diff --git a/src/index.ts b/src/index.ts index 57119361..9d4e6e9c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -313,10 +313,10 @@ function analyzeInternal(css: string, options: Options, useLo } else if (node.type === STYLE_RULE) { // Handle keyframe rules specially if (inKeyframes && node.prelude) { - // In keyframes, the prelude is a SelectorList that may not have Selector children - // (e.g., "50%" is just a SelectorList with text, no Selector child) - if (node.prelude.type === SELECTOR_LIST && node.prelude.text) { - keyframeSelectors.p(node.prelude.text, toLoc(node.prelude)) + if (node.prelude.type === SELECTOR_LIST && node.prelude.children.length > 0) { + for (let keyframe_selector of node.prelude.children) { + keyframeSelectors.p(keyframe_selector.text, toLoc(keyframe_selector)) + } } // Don't count keyframe rules as regular rules, but continue walking // children to count declarations inside keyframes diff --git a/src/selectors/selectors.test.ts b/src/selectors/selectors.test.ts index 0c8e97f9..19dfc210 100644 --- a/src/selectors/selectors.test.ts +++ b/src/selectors/selectors.test.ts @@ -199,6 +199,7 @@ test('counts s', () => { 50% { opacity: 0; } + 90%, to { opacity: 1; } @@ -219,14 +220,15 @@ test('counts s', () => { const actual = analyze(fixture).selectors expect(actual.total).toBe(2) expect(actual.keyframes).toEqual({ - total: 4, - totalUnique: 3, + total: 5, + totalUnique: 4, unique: { from: 2, + '90%': 1, to: 1, '50%': 1, }, - uniquenessRatio: 3 / 4, + uniquenessRatio: 4 / 5, }) })