Skip to content

Commit

Permalink
Add test for self-closing tags before expressions (withastro#756)
Browse files Browse the repository at this point in the history
* add test for self-closing tags before expressions

* fix regression related to self-closing tags

* add additional regression test

* add comment

---------

Co-authored-by: Nate Moore <[email protected]>
  • Loading branch information
space-otter and natemoo-re authored Mar 20, 2023
1 parent 8e20866 commit a8a845f
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/purple-olives-punch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@astrojs/compiler': patch
---

Fix regression related to self-closing tags
8 changes: 8 additions & 0 deletions internal/printer/printer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2750,6 +2750,14 @@ const items = ["Dog", "Cat", "Platipus"];
code: `${$$renderComponent($$result,'Layout',Layout,{})}`,
},
},
{
name: "complex recursive component",
source: `{(<Fragment><Fragment set:html={` + BACKTICK + `<${Node.tag} ${stringifyAttributes(Node.attributes)}>` + BACKTICK + `} />{Node.children.map((child) => (<Astro.self node={child} />))}<Fragment set:html={` + BACKTICK + `</${Node.tag}>` + BACKTICK + `} /></Fragment>)}`,
filename: "/projects/app/src/components/RenderNode.astro",
want: want{
code: `${($$render` + BACKTICK + `${$$renderComponent($$result,'Fragment',Fragment,{},{"default": () => $$render` + BACKTICK + `${$$renderComponent($$result,'Fragment',Fragment,{},{"default": () => $$render` + BACKTICK + `${$$unescapeHTML(` + BACKTICK + `<${Node.tag} ${stringifyAttributes(Node.attributes)}>` + BACKTICK + `)}` + BACKTICK + `,})}${Node.children.map((child) => ($$render` + BACKTICK + `${$$renderComponent($$result,'Astro.self',Astro.self,{"node":(child)})}` + BACKTICK + `))}${$$renderComponent($$result,'Fragment',Fragment,{},{"default": () => $$render` + BACKTICK + `${$$unescapeHTML(` + BACKTICK + `</${Node.tag}>` + BACKTICK + `)}` + BACKTICK + `,})}` + BACKTICK + `,})})` + BACKTICK + `}`,
},
},
}

for _, tt := range tests {
Expand Down
6 changes: 5 additions & 1 deletion internal/token.go
Original file line number Diff line number Diff line change
Expand Up @@ -1624,7 +1624,11 @@ func (z *Tokenizer) trackExpressionElementStack() {
}
}
} else if z.tt == SelfClosingTagToken {
z.openBraceIsExpressionStart = false
stack := z.expressionElementStack[i]
if len(stack) == 0 {
// Only switch out of this mode if we're not in an active stack
z.openBraceIsExpressionStart = false
}
}
}

Expand Down
7 changes: 7 additions & 0 deletions internal/token_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -726,6 +726,13 @@ func TestExpressions(t *testing.T) {
}}`,
[]TokenType{StartExpressionToken, TextToken, TextToken, TextToken, StartTagToken, StartExpressionToken, TextToken, EndExpressionToken, EndTagToken, TextToken, TextToken, EndExpressionToken},
},
{
"nested one level with self-closing tag before expression",
`{() => {
return <div><div />{value}</div>
}}`,
[]TokenType{StartExpressionToken, TextToken, TextToken, TextToken, StartTagToken, SelfClosingTagToken, StartExpressionToken, TextToken, EndExpressionToken, EndTagToken, TextToken, TextToken, EndExpressionToken},
},
{
"nested two levels",
`{() => {
Expand Down

0 comments on commit a8a845f

Please sign in to comment.