-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
Copy pathremove-broken-links.js
58 lines (43 loc) · 1.59 KB
/
remove-broken-links.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
#!/usr/bin/env node
const fs = require('fs').promises
const findBrokenLinks = require('../lib/broken-links')
/* Links can break at any time and it's outside of the repo's control,
so it doesn't make sense to run this script as part of CI. Instead,
this should be run periodically as part of a separate process. */
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason)
})
const numberArgs = process.argv.filter((v) => /^\d+$/.test(v))
const possibleStart =
numberArgs.length > 0 ? parseInt(numberArgs[0], 10) : undefined
const possibleEnd =
numberArgs.length > 0 ? parseInt(numberArgs[1], 10) : undefined
console.log(
`Checking apps ${possibleStart || 0} through ${
possibleEnd || 'infinity'
} for broken links`
)
function isRateLimited(failures = []) {
return failures.every(({ status }) => status === 429)
}
async function main() {
const failArrays = (await findBrokenLinks(possibleStart, possibleEnd)).filter(
(failure) => {
return !isRateLimited(failure.result)
}
)
console.log(`Will disable ${failArrays.length} entries`)
for (const failure of failArrays) {
console.timeLog(failure.result)
const deadLinks = failure.result.map(({ url }) => url).join(', ')
let data = await fs.readFile(failure.entry.fullPath, { encoding: 'utf-8' })
if (!data.endsWith('\n')) {
data += `\n`
}
data += `disabled: true # Dead link(s): ${deadLinks}\n`
await fs.writeFile(failure.entry.fullPath, data, { encoding: 'utf-8' })
console.log(data)
console.log(`\n---\n`)
}
}
main()