Skip to content

Commit 626ac2c

Browse files
committed
fix #3818: preserve collapsed jsx whitespace
1 parent 7c2eb2e commit 626ac2c

File tree

4 files changed

+240
-217
lines changed

4 files changed

+240
-217
lines changed

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
* Fix preserving collapsed JSX whitespace ([#3818](https://github.com/evanw/esbuild/issues/3818))
6+
7+
When transformed, certain whitespace inside JSX elements is ignored completely if it collapses to an empty string. However, the whitespace should only be ignored if the JSX is being transformed, not if it's being preserved. This release fixes a bug where esbuild was previously incorrectly ignoring collapsed whitespace with `--jsx=preserve`. Here is an example:
8+
9+
```jsx
10+
// Original code
11+
<Foo>
12+
<Bar />
13+
</Foo>
14+
15+
// Old output (with --jsx=preserve)
16+
<Foo><Bar /></Foo>;
17+
18+
// New output (with --jsx=preserve)
19+
<Foo>
20+
<Bar />
21+
</Foo>;
22+
```
23+
324
## 0.22.0
425

526
**This release deliberately contains backwards-incompatible changes.** To avoid automatically picking up releases like this, you should either be pinning the exact version of `esbuild` in your `package.json` file (recommended) or be using a version range syntax that only accepts patch upgrades such as `^0.21.0` or `~0.21.0`. See npm's documentation about [semver](https://docs.npmjs.com/cli/v6/using-npm/semver/) for more information.

internal/js_lexer/js_lexer.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -794,12 +794,6 @@ func (lexer *Lexer) NextJSXElementChild() {
794794
if needsFixing {
795795
// Slow path
796796
lexer.decodedStringLiteralOrNil = fixWhitespaceAndDecodeJSXEntities(text)
797-
798-
// Skip this token if it turned out to be empty after trimming
799-
if len(lexer.decodedStringLiteralOrNil) == 0 {
800-
lexer.HasNewlineBefore = true
801-
continue
802-
}
803797
} else {
804798
// Fast path
805799
n := len(text)

internal/js_parser/js_parser.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5234,8 +5234,10 @@ func (p *parser) parseJSXElement(loc logger.Loc) js_ast.Expr {
52345234
case js_lexer.TStringLiteral:
52355235
if p.options.jsx.Preserve {
52365236
nullableChildren = append(nullableChildren, js_ast.Expr{Loc: p.lexer.Loc(), Data: &js_ast.EJSXText{Raw: p.lexer.Raw()}})
5237+
} else if str := p.lexer.StringLiteral(); len(str) > 0 {
5238+
nullableChildren = append(nullableChildren, js_ast.Expr{Loc: p.lexer.Loc(), Data: &js_ast.EString{Value: str}})
52375239
} else {
5238-
nullableChildren = append(nullableChildren, js_ast.Expr{Loc: p.lexer.Loc(), Data: &js_ast.EString{Value: p.lexer.StringLiteral()}})
5240+
// Skip this token if it turned out to be empty after trimming
52395241
}
52405242
p.lexer.NextJSXElementChild()
52415243

0 commit comments

Comments
 (0)