Skip to content

Commit 71a2b1b

Browse files
author
Bart Veneman
committed
generate proper report in case of empty css, closes #222
1 parent c87702f commit 71a2b1b

File tree

8 files changed

+302
-16
lines changed

8 files changed

+302
-16
lines changed

src/__fixtures__/bootstrap-5.0.0.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"total": 0,
4141
"totalUnique": 0,
4242
"unique": [],
43-
"uniquenessRatio": 1
43+
"uniquenessRatio": 0
4444
},
4545
"import": {
4646
"total": 0,

src/__fixtures__/github-20210501.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"total": 0,
3030
"totalUnique": 0,
3131
"unique": [],
32-
"uniquenessRatio": 1
32+
"uniquenessRatio": 0
3333
},
3434
"import": {
3535
"total": 0,

src/atrules/atrules.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ const analyzeAtRules = ({ atrules, stringifyNode }) => {
6565
total: fontfaces.length,
6666
totalUnique: fontfaces.length,
6767
unique: fontfaces,
68-
uniquenessRatio: 1
68+
uniquenessRatio: fontfaces.length === 0 ? 0 : 1
6969
},
7070
import: imports.count(),
7171
media: medias.count(),

src/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -290,15 +290,15 @@ const analyze = (css) => {
290290
...properties.count(),
291291
prefixed: {
292292
...propertyVendorPrefixes.count(),
293-
ratio: propertyVendorPrefixes.size() / properties.size(),
293+
ratio: properties.size() === 0 ? 0 : propertyVendorPrefixes.size() / properties.size(),
294294
},
295295
custom: {
296296
...customProperties.count(),
297-
ratio: customProperties.size() / properties.size(),
297+
ratio: properties.size() === 0 ? 0 : customProperties.size() / properties.size(),
298298
},
299299
browserhacks: {
300300
...propertyHacks.count(),
301-
ratio: propertyHacks.size() / properties.size(),
301+
ratio: properties.size() === 0 ? 0 : propertyHacks.size() / properties.size(),
302302
}
303303
},
304304
values: {

src/index.test.js

Lines changed: 284 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,288 @@ Api('does not break on CSS Syntax Errors', () => {
3535
assert.not.throws(() => analyze('test { color red }'))
3636
})
3737

38+
Api('handles empty input gracefully', () => {
39+
const actual = analyze('')
40+
delete actual.__meta__
41+
const expected = {
42+
"stylesheet": {
43+
"sourceLinesOfCode": 0,
44+
"linesOfCode": 1,
45+
"size": 0,
46+
"comments": {
47+
"total": 0,
48+
"size": 0
49+
},
50+
"embeddedContent": {
51+
"total": 0,
52+
"totalUnique": 0,
53+
"unique": {},
54+
"uniquenessRatio": 0,
55+
"size": {
56+
"total": 0,
57+
"ratio": 0
58+
}
59+
}
60+
},
61+
"atrules": {
62+
"fontface": {
63+
"total": 0,
64+
"totalUnique": 0,
65+
"unique": [],
66+
"uniquenessRatio": 0
67+
},
68+
"import": {
69+
"total": 0,
70+
"totalUnique": 0,
71+
"unique": {},
72+
"uniquenessRatio": 0
73+
},
74+
"media": {
75+
"total": 0,
76+
"totalUnique": 0,
77+
"unique": {},
78+
"uniquenessRatio": 0
79+
},
80+
"charset": {
81+
"total": 0,
82+
"totalUnique": 0,
83+
"unique": {},
84+
"uniquenessRatio": 0
85+
},
86+
"supports": {
87+
"total": 0,
88+
"totalUnique": 0,
89+
"unique": {},
90+
"uniquenessRatio": 0
91+
},
92+
"keyframes": {
93+
"total": 0,
94+
"totalUnique": 0,
95+
"unique": {},
96+
"uniquenessRatio": 0,
97+
"prefixed": {
98+
"total": 0,
99+
"totalUnique": 0,
100+
"unique": {},
101+
"uniquenessRatio": 0,
102+
"ratio": 0
103+
}
104+
},
105+
"container": {
106+
"total": 0,
107+
"totalUnique": 0,
108+
"unique": {},
109+
"uniquenessRatio": 0
110+
},
111+
"layer": {
112+
"total": 0,
113+
"totalUnique": 0,
114+
"unique": {},
115+
"uniquenessRatio": 0
116+
}
117+
},
118+
"rules": {
119+
"total": 0,
120+
"empty": {
121+
"total": 0,
122+
"ratio": 0
123+
},
124+
"selectors": {
125+
"min": 0,
126+
"max": 0,
127+
"mean": 0,
128+
"mode": 0,
129+
"median": 0,
130+
"range": 0,
131+
"sum": 0,
132+
"items": []
133+
},
134+
"declarations": {
135+
"min": 0,
136+
"max": 0,
137+
"mean": 0,
138+
"mode": 0,
139+
"median": 0,
140+
"range": 0,
141+
"sum": 0,
142+
"items": []
143+
}
144+
},
145+
"selectors": {
146+
"total": 0,
147+
"totalUnique": 0,
148+
"uniquenessRatio": 0,
149+
"specificity": {
150+
"min": [0, 0, 0],
151+
"max": [0, 0, 0],
152+
"sum": [
153+
0,
154+
0,
155+
0
156+
],
157+
"mean": [
158+
0,
159+
0,
160+
0
161+
],
162+
"mode": [
163+
0,
164+
0,
165+
0
166+
],
167+
"median": [
168+
0,
169+
0,
170+
0
171+
],
172+
"items": []
173+
},
174+
"complexity": {
175+
"min": 0,
176+
"max": 0,
177+
"mean": 0,
178+
"mode": 0,
179+
"median": 0,
180+
"range": 0,
181+
"sum": 0,
182+
"total": 0,
183+
"totalUnique": 0,
184+
"unique": {},
185+
"uniquenessRatio": 0,
186+
"items": []
187+
},
188+
"id": {
189+
"total": 0,
190+
"totalUnique": 0,
191+
"unique": {},
192+
"uniquenessRatio": 0,
193+
"ratio": 0
194+
},
195+
"accessibility": {
196+
"total": 0,
197+
"totalUnique": 0,
198+
"unique": {},
199+
"uniquenessRatio": 0,
200+
"ratio": 0
201+
},
202+
"keyframes": {
203+
"total": 0,
204+
"totalUnique": 0,
205+
"unique": {},
206+
"uniquenessRatio": 0
207+
}
208+
},
209+
"declarations": {
210+
"total": 0,
211+
"unique": {
212+
"total": 0,
213+
"ratio": 0
214+
},
215+
"importants": {
216+
"total": 0,
217+
"ratio": 0,
218+
"inKeyframes": {
219+
"total": 0,
220+
"ratio": 0
221+
}
222+
}
223+
},
224+
"properties": {
225+
"total": 0,
226+
"totalUnique": 0,
227+
"unique": {},
228+
"uniquenessRatio": 0,
229+
"prefixed": {
230+
"total": 0,
231+
"totalUnique": 0,
232+
"unique": {},
233+
"uniquenessRatio": 0,
234+
"ratio": 0
235+
},
236+
"custom": {
237+
"total": 0,
238+
"totalUnique": 0,
239+
"unique": {},
240+
"uniquenessRatio": 0,
241+
"ratio": 0
242+
},
243+
"browserhacks": {
244+
"total": 0,
245+
"totalUnique": 0,
246+
"unique": {},
247+
"uniquenessRatio": 0,
248+
"ratio": 0
249+
}
250+
},
251+
"values": {
252+
"colors": {
253+
"total": 0,
254+
"totalUnique": 0,
255+
"unique": {},
256+
"uniquenessRatio": 0,
257+
"itemsPerContext": {}
258+
},
259+
"fontFamilies": {
260+
"total": 0,
261+
"totalUnique": 0,
262+
"unique": {},
263+
"uniquenessRatio": 0
264+
},
265+
"fontSizes": {
266+
"total": 0,
267+
"totalUnique": 0,
268+
"unique": {},
269+
"uniquenessRatio": 0
270+
},
271+
"zindexes": {
272+
"total": 0,
273+
"totalUnique": 0,
274+
"unique": {},
275+
"uniquenessRatio": 0
276+
},
277+
"textShadows": {
278+
"total": 0,
279+
"totalUnique": 0,
280+
"unique": {},
281+
"uniquenessRatio": 0
282+
},
283+
"boxShadows": {
284+
"total": 0,
285+
"totalUnique": 0,
286+
"unique": {},
287+
"uniquenessRatio": 0
288+
},
289+
"animations": {
290+
"durations": {
291+
"total": 0,
292+
"totalUnique": 0,
293+
"unique": {},
294+
"uniquenessRatio": 0
295+
},
296+
"timingFunctions": {
297+
"total": 0,
298+
"totalUnique": 0,
299+
"unique": {},
300+
"uniquenessRatio": 0
301+
}
302+
},
303+
"prefixes": {
304+
"total": 0,
305+
"totalUnique": 0,
306+
"unique": {},
307+
"uniquenessRatio": 0
308+
},
309+
"units": {
310+
"total": 0,
311+
"totalUnique": 0,
312+
"unique": {},
313+
"uniquenessRatio": 0,
314+
"itemsPerContext": {}
315+
}
316+
},
317+
}
318+
319+
assert.equal(actual, expected)
320+
})
321+
38322
Api.run()

src/selectors/selectors.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ const analyzeSelectors = ({ stringifyNode, selectors }) => {
8181
uniquenessRatio: selectors.length === 0 ? 0 : totalUnique / totalSelectors,
8282
specificity: {
8383
/** @type [number, number, number] */
84-
min: minSpecificity,
84+
min: minSpecificity === undefined ? [0, 0, 0] : minSpecificity,
8585
/** @type [number, number, number] */
86-
max: maxSpecificity,
86+
max: maxSpecificity === undefined ? [0, 0, 0] : maxSpecificity,
8787
/** @type [number, number, number] */
8888
sum: [aggregatesA.sum, aggregatesB.sum, aggregatesC.sum],
8989
/** @type [number, number, number] */

src/selectors/selectors.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ Selectors('handles CSS without selectors', () => {
4040
uniquenessRatio: 0,
4141
specificity: {
4242
sum: [0, 0, 0],
43-
min: undefined,
44-
max: undefined,
43+
min: [0, 0, 0],
44+
max: [0, 0, 0],
4545
mean: [0, 0, 0],
4646
mode: [0, 0, 0],
4747
median: [0, 0, 0],

src/smoke.test.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@ Object.entries({
2828
// const result = analyze(css)
2929
// delete result.__meta__
3030
// fs.writeFileSync(`./src/__fixtures__/${fileName}.json`, JSON.stringify(result, null, 2))
31-
Smoke(name, () => {
32-
assert.not.throws(() => {
33-
const result = analyze(css)
34-
delete result.__meta__
35-
assert.fixture(JSON.stringify(result, null, 2), json)
36-
})
31+
Smoke(`${name} should not throw`, () => {
32+
assert.not.throws(() => analyze(css))
33+
})
34+
35+
Smoke(`${name} matches fixture`, () => {
36+
const result = analyze(css)
37+
delete result.__meta__
38+
assert.fixture(JSON.stringify(result, null, 2), json)
3739
})
3840
})
3941

0 commit comments

Comments
 (0)