@collie-lang/compiler 1.0.0 → 2.0.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/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 ElementNode,\n Node,\n RootNode,\n TextNode\n} from \"./ast\";\n\nexport interface HtmlCodegenOptions {\n indent?: string;\n}\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 | \"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 { generateHtml } 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\n let code = createStubHtml();\n if (!hasErrors(diagnostics)) {\n code = generateHtml(document.root);\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(): string {\n return \"\";\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","emitElement","expandClasses","jsxNode","exprStart","exprEnd","inner"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@collie-lang/compiler",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "Collie compiler core (parser + diagnostics + TSX codegen).",
5
5
  "license": "MIT",
6
6
  "type": "module",