Dedupe duplicate properties (#5830)
* add `collapseDuplicateDeclarations`
This will allow us to remove duplicate declarations. This occurs when
you are using `@apply` for example.
The reason I implemented it as a separate step, is because this doesn't
only happen for `@apply`, but it also happens if you do something like:
```js
addComponents({ '.btn-blue, .btm-red': { padding: '10px' } })
```
So instead of tracking down every place this is happening, it now
happens at the very end.
* use new plugin in processTailwindFeatures
* add/update tests by removing duplicate declarations
* update changelog
This commit is contained in:
parent
0c2f1a6472
commit
ea6f14a499
7 changed files with 58 additions and 8 deletions
28
src/lib/collapseDuplicateDeclarations.js
Normal file
28
src/lib/collapseDuplicateDeclarations.js
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
export default function collapseDuplicateDeclarations() {
|
||||
return (root) => {
|
||||
root.walkRules((node) => {
|
||||
let seen = new Map()
|
||||
let droppable = new Set([])
|
||||
|
||||
node.walkDecls((decl) => {
|
||||
// This could happen if we have nested selectors. In that case the
|
||||
// parent will loop over all its declarations but also the declarations
|
||||
// of nested rules. With this we ensure that we are shallowly checking
|
||||
// declarations.
|
||||
if (decl.parent !== node) {
|
||||
return
|
||||
}
|
||||
|
||||
if (seen.has(decl.prop)) {
|
||||
droppable.add(seen.get(decl.prop))
|
||||
}
|
||||
|
||||
seen.set(decl.prop, decl)
|
||||
})
|
||||
|
||||
for (let decl of droppable) {
|
||||
decl.remove()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -5,6 +5,7 @@ import evaluateTailwindFunctions from './lib/evaluateTailwindFunctions'
|
|||
import substituteScreenAtRules from './lib/substituteScreenAtRules'
|
||||
import resolveDefaultsAtRules from './lib/resolveDefaultsAtRules'
|
||||
import collapseAdjacentRules from './lib/collapseAdjacentRules'
|
||||
import collapseDuplicateDeclarations from './lib/collapseDuplicateDeclarations'
|
||||
import detectNesting from './lib/detectNesting'
|
||||
import { createContext } from './lib/setupContextUtils'
|
||||
import { issueFlagNotices } from './featureFlags'
|
||||
|
|
@ -42,5 +43,6 @@ export default function processTailwindFeatures(setupContext) {
|
|||
substituteScreenAtRules(context)(root, result)
|
||||
resolveDefaultsAtRules(context)(root, result)
|
||||
collapseAdjacentRules(context)(root, result)
|
||||
collapseDuplicateDeclarations(context)(root, result)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue