Skip to content

Commit

Permalink
Don't output unparsable values (#6469)
Browse files Browse the repository at this point in the history
  • Loading branch information
thecrypticace committed Dec 13, 2021
1 parent 4b2482f commit 399440e
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 1 deletion.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- Warn about invalid globs in `content` ([#6449](https://github.com/tailwindlabs/tailwindcss/pull/6449))

### Fixed

- Don't output unparsable values ([#6469](https://github.com/tailwindlabs/tailwindcss/pull/6469))

## [3.0.2] - 2021-12-13

### Fixed
Expand Down
25 changes: 24 additions & 1 deletion src/lib/generateRules.js
Original file line number Diff line number Diff line change
Expand Up @@ -248,16 +248,39 @@ function parseRules(rule, cache, options = {}) {
return [cache.get(rule), options]
}

const IS_VALID_PROPERTY_NAME = /^[a-z_-]/

function isValidPropName(name) {
return IS_VALID_PROPERTY_NAME.test(name)
}

function isParsableCssValue(property, value) {
try {
postcss.parse(`a{${property}:${value}}`).toResult()
return true
} catch (err) {
return false
}
}

function extractArbitraryProperty(classCandidate, context) {
let [, property, value] = classCandidate.match(/^\[([a-zA-Z0-9-_]+):(\S+)\]$/) ?? []

if (value === undefined) {
return null
}

if (!isValidPropName(property)) {
return null
}

if (!isValidArbitraryValue(value)) {
return null
}

let normalized = normalize(value)

if (!isValidArbitraryValue(normalized)) {
if (!isParsableCssValue(property, normalized)) {
return null
}

Expand Down
42 changes: 42 additions & 0 deletions tests/arbitrary-properties.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -231,3 +231,45 @@ test('invalid class', () => {
expect(result.css).toMatchFormattedCss(css``)
})
})

test('invalid arbitrary property', () => {
let config = {
content: [
{
raw: html`<div class="[autoplay:\${autoplay}]"></div>`,
},
],
corePlugins: { preflight: false },
}

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

return run(input, config).then((result) => {
expect(result.css).toMatchFormattedCss(css``)
})
})

test('invalid arbitrary property 2', () => {
let config = {
content: [
{
raw: html`[0:02]`,
},
],
corePlugins: { preflight: false },
}

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

return run(input, config).then((result) => {
expect(result.css).toMatchFormattedCss(css``)
})
})

0 comments on commit 399440e

Please sign in to comment.