Skip to content

Commit efdb357

Browse files
authored
Report all global CSS keywords usage (#389)
closes #387
1 parent 1a9240c commit efdb357

16 files changed

+233
-12
lines changed

src/__fixtures__/bol-com-20231008.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56587,6 +56587,18 @@
5658756587
"median": 1,
5658856588
"range": 1,
5658956589
"sum": 10452
56590+
},
56591+
"keywords": {
56592+
"total": 930,
56593+
"totalUnique": 5,
56594+
"unique": {
56595+
"none": 574,
56596+
"inherit": 89,
56597+
"auto": 231,
56598+
"initial": 33,
56599+
"unset": 3
56600+
},
56601+
"uniquenessRatio": 0.005376344086021506
5659056602
}
5659156603
}
5659256604
}

src/__fixtures__/bootstrap-5.3.2.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30656,6 +30656,17 @@
3065630656
"median": 1,
3065730657
"range": 1,
3065830658
"sum": 5643
30659+
},
30660+
"keywords": {
30661+
"total": 538,
30662+
"totalUnique": 4,
30663+
"unique": {
30664+
"inherit": 34,
30665+
"none": 208,
30666+
"auto": 292,
30667+
"initial": 4
30668+
},
30669+
"uniquenessRatio": 0.007434944237918215
3065930670
}
3066030671
}
3066130672
}

src/__fixtures__/cnn-20231008.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33714,6 +33714,18 @@
3371433714
"median": 1,
3371533715
"range": 1,
3371633716
"sum": 5964
33717+
},
33718+
"keywords": {
33719+
"total": 663,
33720+
"totalUnique": 5,
33721+
"unique": {
33722+
"auto": 116,
33723+
"none": 429,
33724+
"inherit": 43,
33725+
"initial": 13,
33726+
"unset": 62
33727+
},
33728+
"uniquenessRatio": 0.007541478129713424
3371733729
}
3371833730
}
3371933731
}

src/__fixtures__/css-tricks-20231008.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14876,6 +14876,16 @@
1487614876
"median": 1,
1487714877
"range": 1,
1487814878
"sum": 2701
14879+
},
14880+
"keywords": {
14881+
"total": 182,
14882+
"totalUnique": 3,
14883+
"unique": {
14884+
"none": 113,
14885+
"auto": 59,
14886+
"inherit": 10
14887+
},
14888+
"uniquenessRatio": 0.016483516483516484
1487914889
}
1488014890
}
1488114891
}

src/__fixtures__/gazelle-20231008.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90344,6 +90344,18 @@
9034490344
"median": 1,
9034590345
"range": 1,
9034690346
"sum": 18098
90347+
},
90348+
"keywords": {
90349+
"total": 1196,
90350+
"totalUnique": 5,
90351+
"unique": {
90352+
"none": 767,
90353+
"auto": 347,
90354+
"inherit": 40,
90355+
"initial": 36,
90356+
"unset": 6
90357+
},
90358+
"uniquenessRatio": 0.004180602006688963
9034790359
}
9034890360
}
9034990361
}

src/__fixtures__/github-20231008.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102120,6 +102120,19 @@
102120102120
"median": 1,
102121102121
"range": 1,
102122102122
"sum": 26314
102123+
},
102124+
"keywords": {
102125+
"total": 1518,
102126+
"totalUnique": 6,
102127+
"unique": {
102128+
"none": 961,
102129+
"inherit": 150,
102130+
"auto": 364,
102131+
"initial": 19,
102132+
"revert": 3,
102133+
"unset": 21
102134+
},
102135+
"uniquenessRatio": 0.003952569169960474
102123102136
}
102124102137
}
102125102138
}

src/__fixtures__/indiatimes-20231008.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58267,6 +58267,17 @@
5826758267
"median": 1,
5826858268
"range": 1,
5826958269
"sum": 6161
58270+
},
58271+
"keywords": {
58272+
"total": 266,
58273+
"totalUnique": 4,
58274+
"unique": {
58275+
"none": 95,
58276+
"auto": 135,
58277+
"inherit": 35,
58278+
"unset": 1
58279+
},
58280+
"uniquenessRatio": 0.015037593984962405
5827058281
}
5827158282
}
5827258283
}

