forked from electron/apps
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathremove-broken-links.js
More file actions
58 lines (43 loc) · 1.59 KB
/
Copy pathremove-broken-links.js
File metadata and controls
58 lines (43 loc) · 1.59 KB
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()