Skip to content

Commit bf2be84

Browse files
committed
Feature flag generalized modifiers
We’re putting a flag for modifiers in front of matchVariant and matchUtilities
1 parent 895b672 commit bf2be84

5 files changed

+52
-13
lines changed

src/featureFlags.js

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ let featureFlags = {
1414
],
1515
experimental: [
1616
'optimizeUniversalDefaults',
17+
'generalizedModifiers',
1718
// 'variantGrouping',
1819
],
1920
}

src/lib/setupContextUtils.js

+21-6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import isValidArbitraryValue from '../util/isValidArbitraryValue'
2121
import { generateRules } from './generateRules'
2222
import { hasContentChanged } from './cacheInvalidation.js'
2323
import { Offsets } from './offsets.js'
24+
import { flagEnabled } from '../featureFlags.js'
2425

2526
let MATCH_VARIANT = Symbol()
2627

@@ -410,11 +411,13 @@ function buildPluginApi(tailwindConfig, context, { variantList, variantMap, offs
410411
}
411412

412413
return utilityModifier
413-
}
414+
},
414415
}
415416

417+
let modifiersEnabled = flagEnabled(tailwindConfig, 'generalizedModifiers')
418+
416419
let ruleSets = []
417-
.concat(rule(value, extras))
420+
.concat(modifiersEnabled ? rule(value, extras) : rule(value))
418421
.filter(Boolean)
419422
.map((declaration) => ({
420423
[nameClass(identifier, modifier)]: declaration,
@@ -488,11 +491,13 @@ function buildPluginApi(tailwindConfig, context, { variantList, variantMap, offs
488491
}
489492

490493
return utilityModifier
491-
}
494+
},
492495
}
493496

497+
let modifiersEnabled = flagEnabled(tailwindConfig, 'generalizedModifiers')
498+
494499
let ruleSets = []
495-
.concat(rule(value, extras))
500+
.concat(modifiersEnabled ? rule(value, extras) : rule(value))
496501
.filter(Boolean)
497502
.map((declaration) => ({
498503
[nameClass(identifier, modifier)]: declaration,
@@ -558,11 +563,17 @@ function buildPluginApi(tailwindConfig, context, { variantList, variantMap, offs
558563
let id = ++variantIdentifier // A unique identifier that "groups" these variables together.
559564
let isSpecial = variant === '@'
560565

566+
let modifiersEnabled = flagEnabled(tailwindConfig, 'generalizedModifiers')
567+
561568
for (let [key, value] of Object.entries(options?.values ?? {})) {
562569
api.addVariant(
563570
isSpecial ? `${variant}${key}` : `${variant}-${key}`,
564571
Object.assign(
565-
({ args, container }) => variantFn(value, { modifier: args.modifier, container }),
572+
({ args, container }) =>
573+
variantFn(
574+
value,
575+
modifiersEnabled ? { modifier: args.modifier, container } : { container }
576+
),
566577
{
567578
[MATCH_VARIANT]: true,
568579
}
@@ -574,7 +585,11 @@ function buildPluginApi(tailwindConfig, context, { variantList, variantMap, offs
574585
api.addVariant(
575586
variant,
576587
Object.assign(
577-
({ args, container }) => variantFn(args.value, { modifier: args.modifier, container }),
588+
({ args, container }) =>
589+
variantFn(
590+
args.value,
591+
modifiersEnabled ? { modifier: args.modifier, container } : { container }
592+
),
578593
{
579594
[MATCH_VARIANT]: true,
580595
}

src/util/pluginUtils.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
} from './dataTypes'
2020
import negateValue from './negateValue'
2121
import { backgroundSize } from './validateFormalSyntax'
22+
import { flagEnabled } from '../featureFlags.js'
2223

2324
export function updateAllClasses(selectors, updateClass) {
2425
let parser = selectorParser((selectors) => {
@@ -230,9 +231,12 @@ export function coerceValue(types, modifier, options, tailwindConfig) {
230231
* @returns {Iterator<[value: string, type: string, modifier: string | null]>}
231232
*/
232233
export function* getMatchingTypes(types, rawModifier, options, tailwindConfig) {
233-
let canUseUtilityModifier = options.modifiers != null && (
234-
options.modifiers === 'any' || typeof options.modifiers === 'object'
235-
)
234+
let modifiersEnabled = flagEnabled(tailwindConfig, 'generalizedModifiers')
235+
236+
let canUseUtilityModifier =
237+
modifiersEnabled &&
238+
options.modifiers != null &&
239+
(options.modifiers === 'any' || typeof options.modifiers === 'object')
236240

237241
let [modifier, utilityModifier] = canUseUtilityModifier
238242
? splitUtilityModifier(rawModifier)

tests/arbitrary-variants.test.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ test('variants without & or an at-rule are ignored', () => {
107107

108108
test('arbitrary variants are sorted after other variants', () => {
109109
let config = {
110-
content: [{ raw: html`<div class="underline lg:underline [&>*]:underline"></div>` }],
110+
content: [{ raw: html`<div class="[&>*]:underline underline lg:underline"></div>` }],
111111
corePlugins: { preflight: false },
112112
}
113113

@@ -709,6 +709,9 @@ it('should support supports', () => {
709709

710710
it('should be possible to use modifiers and arbitrary groups', () => {
711711
let config = {
712+
experimental: {
713+
generalizedModifiers: true,
714+
},
712715
content: [
713716
{
714717
raw: html`
@@ -810,6 +813,9 @@ it('should be possible to use modifiers and arbitrary groups', () => {
810813

811814
it('should be possible to use modifiers and arbitrary peers', () => {
812815
let config = {
816+
experimental: {
817+
generalizedModifiers: true,
818+
},
813819
content: [
814820
{
815821
raw: html`

tests/match-utilities.test.js

+16-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ import { run, html, css } from './util/run'
22

33
test('match utilities with modifiers', async () => {
44
let config = {
5+
experimental: {
6+
generalizedModifiers: true,
7+
},
8+
59
content: [
610
{
711
raw: html`<div class="test test/foo test-1/foo test-2/foo test/[foo] test-1/[foo]"></div> `,
@@ -62,6 +66,9 @@ test('match utilities with modifiers', async () => {
6266

6367
test('match utilities with modifiers in the config', async () => {
6468
let config = {
69+
experimental: {
70+
generalizedModifiers: true,
71+
},
6572
content: [
6673
{
6774
raw: html`<div class="test test/foo test-1/foo test/[bar] test-1/[bar]"></div> `,
@@ -119,6 +126,9 @@ test('match utilities with modifiers in the config', async () => {
119126

120127
test('match utilities can omit utilities by returning null', async () => {
121128
let config = {
129+
experimental: {
130+
generalizedModifiers: true,
131+
},
122132
content: [
123133
{
124134
raw: html`<div class="test test/good test/bad"></div> `,
@@ -130,9 +140,12 @@ test('match utilities can omit utilities by returning null', async () => {
130140
({ matchUtilities, theme }) => {
131141
matchUtilities(
132142
{
133-
test: (value, { modifier }) => (modifier === 'bad' ? null : {
134-
color: `${value}_${modifier}`,
135-
}),
143+
test: (value, { modifier }) =>
144+
modifier === 'bad'
145+
? null
146+
: {
147+
color: `${value}_${modifier}`,
148+
},
136149
},
137150
{
138151
values: {

0 commit comments

Comments
 (0)