Skip to content

Commit 768cb44

Browse files
authored
Analyze vendor prefixed @Keyframes (#131)
* add tests for vendor prefixed keyframes * add prefixed keyframes analysis
1 parent fdf0125 commit 768cb44

File tree

4 files changed

+92
-18
lines changed

4 files changed

+92
-18
lines changed

readme.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ analyze('foo{}')
5353
// 'atrules.keyframes.total': 0,
5454
// 'atrules.keyframes.totalUnique': 0,
5555
// 'atrules.keyframes.unique': [],
56+
// 'atrules.keyframes.prefixed.total': 0,
57+
// 'atrules.keyframes.prefixed.totalUnique': 0,
58+
// 'atrules.keyframes.prefixed.unique': [],
59+
// 'atrules.keyframes.prefixed.share': 0,
5660
// 'atrules.mediaqueries.total': 0,
5761
// 'atrules.mediaqueries.totalUnique': 0,
5862
// 'atrules.mediaqueries.unique': [],

src/analyzer/atrules/keyframes.js

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1+
const isVendorPrefixed = require('is-vendor-prefixed')
12
const uniquer = require('../../utils/uniquer')
23

34
module.exports = atRules => {
4-
const all = atRules
5-
.filter(rule => {
6-
return [
7-
'keyframes',
8-
'-moz-keyframes',
9-
'-webkit-keyframes',
10-
'-ms-keyframes',
11-
'-o-keyframes'
12-
].includes(rule.type)
13-
})
14-
.map(rule => rule.params)
5+
const all = atRules.filter(rule => rule.type.includes('keyframes'))
6+
const prefixed = all
7+
.filter(rule => isVendorPrefixed(rule.type))
8+
.map(rule => `@${rule.type} ${rule.params}`)
159

1610
return {
1711
total: all.length,
18-
...uniquer(all)
12+
...uniquer(all.map(rule => rule.params)),
13+
prefixed: {
14+
total: prefixed.length,
15+
...uniquer(prefixed),
16+
share: prefixed.length === 0 ? 0 : all.length / prefixed.length
17+
}
1918
}
2019
}

test/analyzer/atrules/keyframes.js

Lines changed: 73 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,13 @@ test('it responds with the correct structure', t => [
3232
t.deepEqual(analyze([]), {
3333
total: 0,
3434
totalUnique: 0,
35-
unique: []
35+
unique: [],
36+
prefixed: {
37+
total: 0,
38+
totalUnique: 0,
39+
unique: [],
40+
share: 0
41+
}
3642
})
3743
])
3844

@@ -57,6 +63,69 @@ test('it counts unique @keyframes', t => {
5763
t.is(actual, 2)
5864
})
5965

66+
test('it finds all vendor prefixed keyframes', t => {
67+
const fixture = [
68+
{
69+
type: '-webkit-keyframes',
70+
params: 'ANIMATION'
71+
},
72+
{
73+
type: '-moz-keyframes',
74+
params: 'ANIMATION'
75+
},
76+
{
77+
type: '-ms-keyframes',
78+
params: 'ANIMATION'
79+
},
80+
{
81+
type: '-o-keyframes',
82+
params: 'ANIMATION'
83+
}
84+
]
85+
const {prefixed: actual} = analyze(fixture)
86+
87+
t.is(actual.total, 4)
88+
t.is(actual.totalUnique, 4)
89+
t.is(actual.share, 1)
90+
t.deepEqual(actual.unique, [
91+
{
92+
count: 1,
93+
value: '@-moz-keyframes ANIMATION'
94+
},
95+
{
96+
count: 1,
97+
value: '@-ms-keyframes ANIMATION'
98+
},
99+
{
100+
count: 1,
101+
value: '@-o-keyframes ANIMATION'
102+
},
103+
{
104+
count: 1,
105+
value: '@-webkit-keyframes ANIMATION'
106+
}
107+
])
108+
})
109+
110+
test('it does not report non-vendor prefixed keyframes as prefixed', t => {
111+
const fixture = [
112+
{
113+
type: 'keyframes',
114+
params: 'ANIMATION'
115+
},
116+
{
117+
type: 'keyframes',
118+
params: '-webkit-animation-name'
119+
}
120+
]
121+
const {prefixed: actual} = analyze(fixture)
122+
123+
t.is(actual.total, 0)
124+
t.is(actual.totalUnique, 0)
125+
t.is(actual.share, 0)
126+
t.deepEqual(actual.unique, [])
127+
})
128+
60129
test('it does not report non-@keyframes atrules as @keyframes', t => {
61130
const actual = analyze([
62131
{
@@ -69,9 +138,7 @@ test('it does not report non-@keyframes atrules as @keyframes', t => {
69138
}
70139
])
71140

72-
t.deepEqual(actual, {
73-
total: 0,
74-
totalUnique: 0,
75-
unique: []
76-
})
141+
t.is(actual.total, 0)
142+
t.is(actual.totalUnique, 0)
143+
t.deepEqual(actual.unique, [])
77144
})

test/analyzer/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ test('Returns the correct analysis object structure', async t => {
3333
'atrules.keyframes.total': 0,
3434
'atrules.keyframes.totalUnique': 0,
3535
'atrules.keyframes.unique': [],
36+
'atrules.keyframes.prefixed.total': 0,
37+
'atrules.keyframes.prefixed.totalUnique': 0,
38+
'atrules.keyframes.prefixed.unique': [],
39+
'atrules.keyframes.prefixed.share': 0,
3640
'atrules.mediaqueries.total': 0,
3741
'atrules.mediaqueries.totalUnique': 0,
3842
'atrules.mediaqueries.unique': [],

0 commit comments

Comments
 (0)