Skip to content

Commit e4b24b0

Browse files
committed
feat: support whitelists and blacklists
1 parent 776172c commit e4b24b0

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

lib/css-nuker.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,22 @@ const ENABLE_COMMENT_REGEX = /\bnukecss:enable\b/
44
const DISABLE_COMMENT_REGEX = /\bnukecss:disable\b/
55

66
class CssNuker {
7-
constructor(sources, parser) {
7+
constructor(sources, parser, options = {}) {
8+
this._options = options
89
this._sources = sources
910
this._parser = parser
1011

1112
this._enabled = true
1213
this._usedTokens = new Set()
14+
this._blacklistedTokens = new Set()
15+
16+
if (options.whitelist) {
17+
options.whitelist.forEach(token => this._usedTokens.add(token))
18+
}
19+
20+
if (options.blacklist) {
21+
options.blacklist.forEach(token => this._blacklistedTokens.add(token))
22+
}
1323
}
1424

1525
nuke() {
@@ -43,6 +53,8 @@ class CssNuker {
4353
return _.every(tokens, token => {
4454
if (this._usedTokens.has(token)) {
4555
return true
56+
} else if (this._blacklistedTokens.has(token)) {
57+
return false
4658
}
4759

4860
const found = _.find(this._sources, source => source.contains(token))

lib/plugin.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ function createPlugin(sources, opts) {
99

1010
return parsed => {
1111
const parser = new PostCssParser(parsed)
12-
const nuker = new CssNuker(sources, parser)
12+
const nuker = new CssNuker(sources, parser, opts)
1313
nuker.nuke()
1414
}
1515
}

test/nuke.test.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ describe('nuke.js', function () {
77
const htmlContent = fs.readFileSync(path.join(__dirname, '/fixtures/content.html'), 'utf8')
88
const cssContent = fs.readFileSync(path.join(__dirname, '/fixtures/content.css'), 'utf8')
99

10+
it('should keep used rules', function () {
11+
const result = nukecss(htmlContent, cssContent)
12+
expect(result).to.contain('#something[title*=foo]:hover')
13+
expect(result).to.contain('.something')
14+
})
15+
1016
it('should remove unused rules', function () {
1117
const result = nukecss(htmlContent, cssContent)
1218
expect(result).to.not.contain('foobar[something=x]')
@@ -24,6 +30,20 @@ describe('nuke.js', function () {
2430
expect(result).to.contain('.totally-unused')
2531
})
2632

33+
it('should respect the whitelist', function () {
34+
const whitelist = ['foo-bar-3']
35+
const result = nukecss(htmlContent, cssContent, {whitelist})
36+
expect(result).to.contain('.foo-bar-3')
37+
})
38+
39+
it('should respect the blacklist', function () {
40+
const blacklist = ['something']
41+
const extraHtml = '<div id="blacklist-test">test</div>'
42+
const extraCss = '\n.something, #blacklist-test { color: white; }'
43+
const result = nukecss([htmlContent, extraHtml], cssContent + extraCss, {blacklist})
44+
expect(result).to.contain('#blacklist-test')
45+
})
46+
2747
it('should support multiple sources', function () {
2848
const result = nukecss([htmlContent, '<div id="foo-bar-3"></div>'], cssContent)
2949
expect(result).to.contain('.foo-bar-3')

0 commit comments

Comments
 (0)