From 9360bfef856f853012e5eb0336da8e5775e1ad44 Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Thu, 28 Dec 2023 22:06:59 +0000 Subject: [PATCH 1/8] add tests --- .../compiler/test/tsx/comment-whitespace.ts | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 packages/compiler/test/tsx/comment-whitespace.ts diff --git a/packages/compiler/test/tsx/comment-whitespace.ts b/packages/compiler/test/tsx/comment-whitespace.ts new file mode 100644 index 000000000..78cb3a0a4 --- /dev/null +++ b/packages/compiler/test/tsx/comment-whitespace.ts @@ -0,0 +1,47 @@ +import { convertToTSX } from '@astrojs/compiler'; +import { test } from 'uvu'; +import * as assert from 'uvu/assert'; + +test('preverve whitespace around jsx comments', async () => { + const input = `{/* @ts-expect-error */} + + +{ +// @ts-expect-error +} + + +{ +/* @ts-expect-error */ + +} + +{ +// @ts-expect-error + +}`; + const output = ` +{/* @ts-expect-error */} + + +{ +// @ts-expect-error +} + + +{ +/* @ts-expect-error */ + +} + +{ +// @ts-expect-error + +} + +export default function __AstroComponent_(_props: Record): any {}\n`; + const { code } = await convertToTSX(input, { sourcemap: 'external' }); + assert.snapshot(code, output, `expected code to match snapshot`); +}); + +test.run(); From f1ddadba29329796cdc942c191093b6626c9e3dd Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Thu, 28 Dec 2023 22:10:44 +0000 Subject: [PATCH 2/8] do print expressions with comments only --- internal/printer/print-to-tsx.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/internal/printer/print-to-tsx.go b/internal/printer/print-to-tsx.go index 0a45a0577..1ea42e436 100644 --- a/internal/printer/print-to-tsx.go +++ b/internal/printer/print-to-tsx.go @@ -230,9 +230,6 @@ declare const Astro: Readonly Date: Thu, 28 Dec 2023 22:10:58 +0000 Subject: [PATCH 3/8] don't remove whitespace in expressions --- internal/parser.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/internal/parser.go b/internal/parser.go index 70b00fdff..ff9d783fa 100644 --- a/internal/parser.go +++ b/internal/parser.go @@ -342,11 +342,6 @@ func (p *parser) addText(text string) { return } - // Inside of expressions we can skip whitespace - if p.top().Expression && strings.TrimSpace(text) == "" { - return - } - t := p.top() if n := t.LastChild; n != nil && n.Type == TextNode { n.Data += text From be80b82b4b3ea80d04d23859df069cde6da84735 Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Thu, 28 Dec 2023 22:11:12 +0000 Subject: [PATCH 4/8] fix whitespace in tests --- internal/printer/printer_test.go | 9 +++++---- packages/compiler/test/basic/expression-then-node.ts | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/internal/printer/printer_test.go b/internal/printer/printer_test.go index 732a4be4a..6dbb6a74e 100644 --- a/internal/printer/printer_test.go +++ b/internal/printer/printer_test.go @@ -821,7 +821,8 @@ const groups = [[0, 1, 2], [3, 4, 5]]; items.map(item => { return %s
  • ${item}
  • %s; }) - }%s})} + }%s + })} `, "$$render"+BACKTICK, "$$render"+BACKTICK, BACKTICK, BACKTICK), }, }, @@ -871,7 +872,7 @@ const groups = [[0, 1, 2], [3, 4, 5]]; name: "nested expressions IV", source: `
    {() => { if (value > 0.25) { return Default } else if (value > 0.5) { return Another } else if (value > 0.75) { return Other } return Yet Other }}
    `, want: want{ - code: "${$$maybeRenderHead($$result)}
    ${() => { if (value > 0.25) { return $$render`Default`} else if (value > 0.5) { return $$render`Another`} else if (value > 0.75) { return $$render`Other`} return $$render`Yet Other`}}
    ", + code: "${$$maybeRenderHead($$result)}
    ${() => { if (value > 0.25) { return $$render`Default` } else if (value > 0.5) { return $$render`Another` } else if (value > 0.75) { return $$render`Other` } return $$render`Yet Other` }}
    ", }, }, { @@ -921,10 +922,10 @@ const items = ['red', 'yellow', 'blue']; code: `${$$maybeRenderHead($$result)}
    ${items.map((item) => ( // foo < > < } -$$render` + "`" + `color
    ` + "`" + ` + $$render` + "`" + `color` + "`" + ` ))} ${items.map((item) => ( - /* foo < > < } */$$render` + "`" + `color` + "`" + ` + /* foo < > < } */ $$render` + "`" + `color` + "`" + ` ))} `, }, diff --git a/packages/compiler/test/basic/expression-then-node.ts b/packages/compiler/test/basic/expression-then-node.ts index dd29f7d5e..c90e9caf5 100644 --- a/packages/compiler/test/basic/expression-then-node.ts +++ b/packages/compiler/test/basic/expression-then-node.ts @@ -38,7 +38,7 @@ test('expression followed by node', () => { result.code, `yield ' '; -}`, + }`, 'Expected output to properly handle expression!' ); }); From fb5325c7cf4cdfc6de7114a3f26eada2d977bf9c Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Thu, 28 Dec 2023 22:32:08 +0000 Subject: [PATCH 5/8] test to ignore empty expressions with whitespace --- internal/printer/printer_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/internal/printer/printer_test.go b/internal/printer/printer_test.go index 6dbb6a74e..63a6a2641 100644 --- a/internal/printer/printer_test.go +++ b/internal/printer/printer_test.go @@ -2312,6 +2312,13 @@ const items = ["Dog", "Cat", "Platipus"]; code: `${$$maybeRenderHead($$result)}(${(void 0)})`, }, }, + { + name: "Empty expression with whitespace", + source: "({ })", + want: want{ + code: `${$$maybeRenderHead($$result)}(${(void 0) })`, + }, + }, { name: "Empty attribute expression", source: "", @@ -2319,6 +2326,13 @@ const items = ["Dog", "Cat", "Platipus"]; code: `${$$maybeRenderHead($$result)}`, }, }, + { + name: "Empty attribute expression with whitespace", + source: "", + want: want{ + code: `${$$maybeRenderHead($$result)}`, + }, + }, { name: "is:raw", source: "
    <% awesome %>
    ", From 46b96bc82c4fd1314643dd92c6e5c5916839d6b0 Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Thu, 28 Dec 2023 22:32:26 +0000 Subject: [PATCH 6/8] ignore empty expressions with whitespace --- internal/printer/print-to-js.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/internal/printer/print-to-js.go b/internal/printer/print-to-js.go index 8fe72fe91..5bcf082cb 100644 --- a/internal/printer/print-to-js.go +++ b/internal/printer/print-to-js.go @@ -316,7 +316,11 @@ func render1(p *printer, n *Node, opts RenderOptions) { // Tip! Comment this block out to debug expressions if n.Expression { - if n.FirstChild == nil { + clean := "" + if n.FirstChild != nil { + clean = strings.TrimSpace(n.FirstChild.Data) + } + if n.FirstChild == nil || clean == "" { p.print("${(void 0)") } else if expressionOnlyHasComment(n) { // we do not print expressions that only contain comment blocks From fdf90bf1cc7b32594758304c084323dc109d878a Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Thu, 28 Dec 2023 22:41:52 +0000 Subject: [PATCH 7/8] remove test relating to an unaffected code path --- internal/printer/printer_test.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/internal/printer/printer_test.go b/internal/printer/printer_test.go index 63a6a2641..21d11faf7 100644 --- a/internal/printer/printer_test.go +++ b/internal/printer/printer_test.go @@ -2326,13 +2326,6 @@ const items = ["Dog", "Cat", "Platipus"]; code: `${$$maybeRenderHead($$result)}`, }, }, - { - name: "Empty attribute expression with whitespace", - source: "", - want: want{ - code: `${$$maybeRenderHead($$result)}`, - }, - }, { name: "is:raw", source: "
    <% awesome %>
    ", From 5f41338a09b422582cec2765395ca80cdf90c42a Mon Sep 17 00:00:00 2001 From: Moustapha HappyDev Date: Thu, 28 Dec 2023 22:57:53 +0000 Subject: [PATCH 8/8] chore: changeset --- .changeset/poor-cheetahs-talk.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/poor-cheetahs-talk.md diff --git a/.changeset/poor-cheetahs-talk.md b/.changeset/poor-cheetahs-talk.md new file mode 100644 index 000000000..c144128bf --- /dev/null +++ b/.changeset/poor-cheetahs-talk.md @@ -0,0 +1,5 @@ +--- +'@astrojs/compiler': patch +--- + +Preserve whitespace in expressions