From bf2be84ee038bedde41a1e34fd1584f51e8d2abe Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Thu, 13 Oct 2022 13:20:17 -0400 Subject: [PATCH] Feature flag generalized modifiers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We’re putting a flag for modifiers in front of matchVariant and matchUtilities --- src/featureFlags.js | 1 + src/lib/setupContextUtils.js | 27 +++++++++++++++++++++------ src/util/pluginUtils.js | 10 +++++++--- tests/arbitrary-variants.test.js | 8 +++++++- tests/match-utilities.test.js | 19 ++++++++++++++++--- 5 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/featureFlags.js b/src/featureFlags.js index 2bfee94d97ab..13c424184768 100644 --- a/src/featureFlags.js +++ b/src/featureFlags.js @@ -14,6 +14,7 @@ let featureFlags = { ], experimental: [ 'optimizeUniversalDefaults', + 'generalizedModifiers', // 'variantGrouping', ], } diff --git a/src/lib/setupContextUtils.js b/src/lib/setupContextUtils.js index 01b6dc788481..2f0ca84084b5 100644 --- a/src/lib/setupContextUtils.js +++ b/src/lib/setupContextUtils.js @@ -21,6 +21,7 @@ import isValidArbitraryValue from '../util/isValidArbitraryValue' import { generateRules } from './generateRules' import { hasContentChanged } from './cacheInvalidation.js' import { Offsets } from './offsets.js' +import { flagEnabled } from '../featureFlags.js' let MATCH_VARIANT = Symbol() @@ -410,11 +411,13 @@ function buildPluginApi(tailwindConfig, context, { variantList, variantMap, offs } return utilityModifier - } + }, } + let modifiersEnabled = flagEnabled(tailwindConfig, 'generalizedModifiers') + let ruleSets = [] - .concat(rule(value, extras)) + .concat(modifiersEnabled ? rule(value, extras) : rule(value)) .filter(Boolean) .map((declaration) => ({ [nameClass(identifier, modifier)]: declaration, @@ -488,11 +491,13 @@ function buildPluginApi(tailwindConfig, context, { variantList, variantMap, offs } return utilityModifier - } + }, } + let modifiersEnabled = flagEnabled(tailwindConfig, 'generalizedModifiers') + let ruleSets = [] - .concat(rule(value, extras)) + .concat(modifiersEnabled ? rule(value, extras) : rule(value)) .filter(Boolean) .map((declaration) => ({ [nameClass(identifier, modifier)]: declaration, @@ -558,11 +563,17 @@ function buildPluginApi(tailwindConfig, context, { variantList, variantMap, offs let id = ++variantIdentifier // A unique identifier that "groups" these variables together. let isSpecial = variant === '@' + let modifiersEnabled = flagEnabled(tailwindConfig, 'generalizedModifiers') + for (let [key, value] of Object.entries(options?.values ?? {})) { api.addVariant( isSpecial ? `${variant}${key}` : `${variant}-${key}`, Object.assign( - ({ args, container }) => variantFn(value, { modifier: args.modifier, container }), + ({ args, container }) => + variantFn( + value, + modifiersEnabled ? { modifier: args.modifier, container } : { container } + ), { [MATCH_VARIANT]: true, } @@ -574,7 +585,11 @@ function buildPluginApi(tailwindConfig, context, { variantList, variantMap, offs api.addVariant( variant, Object.assign( - ({ args, container }) => variantFn(args.value, { modifier: args.modifier, container }), + ({ args, container }) => + variantFn( + args.value, + modifiersEnabled ? { modifier: args.modifier, container } : { container } + ), { [MATCH_VARIANT]: true, } diff --git a/src/util/pluginUtils.js b/src/util/pluginUtils.js index 704bfdb82cb3..d5ad3fa3142b 100644 --- a/src/util/pluginUtils.js +++ b/src/util/pluginUtils.js @@ -19,6 +19,7 @@ import { } from './dataTypes' import negateValue from './negateValue' import { backgroundSize } from './validateFormalSyntax' +import { flagEnabled } from '../featureFlags.js' export function updateAllClasses(selectors, updateClass) { let parser = selectorParser((selectors) => { @@ -230,9 +231,12 @@ export function coerceValue(types, modifier, options, tailwindConfig) { * @returns {Iterator<[value: string, type: string, modifier: string | null]>} */ export function* getMatchingTypes(types, rawModifier, options, tailwindConfig) { - let canUseUtilityModifier = options.modifiers != null && ( - options.modifiers === 'any' || typeof options.modifiers === 'object' - ) + let modifiersEnabled = flagEnabled(tailwindConfig, 'generalizedModifiers') + + let canUseUtilityModifier = + modifiersEnabled && + options.modifiers != null && + (options.modifiers === 'any' || typeof options.modifiers === 'object') let [modifier, utilityModifier] = canUseUtilityModifier ? splitUtilityModifier(rawModifier) diff --git a/tests/arbitrary-variants.test.js b/tests/arbitrary-variants.test.js index d259971fe57a..35acf35fa7e1 100644 --- a/tests/arbitrary-variants.test.js +++ b/tests/arbitrary-variants.test.js @@ -107,7 +107,7 @@ test('variants without & or an at-rule are ignored', () => { test('arbitrary variants are sorted after other variants', () => { let config = { - content: [{ raw: html`
` }], + content: [{ raw: html`
` }], corePlugins: { preflight: false }, } @@ -709,6 +709,9 @@ it('should support supports', () => { it('should be possible to use modifiers and arbitrary groups', () => { let config = { + experimental: { + generalizedModifiers: true, + }, content: [ { raw: html` @@ -810,6 +813,9 @@ it('should be possible to use modifiers and arbitrary groups', () => { it('should be possible to use modifiers and arbitrary peers', () => { let config = { + experimental: { + generalizedModifiers: true, + }, content: [ { raw: html` diff --git a/tests/match-utilities.test.js b/tests/match-utilities.test.js index ac3dcedcd402..68a67f870d07 100644 --- a/tests/match-utilities.test.js +++ b/tests/match-utilities.test.js @@ -2,6 +2,10 @@ import { run, html, css } from './util/run' test('match utilities with modifiers', async () => { let config = { + experimental: { + generalizedModifiers: true, + }, + content: [ { raw: html`
`, @@ -62,6 +66,9 @@ test('match utilities with modifiers', async () => { test('match utilities with modifiers in the config', async () => { let config = { + experimental: { + generalizedModifiers: true, + }, content: [ { raw: html`
`, @@ -119,6 +126,9 @@ test('match utilities with modifiers in the config', async () => { test('match utilities can omit utilities by returning null', async () => { let config = { + experimental: { + generalizedModifiers: true, + }, content: [ { raw: html`
`, @@ -130,9 +140,12 @@ test('match utilities can omit utilities by returning null', async () => { ({ matchUtilities, theme }) => { matchUtilities( { - test: (value, { modifier }) => (modifier === 'bad' ? null : { - color: `${value}_${modifier}`, - }), + test: (value, { modifier }) => + modifier === 'bad' + ? null + : { + color: `${value}_${modifier}`, + }, }, { values: {