UNPKG

svelte-ast-print

Version:

Serialize Svelte AST nodes into stringified syntax. A.k.a parse in reverse.

86 lines 2.9 kB
/** * 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