@reckona/mreact-server 0.0.180 → 0.0.182
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/boundary.js +1 -1
- package/dist/boundary.js.map +1 -1
- package/dist/flight.d.ts.map +1 -1
- package/dist/flight.js +108 -36
- package/dist/flight.js.map +1 -1
- package/dist/reorder.d.ts.map +1 -1
- package/dist/reorder.js +17 -6
- package/dist/reorder.js.map +1 -1
- package/package.json +3 -3
- package/src/boundary.ts +1 -1
- package/src/flight.ts +203 -89
- package/src/reorder.ts +17 -13
package/dist/boundary.js
CHANGED
|
@@ -261,7 +261,7 @@ export function renderHydrationBoundary(sink, id, render) {
|
|
|
261
261
|
function isPromiseLike(value) {
|
|
262
262
|
return isPromiseLikeUnknown(value);
|
|
263
263
|
}
|
|
264
|
-
const outOfOrderReorderScript = `(()=>{function apply(root){const fragments=Array.from(root.querySelectorAll("template[data-mreact-oob-fragment]"));for(const
|
|
264
|
+
const outOfOrderReorderScript = `(()=>{function apply(root){const fragments=Array.from(root.querySelectorAll("template[data-mreact-oob-fragment]"));const markers=new Map();for(const marker of root.querySelectorAll("[data-mreact-oob-complete]")){const id=marker.getAttribute("data-mreact-oob-complete");if(!markers.has(id))markers.set(id,marker);}const placeholders=new Map();for(const placeholder of root.querySelectorAll("[data-mreact-oob-placeholder]")){const id=placeholder.getAttribute("data-mreact-oob-placeholder");if(!placeholders.has(id))placeholders.set(id,placeholder);}for(const fragment of fragments){const id=fragment.getAttribute("data-mreact-oob-fragment");if(id===null)continue;const marker=markers.get(id);if(marker===undefined)continue;const placeholder=placeholders.get(id);if(placeholder===undefined)continue;placeholder.replaceWith(fragment.content.cloneNode(true));fragment.remove();marker.remove();}}apply(document);new MutationObserver(()=>apply(document)).observe(document.documentElement,{childList:true,subtree:true});})();`;
|
|
265
265
|
const reactSuspenseRevealScriptBody = `(self.$RC=self.$RC||function(bid,sid){var b=document.getElementById(bid);var s=document.getElementById(sid);if(!b||!s)return;var p=b.parentNode;var e=b.nextSibling;var d=0;var r=[];for(var n=e;n;n=n.nextSibling){if(n.nodeType===8){if(n.data==="$"||n.data==="$?"||n.data==="$!")d++;else if(n.data==="/$"){if(d===0){e=n;break;}d--;}}r.push(n);}for(var i=0;r[i];i++)p.removeChild(r[i]);while(s.firstChild)p.insertBefore(s.firstChild,e);s.remove();b.data="$";})`;
|
|
266
266
|
/** External script body that reveals a React Suspense segment when loaded. */
|
|
267
267
|
export const reactSuspenseRevealExternalScript = `(()=>{${reactSuspenseRevealScriptBody};var s=document.currentScript;if(!s)return;var b=s.getAttribute("data-boundary-id");var seg=s.getAttribute("data-segment-id");if(b!==null&&seg!==null)self.$RC(b,seg);})();`;
|
package/dist/boundary.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundary.js","sourceRoot":"","sources":["../src/boundary.ts"],"names":[],"mappings":"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","sourcesContent":["import type { HtmlSink } from \"@reckona/mreact-shared/compiler-contract\";\nimport {\n escapeAttribute,\n isPromiseLikeUnknown,\n renderNonceAttribute,\n serializeScriptJson,\n} from \"./html-internals.js\";\nimport { createStringSink, type StringHtmlSink } from \"./sink.js\";\n\n/** Options shared by async boundaries that render resolved values or caught errors. */\nexport interface AsyncBoundaryOptions {\n catch?: (sink: HtmlSink, error: unknown) => void | PromiseLike<void>;\n hydrationAwaitId?: string;\n}\n\n/** Options for rendering a boundary whose resolved content can arrive out of order. */\nexport interface OutOfOrderBoundaryOptions extends AsyncBoundaryOptions {\n hydration?: boolean;\n placeholder?: (sink: HtmlSink) => void;\n placeholderTag?: string;\n}\n\n/** Options for emitting the out-of-order fragment reorder script. */\nexport interface OutOfOrderReorderScriptOptions {\n nonce?: string;\n src?: string;\n}\n\n/** Options for script tags that hydrate server-rendered data. */\nexport interface HydrationScriptOptions {\n nonce?: string;\n}\n\n/** Options for scripts that reveal React Suspense segments. */\nexport interface ReactSuspenseScriptOptions {\n nonce?: string;\n src?: string;\n}\n\n/** Options for React Suspense boundaries rendered with streamed segments. */\nexport interface ReactSuspenseBoundaryOptions extends AsyncBoundaryOptions {\n fallback?: (sink: HtmlSink) => void | PromiseLike<void>;\n nonce?: string;\n}\n\n/** Error metadata used when forcing a React Suspense boundary to client render. */\nexport interface ReactSuspenseClientRenderOptions {\n message?: string;\n stack?: string;\n}\n\n/** Renderer invoked with an async boundary's resolved value. */\nexport type AsyncBoundaryRender<T> = (\n sink: HtmlSink,\n value: Awaited<T>,\n) => void | PromiseLike<void>;\n\nconst outOfOrderBoundaryInstances = new WeakMap<HtmlSink, Map<string, number>>();\n\n/** Renders a value once it resolves, or renders a configured catch branch on error. */\nexport async function renderAsyncBoundary<T>(\n sink: HtmlSink,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: AsyncBoundaryOptions = {},\n): Promise<void> {\n try {\n const resolved = await value;\n await sink.backpressure?.();\n await render(sink, resolved);\n if (options.hydrationAwaitId !== undefined) {\n appendAwaitHydrationData(sink, options.hydrationAwaitId, resolved);\n }\n } catch (error) {\n if (options.catch === undefined) {\n throw error;\n }\n\n await sink.backpressure?.();\n await options.catch(sink, error);\n }\n}\n\n// Threshold for `<Await>` payload size warnings (UTF-8 byte length of\n// JSON-serialized representation). 100KB warn / 1MB error follow the\n// \"you're sending a lot of data\" hint pattern used by other frameworks.\nconst AWAIT_PAYLOAD_WARN_BYTES = 100 * 1024;\nconst AWAIT_PAYLOAD_ERROR_BYTES = 1024 * 1024;\nconst textEncoder = typeof TextEncoder !== \"undefined\" ? new TextEncoder() : undefined;\n\nfunction isProductionMode(): boolean {\n // `process` may not exist in cross-runtime environments (Cloudflare/Deno).\n // The server tsconfig does not include `@types/node`, so we look it up\n // through `globalThis` with a minimal local typing.\n const globalProcess = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process;\n\n try {\n return globalProcess?.env?.[\"NODE_ENV\"] === \"production\";\n } catch {\n return false;\n }\n}\n\nfunction appendAwaitHydrationData(\n sink: HtmlSink,\n awaitId: string,\n resolved: unknown,\n): void {\n const serialized = serializeAwaitHydrationValue(resolved, awaitId);\n\n if (serialized === undefined) {\n return;\n }\n\n const idLiteral = JSON.stringify(awaitId).replaceAll(\"<\", \"\\\\u003c\");\n sink.append(\n `<script data-mreact-await=\"${escapeAttribute(awaitId)}\">(self.__mreactAwaitData||(self.__mreactAwaitData={}))[${idLiteral}]={value:${serialized}}</script>`,\n );\n}\n\n// Emits a single console.warn in dev when `resolved` contains shapes the\n// wire format will silently drop or coerce (Date / Map / Set / RegExp /\n// class instance / function / Symbol / nested non-POJO).\nfunction warnIfNonSerializableAwaitValue(value: unknown, awaitId: string): void {\n if (isProductionMode()) {\n return;\n }\n\n if (!containsNonSerializableSurface(value)) {\n return;\n }\n\n console.warn(\n `[mreact] <Await value={...}> for \"${awaitId}\" includes non-serializable ` +\n `data (Date / Map / Set / RegExp / class instance / function / Symbol). ` +\n `The wire format uses JSON.stringify, so the client-side renderer may ` +\n `receive a different shape after the JSON round-trip. Convert to plain ` +\n `JSON-serializable data before it reaches <Await>. See ` +\n `https://github.com/t-k/mreact#streaming-loading-and-await.`,\n );\n}\n\nfunction containsNonSerializableSurface(value: unknown): boolean {\n if (value === null || value === undefined || typeof value !== \"object\") {\n return false;\n }\n\n if (value instanceof Date || value instanceof Map || value instanceof Set || value instanceof RegExp) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.some((entry) => containsNonSerializableSurface(entry));\n }\n\n const proto = Object.getPrototypeOf(value);\n\n if (proto !== Object.prototype && proto !== null) {\n return true;\n }\n\n for (const entry of Object.values(value as Record<string, unknown>)) {\n if (containsNonSerializableSurface(entry)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction reportAwaitPayloadSize(json: string, awaitId: string): void {\n if (json.length * 3 < AWAIT_PAYLOAD_WARN_BYTES) {\n return;\n }\n\n const byteLength = textEncoder?.encode(json).length ?? json.length;\n\n if (byteLength > AWAIT_PAYLOAD_ERROR_BYTES) {\n console.error(\n `[mreact] <Await> payload for \"${awaitId}\" is ${(byteLength / 1024 / 1024).toFixed(2)}MB, ` +\n `exceeding the 1MB error threshold. Large payloads inflate HTML response size and ` +\n `client memory pressure. Stream the data via loader or split into smaller boundaries.`,\n );\n return;\n }\n\n if (byteLength > AWAIT_PAYLOAD_WARN_BYTES) {\n console.warn(\n `[mreact] large await payload for \"${awaitId}\": ${(byteLength / 1024).toFixed(1)}KB ` +\n `(over the 100KB warning threshold). Consider streaming the data via loader or ` +\n `splitting into smaller boundaries.`,\n );\n }\n}\n\nfunction serializeAwaitHydrationValue(value: unknown, awaitId: string): string | undefined {\n try {\n const json = JSON.stringify(value);\n if (json === undefined) {\n return undefined;\n }\n\n warnIfNonSerializableAwaitValue(value, awaitId);\n reportAwaitPayloadSize(json, awaitId);\n\n // Defuse `</script>` and runaway control characters so the data can be\n // safely embedded inside a `<script>` element.\n return json\n .replaceAll(\"<\", \"\\\\u003c\")\n .replaceAll(\"\\u2028\", \"\\\\u2028\")\n .replaceAll(\"\\u2029\", \"\\\\u2029\");\n } catch {\n return undefined;\n }\n}\n\nfunction inheritBackpressure(childSink: StringHtmlSink, parentSink: HtmlSink): StringHtmlSink {\n if (parentSink.backpressure === undefined) {\n return childSink;\n }\n\n return {\n ...childSink,\n backpressure: parentSink.backpressure,\n };\n}\n\n/** Emits a placeholder immediately and defers resolved HTML as an out-of-order fragment. */\nexport function renderOutOfOrderBoundary<T>(\n sink: HtmlSink,\n id: string,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: OutOfOrderBoundaryOptions = {},\n): void {\n const boundaryId = nextOutOfOrderBoundaryInstanceId(sink, id);\n const placeholderSink = createStringSink();\n const placeholderResult = options.placeholder?.(placeholderSink);\n if (!isProductionMode() && isPromiseLikeUnknown(placeholderResult)) {\n throw new Error(\"renderOutOfOrderBoundary placeholder must be synchronous.\");\n }\n const placeholderTag = normalizeOutOfOrderPlaceholderTag(options.placeholderTag);\n const hydrationStart =\n options.hydration === true ? `<!--mreact-h:start:${encodeURIComponent(boundaryId)}-->` : \"\";\n const hydrationEnd =\n options.hydration === true ? `<!--mreact-h:end:${encodeURIComponent(boundaryId)}-->` : \"\";\n sink.append(\n `${hydrationStart}<${placeholderTag} data-mreact-oob-placeholder=\"${escapeAttribute(boundaryId)}\">${placeholderSink.toString()}</${placeholderTag}>${hydrationEnd}`,\n );\n\n const task = renderOutOfOrderFragment(sink, boundaryId, value, render, options);\n\n if (sink.defer === undefined) {\n void task;\n return;\n }\n\n sink.defer(task);\n}\n\nfunction normalizeOutOfOrderPlaceholderTag(tag: unknown): string {\n if (typeof tag !== \"string\") {\n return \"span\";\n }\n\n const normalized = tag.trim().toLowerCase();\n return /^[a-z][a-z0-9-]*$/.test(normalized) ? normalized : \"span\";\n}\n\nasync function renderOutOfOrderFragment<T>(\n sink: HtmlSink,\n id: string,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: OutOfOrderBoundaryOptions,\n): Promise<void> {\n const fragmentSink = inheritBackpressure(createStringSink(), sink);\n let resolvedValue: unknown;\n let hasResolvedValue = false;\n\n await renderAsyncBoundary(\n fragmentSink,\n value,\n async (childSink, resolved) => {\n resolvedValue = resolved;\n hasResolvedValue = true;\n await render(childSink, resolved);\n },\n options.catch === undefined ? {} : { catch: options.catch },\n );\n await fragmentSink.drain();\n\n sink.append(renderOutOfOrderFragmentHtml(id, fragmentSink.toString()));\n\n if (hasResolvedValue && options.hydrationAwaitId !== undefined) {\n appendAwaitHydrationData(sink, options.hydrationAwaitId, resolvedValue);\n }\n}\n\n/** Emits the client script that swaps out-of-order fragments into their placeholders. */\nexport function renderOutOfOrderReorderScript(\n sink: HtmlSink,\n options: OutOfOrderReorderScriptOptions = {},\n): void {\n const nonceAttribute =\n options.nonce === undefined ? \"\" : ` nonce=\"${escapeAttribute(options.nonce)}\"`;\n\n if (options.src !== undefined) {\n sink.append(\n `<script data-mreact-oob-reorder${nonceAttribute} src=\"${escapeAttribute(options.src)}\"></script>`,\n );\n return;\n }\n\n sink.append(\n `<script data-mreact-oob-reorder${nonceAttribute}>${outOfOrderReorderScript}</script>`,\n );\n}\n\nfunction renderOutOfOrderFragmentHtml(id: string, html: string): string {\n const escapedId = escapeAttribute(id);\n return `<template data-mreact-oob-fragment=\"${escapedId}\">${html}</template><mreact-oob-complete hidden data-mreact-oob-complete=\"${escapedId}\"></mreact-oob-complete>`;\n}\n\n/** Wraps streamed content in React Suspense completion markers. */\nexport function renderReactSuspenseBoundary(\n sink: HtmlSink,\n render: (sink: HtmlSink) => void | PromiseLike<void>,\n): void | PromiseLike<void> {\n sink.append(\"<!--$-->\");\n const result = render(sink);\n\n if (isPromiseLike(result)) {\n return result.then(() => {\n sink.append(\"<!--/$-->\");\n });\n }\n\n sink.append(\"<!--/$-->\");\n}\n\n/** Emits a React Suspense fallback and streams the resolved segment out of order. */\nexport function renderReactSuspenseOutOfOrderBoundary<T>(\n sink: HtmlSink,\n boundaryId: string,\n segmentId: string,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: ReactSuspenseBoundaryOptions = {},\n): void {\n const actualBoundaryId = nextOutOfOrderBoundaryInstanceId(sink, boundaryId);\n const suffix = actualBoundaryId.slice(boundaryId.length);\n const actualSegmentId = `${segmentId}${suffix}`;\n const fallbackSink = createStringSink();\n void options.fallback?.(fallbackSink);\n sink.append(\n `<!--$?--><template id=\"${escapeAttribute(actualBoundaryId)}\"></template>${fallbackSink.toString()}<!--/$-->`,\n );\n\n const task = renderReactSuspenseSegment(\n sink,\n actualBoundaryId,\n actualSegmentId,\n value,\n render,\n options,\n );\n\n if (sink.defer === undefined) {\n void task;\n return;\n }\n\n sink.defer(task);\n}\n\nfunction nextOutOfOrderBoundaryInstanceId(sink: HtmlSink, id: string): string {\n let instances = outOfOrderBoundaryInstances.get(sink);\n\n if (instances === undefined) {\n instances = new Map();\n outOfOrderBoundaryInstances.set(sink, instances);\n }\n\n const count = instances.get(id) ?? 0;\n instances.set(id, count + 1);\n\n return count === 0 ? id : `${id}-${count.toString(36)}`;\n}\n\n/** Emits a React Suspense boundary that instructs the client to render the fallback. */\nexport function renderReactSuspenseClientRenderBoundary(\n sink: HtmlSink,\n fallback: (sink: HtmlSink) => void | PromiseLike<void>,\n options: ReactSuspenseClientRenderOptions = {},\n): void | PromiseLike<void> {\n sink.append(`<!--$!--><template${renderReactSuspenseErrorAttributes(options)}></template>`);\n const result = fallback(sink);\n\n if (isPromiseLike(result)) {\n return result.then(() => {\n sink.append(\"<!--/$-->\");\n });\n }\n\n sink.append(\"<!--/$-->\");\n}\n\nasync function renderReactSuspenseSegment<T>(\n sink: HtmlSink,\n boundaryId: string,\n segmentId: string,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: ReactSuspenseBoundaryOptions,\n): Promise<void> {\n const segmentSink = inheritBackpressure(createStringSink(), sink);\n\n await renderAsyncBoundary(\n segmentSink,\n value,\n render,\n options.catch === undefined ? {} : { catch: options.catch },\n );\n\n sink.append(\n `<div hidden id=\"${escapeAttribute(segmentId)}\">${segmentSink.toString()}</div>${renderReactSuspenseRevealScript(boundaryId, segmentId, options)}`,\n );\n}\n\nfunction renderReactSuspenseErrorAttributes(options: ReactSuspenseClientRenderOptions): string {\n const message =\n options.message === undefined ? \"\" : ` data-msg=\"${escapeAttribute(options.message)}\"`;\n const stack = options.stack === undefined ? \"\" : ` data-stck=\"${escapeAttribute(options.stack)}\"`;\n\n return `${message}${stack}`;\n}\n\nfunction renderReactSuspenseRevealScript(\n boundaryId: string,\n segmentId: string,\n options: ReactSuspenseScriptOptions = {},\n): string {\n if (options.src !== undefined) {\n return `<script data-mreact-react-suspense-reveal${renderNonceAttribute(options.nonce)} src=\"${escapeAttribute(options.src)}\" data-boundary-id=\"${escapeAttribute(boundaryId)}\" data-segment-id=\"${escapeAttribute(segmentId)}\"></script>`;\n }\n\n return `<script${renderNonceAttribute(options.nonce)}>${reactSuspenseRevealScriptBody};$RC(${serializeScriptJson(boundaryId)},${serializeScriptJson(segmentId)})</script>`;\n}\n\n/** Wraps server-rendered HTML in hydration start and end markers. */\nexport function renderHydrationBoundary(\n sink: HtmlSink,\n id: string,\n render: (sink: HtmlSink) => void | PromiseLike<void>,\n): void | PromiseLike<void> {\n const markerId = encodeURIComponent(id);\n sink.append(`<!--mreact-h:start:${markerId}-->`);\n const result = render(sink);\n\n if (isPromiseLike(result)) {\n return result.then(() => {\n sink.append(`<!--mreact-h:end:${markerId}-->`);\n });\n }\n\n sink.append(`<!--mreact-h:end:${markerId}-->`);\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<void> {\n return isPromiseLikeUnknown(value);\n}\n\nconst outOfOrderReorderScript = `(()=>{function apply(root){const fragments=Array.from(root.querySelectorAll(\"template[data-mreact-oob-fragment]\"));for(const fragment of fragments){const id=fragment.getAttribute(\"data-mreact-oob-fragment\");if(id===null)continue;const markers=Array.from(root.querySelectorAll(\"[data-mreact-oob-complete]\"));const marker=markers.find((candidate)=>candidate.getAttribute(\"data-mreact-oob-complete\")===id);if(marker===undefined)continue;const placeholders=Array.from(root.querySelectorAll(\"[data-mreact-oob-placeholder]\"));const placeholder=placeholders.find((candidate)=>candidate.getAttribute(\"data-mreact-oob-placeholder\")===id);if(placeholder===undefined)continue;placeholder.replaceWith(fragment.content.cloneNode(true));fragment.remove();marker.remove();}}apply(document);new MutationObserver(()=>apply(document)).observe(document.documentElement,{childList:true,subtree:true});})();`;\n\nconst reactSuspenseRevealScriptBody = `(self.$RC=self.$RC||function(bid,sid){var b=document.getElementById(bid);var s=document.getElementById(sid);if(!b||!s)return;var p=b.parentNode;var e=b.nextSibling;var d=0;var r=[];for(var n=e;n;n=n.nextSibling){if(n.nodeType===8){if(n.data===\"$\"||n.data===\"$?\"||n.data===\"$!\")d++;else if(n.data===\"/$\"){if(d===0){e=n;break;}d--;}}r.push(n);}for(var i=0;r[i];i++)p.removeChild(r[i]);while(s.firstChild)p.insertBefore(s.firstChild,e);s.remove();b.data=\"$\";})`;\n\n/** External script body that reveals a React Suspense segment when loaded. */\nexport const reactSuspenseRevealExternalScript = `(()=>{${reactSuspenseRevealScriptBody};var s=document.currentScript;if(!s)return;var b=s.getAttribute(\"data-boundary-id\");var seg=s.getAttribute(\"data-segment-id\");if(b!==null&&seg!==null)self.$RC(b,seg);})();`;\n"]}
|
|
1
|
+
{"version":3,"file":"boundary.js","sourceRoot":"","sources":["../src/boundary.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAuB,MAAM,WAAW,CAAC;AAkDlE,MAAM,2BAA2B,GAAG,IAAI,OAAO,EAAiC,CAAC;AAEjF,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAc,EACd,KAAQ,EACR,MAA8B,EAC9B,UAAgC,EAAE;IAElC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC;QAC7B,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QAC5B,MAAM,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7B,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YAC3C,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QAC5B,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,qEAAqE;AACrE,wEAAwE;AACxE,MAAM,wBAAwB,GAAG,GAAG,GAAG,IAAI,CAAC;AAC5C,MAAM,yBAAyB,GAAG,IAAI,GAAG,IAAI,CAAC;AAC9C,MAAM,WAAW,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAEvF,SAAS,gBAAgB;IACvB,2EAA2E;IAC3E,uEAAuE;IACvE,oDAAoD;IACpD,MAAM,aAAa,GAAI,UAAyE;SAC7F,OAAO,CAAC;IAEX,IAAI,CAAC;QACH,OAAO,aAAa,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,YAAY,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,IAAc,EACd,OAAe,EACf,QAAiB;IAEjB,MAAM,UAAU,GAAG,4BAA4B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEnE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM,CACT,8BAA8B,eAAe,CAAC,OAAO,CAAC,2DAA2D,SAAS,YAAY,UAAU,YAAY,CAC7J,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,wEAAwE;AACxE,yDAAyD;AACzD,SAAS,+BAA+B,CAAC,KAAc,EAAE,OAAe;IACtE,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,IAAI,CAAC,8BAA8B,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,IAAI,CACV,qCAAqC,OAAO,8BAA8B;QACxE,yEAAyE;QACzE,uEAAuE;QACvE,wEAAwE;QACxE,wDAAwD;QACxD,4DAA4D,CAC/D,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CAAC,KAAc;IACpD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY,GAAG,IAAI,KAAK,YAAY,GAAG,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC;QACrG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAE3C,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAgC,CAAC,EAAE,CAAC;QACpE,IAAI,8BAA8B,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY,EAAE,OAAe;IAC3D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,wBAAwB,EAAE,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IAEnE,IAAI,UAAU,GAAG,yBAAyB,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CACX,iCAAiC,OAAO,QAAQ,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;YACzF,mFAAmF;YACnF,sFAAsF,CACzF,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,UAAU,GAAG,wBAAwB,EAAE,CAAC;QAC1C,OAAO,CAAC,IAAI,CACV,qCAAqC,OAAO,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;YACnF,gFAAgF;YAChF,oCAAoC,CACvC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAc,EAAE,OAAe;IACnE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,+BAA+B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChD,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEtC,uEAAuE;QACvE,+CAA+C;QAC/C,OAAO,IAAI;aACR,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC;aAC1B,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC;aAC/B,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAyB,EAAE,UAAoB;IAC1E,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,GAAG,SAAS;QACZ,YAAY,EAAE,UAAU,CAAC,YAAY;KACtC,CAAC;AACJ,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,wBAAwB,CACtC,IAAc,EACd,EAAU,EACV,KAAQ,EACR,MAA8B,EAC9B,UAAqC,EAAE;IAEvC,MAAM,UAAU,GAAG,gCAAgC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,gBAAgB,EAAE,CAAC;IAC3C,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,CAAC;IACjE,IAAI,CAAC,gBAAgB,EAAE,IAAI,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,cAAc,GAAG,iCAAiC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACjF,MAAM,cAAc,GAClB,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,sBAAsB,kBAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9F,MAAM,YAAY,GAChB,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,oBAAoB,kBAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5F,IAAI,CAAC,MAAM,CACT,GAAG,cAAc,IAAI,cAAc,iCAAiC,eAAe,CAAC,UAAU,CAAC,KAAK,eAAe,CAAC,QAAQ,EAAE,KAAK,cAAc,IAAI,YAAY,EAAE,CACpK,CAAC;IAEF,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC;QACV,OAAO;IACT,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,iCAAiC,CAAC,GAAY;IACrD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,IAAc,EACd,EAAU,EACV,KAAQ,EACR,MAA8B,EAC9B,OAAkC;IAElC,MAAM,YAAY,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,CAAC;IACnE,IAAI,aAAsB,CAAC;IAC3B,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,MAAM,mBAAmB,CACvB,YAAY,EACZ,KAAK,EACL,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;QAC5B,aAAa,GAAG,QAAQ,CAAC;QACzB,gBAAgB,GAAG,IAAI,CAAC;QACxB,MAAM,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC,EACD,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAC5D,CAAC;IACF,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAE3B,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,EAAE,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEvE,IAAI,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC/D,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,6BAA6B,CAC3C,IAAc,EACd,UAA0C,EAAE;IAE5C,MAAM,cAAc,GAClB,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;IAElF,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CACT,kCAAkC,cAAc,SAAS,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CACnG,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC,MAAM,CACT,kCAAkC,cAAc,IAAI,uBAAuB,WAAW,CACvF,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CAAC,EAAU,EAAE,IAAY;IAC5D,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACtC,OAAO,uCAAuC,SAAS,KAAK,IAAI,oEAAoE,SAAS,0BAA0B,CAAC;AAC1K,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,2BAA2B,CACzC,IAAc,EACd,MAAoD;IAEpD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACtB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC3B,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,qCAAqC,CACnD,IAAc,EACd,UAAkB,EAClB,SAAiB,EACjB,KAAQ,EACR,MAA8B,EAC9B,UAAwC,EAAE;IAE1C,MAAM,gBAAgB,GAAG,gCAAgC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,eAAe,GAAG,GAAG,SAAS,GAAG,MAAM,EAAE,CAAC;IAChD,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;IACxC,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CACT,0BAA0B,eAAe,CAAC,gBAAgB,CAAC,gBAAgB,YAAY,CAAC,QAAQ,EAAE,WAAW,CAC9G,CAAC;IAEF,MAAM,IAAI,GAAG,0BAA0B,CACrC,IAAI,EACJ,gBAAgB,EAChB,eAAe,EACf,KAAK,EACL,MAAM,EACN,OAAO,CACR,CAAC;IAEF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC;QACV,OAAO;IACT,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,gCAAgC,CAAC,IAAc,EAAE,EAAU;IAClE,IAAI,SAAS,GAAG,2BAA2B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEtD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,2BAA2B,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACrC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAE7B,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,uCAAuC,CACrD,IAAc,EACd,QAAsD,EACtD,UAA4C,EAAE;IAE9C,IAAI,CAAC,MAAM,CAAC,qBAAqB,kCAAkC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE9B,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACtB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,IAAc,EACd,UAAkB,EAClB,SAAiB,EACjB,KAAQ,EACR,MAA8B,EAC9B,OAAqC;IAErC,MAAM,WAAW,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,CAAC;IAElE,MAAM,mBAAmB,CACvB,WAAW,EACX,KAAK,EACL,MAAM,EACN,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAC5D,CAAC;IAEF,IAAI,CAAC,MAAM,CACT,mBAAmB,eAAe,CAAC,SAAS,CAAC,KAAK,WAAW,CAAC,QAAQ,EAAE,SAAS,+BAA+B,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CACnJ,CAAC;AACJ,CAAC;AAED,SAAS,kCAAkC,CAAC,OAAyC;IACnF,MAAM,OAAO,GACX,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;IACzF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;IAElG,OAAO,GAAG,OAAO,GAAG,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,+BAA+B,CACtC,UAAkB,EAClB,SAAiB,EACjB,UAAsC,EAAE;IAExC,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,4CAA4C,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,eAAe,CAAC,UAAU,CAAC,sBAAsB,eAAe,CAAC,SAAS,CAAC,aAAa,CAAC;IAC7O,CAAC;IAED,OAAO,UAAU,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,6BAA6B,QAAQ,mBAAmB,CAAC,UAAU,CAAC,IAAI,mBAAmB,CAAC,SAAS,CAAC,YAAY,CAAC;AAC7K,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,uBAAuB,CACrC,IAAc,EACd,EAAU,EACV,MAAoD;IAEpD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,sBAAsB,QAAQ,KAAK,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACtB,IAAI,CAAC,MAAM,CAAC,oBAAoB,QAAQ,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,uBAAuB,GAAG,2/BAA2/B,CAAC;AAE5hC,MAAM,6BAA6B,GAAG,2cAA2c,CAAC;AAElf,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iCAAiC,GAAG,SAAS,6BAA6B,6KAA6K,CAAC","sourcesContent":["import type { HtmlSink } from \"@reckona/mreact-shared/compiler-contract\";\nimport {\n escapeAttribute,\n isPromiseLikeUnknown,\n renderNonceAttribute,\n serializeScriptJson,\n} from \"./html-internals.js\";\nimport { createStringSink, type StringHtmlSink } from \"./sink.js\";\n\n/** Options shared by async boundaries that render resolved values or caught errors. */\nexport interface AsyncBoundaryOptions {\n catch?: (sink: HtmlSink, error: unknown) => void | PromiseLike<void>;\n hydrationAwaitId?: string;\n}\n\n/** Options for rendering a boundary whose resolved content can arrive out of order. */\nexport interface OutOfOrderBoundaryOptions extends AsyncBoundaryOptions {\n hydration?: boolean;\n placeholder?: (sink: HtmlSink) => void;\n placeholderTag?: string;\n}\n\n/** Options for emitting the out-of-order fragment reorder script. */\nexport interface OutOfOrderReorderScriptOptions {\n nonce?: string;\n src?: string;\n}\n\n/** Options for script tags that hydrate server-rendered data. */\nexport interface HydrationScriptOptions {\n nonce?: string;\n}\n\n/** Options for scripts that reveal React Suspense segments. */\nexport interface ReactSuspenseScriptOptions {\n nonce?: string;\n src?: string;\n}\n\n/** Options for React Suspense boundaries rendered with streamed segments. */\nexport interface ReactSuspenseBoundaryOptions extends AsyncBoundaryOptions {\n fallback?: (sink: HtmlSink) => void | PromiseLike<void>;\n nonce?: string;\n}\n\n/** Error metadata used when forcing a React Suspense boundary to client render. */\nexport interface ReactSuspenseClientRenderOptions {\n message?: string;\n stack?: string;\n}\n\n/** Renderer invoked with an async boundary's resolved value. */\nexport type AsyncBoundaryRender<T> = (\n sink: HtmlSink,\n value: Awaited<T>,\n) => void | PromiseLike<void>;\n\nconst outOfOrderBoundaryInstances = new WeakMap<HtmlSink, Map<string, number>>();\n\n/** Renders a value once it resolves, or renders a configured catch branch on error. */\nexport async function renderAsyncBoundary<T>(\n sink: HtmlSink,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: AsyncBoundaryOptions = {},\n): Promise<void> {\n try {\n const resolved = await value;\n await sink.backpressure?.();\n await render(sink, resolved);\n if (options.hydrationAwaitId !== undefined) {\n appendAwaitHydrationData(sink, options.hydrationAwaitId, resolved);\n }\n } catch (error) {\n if (options.catch === undefined) {\n throw error;\n }\n\n await sink.backpressure?.();\n await options.catch(sink, error);\n }\n}\n\n// Threshold for `<Await>` payload size warnings (UTF-8 byte length of\n// JSON-serialized representation). 100KB warn / 1MB error follow the\n// \"you're sending a lot of data\" hint pattern used by other frameworks.\nconst AWAIT_PAYLOAD_WARN_BYTES = 100 * 1024;\nconst AWAIT_PAYLOAD_ERROR_BYTES = 1024 * 1024;\nconst textEncoder = typeof TextEncoder !== \"undefined\" ? new TextEncoder() : undefined;\n\nfunction isProductionMode(): boolean {\n // `process` may not exist in cross-runtime environments (Cloudflare/Deno).\n // The server tsconfig does not include `@types/node`, so we look it up\n // through `globalThis` with a minimal local typing.\n const globalProcess = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process;\n\n try {\n return globalProcess?.env?.[\"NODE_ENV\"] === \"production\";\n } catch {\n return false;\n }\n}\n\nfunction appendAwaitHydrationData(\n sink: HtmlSink,\n awaitId: string,\n resolved: unknown,\n): void {\n const serialized = serializeAwaitHydrationValue(resolved, awaitId);\n\n if (serialized === undefined) {\n return;\n }\n\n const idLiteral = JSON.stringify(awaitId).replaceAll(\"<\", \"\\\\u003c\");\n sink.append(\n `<script data-mreact-await=\"${escapeAttribute(awaitId)}\">(self.__mreactAwaitData||(self.__mreactAwaitData={}))[${idLiteral}]={value:${serialized}}</script>`,\n );\n}\n\n// Emits a single console.warn in dev when `resolved` contains shapes the\n// wire format will silently drop or coerce (Date / Map / Set / RegExp /\n// class instance / function / Symbol / nested non-POJO).\nfunction warnIfNonSerializableAwaitValue(value: unknown, awaitId: string): void {\n if (isProductionMode()) {\n return;\n }\n\n if (!containsNonSerializableSurface(value)) {\n return;\n }\n\n console.warn(\n `[mreact] <Await value={...}> for \"${awaitId}\" includes non-serializable ` +\n `data (Date / Map / Set / RegExp / class instance / function / Symbol). ` +\n `The wire format uses JSON.stringify, so the client-side renderer may ` +\n `receive a different shape after the JSON round-trip. Convert to plain ` +\n `JSON-serializable data before it reaches <Await>. See ` +\n `https://github.com/t-k/mreact#streaming-loading-and-await.`,\n );\n}\n\nfunction containsNonSerializableSurface(value: unknown): boolean {\n if (value === null || value === undefined || typeof value !== \"object\") {\n return false;\n }\n\n if (value instanceof Date || value instanceof Map || value instanceof Set || value instanceof RegExp) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.some((entry) => containsNonSerializableSurface(entry));\n }\n\n const proto = Object.getPrototypeOf(value);\n\n if (proto !== Object.prototype && proto !== null) {\n return true;\n }\n\n for (const entry of Object.values(value as Record<string, unknown>)) {\n if (containsNonSerializableSurface(entry)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction reportAwaitPayloadSize(json: string, awaitId: string): void {\n if (json.length * 3 < AWAIT_PAYLOAD_WARN_BYTES) {\n return;\n }\n\n const byteLength = textEncoder?.encode(json).length ?? json.length;\n\n if (byteLength > AWAIT_PAYLOAD_ERROR_BYTES) {\n console.error(\n `[mreact] <Await> payload for \"${awaitId}\" is ${(byteLength / 1024 / 1024).toFixed(2)}MB, ` +\n `exceeding the 1MB error threshold. Large payloads inflate HTML response size and ` +\n `client memory pressure. Stream the data via loader or split into smaller boundaries.`,\n );\n return;\n }\n\n if (byteLength > AWAIT_PAYLOAD_WARN_BYTES) {\n console.warn(\n `[mreact] large await payload for \"${awaitId}\": ${(byteLength / 1024).toFixed(1)}KB ` +\n `(over the 100KB warning threshold). Consider streaming the data via loader or ` +\n `splitting into smaller boundaries.`,\n );\n }\n}\n\nfunction serializeAwaitHydrationValue(value: unknown, awaitId: string): string | undefined {\n try {\n const json = JSON.stringify(value);\n if (json === undefined) {\n return undefined;\n }\n\n warnIfNonSerializableAwaitValue(value, awaitId);\n reportAwaitPayloadSize(json, awaitId);\n\n // Defuse `</script>` and runaway control characters so the data can be\n // safely embedded inside a `<script>` element.\n return json\n .replaceAll(\"<\", \"\\\\u003c\")\n .replaceAll(\"\\u2028\", \"\\\\u2028\")\n .replaceAll(\"\\u2029\", \"\\\\u2029\");\n } catch {\n return undefined;\n }\n}\n\nfunction inheritBackpressure(childSink: StringHtmlSink, parentSink: HtmlSink): StringHtmlSink {\n if (parentSink.backpressure === undefined) {\n return childSink;\n }\n\n return {\n ...childSink,\n backpressure: parentSink.backpressure,\n };\n}\n\n/** Emits a placeholder immediately and defers resolved HTML as an out-of-order fragment. */\nexport function renderOutOfOrderBoundary<T>(\n sink: HtmlSink,\n id: string,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: OutOfOrderBoundaryOptions = {},\n): void {\n const boundaryId = nextOutOfOrderBoundaryInstanceId(sink, id);\n const placeholderSink = createStringSink();\n const placeholderResult = options.placeholder?.(placeholderSink);\n if (!isProductionMode() && isPromiseLikeUnknown(placeholderResult)) {\n throw new Error(\"renderOutOfOrderBoundary placeholder must be synchronous.\");\n }\n const placeholderTag = normalizeOutOfOrderPlaceholderTag(options.placeholderTag);\n const hydrationStart =\n options.hydration === true ? `<!--mreact-h:start:${encodeURIComponent(boundaryId)}-->` : \"\";\n const hydrationEnd =\n options.hydration === true ? `<!--mreact-h:end:${encodeURIComponent(boundaryId)}-->` : \"\";\n sink.append(\n `${hydrationStart}<${placeholderTag} data-mreact-oob-placeholder=\"${escapeAttribute(boundaryId)}\">${placeholderSink.toString()}</${placeholderTag}>${hydrationEnd}`,\n );\n\n const task = renderOutOfOrderFragment(sink, boundaryId, value, render, options);\n\n if (sink.defer === undefined) {\n void task;\n return;\n }\n\n sink.defer(task);\n}\n\nfunction normalizeOutOfOrderPlaceholderTag(tag: unknown): string {\n if (typeof tag !== \"string\") {\n return \"span\";\n }\n\n const normalized = tag.trim().toLowerCase();\n return /^[a-z][a-z0-9-]*$/.test(normalized) ? normalized : \"span\";\n}\n\nasync function renderOutOfOrderFragment<T>(\n sink: HtmlSink,\n id: string,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: OutOfOrderBoundaryOptions,\n): Promise<void> {\n const fragmentSink = inheritBackpressure(createStringSink(), sink);\n let resolvedValue: unknown;\n let hasResolvedValue = false;\n\n await renderAsyncBoundary(\n fragmentSink,\n value,\n async (childSink, resolved) => {\n resolvedValue = resolved;\n hasResolvedValue = true;\n await render(childSink, resolved);\n },\n options.catch === undefined ? {} : { catch: options.catch },\n );\n await fragmentSink.drain();\n\n sink.append(renderOutOfOrderFragmentHtml(id, fragmentSink.toString()));\n\n if (hasResolvedValue && options.hydrationAwaitId !== undefined) {\n appendAwaitHydrationData(sink, options.hydrationAwaitId, resolvedValue);\n }\n}\n\n/** Emits the client script that swaps out-of-order fragments into their placeholders. */\nexport function renderOutOfOrderReorderScript(\n sink: HtmlSink,\n options: OutOfOrderReorderScriptOptions = {},\n): void {\n const nonceAttribute =\n options.nonce === undefined ? \"\" : ` nonce=\"${escapeAttribute(options.nonce)}\"`;\n\n if (options.src !== undefined) {\n sink.append(\n `<script data-mreact-oob-reorder${nonceAttribute} src=\"${escapeAttribute(options.src)}\"></script>`,\n );\n return;\n }\n\n sink.append(\n `<script data-mreact-oob-reorder${nonceAttribute}>${outOfOrderReorderScript}</script>`,\n );\n}\n\nfunction renderOutOfOrderFragmentHtml(id: string, html: string): string {\n const escapedId = escapeAttribute(id);\n return `<template data-mreact-oob-fragment=\"${escapedId}\">${html}</template><mreact-oob-complete hidden data-mreact-oob-complete=\"${escapedId}\"></mreact-oob-complete>`;\n}\n\n/** Wraps streamed content in React Suspense completion markers. */\nexport function renderReactSuspenseBoundary(\n sink: HtmlSink,\n render: (sink: HtmlSink) => void | PromiseLike<void>,\n): void | PromiseLike<void> {\n sink.append(\"<!--$-->\");\n const result = render(sink);\n\n if (isPromiseLike(result)) {\n return result.then(() => {\n sink.append(\"<!--/$-->\");\n });\n }\n\n sink.append(\"<!--/$-->\");\n}\n\n/** Emits a React Suspense fallback and streams the resolved segment out of order. */\nexport function renderReactSuspenseOutOfOrderBoundary<T>(\n sink: HtmlSink,\n boundaryId: string,\n segmentId: string,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: ReactSuspenseBoundaryOptions = {},\n): void {\n const actualBoundaryId = nextOutOfOrderBoundaryInstanceId(sink, boundaryId);\n const suffix = actualBoundaryId.slice(boundaryId.length);\n const actualSegmentId = `${segmentId}${suffix}`;\n const fallbackSink = createStringSink();\n void options.fallback?.(fallbackSink);\n sink.append(\n `<!--$?--><template id=\"${escapeAttribute(actualBoundaryId)}\"></template>${fallbackSink.toString()}<!--/$-->`,\n );\n\n const task = renderReactSuspenseSegment(\n sink,\n actualBoundaryId,\n actualSegmentId,\n value,\n render,\n options,\n );\n\n if (sink.defer === undefined) {\n void task;\n return;\n }\n\n sink.defer(task);\n}\n\nfunction nextOutOfOrderBoundaryInstanceId(sink: HtmlSink, id: string): string {\n let instances = outOfOrderBoundaryInstances.get(sink);\n\n if (instances === undefined) {\n instances = new Map();\n outOfOrderBoundaryInstances.set(sink, instances);\n }\n\n const count = instances.get(id) ?? 0;\n instances.set(id, count + 1);\n\n return count === 0 ? id : `${id}-${count.toString(36)}`;\n}\n\n/** Emits a React Suspense boundary that instructs the client to render the fallback. */\nexport function renderReactSuspenseClientRenderBoundary(\n sink: HtmlSink,\n fallback: (sink: HtmlSink) => void | PromiseLike<void>,\n options: ReactSuspenseClientRenderOptions = {},\n): void | PromiseLike<void> {\n sink.append(`<!--$!--><template${renderReactSuspenseErrorAttributes(options)}></template>`);\n const result = fallback(sink);\n\n if (isPromiseLike(result)) {\n return result.then(() => {\n sink.append(\"<!--/$-->\");\n });\n }\n\n sink.append(\"<!--/$-->\");\n}\n\nasync function renderReactSuspenseSegment<T>(\n sink: HtmlSink,\n boundaryId: string,\n segmentId: string,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: ReactSuspenseBoundaryOptions,\n): Promise<void> {\n const segmentSink = inheritBackpressure(createStringSink(), sink);\n\n await renderAsyncBoundary(\n segmentSink,\n value,\n render,\n options.catch === undefined ? {} : { catch: options.catch },\n );\n\n sink.append(\n `<div hidden id=\"${escapeAttribute(segmentId)}\">${segmentSink.toString()}</div>${renderReactSuspenseRevealScript(boundaryId, segmentId, options)}`,\n );\n}\n\nfunction renderReactSuspenseErrorAttributes(options: ReactSuspenseClientRenderOptions): string {\n const message =\n options.message === undefined ? \"\" : ` data-msg=\"${escapeAttribute(options.message)}\"`;\n const stack = options.stack === undefined ? \"\" : ` data-stck=\"${escapeAttribute(options.stack)}\"`;\n\n return `${message}${stack}`;\n}\n\nfunction renderReactSuspenseRevealScript(\n boundaryId: string,\n segmentId: string,\n options: ReactSuspenseScriptOptions = {},\n): string {\n if (options.src !== undefined) {\n return `<script data-mreact-react-suspense-reveal${renderNonceAttribute(options.nonce)} src=\"${escapeAttribute(options.src)}\" data-boundary-id=\"${escapeAttribute(boundaryId)}\" data-segment-id=\"${escapeAttribute(segmentId)}\"></script>`;\n }\n\n return `<script${renderNonceAttribute(options.nonce)}>${reactSuspenseRevealScriptBody};$RC(${serializeScriptJson(boundaryId)},${serializeScriptJson(segmentId)})</script>`;\n}\n\n/** Wraps server-rendered HTML in hydration start and end markers. */\nexport function renderHydrationBoundary(\n sink: HtmlSink,\n id: string,\n render: (sink: HtmlSink) => void | PromiseLike<void>,\n): void | PromiseLike<void> {\n const markerId = encodeURIComponent(id);\n sink.append(`<!--mreact-h:start:${markerId}-->`);\n const result = render(sink);\n\n if (isPromiseLike(result)) {\n return result.then(() => {\n sink.append(`<!--mreact-h:end:${markerId}-->`);\n });\n }\n\n sink.append(`<!--mreact-h:end:${markerId}-->`);\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<void> {\n return isPromiseLikeUnknown(value);\n}\n\nconst outOfOrderReorderScript = `(()=>{function apply(root){const fragments=Array.from(root.querySelectorAll(\"template[data-mreact-oob-fragment]\"));const markers=new Map();for(const marker of root.querySelectorAll(\"[data-mreact-oob-complete]\")){const id=marker.getAttribute(\"data-mreact-oob-complete\");if(!markers.has(id))markers.set(id,marker);}const placeholders=new Map();for(const placeholder of root.querySelectorAll(\"[data-mreact-oob-placeholder]\")){const id=placeholder.getAttribute(\"data-mreact-oob-placeholder\");if(!placeholders.has(id))placeholders.set(id,placeholder);}for(const fragment of fragments){const id=fragment.getAttribute(\"data-mreact-oob-fragment\");if(id===null)continue;const marker=markers.get(id);if(marker===undefined)continue;const placeholder=placeholders.get(id);if(placeholder===undefined)continue;placeholder.replaceWith(fragment.content.cloneNode(true));fragment.remove();marker.remove();}}apply(document);new MutationObserver(()=>apply(document)).observe(document.documentElement,{childList:true,subtree:true});})();`;\n\nconst reactSuspenseRevealScriptBody = `(self.$RC=self.$RC||function(bid,sid){var b=document.getElementById(bid);var s=document.getElementById(sid);if(!b||!s)return;var p=b.parentNode;var e=b.nextSibling;var d=0;var r=[];for(var n=e;n;n=n.nextSibling){if(n.nodeType===8){if(n.data===\"$\"||n.data===\"$?\"||n.data===\"$!\")d++;else if(n.data===\"/$\"){if(d===0){e=n;break;}d--;}}r.push(n);}for(var i=0;r[i];i++)p.removeChild(r[i]);while(s.firstChild)p.insertBefore(s.firstChild,e);s.remove();b.data=\"$\";})`;\n\n/** External script body that reveals a React Suspense segment when loaded. */\nexport const reactSuspenseRevealExternalScript = `(()=>{${reactSuspenseRevealScriptBody};var s=document.currentScript;if(!s)return;var b=s.getAttribute(\"data-boundary-id\");var seg=s.getAttribute(\"data-segment-id\");if(b!==null&&seg!==null)self.$RC(b,seg);})();`;\n"]}
|
package/dist/flight.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flight.d.ts","sourceRoot":"","sources":["../src/flight.ts"],"names":[],"mappings":"AAGA,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,eAA+C,CAAC;AAClF,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,eAA+C,CAAC;AAKlF,iEAAiE;AACjE,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,8EAA8E;AAC9E,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,yDAAyD;AACzD,MAAM,WAAW,yBAA0B,SAAQ,0BAA0B;IAC3E,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,oEAAoE;AACpE,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9E,0DAA0D;AAC1D,MAAM,MAAM,4BAA4B,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5D,6DAA6D;AAC7D,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,4BAA4B,CAAC;CAClE;AAED,uDAAuD;AACvD,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,sBAAsB,CAAC,CAAC;AAEzF,0DAA0D;AAC1D,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,oEAAoE;AACpE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qEAAqE;AACrE,MAAM,WAAW,0BAA0B;IAKzC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,KAAK,CAAC;IAC3C,SAAS,CAAC,EAAE,CACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,4BAA4B,EACvC,IAAI,EAAE,OAAO,EAAE,KACZ,4BAA4B,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC1E,cAAc,CAAC,EAAE,SAAS,4BAA4B,EAAE,CAAC;IAGzD,IAAI,CAAC,EACD,OAAO,GACP;QACE,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACN,gBAAgB,CAAC,EAAE;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,uBAAuB,CAAC;KAC/B,CAAC;IAIF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"flight.d.ts","sourceRoot":"","sources":["../src/flight.ts"],"names":[],"mappings":"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"}
|
package/dist/flight.js
CHANGED
|
@@ -7,8 +7,42 @@ export const SERVER_REFERENCE_TYPE = Symbol.for("modular.react.server_reference"
|
|
|
7
7
|
const REACT_COMPAT_ELEMENT_TYPE = Symbol.for("react.transitional.element");
|
|
8
8
|
const REACT_COMPAT_FRAGMENT_TYPE = Symbol.for("react.fragment");
|
|
9
9
|
const DEFAULT_MAX_BODY_BYTES = 1024 * 1024;
|
|
10
|
-
const
|
|
11
|
-
const
|
|
10
|
+
const MAX_SERVER_ACTION_ARGUMENT_DEPTH = 64;
|
|
11
|
+
const MAX_SERVER_ACTION_ARGUMENT_ARRAY_LENGTH = 2_000;
|
|
12
|
+
const MAX_SERVER_ACTION_ARGUMENT_OBJECT_KEYS = 200;
|
|
13
|
+
const SERVER_ACTION_FORBIDDEN_JSON_KEYS = new Set(["__proto__", "constructor", "prototype"]);
|
|
14
|
+
const reactFlightBinaryRowTags = [
|
|
15
|
+
"A",
|
|
16
|
+
"O",
|
|
17
|
+
"o",
|
|
18
|
+
"U",
|
|
19
|
+
"S",
|
|
20
|
+
"s",
|
|
21
|
+
"L",
|
|
22
|
+
"l",
|
|
23
|
+
"G",
|
|
24
|
+
"g",
|
|
25
|
+
"M",
|
|
26
|
+
"m",
|
|
27
|
+
"V",
|
|
28
|
+
];
|
|
29
|
+
const reactFlightRowTags = [
|
|
30
|
+
"C",
|
|
31
|
+
"D",
|
|
32
|
+
"E",
|
|
33
|
+
"F",
|
|
34
|
+
"H",
|
|
35
|
+
"I",
|
|
36
|
+
"J",
|
|
37
|
+
"N",
|
|
38
|
+
"P",
|
|
39
|
+
"R",
|
|
40
|
+
"T",
|
|
41
|
+
"W",
|
|
42
|
+
"X",
|
|
43
|
+
"x",
|
|
44
|
+
"r",
|
|
45
|
+
];
|
|
12
46
|
const reactFlightModelTokens = [
|
|
13
47
|
"$",
|
|
14
48
|
"$$",
|
|
@@ -142,7 +176,15 @@ export function createServerActionHandler(actions, options = {}) {
|
|
|
142
176
|
const action = getServerAction(actionEntry);
|
|
143
177
|
const validateArgs = getServerActionArgsValidator(actionEntry);
|
|
144
178
|
const boundArgs = Array.isArray(payload.bound) ? payload.bound : [];
|
|
145
|
-
const
|
|
179
|
+
const extraArgs = Array.isArray(payload.args) ? payload.args : [];
|
|
180
|
+
const argsStructure = validateServerActionJsonArgumentStructure(boundArgs, extraArgs);
|
|
181
|
+
if (!argsStructure.valid) {
|
|
182
|
+
return jsonResponse({
|
|
183
|
+
ok: false,
|
|
184
|
+
error: "Invalid server action argument structure.",
|
|
185
|
+
}, 400);
|
|
186
|
+
}
|
|
187
|
+
const args = [...boundArgs, ...extraArgs];
|
|
146
188
|
const validationResult = validateArgs?.(args);
|
|
147
189
|
if (validationResult !== undefined && validationResult !== true) {
|
|
148
190
|
return jsonResponse({
|
|
@@ -434,9 +476,7 @@ function resolveFlightPromiseChunks(model, modelChunks, errorChunks, depth = 0,
|
|
|
434
476
|
]));
|
|
435
477
|
}
|
|
436
478
|
function encodeReactFlightModel(model, state) {
|
|
437
|
-
if (model === null ||
|
|
438
|
-
typeof model === "number" ||
|
|
439
|
-
typeof model === "boolean") {
|
|
479
|
+
if (model === null || typeof model === "number" || typeof model === "boolean") {
|
|
440
480
|
return model;
|
|
441
481
|
}
|
|
442
482
|
if (typeof model === "string") {
|
|
@@ -531,10 +571,7 @@ function encodeReactFlightElementType(type, clientWireIds) {
|
|
|
531
571
|
function encodeReactFlightProps(props, state) {
|
|
532
572
|
return Object.fromEntries(Object.entries(props)
|
|
533
573
|
.filter((entry) => entry[1] !== undefined)
|
|
534
|
-
.map(([key, value]) => [
|
|
535
|
-
key,
|
|
536
|
-
encodeReactFlightModel(value, state),
|
|
537
|
-
]));
|
|
574
|
+
.map(([key, value]) => [key, encodeReactFlightModel(value, state)]));
|
|
538
575
|
}
|
|
539
576
|
function parseReactFlightRow(line) {
|
|
540
577
|
const separator = line.indexOf(":");
|
|
@@ -555,7 +592,7 @@ function parseReactFlightRow(line) {
|
|
|
555
592
|
};
|
|
556
593
|
}
|
|
557
594
|
function looksLikeUnsupportedReactFlightTag(tag, body) {
|
|
558
|
-
return /^[A-Z]$/.test(tag) && (body[1] === "{" || body[1] === "[" || body[1] === "
|
|
595
|
+
return /^[A-Z]$/.test(tag) && (body[1] === "{" || body[1] === "[" || body[1] === '"');
|
|
559
596
|
}
|
|
560
597
|
function parseReactFlightTextChunk(payload) {
|
|
561
598
|
const separator = payload.indexOf(",");
|
|
@@ -753,9 +790,7 @@ function createFlightDecodeContext() {
|
|
|
753
790
|
function decodeReactFlightModel(value, modelChunks = new Map(), errorChunks = new Map(), depth = 0, context = createFlightDecodeContext()) {
|
|
754
791
|
if (depth > MAX_FLIGHT_DECODE_DEPTH)
|
|
755
792
|
flightTooDeep();
|
|
756
|
-
if (value === null ||
|
|
757
|
-
typeof value === "number" ||
|
|
758
|
-
typeof value === "boolean") {
|
|
793
|
+
if (value === null || typeof value === "number" || typeof value === "boolean") {
|
|
759
794
|
return value;
|
|
760
795
|
}
|
|
761
796
|
if (typeof value === "string") {
|
|
@@ -832,7 +867,9 @@ function decodeReactFlightString(value, modelChunks, errorChunks, depth, context
|
|
|
832
867
|
if (/^\$Q[0-9a-f]+$/i.test(value)) {
|
|
833
868
|
const decoded = decodeReactFlightChunk(value.slice(2), modelChunks, errorChunks, depth + 1, context);
|
|
834
869
|
const entries = Array.isArray(decoded)
|
|
835
|
-
? decoded.map((entry) => Array.isArray(entry)
|
|
870
|
+
? decoded.map((entry) => Array.isArray(entry)
|
|
871
|
+
? [entry[0] ?? { kind: "undefined" }, entry[1] ?? { kind: "undefined" }]
|
|
872
|
+
: [entry, { kind: "undefined" }])
|
|
836
873
|
: [];
|
|
837
874
|
return {
|
|
838
875
|
kind: "map",
|
|
@@ -866,11 +903,11 @@ function decodeReactFlightString(value, modelChunks, errorChunks, depth, context
|
|
|
866
903
|
};
|
|
867
904
|
}
|
|
868
905
|
if (/^\$Z[0-9a-f]+$/i.test(value)) {
|
|
869
|
-
return errorChunks.get(parseReactFlightId(value.slice(2))) ?? {
|
|
906
|
+
return (errorChunks.get(parseReactFlightId(value.slice(2))) ?? {
|
|
870
907
|
kind: "error",
|
|
871
908
|
name: "Error",
|
|
872
909
|
message: "Unknown React Flight error.",
|
|
873
|
-
};
|
|
910
|
+
});
|
|
874
911
|
}
|
|
875
912
|
if (value === "$Y" || value.startsWith("$E")) {
|
|
876
913
|
return { kind: "undefined" };
|
|
@@ -950,10 +987,7 @@ function encodeReactFlightError(model) {
|
|
|
950
987
|
};
|
|
951
988
|
}
|
|
952
989
|
function isFlightErrorModel(model) {
|
|
953
|
-
return (typeof model === "object" &&
|
|
954
|
-
model !== null &&
|
|
955
|
-
!Array.isArray(model) &&
|
|
956
|
-
model.kind === "error");
|
|
990
|
+
return (typeof model === "object" && model !== null && !Array.isArray(model) && model.kind === "error");
|
|
957
991
|
}
|
|
958
992
|
function valueIsObject(value) {
|
|
959
993
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -967,15 +1001,14 @@ function parseReactFlightId(value) {
|
|
|
967
1001
|
async function serializeFlightValue(value, state, depth) {
|
|
968
1002
|
if (depth > MAX_FLIGHT_DECODE_DEPTH)
|
|
969
1003
|
flightTooDeep();
|
|
970
|
-
const awaited = await value;
|
|
1004
|
+
const awaited = isThenable(value) ? await value : value;
|
|
971
1005
|
if (awaited === null) {
|
|
972
1006
|
return null;
|
|
973
1007
|
}
|
|
974
1008
|
if (awaited === undefined) {
|
|
975
1009
|
return { kind: "undefined" };
|
|
976
1010
|
}
|
|
977
|
-
if (typeof awaited === "string" ||
|
|
978
|
-
typeof awaited === "boolean") {
|
|
1011
|
+
if (typeof awaited === "string" || typeof awaited === "boolean") {
|
|
979
1012
|
return awaited;
|
|
980
1013
|
}
|
|
981
1014
|
if (typeof awaited === "number") {
|
|
@@ -1032,10 +1065,7 @@ async function serializeFlightValue(value, state, depth) {
|
|
|
1032
1065
|
if (isFormDataLike(awaited)) {
|
|
1033
1066
|
return {
|
|
1034
1067
|
kind: "form-data",
|
|
1035
|
-
entries: await Promise.all(Array.from(awaited.entries()).map(async ([key, value]) => [
|
|
1036
|
-
key,
|
|
1037
|
-
await serializeFlightValue(value, state, depth + 1),
|
|
1038
|
-
])),
|
|
1068
|
+
entries: await Promise.all(Array.from(awaited.entries()).map(async ([key, value]) => [key, await serializeFlightValue(value, state, depth + 1)])),
|
|
1039
1069
|
};
|
|
1040
1070
|
}
|
|
1041
1071
|
if (isIterableObject(awaited)) {
|
|
@@ -1090,17 +1120,11 @@ async function serializeElement(element, state, depth) {
|
|
|
1090
1120
|
throw new TypeError("Unsupported Flight element type.");
|
|
1091
1121
|
}
|
|
1092
1122
|
async function serializeProps(props, state, depth) {
|
|
1093
|
-
const entries = await Promise.all(Object.entries(props).map(async ([key, value]) => [
|
|
1094
|
-
key,
|
|
1095
|
-
await serializeFlightValue(value, state, depth + 1),
|
|
1096
|
-
]));
|
|
1123
|
+
const entries = await Promise.all(Object.entries(props).map(async ([key, value]) => [key, await serializeFlightValue(value, state, depth + 1)]));
|
|
1097
1124
|
return Object.fromEntries(entries);
|
|
1098
1125
|
}
|
|
1099
1126
|
async function serializeObject(object, state, depth) {
|
|
1100
|
-
return Object.fromEntries(await Promise.all(Object.entries(object).map(async ([key, value]) => [
|
|
1101
|
-
key,
|
|
1102
|
-
await serializeFlightValue(value, state, depth + 1),
|
|
1103
|
-
])));
|
|
1127
|
+
return Object.fromEntries(await Promise.all(Object.entries(object).map(async ([key, value]) => [key, await serializeFlightValue(value, state, depth + 1)])));
|
|
1104
1128
|
}
|
|
1105
1129
|
function getClientReferenceId(reference, state) {
|
|
1106
1130
|
const key = `${reference.moduleId}:${reference.exportName}`;
|
|
@@ -1142,6 +1166,11 @@ function isReactCompatElement(value) {
|
|
|
1142
1166
|
value !== null &&
|
|
1143
1167
|
value.$$typeof === REACT_COMPAT_ELEMENT_TYPE);
|
|
1144
1168
|
}
|
|
1169
|
+
function isThenable(value) {
|
|
1170
|
+
return (value !== null &&
|
|
1171
|
+
(typeof value === "object" || typeof value === "function") &&
|
|
1172
|
+
typeof value.then === "function");
|
|
1173
|
+
}
|
|
1145
1174
|
function isFormDataLike(value) {
|
|
1146
1175
|
return typeof FormData !== "undefined" && value instanceof FormData;
|
|
1147
1176
|
}
|
|
@@ -1193,6 +1222,49 @@ async function readServerActionPayload(request, maxBodyBytes) {
|
|
|
1193
1222
|
return jsonResponse({ ok: false, error: "Invalid JSON payload." }, 400);
|
|
1194
1223
|
}
|
|
1195
1224
|
}
|
|
1225
|
+
function validateServerActionJsonArgumentStructure(boundArgs, args) {
|
|
1226
|
+
const stack = [
|
|
1227
|
+
{ depth: 0, value: boundArgs },
|
|
1228
|
+
{ depth: 0, value: args },
|
|
1229
|
+
];
|
|
1230
|
+
const seen = new WeakSet();
|
|
1231
|
+
while (stack.length > 0) {
|
|
1232
|
+
const current = stack.pop();
|
|
1233
|
+
if (current === undefined) {
|
|
1234
|
+
continue;
|
|
1235
|
+
}
|
|
1236
|
+
if (current.depth > MAX_SERVER_ACTION_ARGUMENT_DEPTH) {
|
|
1237
|
+
return { valid: false };
|
|
1238
|
+
}
|
|
1239
|
+
if (current.value === null || typeof current.value !== "object") {
|
|
1240
|
+
continue;
|
|
1241
|
+
}
|
|
1242
|
+
if (seen.has(current.value)) {
|
|
1243
|
+
continue;
|
|
1244
|
+
}
|
|
1245
|
+
seen.add(current.value);
|
|
1246
|
+
if (Array.isArray(current.value)) {
|
|
1247
|
+
if (current.value.length > MAX_SERVER_ACTION_ARGUMENT_ARRAY_LENGTH) {
|
|
1248
|
+
return { valid: false };
|
|
1249
|
+
}
|
|
1250
|
+
for (const item of current.value) {
|
|
1251
|
+
stack.push({ depth: current.depth + 1, value: item });
|
|
1252
|
+
}
|
|
1253
|
+
continue;
|
|
1254
|
+
}
|
|
1255
|
+
const entries = Object.entries(current.value);
|
|
1256
|
+
if (entries.length > MAX_SERVER_ACTION_ARGUMENT_OBJECT_KEYS) {
|
|
1257
|
+
return { valid: false };
|
|
1258
|
+
}
|
|
1259
|
+
for (const [key, value] of entries) {
|
|
1260
|
+
if (SERVER_ACTION_FORBIDDEN_JSON_KEYS.has(key)) {
|
|
1261
|
+
return { valid: false };
|
|
1262
|
+
}
|
|
1263
|
+
stack.push({ depth: current.depth + 1, value });
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
return { valid: true };
|
|
1267
|
+
}
|
|
1196
1268
|
function getServerAction(entry) {
|
|
1197
1269
|
return typeof entry === "function" ? entry : entry.action;
|
|
1198
1270
|
}
|