@reckona/mreact-compiler 0.0.120 → 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.
@@ -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
- return `(${node.itemsCode}).map(${emitListRenderer(node, parameters, state)})`;
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)
@@ -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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"emit-server-stream.d.ts","sourceRoot":"","sources":["../src/emit-server-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAMV,QAAQ,EACT,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAwB1F,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACpC,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,MAAM,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACzC,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACvC;AAcD,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,EACZ,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,CAqIxB"}
1
+ {"version":3,"file":"emit-server-stream.d.ts","sourceRoot":"","sources":["../src/emit-server-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAMV,QAAQ,EACT,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAwB1F,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACpC,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,MAAM,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACzC,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACvC;AAcD,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,EACZ,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,CAsIxB"}
@@ -17,9 +17,7 @@ let currentPropChildrenCollectState;
17
17
  export function emitServerStream(ir, options = {}) {
18
18
  const serverBootstrap = options.serverBootstrap ?? "none";
19
19
  const escapeHelperName = allocateHelperName(ir, "_escapeHtml");
20
- const escapeBatchHelperName = options.escape === undefined
21
- ? undefined
22
- : allocateHelperName(ir, "_escapeHtmlBatch");
20
+ const escapeBatchHelperName = options.escape === undefined ? undefined : allocateHelperName(ir, "_escapeHtmlBatch");
23
21
  const asyncBoundaryHelperName = allocateHelperName(ir, "_renderAsyncBoundary");
24
22
  const outOfOrderBoundaryHelperName = allocateHelperName(ir, "_renderOutOfOrderBoundary");
25
23
  const reorderScriptHelperName = allocateHelperName(ir, "_renderOutOfOrderReorderScript");
@@ -101,7 +99,9 @@ export function emitServerStream(ir, options = {}) {
101
99
  .join("\n");
102
100
  const userImports = emitUserImports(ir);
103
101
  const moduleStatements = emitModuleStatements(ir);
104
- const importsBlock = [importLine, escapeImport, userImports, moduleStatements].filter(Boolean).join("\n");
102
+ const importsBlock = [importLine, escapeImport, userImports, moduleStatements]
103
+ .filter(Boolean)
104
+ .join("\n");
105
105
  const needsSpreadAttributesHelper = components.includes(spreadAttributesHelperName);
106
106
  const urlSafeBlock = components.includes(urlSafeHelperName) || needsSpreadAttributesHelper ? urlSafeHelper : "";
107
107
  const clientBoundaryBlock = clientBoundaryHelperName === undefined || !components.includes(clientBoundaryHelperName)
@@ -319,7 +319,11 @@ function emitComponent(component, escapeHelperName, asyncBoundaryHelperName, out
319
319
  const hydrationEndStatements = options.serverHydration === true
320
320
  ? [` ${sinkName}.append(${stringLiteral(`<!--mreact-h:end:${markerId}-->`)});`]
321
321
  : [];
322
- const exportPrefix = component.exportDefault === true ? "export default " : component.exported === false ? "" : "export ";
322
+ const exportPrefix = component.exportDefault === true
323
+ ? "export default "
324
+ : component.exported === false
325
+ ? ""
326
+ : "export ";
323
327
  const asyncPrefix = component.async === true || containsAnyAsyncBoundary(component.root) ? "async " : "";
324
328
  const functionKeyword = `${exportPrefix}${asyncPrefix}function`;
325
329
  return [
@@ -543,9 +547,7 @@ function emitListPart(part, sinkName, compatRenderToStringHelperName, indent) {
543
547
  ].join("\n");
544
548
  }
545
549
  const childLines = syncCoalescedParts === undefined
546
- ? [
547
- emitNestedStreamAppendStatements(coalescedParts, sinkName, compatRenderToStringHelperName),
548
- ]
550
+ ? [emitNestedStreamAppendStatements(coalescedParts, sinkName, compatRenderToStringHelperName)]
549
551
  : syncCoalescedParts.map((child) => emitSyncPartAsAppendStatement(child, sinkName, compatRenderToStringHelperName, innerIndent));
550
552
  return [
551
553
  `${indent}{`,
@@ -591,7 +593,7 @@ function tryEmitPartAsStringExpression(part, compatRenderToStringHelperName) {
591
593
  return `${stringLiteral(`<!--mreact-h:start:${encodeURIComponent(part.hydrationId)}-->`)} + ${rendered} + ${stringLiteral(`<!--mreact-h:end:${encodeURIComponent(part.hydrationId)}-->`)}`;
592
594
  }
593
595
  if (part.kind === "component" && part.hydrationId === undefined) {
594
- return `${part.name}(${emitPropsObject(part.props, part.children, part.escapeHelperName)})`;
596
+ return emitRenderableHtmlExpression(`${part.name}(${emitPropsObject(part.props, part.children, part.escapeHelperName)})`);
595
597
  }
596
598
  // Non-compat component parts require `await sink-write`; lists with
597
599
  // sink-needing children also can't collapse. Signal fallback.
@@ -732,9 +734,7 @@ function collectHtmlParts(node, escapeHelperName, asyncBoundaryHelperName, outOf
732
734
  ...(node.placeholderTagCode === undefined
733
735
  ? {}
734
736
  : { placeholderTagCode: node.placeholderTagCode }),
735
- ...(state.awaitHydration && node.awaitId !== undefined
736
- ? { awaitId: node.awaitId }
737
- : {}),
737
+ ...(state.awaitHydration && node.awaitId !== undefined ? { awaitId: node.awaitId } : {}),
738
738
  ...(node.catchName === undefined || node.catchChildren === undefined
739
739
  ? {}
740
740
  : {
@@ -750,9 +750,7 @@ function collectHtmlParts(node, escapeHelperName, asyncBoundaryHelperName, outOf
750
750
  valueCode: node.valueCode,
751
751
  valueName: node.valueName,
752
752
  parts: node.children.flatMap((child) => collectHtmlParts(child, escapeHelperName, asyncBoundaryHelperName, outOfOrderBoundaryHelperName, reactSuspenseBoundaryHelperName, reactSuspenseOutOfOrderBoundaryHelperName, state)),
753
- ...(state.awaitHydration && node.awaitId !== undefined
754
- ? { awaitId: node.awaitId }
755
- : {}),
753
+ ...(state.awaitHydration && node.awaitId !== undefined ? { awaitId: node.awaitId } : {}),
756
754
  ...(node.catchName === undefined || node.catchChildren === undefined
757
755
  ? {}
758
756
  : {
@@ -826,10 +824,14 @@ function collectHtmlParts(node, escapeHelperName, asyncBoundaryHelperName, outOf
826
824
  if (isClientBoundaryPlaceholder(node, state.hydration)) {
827
825
  const helperName = currentClientBoundaryHelperName;
828
826
  if (helperName !== undefined) {
827
+ const boundaryProps = emitPropsObject(node.props, [], escapeHelperName);
828
+ const fallbackHtml = shouldRenderClientBoundaryFallback(node)
829
+ ? `${node.name}(${boundaryProps})`
830
+ : emitHtmlExpressionFromChildren(node.children, escapeHelperName);
829
831
  return [
830
832
  {
831
833
  kind: "raw-dynamic",
832
- code: `${helperName}(${stringLiteral(node.name)}, ${emitPropsObject(node.props, [], escapeHelperName)}, ${emitHtmlExpressionFromChildren(node.children, escapeHelperName)})`,
834
+ code: `${helperName}(${stringLiteral(node.name)}, ${boundaryProps}, ${fallbackHtml})`,
833
835
  },
834
836
  ];
835
837
  }
@@ -862,9 +864,7 @@ function collectHtmlParts(node, escapeHelperName, asyncBoundaryHelperName, outOf
862
864
  ];
863
865
  }
864
866
  const attributeScan = scanElementAttributes(node.tagName, node.attributes);
865
- const childSelectedValueCode = node.tagName === "select"
866
- ? attributeScan.formValueAttributeCode
867
- : undefined;
867
+ const childSelectedValueCode = node.tagName === "select" ? attributeScan.formValueAttributeCode : undefined;
868
868
  const childState = childSelectedValueCode === undefined
869
869
  ? state
870
870
  : { ...state, selectedValueCode: childSelectedValueCode };
@@ -872,10 +872,10 @@ function collectHtmlParts(node, escapeHelperName, asyncBoundaryHelperName, outOf
872
872
  const dangerousInnerHtml = emitDangerouslySetInnerHtmlPart(node.attributes);
873
873
  const childrenParts = dangerousInnerHtml !== undefined
874
874
  ? [dangerousInnerHtml]
875
- : (childState.selectedValueCode === undefined
875
+ : ((childState.selectedValueCode === undefined
876
876
  ? collectBatchedSimpleChildrenParts(node.children, state.escapeBatchHelperName)
877
877
  : undefined) ??
878
- node.children.flatMap((child) => collectHtmlParts(child, escapeHelperName, asyncBoundaryHelperName, outOfOrderBoundaryHelperName, reactSuspenseBoundaryHelperName, reactSuspenseOutOfOrderBoundaryHelperName, childState));
878
+ node.children.flatMap((child) => collectHtmlParts(child, escapeHelperName, asyncBoundaryHelperName, outOfOrderBoundaryHelperName, reactSuspenseBoundaryHelperName, reactSuspenseOutOfOrderBoundaryHelperName, childState)));
879
879
  return [
880
880
  { kind: "static", value: `<${node.tagName}` },
881
881
  ...collectElementAttributeParts(node.tagName, node.attributes, escapeHelperName, state, attributeScan),
@@ -945,14 +945,19 @@ function collectHtmlAttributeParts(tagName, attr, escapeHelperName, escapeBatchH
945
945
  return [];
946
946
  }
947
947
  if (attr.name === "style") {
948
- return [{ kind: "raw-dynamic", code: emitDynamicStyleAttributeExpression(attr.code, escapeHelperName, escapeBatchHelperName) }];
948
+ return [
949
+ {
950
+ kind: "raw-dynamic",
951
+ code: emitDynamicStyleAttributeExpression(attr.code, escapeHelperName, escapeBatchHelperName),
952
+ },
953
+ ];
949
954
  }
950
955
  const dynamicHtmlName = htmlAttributeNameForElement(tagName, attr.name);
951
956
  if (isDangerousHtmlAttribute(dynamicHtmlName)) {
952
957
  return [
953
958
  {
954
959
  kind: "raw-dynamic",
955
- code: `(() => { const _value = (${attr.code}); if (_value == null || _value === false) return ""; if (typeof _value === "object" && _value !== null && typeof _value.__html === "string") return ${stringLiteral(` ${dynamicHtmlName}="`)} + ${escapeHelperName}(_value.__html) + ${stringLiteral("\"")}; return ""; })()`,
960
+ code: `(() => { const _value = (${attr.code}); if (_value == null || _value === false) return ""; if (typeof _value === "object" && _value !== null && typeof _value.__html === "string") return ${stringLiteral(` ${dynamicHtmlName}="`)} + ${escapeHelperName}(_value.__html) + ${stringLiteral('"')}; return ""; })()`,
956
961
  },
957
962
  ];
958
963
  }
@@ -1023,8 +1028,7 @@ function scanElementAttributes(tagName, attrs) {
1023
1028
  if ((tagName === "textarea" || tagName === "select") && attr.name === "value") {
1024
1029
  valueAttributeCode = readFormValueAttributeCode(attr);
1025
1030
  }
1026
- else if ((tagName === "textarea" || tagName === "select") &&
1027
- attr.name === "defaultValue") {
1031
+ else if ((tagName === "textarea" || tagName === "select") && attr.name === "defaultValue") {
1028
1032
  defaultValueAttributeCode = readFormValueAttributeCode(attr);
1029
1033
  }
1030
1034
  }
@@ -1042,14 +1046,14 @@ function readFormValueAttributeCode(attr) {
1042
1046
  }
1043
1047
  function emitDynamicAttributeExpression(name, code, escapeHelperName) {
1044
1048
  if (isUrlAttribute(name)) {
1045
- return `(() => { const _value = (${code}); if (_value == null || _value === false) return ""; const _checked = ${currentUrlSafeHelperName}(${stringLiteral(name)}, _value === true ? "" : _value); return _checked === undefined ? "" : ${stringLiteral(` ${name}="`)} + ${escapeHelperName}(_checked) + ${stringLiteral("\"")}; })()`;
1049
+ return `(() => { const _value = (${code}); if (_value == null || _value === false) return ""; const _checked = ${currentUrlSafeHelperName}(${stringLiteral(name)}, _value === true ? "" : _value); return _checked === undefined ? "" : ${stringLiteral(` ${name}="`)} + ${escapeHelperName}(_checked) + ${stringLiteral('"')}; })()`;
1046
1050
  }
1047
1051
  const inlineExpr = simpleSideEffectFreeExpression(code);
1048
1052
  if (inlineExpr !== undefined) {
1049
1053
  // Inline 3 evaluations to avoid per-attribute IIFE closure allocation.
1050
- return `(${inlineExpr} == null || ${inlineExpr} === false ? "" : ${stringLiteral(` ${name}="`)} + ${escapeHelperName}(${inlineExpr} === true ? "" : ${inlineExpr}) + ${stringLiteral("\"")})`;
1054
+ return `(${inlineExpr} == null || ${inlineExpr} === false ? "" : ${stringLiteral(` ${name}="`)} + ${escapeHelperName}(${inlineExpr} === true ? "" : ${inlineExpr}) + ${stringLiteral('"')})`;
1051
1055
  }
1052
- return `(() => { const _value = (${code}); return _value == null || _value === false ? "" : ${stringLiteral(` ${name}="`)} + ${escapeHelperName}(_value === true ? "" : _value) + ${stringLiteral("\"")}; })()`;
1056
+ return `(() => { const _value = (${code}); return _value == null || _value === false ? "" : ${stringLiteral(` ${name}="`)} + ${escapeHelperName}(_value === true ? "" : _value) + ${stringLiteral('"')}; })()`;
1053
1057
  }
1054
1058
  function emitDynamicStyleAttributeExpression(code, escapeHelperName, escapeBatchHelperName) {
1055
1059
  const staticStyleExpression = emitStaticStyleObjectAttributeExpression(code, escapeHelperName);
@@ -1059,7 +1063,7 @@ function emitDynamicStyleAttributeExpression(code, escapeHelperName, escapeBatch
1059
1063
  const escapedPair = escapeBatchHelperName === undefined
1060
1064
  ? `${escapeHelperName}(_cssName) + ":" + ${escapeHelperName}(_styleValue === true ? "" : _styleValue)`
1061
1065
  : `(() => { const _escaped = ${escapeBatchHelperName}([_cssName, _styleValue === true ? "" : _styleValue]); return _escaped[0] + ":" + _escaped[1]; })()`;
1062
- return `(() => { const _value = (${code}); if (_value == null || _value === false) return ""; if (typeof _value === "string") { const _style = ${escapeHelperName}(_value); return _style === "" ? "" : ${stringLiteral(" style=\"")} + _style + ${stringLiteral("\"")}; } const _style = Object.entries(_value).filter(([, _styleValue]) => _styleValue != null && _styleValue !== false).map(([_styleName, _styleValue]) => { const _cssName = String(_styleName).startsWith("--") ? String(_styleName) : String(_styleName).replace(/[A-Z]/g, (_char) => "-" + _char.toLowerCase()); return ${escapedPair}; }).join(";"); return _style === "" ? "" : ${stringLiteral(" style=\"")} + _style + ${stringLiteral("\"")}; })()`;
1066
+ return `(() => { const _value = (${code}); if (_value == null || _value === false) return ""; if (typeof _value === "string") { const _style = ${escapeHelperName}(_value); return _style === "" ? "" : ${stringLiteral(' style="')} + _style + ${stringLiteral('"')}; } const _style = Object.entries(_value).filter(([, _styleValue]) => _styleValue != null && _styleValue !== false).map(([_styleName, _styleValue]) => { const _cssName = String(_styleName).startsWith("--") ? String(_styleName) : String(_styleName).replace(/[A-Z]/g, (_char) => "-" + _char.toLowerCase()); return ${escapedPair}; }).join(";"); return _style === "" ? "" : ${stringLiteral(' style="')} + _style + ${stringLiteral('"')}; })()`;
1063
1067
  }
1064
1068
  function emitStaticStyleObjectAttributeExpression(code, escapeHelperName) {
1065
1069
  const entries = parseStaticStyleObjectLiteral(code);
@@ -1083,7 +1087,7 @@ function emitStaticStyleObjectAttributeExpression(code, escapeHelperName) {
1083
1087
  return stringLiteral(` style="${parts.join(";")}"`);
1084
1088
  }
1085
1089
  const statements = entries.map((entry) => `{ const _v = (${entry.valueCode}); if (_v != null && _v !== false) _style += (_style === "" ? "" : ";") + ${stringLiteral(`${entry.cssName}:`)} + ${escapeHelperName}(_v === true ? "" : _v); }`);
1086
- return `(() => { let _style = ""; ${statements.join(" ")} return _style === "" ? "" : ${stringLiteral(" style=\"")} + _style + ${stringLiteral("\"")}; })()`;
1090
+ return `(() => { let _style = ""; ${statements.join(" ")} return _style === "" ? "" : ${stringLiteral(' style="')} + _style + ${stringLiteral('"')}; })()`;
1087
1091
  }
1088
1092
  function collectTextareaValueParts(node, escapeHelperName, asyncBoundaryHelperName, outOfOrderBoundaryHelperName, reactSuspenseBoundaryHelperName, reactSuspenseOutOfOrderBoundaryHelperName, state, attributeScan = scanElementAttributes(node.tagName, node.attributes)) {
1089
1093
  const valueCode = attributeScan.formValueAttributeCode;
@@ -1108,7 +1112,9 @@ function collectOptionSelectedAttributePart(node, selectedValueCode) {
1108
1112
  function findOptionValueCode(node) {
1109
1113
  const valueAttr = node.attributes.find((attr) => attr.kind !== "spread-attr" && attr.name === "value");
1110
1114
  if (valueAttr !== undefined && valueAttr.kind !== "event" && valueAttr.kind !== "spread-attr") {
1111
- return valueAttr.kind === "static-attr" ? stringLiteral(valueAttr.value) : `(${valueAttr.code})`;
1115
+ return valueAttr.kind === "static-attr"
1116
+ ? stringLiteral(valueAttr.value)
1117
+ : `(${valueAttr.code})`;
1112
1118
  }
1113
1119
  return node.children.every((child) => child.kind === "text")
1114
1120
  ? stringLiteral(node.children.map((child) => child.value).join(""))
@@ -1247,7 +1253,9 @@ function collectBatchedSimpleChildrenParts(children, escapeBatchHelperName) {
1247
1253
  return undefined;
1248
1254
  }
1249
1255
  if (children.some((child) => child.kind !== "text" &&
1250
- !(child.kind === "expr" && child.renderMode !== "html" && child.renderMode !== "react-node"))) {
1256
+ !(child.kind === "expr" &&
1257
+ child.renderMode !== "html" &&
1258
+ child.renderMode !== "react-node"))) {
1251
1259
  return undefined;
1252
1260
  }
1253
1261
  const values = dynamicChildren.map((child) => child.code);
@@ -1278,7 +1286,7 @@ function emitHtmlExpressionFromChildren(children, escapeHelperName) {
1278
1286
  nextFragmentId: 0,
1279
1287
  }));
1280
1288
  const expressions = parts.map((part) => isHtmlSyncPart(part)
1281
- ? tryEmitPartAsStringExpression(part, currentCompatRenderToStringHelperName) ?? '""'
1289
+ ? (tryEmitPartAsStringExpression(part, currentCompatRenderToStringHelperName) ?? '""')
1282
1290
  : '""');
1283
1291
  return expressions.length === 0 ? '""' : expressions.join(" + ");
1284
1292
  }
@@ -1557,7 +1565,14 @@ function isClientBoundaryPlaceholder(node, serverHydration = true) {
1557
1565
  return node.clientReference !== undefined && (!serverHydration || !isCompatClientReference(node));
1558
1566
  }
1559
1567
  function isCompatClientReference(node) {
1560
- return node.clientReference !== undefined && /\.(?:compat)\.[cm]?[jt]sx?$/.test(node.clientReference.moduleId);
1568
+ return (node.clientReference !== undefined &&
1569
+ /\.(?:compat)\.[cm]?[jt]sx?$/.test(node.clientReference.moduleId));
1570
+ }
1571
+ function emitRenderableHtmlExpression(code) {
1572
+ return `((_value) => _value == null || typeof _value === "boolean" ? "" : _value)(${code})`;
1573
+ }
1574
+ function shouldRenderClientBoundaryFallback(node) {
1575
+ return node.clientReference?.ssrFallback === true;
1561
1576
  }
1562
1577
  function clientBoundaryPlaceholder(node) {
1563
1578
  return `<!--mreact-client-boundary:${escapeHtml(node.name)}-->`;