forked from ETS-Next-Gen/writing_observer
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathlist-unused-css.js
77 lines (69 loc) · 2.13 KB
/
list-unused-css.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
const fs = require('fs')
const core = require('@actions/core')
const glob = require('glob')
const postcss = require('postcss')
const postcssScss = require('postcss-scss')
const ingoreFiles = [
'./**/node_modules/**', './**/deps/**', './**/build/**',
'./**/3rd_party/**', '.extension/**'
]
const inputFiles = [
...glob.sync('./**/*.html', { ignore: ingoreFiles }),
...glob.sync('./**/*.js', { ignore: ingoreFiles }),
...glob.sync('./**/*.py', { ignore: ingoreFiles })
]
const cssFiles = [
...glob.sync('./**/*.css', { ignore: ingoreFiles }),
...glob.sync('./**/*.scss', { ignore: ingoreFiles })
]
const usedClasses = new Set()
inputFiles.forEach((file) => {
const content = fs.readFileSync(file, 'utf8')
const classRegex = /(?:class(?:Name)(?:_name)?=["']|[\s.])([\w\s-]+)["'\s;]/g
let match
while ((match = classRegex.exec(content)) !== null) {
const classes = match[1].split(' ').filter((cls) => cls.trim())
classes.forEach((cls) => usedClasses.add(cls))
}
})
let totalUnusedClasses = 0
let currentFile = null
const listUnusedCSS = () => {
let unusedCount = 0
return {
postcssPlugin: 'list-unused-css',
Rule (rule) {
if (rule.selector.startsWith('.')) {
const className = rule.selector.slice(1)
if (!usedClasses.has(className)) {
if (unusedCount === 0) {
console.log(`==========\nFile: ${currentFile}`)
}
console.log(`Unused class: ${className}`)
unusedCount++
}
}
},
OnceExit () {
console.log(`Total unused classes in this file: ${unusedCount}`)
totalUnusedClasses += unusedCount
}
}
}
listUnusedCSS.postcss = true
const unusedClassPromises = cssFiles.map((file) => {
const css = fs.readFileSync(file, 'utf8')
const syntax = file.endsWith('.scss') ? postcssScss : undefined
currentFile = file
return postcss([listUnusedCSS()])
.process(css, { from: file, syntax })
})
Promise.all(unusedClassPromises)
.then(() => {
if (totalUnusedClasses > 0) {
core.setFailed(`Total unused classes found: ${totalUnusedClasses}`)
}
})
.catch((error) => {
core.setFailed(error.message)
})