Skip to content

Commit

Permalink
Fix issue with Tailwind modifying global state (#9294)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
remcohaszing and thecrypticace committed Sep 9, 2022
1 parent db50bbb commit 88e98f5
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion src/util/resolveConfig.js
Expand Up @@ -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]
}
Expand Down
27 changes: 27 additions & 0 deletions tests/resolveConfig.test.js
Expand Up @@ -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' }])
})

0 comments on commit 88e98f5

Please sign in to comment.