@reckona/mreact-compiler 0.0.121 → 0.0.122
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/emit-client.js +73 -1
- package/dist/emit-client.js.map +1 -1
- package/package.json +2 -2
- package/src/emit-client.ts +110 -1
package/dist/emit-client.js
CHANGED
|
@@ -33,6 +33,7 @@ function allocateRuntimeHelperNames(ir, specifiers) {
|
|
|
33
33
|
bindProp: "bindProp",
|
|
34
34
|
bindSpreadProps: "bindSpreadProps",
|
|
35
35
|
bindText: "bindText",
|
|
36
|
+
createList: "createList",
|
|
36
37
|
createTemplate: "createTemplate",
|
|
37
38
|
insertDynamic: "insertDynamic",
|
|
38
39
|
};
|
|
@@ -89,6 +90,9 @@ function collectImports(ir) {
|
|
|
89
90
|
}
|
|
90
91
|
}
|
|
91
92
|
});
|
|
93
|
+
if (componentUsesCreateList(component.root)) {
|
|
94
|
+
specifiers.add("createList");
|
|
95
|
+
}
|
|
92
96
|
}
|
|
93
97
|
return [
|
|
94
98
|
{
|
|
@@ -97,6 +101,62 @@ function collectImports(ir) {
|
|
|
97
101
|
},
|
|
98
102
|
];
|
|
99
103
|
}
|
|
104
|
+
function componentUsesCreateList(node) {
|
|
105
|
+
if (node.kind === "conditional" || node.kind === "list") {
|
|
106
|
+
return renderValueNodeUsesCreateList(node);
|
|
107
|
+
}
|
|
108
|
+
if (node.kind === "component") {
|
|
109
|
+
return componentCallUsesCreateList(node);
|
|
110
|
+
}
|
|
111
|
+
return setupUsesCreateList(node);
|
|
112
|
+
}
|
|
113
|
+
function setupUsesCreateList(node) {
|
|
114
|
+
if (node.kind === "component") {
|
|
115
|
+
return componentCallUsesCreateList(node);
|
|
116
|
+
}
|
|
117
|
+
if (node.kind === "list") {
|
|
118
|
+
return renderValueChildrenUseCreateList(node.children);
|
|
119
|
+
}
|
|
120
|
+
if (node.kind === "conditional") {
|
|
121
|
+
return renderValueNodeUsesCreateList(node);
|
|
122
|
+
}
|
|
123
|
+
if (node.kind === "async-boundary") {
|
|
124
|
+
return (renderValueChildrenUseCreateList(node.children) ||
|
|
125
|
+
renderValueChildrenUseCreateList(node.placeholderChildren ?? []) ||
|
|
126
|
+
renderValueChildrenUseCreateList(node.catchChildren ?? []));
|
|
127
|
+
}
|
|
128
|
+
if (node.kind === "element" || node.kind === "fragment") {
|
|
129
|
+
return node.children.some(setupUsesCreateList);
|
|
130
|
+
}
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
function renderValueChildrenUseCreateList(children) {
|
|
134
|
+
return children.some(renderValueNodeUsesCreateList);
|
|
135
|
+
}
|
|
136
|
+
function renderValueNodeUsesCreateList(node) {
|
|
137
|
+
if (node.kind === "list") {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
if (node.kind === "conditional") {
|
|
141
|
+
return (renderValueChildrenUseCreateList(node.whenTrue) ||
|
|
142
|
+
renderValueChildrenUseCreateList(node.whenFalse));
|
|
143
|
+
}
|
|
144
|
+
if (node.kind === "fragment") {
|
|
145
|
+
return renderValueChildrenUseCreateList(node.children);
|
|
146
|
+
}
|
|
147
|
+
if (node.kind === "component") {
|
|
148
|
+
return componentCallUsesCreateList(node);
|
|
149
|
+
}
|
|
150
|
+
if (node.kind === "element") {
|
|
151
|
+
return setupUsesCreateList(node);
|
|
152
|
+
}
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
function componentCallUsesCreateList(node) {
|
|
156
|
+
return (node.props.some((prop) => prop.kind === "render-prop" &&
|
|
157
|
+
renderValueChildrenUseCreateList(prop.children)) ||
|
|
158
|
+
renderValueChildrenUseCreateList(node.children));
|
|
159
|
+
}
|
|
100
160
|
function hasClientReferenceNodes(ir) {
|
|
101
161
|
return ir.components.some((component) => {
|
|
102
162
|
let found = false;
|
|
@@ -444,7 +504,8 @@ function emitNodeRenderValueExpression(node, state) {
|
|
|
444
504
|
}
|
|
445
505
|
if (node.kind === "list") {
|
|
446
506
|
const parameters = emitListParameters(node);
|
|
447
|
-
|
|
507
|
+
const options = emitListOptions(node, parameters);
|
|
508
|
+
return `${state.helperNames.createList}(() => (${node.itemsCode}), ${emitListRenderer(node, parameters, state)}${options})`;
|
|
448
509
|
}
|
|
449
510
|
if (node.kind === "async-boundary") {
|
|
450
511
|
return "null";
|
|
@@ -480,6 +541,17 @@ function emitListRenderer(node, parameters, state) {
|
|
|
480
541
|
}
|
|
481
542
|
return `(${parameters}) => {\n${node.bodyStatements.map((statement) => ` ${statement}`).join("\n")}\n return ${valueExpression};\n }`;
|
|
482
543
|
}
|
|
544
|
+
function emitListOptions(node, parameters) {
|
|
545
|
+
const optionEntries = [];
|
|
546
|
+
if (node.keyCode !== undefined) {
|
|
547
|
+
optionEntries.push(`key: (${parameters}) => (${node.keyCode})`);
|
|
548
|
+
}
|
|
549
|
+
if (node.keyCode !== undefined &&
|
|
550
|
+
listReadsNestedItemObject(node, node.itemName)) {
|
|
551
|
+
optionEntries.push("nestedObjectFallback: true");
|
|
552
|
+
}
|
|
553
|
+
return optionEntries.length === 0 ? "" : `, { ${optionEntries.join(", ")} }`;
|
|
554
|
+
}
|
|
483
555
|
function emitListParameters(node) {
|
|
484
556
|
return [node.itemName, node.indexName, node.arrayName]
|
|
485
557
|
.filter((name) => name !== undefined)
|
package/dist/emit-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit-client.js","sourceRoot":"","sources":["../src/emit-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ComponentPropIr,\n ComponentIr,\n JsxNodeIr,\n ModuleIr,\n} from \"./ir.js\";\nimport type { RuntimeImport } from \"./types.js\";\nimport { escapeHtmlAttribute as escapeHtml } from \"@reckona/mreact-shared/html-escape\";\n\nexport interface EmitResult {\n code: string;\n imports: RuntimeImport[];\n}\n\nexport function emitClient(ir: ModuleIr): EmitResult {\n const imports = collectImports(ir);\n const helperNames = allocateRuntimeHelperNames(ir, imports[0]?.specifiers ?? []);\n const importLine =\n imports[0]?.specifiers.length === 0 ? \"\" : emitRuntimeImportLine(imports, helperNames);\n const userImports = emitUserImports(ir);\n const moduleStatements = emitModuleStatements(ir);\n const moduleAllocator = createNameAllocator([]);\n const clientBoundaryHelperName = hasClientReferenceNodes(ir)\n ? moduleAllocator(\"__mreactClientBoundary\", ir.moduleBindingNames)\n : undefined;\n const clientBoundaryHelper =\n clientBoundaryHelperName === undefined ? \"\" : emitClientBoundaryHelper(clientBoundaryHelperName);\n const components = ir.components\n .map((component) =>\n emitComponent(component, moduleAllocator, helperNames, clientBoundaryHelperName),\n )\n .join(\"\\n\\n\");\n\n return {\n code: `${[importLine, userImports, moduleStatements, clientBoundaryHelper].filter(Boolean).join(\"\\n\")}\\n\\n${components}\\n`,\n imports,\n };\n}\n\ntype RuntimeHelperName =\n | \"bindList\"\n | \"bindEvent\"\n | \"bindProp\"\n | \"bindSpreadProps\"\n | \"bindText\"\n | \"createTemplate\"\n | \"insertDynamic\";\n\ntype RuntimeHelperNames = Record<RuntimeHelperName, string>;\n\nfunction allocateRuntimeHelperNames(\n ir: ModuleIr,\n specifiers: readonly string[],\n): RuntimeHelperNames {\n const allocator = createNameAllocator([\n ...ir.moduleBindingNames,\n ...ir.components.flatMap((component) => [\n component.name,\n component.exportName,\n ...component.bindingNames,\n ]),\n ]);\n const helperNames: RuntimeHelperNames = {\n bindList: \"bindList\",\n bindEvent: \"bindEvent\",\n bindProp: \"bindProp\",\n bindSpreadProps: \"bindSpreadProps\",\n bindText: \"bindText\",\n createTemplate: \"createTemplate\",\n insertDynamic: \"insertDynamic\",\n };\n\n for (const specifier of specifiers) {\n const helper = specifier as RuntimeHelperName;\n\n if (ir.moduleBindingNames.includes(helper)) {\n helperNames[helper] = allocator(`_${helper}`);\n }\n }\n\n return helperNames;\n}\n\nfunction emitRuntimeImportLine(\n imports: RuntimeImport[],\n helperNames: RuntimeHelperNames,\n): string {\n const specifiers = imports[0]?.specifiers ?? [\"createTemplate\"];\n const importedNames = specifiers.map((specifier) => {\n const helper = specifier as RuntimeHelperName;\n const localName = helperNames[helper];\n\n return localName === specifier ? specifier : `${specifier} as ${localName}`;\n });\n\n return `import { ${importedNames.join(\", \")} } from \"@reckona/mreact-reactive-dom\";`;\n}\n\nfunction emitUserImports(ir: ModuleIr): string {\n return ir.components.length === 0 ? \"\" : ir.userImports.join(\"\\n\");\n}\n\nfunction emitModuleStatements(ir: ModuleIr): string {\n return ir.components.length === 0 ? \"\" : ir.moduleStatements.join(\"\\n\");\n}\n\nfunction collectImports(ir: ModuleIr): RuntimeImport[] {\n if (ir.components.length === 0) {\n return [];\n }\n\n const specifiers = new Set<string>([\"createTemplate\"]);\n\n for (const component of ir.components) {\n visit(component.root, (node) => {\n if (node.kind === \"expr\") {\n specifiers.add(\n node.renderMode === \"dynamic\" ? \"insertDynamic\" : \"bindText\",\n );\n }\n\n if (node.kind === \"conditional\") {\n specifiers.add(\"insertDynamic\");\n }\n\n if (node.kind === \"list\") {\n specifiers.add(\"bindList\");\n }\n\n if (node.kind === \"element\") {\n for (const attr of node.attributes) {\n if (attr.kind === \"dynamic-attr\") {\n specifiers.add(\"bindProp\");\n }\n\n if (attr.kind === \"spread-attr\") {\n specifiers.add(\"bindSpreadProps\");\n }\n\n if (attr.kind === \"event\") {\n specifiers.add(\"bindEvent\");\n }\n }\n }\n });\n }\n\n return [\n {\n source: \"@reckona/mreact-reactive-dom\",\n specifiers: Array.from(specifiers).sort(),\n },\n ];\n}\n\nfunction hasClientReferenceNodes(ir: ModuleIr): boolean {\n return ir.components.some((component) => {\n let found = false;\n visit(component.root, (node) => {\n if (\n node.kind === \"component\" &&\n node.clientReference !== undefined &&\n isCompatClientReferenceModuleId(node.clientReference.moduleId)\n ) {\n found = true;\n }\n });\n return found;\n });\n}\n\nfunction emitClientBoundaryHelper(name: string): string {\n return `function ${name}(name, props) {\n const fragment = document.createDocumentFragment();\n const placeholder = document.createElement(\"template\");\n placeholder.setAttribute(\"data-mreact-client-boundary\", name);\n const propsElement = document.createElement(\"script\");\n propsElement.type = \"application/json\";\n propsElement.setAttribute(\"data-mreact-client-boundary-props\", name);\n try {\n propsElement.textContent = JSON.stringify(props ?? {}).replaceAll(\"<\", \"\\\\\\\\u003c\");\n } catch {\n placeholder.setAttribute(\"data-mreact-client-boundary-nonserializable\", \"true\");\n propsElement.textContent = \"{}\";\n }\n fragment.append(placeholder, propsElement);\n return fragment;\n}`;\n}\n\nfunction emitComponent(\n component: ComponentIr,\n moduleAllocator: NameAllocator,\n helperNames: RuntimeHelperNames,\n clientBoundaryHelperName: string | undefined,\n): string {\n const templateName = moduleAllocator(\n \"_tmpl_\" + component.name,\n component.bindingNames,\n );\n const allocator = createNameAllocator([...component.bindingNames, templateName]);\n const body = component.bodyStatements.map((statement) => ` ${statement}`);\n const parameters = component.parameters.join(\", \");\n\n if (component.root.kind === \"component\") {\n const state = { allocateName: allocator, textIndex: 0, helperNames, clientBoundaryHelperName };\n return [\n `${component.exported === false ? \"\" : \"export \"}function ${component.name}(${parameters}) {`,\n ...body,\n ` return ${emitComponentCall(\n component.root.name,\n component.root.props,\n component.root.children,\n state,\n component.root.clientReference === undefined\n ? undefined\n : { moduleId: component.root.clientReference.moduleId, name: component.root.name },\n )};`,\n `}`,\n ].join(\"\\n\");\n }\n\n if (component.root.kind === \"conditional\") {\n const state = { allocateName: allocator, textIndex: 0, helperNames, clientBoundaryHelperName };\n const fragmentName = allocator(\"_fragment\");\n const markerName = allocator(\"_marker\");\n return [\n `${component.exportDefault === true ? \"export default \" : component.exported === false ? \"\" : \"export \"}function ${component.name}(${parameters}) {`,\n ...body,\n ` const ${fragmentName} = document.createDocumentFragment();`,\n ` const ${markerName} = document.createComment(\"\");`,\n ` ${fragmentName}.append(${markerName});`,\n ` ${helperNames.insertDynamic}(${fragmentName}, ${markerName}, () => ${emitNodeRenderValueExpression(component.root, state)});`,\n ` return ${fragmentName};`,\n `}`,\n ].join(\"\\n\");\n }\n\n const fragmentName = allocator(\"_fragment\");\n const rootName = allocator(\"_root\");\n const templateHtml = JSON.stringify(renderStaticHtml(component.root));\n const setup = emitSetup(component.root, rootName, {\n allocateName: allocator,\n textIndex: 0,\n helperNames,\n clientBoundaryHelperName,\n });\n return [\n `const ${templateName} = ${helperNames.createTemplate}(${templateHtml});`,\n `${component.exportDefault === true ? \"export default \" : component.exported === false ? \"\" : \"export \"}function ${component.name}(${parameters}) {`,\n ...body,\n ` const ${fragmentName} = ${templateName}();`,\n component.root.kind === \"fragment\"\n ? ` const ${rootName} = ${fragmentName};`\n : ` const ${rootName} = ${fragmentName}.firstChild;`,\n setup,\n ` return ${rootName};`,\n `}`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction renderStaticHtml(node: JsxNodeIr): string {\n if (node.kind === \"text\") {\n return escapeHtml(node.value);\n }\n\n if (node.kind === \"expr\") {\n return \"<!---->\";\n }\n\n if (node.kind === \"conditional\" || node.kind === \"list\") {\n return \"<!---->\";\n }\n\n if (node.kind === \"fragment\") {\n return node.children.map(renderStaticHtml).join(\"\");\n }\n\n if (node.kind === \"component\") {\n return \"<!---->\";\n }\n\n if (node.kind === \"async-boundary\") {\n return \"<!--mreact-async-boundary-->\";\n }\n\n const attrs = node.attributes\n .filter((attr) => attr.kind === \"static-attr\")\n .map((attr) => ` ${attr.name}=\"${escapeHtml(attr.value)}\"`)\n .join(\"\");\n const children = node.children.map(renderStaticHtml).join(\"\");\n\n return `<${node.tagName}${attrs}>${children}</${node.tagName}>`;\n}\n\ninterface EmitSetupState {\n allocateName: (baseName: string) => string;\n textIndex: number;\n helperNames: RuntimeHelperNames;\n clientBoundaryHelperName?: string | undefined;\n}\n\nfunction emitSetup(\n node: JsxNodeIr,\n path: string,\n state: EmitSetupState,\n): string {\n const lines: string[] = [];\n\n if (\n node.kind !== \"element\" &&\n node.kind !== \"fragment\" &&\n node.kind !== \"component\"\n ) {\n return \"\";\n }\n\n if (node.kind === \"component\") {\n const componentVar = state.allocateName(\"_component\");\n lines.push(\n ` const ${componentVar} = ${emitComponentCall(\n node.name,\n node.props,\n node.children,\n state,\n node.clientReference === undefined\n ? undefined\n : { moduleId: node.clientReference.moduleId, name: node.name },\n )};`,\n );\n lines.push(` if (${componentVar} == null || typeof ${componentVar} === \"boolean\") {`);\n lines.push(` ${path}.remove();`);\n lines.push(` } else {`);\n lines.push(` ${path}.replaceWith(${componentVar});`);\n lines.push(` }`);\n return lines.join(\"\\n\");\n }\n\n if (node.kind === \"element\") {\n for (const attr of node.attributes) {\n if (attr.kind === \"dynamic-attr\") {\n lines.push(\n ` ${state.helperNames.bindProp}(${path}, \"${attr.name}\", () => (${attr.code}));`,\n );\n }\n\n if (attr.kind === \"spread-attr\") {\n lines.push(\n ` ${state.helperNames.bindSpreadProps}(${path}, () => (${attr.code}));`,\n );\n }\n\n if (attr.kind === \"event\") {\n lines.push(\n ` ${state.helperNames.bindEvent}(${path}, \"${attr.eventName}\", ${attr.code});`,\n );\n }\n }\n }\n\n const children = node.children;\n const stableChildrenName = hasLiveChildListMutation(children)\n ? state.allocateName(\"_children\")\n : undefined;\n let childIndex = 0;\n\n if (stableChildrenName !== undefined) {\n lines.push(` const ${stableChildrenName} = Array.from(${path}.childNodes);`);\n }\n\n let sawStaticText = false;\n let sawComponentMutation = false;\n\n for (const child of children) {\n if (child.kind === \"text\") {\n sawStaticText = true;\n childIndex += 1;\n continue;\n }\n\n const childPath =\n stableChildrenName === undefined ||\n (\n child.kind !== \"component\" &&\n !sawComponentMutation &&\n usesLiveInsertionAnchor(child) &&\n !sawStaticText\n )\n ? `${path}.childNodes[${childIndex}]`\n : `${stableChildrenName}[${childIndex}]`;\n\n if (child.kind === \"expr\") {\n if (child.renderMode === \"dynamic\") {\n lines.push(\n ` ${state.helperNames.insertDynamic}(${path}, ${childPath}, () => (${child.code}));`,\n );\n childIndex += 1;\n continue;\n }\n\n const textVar = state.allocateName(`_text_${state.textIndex}`);\n state.textIndex += 1;\n lines.push(` const ${textVar} = document.createTextNode(\"\");`);\n lines.push(` ${childPath}.replaceWith(${textVar});`);\n lines.push(\n ` ${state.helperNames.bindText}(${textVar}, () => (${child.code}));`,\n );\n childIndex += 1;\n continue;\n }\n\n if (child.kind === \"conditional\") {\n lines.push(\n ` ${state.helperNames.insertDynamic}(${path}, ${childPath}, () => ${emitConditionalRenderValueExpression(child, state)});`,\n );\n childIndex += 1;\n continue;\n }\n\n if (child.kind === \"list\") {\n const parameters = emitListParameters(child);\n const optionEntries: string[] = [];\n\n if (child.keyCode !== undefined) {\n optionEntries.push(`key: (${parameters}) => (${child.keyCode})`);\n }\n\n if (\n child.keyCode !== undefined &&\n listReadsNestedItemObject(child, child.itemName)\n ) {\n optionEntries.push(\"nestedObjectFallback: true\");\n }\n\n const options =\n optionEntries.length === 0 ? \"\" : `, { ${optionEntries.join(\", \")} }`;\n lines.push(\n ` ${state.helperNames.bindList}(${path}, ${childPath}, () => (${child.itemsCode}), ${emitListRenderer(child, parameters, state)}${options});`,\n );\n childIndex += 1;\n continue;\n }\n\n if (child.kind === \"async-boundary\") {\n lines.push(emitAsyncBoundarySetup(child, childPath, state));\n childIndex += 1;\n continue;\n }\n\n lines.push(emitSetup(child, childPath, state));\n if (child.kind === \"component\") {\n sawComponentMutation = true;\n }\n childIndex += 1;\n }\n\n return lines.filter(Boolean).join(\"\\n\");\n}\n\nfunction listReadsNestedItemObject(\n node: Extract<JsxNodeIr, { kind: \"list\" }>,\n itemName: string,\n): boolean {\n return node.children.some((child) => nodeReadsNestedItemObject(child, itemName));\n}\n\nfunction nodeReadsNestedItemObject(node: JsxNodeIr, itemName: string): boolean {\n switch (node.kind) {\n case \"element\":\n return (\n codeReadsNestedItemObject(node.keyCode, itemName) ||\n node.attributes.some((attribute) => {\n if (attribute.kind === \"spread-attr\") {\n return codeReadsNestedItemObject(attribute.code, itemName);\n }\n\n if (attribute.kind === \"dynamic-attr\" || attribute.kind === \"event\") {\n return codeReadsNestedItemObject(attribute.code, itemName);\n }\n\n return false;\n }) ||\n node.children.some((child) => nodeReadsNestedItemObject(child, itemName))\n );\n case \"component\":\n return (\n codeReadsNestedItemObject(node.keyCode, itemName) ||\n node.props.some((prop) => {\n if (prop.kind === \"spread-prop\") {\n return codeReadsNestedItemObject(prop.code, itemName);\n }\n\n if (prop.kind === \"render-prop\") {\n return prop.children.some((child) => nodeReadsNestedItemObject(child, itemName));\n }\n\n return codeReadsNestedItemObject(prop.code, itemName);\n }) ||\n node.children.some((child) => nodeReadsNestedItemObject(child, itemName))\n );\n case \"fragment\":\n return (\n node.bodyStatements?.some((statement) =>\n codeReadsNestedItemObject(statement, itemName),\n ) === true ||\n node.children.some((child) => nodeReadsNestedItemObject(child, itemName))\n );\n case \"conditional\":\n return (\n codeReadsNestedItemObject(node.conditionCode, itemName) ||\n node.whenTrue.some((child) => nodeReadsNestedItemObject(child, itemName)) ||\n node.whenFalse.some((child) => nodeReadsNestedItemObject(child, itemName))\n );\n case \"list\":\n return (\n codeReadsNestedItemObject(node.itemsCode, itemName) ||\n codeReadsNestedItemObject(node.keyCode, itemName) ||\n node.children.some((child) => nodeReadsNestedItemObject(child, itemName))\n );\n case \"expr\":\n return codeReadsNestedItemObject(node.code, itemName);\n case \"async-boundary\":\n return (\n codeReadsNestedItemObject(node.valueCode, itemName) ||\n node.children.some((child) => nodeReadsNestedItemObject(child, itemName)) ||\n (node.placeholderChildren?.some((child) =>\n nodeReadsNestedItemObject(child, itemName),\n ) ?? false) ||\n (node.catchChildren?.some((child) =>\n nodeReadsNestedItemObject(child, itemName),\n ) ?? false)\n );\n case \"text\":\n return false;\n }\n}\n\nfunction codeReadsNestedItemObject(\n code: string | undefined,\n itemName: string,\n): boolean {\n if (code === undefined || code.length === 0) {\n return false;\n }\n\n const escapedItemName = itemName.replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\");\n return new RegExp(`\\\\b${escapedItemName}(?:\\\\.[A-Za-z_$][\\\\w$]*){2,}`).test(code);\n}\n\nfunction usesLiveInsertionAnchor(child: JsxNodeIr): boolean {\n return (\n child.kind === \"component\" ||\n (child.kind === \"expr\" && child.renderMode === \"dynamic\") ||\n child.kind === \"conditional\" ||\n child.kind === \"list\" ||\n child.kind === \"async-boundary\"\n );\n}\n\nfunction hasLiveChildListMutation(children: readonly JsxNodeIr[]): boolean {\n return children.some(usesLiveInsertionAnchor);\n}\n\nfunction emitRenderValueExpression(\n children: JsxNodeIr[],\n state: EmitSetupState,\n): string {\n if (children.length === 0) {\n return \"null\";\n }\n\n if (children.length === 1) {\n return emitNodeRenderValueExpression(children[0] as JsxNodeIr, state);\n }\n\n return `[${children\n .map((child) => emitNodeRenderValueExpression(child, state))\n .join(\", \")}]`;\n}\n\nfunction emitAsyncBoundarySetup(\n node: Extract<JsxNodeIr, { kind: \"async-boundary\" }>,\n childPath: string,\n state: EmitSetupState,\n): string {\n // Without a stable id the server has no way to tell the client what it\n // resolved. Leave the placeholder comment in place so the server-rendered\n // subtree (preserved via the hydration marker skip) remains the source of\n // truth. The resolved buttons inside it stay non-interactive in that case.\n if (node.awaitId === undefined) {\n return \"\";\n }\n\n const valueName = node.valueName;\n const renderChildren = emitRenderValueExpression(node.children, state);\n const awaitIdLiteral = JSON.stringify(node.awaitId);\n\n return [\n ` {`,\n ` const _awaitStore = globalThis.__mreactAwaitData;`,\n ` const _awaitEntry = _awaitStore === undefined ? undefined : _awaitStore[${awaitIdLiteral}];`,\n ` if (_awaitEntry !== undefined) {`,\n ` const ${valueName} = _awaitEntry.value;`,\n ` const _resolvedAwaitContent = ${renderChildren};`,\n ` if (_resolvedAwaitContent != null) {`,\n ` ${childPath}.replaceWith(_resolvedAwaitContent);`,\n ` }`,\n ` }`,\n ` }`,\n ].join(\"\\n\");\n}\n\nfunction emitNodeRenderValueExpression(\n node: JsxNodeIr,\n state: EmitSetupState,\n): string {\n if (node.kind === \"text\") {\n return JSON.stringify(node.value);\n }\n\n if (node.kind === \"expr\") {\n return `(${node.code})`;\n }\n\n if (node.kind === \"component\") {\n return emitComponentCall(\n node.name,\n node.props,\n node.children,\n state,\n node.clientReference === undefined\n ? undefined\n : { moduleId: node.clientReference.moduleId, name: node.name },\n );\n }\n\n if (node.kind === \"fragment\") {\n if (node.bodyStatements !== undefined && node.bodyStatements.length > 0) {\n const valueExpression = emitRenderValueExpression(node.children, state);\n\n return [\n \"(() => {\",\n ...node.bodyStatements.map((statement) => ` ${statement}`),\n ` return ${valueExpression};`,\n \"})()\",\n ].join(\"\\n\");\n }\n\n return emitRenderValueExpression(node.children, state);\n }\n\n if (node.kind === \"conditional\") {\n return emitConditionalRenderValueExpression(node, state);\n }\n\n if (node.kind === \"list\") {\n const parameters = emitListParameters(node);\n return `(${node.itemsCode}).map(${emitListRenderer(node, parameters, state)})`;\n }\n\n if (node.kind === \"async-boundary\") {\n return \"null\";\n }\n\n const templateName = state.allocateName(\"_dynamicTemplate\");\n const fragmentName = state.allocateName(\"_dynamicFragment\");\n const rootName = state.allocateName(\"_dynamicRoot\");\n const templateHtml = JSON.stringify(renderStaticHtml(node));\n const setup = emitSetup(node, rootName, state);\n const setupLines = setup === \"\" ? [] : setup.split(\"\\n\");\n\n return [\n \"(() => {\",\n ` const ${templateName} = ${state.helperNames.createTemplate}(${templateHtml});`,\n ` const ${fragmentName} = ${templateName}();`,\n ` const ${rootName} = ${fragmentName}.firstChild;`,\n ...setupLines,\n ` return ${rootName};`,\n \"})()\",\n ].join(\"\\n\");\n}\n\nfunction emitConditionalRenderValueExpression(\n node: Extract<JsxNodeIr, { kind: \"conditional\" }>,\n state: EmitSetupState,\n): string {\n const whenTrue = emitRenderValueExpression(node.whenTrue, state);\n const whenFalse = emitRenderValueExpression(node.whenFalse, state);\n\n if (node.conditionValueName === undefined) {\n return `((${node.conditionCode}) ? ${whenTrue} : ${whenFalse})`;\n }\n\n return `(() => { const ${node.conditionValueName} = (${node.conditionCode}); return ${node.conditionValueName} ? ${whenTrue} : ${whenFalse}; })()`;\n}\n\nfunction emitListRenderer(\n node: Extract<JsxNodeIr, { kind: \"list\" }>,\n parameters: string,\n state: EmitSetupState,\n): string {\n const valueExpression = emitRenderValueExpression(node.children, state);\n\n if (node.bodyStatements === undefined || node.bodyStatements.length === 0) {\n return `(${parameters}) => ${valueExpression}`;\n }\n\n return `(${parameters}) => {\\n${node.bodyStatements.map((statement) => ` ${statement}`).join(\"\\n\")}\\n return ${valueExpression};\\n }`;\n}\n\nfunction emitListParameters(node: Extract<JsxNodeIr, { kind: \"list\" }>): string {\n return [node.itemName, node.indexName, node.arrayName]\n .filter((name): name is string => name !== undefined)\n .join(\", \");\n}\n\nfunction emitComponentCall(\n name: string,\n props: ComponentPropIr[],\n children: JsxNodeIr[],\n state: EmitSetupState,\n clientReference?: { moduleId: string; name: string } | undefined,\n): string {\n if (\n clientReference !== undefined &&\n state.clientBoundaryHelperName !== undefined &&\n isCompatClientReferenceModuleId(clientReference.moduleId)\n ) {\n return `${state.clientBoundaryHelperName}(${JSON.stringify(clientReference.name)}, ${emitPropsObject(props, children, state)})`;\n }\n\n return `${name}(${emitPropsObject(props, children, state)})`;\n}\n\nfunction emitPropsObject(\n props: ComponentPropIr[],\n children: JsxNodeIr[],\n state: EmitSetupState,\n): string {\n const entries = props.map((prop) => {\n if (prop.kind === \"spread-prop\") {\n return `...(${prop.code})`;\n }\n\n if (prop.kind === \"render-prop\") {\n return `${emitPropName(prop.name)}: ${emitRenderValueExpression(prop.children, state)}`;\n }\n\n if (shouldEmitReactiveComponentPropGetter(prop.code)) {\n return `get ${emitGetterPropName(prop.name)}() { return (${prop.code}); }`;\n }\n\n return `${emitPropName(prop.name)}: (${prop.code})`;\n });\n\n if (children.length > 0) {\n entries.push(`children: ${emitRenderValueExpression(children, state)}`);\n }\n\n return `{ ${entries.join(\", \")} }`;\n}\n\nfunction emitPropName(name: string): string {\n return /^[A-Za-z_$][\\w$]*$/.test(name) ? name : JSON.stringify(name);\n}\n\nfunction emitGetterPropName(name: string): string {\n return /^[A-Za-z_$][\\w$]*$/.test(name) ? name : `[${JSON.stringify(name)}]`;\n}\n\nfunction shouldEmitReactiveComponentPropGetter(code: string): boolean {\n if (!/\\.\\s*get\\s*\\(/.test(code)) {\n return false;\n }\n\n return !/^\\s*(?:async\\s*)?(?:function\\b|(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>)/.test(code);\n}\n\nfunction createNameAllocator(\n reservedNames: readonly string[],\n): NameAllocator {\n const usedNames = new Set(reservedNames);\n\n return (baseName: string, extraReservedNames: readonly string[] = []): string => {\n const reservedNames = new Set(extraReservedNames);\n let name = baseName;\n let index = 1;\n\n while (usedNames.has(name) || reservedNames.has(name)) {\n name = `${baseName}$${index}`;\n index += 1;\n }\n\n usedNames.add(name);\n return name;\n };\n}\n\nfunction isCompatClientReferenceModuleId(moduleId: string): boolean {\n return /\\.compat(?:\\.mreact)?(?:\\.[cm]?[jt]sx?)?$/.test(moduleId);\n}\n\ntype NameAllocator = (\n baseName: string,\n extraReservedNames?: readonly string[],\n) => string;\n\nfunction visit(node: JsxNodeIr, fn: (node: JsxNodeIr) => void): void {\n fn(node);\n\n if (node.kind === \"conditional\") {\n for (const child of [...node.whenTrue, ...node.whenFalse]) {\n visit(child, fn);\n }\n }\n\n if (node.kind === \"list\") {\n for (const child of node.children) {\n visit(child, fn);\n }\n }\n\n if (node.kind === \"component\") {\n for (const prop of node.props) {\n if (prop.kind === \"render-prop\") {\n for (const child of prop.children) {\n visit(child, fn);\n }\n }\n }\n\n for (const child of node.children) {\n visit(child, fn);\n }\n }\n\n if (node.kind === \"element\" || node.kind === \"fragment\") {\n for (const child of node.children) {\n visit(child, fn);\n }\n }\n\n // Async-boundary children participate in client-side rendering when the\n // boundary has an awaitId (hydration data path). Traverse them so their\n // runtime imports (bindList / bindText / bindEvent / etc.) are included.\n if (node.kind === \"async-boundary\") {\n for (const child of node.children) {\n visit(child, fn);\n }\n if (node.placeholderChildren !== undefined) {\n for (const child of node.placeholderChildren) {\n visit(child, fn);\n }\n }\n if (node.catchChildren !== undefined) {\n for (const child of node.catchChildren) {\n visit(child, fn);\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"emit-client.js","sourceRoot":"","sources":["../src/emit-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ComponentPropIr,\n ComponentIr,\n JsxNodeIr,\n ModuleIr,\n} from \"./ir.js\";\nimport type { RuntimeImport } from \"./types.js\";\nimport { escapeHtmlAttribute as escapeHtml } from \"@reckona/mreact-shared/html-escape\";\n\nexport interface EmitResult {\n code: string;\n imports: RuntimeImport[];\n}\n\nexport function emitClient(ir: ModuleIr): EmitResult {\n const imports = collectImports(ir);\n const helperNames = allocateRuntimeHelperNames(ir, imports[0]?.specifiers ?? []);\n const importLine =\n imports[0]?.specifiers.length === 0 ? \"\" : emitRuntimeImportLine(imports, helperNames);\n const userImports = emitUserImports(ir);\n const moduleStatements = emitModuleStatements(ir);\n const moduleAllocator = createNameAllocator([]);\n const clientBoundaryHelperName = hasClientReferenceNodes(ir)\n ? moduleAllocator(\"__mreactClientBoundary\", ir.moduleBindingNames)\n : undefined;\n const clientBoundaryHelper =\n clientBoundaryHelperName === undefined ? \"\" : emitClientBoundaryHelper(clientBoundaryHelperName);\n const components = ir.components\n .map((component) =>\n emitComponent(component, moduleAllocator, helperNames, clientBoundaryHelperName),\n )\n .join(\"\\n\\n\");\n\n return {\n code: `${[importLine, userImports, moduleStatements, clientBoundaryHelper].filter(Boolean).join(\"\\n\")}\\n\\n${components}\\n`,\n imports,\n };\n}\n\ntype RuntimeHelperName =\n | \"bindList\"\n | \"bindEvent\"\n | \"bindProp\"\n | \"bindSpreadProps\"\n | \"bindText\"\n | \"createList\"\n | \"createTemplate\"\n | \"insertDynamic\";\n\ntype RuntimeHelperNames = Record<RuntimeHelperName, string>;\n\nfunction allocateRuntimeHelperNames(\n ir: ModuleIr,\n specifiers: readonly string[],\n): RuntimeHelperNames {\n const allocator = createNameAllocator([\n ...ir.moduleBindingNames,\n ...ir.components.flatMap((component) => [\n component.name,\n component.exportName,\n ...component.bindingNames,\n ]),\n ]);\n const helperNames: RuntimeHelperNames = {\n bindList: \"bindList\",\n bindEvent: \"bindEvent\",\n bindProp: \"bindProp\",\n bindSpreadProps: \"bindSpreadProps\",\n bindText: \"bindText\",\n createList: \"createList\",\n createTemplate: \"createTemplate\",\n insertDynamic: \"insertDynamic\",\n };\n\n for (const specifier of specifiers) {\n const helper = specifier as RuntimeHelperName;\n\n if (ir.moduleBindingNames.includes(helper)) {\n helperNames[helper] = allocator(`_${helper}`);\n }\n }\n\n return helperNames;\n}\n\nfunction emitRuntimeImportLine(\n imports: RuntimeImport[],\n helperNames: RuntimeHelperNames,\n): string {\n const specifiers = imports[0]?.specifiers ?? [\"createTemplate\"];\n const importedNames = specifiers.map((specifier) => {\n const helper = specifier as RuntimeHelperName;\n const localName = helperNames[helper];\n\n return localName === specifier ? specifier : `${specifier} as ${localName}`;\n });\n\n return `import { ${importedNames.join(\", \")} } from \"@reckona/mreact-reactive-dom\";`;\n}\n\nfunction emitUserImports(ir: ModuleIr): string {\n return ir.components.length === 0 ? \"\" : ir.userImports.join(\"\\n\");\n}\n\nfunction emitModuleStatements(ir: ModuleIr): string {\n return ir.components.length === 0 ? \"\" : ir.moduleStatements.join(\"\\n\");\n}\n\nfunction collectImports(ir: ModuleIr): RuntimeImport[] {\n if (ir.components.length === 0) {\n return [];\n }\n\n const specifiers = new Set<string>([\"createTemplate\"]);\n\n for (const component of ir.components) {\n visit(component.root, (node) => {\n if (node.kind === \"expr\") {\n specifiers.add(\n node.renderMode === \"dynamic\" ? \"insertDynamic\" : \"bindText\",\n );\n }\n\n if (node.kind === \"conditional\") {\n specifiers.add(\"insertDynamic\");\n }\n\n if (node.kind === \"list\") {\n specifiers.add(\"bindList\");\n }\n\n if (node.kind === \"element\") {\n for (const attr of node.attributes) {\n if (attr.kind === \"dynamic-attr\") {\n specifiers.add(\"bindProp\");\n }\n\n if (attr.kind === \"spread-attr\") {\n specifiers.add(\"bindSpreadProps\");\n }\n\n if (attr.kind === \"event\") {\n specifiers.add(\"bindEvent\");\n }\n }\n }\n });\n\n if (componentUsesCreateList(component.root)) {\n specifiers.add(\"createList\");\n }\n }\n\n return [\n {\n source: \"@reckona/mreact-reactive-dom\",\n specifiers: Array.from(specifiers).sort(),\n },\n ];\n}\n\nfunction componentUsesCreateList(node: JsxNodeIr): boolean {\n if (node.kind === \"conditional\" || node.kind === \"list\") {\n return renderValueNodeUsesCreateList(node);\n }\n\n if (node.kind === \"component\") {\n return componentCallUsesCreateList(node);\n }\n\n return setupUsesCreateList(node);\n}\n\nfunction setupUsesCreateList(node: JsxNodeIr): boolean {\n if (node.kind === \"component\") {\n return componentCallUsesCreateList(node);\n }\n\n if (node.kind === \"list\") {\n return renderValueChildrenUseCreateList(node.children);\n }\n\n if (node.kind === \"conditional\") {\n return renderValueNodeUsesCreateList(node);\n }\n\n if (node.kind === \"async-boundary\") {\n return (\n renderValueChildrenUseCreateList(node.children) ||\n renderValueChildrenUseCreateList(node.placeholderChildren ?? []) ||\n renderValueChildrenUseCreateList(node.catchChildren ?? [])\n );\n }\n\n if (node.kind === \"element\" || node.kind === \"fragment\") {\n return node.children.some(setupUsesCreateList);\n }\n\n return false;\n}\n\nfunction renderValueChildrenUseCreateList(children: readonly JsxNodeIr[]): boolean {\n return children.some(renderValueNodeUsesCreateList);\n}\n\nfunction renderValueNodeUsesCreateList(node: JsxNodeIr): boolean {\n if (node.kind === \"list\") {\n return true;\n }\n\n if (node.kind === \"conditional\") {\n return (\n renderValueChildrenUseCreateList(node.whenTrue) ||\n renderValueChildrenUseCreateList(node.whenFalse)\n );\n }\n\n if (node.kind === \"fragment\") {\n return renderValueChildrenUseCreateList(node.children);\n }\n\n if (node.kind === \"component\") {\n return componentCallUsesCreateList(node);\n }\n\n if (node.kind === \"element\") {\n return setupUsesCreateList(node);\n }\n\n return false;\n}\n\nfunction componentCallUsesCreateList(node: Extract<JsxNodeIr, { kind: \"component\" }>): boolean {\n return (\n node.props.some((prop) =>\n prop.kind === \"render-prop\" &&\n renderValueChildrenUseCreateList(prop.children),\n ) ||\n renderValueChildrenUseCreateList(node.children)\n );\n}\n\nfunction hasClientReferenceNodes(ir: ModuleIr): boolean {\n return ir.components.some((component) => {\n let found = false;\n visit(component.root, (node) => {\n if (\n node.kind === \"component\" &&\n node.clientReference !== undefined &&\n isCompatClientReferenceModuleId(node.clientReference.moduleId)\n ) {\n found = true;\n }\n });\n return found;\n });\n}\n\nfunction emitClientBoundaryHelper(name: string): string {\n return `function ${name}(name, props) {\n const fragment = document.createDocumentFragment();\n const placeholder = document.createElement(\"template\");\n placeholder.setAttribute(\"data-mreact-client-boundary\", name);\n const propsElement = document.createElement(\"script\");\n propsElement.type = \"application/json\";\n propsElement.setAttribute(\"data-mreact-client-boundary-props\", name);\n try {\n propsElement.textContent = JSON.stringify(props ?? {}).replaceAll(\"<\", \"\\\\\\\\u003c\");\n } catch {\n placeholder.setAttribute(\"data-mreact-client-boundary-nonserializable\", \"true\");\n propsElement.textContent = \"{}\";\n }\n fragment.append(placeholder, propsElement);\n return fragment;\n}`;\n}\n\nfunction emitComponent(\n component: ComponentIr,\n moduleAllocator: NameAllocator,\n helperNames: RuntimeHelperNames,\n clientBoundaryHelperName: string | undefined,\n): string {\n const templateName = moduleAllocator(\n \"_tmpl_\" + component.name,\n component.bindingNames,\n );\n const allocator = createNameAllocator([...component.bindingNames, templateName]);\n const body = component.bodyStatements.map((statement) => ` ${statement}`);\n const parameters = component.parameters.join(\", \");\n\n if (component.root.kind === \"component\") {\n const state = { allocateName: allocator, textIndex: 0, helperNames, clientBoundaryHelperName };\n return [\n `${component.exported === false ? \"\" : \"export \"}function ${component.name}(${parameters}) {`,\n ...body,\n ` return ${emitComponentCall(\n component.root.name,\n component.root.props,\n component.root.children,\n state,\n component.root.clientReference === undefined\n ? undefined\n : { moduleId: component.root.clientReference.moduleId, name: component.root.name },\n )};`,\n `}`,\n ].join(\"\\n\");\n }\n\n if (component.root.kind === \"conditional\") {\n const state = { allocateName: allocator, textIndex: 0, helperNames, clientBoundaryHelperName };\n const fragmentName = allocator(\"_fragment\");\n const markerName = allocator(\"_marker\");\n return [\n `${component.exportDefault === true ? \"export default \" : component.exported === false ? \"\" : \"export \"}function ${component.name}(${parameters}) {`,\n ...body,\n ` const ${fragmentName} = document.createDocumentFragment();`,\n ` const ${markerName} = document.createComment(\"\");`,\n ` ${fragmentName}.append(${markerName});`,\n ` ${helperNames.insertDynamic}(${fragmentName}, ${markerName}, () => ${emitNodeRenderValueExpression(component.root, state)});`,\n ` return ${fragmentName};`,\n `}`,\n ].join(\"\\n\");\n }\n\n const fragmentName = allocator(\"_fragment\");\n const rootName = allocator(\"_root\");\n const templateHtml = JSON.stringify(renderStaticHtml(component.root));\n const setup = emitSetup(component.root, rootName, {\n allocateName: allocator,\n textIndex: 0,\n helperNames,\n clientBoundaryHelperName,\n });\n return [\n `const ${templateName} = ${helperNames.createTemplate}(${templateHtml});`,\n `${component.exportDefault === true ? \"export default \" : component.exported === false ? \"\" : \"export \"}function ${component.name}(${parameters}) {`,\n ...body,\n ` const ${fragmentName} = ${templateName}();`,\n component.root.kind === \"fragment\"\n ? ` const ${rootName} = ${fragmentName};`\n : ` const ${rootName} = ${fragmentName}.firstChild;`,\n setup,\n ` return ${rootName};`,\n `}`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction renderStaticHtml(node: JsxNodeIr): string {\n if (node.kind === \"text\") {\n return escapeHtml(node.value);\n }\n\n if (node.kind === \"expr\") {\n return \"<!---->\";\n }\n\n if (node.kind === \"conditional\" || node.kind === \"list\") {\n return \"<!---->\";\n }\n\n if (node.kind === \"fragment\") {\n return node.children.map(renderStaticHtml).join(\"\");\n }\n\n if (node.kind === \"component\") {\n return \"<!---->\";\n }\n\n if (node.kind === \"async-boundary\") {\n return \"<!--mreact-async-boundary-->\";\n }\n\n const attrs = node.attributes\n .filter((attr) => attr.kind === \"static-attr\")\n .map((attr) => ` ${attr.name}=\"${escapeHtml(attr.value)}\"`)\n .join(\"\");\n const children = node.children.map(renderStaticHtml).join(\"\");\n\n return `<${node.tagName}${attrs}>${children}</${node.tagName}>`;\n}\n\ninterface EmitSetupState {\n allocateName: (baseName: string) => string;\n textIndex: number;\n helperNames: RuntimeHelperNames;\n clientBoundaryHelperName?: string | undefined;\n}\n\nfunction emitSetup(\n node: JsxNodeIr,\n path: string,\n state: EmitSetupState,\n): string {\n const lines: string[] = [];\n\n if (\n node.kind !== \"element\" &&\n node.kind !== \"fragment\" &&\n node.kind !== \"component\"\n ) {\n return \"\";\n }\n\n if (node.kind === \"component\") {\n const componentVar = state.allocateName(\"_component\");\n lines.push(\n ` const ${componentVar} = ${emitComponentCall(\n node.name,\n node.props,\n node.children,\n state,\n node.clientReference === undefined\n ? undefined\n : { moduleId: node.clientReference.moduleId, name: node.name },\n )};`,\n );\n lines.push(` if (${componentVar} == null || typeof ${componentVar} === \"boolean\") {`);\n lines.push(` ${path}.remove();`);\n lines.push(` } else {`);\n lines.push(` ${path}.replaceWith(${componentVar});`);\n lines.push(` }`);\n return lines.join(\"\\n\");\n }\n\n if (node.kind === \"element\") {\n for (const attr of node.attributes) {\n if (attr.kind === \"dynamic-attr\") {\n lines.push(\n ` ${state.helperNames.bindProp}(${path}, \"${attr.name}\", () => (${attr.code}));`,\n );\n }\n\n if (attr.kind === \"spread-attr\") {\n lines.push(\n ` ${state.helperNames.bindSpreadProps}(${path}, () => (${attr.code}));`,\n );\n }\n\n if (attr.kind === \"event\") {\n lines.push(\n ` ${state.helperNames.bindEvent}(${path}, \"${attr.eventName}\", ${attr.code});`,\n );\n }\n }\n }\n\n const children = node.children;\n const stableChildrenName = hasLiveChildListMutation(children)\n ? state.allocateName(\"_children\")\n : undefined;\n let childIndex = 0;\n\n if (stableChildrenName !== undefined) {\n lines.push(` const ${stableChildrenName} = Array.from(${path}.childNodes);`);\n }\n\n let sawStaticText = false;\n let sawComponentMutation = false;\n\n for (const child of children) {\n if (child.kind === \"text\") {\n sawStaticText = true;\n childIndex += 1;\n continue;\n }\n\n const childPath =\n stableChildrenName === undefined ||\n (\n child.kind !== \"component\" &&\n !sawComponentMutation &&\n usesLiveInsertionAnchor(child) &&\n !sawStaticText\n )\n ? `${path}.childNodes[${childIndex}]`\n : `${stableChildrenName}[${childIndex}]`;\n\n if (child.kind === \"expr\") {\n if (child.renderMode === \"dynamic\") {\n lines.push(\n ` ${state.helperNames.insertDynamic}(${path}, ${childPath}, () => (${child.code}));`,\n );\n childIndex += 1;\n continue;\n }\n\n const textVar = state.allocateName(`_text_${state.textIndex}`);\n state.textIndex += 1;\n lines.push(` const ${textVar} = document.createTextNode(\"\");`);\n lines.push(` ${childPath}.replaceWith(${textVar});`);\n lines.push(\n ` ${state.helperNames.bindText}(${textVar}, () => (${child.code}));`,\n );\n childIndex += 1;\n continue;\n }\n\n if (child.kind === \"conditional\") {\n lines.push(\n ` ${state.helperNames.insertDynamic}(${path}, ${childPath}, () => ${emitConditionalRenderValueExpression(child, state)});`,\n );\n childIndex += 1;\n continue;\n }\n\n if (child.kind === \"list\") {\n const parameters = emitListParameters(child);\n const optionEntries: string[] = [];\n\n if (child.keyCode !== undefined) {\n optionEntries.push(`key: (${parameters}) => (${child.keyCode})`);\n }\n\n if (\n child.keyCode !== undefined &&\n listReadsNestedItemObject(child, child.itemName)\n ) {\n optionEntries.push(\"nestedObjectFallback: true\");\n }\n\n const options =\n optionEntries.length === 0 ? \"\" : `, { ${optionEntries.join(\", \")} }`;\n lines.push(\n ` ${state.helperNames.bindList}(${path}, ${childPath}, () => (${child.itemsCode}), ${emitListRenderer(child, parameters, state)}${options});`,\n );\n childIndex += 1;\n continue;\n }\n\n if (child.kind === \"async-boundary\") {\n lines.push(emitAsyncBoundarySetup(child, childPath, state));\n childIndex += 1;\n continue;\n }\n\n lines.push(emitSetup(child, childPath, state));\n if (child.kind === \"component\") {\n sawComponentMutation = true;\n }\n childIndex += 1;\n }\n\n return lines.filter(Boolean).join(\"\\n\");\n}\n\nfunction listReadsNestedItemObject(\n node: Extract<JsxNodeIr, { kind: \"list\" }>,\n itemName: string,\n): boolean {\n return node.children.some((child) => nodeReadsNestedItemObject(child, itemName));\n}\n\nfunction nodeReadsNestedItemObject(node: JsxNodeIr, itemName: string): boolean {\n switch (node.kind) {\n case \"element\":\n return (\n codeReadsNestedItemObject(node.keyCode, itemName) ||\n node.attributes.some((attribute) => {\n if (attribute.kind === \"spread-attr\") {\n return codeReadsNestedItemObject(attribute.code, itemName);\n }\n\n if (attribute.kind === \"dynamic-attr\" || attribute.kind === \"event\") {\n return codeReadsNestedItemObject(attribute.code, itemName);\n }\n\n return false;\n }) ||\n node.children.some((child) => nodeReadsNestedItemObject(child, itemName))\n );\n case \"component\":\n return (\n codeReadsNestedItemObject(node.keyCode, itemName) ||\n node.props.some((prop) => {\n if (prop.kind === \"spread-prop\") {\n return codeReadsNestedItemObject(prop.code, itemName);\n }\n\n if (prop.kind === \"render-prop\") {\n return prop.children.some((child) => nodeReadsNestedItemObject(child, itemName));\n }\n\n return codeReadsNestedItemObject(prop.code, itemName);\n }) ||\n node.children.some((child) => nodeReadsNestedItemObject(child, itemName))\n );\n case \"fragment\":\n return (\n node.bodyStatements?.some((statement) =>\n codeReadsNestedItemObject(statement, itemName),\n ) === true ||\n node.children.some((child) => nodeReadsNestedItemObject(child, itemName))\n );\n case \"conditional\":\n return (\n codeReadsNestedItemObject(node.conditionCode, itemName) ||\n node.whenTrue.some((child) => nodeReadsNestedItemObject(child, itemName)) ||\n node.whenFalse.some((child) => nodeReadsNestedItemObject(child, itemName))\n );\n case \"list\":\n return (\n codeReadsNestedItemObject(node.itemsCode, itemName) ||\n codeReadsNestedItemObject(node.keyCode, itemName) ||\n node.children.some((child) => nodeReadsNestedItemObject(child, itemName))\n );\n case \"expr\":\n return codeReadsNestedItemObject(node.code, itemName);\n case \"async-boundary\":\n return (\n codeReadsNestedItemObject(node.valueCode, itemName) ||\n node.children.some((child) => nodeReadsNestedItemObject(child, itemName)) ||\n (node.placeholderChildren?.some((child) =>\n nodeReadsNestedItemObject(child, itemName),\n ) ?? false) ||\n (node.catchChildren?.some((child) =>\n nodeReadsNestedItemObject(child, itemName),\n ) ?? false)\n );\n case \"text\":\n return false;\n }\n}\n\nfunction codeReadsNestedItemObject(\n code: string | undefined,\n itemName: string,\n): boolean {\n if (code === undefined || code.length === 0) {\n return false;\n }\n\n const escapedItemName = itemName.replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\");\n return new RegExp(`\\\\b${escapedItemName}(?:\\\\.[A-Za-z_$][\\\\w$]*){2,}`).test(code);\n}\n\nfunction usesLiveInsertionAnchor(child: JsxNodeIr): boolean {\n return (\n child.kind === \"component\" ||\n (child.kind === \"expr\" && child.renderMode === \"dynamic\") ||\n child.kind === \"conditional\" ||\n child.kind === \"list\" ||\n child.kind === \"async-boundary\"\n );\n}\n\nfunction hasLiveChildListMutation(children: readonly JsxNodeIr[]): boolean {\n return children.some(usesLiveInsertionAnchor);\n}\n\nfunction emitRenderValueExpression(\n children: JsxNodeIr[],\n state: EmitSetupState,\n): string {\n if (children.length === 0) {\n return \"null\";\n }\n\n if (children.length === 1) {\n return emitNodeRenderValueExpression(children[0] as JsxNodeIr, state);\n }\n\n return `[${children\n .map((child) => emitNodeRenderValueExpression(child, state))\n .join(\", \")}]`;\n}\n\nfunction emitAsyncBoundarySetup(\n node: Extract<JsxNodeIr, { kind: \"async-boundary\" }>,\n childPath: string,\n state: EmitSetupState,\n): string {\n // Without a stable id the server has no way to tell the client what it\n // resolved. Leave the placeholder comment in place so the server-rendered\n // subtree (preserved via the hydration marker skip) remains the source of\n // truth. The resolved buttons inside it stay non-interactive in that case.\n if (node.awaitId === undefined) {\n return \"\";\n }\n\n const valueName = node.valueName;\n const renderChildren = emitRenderValueExpression(node.children, state);\n const awaitIdLiteral = JSON.stringify(node.awaitId);\n\n return [\n ` {`,\n ` const _awaitStore = globalThis.__mreactAwaitData;`,\n ` const _awaitEntry = _awaitStore === undefined ? undefined : _awaitStore[${awaitIdLiteral}];`,\n ` if (_awaitEntry !== undefined) {`,\n ` const ${valueName} = _awaitEntry.value;`,\n ` const _resolvedAwaitContent = ${renderChildren};`,\n ` if (_resolvedAwaitContent != null) {`,\n ` ${childPath}.replaceWith(_resolvedAwaitContent);`,\n ` }`,\n ` }`,\n ` }`,\n ].join(\"\\n\");\n}\n\nfunction emitNodeRenderValueExpression(\n node: JsxNodeIr,\n state: EmitSetupState,\n): string {\n if (node.kind === \"text\") {\n return JSON.stringify(node.value);\n }\n\n if (node.kind === \"expr\") {\n return `(${node.code})`;\n }\n\n if (node.kind === \"component\") {\n return emitComponentCall(\n node.name,\n node.props,\n node.children,\n state,\n node.clientReference === undefined\n ? undefined\n : { moduleId: node.clientReference.moduleId, name: node.name },\n );\n }\n\n if (node.kind === \"fragment\") {\n if (node.bodyStatements !== undefined && node.bodyStatements.length > 0) {\n const valueExpression = emitRenderValueExpression(node.children, state);\n\n return [\n \"(() => {\",\n ...node.bodyStatements.map((statement) => ` ${statement}`),\n ` return ${valueExpression};`,\n \"})()\",\n ].join(\"\\n\");\n }\n\n return emitRenderValueExpression(node.children, state);\n }\n\n if (node.kind === \"conditional\") {\n return emitConditionalRenderValueExpression(node, state);\n }\n\n if (node.kind === \"list\") {\n const parameters = emitListParameters(node);\n const options = emitListOptions(node, parameters);\n\n return `${state.helperNames.createList}(() => (${node.itemsCode}), ${emitListRenderer(node, parameters, state)}${options})`;\n }\n\n if (node.kind === \"async-boundary\") {\n return \"null\";\n }\n\n const templateName = state.allocateName(\"_dynamicTemplate\");\n const fragmentName = state.allocateName(\"_dynamicFragment\");\n const rootName = state.allocateName(\"_dynamicRoot\");\n const templateHtml = JSON.stringify(renderStaticHtml(node));\n const setup = emitSetup(node, rootName, state);\n const setupLines = setup === \"\" ? [] : setup.split(\"\\n\");\n\n return [\n \"(() => {\",\n ` const ${templateName} = ${state.helperNames.createTemplate}(${templateHtml});`,\n ` const ${fragmentName} = ${templateName}();`,\n ` const ${rootName} = ${fragmentName}.firstChild;`,\n ...setupLines,\n ` return ${rootName};`,\n \"})()\",\n ].join(\"\\n\");\n}\n\nfunction emitConditionalRenderValueExpression(\n node: Extract<JsxNodeIr, { kind: \"conditional\" }>,\n state: EmitSetupState,\n): string {\n const whenTrue = emitRenderValueExpression(node.whenTrue, state);\n const whenFalse = emitRenderValueExpression(node.whenFalse, state);\n\n if (node.conditionValueName === undefined) {\n return `((${node.conditionCode}) ? ${whenTrue} : ${whenFalse})`;\n }\n\n return `(() => { const ${node.conditionValueName} = (${node.conditionCode}); return ${node.conditionValueName} ? ${whenTrue} : ${whenFalse}; })()`;\n}\n\nfunction emitListRenderer(\n node: Extract<JsxNodeIr, { kind: \"list\" }>,\n parameters: string,\n state: EmitSetupState,\n): string {\n const valueExpression = emitRenderValueExpression(node.children, state);\n\n if (node.bodyStatements === undefined || node.bodyStatements.length === 0) {\n return `(${parameters}) => ${valueExpression}`;\n }\n\n return `(${parameters}) => {\\n${node.bodyStatements.map((statement) => ` ${statement}`).join(\"\\n\")}\\n return ${valueExpression};\\n }`;\n}\n\nfunction emitListOptions(\n node: Extract<JsxNodeIr, { kind: \"list\" }>,\n parameters: string,\n): string {\n const optionEntries: string[] = [];\n\n if (node.keyCode !== undefined) {\n optionEntries.push(`key: (${parameters}) => (${node.keyCode})`);\n }\n\n if (\n node.keyCode !== undefined &&\n listReadsNestedItemObject(node, node.itemName)\n ) {\n optionEntries.push(\"nestedObjectFallback: true\");\n }\n\n return optionEntries.length === 0 ? \"\" : `, { ${optionEntries.join(\", \")} }`;\n}\n\nfunction emitListParameters(node: Extract<JsxNodeIr, { kind: \"list\" }>): string {\n return [node.itemName, node.indexName, node.arrayName]\n .filter((name): name is string => name !== undefined)\n .join(\", \");\n}\n\nfunction emitComponentCall(\n name: string,\n props: ComponentPropIr[],\n children: JsxNodeIr[],\n state: EmitSetupState,\n clientReference?: { moduleId: string; name: string } | undefined,\n): string {\n if (\n clientReference !== undefined &&\n state.clientBoundaryHelperName !== undefined &&\n isCompatClientReferenceModuleId(clientReference.moduleId)\n ) {\n return `${state.clientBoundaryHelperName}(${JSON.stringify(clientReference.name)}, ${emitPropsObject(props, children, state)})`;\n }\n\n return `${name}(${emitPropsObject(props, children, state)})`;\n}\n\nfunction emitPropsObject(\n props: ComponentPropIr[],\n children: JsxNodeIr[],\n state: EmitSetupState,\n): string {\n const entries = props.map((prop) => {\n if (prop.kind === \"spread-prop\") {\n return `...(${prop.code})`;\n }\n\n if (prop.kind === \"render-prop\") {\n return `${emitPropName(prop.name)}: ${emitRenderValueExpression(prop.children, state)}`;\n }\n\n if (shouldEmitReactiveComponentPropGetter(prop.code)) {\n return `get ${emitGetterPropName(prop.name)}() { return (${prop.code}); }`;\n }\n\n return `${emitPropName(prop.name)}: (${prop.code})`;\n });\n\n if (children.length > 0) {\n entries.push(`children: ${emitRenderValueExpression(children, state)}`);\n }\n\n return `{ ${entries.join(\", \")} }`;\n}\n\nfunction emitPropName(name: string): string {\n return /^[A-Za-z_$][\\w$]*$/.test(name) ? name : JSON.stringify(name);\n}\n\nfunction emitGetterPropName(name: string): string {\n return /^[A-Za-z_$][\\w$]*$/.test(name) ? name : `[${JSON.stringify(name)}]`;\n}\n\nfunction shouldEmitReactiveComponentPropGetter(code: string): boolean {\n if (!/\\.\\s*get\\s*\\(/.test(code)) {\n return false;\n }\n\n return !/^\\s*(?:async\\s*)?(?:function\\b|(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>)/.test(code);\n}\n\nfunction createNameAllocator(\n reservedNames: readonly string[],\n): NameAllocator {\n const usedNames = new Set(reservedNames);\n\n return (baseName: string, extraReservedNames: readonly string[] = []): string => {\n const reservedNames = new Set(extraReservedNames);\n let name = baseName;\n let index = 1;\n\n while (usedNames.has(name) || reservedNames.has(name)) {\n name = `${baseName}$${index}`;\n index += 1;\n }\n\n usedNames.add(name);\n return name;\n };\n}\n\nfunction isCompatClientReferenceModuleId(moduleId: string): boolean {\n return /\\.compat(?:\\.mreact)?(?:\\.[cm]?[jt]sx?)?$/.test(moduleId);\n}\n\ntype NameAllocator = (\n baseName: string,\n extraReservedNames?: readonly string[],\n) => string;\n\nfunction visit(node: JsxNodeIr, fn: (node: JsxNodeIr) => void): void {\n fn(node);\n\n if (node.kind === \"conditional\") {\n for (const child of [...node.whenTrue, ...node.whenFalse]) {\n visit(child, fn);\n }\n }\n\n if (node.kind === \"list\") {\n for (const child of node.children) {\n visit(child, fn);\n }\n }\n\n if (node.kind === \"component\") {\n for (const prop of node.props) {\n if (prop.kind === \"render-prop\") {\n for (const child of prop.children) {\n visit(child, fn);\n }\n }\n }\n\n for (const child of node.children) {\n visit(child, fn);\n }\n }\n\n if (node.kind === \"element\" || node.kind === \"fragment\") {\n for (const child of node.children) {\n visit(child, fn);\n }\n }\n\n // Async-boundary children participate in client-side rendering when the\n // boundary has an awaitId (hydration data path). Traverse them so their\n // runtime imports (bindList / bindText / bindEvent / etc.) are included.\n if (node.kind === \"async-boundary\") {\n for (const child of node.children) {\n visit(child, fn);\n }\n if (node.placeholderChildren !== undefined) {\n for (const child of node.placeholderChildren) {\n visit(child, fn);\n }\n }\n if (node.catchChildren !== undefined) {\n for (const child of node.catchChildren) {\n visit(child, fn);\n }\n }\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reckona/mreact-compiler",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.122",
|
|
4
4
|
"description": "Compiler passes and OXC-backed JSX analysis for mreact.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"compiler",
|
|
@@ -50,6 +50,6 @@
|
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"oxc-parser": "0.129.0",
|
|
52
52
|
"oxc-transform": "0.129.0",
|
|
53
|
-
"@reckona/mreact-shared": "0.0.
|
|
53
|
+
"@reckona/mreact-shared": "0.0.122"
|
|
54
54
|
}
|
|
55
55
|
}
|
package/src/emit-client.ts
CHANGED
|
@@ -43,6 +43,7 @@ type RuntimeHelperName =
|
|
|
43
43
|
| "bindProp"
|
|
44
44
|
| "bindSpreadProps"
|
|
45
45
|
| "bindText"
|
|
46
|
+
| "createList"
|
|
46
47
|
| "createTemplate"
|
|
47
48
|
| "insertDynamic";
|
|
48
49
|
|
|
@@ -66,6 +67,7 @@ function allocateRuntimeHelperNames(
|
|
|
66
67
|
bindProp: "bindProp",
|
|
67
68
|
bindSpreadProps: "bindSpreadProps",
|
|
68
69
|
bindText: "bindText",
|
|
70
|
+
createList: "createList",
|
|
69
71
|
createTemplate: "createTemplate",
|
|
70
72
|
insertDynamic: "insertDynamic",
|
|
71
73
|
};
|
|
@@ -143,6 +145,10 @@ function collectImports(ir: ModuleIr): RuntimeImport[] {
|
|
|
143
145
|
}
|
|
144
146
|
}
|
|
145
147
|
});
|
|
148
|
+
|
|
149
|
+
if (componentUsesCreateList(component.root)) {
|
|
150
|
+
specifiers.add("createList");
|
|
151
|
+
}
|
|
146
152
|
}
|
|
147
153
|
|
|
148
154
|
return [
|
|
@@ -153,6 +159,87 @@ function collectImports(ir: ModuleIr): RuntimeImport[] {
|
|
|
153
159
|
];
|
|
154
160
|
}
|
|
155
161
|
|
|
162
|
+
function componentUsesCreateList(node: JsxNodeIr): boolean {
|
|
163
|
+
if (node.kind === "conditional" || node.kind === "list") {
|
|
164
|
+
return renderValueNodeUsesCreateList(node);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (node.kind === "component") {
|
|
168
|
+
return componentCallUsesCreateList(node);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return setupUsesCreateList(node);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function setupUsesCreateList(node: JsxNodeIr): boolean {
|
|
175
|
+
if (node.kind === "component") {
|
|
176
|
+
return componentCallUsesCreateList(node);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (node.kind === "list") {
|
|
180
|
+
return renderValueChildrenUseCreateList(node.children);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (node.kind === "conditional") {
|
|
184
|
+
return renderValueNodeUsesCreateList(node);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (node.kind === "async-boundary") {
|
|
188
|
+
return (
|
|
189
|
+
renderValueChildrenUseCreateList(node.children) ||
|
|
190
|
+
renderValueChildrenUseCreateList(node.placeholderChildren ?? []) ||
|
|
191
|
+
renderValueChildrenUseCreateList(node.catchChildren ?? [])
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (node.kind === "element" || node.kind === "fragment") {
|
|
196
|
+
return node.children.some(setupUsesCreateList);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function renderValueChildrenUseCreateList(children: readonly JsxNodeIr[]): boolean {
|
|
203
|
+
return children.some(renderValueNodeUsesCreateList);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function renderValueNodeUsesCreateList(node: JsxNodeIr): boolean {
|
|
207
|
+
if (node.kind === "list") {
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (node.kind === "conditional") {
|
|
212
|
+
return (
|
|
213
|
+
renderValueChildrenUseCreateList(node.whenTrue) ||
|
|
214
|
+
renderValueChildrenUseCreateList(node.whenFalse)
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
if (node.kind === "fragment") {
|
|
219
|
+
return renderValueChildrenUseCreateList(node.children);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (node.kind === "component") {
|
|
223
|
+
return componentCallUsesCreateList(node);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (node.kind === "element") {
|
|
227
|
+
return setupUsesCreateList(node);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function componentCallUsesCreateList(node: Extract<JsxNodeIr, { kind: "component" }>): boolean {
|
|
234
|
+
return (
|
|
235
|
+
node.props.some((prop) =>
|
|
236
|
+
prop.kind === "render-prop" &&
|
|
237
|
+
renderValueChildrenUseCreateList(prop.children),
|
|
238
|
+
) ||
|
|
239
|
+
renderValueChildrenUseCreateList(node.children)
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
|
|
156
243
|
function hasClientReferenceNodes(ir: ModuleIr): boolean {
|
|
157
244
|
return ir.components.some((component) => {
|
|
158
245
|
let found = false;
|
|
@@ -657,7 +744,9 @@ function emitNodeRenderValueExpression(
|
|
|
657
744
|
|
|
658
745
|
if (node.kind === "list") {
|
|
659
746
|
const parameters = emitListParameters(node);
|
|
660
|
-
|
|
747
|
+
const options = emitListOptions(node, parameters);
|
|
748
|
+
|
|
749
|
+
return `${state.helperNames.createList}(() => (${node.itemsCode}), ${emitListRenderer(node, parameters, state)}${options})`;
|
|
661
750
|
}
|
|
662
751
|
|
|
663
752
|
if (node.kind === "async-boundary") {
|
|
@@ -710,6 +799,26 @@ function emitListRenderer(
|
|
|
710
799
|
return `(${parameters}) => {\n${node.bodyStatements.map((statement) => ` ${statement}`).join("\n")}\n return ${valueExpression};\n }`;
|
|
711
800
|
}
|
|
712
801
|
|
|
802
|
+
function emitListOptions(
|
|
803
|
+
node: Extract<JsxNodeIr, { kind: "list" }>,
|
|
804
|
+
parameters: string,
|
|
805
|
+
): string {
|
|
806
|
+
const optionEntries: string[] = [];
|
|
807
|
+
|
|
808
|
+
if (node.keyCode !== undefined) {
|
|
809
|
+
optionEntries.push(`key: (${parameters}) => (${node.keyCode})`);
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
if (
|
|
813
|
+
node.keyCode !== undefined &&
|
|
814
|
+
listReadsNestedItemObject(node, node.itemName)
|
|
815
|
+
) {
|
|
816
|
+
optionEntries.push("nestedObjectFallback: true");
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
return optionEntries.length === 0 ? "" : `, { ${optionEntries.join(", ")} }`;
|
|
820
|
+
}
|
|
821
|
+
|
|
713
822
|
function emitListParameters(node: Extract<JsxNodeIr, { kind: "list" }>): string {
|
|
714
823
|
return [node.itemName, node.indexName, node.arrayName]
|
|
715
824
|
.filter((name): name is string => name !== undefined)
|