@pyreon/compiler 0.2.0 → 0.3.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.
@@ -5386,7 +5386,7 @@ var drawChart = (function (exports) {
5386
5386
  </script>
5387
5387
  <script>
5388
5388
  /*<!--*/
5389
- const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.js","children":[{"name":"src","children":[{"uid":"adb72426-1","name":"jsx.ts"},{"uid":"adb72426-3","name":"index.ts"}]}]}],"isRoot":true},"nodeParts":{"adb72426-1":{"renderedLength":21645,"gzipLength":6163,"brotliLength":0,"metaUid":"adb72426-0"},"adb72426-3":{"renderedLength":0,"gzipLength":0,"brotliLength":0,"metaUid":"adb72426-2"}},"nodeMetas":{"adb72426-0":{"id":"/src/jsx.ts","moduleParts":{"index.js":"adb72426-1"},"imported":[{"uid":"adb72426-4"}],"importedBy":[{"uid":"adb72426-2"}]},"adb72426-2":{"id":"/src/index.ts","moduleParts":{"index.js":"adb72426-3"},"imported":[{"uid":"adb72426-0"}],"importedBy":[],"isEntry":true},"adb72426-4":{"id":"typescript","moduleParts":{},"imported":[],"importedBy":[{"uid":"adb72426-0"}]}},"env":{"rollup":"4.23.0"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
5389
+ const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.js","children":[{"name":"src","children":[{"uid":"da0ee88a-1","name":"jsx.ts"},{"uid":"da0ee88a-3","name":"index.ts"}]}]}],"isRoot":true},"nodeParts":{"da0ee88a-1":{"renderedLength":24622,"gzipLength":6908,"brotliLength":0,"metaUid":"da0ee88a-0"},"da0ee88a-3":{"renderedLength":0,"gzipLength":0,"brotliLength":0,"metaUid":"da0ee88a-2"}},"nodeMetas":{"da0ee88a-0":{"id":"/src/jsx.ts","moduleParts":{"index.js":"da0ee88a-1"},"imported":[{"uid":"da0ee88a-4"}],"importedBy":[{"uid":"da0ee88a-2"}]},"da0ee88a-2":{"id":"/src/index.ts","moduleParts":{"index.js":"da0ee88a-3"},"imported":[{"uid":"da0ee88a-0"}],"importedBy":[],"isEntry":true},"da0ee88a-4":{"id":"typescript","moduleParts":{},"imported":[],"importedBy":[{"uid":"da0ee88a-0"}]}},"env":{"rollup":"4.23.0"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
5390
5390
 
5391
5391
  const run = () => {
5392
5392
  const width = window.innerWidth;
package/lib/index.js CHANGED
@@ -37,6 +37,31 @@ import ts from "typescript";
37
37
  */
38
38
  const SKIP_PROPS = new Set(["key", "ref"]);
39
39
  const EVENT_RE = /^on[A-Z]/;
40
+ const DELEGATED_EVENTS = new Set([
41
+ "click",
42
+ "dblclick",
43
+ "contextmenu",
44
+ "focusin",
45
+ "focusout",
46
+ "input",
47
+ "change",
48
+ "keydown",
49
+ "keyup",
50
+ "mousedown",
51
+ "mouseup",
52
+ "mousemove",
53
+ "mouseover",
54
+ "mouseout",
55
+ "pointerdown",
56
+ "pointerup",
57
+ "pointermove",
58
+ "pointerover",
59
+ "pointerout",
60
+ "touchstart",
61
+ "touchend",
62
+ "touchmove",
63
+ "submit"
64
+ ]);
40
65
  function transformJSX(code, filename = "input.tsx") {
41
66
  const scriptKind = filename.endsWith(".tsx") || filename.endsWith(".jsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TSX;
42
67
  const sf = ts.createSourceFile(filename, code, ts.ScriptTarget.ESNext, true, scriptKind);
@@ -54,6 +79,9 @@ function transformJSX(code, filename = "input.tsx") {
54
79
  const hoists = [];
55
80
  let hoistIdx = 0;
56
81
  let needsTplImport = false;
82
+ let needsBindTextImportGlobal = false;
83
+ let needsBindDirectImportGlobal = false;
84
+ let needsBindImportGlobal = false;
57
85
  /**
58
86
  * If `node` is a fully-static JSX element/fragment, register a module-scope
59
87
  * hoist for it and return the generated variable name. Otherwise return null.
@@ -123,10 +151,24 @@ function transformJSX(code, filename = "input.tsx") {
123
151
  const expr = node.initializer.expression;
124
152
  if (expr) hoistOrWrap(expr);
125
153
  }
126
- /** Handle a JSX expression in child position — wrap or hoist. */
154
+ /** Handle a JSX expression in child position — wrap, hoist, or recurse. */
127
155
  function handleJsxExpression(node) {
128
156
  const expr = node.expression;
129
- if (expr) hoistOrWrap(expr);
157
+ if (!expr) return;
158
+ const hoistName = maybeHoist(expr);
159
+ if (hoistName) {
160
+ replacements.push({
161
+ start: expr.getStart(sf),
162
+ end: expr.getEnd(),
163
+ text: hoistName
164
+ });
165
+ return;
166
+ }
167
+ if (shouldWrap(expr)) {
168
+ wrap(expr);
169
+ return;
170
+ }
171
+ ts.forEachChild(expr, walk);
130
172
  }
131
173
  function walk(node) {
132
174
  if (ts.isJsxElement(node) && tryTemplateEmit(node)) return;
@@ -150,7 +192,13 @@ function transformJSX(code, filename = "input.tsx") {
150
192
  let result = code;
151
193
  for (const r of replacements) result = result.slice(0, r.start) + r.text + result.slice(r.end);
152
194
  if (hoists.length > 0) result = hoists.map((h) => `const ${h.name} = /*@__PURE__*/ ${h.text}\n`).join("") + result;
153
- if (needsTplImport) result = `import { _tpl } from "@pyreon/runtime-dom";\nimport { _bind } from "@pyreon/reactivity";\n` + result;
195
+ if (needsTplImport) {
196
+ const runtimeDomImports = ["_tpl"];
197
+ if (needsBindDirectImportGlobal) runtimeDomImports.push("_bindDirect");
198
+ if (needsBindTextImportGlobal) runtimeDomImports.push("_bindText");
199
+ const reactivityImports = needsBindImportGlobal ? `\nimport { _bind } from "@pyreon/reactivity";` : "";
200
+ result = `import { ${runtimeDomImports.join(", ")} } from "@pyreon/runtime-dom";${reactivityImports}\n` + result;
201
+ }
154
202
  return {
155
203
  code: result,
156
204
  usesTemplates: needsTplImport,
@@ -214,6 +262,9 @@ function transformJSX(code, filename = "input.tsx") {
214
262
  const disposerNames = [];
215
263
  let varIdx = 0;
216
264
  let dispIdx = 0;
265
+ const reactiveBindExprs = [];
266
+ let needsBindTextImport = false;
267
+ let needsBindDirectImport = false;
217
268
  function nextVar() {
218
269
  return `__e${varIdx++}`;
219
270
  }
@@ -241,12 +292,14 @@ function transformJSX(code, filename = "input.tsx") {
241
292
  if (!attr.initializer.expression) return;
242
293
  bindLines.push(`${sliceExpr(attr.initializer.expression)}.current = ${varName}`);
243
294
  }
244
- /** Emit addEventListener bind line for an event handler attribute. */
295
+ /** Emit event handler bind line delegated (expando) or addEventListener. */
245
296
  function emitEventListener(attr, attrName, varName) {
246
297
  const eventName = (attrName[2] ?? "").toLowerCase() + attrName.slice(3);
247
298
  if (!attr.initializer || !ts.isJsxExpression(attr.initializer)) return;
248
299
  if (!attr.initializer.expression) return;
249
- bindLines.push(`${varName}.addEventListener("${eventName}", ${sliceExpr(attr.initializer.expression)})`);
300
+ const handler = sliceExpr(attr.initializer.expression);
301
+ if (DELEGATED_EVENTS.has(eventName)) bindLines.push(`${varName}.__ev_${eventName} = ${handler}`);
302
+ else bindLines.push(`${varName}.addEventListener("${eventName}", ${handler})`);
250
303
  }
251
304
  /** Return HTML string for a static attribute expression, or null if not static. */
252
305
  function staticAttrToHtml(exprNode, htmlAttrName) {
@@ -256,6 +309,20 @@ function transformJSX(code, filename = "input.tsx") {
256
309
  if (exprNode.kind === ts.SyntaxKind.TrueKeyword) return ` ${htmlAttrName}`;
257
310
  return "";
258
311
  }
312
+ /**
313
+ * Try to extract a direct signal reference from an expression.
314
+ * Returns the callee text (e.g. "count" or "row.label") if the expression
315
+ * is a single call with no arguments, otherwise null.
316
+ */
317
+ function tryDirectSignalRef(exprNode) {
318
+ let inner = exprNode;
319
+ if (ts.isArrowFunction(inner) && !ts.isBlock(inner.body)) inner = inner.body;
320
+ if (!ts.isCallExpression(inner)) return null;
321
+ if (inner.arguments.length > 0) return null;
322
+ const callee = inner.expression;
323
+ if (ts.isIdentifier(callee) || ts.isPropertyAccessExpression(callee)) return sliceExpr(callee);
324
+ return null;
325
+ }
259
326
  /** Unwrap a reactive accessor expression for use inside _bind(). */
260
327
  function unwrapAccessor(exprNode) {
261
328
  if (ts.isArrowFunction(exprNode) && !ts.isBlock(exprNode.body)) return {
@@ -271,14 +338,26 @@ function transformJSX(code, filename = "input.tsx") {
271
338
  isReactive: containsCall(exprNode)
272
339
  };
273
340
  }
341
+ /** Build a setter expression for an attribute. */
342
+ function attrSetter(htmlAttrName, varName, expr) {
343
+ return htmlAttrName === "class" ? `${varName}.className = ${expr}` : `${varName}.setAttribute("${htmlAttrName}", ${expr})`;
344
+ }
274
345
  /** Emit bind line for a dynamic (non-static) attribute. */
275
346
  function emitDynamicAttr(_expr, exprNode, htmlAttrName, varName) {
276
347
  const { expr, isReactive } = unwrapAccessor(exprNode);
277
- const setter = htmlAttrName === "class" ? `${varName}.className = ${expr}` : `${varName}.setAttribute("${htmlAttrName}", ${expr})`;
278
- if (isReactive) {
348
+ if (!isReactive) {
349
+ bindLines.push(attrSetter(htmlAttrName, varName, expr));
350
+ return;
351
+ }
352
+ const directRef = tryDirectSignalRef(exprNode);
353
+ if (directRef) {
354
+ needsBindDirectImport = true;
279
355
  const d = nextDisp();
280
- bindLines.push(`const ${d} = _bind(() => { ${setter} })`);
281
- } else bindLines.push(setter);
356
+ const updater = htmlAttrName === "class" ? `(v) => { ${varName}.className = v == null ? "" : String(v) }` : `(v) => { ${varName}.setAttribute("${htmlAttrName}", v == null ? "" : String(v)) }`;
357
+ bindLines.push(`const ${d} = _bindDirect(${directRef}, ${updater})`);
358
+ return;
359
+ }
360
+ reactiveBindExprs.push(attrSetter(htmlAttrName, varName, expr));
282
361
  }
283
362
  /** Emit bind line or HTML for an expression attribute value. */
284
363
  function emitAttrExpression(exprNode, htmlAttrName, varName) {
@@ -321,13 +400,17 @@ function transformJSX(code, filename = "input.tsx") {
321
400
  return htmlAttrs;
322
401
  }
323
402
  /** Emit bind lines for a reactive text expression child. */
324
- function emitReactiveTextChild(expr, varName, parentRef, childNodeIdx, needsPlaceholder) {
403
+ function emitReactiveTextChild(expr, exprNode, varName, parentRef, childNodeIdx, needsPlaceholder) {
325
404
  const tVar = nextTextVar();
326
- const d = nextDisp();
327
405
  bindLines.push(`const ${tVar} = document.createTextNode("")`);
328
406
  if (needsPlaceholder) bindLines.push(`${parentRef}.replaceChild(${tVar}, ${parentRef}.childNodes[${childNodeIdx}])`);
329
407
  else bindLines.push(`${varName}.appendChild(${tVar})`);
330
- bindLines.push(`const ${d} = _bind(() => { ${tVar}.data = ${expr} })`);
408
+ const directRef = tryDirectSignalRef(exprNode);
409
+ if (directRef) {
410
+ needsBindTextImport = true;
411
+ const d = nextDisp();
412
+ bindLines.push(`const ${d} = _bindText(${directRef}, ${tVar})`);
413
+ } else reactiveBindExprs.push(`${tVar}.data = ${expr}`);
331
414
  return needsPlaceholder ? "<!>" : "";
332
415
  }
333
416
  /** Emit bind lines for a static text expression child. */
@@ -350,7 +433,7 @@ function transformJSX(code, filename = "input.tsx") {
350
433
  }
351
434
  const needsPlaceholder = useMixed || useMultiExpr;
352
435
  const { expr, isReactive } = unwrapAccessor(child.expression);
353
- if (isReactive) return emitReactiveTextChild(expr, varName, parentRef, childNodeIdx, needsPlaceholder);
436
+ if (isReactive) return emitReactiveTextChild(expr, child.expression, varName, parentRef, childNodeIdx, needsPlaceholder);
354
437
  return emitStaticTextChild(expr, varName, parentRef, childNodeIdx, needsPlaceholder);
355
438
  }
356
439
  /** Process children of a JsxElement, returning the children HTML. */
@@ -384,7 +467,15 @@ function transformJSX(code, filename = "input.tsx") {
384
467
  }
385
468
  const html = processElement(node, "__root");
386
469
  if (html === null) return null;
470
+ if (needsBindTextImport) needsBindTextImportGlobal = true;
471
+ if (needsBindDirectImport) needsBindDirectImportGlobal = true;
387
472
  const escaped = html.replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
473
+ if (reactiveBindExprs.length > 0) {
474
+ needsBindImportGlobal = true;
475
+ const combinedName = nextDisp();
476
+ const combinedBody = reactiveBindExprs.join("; ");
477
+ bindLines.push(`const ${combinedName} = _bind(() => { ${combinedBody} })`);
478
+ }
388
479
  if (bindLines.length === 0 && disposerNames.length === 0) return `_tpl("${escaped}", () => null)`;
389
480
  let body = bindLines.map((l) => ` ${l}`).join("\n");
390
481
  if (disposerNames.length > 0) body += `\n return () => { ${disposerNames.map((d) => `${d}()`).join("; ")} }`;
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/jsx.ts"],"sourcesContent":["/**\n * JSX transform — wraps dynamic JSX expressions in `() =>` so the Pyreon runtime\n * receives reactive getters instead of eagerly-evaluated snapshot values.\n *\n * Rules:\n * - `<div>{expr}</div>` → `<div>{() => expr}</div>` (child)\n * - `<div class={expr}>` → `<div class={() => expr}>` (prop)\n * - `<button onClick={fn}>` → unchanged (event handler)\n * - `<div>{() => expr}</div>` → unchanged (already wrapped)\n * - `<div>{\"literal\"}</div>` → unchanged (static)\n *\n * Static VNode hoisting:\n * - Fully static JSX in expression containers is hoisted to module scope:\n * `{<span>Hello</span>}` → `const _$h0 = <span>Hello</span>` + `{_$h0}`\n * - Hoisted nodes are created ONCE at module initialisation, not per-instance.\n * - A JSX node is static if: all props are string literals / booleans / static\n * values, and all children are text nodes or other static JSX nodes.\n *\n * Template emission:\n * - JSX element trees with ≥ 2 DOM elements (no components, no spread attrs)\n * are compiled to `_tpl(html, bindFn)` calls instead of nested `h()` calls.\n * - The HTML string is parsed once via <template>.innerHTML, then cloneNode(true)\n * for each instance (~5-10x faster than sequential createElement calls).\n * - Static attributes are baked into the HTML string; dynamic attributes and\n * text content use renderEffect in the bind function.\n *\n * Implementation: TypeScript parser for positions + magic-string replacements.\n * No extra runtime dependencies — `typescript` is already in devDependencies.\n *\n * Known limitation (v0): expressions inside *nested* JSX within a child\n * expression container are not individually wrapped. They are still reactive\n * because the outer wrapper re-evaluates the whole subtree, just at a coarser\n * granularity. Fine-grained nested wrapping is planned for a future pass.\n */\n\nimport ts from \"typescript\"\n\nexport interface CompilerWarning {\n /** Warning message */\n message: string\n /** Source file line number (1-based) */\n line: number\n /** Source file column number (0-based) */\n column: number\n /** Warning code for filtering */\n code: \"signal-call-in-jsx\" | \"missing-key-on-for\" | \"signal-in-static-prop\"\n}\n\nexport interface TransformResult {\n /** Transformed source code (JSX preserved, only expression containers modified) */\n code: string\n /** Whether the output uses _tpl/_re template helpers (needs auto-import) */\n usesTemplates?: boolean\n /** Compiler warnings for common mistakes */\n warnings: CompilerWarning[]\n}\n\n// Props that should never be wrapped in a reactive getter\nconst SKIP_PROPS = new Set([\"key\", \"ref\"])\n// Event handler pattern: onClick, onInput, onMouseEnter, …\nconst EVENT_RE = /^on[A-Z]/\n\nexport function transformJSX(code: string, filename = \"input.tsx\"): TransformResult {\n const scriptKind =\n filename.endsWith(\".tsx\") || filename.endsWith(\".jsx\") ? ts.ScriptKind.TSX : ts.ScriptKind.TSX // default to TSX so JSX is always parsed\n\n const sf = ts.createSourceFile(\n filename,\n code,\n ts.ScriptTarget.ESNext,\n /* setParentNodes */ true,\n scriptKind,\n )\n\n type Replacement = { start: number; end: number; text: string }\n const replacements: Replacement[] = []\n const warnings: CompilerWarning[] = []\n\n function warn(node: ts.Node, message: string, warnCode: CompilerWarning[\"code\"]): void {\n const { line, character } = sf.getLineAndCharacterOfPosition(node.getStart(sf))\n warnings.push({ message, line: line + 1, column: character, code: warnCode })\n }\n\n // ── Static hoisting state ─────────────────────────────────────────────────\n type Hoist = { name: string; text: string }\n const hoists: Hoist[] = []\n let hoistIdx = 0\n let needsTplImport = false\n\n /**\n * If `node` is a fully-static JSX element/fragment, register a module-scope\n * hoist for it and return the generated variable name. Otherwise return null.\n */\n function maybeHoist(node: ts.Node): string | null {\n if (\n (ts.isJsxElement(node) || ts.isJsxSelfClosingElement(node) || ts.isJsxFragment(node)) &&\n isStaticJSXNode(node as ts.JsxElement | ts.JsxSelfClosingElement | ts.JsxFragment)\n ) {\n const name = `_$h${hoistIdx++}`\n const text = code.slice(node.getStart(sf), node.getEnd())\n hoists.push({ name, text })\n return name\n }\n return null\n }\n\n function wrap(expr: ts.Expression): void {\n const start = expr.getStart(sf)\n const end = expr.getEnd()\n replacements.push({ start, end, text: `() => ${code.slice(start, end)}` })\n }\n\n /** Try to hoist or wrap an expression, pushing a replacement if needed. */\n function hoistOrWrap(expr: ts.Expression): void {\n const hoistName = maybeHoist(expr)\n if (hoistName) {\n replacements.push({ start: expr.getStart(sf), end: expr.getEnd(), text: hoistName })\n } else if (shouldWrap(expr)) {\n wrap(expr)\n }\n }\n\n // ── walk sub-handlers ───────────────────────────────────────────────────────\n\n /** Try to emit a template for a JsxElement. Returns true if handled. */\n function tryTemplateEmit(node: ts.JsxElement): boolean {\n const elemCount = templateElementCount(node)\n if (elemCount < 1) return false\n const tplCall = buildTemplateCall(node)\n if (!tplCall) return false\n const start = node.getStart(sf)\n const end = node.getEnd()\n const parent = node.parent\n const needsBraces = parent && (ts.isJsxElement(parent) || ts.isJsxFragment(parent))\n replacements.push({ start, end, text: needsBraces ? `{${tplCall}}` : tplCall })\n needsTplImport = true\n return true\n }\n\n /** Emit warnings for common JSX mistakes (e.g. <For> without by). */\n function checkForWarnings(node: ts.JsxElement | ts.JsxSelfClosingElement): void {\n const opening = ts.isJsxElement(node) ? node.openingElement : node\n const tagName = ts.isIdentifier(opening.tagName) ? opening.tagName.text : \"\"\n if (tagName !== \"For\") return\n const hasBy = opening.attributes.properties.some(\n (p) => ts.isJsxAttribute(p) && ts.isIdentifier(p.name) && p.name.text === \"by\",\n )\n if (!hasBy) {\n warn(\n opening.tagName,\n `<For> without a \"by\" prop will use index-based diffing, which is slower and may cause bugs with stateful children. Add by={(item) => item.id} for efficient keyed reconciliation.`,\n \"missing-key-on-for\",\n )\n }\n }\n\n /** Handle a JSX attribute node — wrap or hoist its value if needed. */\n function handleJsxAttribute(node: ts.JsxAttribute): void {\n const name = ts.isIdentifier(node.name) ? node.name.text : \"\"\n const openingEl = node.parent.parent as ts.JsxOpeningElement | ts.JsxSelfClosingElement\n const tagName = ts.isIdentifier(openingEl.tagName) ? openingEl.tagName.text : \"\"\n const isComponentElement =\n tagName.length > 0 && tagName.charAt(0) !== tagName.charAt(0).toLowerCase()\n if (isComponentElement) return\n if (SKIP_PROPS.has(name) || EVENT_RE.test(name)) return\n if (!node.initializer || !ts.isJsxExpression(node.initializer)) return\n const expr = node.initializer.expression\n if (expr) hoistOrWrap(expr)\n }\n\n /** Handle a JSX expression in child position — wrap or hoist. */\n function handleJsxExpression(node: ts.JsxExpression): void {\n const expr = node.expression\n if (expr) hoistOrWrap(expr)\n }\n\n function walk(node: ts.Node): void {\n if (ts.isJsxElement(node) && tryTemplateEmit(node)) return\n if (ts.isJsxSelfClosingElement(node) || ts.isJsxElement(node)) checkForWarnings(node)\n if (ts.isJsxAttribute(node)) {\n handleJsxAttribute(node)\n return\n }\n if (ts.isJsxExpression(node)) {\n handleJsxExpression(node)\n return\n }\n ts.forEachChild(node, walk)\n }\n\n walk(sf)\n\n if (replacements.length === 0 && hoists.length === 0) return { code, warnings }\n\n // Apply replacements from right to left so earlier positions stay valid\n replacements.sort((a, b) => b.start - a.start)\n\n let result = code\n for (const r of replacements) {\n result = result.slice(0, r.start) + r.text + result.slice(r.end)\n }\n\n // Prepend module-scope hoisted static VNode declarations\n if (hoists.length > 0) {\n const preamble = hoists.map((h) => `const ${h.name} = /*@__PURE__*/ ${h.text}\\n`).join(\"\")\n result = preamble + result\n }\n\n // Prepend template imports if _tpl() was emitted\n if (needsTplImport) {\n result =\n `import { _tpl } from \"@pyreon/runtime-dom\";\\nimport { _bind } from \"@pyreon/reactivity\";\\n` +\n result\n }\n\n return { code: result, usesTemplates: needsTplImport, warnings }\n\n // ── Template emission helpers (closures over sf, code) ──────────────────────\n\n /** Check if a single attribute would prevent template emission. */\n function hasBailAttr(node: ts.JsxElement | ts.JsxSelfClosingElement): boolean {\n for (const attr of jsxAttrs(node)) {\n if (ts.isJsxSpreadAttribute(attr)) return true\n if (ts.isJsxAttribute(attr) && ts.isIdentifier(attr.name) && attr.name.text === \"key\")\n return true\n }\n return false\n }\n\n /**\n * Count template-eligible elements for a single JSX child.\n * Returns 0 for skippable children, -1 for bail, positive for element count.\n */\n function countChildForTemplate(child: ts.JsxChild): number {\n if (ts.isJsxText(child)) return 0\n if (ts.isJsxElement(child) || ts.isJsxSelfClosingElement(child))\n return templateElementCount(child)\n if (ts.isJsxExpression(child)) {\n if (!child.expression) return 0\n return containsJSXInExpr(child.expression) ? -1 : 0\n }\n if (ts.isJsxFragment(child)) return templateFragmentCount(child)\n return -1\n }\n\n /**\n * Count DOM elements in a JSX subtree. Returns -1 if the tree is not\n * eligible for template emission.\n */\n function templateElementCount(node: ts.JsxElement | ts.JsxSelfClosingElement): number {\n const tag = jsxTagName(node)\n if (!tag || !isLowerCase(tag)) return -1\n if (hasBailAttr(node)) return -1\n if (!ts.isJsxElement(node)) return 1\n\n let count = 1\n for (const child of node.children) {\n const c = countChildForTemplate(child)\n if (c === -1) return -1\n count += c\n }\n return count\n }\n\n /** Count template-eligible elements inside a fragment. */\n function templateFragmentCount(frag: ts.JsxFragment): number {\n let count = 0\n for (const child of frag.children) {\n const c = countChildForTemplate(child)\n if (c === -1) return -1\n count += c\n }\n return count\n }\n\n /**\n * Build the complete `_tpl(\"html\", (__root) => { ... })` call string\n * for a template-eligible JSX element tree. Returns null if codegen fails.\n */\n function buildTemplateCall(node: ts.JsxElement | ts.JsxSelfClosingElement): string | null {\n const bindLines: string[] = []\n const disposerNames: string[] = []\n let varIdx = 0\n let dispIdx = 0\n\n function nextVar(): string {\n return `__e${varIdx++}`\n }\n function nextDisp(): string {\n const name = `__d${dispIdx++}`\n disposerNames.push(name)\n return name\n }\n function nextTextVar(): string {\n return `__t${varIdx++}`\n }\n\n /** Resolve the variable name for an element given its accessor path. */\n function resolveElementVar(accessor: string, hasDynamic: boolean): string {\n if (accessor === \"__root\") return \"__root\"\n if (hasDynamic) {\n const v = nextVar()\n bindLines.push(`const ${v} = ${accessor}`)\n return v\n }\n return accessor\n }\n\n /** Emit bind line for a ref attribute. */\n function emitRef(attr: ts.JsxAttribute, varName: string): void {\n if (!attr.initializer || !ts.isJsxExpression(attr.initializer)) return\n if (!attr.initializer.expression) return\n bindLines.push(`${sliceExpr(attr.initializer.expression)}.current = ${varName}`)\n }\n\n /** Emit addEventListener bind line for an event handler attribute. */\n function emitEventListener(attr: ts.JsxAttribute, attrName: string, varName: string): void {\n const eventName = (attrName[2] ?? \"\").toLowerCase() + attrName.slice(3)\n if (!attr.initializer || !ts.isJsxExpression(attr.initializer)) return\n if (!attr.initializer.expression) return\n bindLines.push(\n `${varName}.addEventListener(\"${eventName}\", ${sliceExpr(attr.initializer.expression)})`,\n )\n }\n\n /** Return HTML string for a static attribute expression, or null if not static. */\n function staticAttrToHtml(exprNode: ts.Expression, htmlAttrName: string): string | null {\n if (!isStatic(exprNode)) return null\n if (ts.isStringLiteral(exprNode)) return ` ${htmlAttrName}=\"${escapeHtmlAttr(exprNode.text)}\"`\n if (ts.isNumericLiteral(exprNode)) return ` ${htmlAttrName}=\"${exprNode.text}\"`\n if (exprNode.kind === ts.SyntaxKind.TrueKeyword) return ` ${htmlAttrName}`\n return \"\" // false/null/undefined → omit\n }\n\n /** Unwrap a reactive accessor expression for use inside _bind(). */\n function unwrapAccessor(exprNode: ts.Expression): { expr: string; isReactive: boolean } {\n // Concise arrow: () => value() → unwrap to \"value()\"\n if (ts.isArrowFunction(exprNode) && !ts.isBlock(exprNode.body)) {\n return { expr: sliceExpr(exprNode.body as ts.Expression), isReactive: true }\n }\n // Block-body arrow/function: invoke it\n if (ts.isArrowFunction(exprNode) || ts.isFunctionExpression(exprNode)) {\n return { expr: `(${sliceExpr(exprNode)})()`, isReactive: true }\n }\n return { expr: sliceExpr(exprNode), isReactive: containsCall(exprNode) }\n }\n\n /** Emit bind line for a dynamic (non-static) attribute. */\n function emitDynamicAttr(\n _expr: string,\n exprNode: ts.Expression,\n htmlAttrName: string,\n varName: string,\n ): void {\n const { expr, isReactive } = unwrapAccessor(exprNode)\n const setter =\n htmlAttrName === \"class\"\n ? `${varName}.className = ${expr}`\n : `${varName}.setAttribute(\"${htmlAttrName}\", ${expr})`\n\n if (isReactive) {\n const d = nextDisp()\n bindLines.push(`const ${d} = _bind(() => { ${setter} })`)\n } else {\n bindLines.push(setter)\n }\n }\n\n /** Emit bind line or HTML for an expression attribute value. */\n function emitAttrExpression(\n exprNode: ts.Expression,\n htmlAttrName: string,\n varName: string,\n ): string {\n const staticHtml = staticAttrToHtml(exprNode, htmlAttrName)\n if (staticHtml !== null) return staticHtml\n emitDynamicAttr(sliceExpr(exprNode), exprNode, htmlAttrName, varName)\n return \"\"\n }\n\n /** Emit side-effects for special attrs (ref, event). Returns true if handled. */\n function tryEmitSpecialAttr(attr: ts.JsxAttribute, attrName: string, varName: string): boolean {\n if (attrName === \"ref\") {\n emitRef(attr, varName)\n return true\n }\n if (EVENT_RE.test(attrName)) {\n emitEventListener(attr, attrName, varName)\n return true\n }\n return false\n }\n\n /** Convert an attribute initializer to HTML. Returns empty string for side-effect-only attrs. */\n function attrInitializerToHtml(\n attr: ts.JsxAttribute,\n htmlAttrName: string,\n varName: string,\n ): string {\n if (!attr.initializer) return ` ${htmlAttrName}`\n if (ts.isStringLiteral(attr.initializer))\n return ` ${htmlAttrName}=\"${escapeHtmlAttr(attr.initializer.text)}\"`\n if (ts.isJsxExpression(attr.initializer) && attr.initializer.expression)\n return emitAttrExpression(attr.initializer.expression, htmlAttrName, varName)\n return \"\"\n }\n\n /** Process a single attribute, returning HTML to append. */\n function processOneAttr(attr: ts.JsxAttributeLike, varName: string): string {\n if (!ts.isJsxAttribute(attr)) return \"\"\n const attrName = ts.isIdentifier(attr.name) ? attr.name.text : \"\"\n if (attrName === \"key\") return \"\"\n if (tryEmitSpecialAttr(attr, attrName, varName)) return \"\"\n return attrInitializerToHtml(attr, JSX_TO_HTML_ATTR[attrName] ?? attrName, varName)\n }\n\n /** Process all attributes on an element, returning the HTML attribute string. */\n function processAttrs(el: ts.JsxElement | ts.JsxSelfClosingElement, varName: string): string {\n let htmlAttrs = \"\"\n for (const attr of jsxAttrs(el)) htmlAttrs += processOneAttr(attr, varName)\n return htmlAttrs\n }\n\n /** Emit bind lines for a reactive text expression child. */\n function emitReactiveTextChild(\n expr: string,\n varName: string,\n parentRef: string,\n childNodeIdx: number,\n needsPlaceholder: boolean,\n ): string {\n const tVar = nextTextVar()\n const d = nextDisp()\n bindLines.push(`const ${tVar} = document.createTextNode(\"\")`)\n if (needsPlaceholder) {\n bindLines.push(\n `${parentRef}.replaceChild(${tVar}, ${parentRef}.childNodes[${childNodeIdx}])`,\n )\n } else {\n bindLines.push(`${varName}.appendChild(${tVar})`)\n }\n bindLines.push(`const ${d} = _bind(() => { ${tVar}.data = ${expr} })`)\n return needsPlaceholder ? \"<!>\" : \"\"\n }\n\n /** Emit bind lines for a static text expression child. */\n function emitStaticTextChild(\n expr: string,\n varName: string,\n parentRef: string,\n childNodeIdx: number,\n needsPlaceholder: boolean,\n ): string {\n if (needsPlaceholder) {\n const tVar = nextTextVar()\n bindLines.push(`const ${tVar} = document.createTextNode(${expr})`)\n bindLines.push(\n `${parentRef}.replaceChild(${tVar}, ${parentRef}.childNodes[${childNodeIdx}])`,\n )\n return \"<!>\"\n }\n bindLines.push(`${varName}.textContent = ${expr}`)\n return \"\"\n }\n\n /** Process a single flat child, returning the HTML contribution or null on failure. */\n function processOneChild(\n child: FlatChild,\n varName: string,\n parentRef: string,\n useMixed: boolean,\n useMultiExpr: boolean,\n childNodeIdx: number,\n ): string | null {\n if (child.kind === \"text\") return escapeHtmlText(child.text)\n if (child.kind === \"element\") {\n const childAccessor = useMixed\n ? `${parentRef}.childNodes[${childNodeIdx}]`\n : `${parentRef}.children[${child.elemIdx}]`\n return processElement(child.node, childAccessor)\n }\n // expression\n const needsPlaceholder = useMixed || useMultiExpr\n const { expr, isReactive } = unwrapAccessor(child.expression)\n if (isReactive) {\n return emitReactiveTextChild(expr, varName, parentRef, childNodeIdx, needsPlaceholder)\n }\n return emitStaticTextChild(expr, varName, parentRef, childNodeIdx, needsPlaceholder)\n }\n\n /** Process children of a JsxElement, returning the children HTML. */\n function processChildren(el: ts.JsxElement, varName: string, accessor: string): string | null {\n const flatChildren = flattenChildren(el.children)\n const { useMixed, useMultiExpr } = analyzeChildren(flatChildren)\n const parentRef = accessor === \"__root\" ? \"__root\" : varName\n\n let html = \"\"\n let childNodeIdx = 0\n\n for (const child of flatChildren) {\n const childHtml = processOneChild(\n child,\n varName,\n parentRef,\n useMixed,\n useMultiExpr,\n childNodeIdx,\n )\n if (childHtml === null) return null\n html += childHtml\n childNodeIdx++\n }\n\n return html\n }\n\n /** Process a single DOM element for template emission. Returns the HTML string or null. */\n function processElement(\n el: ts.JsxElement | ts.JsxSelfClosingElement,\n accessor: string,\n ): string | null {\n const tag = jsxTagName(el)\n if (!tag) return null\n\n const varName = resolveElementVar(accessor, elementHasDynamic(el))\n const htmlAttrs = processAttrs(el, varName)\n let html = `<${tag}${htmlAttrs}>`\n\n if (ts.isJsxElement(el)) {\n const childHtml = processChildren(el, varName, accessor)\n if (childHtml === null) return null\n html += childHtml\n }\n\n if (!VOID_ELEMENTS.has(tag)) html += `</${tag}>`\n return html\n }\n\n const html = processElement(node, \"__root\")\n if (html === null) return null\n\n // Build bind function body\n const escaped = html.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')\n\n if (bindLines.length === 0 && disposerNames.length === 0) {\n return `_tpl(\"${escaped}\", () => null)`\n }\n\n let body = bindLines.map((l) => ` ${l}`).join(\"\\n\")\n if (disposerNames.length > 0) {\n body += `\\n return () => { ${disposerNames.map((d) => `${d}()`).join(\"; \")} }`\n } else {\n body += \"\\n return null\"\n }\n\n return `_tpl(\"${escaped}\", (__root) => {\\n${body}\\n})`\n }\n\n /** Flat child descriptor for template children processing */\n type FlatChild =\n | { kind: \"text\"; text: string }\n | { kind: \"element\"; node: ts.JsxElement | ts.JsxSelfClosingElement; elemIdx: number }\n | { kind: \"expression\"; expression: ts.Expression }\n\n /** Classify a single JSX child into a FlatChild descriptor. */\n function classifyJsxChild(\n child: ts.JsxChild,\n out: FlatChild[],\n elemIdxRef: { value: number },\n recurse: (kids: ts.NodeArray<ts.JsxChild>) => void,\n ): void {\n if (ts.isJsxText(child)) {\n const trimmed = child.text.replace(/\\n\\s*/g, \"\").trim()\n if (trimmed) out.push({ kind: \"text\", text: trimmed })\n return\n }\n if (ts.isJsxElement(child) || ts.isJsxSelfClosingElement(child)) {\n out.push({ kind: \"element\", node: child, elemIdx: elemIdxRef.value++ })\n return\n }\n if (ts.isJsxExpression(child)) {\n if (child.expression) out.push({ kind: \"expression\", expression: child.expression })\n return\n }\n if (ts.isJsxFragment(child)) recurse(child.children)\n }\n\n /**\n * Flatten JSX children, inlining fragment children and stripping whitespace-only text.\n * Returns a flat array of child descriptors with element indices pre-computed.\n */\n function flattenChildren(children: ts.NodeArray<ts.JsxChild>): FlatChild[] {\n const flatList: FlatChild[] = []\n const elemIdxRef = { value: 0 }\n\n function addChildren(kids: ts.NodeArray<ts.JsxChild>): void {\n for (const child of kids) classifyJsxChild(child, flatList, elemIdxRef, addChildren)\n }\n\n addChildren(children)\n return flatList\n }\n\n /** Analyze flat children to determine indexing strategy. */\n function analyzeChildren(flatChildren: FlatChild[]): {\n useMixed: boolean\n useMultiExpr: boolean\n } {\n const hasElem = flatChildren.some((c) => c.kind === \"element\")\n const hasNonElem = flatChildren.some((c) => c.kind !== \"element\")\n const exprCount = flatChildren.filter((c) => c.kind === \"expression\").length\n return { useMixed: hasElem && hasNonElem, useMultiExpr: exprCount > 1 }\n }\n\n /** Check if a single attribute is dynamic (has ref, event, or non-static expression). */\n function attrIsDynamic(attr: ts.JsxAttributeLike): boolean {\n if (!ts.isJsxAttribute(attr)) return false\n const name = ts.isIdentifier(attr.name) ? attr.name.text : \"\"\n if (name === \"ref\") return true\n if (EVENT_RE.test(name)) return true\n if (!attr.initializer || !ts.isJsxExpression(attr.initializer)) return false\n const expr = attr.initializer.expression\n return expr ? !isStatic(expr) : false\n }\n\n /** Check if an element has any dynamic attributes, events, ref, or expression children */\n function elementHasDynamic(node: ts.JsxElement | ts.JsxSelfClosingElement): boolean {\n if (jsxAttrs(node).some(attrIsDynamic)) return true\n if (ts.isJsxElement(node)) {\n return node.children.some((c) => ts.isJsxExpression(c) && c.expression !== undefined)\n }\n return false\n }\n\n /** Slice expression source from the original code */\n function sliceExpr(expr: ts.Expression): string {\n return code.slice(expr.getStart(sf), expr.getEnd())\n }\n\n /** Get tag name string */\n function jsxTagName(node: ts.JsxElement | ts.JsxSelfClosingElement): string {\n const tag = ts.isJsxElement(node) ? node.openingElement.tagName : node.tagName\n return ts.isIdentifier(tag) ? tag.text : \"\"\n }\n\n /** Get attribute list */\n function jsxAttrs(\n node: ts.JsxElement | ts.JsxSelfClosingElement,\n ): ts.NodeArray<ts.JsxAttributeLike> {\n return ts.isJsxElement(node)\n ? node.openingElement.attributes.properties\n : node.attributes.properties\n }\n}\n\n// ─── Template constants ──────────────────────────────────────────────────────\n\nconst VOID_ELEMENTS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n])\n\nconst JSX_TO_HTML_ATTR: Record<string, string> = {\n className: \"class\",\n htmlFor: \"for\",\n}\n\nfunction isLowerCase(s: string): boolean {\n return s.length > 0 && s[0] === s[0]?.toLowerCase()\n}\n\n/** Check if an expression subtree contains JSX nodes */\nfunction containsJSXInExpr(node: ts.Node): boolean {\n if (ts.isJsxElement(node) || ts.isJsxSelfClosingElement(node) || ts.isJsxFragment(node))\n return true\n return ts.forEachChild(node, containsJSXInExpr) ?? false\n}\n\nfunction escapeHtmlAttr(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\")\n}\n\nfunction escapeHtmlText(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\")\n}\n\n// ─── Static JSX analysis ──────────────────────────────────────────────────────\n\ntype StaticJSXNode = ts.JsxElement | ts.JsxSelfClosingElement | ts.JsxFragment\n\nfunction isStaticJSXNode(node: StaticJSXNode): boolean {\n if (ts.isJsxSelfClosingElement(node)) {\n return isStaticAttrs(node.attributes)\n }\n if (ts.isJsxFragment(node)) {\n return node.children.every(isStaticChild)\n }\n // JsxElement\n return isStaticAttrs(node.openingElement.attributes) && node.children.every(isStaticChild)\n}\n\nfunction isStaticAttrs(attrs: ts.JsxAttributes): boolean {\n return attrs.properties.every((prop) => {\n // Spread attribute — always dynamic\n if (!ts.isJsxAttribute(prop)) return false\n // Boolean shorthand: <input disabled />\n if (!prop.initializer) return true\n // String literal: class=\"foo\"\n if (ts.isStringLiteral(prop.initializer)) return true\n // Must be JsxExpression — the only remaining JsxAttributeValue type\n const expr = (prop.initializer as ts.JsxExpression).expression\n return expr ? isStatic(expr) : true\n })\n}\n\nfunction isStaticChild(child: ts.JsxChild): boolean {\n // Plain text content\n if (ts.isJsxText(child)) return true\n // Nested JSX elements\n if (ts.isJsxSelfClosingElement(child)) return isStaticJSXNode(child)\n if (ts.isJsxElement(child)) return isStaticJSXNode(child)\n if (ts.isJsxFragment(child)) return isStaticJSXNode(child)\n // Must be JsxExpression — the only remaining JsxChild type\n const expr = (child as ts.JsxExpression).expression\n return expr ? isStatic(expr) : true\n}\n\n// ─── General helpers ──────────────────────────────────────────────────────────\n\nfunction isStatic(node: ts.Expression): boolean {\n return (\n ts.isStringLiteral(node) ||\n ts.isNumericLiteral(node) ||\n ts.isNoSubstitutionTemplateLiteral(node) ||\n node.kind === ts.SyntaxKind.TrueKeyword ||\n node.kind === ts.SyntaxKind.FalseKeyword ||\n node.kind === ts.SyntaxKind.NullKeyword ||\n node.kind === ts.SyntaxKind.UndefinedKeyword\n )\n}\n\nfunction shouldWrap(node: ts.Expression): boolean {\n // Already a function — user explicitly wrapped or it's a callback\n if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) return false\n // Static literal — no signals involved\n if (isStatic(node)) return false\n // Only wrap if the expression tree contains a call — signal reads are always\n // function calls (e.g. `count()`, `name()`). Plain identifiers, object literals\n // like `style={{ color: \"red\" }}`, array literals, and member accesses are\n // left as-is to avoid unnecessary reactive wrappers.\n return containsCall(node)\n}\n\nfunction containsCall(node: ts.Node): boolean {\n if (ts.isCallExpression(node)) return true\n if (ts.isTaggedTemplateExpression(node)) return true\n // Don't recurse into nested functions — they're self-contained\n if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) return false\n return ts.forEachChild(node, containsCall) ?? false\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DA,MAAM,aAAa,IAAI,IAAI,CAAC,OAAO,MAAM,CAAC;AAE1C,MAAM,WAAW;AAEjB,SAAgB,aAAa,MAAc,WAAW,aAA8B;CAClF,MAAM,aACJ,SAAS,SAAS,OAAO,IAAI,SAAS,SAAS,OAAO,GAAG,GAAG,WAAW,MAAM,GAAG,WAAW;CAE7F,MAAM,KAAK,GAAG,iBACZ,UACA,MACA,GAAG,aAAa,QACK,MACrB,WACD;CAGD,MAAM,eAA8B,EAAE;CACtC,MAAM,WAA8B,EAAE;CAEtC,SAAS,KAAK,MAAe,SAAiB,UAAyC;EACrF,MAAM,EAAE,MAAM,cAAc,GAAG,8BAA8B,KAAK,SAAS,GAAG,CAAC;AAC/E,WAAS,KAAK;GAAE;GAAS,MAAM,OAAO;GAAG,QAAQ;GAAW,MAAM;GAAU,CAAC;;CAK/E,MAAM,SAAkB,EAAE;CAC1B,IAAI,WAAW;CACf,IAAI,iBAAiB;;;;;CAMrB,SAAS,WAAW,MAA8B;AAChD,OACG,GAAG,aAAa,KAAK,IAAI,GAAG,wBAAwB,KAAK,IAAI,GAAG,cAAc,KAAK,KACpF,gBAAgB,KAAkE,EAClF;GACA,MAAM,OAAO,MAAM;GACnB,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,GAAG,EAAE,KAAK,QAAQ,CAAC;AACzD,UAAO,KAAK;IAAE;IAAM;IAAM,CAAC;AAC3B,UAAO;;AAET,SAAO;;CAGT,SAAS,KAAK,MAA2B;EACvC,MAAM,QAAQ,KAAK,SAAS,GAAG;EAC/B,MAAM,MAAM,KAAK,QAAQ;AACzB,eAAa,KAAK;GAAE;GAAO;GAAK,MAAM,SAAS,KAAK,MAAM,OAAO,IAAI;GAAI,CAAC;;;CAI5E,SAAS,YAAY,MAA2B;EAC9C,MAAM,YAAY,WAAW,KAAK;AAClC,MAAI,UACF,cAAa,KAAK;GAAE,OAAO,KAAK,SAAS,GAAG;GAAE,KAAK,KAAK,QAAQ;GAAE,MAAM;GAAW,CAAC;WAC3E,WAAW,KAAK,CACzB,MAAK,KAAK;;;CAOd,SAAS,gBAAgB,MAA8B;AAErD,MADkB,qBAAqB,KAAK,GAC5B,EAAG,QAAO;EAC1B,MAAM,UAAU,kBAAkB,KAAK;AACvC,MAAI,CAAC,QAAS,QAAO;EACrB,MAAM,QAAQ,KAAK,SAAS,GAAG;EAC/B,MAAM,MAAM,KAAK,QAAQ;EACzB,MAAM,SAAS,KAAK;EACpB,MAAM,cAAc,WAAW,GAAG,aAAa,OAAO,IAAI,GAAG,cAAc,OAAO;AAClF,eAAa,KAAK;GAAE;GAAO;GAAK,MAAM,cAAc,IAAI,QAAQ,KAAK;GAAS,CAAC;AAC/E,mBAAiB;AACjB,SAAO;;;CAIT,SAAS,iBAAiB,MAAsD;EAC9E,MAAM,UAAU,GAAG,aAAa,KAAK,GAAG,KAAK,iBAAiB;AAE9D,OADgB,GAAG,aAAa,QAAQ,QAAQ,GAAG,QAAQ,QAAQ,OAAO,QAC1D,MAAO;AAIvB,MAAI,CAHU,QAAQ,WAAW,WAAW,MACzC,MAAM,GAAG,eAAe,EAAE,IAAI,GAAG,aAAa,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,KAC3E,CAEC,MACE,QAAQ,SACR,qLACA,qBACD;;;CAKL,SAAS,mBAAmB,MAA6B;EACvD,MAAM,OAAO,GAAG,aAAa,KAAK,KAAK,GAAG,KAAK,KAAK,OAAO;EAC3D,MAAM,YAAY,KAAK,OAAO;EAC9B,MAAM,UAAU,GAAG,aAAa,UAAU,QAAQ,GAAG,UAAU,QAAQ,OAAO;AAG9E,MADE,QAAQ,SAAS,KAAK,QAAQ,OAAO,EAAE,KAAK,QAAQ,OAAO,EAAE,CAAC,aAAa,CACrD;AACxB,MAAI,WAAW,IAAI,KAAK,IAAI,SAAS,KAAK,KAAK,CAAE;AACjD,MAAI,CAAC,KAAK,eAAe,CAAC,GAAG,gBAAgB,KAAK,YAAY,CAAE;EAChE,MAAM,OAAO,KAAK,YAAY;AAC9B,MAAI,KAAM,aAAY,KAAK;;;CAI7B,SAAS,oBAAoB,MAA8B;EACzD,MAAM,OAAO,KAAK;AAClB,MAAI,KAAM,aAAY,KAAK;;CAG7B,SAAS,KAAK,MAAqB;AACjC,MAAI,GAAG,aAAa,KAAK,IAAI,gBAAgB,KAAK,CAAE;AACpD,MAAI,GAAG,wBAAwB,KAAK,IAAI,GAAG,aAAa,KAAK,CAAE,kBAAiB,KAAK;AACrF,MAAI,GAAG,eAAe,KAAK,EAAE;AAC3B,sBAAmB,KAAK;AACxB;;AAEF,MAAI,GAAG,gBAAgB,KAAK,EAAE;AAC5B,uBAAoB,KAAK;AACzB;;AAEF,KAAG,aAAa,MAAM,KAAK;;AAG7B,MAAK,GAAG;AAER,KAAI,aAAa,WAAW,KAAK,OAAO,WAAW,EAAG,QAAO;EAAE;EAAM;EAAU;AAG/E,cAAa,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM;CAE9C,IAAI,SAAS;AACb,MAAK,MAAM,KAAK,aACd,UAAS,OAAO,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,MAAM,EAAE,IAAI;AAIlE,KAAI,OAAO,SAAS,EAElB,UADiB,OAAO,KAAK,MAAM,SAAS,EAAE,KAAK,mBAAmB,EAAE,KAAK,IAAI,CAAC,KAAK,GAAG,GACtE;AAItB,KAAI,eACF,UACE,+FACA;AAGJ,QAAO;EAAE,MAAM;EAAQ,eAAe;EAAgB;EAAU;;CAKhE,SAAS,YAAY,MAAyD;AAC5E,OAAK,MAAM,QAAQ,SAAS,KAAK,EAAE;AACjC,OAAI,GAAG,qBAAqB,KAAK,CAAE,QAAO;AAC1C,OAAI,GAAG,eAAe,KAAK,IAAI,GAAG,aAAa,KAAK,KAAK,IAAI,KAAK,KAAK,SAAS,MAC9E,QAAO;;AAEX,SAAO;;;;;;CAOT,SAAS,sBAAsB,OAA4B;AACzD,MAAI,GAAG,UAAU,MAAM,CAAE,QAAO;AAChC,MAAI,GAAG,aAAa,MAAM,IAAI,GAAG,wBAAwB,MAAM,CAC7D,QAAO,qBAAqB,MAAM;AACpC,MAAI,GAAG,gBAAgB,MAAM,EAAE;AAC7B,OAAI,CAAC,MAAM,WAAY,QAAO;AAC9B,UAAO,kBAAkB,MAAM,WAAW,GAAG,KAAK;;AAEpD,MAAI,GAAG,cAAc,MAAM,CAAE,QAAO,sBAAsB,MAAM;AAChE,SAAO;;;;;;CAOT,SAAS,qBAAqB,MAAwD;EACpF,MAAM,MAAM,WAAW,KAAK;AAC5B,MAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAE,QAAO;AACtC,MAAI,YAAY,KAAK,CAAE,QAAO;AAC9B,MAAI,CAAC,GAAG,aAAa,KAAK,CAAE,QAAO;EAEnC,IAAI,QAAQ;AACZ,OAAK,MAAM,SAAS,KAAK,UAAU;GACjC,MAAM,IAAI,sBAAsB,MAAM;AACtC,OAAI,MAAM,GAAI,QAAO;AACrB,YAAS;;AAEX,SAAO;;;CAIT,SAAS,sBAAsB,MAA8B;EAC3D,IAAI,QAAQ;AACZ,OAAK,MAAM,SAAS,KAAK,UAAU;GACjC,MAAM,IAAI,sBAAsB,MAAM;AACtC,OAAI,MAAM,GAAI,QAAO;AACrB,YAAS;;AAEX,SAAO;;;;;;CAOT,SAAS,kBAAkB,MAA+D;EACxF,MAAM,YAAsB,EAAE;EAC9B,MAAM,gBAA0B,EAAE;EAClC,IAAI,SAAS;EACb,IAAI,UAAU;EAEd,SAAS,UAAkB;AACzB,UAAO,MAAM;;EAEf,SAAS,WAAmB;GAC1B,MAAM,OAAO,MAAM;AACnB,iBAAc,KAAK,KAAK;AACxB,UAAO;;EAET,SAAS,cAAsB;AAC7B,UAAO,MAAM;;;EAIf,SAAS,kBAAkB,UAAkB,YAA6B;AACxE,OAAI,aAAa,SAAU,QAAO;AAClC,OAAI,YAAY;IACd,MAAM,IAAI,SAAS;AACnB,cAAU,KAAK,SAAS,EAAE,KAAK,WAAW;AAC1C,WAAO;;AAET,UAAO;;;EAIT,SAAS,QAAQ,MAAuB,SAAuB;AAC7D,OAAI,CAAC,KAAK,eAAe,CAAC,GAAG,gBAAgB,KAAK,YAAY,CAAE;AAChE,OAAI,CAAC,KAAK,YAAY,WAAY;AAClC,aAAU,KAAK,GAAG,UAAU,KAAK,YAAY,WAAW,CAAC,aAAa,UAAU;;;EAIlF,SAAS,kBAAkB,MAAuB,UAAkB,SAAuB;GACzF,MAAM,aAAa,SAAS,MAAM,IAAI,aAAa,GAAG,SAAS,MAAM,EAAE;AACvE,OAAI,CAAC,KAAK,eAAe,CAAC,GAAG,gBAAgB,KAAK,YAAY,CAAE;AAChE,OAAI,CAAC,KAAK,YAAY,WAAY;AAClC,aAAU,KACR,GAAG,QAAQ,qBAAqB,UAAU,KAAK,UAAU,KAAK,YAAY,WAAW,CAAC,GACvF;;;EAIH,SAAS,iBAAiB,UAAyB,cAAqC;AACtF,OAAI,CAAC,SAAS,SAAS,CAAE,QAAO;AAChC,OAAI,GAAG,gBAAgB,SAAS,CAAE,QAAO,IAAI,aAAa,IAAI,eAAe,SAAS,KAAK,CAAC;AAC5F,OAAI,GAAG,iBAAiB,SAAS,CAAE,QAAO,IAAI,aAAa,IAAI,SAAS,KAAK;AAC7E,OAAI,SAAS,SAAS,GAAG,WAAW,YAAa,QAAO,IAAI;AAC5D,UAAO;;;EAIT,SAAS,eAAe,UAAgE;AAEtF,OAAI,GAAG,gBAAgB,SAAS,IAAI,CAAC,GAAG,QAAQ,SAAS,KAAK,CAC5D,QAAO;IAAE,MAAM,UAAU,SAAS,KAAsB;IAAE,YAAY;IAAM;AAG9E,OAAI,GAAG,gBAAgB,SAAS,IAAI,GAAG,qBAAqB,SAAS,CACnE,QAAO;IAAE,MAAM,IAAI,UAAU,SAAS,CAAC;IAAM,YAAY;IAAM;AAEjE,UAAO;IAAE,MAAM,UAAU,SAAS;IAAE,YAAY,aAAa,SAAS;IAAE;;;EAI1E,SAAS,gBACP,OACA,UACA,cACA,SACM;GACN,MAAM,EAAE,MAAM,eAAe,eAAe,SAAS;GACrD,MAAM,SACJ,iBAAiB,UACb,GAAG,QAAQ,eAAe,SAC1B,GAAG,QAAQ,iBAAiB,aAAa,KAAK,KAAK;AAEzD,OAAI,YAAY;IACd,MAAM,IAAI,UAAU;AACpB,cAAU,KAAK,SAAS,EAAE,mBAAmB,OAAO,KAAK;SAEzD,WAAU,KAAK,OAAO;;;EAK1B,SAAS,mBACP,UACA,cACA,SACQ;GACR,MAAM,aAAa,iBAAiB,UAAU,aAAa;AAC3D,OAAI,eAAe,KAAM,QAAO;AAChC,mBAAgB,UAAU,SAAS,EAAE,UAAU,cAAc,QAAQ;AACrE,UAAO;;;EAIT,SAAS,mBAAmB,MAAuB,UAAkB,SAA0B;AAC7F,OAAI,aAAa,OAAO;AACtB,YAAQ,MAAM,QAAQ;AACtB,WAAO;;AAET,OAAI,SAAS,KAAK,SAAS,EAAE;AAC3B,sBAAkB,MAAM,UAAU,QAAQ;AAC1C,WAAO;;AAET,UAAO;;;EAIT,SAAS,sBACP,MACA,cACA,SACQ;AACR,OAAI,CAAC,KAAK,YAAa,QAAO,IAAI;AAClC,OAAI,GAAG,gBAAgB,KAAK,YAAY,CACtC,QAAO,IAAI,aAAa,IAAI,eAAe,KAAK,YAAY,KAAK,CAAC;AACpE,OAAI,GAAG,gBAAgB,KAAK,YAAY,IAAI,KAAK,YAAY,WAC3D,QAAO,mBAAmB,KAAK,YAAY,YAAY,cAAc,QAAQ;AAC/E,UAAO;;;EAIT,SAAS,eAAe,MAA2B,SAAyB;AAC1E,OAAI,CAAC,GAAG,eAAe,KAAK,CAAE,QAAO;GACrC,MAAM,WAAW,GAAG,aAAa,KAAK,KAAK,GAAG,KAAK,KAAK,OAAO;AAC/D,OAAI,aAAa,MAAO,QAAO;AAC/B,OAAI,mBAAmB,MAAM,UAAU,QAAQ,CAAE,QAAO;AACxD,UAAO,sBAAsB,MAAM,iBAAiB,aAAa,UAAU,QAAQ;;;EAIrF,SAAS,aAAa,IAA8C,SAAyB;GAC3F,IAAI,YAAY;AAChB,QAAK,MAAM,QAAQ,SAAS,GAAG,CAAE,cAAa,eAAe,MAAM,QAAQ;AAC3E,UAAO;;;EAIT,SAAS,sBACP,MACA,SACA,WACA,cACA,kBACQ;GACR,MAAM,OAAO,aAAa;GAC1B,MAAM,IAAI,UAAU;AACpB,aAAU,KAAK,SAAS,KAAK,gCAAgC;AAC7D,OAAI,iBACF,WAAU,KACR,GAAG,UAAU,gBAAgB,KAAK,IAAI,UAAU,cAAc,aAAa,IAC5E;OAED,WAAU,KAAK,GAAG,QAAQ,eAAe,KAAK,GAAG;AAEnD,aAAU,KAAK,SAAS,EAAE,mBAAmB,KAAK,UAAU,KAAK,KAAK;AACtE,UAAO,mBAAmB,QAAQ;;;EAIpC,SAAS,oBACP,MACA,SACA,WACA,cACA,kBACQ;AACR,OAAI,kBAAkB;IACpB,MAAM,OAAO,aAAa;AAC1B,cAAU,KAAK,SAAS,KAAK,6BAA6B,KAAK,GAAG;AAClE,cAAU,KACR,GAAG,UAAU,gBAAgB,KAAK,IAAI,UAAU,cAAc,aAAa,IAC5E;AACD,WAAO;;AAET,aAAU,KAAK,GAAG,QAAQ,iBAAiB,OAAO;AAClD,UAAO;;;EAIT,SAAS,gBACP,OACA,SACA,WACA,UACA,cACA,cACe;AACf,OAAI,MAAM,SAAS,OAAQ,QAAO,eAAe,MAAM,KAAK;AAC5D,OAAI,MAAM,SAAS,WAAW;IAC5B,MAAM,gBAAgB,WAClB,GAAG,UAAU,cAAc,aAAa,KACxC,GAAG,UAAU,YAAY,MAAM,QAAQ;AAC3C,WAAO,eAAe,MAAM,MAAM,cAAc;;GAGlD,MAAM,mBAAmB,YAAY;GACrC,MAAM,EAAE,MAAM,eAAe,eAAe,MAAM,WAAW;AAC7D,OAAI,WACF,QAAO,sBAAsB,MAAM,SAAS,WAAW,cAAc,iBAAiB;AAExF,UAAO,oBAAoB,MAAM,SAAS,WAAW,cAAc,iBAAiB;;;EAItF,SAAS,gBAAgB,IAAmB,SAAiB,UAAiC;GAC5F,MAAM,eAAe,gBAAgB,GAAG,SAAS;GACjD,MAAM,EAAE,UAAU,iBAAiB,gBAAgB,aAAa;GAChE,MAAM,YAAY,aAAa,WAAW,WAAW;GAErD,IAAI,OAAO;GACX,IAAI,eAAe;AAEnB,QAAK,MAAM,SAAS,cAAc;IAChC,MAAM,YAAY,gBAChB,OACA,SACA,WACA,UACA,cACA,aACD;AACD,QAAI,cAAc,KAAM,QAAO;AAC/B,YAAQ;AACR;;AAGF,UAAO;;;EAIT,SAAS,eACP,IACA,UACe;GACf,MAAM,MAAM,WAAW,GAAG;AAC1B,OAAI,CAAC,IAAK,QAAO;GAEjB,MAAM,UAAU,kBAAkB,UAAU,kBAAkB,GAAG,CAAC;GAElE,IAAI,OAAO,IAAI,MADG,aAAa,IAAI,QAAQ,CACZ;AAE/B,OAAI,GAAG,aAAa,GAAG,EAAE;IACvB,MAAM,YAAY,gBAAgB,IAAI,SAAS,SAAS;AACxD,QAAI,cAAc,KAAM,QAAO;AAC/B,YAAQ;;AAGV,OAAI,CAAC,cAAc,IAAI,IAAI,CAAE,SAAQ,KAAK,IAAI;AAC9C,UAAO;;EAGT,MAAM,OAAO,eAAe,MAAM,SAAS;AAC3C,MAAI,SAAS,KAAM,QAAO;EAG1B,MAAM,UAAU,KAAK,QAAQ,OAAO,OAAO,CAAC,QAAQ,MAAM,OAAM;AAEhE,MAAI,UAAU,WAAW,KAAK,cAAc,WAAW,EACrD,QAAO,SAAS,QAAQ;EAG1B,IAAI,OAAO,UAAU,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,KAAK;AACpD,MAAI,cAAc,SAAS,EACzB,SAAQ,sBAAsB,cAAc,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,KAAK,KAAK,CAAC;MAE5E,SAAQ;AAGV,SAAO,SAAS,QAAQ,oBAAoB,KAAK;;;CAUnD,SAAS,iBACP,OACA,KACA,YACA,SACM;AACN,MAAI,GAAG,UAAU,MAAM,EAAE;GACvB,MAAM,UAAU,MAAM,KAAK,QAAQ,UAAU,GAAG,CAAC,MAAM;AACvD,OAAI,QAAS,KAAI,KAAK;IAAE,MAAM;IAAQ,MAAM;IAAS,CAAC;AACtD;;AAEF,MAAI,GAAG,aAAa,MAAM,IAAI,GAAG,wBAAwB,MAAM,EAAE;AAC/D,OAAI,KAAK;IAAE,MAAM;IAAW,MAAM;IAAO,SAAS,WAAW;IAAS,CAAC;AACvE;;AAEF,MAAI,GAAG,gBAAgB,MAAM,EAAE;AAC7B,OAAI,MAAM,WAAY,KAAI,KAAK;IAAE,MAAM;IAAc,YAAY,MAAM;IAAY,CAAC;AACpF;;AAEF,MAAI,GAAG,cAAc,MAAM,CAAE,SAAQ,MAAM,SAAS;;;;;;CAOtD,SAAS,gBAAgB,UAAkD;EACzE,MAAM,WAAwB,EAAE;EAChC,MAAM,aAAa,EAAE,OAAO,GAAG;EAE/B,SAAS,YAAY,MAAuC;AAC1D,QAAK,MAAM,SAAS,KAAM,kBAAiB,OAAO,UAAU,YAAY,YAAY;;AAGtF,cAAY,SAAS;AACrB,SAAO;;;CAIT,SAAS,gBAAgB,cAGvB;EACA,MAAM,UAAU,aAAa,MAAM,MAAM,EAAE,SAAS,UAAU;EAC9D,MAAM,aAAa,aAAa,MAAM,MAAM,EAAE,SAAS,UAAU;EACjE,MAAM,YAAY,aAAa,QAAQ,MAAM,EAAE,SAAS,aAAa,CAAC;AACtE,SAAO;GAAE,UAAU,WAAW;GAAY,cAAc,YAAY;GAAG;;;CAIzE,SAAS,cAAc,MAAoC;AACzD,MAAI,CAAC,GAAG,eAAe,KAAK,CAAE,QAAO;EACrC,MAAM,OAAO,GAAG,aAAa,KAAK,KAAK,GAAG,KAAK,KAAK,OAAO;AAC3D,MAAI,SAAS,MAAO,QAAO;AAC3B,MAAI,SAAS,KAAK,KAAK,CAAE,QAAO;AAChC,MAAI,CAAC,KAAK,eAAe,CAAC,GAAG,gBAAgB,KAAK,YAAY,CAAE,QAAO;EACvE,MAAM,OAAO,KAAK,YAAY;AAC9B,SAAO,OAAO,CAAC,SAAS,KAAK,GAAG;;;CAIlC,SAAS,kBAAkB,MAAyD;AAClF,MAAI,SAAS,KAAK,CAAC,KAAK,cAAc,CAAE,QAAO;AAC/C,MAAI,GAAG,aAAa,KAAK,CACvB,QAAO,KAAK,SAAS,MAAM,MAAM,GAAG,gBAAgB,EAAE,IAAI,EAAE,eAAe,OAAU;AAEvF,SAAO;;;CAIT,SAAS,UAAU,MAA6B;AAC9C,SAAO,KAAK,MAAM,KAAK,SAAS,GAAG,EAAE,KAAK,QAAQ,CAAC;;;CAIrD,SAAS,WAAW,MAAwD;EAC1E,MAAM,MAAM,GAAG,aAAa,KAAK,GAAG,KAAK,eAAe,UAAU,KAAK;AACvE,SAAO,GAAG,aAAa,IAAI,GAAG,IAAI,OAAO;;;CAI3C,SAAS,SACP,MACmC;AACnC,SAAO,GAAG,aAAa,KAAK,GACxB,KAAK,eAAe,WAAW,aAC/B,KAAK,WAAW;;;AAMxB,MAAM,gBAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,mBAA2C;CAC/C,WAAW;CACX,SAAS;CACV;AAED,SAAS,YAAY,GAAoB;AACvC,QAAO,EAAE,SAAS,KAAK,EAAE,OAAO,EAAE,IAAI,aAAa;;;AAIrD,SAAS,kBAAkB,MAAwB;AACjD,KAAI,GAAG,aAAa,KAAK,IAAI,GAAG,wBAAwB,KAAK,IAAI,GAAG,cAAc,KAAK,CACrF,QAAO;AACT,QAAO,GAAG,aAAa,MAAM,kBAAkB,IAAI;;AAGrD,SAAS,eAAe,GAAmB;AACzC,QAAO,EAAE,QAAQ,MAAM,QAAQ,CAAC,QAAQ,MAAM,SAAS;;AAGzD,SAAS,eAAe,GAAmB;AACzC,QAAO,EAAE,QAAQ,MAAM,QAAQ,CAAC,QAAQ,MAAM,OAAO;;AAOvD,SAAS,gBAAgB,MAA8B;AACrD,KAAI,GAAG,wBAAwB,KAAK,CAClC,QAAO,cAAc,KAAK,WAAW;AAEvC,KAAI,GAAG,cAAc,KAAK,CACxB,QAAO,KAAK,SAAS,MAAM,cAAc;AAG3C,QAAO,cAAc,KAAK,eAAe,WAAW,IAAI,KAAK,SAAS,MAAM,cAAc;;AAG5F,SAAS,cAAc,OAAkC;AACvD,QAAO,MAAM,WAAW,OAAO,SAAS;AAEtC,MAAI,CAAC,GAAG,eAAe,KAAK,CAAE,QAAO;AAErC,MAAI,CAAC,KAAK,YAAa,QAAO;AAE9B,MAAI,GAAG,gBAAgB,KAAK,YAAY,CAAE,QAAO;EAEjD,MAAM,OAAQ,KAAK,YAAiC;AACpD,SAAO,OAAO,SAAS,KAAK,GAAG;GAC/B;;AAGJ,SAAS,cAAc,OAA6B;AAElD,KAAI,GAAG,UAAU,MAAM,CAAE,QAAO;AAEhC,KAAI,GAAG,wBAAwB,MAAM,CAAE,QAAO,gBAAgB,MAAM;AACpE,KAAI,GAAG,aAAa,MAAM,CAAE,QAAO,gBAAgB,MAAM;AACzD,KAAI,GAAG,cAAc,MAAM,CAAE,QAAO,gBAAgB,MAAM;CAE1D,MAAM,OAAQ,MAA2B;AACzC,QAAO,OAAO,SAAS,KAAK,GAAG;;AAKjC,SAAS,SAAS,MAA8B;AAC9C,QACE,GAAG,gBAAgB,KAAK,IACxB,GAAG,iBAAiB,KAAK,IACzB,GAAG,gCAAgC,KAAK,IACxC,KAAK,SAAS,GAAG,WAAW,eAC5B,KAAK,SAAS,GAAG,WAAW,gBAC5B,KAAK,SAAS,GAAG,WAAW,eAC5B,KAAK,SAAS,GAAG,WAAW;;AAIhC,SAAS,WAAW,MAA8B;AAEhD,KAAI,GAAG,gBAAgB,KAAK,IAAI,GAAG,qBAAqB,KAAK,CAAE,QAAO;AAEtE,KAAI,SAAS,KAAK,CAAE,QAAO;AAK3B,QAAO,aAAa,KAAK;;AAG3B,SAAS,aAAa,MAAwB;AAC5C,KAAI,GAAG,iBAAiB,KAAK,CAAE,QAAO;AACtC,KAAI,GAAG,2BAA2B,KAAK,CAAE,QAAO;AAEhD,KAAI,GAAG,gBAAgB,KAAK,IAAI,GAAG,qBAAqB,KAAK,CAAE,QAAO;AACtE,QAAO,GAAG,aAAa,MAAM,aAAa,IAAI"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/jsx.ts"],"sourcesContent":["/**\n * JSX transform — wraps dynamic JSX expressions in `() =>` so the Pyreon runtime\n * receives reactive getters instead of eagerly-evaluated snapshot values.\n *\n * Rules:\n * - `<div>{expr}</div>` → `<div>{() => expr}</div>` (child)\n * - `<div class={expr}>` → `<div class={() => expr}>` (prop)\n * - `<button onClick={fn}>` → unchanged (event handler)\n * - `<div>{() => expr}</div>` → unchanged (already wrapped)\n * - `<div>{\"literal\"}</div>` → unchanged (static)\n *\n * Static VNode hoisting:\n * - Fully static JSX in expression containers is hoisted to module scope:\n * `{<span>Hello</span>}` → `const _$h0 = <span>Hello</span>` + `{_$h0}`\n * - Hoisted nodes are created ONCE at module initialisation, not per-instance.\n * - A JSX node is static if: all props are string literals / booleans / static\n * values, and all children are text nodes or other static JSX nodes.\n *\n * Template emission:\n * - JSX element trees with ≥ 2 DOM elements (no components, no spread attrs)\n * are compiled to `_tpl(html, bindFn)` calls instead of nested `h()` calls.\n * - The HTML string is parsed once via <template>.innerHTML, then cloneNode(true)\n * for each instance (~5-10x faster than sequential createElement calls).\n * - Static attributes are baked into the HTML string; dynamic attributes and\n * text content use renderEffect in the bind function.\n *\n * Implementation: TypeScript parser for positions + magic-string replacements.\n * No extra runtime dependencies — `typescript` is already in devDependencies.\n *\n * Known limitation (v0): expressions inside *nested* JSX within a child\n * expression container are not individually wrapped. They are still reactive\n * because the outer wrapper re-evaluates the whole subtree, just at a coarser\n * granularity. Fine-grained nested wrapping is planned for a future pass.\n */\n\nimport ts from \"typescript\"\n\nexport interface CompilerWarning {\n /** Warning message */\n message: string\n /** Source file line number (1-based) */\n line: number\n /** Source file column number (0-based) */\n column: number\n /** Warning code for filtering */\n code: \"signal-call-in-jsx\" | \"missing-key-on-for\" | \"signal-in-static-prop\"\n}\n\nexport interface TransformResult {\n /** Transformed source code (JSX preserved, only expression containers modified) */\n code: string\n /** Whether the output uses _tpl/_re template helpers (needs auto-import) */\n usesTemplates?: boolean\n /** Compiler warnings for common mistakes */\n warnings: CompilerWarning[]\n}\n\n// Props that should never be wrapped in a reactive getter\nconst SKIP_PROPS = new Set([\"key\", \"ref\"])\n// Event handler pattern: onClick, onInput, onMouseEnter, …\nconst EVENT_RE = /^on[A-Z]/\n// Events delegated to the container — must match runtime DELEGATED_EVENTS set\nconst DELEGATED_EVENTS = new Set([\n \"click\",\n \"dblclick\",\n \"contextmenu\",\n \"focusin\",\n \"focusout\",\n \"input\",\n \"change\",\n \"keydown\",\n \"keyup\",\n \"mousedown\",\n \"mouseup\",\n \"mousemove\",\n \"mouseover\",\n \"mouseout\",\n \"pointerdown\",\n \"pointerup\",\n \"pointermove\",\n \"pointerover\",\n \"pointerout\",\n \"touchstart\",\n \"touchend\",\n \"touchmove\",\n \"submit\",\n])\n\nexport function transformJSX(code: string, filename = \"input.tsx\"): TransformResult {\n const scriptKind =\n filename.endsWith(\".tsx\") || filename.endsWith(\".jsx\") ? ts.ScriptKind.TSX : ts.ScriptKind.TSX // default to TSX so JSX is always parsed\n\n const sf = ts.createSourceFile(\n filename,\n code,\n ts.ScriptTarget.ESNext,\n /* setParentNodes */ true,\n scriptKind,\n )\n\n type Replacement = { start: number; end: number; text: string }\n const replacements: Replacement[] = []\n const warnings: CompilerWarning[] = []\n\n function warn(node: ts.Node, message: string, warnCode: CompilerWarning[\"code\"]): void {\n const { line, character } = sf.getLineAndCharacterOfPosition(node.getStart(sf))\n warnings.push({ message, line: line + 1, column: character, code: warnCode })\n }\n\n // ── Static hoisting state ─────────────────────────────────────────────────\n type Hoist = { name: string; text: string }\n const hoists: Hoist[] = []\n let hoistIdx = 0\n let needsTplImport = false\n let needsBindTextImportGlobal = false\n let needsBindDirectImportGlobal = false\n let needsBindImportGlobal = false\n\n /**\n * If `node` is a fully-static JSX element/fragment, register a module-scope\n * hoist for it and return the generated variable name. Otherwise return null.\n */\n function maybeHoist(node: ts.Node): string | null {\n if (\n (ts.isJsxElement(node) || ts.isJsxSelfClosingElement(node) || ts.isJsxFragment(node)) &&\n isStaticJSXNode(node as ts.JsxElement | ts.JsxSelfClosingElement | ts.JsxFragment)\n ) {\n const name = `_$h${hoistIdx++}`\n const text = code.slice(node.getStart(sf), node.getEnd())\n hoists.push({ name, text })\n return name\n }\n return null\n }\n\n function wrap(expr: ts.Expression): void {\n const start = expr.getStart(sf)\n const end = expr.getEnd()\n replacements.push({ start, end, text: `() => ${code.slice(start, end)}` })\n }\n\n /** Try to hoist or wrap an expression, pushing a replacement if needed. */\n function hoistOrWrap(expr: ts.Expression): void {\n const hoistName = maybeHoist(expr)\n if (hoistName) {\n replacements.push({ start: expr.getStart(sf), end: expr.getEnd(), text: hoistName })\n } else if (shouldWrap(expr)) {\n wrap(expr)\n }\n }\n\n // ── walk sub-handlers ───────────────────────────────────────────────────────\n\n /** Try to emit a template for a JsxElement. Returns true if handled. */\n function tryTemplateEmit(node: ts.JsxElement): boolean {\n const elemCount = templateElementCount(node)\n if (elemCount < 1) return false\n const tplCall = buildTemplateCall(node)\n if (!tplCall) return false\n const start = node.getStart(sf)\n const end = node.getEnd()\n const parent = node.parent\n const needsBraces = parent && (ts.isJsxElement(parent) || ts.isJsxFragment(parent))\n replacements.push({ start, end, text: needsBraces ? `{${tplCall}}` : tplCall })\n needsTplImport = true\n return true\n }\n\n /** Emit warnings for common JSX mistakes (e.g. <For> without by). */\n function checkForWarnings(node: ts.JsxElement | ts.JsxSelfClosingElement): void {\n const opening = ts.isJsxElement(node) ? node.openingElement : node\n const tagName = ts.isIdentifier(opening.tagName) ? opening.tagName.text : \"\"\n if (tagName !== \"For\") return\n const hasBy = opening.attributes.properties.some(\n (p) => ts.isJsxAttribute(p) && ts.isIdentifier(p.name) && p.name.text === \"by\",\n )\n if (!hasBy) {\n warn(\n opening.tagName,\n `<For> without a \"by\" prop will use index-based diffing, which is slower and may cause bugs with stateful children. Add by={(item) => item.id} for efficient keyed reconciliation.`,\n \"missing-key-on-for\",\n )\n }\n }\n\n /** Handle a JSX attribute node — wrap or hoist its value if needed. */\n function handleJsxAttribute(node: ts.JsxAttribute): void {\n const name = ts.isIdentifier(node.name) ? node.name.text : \"\"\n const openingEl = node.parent.parent as ts.JsxOpeningElement | ts.JsxSelfClosingElement\n const tagName = ts.isIdentifier(openingEl.tagName) ? openingEl.tagName.text : \"\"\n const isComponentElement =\n tagName.length > 0 && tagName.charAt(0) !== tagName.charAt(0).toLowerCase()\n if (isComponentElement) return\n if (SKIP_PROPS.has(name) || EVENT_RE.test(name)) return\n if (!node.initializer || !ts.isJsxExpression(node.initializer)) return\n const expr = node.initializer.expression\n if (expr) hoistOrWrap(expr)\n }\n\n /** Handle a JSX expression in child position — wrap, hoist, or recurse. */\n function handleJsxExpression(node: ts.JsxExpression): void {\n const expr = node.expression\n if (!expr) return\n const hoistName = maybeHoist(expr)\n if (hoistName) {\n replacements.push({ start: expr.getStart(sf), end: expr.getEnd(), text: hoistName })\n return\n }\n if (shouldWrap(expr)) {\n wrap(expr)\n return\n }\n // Not hoisted, not wrapped (e.g., arrow function in For callback).\n // Recurse into the expression body to find nested JSX elements\n // that should be compiled to _tpl() calls.\n ts.forEachChild(expr, walk)\n }\n\n function walk(node: ts.Node): void {\n if (ts.isJsxElement(node) && tryTemplateEmit(node)) return\n if (ts.isJsxSelfClosingElement(node) || ts.isJsxElement(node)) checkForWarnings(node)\n if (ts.isJsxAttribute(node)) {\n handleJsxAttribute(node)\n return\n }\n if (ts.isJsxExpression(node)) {\n handleJsxExpression(node)\n return\n }\n ts.forEachChild(node, walk)\n }\n\n walk(sf)\n\n if (replacements.length === 0 && hoists.length === 0) return { code, warnings }\n\n // Apply replacements from right to left so earlier positions stay valid\n replacements.sort((a, b) => b.start - a.start)\n\n let result = code\n for (const r of replacements) {\n result = result.slice(0, r.start) + r.text + result.slice(r.end)\n }\n\n // Prepend module-scope hoisted static VNode declarations\n if (hoists.length > 0) {\n const preamble = hoists.map((h) => `const ${h.name} = /*@__PURE__*/ ${h.text}\\n`).join(\"\")\n result = preamble + result\n }\n\n // Prepend template imports if _tpl() was emitted\n if (needsTplImport) {\n const runtimeDomImports = [\"_tpl\"]\n if (needsBindDirectImportGlobal) runtimeDomImports.push(\"_bindDirect\")\n if (needsBindTextImportGlobal) runtimeDomImports.push(\"_bindText\")\n const reactivityImports = needsBindImportGlobal\n ? `\\nimport { _bind } from \"@pyreon/reactivity\";`\n : \"\"\n result =\n `import { ${runtimeDomImports.join(\", \")} } from \"@pyreon/runtime-dom\";${reactivityImports}\\n` +\n result\n }\n\n return { code: result, usesTemplates: needsTplImport, warnings }\n\n // ── Template emission helpers (closures over sf, code) ──────────────────────\n\n /** Check if a single attribute would prevent template emission. */\n function hasBailAttr(node: ts.JsxElement | ts.JsxSelfClosingElement): boolean {\n for (const attr of jsxAttrs(node)) {\n if (ts.isJsxSpreadAttribute(attr)) return true\n if (ts.isJsxAttribute(attr) && ts.isIdentifier(attr.name) && attr.name.text === \"key\")\n return true\n }\n return false\n }\n\n /**\n * Count template-eligible elements for a single JSX child.\n * Returns 0 for skippable children, -1 for bail, positive for element count.\n */\n function countChildForTemplate(child: ts.JsxChild): number {\n if (ts.isJsxText(child)) return 0\n if (ts.isJsxElement(child) || ts.isJsxSelfClosingElement(child))\n return templateElementCount(child)\n if (ts.isJsxExpression(child)) {\n if (!child.expression) return 0\n return containsJSXInExpr(child.expression) ? -1 : 0\n }\n if (ts.isJsxFragment(child)) return templateFragmentCount(child)\n return -1\n }\n\n /**\n * Count DOM elements in a JSX subtree. Returns -1 if the tree is not\n * eligible for template emission.\n */\n function templateElementCount(node: ts.JsxElement | ts.JsxSelfClosingElement): number {\n const tag = jsxTagName(node)\n if (!tag || !isLowerCase(tag)) return -1\n if (hasBailAttr(node)) return -1\n if (!ts.isJsxElement(node)) return 1\n\n let count = 1\n for (const child of node.children) {\n const c = countChildForTemplate(child)\n if (c === -1) return -1\n count += c\n }\n return count\n }\n\n /** Count template-eligible elements inside a fragment. */\n function templateFragmentCount(frag: ts.JsxFragment): number {\n let count = 0\n for (const child of frag.children) {\n const c = countChildForTemplate(child)\n if (c === -1) return -1\n count += c\n }\n return count\n }\n\n /**\n * Build the complete `_tpl(\"html\", (__root) => { ... })` call string\n * for a template-eligible JSX element tree. Returns null if codegen fails.\n */\n function buildTemplateCall(node: ts.JsxElement | ts.JsxSelfClosingElement): string | null {\n const bindLines: string[] = []\n const disposerNames: string[] = []\n let varIdx = 0\n let dispIdx = 0\n // Reactive expressions that will be combined into a single _bind call\n const reactiveBindExprs: string[] = []\n let needsBindTextImport = false\n let needsBindDirectImport = false\n\n function nextVar(): string {\n return `__e${varIdx++}`\n }\n function nextDisp(): string {\n const name = `__d${dispIdx++}`\n disposerNames.push(name)\n return name\n }\n function nextTextVar(): string {\n return `__t${varIdx++}`\n }\n\n /** Resolve the variable name for an element given its accessor path. */\n function resolveElementVar(accessor: string, hasDynamic: boolean): string {\n if (accessor === \"__root\") return \"__root\"\n if (hasDynamic) {\n const v = nextVar()\n bindLines.push(`const ${v} = ${accessor}`)\n return v\n }\n return accessor\n }\n\n /** Emit bind line for a ref attribute. */\n function emitRef(attr: ts.JsxAttribute, varName: string): void {\n if (!attr.initializer || !ts.isJsxExpression(attr.initializer)) return\n if (!attr.initializer.expression) return\n bindLines.push(`${sliceExpr(attr.initializer.expression)}.current = ${varName}`)\n }\n\n /** Emit event handler bind line — delegated (expando) or addEventListener. */\n function emitEventListener(attr: ts.JsxAttribute, attrName: string, varName: string): void {\n const eventName = (attrName[2] ?? \"\").toLowerCase() + attrName.slice(3)\n if (!attr.initializer || !ts.isJsxExpression(attr.initializer)) return\n if (!attr.initializer.expression) return\n const handler = sliceExpr(attr.initializer.expression)\n if (DELEGATED_EVENTS.has(eventName)) {\n // Delegated: store handler as expando property — container listener picks it up\n bindLines.push(`${varName}.__ev_${eventName} = ${handler}`)\n } else {\n bindLines.push(`${varName}.addEventListener(\"${eventName}\", ${handler})`)\n }\n }\n\n /** Return HTML string for a static attribute expression, or null if not static. */\n function staticAttrToHtml(exprNode: ts.Expression, htmlAttrName: string): string | null {\n if (!isStatic(exprNode)) return null\n if (ts.isStringLiteral(exprNode)) return ` ${htmlAttrName}=\"${escapeHtmlAttr(exprNode.text)}\"`\n if (ts.isNumericLiteral(exprNode)) return ` ${htmlAttrName}=\"${exprNode.text}\"`\n if (exprNode.kind === ts.SyntaxKind.TrueKeyword) return ` ${htmlAttrName}`\n return \"\" // false/null/undefined → omit\n }\n\n /**\n * Try to extract a direct signal reference from an expression.\n * Returns the callee text (e.g. \"count\" or \"row.label\") if the expression\n * is a single call with no arguments, otherwise null.\n */\n function tryDirectSignalRef(exprNode: ts.Expression): string | null {\n let inner = exprNode\n // Unwrap concise arrow: () => expr\n if (ts.isArrowFunction(inner) && !ts.isBlock(inner.body)) {\n inner = inner.body as ts.Expression\n }\n if (!ts.isCallExpression(inner)) return null\n if (inner.arguments.length > 0) return null\n const callee = inner.expression\n if (ts.isIdentifier(callee) || ts.isPropertyAccessExpression(callee)) {\n return sliceExpr(callee)\n }\n return null\n }\n\n /** Unwrap a reactive accessor expression for use inside _bind(). */\n function unwrapAccessor(exprNode: ts.Expression): { expr: string; isReactive: boolean } {\n // Concise arrow: () => value() → unwrap to \"value()\"\n if (ts.isArrowFunction(exprNode) && !ts.isBlock(exprNode.body)) {\n return { expr: sliceExpr(exprNode.body as ts.Expression), isReactive: true }\n }\n // Block-body arrow/function: invoke it\n if (ts.isArrowFunction(exprNode) || ts.isFunctionExpression(exprNode)) {\n return { expr: `(${sliceExpr(exprNode)})()`, isReactive: true }\n }\n return { expr: sliceExpr(exprNode), isReactive: containsCall(exprNode) }\n }\n\n /** Build a setter expression for an attribute. */\n function attrSetter(htmlAttrName: string, varName: string, expr: string): string {\n return htmlAttrName === \"class\"\n ? `${varName}.className = ${expr}`\n : `${varName}.setAttribute(\"${htmlAttrName}\", ${expr})`\n }\n\n /** Emit bind line for a dynamic (non-static) attribute. */\n function emitDynamicAttr(\n _expr: string,\n exprNode: ts.Expression,\n htmlAttrName: string,\n varName: string,\n ): void {\n const { expr, isReactive } = unwrapAccessor(exprNode)\n\n if (!isReactive) {\n bindLines.push(attrSetter(htmlAttrName, varName, expr))\n return\n }\n\n // Direct signal binding for bare signal calls (e.g. class={() => active()})\n const directRef = tryDirectSignalRef(exprNode)\n if (directRef) {\n needsBindDirectImport = true\n const d = nextDisp()\n const updater =\n htmlAttrName === \"class\"\n ? `(v) => { ${varName}.className = v == null ? \"\" : String(v) }`\n : `(v) => { ${varName}.setAttribute(\"${htmlAttrName}\", v == null ? \"\" : String(v)) }`\n bindLines.push(`const ${d} = _bindDirect(${directRef}, ${updater})`)\n return\n }\n\n reactiveBindExprs.push(attrSetter(htmlAttrName, varName, expr))\n }\n\n /** Emit bind line or HTML for an expression attribute value. */\n function emitAttrExpression(\n exprNode: ts.Expression,\n htmlAttrName: string,\n varName: string,\n ): string {\n const staticHtml = staticAttrToHtml(exprNode, htmlAttrName)\n if (staticHtml !== null) return staticHtml\n emitDynamicAttr(sliceExpr(exprNode), exprNode, htmlAttrName, varName)\n return \"\"\n }\n\n /** Emit side-effects for special attrs (ref, event). Returns true if handled. */\n function tryEmitSpecialAttr(attr: ts.JsxAttribute, attrName: string, varName: string): boolean {\n if (attrName === \"ref\") {\n emitRef(attr, varName)\n return true\n }\n if (EVENT_RE.test(attrName)) {\n emitEventListener(attr, attrName, varName)\n return true\n }\n return false\n }\n\n /** Convert an attribute initializer to HTML. Returns empty string for side-effect-only attrs. */\n function attrInitializerToHtml(\n attr: ts.JsxAttribute,\n htmlAttrName: string,\n varName: string,\n ): string {\n if (!attr.initializer) return ` ${htmlAttrName}`\n if (ts.isStringLiteral(attr.initializer))\n return ` ${htmlAttrName}=\"${escapeHtmlAttr(attr.initializer.text)}\"`\n if (ts.isJsxExpression(attr.initializer) && attr.initializer.expression)\n return emitAttrExpression(attr.initializer.expression, htmlAttrName, varName)\n return \"\"\n }\n\n /** Process a single attribute, returning HTML to append. */\n function processOneAttr(attr: ts.JsxAttributeLike, varName: string): string {\n if (!ts.isJsxAttribute(attr)) return \"\"\n const attrName = ts.isIdentifier(attr.name) ? attr.name.text : \"\"\n if (attrName === \"key\") return \"\"\n if (tryEmitSpecialAttr(attr, attrName, varName)) return \"\"\n return attrInitializerToHtml(attr, JSX_TO_HTML_ATTR[attrName] ?? attrName, varName)\n }\n\n /** Process all attributes on an element, returning the HTML attribute string. */\n function processAttrs(el: ts.JsxElement | ts.JsxSelfClosingElement, varName: string): string {\n let htmlAttrs = \"\"\n for (const attr of jsxAttrs(el)) htmlAttrs += processOneAttr(attr, varName)\n return htmlAttrs\n }\n\n /** Emit bind lines for a reactive text expression child. */\n function emitReactiveTextChild(\n expr: string,\n exprNode: ts.Expression,\n varName: string,\n parentRef: string,\n childNodeIdx: number,\n needsPlaceholder: boolean,\n ): string {\n const tVar = nextTextVar()\n bindLines.push(`const ${tVar} = document.createTextNode(\"\")`)\n if (needsPlaceholder) {\n bindLines.push(\n `${parentRef}.replaceChild(${tVar}, ${parentRef}.childNodes[${childNodeIdx}])`,\n )\n } else {\n bindLines.push(`${varName}.appendChild(${tVar})`)\n }\n // Direct signal binding: bypass effect system entirely\n const directRef = tryDirectSignalRef(exprNode)\n if (directRef) {\n needsBindTextImport = true\n const d = nextDisp()\n bindLines.push(`const ${d} = _bindText(${directRef}, ${tVar})`)\n } else {\n // Collected into the combined _bind at the end\n reactiveBindExprs.push(`${tVar}.data = ${expr}`)\n }\n return needsPlaceholder ? \"<!>\" : \"\"\n }\n\n /** Emit bind lines for a static text expression child. */\n function emitStaticTextChild(\n expr: string,\n varName: string,\n parentRef: string,\n childNodeIdx: number,\n needsPlaceholder: boolean,\n ): string {\n if (needsPlaceholder) {\n const tVar = nextTextVar()\n bindLines.push(`const ${tVar} = document.createTextNode(${expr})`)\n bindLines.push(\n `${parentRef}.replaceChild(${tVar}, ${parentRef}.childNodes[${childNodeIdx}])`,\n )\n return \"<!>\"\n }\n bindLines.push(`${varName}.textContent = ${expr}`)\n return \"\"\n }\n\n /** Process a single flat child, returning the HTML contribution or null on failure. */\n function processOneChild(\n child: FlatChild,\n varName: string,\n parentRef: string,\n useMixed: boolean,\n useMultiExpr: boolean,\n childNodeIdx: number,\n ): string | null {\n if (child.kind === \"text\") return escapeHtmlText(child.text)\n if (child.kind === \"element\") {\n const childAccessor = useMixed\n ? `${parentRef}.childNodes[${childNodeIdx}]`\n : `${parentRef}.children[${child.elemIdx}]`\n return processElement(child.node, childAccessor)\n }\n // expression\n const needsPlaceholder = useMixed || useMultiExpr\n const { expr, isReactive } = unwrapAccessor(child.expression)\n if (isReactive) {\n return emitReactiveTextChild(\n expr,\n child.expression,\n varName,\n parentRef,\n childNodeIdx,\n needsPlaceholder,\n )\n }\n return emitStaticTextChild(expr, varName, parentRef, childNodeIdx, needsPlaceholder)\n }\n\n /** Process children of a JsxElement, returning the children HTML. */\n function processChildren(el: ts.JsxElement, varName: string, accessor: string): string | null {\n const flatChildren = flattenChildren(el.children)\n const { useMixed, useMultiExpr } = analyzeChildren(flatChildren)\n const parentRef = accessor === \"__root\" ? \"__root\" : varName\n\n let html = \"\"\n let childNodeIdx = 0\n\n for (const child of flatChildren) {\n const childHtml = processOneChild(\n child,\n varName,\n parentRef,\n useMixed,\n useMultiExpr,\n childNodeIdx,\n )\n if (childHtml === null) return null\n html += childHtml\n childNodeIdx++\n }\n\n return html\n }\n\n /** Process a single DOM element for template emission. Returns the HTML string or null. */\n function processElement(\n el: ts.JsxElement | ts.JsxSelfClosingElement,\n accessor: string,\n ): string | null {\n const tag = jsxTagName(el)\n if (!tag) return null\n\n const varName = resolveElementVar(accessor, elementHasDynamic(el))\n const htmlAttrs = processAttrs(el, varName)\n let html = `<${tag}${htmlAttrs}>`\n\n if (ts.isJsxElement(el)) {\n const childHtml = processChildren(el, varName, accessor)\n if (childHtml === null) return null\n html += childHtml\n }\n\n if (!VOID_ELEMENTS.has(tag)) html += `</${tag}>`\n return html\n }\n\n const html = processElement(node, \"__root\")\n if (html === null) return null\n\n if (needsBindTextImport) needsBindTextImportGlobal = true\n if (needsBindDirectImport) needsBindDirectImportGlobal = true\n\n // Build bind function body\n const escaped = html.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')\n\n // Emit combined _bind for reactive attribute/text expressions that\n // weren't handled by _bindText. This merges N separate _bind calls into\n // one — saving N-1 closures + deps arrays per template instance.\n // Emit a single combined _bind for all reactive attribute/text expressions\n // that weren't handled by _bindText. Merges N separate _bind calls into one —\n // saving N-1 closures + deps arrays per template instance.\n if (reactiveBindExprs.length > 0) {\n needsBindImportGlobal = true\n const combinedName = nextDisp()\n const combinedBody = reactiveBindExprs.join(\"; \")\n bindLines.push(`const ${combinedName} = _bind(() => { ${combinedBody} })`)\n }\n\n if (bindLines.length === 0 && disposerNames.length === 0) {\n return `_tpl(\"${escaped}\", () => null)`\n }\n\n let body = bindLines.map((l) => ` ${l}`).join(\"\\n\")\n if (disposerNames.length > 0) {\n body += `\\n return () => { ${disposerNames.map((d) => `${d}()`).join(\"; \")} }`\n } else {\n body += \"\\n return null\"\n }\n\n return `_tpl(\"${escaped}\", (__root) => {\\n${body}\\n})`\n }\n\n /** Flat child descriptor for template children processing */\n type FlatChild =\n | { kind: \"text\"; text: string }\n | { kind: \"element\"; node: ts.JsxElement | ts.JsxSelfClosingElement; elemIdx: number }\n | { kind: \"expression\"; expression: ts.Expression }\n\n /** Classify a single JSX child into a FlatChild descriptor. */\n function classifyJsxChild(\n child: ts.JsxChild,\n out: FlatChild[],\n elemIdxRef: { value: number },\n recurse: (kids: ts.NodeArray<ts.JsxChild>) => void,\n ): void {\n if (ts.isJsxText(child)) {\n const trimmed = child.text.replace(/\\n\\s*/g, \"\").trim()\n if (trimmed) out.push({ kind: \"text\", text: trimmed })\n return\n }\n if (ts.isJsxElement(child) || ts.isJsxSelfClosingElement(child)) {\n out.push({ kind: \"element\", node: child, elemIdx: elemIdxRef.value++ })\n return\n }\n if (ts.isJsxExpression(child)) {\n if (child.expression) out.push({ kind: \"expression\", expression: child.expression })\n return\n }\n if (ts.isJsxFragment(child)) recurse(child.children)\n }\n\n /**\n * Flatten JSX children, inlining fragment children and stripping whitespace-only text.\n * Returns a flat array of child descriptors with element indices pre-computed.\n */\n function flattenChildren(children: ts.NodeArray<ts.JsxChild>): FlatChild[] {\n const flatList: FlatChild[] = []\n const elemIdxRef = { value: 0 }\n\n function addChildren(kids: ts.NodeArray<ts.JsxChild>): void {\n for (const child of kids) classifyJsxChild(child, flatList, elemIdxRef, addChildren)\n }\n\n addChildren(children)\n return flatList\n }\n\n /** Analyze flat children to determine indexing strategy. */\n function analyzeChildren(flatChildren: FlatChild[]): {\n useMixed: boolean\n useMultiExpr: boolean\n } {\n const hasElem = flatChildren.some((c) => c.kind === \"element\")\n const hasNonElem = flatChildren.some((c) => c.kind !== \"element\")\n const exprCount = flatChildren.filter((c) => c.kind === \"expression\").length\n return { useMixed: hasElem && hasNonElem, useMultiExpr: exprCount > 1 }\n }\n\n /** Check if a single attribute is dynamic (has ref, event, or non-static expression). */\n function attrIsDynamic(attr: ts.JsxAttributeLike): boolean {\n if (!ts.isJsxAttribute(attr)) return false\n const name = ts.isIdentifier(attr.name) ? attr.name.text : \"\"\n if (name === \"ref\") return true\n if (EVENT_RE.test(name)) return true\n if (!attr.initializer || !ts.isJsxExpression(attr.initializer)) return false\n const expr = attr.initializer.expression\n return expr ? !isStatic(expr) : false\n }\n\n /** Check if an element has any dynamic attributes, events, ref, or expression children */\n function elementHasDynamic(node: ts.JsxElement | ts.JsxSelfClosingElement): boolean {\n if (jsxAttrs(node).some(attrIsDynamic)) return true\n if (ts.isJsxElement(node)) {\n return node.children.some((c) => ts.isJsxExpression(c) && c.expression !== undefined)\n }\n return false\n }\n\n /** Slice expression source from the original code */\n function sliceExpr(expr: ts.Expression): string {\n return code.slice(expr.getStart(sf), expr.getEnd())\n }\n\n /** Get tag name string */\n function jsxTagName(node: ts.JsxElement | ts.JsxSelfClosingElement): string {\n const tag = ts.isJsxElement(node) ? node.openingElement.tagName : node.tagName\n return ts.isIdentifier(tag) ? tag.text : \"\"\n }\n\n /** Get attribute list */\n function jsxAttrs(\n node: ts.JsxElement | ts.JsxSelfClosingElement,\n ): ts.NodeArray<ts.JsxAttributeLike> {\n return ts.isJsxElement(node)\n ? node.openingElement.attributes.properties\n : node.attributes.properties\n }\n}\n\n// ─── Template constants ──────────────────────────────────────────────────────\n\nconst VOID_ELEMENTS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n])\n\nconst JSX_TO_HTML_ATTR: Record<string, string> = {\n className: \"class\",\n htmlFor: \"for\",\n}\n\nfunction isLowerCase(s: string): boolean {\n return s.length > 0 && s[0] === s[0]?.toLowerCase()\n}\n\n/** Check if an expression subtree contains JSX nodes */\nfunction containsJSXInExpr(node: ts.Node): boolean {\n if (ts.isJsxElement(node) || ts.isJsxSelfClosingElement(node) || ts.isJsxFragment(node))\n return true\n return ts.forEachChild(node, containsJSXInExpr) ?? false\n}\n\nfunction escapeHtmlAttr(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\")\n}\n\nfunction escapeHtmlText(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\")\n}\n\n// ─── Static JSX analysis ──────────────────────────────────────────────────────\n\ntype StaticJSXNode = ts.JsxElement | ts.JsxSelfClosingElement | ts.JsxFragment\n\nfunction isStaticJSXNode(node: StaticJSXNode): boolean {\n if (ts.isJsxSelfClosingElement(node)) {\n return isStaticAttrs(node.attributes)\n }\n if (ts.isJsxFragment(node)) {\n return node.children.every(isStaticChild)\n }\n // JsxElement\n return isStaticAttrs(node.openingElement.attributes) && node.children.every(isStaticChild)\n}\n\nfunction isStaticAttrs(attrs: ts.JsxAttributes): boolean {\n return attrs.properties.every((prop) => {\n // Spread attribute — always dynamic\n if (!ts.isJsxAttribute(prop)) return false\n // Boolean shorthand: <input disabled />\n if (!prop.initializer) return true\n // String literal: class=\"foo\"\n if (ts.isStringLiteral(prop.initializer)) return true\n // Must be JsxExpression — the only remaining JsxAttributeValue type\n const expr = (prop.initializer as ts.JsxExpression).expression\n return expr ? isStatic(expr) : true\n })\n}\n\nfunction isStaticChild(child: ts.JsxChild): boolean {\n // Plain text content\n if (ts.isJsxText(child)) return true\n // Nested JSX elements\n if (ts.isJsxSelfClosingElement(child)) return isStaticJSXNode(child)\n if (ts.isJsxElement(child)) return isStaticJSXNode(child)\n if (ts.isJsxFragment(child)) return isStaticJSXNode(child)\n // Must be JsxExpression — the only remaining JsxChild type\n const expr = (child as ts.JsxExpression).expression\n return expr ? isStatic(expr) : true\n}\n\n// ─── General helpers ──────────────────────────────────────────────────────────\n\nfunction isStatic(node: ts.Expression): boolean {\n return (\n ts.isStringLiteral(node) ||\n ts.isNumericLiteral(node) ||\n ts.isNoSubstitutionTemplateLiteral(node) ||\n node.kind === ts.SyntaxKind.TrueKeyword ||\n node.kind === ts.SyntaxKind.FalseKeyword ||\n node.kind === ts.SyntaxKind.NullKeyword ||\n node.kind === ts.SyntaxKind.UndefinedKeyword\n )\n}\n\nfunction shouldWrap(node: ts.Expression): boolean {\n // Already a function — user explicitly wrapped or it's a callback\n if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) return false\n // Static literal — no signals involved\n if (isStatic(node)) return false\n // Only wrap if the expression tree contains a call — signal reads are always\n // function calls (e.g. `count()`, `name()`). Plain identifiers, object literals\n // like `style={{ color: \"red\" }}`, array literals, and member accesses are\n // left as-is to avoid unnecessary reactive wrappers.\n return containsCall(node)\n}\n\nfunction containsCall(node: ts.Node): boolean {\n if (ts.isCallExpression(node)) return true\n if (ts.isTaggedTemplateExpression(node)) return true\n // Don't recurse into nested functions — they're self-contained\n if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) return false\n return ts.forEachChild(node, containsCall) ?? false\n}\n"],"mappings":"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"}
@@ -56,6 +56,9 @@ function transformJSX(code, filename = "input.tsx") {
56
56
  const hoists = [];
57
57
  let hoistIdx = 0;
58
58
  let needsTplImport = false;
59
+ let needsBindTextImportGlobal = false;
60
+ let needsBindDirectImportGlobal = false;
61
+ let needsBindImportGlobal = false;
59
62
  /**
60
63
  * If `node` is a fully-static JSX element/fragment, register a module-scope
61
64
  * hoist for it and return the generated variable name. Otherwise return null.
@@ -124,10 +127,24 @@ function transformJSX(code, filename = "input.tsx") {
124
127
  const expr = node.initializer.expression;
125
128
  if (expr) hoistOrWrap(expr);
126
129
  }
127
- /** Handle a JSX expression in child position — wrap or hoist. */
130
+ /** Handle a JSX expression in child position — wrap, hoist, or recurse. */
128
131
  function handleJsxExpression(node) {
129
132
  const expr = node.expression;
130
- if (expr) hoistOrWrap(expr);
133
+ if (!expr) return;
134
+ const hoistName = maybeHoist(expr);
135
+ if (hoistName) {
136
+ replacements.push({
137
+ start: expr.getStart(sf),
138
+ end: expr.getEnd(),
139
+ text: hoistName
140
+ });
141
+ return;
142
+ }
143
+ if (shouldWrap(expr)) {
144
+ wrap(expr);
145
+ return;
146
+ }
147
+ ts.forEachChild(expr, walk);
131
148
  }
132
149
  function walk(node) {
133
150
  if (ts.isJsxElement(node) && tryTemplateEmit(node)) return;
@@ -151,7 +168,13 @@ function transformJSX(code, filename = "input.tsx") {
151
168
  let result = code;
152
169
  for (const r of replacements) result = result.slice(0, r.start) + r.text + result.slice(r.end);
153
170
  if (hoists.length > 0) result = hoists.map(h => `const ${h.name} = /*@__PURE__*/ ${h.text}\n`).join("") + result;
154
- if (needsTplImport) result = `import { _tpl } from "@pyreon/runtime-dom";\nimport { _bind } from "@pyreon/reactivity";\n` + result;
171
+ if (needsTplImport) {
172
+ const runtimeDomImports = ["_tpl"];
173
+ if (needsBindDirectImportGlobal) runtimeDomImports.push("_bindDirect");
174
+ if (needsBindTextImportGlobal) runtimeDomImports.push("_bindText");
175
+ const reactivityImports = needsBindImportGlobal ? `\nimport { _bind } from "@pyreon/reactivity";` : "";
176
+ result = `import { ${runtimeDomImports.join(", ")} } from "@pyreon/runtime-dom";${reactivityImports}\n` + result;
177
+ }
155
178
  return {
156
179
  code: result,
157
180
  usesTemplates: needsTplImport,
@@ -215,6 +238,9 @@ function transformJSX(code, filename = "input.tsx") {
215
238
  const disposerNames = [];
216
239
  let varIdx = 0;
217
240
  let dispIdx = 0;
241
+ const reactiveBindExprs = [];
242
+ let needsBindTextImport = false;
243
+ let needsBindDirectImport = false;
218
244
  function nextVar() {
219
245
  return `__e${varIdx++}`;
220
246
  }
@@ -242,12 +268,13 @@ function transformJSX(code, filename = "input.tsx") {
242
268
  if (!attr.initializer.expression) return;
243
269
  bindLines.push(`${sliceExpr(attr.initializer.expression)}.current = ${varName}`);
244
270
  }
245
- /** Emit addEventListener bind line for an event handler attribute. */
271
+ /** Emit event handler bind line delegated (expando) or addEventListener. */
246
272
  function emitEventListener(attr, attrName, varName) {
247
273
  const eventName = (attrName[2] ?? "").toLowerCase() + attrName.slice(3);
248
274
  if (!attr.initializer || !ts.isJsxExpression(attr.initializer)) return;
249
275
  if (!attr.initializer.expression) return;
250
- bindLines.push(`${varName}.addEventListener("${eventName}", ${sliceExpr(attr.initializer.expression)})`);
276
+ const handler = sliceExpr(attr.initializer.expression);
277
+ if (DELEGATED_EVENTS.has(eventName)) bindLines.push(`${varName}.__ev_${eventName} = ${handler}`);else bindLines.push(`${varName}.addEventListener("${eventName}", ${handler})`);
251
278
  }
252
279
  /** Return HTML string for a static attribute expression, or null if not static. */
253
280
  function staticAttrToHtml(exprNode, htmlAttrName) {
@@ -257,6 +284,20 @@ function transformJSX(code, filename = "input.tsx") {
257
284
  if (exprNode.kind === ts.SyntaxKind.TrueKeyword) return ` ${htmlAttrName}`;
258
285
  return "";
259
286
  }
287
+ /**
288
+ * Try to extract a direct signal reference from an expression.
289
+ * Returns the callee text (e.g. "count" or "row.label") if the expression
290
+ * is a single call with no arguments, otherwise null.
291
+ */
292
+ function tryDirectSignalRef(exprNode) {
293
+ let inner = exprNode;
294
+ if (ts.isArrowFunction(inner) && !ts.isBlock(inner.body)) inner = inner.body;
295
+ if (!ts.isCallExpression(inner)) return null;
296
+ if (inner.arguments.length > 0) return null;
297
+ const callee = inner.expression;
298
+ if (ts.isIdentifier(callee) || ts.isPropertyAccessExpression(callee)) return sliceExpr(callee);
299
+ return null;
300
+ }
260
301
  /** Unwrap a reactive accessor expression for use inside _bind(). */
261
302
  function unwrapAccessor(exprNode) {
262
303
  if (ts.isArrowFunction(exprNode) && !ts.isBlock(exprNode.body)) return {
@@ -272,17 +313,29 @@ function transformJSX(code, filename = "input.tsx") {
272
313
  isReactive: containsCall(exprNode)
273
314
  };
274
315
  }
316
+ /** Build a setter expression for an attribute. */
317
+ function attrSetter(htmlAttrName, varName, expr) {
318
+ return htmlAttrName === "class" ? `${varName}.className = ${expr}` : `${varName}.setAttribute("${htmlAttrName}", ${expr})`;
319
+ }
275
320
  /** Emit bind line for a dynamic (non-static) attribute. */
276
321
  function emitDynamicAttr(_expr, exprNode, htmlAttrName, varName) {
277
322
  const {
278
323
  expr,
279
324
  isReactive
280
325
  } = unwrapAccessor(exprNode);
281
- const setter = htmlAttrName === "class" ? `${varName}.className = ${expr}` : `${varName}.setAttribute("${htmlAttrName}", ${expr})`;
282
- if (isReactive) {
326
+ if (!isReactive) {
327
+ bindLines.push(attrSetter(htmlAttrName, varName, expr));
328
+ return;
329
+ }
330
+ const directRef = tryDirectSignalRef(exprNode);
331
+ if (directRef) {
332
+ needsBindDirectImport = true;
283
333
  const d = nextDisp();
284
- bindLines.push(`const ${d} = _bind(() => { ${setter} })`);
285
- } else bindLines.push(setter);
334
+ const updater = htmlAttrName === "class" ? `(v) => { ${varName}.className = v == null ? "" : String(v) }` : `(v) => { ${varName}.setAttribute("${htmlAttrName}", v == null ? "" : String(v)) }`;
335
+ bindLines.push(`const ${d} = _bindDirect(${directRef}, ${updater})`);
336
+ return;
337
+ }
338
+ reactiveBindExprs.push(attrSetter(htmlAttrName, varName, expr));
286
339
  }
287
340
  /** Emit bind line or HTML for an expression attribute value. */
288
341
  function emitAttrExpression(exprNode, htmlAttrName, varName) {
@@ -325,12 +378,16 @@ function transformJSX(code, filename = "input.tsx") {
325
378
  return htmlAttrs;
326
379
  }
327
380
  /** Emit bind lines for a reactive text expression child. */
328
- function emitReactiveTextChild(expr, varName, parentRef, childNodeIdx, needsPlaceholder) {
381
+ function emitReactiveTextChild(expr, exprNode, varName, parentRef, childNodeIdx, needsPlaceholder) {
329
382
  const tVar = nextTextVar();
330
- const d = nextDisp();
331
383
  bindLines.push(`const ${tVar} = document.createTextNode("")`);
332
384
  if (needsPlaceholder) bindLines.push(`${parentRef}.replaceChild(${tVar}, ${parentRef}.childNodes[${childNodeIdx}])`);else bindLines.push(`${varName}.appendChild(${tVar})`);
333
- bindLines.push(`const ${d} = _bind(() => { ${tVar}.data = ${expr} })`);
385
+ const directRef = tryDirectSignalRef(exprNode);
386
+ if (directRef) {
387
+ needsBindTextImport = true;
388
+ const d = nextDisp();
389
+ bindLines.push(`const ${d} = _bindText(${directRef}, ${tVar})`);
390
+ } else reactiveBindExprs.push(`${tVar}.data = ${expr}`);
334
391
  return needsPlaceholder ? "<!>" : "";
335
392
  }
336
393
  /** Emit bind lines for a static text expression child. */
@@ -356,7 +413,7 @@ function transformJSX(code, filename = "input.tsx") {
356
413
  expr,
357
414
  isReactive
358
415
  } = unwrapAccessor(child.expression);
359
- if (isReactive) return emitReactiveTextChild(expr, varName, parentRef, childNodeIdx, needsPlaceholder);
416
+ if (isReactive) return emitReactiveTextChild(expr, child.expression, varName, parentRef, childNodeIdx, needsPlaceholder);
360
417
  return emitStaticTextChild(expr, varName, parentRef, childNodeIdx, needsPlaceholder);
361
418
  }
362
419
  /** Process children of a JsxElement, returning the children HTML. */
@@ -393,7 +450,15 @@ function transformJSX(code, filename = "input.tsx") {
393
450
  }
394
451
  const html = processElement(node, "__root");
395
452
  if (html === null) return null;
453
+ if (needsBindTextImport) needsBindTextImportGlobal = true;
454
+ if (needsBindDirectImport) needsBindDirectImportGlobal = true;
396
455
  const escaped = html.replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
456
+ if (reactiveBindExprs.length > 0) {
457
+ needsBindImportGlobal = true;
458
+ const combinedName = nextDisp();
459
+ const combinedBody = reactiveBindExprs.join("; ");
460
+ bindLines.push(`const ${combinedName} = _bind(() => { ${combinedBody} })`);
461
+ }
397
462
  if (bindLines.length === 0 && disposerNames.length === 0) return `_tpl("${escaped}", () => null)`;
398
463
  let body = bindLines.map(l => ` ${l}`).join("\n");
399
464
  if (disposerNames.length > 0) body += `\n return () => { ${disposerNames.map(d => `${d}()`).join("; ")} }`;else body += "\n return null";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/jsx.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/jsx.ts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index2.d.ts","names":[],"sources":["../../src/jsx.ts"],"mappings":";;AAqCA;;;;;;;;;;AAWA;;;;;;;;;;AAcA;;;;;;;;;;;;;UAzBiB,eAAA;;EAEf,OAAA;;EAEA,IAAA;;EAEA,MAAA;;EAEA,IAAA;AAAA;AAAA,UAGe,eAAA;;EAEf,IAAA;;EAEA,aAAA;;EAEA,QAAA,EAAU,eAAA;AAAA;AAAA,iBAQI,YAAA,CAAa,IAAA,UAAc,QAAA,YAAyB,eAAA"}
1
+ {"version":3,"file":"index2.d.ts","names":[],"sources":["../../src/jsx.ts"],"mappings":";;AAqCA;;;;;;;;;;AAWA;;;;;;;;;;AAwCA;;;;;;;;;;;;;UAnDiB,eAAA;;EAEf,OAAA;;EAEA,IAAA;;EAEA,MAAA;;EAEA,IAAA;AAAA;AAAA,UAGe,eAAA;;EAEf,IAAA;;EAEA,aAAA;;EAEA,QAAA,EAAU,eAAA;AAAA;AAAA,iBAkCI,YAAA,CAAa,IAAA,UAAc,QAAA,YAAyB,eAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pyreon/compiler",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Template and JSX compiler for Pyreon",
5
5
  "license": "MIT",
6
6
  "repository": {
package/src/jsx.ts CHANGED
@@ -59,6 +59,32 @@ export interface TransformResult {
59
59
  const SKIP_PROPS = new Set(["key", "ref"])
60
60
  // Event handler pattern: onClick, onInput, onMouseEnter, …
61
61
  const EVENT_RE = /^on[A-Z]/
62
+ // Events delegated to the container — must match runtime DELEGATED_EVENTS set
63
+ const DELEGATED_EVENTS = new Set([
64
+ "click",
65
+ "dblclick",
66
+ "contextmenu",
67
+ "focusin",
68
+ "focusout",
69
+ "input",
70
+ "change",
71
+ "keydown",
72
+ "keyup",
73
+ "mousedown",
74
+ "mouseup",
75
+ "mousemove",
76
+ "mouseover",
77
+ "mouseout",
78
+ "pointerdown",
79
+ "pointerup",
80
+ "pointermove",
81
+ "pointerover",
82
+ "pointerout",
83
+ "touchstart",
84
+ "touchend",
85
+ "touchmove",
86
+ "submit",
87
+ ])
62
88
 
63
89
  export function transformJSX(code: string, filename = "input.tsx"): TransformResult {
64
90
  const scriptKind =
@@ -86,6 +112,9 @@ export function transformJSX(code: string, filename = "input.tsx"): TransformRes
86
112
  const hoists: Hoist[] = []
87
113
  let hoistIdx = 0
88
114
  let needsTplImport = false
115
+ let needsBindTextImportGlobal = false
116
+ let needsBindDirectImportGlobal = false
117
+ let needsBindImportGlobal = false
89
118
 
90
119
  /**
91
120
  * If `node` is a fully-static JSX element/fragment, register a module-scope
@@ -168,10 +197,23 @@ export function transformJSX(code: string, filename = "input.tsx"): TransformRes
168
197
  if (expr) hoistOrWrap(expr)
169
198
  }
170
199
 
171
- /** Handle a JSX expression in child position — wrap or hoist. */
200
+ /** Handle a JSX expression in child position — wrap, hoist, or recurse. */
172
201
  function handleJsxExpression(node: ts.JsxExpression): void {
173
202
  const expr = node.expression
174
- if (expr) hoistOrWrap(expr)
203
+ if (!expr) return
204
+ const hoistName = maybeHoist(expr)
205
+ if (hoistName) {
206
+ replacements.push({ start: expr.getStart(sf), end: expr.getEnd(), text: hoistName })
207
+ return
208
+ }
209
+ if (shouldWrap(expr)) {
210
+ wrap(expr)
211
+ return
212
+ }
213
+ // Not hoisted, not wrapped (e.g., arrow function in For callback).
214
+ // Recurse into the expression body to find nested JSX elements
215
+ // that should be compiled to _tpl() calls.
216
+ ts.forEachChild(expr, walk)
175
217
  }
176
218
 
177
219
  function walk(node: ts.Node): void {
@@ -208,8 +250,14 @@ export function transformJSX(code: string, filename = "input.tsx"): TransformRes
208
250
 
209
251
  // Prepend template imports if _tpl() was emitted
210
252
  if (needsTplImport) {
253
+ const runtimeDomImports = ["_tpl"]
254
+ if (needsBindDirectImportGlobal) runtimeDomImports.push("_bindDirect")
255
+ if (needsBindTextImportGlobal) runtimeDomImports.push("_bindText")
256
+ const reactivityImports = needsBindImportGlobal
257
+ ? `\nimport { _bind } from "@pyreon/reactivity";`
258
+ : ""
211
259
  result =
212
- `import { _tpl } from "@pyreon/runtime-dom";\nimport { _bind } from "@pyreon/reactivity";\n` +
260
+ `import { ${runtimeDomImports.join(", ")} } from "@pyreon/runtime-dom";${reactivityImports}\n` +
213
261
  result
214
262
  }
215
263
 
@@ -282,6 +330,10 @@ export function transformJSX(code: string, filename = "input.tsx"): TransformRes
282
330
  const disposerNames: string[] = []
283
331
  let varIdx = 0
284
332
  let dispIdx = 0
333
+ // Reactive expressions that will be combined into a single _bind call
334
+ const reactiveBindExprs: string[] = []
335
+ let needsBindTextImport = false
336
+ let needsBindDirectImport = false
285
337
 
286
338
  function nextVar(): string {
287
339
  return `__e${varIdx++}`
@@ -313,14 +365,18 @@ export function transformJSX(code: string, filename = "input.tsx"): TransformRes
313
365
  bindLines.push(`${sliceExpr(attr.initializer.expression)}.current = ${varName}`)
314
366
  }
315
367
 
316
- /** Emit addEventListener bind line for an event handler attribute. */
368
+ /** Emit event handler bind line delegated (expando) or addEventListener. */
317
369
  function emitEventListener(attr: ts.JsxAttribute, attrName: string, varName: string): void {
318
370
  const eventName = (attrName[2] ?? "").toLowerCase() + attrName.slice(3)
319
371
  if (!attr.initializer || !ts.isJsxExpression(attr.initializer)) return
320
372
  if (!attr.initializer.expression) return
321
- bindLines.push(
322
- `${varName}.addEventListener("${eventName}", ${sliceExpr(attr.initializer.expression)})`,
323
- )
373
+ const handler = sliceExpr(attr.initializer.expression)
374
+ if (DELEGATED_EVENTS.has(eventName)) {
375
+ // Delegated: store handler as expando property — container listener picks it up
376
+ bindLines.push(`${varName}.__ev_${eventName} = ${handler}`)
377
+ } else {
378
+ bindLines.push(`${varName}.addEventListener("${eventName}", ${handler})`)
379
+ }
324
380
  }
325
381
 
326
382
  /** Return HTML string for a static attribute expression, or null if not static. */
@@ -332,6 +388,26 @@ export function transformJSX(code: string, filename = "input.tsx"): TransformRes
332
388
  return "" // false/null/undefined → omit
333
389
  }
334
390
 
391
+ /**
392
+ * Try to extract a direct signal reference from an expression.
393
+ * Returns the callee text (e.g. "count" or "row.label") if the expression
394
+ * is a single call with no arguments, otherwise null.
395
+ */
396
+ function tryDirectSignalRef(exprNode: ts.Expression): string | null {
397
+ let inner = exprNode
398
+ // Unwrap concise arrow: () => expr
399
+ if (ts.isArrowFunction(inner) && !ts.isBlock(inner.body)) {
400
+ inner = inner.body as ts.Expression
401
+ }
402
+ if (!ts.isCallExpression(inner)) return null
403
+ if (inner.arguments.length > 0) return null
404
+ const callee = inner.expression
405
+ if (ts.isIdentifier(callee) || ts.isPropertyAccessExpression(callee)) {
406
+ return sliceExpr(callee)
407
+ }
408
+ return null
409
+ }
410
+
335
411
  /** Unwrap a reactive accessor expression for use inside _bind(). */
336
412
  function unwrapAccessor(exprNode: ts.Expression): { expr: string; isReactive: boolean } {
337
413
  // Concise arrow: () => value() → unwrap to "value()"
@@ -345,6 +421,13 @@ export function transformJSX(code: string, filename = "input.tsx"): TransformRes
345
421
  return { expr: sliceExpr(exprNode), isReactive: containsCall(exprNode) }
346
422
  }
347
423
 
424
+ /** Build a setter expression for an attribute. */
425
+ function attrSetter(htmlAttrName: string, varName: string, expr: string): string {
426
+ return htmlAttrName === "class"
427
+ ? `${varName}.className = ${expr}`
428
+ : `${varName}.setAttribute("${htmlAttrName}", ${expr})`
429
+ }
430
+
348
431
  /** Emit bind line for a dynamic (non-static) attribute. */
349
432
  function emitDynamicAttr(
350
433
  _expr: string,
@@ -353,17 +436,26 @@ export function transformJSX(code: string, filename = "input.tsx"): TransformRes
353
436
  varName: string,
354
437
  ): void {
355
438
  const { expr, isReactive } = unwrapAccessor(exprNode)
356
- const setter =
357
- htmlAttrName === "class"
358
- ? `${varName}.className = ${expr}`
359
- : `${varName}.setAttribute("${htmlAttrName}", ${expr})`
360
439
 
361
- if (isReactive) {
440
+ if (!isReactive) {
441
+ bindLines.push(attrSetter(htmlAttrName, varName, expr))
442
+ return
443
+ }
444
+
445
+ // Direct signal binding for bare signal calls (e.g. class={() => active()})
446
+ const directRef = tryDirectSignalRef(exprNode)
447
+ if (directRef) {
448
+ needsBindDirectImport = true
362
449
  const d = nextDisp()
363
- bindLines.push(`const ${d} = _bind(() => { ${setter} })`)
364
- } else {
365
- bindLines.push(setter)
450
+ const updater =
451
+ htmlAttrName === "class"
452
+ ? `(v) => { ${varName}.className = v == null ? "" : String(v) }`
453
+ : `(v) => { ${varName}.setAttribute("${htmlAttrName}", v == null ? "" : String(v)) }`
454
+ bindLines.push(`const ${d} = _bindDirect(${directRef}, ${updater})`)
455
+ return
366
456
  }
457
+
458
+ reactiveBindExprs.push(attrSetter(htmlAttrName, varName, expr))
367
459
  }
368
460
 
369
461
  /** Emit bind line or HTML for an expression attribute value. */
@@ -424,13 +516,13 @@ export function transformJSX(code: string, filename = "input.tsx"): TransformRes
424
516
  /** Emit bind lines for a reactive text expression child. */
425
517
  function emitReactiveTextChild(
426
518
  expr: string,
519
+ exprNode: ts.Expression,
427
520
  varName: string,
428
521
  parentRef: string,
429
522
  childNodeIdx: number,
430
523
  needsPlaceholder: boolean,
431
524
  ): string {
432
525
  const tVar = nextTextVar()
433
- const d = nextDisp()
434
526
  bindLines.push(`const ${tVar} = document.createTextNode("")`)
435
527
  if (needsPlaceholder) {
436
528
  bindLines.push(
@@ -439,7 +531,16 @@ export function transformJSX(code: string, filename = "input.tsx"): TransformRes
439
531
  } else {
440
532
  bindLines.push(`${varName}.appendChild(${tVar})`)
441
533
  }
442
- bindLines.push(`const ${d} = _bind(() => { ${tVar}.data = ${expr} })`)
534
+ // Direct signal binding: bypass effect system entirely
535
+ const directRef = tryDirectSignalRef(exprNode)
536
+ if (directRef) {
537
+ needsBindTextImport = true
538
+ const d = nextDisp()
539
+ bindLines.push(`const ${d} = _bindText(${directRef}, ${tVar})`)
540
+ } else {
541
+ // Collected into the combined _bind at the end
542
+ reactiveBindExprs.push(`${tVar}.data = ${expr}`)
543
+ }
443
544
  return needsPlaceholder ? "<!>" : ""
444
545
  }
445
546
 
@@ -483,7 +584,14 @@ export function transformJSX(code: string, filename = "input.tsx"): TransformRes
483
584
  const needsPlaceholder = useMixed || useMultiExpr
484
585
  const { expr, isReactive } = unwrapAccessor(child.expression)
485
586
  if (isReactive) {
486
- return emitReactiveTextChild(expr, varName, parentRef, childNodeIdx, needsPlaceholder)
587
+ return emitReactiveTextChild(
588
+ expr,
589
+ child.expression,
590
+ varName,
591
+ parentRef,
592
+ childNodeIdx,
593
+ needsPlaceholder,
594
+ )
487
595
  }
488
596
  return emitStaticTextChild(expr, varName, parentRef, childNodeIdx, needsPlaceholder)
489
597
  }
@@ -539,9 +647,25 @@ export function transformJSX(code: string, filename = "input.tsx"): TransformRes
539
647
  const html = processElement(node, "__root")
540
648
  if (html === null) return null
541
649
 
650
+ if (needsBindTextImport) needsBindTextImportGlobal = true
651
+ if (needsBindDirectImport) needsBindDirectImportGlobal = true
652
+
542
653
  // Build bind function body
543
654
  const escaped = html.replace(/\\/g, "\\\\").replace(/"/g, '\\"')
544
655
 
656
+ // Emit combined _bind for reactive attribute/text expressions that
657
+ // weren't handled by _bindText. This merges N separate _bind calls into
658
+ // one — saving N-1 closures + deps arrays per template instance.
659
+ // Emit a single combined _bind for all reactive attribute/text expressions
660
+ // that weren't handled by _bindText. Merges N separate _bind calls into one —
661
+ // saving N-1 closures + deps arrays per template instance.
662
+ if (reactiveBindExprs.length > 0) {
663
+ needsBindImportGlobal = true
664
+ const combinedName = nextDisp()
665
+ const combinedBody = reactiveBindExprs.join("; ")
666
+ bindLines.push(`const ${combinedName} = _bind(() => { ${combinedBody} })`)
667
+ }
668
+
545
669
  if (bindLines.length === 0 && disposerNames.length === 0) {
546
670
  return `_tpl("${escaped}", () => null)`
547
671
  }
@@ -9,7 +9,8 @@ describe("JSX transform — children", () => {
9
9
  test("wraps dynamic child expression", () => {
10
10
  const result = t("<div>{count()}</div>")
11
11
  expect(result).toContain("_tpl(")
12
- expect(result).toContain(".data = count()")
12
+ // Single-signal text binding uses _bindText for direct subscription
13
+ expect(result).toContain("_bindText(count,")
13
14
  })
14
15
 
15
16
  test("does NOT wrap string literal child", () => {
@@ -26,9 +27,9 @@ describe("JSX transform — children", () => {
26
27
 
27
28
  test("does NOT double-wrap existing arrow function", () => {
28
29
  const result = t("<div>{() => count()}</div>")
29
- // Arrow should be unwrapped by template emission into _bind(() => { __t.data = count() })
30
+ // Arrow should be unwrapped by template emission into _bindText(count, __t)
30
31
  // The original () => count() should NOT appear in the output
31
- expect(result).toContain("count()")
32
+ expect(result).toContain("_bindText(count,")
32
33
  expect(result).not.toContain("() => count()")
33
34
  })
34
35
 
@@ -91,7 +92,8 @@ describe("JSX transform — children", () => {
91
92
  test("wraps member access with call", () => {
92
93
  const result = t("<div>{obj.getValue()}</div>")
93
94
  expect(result).toContain("_tpl(")
94
- expect(result).toContain(".data = obj.getValue()")
95
+ // Single-signal: uses _bindText with member expression
96
+ expect(result).toContain("_bindText(obj.getValue,")
95
97
  })
96
98
 
97
99
  test("does NOT wrap member access without call", () => {
@@ -300,15 +302,16 @@ describe("JSX transform — mixed", () => {
300
302
  test("wraps props and children independently", () => {
301
303
  const result = t("<div class={cls()}>{text()}</div>")
302
304
  expect(result).toContain("_tpl(")
303
- expect(result).toContain("className = cls()")
304
- expect(result).toContain(".data = text()")
305
+ // className uses _bindDirect (single-signal), text uses _bindText
306
+ expect(result).toContain("_bindDirect(cls,")
307
+ expect(result).toContain("_bindText(text,")
305
308
  })
306
309
 
307
310
  test("preserves static siblings of dynamic children", () => {
308
311
  const result = t("<div>static{count()}</div>")
309
312
  expect(result).toContain("_tpl(")
310
313
  expect(result).toContain("static")
311
- expect(result).toContain(".data = count()")
314
+ expect(result).toContain("_bindText(count,")
312
315
  })
313
316
 
314
317
  test("leaves code outside JSX completely unchanged", () => {
@@ -323,15 +326,15 @@ const B = <span>{b()}</span>
323
326
  `
324
327
  const result = t(input)
325
328
  expect(result).toContain("_tpl(")
326
- expect(result).toContain(".data = a()")
327
- expect(result).toContain(".data = b()")
329
+ expect(result).toContain("_bindText(a,")
330
+ expect(result).toContain("_bindText(b,")
328
331
  })
329
332
 
330
333
  test("handles deeply nested JSX", () => {
331
334
  const result = t("<div><span><em>{count()}</em></span></div>")
332
- // Template emission: 3 DOM elements → _tpl() call with renderEffect binding
335
+ // Template emission: 3 DOM elements → _tpl() call with _bindText binding
333
336
  expect(result).toContain("_tpl(")
334
- expect(result).toContain("count()")
337
+ expect(result).toContain("_bindText(count,")
335
338
  })
336
339
 
337
340
  test("returns unchanged code when no JSX present", () => {
@@ -378,13 +381,13 @@ describe("JSX transform — edge cases", () => {
378
381
  test("handles .jsx file extension", () => {
379
382
  const result = transformJSX("<div>{count()}</div>", "file.jsx").code
380
383
  expect(result).toContain("_tpl(")
381
- expect(result).toContain(".data = count()")
384
+ expect(result).toContain("_bindText(count,")
382
385
  })
383
386
 
384
387
  test("handles .ts file extension (treated as TSX)", () => {
385
388
  const result = transformJSX("<div>{count()}</div>", "file.ts").code
386
389
  expect(result).toContain("_tpl(")
387
- expect(result).toContain(".data = count()")
390
+ expect(result).toContain("_bindText(count,")
388
391
  })
389
392
 
390
393
  test("wraps call inside array map", () => {
@@ -419,7 +422,7 @@ describe("transformJSX return value", () => {
419
422
  // Should not throw with default filename
420
423
  const result = transformJSX("<div>{count()}</div>")
421
424
  expect(result.code).toContain("_tpl(")
422
- expect(result.code).toContain(".data = count()")
425
+ expect(result.code).toContain("_bindText(count,")
423
426
  })
424
427
  })
425
428
 
@@ -466,16 +469,15 @@ describe("JSX transform — template emission", () => {
466
469
  expect(result).toContain("_tpl(")
467
470
  })
468
471
 
469
- test("generates renderEffect for reactive class", () => {
472
+ test("generates _bindDirect for reactive class with single signal", () => {
470
473
  const result = t("<div class={cls()}><span /></div>")
471
- expect(result).toContain("_bind(() => {")
472
- expect(result).toContain("className = cls()")
474
+ expect(result).toContain("_bindDirect(cls,")
475
+ expect(result).toContain("className")
473
476
  })
474
477
 
475
- test("generates renderEffect for reactive text child", () => {
478
+ test("generates _bindText for reactive text child with single signal", () => {
476
479
  const result = t("<div><span>{name()}</span></div>")
477
- expect(result).toContain("_bind(() => {")
478
- expect(result).toContain(".data = name()")
480
+ expect(result).toContain("_bindText(name,")
479
481
  })
480
482
 
481
483
  test("generates one-time set for static expression text", () => {
@@ -484,9 +486,10 @@ describe("JSX transform — template emission", () => {
484
486
  expect(result).not.toContain("_bind(")
485
487
  })
486
488
 
487
- test("generates addEventListener for event handlers", () => {
489
+ test("generates delegated event for common events", () => {
488
490
  const result = t("<div><button onClick={handler}>click</button></div>")
489
- expect(result).toContain('addEventListener("click", handler)')
491
+ // click is delegated — uses expando property instead of addEventListener
492
+ expect(result).toContain("__ev_click = handler")
490
493
  })
491
494
 
492
495
  test("uses element children indexing for nested access", () => {
@@ -499,7 +502,7 @@ describe("JSX transform — template emission", () => {
499
502
  test("handles deeply nested element paths", () => {
500
503
  const result = t("<table><tbody><tr><td>{text()}</td></tr></tbody></table>")
501
504
  expect(result).toContain("_tpl(")
502
- expect(result).toContain(".data = text()")
505
+ expect(result).toContain("_bindText(text,")
503
506
  })
504
507
 
505
508
  test("adds template imports when _tpl is emitted", () => {
@@ -580,7 +583,7 @@ describe("JSX transform — template emission", () => {
580
583
  // Mixed element + expression children use childNodes indexing
581
584
  expect(result).toContain("_tpl(")
582
585
  expect(result).toContain("childNodes[")
583
- expect(result).toContain(".data = text()")
586
+ expect(result).toContain("_bindText(text,")
584
587
  })
585
588
 
586
589
  test("benchmark-like row structure", () => {
@@ -589,16 +592,19 @@ describe("JSX transform — template emission", () => {
589
592
  )
590
593
  expect(result).toContain("_tpl(")
591
594
  expect(result).toContain('<td class=\\"id\\"></td><td></td>')
592
- expect(result).toContain("className = cls()")
595
+ // className uses _bindDirect (single-signal cls())
596
+ expect(result).toContain("_bindDirect(cls,")
597
+ // String(row.id) has args → combined _bind; row.label() is single-signal → _bindText
593
598
  expect(result).toContain(".data = String(row.id)")
594
- expect(result).toContain(".data = row.label()")
599
+ expect(result).toContain("_bindText(row.label,")
595
600
  })
596
601
 
597
602
  test("handles multiple expression children", () => {
598
603
  const result = t("<div><span>{a()}{b()}</span></div>")
599
604
  expect(result).toContain("_tpl(")
600
- expect(result).toContain(".data = a()")
601
- expect(result).toContain(".data = b()")
605
+ // Both are single-signal → _bindText
606
+ expect(result).toContain("_bindText(a,")
607
+ expect(result).toContain("_bindText(b,")
602
608
  // Each expression gets its own placeholder and childNodes access
603
609
  expect(result).toContain("childNodes[0]")
604
610
  expect(result).toContain("childNodes[1]")
@@ -608,7 +614,7 @@ describe("JSX transform — template emission", () => {
608
614
  const result = t("<div>hello<span />{name()}</div>")
609
615
  expect(result).toContain("_tpl(")
610
616
  expect(result).toContain("childNodes[")
611
- expect(result).toContain(".data = name()")
617
+ expect(result).toContain("_bindText(name,")
612
618
  })
613
619
 
614
620
  test("handles fragment with element children inside template", () => {
@@ -666,10 +672,10 @@ describe("JSX transform — template emission", () => {
666
672
  expect(result).not.toContain("_bind(")
667
673
  })
668
674
 
669
- test("reactive renderEffect for non-class dynamic attribute", () => {
675
+ test("_bindDirect for non-class single-signal dynamic attribute", () => {
670
676
  const result = t("<div title={getTitle()}><span /></div>")
671
- expect(result).toContain("_bind(() => {")
672
- expect(result).toContain('setAttribute("title", getTitle())')
677
+ expect(result).toContain("_bindDirect(getTitle,")
678
+ expect(result).toContain('setAttribute("title"')
673
679
  })
674
680
 
675
681
  test("ref attribute in template binds .current", () => {
@@ -692,7 +698,7 @@ describe("JSX transform — template emission", () => {
692
698
  test("handles fragment with expression containing no JSX", () => {
693
699
  const result = t("<div><><span />{count()}</></div>")
694
700
  expect(result).toContain("_tpl(")
695
- expect(result).toContain(".data = count()")
701
+ expect(result).toContain("_bindText(count,")
696
702
  })
697
703
 
698
704
  test("handles nested fragment with text children", () => {
@@ -800,7 +806,7 @@ describe("JSX transform — nested fragment in templateFragmentCount", () => {
800
806
  // Fragment in fragment with expression — templateFragmentCount handles expression
801
807
  const result = t("<div><><>{count()}</></></div>")
802
808
  expect(result).toContain("_tpl(")
803
- expect(result).toContain(".data = count()")
809
+ expect(result).toContain("_bindText(count,")
804
810
  })
805
811
 
806
812
  test("nested fragment with expression containing JSX bails", () => {