@reckona/mreact-compiler 0.0.82 → 0.0.84

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,43 @@
1
+ export type NestedAppendEmitter<Part> = (parts: readonly Part[], sinkName: string, compatRenderToStringHelperName: string) => string;
2
+ export interface BoundaryLoweringContext<Part> {
3
+ compatRenderToStringHelperName: string;
4
+ emitNestedAppendStatements: NestedAppendEmitter<Part>;
5
+ sinkName: string;
6
+ }
7
+ export interface AsyncBoundaryPart<Part> {
8
+ awaitId?: string;
9
+ catchName?: string;
10
+ catchParts?: readonly Part[];
11
+ parts: readonly Part[];
12
+ valueCode: string;
13
+ valueName: string;
14
+ }
15
+ export interface OutOfOrderBoundaryPart<Part> extends AsyncBoundaryPart<Part> {
16
+ id: string;
17
+ hydration: boolean;
18
+ placeholderParts: readonly Part[];
19
+ placeholderTagCode?: string;
20
+ }
21
+ export interface ReactSuspenseBoundaryPart<Part> {
22
+ parts: readonly Part[];
23
+ }
24
+ export interface ReactSuspenseOutOfOrderBoundaryPart<Part> extends AsyncBoundaryPart<Part> {
25
+ boundaryId: string;
26
+ fallbackParts: readonly Part[];
27
+ nonce?: string;
28
+ scriptSrc?: string;
29
+ segmentId: string;
30
+ }
31
+ export declare function emitAsyncBoundary<Part>(part: AsyncBoundaryPart<Part>, context: BoundaryLoweringContext<Part> & {
32
+ asyncBoundaryHelperName: string;
33
+ }): string;
34
+ export declare function emitOutOfOrderBoundary<Part>(part: OutOfOrderBoundaryPart<Part>, context: BoundaryLoweringContext<Part> & {
35
+ outOfOrderBoundaryHelperName: string;
36
+ }): string;
37
+ export declare function emitReactSuspenseBoundary<Part>(part: ReactSuspenseBoundaryPart<Part>, context: BoundaryLoweringContext<Part> & {
38
+ reactSuspenseBoundaryHelperName: string;
39
+ }): string;
40
+ export declare function emitReactSuspenseOutOfOrderBoundary<Part>(part: ReactSuspenseOutOfOrderBoundaryPart<Part>, context: BoundaryLoweringContext<Part> & {
41
+ reactSuspenseOutOfOrderBoundaryHelperName: string;
42
+ }): string;
43
+ //# sourceMappingURL=emit-boundary-lowering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-boundary-lowering.d.ts","sourceRoot":"","sources":["../src/emit-boundary-lowering.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,CAAC,IAAI,IAAI,CACtC,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,QAAQ,EAAE,MAAM,EAChB,8BAA8B,EAAE,MAAM,KACnC,MAAM,CAAC;AAEZ,MAAM,WAAW,uBAAuB,CAAC,IAAI;IAC3C,8BAA8B,EAAE,MAAM,CAAC;IACvC,0BAA0B,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACtD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB,CAAC,IAAI;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IAC7B,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB,CAAC,IAAI,CAAE,SAAQ,iBAAiB,CAAC,IAAI,CAAC;IAC3E,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,SAAS,IAAI,EAAE,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB,CAAC,IAAI;IAC7C,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,mCAAmC,CAAC,IAAI,CAAE,SAAQ,iBAAiB,CAAC,IAAI,CAAC;IACxF,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,SAAS,IAAI,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EACpC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAC7B,OAAO,EAAE,uBAAuB,CAAC,IAAI,CAAC,GAAG;IACvC,uBAAuB,EAAE,MAAM,CAAC;CACjC,GACA,MAAM,CAwBR;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EACzC,IAAI,EAAE,sBAAsB,CAAC,IAAI,CAAC,EAClC,OAAO,EAAE,uBAAuB,CAAC,IAAI,CAAC,GAAG;IACvC,4BAA4B,EAAE,MAAM,CAAC;CACtC,GACA,MAAM,CA6BR;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAC5C,IAAI,EAAE,yBAAyB,CAAC,IAAI,CAAC,EACrC,OAAO,EAAE,uBAAuB,CAAC,IAAI,CAAC,GAAG;IACvC,+BAA+B,EAAE,MAAM,CAAC;CACzC,GACA,MAAM,CAUR;AAED,wBAAgB,mCAAmC,CAAC,IAAI,EACtD,IAAI,EAAE,mCAAmC,CAAC,IAAI,CAAC,EAC/C,OAAO,EAAE,uBAAuB,CAAC,IAAI,CAAC,GAAG;IACvC,yCAAyC,EAAE,MAAM,CAAC;CACnD,GACA,MAAM,CAmCR"}
@@ -0,0 +1,63 @@
1
+ export function emitAsyncBoundary(part, context) {
2
+ const optionFields = [];
3
+ if (part.catchName !== undefined && part.catchParts !== undefined) {
4
+ optionFields.push(`catch: (${context.sinkName}, ${part.catchName}) => {\n${context.emitNestedAppendStatements(part.catchParts, context.sinkName, context.compatRenderToStringHelperName)}\n }`);
5
+ }
6
+ if (part.awaitId !== undefined) {
7
+ optionFields.push(`hydrationAwaitId: ${JSON.stringify(part.awaitId)}`);
8
+ }
9
+ const optionsExpression = optionFields.length === 0 ? "" : `, { ${optionFields.join(", ")} }`;
10
+ return [
11
+ ` await ${context.asyncBoundaryHelperName}(${context.sinkName}, (${part.valueCode}), async (${context.sinkName}, ${part.valueName}) => {`,
12
+ context.emitNestedAppendStatements(part.parts, context.sinkName, context.compatRenderToStringHelperName),
13
+ ` }${optionsExpression});`,
14
+ ].join("\n");
15
+ }
16
+ export function emitOutOfOrderBoundary(part, context) {
17
+ const catchOption = part.catchName === undefined || part.catchParts === undefined
18
+ ? ""
19
+ : `,\n catch: (${context.sinkName}, ${part.catchName}) => {\n${context.emitNestedAppendStatements(part.catchParts, context.sinkName, context.compatRenderToStringHelperName)}\n }`;
20
+ const hydrationAwaitIdOption = part.awaitId === undefined ? "" : `,\n hydrationAwaitId: ${JSON.stringify(part.awaitId)}`;
21
+ const placeholderTagOption = part.placeholderTagCode === undefined ? "" : `,\n placeholderTag: (${part.placeholderTagCode})`;
22
+ return [
23
+ ` ${context.outOfOrderBoundaryHelperName}(${context.sinkName}, ${JSON.stringify(part.id)}, (${part.valueCode}), async (${context.sinkName}, ${part.valueName}) => {`,
24
+ context.emitNestedAppendStatements(part.parts, context.sinkName, context.compatRenderToStringHelperName),
25
+ ` }, {`,
26
+ ...(part.hydration ? [` hydration: true,`] : []),
27
+ ` placeholder: (${context.sinkName}) => {`,
28
+ context.emitNestedAppendStatements(part.placeholderParts, context.sinkName, context.compatRenderToStringHelperName),
29
+ ` }${catchOption}${hydrationAwaitIdOption}${placeholderTagOption}`,
30
+ ` });`,
31
+ ].join("\n");
32
+ }
33
+ export function emitReactSuspenseBoundary(part, context) {
34
+ return [
35
+ ` await ${context.reactSuspenseBoundaryHelperName}(${context.sinkName}, async (${context.sinkName}) => {`,
36
+ context.emitNestedAppendStatements(part.parts, context.sinkName, context.compatRenderToStringHelperName),
37
+ ` });`,
38
+ ].join("\n");
39
+ }
40
+ export function emitReactSuspenseOutOfOrderBoundary(part, context) {
41
+ const options = [
42
+ ` fallback: (${context.sinkName}) => {`,
43
+ context.emitNestedAppendStatements(part.fallbackParts, context.sinkName, context.compatRenderToStringHelperName),
44
+ ` },`,
45
+ ...(part.catchName === undefined || part.catchParts === undefined
46
+ ? []
47
+ : [
48
+ ` catch: (${context.sinkName}, ${part.catchName}) => {`,
49
+ context.emitNestedAppendStatements(part.catchParts, context.sinkName, context.compatRenderToStringHelperName),
50
+ ` },`,
51
+ ]),
52
+ ...(part.nonce === undefined ? [] : [` nonce: ${JSON.stringify(part.nonce)},`]),
53
+ ...(part.scriptSrc === undefined ? [] : [` src: ${JSON.stringify(part.scriptSrc)},`]),
54
+ ];
55
+ return [
56
+ ` ${context.reactSuspenseOutOfOrderBoundaryHelperName}(${context.sinkName}, ${JSON.stringify(part.boundaryId)}, ${JSON.stringify(part.segmentId)}, (${part.valueCode}), async (${context.sinkName}, ${part.valueName}) => {`,
57
+ context.emitNestedAppendStatements(part.parts, context.sinkName, context.compatRenderToStringHelperName),
58
+ ` }, {`,
59
+ ...options,
60
+ ` });`,
61
+ ].join("\n");
62
+ }
63
+ //# sourceMappingURL=emit-boundary-lowering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-boundary-lowering.js","sourceRoot":"","sources":["../src/emit-boundary-lowering.ts"],"names":[],"mappings":"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","sourcesContent":["export type NestedAppendEmitter<Part> = (\n parts: readonly Part[],\n sinkName: string,\n compatRenderToStringHelperName: string,\n) => string;\n\nexport interface BoundaryLoweringContext<Part> {\n compatRenderToStringHelperName: string;\n emitNestedAppendStatements: NestedAppendEmitter<Part>;\n sinkName: string;\n}\n\nexport interface AsyncBoundaryPart<Part> {\n awaitId?: string;\n catchName?: string;\n catchParts?: readonly Part[];\n parts: readonly Part[];\n valueCode: string;\n valueName: string;\n}\n\nexport interface OutOfOrderBoundaryPart<Part> extends AsyncBoundaryPart<Part> {\n id: string;\n hydration: boolean;\n placeholderParts: readonly Part[];\n placeholderTagCode?: string;\n}\n\nexport interface ReactSuspenseBoundaryPart<Part> {\n parts: readonly Part[];\n}\n\nexport interface ReactSuspenseOutOfOrderBoundaryPart<Part> extends AsyncBoundaryPart<Part> {\n boundaryId: string;\n fallbackParts: readonly Part[];\n nonce?: string;\n scriptSrc?: string;\n segmentId: string;\n}\n\nexport function emitAsyncBoundary<Part>(\n part: AsyncBoundaryPart<Part>,\n context: BoundaryLoweringContext<Part> & {\n asyncBoundaryHelperName: string;\n },\n): string {\n const optionFields: string[] = [];\n\n if (part.catchName !== undefined && part.catchParts !== undefined) {\n optionFields.push(\n `catch: (${context.sinkName}, ${part.catchName}) => {\\n${context.emitNestedAppendStatements(part.catchParts, context.sinkName, context.compatRenderToStringHelperName)}\\n }`,\n );\n }\n\n if (part.awaitId !== undefined) {\n optionFields.push(`hydrationAwaitId: ${JSON.stringify(part.awaitId)}`);\n }\n\n const optionsExpression = optionFields.length === 0 ? \"\" : `, { ${optionFields.join(\", \")} }`;\n\n return [\n ` await ${context.asyncBoundaryHelperName}(${context.sinkName}, (${part.valueCode}), async (${context.sinkName}, ${part.valueName}) => {`,\n context.emitNestedAppendStatements(\n part.parts,\n context.sinkName,\n context.compatRenderToStringHelperName,\n ),\n ` }${optionsExpression});`,\n ].join(\"\\n\");\n}\n\nexport function emitOutOfOrderBoundary<Part>(\n part: OutOfOrderBoundaryPart<Part>,\n context: BoundaryLoweringContext<Part> & {\n outOfOrderBoundaryHelperName: string;\n },\n): string {\n const catchOption =\n part.catchName === undefined || part.catchParts === undefined\n ? \"\"\n : `,\\n catch: (${context.sinkName}, ${part.catchName}) => {\\n${context.emitNestedAppendStatements(part.catchParts, context.sinkName, context.compatRenderToStringHelperName)}\\n }`;\n\n const hydrationAwaitIdOption =\n part.awaitId === undefined ? \"\" : `,\\n hydrationAwaitId: ${JSON.stringify(part.awaitId)}`;\n const placeholderTagOption =\n part.placeholderTagCode === undefined ? \"\" : `,\\n placeholderTag: (${part.placeholderTagCode})`;\n\n return [\n ` ${context.outOfOrderBoundaryHelperName}(${context.sinkName}, ${JSON.stringify(part.id)}, (${part.valueCode}), async (${context.sinkName}, ${part.valueName}) => {`,\n context.emitNestedAppendStatements(\n part.parts,\n context.sinkName,\n context.compatRenderToStringHelperName,\n ),\n ` }, {`,\n ...(part.hydration ? [` hydration: true,`] : []),\n ` placeholder: (${context.sinkName}) => {`,\n context.emitNestedAppendStatements(\n part.placeholderParts,\n context.sinkName,\n context.compatRenderToStringHelperName,\n ),\n ` }${catchOption}${hydrationAwaitIdOption}${placeholderTagOption}`,\n ` });`,\n ].join(\"\\n\");\n}\n\nexport function emitReactSuspenseBoundary<Part>(\n part: ReactSuspenseBoundaryPart<Part>,\n context: BoundaryLoweringContext<Part> & {\n reactSuspenseBoundaryHelperName: string;\n },\n): string {\n return [\n ` await ${context.reactSuspenseBoundaryHelperName}(${context.sinkName}, async (${context.sinkName}) => {`,\n context.emitNestedAppendStatements(\n part.parts,\n context.sinkName,\n context.compatRenderToStringHelperName,\n ),\n ` });`,\n ].join(\"\\n\");\n}\n\nexport function emitReactSuspenseOutOfOrderBoundary<Part>(\n part: ReactSuspenseOutOfOrderBoundaryPart<Part>,\n context: BoundaryLoweringContext<Part> & {\n reactSuspenseOutOfOrderBoundaryHelperName: string;\n },\n): string {\n const options = [\n ` fallback: (${context.sinkName}) => {`,\n context.emitNestedAppendStatements(\n part.fallbackParts,\n context.sinkName,\n context.compatRenderToStringHelperName,\n ),\n ` },`,\n ...(part.catchName === undefined || part.catchParts === undefined\n ? []\n : [\n ` catch: (${context.sinkName}, ${part.catchName}) => {`,\n context.emitNestedAppendStatements(\n part.catchParts,\n context.sinkName,\n context.compatRenderToStringHelperName,\n ),\n ` },`,\n ]),\n ...(part.nonce === undefined ? [] : [` nonce: ${JSON.stringify(part.nonce)},`]),\n ...(part.scriptSrc === undefined ? [] : [` src: ${JSON.stringify(part.scriptSrc)},`]),\n ];\n\n return [\n ` ${context.reactSuspenseOutOfOrderBoundaryHelperName}(${context.sinkName}, ${JSON.stringify(part.boundaryId)}, ${JSON.stringify(part.segmentId)}, (${part.valueCode}), async (${context.sinkName}, ${part.valueName}) => {`,\n context.emitNestedAppendStatements(\n part.parts,\n context.sinkName,\n context.compatRenderToStringHelperName,\n ),\n ` }, {`,\n ...options,\n ` });`,\n ].join(\"\\n\");\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export interface CodeBuilder {
2
+ section(code: string | undefined, options?: CodeBuilderSectionOptions): void;
3
+ toString(): string;
4
+ }
5
+ export interface CodeBuilderSectionOptions {
6
+ leadingBlankLines?: number;
7
+ }
8
+ export declare function createCodeBuilder(): CodeBuilder;
9
+ //# sourceMappingURL=emit-code-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-code-builder.d.ts","sourceRoot":"","sources":["../src/emit-code-builder.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC7E,QAAQ,IAAI,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAiB/C"}
@@ -0,0 +1,17 @@
1
+ export function createCodeBuilder() {
2
+ const sections = [];
3
+ return {
4
+ section(code, options = {}) {
5
+ if (code === undefined || code === "") {
6
+ return;
7
+ }
8
+ const leadingBlankLines = options.leadingBlankLines ?? 1;
9
+ const prefix = sections.length === 0 ? "" : "\n".repeat(leadingBlankLines + 1);
10
+ sections.push(`${prefix}${code}`);
11
+ },
12
+ toString() {
13
+ return sections.length === 0 ? "\n" : `${sections.join("")}\n`;
14
+ },
15
+ };
16
+ }
17
+ //# sourceMappingURL=emit-code-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-code-builder.js","sourceRoot":"","sources":["../src/emit-code-builder.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,iBAAiB;IAC/B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,OAAO;QACL,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,EAAE;YACxB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;YAC/E,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,QAAQ;YACN,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;QACjE,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["export interface CodeBuilder {\n section(code: string | undefined, options?: CodeBuilderSectionOptions): void;\n toString(): string;\n}\n\nexport interface CodeBuilderSectionOptions {\n leadingBlankLines?: number;\n}\n\nexport function createCodeBuilder(): CodeBuilder {\n const sections: string[] = [];\n\n return {\n section(code, options = {}) {\n if (code === undefined || code === \"\") {\n return;\n }\n\n const leadingBlankLines = options.leadingBlankLines ?? 1;\n const prefix = sections.length === 0 ? \"\" : \"\\n\".repeat(leadingBlankLines + 1);\n sections.push(`${prefix}${code}`);\n },\n toString() {\n return sections.length === 0 ? \"\\n\" : `${sections.join(\"\")}\\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;AAc1F,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,CA+HxB"}
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;AAqB1F,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,4 +1,6 @@
1
1
  import { emitEscapeHtmlHelper } from "./emit-escape-helper.js";
