svelte-ast-print
Version:
Serialize Svelte AST nodes into stringified syntax. A.k.a parse in reverse.
86 lines • 2.9 kB
JavaScript
/**
* Printer related to Svelte **fragment** AST nodes only.
* @module svelte-ast-print/fragment
*/
import { State } from "./_internal/shared.js";
import { isBlock } from "./_internal/template/block.js";
import { isElementLike } from "./_internal/template/element-like.js";
import { printBlock } from "./template/block.js";
import { printElementLike } from "./template/element-like.js";
import { printHTMLNode } from "./template/html.js";
import { printTag } from "./template/tag.js";
/**
* @since 1.0.0
* @__NO_SIDE_EFFECTS__
*/
export function printFragment(n, opts = {}) {
const st = State.get(n, opts);
/** @type {SV.Fragment["nodes"]} */
let nodes = [];
for (const [idx, ch] of n.nodes.entries()) {
const prev = n.nodes[idx - 1];
const next = n.nodes[idx + 1];
if (ch.type === "Text") {
if (ch.raw === " " && (prev?.type === "ExpressionTag" || next?.type === "ExpressionTag")) {
nodes.push(ch);
continue;
}
if (!(/^(?: {1,}|\t|\n)*$/.test(ch.raw) || /^(?: {2,}|\t|\n)*$/.test(ch.raw))) {
// biome-ignore format: Prettier
// prettier-ignore
ch.raw = ch.raw
.replace(/^[\n\t]+/, "")
.replace(/[\n\t]+$/, "");
nodes.push(ch);
}
continue;
}
nodes.push(ch);
}
for (const [idx, ch] of nodes.entries()) {
const prev = nodes[idx - 1];
if (prev && (isBlock(prev) || prev.type === "Comment" || isElementLike(prev))) {
st.break();
}
// biome-ignore format: Prettier
// prettier-ignore
switch (ch.type) {
case "AwaitBlock":
case "KeyBlock":
case "EachBlock":
case "IfBlock":
case "SnippetBlock":
st.add(printBlock(ch, opts));
break;
case "Component":
case "RegularElement":
case "SlotElement":
case "SvelteBody":
case "SvelteBoundary":
case "SvelteComponent":
case "SvelteDocument":
case "SvelteElement":
case "SvelteFragment":
case "SvelteHead":
case "SvelteOptions":
case "SvelteSelf":
case "SvelteWindow":
case "TitleElement":
st.add(printElementLike(ch, opts));
break;
case "ConstTag":
case "DebugTag":
case "ExpressionTag":
case "HtmlTag":
case "RenderTag":
st.add(printTag(ch, opts));
break;
case "Comment":
case "Text":
st.add(printHTMLNode(ch, opts));
break;
}
}
return st.result;
}
//# sourceMappingURL=fragment.js.map