- Preámbulo
- Resumen del Proyecto
- Desarrollo del Proyecto
- Código
- Pruebas Unitarias
- Tecnologías Aplicadas
- Enlaces Útiles
Markdown es un lenguaje de marcado ligero ampliamente utilizado entre los desarrolladores. Se emplea en numerosas plataformas que manejan texto plano (GitHub, foros, blogs, etc.), y los archivos Markdown son comunes en varios repositorios.
Estos archivos Markdown a menudo contienen enlaces que a veces están rotos o ya no son válidos, afectando negativamente el valor de la información compartida.
MD-Links es un proyecto creado en Node.js. Involucra el desarrollo de una biblioteca dentro de este entorno de ejecución que lee y analiza archivos en formato Markdown. El objetivo es verificar los enlaces contenidos en estos archivos y generar un informe con algunas estadísticas.
En este hito, se creó la versión más sencilla de mdlinks. Se desarrolló una función que retorna una promesa con los links encontrados dentro de un archivo Markdown específico. La función es un módulo que puede importarse en otros scripts de Node.js y ofrece la interfaz mdLinks(path).
Creación de una Promesa. Transformación de la ruta ingresada a absoluta. Comprobación de la existencia de la ruta en el sistema. Aseguramiento de que el archivo sea de tipo Markdown. Lectura del contenido del archivo. Extracción de los enlaces dentro del documento. 3.2 Hito 2: Javascript API con segundo parámetro opcional "validate" En este hito, se agregó un parámetro adicional a la función mdLinks llamado validate, que recibe un valor booleano. validate es un argumento opcional y afecta la salida de la función.
mdLinks(path, validate) Valor que resuelve la promesa con validate = false o undefined:
Un arreglo con objetos que representan links, con las propiedades href, text, y file. Valor que resuelve la promesa con validate = true:
Un arreglo con objetos que representan links, con las propiedades href, text, file, status, y ok.
En este hito, se mejoró la función mdLinks para que pueda recibir un directorio como ruta. La función ahora recorre todos los archivos existentes en el directorio y, por cada archivo .md, extrae los links para mostrarlos en pantalla.
Obtención del contenido de un directorio. Unión de dos rutas para acceder a directorios y archivos.
El código del proyecto se basa en la modularización (CommonJS) de funciones, ayudando a organizar y estructurar el código en archivos JS separados. Hay cuatro secciones principales que definen la funcionalidad de nuestra biblioteca. Bibliotecas y Módulos Utilizados chalk: Librería para dar formato a la salida en la consola mediante colores.
Métodos utilizados: chalk.cyan, chalk.white. fs (File System): Módulo de Node.js para trabajar con el sistema de archivos.
Métodos utilizados: fs.promises.readFile, fs.promises.access, fs.readdir. path: Módulo de Node.js para manipulación de rutas de archivos y directorios.
Métodos utilizados: path.join, path.extname, path.resolve, path.isAbsolute. Tecnologías y Conceptos Destacados Promesas (Promise): Se emplean para gestionar operaciones asíncronas y realizar tareas concurrentes.
Expresiones Regulares (Regex): Utilizadas para analizar y extraer información de cadenas de texto, especialmente para identificar enlaces en archivos Markdown.
Fetch API: Utilizada para realizar solicitudes HTTP y validar la existencia y estado de los enlaces.
ES6 (ECMAScript 2015): Se han aplicado características de ECMAScript 2015, como destructuración de objetos, funciones de flecha y operadores de expansión/rest.
Node.js: El proyecto está diseñado para ejecutarse en el entorno de Node.js.
Módulos: El código se organiza en módulos para mejorar la legibilidad y mantenibilidad.
Exportación e Importación de Módulos: Se utiliza module.exports para exportar funciones y objetos de un módulo, y require para importarlos en otros módulos.
isLinkValid: Valida la existencia y estado de un enlace mediante solicitudes HTTP.
doesFileExist: Verifica la existencia de un archivo en una ruta dada.
getMdFilesInDirectory: Obtiene una lista de archivos Markdown en un directorio.
analyzeLinks: Analiza un archivo Markdown para extraer información sobre los enlaces.
mdLinks: Coordina la verificación de enlaces en archivos Markdown, ya sea en un archivo específico o en un directorio.
convertToAbsolutePath y isAbsolutePath: Funciones utilitarias para trabajar con rutas.
El proyecto incluye un conjunto de pruebas para las funciones mdLinks, isLinkValid, doesFileExist, getMdFilesInDirectory, y analyzeLinks. Las pruebas también contribuyeron a alcanzar una cobertura cercana al 100%.
JavaScript: Implementa funcionalidad para analizar el texto ingresado y mostrar resultados. Node.js: Un entorno de ejecución de JavaScript en el lado del servidor. CommonJS: Se utilizan módulos para organizar y estructurar el código en archivos JS separados. module.exports se utiliza para exportar funciones y variables desde el módulo, y require('./module') se utiliza para importar el módulo en otro archivo. Módulo fs: Interactúa con el sistema de archivos. Módulo path: Funciona con rutas de archivos y directorios. Fetch: Biblioteca para realizar solicitudes HTTP. EsLint: Herramienta de linting para JavaScript. Jest: Marco de pruebas para JavaScript.
-
Diferenciar entre tipos de datos primitivos y no primitivos
-
Arrays (arreglos)
-
Objetos (key, value)
-
Uso de condicionales (if-else, switch, operador ternario, lógica booleana)
-
Funciones (params, args, return)
-
Recursión o recursividad
-
Módulos de CommonJS
-
Diferenciar entre expresiones (expressions) y sentencias (statements)
-
Callbacks
-
Promesas
-
Pruebas unitarias (unit tests)
-
Pruebas asíncronas
-
Uso de mocks y espías
-
Pruebas de compatibilidad en múltiples entornos de ejecución
-
Uso de linter (ESLINT)
-
Uso de identificadores descriptivos (Nomenclatura y Semántica)
-
Instalar y usar módulos con npm
-
Configuración de package.json
-
Configuración de npm-scripts
-
process (env, argv, stdin-stdout-stderr, exit-code)
-
File system (fs, path)
-
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)
-
Consulta o petición (request) y respuesta (response).
-
Códigos de status de HTTP