From b41b386d848b376ace48d6a02c5f6374ad56716d Mon Sep 17 00:00:00 2001 From: LindaRobles Date: Thu, 31 Aug 2023 20:12:27 -0600 Subject: [PATCH 01/10] status http --- extra.md | 35 + functions.js | 125 ++ index.js | 51 +- nueva.js | 116 ++ package-lock.json | 3378 +++++++++++++++++++++++++++++++++++++++++ package.json | 11 +- pruebas.js | 125 ++ test/md-links.spec.js | 39 +- 8 files changed, 3873 insertions(+), 7 deletions(-) create mode 100644 extra.md create mode 100644 functions.js create mode 100644 nueva.js create mode 100644 package-lock.json create mode 100644 pruebas.js diff --git a/extra.md b/extra.md new file mode 100644 index 0000000..6b7ce14 --- /dev/null +++ b/extra.md @@ -0,0 +1,35 @@ +## 3. Objetivos de aprendizaje + +Reflexiona y luego marca los objetivos que has llegado a entender y aplicar en tu proyecto. Piensa en eso al decidir tu estrategia de trabajo. + +### JavaScript + +- [ ] **Diferenciar entre tipos de datos primitivos y no primitivos** + +- [ ] **Arrays (arreglos)** + +
Links

+ + * [Arreglos](https://curriculum.laboratoria.la/es/topics/javascript/04-arrays) + * [Array - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/) + * [Array.prototype.sort() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) + * [Array.prototype.forEach() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) + * [Array.prototype.map() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/map) + * [Array.prototype.filter() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) + * [Array.prototype.reduce() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) +

+ +- [ ] **Objetos (key, value)** + +
Links

+ + * [Objetos en JavaScript](https://curriculum.laboratoria.la/es/topics/javascript/05-objects/01-objects) +

+ +- [ ] **Uso de condicionales (if-else, switch, operador ternario, lógica booleana)** + +
Links

+ + * [Estructuras condicionales y repetitivas](https://curriculum.laboratoria.la/es/topics/javascript/02-flow-control/01-conditionals-and-loops) + * [Tomando decisiones en tu código — condicionales - MDN](https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/conditionals) +

\ No newline at end of file diff --git a/functions.js b/functions.js new file mode 100644 index 0000000..71eeba9 --- /dev/null +++ b/functions.js @@ -0,0 +1,125 @@ +const fs = require("fs"); +const path = require("path"); +const axios = require('axios'); + + +// Función para verificar si un archivo o directorio existe +function fileOrDirExists(filePath) { + return fs.existsSync(filePath); +} +console.log("Path exists:", fileOrDirExists('./extra.md')); + +// Función para convertir una ruta relativa en absoluta +function convertToAbsolute(filePath) { + return path.resolve(filePath); +} +console.log("Absolute path:", convertToAbsolute ('./extra.md')); +//console.log("Absolute path:", convertToAbsolute ('./index.js')); + +// Confirmar si es un archivo .md +function isMarkdownFile(filePath) { + return path.extname(filePath) === ".md"; +} +console.log("Is markdown file:", isMarkdownFile('./extra.md')); + +const filePath = 'D:/Laboratoria/DEV008-md-links/README.md'; +//D:\Laboratoria\DEV008-md-links\README.md +// Leer el archivo .md +function readFileContent(filePath) { + return new Promise((resolve, reject) => { + fs.readFile(filePath, 'utf-8', (err, data) => { + if (err) { + reject(err); + } else { + resolve(data); + } + }); + }); + } + + +// Buscar links dentro del .md + +const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g; + +function findLinksInMarkdown(markdownContent, filePath) { + return new Promise((resolve, reject) => { + const links = []; + let match; + + while ((match = linkRegex.exec(markdownContent)) !== null) { + const [, linkText, linkUrl] = match; + links.push({ + text: linkText, + href: linkUrl, + file: filePath + }); + } + + resolve(links); + }); +} + + +//const filePath = 'D:\Laboratoria\DEV008-md-links\extra.md'; + + +readFileContent(filePath) + .then((markdownContent) => { + return findLinksInMarkdown(markdownContent, filePath); + }) + .then((links) => { + return getStatusLinks(links); + }) + .then((linksWithStatus) => { + console.log("Links with status:", linksWithStatus); + }) + .catch((error) => { + console.error("Error:", error); + }); + + + +// Pedir el código status HTTP -fetch o axios +//Axios aquí + +//transforma en newPromise +function getStatusLinks(linksArray) { + const promises = linksArray.map((link) => { + return axios.get(link.href) + .then((response) => { + const statusText = `HTTP Status Code: ${response.status} ${response.statusText}`; + return { ...link, status: statusText }; + }) + .catch((error) => { + let statusText = 'HTTP Status Code: Unknown Error'; + + if (error.response) { + statusText = `HTTP Status Code: ${error.response.status} ${error.response.statusText}`; + } + + return { ...link, status: statusText }; + }); + }); + + return Promise.all(promises); +} + + +/* axios.get('https://ejemplo.com') + .then(() => { + console.log('HTTP Status Code: 200 OK'); + }) + .catch(() => { + console.log('HTTP Status Code: 404 Not Found'); + }); */ + //Para probar axios afuera. + +// validar links + + module.exports = { + fileOrDirExists, + convertToAbsolute, + isMarkdownFile, + readFileContent, + }; \ No newline at end of file diff --git a/index.js b/index.js index a4e4a45..3606d63 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,50 @@ -module.exports = () => { - // ... +const { + fileOrDirExists, + convertToAbsolute, + isMarkdownFile, + readFileContent, + findLinksInMarkdown, +} = require('../functions'); + +// función mdLinks +//función principal que tomará una ruta de archivo y opciones, y devolverá una promesa. +const mdLinks = (filePath, options) => { + return new Promise((resolve, reject) => { + // File exists + if (!fileOrDirExists(filePath)) { + reject(new Error('File or directory does not exist')); + return; + } + + // Convert Path + const absolutePath = convertToAbsolute(filePath); + + // Verify if it's a md + if (!isMarkdownFile(absolutePath)) { + reject(new Error('File is not a markdown file')); + return; + } + + // Read md content + readFileContent(absolutePath) + .then((markdownContent) => { + return findLinksInMarkdown(markdownContent); + }) + .then((links) => { + return getStatusLinks(links); // Obtiene el status HTTP para cada enlace + }) + .then((linksWithStatus) => { + resolve(linksWithStatus); // Devuelve el array de enlaces con status + }) + .catch((error) => { + reject(error); + }); + }); +}; + + */// Spread Syntax (...) +// eso agrega los elementos individuales al arreglo links. + +module.exports = { + mdLinks, }; diff --git a/nueva.js b/nueva.js new file mode 100644 index 0000000..0de709c --- /dev/null +++ b/nueva.js @@ -0,0 +1,116 @@ +const fs = require("fs"); +const path = require("path"); +const axios = require('axios'); + + +// Función para verificar si un archivo o directorio existe +function fileOrDirExists(filePath) { + return fs.existsSync(filePath); +} +console.log("Path exists:", fileOrDirExists('./extra.md')); + +// Función para convertir una ruta relativa en absoluta +function convertToAbsolute(filePath) { + return path.resolve(filePath); +} +console.log("Absolute path:", convertToAbsolute ('./extra.md')); +//console.log("Absolute path:", convertToAbsolute ('./index.js')); + +// Confirmar si es un archivo .md +function isMarkdownFile(filePath) { + return path.extname(filePath) === ".md"; +} +console.log("Is markdown file:", isMarkdownFile('./extra.md')); + +//D:\Laboratoria\DEV008-md-links\README.md +// Leer el archivo .md +function readFileContent(filePath) { + return new Promise((resolve, reject) => { + fs.readFile(filePath, 'utf-8', (err, data) => { + if (err) { + reject(err); + } else { + resolve(data); + } + }); + }); + } + +/* readFileContent('index.js') + .then((data) =>{ + console.log(data) + }) + .catch((error) =>{ + console.log(error); + }) */ +const filePath = 'extra.md'; + +function getLinks(filePath){ + + + readFileContent(filePath) + .then((data) =>{ + const exp = /\[(.+?)\]\((https?:\/\/[^\s]+)\)/g; + const links = []; + const matchedLinks = data.matchAll(exp); + console.log(matchedLinks); + if (matchedLinks !== null){ + for (let link of matchedLinks){ + links.push({ + + href: link + }) + } + } + console.log(links); + }) + .catch((error) =>{ + console.log(error); + }) +} + +getLinks('./extra.md') + + +// Pedir el código status HTTP -fetch o axios +//Axios aquí + +//transforma en newPromise +function getStatusLinks(linksArray) { + const results = []; + + return new Promise((resolve, reject) =>{ + linksArray.forEach((link) => { + axios.get(link.url) + .then((result) => { + resolve(console.log(result)); + //results.push({ ...link, status: 'HTTP Status Code: 200 OK'}); + }) + .catch(() => { + //results.push({ ...link, status: 'HTTP'}) + }) + }) + }) +} + +//console.log(getStatusLinks(findLinksInMarkdown(readFileContent(filePath)))) +//console.log(getStatusLinks(findLinksInMarkdown('./extra.md', callback ))); + + + +/* axios.get('https://ejemplo.com') + .then(() => { + console.log('HTTP Status Code: 200 OK'); + }) + .catch(() => { + console.log('HTTP Status Code: 404 Not Found'); + }); */ + + // validar links + + module.exports = { + fileOrDirExists, + convertToAbsolute, + isMarkdownFile, + readFileContent, + }; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..43a2afe --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3378 @@ +{ + "name": "md-links", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "md-links", + "version": "0.1.0", + "dependencies": { + "axios": "^1.4.0", + "jest": "^29.6.2", + "node": "^19.6.1" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "dependencies": { + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/@babel/generator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "dependencies": { + "@babel/types": "^7.22.10", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", + "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", + "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", + "dependencies": { + "@jest/console": "^29.6.2", + "@jest/reporters": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.6.2", + "jest-haste-map": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.2", + "jest-resolve-dependencies": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "jest-watcher": "^29.6.2", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.2", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", + "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", + "dependencies": { + "@jest/fake-timers": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", + "dependencies": { + "expect": "^29.6.2", + "jest-snapshot": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", + "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", + "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", + "dependencies": { + "@jest/types": "^29.6.1", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", + "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", + "dependencies": { + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", + "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", + "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", + "dependencies": { + "@jest/console": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", + "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", + "dependencies": { + "@jest/test-result": "^29.6.2", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", + "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.2", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dependencies": { + "@jest/schemas": "^29.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", + "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz", + "integrity": "sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==", + "dependencies": { + "@jest/transform": "^29.6.2", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001521", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz", + "integrity": "sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.495", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.495.tgz", + "integrity": "sha512-mwknuemBZnoOCths4GtpU/SDuVMp3uQHKa2UNJT9/aVD6WVRjGpXOxRGX7lm6ILIenTdGXPSTCTDaWos5tEU8Q==" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==", + "dependencies": { + "@jest/expect-utils": "^29.6.2", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz", + "integrity": "sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==", + "dependencies": { + "@jest/core": "^29.6.2", + "@jest/types": "^29.6.1", + "import-local": "^3.0.2", + "jest-cli": "^29.6.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz", + "integrity": "sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==", + "dependencies": { + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.6.2", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", + "p-limit": "^3.1.0", + "pretty-format": "^29.6.2", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz", + "integrity": "sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==", + "dependencies": { + "@jest/core": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz", + "integrity": "sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.6.2", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.2", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.6.2", + "jest-environment-node": "^29.6.2", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.6.2", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", + "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz", + "integrity": "sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==", + "dependencies": { + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.6.2", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz", + "integrity": "sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==", + "dependencies": { + "@jest/environment": "^29.6.2", + "@jest/fake-timers": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz", + "integrity": "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==", + "dependencies": { + "@jest/types": "^29.6.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz", + "integrity": "sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==", + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz", + "integrity": "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.6.2", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz", + "integrity": "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz", + "integrity": "sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==", + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-util": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz", + "integrity": "sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz", + "integrity": "sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==", + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz", + "integrity": "sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==", + "dependencies": { + "@jest/console": "^29.6.2", + "@jest/environment": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.6.2", + "jest-haste-map": "^29.6.2", + "jest-leak-detector": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-resolve": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-util": "^29.6.2", + "jest-watcher": "^29.6.2", + "jest-worker": "^29.6.2", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz", + "integrity": "sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==", + "dependencies": { + "@jest/environment": "^29.6.2", + "@jest/fake-timers": "^29.6.2", + "@jest/globals": "^29.6.2", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz", + "integrity": "sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.6.2", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.6.2", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^29.6.2", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/jest-util": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz", + "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", + "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", + "dependencies": { + "@jest/types": "^29.6.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz", + "integrity": "sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==", + "dependencies": { + "@jest/test-result": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz", + "integrity": "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.6.2", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/node": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/node/-/node-19.8.1.tgz", + "integrity": "sha512-qAoX6xM9F/eEv4q4qgCXGSbXWruHVzVJX32XCZizSUNsg5ywYY7di9QMqSDFmPwvJrXjZuhNq2z80+lR9GumLg==", + "hasInstallScript": true, + "dependencies": { + "node-bin-setup": "^1.0.0" + }, + "bin": { + "node": "bin/node" + }, + "engines": { + "npm": ">=5.0.0" + } + }, + "node_modules/node-bin-setup": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", + "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index faa2622..d75bb9e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "md-links", "version": "0.1.0", + "main": "index.js", "engines": { "node": ">=16.x" }, @@ -8,5 +9,13 @@ "createdAt": "2023-06-28T16:05:09.952Z", "version": "6.3.0", "commit": "a942adeb868f1fe54b86e34cc4fc4ddb0601700d" + }, + "dependencies": { + "axios": "^1.4.0", + "jest": "^29.6.2", + "node": "^19.6.1" + }, + "scripts": { + "test": "jest" } -} \ No newline at end of file +} diff --git a/pruebas.js b/pruebas.js new file mode 100644 index 0000000..893e50d --- /dev/null +++ b/pruebas.js @@ -0,0 +1,125 @@ +const fs = require("fs"); +const path = require("path"); +const axios = require('axios'); + + +// Función para verificar si un archivo o directorio existe +function fileOrDirExists(filePath) { + return fs.existsSync(filePath); +} +console.log("Path exists:", fileOrDirExists('./extra.md')); + +// Función para convertir una ruta relativa en absoluta +function convertToAbsolute(filePath) { + return path.resolve(filePath); +} +console.log("Absolute path:", convertToAbsolute ('./extra.md')); +//console.log("Absolute path:", convertToAbsolute ('./index.js')); + +// Confirmar si es un archivo .md +function isMarkdownFile(filePath) { + return path.extname(filePath) === ".md"; +} +console.log("Is markdown file:", isMarkdownFile('./extra.md')); + +const filePath = 'D:/Laboratoria/DEV008-md-links/README.md'; +//D:\Laboratoria\DEV008-md-links\README.md +// Leer el archivo .md +function readFileContent(filePath) { + return new Promise((resolve, reject) => { + fs.readFile(filePath, 'utf-8', (err, data) => { + if (err) { + reject(err); + } else { + resolve(data); + } + }); + }); + } + + +// Buscar links dentro del .md + +const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g; + +function findLinksInMarkdown(markdownContent, filePath) { + return new Promise((resolve, reject) => { + const links = []; + let match; + + while ((match = linkRegex.exec(markdownContent)) !== null) { + const [, linkText, linkUrl] = match; + links.push({ + text: linkText, + href: linkUrl, + file: filePath + }); + } + + resolve(links); + }); +} + + +//const filePath = 'D:\Laboratoria\DEV008-md-links\extra.md'; + + +readFileContent(filePath) + .then((markdownContent) => { + return findLinksInMarkdown(markdownContent, filePath); + }) + .then((links) => { + return getStatusLinks(links); + }) + .then((linksWithStatus) => { + console.log("Links with status:", linksWithStatus); + }) + .catch((error) => { + console.error("Error:", error); + }); + + + +// Pedir el código status HTTP -fetch o axios +//Axios aquí + +//transforma en newPromise +function getStatusLinks(linksArray) { + const promises = linksArray.map((link) => { + return axios.get(link.url) + .then((response) => { + const statusText = `HTTP Status Code: ${response.status} ${response.statusText}`; + return { ...link, status: statusText }; + }) + .catch((error) => { + let statusText = 'HTTP Status Code: Unknown Error'; + + if (error.response) { + statusText = `HTTP Status Code: ${error.response.status} ${error.response.statusText}`; + } + + return { ...link, status: statusText }; + }); + }); + + return Promise.all(promises); +} + +axios.get('https://ejemplo.com') + .then(() => { + console.log('HTTP Status Code: 200 OK'); + }) + .catch(() => { + console.log('HTTP Status Code: 404 Not Found'); + }); + + + +// validar links + + module.exports = { + fileOrDirExists, + convertToAbsolute, + isMarkdownFile, + readFileContent, + }; \ No newline at end of file diff --git a/test/md-links.spec.js b/test/md-links.spec.js index 31db9e9..a249dec 100644 --- a/test/md-links.spec.js +++ b/test/md-links.spec.js @@ -1,10 +1,41 @@ -const mdLinks = require('../'); +const mdLinks = require("../index.js"); +const { + fileOrDirExists, + convertToAbsolute, + isMarkdownFile, + readFileContent, +} = require("../functions"); +// Test fileOrDirExists +describe("fileOrDirExists", () => { + it("debe regresar true si existe archivo o directorio", () => { + expect(fileOrDirExists("./README.md")).toBe(true); + }); -describe('mdLinks', () => { + it("debe regresar falso si no existe archivo o directorio", () => { + expect(fileOrDirExists("./ejemplofalso.txt")).toBe(false); + }); +}); - it('should...', () => { - console.log('FIX ME!'); +// Test convertToAbsolute +describe("convertToAbsolute", () => { + it("debe convertir ruta relativa a ruta absoluta", () => { + const relativePath = "./index.js"; + const expectedAbsolutePath = "D:\\Laboratoria\\DEV008-md-links\\index.js"; + const convertedPath = convertToAbsolute(relativePath); + expect(convertedPath).toBe(expectedAbsolutePath); }); +}); +//Test isMarkdownFile +describe("isMarkdownFile", () => { + it("debe mostrar true si es archivo markdown", () => { + const filePath = "./README.md"; + expect(isMarkdownFile(filePath)).toBe(true); + }); + + it("debe mostrar true si es archivo markdown", () => { + const filePath = "./index.js"; + expect(isMarkdownFile(filePath)).toBe(false); + }); }); From b7fe6860cf0b7f458091b24f63a03742eadb7732 Mon Sep 17 00:00:00 2001 From: LindaRobles Date: Mon, 4 Sep 2023 16:36:52 -0600 Subject: [PATCH 02/10] status y mensaje ok --- functions.js | 22 ++++++---------------- pruebas.js | 14 +++++++------- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/functions.js b/functions.js index 71eeba9..c9a54dc 100644 --- a/functions.js +++ b/functions.js @@ -88,35 +88,25 @@ function getStatusLinks(linksArray) { const promises = linksArray.map((link) => { return axios.get(link.href) .then((response) => { - const statusText = `HTTP Status Code: ${response.status} ${response.statusText}`; - return { ...link, status: statusText }; + const statusText = `${response.status}`; + const ok = response.status === 200 ? "OK" : "fail"; + return { ...link, status: statusText, ok }; }) .catch((error) => { let statusText = 'HTTP Status Code: Unknown Error'; + const ok = "fail"; if (error.response) { - statusText = `HTTP Status Code: ${error.response.status} ${error.response.statusText}`; + statusText = `${error.response.status} ${error.response.statusText}`; } - return { ...link, status: statusText }; + return { ...link, status: statusText, ok }; }); }); return Promise.all(promises); } - -/* axios.get('https://ejemplo.com') - .then(() => { - console.log('HTTP Status Code: 200 OK'); - }) - .catch(() => { - console.log('HTTP Status Code: 404 Not Found'); - }); */ - //Para probar axios afuera. - -// validar links - module.exports = { fileOrDirExists, convertToAbsolute, diff --git a/pruebas.js b/pruebas.js index 893e50d..96290cb 100644 --- a/pruebas.js +++ b/pruebas.js @@ -86,16 +86,16 @@ readFileContent(filePath) //transforma en newPromise function getStatusLinks(linksArray) { const promises = linksArray.map((link) => { - return axios.get(link.url) + return axios.get(link.href) .then((response) => { - const statusText = `HTTP Status Code: ${response.status} ${response.statusText}`; + const statusText = `${response.status} ${response.statusText}`; return { ...link, status: statusText }; }) .catch((error) => { let statusText = 'HTTP Status Code: Unknown Error'; if (error.response) { - statusText = `HTTP Status Code: ${error.response.status} ${error.response.statusText}`; + statusText = `${error.response.status} ${error.response.statusText}`; } return { ...link, status: statusText }; @@ -105,15 +105,15 @@ function getStatusLinks(linksArray) { return Promise.all(promises); } -axios.get('https://ejemplo.com') + +/* axios.get('https://ejemplo.com') .then(() => { console.log('HTTP Status Code: 200 OK'); }) .catch(() => { console.log('HTTP Status Code: 404 Not Found'); - }); - - + }); */ + //Para probar axios afuera. // validar links From 6d22d83c7279dbdb6488c935fd48b3a761922877 Mon Sep 17 00:00:00 2001 From: LindaRobles Date: Wed, 6 Sep 2023 22:45:14 -0600 Subject: [PATCH 03/10] ajustes en package json --- cli.js | 78 +++++++++++++++++ functions.js | 70 ++++++++++++--- index.js | 92 +++++++++++--------- package-lock.json | 216 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 8 +- 5 files changed, 411 insertions(+), 53 deletions(-) create mode 100644 cli.js diff --git a/cli.js b/cli.js new file mode 100644 index 0000000..84d9f0a --- /dev/null +++ b/cli.js @@ -0,0 +1,78 @@ +#!/usr/bin/env node +const yargs = require('yargs'); +const { mdLinks } = require('./index.js'); +const { countTotalAndUnique, countBrokenLinks } = require('./functions.js'); +const chalk = require('chalk'); + +console.log(chalk.magenta('¡Here is my md-links library!')); + +// Yargs hace el CLI ejecutable +//Yargs se encarga del análisis de los argumentos y opciones proporcionados por el usuario + +yargs +.usage(chalk.bold.cyanBright('md-links ./path/to/file.md -v -s')) +.command('$0', chalk.cyan('Default command')) +.option('v', { + alias: 'validate', + describe: chalk.cyan('-v to check the status of each link'), + type: 'boolean', + default: false, +}) +.option('s', { + alias: 'stats', + describe: 'Show statistics about the links', + type: 'boolean', + default: false, +}) +.help('h') +.alias('h', 'help') +.argv; + +const args = yargs.argv; +const filePath = args._[0]; +const options = { + validate: args.validate, + stats: args.stats, +}; + +if (!filePath) { + console.error(chalk.red('Error: You must provide a path.')); + process.exit(1); +} + + mdLinks(filePath, options) + .then((linksWithStatus) => { + if (options.stats) { + const totalStats = `Total: ${linksWithStatus.length}`; + const uniqueStats = `Unique: ${countTotalAndUnique(linksWithStatus)}`; + const brokenStats = `Broken: ${countBrokenLinks(linksWithStatus)}`; + console.log(chalk.magenta(totalStats)); + console.log(chalk.magenta(uniqueStats)); + console.log(chalk.magenta(brokenStats)); + } + if (options.validate) { + linksWithStatus.forEach((link) => { + const statusInfo = link.ok === 'OK' ? 'OK' : 'Fail'; + console.log( + `${chalk.magenta('Text:')} ${chalk.green(link.text)}\n` + + `${chalk.magenta('href:')} ${chalk.green(link.href)}\n` + + `${chalk.magenta('File:')} ${chalk.green(link.file)}\n` + + `${chalk.magenta('Status:')} ${chalk.green(link.status)}\n` + + `${chalk.magenta('StatusInfo:')} ${chalk.green(statusInfo)}\n` + ); + }); + } else { + linksWithStatus.forEach((link) => { + console.log( + `${chalk.magenta('Text:')} ${chalk.green(link.text)}\n` + + `${chalk.magenta('href:')} ${chalk.green(link.href)}\n` + + `${chalk.magenta('File:')} ${chalk.green(link.file)}\n` + ); + }); + } + }) + .catch((error) => { + console.error(error); + }); + + diff --git a/functions.js b/functions.js index c9a54dc..ee956cd 100644 --- a/functions.js +++ b/functions.js @@ -13,17 +13,19 @@ console.log("Path exists:", fileOrDirExists('./extra.md')); function convertToAbsolute(filePath) { return path.resolve(filePath); } -console.log("Absolute path:", convertToAbsolute ('./extra.md')); +//console.log("Absolute path:", convertToAbsolute ('./extra.md')); //console.log("Absolute path:", convertToAbsolute ('./index.js')); // Confirmar si es un archivo .md function isMarkdownFile(filePath) { return path.extname(filePath) === ".md"; } -console.log("Is markdown file:", isMarkdownFile('./extra.md')); +//console.log("Is markdown file:", isMarkdownFile('./extra.md')); + +//const filePath = 'D:/Laboratoria/DEV008-md-links/README.md'; +const filePath = 'D:/Laboratoria/DEV008-md-links/extra.md'; //error al copiar path? +//Función para voltear el path**por windows!!! -const filePath = 'D:/Laboratoria/DEV008-md-links/README.md'; -//D:\Laboratoria\DEV008-md-links\README.md // Leer el archivo .md function readFileContent(filePath) { return new Promise((resolve, reject) => { @@ -60,10 +62,7 @@ function findLinksInMarkdown(markdownContent, filePath) { }); } - -//const filePath = 'D:\Laboratoria\DEV008-md-links\extra.md'; - - +/* readFileContent(filePath) .then((markdownContent) => { return findLinksInMarkdown(markdownContent, filePath); @@ -72,11 +71,20 @@ readFileContent(filePath) return getStatusLinks(links); }) .then((linksWithStatus) => { + //linksWithStatus no está declarada porque se obtiene como resultado de la promesa console.log("Links with status:", linksWithStatus); - }) + + const totalAndUnique = countTotalAndUnique(linksWithStatus); + const brokenLinkCount = countBrokenLinks(linksWithStatus); + + console.log('Total Links:', totalAndUnique.total); + console.log('Unique Links:', totalAndUnique.unique); + console.log('Broken Links:', brokenLinkCount); +}) + .catch((error) => { console.error("Error:", error); - }); + }); */ @@ -107,9 +115,51 @@ function getStatusLinks(linksArray) { return Promise.all(promises); } +// Spread Syntax (...) +// eso agrega los elementos individuales al arreglo links. + +//-----------------------------Here functions for stats!!!------------------------------------- +// Count total and unique links +function countTotalAndUnique(linksArray) { + const totalLinks = linksArray.length; + + //con Set NO sirve lenght, usar .size* + //Set-estructura de datos Js que representa una colección de valores únicos + const uniqueLinks = new Set(linksArray.map((link) => link.href)); + return { + total: totalLinks, + unique: uniqueLinks.size, + }; +} + + +// count broken links +function countBrokenLinks(linksArray) { + let count = 0; + for (const link of linksArray) { + if (link.ok !== 'OK') { + count++; + } + } + return count; +} +/* function countBrokenLinks(linksArray) { + return linksArray.reduce((count, link) => { + if (link.ok !== 'OK') { + count++; + } + return count; + }, 0); +} */ + + module.exports = { fileOrDirExists, convertToAbsolute, isMarkdownFile, readFileContent, + getStatusLinks, + findLinksInMarkdown, + countTotalAndUnique, + countBrokenLinks, }; \ No newline at end of file diff --git a/index.js b/index.js index 3606d63..24cd847 100644 --- a/index.js +++ b/index.js @@ -1,50 +1,60 @@ +const fs = require("fs"); const { fileOrDirExists, - convertToAbsolute, - isMarkdownFile, - readFileContent, - findLinksInMarkdown, -} = require('../functions'); + convertToAbsolute, + isMarkdownFile, + readFileContent, + getStatusLinks, + findLinksInMarkdown, +} = require('./functions.js'); -// función mdLinks + + +// aquí va mdLinks //función principal que tomará una ruta de archivo y opciones, y devolverá una promesa. -const mdLinks = (filePath, options) => { - return new Promise((resolve, reject) => { - // File exists - if (!fileOrDirExists(filePath)) { - reject(new Error('File or directory does not exist')); - return; - } - - // Convert Path - const absolutePath = convertToAbsolute(filePath); - - // Verify if it's a md - if (!isMarkdownFile(absolutePath)) { - reject(new Error('File is not a markdown file')); - return; - } - - // Read md content - readFileContent(absolutePath) - .then((markdownContent) => { - return findLinksInMarkdown(markdownContent); - }) - .then((links) => { - return getStatusLinks(links); // Obtiene el status HTTP para cada enlace - }) - .then((linksWithStatus) => { - resolve(linksWithStatus); // Devuelve el array de enlaces con status - }) - .catch((error) => { - reject(error); - }); +const mdLinks = (filePath, options = { validate: false, stats: false }) => new Promise((resolve, reject) => { + const shouldValidate = options.validate; + const shouldShowStats = options.stats; + const absolutePath = convertToAbsolute(filePath); + const pathExist = fs.existsSync(absolutePath); + + if (!pathExist) { + return reject(new Error('Path does not exist' + absolutePath)); + } + + const isMdFile = isMarkdownFile(absolutePath); + if (!isMdFile) { + return reject(new Error('File is not a markdown!')); + } + + readFileContent(filePath) + .then((markdownContent) => { + return findLinksInMarkdown(markdownContent, filePath); + }) + .then((links) => { + return getStatusLinks(links); + }) + .then((linksWithStatus) => { + //linksWithStatus no está declarada porque se obtiene como resultado de la promesa + resolve(linksWithStatus); + }) + .catch((error) => { + // En caso de error, rechazamos la promesa + reject(error); }); -}; + }); + + + + +//..to try mdLinks promise +/* mdLinks('D:/Laboratoria/DEV008-md-links/README.md', { validate: true }).then((result) => { + console.log(result); +}).catch((error) => { + console.error(error); +}); */ - */// Spread Syntax (...) -// eso agrega los elementos individuales al arreglo links. module.exports = { mdLinks, -}; +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 43a2afe..9c68fa0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,11 @@ "version": "0.1.0", "dependencies": { "axios": "^1.4.0", + "boxen": "^7.1.1", + "chalk": "^4.1.2", "jest": "^29.6.2", - "node": "^19.6.1" + "node": "^19.6.1", + "yargs": "^17.7.2" }, "engines": { "node": ">=16.x" @@ -1044,6 +1047,14 @@ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1206,6 +1217,133 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1347,6 +1485,17 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -1485,6 +1634,11 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/electron-to-chromium": { "version": "1.4.495", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.495.tgz", @@ -3292,6 +3446,66 @@ "node": ">= 8" } }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/package.json b/package.json index d75bb9e..7a088d7 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,14 @@ }, "dependencies": { "axios": "^1.4.0", + "boxen": "^7.1.1", + "chalk": "^4.1.2", "jest": "^29.6.2", - "node": "^19.6.1" + "node": "^19.6.1", + "yargs": "^17.7.2" + }, + "bin": { + "md-links": "cli.js" }, "scripts": { "test": "jest" From a3e3044a57cc55273a1cbd4c641651f8294b6dca Mon Sep 17 00:00:00 2001 From: LindaRobles Date: Wed, 6 Sep 2023 23:19:52 -0600 Subject: [PATCH 04/10] fix problema de unique links que antes era undefined --- cli.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli.js b/cli.js index 84d9f0a..e8a5a11 100644 --- a/cli.js +++ b/cli.js @@ -44,10 +44,10 @@ if (!filePath) { .then((linksWithStatus) => { if (options.stats) { const totalStats = `Total: ${linksWithStatus.length}`; - const uniqueStats = `Unique: ${countTotalAndUnique(linksWithStatus)}`; + const uniqueStats = countTotalAndUnique(linksWithStatus); const brokenStats = `Broken: ${countBrokenLinks(linksWithStatus)}`; console.log(chalk.magenta(totalStats)); - console.log(chalk.magenta(uniqueStats)); + console.log(chalk.magenta(`Unique: ${uniqueStats.unique}`)); console.log(chalk.magenta(brokenStats)); } if (options.validate) { From b8e91778f02a501d157e8a95ef564e81b37fc9d6 Mon Sep 17 00:00:00 2001 From: LindaRobles Date: Thu, 7 Sep 2023 00:48:42 -0600 Subject: [PATCH 05/10] add comment for user and path --- cli.js | 17 +++++++++++++---- functions.js | 4 ++-- index.js | 4 ++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/cli.js b/cli.js index e8a5a11..c7de8fd 100644 --- a/cli.js +++ b/cli.js @@ -4,7 +4,16 @@ const { mdLinks } = require('./index.js'); const { countTotalAndUnique, countBrokenLinks } = require('./functions.js'); const chalk = require('chalk'); -console.log(chalk.magenta('¡Here is my md-links library!')); +console.log(chalk.magentaBright("*************************************")); +console.log(chalk.magentaBright('Hey! :) Here is Lin md-links library!')); +console.log(chalk.magentaBright("*************************************")); + +console.log(" /\\_/\\"); +console.log("=( o.o )="); +console.log(" > ^ <"); + +console.log(chalk.yellow("Quick tip! If your path uses inverted diagonal instead of '/',\n please enter your path within double quotes ^^ \n")); + // Yargs hace el CLI ejecutable //Yargs se encarga del análisis de los argumentos y opciones proporcionados por el usuario @@ -46,9 +55,9 @@ if (!filePath) { const totalStats = `Total: ${linksWithStatus.length}`; const uniqueStats = countTotalAndUnique(linksWithStatus); const brokenStats = `Broken: ${countBrokenLinks(linksWithStatus)}`; - console.log(chalk.magenta(totalStats)); - console.log(chalk.magenta(`Unique: ${uniqueStats.unique}`)); - console.log(chalk.magenta(brokenStats)); + console.log(chalk.cyanBright(totalStats)); + console.log(chalk.cyanBright(`Unique: ${uniqueStats.unique}`)); + console.log(chalk.cyanBright(brokenStats)); } if (options.validate) { linksWithStatus.forEach((link) => { diff --git a/functions.js b/functions.js index ee956cd..07b4d30 100644 --- a/functions.js +++ b/functions.js @@ -7,7 +7,7 @@ const axios = require('axios'); function fileOrDirExists(filePath) { return fs.existsSync(filePath); } -console.log("Path exists:", fileOrDirExists('./extra.md')); +//console.log("Path exists:", fileOrDirExists('./extra.md')); // Función para convertir una ruta relativa en absoluta function convertToAbsolute(filePath) { @@ -23,7 +23,7 @@ function isMarkdownFile(filePath) { //console.log("Is markdown file:", isMarkdownFile('./extra.md')); //const filePath = 'D:/Laboratoria/DEV008-md-links/README.md'; -const filePath = 'D:/Laboratoria/DEV008-md-links/extra.md'; //error al copiar path? +//const filePath = 'D:/Laboratoria/DEV008-md-links/extra.md'; //error al copiar path? //Función para voltear el path**por windows!!! // Leer el archivo .md diff --git a/index.js b/index.js index 24cd847..bfffa20 100644 --- a/index.js +++ b/index.js @@ -13,8 +13,8 @@ const { // aquí va mdLinks //función principal que tomará una ruta de archivo y opciones, y devolverá una promesa. const mdLinks = (filePath, options = { validate: false, stats: false }) => new Promise((resolve, reject) => { - const shouldValidate = options.validate; - const shouldShowStats = options.stats; + //const shouldValidate = options.validate; + //const shouldShowStats = options.stats; const absolutePath = convertToAbsolute(filePath); const pathExist = fs.existsSync(absolutePath); From ac18831287fa805fa27f9ed5967ec556ab5ec723 Mon Sep 17 00:00:00 2001 From: LindaRobles Date: Thu, 7 Sep 2023 02:05:31 -0600 Subject: [PATCH 06/10] ASCII --- cli.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli.js b/cli.js index c7de8fd..2ef2af2 100644 --- a/cli.js +++ b/cli.js @@ -10,9 +10,9 @@ console.log(chalk.magentaBright("*************************************")); console.log(" /\\_/\\"); console.log("=( o.o )="); -console.log(" > ^ <"); +console.log(" > - <"); -console.log(chalk.yellow("Quick tip! If your path uses inverted diagonal instead of '/',\n please enter your path within double quotes ^^ \n")); +console.log(chalk.yellow("Quick tip! If your path has inverted backslashes instead of '/',\n please enter your path within double quotes ^^ \n")); // Yargs hace el CLI ejecutable From db6425772e8d40fac323e7bee98c0e7c5b1d18d6 Mon Sep 17 00:00:00 2001 From: LindaRobles Date: Thu, 7 Sep 2023 03:00:29 -0600 Subject: [PATCH 07/10] edit readme --- README copy.md | 671 ++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 675 ++----------------------------------------------- cli.js | 2 +- option s.JPG | Bin 0 -> 36269 bytes option v.JPG | Bin 0 -> 37312 bytes 5 files changed, 694 insertions(+), 654 deletions(-) create mode 100644 README copy.md create mode 100644 option s.JPG create mode 100644 option v.JPG diff --git a/README copy.md b/README copy.md new file mode 100644 index 0000000..10a2d22 --- /dev/null +++ b/README copy.md @@ -0,0 +1,671 @@ +# Markdown Links + +## Índice + +* [1. Proyecto](#1-proyecto) +* [2. Resumen del proyecto](#2-resumen-del-proyecto) +* [3. Objetivos de aprendizaje](#3-objetivos-de-aprendizaje) +* [4. Consideraciones generales](#4-consideraciones-generales) +* [2. Uso del CLI](#5-criterios-de-aceptación-mínimos-del-proyecto) +* [6. Entregables](#6-entregables) +* [7. Hacker edition](#7-hacker-edition) +* [8. Pistas, tips y lecturas complementarias](#8-pistas-tips-y-lecturas-complementarias) +* [9. Checklist](#9-checklist) +* [10. Achicando el problema](#10-achicando-el-problema) + +*** + +## 1. Preámbulo + +[Markdown](https://es.wikipedia.org/wiki/Markdown) es un lenguaje de marcado +ligero muy popular entre developers. Es usado en muchísimas plataformas que +manejan texto plano (GitHub, foros, blogs, ...) y es muy común +encontrar varios archivos en ese formato en cualquier tipo de repositorio +(empezando por el tradicional `README.md`). + +Estos archivos `Markdown` normalmente contienen _links_ (vínculos/ligas) que +muchas veces están rotos o ya no son válidos y eso perjudica mucho el valor de +la información que se quiere compartir. + +Dentro de una comunidad de código abierto, nos han propuesto crear una +herramienta usando [Node.js](https://nodejs.org/), que lea y analice archivos +en formato `Markdown`, para verificar los links que contengan y reportar +algunas estadísticas. + +![md-links](https://user-images.githubusercontent.com/110297/42118443-b7a5f1f0-7bc8-11e8-96ad-9cc5593715a6.jpg) + +## 2. Resumen del proyecto + +En este proyecto crearás una herramienta de línea de comando (CLI) así como tu +propia librería (o biblioteca - library) en JavaScript. + +En esta oportunidad nos alejamos un poco del navegador para construir un +programa que se ejecute usando Node.js. Aprenderemos sobre procesos +(`process.env`, `process.argv`, ...), cómo interactuar con el sistema archivos, +cómo hacer consultas de red, etc. + +[Node.js](https://nodejs.org/es/) es un entorno de ejecución para JavaScript +construido con el [motor de JavaScript V8 de Chrome](https://developers.google.com/v8/). +Esto nos va a permitir ejecutar JavaScript en el entorno del sistema operativo, +ya sea tu máquina o un servidor, lo cual nos abre las puertas para poder +interactuar con el sistema en sí, archivos, redes, etc. + +Diseñar tu propia librería es una experiencia fundamental para cualquier +desarrolladora porque que te obliga a pensar en la interfaz (API) de tus +_módulos_ y cómo será usado por otras developers. Debes tener especial +consideración en peculiaridades del lenguaje, convenciones y buenas prácticas. + +## 3. Objetivos de aprendizaje + +Reflexiona y luego marca los objetivos que has llegado a entender y aplicar en tu proyecto. Piensa en eso al decidir tu estrategia de trabajo. + +### JavaScript + +- [ ] **Diferenciar entre tipos de datos primitivos y no primitivos** + +- [ ] **Arrays (arreglos)** + +
Links

+ + * [Arreglos](https://curriculum.laboratoria.la/es/topics/javascript/04-arrays) + * [Array - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/) + * [Array.prototype.sort() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) + * [Array.prototype.forEach() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) + * [Array.prototype.map() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/map) + * [Array.prototype.filter() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) + * [Array.prototype.reduce() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) +

+ +- [ ] **Objetos (key, value)** + +
Links

+ + * [Objetos en JavaScript](https://curriculum.laboratoria.la/es/topics/javascript/05-objects/01-objects) +

+ +- [ ] **Uso de condicionales (if-else, switch, operador ternario, lógica booleana)** + +
Links

+ + * [Estructuras condicionales y repetitivas](https://curriculum.laboratoria.la/es/topics/javascript/02-flow-control/01-conditionals-and-loops) + * [Tomando decisiones en tu código — condicionales - MDN](https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/conditionals) +

+ +- [ ] **Funciones (params, args, return)** + +
Links

+ + * [Funciones (control de flujo)](https://curriculum.laboratoria.la/es/topics/javascript/02-flow-control/03-functions) + * [Funciones clásicas](https://curriculum.laboratoria.la/es/topics/javascript/03-functions/01-classic) + * [Arrow Functions](https://curriculum.laboratoria.la/es/topics/javascript/03-functions/02-arrow) + * [Funciones — bloques de código reutilizables - MDN](https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/Functions) +

+ +- [ ] **Recursión o recursividad** + +
Links

+ + * [Píldora recursión - YouTube Laboratoria Developers](https://www.youtube.com/watch?v=lPPgY3HLlhQ) + * [Recursión o Recursividad - Laboratoria Developers en Medium](https://medium.com/laboratoria-developers/recursi%C3%B3n-o-recursividad-ec8f1a359727) +

+ +- [ ] **Módulos de CommonJS** + +
Links

+ + * [Modules: CommonJS modules - Node.js Docs](https://nodejs.org/docs/latest/api/modules.html) +

+ +- [ ] **Diferenciar entre expresiones (expressions) y sentencias (statements)** + +- [ ] **Callbacks** + +
Links

+ + * [Función Callback - MDN](https://developer.mozilla.org/es/docs/Glossary/Callback_function) +

+ +- [ ] **Promesas** + +
Links

+ + * [Promise - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Promise) + * [How to Write a JavaScript Promise - freecodecamp (en inglés)](https://www.freecodecamp.org/news/how-to-write-a-javascript-promise-4ed8d44292b8/) +

+ +- [ ] **Pruebas unitarias (unit tests)** + +
Links

+ + * [Empezando con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/getting-started) +

+ +- [ ] **Pruebas asíncronas** + +
Links

+ + * [Tests de código asincrónico con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/asynchronous) +

+ +- [ ] **Uso de mocks y espías** + +
Links

+ + * [Manual Mocks con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/manual-mocks) +

+ +- [ ] **Pruebas de compatibilidad en múltiples entornos de ejecución** + +- [ ] **Uso de linter (ESLINT)** + +- [ ] **Uso de identificadores descriptivos (Nomenclatura y Semántica)** + +### Node.js + +- [ ] **Instalar y usar módulos con npm** + +
Links

+ + * [Sitio oficial de npm (en inglés)](https://www.npmjs.com/) +

+ +- [ ] **Configuración de package.json** + +
Links

+ + * [package.json - Documentación oficial (en inglés)](https://docs.npmjs.com/files/package.json) +

+ +- [ ] **Configuración de npm-scripts** + +
Links

+ + * [scripts - Documentación oficial (en inglés)](https://docs.npmjs.com/misc/scripts) +

+ +- [ ] **process (env, argv, stdin-stdout-stderr, exit-code)** + +
Links

+ + * [Process - Documentación oficial (en inglés)](https://nodejs.org/api/process.html) +

+ +- [ ] **File system (fs, path)** + +
Links

+ + * [File system - Documentación oficial (en inglés)](https://nodejs.org/api/fs.html) + * [Path - Documentación oficial (en inglés)](https://nodejs.org/api/path.html) +

+ +### Control de Versiones (Git y GitHub) + +- [ ] **Git: Instalación y configuración** + +- [ ] **Git: Control de versiones con git (init, clone, add, commit, status, push, pull, remote)** + +- [ ] **Git: Integración de cambios entre ramas (branch, checkout, fetch, merge, reset, rebase, tag)** + +- [ ] **GitHub: Creación de cuenta y repos, configuración de llaves SSH** + +- [ ] **GitHub: Colaboración en Github (branches | forks | pull requests | code review | tags)** + +- [ ] **GitHub: Organización en Github (projects | issues | labels | milestones | releases)** + +### HTTP + +- [ ] **Consulta o petición (request) y respuesta (response).** + +
Links

+ + * [Generalidades del protocolo HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Overview) + * [Mensajes HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Messages) +

+ +- [ ] **Códigos de status de HTTP** + +
Links

+ + * [Códigos de estado de respuesta HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Status) + * [The Complete Guide to Status Codes for Meaningful ReST APIs - dev.to](https://dev.to/khaosdoctor/the-complete-guide-to-status-codes-for-meaningful-rest-apis-1-5c5) +

+ +## 4. Consideraciones generales + +* Este proyecto se debe "resolver" de manera individual. + +* El rango de tiempo estimado para completar el proyecto es de 4 a 5 Sprints. + +* La **librería** y el **script ejecutable** (herramienta de línea de comando - + CLI) deben estar implementados en JavaScript para ser ejecutados con + Node.js. **Está permitido usar librerías externas**. + +* Tu módulo **debe ser instalable** via `npm install /md-links`. Este + módulo debe incluir tanto un _ejecutable_ que podamos invocar en la línea de + comando como una interfaz que podamos importar con `require` para usarlo + programáticamente. + +* Los **tests unitarios** deben cubrir un mínimo del 70% de _statements_, + _functions_, _lines_ y _branches_. Te recomendamos explorar [Jest](https://jestjs.io/) + para tus pruebas unitarias. + +* Para este proyecto **no está permitido** utilizar `async/await`. + +* Para este proyecto te sugerimos **no utilizar** la versión síncrona + de la función para leer archivos, `readFileSync`, y en cambio intentar + resolver este desafío de manera asíncrona. + +* Para este proyecto es **opcional** el uso de ES Modules `(import/export)`, en el + caso optes utilizarlo deberás de crear un script de `build` en el `package.json` + que los transforme en `requires` y `module.exports` con ayuda de **babel**. + +* Para disminuir la complejidad de tu algoritmo recursivo, te recomendamos + utilizar la versión síncrona de la función para leer directorios, `readdirSync`. + +## 5. Criterios de aceptación mínimos del proyecto + +Para comenzar este proyecto tendrás que hacer un **_fork_** y **_clonar_** este +repositorio. + +Antes de comenzar a codear, es necesario crear un **plan de acción**. Esto debería +quedar detallado en el `README.md` de tu repo y en una serie de **_issues_** +y **_milestones_** para priorizar y organizar el trabajo, y para poder hacer +seguimiento de tu progreso. + +Dentro de cada **_milestone_** se crearán y asignarán los **_issues_** que cada quien +considere necesarios. + +### Archivos del proyecto + +* `README.md` con descripción del módulo, instrucciones de instalación/uso, + documentación del API y ejemplos. Todo lo relevante para que cualquier + developer que quiera usar tu librería pueda hacerlo sin inconvenientes. +* `index.js`: Desde este archivo debes exportar **una** función (`mdLinks`). +* `package.json` con nombre, versión, descripción, autores, licencia, + dependencias, scripts (pretest, test, ...), main, bin +* `.editorconfig` con configuración para editores de texto. Este archivo no se + debe cambiar. +* `.eslintrc` con configuración para linter. Este archivo contiene una + configuración básica para ESLint, si deseas agregar reglas adicionales + como Airbnb deberás modificar este archivo. +* `.gitignore` para ignorar `node_modules` u otras carpetas que no deban + incluirse en control de versiones (`git`). +* `test/md-links.spec.js` debe contener los tests unitarios para la función + `mdLinks()`. Tu implementación debe pasar estos tests. + +## Este proyecto consta de DOS partes + +### 1) JavaScript API + +El módulo debe poder **importarse** en otros scripts de Node.js y debe ofrecer la +siguiente interfaz: + +#### `mdLinks(path, options)` + +##### Argumentos + +* `path`: Ruta **absoluta** o **relativa** al **archivo** o **directorio**. +Si la ruta pasada es relativa, debe resolverse como relativa al directorio +desde donde se invoca node - _current working directory_). +* `options`: Un objeto con **únicamente** la siguiente propiedad: + - `validate`: Booleano que determina si se desea validar los links + encontrados. + +##### Valor de retorno + +La función debe **retornar una promesa** (`Promise`) que **resuelva a un arreglo** +(`Array`) de objetos (`Object`), donde cada objeto representa un link y contiene +las siguientes propiedades + +Con `validate:false` : + +* `href`: URL encontrada. +* `text`: Texto que aparecía dentro del link (``). +* `file`: Ruta del archivo donde se encontró el link. + +Con `validate:true` : + +* `href`: URL encontrada. +* `text`: Texto que aparecía dentro del link (``). +* `file`: Ruta del archivo donde se encontró el link. +* `status`: Código de respuesta HTTP. +* `ok`: Mensaje `fail` en caso de fallo u `ok` en caso de éxito. + +#### Ejemplo (resultados como comentarios) + +```js +const mdLinks = require("md-links"); + +mdLinks("./some/example.md") + .then(links => { + // => [{ href, text, file }, ...] + }) + .catch(console.error); + +mdLinks("./some/example.md", { validate: true }) + .then(links => { + // => [{ href, text, file, status, ok }, ...] + }) + .catch(console.error); + +mdLinks("./some/dir") + .then(links => { + // => [{ href, text, file }, ...] + }) + .catch(console.error); +``` + +### 2) CLI (Command Line Interface - Interfaz de Línea de Comando) + +El ejecutable de nuestra aplicación debe poder ejecutarse de la siguiente +manera a través de la **terminal**: + +`md-links [options]` + +Por ejemplo: + +```sh +$ md-links ./some/example.md +./some/example.md http://algo.com/2/3/ Link a algo +./some/example.md https://otra-cosa.net/algun-doc.html algún doc +./some/example.md http://google.com/ Google +``` + +El comportamiento por defecto no debe validar si las URLs responden ok o no, +solo debe identificar el archivo markdown (a partir de la ruta que recibe como +argumento), analizar el archivo Markdown e imprimir los links que vaya +encontrando, junto con la ruta del archivo donde aparece y el texto +que hay dentro del link (truncado a 50 caracteres). + +#### Options + +##### `--validate` + +Si pasamos la opción `--validate`, el módulo debe hacer una petición HTTP para +averiguar si el link funciona o no. Si el link resulta en una redirección a una +URL que responde ok, entonces consideraremos el link como ok. + +Por ejemplo: + +```sh +$ md-links ./some/example.md --validate +./some/example.md http://algo.com/2/3/ ok 200 Link a algo +./some/example.md https://otra-cosa.net/algun-doc.html fail 404 algún doc +./some/example.md http://google.com/ ok 301 Google +``` + +Vemos que el _output_ en este caso incluye la palabra `ok` o `fail` después de +la URL, así como el status de la respuesta recibida a la petición HTTP a dicha +URL. + +##### `--stats` + +Si pasamos la opción `--stats` el output (salida) será un texto con estadísticas +básicas sobre los links. + +```sh +$ md-links ./some/example.md --stats +Total: 3 +Unique: 3 +``` + +También podemos combinar `--stats` y `--validate` para obtener estadísticas que +necesiten de los resultados de la validación. + +```sh +$ md-links ./some/example.md --stats --validate +Total: 3 +Unique: 3 +Broken: 1 +``` + +## 6. Entregables + +Módulo instalable via `npm install /md-links`. Este módulo debe +incluir tanto **un ejecutable** como **una interfaz** que podamos importar con `require` +para usarlo programáticamente. + +## 7. Hacker edition + +Las secciones llamadas _Hacker Edition_ son **opcionales**. Si **terminaste** +con todo lo anterior y te queda tiempo, intenta completarlas. Así podrás +profundizar y/o ejercitar más sobre los objetivos de aprendizaje del proyecto. + +* Puedes agregar la propiedad `line` a cada objeto `link` indicando en qué línea + del archivo se encontró el link. +* Puedes agregar más estadísticas. +* Integración continua con Travis o Circle CI. + +*** + +## 8. Pistas, tips y lecturas complementarias + +Súmate al canal de Slack +[#project-md-links](https://claseslaboratoria.slack.com/archives/C03T1E5TJCQ) +para conversar y pedir ayuda del proyecto. + +### FAQs + +#### ¿Cómo hago para que mi módulo sea _instalable_ desde GitHub? + +Para que el módulo sea instalable desde GitHub solo tiene que: + +* Estar en un repo público de GitHub +* Contener un `package.json` válido + +Con el comando `npm install githubname/reponame` podemos instalar directamente +desde GitHub. Ver [docs oficiales de `npm install` acá](https://docs.npmjs.com/cli/install). + +Por ejemplo, el [`course-parser`](https://github.com/Laboratoria/course-parser) +que usamos para la currícula no está publicado en el registro público de NPM, +así que lo instalamos directamente desde GitHub con el comando `npm install +Laboratoria/course-parser`. + +### Sugerencias de implementación + +La implementación de este proyecto tiene varias partes: leer del sistema de +archivos, recibir argumentos a través de la línea de comando, analizar texto, +hacer consultas HTTP, ... y todas estas cosas pueden enfocarse de muchas formas, +tanto usando librerías como implementando en VanillaJS. + +Por poner un ejemplo, el _parseado_ (análisis) del markdown para extraer los +links podría plantearse de las siguientes maneras (todas válidas): + +* Usando un _módulo_ como [markdown-it](https://github.com/markdown-it/markdown-it), + que nos devuelve un arreglo de _tokens_ que podemos recorrer para identificar + los links. +* Siguiendo otro camino completamente, podríamos usar + [expresiones regulares (`RegExp`)](https://developer.mozilla.org/es/docs/Web/JavaScript/Guide/Regular_Expressions). +* También podríamos usar una combinación de varios _módulos_ (podría ser válido + transformar el markdown a HTML usando algo como [marked](https://github.com/markedjs/marked) + y de ahí extraer los link con una librería de DOM como [JSDOM](https://github.com/jsdom/jsdom) + o [Cheerio](https://github.com/cheeriojs/cheerio) entre otras). +* Usando un _custom renderer_ de [marked](https://github.com/markedjs/marked) + (`new marked.Renderer()`). + +No dudes en consultar a tus compañeras y coaches +si tienes dudas existenciales con respecto a estas decisiones. No existe una +"única" manera correcta :wink: + +### Tutoriales / NodeSchool workshoppers + +* [learnyounode](https://github.com/workshopper/learnyounode) +* [how-to-npm](https://github.com/workshopper/how-to-npm) +* [promise-it-wont-hurt](https://github.com/stevekane/promise-it-wont-hurt) + +### Otros recursos + +* [Acerca de Node.js - Documentación oficial](https://nodejs.org/es/about/) +* [Node.js file system - Documentación oficial](https://nodejs.org/api/fs.html) +* [Node.js http.get - Documentación oficial](https://nodejs.org/api/http.html#http_http_get_options_callback) +* [Node.js - Wikipedia](https://es.wikipedia.org/wiki/Node.js) +* [What exactly is Node.js? - freeCodeCamp](https://medium.freecodecamp.org/what-exactly-is-node-js-ae36e97449f5) +* [¿Qué es Node.js y para qué sirve? - drauta.com](https://www.drauta.com/que-es-nodejs-y-para-que-sirve) +* [¿Qué es Nodejs? Javascript en el Servidor - Fazt en YouTube](https://www.youtube.com/watch?v=WgSc1nv_4Gw) +* [¿Simplemente qué es Node.js? - IBM Developer Works, 2011](https://www.ibm.com/developerworks/ssa/opensource/library/os-nodejs/index.html) +* [Node.js y npm](https://www.genbeta.com/desarrollo/node-js-y-npm) +* [Asíncronía en js](https://carlosazaustre.es/manejando-la-asincronia-en-javascript) +* [NPM](https://docs.npmjs.com/getting-started/what-is-npm) +* [Publicar packpage](https://docs.npmjs.com/getting-started/publishing-npm-packages) +* [Crear módulos en Node.js](https://docs.npmjs.com/getting-started/publishing-npm-packages) +* [Leer un archivo](https://nodejs.org/api/fs.html#fs_fs_readfile_path_options_callback) +* [Leer un directorio](https://nodejs.org/api/fs.html#fs_fs_readdir_path_options_callback) +* [Path](https://nodejs.org/api/path.html) +* [Linea de comando CLI](https://medium.com/netscape/a-guide-to-create-a-nodejs-command-line-package-c2166ad0452e) + +## 9. Checklist + +### General + +* [ ] Puede instalarse via `npm install --global /md-links` + +### `README.md` + +* [ ] Un board con el backlog para la implementación de la librería. +* [ ] Documentación técnica de la librería. +* [ ] Guía de uso e instalación de la librería + +### API `mdLinks(path, opts)` + +* [ ] El módulo exporta una función con la interfaz (API) esperada. +* [ ] Implementa soporte para archivo individual +* [ ] Implementa soporte para directorios +* [ ] Implementa `options.validate` + +### CLI + +* [ ] Expone ejecutable `md-links` en el path (configurado en `package.json`) +* [ ] Se ejecuta sin errores / output esperado +* [ ] Implementa `--validate` +* [ ] Implementa `--stats` + +### Pruebas / tests + +* [ ] Pruebas unitarias cubren un mínimo del 70% de statements, functions, + lines, y branches. +* [ ] Pasa tests (y linters) (`npm test`). + +## 10. Achicando el problema + +Un "superpoder" que esperamos puedas desarrollar durante el bootcamp +es el de definir "mini-proyectos" que te acerquen paso a paso a +la solución del "gran proyecto". Es el equivalente a comenzar armando +esquinas o bordes del rompecabezas/puzzle sin saber necesariamente +cómo encajarán al final. Déjate llevar y explora. + +Estas son algunas sugerencias: + +### Empieza con un diagrama de flujo + +Este proyecto es distinto de los que has venido trabajando hasta ahora +dado que no hay una interfaz web, todo se desarrollará en tu editor y +consola/terminal. + +Es por ello que, para visualizar mejor lo que tendrás que hacer +y planificar tus tareas y objetivos, es recomendable hacer un +`diagrama de flujo`. + +Si nunca has hecho un diagrama de flujo revisa este [recurso](https://www.youtube.com/watch?v=Lub5qOmY4JQ). + +Una alternativa al diagrama de flujo puede ser el `pseudocódigo`. + +### Planificación + +En este proyecto te recomendamos usar la herramienta de planificación +y organización de GitHub llamada **Github Projects**. + +Mediante **issues** y **milestones** podrás organizar y planificar +tareas y objetivos concretos. + +Tomando en consideración los **entregables** del proyecto, el +[9. Checklist](#9-checklist) y los **pasos** que definiste en tu +`diagrama de flujo`, crea tu planificación en GitHub Projects. + +### Antes de codear + +En esta ocasión estarás trabajando en **NodeJS**, asegúrate +de saber para qué sirve y sus consideraciones. + +En particular, deberás decidir desde un comienzo si usarás +`ES Modules`, es decir, **import/export**, ó, por el contrario, +`CommonJS Modules`, es decir, **require/module.exports**. + +Asegurate de tener clara esta decisión desde un inicio para +que no encuentres problemas más adelante. + +### Lee un archivo + +Como primer reto, puedes tratar de leer un solo archivo con +una ruta fija e imprimir su contenido en la consola con un `console.log`. + +La librería nativa `FS` (FileSystem) te será de utilidad. + +**Recuerda**: Te sugerimos **no utilizar** la versión síncrona +de la función para leer archivos, `readFileSync`, y en cambio +intentar resolver ese desafío de manera asíncrona. + +### Averigua la extensión de un archivo + +Ya sabiendo leer un archivo, aventúrate a conocer cual +es su extensión. + +Recuerda, las extensiones son esas letras al final del +nombre de un archivo, por ejemplo: .js, .txt, .doc, etc + +Aquí también podrá ser útil `FS`. + +### Obtén el contenido de un directorio + +Este proyecto consiste en buscar archivos, pero para eso, +primero debes poder verlos. + +Intenta imprimir en consola la lista de archivos en una carpeta. + +La librería `FS` también te será útil aquí. + +**Recuerda**: Para disminuir la complejidad de tu algoritmo +recursivo, te recomendamos utilizar la versión síncrona de +la función para leer directorios, `readdirSync`. + +### Une dos rutas + +Para poder acceder a carpetas y archivos será necesario que +indiques en qué lugar de tu computadora se encuentran, a esto +le llamamos **rutas**. + +Usa la librería nativa `path` para unir dos segmentos de ruta, +por ejemplo, si queremos unir: + +1) /home/Laboratoria/ +2) ./test + +El resultado sería: /home/Laboratoria/test + +### Recursividad + +Este proyecto se ha de resolver de forma casi natural con +**recursividad**. + +¿Por qué?. + +Porque no conocemos realmente cuantas carpetas y archivos +tendremos que recorrer antes de terminar. + +Si recibes una ruta de carpeta, no sabrás de ante mano si +dentro hay más carpetas o muchos archivos. + +Por ello, asegurate bien de entender de qué trata la +recursividad y ver algunos ejemplos. + +Entre los recursos de este proyecto hay un video que te ayudará. + +### Crea una promesa + +El valor de retorno de nuestra librería es una `Promesa`, +no un `Array`. + +Prueba leyendo sobre las promesas y creando una por tu +cuenta utilizando **new Promise()** + +Es importante que sepas qué es un **callback** pues las +promesas los utilizarán. diff --git a/README.md b/README.md index 51b3bf6..be4b877 100644 --- a/README.md +++ b/README.md @@ -1,671 +1,40 @@ # Markdown Links -## Índice +## Tabla de Contenidos +1. [Proyecto](#proyecto) +2. [Uso de la librería](#uso-de-la-libreria) +3. [Instalación](#instalacion) +4. [Ejemplos](#ejemplos) -* [1. Preámbulo](#1-preámbulo) -* [2. Resumen del proyecto](#2-resumen-del-proyecto) -* [3. Objetivos de aprendizaje](#3-objetivos-de-aprendizaje) -* [4. Consideraciones generales](#4-consideraciones-generales) -* [5. Criterios de aceptación mínimos del proyecto](#5-criterios-de-aceptación-mínimos-del-proyecto) -* [6. Entregables](#6-entregables) -* [7. Hacker edition](#7-hacker-edition) -* [8. Pistas, tips y lecturas complementarias](#8-pistas-tips-y-lecturas-complementarias) -* [9. Checklist](#9-checklist) -* [10. Achicando el problema](#10-achicando-el-problema) *** -## 1. Preámbulo +## 1. Proyecto -[Markdown](https://es.wikipedia.org/wiki/Markdown) es un lenguaje de marcado -ligero muy popular entre developers. Es usado en muchísimas plataformas que -manejan texto plano (GitHub, foros, blogs, ...) y es muy común -encontrar varios archivos en ese formato en cualquier tipo de repositorio -(empezando por el tradicional `README.md`). +Markdown es un lenguaje de marcado ligero muy popular, se encuentra en muchos lugares, como en GitHub, foros o blogs. Por ejemplo, si ves un archivo llamado README.md en un proyecto, ¡ese es Markdown!Los archivos de Markdown a menudo tienen enlaces, como los que ves en las páginas web. Pero a veces esos enlaces están rotos, lo que significa que no funcionan bien.Imagina que estás en un grupo de personas que escriben código. Te han pedido que hagas una herramienta especial usando Node.js. Esta herramienta leerá esos archivos de Markdown y verificará si los enlaces funcionan. También te dará información interesante sobre esos enlaces. ¡Así podrás mantener todo en orden! -Estos archivos `Markdown` normalmente contienen _links_ (vínculos/ligas) que -muchas veces están rotos o ya no son válidos y eso perjudica mucho el valor de -la información que se quiere compartir. +## 2. Uso de la librería -Dentro de una comunidad de código abierto, nos han propuesto crear una -herramienta usando [Node.js](https://nodejs.org/), que lea y analice archivos -en formato `Markdown`, para verificar los links que contengan y reportar -algunas estadísticas. +* `md-links file.md`: Revisa el archivo file.md y muestra todos los enlaces que encuentra. También dice en qué parte del archivo están y qué texto tienen. -![md-links](https://user-images.githubusercontent.com/110297/42118443-b7a5f1f0-7bc8-11e8-96ad-9cc5593715a6.jpg) + Tip: En caso de que el path contenga diagonales invertidas, como en este ejemplo ("D:\carpeta\file\abc.md"), asegúrate de colocar el path entre comillas dobles para que pueda leerlo correctamente. -## 2. Resumen del proyecto +* `md-links file.md -v`: Con esta opción en la terminal se verificarán los enlaces en el archivo file.md y se mostrarán más detalles. Esto incluye la ruta del archivo, el texto del enlace y si el enlace está bien o tiene algún problema. -En este proyecto crearás una herramienta de línea de comando (CLI) así como tu -propia librería (o biblioteca - library) en JavaScript. +* `md-links file.md -s`: Esta opción muestra información básica sobre los enlaces en el archivo file.md. Sabrás cuántos enlaces hay en total, cuántos de ellos son únicos (sin repetirse) y cuántos enlaces rotos hay. -En esta oportunidad nos alejamos un poco del navegador para construir un -programa que se ejecute usando Node.js. Aprenderemos sobre procesos -(`process.env`, `process.argv`, ...), cómo interactuar con el sistema archivos, -cómo hacer consultas de red, etc. + +## 3. Instalación -[Node.js](https://nodejs.org/es/) es un entorno de ejecución para JavaScript -construido con el [motor de JavaScript V8 de Chrome](https://developers.google.com/v8/). -Esto nos va a permitir ejecutar JavaScript en el entorno del sistema operativo, -ya sea tu máquina o un servidor, lo cual nos abre las puertas para poder -interactuar con el sistema en sí, archivos, redes, etc. +Para instalar la librería Md-links escribe en la terminal el siguiente comando: -Diseñar tu propia librería es una experiencia fundamental para cualquier -desarrolladora porque que te obliga a pensar en la interfaz (API) de tus -_módulos_ y cómo será usado por otras developers. Debes tener especial -consideración en peculiaridades del lenguaje, convenciones y buenas prácticas. +npm i md-links -## 3. Objetivos de aprendizaje +Y después en la consola podrás utilizarlo como en este ejemplo: + En la consola agrega lo siguiente: -Reflexiona y luego marca los objetivos que has llegado a entender y aplicar en tu proyecto. Piensa en eso al decidir tu estrategia de trabajo. +md-links + La ruta relativa o absoluta del archivo, ejemplo: ./nombredeCarperta + Opciones de comandos -### JavaScript - -- [ ] **Diferenciar entre tipos de datos primitivos y no primitivos** - -- [ ] **Arrays (arreglos)** - -
Links

- - * [Arreglos](https://curriculum.laboratoria.la/es/topics/javascript/04-arrays) - * [Array - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/) - * [Array.prototype.sort() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) - * [Array.prototype.forEach() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) - * [Array.prototype.map() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/map) - * [Array.prototype.filter() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) - * [Array.prototype.reduce() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) -

- -- [ ] **Objetos (key, value)** - -
Links

- - * [Objetos en JavaScript](https://curriculum.laboratoria.la/es/topics/javascript/05-objects/01-objects) -

- -- [ ] **Uso de condicionales (if-else, switch, operador ternario, lógica booleana)** - -
Links

- - * [Estructuras condicionales y repetitivas](https://curriculum.laboratoria.la/es/topics/javascript/02-flow-control/01-conditionals-and-loops) - * [Tomando decisiones en tu código — condicionales - MDN](https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/conditionals) -

- -- [ ] **Funciones (params, args, return)** - -
Links

- - * [Funciones (control de flujo)](https://curriculum.laboratoria.la/es/topics/javascript/02-flow-control/03-functions) - * [Funciones clásicas](https://curriculum.laboratoria.la/es/topics/javascript/03-functions/01-classic) - * [Arrow Functions](https://curriculum.laboratoria.la/es/topics/javascript/03-functions/02-arrow) - * [Funciones — bloques de código reutilizables - MDN](https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/Functions) -

- -- [ ] **Recursión o recursividad** - -
Links

- - * [Píldora recursión - YouTube Laboratoria Developers](https://www.youtube.com/watch?v=lPPgY3HLlhQ) - * [Recursión o Recursividad - Laboratoria Developers en Medium](https://medium.com/laboratoria-developers/recursi%C3%B3n-o-recursividad-ec8f1a359727) -

- -- [ ] **Módulos de CommonJS** - -
Links

- - * [Modules: CommonJS modules - Node.js Docs](https://nodejs.org/docs/latest/api/modules.html) -

- -- [ ] **Diferenciar entre expresiones (expressions) y sentencias (statements)** - -- [ ] **Callbacks** - -
Links

- - * [Función Callback - MDN](https://developer.mozilla.org/es/docs/Glossary/Callback_function) -

- -- [ ] **Promesas** - -
Links

- - * [Promise - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Promise) - * [How to Write a JavaScript Promise - freecodecamp (en inglés)](https://www.freecodecamp.org/news/how-to-write-a-javascript-promise-4ed8d44292b8/) -

- -- [ ] **Pruebas unitarias (unit tests)** - -
Links

- - * [Empezando con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/getting-started) -

- -- [ ] **Pruebas asíncronas** - -
Links

- - * [Tests de código asincrónico con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/asynchronous) -

- -- [ ] **Uso de mocks y espías** - -
Links

- - * [Manual Mocks con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/manual-mocks) -

- -- [ ] **Pruebas de compatibilidad en múltiples entornos de ejecución** - -- [ ] **Uso de linter (ESLINT)** - -- [ ] **Uso de identificadores descriptivos (Nomenclatura y Semántica)** - -### Node.js - -- [ ] **Instalar y usar módulos con npm** - -
Links

- - * [Sitio oficial de npm (en inglés)](https://www.npmjs.com/) -

- -- [ ] **Configuración de package.json** - -
Links

- - * [package.json - Documentación oficial (en inglés)](https://docs.npmjs.com/files/package.json) -

- -- [ ] **Configuración de npm-scripts** - -
Links

- - * [scripts - Documentación oficial (en inglés)](https://docs.npmjs.com/misc/scripts) -

- -- [ ] **process (env, argv, stdin-stdout-stderr, exit-code)** - -
Links

- - * [Process - Documentación oficial (en inglés)](https://nodejs.org/api/process.html) -

- -- [ ] **File system (fs, path)** - -
Links

- - * [File system - Documentación oficial (en inglés)](https://nodejs.org/api/fs.html) - * [Path - Documentación oficial (en inglés)](https://nodejs.org/api/path.html) -

- -### Control de Versiones (Git y GitHub) - -- [ ] **Git: Instalación y configuración** - -- [ ] **Git: Control de versiones con git (init, clone, add, commit, status, push, pull, remote)** - -- [ ] **Git: Integración de cambios entre ramas (branch, checkout, fetch, merge, reset, rebase, tag)** - -- [ ] **GitHub: Creación de cuenta y repos, configuración de llaves SSH** - -- [ ] **GitHub: Colaboración en Github (branches | forks | pull requests | code review | tags)** - -- [ ] **GitHub: Organización en Github (projects | issues | labels | milestones | releases)** - -### HTTP - -- [ ] **Consulta o petición (request) y respuesta (response).** - -
Links

- - * [Generalidades del protocolo HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Overview) - * [Mensajes HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Messages) -

- -- [ ] **Códigos de status de HTTP** - -
Links

- - * [Códigos de estado de respuesta HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Status) - * [The Complete Guide to Status Codes for Meaningful ReST APIs - dev.to](https://dev.to/khaosdoctor/the-complete-guide-to-status-codes-for-meaningful-rest-apis-1-5c5) -

- -## 4. Consideraciones generales - -* Este proyecto se debe "resolver" de manera individual. - -* El rango de tiempo estimado para completar el proyecto es de 4 a 5 Sprints. - -* La **librería** y el **script ejecutable** (herramienta de línea de comando - - CLI) deben estar implementados en JavaScript para ser ejecutados con - Node.js. **Está permitido usar librerías externas**. - -* Tu módulo **debe ser instalable** via `npm install /md-links`. Este - módulo debe incluir tanto un _ejecutable_ que podamos invocar en la línea de - comando como una interfaz que podamos importar con `require` para usarlo - programáticamente. - -* Los **tests unitarios** deben cubrir un mínimo del 70% de _statements_, - _functions_, _lines_ y _branches_. Te recomendamos explorar [Jest](https://jestjs.io/) - para tus pruebas unitarias. - -* Para este proyecto **no está permitido** utilizar `async/await`. - -* Para este proyecto te sugerimos **no utilizar** la versión síncrona - de la función para leer archivos, `readFileSync`, y en cambio intentar - resolver este desafío de manera asíncrona. - -* Para este proyecto es **opcional** el uso de ES Modules `(import/export)`, en el - caso optes utilizarlo deberás de crear un script de `build` en el `package.json` - que los transforme en `requires` y `module.exports` con ayuda de **babel**. - -* Para disminuir la complejidad de tu algoritmo recursivo, te recomendamos - utilizar la versión síncrona de la función para leer directorios, `readdirSync`. - -## 5. Criterios de aceptación mínimos del proyecto - -Para comenzar este proyecto tendrás que hacer un **_fork_** y **_clonar_** este -repositorio. - -Antes de comenzar a codear, es necesario crear un **plan de acción**. Esto debería -quedar detallado en el `README.md` de tu repo y en una serie de **_issues_** -y **_milestones_** para priorizar y organizar el trabajo, y para poder hacer -seguimiento de tu progreso. - -Dentro de cada **_milestone_** se crearán y asignarán los **_issues_** que cada quien -considere necesarios. - -### Archivos del proyecto - -* `README.md` con descripción del módulo, instrucciones de instalación/uso, - documentación del API y ejemplos. Todo lo relevante para que cualquier - developer que quiera usar tu librería pueda hacerlo sin inconvenientes. -* `index.js`: Desde este archivo debes exportar **una** función (`mdLinks`). -* `package.json` con nombre, versión, descripción, autores, licencia, - dependencias, scripts (pretest, test, ...), main, bin -* `.editorconfig` con configuración para editores de texto. Este archivo no se - debe cambiar. -* `.eslintrc` con configuración para linter. Este archivo contiene una - configuración básica para ESLint, si deseas agregar reglas adicionales - como Airbnb deberás modificar este archivo. -* `.gitignore` para ignorar `node_modules` u otras carpetas que no deban - incluirse en control de versiones (`git`). -* `test/md-links.spec.js` debe contener los tests unitarios para la función - `mdLinks()`. Tu implementación debe pasar estos tests. - -## Este proyecto consta de DOS partes - -### 1) JavaScript API - -El módulo debe poder **importarse** en otros scripts de Node.js y debe ofrecer la -siguiente interfaz: - -#### `mdLinks(path, options)` - -##### Argumentos - -* `path`: Ruta **absoluta** o **relativa** al **archivo** o **directorio**. -Si la ruta pasada es relativa, debe resolverse como relativa al directorio -desde donde se invoca node - _current working directory_). -* `options`: Un objeto con **únicamente** la siguiente propiedad: - - `validate`: Booleano que determina si se desea validar los links - encontrados. - -##### Valor de retorno - -La función debe **retornar una promesa** (`Promise`) que **resuelva a un arreglo** -(`Array`) de objetos (`Object`), donde cada objeto representa un link y contiene -las siguientes propiedades - -Con `validate:false` : - -* `href`: URL encontrada. -* `text`: Texto que aparecía dentro del link (`
`). -* `file`: Ruta del archivo donde se encontró el link. - -Con `validate:true` : - -* `href`: URL encontrada. -* `text`: Texto que aparecía dentro del link (``). -* `file`: Ruta del archivo donde se encontró el link. -* `status`: Código de respuesta HTTP. -* `ok`: Mensaje `fail` en caso de fallo u `ok` en caso de éxito. - -#### Ejemplo (resultados como comentarios) - -```js -const mdLinks = require("md-links"); - -mdLinks("./some/example.md") - .then(links => { - // => [{ href, text, file }, ...] - }) - .catch(console.error); - -mdLinks("./some/example.md", { validate: true }) - .then(links => { - // => [{ href, text, file, status, ok }, ...] - }) - .catch(console.error); - -mdLinks("./some/dir") - .then(links => { - // => [{ href, text, file }, ...] - }) - .catch(console.error); -``` - -### 2) CLI (Command Line Interface - Interfaz de Línea de Comando) - -El ejecutable de nuestra aplicación debe poder ejecutarse de la siguiente -manera a través de la **terminal**: - -`md-links [options]` - -Por ejemplo: - -```sh -$ md-links ./some/example.md -./some/example.md http://algo.com/2/3/ Link a algo -./some/example.md https://otra-cosa.net/algun-doc.html algún doc -./some/example.md http://google.com/ Google -``` - -El comportamiento por defecto no debe validar si las URLs responden ok o no, -solo debe identificar el archivo markdown (a partir de la ruta que recibe como -argumento), analizar el archivo Markdown e imprimir los links que vaya -encontrando, junto con la ruta del archivo donde aparece y el texto -que hay dentro del link (truncado a 50 caracteres). - -#### Options - -##### `--validate` - -Si pasamos la opción `--validate`, el módulo debe hacer una petición HTTP para -averiguar si el link funciona o no. Si el link resulta en una redirección a una -URL que responde ok, entonces consideraremos el link como ok. - -Por ejemplo: - -```sh -$ md-links ./some/example.md --validate -./some/example.md http://algo.com/2/3/ ok 200 Link a algo -./some/example.md https://otra-cosa.net/algun-doc.html fail 404 algún doc -./some/example.md http://google.com/ ok 301 Google -``` - -Vemos que el _output_ en este caso incluye la palabra `ok` o `fail` después de -la URL, así como el status de la respuesta recibida a la petición HTTP a dicha -URL. - -##### `--stats` - -Si pasamos la opción `--stats` el output (salida) será un texto con estadísticas -básicas sobre los links. - -```sh -$ md-links ./some/example.md --stats -Total: 3 -Unique: 3 -``` - -También podemos combinar `--stats` y `--validate` para obtener estadísticas que -necesiten de los resultados de la validación. - -```sh -$ md-links ./some/example.md --stats --validate -Total: 3 -Unique: 3 -Broken: 1 -``` - -## 6. Entregables - -Módulo instalable via `npm install /md-links`. Este módulo debe -incluir tanto **un ejecutable** como **una interfaz** que podamos importar con `require` -para usarlo programáticamente. - -## 7. Hacker edition - -Las secciones llamadas _Hacker Edition_ son **opcionales**. Si **terminaste** -con todo lo anterior y te queda tiempo, intenta completarlas. Así podrás -profundizar y/o ejercitar más sobre los objetivos de aprendizaje del proyecto. - -* Puedes agregar la propiedad `line` a cada objeto `link` indicando en qué línea - del archivo se encontró el link. -* Puedes agregar más estadísticas. -* Integración continua con Travis o Circle CI. - -*** - -## 8. Pistas, tips y lecturas complementarias - -Súmate al canal de Slack -[#project-md-links](https://claseslaboratoria.slack.com/archives/C03T1E5TJCQ) -para conversar y pedir ayuda del proyecto. - -### FAQs - -#### ¿Cómo hago para que mi módulo sea _instalable_ desde GitHub? - -Para que el módulo sea instalable desde GitHub solo tiene que: - -* Estar en un repo público de GitHub -* Contener un `package.json` válido - -Con el comando `npm install githubname/reponame` podemos instalar directamente -desde GitHub. Ver [docs oficiales de `npm install` acá](https://docs.npmjs.com/cli/install). - -Por ejemplo, el [`course-parser`](https://github.com/Laboratoria/course-parser) -que usamos para la currícula no está publicado en el registro público de NPM, -así que lo instalamos directamente desde GitHub con el comando `npm install -Laboratoria/course-parser`. - -### Sugerencias de implementación - -La implementación de este proyecto tiene varias partes: leer del sistema de -archivos, recibir argumentos a través de la línea de comando, analizar texto, -hacer consultas HTTP, ... y todas estas cosas pueden enfocarse de muchas formas, -tanto usando librerías como implementando en VanillaJS. - -Por poner un ejemplo, el _parseado_ (análisis) del markdown para extraer los -links podría plantearse de las siguientes maneras (todas válidas): - -* Usando un _módulo_ como [markdown-it](https://github.com/markdown-it/markdown-it), - que nos devuelve un arreglo de _tokens_ que podemos recorrer para identificar - los links. -* Siguiendo otro camino completamente, podríamos usar - [expresiones regulares (`RegExp`)](https://developer.mozilla.org/es/docs/Web/JavaScript/Guide/Regular_Expressions). -* También podríamos usar una combinación de varios _módulos_ (podría ser válido - transformar el markdown a HTML usando algo como [marked](https://github.com/markedjs/marked) - y de ahí extraer los link con una librería de DOM como [JSDOM](https://github.com/jsdom/jsdom) - o [Cheerio](https://github.com/cheeriojs/cheerio) entre otras). -* Usando un _custom renderer_ de [marked](https://github.com/markedjs/marked) - (`new marked.Renderer()`). - -No dudes en consultar a tus compañeras y coaches -si tienes dudas existenciales con respecto a estas decisiones. No existe una -"única" manera correcta :wink: - -### Tutoriales / NodeSchool workshoppers - -* [learnyounode](https://github.com/workshopper/learnyounode) -* [how-to-npm](https://github.com/workshopper/how-to-npm) -* [promise-it-wont-hurt](https://github.com/stevekane/promise-it-wont-hurt) - -### Otros recursos - -* [Acerca de Node.js - Documentación oficial](https://nodejs.org/es/about/) -* [Node.js file system - Documentación oficial](https://nodejs.org/api/fs.html) -* [Node.js http.get - Documentación oficial](https://nodejs.org/api/http.html#http_http_get_options_callback) -* [Node.js - Wikipedia](https://es.wikipedia.org/wiki/Node.js) -* [What exactly is Node.js? - freeCodeCamp](https://medium.freecodecamp.org/what-exactly-is-node-js-ae36e97449f5) -* [¿Qué es Node.js y para qué sirve? - drauta.com](https://www.drauta.com/que-es-nodejs-y-para-que-sirve) -* [¿Qué es Nodejs? Javascript en el Servidor - Fazt en YouTube](https://www.youtube.com/watch?v=WgSc1nv_4Gw) -* [¿Simplemente qué es Node.js? - IBM Developer Works, 2011](https://www.ibm.com/developerworks/ssa/opensource/library/os-nodejs/index.html) -* [Node.js y npm](https://www.genbeta.com/desarrollo/node-js-y-npm) -* [Asíncronía en js](https://carlosazaustre.es/manejando-la-asincronia-en-javascript) -* [NPM](https://docs.npmjs.com/getting-started/what-is-npm) -* [Publicar packpage](https://docs.npmjs.com/getting-started/publishing-npm-packages) -* [Crear módulos en Node.js](https://docs.npmjs.com/getting-started/publishing-npm-packages) -* [Leer un archivo](https://nodejs.org/api/fs.html#fs_fs_readfile_path_options_callback) -* [Leer un directorio](https://nodejs.org/api/fs.html#fs_fs_readdir_path_options_callback) -* [Path](https://nodejs.org/api/path.html) -* [Linea de comando CLI](https://medium.com/netscape/a-guide-to-create-a-nodejs-command-line-package-c2166ad0452e) - -## 9. Checklist - -### General - -* [ ] Puede instalarse via `npm install --global /md-links` - -### `README.md` - -* [ ] Un board con el backlog para la implementación de la librería. -* [ ] Documentación técnica de la librería. -* [ ] Guía de uso e instalación de la librería - -### API `mdLinks(path, opts)` - -* [ ] El módulo exporta una función con la interfaz (API) esperada. -* [ ] Implementa soporte para archivo individual -* [ ] Implementa soporte para directorios -* [ ] Implementa `options.validate` - -### CLI - -* [ ] Expone ejecutable `md-links` en el path (configurado en `package.json`) -* [ ] Se ejecuta sin errores / output esperado -* [ ] Implementa `--validate` -* [ ] Implementa `--stats` - -### Pruebas / tests - -* [ ] Pruebas unitarias cubren un mínimo del 70% de statements, functions, - lines, y branches. -* [ ] Pasa tests (y linters) (`npm test`). - -## 10. Achicando el problema - -Un "superpoder" que esperamos puedas desarrollar durante el bootcamp -es el de definir "mini-proyectos" que te acerquen paso a paso a -la solución del "gran proyecto". Es el equivalente a comenzar armando -esquinas o bordes del rompecabezas/puzzle sin saber necesariamente -cómo encajarán al final. Déjate llevar y explora. - -Estas son algunas sugerencias: - -### Empieza con un diagrama de flujo - -Este proyecto es distinto de los que has venido trabajando hasta ahora -dado que no hay una interfaz web, todo se desarrollará en tu editor y -consola/terminal. - -Es por ello que, para visualizar mejor lo que tendrás que hacer -y planificar tus tareas y objetivos, es recomendable hacer un -`diagrama de flujo`. - -Si nunca has hecho un diagrama de flujo revisa este [recurso](https://www.youtube.com/watch?v=Lub5qOmY4JQ). - -Una alternativa al diagrama de flujo puede ser el `pseudocódigo`. - -### Planificación - -En este proyecto te recomendamos usar la herramienta de planificación -y organización de GitHub llamada **Github Projects**. - -Mediante **issues** y **milestones** podrás organizar y planificar -tareas y objetivos concretos. - -Tomando en consideración los **entregables** del proyecto, el -[9. Checklist](#9-checklist) y los **pasos** que definiste en tu -`diagrama de flujo`, crea tu planificación en GitHub Projects. - -### Antes de codear - -En esta ocasión estarás trabajando en **NodeJS**, asegúrate -de saber para qué sirve y sus consideraciones. - -En particular, deberás decidir desde un comienzo si usarás -`ES Modules`, es decir, **import/export**, ó, por el contrario, -`CommonJS Modules`, es decir, **require/module.exports**. - -Asegurate de tener clara esta decisión desde un inicio para -que no encuentres problemas más adelante. - -### Lee un archivo - -Como primer reto, puedes tratar de leer un solo archivo con -una ruta fija e imprimir su contenido en la consola con un `console.log`. - -La librería nativa `FS` (FileSystem) te será de utilidad. - -**Recuerda**: Te sugerimos **no utilizar** la versión síncrona -de la función para leer archivos, `readFileSync`, y en cambio -intentar resolver ese desafío de manera asíncrona. - -### Averigua la extensión de un archivo - -Ya sabiendo leer un archivo, aventúrate a conocer cual -es su extensión. - -Recuerda, las extensiones son esas letras al final del -nombre de un archivo, por ejemplo: .js, .txt, .doc, etc - -Aquí también podrá ser útil `FS`. - -### Obtén el contenido de un directorio - -Este proyecto consiste en buscar archivos, pero para eso, -primero debes poder verlos. - -Intenta imprimir en consola la lista de archivos en una carpeta. - -La librería `FS` también te será útil aquí. - -**Recuerda**: Para disminuir la complejidad de tu algoritmo -recursivo, te recomendamos utilizar la versión síncrona de -la función para leer directorios, `readdirSync`. - -### Une dos rutas - -Para poder acceder a carpetas y archivos será necesario que -indiques en qué lugar de tu computadora se encuentran, a esto -le llamamos **rutas**. - -Usa la librería nativa `path` para unir dos segmentos de ruta, -por ejemplo, si queremos unir: - -1) /home/Laboratoria/ -2) ./test - -El resultado sería: /home/Laboratoria/test - -### Recursividad - -Este proyecto se ha de resolver de forma casi natural con -**recursividad**. - -¿Por qué?. - -Porque no conocemos realmente cuantas carpetas y archivos -tendremos que recorrer antes de terminar. - -Si recibes una ruta de carpeta, no sabrás de ante mano si -dentro hay más carpetas o muchos archivos. - -Por ello, asegurate bien de entender de qué trata la -recursividad y ver algunos ejemplos. - -Entre los recursos de este proyecto hay un video que te ayudará. - -### Crea una promesa - -El valor de retorno de nuestra librería es una `Promesa`, -no un `Array`. - -Prueba leyendo sobre las promesas y creando una por tu -cuenta utilizando **new Promise()** - -Es importante que sepas qué es un **callback** pues las -promesas los utilizarán. +## 4. Ejemplos +![option -v](option v.JPG) +![option -s](option s.JPG) diff --git a/cli.js b/cli.js index 2ef2af2..3fb7388 100644 --- a/cli.js +++ b/cli.js @@ -12,7 +12,7 @@ console.log(" /\\_/\\"); console.log("=( o.o )="); console.log(" > - <"); -console.log(chalk.yellow("Quick tip! If your path has inverted backslashes instead of '/',\n please enter your path within double quotes ^^ \n")); +console.log(chalk.yellow("Quick tip! If your path has inverted backslashes instead of '/',\n please enter your path within double quotes, ty! ;) \n")); // Yargs hace el CLI ejecutable diff --git a/option s.JPG b/option s.JPG new file mode 100644 index 0000000000000000000000000000000000000000..b7e00b027e6cc43821fda94a79825f915499602b GIT binary patch literal 36269 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 literal 0 HcmV?d00001 diff --git a/option v.JPG b/option v.JPG new file mode 100644 index 0000000000000000000000000000000000000000..15f0331f64994e550ba5d1a66039f20c18ddc191 GIT binary patch literal 37312 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%0DE9AQX_^n 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�p~fDn#h7)h0C>| zu`wxgQ>f2g)ry5Sf;UyGp*LI7 zg(b(}Tcc^Khh>cR8W|CGn(tNngzi&VEU2ml`5W?2V9%=W2v~XFy#3|Lt0EZyDInl3 zQeJBxWL4cQ@OXL~QJc(D<*qe(MduJla@ml z<)5i1@jQ;dgSw5Dw)fd-CPM1TH?Zs1`Lm#tB!=NqpZ0Y!UQFqzR+7avsGg^D!Z}z1 zmM3+0BteBycpley?$nm1tY4>vinaUCRXHEPWmA!op}>dxJ9HkLY9nLSVwsGmHH=2p z0SB(KK@@nwV0+`TNO8T>y!Qp#Aa=?045}t)CLyV{a+Vm)U`XCzVD20N2*>Y9&ET8r zLCoqUL567!zS}3$vdy1rL{1TB)Nj!wngQt|mD?F2^3LrfD9u;0>uqIUt%59lz*}JN1Y5og%d>WoJ<06pfD`@x`sw3X!S$G-HO$6_k`Q3al~La2f`?`Ft!STvZ6)06 zHg|pw+fWwmw?ZXq6`7cHKPpPf`d44V)JUC(Im(_)o{1Dbqmu5$J6%}(1;ktF`~}42 zPF?#2U*Dc^@j;4>HY1svDjlSDG$k?&5@S{GCGiMlNAi6B&s>@PM{WCeDmYU@9Gh3?r34i99pm@7LeCzBM^ zHjD!6ve#Ji;r2>x7?b*_j>I&KWk`n7IH5cL#bU;n4{Nwi1U?9lN>3kWFy7or#CZKc52)Cdp{=T)N zPo0sryIC=o*LixV4fVh=V-%DRB6zm$tCI!#JCyW(DUnE~su}Bhl%^gV@6IeRv=1Xs zy>huNo`=!>Wba~2`6(ynT|Ctq1A|*uj-3u`-LHADH%o5Sg8I;6@NfgzQHrVVY@a7+ zXXzJV=Iv#>C-bK@_}5*BCkkzxbZpzK4r8}EzONm)Z%;+*>wGqO)t5UW#P_vAeP47o zS5mryw)Lf)#s+*&5kAJ`y}d-kECLtpe)K%S_SW#*R zUUyGol1WhSy-Lxp99}pux=zhfsi!bmxfa=J)eRv*s!@I7|C*5k3#;es4;(2^_|T=M zGicYp%77lfc{FRL=9!iG;q*TG^;fb^NP8E6bvjR=MaD)7hnpN%{h4l2qVtY9136b6 zci%fc)WifO`ZdbWxfXxYxHM>Tu<_2a3R6>$an%gv4w2<^H!%q1ZP&m?7q)NixC)e5 zF7^iU%0)(0enCi$JSfQd!q9uwD{fiHnn>R#Hk$s=Dt@UIIx5tF|IX`Qm4ovCw$UnHfoMg-3`9X< z@bg47XO8LRwWCt*iBXUgq=X+EDYbvI`(Oiq=e3Y<_$$(tL8#{U#k1feiM-|P^Ka$5 z6J(8J>>qUl-qhaniX6IEceozn&-U5wFQAd!v~GmMncJ-RH#L7@{iiYbeObx*?eT~0 zr|2lNI?Q-pGo~6Pk!dbX$KgdQ-6t`eTz}A>o7MSv?G;r&grgIpSrUm)f?2{B)hyNA zCp2_*CU)_7LO<2L<)bL{8|nww7+ar)4T>QL8T`mX5?}_{jJq#g$n_Il7rNfq81|s5 z`31c+oCUeri?P8~JtOPf+l$+cCKxuQ-bRA2;Ad`k$uY6w6qFrn#%XfMvRaV?_b5E0Zz5WV8B# zhdWG47ADLtOr$1<+mgwcv}**bPX2H&MTf1|@qe!-(WQ8V0jP>lXeCOXE?sHnG+#>b zR`5|ggf=%xuzI$09Gw-ck3$w9khL0XN0JY!pEl-4siFyDyvsyw`GPiB!d(g%5NL|# zPgm_-sG!+rhuGfCwZ+)V$b)BzZmeI%dVB_D;!zs?$m$JyjySWl!6_V-qrh9yjdFC3iaP(0n+Z z22+8~`^quiqSYVu-qnP4Peor$a&iXcNg0@M<1p8X Date: Thu, 7 Sep 2023 03:13:44 -0600 Subject: [PATCH 08/10] fix imgs readme --- README.md | 4 ++-- option s.JPG => options.JPG | Bin option v.JPG => optionv.JPG | Bin thumb.png | Bin 16777 -> 0 bytes 4 files changed, 2 insertions(+), 2 deletions(-) rename option s.JPG => options.JPG (100%) rename option v.JPG => optionv.JPG (100%) delete mode 100644 thumb.png diff --git a/README.md b/README.md index be4b877..8fa9110 100644 --- a/README.md +++ b/README.md @@ -36,5 +36,5 @@ Y después en la consola podrás utilizarlo como en este ejemplo: md-links + La ruta relativa o absoluta del archivo, ejemplo: ./nombredeCarperta + Opciones de comandos ## 4. Ejemplos -![option -v](option v.JPG) -![option -s](option s.JPG) +![option -v](optionv.JPG) +![option -s](options.JPG) diff --git a/option s.JPG b/options.JPG similarity index 100% rename from option s.JPG rename to options.JPG diff --git a/option v.JPG b/optionv.JPG similarity index 100% rename from option v.JPG rename to optionv.JPG diff --git a/thumb.png b/thumb.png deleted file mode 100644 index a63dca31cddbf5baf59f5bb2851db706d709e653..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16777 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≥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 Date: Thu, 7 Sep 2023 03:16:26 -0600 Subject: [PATCH 09/10] fix2readme --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index bfffa20..11c4d9e 100644 --- a/index.js +++ b/index.js @@ -54,7 +54,7 @@ const mdLinks = (filePath, options = { validate: false, stats: false }) => new P console.error(error); }); */ - +//Comentario imagenes module.exports = { mdLinks, }; \ No newline at end of file From 1e041f7e8335499adb18e1fde258cebfb7e3b415 Mon Sep 17 00:00:00 2001 From: LindaRobles Date: Thu, 7 Sep 2023 03:18:34 -0600 Subject: [PATCH 10/10] changes images --- functions.js | 2 +- index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/functions.js b/functions.js index 07b4d30..b1863fd 100644 --- a/functions.js +++ b/functions.js @@ -24,7 +24,7 @@ function isMarkdownFile(filePath) { //const filePath = 'D:/Laboratoria/DEV008-md-links/README.md'; //const filePath = 'D:/Laboratoria/DEV008-md-links/extra.md'; //error al copiar path? -//Función para voltear el path**por windows!!! + // Leer el archivo .md function readFileContent(filePath) { diff --git a/index.js b/index.js index 11c4d9e..bfffa20 100644 --- a/index.js +++ b/index.js @@ -54,7 +54,7 @@ const mdLinks = (filePath, options = { validate: false, stats: false }) => new P console.error(error); }); */ -//Comentario imagenes + module.exports = { mdLinks, }; \ No newline at end of file