src/__fixtures__/smashing-magazine-20231008.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51551,6 +51551,18 @@
5155151551
"median": 1,
5155251552
"range": 1,
5155351553
"sum": 11962
51554+
},
51555+
"keywords": {
51556+
"total": 980,
51557+
"totalUnique": 5,
51558+
"unique": {
51559+
"inherit": 80,
51560+
"auto": 281,
51561+
"none": 588,
51562+
"initial": 27,
51563+
"unset": 4
51564+
},
51565+
"uniquenessRatio": 0.00510204081632653
5155451566
}
5155551567
}
5155651568
}

src/__fixtures__/trello-20231008.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11656,6 +11656,16 @@
1165611656
"median": 1,
1165711657
"range": 1,
1165811658
"sum": 3825
11659+
},
11660+
"keywords": {
11661+
"total": 300,
11662+
"totalUnique": 3,
11663+
"unique": {
11664+
"inherit": 19,
11665+
"none": 141,
11666+
"auto": 140
11667+
},
11668+
"uniquenessRatio": 0.01
1165911669
}
1166011670
}
1166111671
}

src/index.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { isSupportsBrowserhack, isMediaBrowserhack } from './atrules/atrules.js'
55
import { getCombinators, getComplexity, isAccessibility, isPrefixed } from './selectors/utils.js'
66
import { colorFunctions, colorKeywords, namedColors, systemColors } from './values/colors.js'
77
import { destructure, isSystemFont } from './values/destructure-font-shorthand.js'
8-
import { isValueKeyword } from './values/values.js'
8+
import { isValueKeyword, keywords } from './values/values.js'
99
import { analyzeAnimation } from './values/animations.js'
1010
import { isValuePrefixed } from './values/vendor-prefix.js'
1111
import { ContextCollection } from './context-collection.js'
@@ -175,6 +175,7 @@ export function analyze(css, options = {}) {
175175
let colorFormats = new Collection(useLocations)
176176
let units = new ContextCollection(useLocations)
177177
let gradients = new Collection(useLocations)
178+
let valueKeywords = new Collection(useLocations)
178179

179180
walk(ast, function (node) {
180181
switch (node.type) {
@@ -412,6 +413,7 @@ export function analyze(css, options = {}) {
412413
case Value: {
413414
if (isValueKeyword(node)) {
414415
valueComplexities.push(1)
416+
valueKeywords.p(stringifyNode(node), node.loc)
415417
break
416418
}
417419

@@ -450,7 +452,11 @@ export function analyze(css, options = {}) {
450452
} else if (isProperty('font', property)) {
451453
if (isSystemFont(node)) return
452454

453-
let { font_size, line_height, font_family } = destructure(node, stringifyNode)
455+
let { font_size, line_height, font_family } = destructure(node, stringifyNode, function (item) {
456+
if (item.type === 'keyword') {
457+
valueKeywords.p(item.value, loc)
458+
}
459+
})
454460

455461
if (font_family) {
456462
fontFamilies.p(font_family, loc)
@@ -481,6 +487,8 @@ export function analyze(css, options = {}) {
481487
timingFunctions.p(stringifyNode(item.value), loc)
482488
} else if (item.type === 'duration') {
483489
durations.p(stringifyNode(item.value), loc)
490+
} else if (item.type === 'keyword') {
491+
valueKeywords.p(stringifyNode(item.value), loc)
484492
}
485493
})
486494
break
@@ -533,6 +541,10 @@ export function analyze(css, options = {}) {
533541
return this.skip
534542
}
535543
case Identifier: {
544+
if (keywords.has(nodeName)) {
545+
valueKeywords.p(nodeName, loc)
546+
}
547+
536548
// Bail out if it can't be a color name
537549
// 20 === 'lightgoldenrodyellow'.length
538550
// 3 === 'red'.length
@@ -870,6 +882,7 @@ export function analyze(css, options = {}) {
870882
browserhacks: valueBrowserhacks.c(),
871883
units: units.count(),
872884
complexity: valueComplexity,
885+
keywords: valueKeywords.c(),
873886
},
874887
__meta__: {
875888
parseTime: startAnalysis - startParse,

0 commit comments

Comments
 (0)