2
+ import { createCodeBuilder } from "./emit-code-builder.js";
3
+ import { emitAsyncBoundary as emitLoweredAsyncBoundary, emitOutOfOrderBoundary as emitLoweredOutOfOrderBoundary, emitReactSuspenseBoundary as emitLoweredReactSuspenseBoundary, emitReactSuspenseOutOfOrderBoundary as emitLoweredReactSuspenseOutOfOrderBoundary, } from "./emit-boundary-lowering.js";
2
4
  import { escapeHtmlAttribute as escapeHtml } from "@reckona/mreact-shared/html-escape";
3
5
  import { htmlAttributeName, isDangerousHtmlAttribute, isStaticUrlValueUnsafe, isUrlAttribute, parseStaticStyleObjectLiteral, parseStyleLiteralValue, simpleSideEffectFreeExpression, } from "./emit-server-shared.js";
4
6
  import { oxcServerStringReactNodeRenderHelperPlaceholder } from "./oxc-runtime-emit.js";
@@ -101,20 +103,26 @@ export function emitServerStream(ir, options = {}) {
101
103
  const moduleStatements = emitModuleStatements(ir);
102
104
  const importsBlock = [importLine, escapeImport, userImports, moduleStatements].filter(Boolean).join("\n");
103
105
  const needsSpreadAttributesHelper = components.includes(spreadAttributesHelperName);
104
- const urlSafeBlock = components.includes(urlSafeHelperName) || needsSpreadAttributesHelper
105
- ? `\n\n${urlSafeHelper}`
106
- : "";
106
+ const urlSafeBlock = components.includes(urlSafeHelperName) || needsSpreadAttributesHelper ? urlSafeHelper : "";
107
107
  const clientBoundaryBlock = clientBoundaryHelperName === undefined || !components.includes(clientBoundaryHelperName)
108
108
  ? ""
109
- : `\n\n${emitClientBoundaryHelper(clientBoundaryHelperName)}`;
109
+ : emitClientBoundaryHelper(clientBoundaryHelperName);
110
110
  const spreadAttributesBlock = needsSpreadAttributesHelper
111
- ? `\n\n${emitSpreadAttributesHelper(spreadAttributesHelperName, escapeHelperName, urlSafeHelperName)}`
111
+ ? emitSpreadAttributesHelper(spreadAttributesHelperName, escapeHelperName, urlSafeHelperName)
112
112
  : "";
113
113
  const streamNodeBlock = components.includes(streamNodeHelperName)
114
- ? `\n\n${emitStreamNodeHelper(streamNodeHelperName)}`
114
+ ? emitStreamNodeHelper(streamNodeHelperName)
115
115
  : "";
116
+ const code = createCodeBuilder();
117
+ code.section(importsBlock);
118
+ code.section(helper);
119
+ code.section(urlSafeBlock);
120
+ code.section(clientBoundaryBlock);
121
+ code.section(spreadAttributesBlock);
122
+ code.section(streamNodeBlock);
123
+ code.section(components);
116
124
  return {
117
- code: `${importsBlock === "" ? "" : `${importsBlock}\n\n`}${helper}${urlSafeBlock}${clientBoundaryBlock}${spreadAttributesBlock}${streamNodeBlock}\n\n${components}\n`,
125
+ code: code.toString(),
118
126
  imports,
119
127
  };
120
128
  }
