diff --git a/src/atrules/atrules.test.js b/src/atrules/atrules.test.js index e683da5..240dee4 100644 --- a/src/atrules/atrules.test.js +++ b/src/atrules/atrules.test.js @@ -980,7 +980,14 @@ AtRules('tracks nesting depth', () => { mode: 1, range: 1, sum: 2, - items: [1, 0, 1] + items: [1, 0, 1], + total: 3, + totalUnique: 2, + unique: { + 0: 1, + 1: 2, + }, + uniquenessRatio: 2 / 3, } assert.equal(actual, expected) }) diff --git a/src/declarations/declarations.test.js b/src/declarations/declarations.test.js index c5295c3..102ce36 100644 --- a/src/declarations/declarations.test.js +++ b/src/declarations/declarations.test.js @@ -182,7 +182,15 @@ Declarations('tracks nesting depth', () => { mode: 0, range: 2, sum: 4, - items: [0, 0, 1, 0, 1, 2] + items: [0, 0, 1, 0, 1, 2], + total: 6, + totalUnique: 3, + unique: { + 0: 3, + 1: 2, + 2: 1, + }, + uniquenessRatio: 3 / 6, } assert.equal(actual, expected) }) diff --git a/src/index.js b/src/index.js index 24d0971..12122de 100644 --- a/src/index.js +++ b/src/index.js @@ -129,6 +129,7 @@ export function analyze(css, options = {}) { let containerNames = new Collection(useLocations) let registeredProperties = new Collection(useLocations) let atruleNesting = new AggregateCollection() + let uniqueAtruleNesting = new Collection(useLocations) // Rules let totalRules = 0 @@ -140,6 +141,7 @@ export function analyze(css, options = {}) { let uniqueSelectorsPerRule = new Collection(useLocations) let uniqueDeclarationsPerRule = new Collection(useLocations) let ruleNesting = new AggregateCollection() + let uniqueRuleNesting = new Collection(useLocations) // Selectors let keyframeSelectors = new Collection(useLocations) @@ -162,6 +164,7 @@ export function analyze(css, options = {}) { let pseudoClasses = new Collection(useLocations) let combinators = new Collection(useLocations) let selectorNesting = new AggregateCollection() + let uniqueSelectorNesting = new Collection(useLocations) // Declarations let uniqueDeclarations = new Set() @@ -171,6 +174,7 @@ export function analyze(css, options = {}) { let importantsInKeyframes = 0 let importantCustomProperties = new Collection(useLocations) let declarationNesting = new AggregateCollection() + let uniqueDeclarationNesting = new Collection(useLocations) // Properties let properties = new Collection(useLocations) @@ -207,6 +211,7 @@ export function analyze(css, options = {}) { case Atrule: { totalAtRules++ atruleNesting.push(nestingDepth) + uniqueAtruleNesting.p(nestingDepth, node.loc) let atRuleName = node.name @@ -318,6 +323,7 @@ export function analyze(css, options = {}) { declarationsPerRule.push(numDeclarations) uniqueDeclarationsPerRule.p(numDeclarations, block.loc) ruleNesting.push(nestingDepth) + uniqueRuleNesting.p(nestingDepth, node.loc) totalRules++ @@ -355,6 +361,7 @@ export function analyze(css, options = {}) { selectorComplexities.push(complexity) uniqueSelectorComplexities.p(complexity, node.loc) selectorNesting.push(nestingDepth - 1) + uniqueSelectorNesting.p(nestingDepth - 1, node.loc) // #region specificity let specificity = calculateForAST(node).toArray() @@ -713,6 +720,7 @@ export function analyze(css, options = {}) { uniqueDeclarations.add(stringifyNode(node)) declarationNesting.push(nestingDepth - 1) + uniqueDeclarationNesting.p(nestingDepth - 1, node.loc) if (node.important === true) { importantDeclarations++ @@ -856,7 +864,8 @@ export function analyze(css, options = {}) { atruleNesting.aggregate(), { items: atruleNesting.toArray(), - } + }, + uniqueAtruleNesting.c(), ), }, rules: { @@ -876,7 +885,8 @@ export function analyze(css, options = {}) { ruleNesting.aggregate(), { items: ruleNesting.toArray(), - } + }, + uniqueRuleNesting.c(), ), selectors: assign( selectorsPerRule.aggregate(), @@ -925,7 +935,8 @@ export function analyze(css, options = {}) { selectorNesting.aggregate(), { items: selectorNesting.toArray(), - } + }, + uniqueSelectorNesting.c(), ), id: assign( ids.c(), { @@ -962,7 +973,8 @@ export function analyze(css, options = {}) { declarationNesting.aggregate(), { items: declarationNesting.toArray(), - } + }, + uniqueDeclarationNesting.c(), ), }, properties: assign( diff --git a/src/index.test.js b/src/index.test.js index 42cd337..c7111a6 100644 --- a/src/index.test.js +++ b/src/index.test.js @@ -189,6 +189,10 @@ Api("handles empty input gracefully", () => { range: 0, sum: 0, items: [], + total: 0, + totalUnique: 0, + unique: {}, + uniquenessRatio: 0, } }, rules: { @@ -218,6 +222,10 @@ Api("handles empty input gracefully", () => { range: 0, sum: 0, items: [], + total: 0, + totalUnique: 0, + unique: {}, + uniquenessRatio: 0, }, selectors: { min: 0, @@ -283,6 +291,10 @@ Api("handles empty input gracefully", () => { range: 0, sum: 0, items: [], + total: 0, + totalUnique: 0, + unique: {}, + uniquenessRatio: 0, }, id: { total: 0, @@ -352,6 +364,10 @@ Api("handles empty input gracefully", () => { range: 0, sum: 0, items: [], + total: 0, + totalUnique: 0, + unique: {}, + uniquenessRatio: 0, } }, properties: { diff --git a/src/rules/rules.test.js b/src/rules/rules.test.js index 519c6dd..4b3de03 100644 --- a/src/rules/rules.test.js +++ b/src/rules/rules.test.js @@ -69,6 +69,10 @@ Rules('should handle CSS without rules', () => { range: 0, sum: 0, items: [], + total: 0, + totalUnique: 0, + unique: {}, + uniquenessRatio: 0, } } assert.equal(actual.rules, expected) @@ -441,7 +445,15 @@ Rules('tracks nesting depth', () => { mode: 0, range: 2, sum: 3, - items: [0, 0, 1, 2] + items: [0, 0, 1, 2], + total: 4, + totalUnique: 3, + unique: { + 0: 2, + 1: 1, + 2: 1, + }, + uniquenessRatio: 3 / 4, } assert.equal(actual, expected) }) diff --git a/src/selectors/selectors.test.js b/src/selectors/selectors.test.js index 3b0add4..813c7c7 100644 --- a/src/selectors/selectors.test.js +++ b/src/selectors/selectors.test.js @@ -110,6 +110,10 @@ Selectors('handles CSS without selectors', () => { range: 0, sum: 0, items: [], + total: 0, + totalUnique: 0, + unique: {}, + uniquenessRatio: 0, }, } assert.equal(actual, expected) @@ -368,6 +372,12 @@ Selectors('handles emoji selectors', () => { range: 0, sum: 0, items: [0], + total: 1, + totalUnique: 1, + unique: { + 0: 1, + }, + uniquenessRatio: 1 / 1, }, } assert.equal(actual, expected) @@ -529,7 +539,15 @@ Selectors('tracks nesting depth', () => { mode: 0, range: 2, sum: 3, - items: [0, 0, 1, 2] + items: [0, 0, 1, 2], + total: 4, + totalUnique: 3, + unique: { + 0: 2, + 1: 1, + 2: 1, + }, + uniquenessRatio: 3 / 4, } assert.equal(actual, expected) })