@reckona/mreact-server 0.0.132 → 0.0.134

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.
@@ -28,4 +28,5 @@ export declare function renderEventHydrationManifest(sink: HtmlSink, manifest: E
28
28
  export declare function renderScriptAsset(sink: HtmlSink, options: ScriptAssetOptions): void;
29
29
  export declare function html(node: unknown, options?: HtmlResponseOptions): Response;
30
30
  export declare function renderToString(render: StreamRender): Promise<string>;
31
+ export declare function renderReactNodeToString(node: unknown): Promise<string>;
31
32
  //# sourceMappingURL=html-helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-helpers.d.ts","sourceRoot":"","sources":["../src/html-helpers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAGzE,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,eAAe,CAAC;AAavB,OAAO,EAAsC,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAGlF,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,GAAG,iBAAiB,CAAC;CAC/C;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,sBAA2B,GACnC,IAAI,CAIN;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,mBAAmB,EAAE,GACrC,sBAAsB,CAKxB;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,sBAAsB,EAChC,OAAO,GAAE,sBAA2B,GACnC,IAAI,CAIN;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAWnF;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,mBAAwB,GAAG,QAAQ,CAuB/E;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAO1E"}
1
+ {"version":3,"file":"html-helpers.d.ts","sourceRoot":"","sources":["../src/html-helpers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAGzE,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,eAAe,CAAC;AAavB,OAAO,EAAsC,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAGlF,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,GAAG,iBAAiB,CAAC;CAC/C;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,sBAA2B,GACnC,IAAI,CAIN;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,mBAAmB,EAAE,GACrC,sBAAsB,CAKxB;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,sBAAsB,EAChC,OAAO,GAAE,sBAA2B,GACnC,IAAI,CAIN;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAWnF;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,mBAAwB,GAAG,QAAQ,CAuB/E;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAO1E;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ5E"}
@@ -50,6 +50,13 @@ export async function renderToString(render) {
50
50
  await sink.drain();
51
51
  return sink.toString();
52
52
  }
53
+ export async function renderReactNodeToString(node) {
54
+ const sink = createStringSink();
55
+ const state = { suspenseId: 0 };
56
+ await appendReactNode(sink, node, state);
57
+ await sink.drain();
58
+ return sink.toString();
59
+ }
53
60
  function appendReactNode(sink, node, state) {
54
61
  if (isPromiseLikeNode(node)) {
55
62
  return node.then((resolved) => appendReactNode(sink, resolved, state));
@@ -159,7 +166,7 @@ function appendRawTextNodeList(sink, nodes) {
159
166
  return chain;
160
167
  }
161
168
  function appendSuspenseElement(sink, element, state) {
162
- const rendered = renderReactNodeToString(element.props.children, state);
169
+ const rendered = renderReactNodeChildrenToString(element.props.children, state);
163
170
  if (!isPromiseLikeString(rendered)) {
164
171
  renderReactSuspenseBoundary(sink, (boundarySink) => {
165
172
  boundarySink.append(rendered);
@@ -172,7 +179,7 @@ function appendSuspenseElement(sink, element, state) {
172
179
  boundarySink.append(renderedHtml);
173
180
  }, {
174
181
  fallback(boundarySink) {
175
- const fallback = renderReactNodeToString(element.props.fallback, state);
182
+ const fallback = renderReactNodeChildrenToString(element.props.fallback, state);
176
183
  if (isPromiseLikeString(fallback)) {
177
184
  return fallback.then((html) => {
178
185
  boundarySink.append(html);
@@ -182,7 +189,7 @@ function appendSuspenseElement(sink, element, state) {
182
189
  },
183
190
  });
184
191
  }
185
- function renderReactNodeToString(node, state) {
192
+ function renderReactNodeChildrenToString(node, state) {
186
193
  const sink = createStringSink();
187
194
  const result = appendReactNode(sink, node, state);
188
195
  const finish = () => hasDeferredTasks(sink) ? sink.drain().then(() => sink.toString()) : sink.toString();
@@ -295,7 +302,9 @@ const HTML_ATTRIBUTE_ALIASES = {
295
302
  };
296
303
  function isBooleanishStringAttribute(name) {
297
304
  const attributeName = toHtmlAttributeName(name).toLowerCase();
298
- return attributeName.startsWith("aria-") || BOOLEANISH_STRING_ATTRIBUTES.has(attributeName);
305
+ return (attributeName.startsWith("aria-") ||
306
+ attributeName.startsWith("data-") ||
307
+ BOOLEANISH_STRING_ATTRIBUTES.has(attributeName));
299
308
  }
300
309
  const BOOLEANISH_STRING_ATTRIBUTES = new Set([
301
310
  "contenteditable",
@@ -1 +1 @@
1
- {"version":3,"file":"html-helpers.js","sourceRoot":"","sources":["../src/html-helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Fragment,\n Suspense as ReactCompatSuspense,\n isValidElement,\n type ReactCompatElement,\n type ReactCompatNode,\n} from \"@reckona/mreact-compat\";\nimport type { HtmlSink } from \"@reckona/mreact-shared/compiler-contract\";\nimport { escapeHtmlText as escapeHtml } from \"@reckona/mreact-shared/html-escape\";\nimport { isVoidHtmlElement } from \"@reckona/mreact-shared\";\nimport {\n renderReactSuspenseBoundary,\n renderReactSuspenseOutOfOrderBoundary,\n type HydrationScriptOptions,\n} from \"./boundary.js\";\nimport {\n isDangerousHtmlAttribute,\n isDangerousHtmlOptIn,\n isUnsafeMetaRefreshContent,\n isUnsafeUrlAttribute,\n} from \"./url-safety.js\";\nimport {\n escapeAttribute,\n isPromiseLikeUnknown,\n renderNonceAttribute,\n serializeScriptJson,\n} from \"./html-internals.js\";\nimport { createStringSink, hasDeferredTasks, type StreamRender } from \"./sink.js\";\nimport { renderToReadableStream } from \"./stream.js\";\n\nexport interface ScriptAssetOptions {\n src: string;\n nonce?: string;\n integrity?: string;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n}\n\nexport interface EventHydrationEntry {\n id: string;\n event: string;\n handler: string;\n}\n\nexport interface EventHydrationManifest {\n version: 1;\n events: EventHydrationEntry[];\n}\n\nexport interface HtmlResponseOptions {\n headers?: HeadersInit;\n status?: number;\n statusText?: string;\n}\n\nexport function serializeSsrState(value: unknown): string {\n return serializeScriptJson(value);\n}\n\nexport function renderSsrState(\n sink: HtmlSink,\n value: unknown,\n options: HydrationScriptOptions = {},\n): void {\n sink.append(\n `<script type=\"application/json\" data-mreact-ssr-state${renderNonceAttribute(options.nonce)}>${serializeSsrState(value)}</script>`,\n );\n}\n\nexport function createEventHydrationManifest(\n events: readonly EventHydrationEntry[],\n): EventHydrationManifest {\n return {\n version: 1,\n events: events.map((event) => ({ ...event })),\n };\n}\n\nexport function renderEventHydrationManifest(\n sink: HtmlSink,\n manifest: EventHydrationManifest,\n options: HydrationScriptOptions = {},\n): void {\n sink.append(\n `<script type=\"application/json\" data-mreact-event-manifest${renderNonceAttribute(options.nonce)}>${serializeSsrState(manifest)}</script>`,\n );\n}\n\nexport function renderScriptAsset(sink: HtmlSink, options: ScriptAssetOptions): void {\n const integrityAttribute =\n options.integrity === undefined ? \"\" : ` integrity=\"${escapeAttribute(options.integrity)}\"`;\n const crossOrigin =\n options.integrity === undefined ? options.crossOrigin : (options.crossOrigin ?? \"anonymous\");\n const crossOriginAttribute =\n crossOrigin === undefined ? \"\" : ` crossorigin=\"${escapeAttribute(crossOrigin)}\"`;\n\n sink.append(\n `<script src=\"${escapeAttribute(options.src)}\"${renderNonceAttribute(options.nonce)}${integrityAttribute}${crossOriginAttribute}></script>`,\n );\n}\n\nexport function html(node: unknown, options: HtmlResponseOptions = {}): Response {\n const headers = new Headers(options.headers);\n const responseOptions: ResponseInit = { headers };\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"text/html; charset=utf-8\");\n }\n\n if (options.status !== undefined) {\n responseOptions.status = options.status;\n }\n\n if (options.statusText !== undefined) {\n responseOptions.statusText = options.statusText;\n }\n\n return new Response(\n renderToReadableStream((sink) => {\n const state: HtmlRenderState = { suspenseId: 0 };\n return appendReactNode(sink, node, state);\n }),\n responseOptions,\n );\n}\n\nexport async function renderToString(render: StreamRender): Promise<string> {\n const sink = createStringSink();\n\n await render(sink);\n await sink.drain();\n\n return sink.toString();\n}\n\ninterface HtmlRenderState {\n suspenseId: number;\n}\n\nfunction appendReactNode(\n sink: HtmlSink,\n node: unknown,\n state: HtmlRenderState,\n): void | PromiseLike<void> {\n if (isPromiseLikeNode(node)) {\n return node.then((resolved) => appendReactNode(sink, resolved, state));\n }\n\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n\n if (typeof node === \"string\" || typeof node === \"number\") {\n sink.append(escapeHtml(node));\n return;\n }\n\n if (Array.isArray(node)) {\n return appendReactNodeList(sink, node, state);\n }\n\n if (!isValidElement(node)) {\n return;\n }\n\n return appendReactElement(sink, node, state);\n}\n\nfunction appendReactNodeList(\n sink: HtmlSink,\n nodes: readonly unknown[],\n state: HtmlRenderState,\n): void | PromiseLike<void> {\n let chain: PromiseLike<void> | undefined;\n\n for (const node of nodes) {\n if (chain !== undefined) {\n chain = chain.then(() => appendReactNode(sink, node, state));\n continue;\n }\n\n const result = appendReactNode(sink, node, state);\n\n if (isPromiseLike(result)) {\n chain = result;\n }\n }\n\n return chain;\n}\n\nfunction appendReactElement(\n sink: HtmlSink,\n element: ReactCompatElement,\n state: HtmlRenderState,\n): void | PromiseLike<void> {\n if (typeof element.type === \"string\") {\n return appendHostElement(sink, element, state);\n }\n\n if (element.type === Fragment) {\n return appendReactNode(sink, element.props.children, state);\n }\n\n if (element.type === ReactCompatSuspense) {\n return appendSuspenseElement(sink, element, state);\n }\n\n if (isClassComponentType(element.type)) {\n const instance = new element.type(element.props);\n return appendReactNode(sink, instance.render(), state);\n }\n\n if (typeof element.type === \"function\") {\n return appendReactNode(sink, element.type(element.props), state);\n }\n}\n\nfunction isClassComponentType(\n value: unknown,\n): value is new (props: Record<string, unknown>) => { render(): ReactCompatNode } {\n return typeof value === \"function\" && value.prototype?.render !== undefined;\n}\n\nfunction appendHostElement(\n sink: HtmlSink,\n element: ReactCompatElement,\n state: HtmlRenderState,\n): void | PromiseLike<void> {\n const tagName = element.type as string;\n const innerHtml = (element.props as { dangerouslySetInnerHTML?: { __html?: unknown } })\n .dangerouslySetInnerHTML;\n sink.append(`<${tagName}${renderHtmlAttributes(element.props)}>`);\n\n if (isVoidHtmlElement(tagName)) {\n return;\n }\n\n if (innerHtml !== undefined) {\n sink.append(String(innerHtml.__html ?? \"\"));\n sink.append(`</${tagName}>`);\n return;\n }\n\n const result = isRawTextElement(tagName)\n ? appendRawTextNode(sink, element.props.children)\n : appendReactNode(sink, element.props.children, state);\n\n if (isPromiseLike(result)) {\n return result.then(() => {\n sink.append(`</${tagName}>`);\n });\n }\n\n sink.append(`</${tagName}>`);\n}\n\nfunction isRawTextElement(tagName: string): boolean {\n return tagName === \"script\" || tagName === \"style\";\n}\n\nfunction appendRawTextNode(sink: HtmlSink, node: unknown): void | PromiseLike<void> {\n if (isPromiseLikeNode(node)) {\n return node.then((resolved) => appendRawTextNode(sink, resolved));\n }\n\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n\n if (Array.isArray(node)) {\n return appendRawTextNodeList(sink, node);\n }\n\n if (typeof node === \"string\" || typeof node === \"number\") {\n sink.append(String(node));\n }\n}\n\nfunction appendRawTextNodeList(\n sink: HtmlSink,\n nodes: readonly unknown[],\n): void | PromiseLike<void> {\n let chain: PromiseLike<void> | undefined;\n\n for (const node of nodes) {\n if (chain !== undefined) {\n chain = chain.then(() => appendRawTextNode(sink, node));\n continue;\n }\n\n const result = appendRawTextNode(sink, node);\n\n if (isPromiseLike(result)) {\n chain = result;\n }\n }\n\n return chain;\n}\n\nfunction appendSuspenseElement(\n sink: HtmlSink,\n element: ReactCompatElement,\n state: HtmlRenderState,\n): void {\n const rendered = renderReactNodeToString(element.props.children, state);\n\n if (!isPromiseLikeString(rendered)) {\n renderReactSuspenseBoundary(sink, (boundarySink) => {\n boundarySink.append(rendered);\n });\n return;\n }\n\n const id = state.suspenseId;\n state.suspenseId += 1;\n renderReactSuspenseOutOfOrderBoundary(\n sink,\n `B:${id}`,\n `S:${id}`,\n rendered,\n (boundarySink, renderedHtml) => {\n boundarySink.append(renderedHtml);\n },\n {\n fallback(boundarySink) {\n const fallback = renderReactNodeToString(\n (element.props as { fallback?: ReactCompatNode }).fallback,\n state,\n );\n\n if (isPromiseLikeString(fallback)) {\n return fallback.then((html) => {\n boundarySink.append(html);\n });\n }\n\n boundarySink.append(fallback);\n },\n },\n );\n}\n\nfunction renderReactNodeToString(\n node: unknown,\n state: HtmlRenderState,\n): string | PromiseLike<string> {\n const sink = createStringSink();\n const result = appendReactNode(sink, node, state);\n const finish = () =>\n hasDeferredTasks(sink) ? sink.drain().then(() => sink.toString()) : sink.toString();\n\n if (isPromiseLike(result)) {\n return result.then(finish);\n }\n\n return finish();\n}\n\nfunction renderHtmlAttributes(props: Record<string, unknown>): string {\n // Issue 078: <meta http-equiv=\"refresh\" content=\"0;url=javascript:...\">\n // is URL-bearing only when http-equiv is \"refresh\", so we need both\n // attributes in scope to make the call. Strip the unsafe content\n // before per-attribute rendering.\n const sanitizedProps = sanitizeMetaRefreshProps(props);\n return Object.entries(sanitizedProps)\n .map(([name, value]) => renderHtmlAttribute(name, value))\n .filter((attribute) => attribute !== \"\")\n .join(\"\");\n}\n\nfunction sanitizeMetaRefreshProps(\n props: Record<string, unknown>,\n): Record<string, unknown> {\n const httpEquiv = props[\"http-equiv\"] ?? props.httpEquiv;\n const content = props[\"content\"];\n if (typeof httpEquiv !== \"string\" || typeof content !== \"string\") return props;\n if (!isUnsafeMetaRefreshContent(httpEquiv, content)) return props;\n // Drop only `content`; keep http-equiv so the developer's intent is\n // still visible in the rendered HTML (debugging hint).\n const sanitized = { ...props };\n delete sanitized[\"content\"];\n return sanitized;\n}\n\n// Mirrors `isAttributeNameSafe` in react-dom: an attribute name must start with\n// an ASCII letter (or underscore) and contain only word chars, dot, hyphen, or\n// colon. Anything else is dropped to prevent SSR XSS via spread props\n// (`<div {...userControlled} />`). See docs/issues/resolved Issue 060.\nconst VALID_ATTRIBUTE_NAME = /^[A-Za-z_][\\w.\\-:]*$/;\n\n// URL scheme allow/block list is shared with the compiler emit paths\n// (Issues 062 / 073). See packages/server/src/url-safety.ts.\n\nfunction renderHtmlAttribute(name: string, value: unknown): string {\n if (\n name === \"children\" ||\n name === \"dangerouslySetInnerHTML\" ||\n name === \"key\" ||\n name === \"ref\" ||\n value === null ||\n value === undefined ||\n typeof value === \"function\"\n ) {\n return \"\";\n }\n\n const attributeName = toHtmlAttributeName(name);\n\n if (!VALID_ATTRIBUTE_NAME.test(attributeName)) {\n return \"\";\n }\n\n if (value === false && !isBooleanishStringAttribute(attributeName)) {\n return \"\";\n }\n\n // Issue 077: HTML-bearing attributes (`srcdoc`) require the explicit\n // `{ __html: \"...\" }` opt-in. A plain string value -- even if escaped\n // for the attribute syntax -- decodes back to executable HTML inside\n // the iframe document with the parent's origin.\n if (isDangerousHtmlAttribute(attributeName)) {\n if (!isDangerousHtmlOptIn(value)) {\n return \"\";\n }\n return ` ${attributeName}=\"${escapeAttribute(value.__html)}\"`;\n }\n\n if (value === true) {\n if (isBooleanishStringAttribute(attributeName)) {\n return ` ${attributeName}=\"true\"`;\n }\n return ` ${attributeName}`;\n }\n\n if (value === false) {\n return ` ${attributeName}=\"false\"`;\n }\n\n const stringValue = String(value);\n\n if (isUnsafeUrlAttribute(attributeName, stringValue)) {\n return \"\";\n }\n\n return ` ${attributeName}=\"${escapeAttribute(stringValue)}\"`;\n}\n\nfunction toHtmlAttributeName(name: string): string {\n return HTML_ATTRIBUTE_ALIASES[name] ?? name;\n}\n\nconst HTML_ATTRIBUTE_ALIASES: Record<string, string> = {\n acceptCharset: \"accept-charset\",\n autoFocus: \"autofocus\",\n autoPlay: \"autoplay\",\n charSet: \"charset\",\n className: \"class\",\n colSpan: \"colspan\",\n contentEditable: \"contenteditable\",\n crossOrigin: \"crossorigin\",\n encType: \"enctype\",\n formAction: \"formaction\",\n frameBorder: \"frameborder\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\",\n maxLength: \"maxlength\",\n minLength: \"minlength\",\n noValidate: \"novalidate\",\n playsInline: \"playsinline\",\n readOnly: \"readonly\",\n rowSpan: \"rowspan\",\n spellCheck: \"spellcheck\",\n srcDoc: \"srcdoc\",\n srcSet: \"srcset\",\n tabIndex: \"tabindex\",\n useMap: \"usemap\",\n};\n\nfunction isBooleanishStringAttribute(name: string): boolean {\n const attributeName = toHtmlAttributeName(name).toLowerCase();\n return attributeName.startsWith(\"aria-\") || BOOLEANISH_STRING_ATTRIBUTES.has(attributeName);\n}\n\nconst BOOLEANISH_STRING_ATTRIBUTES = new Set<string>([\n \"contenteditable\",\n \"draggable\",\n \"spellcheck\",\n]);\n\nfunction isPromiseLikeNode(value: unknown): value is PromiseLike<unknown> {\n return isPromiseLikeUnknown(value);\n}\n\nfunction isPromiseLikeString(value: unknown): value is PromiseLike<string> {\n return isPromiseLikeUnknown(value);\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<void> {\n return isPromiseLikeUnknown(value);\n}\n"]}
1
+ {"version":3,"file":"html-helpers.js","sourceRoot":"","sources":["../src/html-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,QAAQ,IAAI,mBAAmB,EAC/B,cAAc,GAGf,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,cAAc,IAAI,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,2BAA2B,EAC3B,qCAAqC,GAEtC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAqB,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AA0BrD,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,IAAc,EACd,KAAc,EACd,UAAkC,EAAE;IAEpC,IAAI,CAAC,MAAM,CACT,wDAAwD,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,WAAW,CACnI,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,MAAsC;IAEtC,OAAO;QACL,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,IAAc,EACd,QAAgC,EAChC,UAAkC,EAAE;IAEpC,IAAI,CAAC,MAAM,CACT,6DAA6D,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,WAAW,CAC3I,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAc,EAAE,OAA2B;IAC3E,MAAM,kBAAkB,GACtB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;IAC9F,MAAM,WAAW,GACf,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,WAAW,CAAC,CAAC;IAC/F,MAAM,oBAAoB,GACxB,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,eAAe,CAAC,WAAW,CAAC,GAAG,CAAC;IAEpF,IAAI,CAAC,MAAM,CACT,gBAAgB,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,kBAAkB,GAAG,oBAAoB,YAAY,CAC5I,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAa,EAAE,UAA+B,EAAE;IACnE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,eAAe,GAAiB,EAAE,OAAO,EAAE,CAAC;IAElD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,eAAe,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC1C,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,eAAe,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,QAAQ,CACjB,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAoB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QACjD,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC,CAAC,EACF,eAAe,CAChB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAoB;IACvD,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAEhC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAEnB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAa;IACzD,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,MAAM,KAAK,GAAoB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IAEjD,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAEnB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;AACzB,CAAC;AAMD,SAAS,eAAe,CACtB,IAAc,EACd,IAAa,EACb,KAAsB;IAEtB,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,SAAS,EAAE,CAAC;QACrE,OAAO;IACT,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,OAAO,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAAc,EACd,KAAyB,EACzB,KAAsB;IAEtB,IAAI,KAAoC,CAAC;IAEzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7D,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAElD,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CACzB,IAAc,EACd,OAA2B,EAC3B,KAAsB;IAEtB,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACzC,OAAO,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjD,OAAO,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACvC,OAAO,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAc;IAEd,OAAO,OAAO,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,CAAC;AAC9E,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAc,EACd,OAA2B,EAC3B,KAAsB;IAEtB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAc,CAAC;IACvC,MAAM,SAAS,GAAI,OAAO,CAAC,KAA4D;SACpF,uBAAuB,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAElE,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC;QACtC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjD,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEzD,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC;AACrD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAc,EAAE,IAAa;IACtD,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,SAAS,EAAE,CAAC;QACrE,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAAc,EACd,KAAyB;IAEzB,IAAI,KAAoC,CAAC;IAEzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACxD,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAE7C,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAAc,EACd,OAA2B,EAC3B,KAAsB;IAEtB,MAAM,QAAQ,GAAG,+BAA+B,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEhF,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,2BAA2B,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,EAAE;YACjD,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC;IAC5B,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;IACtB,qCAAqC,CACnC,IAAI,EACJ,KAAK,EAAE,EAAE,EACT,KAAK,EAAE,EAAE,EACT,QAAQ,EACR,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE;QAC7B,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC,EACD;QACE,QAAQ,CAAC,YAAY;YACnB,MAAM,QAAQ,GAAG,+BAA+B,CAC7C,OAAO,CAAC,KAAwC,CAAC,QAAQ,EAC1D,KAAK,CACN,CAAC;YAEF,IAAI,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC5B,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC,CAAC,CAAC;YACL,CAAC;YAED,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;KACF,CACF,CAAC;AACJ,CAAC;AAED,SAAS,+BAA+B,CACtC,IAAa,EACb,KAAsB;IAEtB,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,GAAG,EAAE,CAClB,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAEtF,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,MAAM,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAA8B;IAC1D,wEAAwE;IACxE,oEAAoE;IACpE,iEAAiE;IACjE,kCAAkC;IAClC,MAAM,cAAc,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SACxD,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,EAAE,CAAC;SACvC,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,wBAAwB,CAC/B,KAA8B;IAE9B,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC;IACzD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC/E,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,oEAAoE;IACpE,uDAAuD;IACvD,MAAM,SAAS,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAC/B,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;IAC5B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,gFAAgF;AAChF,+EAA+E;AAC/E,sEAAsE;AACtE,uEAAuE;AACvE,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAEpD,qEAAqE;AACrE,6DAA6D;AAE7D,SAAS,mBAAmB,CAAC,IAAY,EAAE,KAAc;IACvD,IACE,IAAI,KAAK,UAAU;QACnB,IAAI,KAAK,yBAAyB;QAClC,IAAI,KAAK,KAAK;QACd,IAAI,KAAK,KAAK;QACd,KAAK,KAAK,IAAI;QACd,KAAK,KAAK,SAAS;QACnB,OAAO,KAAK,KAAK,UAAU,EAC3B,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAEhD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC,2BAA2B,CAAC,aAAa,CAAC,EAAE,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,qEAAqE;IACrE,sEAAsE;IACtE,qEAAqE;IACrE,gDAAgD;IAChD,IAAI,wBAAwB,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,aAAa,KAAK,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;IAChE,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,IAAI,2BAA2B,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/C,OAAO,IAAI,aAAa,SAAS,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,OAAO,IAAI,aAAa,UAAU,CAAC;IACrC,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAElC,IAAI,oBAAoB,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,IAAI,aAAa,KAAK,eAAe,CAAC,WAAW,CAAC,GAAG,CAAC;AAC/D,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,sBAAsB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,sBAAsB,GAA2B;IACrD,aAAa,EAAE,gBAAgB;IAC/B,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,OAAO;IAClB,OAAO,EAAE,SAAS;IAClB,eAAe,EAAE,iBAAiB;IAClC,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,SAAS,2BAA2B,CAAC,IAAY;IAC/C,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9D,OAAO,CACL,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;QACjC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;QACjC,4BAA4B,CAAC,GAAG,CAAC,aAAa,CAAC,CAChD,CAAC;AACJ,CAAC;AAED,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAAS;IACnD,iBAAiB;IACjB,WAAW;IACX,YAAY;CACb,CAAC,CAAC;AAEH,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC","sourcesContent":["import {\n Fragment,\n Suspense as ReactCompatSuspense,\n isValidElement,\n type ReactCompatElement,\n type ReactCompatNode,\n} from \"@reckona/mreact-compat\";\nimport type { HtmlSink } from \"@reckona/mreact-shared/compiler-contract\";\nimport { escapeHtmlText as escapeHtml } from \"@reckona/mreact-shared/html-escape\";\nimport { isVoidHtmlElement } from \"@reckona/mreact-shared\";\nimport {\n renderReactSuspenseBoundary,\n renderReactSuspenseOutOfOrderBoundary,\n type HydrationScriptOptions,\n} from \"./boundary.js\";\nimport {\n isDangerousHtmlAttribute,\n isDangerousHtmlOptIn,\n isUnsafeMetaRefreshContent,\n isUnsafeUrlAttribute,\n} from \"./url-safety.js\";\nimport {\n escapeAttribute,\n isPromiseLikeUnknown,\n renderNonceAttribute,\n serializeScriptJson,\n} from \"./html-internals.js\";\nimport { createStringSink, hasDeferredTasks, type StreamRender } from \"./sink.js\";\nimport { renderToReadableStream } from \"./stream.js\";\n\nexport interface ScriptAssetOptions {\n src: string;\n nonce?: string;\n integrity?: string;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n}\n\nexport interface EventHydrationEntry {\n id: string;\n event: string;\n handler: string;\n}\n\nexport interface EventHydrationManifest {\n version: 1;\n events: EventHydrationEntry[];\n}\n\nexport interface HtmlResponseOptions {\n headers?: HeadersInit;\n status?: number;\n statusText?: string;\n}\n\nexport function serializeSsrState(value: unknown): string {\n return serializeScriptJson(value);\n}\n\nexport function renderSsrState(\n sink: HtmlSink,\n value: unknown,\n options: HydrationScriptOptions = {},\n): void {\n sink.append(\n `<script type=\"application/json\" data-mreact-ssr-state${renderNonceAttribute(options.nonce)}>${serializeSsrState(value)}</script>`,\n );\n}\n\nexport function createEventHydrationManifest(\n events: readonly EventHydrationEntry[],\n): EventHydrationManifest {\n return {\n version: 1,\n events: events.map((event) => ({ ...event })),\n };\n}\n\nexport function renderEventHydrationManifest(\n sink: HtmlSink,\n manifest: EventHydrationManifest,\n options: HydrationScriptOptions = {},\n): void {\n sink.append(\n `<script type=\"application/json\" data-mreact-event-manifest${renderNonceAttribute(options.nonce)}>${serializeSsrState(manifest)}</script>`,\n );\n}\n\nexport function renderScriptAsset(sink: HtmlSink, options: ScriptAssetOptions): void {\n const integrityAttribute =\n options.integrity === undefined ? \"\" : ` integrity=\"${escapeAttribute(options.integrity)}\"`;\n const crossOrigin =\n options.integrity === undefined ? options.crossOrigin : (options.crossOrigin ?? \"anonymous\");\n const crossOriginAttribute =\n crossOrigin === undefined ? \"\" : ` crossorigin=\"${escapeAttribute(crossOrigin)}\"`;\n\n sink.append(\n `<script src=\"${escapeAttribute(options.src)}\"${renderNonceAttribute(options.nonce)}${integrityAttribute}${crossOriginAttribute}></script>`,\n );\n}\n\nexport function html(node: unknown, options: HtmlResponseOptions = {}): Response {\n const headers = new Headers(options.headers);\n const responseOptions: ResponseInit = { headers };\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"text/html; charset=utf-8\");\n }\n\n if (options.status !== undefined) {\n responseOptions.status = options.status;\n }\n\n if (options.statusText !== undefined) {\n responseOptions.statusText = options.statusText;\n }\n\n return new Response(\n renderToReadableStream((sink) => {\n const state: HtmlRenderState = { suspenseId: 0 };\n return appendReactNode(sink, node, state);\n }),\n responseOptions,\n );\n}\n\nexport async function renderToString(render: StreamRender): Promise<string> {\n const sink = createStringSink();\n\n await render(sink);\n await sink.drain();\n\n return sink.toString();\n}\n\nexport async function renderReactNodeToString(node: unknown): Promise<string> {\n const sink = createStringSink();\n const state: HtmlRenderState = { suspenseId: 0 };\n\n await appendReactNode(sink, node, state);\n await sink.drain();\n\n return sink.toString();\n}\n\ninterface HtmlRenderState {\n suspenseId: number;\n}\n\nfunction appendReactNode(\n sink: HtmlSink,\n node: unknown,\n state: HtmlRenderState,\n): void | PromiseLike<void> {\n if (isPromiseLikeNode(node)) {\n return node.then((resolved) => appendReactNode(sink, resolved, state));\n }\n\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n\n if (typeof node === \"string\" || typeof node === \"number\") {\n sink.append(escapeHtml(node));\n return;\n }\n\n if (Array.isArray(node)) {\n return appendReactNodeList(sink, node, state);\n }\n\n if (!isValidElement(node)) {\n return;\n }\n\n return appendReactElement(sink, node, state);\n}\n\nfunction appendReactNodeList(\n sink: HtmlSink,\n nodes: readonly unknown[],\n state: HtmlRenderState,\n): void | PromiseLike<void> {\n let chain: PromiseLike<void> | undefined;\n\n for (const node of nodes) {\n if (chain !== undefined) {\n chain = chain.then(() => appendReactNode(sink, node, state));\n continue;\n }\n\n const result = appendReactNode(sink, node, state);\n\n if (isPromiseLike(result)) {\n chain = result;\n }\n }\n\n return chain;\n}\n\nfunction appendReactElement(\n sink: HtmlSink,\n element: ReactCompatElement,\n state: HtmlRenderState,\n): void | PromiseLike<void> {\n if (typeof element.type === \"string\") {\n return appendHostElement(sink, element, state);\n }\n\n if (element.type === Fragment) {\n return appendReactNode(sink, element.props.children, state);\n }\n\n if (element.type === ReactCompatSuspense) {\n return appendSuspenseElement(sink, element, state);\n }\n\n if (isClassComponentType(element.type)) {\n const instance = new element.type(element.props);\n return appendReactNode(sink, instance.render(), state);\n }\n\n if (typeof element.type === \"function\") {\n return appendReactNode(sink, element.type(element.props), state);\n }\n}\n\nfunction isClassComponentType(\n value: unknown,\n): value is new (props: Record<string, unknown>) => { render(): ReactCompatNode } {\n return typeof value === \"function\" && value.prototype?.render !== undefined;\n}\n\nfunction appendHostElement(\n sink: HtmlSink,\n element: ReactCompatElement,\n state: HtmlRenderState,\n): void | PromiseLike<void> {\n const tagName = element.type as string;\n const innerHtml = (element.props as { dangerouslySetInnerHTML?: { __html?: unknown } })\n .dangerouslySetInnerHTML;\n sink.append(`<${tagName}${renderHtmlAttributes(element.props)}>`);\n\n if (isVoidHtmlElement(tagName)) {\n return;\n }\n\n if (innerHtml !== undefined) {\n sink.append(String(innerHtml.__html ?? \"\"));\n sink.append(`</${tagName}>`);\n return;\n }\n\n const result = isRawTextElement(tagName)\n ? appendRawTextNode(sink, element.props.children)\n : appendReactNode(sink, element.props.children, state);\n\n if (isPromiseLike(result)) {\n return result.then(() => {\n sink.append(`</${tagName}>`);\n });\n }\n\n sink.append(`</${tagName}>`);\n}\n\nfunction isRawTextElement(tagName: string): boolean {\n return tagName === \"script\" || tagName === \"style\";\n}\n\nfunction appendRawTextNode(sink: HtmlSink, node: unknown): void | PromiseLike<void> {\n if (isPromiseLikeNode(node)) {\n return node.then((resolved) => appendRawTextNode(sink, resolved));\n }\n\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n\n if (Array.isArray(node)) {\n return appendRawTextNodeList(sink, node);\n }\n\n if (typeof node === \"string\" || typeof node === \"number\") {\n sink.append(String(node));\n }\n}\n\nfunction appendRawTextNodeList(\n sink: HtmlSink,\n nodes: readonly unknown[],\n): void | PromiseLike<void> {\n let chain: PromiseLike<void> | undefined;\n\n for (const node of nodes) {\n if (chain !== undefined) {\n chain = chain.then(() => appendRawTextNode(sink, node));\n continue;\n }\n\n const result = appendRawTextNode(sink, node);\n\n if (isPromiseLike(result)) {\n chain = result;\n }\n }\n\n return chain;\n}\n\nfunction appendSuspenseElement(\n sink: HtmlSink,\n element: ReactCompatElement,\n state: HtmlRenderState,\n): void {\n const rendered = renderReactNodeChildrenToString(element.props.children, state);\n\n if (!isPromiseLikeString(rendered)) {\n renderReactSuspenseBoundary(sink, (boundarySink) => {\n boundarySink.append(rendered);\n });\n return;\n }\n\n const id = state.suspenseId;\n state.suspenseId += 1;\n renderReactSuspenseOutOfOrderBoundary(\n sink,\n `B:${id}`,\n `S:${id}`,\n rendered,\n (boundarySink, renderedHtml) => {\n boundarySink.append(renderedHtml);\n },\n {\n fallback(boundarySink) {\n const fallback = renderReactNodeChildrenToString(\n (element.props as { fallback?: ReactCompatNode }).fallback,\n state,\n );\n\n if (isPromiseLikeString(fallback)) {\n return fallback.then((html) => {\n boundarySink.append(html);\n });\n }\n\n boundarySink.append(fallback);\n },\n },\n );\n}\n\nfunction renderReactNodeChildrenToString(\n node: unknown,\n state: HtmlRenderState,\n): string | PromiseLike<string> {\n const sink = createStringSink();\n const result = appendReactNode(sink, node, state);\n const finish = () =>\n hasDeferredTasks(sink) ? sink.drain().then(() => sink.toString()) : sink.toString();\n\n if (isPromiseLike(result)) {\n return result.then(finish);\n }\n\n return finish();\n}\n\nfunction renderHtmlAttributes(props: Record<string, unknown>): string {\n // Issue 078: <meta http-equiv=\"refresh\" content=\"0;url=javascript:...\">\n // is URL-bearing only when http-equiv is \"refresh\", so we need both\n // attributes in scope to make the call. Strip the unsafe content\n // before per-attribute rendering.\n const sanitizedProps = sanitizeMetaRefreshProps(props);\n return Object.entries(sanitizedProps)\n .map(([name, value]) => renderHtmlAttribute(name, value))\n .filter((attribute) => attribute !== \"\")\n .join(\"\");\n}\n\nfunction sanitizeMetaRefreshProps(\n props: Record<string, unknown>,\n): Record<string, unknown> {\n const httpEquiv = props[\"http-equiv\"] ?? props.httpEquiv;\n const content = props[\"content\"];\n if (typeof httpEquiv !== \"string\" || typeof content !== \"string\") return props;\n if (!isUnsafeMetaRefreshContent(httpEquiv, content)) return props;\n // Drop only `content`; keep http-equiv so the developer's intent is\n // still visible in the rendered HTML (debugging hint).\n const sanitized = { ...props };\n delete sanitized[\"content\"];\n return sanitized;\n}\n\n// Mirrors `isAttributeNameSafe` in react-dom: an attribute name must start with\n// an ASCII letter (or underscore) and contain only word chars, dot, hyphen, or\n// colon. Anything else is dropped to prevent SSR XSS via spread props\n// (`<div {...userControlled} />`). See docs/issues/resolved Issue 060.\nconst VALID_ATTRIBUTE_NAME = /^[A-Za-z_][\\w.\\-:]*$/;\n\n// URL scheme allow/block list is shared with the compiler emit paths\n// (Issues 062 / 073). See packages/server/src/url-safety.ts.\n\nfunction renderHtmlAttribute(name: string, value: unknown): string {\n if (\n name === \"children\" ||\n name === \"dangerouslySetInnerHTML\" ||\n name === \"key\" ||\n name === \"ref\" ||\n value === null ||\n value === undefined ||\n typeof value === \"function\"\n ) {\n return \"\";\n }\n\n const attributeName = toHtmlAttributeName(name);\n\n if (!VALID_ATTRIBUTE_NAME.test(attributeName)) {\n return \"\";\n }\n\n if (value === false && !isBooleanishStringAttribute(attributeName)) {\n return \"\";\n }\n\n // Issue 077: HTML-bearing attributes (`srcdoc`) require the explicit\n // `{ __html: \"...\" }` opt-in. A plain string value -- even if escaped\n // for the attribute syntax -- decodes back to executable HTML inside\n // the iframe document with the parent's origin.\n if (isDangerousHtmlAttribute(attributeName)) {\n if (!isDangerousHtmlOptIn(value)) {\n return \"\";\n }\n return ` ${attributeName}=\"${escapeAttribute(value.__html)}\"`;\n }\n\n if (value === true) {\n if (isBooleanishStringAttribute(attributeName)) {\n return ` ${attributeName}=\"true\"`;\n }\n return ` ${attributeName}`;\n }\n\n if (value === false) {\n return ` ${attributeName}=\"false\"`;\n }\n\n const stringValue = String(value);\n\n if (isUnsafeUrlAttribute(attributeName, stringValue)) {\n return \"\";\n }\n\n return ` ${attributeName}=\"${escapeAttribute(stringValue)}\"`;\n}\n\nfunction toHtmlAttributeName(name: string): string {\n return HTML_ATTRIBUTE_ALIASES[name] ?? name;\n}\n\nconst HTML_ATTRIBUTE_ALIASES: Record<string, string> = {\n acceptCharset: \"accept-charset\",\n autoFocus: \"autofocus\",\n autoPlay: \"autoplay\",\n charSet: \"charset\",\n className: \"class\",\n colSpan: \"colspan\",\n contentEditable: \"contenteditable\",\n crossOrigin: \"crossorigin\",\n encType: \"enctype\",\n formAction: \"formaction\",\n frameBorder: \"frameborder\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\",\n maxLength: \"maxlength\",\n minLength: \"minlength\",\n noValidate: \"novalidate\",\n playsInline: \"playsinline\",\n readOnly: \"readonly\",\n rowSpan: \"rowspan\",\n spellCheck: \"spellcheck\",\n srcDoc: \"srcdoc\",\n srcSet: \"srcset\",\n tabIndex: \"tabindex\",\n useMap: \"usemap\",\n};\n\nfunction isBooleanishStringAttribute(name: string): boolean {\n const attributeName = toHtmlAttributeName(name).toLowerCase();\n return (\n attributeName.startsWith(\"aria-\") ||\n attributeName.startsWith(\"data-\") ||\n BOOLEANISH_STRING_ATTRIBUTES.has(attributeName)\n );\n}\n\nconst BOOLEANISH_STRING_ATTRIBUTES = new Set<string>([\n \"contenteditable\",\n \"draggable\",\n \"spellcheck\",\n]);\n\nfunction isPromiseLikeNode(value: unknown): value is PromiseLike<unknown> {\n return isPromiseLikeUnknown(value);\n}\n\nfunction isPromiseLikeString(value: unknown): value is PromiseLike<string> {\n return isPromiseLikeUnknown(value);\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<void> {\n return isPromiseLikeUnknown(value);\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ export { renderToReadableStream, } from "./stream.js";
9
9
  export type { RenderToReadableStreamOptions, } from "./stream.js";
10
10
  export { reactSuspenseRevealExternalScript, renderAsyncBoundary, renderHydrationBoundary, renderOutOfOrderBoundary, renderOutOfOrderReorderScript, renderReactSuspenseBoundary, renderReactSuspenseClientRenderBoundary, renderReactSuspenseOutOfOrderBoundary, } from "./boundary.js";
11
11
  export type { AsyncBoundaryOptions, AsyncBoundaryRender, HydrationScriptOptions, OutOfOrderBoundaryOptions, OutOfOrderReorderScriptOptions, ReactSuspenseBoundaryOptions, ReactSuspenseClientRenderOptions, ReactSuspenseScriptOptions, } from "./boundary.js";
12
- export { createEventHydrationManifest, html, renderEventHydrationManifest, renderScriptAsset, renderSsrState, renderToString, serializeSsrState, } from "./html-helpers.js";
12
+ export { createEventHydrationManifest, html, renderEventHydrationManifest, renderReactNodeToString, renderScriptAsset, renderSsrState, renderToString, serializeSsrState, } from "./html-helpers.js";
13
13
  export type { EventHydrationEntry, EventHydrationManifest, HtmlResponseOptions, ScriptAssetOptions, } from "./html-helpers.js";
14
14
  export interface SuspenseProps extends Record<string, unknown> {
15
15
  fallback?: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAEzE,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,EACnB,8BAA8B,EAC9B,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,eAAe,EACf,yBAAyB,EACzB,qBAAqB,EACrB,0BAA0B,EAC1B,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,uBAAuB,EACvB,4BAA4B,EAC5B,4BAA4B,EAC5B,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,YAAY,EACZ,cAAc,EACd,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iCAAiC,EACjC,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,2BAA2B,EAC3B,uCAAuC,EACvC,qCAAqC,GACtC,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,EACzB,8BAA8B,EAC9B,4BAA4B,EAC5B,gCAAgC,EAChC,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,4BAA4B,EAC5B,IAAI,EACJ,4BAA4B,EAC5B,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,CAYpD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAEzE,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,EACnB,8BAA8B,EAC9B,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,eAAe,EACf,yBAAyB,EACzB,qBAAqB,EACrB,0BAA0B,EAC1B,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,uBAAuB,EACvB,4BAA4B,EAC5B,4BAA4B,EAC5B,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,YAAY,EACZ,cAAc,EACd,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iCAAiC,EACjC,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,2BAA2B,EAC3B,uCAAuC,EACvC,qCAAqC,GACtC,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,EACzB,8BAA8B,EAC9B,4BAA4B,EAC5B,gCAAgC,EAChC,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,4BAA4B,EAC5B,IAAI,EACJ,4BAA4B,EAC5B,uBAAuB,EACvB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,CAYpD"}
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ export { CLIENT_REFERENCE_TYPE, SERVER_REFERENCE_TYPE, createClientReference, cr
4
4
  export { createStringSink, } from "./sink.js";
5
5
  export { renderToReadableStream, } from "./stream.js";
6
6
  export { reactSuspenseRevealExternalScript, renderAsyncBoundary, renderHydrationBoundary, renderOutOfOrderBoundary, renderOutOfOrderReorderScript, renderReactSuspenseBoundary, renderReactSuspenseClientRenderBoundary, renderReactSuspenseOutOfOrderBoundary, } from "./boundary.js";
7
- export { createEventHydrationManifest, html, renderEventHydrationManifest, renderScriptAsset, renderSsrState, renderToString, serializeSsrState, } from "./html-helpers.js";
7
+ export { createEventHydrationManifest, html, renderEventHydrationManifest, renderReactNodeToString, renderScriptAsset, renderSsrState, renderToString, serializeSsrState, } from "./html-helpers.js";
8
8
  export function Suspense(props) {
9
9
  const config = {};
10
10
  if (props.fallback !== undefined) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,IAAI,mBAAmB,EAC/B,aAAa,GAEd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAIlD,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,EACnB,8BAA8B,EAC9B,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AA6BrB,OAAO,EACL,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAQnB,OAAO,EACL,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAKrB,OAAO,EACL,iCAAiC,EACjC,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,2BAA2B,EAC3B,uCAAuC,EACvC,qCAAqC,GACtC,MAAM,eAAe,CAAC;AAYvB,OAAO,EACL,4BAA4B,EAC5B,IAAI,EACJ,4BAA4B,EAC5B,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAa3B,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC3C,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAA2B,CAAC;IACtD,CAAC;IAED,OAAO,aAAa,CAClB,mBAAmB,EACnB,MAAM,EACN,KAAK,CAAC,QAA2B,CACzB,CAAC;AACb,CAAC","sourcesContent":["import {\n Suspense as ReactCompatSuspense,\n createElement,\n type ReactCompatNode,\n} from \"@reckona/mreact-compat\";\n\nexport { Fragment } from \"@reckona/mreact-compat\";\nexport type { ReactCompatNode } from \"@reckona/mreact-compat\";\nexport type { HtmlSink } from \"@reckona/mreact-shared/compiler-contract\";\n\nexport {\n CLIENT_REFERENCE_TYPE,\n SERVER_REFERENCE_TYPE,\n createClientReference,\n createFlightClientManifest,\n createServerReference,\n createServerActionHandler,\n fromReactFlightRows,\n getReactFlightProtocolCoverage,\n isClientReference,\n isServerReference,\n mergeReactFlightRows,\n renderFlightPreloadLinks,\n renderFlightResponseScript,\n renderToFlightResponse,\n stringifyFlightResponse,\n toReactFlightRows,\n} from \"./flight.js\";\nexport type {\n ClientReference,\n FlightClientManifestEntry,\n FlightClientReference,\n FlightClientReferenceInput,\n FlightClientReferenceModel,\n FlightDataViewModel,\n FlightElementModel,\n FlightFormDataModel,\n FlightIterableModel,\n FlightModel,\n FlightResponse,\n FlightScriptOptions,\n FlightServerReference,\n FlightServerReferenceModel,\n FlightArrayBufferModel,\n FlightTypedArrayModel,\n FlightTypedArrayName,\n ServerAction,\n ServerActionDescriptor,\n ServerActionHandlerOptions,\n ServerActionRegistry,\n ServerActionReplayStore,\n ServerActionRequestReference,\n ServerActionValidationResult,\n ServerReference,\n} from \"./flight.js\";\n\nexport {\n createStringSink,\n} from \"./sink.js\";\nexport type {\n StreamRender,\n StringHtmlSink,\n StringSinkBufferStrategy,\n StringSinkOptions,\n} from \"./sink.js\";\n\nexport {\n renderToReadableStream,\n} from \"./stream.js\";\nexport type {\n RenderToReadableStreamOptions,\n} from \"./stream.js\";\n\nexport {\n reactSuspenseRevealExternalScript,\n renderAsyncBoundary,\n renderHydrationBoundary,\n renderOutOfOrderBoundary,\n renderOutOfOrderReorderScript,\n renderReactSuspenseBoundary,\n renderReactSuspenseClientRenderBoundary,\n renderReactSuspenseOutOfOrderBoundary,\n} from \"./boundary.js\";\nexport type {\n AsyncBoundaryOptions,\n AsyncBoundaryRender,\n HydrationScriptOptions,\n OutOfOrderBoundaryOptions,\n OutOfOrderReorderScriptOptions,\n ReactSuspenseBoundaryOptions,\n ReactSuspenseClientRenderOptions,\n ReactSuspenseScriptOptions,\n} from \"./boundary.js\";\n\nexport {\n createEventHydrationManifest,\n html,\n renderEventHydrationManifest,\n renderScriptAsset,\n renderSsrState,\n renderToString,\n serializeSsrState,\n} from \"./html-helpers.js\";\nexport type {\n EventHydrationEntry,\n EventHydrationManifest,\n HtmlResponseOptions,\n ScriptAssetOptions,\n} from \"./html-helpers.js\";\n\nexport interface SuspenseProps extends Record<string, unknown> {\n fallback?: unknown;\n children?: unknown;\n}\n\nexport function Suspense(props: SuspenseProps): never {\n const config: SuspenseProps = {};\n\n if (props.fallback !== undefined) {\n config.fallback = props.fallback as ReactCompatNode;\n }\n\n return createElement<SuspenseProps>(\n ReactCompatSuspense,\n config,\n props.children as ReactCompatNode,\n ) as never;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,IAAI,mBAAmB,EAC/B,aAAa,GAEd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAIlD,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,EACnB,8BAA8B,EAC9B,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AA6BrB,OAAO,EACL,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAQnB,OAAO,EACL,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAKrB,OAAO,EACL,iCAAiC,EACjC,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,2BAA2B,EAC3B,uCAAuC,EACvC,qCAAqC,GACtC,MAAM,eAAe,CAAC;AAYvB,OAAO,EACL,4BAA4B,EAC5B,IAAI,EACJ,4BAA4B,EAC5B,uBAAuB,EACvB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAa3B,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC3C,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAA2B,CAAC;IACtD,CAAC;IAED,OAAO,aAAa,CAClB,mBAAmB,EACnB,MAAM,EACN,KAAK,CAAC,QAA2B,CACzB,CAAC;AACb,CAAC","sourcesContent":["import {\n Suspense as ReactCompatSuspense,\n createElement,\n type ReactCompatNode,\n} from \"@reckona/mreact-compat\";\n\nexport { Fragment } from \"@reckona/mreact-compat\";\nexport type { ReactCompatNode } from \"@reckona/mreact-compat\";\nexport type { HtmlSink } from \"@reckona/mreact-shared/compiler-contract\";\n\nexport {\n CLIENT_REFERENCE_TYPE,\n SERVER_REFERENCE_TYPE,\n createClientReference,\n createFlightClientManifest,\n createServerReference,\n createServerActionHandler,\n fromReactFlightRows,\n getReactFlightProtocolCoverage,\n isClientReference,\n isServerReference,\n mergeReactFlightRows,\n renderFlightPreloadLinks,\n renderFlightResponseScript,\n renderToFlightResponse,\n stringifyFlightResponse,\n toReactFlightRows,\n} from \"./flight.js\";\nexport type {\n ClientReference,\n FlightClientManifestEntry,\n FlightClientReference,\n FlightClientReferenceInput,\n FlightClientReferenceModel,\n FlightDataViewModel,\n FlightElementModel,\n FlightFormDataModel,\n FlightIterableModel,\n FlightModel,\n FlightResponse,\n FlightScriptOptions,\n FlightServerReference,\n FlightServerReferenceModel,\n FlightArrayBufferModel,\n FlightTypedArrayModel,\n FlightTypedArrayName,\n ServerAction,\n ServerActionDescriptor,\n ServerActionHandlerOptions,\n ServerActionRegistry,\n ServerActionReplayStore,\n ServerActionRequestReference,\n ServerActionValidationResult,\n ServerReference,\n} from \"./flight.js\";\n\nexport {\n createStringSink,\n} from \"./sink.js\";\nexport type {\n StreamRender,\n StringHtmlSink,\n StringSinkBufferStrategy,\n StringSinkOptions,\n} from \"./sink.js\";\n\nexport {\n renderToReadableStream,\n} from \"./stream.js\";\nexport type {\n RenderToReadableStreamOptions,\n} from \"./stream.js\";\n\nexport {\n reactSuspenseRevealExternalScript,\n renderAsyncBoundary,\n renderHydrationBoundary,\n renderOutOfOrderBoundary,\n renderOutOfOrderReorderScript,\n renderReactSuspenseBoundary,\n renderReactSuspenseClientRenderBoundary,\n renderReactSuspenseOutOfOrderBoundary,\n} from \"./boundary.js\";\nexport type {\n AsyncBoundaryOptions,\n AsyncBoundaryRender,\n HydrationScriptOptions,\n OutOfOrderBoundaryOptions,\n OutOfOrderReorderScriptOptions,\n ReactSuspenseBoundaryOptions,\n ReactSuspenseClientRenderOptions,\n ReactSuspenseScriptOptions,\n} from \"./boundary.js\";\n\nexport {\n createEventHydrationManifest,\n html,\n renderEventHydrationManifest,\n renderReactNodeToString,\n renderScriptAsset,\n renderSsrState,\n renderToString,\n serializeSsrState,\n} from \"./html-helpers.js\";\nexport type {\n EventHydrationEntry,\n EventHydrationManifest,\n HtmlResponseOptions,\n ScriptAssetOptions,\n} from \"./html-helpers.js\";\n\nexport interface SuspenseProps extends Record<string, unknown> {\n fallback?: unknown;\n children?: unknown;\n}\n\nexport function Suspense(props: SuspenseProps): never {\n const config: SuspenseProps = {};\n\n if (props.fallback !== undefined) {\n config.fallback = props.fallback as ReactCompatNode;\n }\n\n return createElement<SuspenseProps>(\n ReactCompatSuspense,\n config,\n props.children as ReactCompatNode,\n ) as never;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reckona/mreact-server",
3
- "version": "0.0.132",
3
+ "version": "0.0.134",
4
4
  "description": "Server rendering, streaming, hydration, and Flight primitives for mreact.",
5
5
  "keywords": [
6
6
  "flight",
@@ -61,7 +61,7 @@
61
61
  "access": "public"
62
62
  },
63
63
  "dependencies": {
64
- "@reckona/mreact-compat": "0.0.132",
65
- "@reckona/mreact-shared": "0.0.132"
64
+ "@reckona/mreact-compat": "0.0.134",
65
+ "@reckona/mreact-shared": "0.0.134"
66
66
  }
67
67
  }
@@ -132,6 +132,16 @@ export async function renderToString(render: StreamRender): Promise<string> {
132
132
  return sink.toString();
133
133
  }
134
134
 
135
+ export async function renderReactNodeToString(node: unknown): Promise<string> {
136
+ const sink = createStringSink();
137
+ const state: HtmlRenderState = { suspenseId: 0 };
138
+
139
+ await appendReactNode(sink, node, state);
140
+ await sink.drain();
141
+
142
+ return sink.toString();
143
+ }
144
+
135
145
  interface HtmlRenderState {
136
146
  suspenseId: number;
137
147
  }
@@ -303,7 +313,7 @@ function appendSuspenseElement(
303
313
  element: ReactCompatElement,
304
314
  state: HtmlRenderState,
305
315
  ): void {
306
- const rendered = renderReactNodeToString(element.props.children, state);
316
+ const rendered = renderReactNodeChildrenToString(element.props.children, state);
307
317
 
308
318
  if (!isPromiseLikeString(rendered)) {
309
319
  renderReactSuspenseBoundary(sink, (boundarySink) => {
@@ -324,7 +334,7 @@ function appendSuspenseElement(
324
334
  },
325
335
  {
326
336
  fallback(boundarySink) {
327
- const fallback = renderReactNodeToString(
337
+ const fallback = renderReactNodeChildrenToString(
328
338
  (element.props as { fallback?: ReactCompatNode }).fallback,
329
339
  state,
330
340
  );
@@ -341,7 +351,7 @@ function appendSuspenseElement(
341
351
  );
342
352
  }
343
353
 
344
- function renderReactNodeToString(
354
+ function renderReactNodeChildrenToString(
345
355
  node: unknown,
346
356
  state: HtmlRenderState,
347
357
  ): string | PromiseLike<string> {
@@ -479,7 +489,11 @@ const HTML_ATTRIBUTE_ALIASES: Record<string, string> = {
479
489
 
480
490
  function isBooleanishStringAttribute(name: string): boolean {
481
491
  const attributeName = toHtmlAttributeName(name).toLowerCase();
482
- return attributeName.startsWith("aria-") || BOOLEANISH_STRING_ATTRIBUTES.has(attributeName);
492
+ return (
493
+ attributeName.startsWith("aria-") ||
494
+ attributeName.startsWith("data-") ||
495
+ BOOLEANISH_STRING_ATTRIBUTES.has(attributeName)
496
+ );
483
497
  }
484
498
 
485
499
  const BOOLEANISH_STRING_ATTRIBUTES = new Set<string>([
package/src/index.ts CHANGED
@@ -96,6 +96,7 @@ export {
96
96
  createEventHydrationManifest,
97
97
  html,
98
98
  renderEventHydrationManifest,
99
+ renderReactNodeToString,
99
100
  renderScriptAsset,
100
101
  renderSsrState,
101
102
  renderToString,