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

Throw when applying.group #4666

Merged
merged 1 commit into from
Sep 1, 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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/lib/expandApplyAtRules.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ import { resolveMatches } from './generateRules'
import bigSign from '../util/bigSign'
import escapeClassName from '../util/escapeClassName'

function prefix(context, selector) {
let prefix = context.tailwindConfig.prefix
return typeof prefix === 'function' ? prefix(selector) : prefix + selector
}

function buildApplyCache(applyCandidates, context) {
for (let candidate of applyCandidates) {
if (context.notClassCache.has(candidate) || context.applyClassCache.has(candidate)) {
Expand Down Expand Up @@ -170,6 +175,11 @@ function processApply(root, context) {

for (let applyCandidate of applyCandidates) {
if (!applyClassCache.has(applyCandidate)) {
if (applyCandidate === prefix(context, 'group')) {
// TODO: Link to specific documentation page with error code.
throw apply.error(`@apply should not be used with the '${applyCandidate}' utility`)
}

throw apply.error(
`The \`${applyCandidate}\` class does not exist. If \`${applyCandidate}\` is a custom class, make sure it is defined within a \`@layer\` directive.`
)
Expand Down
5 changes: 2 additions & 3 deletions src/util/resolveConfig.js
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,6 @@ export default function resolveConfig(configs) {
let allConfigs = [
...extractPluginConfigs(configs),
{
content: [],
prefix: '',
important: false,
separator: ':',
Expand Down Expand Up @@ -302,10 +301,10 @@ function normalizeConfig(config) {
content: (() => {
let { content, purge } = config

if (Array.isArray(content)) return content
if (Array.isArray(content?.content)) return content.content
if (Array.isArray(purge)) return purge
if (Array.isArray(purge?.content)) return purge.content
if (Array.isArray(content)) return content
if (Array.isArray(content?.content)) return content.content

return []
})(),
Expand Down
69 changes: 61 additions & 8 deletions tests/jit/apply.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ function run(input, config = {}) {
})
}

function css(templates) {
return templates.join('')
}

test('@apply', () => {
let config = {
darkMode: 'class',
Expand Down Expand Up @@ -207,19 +211,68 @@ test('@apply error with nested @anyatrulehere', async () => {
}

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

@layer components {
.foo {
@genie {
@apply text-black;
@layer components {
.foo {
@genie {
@apply text-black;
}
}
}
}
`
`

await expect(run(css, config)).rejects.toThrowError(
'@apply is not supported within nested at-rules like @genie'
)
})

test('@apply error when using .group utility', async () => {
let config = {
darkMode: 'class',
content: [{ raw: '<div class="foo"></div>' }],
corePlugins: { preflight: false },
plugins: [],
}

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

@layer components {
.foo {
@apply group;
}
}
`

await expect(run(input, config)).rejects.toThrowError(
`@apply should not be used with the 'group' utility`
)
})

test('@apply error when using a prefixed .group utility', async () => {
let config = {
prefix: 'tw-',
darkMode: 'class',
content: [{ raw: '<div class="foo"></div>' }],
corePlugins: { preflight: false },
plugins: [],
}

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

@layer components {
.foo {
@apply tw-group;
}
}
`

await expect(run(css, config)).rejects.toThrowError(
`@apply should not be used with the 'tw-group' utility`
)
})