diff --git a/cmd/astro-wasm/astro-wasm.go b/cmd/astro-wasm/astro-wasm.go
index 3dfdba83..bcaef443 100644
--- a/cmd/astro-wasm/astro-wasm.go
+++ b/cmd/astro-wasm/astro-wasm.go
@@ -143,21 +143,27 @@ func makeTransformOptions(options js.Value) transform.TransformOptions {
experimentalScriptOrder = true
}
+ experimentalExactParsingThingy := false
+ if jsBool(options.Get("experimentalExactParsingThingy")) {
+ experimentalExactParsingThingy = true
+ }
+
return transform.TransformOptions{
- Filename: filename,
- NormalizedFilename: normalizedFilename,
- InternalURL: internalURL,
- SourceMap: sourcemap,
- AstroGlobalArgs: astroGlobalArgs,
- Compact: compact,
- ResolvePath: resolvePathFn,
- PreprocessStyle: preprocessStyle,
- ResultScopedSlot: scopedSlot,
- ScopedStyleStrategy: scopedStyleStrategy,
- TransitionsAnimationURL: transitionsAnimationURL,
- AnnotateSourceFile: annotateSourceFile,
- RenderScript: renderScript,
- ExperimentalScriptOrder: experimentalScriptOrder,
+ Filename: filename,
+ NormalizedFilename: normalizedFilename,
+ InternalURL: internalURL,
+ SourceMap: sourcemap,
+ AstroGlobalArgs: astroGlobalArgs,
+ Compact: compact,
+ ResolvePath: resolvePathFn,
+ PreprocessStyle: preprocessStyle,
+ ResultScopedSlot: scopedSlot,
+ ScopedStyleStrategy: scopedStyleStrategy,
+ TransitionsAnimationURL: transitionsAnimationURL,
+ AnnotateSourceFile: annotateSourceFile,
+ RenderScript: renderScript,
+ ExperimentalScriptOrder: experimentalScriptOrder,
+ ExperimentalExactParsingThingy: experimentalExactParsingThingy,
}
}
@@ -257,7 +263,7 @@ func Parse() any {
h := handler.NewHandler(source, parseOptions.Filename)
var doc *astro.Node
- doc, err := astro.ParseWithOptions(strings.NewReader(source), astro.ParseOptionWithHandler(h), astro.ParseOptionEnableLiteral(true))
+ doc, err := astro.ParseWithOptions(strings.NewReader(source), astro.ParseOptionWithHandler(h), astro.ParseOptionEnableLiteral(true), astro.ParseOptionExperimentalBetterLiteralThingy(transformOptions.ExperimentalExactParsingThingy))
if err != nil {
h.AppendError(err)
}
@@ -281,7 +287,7 @@ func ConvertToTSX() any {
h := handler.NewHandler(source, transformOptions.Filename)
var doc *astro.Node
- doc, err := astro.ParseWithOptions(strings.NewReader(source), astro.ParseOptionWithHandler(h), astro.ParseOptionEnableLiteral(true))
+ doc, err := astro.ParseWithOptions(strings.NewReader(source), astro.ParseOptionWithHandler(h), astro.ParseOptionEnableLiteral(true), astro.ParseOptionExperimentalBetterLiteralThingy(transformOptions.ExperimentalExactParsingThingy))
if err != nil {
h.AppendError(err)
}
@@ -335,7 +341,7 @@ func Transform() any {
}
}()
- doc, err := astro.ParseWithOptions(strings.NewReader(source), astro.ParseOptionWithHandler(h))
+ doc, err := astro.ParseWithOptions(strings.NewReader(source), astro.ParseOptionWithHandler(h), astro.ParseOptionExperimentalBetterLiteralThingy(transformOptions.ExperimentalExactParsingThingy))
if err != nil {
reject.Invoke(wasm_utils.ErrorToJSError(h, err))
return
diff --git a/internal/doctype.go b/internal/doctype.go
index 934abf91..faba7e0b 100644
--- a/internal/doctype.go
+++ b/internal/doctype.go
@@ -154,3 +154,53 @@ var quirkyIDs = []string{
"-//webtechs//dtd mozilla html 2.0//",
"-//webtechs//dtd mozilla html//",
}
+
+func parseDoctypeExact(s string) (n *Node) {
+ n = &Node{Type: DoctypeNode}
+
+ // Find the name.
+ space := strings.IndexAny(s, whitespace)
+ if space == -1 {
+ space = len(s)
+ }
+ n.Data = s[:space]
+ n.Data = strings.ToLower(n.Data)
+ s = strings.TrimLeft(s[space:], whitespace)
+
+ if len(s) < 6 {
+ // It can't start with "PUBLIC" or "SYSTEM".
+ // Ignore the rest of the string.
+ return n
+ }
+
+ key := strings.ToLower(s[:6])
+ s = s[6:]
+ for key == "public" || key == "system" {
+ s = strings.TrimLeft(s, whitespace)
+ if s == "" {
+ break
+ }
+ quote := s[0]
+ if quote != '"' && quote != '\'' {
+ break
+ }
+ s = s[1:]
+ q := strings.IndexRune(s, rune(quote))
+ var id string
+ if q == -1 {
+ id = s
+ s = ""
+ } else {
+ id = s[:q]
+ s = s[q+1:]
+ }
+ n.Attr = append(n.Attr, Attribute{Key: key, Val: id})
+ if key == "public" {
+ key = "system"
+ } else {
+ key = ""
+ }
+ }
+
+ return n
+}
diff --git a/internal/parser.go b/internal/parser.go
index 42d7eb0d..352aff16 100644
--- a/internal/parser.go
+++ b/internal/parser.go
@@ -393,7 +393,6 @@ func (p *parser) addExpression() {
Loc: p.generateLoc(),
Namespace: p.top().Namespace,
})
-
}
func isFragment(data string) bool {
@@ -725,6 +724,38 @@ func beforeHTMLIM(p *parser) bool {
return false
}
+func initialIMExact(p *parser) bool {
+ switch p.tok.Type {
+ case FrontmatterFenceToken:
+ p.setOriginalIM()
+ p.im = frontmatterIM
+ return false
+ case TextToken:
+ p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace)
+ if len(p.tok.Data) == 0 {
+ // It was all whitespace, so ignore it.
+ return true
+ }
+ case CommentToken:
+ p.doc.AppendChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ Loc: p.generateLoc(),
+ })
+ return true
+ case DoctypeToken:
+ n := parseDoctypeExact(p.tok.Data)
+ p.doc.AppendChild(n)
+ p.im = inLiteralIMExact
+ return true
+ }
+ if p.frontmatterState == FrontmatterInitial {
+ p.addFrontmatter(true)
+ }
+ p.im = inLiteralIMExact
+ return false
+}
+
// Section 12.2.6.4.3.
func beforeHeadIM(p *parser) bool {
switch p.tok.Type {
@@ -1776,6 +1807,14 @@ func textIM(p *parser) bool {
return p.tok.Type == EndTagToken
}
+func parseText(p *parser) {
+ d := p.tok.Data
+ if d == "" {
+ return
+ }
+ p.addText(d)
+}
+
// Section 12.2.6.4.9.
func inTableIM(p *parser) bool {
switch p.tok.Type {
@@ -2805,6 +2844,42 @@ func inExpressionIM(p *parser) bool {
return p.tok.Type == EndTagToken
}
+func inLiteralIMExact(p *parser) bool {
+ switch p.tok.Type {
+ case DoctypeToken:
+ n := parseDoctypeExact(p.tok.Data)
+ p.doc.AppendChild(n)
+ case StartTagToken:
+ p.addElement()
+ if p.hasSelfClosingToken {
+ p.addLoc()
+ p.oe.pop()
+ p.acknowledgeSelfClosingTag()
+ }
+ case StartExpressionToken:
+ p.addExpression()
+ p.setOriginalIM()
+ p.im = inExpressionIMExact
+ case ErrorToken:
+ // ignore the token
+ case TextToken:
+ parseText(p)
+ case CommentToken:
+ p.addChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ Loc: p.generateLoc(),
+ })
+ case EndTagToken:
+ p.addLoc()
+ p.oe.pop()
+ case EndExpressionToken:
+ p.addLoc()
+ p.oe.pop()
+ }
+ return true
+}
+
func ignoreTheRemainingTokens(p *parser) bool {
return true
}
@@ -2817,6 +2892,34 @@ func getExitLiteralFunc(p *parser) func() bool {
}
}
+func inExpressionIMExact(p *parser) bool {
+ switch p.tok.Type {
+ case ErrorToken:
+ p.oe.pop()
+ case TextToken:
+ parseText(p)
+ return true
+ case StartTagToken, EndTagToken:
+ return inLiteralIMExact(p)
+ case EndExpressionToken:
+ p.addLoc()
+ p.oe.pop()
+ p.im = p.originalIM
+ p.originalIM = nil
+ return true
+ case CommentToken:
+ p.addChild(&Node{
+ Type: CommentNode,
+ Data: p.tok.Data,
+ Loc: p.generateLoc(),
+ })
+ return true
+ }
+ p.im = p.originalIM
+ p.originalIM = nil
+ return p.tok.Type == EndTagToken
+}
+
const whitespaceOrNUL = whitespace + "\x00"
// Section 12.2.6.5
@@ -3052,6 +3155,14 @@ func ParseOptionEnableLiteral(enable bool) ParseOption {
}
}
+func ParseOptionExperimentalBetterLiteralThingy(enable bool) ParseOption {
+ return func(p *parser) {
+ if enable {
+ p.im = initialIMExact
+ }
+ }
+}
+
// ParseWithOptions is like Parse, with options.
func ParseWithOptions(r io.Reader, opts ...ParseOption) (*Node, error) {
p := &parser{
diff --git a/internal/printer/__printer_js__/Preserve_namespaces_in_expressions_-_with_exact_parsing.snap b/internal/printer/__printer_js__/Preserve_namespaces_in_expressions_-_with_exact_parsing.snap
new file mode 100755
index 00000000..3205c24f
--- /dev/null
+++ b/internal/printer/__printer_js__/Preserve_namespaces_in_expressions_-_with_exact_parsing.snap
@@ -0,0 +1,41 @@
+
+[TestPrinter/Preserve_namespaces_in_expressions_-_with_exact_parsing - 1]
+## Input
+
+```
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`${$$maybeRenderHead($$result)}`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/React_framework_example_-_with_exact_parsing.snap b/internal/printer/__printer_js__/React_framework_example_-_with_exact_parsing.snap
new file mode 100755
index 00000000..39fe3881
--- /dev/null
+++ b/internal/printer/__printer_js__/React_framework_example_-_with_exact_parsing.snap
@@ -0,0 +1,116 @@
+
+[TestPrinter/React_framework_example_-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+// Component Imports
+import Counter from '../components/Counter.jsx'
+const someProps = {
+ count: 0,
+}
+
+// Full Astro Component Syntax:
+// https://docs.astro.build/core-concepts/astro-components/
+/-/-/-/
+
+
+
+
+
+
+
+
+
+
+ Hello React!
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import Counter from '../components/Counter.jsx'
+
+
+import * as $$module1 from '../components/Counter.jsx';
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [{ module: $$module1, specifier: '../components/Counter.jsx', assert: {} }], hydratedComponents: [Counter], clientOnlyComponents: [], hydrationDirectives: new Set(['visible']), hoisted: [] });
+
+const $$Astro = $$createAstro('https://astro.build');
+const Astro = $$Astro;
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+const Astro = $$result.createAstro($$Astro, $$props, $$slots);
+Astro.self = $$Component;
+
+// Component Imports
+
+const someProps = {
+ count: 0,
+}
+
+// Full Astro Component Syntax:
+// https://docs.astro.build/core-concepts/astro-components/
+
+return $$render`
+
+
+
+
+
+ ${$$renderHead($$result)}
+
+
+ ${$$renderComponent($$result,'Counter',Counter,{...(someProps),"client:visible":true,"client:component-hydration":"visible","client:component-path":("../components/Counter.jsx"),"client:component-export":("default"),"class":"astro-hmnnhvcq"},{"default": () => $$render`
+ Hello React!
+ `,})}
+
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/Self-closing_components_in_head_can_have_siblings.snap b/internal/printer/__printer_js__/Self-closing_components_in_head_can_have_siblings.snap
index e11dfd4e..1624a479 100755
--- a/internal/printer/__printer_js__/Self-closing_components_in_head_can_have_siblings.snap
+++ b/internal/printer/__printer_js__/Self-closing_components_in_head_can_have_siblings.snap
@@ -3,7 +3,7 @@
## Input
```
-
+
```
## Output
diff --git a/internal/printer/__printer_js__/Self-closing_script_in_head_works.snap b/internal/printer/__printer_js__/Self-closing_script_in_head_works.snap
index ec156d5e..bb6a9de3 100755
--- a/internal/printer/__printer_js__/Self-closing_script_in_head_works.snap
+++ b/internal/printer/__printer_js__/Self-closing_script_in_head_works.snap
@@ -3,7 +3,7 @@
## Input
```
-
+
```
## Output
diff --git a/internal/printer/__printer_js__/anchor_tag_in_template,_containing_an_expression,_isn_t_duplicated___971_.snap b/internal/printer/__printer_js__/anchor_tag_in_template,_containing_an_expression,_isn_t_duplicated___971_.snap
new file mode 100755
index 00000000..15532de8
--- /dev/null
+++ b/internal/printer/__printer_js__/anchor_tag_in_template,_containing_an_expression,_isn_t_duplicated___971_.snap
@@ -0,0 +1,47 @@
+
+[TestPrinter/anchor_tag_in_template,_containing_an_expression,_isn't_duplicated_(#971) - 1]
+## Input
+
+```
+
+ {text}.
+
+This should not be a link
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+ ${$$maybeRenderHead($$result)}${text}.
+
+This should not be a link
`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/client_only_component__default__-_with_exact_parsing.snap b/internal/printer/__printer_js__/client_only_component__default__-_with_exact_parsing.snap
new file mode 100755
index 00000000..0db0091f
--- /dev/null
+++ b/internal/printer/__printer_js__/client_only_component__default__-_with_exact_parsing.snap
@@ -0,0 +1,59 @@
+
+[TestPrinter/client:only_component_(default)_-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+import Component from '../components';
+/-/-/-/
+
+
+ Hello world
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import Component from '../components';
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: ['../components'], hydrationDirectives: new Set(['only']), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+
+ Hello world
+ ${$$renderHead($$result)}
+
+ ${$$renderComponent($$result,'Component',null,{"client:only":true,"client:component-hydration":"only","client:component-path":($$metadata.resolvePath("../components")),"client:component-export":"default"})}
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/client_only_component__multiple__-_with_exact_parsing.snap b/internal/printer/__printer_js__/client_only_component__multiple__-_with_exact_parsing.snap
new file mode 100755
index 00000000..2fc23069
--- /dev/null
+++ b/internal/printer/__printer_js__/client_only_component__multiple__-_with_exact_parsing.snap
@@ -0,0 +1,63 @@
+
+[TestPrinter/client:only_component_(multiple)_-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+import Component from '../components';
+/-/-/-/
+
+
+ Hello world
+
+
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import Component from '../components';
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: ['../components'], hydrationDirectives: new Set(['only']), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+
+ Hello world
+ ${$$renderHead($$result)}
+
+ ${$$renderComponent($$result,'Component',null,{"test":"a","client:only":true,"client:component-hydration":"only","client:component-path":($$metadata.resolvePath("../components")),"client:component-export":"default"})}
+ ${$$renderComponent($$result,'Component',null,{"test":"b","client:only":true,"client:component-hydration":"only","client:component-path":($$metadata.resolvePath("../components")),"client:component-export":"default"})}
+ ${$$renderComponent($$result,'Component',null,{"test":"c","client:only":true,"client:component-hydration":"only","client:component-path":($$metadata.resolvePath("../components")),"client:component-export":"default"})}
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/client_only_component__named__-_with_exact_parsing.snap b/internal/printer/__printer_js__/client_only_component__named__-_with_exact_parsing.snap
new file mode 100755
index 00000000..693ad786
--- /dev/null
+++ b/internal/printer/__printer_js__/client_only_component__named__-_with_exact_parsing.snap
@@ -0,0 +1,59 @@
+
+[TestPrinter/client:only_component_(named)_-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+import { Component } from '../components';
+/-/-/-/
+
+
+ Hello world
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import { Component } from '../components';
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: ['../components'], hydrationDirectives: new Set(['only']), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+
+ Hello world
+ ${$$renderHead($$result)}
+
+ ${$$renderComponent($$result,'Component',null,{"client:only":true,"client:component-hydration":"only","client:component-path":($$metadata.resolvePath("../components")),"client:component-export":"Component"})}
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/client_only_component__namespace__-_with_exact_parsing.snap b/internal/printer/__printer_js__/client_only_component__namespace__-_with_exact_parsing.snap
new file mode 100755
index 00000000..c1079b88
--- /dev/null
+++ b/internal/printer/__printer_js__/client_only_component__namespace__-_with_exact_parsing.snap
@@ -0,0 +1,59 @@
+
+[TestPrinter/client:only_component_(namespace)_-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+import * as components from '../components';
+/-/-/-/
+
+
+ Hello world
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import * as components from '../components';
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: ['../components'], hydrationDirectives: new Set(['only']), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+
+ Hello world
+ ${$$renderHead($$result)}
+
+ ${$$renderComponent($$result,'components.A',null,{"client:only":true,"client:component-hydration":"only","client:component-path":($$metadata.resolvePath("../components")),"client:component-export":"A"})}
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/client_only_component__namespaced_default__-_with_exact_parsing.snap b/internal/printer/__printer_js__/client_only_component__namespaced_default__-_with_exact_parsing.snap
new file mode 100755
index 00000000..bb101a5f
--- /dev/null
+++ b/internal/printer/__printer_js__/client_only_component__namespaced_default__-_with_exact_parsing.snap
@@ -0,0 +1,59 @@
+
+[TestPrinter/client:only_component_(namespaced_default)_-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+import defaultImport from '../components/ui-1';
+/-/-/-/
+
+
+ Hello world
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import defaultImport from '../components/ui-1';
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: ['../components/ui-1'], hydrationDirectives: new Set(['only']), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+
+ Hello world
+ ${$$renderHead($$result)}
+
+ ${$$renderComponent($$result,'defaultImport.Counter1',null,{"client:only":true,"client:component-hydration":"only","client:component-path":($$metadata.resolvePath("../components/ui-1")),"client:component-export":"default.Counter1"})}
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/client_only_component__namespaced_named__-_with_exact_parsing.snap b/internal/printer/__printer_js__/client_only_component__namespaced_named__-_with_exact_parsing.snap
new file mode 100755
index 00000000..d1cf91a1
--- /dev/null
+++ b/internal/printer/__printer_js__/client_only_component__namespaced_named__-_with_exact_parsing.snap
@@ -0,0 +1,59 @@
+
+[TestPrinter/client:only_component_(namespaced_named)_-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+import { namedImport } from '../components/ui-2';
+/-/-/-/
+
+
+ Hello world
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import { namedImport } from '../components/ui-2';
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: ['../components/ui-2'], hydrationDirectives: new Set(['only']), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+
+ Hello world
+ ${$$renderHead($$result)}
+
+ ${$$renderComponent($$result,'namedImport.Counter2',null,{"client:only":true,"client:component-hydration":"only","client:component-path":($$metadata.resolvePath("../components/ui-2")),"client:component-export":"namedImport.Counter2"})}
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/code_tag_not_duplicated_II___983_.snap b/internal/printer/__printer_js__/code_tag_not_duplicated_II___983_.snap
new file mode 100755
index 00000000..3b92995c
--- /dev/null
+++ b/internal/printer/__printer_js__/code_tag_not_duplicated_II___983_.snap
@@ -0,0 +1,91 @@
+
+[TestPrinter/code_tag_not_duplicated_II_(#983) - 1]
+## Input
+
+```
+
+
+
+
+
+
+
+
+
+ A |
+ B |
+
+
+
+
+ Code element with HTML entities |
+ <bar> |
+
+
+ Code element below with curly braces |
+ {``} |
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+
+
+
+ ${$$renderHead($$result)}
+
+
+
+
+ A |
+ B |
+
+
+
+
+ Code element with HTML entities |
+ <bar> |
+
+
+ Code element below with curly braces |
+ ${``} |
+
+
+
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/code_tag_not_duplicated_I___983_.snap b/internal/printer/__printer_js__/code_tag_not_duplicated_I___983_.snap
new file mode 100755
index 00000000..f19b6be5
--- /dev/null
+++ b/internal/printer/__printer_js__/code_tag_not_duplicated_I___983_.snap
@@ -0,0 +1,61 @@
+
+[TestPrinter/code_tag_not_duplicated_I_(#983) - 1]
+## Input
+
+```
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+ ${$$maybeRenderHead($$result)}
+
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/component_-_with_exact_parsing.snap b/internal/printer/__printer_js__/component_-_with_exact_parsing.snap
new file mode 100755
index 00000000..77fa56a7
--- /dev/null
+++ b/internal/printer/__printer_js__/component_-_with_exact_parsing.snap
@@ -0,0 +1,61 @@
+
+[TestPrinter/component_-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+import VueComponent from '../components/Vue.vue';
+/-/-/-/
+
+
+ Hello world
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import VueComponent from '../components/Vue.vue';
+
+import * as $$module1 from '../components/Vue.vue';
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [{ module: $$module1, specifier: '../components/Vue.vue', assert: {} }], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+
+ Hello world
+ ${$$renderHead($$result)}
+
+ ${$$renderComponent($$result,'VueComponent',VueComponent,{})}
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/dot_component__-_with_exact_parsing.snap b/internal/printer/__printer_js__/dot_component__-_with_exact_parsing.snap
new file mode 100755
index 00000000..265872db
--- /dev/null
+++ b/internal/printer/__printer_js__/dot_component__-_with_exact_parsing.snap
@@ -0,0 +1,61 @@
+
+[TestPrinter/dot_component__-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+import * as ns from '../components';
+/-/-/-/
+
+
+ Hello world
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import * as ns from '../components';
+
+import * as $$module1 from '../components';
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [{ module: $$module1, specifier: '../components', assert: {} }], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+
+ Hello world
+ ${$$renderHead($$result)}
+
+ ${$$renderComponent($$result,'ns.Component',ns.Component,{})}
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/expression_in_title___1049_.snap b/internal/printer/__printer_js__/expression_in_title___1049_.snap
new file mode 100755
index 00000000..295b0893
--- /dev/null
+++ b/internal/printer/__printer_js__/expression_in_title___1049_.snap
@@ -0,0 +1,65 @@
+
+[TestPrinter/expression_in_title_(#1049) - 1]
+## Input
+
+```
+
+
+
+
+
+
+ {title ? `${title} - ` : ""}Placeholder
+ {title} - Placeholder
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+
+
+
+
+
+ ${title ? `${title} - ` : ""}Placeholder
+ ${title} - Placeholder
+${$$renderHead($$result)}
+
+ ${$$renderSlot($$result,$$slots["default"])}
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/expression_returning_multiple_elements_-_with_verbatim_parsing.snap b/internal/printer/__printer_js__/expression_returning_multiple_elements_-_with_verbatim_parsing.snap
new file mode 100755
index 00000000..452905f2
--- /dev/null
+++ b/internal/printer/__printer_js__/expression_returning_multiple_elements_-_with_verbatim_parsing.snap
@@ -0,0 +1,89 @@
+
+[TestPrinter/expression_returning_multiple_elements_-_with_verbatim_parsing - 1]
+## Input
+
+```
+
+
+ Welcome to Astro
+ {
+ Object.entries(DUMMY_DATA).map(([dummyKey, dummyValue]) => {
+ return (
+
+ onlyp {dummyKey}
+
+
+ onlyh2 {dummyKey}
+
+
+
div+h2 {dummyKey}
+
+
+
p+h2 {dummyKey}
+
+ );
+ })
+ }
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Astro = $$createAstro('https://astro.build');
+const Astro = $$Astro;
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+const Astro = $$result.createAstro($$Astro, $$props, $$slots);
+Astro.self = $$Component;
+
+return $$render`${$$renderComponent($$result,'Layout',Layout,{"title":"Welcome to Astro."},{"default": () => $$render`
+ ${$$maybeRenderHead($$result)}
+ Welcome to Astro
+ ${
+ Object.entries(DUMMY_DATA).map(([dummyKey, dummyValue]) => {
+ return (
+ $$render`
+ onlyp ${dummyKey}
+
+
+ onlyh2 ${dummyKey}
+
+
+
div+h2 ${dummyKey}
+
+
+
p+h2 ${dummyKey}
+ `
+ );
+ })
+ }
+
+`,})}`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/head_expression_-_with_exact_parsing.snap b/internal/printer/__printer_js__/head_expression_-_with_exact_parsing.snap
new file mode 100755
index 00000000..d12289e2
--- /dev/null
+++ b/internal/printer/__printer_js__/head_expression_-_with_exact_parsing.snap
@@ -0,0 +1,60 @@
+
+[TestPrinter/head_expression_-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+const name = "world";
+/-/-/-/
+
+
+ Hello {name}
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+const name = "world";
+
+return $$render`
+
+ Hello ${name}
+ ${$$renderHead($$result)}
+
+
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/head_expression_and_conditional_rendering_of_fragment_-_with_exact_parsing.snap b/internal/printer/__printer_js__/head_expression_and_conditional_rendering_of_fragment_-_with_exact_parsing.snap
new file mode 100755
index 00000000..b5560bf7
--- /dev/null
+++ b/internal/printer/__printer_js__/head_expression_and_conditional_rendering_of_fragment_-_with_exact_parsing.snap
@@ -0,0 +1,64 @@
+
+[TestPrinter/head_expression_and_conditional_rendering_of_fragment_-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+const testBool = true;
+/-/-/-/
+
+
+
+ {testBool ? "Hey" : "Bye"}
+ {testBool && (<>>)}
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+const testBool = true;
+
+return $$render`
+
+
+ ${testBool ? "Hey" : "Bye"}
+ ${testBool && ($$render`${$$renderComponent($$result,'Fragment',Fragment,{},{"default": () => $$render``,})}`)}
+ ${$$renderHead($$result)}
+
+
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/html5_boilerplate_-_with_exact_parsing.snap b/internal/printer/__printer_js__/html5_boilerplate_-_with_exact_parsing.snap
new file mode 100755
index 00000000..ec614654
--- /dev/null
+++ b/internal/printer/__printer_js__/html5_boilerplate_-_with_exact_parsing.snap
@@ -0,0 +1,99 @@
+
+[TestPrinter/html5_boilerplate_-_with_exact_parsing - 1]
+## Input
+
+```
+
+
+
+
+
+
+
+ A Basic HTML5 Template
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+
+
+
+
+
+
+ A Basic HTML5 Template
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+${$$renderHead($$result)}
+
+
+
+
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/import.meta.env_-_with_exact_parsing.snap b/internal/printer/__printer_js__/import.meta.env_-_with_exact_parsing.snap
new file mode 100755
index 00000000..97f0026f
--- /dev/null
+++ b/internal/printer/__printer_js__/import.meta.env_-_with_exact_parsing.snap
@@ -0,0 +1,131 @@
+
+[TestPrinter/import.meta.env_-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+import Header from '../../components/Header.jsx'
+import Footer from '../../components/Footer.astro'
+import ProductPageContent from '../../components/ProductPageContent.jsx';
+
+export async function getStaticPaths() {
+ let products = await fetch(`${import.meta.env.PUBLIC_NETLIFY_URL}/.netlify/functions/get-product-list`)
+ .then(res => res.json()).then((response) => {
+ console.log('--- built product pages ---')
+ return response.products.edges
+ });
+
+ return products.map((p, i) => {
+ return {
+ params: {pid: p.node.handle},
+ props: {product: p},
+ };
+ });
+}
+
+const { product } = Astro.props;
+/-/-/-/
+
+
+
+
+
+
+ Shoperoni | Buy {product.node.title}
+
+
+
+
+
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import Header from '../../components/Header.jsx'
+
+import Footer from '../../components/Footer.astro'
+
+import ProductPageContent from '../../components/ProductPageContent.jsx';
+
+import * as $$module1 from '../../components/Header.jsx';
+import * as $$module2 from '../../components/Footer.astro';
+import * as $$module3 from '../../components/ProductPageContent.jsx';
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [{ module: $$module1, specifier: '../../components/Header.jsx', assert: {} }, { module: $$module2, specifier: '../../components/Footer.astro', assert: {} }, { module: $$module3, specifier: '../../components/ProductPageContent.jsx', assert: {} }], hydratedComponents: [ProductPageContent], clientOnlyComponents: [], hydrationDirectives: new Set(['visible']), hoisted: [] });
+
+const $$Astro = $$createAstro('https://astro.build');
+const Astro = $$Astro;
+export async function getStaticPaths() {
+ let products = await fetch(`${import.meta.env.PUBLIC_NETLIFY_URL}/.netlify/functions/get-product-list`)
+ .then(res => res.json()).then((response) => {
+ console.log('--- built product pages ---')
+ return response.products.edges
+ });
+
+ return products.map((p, i) => {
+ return {
+ params: {pid: p.node.handle},
+ props: {product: p},
+ };
+ });
+}
+const $$Component = $$createComponent(async ($$result, $$props, $$slots) => {
+const Astro = $$result.createAstro($$Astro, $$props, $$slots);
+Astro.self = $$Component;
+
+const { product } = Astro.props;
+
+return $$render`
+
+
+
+
+ Shoperoni | Buy ${product.node.title}
+
+
+
+${$$renderHead($$result)}
+
+ ${$$renderComponent($$result,'Header',Header,{})}
+
+
+ ${$$renderComponent($$result,'ProductPageContent',ProductPageContent,{"client:visible":true,"product":(product.node),"client:component-hydration":"visible","client:component-path":("../../components/ProductPageContent.jsx"),"client:component-export":("default")})}
+
+
+ ${$$renderComponent($$result,'Footer',Footer,{})}
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/nested_head_content_stays_in_the_head_-_with_exact_parsing.snap b/internal/printer/__printer_js__/nested_head_content_stays_in_the_head_-_with_exact_parsing.snap
new file mode 100755
index 00000000..68c0de15
--- /dev/null
+++ b/internal/printer/__printer_js__/nested_head_content_stays_in_the_head_-_with_exact_parsing.snap
@@ -0,0 +1,73 @@
+
+[TestPrinter/nested_head_content_stays_in_the_head_-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+const meta = { title: 'My App' };
+/-/-/-/
+
+
+
+
+
+ {
+ meta && {meta.title}
+ }
+
+
+
+
+ My App
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+const meta = { title: 'My App' };
+
+return $$render`
+
+
+
+ ${
+ meta && $$render`${meta.title}`
+ }
+
+
+ ${$$renderHead($$result)}
+
+ My App
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/nested_template_literal_expression_-_with_exact_parsing.snap b/internal/printer/__printer_js__/nested_template_literal_expression_-_with_exact_parsing.snap
new file mode 100755
index 00000000..f0f877b1
--- /dev/null
+++ b/internal/printer/__printer_js__/nested_template_literal_expression_-_with_exact_parsing.snap
@@ -0,0 +1,51 @@
+
+[TestPrinter/nested_template_literal_expression_-_with_exact_parsing - 1]
+## Input
+
+```
+
+
+{Object.keys(importedAuthors).map(author => hello
)}
+{Object.keys(importedAuthors).map(author => {author}
)}
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+${$$maybeRenderHead($$result)}
+${Object.keys(importedAuthors).map(author => $$render`hello
`)}
+${Object.keys(importedAuthors).map(author => $$render`${author}
`)}
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/no_space_after_expression_in_title_works___1049_.snap b/internal/printer/__printer_js__/no_space_after_expression_in_title_works___1049_.snap
new file mode 100755
index 00000000..d08b3d80
--- /dev/null
+++ b/internal/printer/__printer_js__/no_space_after_expression_in_title_works___1049_.snap
@@ -0,0 +1,65 @@
+
+[TestPrinter/no_space_after_expression_in_title_works_(#1049) - 1]
+## Input
+
+```
+
+
+
+
+
+
+ {title ? `${title} - ` : ""}Placeholder
+ {title}- Placeholder
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+
+
+
+
+
+ ${title ? `${title} - ` : ""}Placeholder
+ ${title}- Placeholder
+${$$renderHead($$result)}
+
+ ${$$renderSlot($$result,$$slots["default"])}
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/noscript_component_-_with_exact_parsing.snap b/internal/printer/__printer_js__/noscript_component_-_with_exact_parsing.snap
new file mode 100755
index 00000000..5375b936
--- /dev/null
+++ b/internal/printer/__printer_js__/noscript_component_-_with_exact_parsing.snap
@@ -0,0 +1,55 @@
+
+[TestPrinter/noscript_component_-_with_exact_parsing - 1]
+## Input
+
+```
+
+
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`
+ ${$$renderHead($$result)}
+
+
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/select_with_2_options_containing_element.snap b/internal/printer/__printer_js__/select_with_2_options_containing_element.snap
new file mode 100755
index 00000000..25bf2885
--- /dev/null
+++ b/internal/printer/__printer_js__/select_with_2_options_containing_element.snap
@@ -0,0 +1,41 @@
+
+[TestPrinter/select_with_2_options_containing_element - 1]
+## Input
+
+```
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`${$$maybeRenderHead($$result)}`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/select_with_2_options_containing_element_with_div_sibling.snap b/internal/printer/__printer_js__/select_with_2_options_containing_element_with_div_sibling.snap
new file mode 100755
index 00000000..6e404e4b
--- /dev/null
+++ b/internal/printer/__printer_js__/select_with_2_options_containing_element_with_div_sibling.snap
@@ -0,0 +1,41 @@
+
+[TestPrinter/select_with_2_options_containing_element_with_div_sibling - 1]
+## Input
+
+```
+Orange
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`${$$maybeRenderHead($$result)}Orange
`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/select_with_option_containing_element.snap b/internal/printer/__printer_js__/select_with_option_containing_element.snap
new file mode 100755
index 00000000..50d4fa23
--- /dev/null
+++ b/internal/printer/__printer_js__/select_with_option_containing_element.snap
@@ -0,0 +1,41 @@
+
+[TestPrinter/select_with_option_containing_element - 1]
+## Input
+
+```
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`${$$maybeRenderHead($$result)}`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/select_with_option_containing_element_and_button_containing_selected_content.snap b/internal/printer/__printer_js__/select_with_option_containing_element_and_button_containing_selected_content.snap
new file mode 100755
index 00000000..eb1d207e
--- /dev/null
+++ b/internal/printer/__printer_js__/select_with_option_containing_element_and_button_containing_selected_content.snap
@@ -0,0 +1,41 @@
+
+[TestPrinter/select_with_option_containing_element_and_button_containing_selected_content - 1]
+## Input
+
+```
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`${$$maybeRenderHead($$result)}`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/select_with_option_containing_element_with_div_sibling.snap b/internal/printer/__printer_js__/select_with_option_containing_element_with_div_sibling.snap
new file mode 100755
index 00000000..f8b51d8b
--- /dev/null
+++ b/internal/printer/__printer_js__/select_with_option_containing_element_with_div_sibling.snap
@@ -0,0 +1,41 @@
+
+[TestPrinter/select_with_option_containing_element_with_div_sibling - 1]
+## Input
+
+```
+Orange
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`${$$maybeRenderHead($$result)}Orange
`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/slot_with_fallback.snap b/internal/printer/__printer_js__/slot_with_fallback.snap
index 45e425c8..dcbf747a 100755
--- a/internal/printer/__printer_js__/slot_with_fallback.snap
+++ b/internal/printer/__printer_js__/slot_with_fallback.snap
@@ -3,7 +3,7 @@
## Input
```
-Hello world!
+Hello world!
```
## Output
diff --git a/internal/printer/__printer_js__/table_component_wrapped_in_element_containing_expression_II___958_.snap b/internal/printer/__printer_js__/table_component_wrapped_in_element_containing_expression_II___958_.snap
new file mode 100755
index 00000000..617a2774
--- /dev/null
+++ b/internal/printer/__printer_js__/table_component_wrapped_in_element_containing_expression_II___958_.snap
@@ -0,0 +1,79 @@
+
+[TestPrinter/table_component_wrapped_in_element_containing_expression_II_(#958) - 1]
+## Input
+
+```
+/-/-/-/
+import Layout from '../layouts/Layout.astro';
+const linkURL = '0000';
+/-/-/-/
+
+
+
+
+
+ test
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import Layout from '../layouts/Layout.astro';
+
+import * as $$module1 from '../layouts/Layout.astro';
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [{ module: $$module1, specifier: '../layouts/Layout.astro', assert: {} }], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Astro = $$createAstro('https://astro.build');
+const Astro = $$Astro;
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+const Astro = $$result.createAstro($$Astro, $$props, $$slots);
+Astro.self = $$Component;
+
+const linkURL = '0000';
+
+return $$render`${$$renderComponent($$result,'Layout',Layout,{"title":"Welcome to Astro."},{"default": () => $$render`
+ ${$$maybeRenderHead($$result)}
+
+
+ test
+
+
+`,})}`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/table_component_wrapped_in_element_containing_expression_I___1015_.snap b/internal/printer/__printer_js__/table_component_wrapped_in_element_containing_expression_I___1015_.snap
new file mode 100755
index 00000000..a893e02d
--- /dev/null
+++ b/internal/printer/__printer_js__/table_component_wrapped_in_element_containing_expression_I___1015_.snap
@@ -0,0 +1,88 @@
+
+[TestPrinter/table_component_wrapped_in_element_containing_expression_I_(#1015) - 1]
+## Input
+
+```
+/-/-/-/
+import Table from "./base/table.astro";
+
+const headingContent = "foo";
+const cellContent = "bar";
+/-/-/-/
+
+
+
+
+
+ {headingContent} |
+ Cell 2 |
+ Cell 3 |
+
+
+
+
+ {cellContent} |
+ Data 2 |
+ Data 3 |
+
+
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import Table from "./base/table.astro";
+
+import * as $$module1 from './base/table.astro';
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [{ module: $$module1, specifier: './base/table.astro', assert: {} }], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+const headingContent = "foo";
+const cellContent = "bar";
+
+return $$render`${$$maybeRenderHead($$result)}
+ ${$$renderComponent($$result,'Table',Table,{},{"default": () => $$render`
+
+
+ ${headingContent} |
+ Cell 2 |
+ Cell 3 |
+
+
+
+
+ ${cellContent} |
+ Data 2 |
+ Data 3 |
+
+
+ `,})}
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/table_simple_case_-_with_exact_parsing.snap b/internal/printer/__printer_js__/table_simple_case_-_with_exact_parsing.snap
new file mode 100755
index 00000000..22fab06d
--- /dev/null
+++ b/internal/printer/__printer_js__/table_simple_case_-_with_exact_parsing.snap
@@ -0,0 +1,77 @@
+
+[TestPrinter/table_simple_case_-_with_exact_parsing - 1]
+## Input
+
+```
+/-/-/-/
+const content = "lol";
+/-/-/-/
+
+
+
+
+
+ {content} |
+
+ {
+ (
+
+ 1 |
+
+ )
+ }
+
Hello
+
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+const content = "lol";
+
+return $$render`
+ ${$$maybeRenderHead($$result)}
+
+
+ ${content} |
+
+ ${
+ (
+ $$render`
+ 1 |
+
`
+ )
+ }
+
Hello
+
+`;
+}, undefined, undefined);
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/transition_animate_with_an_expression_-_with_exact_parsing.snap b/internal/printer/__printer_js__/transition_animate_with_an_expression_-_with_exact_parsing.snap
new file mode 100755
index 00000000..10fd6e1f
--- /dev/null
+++ b/internal/printer/__printer_js__/transition_animate_with_an_expression_-_with_exact_parsing.snap
@@ -0,0 +1,42 @@
+
+[TestPrinter/transition:animate_with_an_expression_-_with_exact_parsing - 1]
+## Input
+
+```
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import "transitions.css";
+
+export const $$metadata = $$createMetadata("/projects/app/src/pages/page.astro", { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Page = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`${$$maybeRenderHead($$result)}`;
+}, '/projects/app/src/pages/page.astro', 'self');
+export default $$Page;
+```
+---
diff --git a/internal/printer/__printer_js__/transition_name_with_an_expression_-_with_exact_parsing.snap b/internal/printer/__printer_js__/transition_name_with_an_expression_-_with_exact_parsing.snap
new file mode 100755
index 00000000..f1f5977f
--- /dev/null
+++ b/internal/printer/__printer_js__/transition_name_with_an_expression_-_with_exact_parsing.snap
@@ -0,0 +1,42 @@
+
+[TestPrinter/transition:name_with_an_expression_-_with_exact_parsing - 1]
+## Input
+
+```
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import "transitions.css";
+
+export const $$metadata = $$createMetadata("/projects/app/src/pages/page.astro", { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Page = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`${$$maybeRenderHead($$result)}`;
+}, '/projects/app/src/pages/page.astro', 'self');
+export default $$Page;
+```
+---
diff --git a/internal/printer/__printer_js__/transition_name_with_an_template_literal_-_with_exact_parsing.snap b/internal/printer/__printer_js__/transition_name_with_an_template_literal_-_with_exact_parsing.snap
new file mode 100755
index 00000000..d65a43ea
--- /dev/null
+++ b/internal/printer/__printer_js__/transition_name_with_an_template_literal_-_with_exact_parsing.snap
@@ -0,0 +1,42 @@
+
+[TestPrinter/transition:name_with_an_template_literal_-_with_exact_parsing - 1]
+## Input
+
+```
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import "transitions.css";
+
+export const $$metadata = $$createMetadata("/projects/app/src/pages/page.astro", { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Page = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`${$$maybeRenderHead($$result)}`;
+}, '/projects/app/src/pages/page.astro', 'self');
+export default $$Page;
+```
+---
diff --git a/internal/printer/__printer_js__/transition_persist-props_converted_to_a_data_attribute_-_with_exact_parsing.snap b/internal/printer/__printer_js__/transition_persist-props_converted_to_a_data_attribute_-_with_exact_parsing.snap
new file mode 100755
index 00000000..5e459e52
--- /dev/null
+++ b/internal/printer/__printer_js__/transition_persist-props_converted_to_a_data_attribute_-_with_exact_parsing.snap
@@ -0,0 +1,42 @@
+
+[TestPrinter/transition:persist-props_converted_to_a_data_attribute_-_with_exact_parsing - 1]
+## Input
+
+```
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import "transitions.css";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`${$$renderComponent($$result,'my-island','my-island',{"data-astro-transition-persist-props":"false","data-astro-transition-persist":($$createTransitionScope($$result, "oh2whuuc"))})}`;
+}, undefined, 'self');
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/transition_persist_converted_to_a_data_attribute_-_with_exact_parsing.snap b/internal/printer/__printer_js__/transition_persist_converted_to_a_data_attribute_-_with_exact_parsing.snap
new file mode 100755
index 00000000..dd9275e1
--- /dev/null
+++ b/internal/printer/__printer_js__/transition_persist_converted_to_a_data_attribute_-_with_exact_parsing.snap
@@ -0,0 +1,42 @@
+
+[TestPrinter/transition:persist_converted_to_a_data_attribute_-_with_exact_parsing - 1]
+## Input
+
+```
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import "transitions.css";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`${$$maybeRenderHead($$result)}`;
+}, undefined, 'self');
+export default $$Component;
+```
+---
diff --git a/internal/printer/__printer_js__/transition_persist_uses_transition_name_if_defined_-_with_exact_parsing.snap b/internal/printer/__printer_js__/transition_persist_uses_transition_name_if_defined_-_with_exact_parsing.snap
new file mode 100755
index 00000000..8d44f6eb
--- /dev/null
+++ b/internal/printer/__printer_js__/transition_persist_uses_transition_name_if_defined_-_with_exact_parsing.snap
@@ -0,0 +1,42 @@
+
+[TestPrinter/transition:persist_uses_transition:name_if_defined_-_with_exact_parsing - 1]
+## Input
+
+```
+
+```
+
+## Output
+
+```js
+import {
+ Fragment,
+ render as $$render,
+ createAstro as $$createAstro,
+ createComponent as $$createComponent,
+ renderComponent as $$renderComponent,
+ renderHead as $$renderHead,
+ maybeRenderHead as $$maybeRenderHead,
+ unescapeHTML as $$unescapeHTML,
+ renderSlot as $$renderSlot,
+ mergeSlots as $$mergeSlots,
+ addAttribute as $$addAttribute,
+ spreadAttributes as $$spreadAttributes,
+ defineStyleVars as $$defineStyleVars,
+ defineScriptVars as $$defineScriptVars,
+ renderTransition as $$renderTransition,
+ createTransitionScope as $$createTransitionScope,
+ renderScript as $$renderScript,
+ createMetadata as $$createMetadata
+} from "http://localhost:3000/";
+import "transitions.css";
+
+export const $$metadata = $$createMetadata(import.meta.url, { modules: [], hydratedComponents: [], clientOnlyComponents: [], hydrationDirectives: new Set([]), hoisted: [] });
+
+const $$Component = $$createComponent(($$result, $$props, $$slots) => {
+
+return $$render`${$$maybeRenderHead($$result)}`;
+}, undefined, 'self');
+export default $$Component;
+```
+---
diff --git a/internal/printer/printer_test.go b/internal/printer/printer_test.go
index fedea94a..e8732915 100644
--- a/internal/printer/printer_test.go
+++ b/internal/printer/printer_test.go
@@ -185,7 +185,7 @@ func TestPrinter(t *testing.T) {
},
{
name: "slot with fallback",
- source: `Hello world!
`,
+ source: `Hello world!
`,
},
{
name: "slot with fallback II",
@@ -368,6 +368,35 @@ import type data from "test"
`,
},
+ {
+ name: "expression returning multiple elements - with verbatim parsing",
+ source: `
+
+ Welcome to Astro
+ {
+ Object.entries(DUMMY_DATA).map(([dummyKey, dummyValue]) => {
+ return (
+
+ onlyp {dummyKey}
+
+
+ onlyh2 {dummyKey}
+
+
+
div+h2 {dummyKey}
+
+
+
p+h2 {dummyKey}
+
+ );
+ })
+ }
+
+`,
+ transformOptions: transform.TransformOptions{
+ ExperimentalExactParsingThingy: true,
+ },
+ },
{
name: "nested template literal expression",
source: `
@@ -377,6 +406,18 @@ import type data from "test"
`,
},
+ {
+ name: "nested template literal expression - with exact parsing",
+ source: `
+
+{Object.keys(importedAuthors).map(author => hello
)}
+{Object.keys(importedAuthors).map(author => {author}
)}
+
+`,
+ transformOptions: transform.TransformOptions{
+ ExperimentalExactParsingThingy: true,
+ },
+ },
{
name: "complex nested template literal expression",
source: "",
@@ -395,6 +436,23 @@ import VueComponent from '../components/Vue.vue';
`,
},
+ {
+ name: "component - with exact parsing",
+ source: `---
+import VueComponent from '../components/Vue.vue';
+---
+
+
+ Hello world
+
+
+
+
+`,
+ transformOptions: transform.TransformOptions{
+ ExperimentalExactParsingThingy: true,
+ },
+ },
{
name: "dot component",
source: `---
@@ -409,6 +467,23 @@ import * as ns from '../components';
`,
},
+ {
+ name: "dot component - with exact parsing",
+ source: `---
+import * as ns from '../components';
+---
+
+
+ Hello world
+
+
+
+
+`,
+ transformOptions: transform.TransformOptions{
+ ExperimentalExactParsingThingy: true,
+ },
+ },
{
name: "component with quoted attributes",
source: ``,
@@ -437,6 +512,21 @@ import * as ns from '../components';
`,
},
+ {
+ name: "noscript component - with exact parsing",
+ source: `
+
+
+
+
+
+`,
+ transformOptions: transform.TransformOptions{
+ ExperimentalExactParsingThingy: true,
+ },
+ },
{
name: "noscript styles",
source: ``,
@@ -463,6 +553,23 @@ import Component from '../components';