From 58c137a839b8170897cee4763f3d225536b7e575 Mon Sep 17 00:00:00 2001 From: tania lizbeth garcia fierro Date: Tue, 28 Feb 2023 09:53:02 -0600 Subject: [PATCH 01/11] =?UTF-8?q?realizando=20la=20primera=20funci=C3=B3n?= =?UTF-8?q?=20para=20leer=20archivos,=20cambios=20en=20el=20diagrama=20de?= =?UTF-8?q?=20flujo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 40 ++- mdLinks.js | 21 ++ package-lock.json | 26 ++ package.json | 5 +- test.drawio | 754 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 843 insertions(+), 3 deletions(-) create mode 100644 mdLinks.js create mode 100644 package-lock.json create mode 100644 test.drawio diff --git a/index.js b/index.js index a4e4a45..1b1252f 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,39 @@ -module.exports = () => { - // ... +const fs = require('fs'); //modulo de node.js lee, escribe archivos... +const path = require('path'); //modulo de node.js trabaja con rutas de archivos en los directorios + +const colors = require('colors'); + +// Función para ver si la ruta existe +const validPath = (route) => fs.existsSync(route); + +//Función para ver si la ruta es un archivo +const file = (route) => fs.statSync(route).file(); + +//Función para ver si es un archivo md +const mdFile = (route) => (path.extname(route) === '.md'); + +//Función para hacerla absoluta | en caso de ser relativa la convierte +const absolutePath = (route) => (path.isAbsolute(route) ? route : path.resolve(route)); + + + + + + + + +console.log(colors.blue('Probando...')); +console.log(colors.rainbow('MdLinks')); +console.log(colors.magenta('trabajando con Node.js')); +console.log(colors.bgCyan('<3')); + + +module.exports = { + validPath, + file, + mdFile, + absolutePath, + }; + + diff --git a/mdLinks.js b/mdLinks.js new file mode 100644 index 0000000..a64104d --- /dev/null +++ b/mdLinks.js @@ -0,0 +1,21 @@ +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); + + module.exports = { mdLinks }; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4f8b511 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,26 @@ +{ + "name": "md-links", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "md-links", + "version": "0.1.0", + "dependencies": { + "colors": "^1.4.0" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } + } + } +} diff --git a/package.json b/package.json index 5c10b74..149a734 100644 --- a/package.json +++ b/package.json @@ -8,5 +8,8 @@ "createdAt": "2022-11-30T13:40:29.636Z", "version": "5.5.0", "commit": "51e941edf1cc991930aefd7dd9c406a7c43741c1" + }, + "dependencies": { + "colors": "^1.4.0" } -} \ No newline at end of file +} diff --git a/test.drawio b/test.drawio new file mode 100644 index 0000000..ff111a2 --- /dev/null +++ b/test.drawio @@ -0,0 +1,754 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From cd3fe2139112d780f19b3614ad2545ab2fda2d85 Mon Sep 17 00:00:00 2001 From: tania lizbeth garcia fierro Date: Wed, 8 Mar 2023 07:15:27 -0600 Subject: [PATCH 02/11] se crea archivo funcitons para colocar todas las funciones --- examplesFiles/oneFile.md | 3 + functions.js | 36 ++++++++++++ index.js | 9 +-- pruebas/probando/prueba1.2 | 0 pruebas/prueba1.js | 0 test.drawio | 116 ++++++++++++++++++------------------- 6 files changed, 99 insertions(+), 65 deletions(-) create mode 100644 examplesFiles/oneFile.md create mode 100644 functions.js create mode 100644 pruebas/probando/prueba1.2 create mode 100644 pruebas/prueba1.js diff --git a/examplesFiles/oneFile.md b/examplesFiles/oneFile.md new file mode 100644 index 0000000..3770729 --- /dev/null +++ b/examplesFiles/oneFile.md @@ -0,0 +1,3 @@ +motor de JavaScript V8 de Chrome. 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, ... + +Dentro de una comunidad de código abierto, nos han propuesto crear una herramienta usando Node.js, que lea y analice archivos en formato Markdown, para verificar los links que contengan y reportar algunas estadísticas. https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing12345/Client-side_JavaScript_frameworks diff --git a/functions.js b/functions.js new file mode 100644 index 0000000..1aea8de --- /dev/null +++ b/functions.js @@ -0,0 +1,36 @@ +const fs = require('fs'); +const path = require('path'); +const process = require('process'); +const colors = require('colors'); +// console.log(fs); + +//verficar que la ruta sea válida +// console.log(fs.existsSync('./pruebas')); +const validPath = (route) => fs.existsSync(route); + +//ver si la ruta es absoluta +// console.log(path.isAbsolute('./pruebas')); +const absolutePath = (route) => path.isAbsolute(route); + +//convierte de relativa en absoluta +// console.log (process.cwd('./pruebas')); +// ruta transformada: C:\Users\tania\OneDrive\Escritorio\Proyectos Laboratoria\mdLinks\DEV002-md-links + +const transformAbs = (route) => { + const validateDirectory = process.cwd(); + return path.resolve(validateDirectory, route); +}; + +//Validar que sea un directorio +// console.log (fs.statSync('./pruebas')); +// console.log(stats.isDirectory('./pruebas')); +const validateDirectory = (route) => { + const stats = fs.statSync(route); + return stats.isDirectory(); +}; + +//lee los archivos del directorio +//console.log(fs.readdirSync('./pruebas')); debería devolver un array con el contenido de ese directorio +const readDir = (route) => fs.readdirSync(route); + +//validar que la función sea md diff --git a/index.js b/index.js index 1b1252f..00c6821 100644 --- a/index.js +++ b/index.js @@ -12,14 +12,10 @@ const file = (route) => fs.statSync(route).file(); //Función para ver si es un archivo md const mdFile = (route) => (path.extname(route) === '.md'); -//Función para hacerla absoluta | en caso de ser relativa la convierte -const absolutePath = (route) => (path.isAbsolute(route) ? route : path.resolve(route)); - - - - +//Función para hacerla absoluta | en caso de ser relativa la convierte +const absolutePath = (route) => (path.isAbsolute(route) ? route : path.resolve(route)); console.log(colors.blue('Probando...')); @@ -27,7 +23,6 @@ console.log(colors.rainbow('MdLinks')); console.log(colors.magenta('trabajando con Node.js')); console.log(colors.bgCyan('<3')); - module.exports = { validPath, file, diff --git a/pruebas/probando/prueba1.2 b/pruebas/probando/prueba1.2 new file mode 100644 index 0000000..e69de29 diff --git a/pruebas/prueba1.js b/pruebas/prueba1.js new file mode 100644 index 0000000..e69de29 diff --git a/test.drawio b/test.drawio index ff111a2..c23a353 100644 --- a/test.drawio +++ b/test.drawio @@ -1,17 +1,17 @@ - + - + - + @@ -20,7 +20,7 @@ - + @@ -72,7 +72,7 @@ - + @@ -81,7 +81,7 @@ - + @@ -162,7 +162,7 @@ - + @@ -173,28 +173,28 @@ - + - + - + - + - + @@ -203,151 +203,151 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -356,7 +356,7 @@ - + @@ -365,7 +365,7 @@ - + @@ -374,7 +374,7 @@ - + @@ -383,34 +383,34 @@ - + - + - + - + - + - + - + - + - + @@ -419,14 +419,14 @@ - + - + From f7a93707596e3f83ed8cc390922566a91f8f9b65 Mon Sep 17 00:00:00 2001 From: tania lizbeth garcia fierro Date: Wed, 8 Mar 2023 17:28:35 -0600 Subject: [PATCH 03/11] se realiza funcion de la recursividad --- functions.js | 63 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/functions.js b/functions.js index 1aea8de..d602878 100644 --- a/functions.js +++ b/functions.js @@ -1,7 +1,7 @@ -const fs = require('fs'); -const path = require('path'); -const process = require('process'); -const colors = require('colors'); +const fs = require("fs"); +const path = require("path"); +const process = require("process"); +const colors = require("colors"); // console.log(fs); //verficar que la ruta sea válida @@ -13,24 +13,65 @@ const validPath = (route) => fs.existsSync(route); const absolutePath = (route) => path.isAbsolute(route); //convierte de relativa en absoluta -// console.log (process.cwd('./pruebas')); +// console.log(process.cwd("./pruebas")); // ruta transformada: C:\Users\tania\OneDrive\Escritorio\Proyectos Laboratoria\mdLinks\DEV002-md-links const transformAbs = (route) => { - const validateDirectory = process.cwd(); - return path.resolve(validateDirectory, route); + const validateDirectory = process.cwd(); + return path.resolve(validateDirectory, route); }; //Validar que sea un directorio // console.log (fs.statSync('./pruebas')); // console.log(stats.isDirectory('./pruebas')); -const validateDirectory = (route) => { - const stats = fs.statSync(route); - return stats.isDirectory(); + +const validDir = (route) => { + const stats = fs.statSync(route); + return stats.isDirectory(); }; //lee los archivos del directorio //console.log(fs.readdirSync('./pruebas')); debería devolver un array con el contenido de ese directorio -const readDir = (route) => fs.readdirSync(route); +const readFile = (route) => fs.readdirSync(route); //validar que la función sea md +const mdFile = (route) => (path.extname(route) === ".md" ? true : false); + +//recursividad +const recursive = (paths) => { + let arrReadMd = []; + if (mdFile(paths)) { + arrReadMd.push(paths); //se llena si la ruta tiene ext md si no es un directorio + } else if (validDir(paths)) { + const contentRoute = readFile(paths); //leer las rutas del directorio e itera el contenido que tiene + contentRoute.forEach((paths) => { + console.log( + (arrReadMd = arrReadMd.concat( + // recursive(`${}/${}`) //concatenar la ruta de los directorios para que me los devuelva en un array + )) + ); + }); + } + return arrReadMd; +}; + +//leer contenidos de archivos md + +const readFileMd = (route) => { + return new Promise((resolve, reject) => { + fs.readFile(route,"utf-8", (error, data) => { + if (error) { + reject("ocurrió un error"); + } else { + resolve(data); + } + }); + }); +}; + +readFileMd('README.md').then((data) => { + console.log(data) + +}).catch((error) => { + console.log(error) +}) From 2e9b76f9fb6bafd27bdb4787496c0ea3d81f9cb8 Mon Sep 17 00:00:00 2001 From: tania lizbeth garcia fierro Date: Thu, 9 Mar 2023 08:38:28 -0600 Subject: [PATCH 04/11] acomdando funciones --- examplesFiles/{oneFile.md => prueba2.md} | 0 examplesFiles/pruebas/ejemplos/prueba1.md | 8 ++++++++ .../prueba1.2 => examplesFiles/pruebas/prueba0.md | 0 functions.js | 12 +++++++----- pruebas/prueba1.js | 0 5 files changed, 15 insertions(+), 5 deletions(-) rename examplesFiles/{oneFile.md => prueba2.md} (100%) create mode 100644 examplesFiles/pruebas/ejemplos/prueba1.md rename pruebas/probando/prueba1.2 => examplesFiles/pruebas/prueba0.md (100%) delete mode 100644 pruebas/prueba1.js diff --git a/examplesFiles/oneFile.md b/examplesFiles/prueba2.md similarity index 100% rename from examplesFiles/oneFile.md rename to examplesFiles/prueba2.md diff --git a/examplesFiles/pruebas/ejemplos/prueba1.md b/examplesFiles/pruebas/ejemplos/prueba1.md new file mode 100644 index 0000000..7b43153 --- /dev/null +++ b/examplesFiles/pruebas/ejemplos/prueba1.md @@ -0,0 +1,8 @@ +1. Preámbulo +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, que lea y analice archivos en formato Markdown, para verificar los links que contengan y reportar algunas estadísticas. + +Módulos, librerías, paquetes, frameworks... ¿cuál es la diferencia? \ No newline at end of file diff --git a/pruebas/probando/prueba1.2 b/examplesFiles/pruebas/prueba0.md similarity index 100% rename from pruebas/probando/prueba1.2 rename to examplesFiles/pruebas/prueba0.md diff --git a/functions.js b/functions.js index d602878..6057688 100644 --- a/functions.js +++ b/functions.js @@ -4,15 +4,17 @@ const process = require("process"); const colors = require("colors"); // console.log(fs); -//verficar que la ruta sea válida +//FUNCIONES A UTILIZAR + +//¿La ruta existe? // console.log(fs.existsSync('./pruebas')); const validPath = (route) => fs.existsSync(route); -//ver si la ruta es absoluta +//¿La ruta es absoluta? // console.log(path.isAbsolute('./pruebas')); const absolutePath = (route) => path.isAbsolute(route); -//convierte de relativa en absoluta +//convierte la ruta de relativa en absoluta // console.log(process.cwd("./pruebas")); // ruta transformada: C:\Users\tania\OneDrive\Escritorio\Proyectos Laboratoria\mdLinks\DEV002-md-links @@ -21,7 +23,7 @@ const transformAbs = (route) => { return path.resolve(validateDirectory, route); }; -//Validar que sea un directorio +//¿Es un directorio? // console.log (fs.statSync('./pruebas')); // console.log(stats.isDirectory('./pruebas')); @@ -55,7 +57,7 @@ const recursive = (paths) => { return arrReadMd; }; -//leer contenidos de archivos md +//lee directorios y retorna archivos md const readFileMd = (route) => { return new Promise((resolve, reject) => { diff --git a/pruebas/prueba1.js b/pruebas/prueba1.js deleted file mode 100644 index e69de29..0000000 From 9ece7f9728c0fde22518e65cccbc6ccbf028d268 Mon Sep 17 00:00:00 2001 From: tania lizbeth garcia fierro Date: Thu, 9 Mar 2023 17:21:43 -0600 Subject: [PATCH 05/11] =?UTF-8?q?instalaci=C3=B3n=20de=20axios=20y=20prett?= =?UTF-8?q?ier,=20se=20termina=20la=20funci=C3=B3n=20validar=20ruta=20y=20?= =?UTF-8?q?devolver=20el=20objeto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functions.js | 109 +++++++++++++++++++++++++++++++++++++++------- package-lock.json | 91 ++++++++++++++++++++++++++++++++++++++ package.json | 1 + 3 files changed, 186 insertions(+), 15 deletions(-) diff --git a/functions.js b/functions.js index 6057688..c782214 100644 --- a/functions.js +++ b/functions.js @@ -1,12 +1,13 @@ const fs = require("fs"); const path = require("path"); const process = require("process"); +const axios = require("axios"); const colors = require("colors"); // console.log(fs); //FUNCIONES A UTILIZAR -//¿La ruta existe? +//¿La ruta existe? // console.log(fs.existsSync('./pruebas')); const validPath = (route) => fs.existsSync(route); @@ -48,10 +49,11 @@ const recursive = (paths) => { const contentRoute = readFile(paths); //leer las rutas del directorio e itera el contenido que tiene contentRoute.forEach((paths) => { console.log( - (arrReadMd = arrReadMd.concat( - // recursive(`${}/${}`) //concatenar la ruta de los directorios para que me los devuelva en un array - )) - ); + (arrReadMd = arrReadMd + .concat + // recursive(`${}/${}`) //concatenar la ruta de los directorios para que me los devuelva en un array + ()) + ); }); } return arrReadMd; @@ -60,20 +62,97 @@ const recursive = (paths) => { //lee directorios y retorna archivos md const readFileMd = (route) => { - return new Promise((resolve, reject) => { - fs.readFile(route,"utf-8", (error, data) => { + return new Promise((res, rej) => { + fs.readFile(route, "utf-8", (error, data) => { if (error) { - reject("ocurrió un error"); + rej("ocurrió un error"); } else { - resolve(data); + res(data); } }); }); }; -readFileMd('README.md').then((data) => { - console.log(data) - -}).catch((error) => { - console.log(error) -}) +// readFileMd('README.md').then((data) => { +// console.log(data) +// +// }).catch((error) => { +// console.log(error) +// }) + +//Validar todo tipo de ruta 'false' +const routeFalse = (route) => { + return new Promise((res, rej) => { + //usar este array para crear un objeto invalidateAllRoutes + const allLinks = []; + //promesa(lento) // probar con readme readContentMd + readFileMd(route) + .then((data) => { + const regExp = + /\[([\w\s\d]+)\]\(((?:\/|https?:\/\/)[\w\d./?=#]+[a-zA-Z0-9!-_$]+)\)/gi; + + //regExp.exec(data)//devuelve array con link que cumplan con la regEx... + + let resultRegEx = regExp.exec(data); //devuelve array iterado + if (resultRegEx !== null) { + // evitar que me devuelva null + + const dataFiles = resultRegEx.map((content) => content); + allLinks.push({ + href: dataFiles[2], + text: dataFiles[1], + file: route, //probar con readme + }); + res(allLinks); + } + }) + .catch((error) => { + rej(error); + }); + }); +}; + +// routeFalse('README.md') +// .then((data) => { +// console.log(data) +// }) +// .catch((error) => { +// console.log(error); +// }); + +//validar ruta (true) devolver un arr de objet + +const trueRoute = (allLinks) => { + // simulando parameter + return Promise.all( + allLinks.map((content) => { + //cada objetc es una promesa y all me dev un arr de promise + axios + .get(content.href) + .then((data) => { + //axios + const objs = { + ...content, + status: data.status, + statusText: data.statusText, + }; + console.log(objs); + }) + .catch((error) => { + const failObject = { + ...content, + status: error.data ? 404 : 404, + statusText: "FAIL", + }; + console.log(failObject); + }); + }) + ); +}; +trueRoute([ + { + href: "https://es.wikipedia.org/wiki/Markdown/tania", + text: "Markdown", + file: "README.md", + }, +]); diff --git a/package-lock.json b/package-lock.json index 4f8b511..c4b0bef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,28 @@ "name": "md-links", "version": "0.1.0", "dependencies": { + "axios": "^1.3.4", "colors": "^1.4.0" }, "engines": { "node": ">=16.x" } }, + "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.3.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -21,6 +37,81 @@ "engines": { "node": ">=0.1.90" } + }, + "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/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/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/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/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==" } } } diff --git a/package.json b/package.json index 149a734..6a299c5 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "commit": "51e941edf1cc991930aefd7dd9c406a7c43741c1" }, "dependencies": { + "axios": "^1.3.4", "colors": "^1.4.0" } } From 70ec4266bfc609eb5fbf282827da07ed07b311d0 Mon Sep 17 00:00:00 2001 From: tania lizbeth garcia fierro Date: Fri, 10 Mar 2023 12:03:05 -0600 Subject: [PATCH 06/11] funcion atats terminada --- functions.js | 62 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 7 deletions(-) diff --git a/functions.js b/functions.js index c782214..78511ba 100644 --- a/functions.js +++ b/functions.js @@ -149,10 +149,58 @@ const trueRoute = (allLinks) => { }) ); }; -trueRoute([ - { - href: "https://es.wikipedia.org/wiki/Markdown/tania", - text: "Markdown", - file: "README.md", - }, -]); +// trueRoute([ +// { +// href: "https://es.wikipedia.org/wiki/Markdown/tania", +// text: "Markdown", +// file: "README.md", +// }, +// ]); + +// estadística de archivos repetidos (en caso de que hayan) console.log(new Set([50,90,30,'veinte', 'ocho', 90,30,'quince'])) //instancia de un modelo existente // set no funciona con lengh si no con size +const statsRep = (allLinks) => { + // me va a devolver un arr de links + const linksAr = allLinks.map((content) => content.href); + const linksU = new Set(linksAr); // me va a dar linsk unicos + return { + total: linksAr.length, + unique: linksU.size, + }; +}; +// console.log(statsRep([ +// { +// href: "https://es.wikipedia.org/wiki/Markdown/gina", +// text: "Markdown", +// file: "README.md", +// }, +// { +// href: "https://es.wikipedia.org/wiki/Markdown/gina", +// text: "Markdown", +// file: "README.md", +// }, +// ])); +//validar links rotos +const brokenLinks = (allLinks) => { + const brokenAr = allLinks.filter( + (content) => content.statusText === "FAIL" + ); //filter esta diseñado para filtrar de acuerdo a una condición //devuelve un arr con los rotos + return { + total: allLinks.length, + unique: statsRep(allLinks).unique, + broken: brokenAr.length, + }; +}; +// console.log(brokenLinks([ +// { +// href: "https://es.wikipedia.org/wiki/Markdown/gina", +// text: "Markdown", +// file: "README.md", +// statusText:"FAIL", +// }, +// { +// href: "https://es.wikipedia.org/wiki/Markdown/gina", +// text: "Markdown", +// file: "README.md", +// statusText: "FAIL", +// }, +// ])) From 2da438c2e2189e90cf6591855a0b7a257fb407fe Mon Sep 17 00:00:00 2001 From: tania lizbeth garcia fierro Date: Mon, 13 Mar 2023 09:20:02 -0600 Subject: [PATCH 07/11] cambios en funcion para obtener archivos md --- functions.js | 14 +++++++++++-- mdLinks.js | 56 +++++++++++++++++++++++++++++++++------------------- 2 files changed, 48 insertions(+), 22 deletions(-) diff --git a/functions.js b/functions.js index 78511ba..239c10b 100644 --- a/functions.js +++ b/functions.js @@ -192,15 +192,25 @@ const brokenLinks = (allLinks) => { }; // console.log(brokenLinks([ // { -// href: "https://es.wikipedia.org/wiki/Markdown/gina", +// href: "https://es.wikipedia.org/wiki/Markdown/tania", // text: "Markdown", // file: "README.md", // statusText:"FAIL", // }, // { -// href: "https://es.wikipedia.org/wiki/Markdown/gina", +// href: "https://es.wikipedia.org/wiki/Markdown/tania", // text: "Markdown", // file: "README.md", // statusText: "FAIL", // }, // ])) + +//obtener archivos md //usar ej readme +const addFileMd = (route) => { + if (validPath(route)) { + absolutePath(route); + transformAbs(route); + } + return recursive(route); // dev un arr con archivos md +}; +console.log (addFileMd('README.md')); \ No newline at end of file diff --git a/mdLinks.js b/mdLinks.js index a64104d..785bed8 100644 --- a/mdLinks.js +++ b/mdLinks.js @@ -1,21 +1,37 @@ -const mdLinks = require("md-links"); +const { + obtenerArchivosMd, + invalidateAllRoutes, + brokenLinks, +} = require("./function"); //use destructuración para importar funciones -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); - - module.exports = { mdLinks }; \ No newline at end of file +const mdLinks = (path, options) => { + return new Promise((resolve, reject) => { + if (options[0] === undefined && options[1] === undefined) { + const pathArr = obtenerArchivosMd(path); + pathArr.map((element) => { + //map recibe una funct y la funct recibe un elemento a iterar + invalidateAllRoutes(element) + .then((data) => { + console.log(data); + return resolve(data); + }) + .catch((error) => { + reject("TU RUTA ES INVALIDA", error); + }); + }); + } else { + if ( + (options[0] === "--validate" && options[1] === "--stats") || + (options[0] === "--stats" && options[1] === "--validate") + ) { + const pathArr = obtenerArchivosMd(path); + pathArr.map((element) => { + invalidateAllRoutes(element).then((data) => { + console.log(brokenLinks(data)) + return resolve (brokenLinks(data)); + }); + }); + } + } + }); +}; \ No newline at end of file From 834ead8ed4cabc88751403d6b79505287f090b87 Mon Sep 17 00:00:00 2001 From: tania lizbeth garcia fierro Date: Tue, 14 Mar 2023 05:16:54 -0600 Subject: [PATCH 08/11] =?UTF-8?q?se=20realizan=20cambios=20en=20funci?= =?UTF-8?q?=C3=B3n=20cli?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 690 ++++++++++++++++++--------------------------------- cli.js | 22 ++ functions.js | 35 ++- index.js | 34 --- mdLinks.js | 28 ++- test.drawio | 2 +- 6 files changed, 301 insertions(+), 510 deletions(-) create mode 100644 cli.js delete mode 100644 index.js diff --git a/README.md b/README.md index d4df79b..fb50a6c 100644 --- a/README.md +++ b/README.md @@ -1,666 +1,450 @@ # Markdown Links +*** +## Features +*** +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). -## Índice +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. -* [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) +Dentro de una comunidad de código abierto, nos han propuesto crear una herramienta usando Node.js, 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) + +## Introduction *** +Node.js es un entorno de ejecución para JavaScript construido con el motor de JavaScript V8 de Chrome. 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, ... + +En este proyecto nos alejamos un poco del navegador para construir un programa que se ejecute usando Node.js, donde aprenderemos sobre cómo interactuar con el sistema archivos, con el entorno (proceso, env, stdin/stdout/stderr), ... + +## Objectives +*** +El objetivo de esta librería es crear una herramienta que facilite a las personas a encontrar los links que hay dentro de un texto plano y verificar el status de estos, es decir, la librería verifica si los links estan rotos o son links funcionales y hace diferentes reportes con la información resumida. + +## Flowchart + + + +## Usability mode +*** +La manera en que debe usarse es tecleando en la terminal primero el nombre del archivo o carpeta a analizar y despues alguno de los siguientes comandos: + +mdlinks - Para obtener un reporte de los links que hay en el archivo o carpeta, asi como la ruta de cada uno de ellos +--validate - para obtener un reporte de los links, su status, es decir, si esta roto o no y la ruta absoluta del archivo donde se encuentra el link +-- stats - con este comado se encontrará una estadística de los links totales y los links únicos. +-stats -validate - con este comando la librería arroja una estadística de los totales, los únicos y los links que están rotos. +Esta librería utiliza la recursividad, por lo que si la ruta que se le agregó es carpeta, analiza todos los archivos con extetnsióm .md que haya dentro de la misma y si es carpeta, busca dentro de la misma, hasta desglosarse en puros archivos .md + +Se le agregó un poco de color para hacerlo mas amigable para el usuario. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -## 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, ... -Diseñar tu propia librería es una experiencia fundamental para cualquier -desarrollador porque que te obliga a pensar en la interfaz (API) de tus -_módulos_ y cómo será usado por otros 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. -* 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 inplementación debe pasar estos tets. -## 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 -### 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) -* [Módulos, librerías, paquetes, frameworks... ¿cuál es la diferencia?](http://community.laboratoria.la/t/modulos-librerias-paquetes-frameworks-cual-es-la-diferencia/175) -* [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/cli.js b/cli.js new file mode 100644 index 0000000..4c884ee --- /dev/null +++ b/cli.js @@ -0,0 +1,22 @@ + +#!/usr/bin/env node + +const mdLinks = require('./mdLinks'); +const process = require("process"); +const colors = require("colors"); + +const pathRoute2 = process.argv[2]; +const pathOptions1 = process.argv[3]; +const pathROptions2 = process.argv[4]; +const arOptions = [pathOptions1, pathOptions2]; + +mdLinks(pathRoute2, arrOptions); + +module.exports = mdLinks; + +console.log(colors.bgYellow('Probando...')); +console.log(colors.rainbow('MdLinks')); +console.log(colors.magenta('trabajando con Node.js')); +console.log(colors.bgCyan('<3')); + + diff --git a/functions.js b/functions.js index 239c10b..d69b587 100644 --- a/functions.js +++ b/functions.js @@ -48,15 +48,16 @@ const recursive = (paths) => { } else if (validDir(paths)) { const contentRoute = readFile(paths); //leer las rutas del directorio e itera el contenido que tiene contentRoute.forEach((paths) => { - console.log( + //rote es el elemt que se esta iterando del arr de string qur me devolv contenRoute (arrReadMd = arrReadMd .concat - // recursive(`${}/${}`) //concatenar la ruta de los directorios para que me los devuelva en un array + (recursive(`${route}/${route}`) //concatenar la ruta de los directorios para que me los devuelva en un array ()) ); }); } return arrReadMd; + }; //lee directorios y retorna archivos md @@ -72,6 +73,13 @@ const readFileMd = (route) => { }); }); }; +// const readFileMd = (route) => { + // return new Promise((res, rej) => { + // fs.readFile(route, "utf-8", (error, data) => { + // error ? rej("ocurrió un error") : res(data); + // }); + // }); +// }; // readFileMd('README.md').then((data) => { // console.log(data) @@ -125,8 +133,8 @@ const routeFalse = (route) => { const trueRoute = (allLinks) => { // simulando parameter return Promise.all( - allLinks.map((content) => { - //cada objetc es una promesa y all me dev un arr de promise + allLinks.map((content) => { //cada objeto es una promesa y all me dev un array de promesa + axios .get(content.href) .then((data) => { @@ -169,12 +177,12 @@ const statsRep = (allLinks) => { }; // console.log(statsRep([ // { -// href: "https://es.wikipedia.org/wiki/Markdown/gina", +// href: "https://es.wikipedia.org/wiki/Markdown/tania", // text: "Markdown", // file: "README.md", // }, // { -// href: "https://es.wikipedia.org/wiki/Markdown/gina", +// href: "https://es.wikipedia.org/wiki/Markdown/tania", // text: "Markdown", // file: "README.md", // }, @@ -205,12 +213,21 @@ const brokenLinks = (allLinks) => { // }, // ])) -//obtener archivos md //usar ej readme +//obtener archivos md //usar ejemplo readme.md const addFileMd = (route) => { if (validPath(route)) { absolutePath(route); transformAbs(route); } - return recursive(route); // dev un arr con archivos md + return recursive(route); // devuelve un array con archivos md }; -console.log (addFileMd('README.md')); \ No newline at end of file +// console.log (addFileMd('README.md')); + +// addFileMd(); +module.exports = { + addFileMd, //obtiene archivos md + routeFalse, //valida ruta false + trueRoute, //valida ruta true + brokenLinks, //valida los links rotos + statsRep, //devuelve stats +}; \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index 00c6821..0000000 --- a/index.js +++ /dev/null @@ -1,34 +0,0 @@ -const fs = require('fs'); //modulo de node.js lee, escribe archivos... -const path = require('path'); //modulo de node.js trabaja con rutas de archivos en los directorios - -const colors = require('colors'); - -// Función para ver si la ruta existe -const validPath = (route) => fs.existsSync(route); - -//Función para ver si la ruta es un archivo -const file = (route) => fs.statSync(route).file(); - -//Función para ver si es un archivo md -const mdFile = (route) => (path.extname(route) === '.md'); - - - -//Función para hacerla absoluta | en caso de ser relativa la convierte -const absolutePath = (route) => (path.isAbsolute(route) ? route : path.resolve(route)); - - -console.log(colors.blue('Probando...')); -console.log(colors.rainbow('MdLinks')); -console.log(colors.magenta('trabajando con Node.js')); -console.log(colors.bgCyan('<3')); - -module.exports = { - validPath, - file, - mdFile, - absolutePath, - -}; - - diff --git a/mdLinks.js b/mdLinks.js index 785bed8..a2070d1 100644 --- a/mdLinks.js +++ b/mdLinks.js @@ -1,22 +1,24 @@ const { - obtenerArchivosMd, - invalidateAllRoutes, + addFileMd, + routeFalse, brokenLinks, } = require("./function"); //use destructuración para importar funciones +const colors = require('colors'); const mdLinks = (path, options) => { - return new Promise((resolve, reject) => { + return new Promise((res, rej) => { if (options[0] === undefined && options[1] === undefined) { - const pathArr = obtenerArchivosMd(path); - pathArr.map((element) => { + const inputPath = addFileMd(path); + inputPath.map((content) => { + //map recibe una funct y la funct recibe un elemento a iterar - invalidateAllRoutes(element) + routeFalse(content) .then((data) => { console.log(data); - return resolve(data); + return res(data); }) .catch((error) => { - reject("TU RUTA ES INVALIDA", error); + rej("La ruta ingresada no es válida", error); }); }); } else { @@ -24,14 +26,14 @@ const mdLinks = (path, options) => { (options[0] === "--validate" && options[1] === "--stats") || (options[0] === "--stats" && options[1] === "--validate") ) { - const pathArr = obtenerArchivosMd(path); - pathArr.map((element) => { - invalidateAllRoutes(element).then((data) => { + const inputPath = addFileMd(path); + inputPath.map((content) => { + routeFalse(content).then((data) => { console.log(brokenLinks(data)) - return resolve (brokenLinks(data)); + return res (brokenLinks(data)); }); }); } } }); -}; \ No newline at end of file +}; diff --git a/test.drawio b/test.drawio index c23a353..21e3928 100644 --- a/test.drawio +++ b/test.drawio @@ -1,6 +1,6 @@ - + From c7e8c2f41a37082754ab3b855ad13f7221983e4d Mon Sep 17 00:00:00 2001 From: tania lizbeth garcia fierro Date: Tue, 14 Mar 2023 05:50:54 -0600 Subject: [PATCH 09/11] se agrega diagrama de flujo a readme --- README.md | 4 +++- cli.js | 6 +++--- imgdrawio/drawio1.png | Bin 0 -> 84528 bytes imgdrawio/drawio2.png | Bin 0 -> 83081 bytes imgdrawio/drawio3.png | Bin 0 -> 15808 bytes mdLinks.js | 25 +++++++++++++++++++++++++ 6 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 imgdrawio/drawio1.png create mode 100644 imgdrawio/drawio2.png create mode 100644 imgdrawio/drawio3.png diff --git a/README.md b/README.md index fb50a6c..4671de7 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,9 @@ El objetivo de esta librería es crear una herramienta que facilite a las person ## Flowchart - +![flowchart](./imgdrawio/drawio1.png) +![flowchart](./imgdrawio/drawio2.png) +![flowchart](./imgdrawio/drawio3.png) ## Usability mode *** diff --git a/cli.js b/cli.js index 4c884ee..4e14b08 100644 --- a/cli.js +++ b/cli.js @@ -1,5 +1,5 @@ -#!/usr/bin/env node +#!/usr/bin/env node //ERROR const mdLinks = require('./mdLinks'); const process = require("process"); @@ -7,10 +7,10 @@ const colors = require("colors"); const pathRoute2 = process.argv[2]; const pathOptions1 = process.argv[3]; -const pathROptions2 = process.argv[4]; +const pathOptions2 = process.argv[4]; const arOptions = [pathOptions1, pathOptions2]; -mdLinks(pathRoute2, arrOptions); +mdLinks(pathRoute2, arOptions); module.exports = mdLinks; diff --git a/imgdrawio/drawio1.png b/imgdrawio/drawio1.png new file mode 100644 index 0000000000000000000000000000000000000000..66a275d52b132563a1af2757b7410566851e0150 GIT binary patch literal 84528 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%0D=UNrbnOec+9!cr*Q#ST#EC6=(ciEV$3`0ajRAK( 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 QaKP6~Nd<{gF~flW0~U4z5C8xG literal 0 HcmV?d00001 diff --git a/imgdrawio/drawio2.png b/imgdrawio/drawio2.png new file mode 100644 index 0000000000000000000000000000000000000000..5210a1ecb2fbded3074e4809a87a38557adeac81 GIT binary patch literal 83081 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

nVM|F|>?S5#Zxv*Zf4BezK&s-WB}3z_t+6 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 { return res (brokenLinks(data)); }); }); + + } else if (options[0] === "--validate") { + const arrMd = obtenerArchivosMd(path); + arrMd.map((element) => { + invalidateAllRoutes(element) + .then((data) => { + validateAllRoutes(data).then((data)=> { + console.log(data) + return resolve(data) + } + ); + }) + .catch((error) => { + return reject("La ruta ingresada es válida", error); + }); + }); + } else if (options[0] === "--stats") { + const arrMdStast = obtenerArchivosMd(path); + arrMdStast.map((element) => { + invalidateAllRoutes(element).then((data) => { + console.log(statsFunction(data)); + return resolve(statsFunction(data)); + }); + }); } } }); }; +module.exports = mdLinks; \ No newline at end of file From 59c0be2f8b791e5389b67f4e52f4f9adc52afc31 Mon Sep 17 00:00:00 2001 From: tania lizbeth garcia fierro Date: Tue, 14 Mar 2023 08:30:44 -0600 Subject: [PATCH 10/11] acomodando archivo de functions(recursividad) --- cli.js | 10 +++++----- functions.js | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cli.js b/cli.js index 4e14b08..afe5906 100644 --- a/cli.js +++ b/cli.js @@ -1,16 +1,16 @@ -#!/usr/bin/env node //ERROR +#!/usr/bin/env node //indica qué programa debe ejecutar el archivo -const mdLinks = require('./mdLinks'); +const mdLinks = require('./mdLinks'); // se importa la función mdLinks const process = require("process"); const colors = require("colors"); -const pathRoute2 = process.argv[2]; +const path2 = process.argv[2]; const pathOptions1 = process.argv[3]; const pathOptions2 = process.argv[4]; -const arOptions = [pathOptions1, pathOptions2]; +const arOptions = [pathOptions1, pathOptions2]; //Se crea un arreglo que contiene las opciones que se van a aplicar al análisis -mdLinks(pathRoute2, arOptions); +mdLinks(path2, arOptions); module.exports = mdLinks; diff --git a/functions.js b/functions.js index d69b587..702e658 100644 --- a/functions.js +++ b/functions.js @@ -20,18 +20,18 @@ const absolutePath = (route) => path.isAbsolute(route); // ruta transformada: C:\Users\tania\OneDrive\Escritorio\Proyectos Laboratoria\mdLinks\DEV002-md-links const transformAbs = (route) => { - const validateDirectory = process.cwd(); - return path.resolve(validateDirectory, route); + const validateDirectory = process.cwd(); //verifica si el arcivo existe en el local + return path.resolve(validateDirectory, route); //si es directorio, devuelve una ruta absoluta }; //¿Es un directorio? -// console.log (fs.statSync('./pruebas')); -// console.log(stats.isDirectory('./pruebas')); -const validDir = (route) => { +const validDir = (route) => { //devuelve 'true' si la ruta especificada es una carpeta válida, y 'false' si no lo es. const stats = fs.statSync(route); return stats.isDirectory(); }; +// console.log (fs.statSync('./pruebas')); +// console.log(stats.isDirectory('./pruebas')); //lee los archivos del directorio //console.log(fs.readdirSync('./pruebas')); debería devolver un array con el contenido de ese directorio From 7edc926ab9a16e789706f139701a4d81823db3d8 Mon Sep 17 00:00:00 2001 From: tania lizbeth garcia fierro Date: Tue, 14 Mar 2023 12:24:40 -0600 Subject: [PATCH 11/11] revisando cli haciendo ultimos ajustes --- README.md | 70 ++++++++++++++++++++- cli.js | 11 ++-- examplesFiles/pruebas/prueba0.md | 7 +++ functions.js | 102 +++++++++++++------------------ mdLinks.js | 8 ++- 5 files changed, 127 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index 4671de7..bfb2a5a 100644 --- a/README.md +++ b/README.md @@ -37,10 +37,78 @@ mdlinks - Para obtener un reporte de los links que hay en el archivo o carpeta, -stats -validate - con este comando la librería arroja una estadística de los totales, los únicos y los links que están rotos. Esta librería utiliza la recursividad, por lo que si la ruta que se le agregó es carpeta, analiza todos los archivos con extetnsióm .md que haya dentro de la misma y si es carpeta, busca dentro de la misma, hasta desglosarse en puros archivos .md -Se le agregó un poco de color para hacerlo mas amigable para el usuario. +### 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) +const mdLinks = require("md-links"); + + +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: + + 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: + + 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. + + 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. + +md --stats --validate + + + +En tu consola ejecuta el siguiente comando: +### npm i mdlinks-taniafe diff --git a/cli.js b/cli.js index afe5906..e70a551 100644 --- a/cli.js +++ b/cli.js @@ -1,5 +1,4 @@ - -#!/usr/bin/env node //indica qué programa debe ejecutar el archivo +#!/usr/bin/env node const mdLinks = require('./mdLinks'); // se importa la función mdLinks const process = require("process"); @@ -14,9 +13,9 @@ mdLinks(path2, arOptions); module.exports = mdLinks; -console.log(colors.bgYellow('Probando...')); -console.log(colors.rainbow('MdLinks')); -console.log(colors.magenta('trabajando con Node.js')); -console.log(colors.bgCyan('<3')); +// console.log(colors.bgYellow('Probando...')); +// console.log(colors.rainbow('MdLinks')); +// console.log(colors.magenta('trabajando con Node.js')); +// console.log(colors.bgCyan('<3')); diff --git a/examplesFiles/pruebas/prueba0.md b/examplesFiles/pruebas/prueba0.md index e69de29..db58955 100644 --- a/examplesFiles/pruebas/prueba0.md +++ b/examplesFiles/pruebas/prueba0.md @@ -0,0 +1,7 @@ +[Markdown](https://es.wikipedia.org/wiki/Markdown) +[motor de JavaScript V8 de Chrome](https://developers.google.com/v8/) +[Arreglos](https://curriculum.laboratoria.la/es/topics/javascript/04-arrays) +[Objetos en JavaScript](https://curriculum.laboratoria.la/es/topics/javascript/05-objects/01-objects) +[JSDOM](https://github.com/jsdom/jsdom/gy) +[NPM](https://docs.npmjs.com/getting-started/what-is-npm) +[Leer un directorio](https://nodejs.org/api/fs.html#fs_fs_readdir_path_options_callback) \ No newline at end of file diff --git a/functions.js b/functions.js index 702e658..11ef2cc 100644 --- a/functions.js +++ b/functions.js @@ -20,44 +20,39 @@ const absolutePath = (route) => path.isAbsolute(route); // ruta transformada: C:\Users\tania\OneDrive\Escritorio\Proyectos Laboratoria\mdLinks\DEV002-md-links const transformAbs = (route) => { - const validateDirectory = process.cwd(); //verifica si el arcivo existe en el local - return path.resolve(validateDirectory, route); //si es directorio, devuelve una ruta absoluta + const validDir = process.cwd(); //verifica si el arcivo existe en el local + return path.resolve(validDir, route); //si es directorio, devuelve una ruta absoluta }; //¿Es un directorio? -const validDir = (route) => { //devuelve 'true' si la ruta especificada es una carpeta válida, y 'false' si no lo es. +const validDir = (route) => { + //devuelve 'true' si la ruta especificada es una carpeta válida, y 'false' si no lo es. const stats = fs.statSync(route); return stats.isDirectory(); }; -// console.log (fs.statSync('./pruebas')); -// console.log(stats.isDirectory('./pruebas')); //lee los archivos del directorio //console.log(fs.readdirSync('./pruebas')); debería devolver un array con el contenido de ese directorio const readFile = (route) => fs.readdirSync(route); -//validar que la función sea md +//validar que la función sea md devuelve la ext se un arch const mdFile = (route) => (path.extname(route) === ".md" ? true : false); //recursividad -const recursive = (paths) => { +const recursive = (route) => { let arrReadMd = []; - if (mdFile(paths)) { - arrReadMd.push(paths); //se llena si la ruta tiene ext md si no es un directorio - } else if (validDir(paths)) { - const contentRoute = readFile(paths); //leer las rutas del directorio e itera el contenido que tiene - contentRoute.forEach((paths) => { - //rote es el elemt que se esta iterando del arr de string qur me devolv contenRoute - (arrReadMd = arrReadMd - .concat - (recursive(`${route}/${route}`) //concatenar la ruta de los directorios para que me los devuelva en un array - ()) - ); - }); + if (mdFile(route)) { + arrReadMd.push(route); //se llena si la ruta tiene ext md si no es un directorio + } else if (validDir(route)) { + const contentRoute = readFile(route); //leer las rutas del directorio e itera el contenido que tiene + contentRoute.forEach((pathRoute) => { + //route es el elemt que se esta iterando del arr de string que me devolv contenRoute + + arrReadMd = arrReadMd.concat(recursive(`${route}/${pathRoute}`)); + }) } return arrReadMd; - }; //lee directorios y retorna archivos md @@ -65,36 +60,24 @@ const recursive = (paths) => { const readFileMd = (route) => { return new Promise((res, rej) => { fs.readFile(route, "utf-8", (error, data) => { - if (error) { - rej("ocurrió un error"); - } else { - res(data); - } + error ? rej("Ocurrió un error") : res(data); + + }); }); - }); }; // const readFileMd = (route) => { - // return new Promise((res, rej) => { - // fs.readFile(route, "utf-8", (error, data) => { - // error ? rej("ocurrió un error") : res(data); - // }); - // }); +// return new Promise((res, rej) => { +// fs.readFile(route, "utf-8", (error, data) => { +// error ? rej("ocurrió un error") : res(data); +// }); +// }); // }; -// readFileMd('README.md').then((data) => { -// console.log(data) -// -// }).catch((error) => { -// console.log(error) -// }) - //Validar todo tipo de ruta 'false' const routeFalse = (route) => { return new Promise((res, rej) => { - //usar este array para crear un objeto invalidateAllRoutes - const allLinks = []; - //promesa(lento) // probar con readme readContentMd - readFileMd(route) + const allLinks = []; //usar este array para crear un objeto + readFileMd(route) //promesa(lento) probar con readme readContentMd .then((data) => { const regExp = /\[([\w\s\d]+)\]\(((?:\/|https?:\/\/)[\w\d./?=#]+[a-zA-Z0-9!-_$]+)\)/gi; @@ -102,17 +85,17 @@ const routeFalse = (route) => { //regExp.exec(data)//devuelve array con link que cumplan con la regEx... let resultRegEx = regExp.exec(data); //devuelve array iterado - if (resultRegEx !== null) { + while (resultRegEx !== null) { // evitar que me devuelva null - const dataFiles = resultRegEx.map((content) => content); allLinks.push({ - href: dataFiles[2], - text: dataFiles[1], + href: resultRegEx[2], + text: resultRegEx[1], file: route, //probar con readme }); - res(allLinks); + resultRegEx = regExp.exec(data); } + res(allLinks); }) .catch((error) => { rej(error); @@ -128,23 +111,23 @@ const routeFalse = (route) => { // console.log(error); // }); -//validar ruta (true) devolver un arr de objet +//validar ruta (true) devolver un array de objeto const trueRoute = (allLinks) => { // simulando parameter return Promise.all( - allLinks.map((content) => { //cada objeto es una promesa y all me dev un array de promesa - - axios - .get(content.href) + allLinks.map((content) => { + //cada objeto es una promesa y all me dev un array de promesa + return axios //peticiones http a un serv + .get(content.href) //hace peticion para obtener datos obtener inf de esa url .then((data) => { //axios const objs = { ...content, - status: data.status, - statusText: data.statusText, + status: data.status, //se presenta con num + statusText: data.statusText, //string }; - console.log(objs); + return (objs); }) .catch((error) => { const failObject = { @@ -152,7 +135,7 @@ const trueRoute = (allLinks) => { status: error.data ? 404 : 404, statusText: "FAIL", }; - console.log(failObject); + return(failObject); }); }) ); @@ -189,9 +172,7 @@ const statsRep = (allLinks) => { // ])); //validar links rotos const brokenLinks = (allLinks) => { - const brokenAr = allLinks.filter( - (content) => content.statusText === "FAIL" - ); //filter esta diseñado para filtrar de acuerdo a una condición //devuelve un arr con los rotos + const brokenAr = allLinks.filter((content) => content.statusText === "FAIL"); //filtrar de acuerdo a una condición //devuelve un arr con los rotos return { total: allLinks.length, unique: statsRep(allLinks).unique, @@ -221,7 +202,6 @@ const addFileMd = (route) => { } return recursive(route); // devuelve un array con archivos md }; -// console.log (addFileMd('README.md')); // addFileMd(); module.exports = { @@ -230,4 +210,4 @@ module.exports = { trueRoute, //valida ruta true brokenLinks, //valida los links rotos statsRep, //devuelve stats -}; \ No newline at end of file +}; diff --git a/mdLinks.js b/mdLinks.js index eda6277..16e0f78 100644 --- a/mdLinks.js +++ b/mdLinks.js @@ -1,7 +1,9 @@ const { addFileMd, routeFalse, + trueRoute, brokenLinks, + statsRep } = require("./function"); //use destructuración para importar funciones const colors = require('colors'); @@ -35,11 +37,11 @@ const mdLinks = (path, options) => { }); } else if (options[0] === "--validate") { - const arrMd = obtenerArchivosMd(path); + const arrMd = addFileMd(path); arrMd.map((element) => { - invalidateAllRoutes(element) + routeFalse(element) .then((data) => { - validateAllRoutes(data).then((data)=> { + trueRoute(data).then((data)=> { console.log(data) return resolve(data) }