mlemus-md-links
Version:
[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 fo
234 lines (177 loc) • 8.36 kB
JavaScript
//Dependencias instaladas
const fetch = require('node-fetch');
const marked = require('marked');
const fs = require('fs');
const FileHound = require('filehound');
const mdLinks = (pathTerminal, options) => {
return new Promise((resolve, reject) =>{
//fs.stats() diferencia si lo introducido por el usuario es un archivo o un directorio
fs.stat(pathTerminal, (err, stats) => {
if (err) {
reject(err);
}
else if(stats.isFile()){
getArrayLinksFromFile(pathTerminal, options)
.then(res => {
resolve(res);
})
.catch(err => {
reject(err);
})
}
else if(stats.isDirectory()){
getMdFilesFromDirectories(pathTerminal, options)
.then(res => {
resolve(res);
})
.catch(err => {
reject(err);
})
}
})
//fs.readFile busca y toma los links encontrados en los archivos
const getArrayLinksFromFile = (path, options) =>{
return new Promise((resolve, reject) =>{
fs.readFile(path,'utf8', (err,data) =>{
if(err){
reject(err);
}
let arrayLinksFromFile =[];
const renderer = new marked.Renderer();
renderer.link = function(href, title, text){
arrayLinksFromFile.push({
href:href,
text:text,
file:path
})
}
marked(data, {renderer:renderer})
if(options[0].default){
resolve(arrayLinksFromFile);
}
else if(options[0].both){
resolve(evaluationStatusOfLinksWithFetch(arrayLinksFromFile));
}
else if (options[0].validate) {
resolve(evaluationStatusOfLinksWithFetch(arrayLinksFromFile));
}
else if (options[0].stats) {
resolve(parametersGivenByOptionStats(arrayLinksFromFile));
}
})
})
}
//Función asociada a la opcion Stats que ofrece el total de links encontrados y únicos
const parametersGivenByOptionStats = (arrayStats) => {
return new Promise((resolve, reject) => {
let optionResponseStats= {};
let totalLinksFromOptionStats = [];
totalLinksFromOptionStats = arrayStats.map(el => {
return el.href;
});
let uniqueLinksFromOptionStats = [];
uniqueLinksFromOptionStats = totalLinksFromOptionStats.filter((item,index,arr) => {
return arr.indexOf(item) === index;
});
optionResponseStats.Total = totalLinksFromOptionStats.length;
optionResponseStats.Unique = uniqueLinksFromOptionStats.length;
resolve(optionResponseStats);
if(err){
reject(err);
}
})
}
//fetch evalua los estatus de los links encontrados
const evaluationStatusOfLinksWithFetch = (arrayLinksFromFile) => {
let arrayStatusLinksWithFectch =[];
return new Promise((resolve, reject) =>{
arrayLinksFromFile.forEach(element => {
fetch(element.href)
.then(res => {
arrayStatusLinksWithFectch.push({
file: element.file,
href: res.url,
statusText: res.statusText,
status: res.status,
text: element.text
});
if(options[0].validate){
setTimeout(() => {
resolve(arrayStatusLinksWithFectch);
}, 3000);
}
if(options[0].both){
setTimeout(() => {
resolve(parametersGivenByOptionBoth(arrayStatusLinksWithFectch));
}, 2000);
}
})
.catch(error =>{
reject(error);
})
});
});
}
const parametersGivenByOptionBoth = (arrayBoth) => {
return new Promise((resolve, reject) => {
let optionResponseStats= {};
let totalLinksFromOptionBoth = [];
totalLinksFromOptionBoth = arrayBoth.map(el => {
return el.href;
});
let uniqueLinksFromOptionBoth = [];
uniqueLinksFromOptionBoth = totalLinksFromOptionBoth.filter((item,index,arr) => {
return arr.indexOf(item) === index;
});
let BrokenLinksFromOptionBoth =[];
BrokenLinksFromOptionBoth = arrayBoth.filter(el => el.statusText === "Not Found");
optionResponseStats.Total = totalLinksFromOptionBoth.length;
optionResponseStats.Unique = uniqueLinksFromOptionBoth.length;
optionResponseStats.Broken = BrokenLinksFromOptionBoth.length;
resolve(optionResponseStats);
if(err){
reject(err);
}
})
}
//FileHound busca archivos con formato md dentro de los directorios
const getMdFilesFromDirectories = (pathTerminal, options) =>{
return new Promise((resolve, reject) =>{
const files = FileHound.create()
.discard('node_modules')
.paths(pathTerminal)
.ext('md')
.find();
files
.then (res => {
let arrayOfMarkdownFound =[];
res.forEach(element => {
arrayOfMarkdownFound.push(element);
});
Promise.all(arrayOfMarkdownFound.map(el => {
return getArrayLinksFromFile(el, options);
}))
.then(res=>{
let linksFoundInDirectories = Array.prototype.concat.apply([], res);
if(options[0].default){
resolve(linksFoundInDirectories);
}
else if(options[0].both){
resolve(linksFoundInDirectories);
}
else if (options[0].validate) {
resolve(linksFoundInDirectories);
}
else if (options[0].stats) {
resolve(linksFoundInDirectories);
}
})
})
.catch(error =>{
reject(error);
})
})
}
})
}
module.exports = mdLinks;