forked from Laboratoria/SAP004-md-links
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
120 lines (104 loc) · 3.04 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
const fs = require('fs')
const axios = require('axios');
const paths = require('path');
module.exports = (path, options) => {
let array = [];
const readFile = (file) => {
return new Promise((resolve, reject) => {
fs.readFile(file, 'utf8', (error, data) => {
if (error) {
reject(error);
return;
}
const regexMdLinks = /\[([^\[]+)\](\(http.*\))/gm
const matches = data.match(regexMdLinks)
const singleMatch = /\[([^\[]+)\]\((.*)\)/
for (let item of matches) {
let text = singleMatch.exec(item)
array.push({ href: text[2], text: text[1], file: file })
}
if (options && options.stats === true && options.validate === true) {
let promises = []
for (let item of array) {
promises.push(validLink(item))
}
Promise.all(promises).then((data) => {
const urls = data.map((curr) => {
return curr.href;
});
const broken = data.filter(item => {
return item.valid === "fail";
})
resolve({
Total: data.length,
Unique: [...new Set(urls)].length,
Broken: broken.length
})
}).catch((error) => {
reject(error);
});
} else if (options && options.validate === true) {
let promises = []
for (let item of array) {
promises.push(validLink(item))
}
Promise.all(promises).then((data) => {
resolve(data)
}).catch((error) => {
reject(error);
});
} else if (options && options.stats === true) {
const urls = array.map((curr) => {
return curr.href;
});
resolve({
Total: array.length,
Unique: [...new Set(urls)].length
})
} else {
resolve(array)
}
})
});
}
const validLink = (item) => {
return axios.get(item.href, { validateStatus: () => true })
.then((response) => {
item.valid = response.statusText === "OK" ? "ok" : "fail";
item.statusCode = response.status;
return item;
})
.catch(() => {
item.valid = "fail";
item.statusCode = "404"
return item
});
}
const readFolder = (folder) => {
return new Promise((resolve, reject) => {
fs.readdir(folder, (error, list) => {
if (error) {
reject(error);
return;
}
const files = list.filter(item => paths.extname(item) === ".md");
let promises = []
for (let item of files) {
let p = folder + item;
promises.push(readFile(p));
}
Promise.all(promises).then((data) => {
resolve(array);
}).catch((error) => {
reject(error);
})
});
});
}
const statsPath = fs.statSync(path)
if (statsPath.isDirectory()) {
return readFolder(path);
} else {
return readFile(path);
}
};