Fix issue with Tailwind modifying global state (#9294)

* Fix issue with Tailwind modifying global state

When running Tailwind, it modifies the plugin defaults parameters. As a
result Tailwind using a Tailwind plugin in the same process twice yields
different results.

* Add failing test

* Undo defaults change

* wip

* Fix shared mutation problem

* Update changelog

Co-authored-by: Jordan Pittman <jordan@cryptica.me>
This commit is contained in:
Remco Haszing 2022-09-09 17:45:25 +02:00 committed by GitHub
parent db50bbbc71
commit 88e98f557c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 1 deletions

View File

@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Don't output duplicate utilities ([#9208](https://github.com/tailwindlabs/tailwindcss/pull/9208))
- Fix `fontFamily` config TypeScript types ([#9214](https://github.com/tailwindlabs/tailwindcss/pull/9214))
- Handle variants on complex selector utilities ([#9262](https://github.com/tailwindlabs/tailwindcss/pull/9262))
- Don't mutate shared config objects ([#9294](https://github.com/tailwindlabs/tailwindcss/pull/9294))
## [3.1.8] - 2022-08-05

View File

@ -29,7 +29,7 @@ function mergeWith(target, ...sources) {
if (merged === undefined) {
if (isObject(target[k]) && isObject(source[k])) {
target[k] = mergeWith(target[k], source[k], customizer)
target[k] = mergeWith({}, target[k], source[k], customizer)
} else {
target[k] = source[k]
}

View File

@ -1763,3 +1763,30 @@ test('all helpers can be destructured from the first function argument', () => {
},
})
})
test('does not duplicate extended configs every time resolveConfig is called', () => {
let shared = {
foo: { bar: { baz: [{ color: 'red' }] } },
}
const createConfig = (color) =>
resolveConfig([
{
theme: {
foo: shared.foo,
extend: {
foo: { bar: { baz: { color } } },
},
},
},
])
createConfig('orange')
createConfig('yellow')
createConfig('green')
const result = createConfig('blue')
expect(shared.foo.bar.baz).toMatchObject([{ color: 'red' }])
expect(result.theme.foo.bar.baz).toMatchObject([{ color: 'red' }, { color: 'blue' }])
})