Skip to content

Commit

Permalink
Discard invalid variants such as data-checked-[selected=1]:* (#15629)
Browse files Browse the repository at this point in the history
  • Loading branch information
thecrypticace authored Jan 15, 2025
1 parent e62991a commit 528c848
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Ensure namespace reset with escaped `*` (e.g.: `--color-\*: initial;`) ([#15603](https://github.com/tailwindlabs/tailwindcss/pull/15603))
- Resolve values in functional utilities based on `@theme` options ([#15623](https://github.com/tailwindlabs/tailwindcss/pull/15623))
- _Upgrade (experimental)_: Pretty print `--spacing(…)` to prevent ambiguity ([#15596](https://github.com/tailwindlabs/tailwindcss/pull/15596))
- Discard invalid variants such as `data-checked-[selected=1]:*` ([#15629](https://github.com/tailwindlabs/tailwindcss/pull/15629))

## [4.0.0-beta.9] - 2025-01-09

Expand Down
69 changes: 69 additions & 0 deletions packages/tailwindcss/src/candidate.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -836,6 +836,63 @@ it('should not parse invalid arbitrary values', () => {
}
})

it('should not parse invalid arbitrary values in variants', () => {
let utilities = new Utilities()
utilities.static('flex', () => [])

let variants = new Variants()
variants.functional('data', () => {})

for (let candidate of [
'data-foo-[#0088cc]:flex',
'data-foo[#0088cc]:flex',

'data-foo-[color:var(--value)]:flex',
'data-foo[color:var(--value)]:flex',

'data-foo-[#0088cc]/50:flex',
'data-foo[#0088cc]/50:flex',

'data-foo-[#0088cc]/[50%]:flex',
'data-foo[#0088cc]/[50%]:flex',

'data-foo-[#0088cc]:flex!',
'data-foo[#0088cc]:flex!',

'data-foo-[var(--value)]:flex',
'data-foo[var(--value)]:flex',

'data-foo-[var(--value)]:flex!',
'data-foo[var(--value)]:flex!',

'data-foo-(color:--value):flex',
'data-foo(color:--value):flex',

'data-foo-(color:--value)/50:flex',
'data-foo(color:--value)/50:flex',

'data-foo-(color:--value)/(--mod):flex',
'data-foo(color:--value)/(--mod):flex',

'data-foo-(color:--value)/(number:--mod):flex',
'data-foo(color:--value)/(number:--mod):flex',

'data-foo-(--value):flex',
'data-foo(--value):flex',

'data-foo-(--value)/50:flex',
'data-foo(--value)/50:flex',

'data-foo-(--value)/(--mod):flex',
'data-foo(--value)/(--mod):flex',

'data-foo-(--value)/(number:--mod):flex',
'data-foo(--value)/(number:--mod):flex',
]) {
expect(run(candidate, { utilities, variants })).toEqual([])
}
})

it('should parse a utility with an implicit variable as the modifier', () => {
let utilities = new Utilities()
utilities.functional('bg', () => [])
Expand Down Expand Up @@ -966,6 +1023,18 @@ it('should parse a utility with an explicit variable as the modifier that is imp
`)
})

it('should not parse a partial variant', () => {
let utilities = new Utilities()
utilities.static('flex', () => [])

let variants = new Variants()
variants.static('open', () => {})
variants.functional('data', () => {})

expect(run('open-:flex', { utilities, variants })).toMatchInlineSnapshot(`[]`)
expect(run('data-:flex', { utilities, variants })).toMatchInlineSnapshot(`[]`)
})

it('should parse a static variant starting with @', () => {
let utilities = new Utilities()
utilities.static('flex', () => [])
Expand Down
10 changes: 8 additions & 2 deletions packages/tailwindcss/src/candidate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -620,7 +620,10 @@ export function parseVariant(variant: string, designSystem: DesignSystem): Varia
}
}

if (value[0] === '[' && value[value.length - 1] === ']') {
if (value[value.length - 1] === ']') {
// Discard values like `foo-[#bar]`
if (value[0] !== '[') continue

let arbitraryValue = decodeArbitraryValue(value.slice(1, -1))

// Empty arbitrary values are invalid. E.g.: `data-[]:`
Expand All @@ -638,7 +641,10 @@ export function parseVariant(variant: string, designSystem: DesignSystem): Varia
}
}

if (value[0] === '(' && value[value.length - 1] === ')') {
if (value[value.length - 1] === ')') {
// Discard values like `foo-(--bar)`
if (value[0] !== '(') continue

let arbitraryValue = decodeArbitraryValue(value.slice(1, -1))

// Empty arbitrary values are invalid. E.g.: `data-():`
Expand Down

0 comments on commit 528c848

Please sign in to comment.