Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Only generate variants for non-user layers #6589

Merged
merged 3 commits into from Dec 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- Don't mutate custom color palette when overriding per-plugin colors ([#6546](https://github.com/tailwindlabs/tailwindcss/pull/6546))
- Improve circular dependency detection when using `@apply` ([#6588](https://github.com/tailwindlabs/tailwindcss/pull/6588))
- Only generate variants for non-`user` layers ([#6589](https://github.com/tailwindlabs/tailwindcss/pull/6589))

## [3.0.6] - 2021-12-16

Expand Down
5 changes: 5 additions & 0 deletions src/lib/generateRules.js
Expand Up @@ -112,6 +112,11 @@ function applyVariant(variant, matches, context) {
let result = []

for (let [meta, rule] of matches) {
// Don't generate variants for user css
if (meta.layer === 'user') {
continue
}

let container = postcss.root({ nodes: [rule.clone()] })

for (let [variantSort, variantFunction] of variantFunctionTuples) {
Expand Down
58 changes: 58 additions & 0 deletions tests/apply.test.js
Expand Up @@ -654,3 +654,61 @@ it('rules with vendor prefixes are still separate when optimizing defaults rules
`)
})
})

it('should be possible to apply user css', () => {
let config = {
content: [{ raw: html`<div></div>` }],
plugins: [],
}

let input = css`
@tailwind components;
@tailwind utilities;

.foo {
color: red;
}

.bar {
@apply foo;
}
`

return run(input, config).then((result) => {
return expect(result.css).toMatchFormattedCss(css`
.foo {
color: red;
}

.bar {
color: red;
}
`)
})
})

it('should not be possible to apply user css with variants', () => {
let config = {
content: [{ raw: html`<div></div>` }],
plugins: [],
}

let input = css`
@tailwind components;
@tailwind utilities;

.foo {
color: red;
}

.bar {
@apply hover:foo;
}
`

return run(input, config).catch((err) => {
expect(err.reason).toBe(
'The `hover:foo` class does not exist. If `hover:foo` is a custom class, make sure it is defined within a `@layer` directive.'
)
})
})
24 changes: 24 additions & 0 deletions tests/variants.test.js
Expand Up @@ -421,3 +421,27 @@ test('before and after variants are a bit special, and forced to the end (2)', (
`)
})
})

it('should not generate variants of user css if it is not inside a layer', () => {
let config = {
content: [{ raw: html`<div class="hover:foo"></div>` }],
plugins: [],
}

let input = css`
@tailwind components;
@tailwind utilities;

.foo {
color: red;
}
`

return run(input, config).then((result) => {
return expect(result.css).toMatchFormattedCss(css`
.foo {
color: red;
}
`)
})
})