Fix erroneous template string whitespace formatting in Svelte #332
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.
Overview
We've been using
prettier-plugin-tailwindcss
to great effect in various Svelte projects at work, but after updating tov0.6.x
, we noticed that Svelte components with template string classnames using newlines starting printing with invalid syntax, even when no class re-ordering was necessaryPreviously reported as #303
Cause
I dug into the code, and noticed that inside the Svelte template string formatter, there is this call:
From this call, and from reading some of the tests, it definitely seemed like the intent was to avoid collapsing whitespace in Svelte template literals. Despite this apparent intent, digging further, I found
collapseWhitespace
option ofsortTemplateLiteral
was effectively ignored, because:Was getting turned into:
Before being passed to
sortClasses
. This is not equivalent according to the internal logic ofsortClasses
. From there, there appears to be some sort of re-printing bug inprettier-plugin-svelte
, which I did not dig into furtherFix
Inside
sortTemplateLiteral
, I added extra short-circuits to ensurecollapseWhitespace: false
is preserved. Preserving whitespace in template strings happily avoids whatever re-printing bug(s) exists in the Svelte plugin, and feels fairly "correct" to me because template strings intentionally preserve newlines etc.