@@ -360,16 +368,36 @@ function emitAppendStatements(node, sinkName, escapeHelperName, asyncBoundaryHel
360
368
  try {
361
369
  return coalesceAdjacentStaticParts(collected).map((part) => {
362
370
  if (part.kind === "async-boundary") {
363
- return emitAsyncBoundary(part, sinkName, asyncBoundaryHelperName, compatRenderToStringHelperName);
371
+ return emitLoweredAsyncBoundary(part, {
372
+ asyncBoundaryHelperName,
373
+ compatRenderToStringHelperName,
374
+ emitNestedAppendStatements,
375
+ sinkName,
376
+ });
364
377
  }
365
378
  if (part.kind === "out-of-order-boundary") {
366
- return emitOutOfOrderBoundary(part, sinkName, outOfOrderBoundaryHelperName, compatRenderToStringHelperName);
379
+ return emitLoweredOutOfOrderBoundary(part, {
380
+ compatRenderToStringHelperName,
381
+ emitNestedAppendStatements,
382
+ outOfOrderBoundaryHelperName,
383
+ sinkName,
384
+ });
367
385
  }
368
386
  if (part.kind === "react-suspense-boundary") {
369
- return emitReactSuspenseBoundary(part, sinkName, reactSuspenseBoundaryHelperName, compatRenderToStringHelperName);
387
+ return emitLoweredReactSuspenseBoundary(part, {
388
+ compatRenderToStringHelperName,
389
+ emitNestedAppendStatements,
390
+ reactSuspenseBoundaryHelperName,
391
+ sinkName,
392
+ });
370
393
  }
371
394
  if (part.kind === "react-suspense-out-of-order-boundary") {
372
- return emitReactSuspenseOutOfOrderBoundary(part, sinkName, reactSuspenseOutOfOrderBoundaryHelperName, compatRenderToStringHelperName);
395
+ return emitLoweredReactSuspenseOutOfOrderBoundary(part, {
396
+ compatRenderToStringHelperName,
397
+ emitNestedAppendStatements,
398
+ reactSuspenseOutOfOrderBoundaryHelperName,
399
+ sinkName,
400
+ });
373
401
  }
374
402
  if (part.kind === "component") {
375
403
  if (part.runtime === "compat") {
@@ -565,76 +593,8 @@ function emitListPartAsStringExpression(part, compatRenderToStringHelperName) {
565
593
  const concatLines = stringExpressions.map((expr) => `_listOut += ${expr};`);
566
594
  return `(() => { const _arr = (${part.itemsCode}); let _listOut = ""; for (let _i = 0, _len = _arr.length; _i < _len; _i++) { const ${part.itemName} = _arr[_i];${part.indexName === undefined ? "" : ` const ${part.indexName} = _i;`}${part.arrayName === undefined ? "" : ` const ${part.arrayName} = _arr;`}${part.bodyStatements.length === 0 ? "" : ` ${part.bodyStatements.join(" ")}`} ${concatLines.join(" ")} } return _listOut; })()`;
567
595
  }
568
- function emitAsyncBoundary(part, sinkName, asyncBoundaryHelperName, compatRenderToStringHelperName) {
569
- const optionFields = [];
570
- if (part.catchName !== undefined && part.catchParts !== undefined) {
571
- optionFields.push(`catch: (${sinkName}, ${part.catchName}) => {\n${emitNestedAppendStatements(part.catchParts, sinkName, compatRenderToStringHelperName)}\n }`);
572
- }
573
- if (part.awaitId !== undefined) {
574
- optionFields.push(`hydrationAwaitId: ${JSON.stringify(part.awaitId)}`);
575
- }
576
- const optionsExpression = optionFields.length === 0
577
- ? ""
578
- : `, { ${optionFields.join(", ")} }`;
579
- return [
580
- ` await ${asyncBoundaryHelperName}(${sinkName}, (${part.valueCode}), async (${sinkName}, ${part.valueName}) => {`,
581
- emitNestedAppendStatements(part.parts, sinkName, compatRenderToStringHelperName),
582
- ` }${optionsExpression});`,
583
- ].join("\n");
584
- }
585
- function emitOutOfOrderBoundary(part, sinkName, outOfOrderBoundaryHelperName, compatRenderToStringHelperName) {
586
- const catchOption = part.catchName === undefined || part.catchParts === undefined
587
- ? ""
588
- : `,\n catch: (${sinkName}, ${part.catchName}) => {\n${emitNestedAppendStatements(part.catchParts, sinkName, compatRenderToStringHelperName)}\n }`;
589
- const hydrationAwaitIdOption = part.awaitId === undefined
590
- ? ""
591
- : `,\n hydrationAwaitId: ${JSON.stringify(part.awaitId)}`;
592
- const placeholderTagOption = part.placeholderTagCode === undefined
593
- ? ""
594
- : `,\n placeholderTag: (${part.placeholderTagCode})`;
595
- return [
596
- ` ${outOfOrderBoundaryHelperName}(${sinkName}, ${JSON.stringify(part.id)}, (${part.valueCode}), async (${sinkName}, ${part.valueName}) => {`,
597
- emitNestedAppendStatements(part.parts, sinkName, compatRenderToStringHelperName),
598
- ` }, {`,
599
- ...(part.hydration ? [` hydration: true,`] : []),
600
- ` placeholder: (${sinkName}) => {`,
601
- emitNestedAppendStatements(part.placeholderParts, sinkName, compatRenderToStringHelperName),
602
- ` }${catchOption}${hydrationAwaitIdOption}${placeholderTagOption}`,
603
- ` });`,
604
- ].join("\n");
605
- }
606
- function emitReactSuspenseBoundary(part, sinkName, reactSuspenseBoundaryHelperName, compatRenderToStringHelperName) {
607
- return [
608
- ` await ${reactSuspenseBoundaryHelperName}(${sinkName}, async (${sinkName}) => {`,
609
- emitNestedAppendStatements(part.parts, sinkName, compatRenderToStringHelperName),
610
- ` });`,
611
- ].join("\n");
612
- }
613
- function emitReactSuspenseOutOfOrderBoundary(part, sinkName, reactSuspenseOutOfOrderBoundaryHelperName, compatRenderToStringHelperName) {
614
- const options = [
615
- ` fallback: (${sinkName}) => {`,
616
- emitNestedAppendStatements(part.fallbackParts, sinkName, compatRenderToStringHelperName),
617
- ` },`,
618
- ...(part.catchName === undefined || part.catchParts === undefined
619
- ? []
620
- : [
621
- ` catch: (${sinkName}, ${part.catchName}) => {`,
622
- emitNestedAppendStatements(part.catchParts, sinkName, compatRenderToStringHelperName),
623
- ` },`,
624
- ]),
625
- ...(part.nonce === undefined ? [] : [` nonce: ${stringLiteral(part.nonce)},`]),
626
- ...(part.scriptSrc === undefined ? [] : [` src: ${stringLiteral(part.scriptSrc)},`]),
627
- ];
628
- return [
629
- ` ${reactSuspenseOutOfOrderBoundaryHelperName}(${sinkName}, ${JSON.stringify(part.boundaryId)}, ${JSON.stringify(part.segmentId)}, (${part.valueCode}), async (${sinkName}, ${part.valueName}) => {`,
630
- emitNestedAppendStatements(part.parts, sinkName, compatRenderToStringHelperName),
631
- ` }, {`,
632
- ...options,
633
- ` });`,
634
- ].join("\n");
635
- }
636
596
  function emitNestedAppendStatements(parts, sinkName, compatRenderToStringHelperName) {
637
- return coalesceAdjacentStaticParts(parts)
597
+ return coalesceAdjacentStaticParts([...parts])
638
598
  .map((part) => emitSyncPartAsAppendStatement(part, sinkName, compatRenderToStringHelperName, " "))
639
599
  .join("\n");
640
600
  }
@@ -642,16 +602,36 @@ function emitNestedStreamAppendStatements(parts, sinkName, compatRenderToStringH
642
602
  return coalesceAdjacentStaticParts(parts)
643
603
  .map((part) => {
644
604
  if (part.kind === "async-boundary") {
645
- return emitAsyncBoundary(part, sinkName, currentAsyncBoundaryHelperName, compatRenderToStringHelperName).replace(/^/gm, " ");
605
+ return emitLoweredAsyncBoundary(part, {
606
+ asyncBoundaryHelperName: currentAsyncBoundaryHelperName,
607
+ compatRenderToStringHelperName,
608
+ emitNestedAppendStatements,
609
+ sinkName,
610
+ }).replace(/^/gm, " ");
646
611
  }
647
612
  if (part.kind === "out-of-order-boundary") {
648
- return emitOutOfOrderBoundary(part, sinkName, currentOutOfOrderBoundaryHelperName, compatRenderToStringHelperName).replace(/^/gm, " ");
613
+ return emitLoweredOutOfOrderBoundary(part, {
614
+ compatRenderToStringHelperName,
615
+ emitNestedAppendStatements,
616
+ outOfOrderBoundaryHelperName: currentOutOfOrderBoundaryHelperName,
617
+ sinkName,
618
+ }).replace(/^/gm, " ");
649
619
  }
650
620
  if (part.kind === "react-suspense-boundary") {
651
- return emitReactSuspenseBoundary(part, sinkName, currentReactSuspenseBoundaryHelperName, compatRenderToStringHelperName).replace(/^/gm, " ");
621
+ return emitLoweredReactSuspenseBoundary(part, {
622
+ compatRenderToStringHelperName,
623
+ emitNestedAppendStatements,
624
+ reactSuspenseBoundaryHelperName: currentReactSuspenseBoundaryHelperName,
625
+ sinkName,
626
+ }).replace(/^/gm, " ");
652
627
  }
653
628
  if (part.kind === "react-suspense-out-of-order-boundary") {
654
- return emitReactSuspenseOutOfOrderBoundary(part, sinkName, currentReactSuspenseOutOfOrderBoundaryHelperName, compatRenderToStringHelperName).replace(/^/gm, " ");
629
+ return emitLoweredReactSuspenseOutOfOrderBoundary(part, {
630
+ compatRenderToStringHelperName,
631
+ emitNestedAppendStatements,
632
+ reactSuspenseOutOfOrderBoundaryHelperName: currentReactSuspenseOutOfOrderBoundaryHelperName,
633
+ sinkName,
634
+ }).replace(/^/gm, " ");
655
635
  }
656
636
  return emitSyncPartAsAppendStatement(part, sinkName, compatRenderToStringHelperName, " ");
657
637
  })