Skip to content

Commit a7964e9

Browse files
authored
feat: analyze types of atrules composition (#470)
1 parent df3d0dc commit a7964e9

File tree

3 files changed

+68
-54
lines changed

3 files changed

+68
-54
lines changed

src/atrules/atrules.test.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,16 @@ AtRules('counts total atrules', () => {
1818
a {}
1919
}
2020
`
21-
let actual = analyze(css).atrules.total
22-
assert.is(actual, 4)
21+
let actual = analyze(css).atrules
22+
assert.is(actual.total, 4)
23+
assert.is(actual.totalUnique, 4)
24+
assert.equal(actual.unique, {
25+
'import': 1,
26+
'layer': 1,
27+
'media': 1,
28+
'supports': 1,
29+
})
30+
assert.equal(actual.uniquenessRatio, 4 / 4)
2331
})
2432

2533
AtRules('calculates complexity', () => {

src/index.js

Lines changed: 54 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ export function analyze(css, options = {}) {
110110
let linesOfCode = ast.loc.end.line - ast.loc.start.line + 1
111111

112112
// Atrules
113-
let totalAtRules = 0
113+
let atrules = new Collection(useLocations)
114114
let atRuleComplexities = new AggregateCollection()
115115
/** @type {Record<string, string>[]} */
116116
let fontfaces = []
@@ -209,7 +209,7 @@ export function analyze(css, options = {}) {
209209
enter(node) {
210210
switch (node.type) {
211211
case Atrule: {
212-
totalAtRules++
212+
atrules.p(node.name, node.loc)
213213
atruleNesting.push(nestingDepth)
214214
uniqueAtruleNesting.p(nestingDepth, node.loc)
215215

@@ -795,10 +795,11 @@ export function analyze(css, options = {}) {
795795
let declarationComplexity = declarationComplexities.aggregate()
796796
let propertyComplexity = propertyComplexities.aggregate()
797797
let valueComplexity = valueComplexities.aggregate()
798+
let atruleCount = atrules.c()
798799

799800
return {
800801
stylesheet: {
801-
sourceLinesOfCode: totalAtRules + totalSelectors + totalDeclarations + keyframeSelectors.size(),
802+
sourceLinesOfCode: atruleCount.total + totalSelectors + totalDeclarations + keyframeSelectors.size(),
802803
linesOfCode,
803804
size: cssLen,
804805
complexity: atRuleComplexity.sum + selectorComplexity.sum + declarationComplexity.sum + propertyComplexity.sum + valueComplexity.sum,
@@ -819,55 +820,57 @@ export function analyze(css, options = {}) {
819820
},
820821
},
821822
},
822-
atrules: {
823-
fontface: assign({
824-
total: fontFacesCount,
825-
totalUnique: fontFacesCount,
826-
unique: fontfaces,
827-
uniquenessRatio: fontFacesCount === 0 ? 0 : 1,
828-
}, useLocations ? {
829-
uniqueWithLocations: fontfaces_with_loc.c().uniqueWithLocations,
830-
} : {}),
831-
import: imports.c(),
832-
media: assign(
833-
medias.c(),
834-
{
835-
browserhacks: mediaBrowserhacks.c(),
836-
features: mediaFeatures.c(),
837-
}
838-
),
839-
charset: charsets.c(),
840-
supports: assign(
841-
supports.c(),
842-
{
843-
browserhacks: supportsBrowserhacks.c(),
844-
},
845-
),
846-
keyframes: assign(
847-
keyframes.c(), {
848-
prefixed: assign(
849-
prefixedKeyframes.c(), {
850-
ratio: ratio(prefixedKeyframes.size(), keyframes.size())
823+
atrules: assign(
824+
atruleCount,
825+
{
826+
fontface: assign({
827+
total: fontFacesCount,
828+
totalUnique: fontFacesCount,
829+
unique: fontfaces,
830+
uniquenessRatio: fontFacesCount === 0 ? 0 : 1,
831+
}, useLocations ? {
832+
uniqueWithLocations: fontfaces_with_loc.c().uniqueWithLocations,
833+
} : {}),
834+
import: imports.c(),
835+
media: assign(
836+
medias.c(),
837+
{
838+
browserhacks: mediaBrowserhacks.c(),
839+
features: mediaFeatures.c(),
840+
}
841+
),
842+
charset: charsets.c(),
843+
supports: assign(
844+
supports.c(),
845+
{
846+
browserhacks: supportsBrowserhacks.c(),
847+
},
848+
),
849+
keyframes: assign(
850+
keyframes.c(), {
851+
prefixed: assign(
852+
prefixedKeyframes.c(), {
853+
ratio: ratio(prefixedKeyframes.size(), keyframes.size())
854+
}),
851855
}),
852-
}),
853-
container: assign(
854-
containers.c(),
855-
{
856-
names: containerNames.c(),
857-
}
858-
),
859-
layer: layers.c(),
860-
property: registeredProperties.c(),
861-
total: totalAtRules,
862-
complexity: atRuleComplexity,
863-
nesting: assign(
864-
atruleNesting.aggregate(),
865-
{
866-
items: atruleNesting.toArray(),
867-
},
868-
uniqueAtruleNesting.c(),
869-
),
870-
},
856+
container: assign(
857+
containers.c(),
858+
{
859+
names: containerNames.c(),
860+
}
861+
),
862+
layer: layers.c(),
863+
property: registeredProperties.c(),
864+
complexity: atRuleComplexity,
865+
nesting: assign(
866+
atruleNesting.aggregate(),
867+
{
868+
items: atruleNesting.toArray(),
869+
},
870+
uniqueAtruleNesting.c(),
871+
),
872+
}
873+
),
871874
rules: {
872875
total: totalRules,
873876
empty: {

src/index.test.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ Api("handles empty input gracefully", () => {
8787
complexity: 0,
8888
},
8989
atrules: {
90+
total: 0,
91+
totalUnique: 0,
92+
unique: {},
93+
uniquenessRatio: 0,
9094
fontface: {
9195
total: 0,
9296
totalUnique: 0,
@@ -172,7 +176,6 @@ Api("handles empty input gracefully", () => {
172176
unique: {},
173177
uniquenessRatio: 0,
174178
},
175-
total: 0,
176179
complexity: {
177180
min: 0,
178181
max: 0,

0 commit comments

Comments
 (0)