forked from github/docs
-
Notifications
You must be signed in to change notification settings - Fork 2
/
remove-unused-assets.js
executable file
·92 lines (77 loc) · 2.65 KB
/
remove-unused-assets.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
#!/usr/bin/env node
// [start-readme]
//
// Run this script to remove reusables and image files that exist in the repo but
// are not used in content files. It also displays a list of unused variables. Set
// the `--dry-run` to flag to print results without deleting any files. For images
// you don't want to delete, add them to `ignoreList` in `lib/find-unused-assets.js`
//
// [end-readme]
import { fileURLToPath } from 'url'
import path from 'path'
import fs from 'fs'
import findUnusedAssets from './helpers/find-unused-assets.js'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const dryRun = process.argv.slice(2).includes('--dry-run')
main()
async function main() {
if (dryRun) {
console.log('This is a dry run! The script will report unused files without deleting anything.')
}
removeUnusedReusables(await findUnusedAssets('reusables'))
removeUnusedImages(await findUnusedAssets('images'))
printUnusedVariables(await findUnusedAssets('variables'))
}
function removeUnusedReusables(reusables) {
logMessage(reusables, 'reusable')
reusables.forEach((reusable) => {
const reusablePath = path.join(
__dirname,
'..',
reusable.replace('site', '').replace(/\./g, '/').replace(/$/, '.md')
)
dryRun ? console.log(reusable) : fs.unlinkSync(reusablePath)
})
}
function removeUnusedImages(images) {
logMessage(images, 'image')
images.forEach((image) => {
const imagePath = path.join(__dirname, '..', image)
dryRun ? console.log(image) : fs.unlinkSync(imagePath)
})
}
// multiple variables are embedded in within the same YML file
// so we can't just delete the files, and we can't parse/modify
// them either because js-yaml does not preserve whitespace :[
function printUnusedVariables(variables) {
logMessage(variables, 'variable')
variables.forEach((variable) => {
const variableKey = variable.split('.').pop()
const variablePath = path.join(
process.cwd(),
variable
.replace('site', '')
.replace(`.${variableKey}`, '')
.replace(/\./g, '/')
.replace(/$/, '.yml')
)
dryRun
? console.log(variable)
: console.log(
`* found but did not delete '${variableKey}' in ${variablePath.replace(
process.cwd(),
''
)}`
)
})
if (!dryRun) console.log('\nYou will need to manually delete any variables you want to remove.')
}
function logMessage(list, type) {
let action
if (dryRun) {
action = '\n**Found'
} else {
action = type === 'variable' ? ':eyes: **Found' : ':scissors: **Removed'
}
console.log(`${action} ${list.length} unused ${type} ${list.length === 1 ? 'file' : 'files'}**\n`)
}