@askrjs/askr 0.0.34 → 0.0.36
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/bench/components/benchmark-row.js.map +1 -1
- package/dist/bench/components/benchmark-table.js.map +1 -1
- package/dist/benchmark.js +2 -2
- package/dist/benchmark.js.map +1 -1
- package/dist/bin/askr-ssg.js.map +1 -1
- package/dist/boot/index.d.ts.map +1 -1
- package/dist/boot/index.js +9 -29
- package/dist/boot/index.js.map +1 -1
- package/dist/common/control.js.map +1 -1
- package/dist/common/env.js.map +1 -1
- package/dist/common/router.d.ts +8 -1
- package/dist/common/router.d.ts.map +1 -1
- package/dist/common/ssr-errors.js.map +1 -1
- package/dist/common/vnode.js.map +1 -1
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/link.js.map +1 -1
- package/dist/control/case.js.map +1 -1
- package/dist/control/for.js.map +1 -1
- package/dist/control/shared.js.map +1 -1
- package/dist/control/show.js.map +1 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +165 -23
- package/dist/data/index.js.map +1 -1
- package/dist/dev/invariant.js.map +1 -1
- package/dist/dev/logger.js.map +1 -1
- package/dist/foundations/icon/icon.js.map +1 -1
- package/dist/foundations/interactions/dismissable.js.map +1 -1
- package/dist/foundations/interactions/focusable.js.map +1 -1
- package/dist/foundations/interactions/hoverable.js.map +1 -1
- package/dist/foundations/interactions/interaction-policy.js.map +1 -1
- package/dist/foundations/interactions/pressable.js.map +1 -1
- package/dist/foundations/interactions/roving-focus.js.map +1 -1
- package/dist/foundations/state/controllable.js.map +1 -1
- package/dist/foundations/structures/collection.js.map +1 -1
- package/dist/foundations/structures/layer.js.map +1 -1
- package/dist/foundations/structures/layout.js.map +1 -1
- package/dist/foundations/structures/portal.js.map +1 -1
- package/dist/foundations/structures/presence.js.map +1 -1
- package/dist/foundations/structures/slot.js.map +1 -1
- package/dist/foundations/utilities/aria.js.map +1 -1
- package/dist/foundations/utilities/compose-handlers.js.map +1 -1
- package/dist/foundations/utilities/compose-ref.js.map +1 -1
- package/dist/foundations/utilities/merge-props.js.map +1 -1
- package/dist/foundations/utilities/use-id.js.map +1 -1
- package/dist/fx/fx.js.map +1 -1
- package/dist/fx/timing.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/jsx/utils.js.map +1 -1
- package/dist/jsx-dev-runtime.js.map +1 -1
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/renderer/children.js.map +1 -1
- package/dist/renderer/cleanup.js.map +1 -1
- package/dist/renderer/dom.js +128 -53
- package/dist/renderer/dom.js.map +1 -1
- package/dist/renderer/evaluate.js +7 -0
- package/dist/renderer/evaluate.js.map +1 -1
- package/dist/renderer/fastpath.js.map +1 -1
- package/dist/renderer/index.js.map +1 -1
- package/dist/renderer/keyed.js +1 -1
- package/dist/renderer/keyed.js.map +1 -1
- package/dist/renderer/reconcile.js.map +1 -1
- package/dist/renderer/utils.js.map +1 -1
- package/dist/router/index.d.ts +3 -3
- package/dist/router/index.js +2 -2
- package/dist/router/match.js.map +1 -1
- package/dist/router/navigate.d.ts.map +1 -1
- package/dist/router/navigate.js +8 -3
- package/dist/router/navigate.js.map +1 -1
- package/dist/router/policy.js.map +1 -1
- package/dist/router/route-context.js.map +1 -1
- package/dist/router/route.d.ts +11 -2
- package/dist/router/route.d.ts.map +1 -1
- package/dist/router/route.js +268 -109
- package/dist/router/route.js.map +1 -1
- package/dist/runtime/child-scope.d.ts +1 -0
- package/dist/runtime/child-scope.d.ts.map +1 -1
- package/dist/runtime/child-scope.js +2 -0
- package/dist/runtime/child-scope.js.map +1 -1
- package/dist/runtime/component.js +1 -1
- package/dist/runtime/component.js.map +1 -1
- package/dist/runtime/context.js.map +1 -1
- package/dist/runtime/control.js.map +1 -1
- package/dist/runtime/derive.d.ts +2 -1
- package/dist/runtime/derive.d.ts.map +1 -1
- package/dist/runtime/derive.js +15 -10
- package/dist/runtime/derive.js.map +1 -1
- package/dist/runtime/dev-namespace.js.map +1 -1
- package/dist/runtime/effect.d.ts.map +1 -1
- package/dist/runtime/effect.js +34 -9
- package/dist/runtime/effect.js.map +1 -1
- package/dist/runtime/events.js.map +1 -1
- package/dist/runtime/execution-model.js.map +1 -1
- package/dist/runtime/fastlane.js.map +1 -1
- package/dist/runtime/for-bench.d.ts +1 -1
- package/dist/runtime/for-bench.d.ts.map +1 -1
- package/dist/runtime/for-bench.js +15 -14
- package/dist/runtime/for-bench.js.map +1 -1
- package/dist/runtime/for.d.ts +1 -0
- package/dist/runtime/for.d.ts.map +1 -1
- package/dist/runtime/for.js +63 -16
- package/dist/runtime/for.js.map +1 -1
- package/dist/runtime/operations.d.ts.map +1 -1
- package/dist/runtime/operations.js +9 -7
- package/dist/runtime/operations.js.map +1 -1
- package/dist/runtime/perf-metrics.js +8 -2
- package/dist/runtime/perf-metrics.js.map +1 -1
- package/dist/runtime/readable.d.ts +1 -1
- package/dist/runtime/readable.d.ts.map +1 -1
- package/dist/runtime/readable.js +2 -1
- package/dist/runtime/readable.js.map +1 -1
- package/dist/runtime/resource-cell.js +3 -2
- package/dist/runtime/resource-cell.js.map +1 -1
- package/dist/runtime/scheduler.d.ts +0 -1
- package/dist/runtime/scheduler.d.ts.map +1 -1
- package/dist/runtime/scheduler.js +6 -19
- package/dist/runtime/scheduler.js.map +1 -1
- package/dist/runtime/selector.d.ts.map +1 -1
- package/dist/runtime/selector.js +6 -4
- package/dist/runtime/selector.js.map +1 -1
- package/dist/runtime/snapshot-source.d.ts +10 -0
- package/dist/runtime/snapshot-source.d.ts.map +1 -0
- package/dist/runtime/snapshot-source.js +17 -0
- package/dist/runtime/snapshot-source.js.map +1 -0
- package/dist/runtime/ssr-bridge.js.map +1 -1
- package/dist/runtime/state.d.ts.map +1 -1
- package/dist/runtime/state.js +1 -5
- package/dist/runtime/state.js.map +1 -1
- package/dist/ssg/batch-render.js.map +1 -1
- package/dist/ssg/create-static-gen.js.map +1 -1
- package/dist/ssg/generate-metadata.js.map +1 -1
- package/dist/ssg/incremental-manifest.js.map +1 -1
- package/dist/ssg/resolve-ssg-data.js.map +1 -1
- package/dist/ssg/route-utils.js.map +1 -1
- package/dist/ssg/write-static-files.js.map +1 -1
- package/dist/ssr/attrs.js.map +1 -1
- package/dist/ssr/context.d.ts +1 -0
- package/dist/ssr/context.d.ts.map +1 -1
- package/dist/ssr/context.js +3 -0
- package/dist/ssr/context.js.map +1 -1
- package/dist/ssr/escape.js +56 -16
- package/dist/ssr/escape.js.map +1 -1
- package/dist/ssr/index.d.ts.map +1 -1
- package/dist/ssr/index.js +15 -3
- package/dist/ssr/index.js.map +1 -1
- package/dist/ssr/render-keys.js.map +1 -1
- package/dist/ssr/sink.js.map +1 -1
- package/dist/ssr/stream-render.js +14 -2
- package/dist/ssr/stream-render.js.map +1 -1
- package/package.json +8 -6
package/dist/ssr/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["RouteModule.resolveRouteRequest","RouteModule.resolveRouteFromRoutes"],"sources":["../../src/ssr/index.ts"],"sourcesContent":["/**\n * SSR - Server-Side Rendering\n *\n * Renders Askr components to static HTML strings for server-side rendering.\n * SSR is synchronous: async components are not supported; async work should use\n * `resource()` which is rejected during synchronous SSR. This module throws\n * when an async component or async resource is encountered during sync SSR.\n *\n * Concurrency: Each render call uses AsyncLocalStorage (Node.js) to isolate\n * render state, making concurrent SSR requests safe.\n */\n\nimport type { JSXElement } from '../common/jsx';\nimport { __CONTROL_BOUNDARY__ } from '../common/control';\nimport type {\n RouteAuthOptions,\n RouteHandler,\n RouteManifest,\n RouteRequestResult,\n} from '../common/router';\nimport * as RouteModule from '../router/route';\nimport type { Props } from '../common/props';\nimport { Fragment, ELEMENT_TYPE } from '../jsx';\nimport { DefaultPortal } from '../foundations/structures/portal';\nimport {\n createRenderContext,\n getRenderContext,\n withRenderContext,\n throwSSRDataMissing,\n type RenderContext,\n type SSRData,\n} from './context';\nimport { installSSRBridge } from '../runtime/ssr-bridge';\nimport { getCurrentRenderData, getNextKey } from './render-keys';\nimport {\n createComponentInstance,\n setCurrentComponentInstance,\n getCurrentComponentInstance,\n} from '../runtime/component';\nimport type { ComponentFunction } from '../common/component';\nimport type { DOMElement } from '../common/vnode';\nimport { __ERROR_BOUNDARY__ } from '../common/vnode';\nimport { VOID_ELEMENTS, escapeText, styleObjToCss } from './escape';\nimport { renderAttrs, renderAttrsDirect } from './attrs';\nimport type { VNode, SSRComponent } from './types';\n\nimport { logger } from '../dev/logger';\nimport {\n type ControlBoundaryState,\n evaluateCaseState,\n evaluateShowState,\n} from '../runtime/control';\nimport { evaluateForState } from '../runtime/for';\n\nconst __SSR_DEBUG =\n process.env.NODE_ENV !== 'production' &&\n (process.env.ASKR_SSR_DEBUG === '1' || process.env.ASKR_SSR_DEBUG === 'true');\n\nfunction isSSRAttrEventHandler(key: string): boolean {\n return (\n key.length >= 3 &&\n key.charCodeAt(0) === 111 &&\n key.charCodeAt(1) === 110 &&\n key.charCodeAt(2) >= 65 &&\n key.charCodeAt(2) <= 90\n );\n}\n\n// Install SSR bridge once so runtime primitives (resource/derive/etc) can\n// detect SSR mode and access deterministic render-phase data without a\n// runtime->ssr import.\ninstallSSRBridge({\n getCurrentSSRContext: getRenderContext,\n throwSSRDataMissing,\n getCurrentRenderData,\n getNextKey,\n});\n\nexport { SSRDataMissingError } from './context';\nexport type { VNode, SSRComponent } from './types';\n\n// Re-export for backwards compatibility\nexport type Component = SSRComponent;\n\n// Dev-only SSR strictness guard helpers. We mutate globals in dev to make\n// accidental usage of Math.random/Date.now during sync SSR fail fast.\n// We implement a re-entrant stack so nested or concurrent calls don't clobber\n// global values unexpectedly.\nconst __ssrGuardStack: Array<{ random: () => number; now: () => number }> = [];\n\nexport function pushSSRStrictPurityGuard() {\n /* istanbul ignore if - dev-only guard */\n if (process.env.NODE_ENV === 'production') return;\n __ssrGuardStack.push({\n random: Reflect.get(Math, 'random') as () => number,\n now: Reflect.get(Date, 'now') as () => number,\n });\n Reflect.set(Math, 'random', () => {\n throw new Error(\n 'SSR Strict Purity: Math.random is not allowed during synchronous SSR. Use the provided `ssr` context RNG instead.'\n );\n });\n Reflect.set(Date, 'now', () => {\n throw new Error(\n 'SSR Strict Purity: Date.now is not allowed during synchronous SSR. Pass timestamps explicitly or use deterministic helpers.'\n );\n });\n}\n\nexport function popSSRStrictPurityGuard() {\n /* istanbul ignore if - dev-only guard */\n if (process.env.NODE_ENV === 'production') return;\n const prev = __ssrGuardStack.pop();\n if (prev) {\n Reflect.set(Math, 'random', prev.random);\n Reflect.set(Date, 'now', prev.now);\n }\n}\n\n/**\n * Synchronous rendering helpers (used for strictly synchronous SSR)\n */\nfunction renderChildSync(child: unknown, ctx: RenderContext): string {\n if (typeof child === 'string') return escapeText(child);\n if (typeof child === 'number') return escapeText(String(child));\n if (child === null || child === undefined || child === false) return '';\n if (child && typeof child === 'object' && 'type' in child) {\n // We already verified the shape above; assert as VNode for the sync renderer\n return renderNodeSync(child as VNode, ctx);\n }\n return '';\n}\n\nfunction renderChildSyncToSink(\n child: unknown,\n sink: { write(html: string): void },\n ctx: RenderContext\n): void {\n if (child === null || child === undefined || child === false) return;\n if (typeof child === 'string') {\n sink.write(escapeText(child));\n return;\n }\n if (typeof child === 'number') {\n sink.write(escapeText(String(child)));\n return;\n }\n if (child && typeof child === 'object' && 'type' in child) {\n renderNodeSyncToSink(child as VNode, sink, ctx);\n }\n}\n\nfunction renderChildrenSync(\n children: unknown[] | undefined,\n ctx: RenderContext\n): string {\n if (!children || !Array.isArray(children) || children.length === 0) return '';\n if (children.length === 1) return renderChildSync(children[0], ctx);\n\n // Small child arrays are common; concatenation is usually faster than\n // allocating + joining. Large sibling lists (10k+) need join to avoid O(n^2)\n // concatenation costs.\n if (children.length <= 8) {\n let result = '';\n for (const child of children) result += renderChildSync(child, ctx);\n return result;\n }\n\n const parts = Array.from({ length: children.length }, (_, index) =>\n renderChildSync(children[index], ctx)\n );\n return parts.join('');\n}\n\nfunction normalizeRenderableChildren(value: unknown): unknown[] {\n if (value === null || value === undefined || value === false) {\n return [];\n }\n\n return Array.isArray(value) ? value : [value];\n}\n\nfunction getErrorBoundaryState(\n node: VNode | JSXElement\n): NonNullable<ComponentInstance['errorBoundaryState']> | null {\n return (\n (node as DOMElement & { __instance?: ComponentInstance }).__instance\n ?.errorBoundaryState ?? null\n );\n}\n\nfunction createDefaultErrorBoundaryFallbackVNode(error: unknown): JSXElement {\n const message =\n error instanceof Error\n ? error.stack || error.message || error.name\n : typeof error === 'string'\n ? error\n : (() => {\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n })();\n\n return {\n $$typeof: ELEMENT_TYPE,\n type: 'div',\n props: {\n role: 'alert',\n 'data-askr-error-boundary': 'true',\n style: {\n boxSizing: 'border-box',\n padding: '1rem',\n border: '1px solid currentColor',\n borderRadius: '0.75rem',\n display: 'grid',\n gap: '0.75rem',\n maxWidth: '100%',\n },\n children: [\n {\n $$typeof: ELEMENT_TYPE,\n type: 'strong',\n props: {\n children: ['Something went wrong while rendering this view.'],\n },\n },\n {\n $$typeof: ELEMENT_TYPE,\n type: 'p',\n props: {\n style: { margin: '0' },\n children: [\n 'The app recovered into a visible fallback so the error is not hidden in the console.',\n ],\n },\n },\n {\n $$typeof: ELEMENT_TYPE,\n type: 'details',\n props: {\n open: process.env.NODE_ENV !== 'production',\n children: [\n {\n $$typeof: ELEMENT_TYPE,\n type: 'summary',\n props: {\n children: ['Error details'],\n },\n },\n {\n $$typeof: ELEMENT_TYPE,\n type: 'pre',\n props: {\n style: {\n margin: '0',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n },\n children: [message],\n },\n },\n ],\n },\n },\n ],\n },\n key: null,\n } as JSXElement;\n}\n\nfunction resolveErrorBoundaryFallbackNode(\n fallback: unknown,\n error: unknown,\n reset: () => void\n): unknown {\n return typeof fallback === 'function'\n ? (fallback as (error: unknown, reset: () => void) => unknown)(error, reset)\n : fallback !== undefined\n ? fallback\n : createDefaultErrorBoundaryFallbackVNode(error);\n}\n\nfunction renderErrorBoundaryFallbackValue(\n fallback: unknown,\n error: unknown,\n reset: () => void,\n ctx: RenderContext\n): string {\n const nextValue = resolveErrorBoundaryFallbackNode(fallback, error, reset);\n\n return Array.isArray(nextValue)\n ? renderChildrenSync(normalizeRenderableChildren(nextValue), ctx)\n : renderChildSync(nextValue, ctx);\n}\n\nfunction renderErrorBoundaryFallbackValueToSink(\n fallback: unknown,\n error: unknown,\n reset: () => void,\n sink: { write(html: string): void },\n ctx: RenderContext\n): void {\n sink.write(renderErrorBoundaryFallbackValue(fallback, error, reset, ctx));\n}\n\nfunction getControlBoundaryState(\n node: VNode | JSXElement\n): ControlBoundaryState | null {\n const boundaryNode = node as DOMElement;\n\n return (\n boundaryNode._controlState ??\n (boundaryNode._forState as ControlBoundaryState | undefined) ??\n null\n );\n}\n\nfunction evaluateControlBoundaryChildren(\n node: VNode | JSXElement\n): unknown[] | undefined {\n if (node.type !== __CONTROL_BOUNDARY__) {\n return undefined;\n }\n\n const controlState = getControlBoundaryState(node);\n if (!controlState) {\n return [];\n }\n\n if (controlState.kind === 'for') {\n return evaluateForState(controlState);\n }\n if (controlState.kind === 'show') {\n return evaluateShowState(controlState);\n }\n return evaluateCaseState(controlState);\n}\n\nfunction renderChildrenSyncToSink(\n children: unknown[] | undefined,\n sink: { write(html: string): void },\n ctx: RenderContext\n): void {\n if (!children || !Array.isArray(children) || children.length === 0) return;\n if (children.length >= 32) {\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (child === null || child === undefined || child === false) continue;\n if (typeof child === 'string') {\n sink.write(escapeText(child));\n continue;\n }\n if (typeof child === 'number') {\n sink.write(escapeText(String(child)));\n continue;\n }\n if (child && typeof child === 'object' && 'type' in child) {\n renderNodeSyncToSink(child as VNode, sink, ctx);\n }\n }\n return;\n }\n for (let i = 0; i < children.length; i++) {\n renderChildSyncToSink(children[i], sink, ctx);\n }\n}\n\nfunction sinkWrite2(\n sink: { write(html: string): void; write2?: (a: string, b: string) => void },\n a: string,\n b: string\n): void {\n if (typeof sink.write2 === 'function') {\n sink.write2(a, b);\n return;\n }\n sink.write(a);\n sink.write(b);\n}\n\nfunction sinkWrite3(\n sink: {\n write(html: string): void;\n write3?: (a: string, b: string, c: string) => void;\n },\n a: string,\n b: string,\n c: string\n): void {\n if (typeof sink.write3 === 'function') {\n sink.write3(a, b, c);\n return;\n }\n sink.write(a);\n sink.write(b);\n sink.write(c);\n}\n\n/**\n * Render a VNode synchronously. Throws if an async component is encountered.\n */\nfunction renderNodeSync(node: VNode | JSXElement, ctx: RenderContext): string {\n const { type, props } = node;\n\n /* istanbul ignore if - dev-only debug */\n if (__SSR_DEBUG) {\n try {\n logger.warn('[SSR] renderNodeSync type:', typeof type, type);\n } catch {\n // Ignore coercion errors for Symbols\n }\n }\n\n if (typeof type === 'function') {\n const result = executeComponentSync(type as Component, props, ctx);\n if (result instanceof Promise) {\n // Use centralized SSR error to maintain a single failure mode\n throwSSRDataMissing();\n }\n // executeComponentSync already normalizes primitives into VNode wrappers,\n // so result is always a VNode or JSXElement here. Safe to recurse directly.\n return renderNodeSync(result, ctx);\n }\n\n // Special-case fragments (symbols) - render children directly\n if (typeof type === 'symbol') {\n if (type === Fragment) {\n // Prefer explicit `children` array; fallback to `props.children` for\n // JSX runtimes that place children on props.\n const childrenArr = Array.isArray((node as VNode).children)\n ? (node as VNode).children\n : Array.isArray(props?.children)\n ? (props?.children as unknown[])\n : undefined;\n /* istanbul ignore if - dev-only debug */\n if (__SSR_DEBUG) {\n try {\n logger.warn('[SSR] fragment children length:', childrenArr?.length);\n } catch {\n // Ignore\n }\n }\n return renderChildrenSync(childrenArr, ctx);\n }\n if (type === __CONTROL_BOUNDARY__) {\n return renderChildrenSync(evaluateControlBoundaryChildren(node), ctx);\n }\n if (type === __ERROR_BOUNDARY__) {\n const boundaryState = getErrorBoundaryState(node);\n const fallback = props?.fallback;\n const reset = () => {\n const instance = (\n node as DOMElement & { __instance?: ComponentInstance }\n ).__instance;\n const state = instance?.errorBoundaryState;\n if (state) {\n state.error = null;\n state.notified = false;\n }\n };\n\n if (boundaryState?.error != null) {\n return renderErrorBoundaryFallbackValue(\n fallback,\n boundaryState.error,\n reset,\n ctx\n );\n }\n\n try {\n return renderChildrenSync(\n normalizeRenderableChildren(props?.children),\n ctx\n );\n } catch (error) {\n if (boundaryState) {\n boundaryState.error = error;\n boundaryState.notified = true;\n }\n logger.error('[Askr] ErrorBoundary caught render error:', error);\n return renderErrorBoundaryFallbackValue(fallback, error, reset, ctx);\n }\n }\n // Unknown symbol type - throw a helpful error instead of letting\n // a built-in TypeError bubble up when attempting to coerce to string.\n throw new Error(\n `renderNodeSync: unsupported VNode symbol type: ${String(type)}`\n );\n }\n\n const typeStr = type as string;\n if (VOID_ELEMENTS.has(typeStr)) {\n const attrs = renderAttrs(props);\n return `<${typeStr}${attrs} />`;\n }\n\n // Hot path: most nodes don't use dangerouslySetInnerHTML.\n // Avoid allocating the `{ attrs, dangerousHtml }` object unless the prop exists.\n const maybeDangerous = (\n props as unknown as { dangerouslySetInnerHTML?: unknown }\n )?.dangerouslySetInnerHTML;\n if (maybeDangerous !== undefined && maybeDangerous !== null) {\n const { attrs, dangerousHtml } = renderAttrs(props, {\n returnDangerousHtml: true,\n });\n if (dangerousHtml !== undefined) {\n return `<${typeStr}${attrs}>${dangerousHtml}</${typeStr}>`;\n }\n const childrenHtml = renderChildrenSync((node as VNode).children, ctx);\n return `<${typeStr}${attrs}>${childrenHtml}</${typeStr}>`;\n }\n\n const attrs = renderAttrs(props);\n const childrenHtml = renderChildrenSync((node as VNode).children, ctx);\n return `<${typeStr}${attrs}>${childrenHtml}</${typeStr}>`;\n}\n\nfunction renderNodeSyncToSink(\n node: VNode | JSXElement,\n sink: {\n write(html: string): void;\n write2?: (a: string, b: string) => void;\n write3?: (a: string, b: string, c: string) => void;\n },\n ctx: RenderContext\n): void {\n const { type, props } = node;\n\n if (typeof type === 'function') {\n const result = executeComponentSync(type as Component, props, ctx);\n // executeComponentSync guarantees synchronous result.\n renderNodeSyncToSink(result, sink, ctx);\n return;\n }\n\n // Fragment\n if (typeof type === 'symbol') {\n if (type === Fragment) {\n const childrenArr = Array.isArray((node as VNode).children)\n ? (node as VNode).children\n : Array.isArray(props?.children)\n ? (props?.children as unknown[])\n : undefined;\n renderChildrenSyncToSink(childrenArr, sink, ctx);\n return;\n }\n if (type === __CONTROL_BOUNDARY__) {\n renderChildrenSyncToSink(\n evaluateControlBoundaryChildren(node),\n sink,\n ctx\n );\n return;\n }\n if (type === __ERROR_BOUNDARY__) {\n const boundaryState = getErrorBoundaryState(node);\n const fallback = props?.fallback;\n const reset = () => {\n const instance = (\n node as DOMElement & { __instance?: ComponentInstance }\n ).__instance;\n const state = instance?.errorBoundaryState;\n if (state) {\n state.error = null;\n state.notified = false;\n }\n };\n\n if (boundaryState?.error != null) {\n renderErrorBoundaryFallbackValueToSink(\n fallback,\n boundaryState.error,\n reset,\n sink,\n ctx\n );\n return;\n }\n\n try {\n renderChildrenSyncToSink(\n normalizeRenderableChildren(props?.children),\n sink,\n ctx\n );\n } catch (error) {\n if (boundaryState) {\n boundaryState.error = error;\n boundaryState.notified = true;\n }\n logger.error('[Askr] ErrorBoundary caught render error:', error);\n renderErrorBoundaryFallbackValueToSink(\n fallback,\n error,\n reset,\n sink,\n ctx\n );\n }\n return;\n }\n throw new Error(\n `renderNodeSyncToSink: unsupported VNode symbol type: ${String(type)}`\n );\n }\n\n const typeStr = type as string;\n if (VOID_ELEMENTS.has(typeStr)) {\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write(' />');\n return;\n }\n\n const maybeDangerous = props\n ? (props as unknown as { dangerouslySetInnerHTML?: unknown })\n ?.dangerouslySetInnerHTML\n : undefined;\n\n if (maybeDangerous !== undefined && maybeDangerous !== null) {\n const dangerousHtml =\n typeof maybeDangerous === 'object' && '__html' in maybeDangerous\n ? String((maybeDangerous as { __html: unknown }).__html)\n : undefined;\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n if (dangerousHtml !== undefined) {\n sink.write(dangerousHtml);\n } else {\n renderChildrenSyncToSink((node as VNode).children, sink, ctx);\n }\n sinkWrite3(sink, '</', typeStr, '>');\n return;\n }\n\n // Normalize children: prefer node.children, fallback to props.children (for JSXElement)\n let children = (node as VNode).children;\n if (children === undefined && props?.children !== undefined) {\n const propsChildren = props.children as unknown;\n if (Array.isArray(propsChildren)) {\n children = propsChildren;\n } else if (propsChildren !== null && propsChildren !== false) {\n children = [propsChildren];\n }\n }\n\n // Hot path: empty element (no children) - single write\n if (!children || (Array.isArray(children) && children.length === 0)) {\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n sinkWrite3(sink, '</', typeStr, '>');\n return;\n }\n\n // Hot path: single text child - single write\n if (Array.isArray(children) && children.length === 1) {\n const only = children[0];\n if (typeof only === 'string') {\n const content = escapeText(only);\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n sink.write(content);\n sinkWrite3(sink, '</', typeStr, '>');\n return;\n }\n if (typeof only === 'number') {\n const content = escapeText(String(only));\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n sink.write(content);\n sinkWrite3(sink, '</', typeStr, '>');\n return;\n }\n }\n\n // General case: element with complex children\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n renderChildrenSyncToSink(children, sink, ctx);\n sinkWrite3(sink, '</', typeStr, '>');\n}\n\n/**\n * Execute a component function (synchronously or async) and return VNode\n */\n/**\n * Execute a component synchronously inside a render-only context.\n * This must not create or reuse runtime ComponentInstance objects. We pass\n * the render context explicitly as `context.ssr` in the second argument so\n * components can opt-in to deterministic randomness/time via the provided RNG.\n */\nfunction executeComponentSync(\n component: Component,\n props: Record<string, unknown> | undefined,\n ctx: RenderContext\n): VNode | JSXElement {\n // Dev-only: enforce SSR purity with clear messages. We temporarily override\n // `Math.random` and `Date.now` while rendering to produce a targeted error\n // if components call them directly. We restore them immediately afterwards.\n // Re-entrant guard for dev-only SSR strict purity checks.\n // We avoid clobbering globals permanently by pushing the original functions\n // onto a stack and restoring them on exit. This is safer for nested or\n // stacked SSR render invocations.\n\n try {\n if (process.env.NODE_ENV !== 'production') {\n pushSSRStrictPurityGuard();\n }\n // Create a temporary, lightweight component instance so runtime APIs like\n // `state()` and `currentRoute()` can be called during SSR render. We avoid mounting\n // or side-effects by not attaching the instance to any DOM target.\n const prev = getCurrentComponentInstance();\n const temp = createComponentInstance(\n 'ssr-temp',\n component as ComponentFunction,\n (props || {}) as Props,\n null\n );\n temp.ssr = true;\n setCurrentComponentInstance(temp);\n try {\n // Context already set via withRenderContext at render entry point\n const result = component((props || {}) as Props, { ssr: ctx });\n if (result instanceof Promise) {\n // Use the centralized SSR error for async data/components during SSR\n throwSSRDataMissing();\n }\n if (\n typeof result === 'string' ||\n typeof result === 'number' ||\n typeof result === 'boolean' ||\n result === null ||\n result === undefined\n ) {\n // Return a Fragment with the text content, not a div wrapper\n const inner =\n result === null || result === undefined || result === false\n ? ''\n : String(result);\n return {\n $$typeof: ELEMENT_TYPE,\n type: Fragment,\n props: { children: inner ? [inner] : [] },\n } as unknown as VNode | JSXElement;\n }\n return result as VNode | JSXElement;\n } finally {\n // Restore the previous instance (if any)\n setCurrentComponentInstance(prev);\n }\n } finally {\n if (process.env.NODE_ENV !== 'production') popSSRStrictPurityGuard();\n }\n}\n\nfunction wrapWithDefaultPortal(out: unknown): VNode | JSXElement {\n const portalVNode = {\n $$typeof: ELEMENT_TYPE,\n type: DefaultPortal,\n props: {},\n key: '__default_portal',\n } as unknown;\n\n if (out == null) {\n return {\n $$typeof: ELEMENT_TYPE,\n type: Fragment,\n props: { children: [portalVNode] },\n } as unknown as VNode | JSXElement;\n }\n\n return {\n $$typeof: ELEMENT_TYPE,\n type: Fragment,\n props: { children: [out as unknown, portalVNode] },\n } as unknown as VNode | JSXElement;\n}\n\nfunction renderSyncComponentRoot(\n component: Component,\n props: Record<string, unknown> | undefined,\n ctx: RenderContext\n): VNode | JSXElement {\n const wrapped: Component = (\n p?: Record<string, unknown>,\n c?: { signal?: AbortSignal; ssr?: RenderContext }\n ) => wrapWithDefaultPortal(component(p ?? {}, c));\n\n return executeComponentSync(wrapped, props || {}, ctx);\n}\n\nfunction getRenderableChildren(\n node: VNode | JSXElement\n): unknown[] | undefined {\n if (Array.isArray((node as VNode).children)) {\n return (node as VNode).children;\n }\n if (Array.isArray(node.props?.children)) {\n return node.props.children as unknown[];\n }\n if (\n node.props?.children !== undefined &&\n node.props.children !== null &&\n node.props.children !== false\n ) {\n return [node.props.children];\n }\n return undefined;\n}\n\ntype VerifyState = {\n current: ChildNode | null;\n pendingText: string;\n};\n\nfunction flushPendingText(state: VerifyState): boolean {\n if (state.pendingText.length === 0) {\n return true;\n }\n if (!state.current || state.current.nodeType !== Node.TEXT_NODE) {\n return false;\n }\n if (state.current.textContent !== state.pendingText) {\n return false;\n }\n state.current = state.current.nextSibling;\n state.pendingText = '';\n return true;\n}\n\nfunction verifyRenderedAttrs(\n element: Element,\n props: Props | undefined\n): { matched: boolean; dangerousHtml?: string } {\n const matchedAttrs = new Set<string>();\n let dangerousHtml: string | undefined;\n\n if (!props || typeof props !== 'object') {\n return {\n matched: element.attributes.length === 0,\n dangerousHtml,\n };\n }\n\n const propsObj = props as Record<string, unknown>;\n for (const key in propsObj) {\n const value = propsObj[key];\n\n if (\n key === 'children' ||\n key === 'key' ||\n key === 'ref' ||\n key === 'dangerouslySetInnerHTML'\n ) {\n if (\n key === 'dangerouslySetInnerHTML' &&\n value &&\n typeof value === 'object' &&\n '__html' in value\n ) {\n dangerousHtml = String((value as { __html: unknown }).__html);\n }\n continue;\n }\n\n if (isSSRAttrEventHandler(key) || key.charCodeAt(0) === 95) {\n continue;\n }\n\n const attrName = key === 'class' || key === 'className' ? 'class' : key;\n\n if (attrName === 'style') {\n const css = typeof value === 'string' ? value : styleObjToCss(value);\n if (!css) continue;\n if (element.getAttribute('style') !== css) {\n return { matched: false };\n }\n matchedAttrs.add('style');\n continue;\n }\n\n if (value === true) {\n if (!element.hasAttribute(attrName)) {\n return { matched: false };\n }\n matchedAttrs.add(attrName);\n continue;\n }\n\n if (value === false || value === null || value === undefined) {\n continue;\n }\n\n const stringValue = String(value);\n if (element.getAttribute(attrName) !== stringValue) {\n return { matched: false };\n }\n matchedAttrs.add(attrName);\n }\n\n if (element.attributes.length !== matchedAttrs.size) {\n return { matched: false };\n }\n\n return { matched: true, dangerousHtml };\n}\n\nfunction verifyExpectedNode(\n node: unknown,\n state: VerifyState,\n ctx: RenderContext\n): boolean {\n if (node === null || node === undefined || node === false) {\n return true;\n }\n\n if (typeof node === 'string' || typeof node === 'number') {\n state.pendingText += String(node);\n return true;\n }\n\n if (!node || typeof node !== 'object' || !('type' in node)) {\n return true;\n }\n\n const vnode = node as VNode | JSXElement;\n const { type, props } = vnode;\n\n if (typeof type === 'function') {\n return verifyExpectedNode(\n executeComponentSync(type as Component, props, ctx),\n state,\n ctx\n );\n }\n\n if (typeof type === 'symbol') {\n if (type === __CONTROL_BOUNDARY__) {\n const children = evaluateControlBoundaryChildren(vnode);\n if (!children || children.length === 0) {\n return true;\n }\n for (let index = 0; index < children.length; index += 1) {\n if (!verifyExpectedNode(children[index], state, ctx)) {\n return false;\n }\n }\n return true;\n }\n if (type === __ERROR_BOUNDARY__) {\n const boundaryState = getErrorBoundaryState(vnode);\n const fallback = props?.fallback;\n const reset = () => {\n const instance = (\n vnode as DOMElement & { __instance?: ComponentInstance }\n ).__instance;\n const stateRef = instance?.errorBoundaryState;\n if (stateRef) {\n stateRef.error = null;\n stateRef.notified = false;\n }\n };\n\n const snapshot: VerifyState = {\n current: state.current,\n pendingText: state.pendingText,\n };\n\n if (boundaryState?.error != null) {\n const fallbackNode = resolveErrorBoundaryFallbackNode(\n fallback,\n boundaryState.error,\n reset\n );\n return verifyRenderableNode(fallbackNode, state, ctx);\n }\n\n try {\n if (\n verifyExpectedChildren(\n normalizeRenderableChildren(props?.children),\n state,\n ctx\n )\n ) {\n return true;\n }\n } catch (error) {\n if (boundaryState) {\n boundaryState.error = error;\n boundaryState.notified = true;\n }\n }\n\n state.current = snapshot.current;\n state.pendingText = snapshot.pendingText;\n\n const fallbackNode = resolveErrorBoundaryFallbackNode(\n fallback,\n boundaryState?.error ?? new Error('ErrorBoundary render failed'),\n reset\n );\n return verifyRenderableNode(fallbackNode, state, ctx);\n }\n if (type !== Fragment) {\n throw new Error(\n `verifyHydrationSyncForUrl: unsupported VNode symbol type: ${String(type)}`\n );\n }\n const children = getRenderableChildren(vnode);\n if (!children || children.length === 0) {\n return true;\n }\n for (let index = 0; index < children.length; index += 1) {\n if (!verifyExpectedNode(children[index], state, ctx)) {\n return false;\n }\n }\n return true;\n }\n\n if (!flushPendingText(state)) {\n return false;\n }\n\n if (!state.current || state.current.nodeType !== Node.ELEMENT_NODE) {\n return false;\n }\n\n const actualElement = state.current as Element;\n if (actualElement.tagName.toLowerCase() !== String(type).toLowerCase()) {\n return false;\n }\n\n const attrMatch = verifyRenderedAttrs(actualElement, props);\n if (!attrMatch.matched) {\n return false;\n }\n\n if (VOID_ELEMENTS.has(String(type))) {\n if (actualElement.firstChild !== null) {\n return false;\n }\n state.current = actualElement.nextSibling;\n return true;\n }\n\n if (attrMatch.dangerousHtml !== undefined) {\n if (actualElement.innerHTML !== attrMatch.dangerousHtml) {\n return false;\n }\n state.current = actualElement.nextSibling;\n return true;\n }\n\n const childState: VerifyState = {\n current: actualElement.firstChild,\n pendingText: '',\n };\n const children = getRenderableChildren(vnode);\n if (children && children.length > 0) {\n for (let index = 0; index < children.length; index += 1) {\n if (!verifyExpectedNode(children[index], childState, ctx)) {\n return false;\n }\n }\n }\n\n if (!flushPendingText(childState) || childState.current !== null) {\n return false;\n }\n\n state.current = actualElement.nextSibling;\n return true;\n}\n\nfunction verifyHydrationRoot(\n root: Element,\n node: VNode | JSXElement,\n ctx: RenderContext\n): boolean {\n const state: VerifyState = {\n current: root.firstChild,\n pendingText: '',\n };\n if (!verifyExpectedNode(node, state, ctx)) {\n return false;\n }\n return flushPendingText(state) && state.current === null;\n}\n\nfunction verifyExpectedChildren(\n children: unknown[] | undefined,\n state: VerifyState,\n ctx: RenderContext\n): boolean {\n if (!children || children.length === 0) {\n return true;\n }\n\n for (let index = 0; index < children.length; index += 1) {\n if (!verifyExpectedNode(children[index], state, ctx)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction verifyRenderableNode(\n value: unknown,\n state: VerifyState,\n ctx: RenderContext\n): boolean {\n return Array.isArray(value)\n ? verifyExpectedChildren(normalizeRenderableChildren(value), state, ctx)\n : verifyExpectedNode(value, state, ctx);\n}\n\n/**\n * Single synchronous SSR entrypoint: render a component to an HTML string.\n * This is strictly synchronous and deterministic. Optionally provide a seed\n * for deterministic randomness via `options.seed`.\n */\nexport function renderToStringSync(\n component: (\n props?: Record<string, unknown>\n ) => VNode | JSXElement | string | number | boolean | null | undefined,\n props?: Record<string, unknown>,\n options?: { seed?: number; data?: SSRData }\n): string {\n const seed = options?.seed ?? 12345;\n const ctx = createRenderContext(seed, { data: options?.data });\n\n return withRenderContext(ctx, () => {\n // Set render data on context (startRenderPhase now reads from context)\n startRenderPhase(options?.data ?? null);\n try {\n const node = renderSyncComponentRoot(\n component as unknown as Component,\n props || {},\n ctx\n );\n if (!node) {\n throw new Error('renderToStringSync: wrapped component returned empty');\n }\n const sink = new StringSink();\n renderNodeSyncToSink(node, sink, ctx);\n sink.end();\n return sink.toString();\n } finally {\n stopRenderPhase();\n }\n });\n}\n\nexport function renderResolvedToStringSync(opts: {\n url: string;\n routes: Array<{ path: string; handler: RouteHandler; namespace?: string }>;\n handler: RouteHandler;\n params?: Record<string, string>;\n options?: { seed?: number; data?: SSRData };\n}): string {\n const { url, routes, handler, params, options } = opts;\n const seed = options?.seed ?? 12345;\n const ctx = createRenderContext(seed, {\n url,\n data: options?.data,\n params,\n routes,\n });\n\n return withRenderContext(ctx, () => {\n startRenderPhase(options?.data ?? null);\n try {\n const node = renderSyncComponentRoot(\n handler as unknown as Component,\n params || {},\n ctx\n );\n const sink = new StringSink();\n renderNodeSyncToSink(node, sink, ctx);\n sink.end();\n return sink.toString();\n } finally {\n stopRenderPhase();\n }\n });\n}\n\nexport async function resolveRequest(opts: {\n url: string;\n manifest?: RouteManifest;\n routes?: Array<{ path: string; handler: RouteHandler; namespace?: string }>;\n auth?: RouteAuthOptions;\n signal?: AbortSignal;\n}): Promise<RouteRequestResult> {\n const { url, manifest, routes, auth, signal } = opts;\n\n if (manifest) {\n return await RouteModule.resolveRouteRequest(url, {\n manifest,\n mode: 'ssr',\n auth,\n signal,\n });\n }\n\n if (!routes) {\n throw new Error('resolveRequest requires a route manifest or route table.');\n }\n\n const requestUrl = new URL(url, 'http://localhost');\n const resolved = RouteModule.resolveRouteFromRoutes(\n requestUrl.pathname,\n routes\n );\n\n if (!resolved) {\n return null;\n }\n\n return {\n kind: 'render',\n handler: resolved.handler,\n params: resolved.params,\n };\n}\n\n// Synchronous server render for strict checks. Routes are resolved against the\n// provided route table and kept in the per-render SSR context.\nexport function renderToStringSyncForUrl(opts: {\n url: string;\n routes: Array<{ path: string; handler: RouteHandler; namespace?: string }>;\n options?: { seed?: number; data?: SSRData };\n}): string {\n const { url, routes, options } = opts;\n const routeTable = routes.map((route) => ({ ...route }));\n const requestUrl = new URL(url, 'http://localhost');\n const resolved = RouteModule.resolveRouteFromRoutes(\n requestUrl.pathname,\n routeTable\n );\n if (!resolved)\n throw new Error(`renderToStringSyncForUrl: no route found for url: ${url}`);\n\n return renderResolvedToStringSync({\n url,\n routes: routeTable,\n handler: resolved.handler,\n params: resolved.params,\n options,\n });\n}\n\nexport function verifyHydrationSyncForUrl(opts: {\n root: Element;\n url: string;\n routes: Array<{ path: string; handler: RouteHandler; namespace?: string }>;\n options?: { seed?: number; data?: SSRData };\n}): boolean {\n const { root, url, routes, options } = opts;\n const routeTable = routes.map((route) => ({ ...route }));\n const requestUrl = new URL(url, 'http://localhost');\n const resolved = RouteModule.resolveRouteFromRoutes(\n requestUrl.pathname,\n routeTable\n );\n if (!resolved) {\n throw new Error(\n `verifyHydrationSyncForUrl: no route found for url: ${url}`\n );\n }\n\n const seed = options?.seed ?? 12345;\n const ctx = createRenderContext(seed, {\n url,\n data: options?.data,\n params: resolved.params,\n routes: routeTable,\n });\n\n return withRenderContext(ctx, () => {\n startRenderPhase(options?.data ?? null);\n try {\n const node = renderSyncComponentRoot(\n resolved.handler as unknown as Component,\n resolved.params || {},\n ctx\n );\n return verifyHydrationRoot(root, node, ctx);\n } finally {\n stopRenderPhase();\n }\n });\n}\n\n// --- Streaming sink-based renderer (v2) --------------------------------------------------\nimport { StringSink, StreamSink } from './sink';\nimport { renderNodeToSink } from './stream-render';\nimport {\n startRenderPhase,\n stopRenderPhase,\n collectResources,\n resolvePlan,\n resolveResources,\n type ResourcePlan,\n} from './render-keys';\n\nexport type SSRRoute = {\n path: string;\n handler: RouteHandler;\n namespace?: string;\n};\n\nexport function renderToString(\n component: (\n props?: Record<string, unknown>\n ) => VNode | JSXElement | string | number | null\n): string;\nexport function renderToString(opts: {\n url: string;\n routes: SSRRoute[];\n seed?: number;\n data?: SSRData;\n}): string;\nexport function renderToString(arg: unknown): string {\n // Convenience: if a component function is passed, delegate to sync render\n if (typeof arg === 'function') {\n return renderToStringSync(\n arg as (\n props?: Record<string, unknown>\n ) => VNode | JSXElement | string | number | null\n );\n }\n const opts = arg as {\n url: string;\n routes: SSRRoute[];\n seed?: number;\n data?: SSRData;\n };\n const sink = new StringSink();\n renderToSinkInternal({ ...opts, sink });\n sink.end();\n return sink.toString();\n}\n\nexport function renderToStream(opts: {\n url: string;\n routes: SSRRoute[];\n seed?: number;\n data?: SSRData;\n onChunk(html: string): void;\n onComplete(): void;\n}): void {\n const sink = new StreamSink(opts.onChunk, opts.onComplete);\n renderToSinkInternal({ ...opts, sink });\n sink.end();\n}\n\nfunction renderToSinkInternal(opts: {\n url: string;\n routes: SSRRoute[];\n seed?: number;\n data?: SSRData;\n sink: { write(html: string): void; end(): void };\n}) {\n const { url, routes, seed = 12345, data, sink } = opts;\n\n const routeTable = routes.map((route) => ({ ...route }));\n const requestUrl = new URL(url, 'http://localhost');\n const resolved = RouteModule.resolveRouteFromRoutes(\n requestUrl.pathname,\n routeTable\n );\n if (!resolved) throw new Error(`SSR: no route found for url: ${url}`);\n\n const ctx = createRenderContext(seed, {\n url,\n data,\n params: resolved.params,\n routes: routeTable,\n });\n\n withRenderContext(ctx, () => {\n // Start render-phase keying so resource() can lookup resolved `data` by key\n startRenderPhase(data || null);\n try {\n const node = executeComponentSync(\n resolved.handler as unknown as Component,\n resolved.params,\n ctx\n );\n renderNodeToSink(node, sink, ctx);\n } finally {\n stopRenderPhase();\n }\n });\n}\n\nexport { collectResources, resolvePlan, resolveResources, ResourcePlan };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["RouteModule.resolveRouteRequest","RouteModule.resolveRouteFromRoutes"],"sources":["../../src/ssr/index.ts"],"sourcesContent":["/**\n * SSR - Server-Side Rendering\n *\n * Renders Askr components to static HTML strings for server-side rendering.\n * SSR is synchronous: async components are not supported; async work should use\n * `resource()` which is rejected during synchronous SSR. This module throws\n * when an async component or async resource is encountered during sync SSR.\n *\n * Concurrency: Each render call uses AsyncLocalStorage (Node.js) to isolate\n * render state, making concurrent SSR requests safe.\n */\n\nimport type { JSXElement } from '../common/jsx';\nimport { __CONTROL_BOUNDARY__ } from '../common/control';\nimport type {\n RouteAuthOptions,\n RouteHandler,\n RouteManifest,\n RouteRequestResult,\n} from '../common/router';\nimport * as RouteModule from '../router/route';\nimport type { Props } from '../common/props';\nimport { Fragment, ELEMENT_TYPE } from '../jsx';\nimport { DefaultPortal } from '../foundations/structures/portal';\nimport {\n createRenderContext,\n getRenderContext,\n withRenderContext,\n throwSSRDataMissing,\n type RenderContext,\n type SSRData,\n} from './context';\nimport { installSSRBridge } from '../runtime/ssr-bridge';\nimport { getCurrentRenderData, getNextKey } from './render-keys';\nimport {\n createComponentInstance,\n setCurrentComponentInstance,\n getCurrentComponentInstance,\n} from '../runtime/component';\nimport type { ComponentFunction } from '../common/component';\nimport type { DOMElement } from '../common/vnode';\nimport { __ERROR_BOUNDARY__ } from '../common/vnode';\nimport { VOID_ELEMENTS, escapeText, styleObjToCss } from './escape';\nimport { renderAttrs, renderAttrsDirect } from './attrs';\nimport type { VNode, SSRComponent } from './types';\n\nimport { logger } from '../dev/logger';\nimport {\n type ControlBoundaryState,\n evaluateCaseState,\n evaluateShowState,\n} from '../runtime/control';\nimport { evaluateForState } from '../runtime/for';\n\nconst __SSR_DEBUG =\n process.env.NODE_ENV !== 'production' &&\n (process.env.ASKR_SSR_DEBUG === '1' || process.env.ASKR_SSR_DEBUG === 'true');\n\nfunction isSSRAttrEventHandler(key: string): boolean {\n return (\n key.length >= 3 &&\n key.charCodeAt(0) === 111 &&\n key.charCodeAt(1) === 110 &&\n key.charCodeAt(2) >= 65 &&\n key.charCodeAt(2) <= 90\n );\n}\n\nfunction inheritRenderableKey(\n source: VNode | JSXElement,\n result: VNode | JSXElement\n): VNode | JSXElement {\n const inheritedKey = (source as DOMElement).key;\n if (inheritedKey === undefined || inheritedKey === null) {\n return result;\n }\n\n if (!result || typeof result !== 'object' || !('type' in result)) {\n return result;\n }\n\n const resultVNode = result as DOMElement;\n if (resultVNode.key === undefined || resultVNode.key === null) {\n resultVNode.key = inheritedKey;\n }\n\n if (typeof resultVNode.type === 'string') {\n if (!resultVNode.props) {\n resultVNode.props = {};\n }\n\n if (resultVNode.props['data-key'] === undefined) {\n resultVNode.props['data-key'] = String(inheritedKey);\n }\n }\n\n return result;\n}\n\n// Install SSR bridge once so runtime primitives (resource/derive/etc) can\n// detect SSR mode and access deterministic render-phase data without a\n// runtime->ssr import.\ninstallSSRBridge({\n getCurrentSSRContext: getRenderContext,\n throwSSRDataMissing,\n getCurrentRenderData,\n getNextKey,\n});\n\nexport { SSRDataMissingError } from './context';\nexport type { VNode, SSRComponent } from './types';\n\n// Re-export for backwards compatibility\nexport type Component = SSRComponent;\n\n// Dev-only SSR strictness guard helpers. We mutate globals in dev to make\n// accidental usage of Math.random/Date.now during sync SSR fail fast.\n// We implement a re-entrant stack so nested or concurrent calls don't clobber\n// global values unexpectedly.\nconst __ssrGuardStack: Array<{ random: () => number; now: () => number }> = [];\n\nexport function pushSSRStrictPurityGuard() {\n /* istanbul ignore if - dev-only guard */\n if (process.env.NODE_ENV === 'production') return;\n __ssrGuardStack.push({\n random: Reflect.get(Math, 'random') as () => number,\n now: Reflect.get(Date, 'now') as () => number,\n });\n Reflect.set(Math, 'random', () => {\n throw new Error(\n 'SSR Strict Purity: Math.random is not allowed during synchronous SSR. Use the provided `ssr` context RNG instead.'\n );\n });\n Reflect.set(Date, 'now', () => {\n throw new Error(\n 'SSR Strict Purity: Date.now is not allowed during synchronous SSR. Pass timestamps explicitly or use deterministic helpers.'\n );\n });\n}\n\nexport function popSSRStrictPurityGuard() {\n /* istanbul ignore if - dev-only guard */\n if (process.env.NODE_ENV === 'production') return;\n const prev = __ssrGuardStack.pop();\n if (prev) {\n Reflect.set(Math, 'random', prev.random);\n Reflect.set(Date, 'now', prev.now);\n }\n}\n\n/**\n * Synchronous rendering helpers (used for strictly synchronous SSR)\n */\nfunction renderChildSync(child: unknown, ctx: RenderContext): string {\n if (typeof child === 'string') return escapeText(child);\n if (typeof child === 'number') return escapeText(String(child));\n if (child === null || child === undefined || child === false) return '';\n if (child && typeof child === 'object' && 'type' in child) {\n // We already verified the shape above; assert as VNode for the sync renderer\n return renderNodeSync(child as VNode, ctx);\n }\n return '';\n}\n\nfunction renderChildSyncToSink(\n child: unknown,\n sink: { write(html: string): void },\n ctx: RenderContext\n): void {\n if (child === null || child === undefined || child === false) return;\n if (typeof child === 'string') {\n sink.write(escapeText(child));\n return;\n }\n if (typeof child === 'number') {\n sink.write(escapeText(String(child)));\n return;\n }\n if (child && typeof child === 'object' && 'type' in child) {\n renderNodeSyncToSink(child as VNode, sink, ctx);\n }\n}\n\nfunction renderChildrenSync(\n children: unknown[] | undefined,\n ctx: RenderContext\n): string {\n if (!children || !Array.isArray(children) || children.length === 0) return '';\n if (children.length === 1) return renderChildSync(children[0], ctx);\n\n // Small child arrays are common; concatenation is usually faster than\n // allocating + joining. Large sibling lists (10k+) need join to avoid O(n^2)\n // concatenation costs.\n if (children.length <= 8) {\n let result = '';\n for (const child of children) result += renderChildSync(child, ctx);\n return result;\n }\n\n const parts = Array.from({ length: children.length }, (_, index) =>\n renderChildSync(children[index], ctx)\n );\n return parts.join('');\n}\n\nfunction normalizeRenderableChildren(value: unknown): unknown[] {\n if (value === null || value === undefined || value === false) {\n return [];\n }\n\n return Array.isArray(value) ? value : [value];\n}\n\nfunction getErrorBoundaryState(\n node: VNode | JSXElement\n): NonNullable<ComponentInstance['errorBoundaryState']> | null {\n return (\n (node as DOMElement & { __instance?: ComponentInstance }).__instance\n ?.errorBoundaryState ?? null\n );\n}\n\nfunction createDefaultErrorBoundaryFallbackVNode(error: unknown): JSXElement {\n const message =\n error instanceof Error\n ? error.stack || error.message || error.name\n : typeof error === 'string'\n ? error\n : (() => {\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n })();\n\n return {\n $$typeof: ELEMENT_TYPE,\n type: 'div',\n props: {\n role: 'alert',\n 'data-askr-error-boundary': 'true',\n style: {\n boxSizing: 'border-box',\n padding: '1rem',\n border: '1px solid currentColor',\n borderRadius: '0.75rem',\n display: 'grid',\n gap: '0.75rem',\n maxWidth: '100%',\n },\n children: [\n {\n $$typeof: ELEMENT_TYPE,\n type: 'strong',\n props: {\n children: ['Something went wrong while rendering this view.'],\n },\n },\n {\n $$typeof: ELEMENT_TYPE,\n type: 'p',\n props: {\n style: { margin: '0' },\n children: [\n 'The app recovered into a visible fallback so the error is not hidden in the console.',\n ],\n },\n },\n {\n $$typeof: ELEMENT_TYPE,\n type: 'details',\n props: {\n open: process.env.NODE_ENV !== 'production',\n children: [\n {\n $$typeof: ELEMENT_TYPE,\n type: 'summary',\n props: {\n children: ['Error details'],\n },\n },\n {\n $$typeof: ELEMENT_TYPE,\n type: 'pre',\n props: {\n style: {\n margin: '0',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n },\n children: [message],\n },\n },\n ],\n },\n },\n ],\n },\n key: null,\n } as JSXElement;\n}\n\nfunction resolveErrorBoundaryFallbackNode(\n fallback: unknown,\n error: unknown,\n reset: () => void\n): unknown {\n return typeof fallback === 'function'\n ? (fallback as (error: unknown, reset: () => void) => unknown)(error, reset)\n : fallback !== undefined\n ? fallback\n : createDefaultErrorBoundaryFallbackVNode(error);\n}\n\nfunction renderErrorBoundaryFallbackValue(\n fallback: unknown,\n error: unknown,\n reset: () => void,\n ctx: RenderContext\n): string {\n const nextValue = resolveErrorBoundaryFallbackNode(fallback, error, reset);\n\n return Array.isArray(nextValue)\n ? renderChildrenSync(normalizeRenderableChildren(nextValue), ctx)\n : renderChildSync(nextValue, ctx);\n}\n\nfunction renderErrorBoundaryFallbackValueToSink(\n fallback: unknown,\n error: unknown,\n reset: () => void,\n sink: { write(html: string): void },\n ctx: RenderContext\n): void {\n sink.write(renderErrorBoundaryFallbackValue(fallback, error, reset, ctx));\n}\n\nfunction getControlBoundaryState(\n node: VNode | JSXElement\n): ControlBoundaryState | null {\n const boundaryNode = node as DOMElement;\n\n return (\n boundaryNode._controlState ??\n (boundaryNode._forState as ControlBoundaryState | undefined) ??\n null\n );\n}\n\nfunction evaluateControlBoundaryChildren(\n node: VNode | JSXElement\n): unknown[] | undefined {\n if (node.type !== __CONTROL_BOUNDARY__) {\n return undefined;\n }\n\n const controlState = getControlBoundaryState(node);\n if (!controlState) {\n return [];\n }\n\n if (controlState.kind === 'for') {\n return evaluateForState(controlState);\n }\n if (controlState.kind === 'show') {\n return evaluateShowState(controlState);\n }\n return evaluateCaseState(controlState);\n}\n\nfunction renderChildrenSyncToSink(\n children: unknown[] | undefined,\n sink: { write(html: string): void },\n ctx: RenderContext\n): void {\n if (!children || !Array.isArray(children) || children.length === 0) return;\n if (children.length >= 32) {\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (child === null || child === undefined || child === false) continue;\n if (typeof child === 'string') {\n sink.write(escapeText(child));\n continue;\n }\n if (typeof child === 'number') {\n sink.write(escapeText(String(child)));\n continue;\n }\n if (child && typeof child === 'object' && 'type' in child) {\n renderNodeSyncToSink(child as VNode, sink, ctx);\n }\n }\n return;\n }\n for (let i = 0; i < children.length; i++) {\n renderChildSyncToSink(children[i], sink, ctx);\n }\n}\n\nfunction sinkWrite2(\n sink: { write(html: string): void; write2?: (a: string, b: string) => void },\n a: string,\n b: string\n): void {\n if (typeof sink.write2 === 'function') {\n sink.write2(a, b);\n return;\n }\n sink.write(a);\n sink.write(b);\n}\n\nfunction sinkWrite3(\n sink: {\n write(html: string): void;\n write3?: (a: string, b: string, c: string) => void;\n },\n a: string,\n b: string,\n c: string\n): void {\n if (typeof sink.write3 === 'function') {\n sink.write3(a, b, c);\n return;\n }\n sink.write(a);\n sink.write(b);\n sink.write(c);\n}\n\n/**\n * Render a VNode synchronously. Throws if an async component is encountered.\n */\nfunction renderNodeSync(node: VNode | JSXElement, ctx: RenderContext): string {\n const { type, props } = node;\n\n /* istanbul ignore if - dev-only debug */\n if (__SSR_DEBUG) {\n try {\n logger.warn('[SSR] renderNodeSync type:', typeof type, type);\n } catch {\n // Ignore coercion errors for Symbols\n }\n }\n\n if (typeof type === 'function') {\n const result = executeComponentSync(type as Component, props, ctx);\n if (result instanceof Promise) {\n // Use centralized SSR error to maintain a single failure mode\n throwSSRDataMissing();\n }\n // executeComponentSync already normalizes primitives into VNode wrappers,\n // so result is always a VNode or JSXElement here. Safe to recurse directly.\n return renderNodeSync(result, ctx);\n }\n\n // Special-case fragments (symbols) - render children directly\n if (typeof type === 'symbol') {\n if (type === Fragment) {\n // Prefer explicit `children` array; fallback to `props.children` for\n // JSX runtimes that place children on props.\n const childrenArr = Array.isArray((node as VNode).children)\n ? (node as VNode).children\n : Array.isArray(props?.children)\n ? (props?.children as unknown[])\n : undefined;\n /* istanbul ignore if - dev-only debug */\n if (__SSR_DEBUG) {\n try {\n logger.warn('[SSR] fragment children length:', childrenArr?.length);\n } catch {\n // Ignore\n }\n }\n return renderChildrenSync(childrenArr, ctx);\n }\n if (type === __CONTROL_BOUNDARY__) {\n return renderChildrenSync(evaluateControlBoundaryChildren(node), ctx);\n }\n if (type === __ERROR_BOUNDARY__) {\n const boundaryState = getErrorBoundaryState(node);\n const fallback = props?.fallback;\n const reset = () => {\n const instance = (\n node as DOMElement & { __instance?: ComponentInstance }\n ).__instance;\n const state = instance?.errorBoundaryState;\n if (state) {\n state.error = null;\n state.notified = false;\n }\n };\n\n if (boundaryState?.error != null) {\n return renderErrorBoundaryFallbackValue(\n fallback,\n boundaryState.error,\n reset,\n ctx\n );\n }\n\n try {\n return renderChildrenSync(\n normalizeRenderableChildren(props?.children),\n ctx\n );\n } catch (error) {\n if (boundaryState) {\n boundaryState.error = error;\n boundaryState.notified = true;\n }\n logger.error('[Askr] ErrorBoundary caught render error:', error);\n return renderErrorBoundaryFallbackValue(fallback, error, reset, ctx);\n }\n }\n // Unknown symbol type - throw a helpful error instead of letting\n // a built-in TypeError bubble up when attempting to coerce to string.\n throw new Error(\n `renderNodeSync: unsupported VNode symbol type: ${String(type)}`\n );\n }\n\n const typeStr = type as string;\n if (VOID_ELEMENTS.has(typeStr)) {\n const attrs = renderAttrs(props);\n return `<${typeStr}${attrs} />`;\n }\n\n // Hot path: most nodes don't use dangerouslySetInnerHTML.\n // Avoid allocating the `{ attrs, dangerousHtml }` object unless the prop exists.\n const maybeDangerous = (\n props as unknown as { dangerouslySetInnerHTML?: unknown }\n )?.dangerouslySetInnerHTML;\n if (maybeDangerous !== undefined && maybeDangerous !== null) {\n const { attrs, dangerousHtml } = renderAttrs(props, {\n returnDangerousHtml: true,\n });\n if (dangerousHtml !== undefined) {\n return `<${typeStr}${attrs}>${dangerousHtml}</${typeStr}>`;\n }\n const childrenHtml = renderChildrenSync((node as VNode).children, ctx);\n return `<${typeStr}${attrs}>${childrenHtml}</${typeStr}>`;\n }\n\n const attrs = renderAttrs(props);\n const childrenHtml = renderChildrenSync((node as VNode).children, ctx);\n return `<${typeStr}${attrs}>${childrenHtml}</${typeStr}>`;\n}\n\nfunction renderNodeSyncToSink(\n node: VNode | JSXElement,\n sink: {\n write(html: string): void;\n write2?: (a: string, b: string) => void;\n write3?: (a: string, b: string, c: string) => void;\n },\n ctx: RenderContext\n): void {\n const { type, props } = node;\n\n if (typeof type === 'function') {\n const result = executeComponentSync(type as Component, props, ctx);\n // executeComponentSync guarantees synchronous result.\n renderNodeSyncToSink(inheritRenderableKey(node, result), sink, ctx);\n return;\n }\n\n // Fragment\n if (typeof type === 'symbol') {\n if (type === Fragment) {\n const childrenArr = Array.isArray((node as VNode).children)\n ? (node as VNode).children\n : Array.isArray(props?.children)\n ? (props?.children as unknown[])\n : undefined;\n renderChildrenSyncToSink(childrenArr, sink, ctx);\n return;\n }\n if (type === __CONTROL_BOUNDARY__) {\n renderChildrenSyncToSink(\n evaluateControlBoundaryChildren(node),\n sink,\n ctx\n );\n return;\n }\n if (type === __ERROR_BOUNDARY__) {\n const boundaryState = getErrorBoundaryState(node);\n const fallback = props?.fallback;\n const reset = () => {\n const instance = (\n node as DOMElement & { __instance?: ComponentInstance }\n ).__instance;\n const state = instance?.errorBoundaryState;\n if (state) {\n state.error = null;\n state.notified = false;\n }\n };\n\n if (boundaryState?.error != null) {\n renderErrorBoundaryFallbackValueToSink(\n fallback,\n boundaryState.error,\n reset,\n sink,\n ctx\n );\n return;\n }\n\n try {\n renderChildrenSyncToSink(\n normalizeRenderableChildren(props?.children),\n sink,\n ctx\n );\n } catch (error) {\n if (boundaryState) {\n boundaryState.error = error;\n boundaryState.notified = true;\n }\n logger.error('[Askr] ErrorBoundary caught render error:', error);\n renderErrorBoundaryFallbackValueToSink(\n fallback,\n error,\n reset,\n sink,\n ctx\n );\n }\n return;\n }\n throw new Error(\n `renderNodeSyncToSink: unsupported VNode symbol type: ${String(type)}`\n );\n }\n\n const typeStr = type as string;\n if (VOID_ELEMENTS.has(typeStr)) {\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write(' />');\n return;\n }\n\n const maybeDangerous = props\n ? (props as unknown as { dangerouslySetInnerHTML?: unknown })\n ?.dangerouslySetInnerHTML\n : undefined;\n\n if (maybeDangerous !== undefined && maybeDangerous !== null) {\n const dangerousHtml =\n typeof maybeDangerous === 'object' && '__html' in maybeDangerous\n ? String((maybeDangerous as { __html: unknown }).__html)\n : undefined;\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n if (dangerousHtml !== undefined) {\n sink.write(dangerousHtml);\n } else {\n renderChildrenSyncToSink((node as VNode).children, sink, ctx);\n }\n sinkWrite3(sink, '</', typeStr, '>');\n return;\n }\n\n // Normalize children: prefer node.children, fallback to props.children (for JSXElement)\n let children = (node as VNode).children;\n if (children === undefined && props?.children !== undefined) {\n const propsChildren = props.children as unknown;\n if (Array.isArray(propsChildren)) {\n children = propsChildren;\n } else if (propsChildren !== null && propsChildren !== false) {\n children = [propsChildren];\n }\n }\n\n // Hot path: empty element (no children) - single write\n if (!children || (Array.isArray(children) && children.length === 0)) {\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n sinkWrite3(sink, '</', typeStr, '>');\n return;\n }\n\n // Hot path: single text child - single write\n if (Array.isArray(children) && children.length === 1) {\n const only = children[0];\n if (typeof only === 'string') {\n const content = escapeText(only);\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n sink.write(content);\n sinkWrite3(sink, '</', typeStr, '>');\n return;\n }\n if (typeof only === 'number') {\n const content = escapeText(String(only));\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n sink.write(content);\n sinkWrite3(sink, '</', typeStr, '>');\n return;\n }\n }\n\n // General case: element with complex children\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n renderChildrenSyncToSink(children, sink, ctx);\n sinkWrite3(sink, '</', typeStr, '>');\n}\n\n/**\n * Execute a component function (synchronously or async) and return VNode\n */\n/**\n * Execute a component synchronously inside a render-only context.\n * This must not create or reuse runtime ComponentInstance objects. We pass\n * the render context explicitly as `context.ssr` in the second argument so\n * components can opt-in to deterministic randomness/time via the provided RNG.\n */\nfunction executeComponentSync(\n component: Component,\n props: Record<string, unknown> | undefined,\n ctx: RenderContext\n): VNode | JSXElement {\n // Dev-only: enforce SSR purity with clear messages. We temporarily override\n // `Math.random` and `Date.now` while rendering to produce a targeted error\n // if components call them directly. We restore them immediately afterwards.\n // Re-entrant guard for dev-only SSR strict purity checks.\n // We avoid clobbering globals permanently by pushing the original functions\n // onto a stack and restoring them on exit. This is safer for nested or\n // stacked SSR render invocations.\n\n try {\n if (process.env.NODE_ENV !== 'production') {\n pushSSRStrictPurityGuard();\n }\n // Create a temporary, lightweight component instance so runtime APIs like\n // `state()` and `currentRoute()` can be called during SSR render. We avoid mounting\n // or side-effects by not attaching the instance to any DOM target.\n const prev = getCurrentComponentInstance();\n const temp = createComponentInstance(\n 'ssr-temp',\n component as ComponentFunction,\n (props || {}) as Props,\n null\n );\n temp.ssr = true;\n setCurrentComponentInstance(temp);\n try {\n // Context already set via withRenderContext at render entry point\n const result = component((props || {}) as Props, { ssr: ctx });\n if (result instanceof Promise) {\n // Use the centralized SSR error for async data/components during SSR\n throwSSRDataMissing();\n }\n if (\n typeof result === 'string' ||\n typeof result === 'number' ||\n typeof result === 'boolean' ||\n result === null ||\n result === undefined\n ) {\n // Return a Fragment with the text content, not a div wrapper\n const inner =\n result === null || result === undefined || result === false\n ? ''\n : String(result);\n return {\n $$typeof: ELEMENT_TYPE,\n type: Fragment,\n props: { children: inner ? [inner] : [] },\n } as unknown as VNode | JSXElement;\n }\n return result as VNode | JSXElement;\n } finally {\n // Restore the previous instance (if any)\n setCurrentComponentInstance(prev);\n }\n } finally {\n if (process.env.NODE_ENV !== 'production') popSSRStrictPurityGuard();\n }\n}\n\nfunction wrapWithDefaultPortal(out: unknown): VNode | JSXElement {\n const portalVNode = {\n $$typeof: ELEMENT_TYPE,\n type: DefaultPortal,\n props: {},\n key: '__default_portal',\n } as unknown;\n\n if (out == null) {\n return {\n $$typeof: ELEMENT_TYPE,\n type: Fragment,\n props: { children: [portalVNode] },\n } as unknown as VNode | JSXElement;\n }\n\n return {\n $$typeof: ELEMENT_TYPE,\n type: Fragment,\n props: { children: [out as unknown, portalVNode] },\n } as unknown as VNode | JSXElement;\n}\n\nfunction renderSyncComponentRoot(\n component: Component,\n props: Record<string, unknown> | undefined,\n ctx: RenderContext\n): VNode | JSXElement {\n const wrapped: Component = (\n p?: Record<string, unknown>,\n c?: { signal?: AbortSignal; ssr?: RenderContext }\n ) => wrapWithDefaultPortal(component(p ?? {}, c));\n\n return executeComponentSync(wrapped, props || {}, ctx);\n}\n\nfunction getRenderableChildren(\n node: VNode | JSXElement\n): unknown[] | undefined {\n if (Array.isArray((node as VNode).children)) {\n return (node as VNode).children;\n }\n if (Array.isArray(node.props?.children)) {\n return node.props.children as unknown[];\n }\n if (\n node.props?.children !== undefined &&\n node.props.children !== null &&\n node.props.children !== false\n ) {\n return [node.props.children];\n }\n return undefined;\n}\n\ntype VerifyState = {\n current: ChildNode | null;\n pendingText: string;\n};\n\nfunction flushPendingText(state: VerifyState): boolean {\n if (state.pendingText.length === 0) {\n return true;\n }\n if (!state.current || state.current.nodeType !== Node.TEXT_NODE) {\n return false;\n }\n if (state.current.textContent !== state.pendingText) {\n return false;\n }\n state.current = state.current.nextSibling;\n state.pendingText = '';\n return true;\n}\n\nfunction verifyRenderedAttrs(\n element: Element,\n props: Props | undefined\n): { matched: boolean; dangerousHtml?: string } {\n const matchedAttrs = new Set<string>();\n let dangerousHtml: string | undefined;\n\n if (!props || typeof props !== 'object') {\n return {\n matched: element.attributes.length === 0,\n dangerousHtml,\n };\n }\n\n const propsObj = props as Record<string, unknown>;\n for (const key in propsObj) {\n const value = propsObj[key];\n\n if (\n key === 'children' ||\n key === 'key' ||\n key === 'ref' ||\n key === 'dangerouslySetInnerHTML'\n ) {\n if (\n key === 'dangerouslySetInnerHTML' &&\n value &&\n typeof value === 'object' &&\n '__html' in value\n ) {\n dangerousHtml = String((value as { __html: unknown }).__html);\n }\n continue;\n }\n\n if (isSSRAttrEventHandler(key) || key.charCodeAt(0) === 95) {\n continue;\n }\n\n const attrName = key === 'class' || key === 'className' ? 'class' : key;\n\n if (attrName === 'style') {\n const css = typeof value === 'string' ? value : styleObjToCss(value);\n if (!css) continue;\n if (element.getAttribute('style') !== css) {\n return { matched: false };\n }\n matchedAttrs.add('style');\n continue;\n }\n\n if (value === true) {\n if (!element.hasAttribute(attrName)) {\n return { matched: false };\n }\n matchedAttrs.add(attrName);\n continue;\n }\n\n if (value === false || value === null || value === undefined) {\n continue;\n }\n\n const stringValue = String(value);\n if (element.getAttribute(attrName) !== stringValue) {\n return { matched: false };\n }\n matchedAttrs.add(attrName);\n }\n\n if (element.attributes.length !== matchedAttrs.size) {\n return { matched: false };\n }\n\n return { matched: true, dangerousHtml };\n}\n\nfunction verifyExpectedNode(\n node: unknown,\n state: VerifyState,\n ctx: RenderContext\n): boolean {\n if (node === null || node === undefined || node === false) {\n return true;\n }\n\n if (typeof node === 'string' || typeof node === 'number') {\n state.pendingText += String(node);\n return true;\n }\n\n if (!node || typeof node !== 'object' || !('type' in node)) {\n return true;\n }\n\n const vnode = node as VNode | JSXElement;\n const { type, props } = vnode;\n\n if (typeof type === 'function') {\n return verifyExpectedNode(\n inheritRenderableKey(\n vnode,\n executeComponentSync(type as Component, props, ctx)\n ),\n state,\n ctx\n );\n }\n\n if (typeof type === 'symbol') {\n if (type === __CONTROL_BOUNDARY__) {\n const children = evaluateControlBoundaryChildren(vnode);\n if (!children || children.length === 0) {\n return true;\n }\n for (let index = 0; index < children.length; index += 1) {\n if (!verifyExpectedNode(children[index], state, ctx)) {\n return false;\n }\n }\n return true;\n }\n if (type === __ERROR_BOUNDARY__) {\n const boundaryState = getErrorBoundaryState(vnode);\n const fallback = props?.fallback;\n const reset = () => {\n const instance = (\n vnode as DOMElement & { __instance?: ComponentInstance }\n ).__instance;\n const stateRef = instance?.errorBoundaryState;\n if (stateRef) {\n stateRef.error = null;\n stateRef.notified = false;\n }\n };\n\n const snapshot: VerifyState = {\n current: state.current,\n pendingText: state.pendingText,\n };\n\n if (boundaryState?.error != null) {\n const fallbackNode = resolveErrorBoundaryFallbackNode(\n fallback,\n boundaryState.error,\n reset\n );\n return verifyRenderableNode(fallbackNode, state, ctx);\n }\n\n try {\n if (\n verifyExpectedChildren(\n normalizeRenderableChildren(props?.children),\n state,\n ctx\n )\n ) {\n return true;\n }\n } catch (error) {\n if (boundaryState) {\n boundaryState.error = error;\n boundaryState.notified = true;\n }\n }\n\n state.current = snapshot.current;\n state.pendingText = snapshot.pendingText;\n\n const fallbackNode = resolveErrorBoundaryFallbackNode(\n fallback,\n boundaryState?.error ?? new Error('ErrorBoundary render failed'),\n reset\n );\n return verifyRenderableNode(fallbackNode, state, ctx);\n }\n if (type !== Fragment) {\n throw new Error(\n `verifyHydrationSyncForUrl: unsupported VNode symbol type: ${String(type)}`\n );\n }\n const children = getRenderableChildren(vnode);\n if (!children || children.length === 0) {\n return true;\n }\n for (let index = 0; index < children.length; index += 1) {\n if (!verifyExpectedNode(children[index], state, ctx)) {\n return false;\n }\n }\n return true;\n }\n\n if (!flushPendingText(state)) {\n return false;\n }\n\n if (!state.current || state.current.nodeType !== Node.ELEMENT_NODE) {\n return false;\n }\n\n const actualElement = state.current as Element;\n if (actualElement.tagName.toLowerCase() !== String(type).toLowerCase()) {\n return false;\n }\n\n const attrMatch = verifyRenderedAttrs(actualElement, props);\n if (!attrMatch.matched) {\n return false;\n }\n\n if (VOID_ELEMENTS.has(String(type))) {\n if (actualElement.firstChild !== null) {\n return false;\n }\n state.current = actualElement.nextSibling;\n return true;\n }\n\n if (attrMatch.dangerousHtml !== undefined) {\n if (actualElement.innerHTML !== attrMatch.dangerousHtml) {\n return false;\n }\n state.current = actualElement.nextSibling;\n return true;\n }\n\n const childState: VerifyState = {\n current: actualElement.firstChild,\n pendingText: '',\n };\n const children = getRenderableChildren(vnode);\n if (children && children.length > 0) {\n for (let index = 0; index < children.length; index += 1) {\n if (!verifyExpectedNode(children[index], childState, ctx)) {\n return false;\n }\n }\n }\n\n if (!flushPendingText(childState) || childState.current !== null) {\n return false;\n }\n\n state.current = actualElement.nextSibling;\n return true;\n}\n\nfunction verifyHydrationRoot(\n root: Element,\n node: VNode | JSXElement,\n ctx: RenderContext\n): boolean {\n const state: VerifyState = {\n current: root.firstChild,\n pendingText: '',\n };\n if (!verifyExpectedNode(node, state, ctx)) {\n return false;\n }\n return flushPendingText(state) && state.current === null;\n}\n\nfunction verifyExpectedChildren(\n children: unknown[] | undefined,\n state: VerifyState,\n ctx: RenderContext\n): boolean {\n if (!children || children.length === 0) {\n return true;\n }\n\n for (let index = 0; index < children.length; index += 1) {\n if (!verifyExpectedNode(children[index], state, ctx)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction verifyRenderableNode(\n value: unknown,\n state: VerifyState,\n ctx: RenderContext\n): boolean {\n return Array.isArray(value)\n ? verifyExpectedChildren(normalizeRenderableChildren(value), state, ctx)\n : verifyExpectedNode(value, state, ctx);\n}\n\n/**\n * Single synchronous SSR entrypoint: render a component to an HTML string.\n * This is strictly synchronous and deterministic. Optionally provide a seed\n * for deterministic randomness via `options.seed`.\n */\nexport function renderToStringSync(\n component: (\n props?: Record<string, unknown>\n ) => VNode | JSXElement | string | number | boolean | null | undefined,\n props?: Record<string, unknown>,\n options?: { seed?: number; data?: SSRData }\n): string {\n const seed = options?.seed ?? 12345;\n const ctx = createRenderContext(seed, { data: options?.data });\n\n return withRenderContext(ctx, () => {\n // Set render data on context (startRenderPhase now reads from context)\n startRenderPhase(options?.data ?? null);\n try {\n const node = renderSyncComponentRoot(\n component as unknown as Component,\n props || {},\n ctx\n );\n if (!node) {\n throw new Error('renderToStringSync: wrapped component returned empty');\n }\n const sink = new StringSink();\n renderNodeSyncToSink(node, sink, ctx);\n sink.end();\n return sink.toString();\n } finally {\n stopRenderPhase();\n }\n });\n}\n\nexport function renderResolvedToStringSync(opts: {\n url: string;\n routes: Array<{ path: string; handler: RouteHandler; namespace?: string }>;\n handler: RouteHandler;\n params?: Record<string, string>;\n options?: { seed?: number; data?: SSRData };\n}): string {\n const { url, routes, handler, params, options } = opts;\n const seed = options?.seed ?? 12345;\n const ctx = createRenderContext(seed, {\n url,\n data: options?.data,\n params,\n routes,\n });\n\n return withRenderContext(ctx, () => {\n startRenderPhase(options?.data ?? null);\n try {\n const node = renderSyncComponentRoot(\n handler as unknown as Component,\n params || {},\n ctx\n );\n const sink = new StringSink();\n renderNodeSyncToSink(node, sink, ctx);\n sink.end();\n return sink.toString();\n } finally {\n stopRenderPhase();\n }\n });\n}\n\nexport async function resolveRequest(opts: {\n url: string;\n manifest?: RouteManifest;\n routes?: Array<{ path: string; handler: RouteHandler; namespace?: string }>;\n auth?: RouteAuthOptions;\n signal?: AbortSignal;\n}): Promise<RouteRequestResult> {\n const { url, manifest, routes, auth, signal } = opts;\n\n if (manifest) {\n return await RouteModule.resolveRouteRequest(url, {\n manifest,\n mode: 'ssr',\n auth,\n signal,\n });\n }\n\n if (!routes) {\n throw new Error('resolveRequest requires a route manifest or route table.');\n }\n\n const requestUrl = new URL(url, 'http://localhost');\n const resolved = RouteModule.resolveRouteFromRoutes(\n requestUrl.pathname,\n routes\n );\n\n if (!resolved) {\n return null;\n }\n\n return {\n kind: 'render',\n handler: resolved.handler,\n params: resolved.params,\n };\n}\n\n// Synchronous server render for strict checks. Routes are resolved against the\n// provided route table and kept in the per-render SSR context.\nexport function renderToStringSyncForUrl(opts: {\n url: string;\n routes: Array<{ path: string; handler: RouteHandler; namespace?: string }>;\n options?: { seed?: number; data?: SSRData };\n}): string {\n const { url, routes, options } = opts;\n const routeTable = routes.map((route) => ({ ...route }));\n const requestUrl = new URL(url, 'http://localhost');\n const resolved = RouteModule.resolveRouteFromRoutes(\n requestUrl.pathname,\n routeTable\n );\n if (!resolved)\n throw new Error(`renderToStringSyncForUrl: no route found for url: ${url}`);\n\n return renderResolvedToStringSync({\n url,\n routes: routeTable,\n handler: resolved.handler,\n params: resolved.params,\n options,\n });\n}\n\nexport function verifyHydrationSyncForUrl(opts: {\n root: Element;\n url: string;\n routes: Array<{ path: string; handler: RouteHandler; namespace?: string }>;\n options?: { seed?: number; data?: SSRData };\n}): boolean {\n const { root, url, routes, options } = opts;\n const routeTable = routes.map((route) => ({ ...route }));\n const requestUrl = new URL(url, 'http://localhost');\n const resolved = RouteModule.resolveRouteFromRoutes(\n requestUrl.pathname,\n routeTable\n );\n if (!resolved) {\n throw new Error(\n `verifyHydrationSyncForUrl: no route found for url: ${url}`\n );\n }\n\n const seed = options?.seed ?? 12345;\n const ctx = createRenderContext(seed, {\n url,\n data: options?.data,\n params: resolved.params,\n routes: routeTable,\n });\n\n return withRenderContext(ctx, () => {\n startRenderPhase(options?.data ?? null);\n try {\n const node = renderSyncComponentRoot(\n resolved.handler as unknown as Component,\n resolved.params || {},\n ctx\n );\n return verifyHydrationRoot(root, node, ctx);\n } finally {\n stopRenderPhase();\n }\n });\n}\n\n// --- Streaming sink-based renderer (v2) --------------------------------------------------\nimport { StringSink, StreamSink } from './sink';\nimport { renderNodeToSink } from './stream-render';\nimport {\n startRenderPhase,\n stopRenderPhase,\n collectResources,\n resolvePlan,\n resolveResources,\n type ResourcePlan,\n} from './render-keys';\n\nexport type SSRRoute = {\n path: string;\n handler: RouteHandler;\n namespace?: string;\n};\n\nexport function renderToString(\n component: (\n props?: Record<string, unknown>\n ) => VNode | JSXElement | string | number | null\n): string;\nexport function renderToString(opts: {\n url: string;\n routes: SSRRoute[];\n seed?: number;\n data?: SSRData;\n}): string;\nexport function renderToString(arg: unknown): string {\n // Convenience: if a component function is passed, delegate to sync render\n if (typeof arg === 'function') {\n return renderToStringSync(\n arg as (\n props?: Record<string, unknown>\n ) => VNode | JSXElement | string | number | null\n );\n }\n const opts = arg as {\n url: string;\n routes: SSRRoute[];\n seed?: number;\n data?: SSRData;\n };\n const sink = new StringSink();\n renderToSinkInternal({ ...opts, sink });\n sink.end();\n return sink.toString();\n}\n\nexport function renderToStream(opts: {\n url: string;\n routes: SSRRoute[];\n seed?: number;\n data?: SSRData;\n onChunk(html: string): void;\n onComplete(): void;\n}): void {\n const sink = new StreamSink(opts.onChunk, opts.onComplete);\n renderToSinkInternal({ ...opts, sink });\n sink.end();\n}\n\nfunction renderToSinkInternal(opts: {\n url: string;\n routes: SSRRoute[];\n seed?: number;\n data?: SSRData;\n sink: { write(html: string): void; end(): void };\n}) {\n const { url, routes, seed = 12345, data, sink } = opts;\n\n const routeTable = routes.map((route) => ({ ...route }));\n const requestUrl = new URL(url, 'http://localhost');\n const resolved = RouteModule.resolveRouteFromRoutes(\n requestUrl.pathname,\n routeTable\n );\n if (!resolved) throw new Error(`SSR: no route found for url: ${url}`);\n\n const ctx = createRenderContext(seed, {\n url,\n data,\n params: resolved.params,\n routes: routeTable,\n });\n\n withRenderContext(ctx, () => {\n // Start render-phase keying so resource() can lookup resolved `data` by key\n startRenderPhase(data || null);\n try {\n const node = executeComponentSync(\n resolved.handler as unknown as Component,\n resolved.params,\n ctx\n );\n renderNodeToSink(node, sink, ctx);\n } finally {\n stopRenderPhase();\n }\n });\n}\n\nexport { collectResources, resolvePlan, resolveResources, ResourcePlan };\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-keys.js","names":[],"sources":["../../src/ssr/render-keys.ts"],"sourcesContent":["/**\n * SSR Data Management\n *\n * Manages render-phase keying for deterministic SSR data lookup.\n * All state is stored in the per-render context for concurrency safety.\n */\n\nimport type { SSRRoute } from './index';\nimport { getRenderContext } from './context';\n\nexport type ResourceDescriptor = {\n key: string;\n fn: (opts: { signal?: AbortSignal }) => Promise<unknown> | unknown;\n deps: unknown[];\n index: number;\n};\n\nexport type ResourcePlan = {\n resources: ResourceDescriptor[]; // declarative manifest in stable order\n};\n\nexport function getCurrentRenderData(): Record<string, unknown> | null {\n const ctx = getRenderContext();\n return ctx?.renderData ?? null;\n}\n\nexport function resetKeyCounter() {\n const ctx = getRenderContext();\n if (ctx) ctx.keyCounter = 0;\n}\n\nexport function getNextKey(): string {\n const ctx = getRenderContext();\n if (!ctx) return `r:0`; // Fallback for edge cases\n return `r:${ctx.keyCounter++}`;\n}\n\nexport function startRenderPhase(data: Record<string, unknown> | null) {\n const ctx = getRenderContext();\n if (ctx) {\n ctx.renderData = data ?? null;\n ctx.keyCounter = 0;\n }\n}\n\nexport function stopRenderPhase() {\n const ctx = getRenderContext();\n if (ctx) {\n ctx.renderData = null;\n ctx.keyCounter = 0;\n }\n}\n\n// --- Deprecated APIs (throw descriptive errors) ---\n\nconst PREPASS_REMOVED_MSG =\n 'SSR collection/prepass is removed: SSR is strictly synchronous';\n\n/** @deprecated SSR prepass has been removed */\nexport function startCollection(): never {\n throw new Error(`${PREPASS_REMOVED_MSG}; do not call startCollection()`);\n}\n\n/** @deprecated SSR prepass has been removed */\nexport function stopCollection(): ResourcePlan {\n throw new Error(`${PREPASS_REMOVED_MSG}; do not call stopCollection()`);\n}\n\n/** @deprecated SSR prepass has been removed */\nexport function registerResourceIntent(\n _fn: ResourceDescriptor['fn'],\n _deps: unknown[]\n): string {\n throw new Error(\n `${PREPASS_REMOVED_MSG}; resource() no longer registers intents for prepass`\n );\n}\n\n/** @deprecated SSR prepass has been removed */\nexport async function resolvePlan(\n _plan: ResourcePlan\n): Promise<Record<string, unknown>> {\n throw new Error(\n `${PREPASS_REMOVED_MSG}; async resource plans are not supported`\n );\n}\n\n/** @deprecated SSR prepass has been removed */\nexport function collectResources(_opts: {\n url: string;\n routes: SSRRoute[];\n}): ResourcePlan {\n throw new Error(`${PREPASS_REMOVED_MSG}; collectResources is disabled`);\n}\n\n/** @deprecated Alias for resolvePlan */\nexport const resolveResources = resolvePlan;\n"],"mappings":";;AAqBA,SAAgB,uBAAuD;
|
|
1
|
+
{"version":3,"file":"render-keys.js","names":[],"sources":["../../src/ssr/render-keys.ts"],"sourcesContent":["/**\n * SSR Data Management\n *\n * Manages render-phase keying for deterministic SSR data lookup.\n * All state is stored in the per-render context for concurrency safety.\n */\n\nimport type { SSRRoute } from './index';\nimport { getRenderContext } from './context';\n\nexport type ResourceDescriptor = {\n key: string;\n fn: (opts: { signal?: AbortSignal }) => Promise<unknown> | unknown;\n deps: unknown[];\n index: number;\n};\n\nexport type ResourcePlan = {\n resources: ResourceDescriptor[]; // declarative manifest in stable order\n};\n\nexport function getCurrentRenderData(): Record<string, unknown> | null {\n const ctx = getRenderContext();\n return ctx?.renderData ?? null;\n}\n\nexport function resetKeyCounter() {\n const ctx = getRenderContext();\n if (ctx) ctx.keyCounter = 0;\n}\n\nexport function getNextKey(): string {\n const ctx = getRenderContext();\n if (!ctx) return `r:0`; // Fallback for edge cases\n return `r:${ctx.keyCounter++}`;\n}\n\nexport function startRenderPhase(data: Record<string, unknown> | null) {\n const ctx = getRenderContext();\n if (ctx) {\n ctx.renderData = data ?? null;\n ctx.keyCounter = 0;\n }\n}\n\nexport function stopRenderPhase() {\n const ctx = getRenderContext();\n if (ctx) {\n ctx.renderData = null;\n ctx.keyCounter = 0;\n }\n}\n\n// --- Deprecated APIs (throw descriptive errors) ---\n\nconst PREPASS_REMOVED_MSG =\n 'SSR collection/prepass is removed: SSR is strictly synchronous';\n\n/** @deprecated SSR prepass has been removed */\nexport function startCollection(): never {\n throw new Error(`${PREPASS_REMOVED_MSG}; do not call startCollection()`);\n}\n\n/** @deprecated SSR prepass has been removed */\nexport function stopCollection(): ResourcePlan {\n throw new Error(`${PREPASS_REMOVED_MSG}; do not call stopCollection()`);\n}\n\n/** @deprecated SSR prepass has been removed */\nexport function registerResourceIntent(\n _fn: ResourceDescriptor['fn'],\n _deps: unknown[]\n): string {\n throw new Error(\n `${PREPASS_REMOVED_MSG}; resource() no longer registers intents for prepass`\n );\n}\n\n/** @deprecated SSR prepass has been removed */\nexport async function resolvePlan(\n _plan: ResourcePlan\n): Promise<Record<string, unknown>> {\n throw new Error(\n `${PREPASS_REMOVED_MSG}; async resource plans are not supported`\n );\n}\n\n/** @deprecated SSR prepass has been removed */\nexport function collectResources(_opts: {\n url: string;\n routes: SSRRoute[];\n}): ResourcePlan {\n throw new Error(`${PREPASS_REMOVED_MSG}; collectResources is disabled`);\n}\n\n/** @deprecated Alias for resolvePlan */\nexport const resolveResources = resolvePlan;\n"],"mappings":";;AAqBA,SAAgB,uBAAuD;CAErE,OADY,kBACL,EAAK,cAAc;;AAQ5B,SAAgB,aAAqB;CACnC,MAAM,MAAM,kBAAkB;CAC9B,IAAI,CAAC,KAAK,OAAO;CACjB,OAAO,KAAK,IAAI;;AAGlB,SAAgB,iBAAiB,MAAsC;CACrE,MAAM,MAAM,kBAAkB;CAC9B,IAAI,KAAK;EACP,IAAI,aAAa,QAAQ;EACzB,IAAI,aAAa;;;AAIrB,SAAgB,kBAAkB;CAChC,MAAM,MAAM,kBAAkB;CAC9B,IAAI,KAAK;EACP,IAAI,aAAa;EACjB,IAAI,aAAa;;;AAMrB,MAAM,sBACJ;;AAuBF,eAAsB,YACpB,OACkC;CAClC,MAAM,IAAI,MACR,GAAG,oBAAoB,0CACxB;;;AAIH,SAAgB,iBAAiB,OAGhB;CACf,MAAM,IAAI,MAAM,GAAG,oBAAoB,gCAAgC;;;AAIzE,MAAa,mBAAmB"}
|
package/dist/ssr/sink.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sink.js","names":[],"sources":["../../src/ssr/sink.ts"],"sourcesContent":["export interface RenderSink {\n write(html: string): void;\n end(): void;\n}\n\nexport class StringSink implements RenderSink {\n private chunks: string[] = [];\n private bufferChunks: string[] = [];\n private bufferLen = 0;\n\n // Reduce array churn by batching many small writes into a larger buffer.\n // This is especially important for large SSR trees where we may write\n // hundreds of thousands of small fragments.\n private static readonly FLUSH_THRESHOLD = 32 * 1024;\n\n write(html: string) {\n if (!html) return;\n this.bufferChunks.push(html);\n this.bufferLen += html.length;\n if (this.bufferLen >= StringSink.FLUSH_THRESHOLD) {\n this.chunks.push(this.bufferChunks.join(''));\n this.bufferChunks.length = 0;\n this.bufferLen = 0;\n }\n }\n\n // Batch write for hot paths (avoids multiple push calls)\n write2(a: string, b: string) {\n if (a) {\n this.bufferChunks.push(a);\n this.bufferLen += a.length;\n }\n if (b) {\n this.bufferChunks.push(b);\n this.bufferLen += b.length;\n }\n if (this.bufferLen >= StringSink.FLUSH_THRESHOLD) {\n this.chunks.push(this.bufferChunks.join(''));\n this.bufferChunks.length = 0;\n this.bufferLen = 0;\n }\n }\n\n write3(a: string, b: string, c: string) {\n if (a) {\n this.bufferChunks.push(a);\n this.bufferLen += a.length;\n }\n if (b) {\n this.bufferChunks.push(b);\n this.bufferLen += b.length;\n }\n if (c) {\n this.bufferChunks.push(c);\n this.bufferLen += c.length;\n }\n if (this.bufferLen >= StringSink.FLUSH_THRESHOLD) {\n this.chunks.push(this.bufferChunks.join(''));\n this.bufferChunks.length = 0;\n this.bufferLen = 0;\n }\n }\n\n end() {\n if (this.bufferLen) {\n this.chunks.push(this.bufferChunks.join(''));\n this.bufferChunks.length = 0;\n this.bufferLen = 0;\n }\n }\n\n toString() {\n // Ensure any buffered content is included even if end() wasn't called.\n if (this.bufferLen) {\n this.chunks.push(this.bufferChunks.join(''));\n this.bufferChunks.length = 0;\n this.bufferLen = 0;\n }\n return this.chunks.join('');\n }\n}\n\nexport class StreamSink implements RenderSink {\n constructor(\n private readonly onChunk: (html: string) => void,\n private readonly onComplete: () => void\n ) {}\n\n write(html: string) {\n if (html) this.onChunk(html);\n }\n\n end() {\n this.onComplete();\n }\n}\n"],"mappings":";AAKA,IAAa,aAAb,MAAa,WAAiC;;gBACjB,EAAE;sBACI,EAAE;mBACf;;;yBAKsB,KAAK;;CAE/C,MAAM,MAAc;
|
|
1
|
+
{"version":3,"file":"sink.js","names":[],"sources":["../../src/ssr/sink.ts"],"sourcesContent":["export interface RenderSink {\n write(html: string): void;\n end(): void;\n}\n\nexport class StringSink implements RenderSink {\n private chunks: string[] = [];\n private bufferChunks: string[] = [];\n private bufferLen = 0;\n\n // Reduce array churn by batching many small writes into a larger buffer.\n // This is especially important for large SSR trees where we may write\n // hundreds of thousands of small fragments.\n private static readonly FLUSH_THRESHOLD = 32 * 1024;\n\n write(html: string) {\n if (!html) return;\n this.bufferChunks.push(html);\n this.bufferLen += html.length;\n if (this.bufferLen >= StringSink.FLUSH_THRESHOLD) {\n this.chunks.push(this.bufferChunks.join(''));\n this.bufferChunks.length = 0;\n this.bufferLen = 0;\n }\n }\n\n // Batch write for hot paths (avoids multiple push calls)\n write2(a: string, b: string) {\n if (a) {\n this.bufferChunks.push(a);\n this.bufferLen += a.length;\n }\n if (b) {\n this.bufferChunks.push(b);\n this.bufferLen += b.length;\n }\n if (this.bufferLen >= StringSink.FLUSH_THRESHOLD) {\n this.chunks.push(this.bufferChunks.join(''));\n this.bufferChunks.length = 0;\n this.bufferLen = 0;\n }\n }\n\n write3(a: string, b: string, c: string) {\n if (a) {\n this.bufferChunks.push(a);\n this.bufferLen += a.length;\n }\n if (b) {\n this.bufferChunks.push(b);\n this.bufferLen += b.length;\n }\n if (c) {\n this.bufferChunks.push(c);\n this.bufferLen += c.length;\n }\n if (this.bufferLen >= StringSink.FLUSH_THRESHOLD) {\n this.chunks.push(this.bufferChunks.join(''));\n this.bufferChunks.length = 0;\n this.bufferLen = 0;\n }\n }\n\n end() {\n if (this.bufferLen) {\n this.chunks.push(this.bufferChunks.join(''));\n this.bufferChunks.length = 0;\n this.bufferLen = 0;\n }\n }\n\n toString() {\n // Ensure any buffered content is included even if end() wasn't called.\n if (this.bufferLen) {\n this.chunks.push(this.bufferChunks.join(''));\n this.bufferChunks.length = 0;\n this.bufferLen = 0;\n }\n return this.chunks.join('');\n }\n}\n\nexport class StreamSink implements RenderSink {\n constructor(\n private readonly onChunk: (html: string) => void,\n private readonly onComplete: () => void\n ) {}\n\n write(html: string) {\n if (html) this.onChunk(html);\n }\n\n end() {\n this.onComplete();\n }\n}\n"],"mappings":";AAKA,IAAa,aAAb,MAAa,WAAiC;;gBACjB,EAAE;sBACI,EAAE;mBACf;;;yBAKsB,KAAK;;CAE/C,MAAM,MAAc;EAClB,IAAI,CAAC,MAAM;EACX,KAAK,aAAa,KAAK,KAAK;EAC5B,KAAK,aAAa,KAAK;EACvB,IAAI,KAAK,aAAa,WAAW,iBAAiB;GAChD,KAAK,OAAO,KAAK,KAAK,aAAa,KAAK,GAAG,CAAC;GAC5C,KAAK,aAAa,SAAS;GAC3B,KAAK,YAAY;;;CAKrB,OAAO,GAAW,GAAW;EAC3B,IAAI,GAAG;GACL,KAAK,aAAa,KAAK,EAAE;GACzB,KAAK,aAAa,EAAE;;EAEtB,IAAI,GAAG;GACL,KAAK,aAAa,KAAK,EAAE;GACzB,KAAK,aAAa,EAAE;;EAEtB,IAAI,KAAK,aAAa,WAAW,iBAAiB;GAChD,KAAK,OAAO,KAAK,KAAK,aAAa,KAAK,GAAG,CAAC;GAC5C,KAAK,aAAa,SAAS;GAC3B,KAAK,YAAY;;;CAIrB,OAAO,GAAW,GAAW,GAAW;EACtC,IAAI,GAAG;GACL,KAAK,aAAa,KAAK,EAAE;GACzB,KAAK,aAAa,EAAE;;EAEtB,IAAI,GAAG;GACL,KAAK,aAAa,KAAK,EAAE;GACzB,KAAK,aAAa,EAAE;;EAEtB,IAAI,GAAG;GACL,KAAK,aAAa,KAAK,EAAE;GACzB,KAAK,aAAa,EAAE;;EAEtB,IAAI,KAAK,aAAa,WAAW,iBAAiB;GAChD,KAAK,OAAO,KAAK,KAAK,aAAa,KAAK,GAAG,CAAC;GAC5C,KAAK,aAAa,SAAS;GAC3B,KAAK,YAAY;;;CAIrB,MAAM;EACJ,IAAI,KAAK,WAAW;GAClB,KAAK,OAAO,KAAK,KAAK,aAAa,KAAK,GAAG,CAAC;GAC5C,KAAK,aAAa,SAAS;GAC3B,KAAK,YAAY;;;CAIrB,WAAW;EAET,IAAI,KAAK,WAAW;GAClB,KAAK,OAAO,KAAK,KAAK,aAAa,KAAK,GAAG,CAAC;GAC5C,KAAK,aAAa,SAAS;GAC3B,KAAK,YAAY;;EAEnB,OAAO,KAAK,OAAO,KAAK,GAAG;;;AAI/B,IAAa,aAAb,MAA8C;CAC5C,YACE,SACA,YACA;EAFiB,KAAA,UAAA;EACA,KAAA,aAAA;;CAGnB,MAAM,MAAc;EAClB,IAAI,MAAM,KAAK,QAAQ,KAAK;;CAG9B,MAAM;EACJ,KAAK,YAAY"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Fragment } from "../common/jsx.js";
|
|
2
|
+
import { VOID_ELEMENTS, escapeText } from "./escape.js";
|
|
2
3
|
import { throwSSRDataMissing } from "./context.js";
|
|
3
4
|
import "../jsx/index.js";
|
|
4
|
-
import { VOID_ELEMENTS, escapeText } from "./escape.js";
|
|
5
5
|
import { renderAttrsDirect } from "./attrs.js";
|
|
6
6
|
//#region src/ssr/stream-render.ts
|
|
7
7
|
function isPromiseLike(x) {
|
|
@@ -13,6 +13,18 @@ function executeComponent(type, props, ctx) {
|
|
|
13
13
|
if (isPromiseLike(res)) throwSSRDataMissing();
|
|
14
14
|
return res;
|
|
15
15
|
}
|
|
16
|
+
function inheritRenderableKey(source, result) {
|
|
17
|
+
const inheritedKey = source.key;
|
|
18
|
+
if (inheritedKey === void 0 || inheritedKey === null) return result;
|
|
19
|
+
if (!result || typeof result !== "object" || !("type" in result)) return result;
|
|
20
|
+
const resultVNode = result;
|
|
21
|
+
if (resultVNode.key === void 0 || resultVNode.key === null) resultVNode.key = inheritedKey;
|
|
22
|
+
if (typeof resultVNode.type === "string") {
|
|
23
|
+
if (!resultVNode.props) resultVNode.props = {};
|
|
24
|
+
if (resultVNode.props["data-key"] === void 0) resultVNode.props["data-key"] = String(inheritedKey);
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
16
28
|
function renderChildrenDirect(node, sink, ctx) {
|
|
17
29
|
let raw = node.children;
|
|
18
30
|
if (raw === void 0) raw = node.props?.children;
|
|
@@ -46,7 +58,7 @@ function renderNodeToSink(node, sink, ctx) {
|
|
|
46
58
|
return;
|
|
47
59
|
}
|
|
48
60
|
if (typeof type === "function") {
|
|
49
|
-
renderNodeToSink(executeComponent(type, vnode.props, ctx), sink, ctx);
|
|
61
|
+
renderNodeToSink(inheritRenderableKey(vnode, executeComponent(type, vnode.props, ctx)), sink, ctx);
|
|
50
62
|
return;
|
|
51
63
|
}
|
|
52
64
|
const tag = type;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-render.js","names":[],"sources":["../../src/ssr/stream-render.ts"],"sourcesContent":["import type { Props } from '../common/props';\nimport type { RenderSink } from './sink';\nimport type { VNode, SSRComponent } from './types';\nimport { Fragment } from '../jsx';\nimport { type RenderContext, throwSSRDataMissing } from './context';\nimport { VOID_ELEMENTS, escapeText } from './escape';\nimport { renderAttrsDirect } from './attrs';\n\n// Re-export for backwards compatibility\nexport type Component = SSRComponent;\n\n// Legacy alias for context type\nexport type SSRContext = RenderContext;\n\nfunction isPromiseLike(x: unknown): x is PromiseLike<unknown> {\n if (!x || typeof x !== 'object') return false;\n return typeof (x as { then?: unknown }).then === 'function';\n}\n\nfunction executeComponent(\n type: Component,\n props: Props | undefined,\n ctx: RenderContext\n): unknown {\n const res = type(props ?? {}, { signal: ctx.signal });\n if (isPromiseLike(res)) {\n throwSSRDataMissing();\n }\n return res;\n}\n\n// Render children directly without allocating wrapper array when possible\nfunction renderChildrenDirect(\n node: Record<string, unknown>,\n sink: RenderSink,\n ctx: RenderContext\n): void {\n // Prefer explicit children; fallback to props.children\n let raw: unknown = node.children;\n if (raw === undefined) {\n raw = (node.props as Record<string, unknown> | undefined)?.children;\n }\n\n if (raw === null || raw === undefined || raw === false) return;\n\n if (Array.isArray(raw)) {\n for (let i = 0; i < raw.length; i++) {\n renderNodeToSink(raw[i], sink, ctx);\n }\n return;\n }\n\n // Single child - no array allocation\n renderNodeToSink(raw, sink, ctx);\n}\n\nexport function renderNodeToSink(\n node: unknown,\n sink: RenderSink,\n ctx: RenderContext\n): void {\n if (node === null || node === undefined) return;\n\n // Fast path: primitive strings\n if (typeof node === 'string') {\n sink.write(escapeText(node));\n return;\n }\n\n // Fast path: numbers\n if (typeof node === 'number') {\n sink.write(String(node));\n return;\n }\n\n // Skip booleans (false is common from conditional rendering)\n if (typeof node === 'boolean') return;\n\n // Must be object at this point\n if (typeof node !== 'object') return;\n\n const vnode = node as VNode;\n const type = vnode.type;\n\n // Fragment: render children directly (canonical check via === is fastest)\n if (type === Fragment) {\n renderChildrenDirect(\n vnode as unknown as Record<string, unknown>,\n sink,\n ctx\n );\n return;\n }\n\n // Symbol type that isn't our Fragment\n if (typeof type === 'symbol') {\n // Unknown symbol - render children as fragment fallback\n renderChildrenDirect(\n vnode as unknown as Record<string, unknown>,\n sink,\n ctx\n );\n return;\n }\n\n // Function component\n if (typeof type === 'function') {\n const out = executeComponent(type as Component, vnode.props, ctx);\n renderNodeToSink(out, sink, ctx);\n return;\n }\n\n // Element node (type is string)\n const tag = type as string;\n const props = vnode.props;\n\n // Check for dangerouslySetInnerHTML\n const dangerous = props?.dangerouslySetInnerHTML as\n | { __html: unknown }\n | undefined;\n const dangerousHtml =\n dangerous && typeof dangerous === 'object' && '__html' in dangerous\n ? String(dangerous.__html)\n : undefined;\n\n // Void element - self-closing\n if (VOID_ELEMENTS.has(tag)) {\n sink.write('<');\n sink.write(tag);\n renderAttrsDirect(props, sink);\n sink.write(' />');\n return;\n }\n\n // Regular element\n sink.write('<');\n sink.write(tag);\n renderAttrsDirect(props, sink);\n sink.write('>');\n\n if (dangerousHtml !== undefined) {\n sink.write(dangerousHtml);\n } else {\n renderChildrenDirect(\n vnode as unknown as Record<string, unknown>,\n sink,\n ctx\n );\n }\n\n sink.write('</');\n sink.write(tag);\n sink.write('>');\n}\n"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"stream-render.js","names":[],"sources":["../../src/ssr/stream-render.ts"],"sourcesContent":["import type { Props } from '../common/props';\nimport type { RenderSink } from './sink';\nimport type { VNode, SSRComponent } from './types';\nimport type { DOMElement } from '../common/vnode';\nimport { Fragment } from '../jsx';\nimport { type RenderContext, throwSSRDataMissing } from './context';\nimport { VOID_ELEMENTS, escapeText } from './escape';\nimport { renderAttrsDirect } from './attrs';\n\n// Re-export for backwards compatibility\nexport type Component = SSRComponent;\n\n// Legacy alias for context type\nexport type SSRContext = RenderContext;\n\nfunction isPromiseLike(x: unknown): x is PromiseLike<unknown> {\n if (!x || typeof x !== 'object') return false;\n return typeof (x as { then?: unknown }).then === 'function';\n}\n\nfunction executeComponent(\n type: Component,\n props: Props | undefined,\n ctx: RenderContext\n): unknown {\n const res = type(props ?? {}, { signal: ctx.signal });\n if (isPromiseLike(res)) {\n throwSSRDataMissing();\n }\n return res;\n}\n\nfunction inheritRenderableKey(source: VNode, result: unknown): unknown {\n const inheritedKey = source.key;\n if (inheritedKey === undefined || inheritedKey === null) {\n return result;\n }\n\n if (!result || typeof result !== 'object' || !('type' in result)) {\n return result;\n }\n\n const resultVNode = result as DOMElement;\n if (resultVNode.key === undefined || resultVNode.key === null) {\n resultVNode.key = inheritedKey;\n }\n\n if (typeof resultVNode.type === 'string') {\n if (!resultVNode.props) {\n resultVNode.props = {};\n }\n\n if (resultVNode.props['data-key'] === undefined) {\n resultVNode.props['data-key'] = String(inheritedKey);\n }\n }\n\n return result;\n}\n\n// Render children directly without allocating wrapper array when possible\nfunction renderChildrenDirect(\n node: Record<string, unknown>,\n sink: RenderSink,\n ctx: RenderContext\n): void {\n // Prefer explicit children; fallback to props.children\n let raw: unknown = node.children;\n if (raw === undefined) {\n raw = (node.props as Record<string, unknown> | undefined)?.children;\n }\n\n if (raw === null || raw === undefined || raw === false) return;\n\n if (Array.isArray(raw)) {\n for (let i = 0; i < raw.length; i++) {\n renderNodeToSink(raw[i], sink, ctx);\n }\n return;\n }\n\n // Single child - no array allocation\n renderNodeToSink(raw, sink, ctx);\n}\n\nexport function renderNodeToSink(\n node: unknown,\n sink: RenderSink,\n ctx: RenderContext\n): void {\n if (node === null || node === undefined) return;\n\n // Fast path: primitive strings\n if (typeof node === 'string') {\n sink.write(escapeText(node));\n return;\n }\n\n // Fast path: numbers\n if (typeof node === 'number') {\n sink.write(String(node));\n return;\n }\n\n // Skip booleans (false is common from conditional rendering)\n if (typeof node === 'boolean') return;\n\n // Must be object at this point\n if (typeof node !== 'object') return;\n\n const vnode = node as VNode;\n const type = vnode.type;\n\n // Fragment: render children directly (canonical check via === is fastest)\n if (type === Fragment) {\n renderChildrenDirect(\n vnode as unknown as Record<string, unknown>,\n sink,\n ctx\n );\n return;\n }\n\n // Symbol type that isn't our Fragment\n if (typeof type === 'symbol') {\n // Unknown symbol - render children as fragment fallback\n renderChildrenDirect(\n vnode as unknown as Record<string, unknown>,\n sink,\n ctx\n );\n return;\n }\n\n // Function component\n if (typeof type === 'function') {\n const out = executeComponent(type as Component, vnode.props, ctx);\n renderNodeToSink(inheritRenderableKey(vnode, out), sink, ctx);\n return;\n }\n\n // Element node (type is string)\n const tag = type as string;\n const props = vnode.props;\n\n // Check for dangerouslySetInnerHTML\n const dangerous = props?.dangerouslySetInnerHTML as\n | { __html: unknown }\n | undefined;\n const dangerousHtml =\n dangerous && typeof dangerous === 'object' && '__html' in dangerous\n ? String(dangerous.__html)\n : undefined;\n\n // Void element - self-closing\n if (VOID_ELEMENTS.has(tag)) {\n sink.write('<');\n sink.write(tag);\n renderAttrsDirect(props, sink);\n sink.write(' />');\n return;\n }\n\n // Regular element\n sink.write('<');\n sink.write(tag);\n renderAttrsDirect(props, sink);\n sink.write('>');\n\n if (dangerousHtml !== undefined) {\n sink.write(dangerousHtml);\n } else {\n renderChildrenDirect(\n vnode as unknown as Record<string, unknown>,\n sink,\n ctx\n );\n }\n\n sink.write('</');\n sink.write(tag);\n sink.write('>');\n}\n"],"mappings":";;;;;;AAeA,SAAS,cAAc,GAAuC;CAC5D,IAAI,CAAC,KAAK,OAAO,MAAM,UAAU,OAAO;CACxC,OAAO,OAAQ,EAAyB,SAAS;;AAGnD,SAAS,iBACP,MACA,OACA,KACS;CACT,MAAM,MAAM,KAAK,SAAS,EAAE,EAAE,EAAE,QAAQ,IAAI,QAAQ,CAAC;CACrD,IAAI,cAAc,IAAI,EACpB,qBAAqB;CAEvB,OAAO;;AAGT,SAAS,qBAAqB,QAAe,QAA0B;CACrE,MAAM,eAAe,OAAO;CAC5B,IAAI,iBAAiB,UAAa,iBAAiB,MACjD,OAAO;CAGT,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,EAAE,UAAU,SACvD,OAAO;CAGT,MAAM,cAAc;CACpB,IAAI,YAAY,QAAQ,UAAa,YAAY,QAAQ,MACvD,YAAY,MAAM;CAGpB,IAAI,OAAO,YAAY,SAAS,UAAU;EACxC,IAAI,CAAC,YAAY,OACf,YAAY,QAAQ,EAAE;EAGxB,IAAI,YAAY,MAAM,gBAAgB,QACpC,YAAY,MAAM,cAAc,OAAO,aAAa;;CAIxD,OAAO;;AAIT,SAAS,qBACP,MACA,MACA,KACM;CAEN,IAAI,MAAe,KAAK;CACxB,IAAI,QAAQ,QACV,MAAO,KAAK,OAA+C;CAG7D,IAAI,QAAQ,QAAQ,QAAQ,UAAa,QAAQ,OAAO;CAExD,IAAI,MAAM,QAAQ,IAAI,EAAE;EACtB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAC9B,iBAAiB,IAAI,IAAI,MAAM,IAAI;EAErC;;CAIF,iBAAiB,KAAK,MAAM,IAAI;;AAGlC,SAAgB,iBACd,MACA,MACA,KACM;CACN,IAAI,SAAS,QAAQ,SAAS,QAAW;CAGzC,IAAI,OAAO,SAAS,UAAU;EAC5B,KAAK,MAAM,WAAW,KAAK,CAAC;EAC5B;;CAIF,IAAI,OAAO,SAAS,UAAU;EAC5B,KAAK,MAAM,OAAO,KAAK,CAAC;EACxB;;CAIF,IAAI,OAAO,SAAS,WAAW;CAG/B,IAAI,OAAO,SAAS,UAAU;CAE9B,MAAM,QAAQ;CACd,MAAM,OAAO,MAAM;CAGnB,IAAI,SAAS,UAAU;EACrB,qBACE,OACA,MACA,IACD;EACD;;CAIF,IAAI,OAAO,SAAS,UAAU;EAE5B,qBACE,OACA,MACA,IACD;EACD;;CAIF,IAAI,OAAO,SAAS,YAAY;EAE9B,iBAAiB,qBAAqB,OAD1B,iBAAiB,MAAmB,MAAM,OAAO,IAChB,CAAI,EAAE,MAAM,IAAI;EAC7D;;CAIF,MAAM,MAAM;CACZ,MAAM,QAAQ,MAAM;CAGpB,MAAM,YAAY,OAAO;CAGzB,MAAM,gBACJ,aAAa,OAAO,cAAc,YAAY,YAAY,YACtD,OAAO,UAAU,OAAO,GACxB;CAGN,IAAI,cAAc,IAAI,IAAI,EAAE;EAC1B,KAAK,MAAM,IAAI;EACf,KAAK,MAAM,IAAI;EACf,kBAAkB,OAAO,KAAK;EAC9B,KAAK,MAAM,MAAM;EACjB;;CAIF,KAAK,MAAM,IAAI;CACf,KAAK,MAAM,IAAI;CACf,kBAAkB,OAAO,KAAK;CAC9B,KAAK,MAAM,IAAI;CAEf,IAAI,kBAAkB,QACpB,KAAK,MAAM,cAAc;MAEzB,qBACE,OACA,MACA,IACD;CAGH,KAAK,MAAM,KAAK;CAChB,KAAK,MAAM,IAAI;CACf,KAAK,MAAM,IAAI"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askrjs/askr",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.36",
|
|
4
4
|
"description": "Actor-backed deterministic UI framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"askr",
|
|
@@ -26,7 +26,9 @@
|
|
|
26
26
|
"dist"
|
|
27
27
|
],
|
|
28
28
|
"type": "module",
|
|
29
|
-
"sideEffects": [
|
|
29
|
+
"sideEffects": [
|
|
30
|
+
"./dist/index.js"
|
|
31
|
+
],
|
|
30
32
|
"main": "./dist/index.js",
|
|
31
33
|
"types": "./dist/index.d.ts",
|
|
32
34
|
"exports": {
|
|
@@ -102,13 +104,13 @@
|
|
|
102
104
|
},
|
|
103
105
|
"devDependencies": {
|
|
104
106
|
"@axe-core/playwright": "^4.11.3",
|
|
105
|
-
"@playwright/test": "^1.
|
|
106
|
-
"@types/node": "^25.
|
|
107
|
+
"@playwright/test": "^1.60.0",
|
|
108
|
+
"@types/node": "^25.7.0",
|
|
107
109
|
"jsdom": "^29.1.1",
|
|
108
|
-
"playwright": "^1.
|
|
110
|
+
"playwright": "^1.60.0",
|
|
109
111
|
"tsd": "^0.33.0",
|
|
110
112
|
"typescript": "^6.0.3",
|
|
111
|
-
"vite-plus": "^0.1.
|
|
113
|
+
"vite-plus": "^0.1.21"
|
|
112
114
|
},
|
|
113
115
|
"engines": {
|
|
114
116
|
"node": ">=18"
|