diff --git a/src/jit/lib/optimizeUniversalRules.js b/src/jit/lib/resolveDefaultsAtRules.js similarity index 87% rename from src/jit/lib/optimizeUniversalRules.js rename to src/jit/lib/resolveDefaultsAtRules.js index 73cb1ecb3..14e7bf19a 100644 --- a/src/jit/lib/optimizeUniversalRules.js +++ b/src/jit/lib/resolveDefaultsAtRules.js @@ -22,7 +22,7 @@ function extractElementSelector(selector) { return cache.get(selector) } -export default function collapseAdjacentRules() { +export default function resolveDefaultsAtRules() { return (root) => { let variableNodeMap = new Map() let universals = new Set() @@ -45,9 +45,8 @@ export default function collapseAdjacentRules() { for (let universal of universals) { let selectors = new Set() - let universalRule = postcss.rule() - let rules = variableNodeMap.get(universal.params) + let rules = variableNodeMap.get(universal.params) ?? [] for (let rule of rules) { for (let selector of extractElementSelector(rule.selector)) { @@ -55,6 +54,12 @@ export default function collapseAdjacentRules() { } } + if (selectors.size === 0) { + universal.remove() + continue + } + + let universalRule = postcss.rule() universalRule.selectors = [...selectors] universalRule.append(universal.nodes) universal.before(universalRule) diff --git a/src/jit/processTailwindFeatures.js b/src/jit/processTailwindFeatures.js index 6344b5219..d89c1a7ca 100644 --- a/src/jit/processTailwindFeatures.js +++ b/src/jit/processTailwindFeatures.js @@ -3,7 +3,7 @@ import expandTailwindAtRules from './lib/expandTailwindAtRules' import expandApplyAtRules from './lib/expandApplyAtRules' import evaluateTailwindFunctions from '../lib/evaluateTailwindFunctions' import substituteScreenAtRules from '../lib/substituteScreenAtRules' -import optimizeUniversalRules from './lib/optimizeUniversalRules' +import resolveDefaultsAtRules from './lib/resolveDefaultsAtRules' import collapseAdjacentRules from './lib/collapseAdjacentRules' import { createContext } from './lib/setupContextUtils' import log from '../util/log' @@ -46,7 +46,7 @@ export default function processTailwindFeatures(setupContext) { expandApplyAtRules(context)(root, result) evaluateTailwindFunctions(context)(root, result) substituteScreenAtRules(context)(root, result) - optimizeUniversalRules(context)(root, result) + resolveDefaultsAtRules(context)(root, result) collapseAdjacentRules(context)(root, result) } } diff --git a/tests/jit/optimize-universal-selectors.test.js b/tests/jit/resolve-defaults-at-rules.test.js similarity index 93% rename from tests/jit/optimize-universal-selectors.test.js rename to tests/jit/resolve-defaults-at-rules.test.js index c5d9001e5..4ca62e163 100644 --- a/tests/jit/optimize-universal-selectors.test.js +++ b/tests/jit/resolve-defaults-at-rules.test.js @@ -549,3 +549,59 @@ test('with shadows', async () => { `) }) }) + +test('when no utilities that need the defaults are used', async () => { + let config = { + mode: 'jit', + purge: [ + { + raw: '
', + }, + ], + theme: {}, + plugins: [], + corePlugins: ['transform', 'scale', 'rotate', 'skew'], + } + + let css = ` + @tailwind base; + /* --- */ + @tailwind utilities; + ` + + return run(css, config).then((result) => { + expect(result.css).toMatchFormattedCss(` + /* --- */ + `) + }) +}) + +test('when a utility uses defaults but they do not exist', async () => { + let config = { + mode: 'jit', + purge: [ + { + raw: '', + }, + ], + theme: {}, + plugins: [], + corePlugins: ['rotate'], + } + + let css = ` + @tailwind base; + /* --- */ + @tailwind utilities; + ` + + return run(css, config).then((result) => { + expect(result.css).toMatchFormattedCss(` + /* --- */ + .rotate-3 { + --tw-rotate: 3deg; + transform: var(--tw-transform); + } + `) + }) +})