@collie-lang/compiler 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/codegen.ts","../src/html-codegen.ts","../src/diagnostics.ts","../src/parser.ts","../src/index.ts"],"sourcesContent":["import type {\n Attribute,\n ClassAliasesDecl,\n ComponentNode,\n ConditionalBranch,\n ConditionalNode,\n ElementNode,\n ForNode,\n JSXPassthroughNode,\n Node,\n PropsDecl,\n RootNode,\n SlotBlock,\n TextNode\n} from \"./ast\";\n\nexport interface CodegenOptions {\n componentName: string;\n jsxRuntime: \"automatic\" | \"classic\";\n flavor: \"jsx\" | \"tsx\";\n}\n\nexport function generateModule(root: RootNode, options: CodegenOptions): string {\n const { componentName, jsxRuntime, flavor } = options;\n const isTsx = flavor === \"tsx\";\n\n const aliasEnv = buildClassAliasEnvironment(root.classAliases);\n const jsx = renderRootChildren(root.children, aliasEnv);\n const propsDestructure = emitPropsDestructure(root.props);\n\n const parts: string[] = [];\n\n if (root.clientComponent) {\n parts.push(`\"use client\";`);\n }\n\n // Classic runtime needs React in scope for JSX transforms.\n if (jsxRuntime === \"classic\" && templateUsesJsx(root)) {\n parts.push(`import React from \"react\";`);\n }\n\n // JS-safe typedef for Props (JSDoc)\n parts.push(emitPropsType(root.props, flavor));\n\n if (!isTsx) {\n // JS-safe param typing (JSDoc), so tooling can still understand Props.\n parts.push(`/** @param {Props} props */`);\n }\n\n // IMPORTANT: Do not emit TypeScript annotations here.\n const functionLines = [\n isTsx\n ? `export default function ${componentName}(props: Props) {`\n : `export default function ${componentName}(props) {`\n ];\n if (propsDestructure) {\n functionLines.push(` ${propsDestructure}`);\n }\n functionLines.push(` return ${jsx};`, `}`);\n parts.push(functionLines.join(\"\\n\"));\n\n return parts.join(\"\\n\\n\");\n}\n\nfunction buildClassAliasEnvironment(\n decl?: ClassAliasesDecl\n): Map<string, readonly string[]> {\n const env = new Map<string, readonly string[]>();\n if (!decl) {\n return env;\n }\n for (const alias of decl.aliases) {\n env.set(alias.name, alias.classes);\n }\n return env;\n}\n\nfunction renderRootChildren(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>\n): string {\n return emitNodesExpression(children, aliasEnv);\n}\n\nfunction templateUsesJsx(root: RootNode): boolean {\n if (root.children.length === 0) {\n return false;\n }\n if (root.children.length > 1) {\n return true;\n }\n return nodeUsesJsx(root.children[0]);\n}\n\nfunction nodeUsesJsx(node: Node): boolean {\n if (node.type === \"Element\" || node.type === \"Text\" || node.type === \"Component\") {\n return true;\n }\n if (node.type === \"Expression\" || node.type === \"JSXPassthrough\") {\n return false;\n }\n if (node.type === \"Conditional\") {\n return node.branches.some((branch) => branchUsesJsx(branch));\n }\n if (node.type === \"For\") {\n return node.body.some((child) => nodeUsesJsx(child));\n }\n return false;\n}\n\nfunction branchUsesJsx(branch: ConditionalBranch): boolean {\n if (!branch.body.length) {\n return false;\n }\n return branch.body.some((child) => nodeUsesJsx(child));\n}\n\nfunction emitNodeInJsx(node: Node, aliasEnv: Map<string, readonly string[]>): string {\n if (node.type === \"Text\") {\n return emitText(node);\n }\n if (node.type === \"Expression\") {\n return `{${node.value}}`;\n }\n if (node.type === \"JSXPassthrough\") {\n return `{${node.expression}}`;\n }\n if (node.type === \"Conditional\") {\n return `{${emitConditionalExpression(node, aliasEnv)}}`;\n }\n if (node.type === \"For\") {\n return `{${emitForExpression(node, aliasEnv)}}`;\n }\n if (node.type === \"Component\") {\n return wrapWithGuard(emitComponent(node, aliasEnv), node.guard, \"jsx\");\n }\n return wrapWithGuard(emitElement(node, aliasEnv), node.guard, \"jsx\");\n}\n\nfunction emitElement(\n node: ElementNode,\n aliasEnv: Map<string, readonly string[]>\n): string {\n const expanded = expandClasses(node.classes, aliasEnv);\n const classAttr = expanded.length ? ` className=\"${expanded.join(\" \")}\"` : \"\";\n const attrs = emitAttributes(node.attributes, aliasEnv);\n const allAttrs = classAttr + attrs;\n const children = emitChildrenWithSpacing(node.children, aliasEnv);\n \n if (children.length > 0) {\n return `<${node.name}${allAttrs}>${children}</${node.name}>`;\n } else {\n return `<${node.name}${allAttrs} />`;\n }\n}\n\nfunction emitComponent(\n node: ComponentNode,\n aliasEnv: Map<string, readonly string[]>\n): string {\n const attrs = emitAttributes(node.attributes, aliasEnv);\n const slotProps = emitSlotProps(node, aliasEnv);\n const allAttrs = `${attrs}${slotProps}`;\n const children = emitChildrenWithSpacing(node.children, aliasEnv);\n \n if (children.length > 0) {\n return `<${node.name}${allAttrs}>${children}</${node.name}>`;\n } else {\n return `<${node.name}${allAttrs} />`;\n }\n}\n\nfunction emitChildrenWithSpacing(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>\n): string {\n if (children.length === 0) {\n return \"\";\n }\n \n const parts: string[] = [];\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const emitted = emitNodeInJsx(child, aliasEnv);\n parts.push(emitted);\n \n // Add space between text and following element/component\n // but NOT between element/component and element/component\n if (i < children.length - 1) {\n const nextChild = children[i + 1];\n const needsSpace = \n child.type === \"Text\" &&\n (nextChild.type === \"Element\" || nextChild.type === \"Component\" || nextChild.type === \"Expression\" || nextChild.type === \"JSXPassthrough\");\n \n if (needsSpace) {\n parts.push(\" \");\n }\n }\n }\n \n return parts.join(\"\");\n}\n\nfunction emitAttributes(\n attributes: Attribute[],\n aliasEnv: Map<string, readonly string[]>\n): string {\n if (attributes.length === 0) {\n return \"\";\n }\n \n return attributes.map(attr => {\n if (attr.value === null) {\n return ` ${attr.name}`;\n }\n // The value is already in the correct format (e.g., {expr} or \"string\")\n return ` ${attr.name}=${attr.value}`;\n }).join(\"\");\n}\n\nfunction emitSlotProps(\n node: ComponentNode,\n aliasEnv: Map<string, readonly string[]>\n): string {\n if (!node.slots || node.slots.length === 0) {\n return \"\";\n }\n return node.slots\n .map((slot) => {\n const expr = emitNodesExpression(slot.children, aliasEnv);\n return ` ${slot.name}={${expr}}`;\n })\n .join(\"\");\n}\n\nfunction wrapWithGuard(rendered: string, guard: string | undefined, context: \"jsx\" | \"expression\"): string {\n if (!guard) {\n return rendered;\n }\n const expression = `(${guard}) && ${rendered}`;\n return context === \"jsx\" ? `{${expression}}` : expression;\n}\n\nfunction emitForExpression(\n node: ForNode,\n aliasEnv: Map<string, readonly string[]>\n): string {\n const body = emitNodesExpression(node.body, aliasEnv);\n return `${node.arrayExpr}.map((${node.itemName}) => ${body})`;\n}\n\nfunction expandClasses(\n classes: readonly string[],\n aliasEnv: Map<string, readonly string[]>\n): string[] {\n // Alias expansion is a pure compile-time macro. The parser guarantees diagnostics for\n // undefined aliases, so codegen simply replaces $alias tokens with their literal class list.\n const result: string[] = [];\n for (const cls of classes) {\n const match = cls.match(/^\\$([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) {\n result.push(cls);\n continue;\n }\n const aliasClasses = aliasEnv.get(match[1]);\n if (!aliasClasses) {\n continue;\n }\n result.push(...aliasClasses);\n }\n return result;\n}\n\nfunction emitText(node: TextNode): string {\n if (!node.parts.length) {\n return \"\";\n }\n\n return node.parts\n .map((part) => {\n if (part.type === \"text\") {\n return escapeText(part.value);\n }\n return `{${part.value}}`;\n })\n .join(\"\");\n}\n\nfunction emitConditionalExpression(\n node: ConditionalNode,\n aliasEnv: Map<string, readonly string[]>\n): string {\n if (!node.branches.length) {\n return \"null\";\n }\n const first = node.branches[0];\n if (node.branches.length === 1 && first.test) {\n return `(${first.test}) && ${emitBranchExpression(first, aliasEnv)}`;\n }\n const hasElse = node.branches[node.branches.length - 1].test === undefined;\n let fallback = hasElse\n ? emitBranchExpression(node.branches[node.branches.length - 1], aliasEnv)\n : \"null\";\n const startIndex = hasElse ? node.branches.length - 2 : node.branches.length - 1;\n if (startIndex < 0) {\n return fallback;\n }\n for (let i = startIndex; i >= 0; i--) {\n const branch = node.branches[i];\n const test = branch.test ?? \"false\";\n fallback = `(${test}) ? ${emitBranchExpression(branch, aliasEnv)} : ${fallback}`;\n }\n return fallback;\n}\n\nfunction emitBranchExpression(\n branch: ConditionalBranch,\n aliasEnv: Map<string, readonly string[]>\n): string {\n return emitNodesExpression(branch.body, aliasEnv);\n}\n\nfunction emitNodesExpression(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>\n): string {\n if (children.length === 0) {\n return \"null\";\n }\n if (children.length === 1) {\n return emitSingleNodeExpression(children[0], aliasEnv);\n }\n return `<>${children.map((child) => emitNodeInJsx(child, aliasEnv)).join(\"\")}</>`;\n}\n\nfunction emitSingleNodeExpression(\n node: Node,\n aliasEnv: Map<string, readonly string[]>\n): string {\n if (node.type === \"Expression\") {\n return node.value;\n }\n if (node.type === \"JSXPassthrough\") {\n return node.expression;\n }\n if (node.type === \"Conditional\") {\n return emitConditionalExpression(node, aliasEnv);\n }\n if (node.type === \"For\") {\n return emitForExpression(node, aliasEnv);\n }\n if (node.type === \"Element\") {\n return wrapWithGuard(emitElement(node, aliasEnv), node.guard, \"expression\");\n }\n if (node.type === \"Component\") {\n return wrapWithGuard(emitComponent(node, aliasEnv), node.guard, \"expression\");\n }\n if (node.type === \"Text\") {\n return `<>${emitNodeInJsx(node, aliasEnv)}</>`;\n }\n return emitNodeInJsx(node, aliasEnv);\n}\n\nfunction emitPropsType(props: PropsDecl | undefined, flavor: \"jsx\" | \"tsx\"): string {\n if (flavor === \"tsx\") {\n return emitTsPropsType(props);\n }\n return emitJsDocPropsType(props);\n}\n\nfunction emitJsDocPropsType(props?: PropsDecl): string {\n // Emit JS-safe JSDoc typedef (Rollup can parse this, and TS tooling can read it).\n if (!props) {\n return \"/** @typedef {any} Props */\";\n }\n if (!props.fields.length) {\n return \"/** @typedef {{}} Props */\";\n }\n\n // Build an object type like: { foo: string; bar?: number }\n const fields = props.fields\n .map((field) => {\n const optional = field.optional ? \"?\" : \"\";\n return `${field.name}${optional}: ${field.typeText}`;\n })\n .join(\"; \");\n\n return `/** @typedef {{ ${fields} }} Props */`;\n}\n\nfunction emitTsPropsType(props?: PropsDecl): string {\n if (!props || props.fields.length === 0) {\n return \"export type Props = Record<string, never>;\";\n }\n\n const lines = props.fields.map((field) => {\n const optional = field.optional ? \"?\" : \"\";\n return ` ${field.name}${optional}: ${field.typeText};`;\n });\n\n return [\"export interface Props {\", ...lines, \"}\"].join(\"\\n\");\n}\n\nfunction emitPropsDestructure(props?: PropsDecl): string | null {\n if (!props || props.fields.length === 0) {\n return null;\n }\n const names = props.fields.map((field) => field.name);\n return `const { ${names.join(\", \")} } = props;`;\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/[&<>{}]/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case \"{\":\n return \"&#123;\";\n case \"}\":\n return \"&#125;\";\n default:\n return char;\n }\n });\n}\n","import type {\n Attribute,\n ClassAliasesDecl,\n ComponentNode,\n ConditionalBranch,\n ConditionalNode,\n ElementNode,\n ForNode,\n Node,\n PropsDecl,\n RootNode,\n SlotBlock,\n TextNode\n} from \"./ast\";\n\nexport interface HtmlCodegenOptions {\n componentName: string;\n}\n\nexport function generateHtmlModule(root: RootNode, options: HtmlCodegenOptions): string {\n const aliasEnv = buildClassAliasEnvironment(root.classAliases);\n const htmlExpression = emitNodesString(root.children, aliasEnv);\n const propsType = emitJsDocPropsType(root.props);\n const propsDestructure = emitPropsDestructure(root.props);\n\n const parts: string[] = [];\n\n if (root.clientComponent) {\n parts.push(`\"use client\";`);\n }\n\n parts.push(...createHtmlHelpers());\n parts.push(propsType);\n parts.push(`/** @param {Props} props */`);\n parts.push(`/** @returns {string} */`);\n\n const lines = [`export default function ${options.componentName}(props = {}) {`];\n if (propsDestructure) {\n lines.push(` ${propsDestructure}`);\n }\n lines.push(` const __collie_html = ${htmlExpression};`);\n lines.push(\" return __collie_html;\", \"}\");\n parts.push(lines.join(\"\\n\"));\n\n return parts.join(\"\\n\\n\");\n}\n\nfunction emitNodesString(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>\n): string {\n if (children.length === 0) {\n return '\"\"';\n }\n\n const segments = children.map((child) => emitNodeString(child, aliasEnv)).filter(Boolean);\n return concatSegments(segments);\n}\n\nfunction emitNodeString(node: Node, aliasEnv: Map<string, readonly string[]>): string {\n switch (node.type) {\n case \"Text\":\n return emitTextNode(node);\n case \"Expression\":\n return `__collie_escapeHtml(${node.value})`;\n case \"JSXPassthrough\":\n return `String(${node.expression})`;\n case \"Element\":\n return wrapWithGuard(emitElement(node, aliasEnv), node.guard);\n case \"Component\":\n return wrapWithGuard(emitComponent(node, aliasEnv), node.guard);\n case \"Conditional\":\n return emitConditional(node, aliasEnv);\n case \"For\":\n return emitFor(node, aliasEnv);\n default:\n return '\"\"';\n }\n}\n\nfunction emitElement(node: ElementNode, aliasEnv: Map<string, readonly string[]>): string {\n const classSegments = expandClasses(node.classes, aliasEnv);\n const attributeSegments = emitAttributeSegments(node.attributes, classSegments);\n const start = concatSegments([literal(`<${node.name}`), ...attributeSegments, literal(node.children.length > 0 ? \">\" : \" />\")]);\n\n if (node.children.length === 0) {\n return start;\n }\n\n const children = emitNodesString(node.children, aliasEnv);\n const end = literal(`</${node.name}>`);\n return concatSegments([start, children, end]);\n}\n\nfunction emitComponent(node: ComponentNode, aliasEnv: Map<string, readonly string[]>): string {\n const attributeSegments = emitAttributeSegments(node.attributes, []);\n const hasChildren = node.children.length > 0 || (node.slots?.length ?? 0) > 0;\n const closingToken = hasChildren ? \">\" : \" />\";\n const start = concatSegments([literal(`<${node.name}`), ...attributeSegments, literal(closingToken)]);\n\n if (!hasChildren) {\n return start;\n }\n\n const childSegments: string[] = [];\n if (node.children.length) {\n childSegments.push(emitNodesString(node.children, aliasEnv));\n }\n for (const slot of node.slots ?? []) {\n childSegments.push(emitSlotTemplate(slot, aliasEnv));\n }\n\n const children = concatSegments(childSegments);\n const end = literal(`</${node.name}>`);\n return concatSegments([start, children, end]);\n}\n\nfunction emitSlotTemplate(slot: SlotBlock, aliasEnv: Map<string, readonly string[]>): string {\n const start = literal(`<template slot=\"${slot.name}\">`);\n const body = emitNodesString(slot.children, aliasEnv);\n const end = literal(\"</template>\");\n return concatSegments([start, body, end]);\n}\n\nfunction emitConditional(\n node: ConditionalNode,\n aliasEnv: Map<string, readonly string[]>\n): string {\n if (node.branches.length === 0) {\n return '\"\"';\n }\n const first = node.branches[0];\n if (node.branches.length === 1 && first.test) {\n return `(${first.test}) ? ${emitBranch(first, aliasEnv)} : \"\"`;\n }\n const hasElse = node.branches[node.branches.length - 1].test === undefined;\n let fallback = hasElse ? emitBranch(node.branches[node.branches.length - 1], aliasEnv) : '\"\"';\n const limit = hasElse ? node.branches.length - 2 : node.branches.length - 1;\n for (let i = limit; i >= 0; i--) {\n const branch = node.branches[i];\n const test = branch.test ?? \"false\";\n fallback = `(${test}) ? ${emitBranch(branch, aliasEnv)} : ${fallback}`;\n }\n return fallback;\n}\n\nfunction emitBranch(branch: ConditionalBranch, aliasEnv: Map<string, readonly string[]>): string {\n return emitNodesString(branch.body, aliasEnv);\n}\n\nfunction emitFor(node: ForNode, aliasEnv: Map<string, readonly string[]>): string {\n const body = emitNodesString(node.body, aliasEnv);\n return `(${node.arrayExpr}).map((${node.itemName}) => ${body}).join(\"\")`;\n}\n\nfunction emitTextNode(node: TextNode): string {\n if (!node.parts.length) {\n return '\"\"';\n }\n\n const segments = node.parts.map((part) => {\n if (part.type === \"text\") {\n return literal(escapeStaticText(part.value));\n }\n return `__collie_escapeHtml(${part.value})`;\n });\n return concatSegments(segments);\n}\n\nfunction emitAttributeSegments(attributes: Attribute[], classNames: readonly string[]): string[] {\n const segments: string[] = [];\n if (classNames.length) {\n segments.push(literal(` class=\"${classNames.join(\" \")}\"`));\n }\n for (const attr of attributes) {\n if (attr.value === null) {\n segments.push(literal(` ${attr.name}`));\n continue;\n }\n const expr = attributeExpression(attr.value);\n segments.push(\n [\n \"(() => {\",\n ` const __collie_attr = ${expr};`,\n ` return __collie_attr == null ? \"\" : ${literal(` ${attr.name}=\"`)} + __collie_escapeAttr(__collie_attr) + ${literal(`\"`)};`,\n \"})()\"\n ].join(\" \")\n );\n }\n return segments;\n}\n\nfunction attributeExpression(raw: string): string {\n const trimmed = raw.trim();\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n return trimmed.slice(1, -1).trim();\n }\n return trimmed;\n}\n\nfunction wrapWithGuard(rendered: string, guard?: string): string {\n if (!guard) {\n return rendered;\n }\n return `(${guard}) ? ${rendered} : \"\"`;\n}\n\nfunction literal(text: string): string {\n return JSON.stringify(text);\n}\n\nfunction concatSegments(segments: string[]): string {\n const filtered = segments.filter((segment) => segment && segment !== '\"\"');\n if (!filtered.length) {\n return '\"\"';\n }\n if (filtered.length === 1) {\n return filtered[0];\n }\n return filtered.join(\" + \");\n}\n\nfunction buildClassAliasEnvironment(\n decl?: ClassAliasesDecl\n): Map<string, readonly string[]> {\n const env = new Map<string, readonly string[]>();\n if (!decl) {\n return env;\n }\n for (const alias of decl.aliases) {\n env.set(alias.name, alias.classes);\n }\n return env;\n}\n\nfunction expandClasses(\n classes: readonly string[],\n aliasEnv: Map<string, readonly string[]>\n): string[] {\n const result: string[] = [];\n for (const cls of classes) {\n const match = cls.match(/^\\$([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) {\n result.push(cls);\n continue;\n }\n const aliasClasses = aliasEnv.get(match[1]);\n if (!aliasClasses) {\n continue;\n }\n result.push(...aliasClasses);\n }\n return result;\n}\n\nfunction emitJsDocPropsType(props?: PropsDecl): string {\n if (!props) {\n return \"/** @typedef {any} Props */\";\n }\n if (!props.fields.length) {\n return \"/** @typedef {{}} Props */\";\n }\n const fields = props.fields\n .map((field) => {\n const optional = field.optional ? \"?\" : \"\";\n return `${field.name}${optional}: ${field.typeText}`;\n })\n .join(\"; \");\n return `/** @typedef {{ ${fields} }} Props */`;\n}\n\nfunction emitPropsDestructure(props?: PropsDecl): string | null {\n if (!props || props.fields.length === 0) {\n return null;\n }\n const names = props.fields.map((field) => field.name);\n return `const { ${names.join(\", \")} } = props;`;\n}\n\nfunction escapeStaticText(value: string): string {\n return value.replace(/[&<>{}]/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case \"{\":\n return \"&#123;\";\n case \"}\":\n return \"&#125;\";\n default:\n return char;\n }\n });\n}\n\nfunction createHtmlHelpers(): string[] {\n return [\n \"function __collie_escapeHtml(value) {\",\n \" if (value === null || value === undefined) {\",\n ' return \"\";',\n \" }\",\n \" return String(value).replace(/[&<>]/g, __collie_escapeHtmlChar);\",\n \"}\",\n \"function __collie_escapeHtmlChar(char) {\",\n ' switch (char) {',\n ' case \"&\":',\n ' return \"&amp;\";',\n ' case \"<\":',\n ' return \"&lt;\";',\n ' case \">\":',\n ' return \"&gt;\";',\n \" default:\",\n \" return char;\",\n \" }\",\n \"}\",\n \"function __collie_escapeAttr(value) {\",\n \" if (value === null || value === undefined) {\",\n ' return \"\";',\n \" }\",\n ' return String(value).replace(/[\"&<>]/g, __collie_escapeAttrChar);',\n \"}\",\n \"function __collie_escapeAttrChar(char) {\",\n ' switch (char) {',\n ' case \"&\":',\n ' return \"&amp;\";',\n ' case \"<\":',\n ' return \"&lt;\";',\n ' case \">\":',\n ' return \"&gt;\";',\n ' case \\'\"\\':',\n ' return \"&quot;\";',\n \" default:\",\n \" return char;\",\n \" }\",\n \"}\"\n ];\n}\n","export type DiagnosticSeverity = \"error\" | \"warning\";\n\nexport type DiagnosticCode =\n | \"COLLIE001\"\n | \"COLLIE002\"\n | \"COLLIE003\"\n | \"COLLIE004\"\n | \"COLLIE005\"\n | \"COLLIE101\"\n | \"COLLIE102\"\n | \"COLLIE201\"\n | \"COLLIE202\"\n | \"COLLIE203\"\n | \"COLLIE204\"\n | \"COLLIE205\"\n | \"COLLIE206\"\n | \"COLLIE207\"\n | \"COLLIE208\"\n | \"COLLIE209\"\n | \"COLLIE210\"\n | \"COLLIE301\"\n | \"COLLIE302\"\n | \"COLLIE303\"\n | \"COLLIE304\"\n | \"COLLIE305\"\n | \"COLLIE306\"\n | \"COLLIE307\"\n | \"COLLIE401\"\n | \"COLLIE402\"\n | \"COLLIE501\"\n | \"COLLIE502\"\n | \"COLLIE503\"\n | \"COLLIE601\";\n\nexport interface SourcePos {\n line: number;\n col: number;\n offset: number;\n}\n\nexport interface SourceSpan {\n start: SourcePos;\n end: SourcePos;\n}\n\nexport interface Diagnostic {\n severity: DiagnosticSeverity;\n message: string;\n span?: SourceSpan;\n code?: DiagnosticCode;\n file?: string;\n}\n\nexport function createSpan(line: number, col: number, length: number, lineOffset: number): SourceSpan {\n const startOffset = lineOffset + col - 1;\n return {\n start: { line, col, offset: startOffset },\n end: { line, col: col + length, offset: startOffset + length }\n };\n}\n","import type {\n Attribute,\n ClassAliasDecl,\n ClassAliasesDecl,\n ComponentNode,\n ConditionalBranch,\n ConditionalNode,\n ElementNode,\n ExpressionNode,\n ForNode,\n JSXPassthroughNode,\n Node,\n PropsField,\n RootNode,\n SlotBlock,\n TextNode\n} from \"./ast\";\nimport { type Diagnostic, type DiagnosticCode, type SourceSpan, createSpan } from \"./diagnostics\";\n\nexport interface ParseResult {\n root: RootNode;\n diagnostics: Diagnostic[];\n}\n\ninterface ConditionalBranchContext {\n kind: \"ConditionalBranch\";\n owner: ConditionalNode;\n branch: ConditionalBranch;\n children: Node[];\n}\n\ninterface SlotContext {\n kind: \"Slot\";\n owner: ComponentNode;\n slot: SlotBlock;\n children: Node[];\n}\n\ntype ParentNode = RootNode | ElementNode | ComponentNode | ForNode | ConditionalBranchContext | SlotContext;\n\ninterface StackItem {\n node: ParentNode;\n level: number;\n}\n\ninterface BranchLocation {\n branch: ConditionalBranch;\n line: number;\n column: number;\n lineOffset: number;\n length: number;\n}\n\ninterface ConditionalChainState {\n node: ConditionalNode;\n level: number;\n hasElse: boolean;\n}\n\nconst ELEMENT_NAME = /^[A-Za-z][A-Za-z0-9_-]*/;\nconst CLASS_NAME = /^[A-Za-z0-9_$-]+/;\n\nfunction getIndentLevel(line: string): number {\n const match = line.match(/^\\s*/);\n return match ? match[0].length / 2 : 0;\n}\n\nexport function parse(source: string): ParseResult {\n const diagnostics: Diagnostic[] = [];\n const root: RootNode = { type: \"Root\", children: [] };\n const stack: StackItem[] = [{ node: root, level: -1 }];\n let propsBlockLevel: number | null = null;\n let classesBlockLevel: number | null = null;\n let sawTopLevelTemplateNode = false;\n const conditionalChains = new Map<number, ConditionalChainState>();\n const branchLocations: BranchLocation[] = [];\n\n const normalized = source.replace(/\\r\\n?/g, \"\\n\");\n const lines = normalized.split(\"\\n\");\n\n let offset = 0;\n let i = 0;\n\n while (i < lines.length) {\n const rawLine = lines[i];\n const lineNumber = i + 1;\n const lineOffset = offset;\n offset += rawLine.length + 1;\n i++;\n\n if (/^\\s*$/.test(rawLine)) {\n continue;\n }\n\n const tabIndex = rawLine.indexOf(\"\\t\");\n if (tabIndex !== -1) {\n pushDiag(\n diagnostics,\n \"COLLIE001\",\n \"Tabs are not allowed; use spaces for indentation.\",\n lineNumber,\n tabIndex + 1,\n lineOffset\n );\n continue;\n }\n\n const indentMatch = rawLine.match(/^\\s*/) ?? [\"\"];\n const indent = indentMatch[0].length;\n const lineContent = rawLine.slice(indent);\n const trimmed = lineContent.trimEnd();\n\n if (indent % 2 !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE002\",\n \"Indentation must be multiples of two spaces.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n continue;\n }\n\n let level = indent / 2;\n\n if (propsBlockLevel !== null && level <= propsBlockLevel) {\n propsBlockLevel = null;\n }\n if (classesBlockLevel !== null && level <= classesBlockLevel) {\n classesBlockLevel = null;\n }\n\n const top = stack[stack.length - 1];\n const isInPropsBlock = propsBlockLevel !== null && level > propsBlockLevel;\n const isInClassesBlock = classesBlockLevel !== null && level > classesBlockLevel;\n if (level > top.level + 1 && !isInPropsBlock && !isInClassesBlock) {\n pushDiag(\n diagnostics,\n \"COLLIE003\",\n \"Indentation jumped more than one level.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n level = top.level + 1;\n }\n\n while (stack.length > 1 && stack[stack.length - 1].level >= level) {\n stack.pop();\n }\n\n cleanupConditionalChains(conditionalChains, level);\n const isElseIfLine = /^@elseIf\\b/.test(trimmed);\n const isElseLine = /^@else\\b/.test(trimmed) && !isElseIfLine;\n if (!isElseIfLine && !isElseLine) {\n conditionalChains.delete(level);\n }\n\n if (trimmed === \"classes\") {\n if (level !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE301\",\n \"Classes block must be at the top level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (sawTopLevelTemplateNode) {\n pushDiag(\n diagnostics,\n \"COLLIE302\",\n \"Classes block must appear before any template nodes.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n if (!root.classAliases) {\n root.classAliases = { aliases: [] };\n }\n classesBlockLevel = level;\n }\n continue;\n }\n\n if (trimmed === \"props\") {\n if (level !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE102\",\n \"Props block must be at the top level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (sawTopLevelTemplateNode || root.props) {\n pushDiag(\n diagnostics,\n \"COLLIE101\",\n \"Props block must appear before any template nodes.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n root.props = { fields: [] };\n propsBlockLevel = level;\n }\n continue;\n }\n\n if (trimmed === \"@client\") {\n if (level !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE401\",\n \"@client must appear at the top level before any other blocks.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (sawTopLevelTemplateNode) {\n pushDiag(\n diagnostics,\n \"COLLIE401\",\n \"@client must appear before any template nodes.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (root.clientComponent) {\n pushDiag(\n diagnostics,\n \"COLLIE402\",\n \"@client can only appear once per file.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n root.clientComponent = true;\n }\n continue;\n }\n\n if (propsBlockLevel !== null && level > propsBlockLevel) {\n if (level !== propsBlockLevel + 1) {\n pushDiag(\n diagnostics,\n \"COLLIE102\",\n \"Props lines must be indented two spaces under the props header.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n continue;\n }\n\n const field = parsePropsField(trimmed, lineNumber, indent + 1, lineOffset, diagnostics);\n if (field && root.props) {\n root.props.fields.push(field);\n }\n continue;\n }\n\n if (classesBlockLevel !== null && level > classesBlockLevel) {\n if (level !== classesBlockLevel + 1) {\n pushDiag(\n diagnostics,\n \"COLLIE303\",\n \"Classes lines must be indented two spaces under the classes header.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n continue;\n }\n\n const alias = parseClassAliasLine(trimmed, lineNumber, indent + 1, lineOffset, diagnostics);\n if (alias && root.classAliases) {\n root.classAliases.aliases.push(alias);\n }\n continue;\n }\n\n const parent = stack[stack.length - 1].node;\n\n if (trimmed.startsWith(\"@for\")) {\n const forHeader = parseForHeader(\n lineContent,\n lineNumber,\n indent + 1,\n lineOffset,\n diagnostics\n );\n if (!forHeader) {\n continue;\n }\n const forNode: ForNode = {\n type: \"For\",\n itemName: forHeader.itemName,\n arrayExpr: forHeader.arrayExpr,\n body: []\n };\n addChildToParent(parent, forNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n stack.push({ node: forNode, level });\n continue;\n }\n\n if (trimmed.startsWith(\"@if\")) {\n const header = parseConditionalHeader(\n \"if\",\n lineContent,\n lineNumber,\n indent + 1,\n lineOffset,\n diagnostics\n );\n if (!header) {\n continue;\n }\n const chain: ConditionalNode = { type: \"Conditional\", branches: [] };\n const branch: ConditionalBranch = { test: header.test, body: [] };\n chain.branches.push(branch);\n addChildToParent(parent, chain);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n conditionalChains.set(level, { node: chain, level, hasElse: false });\n branchLocations.push({\n branch,\n line: lineNumber,\n column: indent + 1,\n lineOffset,\n length: header.directiveLength\n });\n if (header.inlineBody) {\n const inlineNode = parseInlineNode(\n header.inlineBody,\n lineNumber,\n header.inlineColumn ?? indent + 1,\n lineOffset,\n diagnostics\n );\n if (inlineNode) {\n branch.body.push(inlineNode);\n }\n } else {\n stack.push({ node: createConditionalBranchContext(chain, branch), level });\n }\n continue;\n }\n\n if (isElseIfLine) {\n const chain = conditionalChains.get(level);\n if (!chain) {\n pushDiag(\n diagnostics,\n \"COLLIE205\",\n \"@elseIf must follow an @if at the same indentation level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n if (chain.hasElse) {\n pushDiag(\n diagnostics,\n \"COLLIE207\",\n \"@elseIf cannot appear after an @else in the same chain.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n const header = parseConditionalHeader(\n \"elseIf\",\n lineContent,\n lineNumber,\n indent + 1,\n lineOffset,\n diagnostics\n );\n if (!header) {\n continue;\n }\n const branch: ConditionalBranch = { test: header.test, body: [] };\n chain.node.branches.push(branch);\n branchLocations.push({\n branch,\n line: lineNumber,\n column: indent + 1,\n lineOffset,\n length: header.directiveLength\n });\n if (header.inlineBody) {\n const inlineNode = parseInlineNode(\n header.inlineBody,\n lineNumber,\n header.inlineColumn ?? indent + 1,\n lineOffset,\n diagnostics\n );\n if (inlineNode) {\n branch.body.push(inlineNode);\n }\n } else {\n stack.push({ node: createConditionalBranchContext(chain.node, branch), level });\n }\n continue;\n }\n\n if (isElseLine) {\n const chain = conditionalChains.get(level);\n if (!chain) {\n pushDiag(\n diagnostics,\n \"COLLIE206\",\n \"@else must follow an @if at the same indentation level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n if (chain.hasElse) {\n pushDiag(\n diagnostics,\n \"COLLIE203\",\n \"An @if chain can only have one @else branch.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n const header = parseElseHeader(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (!header) {\n continue;\n }\n const branch: ConditionalBranch = { test: undefined, body: [] };\n chain.node.branches.push(branch);\n chain.hasElse = true;\n branchLocations.push({\n branch,\n line: lineNumber,\n column: indent + 1,\n lineOffset,\n length: header.directiveLength\n });\n if (header.inlineBody) {\n const inlineNode = parseInlineNode(\n header.inlineBody,\n lineNumber,\n header.inlineColumn ?? indent + 1,\n lineOffset,\n diagnostics\n );\n if (inlineNode) {\n branch.body.push(inlineNode);\n }\n } else {\n stack.push({ node: createConditionalBranchContext(chain.node, branch), level });\n }\n continue;\n }\n\n const slotMatch = trimmed.match(/^@([A-Za-z_][A-Za-z0-9_]*)$/);\n if (slotMatch) {\n const slotName = slotMatch[1];\n if (!isComponentNode(parent)) {\n pushDiag(\n diagnostics,\n \"COLLIE501\",\n `Slot '${slotName}' must be a direct child of a component.`,\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n stack.push({ node: createStandaloneSlotContext(slotName), level });\n continue;\n }\n\n if (!parent.slots) {\n parent.slots = [];\n }\n const existing = parent.slots.find((slot) => slot.name === slotName);\n const slotBlock: SlotBlock =\n existing ??\n {\n type: \"Slot\",\n name: slotName,\n children: []\n };\n if (!existing) {\n parent.slots.push(slotBlock);\n } else {\n pushDiag(\n diagnostics,\n \"COLLIE503\",\n `Duplicate slot '${slotName}' inside ${parent.name}.`,\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n }\n stack.push({ node: createSlotContext(parent, slotBlock), level });\n continue;\n }\n\n if (trimmed.startsWith(\"@\")) {\n pushDiag(\n diagnostics,\n \"COLLIE502\",\n \"Invalid slot syntax. Use @slotName on its own line.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n const fallbackName = trimmed.slice(1).split(/\\s+/)[0] || \"slot\";\n stack.push({ node: createStandaloneSlotContext(fallbackName), level });\n continue;\n }\n\n if (lineContent.startsWith(\"=\")) {\n // Check if this starts a multiline JSX block\n const payload = lineContent.slice(1).trim();\n \n // If it's a function or expression that starts with ( or <, collect multiline content\n if (payload.endsWith(\"(\") || payload.endsWith(\"<\") || (i < lines.length && level < getIndentLevel(lines[i]))) {\n // Collect all indented children\n let jsxContent = payload;\n const jsxStartLine = i;\n while (i < lines.length) {\n const nextRaw = lines[i];\n const nextIndent = getIndentLevel(nextRaw);\n const nextTrimmed = nextRaw.trim();\n \n // Include lines that are:\n // 1. More indented than the = line (children)\n // 2. At the same level but are just closing parens/braces\n if (nextIndent > level && nextTrimmed.length > 0) {\n jsxContent += \"\\n\" + nextRaw;\n i++;\n } else if (nextIndent === level && /^[)\\]}]+$/.test(nextTrimmed)) {\n // Include closing parens/braces at the same level\n jsxContent += \"\\n\" + nextRaw;\n i++;\n // After the closing paren, we're done\n break;\n } else {\n break;\n }\n }\n \n const jsxNode: JSXPassthroughNode = {\n type: \"JSXPassthrough\",\n expression: jsxContent\n };\n addChildToParent(parent, jsxNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n continue;\n }\n \n const jsxNode = parseJSXPassthrough(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (jsxNode) {\n addChildToParent(parent, jsxNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n if (lineContent.startsWith(\"|\")) {\n const textNode = parseTextLine(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (textNode) {\n addChildToParent(parent, textNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n if (lineContent.startsWith(\"{{\")) {\n const exprNode = parseExpressionLine(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (exprNode) {\n addChildToParent(parent, exprNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n // Check if this line starts an element/component with potential multiline attributes\n let fullLine = trimmed;\n let multilineEnd = i;\n \n if (trimmed.includes(\"(\") && !trimmed.includes(\")\")) {\n // Multiline attributes - collect subsequent lines\n let parenDepth = (trimmed.match(/\\(/g) || []).length - (trimmed.match(/\\)/g) || []).length;\n while (multilineEnd < lines.length && parenDepth > 0) {\n const nextRaw = lines[multilineEnd];\n multilineEnd++;\n fullLine += \"\\n\" + nextRaw;\n parenDepth += (nextRaw.match(/\\(/g) || []).length - (nextRaw.match(/\\)/g) || []).length;\n }\n // Update i to skip the lines we consumed\n i = multilineEnd;\n }\n\n const element = parseElement(fullLine, lineNumber, indent + 1, lineOffset, diagnostics);\n if (!element) {\n // Try parsing as text if element parsing failed\n const textNode = parseTextPayload(trimmed, lineNumber, indent + 1, lineOffset, diagnostics);\n if (textNode && textNode.parts.length > 0) {\n addChildToParent(parent, textNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n addChildToParent(parent, element);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n stack.push({ node: element, level });\n }\n\n if (root.classAliases) {\n validateClassAliasDefinitions(root.classAliases, diagnostics);\n }\n validateClassAliasUsages(root, diagnostics);\n\n for (const info of branchLocations) {\n if (info.branch.body.length === 0) {\n pushDiag(\n diagnostics,\n \"COLLIE208\",\n \"Conditional branches must include an inline body or indented block.\",\n info.line,\n info.column,\n info.lineOffset,\n info.length || 3\n );\n }\n }\n\n return { root, diagnostics };\n}\n\nfunction cleanupConditionalChains(state: Map<number, ConditionalChainState>, level: number): void {\n for (const key of Array.from(state.keys())) {\n if (key > level) {\n state.delete(key);\n }\n }\n}\n\nfunction addChildToParent(parent: ParentNode, child: Node): void {\n if (isForParent(parent)) {\n parent.body.push(child);\n } else {\n parent.children.push(child);\n }\n}\n\nfunction isForParent(parent: ParentNode): parent is ForNode {\n return \"type\" in parent && parent.type === \"For\";\n}\n\nfunction isComponentNode(parent: ParentNode): parent is ComponentNode {\n return \"type\" in parent && parent.type === \"Component\";\n}\n\ninterface ConditionalHeaderResult {\n test?: string;\n inlineBody?: string;\n inlineColumn?: number;\n directiveLength: number;\n}\n\nfunction parseConditionalHeader(\n kind: \"if\" | \"elseIf\",\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ConditionalHeaderResult | null {\n const trimmed = lineContent.trimEnd();\n const pattern = kind === \"if\" ? /^@if\\s*\\((.*)\\)(.*)$/ : /^@elseIf\\s*\\((.*)\\)(.*)$/;\n const match = trimmed.match(pattern);\n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE201\",\n kind === \"if\" ? \"Invalid @if syntax. Use @if (condition).\" : \"Invalid @elseIf syntax. Use @elseIf (condition).\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 3\n );\n return null;\n }\n const test = match[1].trim();\n if (!test) {\n pushDiag(\n diagnostics,\n \"COLLIE201\",\n kind === \"if\" ? \"@if condition cannot be empty.\" : \"@elseIf condition cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 3\n );\n return null;\n }\n const remainderRaw = match[2] ?? \"\";\n const inlineBody = remainderRaw.trim();\n const remainderOffset = trimmed.length - remainderRaw.length;\n const leadingWhitespace = remainderRaw.length - inlineBody.length;\n const inlineColumn =\n inlineBody.length > 0 ? column + remainderOffset + leadingWhitespace : undefined;\n return {\n test,\n inlineBody: inlineBody.length ? inlineBody : undefined,\n inlineColumn,\n directiveLength: trimmed.length || 3\n };\n}\n\nfunction parseElseHeader(\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ConditionalHeaderResult | null {\n const trimmed = lineContent.trimEnd();\n const match = trimmed.match(/^@else\\b(.*)$/);\n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE203\",\n \"Invalid @else syntax.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n const remainderRaw = match[1] ?? \"\";\n const inlineBody = remainderRaw.trim();\n const remainderOffset = trimmed.length - remainderRaw.length;\n const leadingWhitespace = remainderRaw.length - inlineBody.length;\n const inlineColumn =\n inlineBody.length > 0 ? column + remainderOffset + leadingWhitespace : undefined;\n return {\n inlineBody: inlineBody.length ? inlineBody : undefined,\n inlineColumn,\n directiveLength: trimmed.length || 4\n };\n}\n\ninterface ForHeaderResult {\n itemName: string;\n arrayExpr: string;\n}\n\nfunction parseForHeader(\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ForHeaderResult | null {\n const trimmed = lineContent.trimEnd();\n const match = trimmed.match(/^@for\\s+([A-Za-z_][A-Za-z0-9_]*)\\s+in\\s+(.+)$/);\n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"Invalid @for syntax. Use @for itemName in arrayExpr.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n const itemName = match[1];\n const arrayExprRaw = match[2];\n if (!itemName || !arrayExprRaw) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"Invalid @for syntax. Use @for itemName in arrayExpr.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n const arrayExpr = arrayExprRaw.trim();\n if (!arrayExpr) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"@for array expression cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n return { itemName, arrayExpr };\n}\n\nfunction parseInlineNode(\n source: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): Node | null {\n const trimmed = source.trim();\n if (!trimmed) {\n return null;\n }\n\n if (trimmed.startsWith(\"|\")) {\n return parseTextLine(trimmed, lineNumber, column, lineOffset, diagnostics);\n }\n\n if (trimmed.startsWith(\"{{\")) {\n return parseExpressionLine(trimmed, lineNumber, column, lineOffset, diagnostics);\n }\n\n if (trimmed.startsWith(\"@\")) {\n pushDiag(\n diagnostics,\n \"COLLIE209\",\n \"Inline conditional bodies may only contain elements, text, or expressions.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length\n );\n return null;\n }\n\n return parseElement(trimmed, lineNumber, column, lineOffset, diagnostics);\n}\n\nfunction createConditionalBranchContext(\n owner: ConditionalNode,\n branch: ConditionalBranch\n): ConditionalBranchContext {\n return {\n kind: \"ConditionalBranch\",\n owner,\n branch,\n children: branch.body\n };\n}\n\nfunction createSlotContext(owner: ComponentNode, slot: SlotBlock): SlotContext {\n return {\n kind: \"Slot\",\n owner,\n slot,\n children: slot.children\n };\n}\n\nfunction createStandaloneSlotContext(name: string): SlotContext {\n const owner: ComponentNode = {\n type: \"Component\",\n name: \"__invalid_slot__\",\n attributes: [],\n children: []\n };\n const slot: SlotBlock = { type: \"Slot\", name, children: [] };\n return createSlotContext(owner, slot);\n}\n\nfunction parseTextLine(\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): TextNode | null {\n const trimmed = lineContent.trimEnd();\n let payload = trimmed;\n let payloadColumn = column;\n\n if (payload.startsWith(\"|\")) {\n payload = payload.slice(1);\n payloadColumn += 1;\n\n if (payload.startsWith(\" \")) {\n payload = payload.slice(1);\n payloadColumn += 1;\n }\n }\n\n return parseTextPayload(payload, lineNumber, payloadColumn, lineOffset, diagnostics);\n}\n\nfunction parseTextPayload(\n payload: string,\n lineNumber: number,\n payloadColumn: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): TextNode | null {\n const parts: TextNode[\"parts\"] = [];\n let cursor = 0;\n let textBuffer = \"\";\n\n const flushText = (): void => {\n if (textBuffer.length) {\n parts.push({ type: \"text\", value: textBuffer });\n textBuffer = \"\";\n }\n };\n\n while (cursor < payload.length) {\n const ch = payload[cursor];\n\n if (ch === \"{\") {\n flushText();\n if (payload[cursor + 1] === \"{\") {\n const exprStart = cursor;\n const exprEnd = payload.indexOf(\"}}\", cursor + 2);\n if (exprEnd === -1) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression must end with }}.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset\n );\n textBuffer += payload.slice(exprStart);\n break;\n }\n const inner = payload.slice(exprStart + 2, exprEnd).trim();\n if (!inner) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression cannot be empty.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset,\n exprEnd - exprStart\n );\n } else {\n parts.push({ type: \"expr\", value: inner });\n }\n cursor = exprEnd + 2;\n continue;\n }\n\n const exprStart = cursor;\n const exprEnd = payload.indexOf(\"}\", cursor + 1);\n if (exprEnd === -1) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression must end with }.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset\n );\n textBuffer += payload.slice(exprStart);\n break;\n }\n const inner = payload.slice(exprStart + 1, exprEnd).trim();\n if (!inner) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression cannot be empty.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset,\n exprEnd - exprStart\n );\n } else {\n parts.push({ type: \"expr\", value: inner });\n }\n cursor = exprEnd + 1;\n continue;\n }\n\n if (ch === \"}\") {\n flushText();\n if (payload[cursor + 1] === \"}\") {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression closing }} must follow an opening {{.\",\n lineNumber,\n payloadColumn + cursor,\n lineOffset,\n 2\n );\n cursor += 2;\n continue;\n }\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression closing } must follow an opening {.\",\n lineNumber,\n payloadColumn + cursor,\n lineOffset\n );\n cursor += 1;\n continue;\n }\n\n textBuffer += ch;\n cursor += 1;\n }\n\n flushText();\n\n return { type: \"Text\", parts };\n}\n\nfunction parseExpressionLine(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ExpressionNode | null {\n const trimmed = line.trimEnd();\n const closeIndex = trimmed.indexOf(\"}}\");\n if (closeIndex === -1) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Expression lines must end with }}.\",\n lineNumber,\n column,\n lineOffset\n );\n return null;\n }\n\n if (trimmed.slice(closeIndex + 2).trim().length) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Expression lines cannot contain text after the closing }}.\",\n lineNumber,\n column + closeIndex + 2,\n lineOffset\n );\n return null;\n }\n\n const inner = trimmed.slice(2, closeIndex).trim();\n if (!inner) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Expression cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n closeIndex + 2\n );\n return null;\n }\n\n return { type: \"Expression\", value: inner };\n}\n\nfunction parseJSXPassthrough(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): JSXPassthroughNode | null {\n if (!line.startsWith(\"=\")) {\n return null;\n }\n \n const payload = line.slice(1).trim();\n if (!payload) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"JSX passthrough expression cannot be empty.\",\n lineNumber,\n column,\n lineOffset\n );\n return null;\n }\n \n return { type: \"JSXPassthrough\", expression: payload };\n}\n\n\nfunction parsePropsField(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): PropsField | null {\n const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)(\\??)\\s*:\\s*(.+)$/);\n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE102\",\n \"Props lines must be in the form `name[:?] Type`.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(line.length, 1)\n );\n return null;\n }\n\n const [, name, optionalFlag, typePart] = match;\n const typeText = typePart.trim();\n if (!typeText) {\n pushDiag(\n diagnostics,\n \"COLLIE102\",\n \"Props lines must provide a type after the colon.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(line.length, 1)\n );\n return null;\n }\n\n return {\n name,\n optional: optionalFlag === \"?\",\n typeText\n };\n}\n\nfunction parseClassAliasLine(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ClassAliasDecl | null {\n const match = line.match(/^([^=]+?)\\s*=\\s*(.+)$/);\n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE304\",\n \"Classes lines must be in the form `name = class.tokens`.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(line.length, 1)\n );\n return null;\n }\n\n const rawName = match[1].trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(rawName)) {\n pushDiag(\n diagnostics,\n \"COLLIE305\",\n `Class alias name '${rawName}' must be a valid identifier.`,\n lineNumber,\n column,\n lineOffset,\n Math.max(rawName.length, 1)\n );\n return null;\n }\n\n const rhs = match[2];\n const rhsIndex = line.indexOf(rhs);\n const rhsColumn = rhsIndex >= 0 ? column + rhsIndex : column;\n const classes = parseAliasClasses(rhs, lineNumber, rhsColumn, lineOffset, diagnostics);\n if (!classes.length) {\n return null;\n }\n\n const nameIndex = line.indexOf(rawName);\n const nameColumn = nameIndex >= 0 ? column + nameIndex : column;\n const span = createSpan(lineNumber, nameColumn, rawName.length, lineOffset);\n\n return { name: rawName, classes, span };\n}\n\nfunction parseAliasClasses(\n rhs: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): string[] {\n const trimmed = rhs.trim();\n if (!trimmed) {\n pushDiag(\n diagnostics,\n \"COLLIE304\",\n \"Classes lines must provide one or more class tokens after '='.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(rhs.length, 1)\n );\n return [];\n }\n\n const withoutDotPrefix = trimmed.startsWith(\".\") ? trimmed.slice(1) : trimmed;\n const parts = withoutDotPrefix.split(\".\");\n const classes: string[] = [];\n for (const part of parts) {\n const token = part.trim();\n if (!token) {\n pushDiag(\n diagnostics,\n \"COLLIE304\",\n \"Classes lines must provide one or more class tokens after '='.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(rhs.length, 1)\n );\n return [];\n }\n classes.push(token);\n }\n\n return classes;\n}\n\nfunction validateClassAliasDefinitions(\n classAliases: ClassAliasesDecl,\n diagnostics: Diagnostic[]\n): void {\n const seen = new Map<string, ClassAliasDecl>();\n for (const alias of classAliases.aliases) {\n const previous = seen.get(alias.name);\n if (previous) {\n if (alias.span) {\n diagnostics.push({\n severity: \"error\",\n code: \"COLLIE306\",\n message: `Duplicate class alias '${alias.name}'.`,\n span: alias.span\n });\n } else {\n pushDiag(diagnostics, \"COLLIE306\", `Duplicate class alias '${alias.name}'.`, 1, 1, 0);\n }\n continue;\n }\n seen.set(alias.name, alias);\n }\n}\n\nfunction validateClassAliasUsages(root: RootNode, diagnostics: Diagnostic[]): void {\n const defined = new Set<string>(root.classAliases?.aliases.map((alias) => alias.name) ?? []);\n for (const child of root.children) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n}\n\nfunction validateNodeClassAliases(\n node: Node,\n defined: Set<string>,\n diagnostics: Diagnostic[]\n): void {\n if (node.type === \"Element\" || node.type === \"Component\") {\n const spans = node.type === \"Element\" ? (node.classSpans ?? []) : [];\n const classes = node.type === \"Element\" ? node.classes : [];\n classes.forEach((cls, index) => {\n const match = cls.match(/^\\$([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) {\n return;\n }\n const aliasName = match[1];\n if (defined.has(aliasName)) {\n return;\n }\n const span = spans[index];\n if (span) {\n diagnostics.push({\n severity: \"error\",\n code: \"COLLIE307\",\n message: `Undefined class alias '${aliasName}'.`,\n span\n });\n } else {\n pushDiag(diagnostics, \"COLLIE307\", `Undefined class alias '${aliasName}'.`, 1, 1, 0);\n }\n });\n for (const child of node.children) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n if (node.type === \"Component\" && node.slots) {\n for (const slot of node.slots) {\n for (const child of slot.children) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n }\n }\n return;\n }\n\n if (node.type === \"Conditional\") {\n for (const branch of node.branches) {\n for (const child of branch.body) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n }\n }\n\n if (node.type === \"For\") {\n for (const child of node.body) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n }\n}\n\nfunction parseElement(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ElementNode | ComponentNode | null {\n // First, try to match tag name\n const nameMatch = line.match(/^([A-Za-z][A-Za-z0-9_]*)/);\n if (!nameMatch) {\n // Don't push diagnostic here - let the caller handle fallback to text\n return null;\n }\n\n const name = nameMatch[1];\n let cursor = name.length;\n\n // Check what follows the name\n const nextPart = line.slice(cursor);\n const isComponent = /^[A-Z]/.test(name);\n \n // Components must have parentheses or be at EOL\n if (isComponent && nextPart.length > 0) {\n const trimmedNext = nextPart.trimStart();\n if (trimmedNext.length > 0 && !trimmedNext.startsWith(\"(\")) {\n // This looks like a component name but has no parentheses - probably text\n return null;\n }\n }\n \n // If it's something other than '.', '(', whitespace, or EOL, it's probably not an element\n if (cursor < line.length) {\n const nextChar = line[cursor];\n if (nextChar !== \".\" && nextChar !== \"(\" && !/\\s/.test(nextChar)) {\n // This is probably text, not an element\n return null;\n }\n }\n\n // Parse classes (only for elements, not components)\n const classes: string[] = [];\n const classSpans: SourceSpan[] = [];\n\n if (!isComponent) {\n while (cursor < line.length && line[cursor] === \".\") {\n cursor++; // skip the dot\n const classMatch = line.slice(cursor).match(/^([A-Za-z0-9_$-]+)/);\n if (!classMatch) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Class names must contain only letters, numbers, underscores, hyphens, or `$` (for aliases).\",\n lineNumber,\n column + cursor,\n lineOffset\n );\n return null;\n }\n const className = classMatch[1];\n classes.push(className);\n classSpans.push(createSpan(lineNumber, column + cursor, className.length, lineOffset));\n cursor += className.length;\n }\n }\n\n // Parse attributes if parentheses are present\n const attributes: Attribute[] = [];\n if (cursor < line.length && line[cursor] === \"(\") {\n const attrResult = parseAttributes(line, cursor, lineNumber, column, lineOffset, diagnostics);\n if (!attrResult) {\n return null;\n }\n attributes.push(...attrResult.attributes);\n cursor = attrResult.endIndex;\n }\n\n // Parse optional guard expression\n let guard: string | undefined;\n const guardProbeStart = cursor;\n while (cursor < line.length && /\\s/.test(line[cursor])) {\n cursor++;\n }\n if (cursor < line.length && line[cursor] === \"?\") {\n const guardColumn = column + cursor;\n cursor++;\n const guardExpr = line.slice(cursor).trim();\n if (!guardExpr) {\n pushDiag(\n diagnostics,\n \"COLLIE601\",\n \"Guard expressions require a condition after '?'.\",\n lineNumber,\n guardColumn,\n lineOffset\n );\n } else {\n guard = guardExpr;\n }\n cursor = line.length;\n } else {\n cursor = guardProbeStart;\n }\n\n // Parse inline text or children\n let rest = line.slice(cursor).trimStart();\n const children: Node[] = [];\n\n if (rest.length > 0) {\n // Bare text after the element\n const textNode = parseTextPayload(rest, lineNumber, column + cursor + (line.slice(cursor).length - rest.length), lineOffset, diagnostics);\n if (textNode) {\n children.push(textNode);\n }\n }\n\n if (isComponent) {\n const component: ComponentNode = {\n type: \"Component\",\n name,\n attributes,\n children\n };\n if (guard) {\n component.guard = guard;\n }\n return component;\n } else {\n const element: ElementNode = {\n type: \"Element\",\n name,\n classes,\n attributes,\n children\n };\n if (classSpans.length) {\n element.classSpans = classSpans;\n }\n if (guard) {\n element.guard = guard;\n }\n return element;\n }\n}\n\ninterface ParseAttributesResult {\n attributes: Attribute[];\n endIndex: number;\n}\n\nfunction parseAttributes(\n line: string,\n startIndex: number,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ParseAttributesResult | null {\n if (line[startIndex] !== \"(\") {\n return null;\n }\n\n const attributes: Attribute[] = [];\n let cursor = startIndex + 1;\n let depth = 1;\n let attrBuffer = \"\";\n\n // Find the matching closing parenthesis\n while (cursor < line.length && depth > 0) {\n const ch = line[cursor];\n if (ch === \"(\") {\n depth++;\n attrBuffer += ch;\n } else if (ch === \")\") {\n depth--;\n if (depth > 0) {\n attrBuffer += ch;\n }\n } else {\n attrBuffer += ch;\n }\n cursor++;\n }\n\n if (depth !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Unclosed attribute parentheses.\",\n lineNumber,\n column + startIndex,\n lineOffset\n );\n return null;\n }\n\n // Now parse the attributes from the buffer\n const trimmedAttrs = attrBuffer.trim();\n if (trimmedAttrs.length === 0) {\n return { attributes: [], endIndex: cursor };\n }\n\n // Parse each attribute\n // We need to handle multiline attributes properly\n const attrLines = trimmedAttrs.split(\"\\n\");\n let currentAttr = \"\";\n \n for (const attrLine of attrLines) {\n const trimmedLine = attrLine.trim();\n if (trimmedLine.length === 0) continue;\n\n // Check if this starts a new attribute (has an = sign at the top level)\n // or continues a previous one\n const eqIndex = trimmedLine.indexOf(\"=\");\n if (eqIndex > 0 && /^[A-Za-z][A-Za-z0-9_-]*\\s*=/.test(trimmedLine)) {\n // This is a new attribute\n if (currentAttr) {\n // Parse the previous attribute\n parseAndAddAttribute(currentAttr, attributes, diagnostics, lineNumber, column, lineOffset);\n currentAttr = \"\";\n }\n currentAttr = trimmedLine;\n } else {\n // Continuation of previous attribute\n if (currentAttr) {\n currentAttr += \" \" + trimmedLine;\n } else {\n // Boolean attribute\n currentAttr = trimmedLine;\n }\n }\n }\n\n // Parse the last attribute\n if (currentAttr) {\n parseAndAddAttribute(currentAttr, attributes, diagnostics, lineNumber, column, lineOffset);\n }\n\n return { attributes, endIndex: cursor };\n}\n\nfunction parseAndAddAttribute(\n attrStr: string,\n attributes: Attribute[],\n diagnostics: Diagnostic[],\n lineNumber: number,\n column: number,\n lineOffset: number\n): void {\n const trimmed = attrStr.trim();\n const match = trimmed.match(/^([A-Za-z][A-Za-z0-9_-]*)\\s*=\\s*(.+)$/s);\n if (match) {\n const attrName = match[1];\n const attrValue = match[2].trim();\n attributes.push({ name: attrName, value: attrValue });\n } else {\n // Boolean attribute\n const nameMatch = trimmed.match(/^([A-Za-z][A-Za-z0-9_-]*)$/);\n if (nameMatch) {\n attributes.push({ name: nameMatch[1], value: null });\n } else {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n `Invalid attribute syntax: ${trimmed.slice(0, 30)}`,\n lineNumber,\n column,\n lineOffset\n );\n }\n }\n}\n\nfunction pushDiag(\n diagnostics: Diagnostic[],\n code: DiagnosticCode,\n message: string,\n line: number,\n column: number,\n lineOffset: number,\n length = 1\n): void {\n diagnostics.push({\n severity: \"error\",\n code,\n message,\n span: createSpan(line, column, Math.max(length, 1), lineOffset)\n });\n}\n","import { generateModule } from \"./codegen\";\nimport { generateHtmlModule } from \"./html-codegen\";\nimport { parse } from \"./parser\";\nimport type { ParseResult } from \"./parser\";\nimport type { Diagnostic } from \"./diagnostics\";\nimport type { RootNode } from \"./ast\";\n\nexport type {\n Diagnostic,\n DiagnosticSeverity,\n SourcePos,\n SourceSpan\n} from \"./diagnostics\";\nexport type { ParseResult } from \"./parser\";\nexport type {\n Attribute,\n ClassAliasDecl,\n ClassAliasesDecl,\n ComponentNode,\n ConditionalBranch,\n ConditionalNode,\n ElementNode,\n ExpressionNode,\n ForNode,\n JSXPassthroughNode,\n Node,\n PropsDecl,\n PropsField,\n RootNode,\n SlotBlock,\n TextChunk,\n TextExprPart,\n TextNode,\n TextPart\n} from \"./ast\";\n\nexport interface ParseCollieOptions {\n filename?: string;\n}\n\nexport interface BaseCompileOptions {\n filename?: string;\n componentNameHint?: string;\n}\n\nexport interface JsxCompileOptions extends BaseCompileOptions {\n jsxRuntime?: \"classic\" | \"automatic\";\n}\n\nexport interface TsxCompileOptions extends BaseCompileOptions {\n jsxRuntime?: \"classic\" | \"automatic\";\n}\n\nexport interface HtmlCompileOptions extends BaseCompileOptions {}\n\nexport interface CompileResult {\n code: string;\n map?: any;\n diagnostics: Diagnostic[];\n}\n\nexport type CollieDocument = ParseResult;\nexport type CompileOptions = JsxCompileOptions;\n\nexport function parseCollie(source: string, options: ParseCollieOptions = {}): CollieDocument {\n const result = parse(source);\n if (!options.filename) {\n return result;\n }\n return { root: result.root, diagnostics: attachFilename(result.diagnostics, options.filename) };\n}\n\nexport function compileToJsx(\n sourceOrAst: string | RootNode | CollieDocument,\n options: JsxCompileOptions = {}\n): CompileResult {\n const document = normalizeDocument(sourceOrAst, options.filename);\n const diagnostics = options.filename ? attachFilename(document.diagnostics, options.filename) : document.diagnostics;\n const componentName = options.componentNameHint ?? \"CollieTemplate\";\n const jsxRuntime = options.jsxRuntime ?? \"automatic\";\n\n let code = createStubComponent(componentName, \"jsx\");\n if (!hasErrors(diagnostics)) {\n code = generateModule(document.root, { componentName, jsxRuntime, flavor: \"jsx\" });\n }\n\n return { code, diagnostics, map: undefined };\n}\n\nexport function compileToTsx(\n sourceOrAst: string | RootNode | CollieDocument,\n options: TsxCompileOptions = {}\n): CompileResult {\n const document = normalizeDocument(sourceOrAst, options.filename);\n const diagnostics = options.filename ? attachFilename(document.diagnostics, options.filename) : document.diagnostics;\n const componentName = options.componentNameHint ?? \"CollieTemplate\";\n const jsxRuntime = options.jsxRuntime ?? \"automatic\";\n\n let code = createStubComponent(componentName, \"tsx\");\n if (!hasErrors(diagnostics)) {\n code = generateModule(document.root, { componentName, jsxRuntime, flavor: \"tsx\" });\n }\n\n return { code, diagnostics, map: undefined };\n}\n\nexport function compileToHtml(\n sourceOrAst: string | RootNode | CollieDocument,\n options: HtmlCompileOptions = {}\n): CompileResult {\n const document = normalizeDocument(sourceOrAst, options.filename);\n const diagnostics = options.filename ? attachFilename(document.diagnostics, options.filename) : document.diagnostics;\n const componentName = options.componentNameHint ?? \"CollieTemplate\";\n\n let code = createStubHtml(componentName);\n if (!hasErrors(diagnostics)) {\n code = generateHtmlModule(document.root, { componentName });\n }\n\n return { code, diagnostics, map: undefined };\n}\n\nexport function compile(source: string, options: CompileOptions = {}): CompileResult {\n return compileToJsx(source, options);\n}\n\nexport { parseCollie as parse };\n\nfunction normalizeDocument(\n sourceOrAst: string | RootNode | CollieDocument,\n filename?: string\n): CollieDocument {\n if (typeof sourceOrAst === \"string\") {\n return parseCollie(sourceOrAst, { filename });\n }\n\n if (isCollieDocument(sourceOrAst)) {\n if (!filename) {\n return sourceOrAst;\n }\n return { root: sourceOrAst.root, diagnostics: attachFilename(sourceOrAst.diagnostics, filename) };\n }\n\n if (isRootNode(sourceOrAst)) {\n return { root: sourceOrAst, diagnostics: [] };\n }\n\n throw new TypeError(\"Collie compiler expected source text, a parsed document, or a root node.\");\n}\n\nfunction isRootNode(value: unknown): value is RootNode {\n return !!value && typeof value === \"object\" && (value as { type?: unknown }).type === \"Root\";\n}\n\nfunction isCollieDocument(value: unknown): value is CollieDocument {\n return (\n !!value &&\n typeof value === \"object\" &&\n isRootNode((value as { root?: unknown }).root) &&\n Array.isArray((value as { diagnostics?: unknown }).diagnostics)\n );\n}\n\nfunction hasErrors(diagnostics: Diagnostic[]): boolean {\n return diagnostics.some((diag) => diag.severity === \"error\");\n}\n\nfunction createStubComponent(name: string, flavor: \"jsx\" | \"tsx\"): string {\n if (flavor === \"tsx\") {\n return [\n \"export type Props = Record<string, never>;\",\n `export default function ${name}(props: Props) {`,\n \" return null;\",\n \"}\"\n ].join(\"\\n\");\n }\n return [`export default function ${name}(props) {`, \" return null;\", \"}\"].join(\"\\n\");\n}\n\nfunction createStubHtml(name: string): string {\n return [`export default function ${name}(props = {}) {`, ' return \"\";', \"}\"].join(\"\\n\");\n}\n\nfunction attachFilename(diagnostics: Diagnostic[], filename?: string): Diagnostic[] {\n if (!filename) {\n return diagnostics;\n }\n return diagnostics.map((diag) => (diag.file ? diag : { ...diag, file: filename }));\n}\n"],"mappings":"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","names":["buildClassAliasEnvironment","emitJsDocPropsType","emitPropsDestructure","wrapWithGuard","emitElement","emitComponent","expandClasses","jsxNode","exprStart","exprEnd","inner"]}
1
+ {"version":3,"sources":["../src/codegen.ts","../src/html-codegen.ts","../src/diagnostics.ts","../src/dialect.ts","../src/props.ts","../src/parser.ts","../src/index.ts","../src/fixes.ts","../src/format.ts","../src/convert.ts"],"sourcesContent":["import type {\n Attribute,\n ClassAliasesDecl,\n ComponentNode,\n ConditionalBranch,\n ConditionalNode,\n ElementNode,\n ForNode,\n JSXPassthroughNode,\n Node,\n PropsDecl,\n RootNode,\n SlotBlock,\n TextNode\n} from \"./ast.ts\";\n\nexport interface RenderCodegenOptions {\n jsxRuntime: \"automatic\" | \"classic\";\n flavor: \"jsx\" | \"tsx\";\n}\n\nexport function generateRenderModule(root: RootNode, options: RenderCodegenOptions): string {\n const { prelude, propsType, propsDestructure, jsx, isTsx } = buildModuleParts(root, options);\n const parts: string[] = [...prelude, propsType];\n\n if (!isTsx) {\n parts.push(`/** @param {any} props */`);\n }\n\n const functionLines = [\n isTsx ? \"export function render(props: any) {\" : \"export function render(props) {\"\n ];\n if (propsDestructure) {\n functionLines.push(` ${propsDestructure}`);\n }\n functionLines.push(` return ${jsx};`, `}`);\n parts.push(functionLines.join(\"\\n\"));\n\n return parts.join(\"\\n\\n\");\n}\n\ninterface ModuleParts {\n prelude: string[];\n propsType: string;\n propsDestructure: string | null;\n jsx: string;\n isTsx: boolean;\n}\n\nfunction buildModuleParts(\n root: RootNode,\n options: { jsxRuntime: \"automatic\" | \"classic\"; flavor: \"jsx\" | \"tsx\" }\n): ModuleParts {\n const { jsxRuntime, flavor } = options;\n const isTsx = flavor === \"tsx\";\n\n const aliasEnv = buildClassAliasEnvironment(root.classAliases);\n const jsx = renderRootChildren(root.children, aliasEnv);\n const propsDestructure = emitPropsDestructure(root.props);\n\n const prelude: string[] = [];\n\n if (root.clientComponent) {\n prelude.push(`\"use client\";`);\n }\n\n // Classic runtime needs React in scope for JSX transforms.\n if (jsxRuntime === \"classic\" && templateUsesJsx(root)) {\n prelude.push(`import React from \"react\";`);\n }\n\n // JS-safe typedef for Props (JSDoc)\n const propsType = emitPropsType(root.props, flavor);\n\n return { prelude, propsType, propsDestructure, jsx, isTsx };\n}\n\nfunction buildClassAliasEnvironment(\n decl?: ClassAliasesDecl\n): Map<string, readonly string[]> {\n const env = new Map<string, readonly string[]>();\n if (!decl) {\n return env;\n }\n for (const alias of decl.aliases) {\n env.set(alias.name, alias.classes);\n }\n return env;\n}\n\nfunction renderRootChildren(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>\n): string {\n return emitNodesExpression(children, aliasEnv, new Set());\n}\n\nfunction templateUsesJsx(root: RootNode): boolean {\n if (root.children.length === 0) {\n return false;\n }\n if (root.children.length > 1) {\n return true;\n }\n return nodeUsesJsx(root.children[0]);\n}\n\nfunction nodeUsesJsx(node: Node): boolean {\n if (node.type === \"Element\" || node.type === \"Text\" || node.type === \"Component\") {\n return true;\n }\n if (node.type === \"Expression\" || node.type === \"JSXPassthrough\") {\n return false;\n }\n if (node.type === \"Conditional\") {\n return node.branches.some((branch) => branchUsesJsx(branch));\n }\n if (node.type === \"For\") {\n return node.body.some((child) => nodeUsesJsx(child));\n }\n return false;\n}\n\nfunction branchUsesJsx(branch: ConditionalBranch): boolean {\n if (!branch.body.length) {\n return false;\n }\n return branch.body.some((child) => nodeUsesJsx(child));\n}\n\nfunction emitNodeInJsx(\n node: Node,\n aliasEnv: Map<string, readonly string[]>,\n locals: Set<string>\n): string {\n if (node.type === \"Text\") {\n return emitText(node, locals);\n }\n if (node.type === \"Expression\") {\n return `{${emitExpressionValue(node.value, locals)}}`;\n }\n if (node.type === \"JSXPassthrough\") {\n return `{${emitJsxExpression(node.expression, locals)}}`;\n }\n if (node.type === \"Conditional\") {\n return `{${emitConditionalExpression(node, aliasEnv, locals)}}`;\n }\n if (node.type === \"For\") {\n return `{${emitForExpression(node, aliasEnv, locals)}}`;\n }\n if (node.type === \"Component\") {\n return wrapWithGuard(emitComponent(node, aliasEnv, locals), node.guard, \"jsx\", locals);\n }\n return wrapWithGuard(emitElement(node, aliasEnv, locals), node.guard, \"jsx\", locals);\n}\n\nfunction emitElement(\n node: ElementNode,\n aliasEnv: Map<string, readonly string[]>,\n locals: Set<string>\n): string {\n const expanded = expandClasses(node.classes, aliasEnv);\n const classAttr = expanded.length ? ` className=\"${expanded.join(\" \")}\"` : \"\";\n const attrs = emitAttributes(node.attributes, aliasEnv, locals);\n const allAttrs = classAttr + attrs;\n const children = emitChildrenWithSpacing(node.children, aliasEnv, locals);\n \n if (children.length > 0) {\n return `<${node.name}${allAttrs}>${children}</${node.name}>`;\n } else {\n return `<${node.name}${allAttrs} />`;\n }\n}\n\nfunction emitComponent(\n node: ComponentNode,\n aliasEnv: Map<string, readonly string[]>,\n locals: Set<string>\n): string {\n const attrs = emitAttributes(node.attributes, aliasEnv, locals);\n const slotProps = emitSlotProps(node, aliasEnv, locals);\n const allAttrs = `${attrs}${slotProps}`;\n const children = emitChildrenWithSpacing(node.children, aliasEnv, locals);\n \n if (children.length > 0) {\n return `<${node.name}${allAttrs}>${children}</${node.name}>`;\n } else {\n return `<${node.name}${allAttrs} />`;\n }\n}\n\nfunction emitChildrenWithSpacing(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>,\n locals: Set<string>\n): string {\n if (children.length === 0) {\n return \"\";\n }\n \n const parts: string[] = [];\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const emitted = emitNodeInJsx(child, aliasEnv, locals);\n parts.push(emitted);\n \n // Add space between text and following element/component\n // but NOT between element/component and element/component\n if (i < children.length - 1) {\n const nextChild = children[i + 1];\n const needsSpace = \n child.type === \"Text\" &&\n (nextChild.type === \"Element\" || nextChild.type === \"Component\" || nextChild.type === \"Expression\" || nextChild.type === \"JSXPassthrough\");\n \n if (needsSpace) {\n parts.push(\" \");\n }\n }\n }\n \n return parts.join(\"\");\n}\n\nfunction emitAttributes(\n attributes: Attribute[],\n aliasEnv: Map<string, readonly string[]>,\n locals: Set<string>\n): string {\n if (attributes.length === 0) {\n return \"\";\n }\n \n return attributes.map(attr => {\n if (attr.value === null) {\n return ` ${attr.name}`;\n }\n return ` ${attr.name}=${emitAttributeValue(attr.value, locals)}`;\n }).join(\"\");\n}\n\nfunction emitSlotProps(\n node: ComponentNode,\n aliasEnv: Map<string, readonly string[]>,\n locals: Set<string>\n): string {\n if (!node.slots || node.slots.length === 0) {\n return \"\";\n }\n return node.slots\n .map((slot) => {\n const expr = emitNodesExpression(slot.children, aliasEnv, locals);\n return ` ${slot.name}={${expr}}`;\n })\n .join(\"\");\n}\n\nfunction wrapWithGuard(\n rendered: string,\n guard: string | undefined,\n context: \"jsx\" | \"expression\",\n locals: Set<string>\n): string {\n if (!guard) {\n return rendered;\n }\n const condition = emitExpressionValue(guard, locals);\n const expression = `(${condition}) && ${rendered}`;\n return context === \"jsx\" ? `{${expression}}` : expression;\n}\n\nfunction emitForExpression(\n node: ForNode,\n aliasEnv: Map<string, readonly string[]>,\n locals: Set<string>\n): string {\n const arrayExpr = emitExpressionValue(node.arrayExpr, locals);\n const nextLocals = new Set(locals);\n nextLocals.add(node.itemName);\n const body = emitNodesExpression(node.body, aliasEnv, nextLocals);\n return `(${arrayExpr} ?? []).map((${node.itemName}) => ${body})`;\n}\n\nfunction expandClasses(\n classes: readonly string[],\n aliasEnv: Map<string, readonly string[]>\n): string[] {\n // Alias expansion is a pure compile-time macro. The parser guarantees diagnostics for\n // undefined aliases, so codegen simply replaces $alias tokens with their literal class list.\n const result: string[] = [];\n for (const cls of classes) {\n const match = cls.match(/^\\$([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) {\n result.push(cls);\n continue;\n }\n const aliasClasses = aliasEnv.get(match[1]);\n if (!aliasClasses) {\n continue;\n }\n result.push(...aliasClasses);\n }\n return result;\n}\n\nfunction emitExpressionValue(expression: string, locals: Set<string>): string {\n return rewriteExpression(expression, locals);\n}\n\nfunction emitJsxExpression(expression: string, locals: Set<string>): string {\n const trimmed = expression.trimStart();\n if (trimmed.startsWith(\"<\")) {\n return rewriteJsxExpression(expression, locals);\n }\n return rewriteExpression(expression, locals);\n}\n\nfunction emitAttributeValue(value: string, locals: Set<string>): string {\n const trimmed = value.trim();\n if (trimmed.startsWith(\"\\\"\") || trimmed.startsWith(\"'\")) {\n return value;\n }\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n const inner = trimmed.slice(1, -1);\n const rewritten = rewriteExpression(inner, locals);\n return `{${rewritten}}`;\n }\n return rewriteExpression(trimmed, locals);\n}\n\nfunction emitText(node: TextNode, locals: Set<string>): string {\n if (!node.parts.length) {\n return \"\";\n }\n\n return node.parts\n .map((part) => {\n if (part.type === \"text\") {\n return escapeText(part.value);\n }\n return `{${emitExpressionValue(part.value, locals)}}`;\n })\n .join(\"\");\n}\n\nfunction emitConditionalExpression(\n node: ConditionalNode,\n aliasEnv: Map<string, readonly string[]>,\n locals: Set<string>\n): string {\n if (!node.branches.length) {\n return \"null\";\n }\n const first = node.branches[0];\n if (node.branches.length === 1 && first.test) {\n const test = emitExpressionValue(first.test, locals);\n return `(${test}) && ${emitBranchExpression(first, aliasEnv, locals)}`;\n }\n const hasElse = node.branches[node.branches.length - 1].test === undefined;\n let fallback = hasElse\n ? emitBranchExpression(node.branches[node.branches.length - 1], aliasEnv, locals)\n : \"null\";\n const startIndex = hasElse ? node.branches.length - 2 : node.branches.length - 1;\n if (startIndex < 0) {\n return fallback;\n }\n for (let i = startIndex; i >= 0; i--) {\n const branch = node.branches[i];\n const test = branch.test ? emitExpressionValue(branch.test, locals) : \"false\";\n fallback = `(${test}) ? ${emitBranchExpression(branch, aliasEnv, locals)} : ${fallback}`;\n }\n return fallback;\n}\n\nfunction emitBranchExpression(\n branch: ConditionalBranch,\n aliasEnv: Map<string, readonly string[]>,\n locals: Set<string>\n): string {\n return emitNodesExpression(branch.body, aliasEnv, locals);\n}\n\nfunction emitNodesExpression(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>,\n locals: Set<string>\n): string {\n if (children.length === 0) {\n return \"null\";\n }\n if (children.length === 1) {\n return emitSingleNodeExpression(children[0], aliasEnv, locals);\n }\n return `<>${children.map((child) => emitNodeInJsx(child, aliasEnv, locals)).join(\"\")}</>`;\n}\n\nfunction emitSingleNodeExpression(\n node: Node,\n aliasEnv: Map<string, readonly string[]>,\n locals: Set<string>\n): string {\n if (node.type === \"Expression\") {\n return emitExpressionValue(node.value, locals);\n }\n if (node.type === \"JSXPassthrough\") {\n return emitJsxExpression(node.expression, locals);\n }\n if (node.type === \"Conditional\") {\n return emitConditionalExpression(node, aliasEnv, locals);\n }\n if (node.type === \"For\") {\n return emitForExpression(node, aliasEnv, locals);\n }\n if (node.type === \"Element\") {\n return wrapWithGuard(emitElement(node, aliasEnv, locals), node.guard, \"expression\", locals);\n }\n if (node.type === \"Component\") {\n return wrapWithGuard(emitComponent(node, aliasEnv, locals), node.guard, \"expression\", locals);\n }\n if (node.type === \"Text\") {\n return `<>${emitNodeInJsx(node, aliasEnv, locals)}</>`;\n }\n return emitNodeInJsx(node, aliasEnv, locals);\n}\n\nfunction emitPropsType(props: PropsDecl | undefined, flavor: \"jsx\" | \"tsx\"): string {\n if (flavor === \"tsx\") {\n return emitTsPropsType(props);\n }\n return emitJsDocPropsType(props);\n}\n\nfunction emitJsDocPropsType(props?: PropsDecl): string {\n // Emit JS-safe JSDoc typedef (Rollup can parse this, and TS tooling can read it).\n if (!props) {\n return \"/** @typedef {any} Props */\";\n }\n if (!props.fields.length) {\n return \"/** @typedef {{}} Props */\";\n }\n\n // Build an object type like: { foo: string; bar?: number }\n const fields = props.fields\n .map((field) => {\n const optional = field.optional ? \"?\" : \"\";\n return `${field.name}${optional}: ${field.typeText}`;\n })\n .join(\"; \");\n\n return `/** @typedef {{ ${fields} }} Props */`;\n}\n\nfunction emitTsPropsType(props?: PropsDecl): string {\n if (!props || props.fields.length === 0) {\n return \"export type Props = Record<string, never>;\";\n }\n\n const lines = props.fields.map((field) => {\n const optional = field.optional ? \"?\" : \"\";\n return ` ${field.name}${optional}: ${field.typeText};`;\n });\n\n return [\"export interface Props {\", ...lines, \"}\"].join(\"\\n\");\n}\n\nfunction emitPropsDestructure(props?: PropsDecl): string | null {\n if (!props || props.fields.length === 0) {\n return null;\n }\n const names = props.fields.map((field) => field.name);\n return `const { ${names.join(\", \")} } = props ?? {};`;\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/[&<>{}]/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case \"{\":\n return \"&#123;\";\n case \"}\":\n return \"&#125;\";\n default:\n return char;\n }\n });\n}\n\nconst IGNORED_IDENTIFIERS = new Set([\n \"null\",\n \"undefined\",\n \"true\",\n \"false\",\n \"NaN\",\n \"Infinity\",\n \"this\",\n \"props\"\n]);\n\nconst RESERVED_KEYWORDS = new Set([\n \"await\",\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"enum\",\n \"export\",\n \"extends\",\n \"false\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"let\",\n \"new\",\n \"null\",\n \"return\",\n \"super\",\n \"switch\",\n \"this\",\n \"throw\",\n \"true\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\"\n]);\n\nfunction emitIdentifier(name: string): string {\n return `props?.${name}`;\n}\n\nfunction rewriteExpression(expression: string, locals: Set<string>): string {\n let i = 0;\n let state: \"code\" | \"single\" | \"double\" | \"template\" | \"line\" | \"block\" = \"code\";\n let output = \"\";\n\n while (i < expression.length) {\n const ch = expression[i];\n\n if (state === \"code\") {\n if (ch === \"'\" || ch === \"\\\"\") {\n state = ch === \"'\" ? \"single\" : \"double\";\n output += ch;\n i++;\n continue;\n }\n if (ch === \"`\") {\n state = \"template\";\n output += ch;\n i++;\n continue;\n }\n if (ch === \"/\" && expression[i + 1] === \"/\") {\n state = \"line\";\n output += ch;\n i++;\n continue;\n }\n if (ch === \"/\" && expression[i + 1] === \"*\") {\n state = \"block\";\n output += ch;\n i++;\n continue;\n }\n if (isIdentifierStart(ch)) {\n const start = i;\n i++;\n while (i < expression.length && isIdentifierPart(expression[i])) {\n i++;\n }\n const name = expression.slice(start, i);\n const prevNonSpace = findPreviousNonSpace(expression, start - 1);\n const nextNonSpace = findNextNonSpace(expression, i);\n const isMemberAccess = prevNonSpace === \".\";\n const isObjectKey = nextNonSpace === \":\";\n\n if (\n isMemberAccess ||\n isObjectKey ||\n locals.has(name) ||\n shouldIgnoreIdentifier(name)\n ) {\n output += name;\n continue;\n }\n\n output += emitIdentifier(name);\n continue;\n }\n\n output += ch;\n i++;\n continue;\n }\n\n if (state === \"line\") {\n output += ch;\n if (ch === \"\\n\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"block\") {\n output += ch;\n if (ch === \"*\" && expression[i + 1] === \"/\") {\n output += \"/\";\n i += 2;\n state = \"code\";\n continue;\n }\n i++;\n continue;\n }\n\n if (state === \"single\") {\n output += ch;\n if (ch === \"\\\\\") {\n if (i + 1 < expression.length) {\n output += expression[i + 1];\n i += 2;\n continue;\n }\n }\n if (ch === \"'\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"double\") {\n output += ch;\n if (ch === \"\\\\\") {\n if (i + 1 < expression.length) {\n output += expression[i + 1];\n i += 2;\n continue;\n }\n }\n if (ch === \"\\\"\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"template\") {\n output += ch;\n if (ch === \"\\\\\") {\n if (i + 1 < expression.length) {\n output += expression[i + 1];\n i += 2;\n continue;\n }\n }\n if (ch === \"`\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n }\n\n return output;\n}\n\nfunction rewriteJsxExpression(expression: string, locals: Set<string>): string {\n let output = \"\";\n let i = 0;\n\n while (i < expression.length) {\n const ch = expression[i];\n if (ch === \"{\") {\n const braceResult = readBalancedBraces(expression, i + 1);\n if (!braceResult) {\n output += expression.slice(i);\n break;\n }\n const rewritten = rewriteExpression(braceResult.content, locals);\n output += `{${rewritten}}`;\n i = braceResult.endIndex + 1;\n continue;\n }\n output += ch;\n i++;\n }\n\n return output;\n}\n\nfunction readBalancedBraces(\n source: string,\n startIndex: number\n): { content: string; endIndex: number } | null {\n let i = startIndex;\n let depth = 1;\n let state: \"code\" | \"single\" | \"double\" | \"template\" | \"line\" | \"block\" = \"code\";\n\n while (i < source.length) {\n const ch = source[i];\n\n if (state === \"code\") {\n if (ch === \"'\" || ch === \"\\\"\") {\n state = ch === \"'\" ? \"single\" : \"double\";\n i++;\n continue;\n }\n if (ch === \"`\") {\n state = \"template\";\n i++;\n continue;\n }\n if (ch === \"/\" && source[i + 1] === \"/\") {\n state = \"line\";\n i += 2;\n continue;\n }\n if (ch === \"/\" && source[i + 1] === \"*\") {\n state = \"block\";\n i += 2;\n continue;\n }\n if (ch === \"{\") {\n depth += 1;\n } else if (ch === \"}\") {\n depth -= 1;\n if (depth === 0) {\n return { content: source.slice(startIndex, i), endIndex: i };\n }\n }\n i++;\n continue;\n }\n\n if (state === \"line\") {\n if (ch === \"\\n\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"block\") {\n if (ch === \"*\" && source[i + 1] === \"/\") {\n i += 2;\n state = \"code\";\n continue;\n }\n i++;\n continue;\n }\n\n if (state === \"single\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"'\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"double\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"\\\"\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"template\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"`\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n }\n\n return null;\n}\n\nfunction findPreviousNonSpace(text: string, index: number): string | null {\n for (let i = index; i >= 0; i--) {\n const ch = text[i];\n if (!/\\s/.test(ch)) {\n return ch;\n }\n }\n return null;\n}\n\nfunction findNextNonSpace(text: string, index: number): string | null {\n for (let i = index; i < text.length; i++) {\n const ch = text[i];\n if (!/\\s/.test(ch)) {\n return ch;\n }\n }\n return null;\n}\n\nfunction isIdentifierStart(ch: string): boolean {\n return /[A-Za-z_$]/.test(ch);\n}\n\nfunction isIdentifierPart(ch: string): boolean {\n return /[A-Za-z0-9_$]/.test(ch);\n}\n\nfunction shouldIgnoreIdentifier(name: string): boolean {\n return IGNORED_IDENTIFIERS.has(name) || RESERVED_KEYWORDS.has(name);\n}\n","import type {\n Attribute,\n ClassAliasesDecl,\n ElementNode,\n Node,\n RootNode,\n TextNode\n} from \"./ast.ts\";\n\nexport interface HtmlCodegenOptions {\n indent?: string;\n}\n\n// Attribute rendering overview:\n// - renderAttributes flattens classes and AST-provided attributes into `name=\"value\"` strings.\n// - extractStaticAttributeValue peels the literal text from the parser's raw attribute field and hands it to\n// escapeHtmlAttribute so that &, <, >, and \" inside the value are safely encoded.\n// - When inline attributes were parsed as a single chunk (e.g. `src=\"/foo\" alt=\"bar\"`), the chunk's closing quote\n// was treated as part of the literal, causing escapeHtmlAttribute to turn the boundary `\"` into `&quot;` and break\n// subsequent attributes. The logic below isolates the raw value and feeds any leftover attribute text back through\n// the same renderer so only the actual attribute contents are escaped.\n\n/**\n * HTML emitter currently supports only static markup; dynamic expressions and control flow will be added later.\n */\nexport function generateHtml(root: RootNode, options: HtmlCodegenOptions = {}): string {\n const indent = options.indent ?? \" \";\n const aliasEnv = buildClassAliasEnvironment(root.classAliases);\n const rendered = emitNodes(root.children, aliasEnv, indent, 0);\n return rendered.trimEnd();\n}\n\nfunction emitNodes(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>,\n indent: string,\n depth: number\n): string {\n let html = \"\";\n for (const child of children) {\n const chunk = emitNode(child, aliasEnv, indent, depth);\n if (chunk) {\n html += chunk;\n }\n }\n return html;\n}\n\nfunction emitNode(\n node: Node,\n aliasEnv: Map<string, readonly string[]>,\n indent: string,\n depth: number\n): string {\n switch (node.type) {\n case \"Element\":\n return emitElement(node, aliasEnv, indent, depth);\n case \"Text\":\n return emitTextBlock(node, indent, depth);\n default:\n return \"\";\n }\n}\n\nfunction emitElement(\n node: ElementNode,\n aliasEnv: Map<string, readonly string[]>,\n indent: string,\n depth: number\n): string {\n const indentText = indent.repeat(depth);\n const classNames = expandClasses(node.classes, aliasEnv);\n const attrs = renderAttributes(node.attributes, classNames);\n const openTag = `<${node.name}${attrs}>`;\n\n if (node.children.length === 0) {\n return `${indentText}${openTag}</${node.name}>\\n`;\n }\n\n if (node.children.length === 1 && node.children[0].type === \"Text\") {\n const inline = emitInlineText(node.children[0]);\n if (inline !== null) {\n return `${indentText}${openTag}${inline}</${node.name}>\\n`;\n }\n }\n\n const children = emitNodes(node.children, aliasEnv, indent, depth + 1);\n if (!children) {\n return `${indentText}${openTag}</${node.name}>\\n`;\n }\n\n return `${indentText}${openTag}\\n${children}${indentText}</${node.name}>\\n`;\n}\n\nfunction renderAttributes(attributes: Attribute[], classNames: readonly string[]): string {\n const segments: string[] = [];\n if (classNames.length) {\n segments.push(`class=\"${escapeAttributeValue(classNames.join(\" \"))}\"`);\n }\n for (const attr of attributes) {\n if (attr.value === null) {\n segments.push(attr.name);\n continue;\n }\n const literal = extractStaticAttributeValue(attr.value);\n if (literal === null) {\n continue;\n }\n const name = attr.name === \"className\" ? \"class\" : attr.name;\n segments.push(`${name}=\"${escapeAttributeValue(literal)}\"`);\n }\n if (!segments.length) {\n return \"\";\n }\n return \" \" + segments.join(\" \");\n}\n\nfunction emitTextBlock(node: TextNode, indent: string, depth: number): string {\n const inline = emitInlineText(node);\n if (inline === null || inline.trim().length === 0) {\n return \"\";\n }\n return `${indent.repeat(depth)}${inline}\\n`;\n}\n\nfunction emitInlineText(node: TextNode): string | null {\n if (!node.parts.length) {\n return \"\";\n }\n let text = \"\";\n for (const part of node.parts) {\n if (part.type !== \"text\") {\n return null;\n }\n text += escapeStaticText(part.value);\n }\n return text;\n}\n\nfunction extractStaticAttributeValue(raw: string): string | null {\n const trimmed = raw.trim();\n if (trimmed.length < 2) {\n return null;\n }\n const quote = trimmed[0];\n if ((quote !== '\"' && quote !== \"'\") || trimmed[trimmed.length - 1] !== quote) {\n return null;\n }\n const body = trimmed.slice(1, -1);\n let result = \"\";\n let escaping = false;\n for (const char of body) {\n if (escaping) {\n result += unescapeChar(char, quote);\n escaping = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaping = true;\n } else {\n result += char;\n }\n }\n if (escaping) {\n result += \"\\\\\";\n }\n return result;\n}\n\nfunction unescapeChar(char: string, quote: string): string {\n switch (char) {\n case \"n\":\n return \"\\n\";\n case \"r\":\n return \"\\r\";\n case \"t\":\n return \"\\t\";\n case \"\\\\\":\n return \"\\\\\";\n case '\"':\n return '\"';\n case \"'\":\n return \"'\";\n default:\n if (char === quote) {\n return quote;\n }\n return char;\n }\n}\n\nfunction buildClassAliasEnvironment(\n decl?: ClassAliasesDecl\n): Map<string, readonly string[]> {\n const env = new Map<string, readonly string[]>();\n if (!decl) {\n return env;\n }\n for (const alias of decl.aliases) {\n env.set(alias.name, alias.classes);\n }\n return env;\n}\n\nfunction expandClasses(\n classes: readonly string[],\n aliasEnv: Map<string, readonly string[]>\n): string[] {\n const result: string[] = [];\n for (const cls of classes) {\n const match = cls.match(/^\\$([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) {\n result.push(cls);\n continue;\n }\n const aliasClasses = aliasEnv.get(match[1]);\n if (!aliasClasses) {\n continue;\n }\n result.push(...aliasClasses);\n }\n return result;\n}\n\nfunction escapeStaticText(value: string): string {\n return value.replace(/[&<>{}]/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case \"{\":\n return \"&#123;\";\n case \"}\":\n return \"&#125;\";\n default:\n return char;\n }\n });\n}\n\nfunction escapeAttributeValue(value: string): string {\n return value.replace(/[\"&<>]/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case '\"':\n return \"&quot;\";\n default:\n return char;\n }\n });\n}\n","export type DiagnosticSeverity = \"error\" | \"warning\";\n\nexport type DiagnosticCode =\n | \"COLLIE001\"\n | \"COLLIE002\"\n | \"COLLIE003\"\n | \"COLLIE004\"\n | \"COLLIE005\"\n | \"COLLIE101\"\n | \"COLLIE102\"\n | \"COLLIE103\"\n | \"COLLIE201\"\n | \"COLLIE202\"\n | \"COLLIE203\"\n | \"COLLIE204\"\n | \"COLLIE205\"\n | \"COLLIE206\"\n | \"COLLIE207\"\n | \"COLLIE208\"\n | \"COLLIE209\"\n | \"COLLIE210\"\n | \"COLLIE301\"\n | \"COLLIE302\"\n | \"COLLIE303\"\n | \"COLLIE304\"\n | \"COLLIE305\"\n | \"COLLIE306\"\n | \"COLLIE307\"\n | \"COLLIE401\"\n | \"COLLIE402\"\n | \"COLLIE501\"\n | \"COLLIE502\"\n | \"COLLIE503\"\n | \"COLLIE601\"\n | \"COLLIE701\"\n | \"COLLIE702\"\n | \"COLLIE703\"\n | \"COLLIE_ID_NOT_PASCAL_CASE\"\n | \"dialect.token.disallowed\"\n | \"dialect.token.nonPreferred\"\n | \"props.missingDeclaration\"\n | \"props.unusedDeclaration\"\n | \"props.style.nonPreferred\"\n | \"props.block.recommendedOrRequired\";\n\nexport interface SourcePos {\n line: number;\n col: number;\n offset: number;\n}\n\nexport interface SourceSpan {\n start: SourcePos;\n end: SourcePos;\n}\n\nexport interface Diagnostic {\n severity: DiagnosticSeverity;\n message: string;\n span?: SourceSpan;\n range?: SourceSpan;\n code?: DiagnosticCode;\n file?: string;\n filePath?: string;\n fix?: DiagnosticFix;\n data?: DiagnosticData;\n}\n\nexport interface DiagnosticFix {\n range: SourceSpan;\n replacementText: string;\n}\n\nexport interface DiagnosticData {\n kind: string;\n [key: string]: unknown;\n}\n\nexport function createSpan(line: number, col: number, length: number, lineOffset: number): SourceSpan {\n const startOffset = lineOffset + col - 1;\n return {\n start: { line, col, offset: startOffset },\n end: { line, col: col + length, offset: startOffset + length }\n };\n}\n","import type {\n ConditionalBranch,\n ConditionalNode,\n ForNode,\n Node,\n RootNode\n} from \"./ast.ts\";\nimport type { Diagnostic, DiagnosticSeverity, SourceSpan } from \"./diagnostics.ts\";\nimport type {\n CollieDiagnosticLevel,\n NormalizedCollieDialectOptions,\n NormalizedCollieDialectTokenRule\n} from \"@collie-lang/config\";\n\ninterface TokenOccurrence {\n kind: \"if\" | \"elseIf\" | \"else\" | \"for\" | \"id\";\n token: string;\n span?: SourceSpan;\n}\n\nexport function enforceDialect(\n root: RootNode,\n config: NormalizedCollieDialectOptions\n): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n\n if (root.idToken) {\n diagnostics.push(\n ...evaluateToken(\n { kind: \"id\", token: root.idToken, span: root.idTokenSpan },\n config.tokens.id\n )\n );\n }\n\n walkNodes(root.children, (occurrence) => {\n const rule = config.tokens[occurrence.kind];\n diagnostics.push(...evaluateToken(occurrence, rule));\n });\n\n return diagnostics;\n}\n\nfunction walkNodes(nodes: Node[], onToken: (occurrence: TokenOccurrence) => void): void {\n for (const node of nodes) {\n if (node.type === \"For\") {\n onFor(node, onToken);\n walkNodes(node.body, onToken);\n continue;\n }\n if (node.type === \"Conditional\") {\n onConditional(node, onToken);\n continue;\n }\n if (node.type === \"Element\" || node.type === \"Component\") {\n walkNodes(node.children, onToken);\n if (node.type === \"Component\" && node.slots) {\n for (const slot of node.slots) {\n walkNodes(slot.children, onToken);\n }\n }\n continue;\n }\n }\n}\n\nfunction onFor(node: ForNode, onToken: (occurrence: TokenOccurrence) => void): void {\n if (!node.token) {\n return;\n }\n onToken({ kind: \"for\", token: node.token, span: node.tokenSpan });\n}\n\nfunction onConditional(\n node: ConditionalNode,\n onToken: (occurrence: TokenOccurrence) => void\n): void {\n for (const branch of node.branches) {\n onBranch(branch, onToken);\n walkNodes(branch.body, onToken);\n }\n}\n\nfunction onBranch(\n branch: ConditionalBranch,\n onToken: (occurrence: TokenOccurrence) => void\n): void {\n if (!branch.token || !branch.kind) {\n return;\n }\n onToken({ kind: branch.kind, token: branch.token, span: branch.tokenSpan });\n}\n\nfunction evaluateToken(\n occurrence: TokenOccurrence,\n rule: NormalizedCollieDialectTokenRule\n): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const used = occurrence.token;\n const preferred = rule.preferred;\n const isAllowed = rule.allow.includes(used);\n\n if (!isAllowed) {\n const severity = levelToSeverity(rule.onDisallowed);\n if (severity) {\n diagnostics.push(\n createDialectDiagnostic(\n \"dialect.token.disallowed\",\n severity,\n used,\n preferred,\n occurrence.span,\n `Token \"${used}\" is not allowed for ${occurrence.kind}. Preferred: \"${preferred}\".`\n )\n );\n }\n return diagnostics;\n }\n\n if (used !== preferred) {\n const severity = levelToSeverity(rule.onDisallowed);\n if (severity) {\n diagnostics.push(\n createDialectDiagnostic(\n \"dialect.token.nonPreferred\",\n severity,\n used,\n preferred,\n occurrence.span,\n `Token \"${used}\" is allowed but not preferred for ${occurrence.kind}. Preferred: \"${preferred}\".`\n )\n );\n }\n }\n\n return diagnostics;\n}\n\nfunction createDialectDiagnostic(\n code: \"dialect.token.disallowed\" | \"dialect.token.nonPreferred\",\n severity: DiagnosticSeverity,\n used: string,\n preferred: string,\n span: SourceSpan | undefined,\n message: string\n): Diagnostic {\n const fix = span\n ? {\n range: span,\n replacementText: preferred\n }\n : undefined;\n\n return {\n severity,\n code,\n message: message.replace(/\\\\s+/g, \" \"),\n span,\n fix\n };\n}\n\nfunction levelToSeverity(level: CollieDiagnosticLevel): DiagnosticSeverity | null {\n if (level === \"off\") {\n return null;\n }\n if (level === \"error\") {\n return \"error\";\n }\n return \"warning\";\n}\n","import type {\n Attribute,\n ConditionalNode,\n ElementNode,\n ComponentNode,\n ForNode,\n Node,\n PropsField,\n RootNode,\n TextNode\n} from \"./ast.ts\";\nimport type { Diagnostic, DiagnosticSeverity, SourceSpan } from \"./diagnostics.ts\";\nimport type { CollieDiagnosticLevel, NormalizedCollieDialectPropsOptions } from \"@collie-lang/config\";\n\ninterface UsageOccurrence {\n name: string;\n kind: \"local\" | \"namespace\";\n index: number;\n length: number;\n}\n\ninterface UsageTracker {\n span?: SourceSpan;\n count: number;\n}\n\nconst IGNORED_IDENTIFIERS = new Set([\n \"null\",\n \"undefined\",\n \"true\",\n \"false\",\n \"NaN\",\n \"Infinity\",\n \"this\",\n \"props\"\n]);\n\nconst RESERVED_KEYWORDS = new Set([\n \"await\",\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"enum\",\n \"export\",\n \"extends\",\n \"false\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"let\",\n \"new\",\n \"null\",\n \"return\",\n \"super\",\n \"switch\",\n \"this\",\n \"throw\",\n \"true\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\"\n]);\n\nexport function enforceProps(\n root: RootNode,\n propsConfig: NormalizedCollieDialectPropsOptions\n): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const declaredProps = new Map<string, PropsField>();\n const usedLocal = new Map<string, UsageTracker>();\n const usedNamespace = new Map<string, UsageTracker>();\n const usedAny = new Set<string>();\n const missingReported = new Set<string>();\n const localStyleReported = new Set<string>();\n const namespaceStyleReported = new Set<string>();\n\n if (root.props?.fields) {\n for (const field of root.props.fields) {\n declaredProps.set(field.name, field);\n }\n }\n\n const preferStyle = propsConfig.preferAccessStyle;\n const flagLocalStyle = !propsConfig.allowDeclaredLocals || preferStyle === \"namespace\";\n const flagNamespaceStyle = !propsConfig.allowPropsNamespace || preferStyle === \"locals\";\n\n const walkNodes = (nodes: Node[], locals: Set<string>): void => {\n for (const node of nodes) {\n if (node.type === \"Conditional\") {\n handleConditional(node, locals);\n continue;\n }\n if (node.type === \"For\") {\n handleFor(node, locals);\n continue;\n }\n if (node.type === \"Expression\") {\n handleExpression(node.value, node.span, locals);\n continue;\n }\n if (node.type === \"JSXPassthrough\") {\n handleExpression(node.expression, node.span, locals);\n continue;\n }\n if (node.type === \"Text\") {\n handleText(node.parts, locals);\n continue;\n }\n if (node.type === \"Element\") {\n handleElement(node, locals);\n continue;\n }\n if (node.type === \"Component\") {\n handleComponent(node, locals);\n continue;\n }\n }\n };\n\n const handleConditional = (node: ConditionalNode, locals: Set<string>): void => {\n for (const branch of node.branches) {\n if (branch.test) {\n handleExpression(branch.test, branch.testSpan, locals);\n }\n walkNodes(branch.body, locals);\n }\n };\n\n const handleFor = (node: ForNode, locals: Set<string>): void => {\n handleExpression(node.arrayExpr, node.arrayExprSpan, locals);\n const nextLocals = new Set(locals);\n nextLocals.add(node.itemName);\n walkNodes(node.body, nextLocals);\n };\n\n const handleElement = (node: ElementNode, locals: Set<string>): void => {\n if (node.guard) {\n handleExpression(node.guard, node.guardSpan, locals);\n }\n handleAttributes(node.attributes, locals);\n walkNodes(node.children, locals);\n };\n\n const handleComponent = (node: ComponentNode, locals: Set<string>): void => {\n if (node.guard) {\n handleExpression(node.guard, node.guardSpan, locals);\n }\n handleAttributes(node.attributes, locals);\n if (node.slots) {\n for (const slot of node.slots) {\n walkNodes(slot.children, locals);\n }\n }\n walkNodes(node.children, locals);\n };\n\n const handleText = (parts: TextNode[\"parts\"], locals: Set<string>): void => {\n for (const part of parts) {\n if (part.type === \"expr\") {\n handleExpression(part.value, part.span, locals);\n }\n }\n };\n\n const handleAttributes = (attributes: Attribute[], locals: Set<string>): void => {\n for (const attr of attributes) {\n if (!attr.value) continue;\n const trimmed = attr.value.trim();\n if (!trimmed || trimmed.startsWith(\"'\") || trimmed.startsWith(\"\\\"\")) {\n continue;\n }\n handleExpression(trimmed, undefined, locals);\n }\n };\n\n const handleExpression = (\n expression: string,\n span: SourceSpan | undefined,\n locals: Set<string>\n ): void => {\n const occurrences = scanExpression(expression);\n for (const occurrence of occurrences) {\n const name = occurrence.name;\n if (occurrence.kind === \"local\" && locals.has(name)) {\n continue;\n }\n if (shouldIgnoreIdentifier(name)) {\n continue;\n }\n const usageSpan = span ? offsetSpan(span, occurrence.index, occurrence.length) : undefined;\n if (occurrence.kind === \"namespace\") {\n recordUsage(usedNamespace, name, usageSpan);\n usedAny.add(name);\n if (\n propsConfig.requireDeclarationForLocals &&\n !declaredProps.has(name) &&\n !missingReported.has(name)\n ) {\n const severity = levelToSeverity(propsConfig.diagnostics.missingDeclaration);\n if (severity) {\n diagnostics.push(createMissingDeclarationDiagnostic(name, severity, usageSpan));\n missingReported.add(name);\n }\n }\n if (flagNamespaceStyle && !namespaceStyleReported.has(name)) {\n const severity = levelToSeverity(propsConfig.diagnostics.style);\n if (severity) {\n diagnostics.push(\n createStyleDiagnostic(\n name,\n \"namespace\",\n severity,\n usageSpan,\n propsConfig.allowPropsNamespace\n )\n );\n namespaceStyleReported.add(name);\n }\n }\n continue;\n }\n\n recordUsage(usedLocal, name, usageSpan);\n usedAny.add(name);\n if (\n propsConfig.requireDeclarationForLocals &&\n !declaredProps.has(name) &&\n !missingReported.has(name)\n ) {\n const severity = levelToSeverity(propsConfig.diagnostics.missingDeclaration);\n if (severity) {\n diagnostics.push(createMissingDeclarationDiagnostic(name, severity, usageSpan));\n missingReported.add(name);\n }\n }\n\n if (flagLocalStyle && !localStyleReported.has(name)) {\n const severity = levelToSeverity(propsConfig.diagnostics.style);\n if (severity) {\n diagnostics.push(\n createStyleDiagnostic(name, \"local\", severity, usageSpan, propsConfig.allowDeclaredLocals)\n );\n localStyleReported.add(name);\n }\n }\n }\n };\n\n walkNodes(root.children, new Set());\n\n if (root.props?.fields) {\n for (const field of root.props.fields) {\n if (!usedAny.has(field.name)) {\n const severity = levelToSeverity(propsConfig.diagnostics.unusedDeclaration);\n if (severity) {\n diagnostics.push({\n severity,\n code: \"props.unusedDeclaration\",\n message: `Prop \"${field.name}\" is declared but never used.`,\n span: field.span\n });\n }\n }\n }\n }\n\n if (\n propsConfig.requirePropsBlockWhen.enabled &&\n !root.props &&\n usedAny.size >= propsConfig.requirePropsBlockWhen.minUniquePropsUsed\n ) {\n const severity = levelToSeverity(propsConfig.requirePropsBlockWhen.severity);\n if (severity) {\n diagnostics.push({\n severity,\n code: \"props.block.recommendedOrRequired\",\n message: `Props block recommended: ${usedAny.size} unique prop${usedAny.size === 1 ? \"\" : \"s\"} used.`\n });\n }\n }\n\n return diagnostics;\n}\n\nfunction createMissingDeclarationDiagnostic(\n name: string,\n severity: DiagnosticSeverity,\n span?: SourceSpan\n): Diagnostic {\n return {\n severity,\n code: \"props.missingDeclaration\",\n message: `Prop \\`${name}\\` is used but not declared in \\`#props\\`.`,\n span,\n data: {\n kind: \"addPropDeclaration\",\n propName: name\n }\n };\n}\n\nfunction createStyleDiagnostic(\n name: string,\n kind: \"local\" | \"namespace\",\n severity: DiagnosticSeverity,\n span: SourceSpan | undefined,\n allowed: boolean\n): Diagnostic {\n if (kind === \"namespace\") {\n const message = allowed\n ? `props.${name} is allowed but not preferred; use \"${name}\" instead.`\n : `props.${name} is disabled; use \"${name}\" instead.`;\n return {\n severity,\n code: \"props.style.nonPreferred\",\n message,\n span\n };\n }\n\n const message = allowed\n ? `\"${name}\" is allowed but not preferred; use props.${name} instead.`\n : `\"${name}\" is disabled; use props.${name} instead.`;\n\n return {\n severity,\n code: \"props.style.nonPreferred\",\n message,\n span\n };\n}\n\nfunction recordUsage(map: Map<string, UsageTracker>, name: string, span?: SourceSpan): void {\n const existing = map.get(name);\n if (existing) {\n existing.count += 1;\n return;\n }\n map.set(name, { count: 1, span });\n}\n\nfunction scanExpression(expression: string): UsageOccurrence[] {\n const occurrences: UsageOccurrence[] = [];\n let i = 0;\n let state: \"code\" | \"single\" | \"double\" | \"template\" | \"line\" | \"block\" = \"code\";\n\n while (i < expression.length) {\n const ch = expression[i];\n\n if (state === \"code\") {\n if (ch === \"'\" || ch === \"\\\"\") {\n state = ch === \"'\" ? \"single\" : \"double\";\n i++;\n continue;\n }\n if (ch === \"`\") {\n state = \"template\";\n i++;\n continue;\n }\n if (ch === \"/\" && expression[i + 1] === \"/\") {\n state = \"line\";\n i += 2;\n continue;\n }\n if (ch === \"/\" && expression[i + 1] === \"*\") {\n state = \"block\";\n i += 2;\n continue;\n }\n if (isIdentifierStart(ch)) {\n const start = i;\n i++;\n while (i < expression.length && isIdentifierPart(expression[i])) {\n i++;\n }\n const name = expression.slice(start, i);\n const prevNonSpace = findPreviousNonSpace(expression, start - 1);\n if (name === \"props\" && prevNonSpace !== \".\") {\n const namespace = readNamespaceAccess(expression, i);\n if (namespace) {\n occurrences.push({\n name: namespace.name,\n kind: \"namespace\",\n index: namespace.index,\n length: namespace.name.length\n });\n i = namespace.endIndex;\n continue;\n }\n }\n if (prevNonSpace !== \".\") {\n occurrences.push({ name, kind: \"local\", index: start, length: name.length });\n }\n continue;\n }\n i++;\n continue;\n }\n\n if (state === \"line\") {\n if (ch === \"\\n\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"block\") {\n if (ch === \"*\" && expression[i + 1] === \"/\") {\n state = \"code\";\n i += 2;\n continue;\n }\n i++;\n continue;\n }\n\n if (state === \"single\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"'\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"double\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"\\\"\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"template\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"`\") {\n state = \"code\";\n i++;\n continue;\n }\n i++;\n continue;\n }\n }\n\n return occurrences;\n}\n\nfunction readNamespaceAccess(\n expression: string,\n startIndex: number\n): { name: string; index: number; endIndex: number } | null {\n let i = startIndex;\n while (i < expression.length && /\\s/.test(expression[i])) {\n i++;\n }\n if (expression[i] === \"?\") {\n if (expression[i + 1] !== \".\") {\n return null;\n }\n i += 2;\n } else if (expression[i] === \".\") {\n i++;\n } else {\n return null;\n }\n while (i < expression.length && /\\s/.test(expression[i])) {\n i++;\n }\n if (!isIdentifierStart(expression[i])) {\n return null;\n }\n const propStart = i;\n i++;\n while (i < expression.length && isIdentifierPart(expression[i])) {\n i++;\n }\n return {\n name: expression.slice(propStart, i),\n index: propStart,\n endIndex: i\n };\n}\n\nfunction findPreviousNonSpace(text: string, index: number): string | null {\n for (let i = index; i >= 0; i--) {\n const ch = text[i];\n if (!/\\s/.test(ch)) {\n return ch;\n }\n }\n return null;\n}\n\nfunction isIdentifierStart(ch: string): boolean {\n return /[A-Za-z_$]/.test(ch);\n}\n\nfunction isIdentifierPart(ch: string): boolean {\n return /[A-Za-z0-9_$]/.test(ch);\n}\n\nfunction shouldIgnoreIdentifier(name: string): boolean {\n return IGNORED_IDENTIFIERS.has(name) || RESERVED_KEYWORDS.has(name);\n}\n\nfunction levelToSeverity(level: CollieDiagnosticLevel): DiagnosticSeverity | null {\n if (level === \"off\") {\n return null;\n }\n if (level === \"error\") {\n return \"error\";\n }\n return \"warning\";\n}\n\nfunction offsetSpan(base: SourceSpan, index: number, length: number): SourceSpan {\n const startOffset = base.start.offset + index;\n const startCol = base.start.col + index;\n return {\n start: {\n line: base.start.line,\n col: startCol,\n offset: startOffset\n },\n end: {\n line: base.start.line,\n col: startCol + length,\n offset: startOffset + length\n }\n };\n}\n","import type {\n Attribute,\n ClassAliasDecl,\n ClassAliasesDecl,\n ComponentNode,\n ConditionalBranch,\n ConditionalNode,\n ElementNode,\n ExpressionNode,\n ForNode,\n JSXPassthroughNode,\n Node,\n PropsField,\n RootNode,\n SlotBlock,\n TextNode\n} from \"./ast.ts\";\nimport type { NormalizedCollieDialectOptions } from \"@collie-lang/config\";\nimport { type Diagnostic, type DiagnosticCode, type SourceSpan, createSpan } from \"./diagnostics.ts\";\nimport { enforceDialect } from \"./dialect.ts\";\nimport { enforceProps } from \"./props.ts\";\n\nexport interface TemplateUnit {\n id: string;\n rawId: string;\n span?: SourceSpan;\n ast: RootNode;\n diagnostics: Diagnostic[];\n}\n\nexport interface ParseResult {\n templates: TemplateUnit[];\n diagnostics: Diagnostic[];\n}\n\nexport interface ParseOptions {\n dialect?: NormalizedCollieDialectOptions;\n}\n\ninterface ConditionalBranchContext {\n kind: \"ConditionalBranch\";\n owner: ConditionalNode;\n branch: ConditionalBranch;\n children: Node[];\n}\n\ninterface SlotContext {\n kind: \"Slot\";\n owner: ComponentNode;\n slot: SlotBlock;\n children: Node[];\n}\n\ntype ParentNode = RootNode | ElementNode | ComponentNode | ForNode | ConditionalBranchContext | SlotContext;\n\ninterface StackItem {\n node: ParentNode;\n level: number;\n}\n\ninterface BranchLocation {\n branch: ConditionalBranch;\n line: number;\n column: number;\n lineOffset: number;\n length: number;\n}\n\ninterface ConditionalChainState {\n node: ConditionalNode;\n level: number;\n hasElse: boolean;\n}\n\nconst ELEMENT_NAME = /^[A-Za-z][A-Za-z0-9_-]*/;\nconst CLASS_NAME = /^[A-Za-z0-9_$-]+/;\nconst TEMPLATE_ID_PATTERN = /^[A-Za-z][A-Za-z0-9._-]*$/;\n\nfunction getIndentLevel(line: string): number {\n const match = line.match(/^\\s*/);\n return match ? match[0].length / 2 : 0;\n}\n\nfunction getIdValueSpan(\n lineContent: string,\n indent: number,\n lineNumber: number,\n lineOffset: number,\n tokenLength: number,\n valueLength: number\n): SourceSpan | undefined {\n if (valueLength <= 0) {\n return undefined;\n }\n\n let cursor = tokenLength;\n while (cursor < lineContent.length && /\\s/.test(lineContent[cursor])) {\n cursor++;\n }\n if (lineContent[cursor] === \":\" || lineContent[cursor] === \"=\") {\n cursor++;\n while (cursor < lineContent.length && /\\s/.test(lineContent[cursor])) {\n cursor++;\n }\n }\n\n const column = indent + cursor + 1;\n return createSpan(lineNumber, column, valueLength, lineOffset);\n}\n\ninterface TemplateHeader {\n id: string;\n rawId: string;\n span?: SourceSpan;\n bodyStartIndex: number;\n}\n\nexport function parse(source: string, options: ParseOptions = {}): ParseResult {\n const diagnostics: Diagnostic[] = [];\n const templates: TemplateUnit[] = [];\n\n const normalized = source.replace(/\\r\\n?/g, \"\\n\");\n const lines = normalized.split(\"\\n\");\n const lineOffsets = buildLineOffsets(lines);\n\n let currentHeader: TemplateHeader | null = null;\n let sawIdBlock = false;\n const seenIds = new Map<string, SourceSpan | undefined>();\n\n const finalizeTemplate = (endIndex: number): void => {\n if (!currentHeader) {\n return;\n }\n const result = parseTemplateBlock(lines, lineOffsets, currentHeader.bodyStartIndex, endIndex, options);\n const prefixedDiagnostics = prefixDiagnostics(result.diagnostics, currentHeader.id);\n const unit: TemplateUnit = {\n id: currentHeader.id,\n rawId: currentHeader.rawId,\n span: currentHeader.span,\n ast: result.root,\n diagnostics: prefixedDiagnostics\n };\n templates.push(unit);\n diagnostics.push(...prefixedDiagnostics);\n currentHeader = null;\n };\n\n for (let i = 0; i < lines.length; i++) {\n const rawLine = lines[i];\n const lineNumber = i + 1;\n const lineOffset = lineOffsets[i];\n\n if (/^\\s*$/.test(rawLine)) {\n continue;\n }\n\n const indentMatch = rawLine.match(/^\\s*/) ?? [\"\"];\n const indent = indentMatch[0].length;\n const lineContent = rawLine.slice(indent);\n const trimmed = lineContent.trimEnd();\n\n const idMatch = trimmed.match(/^#id\\b(.*)$/);\n if (idMatch) {\n if (indent !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE701\",\n \"#id directives must appear at the top level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n\n finalizeTemplate(i);\n sawIdBlock = true;\n\n const remainderRaw = idMatch[1] ?? \"\";\n if (remainderRaw && !/^[\\s:=]/.test(remainderRaw)) {\n pushDiag(\n diagnostics,\n \"COLLIE702\",\n 'Invalid #id directive syntax. Use \"#id <id>\".',\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n }\n let valuePart = remainderRaw.trim();\n if (valuePart.startsWith(\"=\") || valuePart.startsWith(\":\")) {\n valuePart = valuePart.slice(1).trim();\n }\n\n const valueSpan = getIdValueSpan(\n lineContent,\n indent,\n lineNumber,\n lineOffset,\n \"#id\".length,\n valuePart.length\n );\n const valueColumn = valueSpan?.start.col ?? indent + 1;\n const valueLength = valueSpan ? valuePart.length : trimmed.length;\n\n if (!valuePart) {\n pushDiag(\n diagnostics,\n \"COLLIE702\",\n \"#id directives must specify an identifier value.\",\n lineNumber,\n valueColumn,\n lineOffset,\n valueLength\n );\n } else if (!TEMPLATE_ID_PATTERN.test(valuePart)) {\n pushDiag(\n diagnostics,\n \"COLLIE702\",\n 'Invalid #id value. IDs must match \"^[A-Za-z][A-Za-z0-9._-]*$\".',\n lineNumber,\n valueColumn,\n lineOffset,\n valueLength\n );\n }\n\n if (valuePart && TEMPLATE_ID_PATTERN.test(valuePart)) {\n const previous = seenIds.get(valuePart);\n if (previous) {\n const previousLine = previous.start.line;\n pushDiag(\n diagnostics,\n \"COLLIE703\",\n `Duplicate #id \"${valuePart}\" (first declared on line ${previousLine}).`,\n lineNumber,\n valueColumn,\n lineOffset,\n valueLength\n );\n } else {\n seenIds.set(valuePart, valueSpan);\n }\n }\n\n currentHeader = {\n id: valuePart,\n rawId: valuePart,\n span: valueSpan,\n bodyStartIndex: i + 1\n };\n continue;\n }\n\n if (!sawIdBlock && !currentHeader) {\n pushDiag(\n diagnostics,\n \"COLLIE701\",\n \"Content before the first #id block is not allowed.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n }\n }\n\n finalizeTemplate(lines.length);\n\n if (!sawIdBlock) {\n pushDiag(\n diagnostics,\n \"COLLIE701\",\n \"A .collie file must contain at least one #id block.\",\n 1,\n 1,\n 0\n );\n }\n\n return { templates, diagnostics };\n}\n\nfunction parseTemplateBlock(\n lines: string[],\n lineOffsets: number[],\n startIndex: number,\n endIndex: number,\n options: ParseOptions\n): { root: RootNode; diagnostics: Diagnostic[] } {\n const diagnostics: Diagnostic[] = [];\n const root: RootNode = { type: \"Root\", children: [] };\n const stack: StackItem[] = [{ node: root, level: -1 }];\n let propsBlockLevel: number | null = null;\n let classesBlockLevel: number | null = null;\n let sawTopLevelTemplateNode = false;\n const conditionalChains = new Map<number, ConditionalChainState>();\n const branchLocations: BranchLocation[] = [];\n\n let i = startIndex;\n\n while (i < endIndex) {\n const rawLine = lines[i];\n const lineNumber = i + 1;\n const lineOffset = lineOffsets[i];\n i++;\n\n if (/^\\s*$/.test(rawLine)) {\n continue;\n }\n\n const tabIndex = rawLine.indexOf(\"\\t\");\n if (tabIndex !== -1) {\n pushDiag(\n diagnostics,\n \"COLLIE001\",\n \"Tabs are not allowed; use spaces for indentation.\",\n lineNumber,\n tabIndex + 1,\n lineOffset\n );\n continue;\n }\n\n const indentMatch = rawLine.match(/^\\s*/) ?? [\"\"];\n const indent = indentMatch[0].length;\n const lineContent = rawLine.slice(indent);\n const trimmed = lineContent.trimEnd();\n\n if (indent % 2 !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE002\",\n \"Indentation must be multiples of two spaces.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n continue;\n }\n\n let level = indent / 2;\n\n if (propsBlockLevel !== null && level <= propsBlockLevel) {\n propsBlockLevel = null;\n }\n if (classesBlockLevel !== null && level <= classesBlockLevel) {\n classesBlockLevel = null;\n }\n\n const isInPropsBlock = propsBlockLevel !== null && level > propsBlockLevel;\n const isInClassesBlock = classesBlockLevel !== null && level > classesBlockLevel;\n\n while (stack.length > 1 && stack[stack.length - 1].level >= level) {\n stack.pop();\n }\n\n const parentLevel = stack[stack.length - 1].level;\n if (level > parentLevel + 1 && !isInPropsBlock && !isInClassesBlock) {\n pushDiag(\n diagnostics,\n \"COLLIE003\",\n \"Indentation jumped more than one level.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n level = parentLevel + 1;\n }\n\n cleanupConditionalChains(conditionalChains, level);\n const isElseIfLine = /^@elseIf\\b/.test(trimmed);\n const isElseLine = /^@else\\b/.test(trimmed) && !isElseIfLine;\n if (!isElseIfLine && !isElseLine) {\n conditionalChains.delete(level);\n }\n\n if (trimmed === \"classes\") {\n if (level !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE301\",\n \"Classes block must be at the top level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (sawTopLevelTemplateNode) {\n pushDiag(\n diagnostics,\n \"COLLIE302\",\n \"Classes block must appear before any template nodes.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n if (!root.classAliases) {\n root.classAliases = { aliases: [] };\n }\n classesBlockLevel = level;\n }\n continue;\n }\n\n if (trimmed === \"props\") {\n pushDiag(\n diagnostics,\n \"COLLIE103\",\n \"`props` must be declared using `#props`.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n if (level === 0) {\n propsBlockLevel = level;\n }\n continue;\n }\n\n if (trimmed === \"#props\") {\n if (level !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE102\",\n \"#props block must be at the top level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (root.props) {\n pushDiag(\n diagnostics,\n \"COLLIE101\",\n \"Only one #props block is allowed per #id.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n root.props = { fields: [] };\n }\n if (level === 0) {\n propsBlockLevel = level;\n }\n continue;\n }\n\n if (trimmed === \"@client\") {\n if (level !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE401\",\n \"@client must appear at the top level before any other blocks.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (sawTopLevelTemplateNode) {\n pushDiag(\n diagnostics,\n \"COLLIE401\",\n \"@client must appear before any template nodes.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (root.clientComponent) {\n pushDiag(\n diagnostics,\n \"COLLIE402\",\n \"@client can only appear once per file.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n root.clientComponent = true;\n }\n continue;\n }\n\n if (propsBlockLevel !== null && level > propsBlockLevel) {\n if (level !== propsBlockLevel + 1) {\n pushDiag(\n diagnostics,\n \"COLLIE102\",\n \"#props lines must be indented two spaces under the #props header.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n continue;\n }\n\n // const field = parsePropsField(trimmed, lineNumber, indent + 1, lineOffset, diagnostics);\n // if (field && root.props) {\n // root.props.fields.push(field);\n // }\n continue;\n }\n\n if (classesBlockLevel !== null && level > classesBlockLevel) {\n if (level !== classesBlockLevel + 1) {\n pushDiag(\n diagnostics,\n \"COLLIE303\",\n \"Classes lines must be indented two spaces under the classes header.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n continue;\n }\n\n const alias = parseClassAliasLine(trimmed, lineNumber, indent + 1, lineOffset, diagnostics);\n if (alias && root.classAliases) {\n root.classAliases.aliases.push(alias);\n }\n continue;\n }\n\n const parent = stack[stack.length - 1].node;\n\n if (trimmed.startsWith(\"@for\")) {\n const forHeader = parseForHeader(\n lineContent,\n lineNumber,\n indent + 1,\n lineOffset,\n diagnostics\n );\n if (!forHeader) {\n continue;\n }\n const forNode: ForNode = {\n type: \"For\",\n itemName: forHeader.itemName,\n arrayExpr: forHeader.arrayExpr,\n body: [],\n token: forHeader.token,\n tokenSpan: forHeader.tokenSpan,\n arrayExprSpan: forHeader.arrayExprSpan\n };\n addChildToParent(parent, forNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n stack.push({ node: forNode, level });\n continue;\n }\n\n if (trimmed.startsWith(\"@if\")) {\n const header = parseConditionalHeader(\n \"if\",\n lineContent,\n lineNumber,\n indent + 1,\n lineOffset,\n diagnostics\n );\n if (!header) {\n continue;\n }\n const chain: ConditionalNode = { type: \"Conditional\", branches: [] };\n const branch: ConditionalBranch = {\n kind: \"if\",\n test: header.test,\n body: [],\n token: header.token,\n tokenSpan: header.tokenSpan,\n testSpan: header.testSpan\n };\n chain.branches.push(branch);\n addChildToParent(parent, chain);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n conditionalChains.set(level, { node: chain, level, hasElse: false });\n branchLocations.push({\n branch,\n line: lineNumber,\n column: indent + 1,\n lineOffset,\n length: header.directiveLength\n });\n if (header.inlineBody) {\n const inlineNode = parseInlineNode(\n header.inlineBody,\n lineNumber,\n header.inlineColumn ?? indent + 1,\n lineOffset,\n diagnostics\n );\n if (inlineNode) {\n branch.body.push(inlineNode);\n }\n } else {\n stack.push({ node: createConditionalBranchContext(chain, branch), level });\n }\n continue;\n }\n\n if (isElseIfLine) {\n const chain = conditionalChains.get(level);\n if (!chain) {\n pushDiag(\n diagnostics,\n \"COLLIE205\",\n \"@elseIf must follow an @if at the same indentation level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n if (chain.hasElse) {\n pushDiag(\n diagnostics,\n \"COLLIE207\",\n \"@elseIf cannot appear after an @else in the same chain.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n const header = parseConditionalHeader(\n \"elseIf\",\n lineContent,\n lineNumber,\n indent + 1,\n lineOffset,\n diagnostics\n );\n if (!header) {\n continue;\n }\n const branch: ConditionalBranch = {\n kind: \"elseIf\",\n test: header.test,\n body: [],\n token: header.token,\n tokenSpan: header.tokenSpan,\n testSpan: header.testSpan\n };\n chain.node.branches.push(branch);\n branchLocations.push({\n branch,\n line: lineNumber,\n column: indent + 1,\n lineOffset,\n length: header.directiveLength\n });\n if (header.inlineBody) {\n const inlineNode = parseInlineNode(\n header.inlineBody,\n lineNumber,\n header.inlineColumn ?? indent + 1,\n lineOffset,\n diagnostics\n );\n if (inlineNode) {\n branch.body.push(inlineNode);\n }\n } else {\n stack.push({ node: createConditionalBranchContext(chain.node, branch), level });\n }\n continue;\n }\n\n if (isElseLine) {\n const chain = conditionalChains.get(level);\n if (!chain) {\n pushDiag(\n diagnostics,\n \"COLLIE206\",\n \"@else must follow an @if at the same indentation level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n if (chain.hasElse) {\n pushDiag(\n diagnostics,\n \"COLLIE203\",\n \"An @if chain can only have one @else branch.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n const header = parseElseHeader(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (!header) {\n continue;\n }\n const branch: ConditionalBranch = {\n kind: \"else\",\n test: undefined,\n body: [],\n token: header.token,\n tokenSpan: header.tokenSpan\n };\n chain.node.branches.push(branch);\n chain.hasElse = true;\n branchLocations.push({\n branch,\n line: lineNumber,\n column: indent + 1,\n lineOffset,\n length: header.directiveLength\n });\n if (header.inlineBody) {\n const inlineNode = parseInlineNode(\n header.inlineBody,\n lineNumber,\n header.inlineColumn ?? indent + 1,\n lineOffset,\n diagnostics\n );\n if (inlineNode) {\n branch.body.push(inlineNode);\n }\n } else {\n stack.push({ node: createConditionalBranchContext(chain.node, branch), level });\n }\n continue;\n }\n\n const slotMatch = trimmed.match(/^@([A-Za-z_][A-Za-z0-9_]*)$/);\n if (slotMatch) {\n const slotName = slotMatch[1];\n if (!isComponentNode(parent)) {\n pushDiag(\n diagnostics,\n \"COLLIE501\",\n `Slot '${slotName}' must be a direct child of a component.`,\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n stack.push({ node: createStandaloneSlotContext(slotName), level });\n continue;\n }\n\n if (!parent.slots) {\n parent.slots = [];\n }\n const existing = parent.slots.find((slot) => slot.name === slotName);\n const slotBlock: SlotBlock =\n existing ??\n {\n type: \"Slot\",\n name: slotName,\n children: []\n };\n if (!existing) {\n parent.slots.push(slotBlock);\n } else {\n pushDiag(\n diagnostics,\n \"COLLIE503\",\n `Duplicate slot '${slotName}' inside ${parent.name}.`,\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n }\n stack.push({ node: createSlotContext(parent, slotBlock), level });\n continue;\n }\n\n if (trimmed.startsWith(\"@\")) {\n pushDiag(\n diagnostics,\n \"COLLIE502\",\n \"Invalid slot syntax. Use @slotName on its own line.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n const fallbackName = trimmed.slice(1).split(/\\s+/)[0] || \"slot\";\n stack.push({ node: createStandaloneSlotContext(fallbackName), level });\n continue;\n }\n\n if (lineContent.startsWith(\"=\")) {\n // Check if this starts a multiline JSX block\n const payload = lineContent.slice(1).trim();\n \n // If it's a function or expression that starts with ( or <, collect multiline content\n if (payload.endsWith(\"(\") || payload.endsWith(\"<\") || (i < endIndex && level < getIndentLevel(lines[i]))) {\n // Collect all indented children\n let jsxContent = payload;\n while (i < endIndex) {\n const nextRaw = lines[i];\n const nextIndent = getIndentLevel(nextRaw);\n const nextTrimmed = nextRaw.trim();\n \n // Include lines that are:\n // 1. More indented than the = line (children)\n // 2. At the same level but are just closing parens/braces\n if (nextIndent > level && nextTrimmed.length > 0) {\n jsxContent += \"\\n\" + nextRaw;\n i++;\n } else if (nextIndent === level && /^[)\\]}]+$/.test(nextTrimmed)) {\n // Include closing parens/braces at the same level\n jsxContent += \"\\n\" + nextRaw;\n i++;\n // After the closing paren, we're done\n break;\n } else {\n break;\n }\n }\n \n const jsxNode: JSXPassthroughNode = {\n type: \"JSXPassthrough\",\n expression: jsxContent\n };\n addChildToParent(parent, jsxNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n continue;\n }\n \n const jsxNode = parseJSXPassthrough(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (jsxNode) {\n addChildToParent(parent, jsxNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n if (lineContent.startsWith(\"|\")) {\n const textNode = parseTextLine(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (textNode) {\n addChildToParent(parent, textNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n if (lineContent.startsWith(\"{{\")) {\n const exprNode = parseExpressionLine(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (exprNode) {\n addChildToParent(parent, exprNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n // Check if this line starts an element/component with potential multiline attributes\n let fullLine = trimmed;\n let multilineEnd = i;\n \n if (trimmed.includes(\"(\") && !trimmed.includes(\")\")) {\n // Multiline attributes - collect subsequent lines\n let parenDepth = (trimmed.match(/\\(/g) || []).length - (trimmed.match(/\\)/g) || []).length;\n while (multilineEnd < endIndex && parenDepth > 0) {\n const nextRaw = lines[multilineEnd];\n multilineEnd++;\n fullLine += \"\\n\" + nextRaw;\n parenDepth += (nextRaw.match(/\\(/g) || []).length - (nextRaw.match(/\\)/g) || []).length;\n }\n // Update i to skip the lines we consumed\n i = multilineEnd;\n }\n\n const elementResult = parseElementWithInfo(fullLine, lineNumber, indent + 1, lineOffset, diagnostics);\n if (!elementResult) {\n // Try parsing as text if element parsing failed\n const textNode = parseTextPayload(trimmed, lineNumber, indent + 1, lineOffset, diagnostics);\n if (textNode && textNode.parts.length > 0) {\n addChildToParent(parent, textNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n const element = elementResult.node;\n let hasIndentedAttributeLines = false;\n if ((element.type === \"Element\" || element.type === \"Component\") && element.children.length === 0) {\n const indentedAttributes = collectIndentedAttributeLines(\n lines,\n lineOffsets,\n i,\n endIndex,\n level,\n diagnostics\n );\n if (indentedAttributes.attributes.length > 0) {\n element.attributes.push(...indentedAttributes.attributes);\n hasIndentedAttributeLines = true;\n }\n i = indentedAttributes.nextIndex;\n }\n\n addChildToParent(parent, element);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n stack.push({ node: element, level });\n if (hasIndentedAttributeLines) {\n // Treat attribute-only lines as an intermediate indent step for children.\n stack.push({ node: element, level: level + 1 });\n }\n }\n\n if (root.classAliases) {\n validateClassAliasDefinitions(root.classAliases, diagnostics);\n }\n validateClassAliasUsages(root, diagnostics);\n\n for (const info of branchLocations) {\n if (info.branch.body.length === 0) {\n pushDiag(\n diagnostics,\n \"COLLIE208\",\n \"Conditional branches must include an inline body or indented block.\",\n info.line,\n info.column,\n info.lineOffset,\n info.length || 3\n );\n }\n }\n\n if (options.dialect) {\n diagnostics.push(...enforceDialect(root, options.dialect));\n diagnostics.push(...enforceProps(root, options.dialect.props));\n }\n\n return { root, diagnostics };\n}\n\nfunction buildLineOffsets(lines: string[]): number[] {\n const offsets: number[] = [];\n let offset = 0;\n for (const line of lines) {\n offsets.push(offset);\n offset += line.length + 1;\n }\n return offsets;\n}\n\nfunction prefixDiagnostics(diagnostics: Diagnostic[], templateId?: string): Diagnostic[] {\n if (!templateId) {\n return diagnostics;\n }\n const prefix = `In template \"${templateId}\": `;\n return diagnostics.map((diag) => {\n if (diag.message.startsWith(prefix)) {\n return diag;\n }\n return { ...diag, message: `${prefix}${diag.message}` };\n });\n}\n\nfunction cleanupConditionalChains(state: Map<number, ConditionalChainState>, level: number): void {\n for (const key of Array.from(state.keys())) {\n if (key > level) {\n state.delete(key);\n }\n }\n}\n\nfunction addChildToParent(parent: ParentNode, child: Node): void {\n if (isForParent(parent)) {\n parent.body.push(child);\n } else {\n parent.children.push(child);\n }\n}\n\nfunction isForParent(parent: ParentNode): parent is ForNode {\n return \"type\" in parent && parent.type === \"For\";\n}\n\nfunction isComponentNode(parent: ParentNode): parent is ComponentNode {\n return \"type\" in parent && parent.type === \"Component\";\n}\n\ninterface ConditionalHeaderResult {\n test?: string;\n inlineBody?: string;\n inlineColumn?: number;\n directiveLength: number;\n token: string;\n tokenSpan?: SourceSpan;\n testSpan?: SourceSpan;\n}\n\nfunction parseConditionalHeader(\n kind: \"if\" | \"elseIf\",\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ConditionalHeaderResult | null {\n const trimmed = lineContent.trimEnd();\n const token = kind === \"if\" ? \"@if\" : \"@elseIf\";\n if (!trimmed.startsWith(token)) {\n pushDiag(\n diagnostics,\n \"COLLIE201\",\n kind === \"if\" ? \"Invalid @if syntax. Use @if <condition>.\" : \"Invalid @elseIf syntax. Use @elseIf <condition>.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || token.length\n );\n return null;\n }\n const tokenSpan = createSpan(lineNumber, column, token.length, lineOffset);\n const remainder = trimmed.slice(token.length);\n if (!remainder.trim()) {\n pushDiag(\n diagnostics,\n \"COLLIE201\",\n kind === \"if\" ? \"@if condition cannot be empty.\" : \"@elseIf condition cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || token.length\n );\n return null;\n }\n\n const remainderTrimmed = remainder.trimStart();\n const usesParens = remainderTrimmed.startsWith(\"(\");\n let testRaw = \"\";\n let remainderRaw = \"\";\n\n if (usesParens) {\n const openIndex = trimmed.indexOf(\"(\", token.length);\n const closeIndex = trimmed.lastIndexOf(\")\");\n if (openIndex === -1 || closeIndex <= openIndex) {\n pushDiag(\n diagnostics,\n \"COLLIE201\",\n kind === \"if\" ? \"Invalid @if syntax. Use @if <condition>.\" : \"Invalid @elseIf syntax. Use @elseIf <condition>.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || token.length\n );\n return null;\n }\n testRaw = trimmed.slice(openIndex + 1, closeIndex);\n remainderRaw = trimmed.slice(closeIndex + 1);\n } else {\n testRaw = remainderTrimmed;\n remainderRaw = \"\";\n }\n\n const test = testRaw.trim();\n if (!test) {\n pushDiag(\n diagnostics,\n \"COLLIE201\",\n kind === \"if\" ? \"@if condition cannot be empty.\" : \"@elseIf condition cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 3\n );\n return null;\n }\n const testLeadingWhitespace = testRaw.length - testRaw.trimStart().length;\n const testColumn = usesParens\n ? column + trimmed.indexOf(\"(\", token.length) + 1 + testLeadingWhitespace\n : column + token.length + (remainder.length - remainder.trimStart().length) + testLeadingWhitespace;\n const testSpan = createSpan(lineNumber, testColumn, test.length, lineOffset);\n const inlineBody = remainderRaw.trim();\n const remainderOffset = trimmed.length - remainderRaw.length;\n const leadingWhitespace = remainderRaw.length - inlineBody.length;\n const inlineColumn =\n inlineBody.length > 0 ? column + remainderOffset + leadingWhitespace : undefined;\n return {\n test,\n inlineBody: inlineBody.length ? inlineBody : undefined,\n inlineColumn,\n directiveLength: trimmed.length || 3,\n token,\n tokenSpan,\n testSpan\n };\n}\n\nfunction parseElseHeader(\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ConditionalHeaderResult | null {\n const trimmed = lineContent.trimEnd();\n const match = trimmed.match(/^@else\\b(.*)$/);\n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE203\",\n \"Invalid @else syntax.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n const token = \"@else\";\n const tokenSpan = createSpan(lineNumber, column, token.length, lineOffset);\n const remainderRaw = match[1] ?? \"\";\n const inlineBody = remainderRaw.trim();\n const remainderOffset = trimmed.length - remainderRaw.length;\n const leadingWhitespace = remainderRaw.length - inlineBody.length;\n const inlineColumn =\n inlineBody.length > 0 ? column + remainderOffset + leadingWhitespace : undefined;\n return {\n inlineBody: inlineBody.length ? inlineBody : undefined,\n inlineColumn,\n directiveLength: trimmed.length || 4,\n token,\n tokenSpan\n };\n}\n\ninterface ForHeaderResult {\n itemName: string;\n arrayExpr: string;\n token: string;\n tokenSpan?: SourceSpan;\n arrayExprSpan?: SourceSpan;\n}\n\nfunction parseForHeader(\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ForHeaderResult | null {\n const trimmed = lineContent.trimEnd();\n const match = trimmed.match(/^@for\\s+([A-Za-z_][A-Za-z0-9_]*)\\s+in\\s+(.+)$/);\n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"Invalid @for syntax. Use @for itemName in arrayExpr.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n const token = \"@for\";\n const tokenSpan = createSpan(lineNumber, column, token.length, lineOffset);\n const itemName = match[1];\n const arrayExprRaw = match[2];\n if (!itemName || !arrayExprRaw) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"Invalid @for syntax. Use @for itemName in arrayExpr.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n const arrayExpr = arrayExprRaw.trim();\n if (!arrayExpr) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"@for array expression cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n const arrayExprLeadingWhitespace = arrayExprRaw.length - arrayExprRaw.trimStart().length;\n const arrayExprStart = trimmed.length - arrayExprRaw.length;\n const arrayExprColumn = column + arrayExprStart + arrayExprLeadingWhitespace;\n const arrayExprSpan = createSpan(lineNumber, arrayExprColumn, arrayExpr.length, lineOffset);\n return { itemName, arrayExpr, token, tokenSpan, arrayExprSpan };\n}\n\nfunction parseInlineNode(\n source: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): Node | null {\n const trimmed = source.trim();\n if (!trimmed) {\n return null;\n }\n\n if (trimmed.startsWith(\"|\")) {\n return parseTextLine(trimmed, lineNumber, column, lineOffset, diagnostics);\n }\n\n if (trimmed.startsWith(\"{{\")) {\n return parseExpressionLine(trimmed, lineNumber, column, lineOffset, diagnostics);\n }\n\n if (trimmed.startsWith(\"@\")) {\n pushDiag(\n diagnostics,\n \"COLLIE209\",\n \"Inline conditional bodies may only contain elements, text, or expressions.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length\n );\n return null;\n }\n\n return parseElement(trimmed, lineNumber, column, lineOffset, diagnostics);\n}\n\nfunction createConditionalBranchContext(\n owner: ConditionalNode,\n branch: ConditionalBranch\n): ConditionalBranchContext {\n return {\n kind: \"ConditionalBranch\",\n owner,\n branch,\n children: branch.body\n };\n}\n\nfunction createSlotContext(owner: ComponentNode, slot: SlotBlock): SlotContext {\n return {\n kind: \"Slot\",\n owner,\n slot,\n children: slot.children\n };\n}\n\nfunction createStandaloneSlotContext(name: string): SlotContext {\n const owner: ComponentNode = {\n type: \"Component\",\n name: \"__invalid_slot__\",\n attributes: [],\n children: []\n };\n const slot: SlotBlock = { type: \"Slot\", name, children: [] };\n return createSlotContext(owner, slot);\n}\n\nfunction parseTextLine(\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): TextNode | null {\n const trimmed = lineContent.trimEnd();\n let payload = trimmed;\n let payloadColumn = column;\n\n if (payload.startsWith(\"|\")) {\n payload = payload.slice(1);\n payloadColumn += 1;\n\n if (payload.startsWith(\" \")) {\n payload = payload.slice(1);\n payloadColumn += 1;\n }\n }\n\n return parseTextPayload(payload, lineNumber, payloadColumn, lineOffset, diagnostics);\n}\n\nfunction parseTextPayload(\n payload: string,\n lineNumber: number,\n payloadColumn: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): TextNode | null {\n const parts: TextNode[\"parts\"] = [];\n let cursor = 0;\n let textBuffer = \"\";\n\n const flushText = (): void => {\n if (textBuffer.length) {\n parts.push({ type: \"text\", value: textBuffer });\n textBuffer = \"\";\n }\n };\n\n while (cursor < payload.length) {\n const ch = payload[cursor];\n\n if (ch === \"{\") {\n flushText();\n if (payload[cursor + 1] === \"{\") {\n const exprStart = cursor;\n const exprEnd = payload.indexOf(\"}}\", cursor + 2);\n if (exprEnd === -1) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression must end with }}.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset\n );\n textBuffer += payload.slice(exprStart);\n break;\n }\n const inner = payload.slice(exprStart + 2, exprEnd).trim();\n if (!inner) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression cannot be empty.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset,\n exprEnd - exprStart\n );\n } else {\n const innerRaw = payload.slice(exprStart + 2, exprEnd);\n const leadingWhitespace = innerRaw.length - innerRaw.trimStart().length;\n const exprColumn = payloadColumn + exprStart + 2 + leadingWhitespace;\n parts.push({\n type: \"expr\",\n value: inner,\n span: createSpan(lineNumber, exprColumn, inner.length, lineOffset)\n });\n }\n cursor = exprEnd + 2;\n continue;\n }\n\n const exprStart = cursor;\n const exprEnd = payload.indexOf(\"}\", cursor + 1);\n if (exprEnd === -1) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression must end with }.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset\n );\n textBuffer += payload.slice(exprStart);\n break;\n }\n const inner = payload.slice(exprStart + 1, exprEnd).trim();\n if (!inner) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression cannot be empty.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset,\n exprEnd - exprStart\n );\n } else {\n const innerRaw = payload.slice(exprStart + 1, exprEnd);\n const leadingWhitespace = innerRaw.length - innerRaw.trimStart().length;\n const exprColumn = payloadColumn + exprStart + 1 + leadingWhitespace;\n parts.push({\n type: \"expr\",\n value: inner,\n span: createSpan(lineNumber, exprColumn, inner.length, lineOffset)\n });\n }\n cursor = exprEnd + 1;\n continue;\n }\n\n if (ch === \"}\") {\n flushText();\n if (payload[cursor + 1] === \"}\") {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression closing }} must follow an opening {{.\",\n lineNumber,\n payloadColumn + cursor,\n lineOffset,\n 2\n );\n cursor += 2;\n continue;\n }\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression closing } must follow an opening {.\",\n lineNumber,\n payloadColumn + cursor,\n lineOffset\n );\n cursor += 1;\n continue;\n }\n\n textBuffer += ch;\n cursor += 1;\n }\n\n flushText();\n\n return { type: \"Text\", parts };\n}\n\nfunction parseExpressionLine(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ExpressionNode | null {\n const trimmed = line.trimEnd();\n const closeIndex = trimmed.indexOf(\"}}\");\n if (closeIndex === -1) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Expression lines must end with }}.\",\n lineNumber,\n column,\n lineOffset\n );\n return null;\n }\n\n if (trimmed.slice(closeIndex + 2).trim().length) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Expression lines cannot contain text after the closing }}.\",\n lineNumber,\n column + closeIndex + 2,\n lineOffset\n );\n return null;\n }\n\n const inner = trimmed.slice(2, closeIndex).trim();\n if (!inner) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Expression cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n closeIndex + 2\n );\n return null;\n }\n const innerRaw = trimmed.slice(2, closeIndex);\n const leadingWhitespace = innerRaw.length - innerRaw.trimStart().length;\n const exprColumn = column + 2 + leadingWhitespace;\n return {\n type: \"Expression\",\n value: inner,\n span: createSpan(lineNumber, exprColumn, inner.length, lineOffset)\n };\n}\n\nfunction parseJSXPassthrough(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): JSXPassthroughNode | null {\n if (!line.startsWith(\"=\")) {\n return null;\n }\n \n const payload = line.slice(1).trim();\n if (!payload) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"JSX passthrough expression cannot be empty.\",\n lineNumber,\n column,\n lineOffset\n );\n return null;\n }\n\n const rawPayload = line.slice(1);\n const leadingWhitespace = rawPayload.length - rawPayload.trimStart().length;\n const exprColumn = column + 1 + leadingWhitespace;\n\n return {\n type: \"JSXPassthrough\",\n expression: payload,\n span: createSpan(lineNumber, exprColumn, payload.length, lineOffset)\n };\n}\n\n// function parsePropsField(\n// line: string,\n// lineNumber: number,\n// column: number,\n// lineOffset: number,\n// diagnostics: Diagnostic[]\n// ): PropsField | null {\n// const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)(\\??)\\s*:\\s*(.+)$/);\n// if (!match) {\n// pushDiag(\n// diagnostics,\n// \"COLLIE102\",\n// \"Props lines must be in the form `name[:?] Type`.\",\n// lineNumber,\n// column,\n// lineOffset,\n// Math.max(line.length, 1)\n// );\n// return null;\n// }\n\n// const [, name, optionalFlag, typePart] = match;\n// const typeText = typePart.trim();\n// if (!typeText) {\n// pushDiag(\n// diagnostics,\n// \"COLLIE102\",\n// \"Props lines must provide a type after the colon.\",\n// lineNumber,\n// column,\n// lineOffset,\n// Math.max(line.length, 1)\n// );\n// return null;\n// }\n\n// return {\n// name,\n// optional: optionalFlag === \"?\",\n// typeText,\n// span: createSpan(lineNumber, column, Math.max(line.length, 1), lineOffset)\n// };\n// }\n\nfunction parseClassAliasLine(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ClassAliasDecl | null {\n const match = line.match(/^([^=]+?)\\s*=\\s*(.+)$/);\n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE304\",\n \"Classes lines must be in the form `name = class.tokens`.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(line.length, 1)\n );\n return null;\n }\n\n const rawName = match[1].trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(rawName)) {\n pushDiag(\n diagnostics,\n \"COLLIE305\",\n `Class alias name '${rawName}' must be a valid identifier.`,\n lineNumber,\n column,\n lineOffset,\n Math.max(rawName.length, 1)\n );\n return null;\n }\n\n const rhs = match[2];\n const rhsIndex = line.indexOf(rhs);\n const rhsColumn = rhsIndex >= 0 ? column + rhsIndex : column;\n const classes = parseAliasClasses(rhs, lineNumber, rhsColumn, lineOffset, diagnostics);\n if (!classes.length) {\n return null;\n }\n\n const nameIndex = line.indexOf(rawName);\n const nameColumn = nameIndex >= 0 ? column + nameIndex : column;\n const span = createSpan(lineNumber, nameColumn, rawName.length, lineOffset);\n\n return { name: rawName, classes, span };\n}\n\nfunction parseAliasClasses(\n rhs: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): string[] {\n const trimmed = rhs.trim();\n if (!trimmed) {\n pushDiag(\n diagnostics,\n \"COLLIE304\",\n \"Classes lines must provide one or more class tokens after '='.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(rhs.length, 1)\n );\n return [];\n }\n\n const withoutDotPrefix = trimmed.startsWith(\".\") ? trimmed.slice(1) : trimmed;\n const parts = withoutDotPrefix.split(\".\");\n const classes: string[] = [];\n for (const part of parts) {\n const token = part.trim();\n if (!token) {\n pushDiag(\n diagnostics,\n \"COLLIE304\",\n \"Classes lines must provide one or more class tokens after '='.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(rhs.length, 1)\n );\n return [];\n }\n classes.push(token);\n }\n\n return classes;\n}\n\nfunction validateClassAliasDefinitions(\n classAliases: ClassAliasesDecl,\n diagnostics: Diagnostic[]\n): void {\n const seen = new Map<string, ClassAliasDecl>();\n for (const alias of classAliases.aliases) {\n const previous = seen.get(alias.name);\n if (previous) {\n if (alias.span) {\n diagnostics.push({\n severity: \"error\",\n code: \"COLLIE306\",\n message: `Duplicate class alias '${alias.name}'.`,\n span: alias.span\n });\n } else {\n pushDiag(diagnostics, \"COLLIE306\", `Duplicate class alias '${alias.name}'.`, 1, 1, 0);\n }\n continue;\n }\n seen.set(alias.name, alias);\n }\n}\n\nfunction validateClassAliasUsages(root: RootNode, diagnostics: Diagnostic[]): void {\n const defined = new Set<string>(root.classAliases?.aliases.map((alias) => alias.name) ?? []);\n for (const child of root.children) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n}\n\nfunction validateNodeClassAliases(\n node: Node,\n defined: Set<string>,\n diagnostics: Diagnostic[]\n): void {\n if (node.type === \"Element\" || node.type === \"Component\") {\n const spans = node.type === \"Element\" ? (node.classSpans ?? []) : [];\n const classes = node.type === \"Element\" ? node.classes : [];\n classes.forEach((cls, index) => {\n const match = cls.match(/^\\$([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) {\n return;\n }\n const aliasName = match[1];\n if (defined.has(aliasName)) {\n return;\n }\n const span = spans[index];\n if (span) {\n diagnostics.push({\n severity: \"error\",\n code: \"COLLIE307\",\n message: `Undefined class alias '${aliasName}'.`,\n span\n });\n } else {\n pushDiag(diagnostics, \"COLLIE307\", `Undefined class alias '${aliasName}'.`, 1, 1, 0);\n }\n });\n for (const child of node.children) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n if (node.type === \"Component\" && node.slots) {\n for (const slot of node.slots) {\n for (const child of slot.children) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n }\n }\n return;\n }\n\n if (node.type === \"Conditional\") {\n for (const branch of node.branches) {\n for (const child of branch.body) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n }\n }\n\n if (node.type === \"For\") {\n for (const child of node.body) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n }\n}\n\ninterface ParsedElementResult {\n node: ElementNode | ComponentNode;\n hasAttributeGroup: boolean;\n}\n\ninterface AttributeTokenParseResult {\n attributes: Attribute[];\n rest: string;\n restColumn: number;\n}\n\nfunction parseAttributeTokensFromStart(\n source: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): AttributeTokenParseResult | null {\n let remaining = source;\n let consumed = 0;\n let parsedAny = false;\n const attributes: Attribute[] = [];\n\n while (remaining.length > 0) {\n if (!/^([A-Za-z][A-Za-z0-9_-]*)\\s*=/.test(remaining)) {\n break;\n }\n parsedAny = true;\n const before = remaining;\n const next = parseAndAddAttribute(\n remaining,\n attributes,\n diagnostics,\n lineNumber,\n column + consumed,\n lineOffset\n );\n if (next.length === before.length) {\n break;\n }\n consumed += before.length - next.length;\n remaining = next;\n }\n\n if (!parsedAny) {\n return null;\n }\n\n return {\n attributes,\n rest: remaining,\n restColumn: column + consumed\n };\n}\n\nfunction parseAttributeLine(\n source: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): Attribute[] | null {\n const result = parseAttributeTokensFromStart(\n source,\n lineNumber,\n column,\n lineOffset,\n diagnostics\n );\n if (!result || result.rest.length > 0) {\n return null;\n }\n return result.attributes;\n}\n\nfunction parseElementWithInfo(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ParsedElementResult | null {\n let name: string;\n let cursor = 0;\n let hasAttributeGroup = false;\n\n if (line[cursor] === \".\") {\n // Implicit div shorthand (e.g. `.foo` -> `div.foo`)\n name = \"div\";\n } else {\n const nameMatch = line.match(/^([A-Za-z][A-Za-z0-9_]*)/);\n if (!nameMatch) {\n // Don't push diagnostic here - let the caller handle fallback to text\n return null;\n }\n name = nameMatch[1];\n cursor = name.length;\n }\n\n // Check what follows the name\n const nextPart = line.slice(cursor);\n const isComponent = /^[A-Z]/.test(name);\n \n // Components must have parentheses or be at EOL\n if (isComponent && nextPart.length > 0) {\n const trimmedNext = nextPart.trimStart();\n if (trimmedNext.length > 0 && !trimmedNext.startsWith(\"(\")) {\n // This looks like a component name but has no parentheses - probably text\n return null;\n }\n }\n \n // If it's something other than '.', '(', whitespace, or EOL, it's probably not an element\n if (cursor < line.length) {\n const nextChar = line[cursor];\n if (nextChar !== \".\" && nextChar !== \"(\" && !/\\s/.test(nextChar)) {\n // This is probably text, not an element\n return null;\n }\n }\n\n // Parse classes (only for elements, not components)\n const classes: string[] = [];\n const classSpans: SourceSpan[] = [];\n\n if (!isComponent) {\n while (cursor < line.length && line[cursor] === \".\") {\n cursor++; // skip the dot\n const classMatch = line.slice(cursor).match(/^([A-Za-z0-9_$-]+)/);\n if (!classMatch) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Class names must contain only letters, numbers, underscores, hyphens, or `$` (for aliases).\",\n lineNumber,\n column + cursor,\n lineOffset\n );\n return null;\n }\n const className = classMatch[1];\n classes.push(className);\n classSpans.push(createSpan(lineNumber, column + cursor, className.length, lineOffset));\n cursor += className.length;\n }\n }\n\n // Parse attributes if parentheses are present\n const attributes: Attribute[] = [];\n if (cursor < line.length && line[cursor] === \"(\") {\n const attrResult = parseAttributes(line, cursor, lineNumber, column, lineOffset, diagnostics);\n if (!attrResult) {\n return null;\n }\n attributes.push(...attrResult.attributes);\n hasAttributeGroup = true;\n cursor = attrResult.endIndex;\n }\n\n // Parse optional guard expression\n let guard: string | undefined;\n let guardSpan: SourceSpan | undefined;\n const guardProbeStart = cursor;\n while (cursor < line.length && /\\s/.test(line[cursor])) {\n cursor++;\n }\n if (cursor < line.length && line[cursor] === \"?\") {\n const guardColumn = column + cursor;\n cursor++;\n const guardRaw = line.slice(cursor);\n const guardExpr = guardRaw.trim();\n if (!guardExpr) {\n pushDiag(\n diagnostics,\n \"COLLIE601\",\n \"Guard expressions require a condition after '?'.\",\n lineNumber,\n guardColumn,\n lineOffset\n );\n } else {\n guard = guardExpr;\n const leadingWhitespace = guardRaw.length - guardRaw.trimStart().length;\n const guardExprColumn = column + cursor + leadingWhitespace;\n guardSpan = createSpan(lineNumber, guardExprColumn, guardExpr.length, lineOffset);\n }\n cursor = line.length;\n } else {\n cursor = guardProbeStart;\n }\n\n // Parse inline text or children\n const restRaw = line.slice(cursor);\n let rest = restRaw.trimStart();\n let restColumn = column + cursor + (restRaw.length - rest.length);\n const children: Node[] = [];\n\n if (rest.length > 0) {\n const inlineAttrs = parseAttributeTokensFromStart(\n rest,\n lineNumber,\n restColumn,\n lineOffset,\n diagnostics\n );\n if (inlineAttrs) {\n attributes.push(...inlineAttrs.attributes);\n rest = inlineAttrs.rest;\n restColumn = inlineAttrs.restColumn;\n }\n\n if (rest.length > 0) {\n if (!rest.startsWith(\"|\")) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Inline text must start with '|'.\",\n lineNumber,\n restColumn,\n lineOffset,\n Math.max(rest.length, 1)\n );\n } else {\n let payload = rest.slice(1);\n let payloadColumn = restColumn + 1;\n if (payload.startsWith(\" \")) {\n payload = payload.slice(1);\n payloadColumn += 1;\n }\n const textNode = parseTextPayload(\n payload,\n lineNumber,\n payloadColumn,\n lineOffset,\n diagnostics\n );\n if (textNode) {\n children.push(textNode);\n }\n }\n }\n }\n\n if (isComponent) {\n const component: ComponentNode = {\n type: \"Component\",\n name,\n attributes,\n children\n };\n if (guard) {\n component.guard = guard;\n component.guardSpan = guardSpan;\n }\n return { node: component, hasAttributeGroup };\n } else {\n const element: ElementNode = {\n type: \"Element\",\n name,\n classes,\n attributes,\n children\n };\n if (classSpans.length) {\n element.classSpans = classSpans;\n }\n if (guard) {\n element.guard = guard;\n element.guardSpan = guardSpan;\n }\n return { node: element, hasAttributeGroup };\n }\n}\n\nfunction parseElement(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ElementNode | ComponentNode | null {\n const result = parseElementWithInfo(line, lineNumber, column, lineOffset, diagnostics);\n return result ? result.node : null;\n}\n\nfunction collectIndentedAttributeLines(\n lines: string[],\n lineOffsets: number[],\n startIndex: number,\n endIndex: number,\n parentLevel: number,\n diagnostics: Diagnostic[]\n): { attributes: Attribute[]; nextIndex: number } {\n const attributes: Attribute[] = [];\n let index = startIndex;\n\n while (index < endIndex) {\n const rawLine = lines[index];\n if (/^\\s*$/.test(rawLine)) {\n break;\n }\n if (rawLine.includes(\"\\t\")) {\n break;\n }\n const indentMatch = rawLine.match(/^\\s*/) ?? [\"\"];\n const indent = indentMatch[0].length;\n if (indent % 2 !== 0) {\n break;\n }\n const level = indent / 2;\n if (level !== parentLevel + 1) {\n break;\n }\n\n const lineContent = rawLine.slice(indent);\n const trimmed = lineContent.trimEnd();\n const leadingWhitespace = trimmed.length - trimmed.trimStart().length;\n const attrLine = trimmed.trimStart();\n if (!attrLine) {\n break;\n }\n\n const lineNumber = index + 1;\n const lineOffset = lineOffsets[index];\n const attrColumn = indent + 1 + leadingWhitespace;\n const lineAttributes = parseAttributeLine(\n attrLine,\n lineNumber,\n attrColumn,\n lineOffset,\n diagnostics\n );\n if (!lineAttributes) {\n break;\n }\n\n attributes.push(...lineAttributes);\n index++;\n }\n\n return { attributes, nextIndex: index };\n}\n\ninterface ParseAttributesResult {\n attributes: Attribute[];\n endIndex: number;\n}\n\nfunction parseAttributes(\n line: string,\n startIndex: number,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ParseAttributesResult | null {\n if (line[startIndex] !== \"(\") {\n return null;\n }\n\n const attributes: Attribute[] = [];\n let cursor = startIndex + 1;\n let depth = 1;\n let attrBuffer = \"\";\n\n // Find the matching closing parenthesis\n while (cursor < line.length && depth > 0) {\n const ch = line[cursor];\n if (ch === \"(\") {\n depth++;\n attrBuffer += ch;\n } else if (ch === \")\") {\n depth--;\n if (depth > 0) {\n attrBuffer += ch;\n }\n } else {\n attrBuffer += ch;\n }\n cursor++;\n }\n\n if (depth !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Unclosed attribute parentheses.\",\n lineNumber,\n column + startIndex,\n lineOffset\n );\n return null;\n }\n\n // Now parse the attributes from the buffer\n const trimmedAttrs = attrBuffer.trim();\n if (trimmedAttrs.length === 0) {\n return { attributes: [], endIndex: cursor };\n }\n\n // Parse each attribute\n // We need to handle multiline attributes properly\n const attrLines = trimmedAttrs.split(\"\\n\");\n let currentAttr = \"\";\n \n for (const attrLine of attrLines) {\n const trimmedLine = attrLine.trim();\n if (trimmedLine.length === 0) continue;\n\n // Check if this starts a new attribute (has an = sign at the top level)\n // or continues a previous one\n const eqIndex = trimmedLine.indexOf(\"=\");\n if (eqIndex > 0 && /^[A-Za-z][A-Za-z0-9_-]*\\s*=/.test(trimmedLine)) {\n // This is a new attribute\n if (currentAttr) {\n // Parse the previous attribute\n let remaining = parseAndAddAttribute(currentAttr, attributes, diagnostics, lineNumber, column, lineOffset);\n // Process any remaining attributes from the previous line\n while (remaining) {\n remaining = parseAndAddAttribute(remaining, attributes, diagnostics, lineNumber, column, lineOffset);\n }\n currentAttr = \"\";\n }\n currentAttr = trimmedLine;\n } else {\n // Continuation of previous attribute\n if (currentAttr) {\n currentAttr += \" \" + trimmedLine;\n } else {\n // Boolean attribute\n currentAttr = trimmedLine;\n }\n }\n }\n\n // Parse the last attribute and any remaining inline attributes\n if (currentAttr) {\n let remaining = parseAndAddAttribute(currentAttr, attributes, diagnostics, lineNumber, column, lineOffset);\n while (remaining) {\n remaining = parseAndAddAttribute(remaining, attributes, diagnostics, lineNumber, column, lineOffset);\n }\n }\n\n return { attributes, endIndex: cursor };\n}\n\n// Scan brace-wrapped attribute values as a single unit, balancing nested delimiters and quoted strings.\nfunction scanBraceAttributeValue(\n source: string,\n diagnostics: Diagnostic[],\n lineNumber: number,\n column: number,\n lineOffset: number\n): { value: string; rest: string } | null {\n if (!source.startsWith(\"{\")) {\n return null;\n }\n\n let braceDepth = 0;\n let parenDepth = 0;\n let bracketDepth = 0;\n let quote: \"'\" | '\"' | \"`\" | null = null;\n let escaped = false;\n\n for (let i = 0; i < source.length; i++) {\n const char = source[i];\n\n if (quote) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (char === quote) {\n quote = null;\n }\n continue;\n }\n\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n continue;\n }\n\n if (char === \"{\") {\n braceDepth++;\n continue;\n }\n if (char === \"}\") {\n braceDepth--;\n if (braceDepth === 0 && parenDepth === 0 && bracketDepth === 0) {\n return { value: source.slice(0, i + 1), rest: source.slice(i + 1).trim() };\n }\n continue;\n }\n if (char === \"(\") {\n parenDepth++;\n continue;\n }\n if (char === \")\") {\n if (parenDepth > 0) {\n parenDepth--;\n }\n continue;\n }\n if (char === \"[\") {\n bracketDepth++;\n continue;\n }\n if (char === \"]\") {\n if (bracketDepth > 0) {\n bracketDepth--;\n }\n }\n }\n\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Unclosed brace in attribute value.\",\n lineNumber,\n column,\n lineOffset\n );\n return null;\n}\n\nfunction parseAndAddAttribute(\n attrStr: string,\n attributes: Attribute[],\n diagnostics: Diagnostic[],\n lineNumber: number,\n column: number,\n lineOffset: number\n): string {\n const trimmed = attrStr.trim();\n \n // Try to match attribute name and equals sign\n const nameMatch = trimmed.match(/^([A-Za-z][A-Za-z0-9_-]*)\\s*=\\s*/);\n if (nameMatch) {\n const attrName = nameMatch[1];\n const afterEquals = trimmed.slice(nameMatch[0].length);\n \n if (afterEquals.length === 0) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n `Attribute ${attrName} missing value`,\n lineNumber,\n column,\n lineOffset\n );\n return \"\";\n }\n\n const braceValue = scanBraceAttributeValue(afterEquals, diagnostics, lineNumber, column, lineOffset);\n if (braceValue) {\n attributes.push({ name: attrName, value: braceValue.value });\n return braceValue.rest;\n }\n\n // Extract the quoted value\n const quoteChar = afterEquals[0];\n if (quoteChar === '\"' || quoteChar === \"'\") {\n let i = 1;\n let value = \"\";\n let escaped = false;\n \n while (i < afterEquals.length) {\n const char = afterEquals[i];\n \n if (escaped) {\n value += char;\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === quoteChar) {\n // Found the closing quote\n attributes.push({ name: attrName, value: quoteChar + value + quoteChar });\n // Return remaining text after this attribute\n return afterEquals.slice(i + 1).trim();\n } else {\n value += char;\n }\n i++;\n }\n \n // Unclosed quote\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n `Unclosed quote in attribute ${attrName}`,\n lineNumber,\n column,\n lineOffset\n );\n return \"\";\n } else {\n // Unquoted value - take everything until space or end\n const unquotedMatch = afterEquals.match(/^(\\S+)/);\n if (unquotedMatch) {\n attributes.push({ name: attrName, value: unquotedMatch[1] });\n return afterEquals.slice(unquotedMatch[1].length).trim();\n }\n return \"\";\n }\n } else {\n // Boolean attribute\n const boolMatch = trimmed.match(/^([A-Za-z][A-Za-z0-9_-]*)(\\s+.*)?$/);\n if (boolMatch) {\n attributes.push({ name: boolMatch[1], value: null });\n return boolMatch[2] ? boolMatch[2].trim() : \"\";\n } else {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n `Invalid attribute syntax: ${trimmed.slice(0, 30)}`,\n lineNumber,\n column,\n lineOffset\n );\n return \"\";\n }\n }\n}\n\nfunction pushDiag(\n diagnostics: Diagnostic[],\n code: DiagnosticCode,\n message: string,\n line: number,\n column: number,\n lineOffset: number,\n length = 1\n): void {\n diagnostics.push({\n severity: \"error\",\n code,\n message,\n span: createSpan(line, column, Math.max(length, 1), lineOffset)\n });\n}\n","import type { NormalizedCollieDialectOptions } from \"@collie-lang/config\";\nimport { generateRenderModule } from \"./codegen.ts\";\nimport { generateHtml } from \"./html-codegen.ts\";\nimport { parse } from \"./parser.ts\";\nimport type { ParseResult, TemplateUnit } from \"./parser.ts\";\nimport type { Diagnostic } from \"./diagnostics.ts\";\nimport type { RootNode } from \"./ast.ts\";\nimport type { SourceSpan } from \"./diagnostics.ts\";\n\nexport type {\n CollieConfig,\n CollieCssOptions,\n CollieCssStrategy,\n CollieDialectOptions,\n CollieDialectPropsOptions,\n CollieDialectTokenKind,\n CollieDialectTokenRule,\n CollieDialectTokens,\n CollieDiagnosticLevel,\n CollieProjectConfig,\n CollieCompilerOptions,\n CollieFeatureOptions,\n CollieEditorOptions,\n HtmlProjectOptions,\n ReactProjectOptions,\n NormalizedCollieCssOptions,\n NormalizedCollieConfig,\n NormalizedCollieDialectOptions,\n NormalizedCollieDialectPropsOptions,\n NormalizedCollieDialectTokenRule,\n NormalizedCollieDialectTokens,\n NormalizedCollieProjectConfig\n} from \"@collie-lang/config\";\nexport {\n defineConfig,\n loadConfig,\n loadAndNormalizeConfig,\n normalizeConfig\n} from \"@collie-lang/config\";\n\nexport type {\n Diagnostic,\n DiagnosticFix,\n DiagnosticSeverity,\n SourcePos,\n SourceSpan\n} from \"./diagnostics.ts\";\nexport { applyFixes, fixAllFromDiagnostics } from \"./fixes.ts\";\nexport type { ParseResult, TemplateUnit } from \"./parser.ts\";\nexport type {\n Attribute,\n ClassAliasDecl,\n ClassAliasesDecl,\n ComponentNode,\n ConditionalBranch,\n ConditionalNode,\n ElementNode,\n ExpressionNode,\n ForNode,\n JSXPassthroughNode,\n Node,\n PropsDecl,\n PropsField,\n RootNode,\n SlotBlock,\n TextChunk,\n TextExprPart,\n TextNode,\n TextPart\n} from \"./ast.ts\";\nexport type { FormatOptions, FormatResult } from \"./format.ts\";\nexport { formatCollie } from \"./format.ts\";\nexport type { ConvertTsxOptions, ConvertTsxResult } from \"./convert.ts\";\nexport { convertTsxToCollie } from \"./convert.ts\";\n\nexport interface ParseCollieOptions {\n filename?: string;\n dialect?: NormalizedCollieDialectOptions;\n}\n\nexport interface BaseCompileOptions {\n filename?: string;\n /** @deprecated Legacy component module option. */\n componentNameHint?: string;\n dialect?: NormalizedCollieDialectOptions;\n}\n\nexport interface JsxCompileOptions extends BaseCompileOptions {\n jsxRuntime?: \"classic\" | \"automatic\";\n}\n\nexport interface TsxCompileOptions extends BaseCompileOptions {\n jsxRuntime?: \"classic\" | \"automatic\";\n}\n\nexport interface HtmlCompileOptions extends BaseCompileOptions {\n pretty?: boolean;\n}\n\nexport interface CollieCompileMeta {\n id?: string;\n rawId?: string;\n filename?: string;\n span?: SourceSpan;\n}\n\nexport interface CompileResult {\n code: string;\n map?: any;\n diagnostics: Diagnostic[];\n meta?: CollieCompileMeta;\n}\n\nexport interface ConvertCollieResult {\n tsx: string;\n diagnostics: Diagnostic[];\n meta?: CollieCompileMeta;\n}\n\nexport interface CompileTemplateOptions {\n filename?: string;\n jsxRuntime?: \"classic\" | \"automatic\";\n flavor?: \"jsx\" | \"tsx\";\n}\n\nexport type CollieDocument = ParseResult;\n/** @deprecated Legacy component-compile options. Prefer CompileTemplateOptions. */\nexport type CompileOptions = JsxCompileOptions;\n\nexport function parseCollie(source: string, options: ParseCollieOptions = {}): CollieDocument {\n const result = parse(source, { dialect: options.dialect });\n if (!options.filename) {\n return {\n templates: result.templates.map((template) => ({\n ...template,\n diagnostics: normalizeDiagnostics(template.diagnostics)\n })),\n diagnostics: normalizeDiagnostics(result.diagnostics)\n };\n }\n return {\n templates: result.templates.map((template) => ({\n ...template,\n diagnostics: normalizeDiagnostics(template.diagnostics, options.filename)\n })),\n diagnostics: normalizeDiagnostics(result.diagnostics, options.filename)\n };\n}\n\nexport function compileTemplate(\n template: TemplateUnit,\n options: CompileTemplateOptions = {}\n): CompileResult {\n const diagnostics = normalizeDiagnostics(template.diagnostics, options.filename);\n const jsxRuntime = options.jsxRuntime ?? \"automatic\";\n const flavor = options.flavor ?? \"tsx\";\n\n let code = createStubRender(flavor);\n if (!hasErrors(diagnostics)) {\n code = generateRenderModule(template.ast, { jsxRuntime, flavor });\n }\n\n const meta = buildCompileMeta(template, options.filename);\n return { code, diagnostics, map: undefined, meta };\n}\n\n/**\n * @deprecated Legacy component module wrapper.\n * Use compileTemplate for registry-driven render modules.\n */\nexport function compileToJsx(\n sourceOrAst: string | RootNode | CollieDocument,\n options: JsxCompileOptions = {}\n): CompileResult {\n const document = normalizeDocument(sourceOrAst, options.filename, options.dialect);\n const diagnostics = normalizeDiagnostics(document.diagnostics, options.filename);\n const template = document.templates[0];\n const componentName = options.componentNameHint ?? \"CollieTemplate\";\n const jsxRuntime = options.jsxRuntime ?? \"automatic\";\n\n let code = createStubComponent(componentName, \"jsx\");\n if (!hasErrors(diagnostics) && template) {\n const renderResult = compileTemplate(template, {\n filename: options.filename,\n jsxRuntime,\n flavor: \"jsx\"\n });\n code = wrapRenderModuleAsComponent(renderResult.code, componentName, \"jsx\");\n }\n\n const meta = buildCompileMeta(template, options.filename);\n return { code, diagnostics, map: undefined, meta };\n}\n\n/**\n * @deprecated Legacy component module wrapper.\n * Use compileTemplate for registry-driven render modules.\n */\nexport function compileToTsx(\n sourceOrAst: string | RootNode | CollieDocument,\n options: TsxCompileOptions = {}\n): CompileResult {\n const document = normalizeDocument(sourceOrAst, options.filename, options.dialect);\n const diagnostics = normalizeDiagnostics(document.diagnostics, options.filename);\n const template = document.templates[0];\n const componentName = options.componentNameHint ?? \"CollieTemplate\";\n const jsxRuntime = options.jsxRuntime ?? \"automatic\";\n\n let code = createStubComponent(componentName, \"tsx\");\n if (!hasErrors(diagnostics) && template) {\n const renderResult = compileTemplate(template, {\n filename: options.filename,\n jsxRuntime,\n flavor: \"tsx\"\n });\n code = wrapRenderModuleAsComponent(renderResult.code, componentName, \"tsx\");\n }\n\n const meta = buildCompileMeta(template, options.filename);\n return { code, diagnostics, map: undefined, meta };\n}\n\n/**\n * @deprecated Legacy component module wrapper.\n * Use compileTemplate for registry-driven render modules.\n */\nexport function convertCollieToTsx(source: string, options: TsxCompileOptions = {}): ConvertCollieResult {\n const result = compileToTsx(source, options);\n return {\n tsx: result.code,\n diagnostics: result.diagnostics,\n meta: result.meta\n };\n}\n\nexport function compileToHtml(\n sourceOrAst: string | RootNode | CollieDocument,\n options: HtmlCompileOptions = {}\n): CompileResult {\n const document = normalizeDocument(sourceOrAst, options.filename, options.dialect);\n const diagnostics = normalizeDiagnostics(document.diagnostics, options.filename);\n const template = document.templates[0];\n\n let code = createStubHtml();\n if (!hasErrors(diagnostics) && template) {\n code = generateHtml(template.ast);\n }\n\n const meta = buildCompileMeta(template, options.filename);\n return { code, diagnostics, map: undefined, meta };\n}\n\n/**\n * @deprecated Legacy component module wrapper.\n * Use compileTemplate for registry-driven render modules.\n */\nexport function compile(source: string, options: CompileOptions = {}): CompileResult {\n return compileToJsx(source, options);\n}\n\nexport { parseCollie as parse };\n\nfunction normalizeDocument(\n sourceOrAst: string | RootNode | CollieDocument,\n filename?: string,\n dialect?: NormalizedCollieDialectOptions\n): CollieDocument {\n if (typeof sourceOrAst === \"string\") {\n return parseCollie(sourceOrAst, { filename, dialect });\n }\n\n if (isCollieDocument(sourceOrAst)) {\n if (!filename) {\n return sourceOrAst;\n }\n return attachFilenameToDocument(sourceOrAst, filename);\n }\n\n if (isRootNode(sourceOrAst)) {\n const id = sourceOrAst.id ?? sourceOrAst.rawId ?? \"\";\n const rawId = sourceOrAst.rawId ?? sourceOrAst.id ?? \"\";\n const template: TemplateUnit = {\n id,\n rawId,\n span: sourceOrAst.idTokenSpan,\n ast: sourceOrAst,\n diagnostics: []\n };\n return { templates: [template], diagnostics: [] };\n }\n\n throw new TypeError(\"Collie compiler expected source text, a parsed document, or a root node.\");\n}\n\nfunction isRootNode(value: unknown): value is RootNode {\n return !!value && typeof value === \"object\" && (value as { type?: unknown }).type === \"Root\";\n}\n\nfunction isCollieDocument(value: unknown): value is CollieDocument {\n return (\n !!value &&\n typeof value === \"object\" &&\n Array.isArray((value as { templates?: unknown }).templates) &&\n Array.isArray((value as { diagnostics?: unknown }).diagnostics)\n );\n}\n\nfunction hasErrors(diagnostics: Diagnostic[]): boolean {\n return diagnostics.some((diag) => diag.severity === \"error\");\n}\n\nfunction createStubComponent(name: string, flavor: \"jsx\" | \"tsx\"): string {\n if (flavor === \"tsx\") {\n return [\n \"export type Props = Record<string, never>;\",\n `export default function ${name}(props: Props) {`,\n \" return null;\",\n \"}\"\n ].join(\"\\n\");\n }\n return [`export default function ${name}(props) {`, \" return null;\", \"}\"].join(\"\\n\");\n}\n\nfunction createStubRender(flavor: \"jsx\" | \"tsx\"): string {\n if (flavor === \"tsx\") {\n return [\n \"export type Props = Record<string, never>;\",\n \"export function render(props: any) {\",\n \" return null;\",\n \"}\"\n ].join(\"\\n\");\n }\n return [\"export function render(props) {\", \" return null;\", \"}\"].join(\"\\n\");\n}\n\nfunction wrapRenderModuleAsComponent(\n renderModule: string,\n name: string,\n flavor: \"jsx\" | \"tsx\"\n): string {\n const signature = flavor === \"tsx\" ? `export default function ${name}(props: Props) {` : `export default function ${name}(props) {`;\n const wrapper = [signature, \" return render(props);\", \"}\"].join(\"\\n\");\n return `${renderModule}\\n\\n${wrapper}`;\n}\n\nfunction createStubHtml(): string {\n return \"\";\n}\n\nfunction buildCompileMeta(\n template: TemplateUnit | undefined,\n filename?: string\n): CollieCompileMeta | undefined {\n const meta: CollieCompileMeta = {};\n if (filename) {\n meta.filename = filename;\n }\n if (template?.rawId) {\n meta.rawId = template.rawId;\n }\n if (template?.id) {\n meta.id = template.id;\n }\n if (template?.span) {\n meta.span = template.span;\n }\n\n return meta.id || meta.rawId || meta.filename ? meta : undefined;\n}\nfunction attachFilenameToDocument(document: CollieDocument, filename?: string): CollieDocument {\n if (!filename) {\n return document;\n }\n return {\n templates: document.templates.map((template) => ({\n ...template,\n diagnostics: normalizeDiagnostics(template.diagnostics, filename)\n })),\n diagnostics: normalizeDiagnostics(document.diagnostics, filename)\n };\n}\n\nfunction normalizeDiagnostics(diagnostics: Diagnostic[], filename?: string): Diagnostic[] {\n return diagnostics.map((diag) => {\n const filePath = diag.filePath ?? diag.file ?? filename;\n const file = diag.file ?? filename;\n const range = diag.range ?? diag.span;\n\n if (filePath === diag.filePath && file === diag.file && range === diag.range) {\n return diag;\n }\n\n return {\n ...diag,\n filePath,\n file,\n range\n };\n });\n}\n","import type { Diagnostic, DiagnosticFix, SourceSpan } from \"./diagnostics.ts\";\n\ninterface FixWithOffsets {\n fix: DiagnosticFix;\n start: number;\n end: number;\n}\n\ninterface FixApplyResult {\n text: string;\n applied: DiagnosticFix[];\n skipped: DiagnosticFix[];\n}\n\nexport function applyFixes(sourceText: string, fixes: DiagnosticFix[]): FixApplyResult {\n const normalized: FixWithOffsets[] = [];\n const skipped: DiagnosticFix[] = [];\n\n for (const fix of fixes) {\n const offsets = getSpanOffsets(fix.range);\n if (!offsets) {\n skipped.push(fix);\n continue;\n }\n if (offsets.start < 0 || offsets.end < offsets.start || offsets.end > sourceText.length) {\n skipped.push(fix);\n continue;\n }\n normalized.push({ fix, start: offsets.start, end: offsets.end });\n }\n\n normalized.sort((a, b) => (a.start === b.start ? a.end - b.end : a.start - b.start));\n\n const accepted: FixWithOffsets[] = [];\n let currentEnd = -1;\n for (const item of normalized) {\n if (item.start < currentEnd) {\n skipped.push(item.fix);\n continue;\n }\n accepted.push(item);\n currentEnd = item.end;\n }\n\n let text = sourceText;\n for (let i = accepted.length - 1; i >= 0; i--) {\n const { start, end, fix } = accepted[i];\n text = `${text.slice(0, start)}${fix.replacementText}${text.slice(end)}`;\n }\n\n return { text, applied: accepted.map((item) => item.fix), skipped };\n}\n\nexport function fixAllFromDiagnostics(\n sourceText: string,\n diagnostics: Diagnostic[]\n): FixApplyResult {\n const fixes = diagnostics.flatMap((diag) => (diag.fix ? [diag.fix] : []));\n return applyFixes(sourceText, fixes);\n}\n\nfunction getSpanOffsets(span: SourceSpan | undefined): { start: number; end: number } | null {\n if (!span) {\n return null;\n }\n const start = span.start?.offset;\n const end = span.end?.offset;\n if (!Number.isFinite(start) || !Number.isFinite(end)) {\n return null;\n }\n return { start, end };\n}\n","import type {\n Attribute,\n ClassAliasesDecl,\n Node,\n PropsDecl,\n RootNode,\n TextNode,\n TextPart\n} from \"./ast.ts\";\nimport type { Diagnostic } from \"./diagnostics.ts\";\nimport { parse } from \"./parser.ts\";\nimport type { TemplateUnit } from \"./parser.ts\";\n\nexport interface FormatOptions {\n indent?: number;\n}\n\nexport interface FormatResult {\n formatted: string;\n diagnostics: Diagnostic[];\n success: boolean;\n}\n\nexport function formatCollie(source: string, options: FormatOptions = {}): FormatResult {\n const indentSize = validateIndentOption(options.indent);\n const normalized = source.replace(/\\r\\n?/g, \"\\n\");\n const parseResult = parse(normalized);\n const diagnostics = normalizeDiagnostics(parseResult.diagnostics);\n const hasErrors = diagnostics.some((diag) => diag.severity === \"error\");\n\n if (hasErrors) {\n return {\n formatted: source,\n diagnostics,\n success: false\n };\n }\n\n const serialized = serializeTemplates(parseResult.templates, indentSize);\n const formatted = ensureTrailingNewline(serialized);\n\n return {\n formatted,\n diagnostics,\n success: true\n };\n}\n\nfunction normalizeDiagnostics(diagnostics: Diagnostic[]): Diagnostic[] {\n return diagnostics.map((diag) => {\n if (diag.range || !diag.span) {\n return diag;\n }\n return {\n ...diag,\n range: diag.span\n };\n });\n}\n\nfunction validateIndentOption(indent?: number): number {\n if (indent === undefined) {\n return 2;\n }\n if (!Number.isFinite(indent) || indent < 1) {\n throw new Error(\"Indent width must be a positive integer.\");\n }\n return Math.floor(indent);\n}\n\nfunction serializeTemplates(templates: TemplateUnit[], indentSize: number): string {\n const lines: string[] = [];\n\n for (const template of templates) {\n if (lines.length && lines[lines.length - 1] !== \"\") {\n lines.push(\"\");\n }\n const idValue = template.rawId || template.id;\n lines.push(cleanLine(`#id ${idValue}`));\n const body = serializeRoot(template.ast, indentSize);\n if (body.trim().length > 0) {\n lines.push(...body.split(\"\\n\"));\n }\n }\n\n while (lines.length && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction serializeRoot(root: RootNode, indentSize: number): string {\n const sections: string[][] = [];\n if (root.classAliases && root.classAliases.aliases.length > 0) {\n sections.push(formatClassAliases(root.classAliases, indentSize));\n }\n if (root.props && root.props.fields.length > 0) {\n sections.push(formatProps(root.props, indentSize));\n }\n if (root.children.length > 0) {\n sections.push(formatNodes(root.children, 0, indentSize));\n }\n\n const lines: string[] = [];\n for (const section of sections) {\n if (!section.length) continue;\n if (lines.length && lines[lines.length - 1] !== \"\") {\n lines.push(\"\");\n }\n for (const line of section) {\n lines.push(line);\n }\n }\n\n while (lines.length && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatClassAliases(decl: ClassAliasesDecl, indentSize: number): string[] {\n const indent = indentString(1, indentSize);\n const lines: string[] = [\"classes\"];\n for (const alias of decl.aliases) {\n const rhs = alias.classes.join(\".\");\n lines.push(cleanLine(`${indent}${alias.name} = ${rhs}`));\n }\n return lines;\n}\n\nfunction formatProps(props: PropsDecl, indentSize: number): string[] {\n const indent = indentString(1, indentSize);\n const lines: string[] = [\"props\"];\n for (const field of props.fields) {\n const optionalFlag = field.optional ? \"?\" : \"\";\n lines.push(cleanLine(`${indent}${field.name}${optionalFlag}: ${field.typeText.trim()}`));\n }\n return lines;\n}\n\nfunction formatNodes(nodes: Node[], level: number, indentSize: number): string[] {\n const lines: string[] = [];\n for (const node of nodes) {\n lines.push(...formatNode(node, level, indentSize));\n }\n return lines;\n}\n\nfunction formatNode(node: Node, level: number, indentSize: number): string[] {\n switch (node.type) {\n case \"Element\":\n return formatElement(node, level, indentSize);\n case \"Component\":\n return formatComponent(node, level, indentSize);\n case \"Text\":\n return [formatTextNode(node, level, indentSize)];\n case \"Expression\":\n return [cleanLine(`${indentString(level, indentSize)}{{ ${node.value} }}`)];\n case \"JSXPassthrough\":\n return formatJsxPassthrough(node.expression, level, indentSize);\n case \"For\":\n return formatFor(node, level, indentSize);\n case \"Conditional\":\n return formatConditional(node, level, indentSize);\n default:\n return [];\n }\n}\n\nfunction formatElement(node: Node & { type: \"Element\" }, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n let line = `${indent}${node.name}${formatClassList(node.classes)}`;\n const attrs = formatAttributes(node.attributes);\n if (attrs) {\n line += `(${attrs})`;\n }\n const children = formatNodes(node.children, level + 1, indentSize);\n if (children.length === 0) {\n return [cleanLine(line)];\n }\n return [cleanLine(line), ...children];\n}\n\nfunction formatComponent(node: Node & { type: \"Component\" }, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n let line = `${indent}${node.name}`;\n const attrs = formatAttributes(node.attributes);\n if (attrs) {\n line += `(${attrs})`;\n }\n const children = formatNodes(node.children, level + 1, indentSize);\n if (children.length === 0) {\n return [cleanLine(line)];\n }\n return [cleanLine(line), ...children];\n}\n\nfunction formatTextNode(node: TextNode, level: number, indentSize: number): string {\n const indent = indentString(level, indentSize);\n const text = renderTextParts(node.parts);\n return cleanLine(`${indent}| ${text}`);\n}\n\nfunction renderTextParts(parts: TextPart[]): string {\n return parts\n .map((part) => {\n if (part.type === \"text\") {\n return part.value;\n }\n return `{${part.value}}`;\n })\n .join(\"\");\n}\n\nfunction formatJsxPassthrough(expression: string, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n const childIndent = indentString(level + 1, indentSize);\n const normalized = expression.replace(/\\r\\n?/g, \"\\n\").trimEnd();\n if (!normalized.trim()) {\n return [cleanLine(`${indent}= ${normalized.trim()}`)];\n }\n const lines = normalized.split(\"\\n\");\n const [first, ...rest] = lines;\n const result: string[] = [cleanLine(`${indent}= ${first.trim()}`)];\n if (rest.length === 0) {\n return result;\n }\n\n const dedent = computeDedent(rest);\n for (const raw of rest) {\n if (!raw.trim()) {\n result.push(\"\");\n continue;\n }\n const withoutIndent = raw.slice(Math.min(dedent, raw.length)).trimEnd();\n result.push(cleanLine(`${childIndent}${withoutIndent}`));\n }\n return result;\n}\n\nfunction computeDedent(lines: string[]): number {\n let min = Number.POSITIVE_INFINITY;\n for (const line of lines) {\n if (!line.trim()) continue;\n const indentMatch = line.match(/^\\s*/);\n const indentLength = indentMatch ? indentMatch[0].length : 0;\n min = Math.min(min, indentLength);\n }\n return Number.isFinite(min) ? min : 0;\n}\n\nfunction formatFor(node: Node & { type: \"For\" }, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n const header = cleanLine(`${indent}@for ${node.itemName} in ${node.arrayExpr}`);\n const body = formatNodes(node.body, level + 1, indentSize);\n return body.length ? [header, ...body] : [header];\n}\n\nfunction formatConditional(node: Node & { type: \"Conditional\" }, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n const lines: string[] = [];\n node.branches.forEach((branch, index) => {\n let directive: string;\n if (index === 0) {\n directive = `@if (${branch.test ?? \"\"})`;\n } else if (branch.test) {\n directive = `@elseIf (${branch.test})`;\n } else {\n directive = \"@else\";\n }\n lines.push(cleanLine(`${indent}${directive}`));\n const body = formatNodes(branch.body, level + 1, indentSize);\n lines.push(...body);\n });\n return lines;\n}\n\nfunction formatAttributes(attributes: Attribute[]): string {\n if (!attributes.length) {\n return \"\";\n }\n const sorted = [...attributes].sort((a, b) => {\n if (a.name === b.name) return 0;\n if (a.name === \"class\") return -1;\n if (b.name === \"class\") return 1;\n return a.name.localeCompare(b.name);\n });\n return sorted\n .map((attr) => {\n if (attr.value === null) {\n return attr.name;\n }\n return `${attr.name}=${normalizeAttributeValue(attr.value)}`;\n })\n .join(\" \");\n}\n\nfunction normalizeAttributeValue(value: string): string {\n const trimmed = value.trim();\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"<\")) {\n return trimmed;\n }\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed;\n }\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n const inner = trimmed.slice(1, -1).replace(/\"/g, '\\\\\"');\n return `\"${inner}\"`;\n }\n return trimmed;\n}\n\nfunction formatClassList(classes: string[]): string {\n if (!classes.length) return \"\";\n return classes.map((cls) => `.${cls}`).join(\"\");\n}\n\nfunction indentString(level: number, indentSize: number): string {\n return \" \".repeat(level * indentSize);\n}\n\nfunction ensureTrailingNewline(output: string): string {\n const trimmed = output.replace(/\\s+$/g, \"\");\n return trimmed.length ? `${trimmed}\\n` : \"\\n\";\n}\n\nfunction cleanLine(line: string): string {\n return line.replace(/[ \\t]+$/g, \"\");\n}\n","import ts from \"typescript\";\n\nexport interface ConvertTsxOptions {\n filename?: string;\n}\n\nexport interface ConvertTsxResult {\n collie: string;\n warnings: string[];\n}\n\ninterface PropField {\n name: string;\n optional: boolean;\n typeText: string;\n}\n\ninterface ComponentInfo {\n jsxRoot: ts.JsxChild;\n propsTypeName?: string;\n inlineProps?: PropField[];\n defaults: Map<string, string>;\n}\n\ninterface ConverterContext {\n sourceFile: ts.SourceFile;\n warnings: string[];\n}\n\nexport function convertTsxToCollie(source: string, options: ConvertTsxOptions = {}): ConvertTsxResult {\n const filename = options.filename ?? \"input.tsx\";\n const sourceFile = ts.createSourceFile(\n filename,\n source,\n ts.ScriptTarget.Latest,\n true,\n inferScriptKind(filename)\n );\n const warnings: string[] = [];\n const ctx: ConverterContext = { sourceFile, warnings };\n const propDeclarations = collectPropDeclarations(sourceFile);\n const component = findComponentInfo(sourceFile, propDeclarations, ctx);\n if (!component) {\n throw new Error(\"Could not find a component that returns JSX in this file.\");\n }\n\n const propsLines = buildPropsBlock(component, propDeclarations, ctx);\n const templateLines = convertJsxNode(component.jsxRoot, ctx, 0);\n if (!templateLines.length) {\n throw new Error(\"Unable to convert JSX tree to Collie template.\");\n }\n\n const sections: string[] = [];\n if (propsLines.length) {\n sections.push(propsLines.join(\"\\n\"));\n }\n sections.push(templateLines.join(\"\\n\"));\n\n const collie = `${sections.join(\"\\n\\n\").trimEnd()}\\n`;\n return { collie, warnings };\n}\n\nfunction inferScriptKind(filename: string): ts.ScriptKind {\n const dotIndex = filename.lastIndexOf(\".\");\n const ext = dotIndex === -1 ? \"\" : filename.slice(dotIndex).toLowerCase();\n if (ext === \".tsx\") return ts.ScriptKind.TSX;\n if (ext === \".jsx\") return ts.ScriptKind.JSX;\n if (ext === \".ts\") return ts.ScriptKind.TS;\n return ts.ScriptKind.JS;\n}\n\nfunction collectPropDeclarations(sourceFile: ts.SourceFile): Map<string, PropField[]> {\n const map = new Map<string, PropField[]>();\n for (const statement of sourceFile.statements) {\n if (ts.isInterfaceDeclaration(statement) && statement.name) {\n map.set(statement.name.text, extractPropsFromMembers(statement.members, sourceFile));\n } else if (ts.isTypeAliasDeclaration(statement) && ts.isTypeLiteralNode(statement.type)) {\n map.set(statement.name.text, extractPropsFromMembers(statement.type.members, sourceFile));\n }\n }\n return map;\n}\n\nfunction extractPropsFromMembers(members: readonly ts.TypeElement[], sourceFile: ts.SourceFile): PropField[] {\n const fields: PropField[] = [];\n for (const member of members) {\n if (!ts.isPropertySignature(member) || member.name === undefined) {\n continue;\n }\n const name = getPropertyName(member.name, sourceFile);\n if (!name) {\n continue;\n }\n const typeText = member.type ? member.type.getText(sourceFile).trim() : \"any\";\n fields.push({\n name,\n optional: Boolean(member.questionToken),\n typeText\n });\n }\n return fields;\n}\n\nfunction findComponentInfo(\n sourceFile: ts.SourceFile,\n declarations: Map<string, PropField[]>,\n ctx: ConverterContext\n): ComponentInfo | null {\n for (const statement of sourceFile.statements) {\n if (ts.isFunctionDeclaration(statement) && statement.body) {\n const jsx = findJsxReturn(statement.body);\n if (jsx) {\n const defaults = extractDefaultsFromParameters(statement.parameters, ctx);\n const propsInfo = resolvePropsFromParameters(statement.parameters, declarations, ctx);\n return {\n jsxRoot: jsx,\n propsTypeName: propsInfo.typeName,\n inlineProps: propsInfo.inline,\n defaults\n };\n }\n } else if (ts.isVariableStatement(statement)) {\n for (const decl of statement.declarationList.declarations) {\n const init = decl.initializer;\n if (!init) continue;\n if (ts.isArrowFunction(init) || ts.isFunctionExpression(init)) {\n const jsx = init.body ? findJsxInFunctionBody(init.body) : undefined;\n if (!jsx) {\n continue;\n }\n const defaults = extractDefaultsFromParameters(init.parameters, ctx);\n const propsInfo = resolvePropsFromParameters(init.parameters, declarations, ctx);\n if (!propsInfo.typeName && !propsInfo.inline && decl.type) {\n const inferred = resolvePropsFromTypeAnnotation(decl.type, sourceFile, declarations);\n if (inferred.typeName && !propsInfo.typeName) {\n propsInfo.typeName = inferred.typeName;\n }\n if (inferred.inline && !propsInfo.inline) {\n propsInfo.inline = inferred.inline;\n }\n }\n return {\n jsxRoot: jsx,\n propsTypeName: propsInfo.typeName,\n inlineProps: propsInfo.inline,\n defaults\n };\n }\n }\n }\n }\n return null;\n}\n\nfunction resolvePropsFromParameters(\n parameters: readonly ts.ParameterDeclaration[],\n declarations: Map<string, PropField[]>,\n ctx: ConverterContext\n): { typeName?: string; inline?: PropField[] } {\n if (!parameters.length) {\n return {};\n }\n const param = parameters[0];\n if (param.type) {\n const inferred = resolvePropsFromTypeAnnotation(param.type, ctx.sourceFile, declarations);\n if (inferred.inline) {\n return inferred;\n }\n if (inferred.typeName) {\n return inferred;\n }\n }\n return {};\n}\n\nfunction resolvePropsFromTypeAnnotation(\n typeNode: ts.TypeNode,\n sourceFile: ts.SourceFile,\n declarations: Map<string, PropField[]>\n): { typeName?: string; inline?: PropField[] } {\n if (ts.isTypeReferenceNode(typeNode)) {\n const referenced = getTypeReferenceName(typeNode.typeName);\n if (referenced && declarations.has(referenced)) {\n return { typeName: referenced };\n }\n const typeArg = typeNode.typeArguments?.[0];\n if (typeArg) {\n if (ts.isTypeReferenceNode(typeArg)) {\n const nested = getTypeReferenceName(typeArg.typeName);\n if (nested && declarations.has(nested)) {\n return { typeName: nested };\n }\n } else if (ts.isTypeLiteralNode(typeArg)) {\n return { inline: extractPropsFromMembers(typeArg.members, sourceFile) };\n }\n }\n }\n if (ts.isTypeLiteralNode(typeNode)) {\n return { inline: extractPropsFromMembers(typeNode.members, sourceFile) };\n }\n return {};\n}\n\nfunction getTypeReferenceName(typeName: ts.EntityName | ts.Expression): string | undefined {\n if (ts.isIdentifier(typeName)) {\n return typeName.text;\n }\n if (ts.isQualifiedName(typeName)) {\n return typeName.right.text;\n }\n if (ts.isPropertyAccessExpression(typeName)) {\n return getTypeReferenceName(typeName.name);\n }\n return undefined;\n}\n\nfunction findJsxReturn(body: ts.Block): ts.JsxChild | undefined {\n for (const statement of body.statements) {\n if (ts.isReturnStatement(statement) && statement.expression) {\n const jsx = unwrapJsx(statement.expression);\n if (jsx) {\n return jsx;\n }\n }\n }\n return undefined;\n}\n\nfunction findJsxInFunctionBody(body: ts.ConciseBody): ts.JsxChild | undefined {\n if (ts.isBlock(body)) {\n return findJsxReturn(body);\n }\n return unwrapJsx(body);\n}\n\nfunction unwrapJsx(expression: ts.Expression): ts.JsxChild | undefined {\n let current: ts.Expression = expression;\n while (ts.isParenthesizedExpression(current)) {\n current = current.expression;\n }\n if (ts.isJsxElement(current) || ts.isJsxFragment(current) || ts.isJsxSelfClosingElement(current)) {\n return current;\n }\n return undefined;\n}\n\nfunction extractDefaultsFromParameters(\n parameters: readonly ts.ParameterDeclaration[],\n ctx: ConverterContext\n): Map<string, string> {\n const defaults = new Map<string, string>();\n if (!parameters.length) {\n return defaults;\n }\n const param = parameters[0];\n if (!ts.isObjectBindingPattern(param.name)) {\n return defaults;\n }\n for (const element of param.name.elements) {\n if (!element.initializer) {\n continue;\n }\n const propName = getBindingElementPropName(element, ctx.sourceFile);\n if (!propName) {\n ctx.warnings.push(\"Skipping complex destructured default value.\");\n continue;\n }\n defaults.set(propName, element.initializer.getText(ctx.sourceFile).trim());\n }\n return defaults;\n}\n\nfunction getBindingElementPropName(element: ts.BindingElement, sourceFile: ts.SourceFile): string | undefined {\n const prop = element.propertyName;\n if (prop) {\n if (ts.isIdentifier(prop) || ts.isStringLiteral(prop) || ts.isNumericLiteral(prop)) {\n return prop.text;\n }\n return prop.getText(sourceFile);\n }\n if (ts.isIdentifier(element.name)) {\n return element.name.text;\n }\n return undefined;\n}\n\nfunction getPropertyName(name: ts.PropertyName, sourceFile: ts.SourceFile): string | undefined {\n if (ts.isIdentifier(name)) {\n return name.text;\n }\n if (ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {\n return name.text;\n }\n return name.getText(sourceFile);\n}\n\nfunction buildPropsBlock(\n info: ComponentInfo,\n propDeclarations: Map<string, PropField[]>,\n ctx: ConverterContext\n): string[] {\n const fields =\n info.inlineProps ??\n (info.propsTypeName ? propDeclarations.get(info.propsTypeName) ?? [] : undefined) ??\n [];\n if (!fields.length && !info.defaults.size) {\n return [];\n }\n\n const lines = [\"props\"];\n if (fields.length) {\n for (const field of fields) {\n const def = info.defaults.get(field.name);\n let line = ` ${field.name}${field.optional ? \"?\" : \"\"}: ${field.typeText}`;\n if (def) {\n line += ` = ${def}`;\n }\n lines.push(line);\n }\n } else {\n for (const [name, defValue] of info.defaults.entries()) {\n lines.push(` ${name}: any = ${defValue}`);\n }\n }\n return lines;\n}\n\nfunction convertJsxNode(node: ts.JsxChild, ctx: ConverterContext, indent: number): string[] {\n if (ts.isJsxElement(node)) {\n return convertJsxElement(node, ctx, indent);\n }\n if (ts.isJsxSelfClosingElement(node)) {\n return convertJsxSelfClosing(node, ctx, indent);\n }\n if (ts.isJsxFragment(node)) {\n return convertJsxFragment(node, ctx, indent);\n }\n if (ts.isJsxText(node)) {\n return convertJsxText(node, ctx, indent);\n }\n if (ts.isJsxExpression(node)) {\n return convertJsxExpression(node, ctx, indent);\n }\n return [];\n}\n\nfunction convertJsxFragment(fragment: ts.JsxFragment, ctx: ConverterContext, indent: number): string[] {\n const lines: string[] = [];\n for (const child of fragment.children) {\n lines.push(...convertJsxNode(child, ctx, indent));\n }\n return lines;\n}\n\nfunction convertJsxElement(element: ts.JsxElement, ctx: ConverterContext, indent: number): string[] {\n const line = buildElementLine(element.openingElement, ctx, indent);\n const children: string[] = [];\n for (const child of element.children) {\n children.push(...convertJsxNode(child, ctx, indent + 1));\n }\n if (!children.length) {\n return [line];\n }\n return [line, ...children];\n}\n\nfunction convertJsxSelfClosing(element: ts.JsxSelfClosingElement, ctx: ConverterContext, indent: number): string[] {\n return [buildElementLine(element, ctx, indent)];\n}\n\nfunction buildElementLine(element: ts.JsxOpeningLikeElement, ctx: ConverterContext, indent: number): string {\n const indentStr = \" \".repeat(indent);\n const tagName = getTagName(element.tagName, ctx);\n const { classSegments, attributes } = convertAttributes(element.attributes, ctx);\n const classes = classSegments.length ? classSegments.map((cls) => `.${cls}`).join(\"\") : \"\";\n const attrString = attributes.length ? `(${attributes.join(\" \")})` : \"\";\n return `${indentStr}${tagName}${classes}${attrString}`;\n}\n\nfunction getTagName(tag: ts.JsxTagNameExpression, ctx: ConverterContext): string {\n const fallback = tag.getText(ctx.sourceFile);\n if (ts.isIdentifier(tag)) {\n return tag.text;\n }\n if (ts.isPropertyAccessExpression(tag)) {\n const left = getTagName(tag.expression as ts.JsxTagNameExpression, ctx);\n return `${left}.${tag.name.text}`;\n }\n if (tag.kind === ts.SyntaxKind.ThisKeyword) {\n return \"this\";\n }\n if (ts.isJsxNamespacedName(tag)) {\n return `${tag.namespace.text}:${tag.name.text}`;\n }\n return fallback;\n}\n\nfunction convertAttributes(attributes: ts.JsxAttributes, ctx: ConverterContext): {\n classSegments: string[];\n attributes: string[];\n} {\n const classSegments: string[] = [];\n const attrs: string[] = [];\n\n for (const attr of attributes.properties) {\n if (ts.isJsxAttribute(attr)) {\n const attrName = getAttributeName(attr.name, ctx);\n if (!attrName) {\n ctx.warnings.push(\"Skipping unsupported attribute name.\");\n continue;\n }\n if (attrName === \"className\" || attrName === \"class\") {\n const handled = handleClassAttribute(attr, ctx, classSegments, attrs);\n if (!handled) {\n attrs.push(formatAttribute(attrName === \"className\" ? \"className\" : attrName, attr.initializer, ctx));\n }\n continue;\n }\n attrs.push(formatAttribute(attrName, attr.initializer, ctx));\n } else if (ts.isJsxSpreadAttribute(attr)) {\n ctx.warnings.push(\"Spread attributes are not supported and were skipped.\");\n }\n }\n\n return { classSegments, attributes: attrs.filter(Boolean) };\n}\n\nfunction handleClassAttribute(\n attr: ts.JsxAttribute,\n ctx: ConverterContext,\n classSegments: string[],\n attrs: string[]\n): boolean {\n if (!attr.initializer) {\n return false;\n }\n if (ts.isStringLiteral(attr.initializer)) {\n classSegments.push(...splitClassNames(attr.initializer.text));\n return true;\n }\n if (ts.isJsxExpression(attr.initializer) && attr.initializer.expression) {\n const expressionText = attr.initializer.expression.getText(ctx.sourceFile).trim();\n attrs.push(`className={${expressionText}}`);\n return true;\n }\n ctx.warnings.push(\"Unsupported class attribute value; leaving as-is.\");\n return false;\n}\n\nfunction splitClassNames(value: string): string[] {\n return value\n .split(/\\s+/)\n .map((cls) => cls.trim())\n .filter(Boolean);\n}\n\nfunction formatAttribute(\n name: string,\n initializer: ts.JsxAttributeValue | undefined,\n ctx: ConverterContext\n): string {\n if (!initializer) {\n return name;\n }\n if (ts.isStringLiteral(initializer)) {\n return `${name}=\"${initializer.text}\"`;\n }\n if (ts.isJsxExpression(initializer)) {\n if (initializer.expression) {\n const expr = initializer.expression.getText(ctx.sourceFile).trim();\n return `${name}={${expr}}`;\n }\n return name;\n }\n ctx.warnings.push(\"Unsupported JSX attribute value; leaving as-is.\");\n return name;\n}\n\nfunction getAttributeName(name: ts.JsxAttributeName, ctx: ConverterContext): string | null {\n if (ts.isIdentifier(name)) {\n return name.text;\n }\n if (ts.isJsxNamespacedName(name)) {\n return `${name.namespace.text}:${name.name.text}`;\n }\n return null;\n}\n\nfunction convertJsxText(textNode: ts.JsxText, ctx: ConverterContext, indent: number): string[] {\n const text = textNode.getText(ctx.sourceFile).replace(/\\s+/g, \" \").trim();\n if (!text) {\n return [];\n }\n return [`${\" \".repeat(indent)}| ${text}`];\n}\n\nfunction convertJsxExpression(expressionNode: ts.JsxExpression, ctx: ConverterContext, indent: number): string[] {\n if (!expressionNode.expression) {\n return [];\n }\n const exprText = expressionNode.expression.getText(ctx.sourceFile).trim();\n if (!exprText) {\n return [];\n }\n return [`${\" \".repeat(indent)}{{ ${exprText} }}`];\n}\n"],"mappings":"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","names":["buildClassAliasEnvironment","emitElement","expandClasses","IGNORED_IDENTIFIERS","RESERVED_KEYWORDS","walkNodes","shouldIgnoreIdentifier","levelToSeverity","message","isIdentifierStart","isIdentifierPart","findPreviousNonSpace","jsxNode","exprStart","exprEnd","inner","hasErrors","normalizeDiagnostics","normalizeDiagnostics"]}