@aihu/compiler 1.3.3 → 1.3.5

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-wrapper.js","names":[],"sources":["../../js/codemods/state-wrapper/migrate.ts"],"sourcesContent":["/**\n * state-wrapper codemod (#487 §7 — waves 1 + 2, the app-corpus migration)\n *\n * Migrates an `.aihu` file's `@state` block from the retired forms to the\n * ratified wrapper model (`docs/plans/state-model/40-spec.md`):\n *\n * Stage 1 — `$`-macros → wrappers / statement calls / directives (§2, §3):\n * $prop: { x: { … } } → const|let x = prop<T>({ … })\n * $computed: { x: fn } → const x = derived(cfg?, fn)\n * $action: { f: fn } → const f = action(cfg?, fn)\n * $resource: { r: fn } → const r = resource(cfg?, fn)\n * $controller: { c: {value} }→ const c = controller(cfg?, factory)\n * $effect: fn / { name: fn } → effect(fn) / effect({ on: […] }, fn)\n * $lifecycle: { mount, … } → onMount(fn), onDispose(fn), …\n * $aria: { … } / $form: { … }→ aria({ … }) / form({ … })\n * $context: {provide,consume}→ provide('k', v) / const k = consume<T>('k')\n * $route name → const name = route()\n * $before/afterNavigate(fn) → beforeNavigate(fn) / afterNavigate(fn)\n * $extends: X / $shadow: 'm' → base: X / shadow: 'm'\n * bare typed decl `x: T = v` → let x = state(v) (reactive) |\n * plain let/const (inert; §3 row 21 + W627)\n *\n * Stage 2 — signal tuples → `state` (§7 wave 2), INCLUDING call sites:\n * const [x, setX] = signal(v) → let x = state(v)\n * x() → x\n * setX(v) → x = v (statement / handler)\n * setX(p => expr) → x = expr[p→x] (updater desugar)\n *\n * Byte-identity contract: `$`-macro migrations lower onto the SAME IR, so a\n * stage-1-only migration emits byte-identical JS (modulo the old parser's\n * `strip_line_comments` artifact — authored `//` comments inside metadata-bag\n * bodies were BLANKED in old emission and are preserved by the wrapper path).\n * To keep even whitespace stable, entry VALUE text is spliced verbatim — the\n * codemod never re-indents running code.\n *\n * Per-file dialect exclusivity (C625): a file either migrates fully or not at\n * all. Any unmappable `$`-form (e.g. the `mount:`-keyed `$controller`, which\n * has no wrapper equivalent) aborts the file with a warning. Authored signal\n * tuples are exempt from C625 (orthogonal), so a tuple pair whose setter is\n * used as a VALUE (not called) is kept authored, per-pair.\n */\n\nexport interface StateWrapperResult {\n readonly rewritten: string\n readonly warnings: readonly string[]\n /** True when the file was left byte-untouched (nothing to do, or aborted). */\n readonly skipped: boolean\n /** Which change classes were applied — drives the verification bucket. */\n readonly changes: {\n macros: boolean\n tuples: boolean\n bareTyped: boolean\n }\n /** Tuple pairs migrated: authored setter name → state binding name. */\n readonly renamedSetters: ReadonlyArray<{ getter: string; setter: string }>\n}\n\nexport interface StateWrapperOptions {\n /** Run only stage 1 ($-macros + bare typed decls). */\n macrosOnly?: boolean\n /** Run only stage 2 (signal tuples + call sites). */\n tuplesOnly?: boolean\n /**\n * Binding names that must stay PLAIN even when the reactive heuristic says\n * `state(…)` (e.g. a fixture guard depends on the plain-let lowering).\n */\n keepPlain?: readonly string[]\n}\n\nconst INDENT = ' '\n\n// ─── JS-aware scanning helpers ──────────────────────────────────────────────\n\nfunction skipString(s: string, i: number): number {\n const quote = s[i]!\n let j = i + 1\n while (j < s.length) {\n const c = s[j]\n if (c === '\\\\') {\n j += 2\n continue\n }\n if (quote === '`' && c === '$' && s[j + 1] === '{') {\n const close = matchBrace(s, j + 1)\n j = close < 0 ? s.length : close + 1\n continue\n }\n if (c === quote) return j + 1\n j++\n }\n return s.length\n}\n\n/** Matching `}` for the `{` at `i` (string/comment aware). */\nexport function matchBrace(s: string, i: number): number {\n if (s[i] !== '{') return -1\n let depth = 0\n let j = i\n while (j < s.length) {\n const c = s[j]\n if (c === '/' && s[j + 1] === '/') {\n const nl = s.indexOf('\\n', j)\n j = nl < 0 ? s.length : nl\n continue\n }\n if (c === '/' && s[j + 1] === '*') {\n const end = s.indexOf('*/', j + 2)\n j = end < 0 ? s.length : end + 2\n continue\n }\n if (c === '\"' || c === \"'\" || c === '`') {\n j = skipString(s, j)\n continue\n }\n if (c === '{') depth++\n else if (c === '}') {\n depth--\n if (depth === 0) return j\n }\n j++\n }\n return -1\n}\n\n/** Matching `)` for the `(` at `i` (string/comment/brace aware). */\nexport function matchParen(s: string, i: number): number {\n if (s[i] !== '(') return -1\n let depth = 0\n let j = i\n while (j < s.length) {\n const c = s[j]\n if (c === '/' && s[j + 1] === '/') {\n const nl = s.indexOf('\\n', j)\n j = nl < 0 ? s.length : nl\n continue\n }\n if (c === '/' && s[j + 1] === '*') {\n const end = s.indexOf('*/', j + 2)\n j = end < 0 ? s.length : end + 2\n continue\n }\n if (c === '\"' || c === \"'\" || c === '`') {\n j = skipString(s, j)\n continue\n }\n if (c === '{') {\n const close = matchBrace(s, j)\n j = close < 0 ? s.length : close + 1\n continue\n }\n if (c === '(') depth++\n else if (c === ')') {\n depth--\n if (depth === 0) return j\n }\n j++\n }\n return -1\n}\n\n/** Split `{…}`-stripped object-literal text at top-level commas. */\nfunction splitTopLevelCommas(s: string): string[] {\n const out: string[] = []\n let start = 0\n let j = 0\n let depthParen = 0\n let depthBrace = 0\n let depthBracket = 0\n const depthAngle = 0\n while (j < s.length) {\n const c = s[j]\n if (c === '/' && s[j + 1] === '/') {\n const nl = s.indexOf('\\n', j)\n j = nl < 0 ? s.length : nl\n continue\n }\n if (c === '/' && s[j + 1] === '*') {\n const end = s.indexOf('*/', j + 2)\n j = end < 0 ? s.length : end + 2\n continue\n }\n if (c === '\"' || c === \"'\" || c === '`') {\n j = skipString(s, j)\n continue\n }\n if (c === '(') depthParen++\n else if (c === ')') depthParen--\n else if (c === '{') depthBrace++\n else if (c === '}') depthBrace--\n else if (c === '[') depthBracket++\n else if (c === ']') depthBracket--\n else if (c === '<' && depthAngle >= 0 && /[A-Za-z0-9_$>\\s]/.test(s[j + 1] ?? '')) {\n // Track angle depth loosely; `=>` never reaches here because the `=`\n // branch below runs first when scanning left-to-right.\n } else if (\n c === ',' &&\n depthParen === 0 &&\n depthBrace === 0 &&\n depthBracket === 0 &&\n depthAngle === 0\n ) {\n out.push(s.slice(start, j))\n start = j + 1\n }\n j++\n }\n if (s.slice(start).trim() !== '') out.push(s.slice(start))\n return out\n}\n\n/**\n * Parse one collection entry `name: value` — the value keeps its raw text\n * (newlines and indentation included; splicing is verbatim by contract).\n */\ninterface Entry {\n name: string\n value: string\n /** Comment lines preceding the entry inside the collection body. */\n leading: string\n}\n\nfunction parseEntries(inner: string): Entry[] {\n const entries: Entry[] = []\n for (const piece of splitTopLevelCommas(inner)) {\n const withoutLead = piece.replace(/^\\s*\\n/, '')\n // Separate leading comment lines from the entry itself.\n const lines = withoutLead.split('\\n')\n let k = 0\n const leadingLines: string[] = []\n while (k < lines.length) {\n const t = lines[k]!.trim()\n if (t === '' || t.startsWith('//') || t.startsWith('/*') || t.startsWith('*')) {\n leadingLines.push(lines[k]!)\n k++\n continue\n }\n break\n }\n const rest = lines.slice(k).join('\\n')\n const m = /^\\s*([A-Za-z_$][\\w$]*)\\s*:/.exec(rest)\n if (!m) continue\n entries.push({\n name: m[1]!,\n value: rest.slice(m[0].length).replace(/^[ \\t]/, ''),\n leading: leadingLines.join('\\n'),\n })\n }\n return entries\n}\n\n/** Parse a metadata bag `{ key: value, … }` into raw key/value pairs. */\nfunction parseMetaPairs(objText: string): Map<string, string> | null {\n const t = objText.trim()\n if (!t.startsWith('{')) return null\n const close = matchBrace(t, 0)\n if (close < 0) return null\n const inner = t.slice(1, close)\n const pairs = new Map<string, string>()\n for (const piece of splitTopLevelCommas(inner)) {\n const m = /^\\s*([A-Za-z_$][\\w$]*)\\s*:/.exec(piece)\n if (!m) continue\n pairs.set(\n m[1]!,\n piece\n .slice(m[0].length)\n .replace(/^[ \\t]/, '')\n .replace(/\\s+$/, ''),\n )\n }\n return pairs\n}\n\n/** Whether `expr` is a function expression (arrow or `function`). */\nfunction isFnExpr(expr: string): boolean {\n const t = expr.trim()\n if (t.startsWith('function')) return true\n if (/^async\\b/.test(t)) return true\n if (t.startsWith('(')) {\n const close = matchParen(t, 0)\n if (close < 0) return false\n const after = t.slice(close + 1).trimStart()\n if (after.startsWith('=>')) return true\n // Return-type annotation: `(args): Type => …`.\n if (after.startsWith(':')) {\n const arrowAt = after.indexOf('=>')\n return arrowAt > 0\n }\n return false\n }\n return /^[A-Za-z_$][\\w$]*\\s*=>/.test(t)\n}\n\n// ─── Block location ─────────────────────────────────────────────────────────\n\ninterface BlockSpan {\n start: number\n end: number\n bodyStart: number\n bodyEnd: number\n body: string\n}\n\nfunction findBlock(source: string, name: string): BlockSpan | null {\n const re = new RegExp(`(^|\\\\n)([ \\\\t]*)@${name}\\\\s*\\\\{`, 'g')\n const m = re.exec(source)\n if (!m) return null\n const start = m.index + (m[1] === '\\n' ? 1 : 0)\n const openIdx = m.index + m[0].length - 1\n const closeIdx = matchBrace(source, openIdx)\n if (closeIdx < 0) return null\n return {\n start,\n end: closeIdx + 1,\n bodyStart: openIdx + 1,\n bodyEnd: closeIdx,\n body: source.slice(openIdx + 1, closeIdx),\n }\n}\n\n// ─── Write / read detection (the nature + reactivity heuristics) ────────────\n\n/** Escape every regex-special char, not just `$` — `name`/`getter`/`setter`\n * here are always JS/TS identifiers, so backslash never actually appears,\n * but a full escape is one line and removes the ambiguity CodeQL's\n * js/incomplete-sanitization flags in the `$`-only version. */\nfunction escapeRegex(literal: string): string {\n return literal.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * Does `code` WRITE `name`? Assignment (plain or compound) or update\n * expression. `==`/`===`/`=>`/`<=`/`>=`/`!=` never match: the operator char\n * preceding `=` breaks the `name\\s*OP=` shape, and the lookahead rejects\n * `==`/`=>` after a bare `=`.\n */\nfunction writesName(code: string, name: string): boolean {\n const esc = escapeRegex(name)\n const re = new RegExp(\n `\\\\b${esc}\\\\s*(\\\\+\\\\+|--|(?:\\\\+|-|\\\\*|/|%|\\\\*\\\\*|&&|\\\\|\\\\||\\\\?\\\\?|&|\\\\||\\\\^|<<|>>>?)?=(?![=>]))`,\n )\n return re.test(code)\n}\n\nfunction readsName(code: string, name: string): boolean {\n const esc = escapeRegex(name)\n return new RegExp(`\\\\b${esc}\\\\b`).test(code)\n}\n\n/** Template two-way bindings (`bind:value={name}`) WRITE their target. */\nfunction bindWrites(templateText: string, name: string): boolean {\n const esc = escapeRegex(name)\n return new RegExp(`\\\\bbind:[\\\\w-]+=\\\\{\\\\s*${esc}\\\\s*\\\\}`).test(templateText)\n}\n\n// ─── Stage 1: $-macros + bare typed declarations ────────────────────────────\n\n/** TS spelling for a v2 `type:` value (String → string, quoted → unquoted). */\nfunction tsType(raw: string): string {\n const t = raw.trim()\n // Unquote only a SINGLE string literal (`type: 'string'`); a union of\n // literal types (`'a' | 'b'`) also starts and ends with a quote but must\n // stay verbatim.\n const isOneLiteral =\n ((t.startsWith(\"'\") && t.endsWith(\"'\")) || (t.startsWith('\"') && t.endsWith('\"'))) &&\n !t.slice(1, -1).includes(t[0]!)\n const unq = isOneLiteral ? t.slice(1, -1) : t\n switch (unq) {\n case 'String':\n return 'string'\n case 'Number':\n return 'number'\n case 'Boolean':\n return 'boolean'\n case 'Array':\n return 'unknown[]'\n case 'Object':\n return 'Record<string, unknown>'\n default:\n return unq\n }\n}\n\n/** Is the default literal rich enough that `prop<T>` inference covers it? */\nfunction defaultCarriesType(typeRaw: string | undefined, defaultRaw: string | undefined): boolean {\n if (defaultRaw === undefined) return false\n const d = defaultRaw.trim()\n if (d === 'null' || d === 'undefined' || d === '[]' || d === '{}') return false\n if (!typeRaw) return true\n const t = typeRaw.trim()\n // Constructor hints (String/Number/Boolean/Array/Object) are fully covered\n // by a concrete default; real TS types (unions, generics) are kept.\n return /^(String|Number|Boolean|Array|Object)$/.test(t)\n}\n\n/** `expose: { read: true, write: true }` → the §6.1 shorthand. */\nfunction exposeShorthand(raw: string): string {\n const pairs = parseMetaPairs(raw.trim())\n if (pairs) {\n const read = pairs.get('read')?.trim() === 'true'\n const write = pairs.get('write')?.trim() === 'true'\n const extraneous = [...pairs.keys()].some((k) => k !== 'read' && k !== 'write')\n if (!extraneous) {\n if (read && write) return `'read write'`\n if (read) return `'read'`\n if (write) return `'write'`\n }\n }\n return raw.trim()\n}\n\ninterface StageState {\n warnings: string[]\n changedMacros: boolean\n changedBareTyped: boolean\n aborted: boolean\n}\n\n/**\n * Build the wrapper declaration for one `$prop` entry.\n * `mutable` decides the nature (`let` vs `const`) — the §2.2 axes.\n */\nfunction emitPropDecl(entry: Entry, mutable: boolean): string {\n const meta = parseMetaPairs(entry.value)\n if (!meta) return `${INDENT}// UNMIGRATABLE $prop entry ${entry.name}`\n const typeRaw = meta.get('type')\n const defaultRaw = meta.get('default')\n const parts: string[] = []\n if (defaultRaw !== undefined) parts.push(`default: ${defaultRaw}`)\n const describe = meta.get('describe')\n if (describe !== undefined) parts.push(`describe: ${describe}`)\n const expose = meta.get('expose')\n if (expose !== undefined) parts.push(`expose: ${exposeShorthand(expose)}`)\n const attribute = meta.get('attribute')\n if (attribute !== undefined) parts.push(`attribute: ${attribute}`)\n const reflect = meta.get('reflect')\n if (reflect !== undefined) parts.push(`reflect: ${reflect}`)\n const required = meta.get('required')\n if (required !== undefined) parts.push(`required: ${required}`)\n\n const generic = typeRaw && !defaultCarriesType(typeRaw, defaultRaw) ? `<${tsType(typeRaw)}>` : ''\n const nature = mutable ? 'let' : 'const'\n const head = `${INDENT}${nature} ${entry.name} = prop${generic}(`\n if (parts.length === 0) return `${head})`\n const inline = `${head}{ ${parts.join(', ')} })`\n if (!inline.includes('\\n') && inline.length <= 100) return inline\n // Multi-line config: one key per line. Values keep their raw text.\n const lines = [`${head}{`]\n for (const p of parts) lines.push(`${INDENT}${INDENT}${p},`)\n lines.push(`${INDENT}})`)\n return lines.join('\\n')\n}\n\n/**\n * Config-first wrapper call for computed/action/resource/controller entries.\n * The running-code text is spliced VERBATIM (byte-identity contract).\n */\nfunction emitConfigFirstDecl(\n wrapper: 'derived' | 'action' | 'resource' | 'controller' | 'effect',\n name: string | null,\n meta: Map<string, string> | null,\n fnRaw: string,\n): string {\n const decl = name === null ? `${INDENT}${wrapper}(` : `${INDENT}const ${name} = ${wrapper}(`\n const cfgParts: string[] = []\n if (meta) {\n const describe = meta.get('describe')\n if (describe !== undefined) cfgParts.push(`describe: ${describe}`)\n const expose = meta.get('expose')\n if (expose !== undefined) cfgParts.push(`expose: ${exposeShorthand(expose)}`)\n const on = meta.get('on')\n if (on !== undefined) cfgParts.push(`on: ${on}`)\n }\n const fn = fnRaw.replace(/\\s+$/, '')\n if (cfgParts.length === 0) return `${decl}${fn})`\n const cfgInline = `{ ${cfgParts.join(', ')} }`\n if (!cfgInline.includes('\\n') && decl.length + cfgInline.length <= 98) {\n return `${decl}\\n${INDENT}${INDENT}${cfgInline},\\n${INDENT}${INDENT}${fn})`\n }\n const lines = [`${decl}`, `${INDENT}${INDENT}{ ${cfgParts.join(`,\\n${INDENT}${INDENT} `)} },`]\n lines.push(`${INDENT}${INDENT}${fn})`)\n return lines.join('\\n')\n}\n\n/** One `$computed`/`$action`/`$resource` entry → wrapper declaration. */\nfunction emitValueEntryDecl(\n wrapper: 'derived' | 'action' | 'resource',\n entry: Entry,\n st: StageState,\n): string | null {\n const codeKey = wrapper === 'action' ? 'handler' : 'value'\n if (isFnExpr(entry.value)) {\n return emitConfigFirstDecl(wrapper, entry.name, null, entry.value)\n }\n const meta = parseMetaPairs(entry.value)\n if (!meta) {\n st.warnings.push(`unrecognized ${wrapper} entry shape for '${entry.name}'`)\n return null\n }\n const fn = meta.get(codeKey)\n if (fn === undefined) {\n st.warnings.push(`${wrapper} entry '${entry.name}' has no ${codeKey}: key`)\n return null\n }\n // Refuse silent metadata loss: only describe/expose (+ the code key) map.\n for (const k of meta.keys()) {\n if (k !== 'describe' && k !== 'expose' && k !== codeKey) {\n st.warnings.push(`${wrapper} entry '${entry.name}' carries unmapped key '${k}:'`)\n return null\n }\n }\n return emitConfigFirstDecl(wrapper, entry.name, meta, fn)\n}\n\nfunction migrateStateMacrosBody(\n body: string,\n templateText: string,\n st: StageState,\n keepPlain: ReadonlySet<string>,\n): string {\n // Reactive-read corpus for the bare-typed heuristic: the template plus\n // every derivation-position body ($computed/$form/$aria/$resource values).\n // A colon-form field read there needs real reactivity → state(). $effect\n // bodies are deliberately EXCLUDED: a field both read and written inside\n // one effect (the debounce-timer idiom) would, as a signal, re-trigger its\n // own effect — the inert plain `let` is the faithful migration there.\n let derivationText = ''\n {\n const re = /^[ \\t]*\\$(computed|form|aria|resource)\\s*:\\s*\\{/gm\n let m: RegExpExecArray | null = re.exec(body)\n while (m !== null) {\n const open = m.index + m[0].length - 1\n const close = matchBrace(body, open)\n if (close > 0) derivationText += body.slice(open, close + 1)\n m = re.exec(body)\n }\n }\n const reactiveReadCorpus = `${templateText}\\n${derivationText}`\n\n const out: string[] = []\n let i = 0\n while (i < body.length) {\n const nl = body.indexOf('\\n', i)\n const lineEnd = nl < 0 ? body.length : nl\n const lineRaw = body.slice(i, lineEnd)\n const line = lineRaw.trim()\n const indentLen = lineRaw.length - lineRaw.trimStart().length\n const lineStart = i + indentLen\n\n // ── $-collections ──────────────────────────────────────────────────────\n const coll =\n /^\\$(prop|computed|action|resource|effect|lifecycle|aria|form|context|controller|event|stream|extract)\\s*:\\s*/.exec(\n line,\n )\n if (coll) {\n const kind = coll[1]!\n const afterColon = lineStart + coll[0].length\n // `$effect: () => …` — anonymous statement form.\n if (kind === 'effect' && body[afterColon] !== '{') {\n const fnStart = afterColon\n const end = scanArrowEnd(body, fnStart)\n if (end < 0) {\n st.warnings.push('unparseable anonymous $effect — file left unmigrated')\n st.aborted = true\n return body\n }\n const fn = body.slice(fnStart, end).replace(/\\s+$/, '')\n out.push(`${INDENT}effect(${fn})`)\n st.changedMacros = true\n i = end\n if (body[i] === ';') i++\n if (body[i] === '\\n') i++\n continue\n }\n if (body[afterColon] !== '{') {\n st.warnings.push(`unrecognized $${kind} value shape — file left unmigrated`)\n st.aborted = true\n return body\n }\n const close = matchBrace(body, afterColon)\n if (close < 0) {\n st.aborted = true\n return body\n }\n const inner = body.slice(afterColon + 1, close)\n const entries = parseEntries(inner)\n const decls: string[] = []\n const push = (leading: string, text: string | null) => {\n if (text === null) {\n st.aborted = true\n return\n }\n if (leading.trim()) decls.push(leading.replace(/\\s+$/, ''))\n decls.push(text)\n }\n switch (kind) {\n case 'prop': {\n for (const e of entries) {\n const mutable =\n writesName(body, e.name) ||\n writesName(templateText, e.name) ||\n bindWrites(templateText, e.name)\n push(e.leading, emitPropDecl(e, mutable))\n }\n break\n }\n case 'computed':\n case 'action':\n case 'resource': {\n const wrapper = kind === 'computed' ? 'derived' : (kind as 'action' | 'resource')\n for (const e of entries) push(e.leading, emitValueEntryDecl(wrapper, e, st))\n break\n }\n case 'effect': {\n for (const e of entries) {\n if (isFnExpr(e.value)) {\n push(e.leading, `${INDENT}effect(${e.value.replace(/\\s+$/, '')})`)\n } else {\n const meta = parseMetaPairs(e.value)\n const fn = meta?.get('value')\n if (!meta || fn === undefined) {\n st.warnings.push(`$effect entry '${e.name}' unrecognized — file left unmigrated`)\n st.aborted = true\n return body\n }\n push(e.leading, emitConfigFirstDecl('effect', null, meta, fn))\n }\n }\n break\n }\n case 'lifecycle': {\n const hookFor: Record<string, string> = {\n mount: 'onMount',\n dispose: 'onDispose',\n adopt: 'onAdopt',\n attributeChange: 'onAttributeChange',\n }\n for (const e of entries) {\n const hook = hookFor[e.name]\n if (!hook) {\n st.warnings.push(`unknown $lifecycle key '${e.name}' — file left unmigrated`)\n st.aborted = true\n return body\n }\n push(e.leading, `${INDENT}${hook}(${e.value.replace(/\\s+$/, '')})`)\n }\n break\n }\n case 'aria':\n case 'form': {\n // One config object, inner text verbatim.\n const innerTrimmed = inner.replace(/^\\s*\\n/, '').replace(/\\s+$/, '')\n push('', `${INDENT}${kind}({\\n${innerTrimmed}\\n${INDENT}})`)\n break\n }\n case 'context': {\n for (const e of entries) {\n if (e.name === 'provide') {\n const sub = parseMetaPairs(e.value)\n if (!sub) {\n st.aborted = true\n return body\n }\n for (const [key, valObj] of sub) {\n const valMeta = parseMetaPairs(valObj)\n const value = valMeta?.get('value')\n if (value === undefined) {\n st.warnings.push(`$context provide '${key}' has no value: — file left unmigrated`)\n st.aborted = true\n return body\n }\n push(e.leading, `${INDENT}provide('${key}', ${value})`)\n }\n } else if (e.name === 'consume') {\n const sub = parseMetaPairs(e.value)\n if (!sub) {\n st.aborted = true\n return body\n }\n for (const [key, valObj] of sub) {\n const valMeta = parseMetaPairs(valObj)\n const typeRaw = valMeta?.get('type')\n const generic = typeRaw ? `<${tsType(typeRaw)}>` : ''\n push(e.leading, `${INDENT}const ${key} = consume${generic}('${key}')`)\n }\n } else {\n st.aborted = true\n return body\n }\n }\n break\n }\n case 'controller': {\n for (const e of entries) {\n const meta = parseMetaPairs(e.value)\n const factory = meta?.get('value')\n if (!meta || factory === undefined) {\n st.warnings.push(\n `$controller entry '${e.name}' has no value: factory (the mount:-keyed shape ` +\n `has no wrapper equivalent) — file left unmigrated`,\n )\n st.aborted = true\n return body\n }\n push(e.leading, emitConfigFirstDecl('controller', e.name, meta, factory))\n }\n break\n }\n case 'extract': {\n // Directive rename only; value verbatim.\n push('', `${INDENT}extract: ${body.slice(afterColon, close + 1)}`)\n break\n }\n default: {\n st.warnings.push(`$${kind} has no app-corpus mapping — file left unmigrated`)\n st.aborted = true\n return body\n }\n }\n if (st.aborted) return body\n out.push(decls.join('\\n'))\n st.changedMacros = true\n i = close + 1\n if (body[i] === ';') i++\n if (body[i] === '\\n') i++\n continue\n }\n\n // ── Directives + dedicated forms ───────────────────────────────────────\n const extendsM = /^\\$extends\\s*:\\s*(.+)$/.exec(line)\n if (extendsM) {\n out.push(`${' '.repeat(indentLen)}base: ${extendsM[1]!.trim()}`)\n st.changedMacros = true\n i = lineEnd + 1\n continue\n }\n const shadowM = /^\\$shadow\\s*:\\s*(.+)$/.exec(line)\n if (shadowM) {\n out.push(`${' '.repeat(indentLen)}shadow: ${shadowM[1]!.trim()}`)\n st.changedMacros = true\n i = lineEnd + 1\n continue\n }\n const routeM = /^\\$route\\s+([A-Za-z_$][\\w$]*)\\s*;?$/.exec(line)\n if (routeM) {\n out.push(`${' '.repeat(indentLen)}const ${routeM[1]} = route()`)\n st.changedMacros = true\n i = lineEnd + 1\n continue\n }\n if (/^\\$(beforeNavigate|afterNavigate)\\s*\\(/.test(line)) {\n const parenIdx = body.indexOf('(', lineStart)\n const close = matchParen(body, parenIdx)\n if (close < 0) {\n st.aborted = true\n return body\n }\n let end = close + 1\n if (body[end] === ';') end++\n out.push(`${' '.repeat(indentLen)}${body.slice(lineStart + 1, end)}`)\n st.changedMacros = true\n i = end\n if (body[i] === '\\n') i++\n continue\n }\n if (line.startsWith('$')) {\n st.warnings.push(`unmapped macro form '${line.split(/\\s|\\(|:/)[0]}' — file left unmigrated`)\n st.aborted = true\n return body\n }\n\n // ── Bare typed declaration `name: T = v` (§3 row 21) ───────────────────\n const bare = /^([A-Za-z_$][\\w$]*)\\s*:\\s*([^=\\n]+?)\\s*=\\s*(.+?);?\\s*$/.exec(line)\n if (\n bare &&\n !/^(if|else|for|while|return|case|default|import|export|type|interface)\\b/.test(line)\n ) {\n const name = bare[1]!\n const typeRaw = bare[2]!.trim()\n const init = bare[3]!.trim()\n const ws = ' '.repeat(indentLen)\n const written =\n writesName(stripSpan(body, i, lineEnd), name) ||\n writesName(templateText, name) ||\n bindWrites(templateText, name)\n const reactivelyRead = readsName(reactiveReadCorpus, name)\n if (written && reactivelyRead && !keepPlain.has(name)) {\n const inferrable =\n /^(-?\\d|'|\"|`|true$|false$)/.test(init) && init !== 'null' && init !== 'undefined'\n const generic = inferrable ? '' : `<${typeRaw}>`\n out.push(`${ws}let ${name} = state${generic}(${init})`)\n } else if (written) {\n out.push(`${ws}let ${name}: ${typeRaw} = ${init}`)\n } else {\n out.push(`${ws}const ${name}: ${typeRaw} = ${init}`)\n }\n st.changedBareTyped = true\n i = lineEnd + 1\n continue\n }\n\n // ── Everything else: verbatim, consuming balanced multi-line statements\n const stmtEnd = consumeBalancedStatement(body, i)\n out.push(body.slice(i, stmtEnd).replace(/\\n$/, ''))\n i = stmtEnd\n }\n return out.join('\\n')\n}\n\n/** Remove a span (decl's own line) so self-matches don't count as writes. */\nfunction stripSpan(s: string, start: number, end: number): string {\n return s.slice(0, start) + s.slice(end)\n}\n\n/** Consume one whole statement (through balanced brackets) incl. newline. */\nfunction consumeBalancedStatement(body: string, start: number): number {\n let depth = 0\n let j = start\n while (j < body.length) {\n const c = body[j]!\n if (c === '/' && body[j + 1] === '/') {\n const nl = body.indexOf('\\n', j)\n j = nl < 0 ? body.length : nl\n continue\n }\n if (c === '/' && body[j + 1] === '*') {\n const end = body.indexOf('*/', j + 2)\n j = end < 0 ? body.length : end + 2\n continue\n }\n if (c === '\"' || c === \"'\" || c === '`') {\n j = skipString(body, j)\n continue\n }\n if (c === '(' || c === '{' || c === '[') depth++\n else if (c === ')' || c === '}' || c === ']') depth--\n else if (c === '\\n' && depth <= 0) return j + 1\n j++\n }\n return body.length\n}\n\n/** End offset (exclusive) of an arrow/function expression at `start`. */\nfunction scanArrowEnd(s: string, start: number): number {\n let p = start\n while (p < s.length && /[ \\t]/.test(s[p]!)) p++\n if (s.slice(p, p + 5) === 'async') {\n p += 5\n while (p < s.length && /[ \\t]/.test(s[p]!)) p++\n }\n if (s.slice(p, p + 8) === 'function') {\n const braceIdx = s.indexOf('{', p)\n if (braceIdx < 0) return -1\n const close = matchBrace(s, braceIdx)\n return close < 0 ? -1 : close + 1\n }\n if (s[p] === '(') {\n const parenClose = matchParen(s, p)\n if (parenClose < 0) return -1\n p = parenClose + 1\n } else {\n // single-ident param\n const m = /^[A-Za-z_$][\\w$]*/.exec(s.slice(p))\n if (!m) return -1\n p += m[0].length\n }\n while (p < s.length && /[ \\t]/.test(s[p]!)) p++\n if (s[p] === ':') {\n const arrowAt = s.indexOf('=>', p)\n if (arrowAt < 0) return -1\n p = arrowAt\n }\n if (s.slice(p, p + 2) !== '=>') return -1\n p += 2\n while (p < s.length && /[ \\t]/.test(s[p]!)) p++\n if (s[p] === '{') {\n const close = matchBrace(s, p)\n return close < 0 ? -1 : close + 1\n }\n // Expression body: to end of line (top-level).\n const nl = s.indexOf('\\n', p)\n return nl < 0 ? s.length : nl\n}\n\n// ─── Stage 2: signal tuples ─────────────────────────────────────────────────\n\ninterface TuplePair {\n getter: string\n setter: string | null\n generic: string\n init: string\n declStart: number\n declEnd: number\n}\n\nfunction findTuples(body: string, offset: number): TuplePair[] {\n const pairs: TuplePair[] = []\n const re =\n /(^|\\n)([ \\t]*)(?:const|let)\\s*\\[\\s*([A-Za-z_$][\\w$]*)\\s*(?:,\\s*([A-Za-z_$][\\w$]*)\\s*)?\\]\\s*=\\s*signal\\b/g\n let m: RegExpExecArray | null = re.exec(body)\n while (m !== null) {\n const declStart = m.index + m[1]!.length + m[2]!.length\n let p = m.index + m[0].length\n let generic = ''\n if (body[p] === '<') {\n // balanced angle scan\n let depth = 1\n let j = p + 1\n while (j < body.length && depth > 0) {\n if (body[j] === '<') depth++\n else if (body[j] === '>') depth--\n j++\n }\n generic = body.slice(p, j)\n p = j\n }\n if (body[p] !== '(') {\n m = re.exec(body)\n continue\n }\n const close = matchParen(body, p)\n if (close < 0) {\n m = re.exec(body)\n continue\n }\n const init = body.slice(p + 1, close)\n let declEnd = close + 1\n if (body[declEnd] === ';') declEnd++\n pairs.push({\n getter: m[3]!,\n setter: m[4] ?? null,\n generic,\n init,\n declStart: declStart + offset,\n declEnd: declEnd + offset,\n })\n m = re.exec(body)\n }\n return pairs\n}\n\n/** All indexes of `name(` call heads in `text` (word-boundary). */\nfunction callSites(text: string, name: string): number[] {\n const out: number[] = []\n const esc = escapeRegex(name)\n const re = new RegExp(`(?<![\\\\w$.])${esc}\\\\s*\\\\(`, 'g')\n let m: RegExpExecArray | null = re.exec(text)\n while (m !== null) {\n out.push(m.index)\n m = re.exec(text)\n }\n return out\n}\n\n/** Rewrite one setter call `setX(ARG)` → assignment text. */\nfunction rewriteSetterCall(\n text: string,\n at: number,\n setter: string,\n getter: string,\n warnings: string[],\n): { replaced: string; start: number; end: number } | null {\n const parenIdx = text.indexOf('(', at + setter.length - 1)\n const open = text.indexOf('(', at)\n const close = matchParen(text, open)\n if (close < 0) return null\n void parenIdx\n const arg = text.slice(open + 1, close).trim()\n\n // Updater form: `p => expr` / `(p) => expr` / `(p: T) => expr`.\n let rhs: string | null = null\n const upd =\n /^(?:\\(\\s*([A-Za-z_$][\\w$]*)\\s*(?::[^)]*)?\\)|([A-Za-z_$][\\w$]*))\\s*=>\\s*([\\s\\S]+)$/.exec(arg)\n if (upd) {\n const param = upd[1] ?? upd[2]!\n const bodyExpr = upd[3]!.trim()\n if (bodyExpr.startsWith('{')) {\n warnings.push(\n `updater with block body at ${setter}(${arg.slice(0, 30)}…) — kept as an IIFE over the current value`,\n )\n rhs = `(${arg})(${getter})`\n } else {\n const esc = escapeRegex(param)\n rhs = bodyExpr.replace(new RegExp(`\\\\b${esc}\\\\b`, 'g'), getter)\n }\n } else {\n rhs = arg\n }\n\n // Context: statement / arrow-body / expression position.\n let k = at - 1\n while (k >= 0 && /[ \\t]/.test(text[k]!)) k--\n const isArrowBody = k >= 1 && text[k] === '>' && text[k - 1] === '='\n // Walk back over `await`.\n let stmtProbe = k\n const beforeWord = /(?:^|[\\s;{}])await$/.exec(text.slice(Math.max(0, k - 6), k + 1))\n if (beforeWord) stmtProbe = k - 5 - 1\n const prevCh = stmtProbe >= 0 ? text[stmtProbe] : '\\n'\n const isStatement = prevCh === '\\n' || prevCh === ';' || prevCh === '{' || stmtProbe < 0\n\n let replaced: string\n if (isArrowBody) {\n replaced = `{ ${getter} = ${rhs} }`\n } else if (isStatement) {\n replaced = `${getter} = ${rhs}`\n } else {\n replaced = `(${getter} = ${rhs})`\n }\n const end = close + 1\n return { replaced, start: at, end }\n}\n\nfunction migrateTuplesIn(\n source: string,\n st: { warnings: string[]; changedTuples: boolean },\n renamed: Array<{ getter: string; setter: string }>,\n): string {\n const state = findBlock(source, 'state')\n if (!state) return source\n const pairs = findTuples(state.body, state.bodyStart)\n if (pairs.length === 0) return source\n\n let text = source\n // Process pairs last-to-first so recorded spans stay valid.\n for (const pair of [...pairs].reverse()) {\n const { getter, setter } = pair\n // Guard: setter referenced as a VALUE (not a call) anywhere → keep pair.\n if (setter) {\n const esc = escapeRegex(setter)\n const valueUse = new RegExp(`(?<![\\\\w$.'\"\\`])${esc}(?![\\\\w$]|\\\\s*\\\\()`)\n const outsideDecl = stripSpan(text, pair.declStart, pair.declEnd)\n if (valueUse.test(outsideDecl)) {\n st.warnings.push(\n `tuple [${getter}, ${setter}] kept authored — the setter is used as a value ` +\n `(cannot be expressed as a state binding during the compat window)`,\n )\n continue\n }\n }\n\n // 1. Setter calls → assignments (whole file: @state body + @template).\n if (setter) {\n let sites = callSites(text, setter)\n // Skip the declaration site itself.\n sites = sites.filter((idx) => idx < pair.declStart || idx >= pair.declEnd)\n for (const idx of sites.reverse()) {\n const r = rewriteSetterCall(text, idx, setter, getter, st.warnings)\n if (!r) {\n st.warnings.push(`unbalanced ${setter}(…) call — left untouched`)\n continue\n }\n text = text.slice(0, r.start) + r.replaced + text.slice(r.end)\n }\n }\n\n // 2. Getter reads `x()` → `x` (whole file; empty-arg calls only).\n {\n const esc = escapeRegex(getter)\n // Reject member reads (`obj.x()`) but allow spread (`...x()`): the\n // preceding dot only blocks when it is not itself part of `...`.\n text = text.replace(\n new RegExp(`(?<![\\\\w$])(?<!(?<!\\\\.)\\\\.)${esc}\\\\s*\\\\(\\\\s*\\\\)`, 'g'),\n getter,\n )\n }\n\n // 3. The declaration itself. Re-locate it (upstream edits shifted spans\n // only AFTER the decl, but re-find defensively).\n {\n const esc = escapeRegex(getter)\n const declRe = new RegExp(\n `(?:const|let)\\\\s*\\\\[\\\\s*${esc}\\\\s*(?:,\\\\s*[A-Za-z_$][\\\\w$]*\\\\s*)?\\\\]\\\\s*=\\\\s*signal(<[^\\\\n]*?>)?\\\\(`,\n )\n const dm = declRe.exec(text)\n if (dm) {\n const open = text.indexOf('(', dm.index + dm[0].length - 1)\n const close = matchParen(text, open)\n if (close > 0) {\n let declEnd = close + 1\n if (text[declEnd] === ';') declEnd++\n const generic = dm[1] ?? ''\n const init = text.slice(open + 1, close)\n // An object-literal initial value must be parenthesized: the\n // one-signature rule parses `state({…})` as the reserved CONFIG\n // bag (split_config_fn), so a bare `{}` init is C629.\n const initOut = init.trim().startsWith('{') ? `(${init})` : init\n text =\n text.slice(0, dm.index) +\n `let ${getter} = state${generic}(${initOut})` +\n text.slice(declEnd)\n }\n }\n }\n\n st.changedTuples = true\n if (setter) renamed.push({ getter, setter })\n }\n\n // Drop the `signal` import when no `signal(`/`signal<` use remains.\n if (!/\\bsignal\\s*[(<]/.test(text)) {\n text = text.replace(\n /^([ \\t]*)import\\s*\\{([^}]*)\\}\\s*from\\s*'@aihu\\/signals'\\s*;?\\s*\\n/m,\n (_full, ws: string, names: string) => {\n const kept = names\n .split(',')\n .map((s) => s.trim())\n .filter((n) => n !== '' && n !== 'signal')\n if (kept.length === 0) return ''\n return `${ws}import { ${kept.join(', ')} } from '@aihu/signals'\\n`\n },\n )\n }\n return text\n}\n\n// ─── Public entry point ─────────────────────────────────────────────────────\n\nexport function migrateStateWrappers(\n source: string,\n options: StateWrapperOptions = {},\n): StateWrapperResult {\n const st: StageState = {\n warnings: [],\n changedMacros: false,\n changedBareTyped: false,\n aborted: false,\n }\n const tupleSt = { warnings: st.warnings, changedTuples: false }\n const renamed: Array<{ getter: string; setter: string }> = []\n const keepPlain = new Set(options.keepPlain ?? [])\n\n let text = source\n\n if (!options.tuplesOnly) {\n const state = findBlock(text, 'state')\n if (state) {\n const template = findBlock(text, 'template')\n const newBody = migrateStateMacrosBody(state.body, template?.body ?? '', st, keepPlain)\n // Statement-call gating guard (state_wrappers.rs module doc): the\n // compiler honors statement-position intrinsics only when the file also\n // declares a binding wrapper or naked directive. A migration whose new\n // dialect would be statement-calls ONLY (e.g. a provide-only file)\n // would silently compile them as plain JS — refuse it.\n if (!st.aborted && st.changedMacros) {\n const hasBinding =\n /^\\s*(?:const|let)\\s+[A-Za-z_$][\\w$]*\\s*=\\s*(?:state|prop|derived|action|resource|stream|controller|route|consume)\\s*[<(]/m.test(\n newBody,\n ) || /^\\s*(?:base|shadow|extract)\\s*:/m.test(newBody)\n const hasStatementCall =\n /^\\s*(?:effect|onMount|onDispose|onAdopt|onAttributeChange|aria|form|provide|event|beforeNavigate|afterNavigate)\\s*[(<]/m.test(\n newBody,\n )\n if (hasStatementCall && !hasBinding) {\n st.warnings.push(\n 'migration would produce only statement-position calls with no binding ' +\n \"wrapper or directive — the compiler's new-dialect gate would treat them \" +\n 'as plain JS; file left unmigrated',\n )\n st.aborted = true\n }\n }\n if (!st.aborted && newBody !== state.body) {\n const trimmed = newBody.replace(/^\\n+/, '').replace(/\\s+$/, '')\n text = `${text.slice(0, state.start)}@state {\\n${trimmed}\\n}${text.slice(state.end)}`\n }\n }\n }\n\n // De-call prop reads (#502). In the wrapper model `prop()` returns a VALUE,\n // so a read is `name`, not `name()`. The macros pass rewrites the `$prop`\n // DECLARATION to `const name = prop(…)` but leaves every read called; fix\n // them across @state + the template, mirroring the tuple-getter de-call in\n // migrateTuplesIn. Empty-arg calls only; member reads (`obj.name()`) are left\n // alone. This is correct even for function-valued props: the retired model\n // read the prop via `name()` and invoked via `name()()`, so de-calling the\n // read's trailing `()` turns an invoke `name()()` into `name()` and a bare\n // read `name()` into `name`.\n if (!options.tuplesOnly && !st.aborted) {\n const migratedState = findBlock(text, 'state')\n if (migratedState) {\n const propNames = [\n ...migratedState.body.matchAll(/(?:const|let)\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*prop\\s*[<(]/g),\n ].map((m) => m[1] ?? '')\n for (const name of propNames) {\n if (!name) continue\n const esc = escapeRegex(name)\n text = text.replace(\n new RegExp(`(?<![\\\\w$])(?<!(?<!\\\\.)\\\\.)${esc}\\\\s*\\\\(\\\\s*\\\\)`, 'g'),\n name,\n )\n }\n }\n }\n\n if (!options.macrosOnly && !st.aborted) {\n text = migrateTuplesIn(text, tupleSt, renamed)\n }\n\n const changed = st.changedMacros || st.changedBareTyped || tupleSt.changedTuples\n return {\n rewritten: st.aborted ? source : text,\n warnings: st.warnings,\n skipped: st.aborted || !changed,\n changes: {\n macros: st.changedMacros,\n tuples: tupleSt.changedTuples,\n bareTyped: st.changedBareTyped,\n },\n renamedSetters: renamed,\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ //#region js/codemods/template-grammar-v2/migrate.d.ts
2
+ /**
3
+ * template-grammar-v2 codemod — migrate v1 template syntax to the
4
+ * prefix-less grammar (docs/plans/template-grammar/40-spec.md).
5
+ *
6
+ * Transforms (template surface only; `@state` bodies are untouched):
7
+ * $if={e} / $if="x" => if={e} / if={x}
8
+ * $each="list as item[, i]" => each={item[, i] of list}
9
+ * $each={list as item} => each={item of list}
10
+ * $each={list} [+ $let={x}] => each={x of list} (default alias: item)
11
+ * $key/$show/$html/$ref/$memo => naked word, braced value
12
+ * $once / $raw => once / raw
13
+ * $on.click={h} / quoted => on:click={h}
14
+ * $bind.value={x} / quoted => bind:value={x}
15
+ * $class:active={c} => class:active={c}
16
+ * $class={e} and any $attr={e} => attr={e} (plain braces)
17
+ * {#if}/{:else if}/{:else}/{/if} => <group if=…>/<group elseif=…>/…
18
+ * {#each … as … (key)}/{:empty}/{/each} => <group each={… of …} key=…>/…
19
+ * {@html e} => <span html={e}></span>
20
+ * {{ident}} => {ident}
21
+ * <$link …>…</$link> => <a …>…</a>
22
+ * <$slot>/<$suspense>/… => <slot>/<suspense>/… (de-`$`-ed)
23
+ *
24
+ * The block conversions are mechanical (`<group>`-wrapping). Authors may
25
+ * hand-tighten single-element branches onto the element itself afterwards —
26
+ * both forms compile to the same arbor structural calls.
27
+ */
28
+ interface TemplateGrammarResult {
29
+ readonly rewritten: string;
30
+ readonly changed: boolean;
31
+ }
32
+ /**
33
+ * Run every template-grammar-v2 pass over one `.aihu` source (or a markdown
34
+ * document containing `.aihu` snippets — the transforms are anchored to
35
+ * template-syntax shapes and leave prose alone).
36
+ */
37
+ declare function migrateTemplateGrammar(source: string): TemplateGrammarResult;
38
+ //#endregion
39
+ export { TemplateGrammarResult, migrateTemplateGrammar };
40
+ //# sourceMappingURL=template-grammar-v2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-grammar-v2.d.ts","names":[],"sources":["../../js/codemods/template-grammar-v2/migrate.ts"],"mappings":";;AA2BA;AAAsC;AAAA;AAAA;AAEpB;AAkLlB;AAAsC;AAAA;AAAuC;AAAA;;;;;;;;;;;;;;;;UApL5D,qBAAA;EAAA,SACN,SAAA;EAAA,SACA,OAAO;AAAA;;;;;;iBAkLF,sBAAA,CAAuB,MAAA,WAAiB,qBAAqB"}
@@ -0,0 +1,3 @@
1
+ const e=[`slot`,`suspense`,`shield`,`outlet`,`router`,`navigate`,`guard`,`warp`,`focusTrap`,`liveRegion`,`visuallyHidden`,`skipLink`];function t(e){return e.replace(/<[a-zA-Z$][^<>]*>/g,e=>{if(!e.includes(`$let=`))return e;let t=e.match(/\$let=\{([^}]+)\}|\$let="([^"]+)"/);if(!t)return e;let n=(t[1]??t[2]??``).trim(),r=e.match(/\$each=\{([^}]+)\}|\$each="([^"]+)"/);if(!r)return e;let i=(r[1]??r[2]??``).trim(),a=e.replace(t[0],``);return a=a.replace(r[0],`each={${n} of ${i}}`),a.replace(/\s+(\/?>)$/,`$1`).replace(/\s{2,}/g,e=>e.includes(`
2
+ `)?e:` `)})}function n(e){let t=0,n=-1;for(let r=0;r<e.length;r++){let i=e[r];i===`(`||i===`[`||i===`{`?t++:i===`)`||i===`]`||i===`}`?t--:t===0&&i===` `&&e.startsWith(`as `,r+1)&&n===-1&&(n=r)}if(n===-1)return null;let r=e.slice(0,n).trim(),i=e.slice(n+4).trim(),a;if(i.endsWith(`)`)){let e=0;for(let t=i.length-1;t>=0;t--){let n=i[t];if(n===`)`)e++;else if(n===`(`&&(e--,e===0)){t>0&&/\s/.test(i[t-1]??``)&&(a=i.slice(t+1,i.length-1).trim(),i=i.slice(0,t).trim());break}}}return{list:r,aliases:i,key:a}}function r(e){let t=e;return t=t.replace(/\{#if\s+([^{}]+(?:\{[^{}]*\}[^{}]*)*)\}/g,(e,t)=>`<group if={${t.trim()}}>`),t=t.replace(/\{:else\s+if\s+([^{}]+(?:\{[^{}]*\}[^{}]*)*)\}/g,(e,t)=>`</group><group elseif={${t.trim()}}>`),t=t.replace(/\{:else\}/g,`</group><group else>`),t=t.replace(/\{\/\s*if\s*\}/g,`</group>`),t=t.replace(/\{#each\s+([^{}]+(?:\{[^{}]*\}[^{}]*)*)\}/g,(e,t)=>{let r=n(t.trim());if(!r)return e;let i=r.key?` key={${r.key}}`:``;return`<group each={${r.aliases} of ${r.list}}${i}>`}),t=t.replace(/\{:empty\}/g,`</group><group empty>`),t=t.replace(/\{\/\s*each\s*\}/g,`</group>`),t=t.replace(/\{@html\s+([^{}]+(?:\{[^{}]*\}[^{}]*)*)\}/g,(e,t)=>`<span html={${t.trim()}}></span>`),t}function i(e){let t=e;return t=t.replace(/\$on\.([A-Za-z][\w]*((?:\.[a-z]+)*))=\{/g,`on:$1={`),t=t.replace(/\$on\.([A-Za-z][\w]*)="([^"]*)"/g,`on:$1={$2}`),t=t.replace(/\$bind\.([A-Za-z][\w-]*)=\{/g,`bind:$1={`),t=t.replace(/\$bind\.([A-Za-z][\w-]*)="([^"]*)"/g,`bind:$1={$2}`),t=t.replace(/\$class[:.]([A-Za-z][\w-]*)=\{/g,`class:$1={`),t=t.replace(/\$class[:.]([A-Za-z][\w-]*)="([^"]*)"/g,`class:$1={$2}`),t=t.replace(/\$each="([^"]+?) as ([^"]+?)"/g,`each={$2 of $1}`),t=t.replace(/\$each=\{([^}]+?) as ([^}]+?)\}/g,`each={$2 of $1}`),t=t.replace(/\$each=\{([^}]+)\}/g,`each={item of $1}`),t=t.replace(/\$each="([^"]+)"/g,`each={item of $1}`),t=t.replace(/\$(if|key|show|html|ref|memo)=\{/g,`$1={`),t=t.replace(/\$(if|key|show|html|ref|memo)="([^"]*)"/g,`$1={$2}`),t=t.replace(/\$once(?=[\s/>])/g,`once`),t=t.replace(/\$raw(?=[\s/>])/g,`raw`),t=t.replace(/(?<![\w$])\$([a-zA-Z][\w-]*)=\{/g,`$1={`),t}function a(t){let n=t;n=n.replace(/<\$link\b/g,`<a`),n=n.replace(/<\/\$link>/g,`</a>`);for(let t of e)n=n.replace(RegExp(`<\\$${t}\\b`,`g`),`<${t}`),n=n.replace(RegExp(`</\\$${t}>`,`g`),`</${t}>`);return n}function o(e){return e.replace(/\{\{\s*([A-Za-z_$][\w$]*)\s*\}\}/g,`{$1}`)}function s(e){let n=e;return n=t(n),n=r(n),n=i(n),n=a(n),n=o(n),{rewritten:n,changed:n!==e}}export{s as migrateTemplateGrammar};
3
+ //# sourceMappingURL=template-grammar-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-grammar-v2.js","names":[],"sources":["../../js/codemods/template-grammar-v2/migrate.ts"],"sourcesContent":["/**\n * template-grammar-v2 codemod — migrate v1 template syntax to the\n * prefix-less grammar (docs/plans/template-grammar/40-spec.md).\n *\n * Transforms (template surface only; `@state` bodies are untouched):\n * $if={e} / $if=\"x\" => if={e} / if={x}\n * $each=\"list as item[, i]\" => each={item[, i] of list}\n * $each={list as item} => each={item of list}\n * $each={list} [+ $let={x}] => each={x of list} (default alias: item)\n * $key/$show/$html/$ref/$memo => naked word, braced value\n * $once / $raw => once / raw\n * $on.click={h} / quoted => on:click={h}\n * $bind.value={x} / quoted => bind:value={x}\n * $class:active={c} => class:active={c}\n * $class={e} and any $attr={e} => attr={e} (plain braces)\n * {#if}/{:else if}/{:else}/{/if} => <group if=…>/<group elseif=…>/…\n * {#each … as … (key)}/{:empty}/{/each} => <group each={… of …} key=…>/…\n * {@html e} => <span html={e}></span>\n * {{ident}} => {ident}\n * <$link …>…</$link> => <a …>…</a>\n * <$slot>/<$suspense>/… => <slot>/<suspense>/… (de-`$`-ed)\n *\n * The block conversions are mechanical (`<group>`-wrapping). Authors may\n * hand-tighten single-element branches onto the element itself afterwards —\n * both forms compile to the same arbor structural calls.\n */\n\nexport interface TemplateGrammarResult {\n readonly rewritten: string\n readonly changed: boolean\n}\n\nconst MACRO_ELEMENTS = [\n 'slot',\n 'suspense',\n 'shield',\n 'outlet',\n 'router',\n 'navigate',\n 'guard',\n 'warp',\n 'focusTrap',\n 'liveRegion',\n 'visuallyHidden',\n 'skipLink',\n] as const\n\n/** Fold `$each={list}` + `$let={alias}` on one tag into `each={alias of list}`. */\nfunction foldEachLet(src: string): string {\n return src.replace(/<[a-zA-Z$][^<>]*>/g, (tag) => {\n if (!tag.includes('$let=')) return tag\n const letM = tag.match(/\\$let=\\{([^}]+)\\}|\\$let=\"([^\"]+)\"/)\n if (!letM) return tag\n const alias = (letM[1] ?? letM[2] ?? '').trim()\n const eachM = tag.match(/\\$each=\\{([^}]+)\\}|\\$each=\"([^\"]+)\"/)\n if (!eachM) return tag\n const list = (eachM[1] ?? eachM[2] ?? '').trim()\n let out = tag.replace(letM[0], '')\n out = out.replace(eachM[0], `each={${alias} of ${list}}`)\n return out\n .replace(/\\s+(\\/?>)$/, '$1')\n .replace(/\\s{2,}/g, (ws) => (ws.includes('\\n') ? ws : ' '))\n })\n}\n\n/** `{#each LIST as ALIASES (KEY)}` head split, scanner-lite (paren/bracket depth). */\nfunction splitEachHead(\n head: string,\n): { list: string; aliases: string; key: string | undefined } | null {\n // Locate top-level ` as `.\n let depth = 0\n let asAt = -1\n for (let i = 0; i < head.length; i++) {\n const c = head[i]\n if (c === '(' || c === '[' || c === '{') depth++\n else if (c === ')' || c === ']' || c === '}') depth--\n else if (depth === 0 && c === ' ' && head.startsWith('as ', i + 1) && asAt === -1) {\n asAt = i\n }\n }\n if (asAt === -1) return null\n const list = head.slice(0, asAt).trim()\n let rest = head.slice(asAt + 4).trim()\n // Optional trailing `(key)` group.\n let key: string | undefined\n if (rest.endsWith(')')) {\n let d = 0\n for (let i = rest.length - 1; i >= 0; i--) {\n const c = rest[i]\n if (c === ')') d++\n else if (c === '(') {\n d--\n if (d === 0) {\n if (i > 0 && /\\s/.test(rest[i - 1] ?? '')) {\n key = rest.slice(i + 1, rest.length - 1).trim()\n rest = rest.slice(0, i).trim()\n }\n break\n }\n }\n }\n }\n return { list, aliases: rest, key }\n}\n\n/** Convert `{#if}` / `{#each}` / `{@html}` block forms to element/attribute form. */\nfunction migrateBlocks(src: string): string {\n let out = src\n\n // {#if cond} → <group if={cond}>\n out = out.replace(/\\{#if\\s+([^{}]+(?:\\{[^{}]*\\}[^{}]*)*)\\}/g, (_m, cond: string) => {\n return `<group if={${cond.trim()}}>`\n })\n // {:else if cond} → </group><group elseif={cond}>\n out = out.replace(\n /\\{:else\\s+if\\s+([^{}]+(?:\\{[^{}]*\\}[^{}]*)*)\\}/g,\n (_m, cond: string) => `</group><group elseif={${cond.trim()}}>`,\n )\n // {:else} → </group><group else>\n out = out.replace(/\\{:else\\}/g, '</group><group else>')\n // {/if} → </group>\n out = out.replace(/\\{\\/\\s*if\\s*\\}/g, '</group>')\n\n // {#each head} → <group each={aliases of list} key={key}>\n out = out.replace(/\\{#each\\s+([^{}]+(?:\\{[^{}]*\\}[^{}]*)*)\\}/g, (m, head: string) => {\n const parts = splitEachHead(head.trim())\n if (!parts) return m\n const keyPart = parts.key ? ` key={${parts.key}}` : ''\n return `<group each={${parts.aliases} of ${parts.list}}${keyPart}>`\n })\n // {:empty} → </group><group empty>\n out = out.replace(/\\{:empty\\}/g, '</group><group empty>')\n // {/each} → </group>\n out = out.replace(/\\{\\/\\s*each\\s*\\}/g, '</group>')\n\n // {@html expr} → <span html={expr}></span> (same placeholder-element\n // lowering the block form compiled to).\n out = out.replace(\n /\\{@html\\s+([^{}]+(?:\\{[^{}]*\\}[^{}]*)*)\\}/g,\n (_m, expr: string) => `<span html={${expr.trim()}}></span>`,\n )\n\n return out\n}\n\n/** v1 `$`-attribute layer → naked words / colon directives / plain braces. */\nfunction migrateAttrs(src: string): string {\n let out = src\n\n // Events + two-way binds, dot-form → colon directives (curly + quoted).\n out = out.replace(/\\$on\\.([A-Za-z][\\w]*((?:\\.[a-z]+)*))=\\{/g, 'on:$1={')\n out = out.replace(/\\$on\\.([A-Za-z][\\w]*)=\"([^\"]*)\"/g, 'on:$1={$2}')\n out = out.replace(/\\$bind\\.([A-Za-z][\\w-]*)=\\{/g, 'bind:$1={')\n out = out.replace(/\\$bind\\.([A-Za-z][\\w-]*)=\"([^\"]*)\"/g, 'bind:$1={$2}')\n\n // Class toggles. Accept BOTH the colon spelling (`$class:active`) and the\n // dot spelling (`$class.active`) — the v1 attribute layer permitted the dot\n // form by analogy with `$on.`/`$bind.`, and it was silently passed through\n // untouched (#502). Both normalize to the v2 `class:` directive.\n out = out.replace(/\\$class[:.]([A-Za-z][\\w-]*)=\\{/g, 'class:$1={')\n out = out.replace(/\\$class[:.]([A-Za-z][\\w-]*)=\"([^\"]*)\"/g, 'class:$1={$2}')\n\n // $each string-DSL and curly `list as alias` forms → item-first `of` head.\n out = out.replace(/\\$each=\"([^\"]+?) as ([^\"]+?)\"/g, 'each={$2 of $1}')\n out = out.replace(/\\$each=\\{([^}]+?) as ([^}]+?)\\}/g, 'each={$2 of $1}')\n // Remaining `$each={list}` — the v1 default alias was `item`.\n out = out.replace(/\\$each=\\{([^}]+)\\}/g, 'each={item of $1}')\n out = out.replace(/\\$each=\"([^\"]+)\"/g, 'each={item of $1}')\n\n // Braced control words pass through de-`$`-ed; quoted forms gain braces.\n out = out.replace(/\\$(if|key|show|html|ref|memo)=\\{/g, '$1={')\n out = out.replace(/\\$(if|key|show|html|ref|memo)=\"([^\"]*)\"/g, '$1={$2}')\n\n // Boolean words (attribute position only — require tag-ish delimiter after).\n out = out.replace(/\\$once(?=[\\s/>])/g, 'once')\n out = out.replace(/\\$raw(?=[\\s/>])/g, 'raw')\n\n // Any remaining `$name={expr}` binding (incl. $class= / $href= / $aria-*=)\n // → plain braces. Guard against `${…}` template-literal holes (no name) and\n // identifiers containing `$` (require a non-word char before `$`).\n out = out.replace(/(?<![\\w$])\\$([a-zA-Z][\\w-]*)=\\{/g, '$1={')\n\n return out\n}\n\n/** `<$macro>` elements → naked framework elements; `<$link>` → `<a>`. */\nfunction migrateElements(src: string): string {\n let out = src\n out = out.replace(/<\\$link\\b/g, '<a')\n out = out.replace(/<\\/\\$link>/g, '</a>')\n for (const name of MACRO_ELEMENTS) {\n out = out.replace(new RegExp(`<\\\\$${name}\\\\b`, 'g'), `<${name}`)\n out = out.replace(new RegExp(`</\\\\$${name}>`, 'g'), `</${name}>`)\n }\n return out\n}\n\n/** v0 `{{ident}}` double-brace interpolation → single braces. */\nfunction migrateDoubleBrace(src: string): string {\n return src.replace(/\\{\\{\\s*([A-Za-z_$][\\w$]*)\\s*\\}\\}/g, '{$1}')\n}\n\n/**\n * Run every template-grammar-v2 pass over one `.aihu` source (or a markdown\n * document containing `.aihu` snippets — the transforms are anchored to\n * template-syntax shapes and leave prose alone).\n */\nexport function migrateTemplateGrammar(source: string): TemplateGrammarResult {\n let out = source\n out = foldEachLet(out)\n out = migrateBlocks(out)\n out = migrateAttrs(out)\n out = migrateElements(out)\n out = migrateDoubleBrace(out)\n return { rewritten: out, changed: out !== source }\n}\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { resolveCompilerBinary } from "./resolve-binary.js";
2
+
1
3
  //#region js/native.d.ts
2
4
  /**
3
5
  * @aihu/compiler native-addon loader — the in-process compile fast path.
@@ -896,5 +898,5 @@ declare function compileRouteMeta(source: string, id?: string): RouteMeta | null
896
898
  declare function _injectAutoWiring(code: string): string;
897
899
  declare function aihuCompilerPlugin(options?: AihuCompilerPluginOptions): VitePlugin;
898
900
  //#endregion
899
- export { AihuCompilerPluginOptions, type CompileEnvelope, type CompileEnvelopeOptions, RouteMeta, SfcAst, SfcAttr, SfcMacroValue, SfcMeta, SfcNode, SfcStyleBlock, StripTypesResult, VIRTUAL_UTILITY_PREFIX, ViteStripApi, _MEMO_MAX_ENTRIES, _buildDeferredHydration, _buildStaticIsland, _clearTransformMemo, _compileViaBackend, _deriveChildTags, _errMessage, _foldCssEngineStyles, _foldCssEngineStylesGlobal, _foldSsrCssExport, _formatExtractCensus, _getCompilerNativeStateKind, _globalizeAuthoredStyle, _hashIdForUtilityCss, _injectAutoWiring, _injectLightScopeId, _injectShadowMode, _isLayoutFile, _isViteMissing, _layoutTag, _lightScopeId, _parseComponentTagsMarker, _parseExtractMarker, _parseIslandMarker, _passivizeOutlet, _resetCompileBackend, _resetCompilerNative, _resolveCompileBackend, _stripFailure, _stripTypes, _transformMemoStats, aihuCompilerPlugin, compileRouteMeta, compileSidecar, compileToAst, kebabComponentTag, loadCompilerNative, transform };
901
+ export { AihuCompilerPluginOptions, type CompileEnvelope, type CompileEnvelopeOptions, RouteMeta, SfcAst, SfcAttr, SfcMacroValue, SfcMeta, SfcNode, SfcStyleBlock, StripTypesResult, VIRTUAL_UTILITY_PREFIX, ViteStripApi, _MEMO_MAX_ENTRIES, _buildDeferredHydration, _buildStaticIsland, _clearTransformMemo, _compileViaBackend, _deriveChildTags, _errMessage, _foldCssEngineStyles, _foldCssEngineStylesGlobal, _foldSsrCssExport, _formatExtractCensus, _getCompilerNativeStateKind, _globalizeAuthoredStyle, _hashIdForUtilityCss, _injectAutoWiring, _injectLightScopeId, _injectShadowMode, _isLayoutFile, _isViteMissing, _layoutTag, _lightScopeId, _parseComponentTagsMarker, _parseExtractMarker, _parseIslandMarker, _passivizeOutlet, _resetCompileBackend, _resetCompilerNative, _resolveCompileBackend, _stripFailure, _stripTypes, _transformMemoStats, aihuCompilerPlugin, compileRouteMeta, compileSidecar, compileToAst, kebabComponentTag, loadCompilerNative, resolveCompilerBinary, transform };
900
902
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../js/native.ts","../js/envelope.ts","../js/transform-memo.ts","../js/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../js/native.ts","../js/envelope.ts","../js/transform-memo.ts","../js/index.ts"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -42,5 +42,5 @@ function __aihu_wrap_defer__<T extends typeof HTMLElement>(Ctor: T): T {
42
42
  `),c=-1;for(let e=s.length-1;e>=0;e--){let t=(s[e]??``).trim();if(t.startsWith(`import `)||t.startsWith(`import{`)){c=e;break}}let l=`const __style__ = new CSSStyleSheet();\n__style__.replaceSync(\`${n}\`);`;c===-1?s.unshift(l):s.splice(c+1,0,l);let u=s.join(`
43
43
  `);return u=u.replace(i,`defineComponent((${o}) => {\n (${o}.host as ShadowRoot).adoptedStyleSheets = [__style__];`),u}const De=`\0virtual:aihu-utility/`;function Oe(e){let t=5381;for(let n=0;n<e.length;n++)t=(t*33^e.charCodeAt(n))>>>0;return t}function ke(e){return Oe(e).toString(36)}function Ae(e){return Oe(e).toString(16).padStart(8,`0`)}function je(e,t,n){if(!t.trim())return null;let r=ke(n),i=`${De}${r}.css`;return{code:`import ${JSON.stringify(i)};\n`+e,virtualId:i}}function Me(e,n,i){let a=[`--stdin`,`--tag`,n?r(n,`.aihu`):`Component`,`--sidecar-stdout`];n&&a.push(`--path`,n),i?.strictTemplates&&a.push(`--strict-templates`),i?.target&&a.push(`--target`,i.target);let o=z(),s=Date.now();try{return t(o,a,{input:e,encoding:`utf8`,stdio:[`pipe`,`pipe`,`pipe`],...T(e.length)})}catch(t){throw E(t,o,a,e.length,Date.now()-s)??t}}function Ne(e,t){let n=t?r(t,`.aihu`):`Component`,i=[`--stdin`,`--tag`,n,`--ast-json`];t&&i.push(`--path`,t);let a=k(),o=L(`ast`,e,t??``,``,a,()=>{let r=j(e,i,{tag:n,...t?{path:t}:{},emits:[`ast`]});if(r.kind===`legacy`)return r.output;let a=r.envelope.astJson;if(a===void 0)throw Error(`[@aihu/compiler] envelope reply missing astJson`);return a});return JSON.parse(o)}function Pe(e,t){let n=t?r(t,`.aihu`):`Component`,i=[`--stdin`,`--tag`,n,`--route-json`];t&&i.push(`--path`,t);let a=k(),o=L(`route`,e,t??``,``,a,()=>{let r=j(e,i,{tag:n,...t?{path:t}:{},emits:[`route`]});return r.kind===`legacy`?r.output:r.envelope.routeJson??`null`}).trim();return o===``||o===`null`?null:JSON.parse(o)}function Z(e){let t;t=e.includes(`from '@aihu/arbor'`)?e.replace(/import\s*\{([^{}]*)\}\s*from\s*'@aihu\/arbor'/,(e,t)=>{let n=t.split(`,`).map(e=>e.trim()).filter(Boolean);return n.includes(`mount`)||n.push(`mount`),`import { ${n.join(`, `)} } from '@aihu/arbor'`}):`import { mount } from '@aihu/arbor'\n${e}`,/import\s+\{[^{}]*\}\s+from\s+'@aihu\/signals'/.test(t)?t=t.replace(/import\s*\{([^{}]*)\}\s*from\s*'@aihu\/signals'/,(e,t)=>{if(e.startsWith(`import type`))return e;let n=t.split(`,`).map(e=>e.trim()).filter(Boolean);return n.includes(`signal`)||n.push(`signal`),`import { ${n.join(`, `)} } from '@aihu/signals'`}):/^[^\S\n]*import\b[^\n]*from[^\S\n]*'@aihu\/signals'/m.test(t)?/import\s+type\s+\{[^{}]*\}\s+from\s+'@aihu\/signals'/.test(t)&&!t.match(/import\s+\{[^{}]*\}\s+from\s+'@aihu\/signals'/)&&(t=t.replace(/(import\s+type\s+\{[^{}]*\}\s+from\s+'@aihu\/signals')/,(e,t)=>`${t}\nimport { signal } from '@aihu/signals'`)):t=t.replace(/import\s*\{[^{}]*\}\s*from\s*'@aihu\/arbor'/,e=>`${e}\nimport { signal } from '@aihu/signals'`),t=t.replace(/import\s*\{([^{}]*)\}\s*from\s*'@aihu\/runtime'/,(e,t)=>{let n=t.split(`,`).map(e=>e.trim()).filter(Boolean);return n.includes(`_setMount`)||n.push(`_setMount`),n.includes(`_setSignal`)||n.push(`_setSignal`),`import { ${n.join(`, `)} } from '@aihu/runtime'`});let n=t.split(`
44
44
  `),r=-1;for(let e=n.length-1;e>=0;e--){let t=(n[e]??``).trim();if(t.startsWith(`import `)||t.startsWith(`import{`)){r=e;break}}return r!==-1&&(n.splice(r+1,0,`_setMount(mount)`,`_setSignal(signal)`,``),t=n.join(`
45
- `)),t}let Q,Fe=!1;const $=`@aihu/css-engine`;async function Ie(){try{return await import($)}catch{try{let e=n(a(process.cwd(),`package.json`)).resolve($);return await import(c(e).href)}catch{return null}}}async function Le(e,t,n){if(Q===null)return``;if(process.env.AIHU_COMPILE_BIN==null)try{process.env.AIHU_COMPILE_BIN=z()}catch{}if(Q===void 0&&(Q=await Ie(),Q===null))return``;try{return Q.compileSfc(e,t,n)}catch(e){if(!Fe){Fe=!0;let t=e instanceof Error?e.message:String(e);console.warn(`[@aihu/compiler] @aihu/css-engine is installed but compileSfc() failed; utility classes will not emit. Original error: ${t}\nHint: ensure the native css-core binary is installed (install/upgrade @aihu/css-engine + its per-platform optional dep, or run \`cargo build --release -p aihu-css-core\` in a dev clone).`)}return``}}function Re(e){let t=e?.islands!==!1,n=e?.shadowMode,i=e?.target,a=e?.layoutsDir??`src/layouts`,o=new Map,s=new Map;return{name:`aihu-compiler`,enforce:`pre`,buildEnd(){for(let e of fe(s))console.info(e)},resolveId(e){return e.startsWith(`\0virtual:aihu-utility/`)?e:null},load(e){return e.startsWith(`\0virtual:aihu-utility/`)?o.get(e)??null:null},transform(e,c){let l=c.split(`?`)[0];if(!l.endsWith(`.aihu`))return;let u=this?.environment?.config?.consumer===`server`,d=i??(u?`server`:void 0);return(async()=>{let i=ge(l,a),c=i?_e(r(l,`.aihu`)):void 0,f={...d?{target:d}:{},...c?{tag:c}:{}},p=Ce(e,l,f),m=de(p.code);m&&s.set(l,m);let h=/^\/\/ @aihu:shadow (light|shadow)\b/m.exec(p.code)?.[1],g=/^\/\/ @aihu:shadow-default (light|shadow)\b/m.exec(p.code)?.[1]??(i?`light`:void 0),_=h??n??g,v=_===`light`?Ae(l):void 0,y=_==null?p.code:B(p.code,_,v);v&&(y=V(y,v)),_===`light`&&(y=H(y)),i&&(y=ye(y));let b=await Le(e,l,v);if(b){if(_===`light`){let e=je(y,b,l);e&&(o.set(e.virtualId,b),y=e.code)}else y=X(y,b),u&&(y=Ee(y,b))}let x=pe(y),S,C=me(y);if(u){S=y,v&&(S+=`\nexport const __aihu_light_scope__ = '${v}'\n`),x!==null&&(S+=`\nexport const __aihu_tag__ = '${x}'\n`),_!=null&&(S+=`\nexport const __aihu_shadow__ = '${_}'\n`);let e=Y(S);e.length>0&&(S+=`\nexport const __aihu_child_tags__ = ${JSON.stringify(e)}\n`);let t=J(y);t.length>0&&(S+=`\nexport const __aihu_referenced_tags__ = ${JSON.stringify(t)}\n`)}else t&&x!==null&&!C&&_!==`light`&&U(y)===`static`?S=Se(y,x):x===null?(S=y,S=Z(S)):(S=be(y,x),S=xe(S,x),S=Z(S));let w;try{w=await import(`vite`)}catch(e){if(G(e))return{code:S,map:null};throw Error(`[@aihu/compiler] Could not load \`vite\` to strip TypeScript from ${l}. Vite appears to be installed but failed to load, so this is NOT the "running outside Vite" case and the TypeScript must not be handed back un-stripped. Underlying error: ${W(e)}`,{cause:e})}return await q(w,S,l,u)})()}}}export{De as VIRTUAL_UTILITY_PREFIX,oe as _MEMO_MAX_ENTRIES,xe as _buildDeferredHydration,Se as _buildStaticIsland,ce as _clearTransformMemo,j as _compileViaBackend,Y as _deriveChildTags,W as _errMessage,X as _foldCssEngineStyles,je as _foldCssEngineStylesGlobal,Ee as _foldSsrCssExport,fe as _formatExtractCensus,x as _getCompilerNativeStateKind,H as _globalizeAuthoredStyle,ke as _hashIdForUtilityCss,Z as _injectAutoWiring,V as _injectLightScopeId,B as _injectShadowMode,ge as _isLayoutFile,G as _isViteMissing,_e as _layoutTag,Ae as _lightScopeId,J as _parseComponentTagsMarker,de as _parseExtractMarker,U as _parseIslandMarker,ye as _passivizeOutlet,ie as _resetCompileBackend,S as _resetCompilerNative,O as _resolveCompileBackend,K as _stripFailure,q as _stripTypes,le as _transformMemoStats,Re as aihuCompilerPlugin,Pe as compileRouteMeta,Me as compileSidecar,Ne as compileToAst,ve as kebabComponentTag,b as loadCompilerNative,Ce as transform};
45
+ `)),t}let Q,Fe=!1;const $=`@aihu/css-engine`;async function Ie(){try{return await import($)}catch{try{let e=n(a(process.cwd(),`package.json`)).resolve($);return await import(c(e).href)}catch{return null}}}async function Le(e,t,n){if(Q===null)return``;if(process.env.AIHU_COMPILE_BIN==null)try{process.env.AIHU_COMPILE_BIN=z()}catch{}if(Q===void 0&&(Q=await Ie(),Q===null))return``;try{return Q.compileSfc(e,t,n)}catch(e){if(!Fe){Fe=!0;let t=e instanceof Error?e.message:String(e);console.warn(`[@aihu/compiler] @aihu/css-engine is installed but compileSfc() failed; utility classes will not emit. Original error: ${t}\nHint: ensure the native css-core binary is installed (install/upgrade @aihu/css-engine + its per-platform optional dep, or run \`cargo build --release -p aihu-css-core\` in a dev clone).`)}return``}}function Re(e){let t=e?.islands!==!1,n=e?.shadowMode,i=e?.target,a=e?.layoutsDir??`src/layouts`,o=new Map,s=new Map;return{name:`aihu-compiler`,enforce:`pre`,buildEnd(){for(let e of fe(s))console.info(e)},resolveId(e){return e.startsWith(`\0virtual:aihu-utility/`)?e:null},load(e){return e.startsWith(`\0virtual:aihu-utility/`)?o.get(e)??null:null},transform(e,c){let l=c.split(`?`)[0];if(!l.endsWith(`.aihu`))return;let u=this?.environment?.config?.consumer===`server`,d=i??(u?`server`:void 0);return(async()=>{let i=ge(l,a),c=i?_e(r(l,`.aihu`)):void 0,f={...d?{target:d}:{},...c?{tag:c}:{}},p=Ce(e,l,f),m=de(p.code);m&&s.set(l,m);let h=/^\/\/ @aihu:shadow (light|shadow)\b/m.exec(p.code)?.[1],g=/^\/\/ @aihu:shadow-default (light|shadow)\b/m.exec(p.code)?.[1]??(i?`light`:void 0),_=h??n??g,v=_===`light`?Ae(l):void 0,y=_==null?p.code:B(p.code,_,v);v&&(y=V(y,v)),_===`light`&&(y=H(y)),i&&(y=ye(y));let b=await Le(e,l,v);if(b){if(_===`light`){let e=je(y,b,l);e&&(o.set(e.virtualId,b),y=e.code)}else y=X(y,b),u&&(y=Ee(y,b))}let x=pe(y),S,C=me(y);if(u){S=y,v&&(S+=`\nexport const __aihu_light_scope__ = '${v}'\n`),x!==null&&(S+=`\nexport const __aihu_tag__ = '${x}'\n`),_!=null&&(S+=`\nexport const __aihu_shadow__ = '${_}'\n`);let e=Y(S);e.length>0&&(S+=`\nexport const __aihu_child_tags__ = ${JSON.stringify(e)}\n`);let t=J(y);t.length>0&&(S+=`\nexport const __aihu_referenced_tags__ = ${JSON.stringify(t)}\n`)}else t&&x!==null&&!C&&_!==`light`&&U(y)===`static`?S=Se(y,x):x===null?(S=y,S=Z(S)):(S=be(y,x),S=xe(S,x),S=Z(S));let w;try{w=await import(`vite`)}catch(e){if(G(e))return{code:S,map:null};throw Error(`[@aihu/compiler] Could not load \`vite\` to strip TypeScript from ${l}. Vite appears to be installed but failed to load, so this is NOT the "running outside Vite" case and the TypeScript must not be handed back un-stripped. Underlying error: ${W(e)}`,{cause:e})}return await q(w,S,l,u)})()}}}export{De as VIRTUAL_UTILITY_PREFIX,oe as _MEMO_MAX_ENTRIES,xe as _buildDeferredHydration,Se as _buildStaticIsland,ce as _clearTransformMemo,j as _compileViaBackend,Y as _deriveChildTags,W as _errMessage,X as _foldCssEngineStyles,je as _foldCssEngineStylesGlobal,Ee as _foldSsrCssExport,fe as _formatExtractCensus,x as _getCompilerNativeStateKind,H as _globalizeAuthoredStyle,ke as _hashIdForUtilityCss,Z as _injectAutoWiring,V as _injectLightScopeId,B as _injectShadowMode,ge as _isLayoutFile,G as _isViteMissing,_e as _layoutTag,Ae as _lightScopeId,J as _parseComponentTagsMarker,de as _parseExtractMarker,U as _parseIslandMarker,ye as _passivizeOutlet,ie as _resetCompileBackend,S as _resetCompilerNative,O as _resolveCompileBackend,K as _stripFailure,q as _stripTypes,le as _transformMemoStats,Re as aihuCompilerPlugin,Pe as compileRouteMeta,Me as compileSidecar,Ne as compileToAst,ve as kebabComponentTag,b as loadCompilerNative,e as resolveCompilerBinary,Ce as transform};
46
46
  //# sourceMappingURL=index.js.map