fix: preserve trailing semicolon on nested at-rule statements#323
Open
kernoeb wants to merge 1 commit into
Open
fix: preserve trailing semicolon on nested at-rule statements#323kernoeb wants to merge 1 commit into
kernoeb wants to merge 1 commit into
Conversation
The compress path in `serializeStylesheet` stripped the trailing `;` of
any container whose `raws.semicolon` was set, on the assumption it was a
redundant declaration-body terminator. For a nested at-rule statement
(e.g. `@layer parent { @layer a, b; }`), that `;` is the statement
terminator and removing it yields invalid CSS — browsers then bail on
subsequent rules in the parent layer.
Gate the strip on the parent's last child being a declaration, leaving
nested at-rule statements untouched.
Fixes danielroe#322
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #322.
serializeStylesheet's compress path stripped the trailing;of any container whoseraws.semicolonwas set, on the assumption it terminated a redundant declaration body. For a nested at-rule statement (e.g.@layer parent { @layer a, b; }) the;is the statement terminator — stripping it yields invalid CSS, and browsers then bail on subsequent rules in the parent at-rule.The fix narrows the strip to cases where the parent's last child is a
decl, leaving nested at-rule statements untouched.Before
After
Verification
serialize.test.tscases:;on nested at-rule sub-layer declaration (the bug pattern);inside an at-rule whose last child is a declaration (e.g.@font-face) — locks in that the new guard doesn't over-restrict;previously stripped from@layer vuetify-core { @layer reset, base; },@layer vuetify-utilities { …; @layer theme-foreground; }, and@layer vuetify-final { @layer transitions, trumps; }. Both outputs round-trip throughpostcss.parsewithout error.Test plan
pnpm --filter beasties exec vitest run— 56/56 pass (2 new)pnpm lintpnpm test:types