@pyreon/compiler 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/analysis/index.js.html +1 -1
- package/lib/index.js +104 -13
- package/lib/index.js.map +1 -1
- package/lib/types/index.d.ts +78 -13
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index2.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/jsx.ts +142 -18
- package/src/tests/jsx.test.ts +40 -34
|
@@ -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":"
|
|
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
|
|
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)
|
|
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)
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
278
|
-
|
|
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
|
-
|
|
281
|
-
|
|
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
|
-
|
|
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, \"&\").replace(/\"/g, \""\")\n}\n\nfunction escapeHtmlText(s: string): string {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\")\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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"}
|
|
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, \"&\").replace(/\"/g, \""\")\n}\n\nfunction escapeHtmlText(s: string): string {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\")\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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"}
|
package/lib/types/index.d.ts
CHANGED
|
@@ -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
|
|
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)
|
|
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)
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
282
|
-
|
|
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
|
-
|
|
285
|
-
|
|
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
|
-
|
|
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";
|
package/lib/types/index.d.ts.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwFA,SAAgB,YAAA,CAAa,IAAA,EAAc,QAAA,GAAW,WAAA,EAA8B;EAClF,MAAM,UAAA,GACJ,QAAA,CAAS,QAAA,CAAS,MAAA,CAAO,IAAI,QAAA,CAAS,QAAA,CAAS,MAAA,CAAO,GAAG,EAAA,CAAG,UAAA,CAAW,GAAA,GAAM,EAAA,CAAG,UAAA,CAAW,GAAA;EAE7F,MAAM,EAAA,GAAK,EAAA,CAAG,gBAAA,CACZ,QAAA,EACA,IAAA,EACA,EAAA,CAAG,YAAA,CAAa,MAAA,EACK,IAAA,EACrB,UAAA,CACD;EAGD,MAAM,YAAA,GAA8B,EAAE;EACtC,MAAM,QAAA,GAA8B,EAAE;EAEtC,SAAS,IAAA,CAAK,IAAA,EAAe,OAAA,EAAiB,QAAA,EAAyC;IACrF,MAAM;MAAE,IAAA;MAAM;IAAA,CAAA,GAAc,EAAA,CAAG,6BAAA,CAA8B,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,CAAC;IAC/E,QAAA,CAAS,IAAA,CAAK;MAAE,OAAA;MAAS,IAAA,EAAM,IAAA,GAAO,CAAA;MAAG,MAAA,EAAQ,SAAA;MAAW,IAAA,EAAM;KAAU,CAAC;;EAK/E,MAAM,MAAA,GAAkB,EAAE;EAC1B,IAAI,QAAA,GAAW,CAAA;EACf,IAAI,cAAA,GAAiB,KAAA;EACrB,IAAI,yBAAA,GAA4B,KAAA;EAChC,IAAI,2BAAA,GAA8B,KAAA;EAClC,IAAI,qBAAA,GAAwB,KAAA;;;;;EAM5B,SAAS,UAAA,CAAW,IAAA,EAA8B;IAChD,IAAA,CACG,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,IAAI,EAAA,CAAG,uBAAA,CAAwB,IAAA,CAAK,IAAI,EAAA,CAAG,aAAA,CAAc,IAAA,CAAK,KACpF,eAAA,CAAgB,IAAA,CAAkE,EAClF;MACA,MAAM,IAAA,GAAO,MAAM,QAAA,EAAA,EAAA;MACnB,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,EAAE,IAAA,CAAK,MAAA,CAAA,CAAQ,CAAC;MACzD,MAAA,CAAO,IAAA,CAAK;QAAE,IAAA;QAAM;OAAM,CAAC;MAC3B,OAAO,IAAA;;IAET,OAAO,IAAA;;EAGT,SAAS,IAAA,CAAK,IAAA,EAA2B;IACvC,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG;IAC/B,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAA,CAAQ;IACzB,YAAA,CAAa,IAAA,CAAK;MAAE,KAAA;MAAO,GAAA;MAAK,IAAA,EAAM,SAAS,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAA,CAAI;KAAI,CAAC;;;EAI5E,SAAS,WAAA,CAAY,IAAA,EAA2B;IAC9C,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK;IAClC,IAAI,SAAA,EACF,YAAA,CAAa,IAAA,CAAK;MAAE,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG;MAAE,GAAA,EAAK,IAAA,CAAK,MAAA,CAAA,CAAQ;MAAE,IAAA,EAAM;KAAW,CAAC,CAAA,SAC3E,UAAA,CAAW,IAAA,CAAK,EACzB,IAAA,CAAK,IAAA,CAAK;;;EAOd,SAAS,eAAA,CAAgB,IAAA,EAA8B;IAErD,IADkB,oBAAA,CAAqB,IAAA,CAAK,GAC5B,CAAA,EAAG,OAAO,KAAA;IAC1B,MAAM,OAAA,GAAU,iBAAA,CAAkB,IAAA,CAAK;IACvC,IAAI,CAAC,OAAA,EAAS,OAAO,KAAA;IACrB,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG;IAC/B,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAA,CAAQ;IACzB,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA;IACpB,MAAM,WAAA,GAAc,MAAA,KAAW,EAAA,CAAG,YAAA,CAAa,MAAA,CAAO,IAAI,EAAA,CAAG,aAAA,CAAc,MAAA,CAAO,CAAA;IAClF,YAAA,CAAa,IAAA,CAAK;MAAE,KAAA;MAAO,GAAA;MAAK,IAAA,EAAM,WAAA,GAAc,IAAI,OAAA,GAAQ,GAAK;KAAS,CAAC;IAC/E,cAAA,GAAiB,IAAA;IACjB,OAAO,IAAA;;;EAIT,SAAS,gBAAA,CAAiB,IAAA,EAAsD;IAC9E,MAAM,OAAA,GAAU,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,GAAG,IAAA,CAAK,cAAA,GAAiB,IAAA;IAE9D,IAAA,CADgB,EAAA,CAAG,YAAA,CAAa,OAAA,CAAQ,OAAA,CAAQ,GAAG,OAAA,CAAQ,OAAA,CAAQ,IAAA,GAAO,EAAA,MAC1D,KAAA,EAAO;IAIvB,IAAI,CAHU,OAAA,CAAQ,UAAA,CAAW,UAAA,CAAW,IAAA,CACzC,CAAA,IAAM,EAAA,CAAG,cAAA,CAAe,CAAA,CAAE,IAAI,EAAA,CAAG,YAAA,CAAa,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,CAAK,IAAA,KAAS,IAAA,CAC3E,EAEC,IAAA,CACE,OAAA,CAAQ,OAAA,EACR,mLAAA,EACA,oBAAA,CACD;;;EAKL,SAAS,kBAAA,CAAmB,IAAA,EAA6B;IACvD,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,GAAG,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,EAAA;IAC3D,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,MAAA;IAC9B,MAAM,OAAA,GAAU,EAAA,CAAG,YAAA,CAAa,SAAA,CAAU,OAAA,CAAQ,GAAG,SAAA,CAAU,OAAA,CAAQ,IAAA,GAAO,EAAA;IAG9E,IADE,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAE,KAAK,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAE,CAAC,WAAA,CAAA,CAAa,EACrD;IACxB,IAAI,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,EAAE;IACjD,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,WAAA,CAAY,EAAE;IAChE,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,UAAA;IAC9B,IAAI,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK;;;EAI7B,SAAS,mBAAA,CAAoB,IAAA,EAA8B;IACzD,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA;IAClB,IAAI,CAAC,IAAA,EAAM;IACX,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK;IAClC,IAAI,SAAA,EAAW;MACb,YAAA,CAAa,IAAA,CAAK;QAAE,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG;QAAE,GAAA,EAAK,IAAA,CAAK,MAAA,CAAA,CAAQ;QAAE,IAAA,EAAM;OAAW,CAAC;MACpF;;IAEF,IAAI,UAAA,CAAW,IAAA,CAAK,EAAE;MACpB,IAAA,CAAK,IAAA,CAAK;MACV;;IAKF,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,IAAA,CAAK;;EAG7B,SAAS,IAAA,CAAK,IAAA,EAAqB;IACjC,IAAI,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,IAAI,eAAA,CAAgB,IAAA,CAAK,EAAE;IACpD,IAAI,EAAA,CAAG,uBAAA,CAAwB,IAAA,CAAK,IAAI,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,EAAE,gBAAA,CAAiB,IAAA,CAAK;IACrF,IAAI,EAAA,CAAG,cAAA,CAAe,IAAA,CAAK,EAAE;MAC3B,kBAAA,CAAmB,IAAA,CAAK;MACxB;;IAEF,IAAI,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,EAAE;MAC5B,mBAAA,CAAoB,IAAA,CAAK;MACzB;;IAEF,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,IAAA,CAAK;;EAG7B,IAAA,CAAK,EAAA,CAAG;EAER,IAAI,YAAA,CAAa,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO;IAAE,IAAA;IAAM;GAAU;EAG/E,YAAA,CAAa,IAAA,CAAA,CAAM,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM;EAE9C,IAAI,MAAA,GAAS,IAAA;EACb,KAAK,MAAM,CAAA,IAAK,YAAA,EACd,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,CAAA,CAAE,GAAA,CAAI;EAIlE,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAElB,MAAA,GADiB,MAAA,CAAO,GAAA,CAAK,CAAA,IAAM,SAAS,CAAA,CAAE,IAAA,oBAAwB,CAAA,CAAE,IAAA,IAAK,CAAI,CAAC,IAAA,CAAK,EAAA,CAAG,GACtE,MAAA;EAItB,IAAI,cAAA,EAAgB;IAClB,MAAM,iBAAA,GAAoB,CAAC,MAAA,CAAO;IAClC,IAAI,2BAAA,EAA6B,iBAAA,CAAkB,IAAA,CAAK,aAAA,CAAc;IACtE,IAAI,yBAAA,EAA2B,iBAAA,CAAkB,IAAA,CAAK,WAAA,CAAY;IAClE,MAAM,iBAAA,GAAoB,qBAAA,GACtB,+CAAA,GACA,EAAA;IACJ,MAAA,GACE,YAAY,iBAAA,CAAkB,IAAA,CAAK,IAAA,CAAK,iCAAiC,iBAAA,IAAkB,GAC3F,MAAA;;EAGJ,OAAO;IAAE,IAAA,EAAM,MAAA;IAAQ,aAAA,EAAe,cAAA;IAAgB;GAAU;;EAKhE,SAAS,WAAA,CAAY,IAAA,EAAyD;IAC5E,KAAK,MAAM,IAAA,IAAQ,QAAA,CAAS,IAAA,CAAK,EAAE;MACjC,IAAI,EAAA,CAAG,oBAAA,CAAqB,IAAA,CAAK,EAAE,OAAO,IAAA;MAC1C,IAAI,EAAA,CAAG,cAAA,CAAe,IAAA,CAAK,IAAI,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,KAAA,EAC9E,OAAO,IAAA;;IAEX,OAAO,KAAA;;;;;;EAOT,SAAS,qBAAA,CAAsB,KAAA,EAA4B;IACzD,IAAI,EAAA,CAAG,SAAA,CAAU,KAAA,CAAM,EAAE,OAAO,CAAA;IAChC,IAAI,EAAA,CAAG,YAAA,CAAa,KAAA,CAAM,IAAI,EAAA,CAAG,uBAAA,CAAwB,KAAA,CAAM,EAC7D,OAAO,oBAAA,CAAqB,KAAA,CAAM;IACpC,IAAI,EAAA,CAAG,eAAA,CAAgB,KAAA,CAAM,EAAE;MAC7B,IAAI,CAAC,KAAA,CAAM,UAAA,EAAY,OAAO,CAAA;MAC9B,OAAO,iBAAA,CAAkB,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,CAAA,GAAK,CAAA;;IAEpD,IAAI,EAAA,CAAG,aAAA,CAAc,KAAA,CAAM,EAAE,OAAO,qBAAA,CAAsB,KAAA,CAAM;IAChE,OAAO,CAAA,CAAA;;;;;;EAOT,SAAS,oBAAA,CAAqB,IAAA,EAAwD;IACpF,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,CAAK;IAC5B,IAAI,CAAC,GAAA,IAAO,CAAC,WAAA,CAAY,GAAA,CAAI,EAAE,OAAO,CAAA,CAAA;IACtC,IAAI,WAAA,CAAY,IAAA,CAAK,EAAE,OAAO,CAAA,CAAA;IAC9B,IAAI,CAAC,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,EAAE,OAAO,CAAA;IAEnC,IAAI,KAAA,GAAQ,CAAA;IACZ,KAAK,MAAM,KAAA,IAAS,IAAA,CAAK,QAAA,EAAU;MACjC,MAAM,CAAA,GAAI,qBAAA,CAAsB,KAAA,CAAM;MACtC,IAAI,CAAA,KAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;MACrB,KAAA,IAAS,CAAA;;IAEX,OAAO,KAAA;;;EAIT,SAAS,qBAAA,CAAsB,IAAA,EAA8B;IAC3D,IAAI,KAAA,GAAQ,CAAA;IACZ,KAAK,MAAM,KAAA,IAAS,IAAA,CAAK,QAAA,EAAU;MACjC,MAAM,CAAA,GAAI,qBAAA,CAAsB,KAAA,CAAM;MACtC,IAAI,CAAA,KAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;MACrB,KAAA,IAAS,CAAA;;IAEX,OAAO,KAAA;;;;;;EAOT,SAAS,iBAAA,CAAkB,IAAA,EAA+D;IACxF,MAAM,SAAA,GAAsB,EAAE;IAC9B,MAAM,aAAA,GAA0B,EAAE;IAClC,IAAI,MAAA,GAAS,CAAA;IACb,IAAI,OAAA,GAAU,CAAA;IAEd,MAAM,iBAAA,GAA8B,EAAE;IACtC,IAAI,mBAAA,GAAsB,KAAA;IAC1B,IAAI,qBAAA,GAAwB,KAAA;IAE5B,SAAS,OAAA,CAAA,EAAkB;MACzB,OAAO,MAAM,MAAA,EAAA,EAAA;;IAEf,SAAS,QAAA,CAAA,EAAmB;MAC1B,MAAM,IAAA,GAAO,MAAM,OAAA,EAAA,EAAA;MACnB,aAAA,CAAc,IAAA,CAAK,IAAA,CAAK;MACxB,OAAO,IAAA;;IAET,SAAS,WAAA,CAAA,EAAsB;MAC7B,OAAO,MAAM,MAAA,EAAA,EAAA;;;IAIf,SAAS,iBAAA,CAAkB,QAAA,EAAkB,UAAA,EAA6B;MACxE,IAAI,QAAA,KAAa,QAAA,EAAU,OAAO,QAAA;MAClC,IAAI,UAAA,EAAY;QACd,MAAM,CAAA,GAAI,OAAA,CAAA,CAAS;QACnB,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA,MAAO,QAAA,EAAA,CAAW;QAC1C,OAAO,CAAA;;MAET,OAAO,QAAA;;;IAIT,SAAS,OAAA,CAAQ,IAAA,EAAuB,OAAA,EAAuB;MAC7D,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,WAAA,CAAY,EAAE;MAChE,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,UAAA,EAAY;MAClC,SAAA,CAAU,IAAA,CAAK,GAAG,SAAA,CAAU,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,cAAc,OAAA,EAAA,CAAU;;;IAIlF,SAAS,iBAAA,CAAkB,IAAA,EAAuB,QAAA,EAAkB,OAAA,EAAuB;MACzF,MAAM,SAAA,GAAA,CAAa,QAAA,CAAS,CAAA,CAAA,IAAM,EAAA,EAAI,WAAA,CAAA,CAAa,GAAG,QAAA,CAAS,KAAA,CAAM,CAAA,CAAE;MACvE,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,WAAA,CAAY,EAAE;MAChE,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,UAAA,EAAY;MAClC,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW;MACtD,IAAI,gBAAA,CAAiB,GAAA,CAAI,SAAA,CAAU,EAEjC,SAAA,CAAU,IAAA,CAAK,GAAG,OAAA,SAAgB,SAAA,MAAe,OAAA,EAAA,CAAU,CAAA,KAE3D,SAAA,CAAU,IAAA,CAAK,GAAG,OAAA,sBAA6B,SAAA,MAAe,OAAA,GAAQ,CAAG;;;IAK7E,SAAS,gBAAA,CAAiB,QAAA,EAAyB,YAAA,EAAqC;MACtF,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,EAAE,OAAO,IAAA;MAChC,IAAI,EAAA,CAAG,eAAA,CAAgB,QAAA,CAAS,EAAE,OAAO,IAAI,YAAA,KAAiB,cAAA,CAAe,QAAA,CAAS,IAAA,CAAK,GAAC;MAC5F,IAAI,EAAA,CAAG,gBAAA,CAAiB,QAAA,CAAS,EAAE,OAAO,IAAI,YAAA,KAAiB,QAAA,CAAS,IAAA,GAAK;MAC7E,IAAI,QAAA,CAAS,IAAA,KAAS,EAAA,CAAG,UAAA,CAAW,WAAA,EAAa,OAAO,IAAI,YAAA,EAAA;MAC5D,OAAO,EAAA;;;;;;;IAQT,SAAS,kBAAA,CAAmB,QAAA,EAAwC;MAClE,IAAI,KAAA,GAAQ,QAAA;MAEZ,IAAI,EAAA,CAAG,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAC,EAAA,CAAG,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,EACtD,KAAA,GAAQ,KAAA,CAAM,IAAA;MAEhB,IAAI,CAAC,EAAA,CAAG,gBAAA,CAAiB,KAAA,CAAM,EAAE,OAAO,IAAA;MACxC,IAAI,KAAA,CAAM,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;MACvC,MAAM,MAAA,GAAS,KAAA,CAAM,UAAA;MACrB,IAAI,EAAA,CAAG,YAAA,CAAa,MAAA,CAAO,IAAI,EAAA,CAAG,0BAAA,CAA2B,MAAA,CAAO,EAClE,OAAO,SAAA,CAAU,MAAA,CAAO;MAE1B,OAAO,IAAA;;;IAIT,SAAS,cAAA,CAAe,QAAA,EAAgE;MAEtF,IAAI,EAAA,CAAG,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAC,EAAA,CAAG,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,EAC5D,OAAO;QAAE,IAAA,EAAM,SAAA,CAAU,QAAA,CAAS,IAAA,CAAsB;QAAE,UAAA,EAAY;OAAM;MAG9E,IAAI,EAAA,CAAG,eAAA,CAAgB,QAAA,CAAS,IAAI,EAAA,CAAG,oBAAA,CAAqB,QAAA,CAAS,EACnE,OAAO;QAAE,IAAA,EAAM,IAAI,SAAA,CAAU,QAAA,CAAS,KAAC;QAAM,UAAA,EAAY;OAAM;MAEjE,OAAO;QAAE,IAAA,EAAM,SAAA,CAAU,QAAA,CAAS;QAAE,UAAA,EAAY,YAAA,CAAa,QAAA;OAAW;;;IAI1E,SAAS,UAAA,CAAW,YAAA,EAAsB,OAAA,EAAiB,IAAA,EAAsB;MAC/E,OAAO,YAAA,KAAiB,OAAA,GACpB,GAAG,OAAA,gBAAuB,IAAA,EAAA,GAC1B,GAAG,OAAA,kBAAyB,YAAA,MAAkB,IAAA,GAAK;;;IAIzD,SAAS,eAAA,CACP,KAAA,EACA,QAAA,EACA,YAAA,EACA,OAAA,EACM;MACN,MAAM;QAAE,IAAA;QAAM;MAAA,CAAA,GAAe,cAAA,CAAe,QAAA,CAAS;MAErD,IAAI,CAAC,UAAA,EAAY;QACf,SAAA,CAAU,IAAA,CAAK,UAAA,CAAW,YAAA,EAAc,OAAA,EAAS,IAAA,CAAK,CAAC;QACvD;;MAIF,MAAM,SAAA,GAAY,kBAAA,CAAmB,QAAA,CAAS;MAC9C,IAAI,SAAA,EAAW;QACb,qBAAA,GAAwB,IAAA;QACxB,MAAM,CAAA,GAAI,QAAA,CAAA,CAAU;QACpB,MAAM,OAAA,GACJ,YAAA,KAAiB,OAAA,GACb,YAAY,OAAA,2CAAQ,GACpB,YAAY,OAAA,kBAAyB,YAAA,kCAAa;QACxD,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA,kBAAmB,SAAA,KAAc,OAAA,GAAQ,CAAG;QACpE;;MAGF,iBAAA,CAAkB,IAAA,CAAK,UAAA,CAAW,YAAA,EAAc,OAAA,EAAS,IAAA,CAAK,CAAC;;;IAIjE,SAAS,kBAAA,CACP,QAAA,EACA,YAAA,EACA,OAAA,EACQ;MACR,MAAM,UAAA,GAAa,gBAAA,CAAiB,QAAA,EAAU,YAAA,CAAa;MAC3D,IAAI,UAAA,KAAe,IAAA,EAAM,OAAO,UAAA;MAChC,eAAA,CAAgB,SAAA,CAAU,QAAA,CAAS,EAAE,QAAA,EAAU,YAAA,EAAc,OAAA,CAAQ;MACrE,OAAO,EAAA;;;IAIT,SAAS,kBAAA,CAAmB,IAAA,EAAuB,QAAA,EAAkB,OAAA,EAA0B;MAC7F,IAAI,QAAA,KAAa,KAAA,EAAO;QACtB,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ;QACtB,OAAO,IAAA;;MAET,IAAI,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,EAAE;QAC3B,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,OAAA,CAAQ;QAC1C,OAAO,IAAA;;MAET,OAAO,KAAA;;;IAIT,SAAS,qBAAA,CACP,IAAA,EACA,YAAA,EACA,OAAA,EACQ;MACR,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,IAAI,YAAA,EAAA;MAClC,IAAI,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,WAAA,CAAY,EACtC,OAAO,IAAI,YAAA,KAAiB,cAAA,CAAe,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,GAAC;MACpE,IAAI,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,WAAA,CAAY,IAAI,IAAA,CAAK,WAAA,CAAY,UAAA,EAC3D,OAAO,kBAAA,CAAmB,IAAA,CAAK,WAAA,CAAY,UAAA,EAAY,YAAA,EAAc,OAAA,CAAQ;MAC/E,OAAO,EAAA;;;IAIT,SAAS,cAAA,CAAe,IAAA,EAA2B,OAAA,EAAyB;MAC1E,IAAI,CAAC,EAAA,CAAG,cAAA,CAAe,IAAA,CAAK,EAAE,OAAO,EAAA;MACrC,MAAM,QAAA,GAAW,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,GAAG,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,EAAA;MAC/D,IAAI,QAAA,KAAa,KAAA,EAAO,OAAO,EAAA;MAC/B,IAAI,kBAAA,CAAmB,IAAA,EAAM,QAAA,EAAU,OAAA,CAAQ,EAAE,OAAO,EAAA;MACxD,OAAO,qBAAA,CAAsB,IAAA,EAAM,gBAAA,CAAiB,QAAA,CAAA,IAAa,QAAA,EAAU,OAAA,CAAQ;;;IAIrF,SAAS,YAAA,CAAa,EAAA,EAA8C,OAAA,EAAyB;MAC3F,IAAI,SAAA,GAAY,EAAA;MAChB,KAAK,MAAM,IAAA,IAAQ,QAAA,CAAS,EAAA,CAAG,EAAE,SAAA,IAAa,cAAA,CAAe,IAAA,EAAM,OAAA,CAAQ;MAC3E,OAAO,SAAA;;;IAIT,SAAS,qBAAA,CACP,IAAA,EACA,QAAA,EACA,OAAA,EACA,SAAA,EACA,YAAA,EACA,gBAAA,EACQ;MACR,MAAM,IAAA,GAAO,WAAA,CAAA,CAAa;MAC1B,SAAA,CAAU,IAAA,CAAK,SAAS,IAAA,gCAAK,CAAgC;MAC7D,IAAI,gBAAA,EACF,SAAA,CAAU,IAAA,CACR,GAAG,SAAA,iBAA0B,IAAA,KAAS,SAAA,eAAwB,YAAA,IAAa,CAC5E,CAAA,KAED,SAAA,CAAU,IAAA,CAAK,GAAG,OAAA,gBAAuB,IAAA,GAAK,CAAG;MAGnD,MAAM,SAAA,GAAY,kBAAA,CAAmB,QAAA,CAAS;MAC9C,IAAI,SAAA,EAAW;QACb,mBAAA,GAAsB,IAAA;QACtB,MAAM,CAAA,GAAI,QAAA,CAAA,CAAU;QACpB,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA,gBAAiB,SAAA,KAAc,IAAA,GAAK,CAAG;aAG/D,iBAAA,CAAkB,IAAA,CAAK,GAAG,IAAA,WAAe,IAAA,EAAA,CAAO;MAElD,OAAO,gBAAA,GAAmB,KAAA,GAAQ,EAAA;;;IAIpC,SAAS,mBAAA,CACP,IAAA,EACA,OAAA,EACA,SAAA,EACA,YAAA,EACA,gBAAA,EACQ;MACR,IAAI,gBAAA,EAAkB;QACpB,MAAM,IAAA,GAAO,WAAA,CAAA,CAAa;QAC1B,SAAA,CAAU,IAAA,CAAK,SAAS,IAAA,8BAAkC,IAAA,GAAK,CAAG;QAClE,SAAA,CAAU,IAAA,CACR,GAAG,SAAA,iBAA0B,IAAA,KAAS,SAAA,eAAwB,YAAA,IAAa,CAC5E;QACD,OAAO,KAAA;;MAET,SAAA,CAAU,IAAA,CAAK,GAAG,OAAA,kBAAyB,IAAA,EAAA,CAAO;MAClD,OAAO,EAAA;;;IAIT,SAAS,eAAA,CACP,KAAA,EACA,OAAA,EACA,SAAA,EACA,QAAA,EACA,YAAA,EACA,YAAA,EACe;MACf,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ,OAAO,cAAA,CAAe,KAAA,CAAM,IAAA,CAAK;MAC5D,IAAI,KAAA,CAAM,IAAA,KAAS,SAAA,EAAW;QAC5B,MAAM,aAAA,GAAgB,QAAA,GAClB,GAAG,SAAA,eAAwB,YAAA,GAAa,GACxC,GAAG,SAAA,aAAsB,KAAA,CAAM,OAAA,GAAQ;QAC3C,OAAO,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,aAAA,CAAc;;MAGlD,MAAM,gBAAA,GAAmB,QAAA,IAAY,YAAA;MACrC,MAAM;QAAE,IAAA;QAAM;MAAA,CAAA,GAAe,cAAA,CAAe,KAAA,CAAM,UAAA,CAAW;MAC7D,IAAI,UAAA,EACF,OAAO,qBAAA,CACL,IAAA,EACA,KAAA,CAAM,UAAA,EACN,OAAA,EACA,SAAA,EACA,YAAA,EACA,gBAAA,CACD;MAEH,OAAO,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,YAAA,EAAc,gBAAA,CAAiB;;;IAItF,SAAS,eAAA,CAAgB,EAAA,EAAmB,OAAA,EAAiB,QAAA,EAAiC;MAC5F,MAAM,YAAA,GAAe,eAAA,CAAgB,EAAA,CAAG,QAAA,CAAS;MACjD,MAAM;QAAE,QAAA;QAAU;MAAA,CAAA,GAAiB,eAAA,CAAgB,YAAA,CAAa;MAChE,MAAM,SAAA,GAAY,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,OAAA;MAErD,IAAI,IAAA,GAAO,EAAA;MACX,IAAI,YAAA,GAAe,CAAA;MAEnB,KAAK,MAAM,KAAA,IAAS,YAAA,EAAc;QAChC,MAAM,SAAA,GAAY,eAAA,CAChB,KAAA,EACA,OAAA,EACA,SAAA,EACA,QAAA,EACA,YAAA,EACA,YAAA,CACD;QACD,IAAI,SAAA,KAAc,IAAA,EAAM,OAAO,IAAA;QAC/B,IAAA,IAAQ,SAAA;QACR,YAAA,EAAA;;MAGF,OAAO,IAAA;;;IAIT,SAAS,cAAA,CACP,EAAA,EACA,QAAA,EACe;MACf,MAAM,GAAA,GAAM,UAAA,CAAW,EAAA,CAAG;MAC1B,IAAI,CAAC,GAAA,EAAK,OAAO,IAAA;MAEjB,MAAM,OAAA,GAAU,iBAAA,CAAkB,QAAA,EAAU,iBAAA,CAAkB,EAAA,CAAG,CAAC;MAElE,IAAI,IAAA,GAAO,IAAI,GAAA,GADG,YAAA,CAAa,EAAA,EAAI,OAAA,CAAQ,GACZ;MAE/B,IAAI,EAAA,CAAG,YAAA,CAAa,EAAA,CAAG,EAAE;QACvB,MAAM,SAAA,GAAY,eAAA,CAAgB,EAAA,EAAI,OAAA,EAAS,QAAA,CAAS;QACxD,IAAI,SAAA,KAAc,IAAA,EAAM,OAAO,IAAA;QAC/B,IAAA,IAAQ,SAAA;;MAGV,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,EAAE,IAAA,IAAQ,KAAK,GAAA,GAAI;MAC9C,OAAO,IAAA;;IAGT,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,EAAM,QAAA,CAAS;IAC3C,IAAI,IAAA,KAAS,IAAA,EAAM,OAAO,IAAA;IAE1B,IAAI,mBAAA,EAAqB,yBAAA,GAA4B,IAAA;IACrD,IAAI,qBAAA,EAAuB,2BAAA,GAA8B,IAAA;IAGzD,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,MAAA,CAAO,CAAC,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAM;IAQhE,IAAI,iBAAA,CAAkB,MAAA,GAAS,CAAA,EAAG;MAChC,qBAAA,GAAwB,IAAA;MACxB,MAAM,YAAA,GAAe,QAAA,CAAA,CAAU;MAC/B,MAAM,YAAA,GAAe,iBAAA,CAAkB,IAAA,CAAK,IAAA,CAAK;MACjD,SAAA,CAAU,IAAA,CAAK,SAAS,YAAA,oBAAgC,YAAA,KAAa,CAAK;;IAG5E,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,IAAK,aAAA,CAAc,MAAA,KAAW,CAAA,EACrD,OAAO,SAAS,OAAA,gBAAQ;IAG1B,IAAI,IAAA,GAAO,SAAA,CAAU,GAAA,CAAK,CAAA,IAAM,KAAK,CAAA,EAAA,CAAI,CAAC,IAAA,CAAK,IAAA,CAAK;IACpD,IAAI,aAAA,CAAc,MAAA,GAAS,CAAA,EACzB,IAAA,IAAQ,sBAAsB,aAAA,CAAc,GAAA,CAAK,CAAA,IAAM,GAAG,CAAA,IAAE,CAAI,CAAC,IAAA,CAAK,IAAA,CAAK,IAAC,CAAA,KAE5E,IAAA,IAAQ,iBAAA;IAGV,OAAO,SAAS,OAAA,qBAA4B,IAAA,MAAK;;;EAUnD,SAAS,gBAAA,CACP,KAAA,EACA,GAAA,EACA,UAAA,EACA,OAAA,EACM;IACN,IAAI,EAAA,CAAG,SAAA,CAAU,KAAA,CAAM,EAAE;MACvB,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,EAAA,CAAG,CAAC,IAAA,CAAA,CAAM;MACvD,IAAI,OAAA,EAAS,GAAA,CAAI,IAAA,CAAK;QAAE,IAAA,EAAM,MAAA;QAAQ,IAAA,EAAM;OAAS,CAAC;MACtD;;IAEF,IAAI,EAAA,CAAG,YAAA,CAAa,KAAA,CAAM,IAAI,EAAA,CAAG,uBAAA,CAAwB,KAAA,CAAM,EAAE;MAC/D,GAAA,CAAI,IAAA,CAAK;QAAE,IAAA,EAAM,SAAA;QAAW,IAAA,EAAM,KAAA;QAAO,OAAA,EAAS,UAAA,CAAW,KAAA;OAAS,CAAC;MACvE;;IAEF,IAAI,EAAA,CAAG,eAAA,CAAgB,KAAA,CAAM,EAAE;MAC7B,IAAI,KAAA,CAAM,UAAA,EAAY,GAAA,CAAI,IAAA,CAAK;QAAE,IAAA,EAAM,YAAA;QAAc,UAAA,EAAY,KAAA,CAAM;OAAY,CAAC;MACpF;;IAEF,IAAI,EAAA,CAAG,aAAA,CAAc,KAAA,CAAM,EAAE,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS;;;;;;EAOtD,SAAS,eAAA,CAAgB,QAAA,EAAkD;IACzE,MAAM,QAAA,GAAwB,EAAE;IAChC,MAAM,UAAA,GAAa;MAAE,KAAA,EAAO;IAAA,CAAG;IAE/B,SAAS,WAAA,CAAY,IAAA,EAAuC;MAC1D,KAAK,MAAM,KAAA,IAAS,IAAA,EAAM,gBAAA,CAAiB,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,WAAA,CAAY;;IAGtF,WAAA,CAAY,QAAA,CAAS;IACrB,OAAO,QAAA;;;EAIT,SAAS,eAAA,CAAgB,YAAA,EAGvB;IACA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,CAAM,CAAA,IAAM,CAAA,CAAE,IAAA,KAAS,SAAA,CAAU;IAC9D,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,CAAM,CAAA,IAAM,CAAA,CAAE,IAAA,KAAS,SAAA,CAAU;IACjE,MAAM,SAAA,GAAY,YAAA,CAAa,MAAA,CAAQ,CAAA,IAAM,CAAA,CAAE,IAAA,KAAS,YAAA,CAAa,CAAC,MAAA;IACtE,OAAO;MAAE,QAAA,EAAU,OAAA,IAAW,UAAA;MAAY,YAAA,EAAc,SAAA,GAAY;KAAG;;;EAIzE,SAAS,aAAA,CAAc,IAAA,EAAoC;IACzD,IAAI,CAAC,EAAA,CAAG,cAAA,CAAe,IAAA,CAAK,EAAE,OAAO,KAAA;IACrC,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,GAAG,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,EAAA;IAC3D,IAAI,IAAA,KAAS,KAAA,EAAO,OAAO,IAAA;IAC3B,IAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,EAAE,OAAO,IAAA;IAChC,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,WAAA,CAAY,EAAE,OAAO,KAAA;IACvE,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,UAAA;IAC9B,OAAO,IAAA,GAAO,CAAC,QAAA,CAAS,IAAA,CAAK,GAAG,KAAA;;;EAIlC,SAAS,iBAAA,CAAkB,IAAA,EAAyD;IAClF,IAAI,QAAA,CAAS,IAAA,CAAK,CAAC,IAAA,CAAK,aAAA,CAAc,EAAE,OAAO,IAAA;IAC/C,IAAI,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,EACvB,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAM,CAAA,IAAM,EAAA,CAAG,eAAA,CAAgB,CAAA,CAAE,IAAI,CAAA,CAAE,UAAA,KAAe,KAAA,CAAA,CAAU;IAEvF,OAAO,KAAA;;;EAIT,SAAS,SAAA,CAAU,IAAA,EAA6B;IAC9C,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,EAAE,IAAA,CAAK,MAAA,CAAA,CAAQ,CAAC;;;EAIrD,SAAS,UAAA,CAAW,IAAA,EAAwD;IAC1E,MAAM,GAAA,GAAM,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,GAAG,IAAA,CAAK,cAAA,CAAe,OAAA,GAAU,IAAA,CAAK,OAAA;IACvE,OAAO,EAAA,CAAG,YAAA,CAAa,GAAA,CAAI,GAAG,GAAA,CAAI,IAAA,GAAO,EAAA;;;EAI3C,SAAS,QAAA,CACP,IAAA,EACmC;IACnC,OAAO,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,GACxB,IAAA,CAAK,cAAA,CAAe,UAAA,CAAW,UAAA,GAC/B,IAAA,CAAK,UAAA,CAAW,UAAA;;;AA4BxB,SAAS,WAAA,CAAY,CAAA,EAAoB;EACvC,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,CAAA,CAAA,KAAO,CAAA,CAAE,CAAA,CAAA,EAAI,WAAA,CAAA,CAAa;;;AAIrD,SAAS,iBAAA,CAAkB,IAAA,EAAwB;EACjD,IAAI,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,IAAI,EAAA,CAAG,uBAAA,CAAwB,IAAA,CAAK,IAAI,EAAA,CAAG,aAAA,CAAc,IAAA,CAAK,EACrF,OAAO,IAAA;EACT,OAAO,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,iBAAA,CAAkB,IAAI,KAAA;;AAGrD,SAAS,cAAA,CAAe,CAAA,EAAmB;EACzC,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,OAAA,CAAQ,IAAA,EAAM,QAAA,CAAS;;AAGzD,SAAS,cAAA,CAAe,CAAA,EAAmB;EACzC,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO;;AAOvD,SAAS,eAAA,CAAgB,IAAA,EAA8B;EACrD,IAAI,EAAA,CAAG,uBAAA,CAAwB,IAAA,CAAK,EAClC,OAAO,aAAA,CAAc,IAAA,CAAK,UAAA,CAAW;EAEvC,IAAI,EAAA,CAAG,aAAA,CAAc,IAAA,CAAK,EACxB,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,aAAA,CAAc;EAG3C,OAAO,aAAA,CAAc,IAAA,CAAK,cAAA,CAAe,UAAA,CAAW,IAAI,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,aAAA,CAAc;;AAG5F,SAAS,aAAA,CAAc,KAAA,EAAkC;EACvD,OAAO,KAAA,CAAM,UAAA,CAAW,KAAA,CAAO,IAAA,IAAS;IAEtC,IAAI,CAAC,EAAA,CAAG,cAAA,CAAe,IAAA,CAAK,EAAE,OAAO,KAAA;IAErC,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,IAAA;IAE9B,IAAI,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,WAAA,CAAY,EAAE,OAAO,IAAA;IAEjD,MAAM,IAAA,GAAQ,IAAA,CAAK,WAAA,CAAiC,UAAA;IACpD,OAAO,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,GAAG,IAAA;IAC/B;;AAGJ,SAAS,aAAA,CAAc,KAAA,EAA6B;EAElD,IAAI,EAAA,CAAG,SAAA,CAAU,KAAA,CAAM,EAAE,OAAO,IAAA;EAEhC,IAAI,EAAA,CAAG,uBAAA,CAAwB,KAAA,CAAM,EAAE,OAAO,eAAA,CAAgB,KAAA,CAAM;EACpE,IAAI,EAAA,CAAG,YAAA,CAAa,KAAA,CAAM,EAAE,OAAO,eAAA,CAAgB,KAAA,CAAM;EACzD,IAAI,EAAA,CAAG,aAAA,CAAc,KAAA,CAAM,EAAE,OAAO,eAAA,CAAgB,KAAA,CAAM;EAE1D,MAAM,IAAA,GAAQ,KAAA,CAA2B,UAAA;EACzC,OAAO,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,GAAG,IAAA;;AAKjC,SAAS,QAAA,CAAS,IAAA,EAA8B;EAC9C,OACE,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,IACxB,EAAA,CAAG,gBAAA,CAAiB,IAAA,CAAK,IACzB,EAAA,CAAG,+BAAA,CAAgC,IAAA,CAAK,IACxC,IAAA,CAAK,IAAA,KAAS,EAAA,CAAG,UAAA,CAAW,WAAA,IAC5B,IAAA,CAAK,IAAA,KAAS,EAAA,CAAG,UAAA,CAAW,YAAA,IAC5B,IAAA,CAAK,IAAA,KAAS,EAAA,CAAG,UAAA,CAAW,WAAA,IAC5B,IAAA,CAAK,IAAA,KAAS,EAAA,CAAG,UAAA,CAAW,gBAAA;;AAIhC,SAAS,UAAA,CAAW,IAAA,EAA8B;EAEhD,IAAI,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,IAAI,EAAA,CAAG,oBAAA,CAAqB,IAAA,CAAK,EAAE,OAAO,KAAA;EAEtE,IAAI,QAAA,CAAS,IAAA,CAAK,EAAE,OAAO,KAAA;EAK3B,OAAO,YAAA,CAAa,IAAA,CAAK;;AAG3B,SAAS,YAAA,CAAa,IAAA,EAAwB;EAC5C,IAAI,EAAA,CAAG,gBAAA,CAAiB,IAAA,CAAK,EAAE,OAAO,IAAA;EACtC,IAAI,EAAA,CAAG,0BAAA,CAA2B,IAAA,CAAK,EAAE,OAAO,IAAA;EAEhD,IAAI,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,IAAI,EAAA,CAAG,oBAAA,CAAqB,IAAA,CAAK,EAAE,OAAO,KAAA;EACtE,OAAO,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,YAAA,CAAa,IAAI,KAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.d.ts","names":[],"sources":["../../src/jsx.ts"],"mappings":";;AAqCA;;;;;;;;;;AAWA;;;;;;;;;;
|
|
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
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
|
|
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)
|
|
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 {
|
|
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
|
|
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
|
-
|
|
322
|
-
|
|
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
|
-
|
|
364
|
-
|
|
365
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
}
|
package/src/tests/jsx.test.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
304
|
-
expect(result).toContain("
|
|
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("
|
|
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("
|
|
327
|
-
expect(result).toContain("
|
|
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
|
|
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("
|
|
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("
|
|
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("
|
|
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
|
|
472
|
+
test("generates _bindDirect for reactive class with single signal", () => {
|
|
470
473
|
const result = t("<div class={cls()}><span /></div>")
|
|
471
|
-
expect(result).toContain("
|
|
472
|
-
expect(result).toContain("className
|
|
474
|
+
expect(result).toContain("_bindDirect(cls,")
|
|
475
|
+
expect(result).toContain("className")
|
|
473
476
|
})
|
|
474
477
|
|
|
475
|
-
test("generates
|
|
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("
|
|
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
|
|
489
|
+
test("generates delegated event for common events", () => {
|
|
488
490
|
const result = t("<div><button onClick={handler}>click</button></div>")
|
|
489
|
-
|
|
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("
|
|
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("
|
|
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
|
-
|
|
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("
|
|
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
|
-
|
|
601
|
-
expect(result).toContain("
|
|
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("
|
|
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("
|
|
675
|
+
test("_bindDirect for non-class single-signal dynamic attribute", () => {
|
|
670
676
|
const result = t("<div title={getTitle()}><span /></div>")
|
|
671
|
-
expect(result).toContain("
|
|
672
|
-
expect(result).toContain('setAttribute("title"
|
|
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("
|
|
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("
|
|
809
|
+
expect(result).toContain("_bindText(count,")
|
|
804
810
|
})
|
|
805
811
|
|
|
806
812
|
test("nested fragment with expression containing JSX bails", () => {
|