@demiurgejs/core 0.2.0-beta.3 → 0.2.0-beta.4
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/README.md +13 -11
- package/bin/demiurge.mjs +30 -12
- package/dist/browser/file-router.d.ts +388 -5
- package/dist/browser/file-router.d.ts.map +1 -1
- package/dist/browser/focus.d.ts +20 -0
- package/dist/browser/focus.d.ts.map +1 -0
- package/dist/browser/index.d.ts +7 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/mutation-action.d.ts +81 -0
- package/dist/browser/mutation-action.d.ts.map +1 -0
- package/dist/chunks/document-shell-CpJnFtSC.js +36 -0
- package/dist/chunks/document-shell-CpJnFtSC.js.map +1 -0
- package/dist/chunks/env-startup-DOBYWlZD.js +257 -0
- package/dist/chunks/env-startup-DOBYWlZD.js.map +1 -0
- package/dist/chunks/{image-codec-Di53WpcH.js → image-codec-BmzWnH6W.js} +2 -2
- package/dist/chunks/{image-codec-Di53WpcH.js.map → image-codec-BmzWnH6W.js.map} +1 -1
- package/dist/chunks/{images-Edar3eU1.js → images-BQ80950B.js} +99 -91
- package/dist/chunks/images-BQ80950B.js.map +1 -0
- package/dist/chunks/index-BVk9zWbe.js +832 -0
- package/dist/chunks/index-BVk9zWbe.js.map +1 -0
- package/dist/chunks/manifest-vO6c0G0W.js +19 -0
- package/dist/chunks/manifest-vO6c0G0W.js.map +1 -0
- package/dist/chunks/plugin-BQgMiHxa.js +1827 -0
- package/dist/chunks/plugin-BQgMiHxa.js.map +1 -0
- package/dist/chunks/session-store-ChModVcq.js +92 -0
- package/dist/chunks/session-store-ChModVcq.js.map +1 -0
- package/dist/chunks/static-files-ehaD1kE7.js +51 -0
- package/dist/chunks/static-files-ehaD1kE7.js.map +1 -0
- package/dist/chunks/{streaming-D0fGAuiO.js → streaming-BEbPN7Uk.js} +163 -163
- package/dist/chunks/streaming-BEbPN7Uk.js.map +1 -0
- package/dist/chunks/testing-DueXbMo4.js +4167 -0
- package/dist/chunks/testing-DueXbMo4.js.map +1 -0
- package/dist/chunks/vite-DO70kZA6.js +259 -0
- package/dist/chunks/vite-DO70kZA6.js.map +1 -0
- package/dist/cli.d.ts +17 -25
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +159 -124
- package/dist/cli.js.map +1 -1
- package/dist/config/define.d.ts +3 -0
- package/dist/config/define.d.ts.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +78 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/load.d.ts +12 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/types.d.ts +64 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/validate.d.ts +9 -0
- package/dist/config/validate.d.ts.map +1 -0
- package/dist/config/vite.d.ts +12 -0
- package/dist/config/vite.d.ts.map +1 -0
- package/dist/data/cache.d.ts +2 -0
- package/dist/data/cache.d.ts.map +1 -1
- package/dist/data/idempotency.d.ts.map +1 -1
- package/dist/deployment/testing.d.ts +25 -0
- package/dist/deployment/testing.d.ts.map +1 -0
- package/dist/deployment/testing.js +171 -0
- package/dist/deployment/testing.js.map +1 -0
- package/dist/document/hydration.d.ts +9 -0
- package/dist/document/hydration.d.ts.map +1 -1
- package/dist/document/index.d.ts +4 -2
- package/dist/document/index.d.ts.map +1 -1
- package/dist/document/metadata.d.ts +8 -0
- package/dist/document/metadata.d.ts.map +1 -1
- package/dist/document/navigation.d.ts +28 -0
- package/dist/document/navigation.d.ts.map +1 -0
- package/dist/document/render.d.ts +3 -1
- package/dist/document/render.d.ts.map +1 -1
- package/dist/document/seo.d.ts.map +1 -1
- package/dist/edge/assets.d.ts.map +1 -1
- package/dist/edge/index.js +55 -73
- package/dist/edge/index.js.map +1 -1
- package/dist/index.d.ts +12 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1860 -691
- package/dist/index.js.map +1 -1
- package/dist/internal/testing.js +12 -12
- package/dist/kv/index.d.ts +2 -0
- package/dist/kv/index.d.ts.map +1 -1
- package/dist/kv/index.js +170 -73
- package/dist/kv/index.js.map +1 -1
- package/dist/kv/session-store.d.ts +20 -0
- package/dist/kv/session-store.d.ts.map +1 -0
- package/dist/manifest.d.ts +10 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/node/image.d.ts.map +1 -1
- package/dist/node/index.d.ts +3 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +251 -178
- package/dist/node/index.js.map +1 -1
- package/dist/node/serve.d.ts +47 -0
- package/dist/node/serve.d.ts.map +1 -0
- package/dist/node/static.d.ts.map +1 -1
- package/dist/platform/fonts.d.ts.map +1 -1
- package/dist/platform/image-url.d.ts.map +1 -1
- package/dist/platform/url.d.ts +19 -0
- package/dist/platform/url.d.ts.map +1 -0
- package/dist/platform/web-vitals.d.ts.map +1 -1
- package/dist/redis/index.d.ts +2 -0
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js +186 -69
- package/dist/redis/index.js.map +1 -1
- package/dist/redis/session-store.d.ts +9 -0
- package/dist/redis/session-store.d.ts.map +1 -0
- package/dist/route/index.d.ts +2 -2
- package/dist/route/index.d.ts.map +1 -1
- package/dist/route/mutation.d.ts +97 -0
- package/dist/route/mutation.d.ts.map +1 -0
- package/dist/route/types.d.ts +6 -1
- package/dist/route/types.d.ts.map +1 -1
- package/dist/router/manifest.d.ts +8 -0
- package/dist/router/manifest.d.ts.map +1 -1
- package/dist/router/navigation-data.d.ts +9 -1
- package/dist/router/navigation-data.d.ts.map +1 -1
- package/dist/routing/generate.d.ts +3 -0
- package/dist/routing/generate.d.ts.map +1 -1
- package/dist/routing/index.d.ts +3 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/locale.d.ts +43 -0
- package/dist/routing/locale.d.ts.map +1 -0
- package/dist/routing/types.d.ts +12 -0
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/security/cookie-session.d.ts +43 -0
- package/dist/security/cookie-session.d.ts.map +1 -0
- package/dist/security/csrf.d.ts +1 -1
- package/dist/security/csrf.d.ts.map +1 -1
- package/dist/security/env-startup.d.ts +15 -0
- package/dist/security/env-startup.d.ts.map +1 -0
- package/dist/security/env.d.ts +25 -6
- package/dist/security/env.d.ts.map +1 -1
- package/dist/security/index.d.ts +9 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/report.d.ts.map +1 -1
- package/dist/security/session-manager.d.ts +32 -0
- package/dist/security/session-manager.d.ts.map +1 -0
- package/dist/security/session-store.d.ts +51 -0
- package/dist/security/session-store.d.ts.map +1 -0
- package/dist/security/testing.d.ts +10 -0
- package/dist/security/testing.d.ts.map +1 -0
- package/dist/security/testing.js +145 -0
- package/dist/security/testing.js.map +1 -0
- package/dist/security/types.d.ts +1 -0
- package/dist/security/types.d.ts.map +1 -1
- package/dist/server/document-shell.d.ts.map +1 -1
- package/dist/server/errors.d.ts +1 -0
- package/dist/server/errors.d.ts.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/not-found.d.ts +1 -0
- package/dist/server/not-found.d.ts.map +1 -1
- package/dist/server/render-tree.d.ts.map +1 -1
- package/dist/server/request-handler.d.ts +4 -0
- package/dist/server/request-handler.d.ts.map +1 -1
- package/dist/server/request-metadata.d.ts +1 -0
- package/dist/server/request-metadata.d.ts.map +1 -1
- package/dist/server/ssr.d.ts +2 -0
- package/dist/server/ssr.d.ts.map +1 -1
- package/dist/static/index.d.ts +2 -0
- package/dist/static/index.d.ts.map +1 -1
- package/dist/static/index.js +380 -363
- package/dist/static/index.js.map +1 -1
- package/dist/static/preview.d.ts.map +1 -1
- package/dist/static/vercel.d.ts +11 -2
- package/dist/static/vercel.d.ts.map +1 -1
- package/dist/static-files.d.ts +12 -0
- package/dist/static-files.d.ts.map +1 -1
- package/dist/type-guards.d.ts +19 -0
- package/dist/type-guards.d.ts.map +1 -0
- package/dist/vite/env-boundary.d.ts +14 -0
- package/dist/vite/env-boundary.d.ts.map +1 -0
- package/dist/vite/index.d.ts +5 -3
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +22 -1560
- package/dist/vite/index.js.map +1 -1
- package/dist/vite/plugin.d.ts +6 -1
- package/dist/vite/plugin.d.ts.map +1 -1
- package/dist/vite/policy-verification.d.ts.map +1 -1
- package/package.json +19 -6
- package/dist/chunks/document-shell-WoM8yZlR.js +0 -35
- package/dist/chunks/document-shell-WoM8yZlR.js.map +0 -1
- package/dist/chunks/images-Edar3eU1.js.map +0 -1
- package/dist/chunks/request-metadata-DaIYq4Ea.js +0 -677
- package/dist/chunks/request-metadata-DaIYq4Ea.js.map +0 -1
- package/dist/chunks/static-files-DUjHw-4H.js +0 -11
- package/dist/chunks/static-files-DUjHw-4H.js.map +0 -1
- package/dist/chunks/streaming-D0fGAuiO.js.map +0 -1
- package/dist/chunks/testing-CRflAw4X.js +0 -3475
- package/dist/chunks/testing-CRflAw4X.js.map +0 -1
- package/dist/route/action.d.ts +0 -33
- package/dist/route/action.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-metadata-DaIYq4Ea.js","sources":["../../src/adapter/index.ts","../../src/document/hydration.ts","../../src/document/trusted-types.ts","../../src/document/deferred-scripts.ts","../../src/document/scripts.ts","../../src/document/render.ts","../../src/document/links.ts","../../src/server/render-tree.ts","../../src/server/ssr.ts","../../src/server/request-metadata.ts"],"sourcesContent":["export type AdapterCapability =\n | \"backgroundLifetime\"\n | \"crossOriginIsolationHeaders\"\n | \"nonceInjection\"\n | \"sharedCache\"\n | \"staticOutput\"\n | \"streaming\"\n | \"webSocket\"\n | \"webTransport\";\n\nexport type AdapterCapabilityMap = Record<AdapterCapability, boolean>;\n\nexport type Adapter = {\n capabilities: AdapterCapabilityMap;\n name: string;\n};\n\nexport type AdapterDefinition = {\n capabilities?: Partial<AdapterCapabilityMap>;\n name: string;\n};\n\nexport type AdapterCapabilityCheck = {\n adapter: string;\n missing: AdapterCapability[];\n ok: boolean;\n required: AdapterCapability[];\n};\n\nconst defaultCapabilities = {\n backgroundLifetime: false,\n crossOriginIsolationHeaders: false,\n nonceInjection: false,\n sharedCache: false,\n staticOutput: false,\n streaming: false,\n webSocket: false,\n webTransport: false,\n} satisfies AdapterCapabilityMap;\n\nexport function defineAdapter(definition: AdapterDefinition): Adapter {\n return {\n capabilities: {\n ...defaultCapabilities,\n ...definition.capabilities,\n },\n name: definition.name,\n };\n}\n\nexport function checkAdapterCapabilities(\n adapter: Adapter,\n required: readonly AdapterCapability[],\n): AdapterCapabilityCheck {\n const uniqueRequired = [...new Set(required)];\n const missing = uniqueRequired.filter(\n (capability) => !adapter.capabilities[capability],\n );\n\n return {\n adapter: adapter.name,\n missing,\n ok: missing.length === 0,\n required: uniqueRequired,\n };\n}\n\nexport function assertAdapterCapabilities(\n adapter: Adapter,\n required: readonly AdapterCapability[],\n) {\n const check = checkAdapterCapabilities(adapter, required);\n\n if (!check.ok) {\n throw new Error(\n `Adapter \"${adapter.name}\" does not support required capabilities: ${check.missing.join(\", \")}.`,\n );\n }\n\n return check;\n}\n","export type InitialRouteData = {\n data?: unknown;\n hasData: boolean;\n navigation?: \"document\";\n};\n\nexport const HYDRATION_DATA_ELEMENT_ID = \"__demiurge_data\";\nexport const HYDRATION_ROOT_ATTRIBUTE = \"data-demiurge-hydrate\";\n// Marks a server document as a fallback, not a page. The client hydrates markup\n// that it can reproduce. It replaces other markup. This attribute distinguishes\n// a server 404 from a page that does not match the client manifest.\nexport const HYDRATION_FALLBACK_ATTRIBUTE = \"data-demiurge-fallback\";\n\nexport function serializeInitialRouteData(\n data: unknown,\n options: { navigation?: \"document\" } = {},\n) {\n return escapeJsonScript(\n JSON.stringify({ data, hasData: true, ...options }),\n );\n}\n\nexport function readInitialRouteData(source: Document) {\n const element = source.getElementById(HYDRATION_DATA_ELEMENT_ID);\n // TYPE-EVIDENCE: the tagName check confirms the element is a template element. The cast adds the template content property.\n const serialized = element?.tagName === \"TEMPLATE\"\n ? (element as HTMLTemplateElement).content.textContent\n : element?.textContent;\n\n if (!serialized) {\n return undefined;\n }\n\n try {\n // TYPE-EVIDENCE: the serialized value came from serializeInitialRouteData which emits an initial route data shape. The cast restores that shape after parsing.\n return JSON.parse(serialized) as InitialRouteData;\n } catch (error) {\n throw new Error(\n \"Demiurge could not parse the initial route data payload.\",\n { cause: error },\n );\n }\n}\n\nfunction escapeJsonScript(value: string) {\n return value\n .replace(/&/g, \"\\\\u0026\")\n .replace(/</g, \"\\\\u003c\")\n .replace(/>/g, \"\\\\u003e\")\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\");\n}\n","// The framework writes two script URLs of its own. The `idle` strategy sets\n// `src` on a script element, and the `worker` strategy calls the `Worker`\n// constructor. Trusted Types guards both. The framework owns a named\n// `demiurge` policy for them, so an application never has to name a framework\n// sink in its own policy list.\nexport const FRAMEWORK_TRUSTED_TYPES_POLICY = \"demiurge\";\n\n// A browser accepts a TrustedScriptURL where the DOM declaration says\n// `string`. The DOM library types do not describe Trusted Types, so this\n// module keeps the value typed as a string and documents the difference.\ntype FrameworkScriptUrlPolicy = {\n createScriptURL: (value: string) => string;\n};\n\ntype TrustedTypesApi = {\n createPolicy: (\n name: string,\n rules: { createScriptURL: (value: string) => string },\n ) => FrameworkScriptUrlPolicy;\n};\n\n// A window may create a policy name one time only, so the result is cached per\n// window. `null` records a window that cannot give the framework a policy.\nconst frameworkPolicies = new WeakMap<object, FrameworkScriptUrlPolicy | null>();\n\n/**\n * Returns a value the framework can assign to a Trusted Types script sink.\n *\n * If the browser supports Trusted Types, the value is a TrustedScriptURL from\n * the framework-owned `demiurge` policy. If the browser does not support\n * Trusted Types, the value is the original string.\n */\nexport function createFrameworkScriptUrl(\n view: (Window & typeof globalThis) | null | undefined,\n url: string,\n) {\n return resolveFrameworkPolicy(view)?.createScriptURL(url) ?? url;\n}\n\nfunction resolveFrameworkPolicy(\n view: (Window & typeof globalThis) | null | undefined,\n) {\n if (!view) {\n return null;\n }\n\n const cached = frameworkPolicies.get(view);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const policy = createFrameworkPolicy(view);\n frameworkPolicies.set(view, policy);\n\n return policy;\n}\n\nfunction createFrameworkPolicy(view: object) {\n // TYPE-EVIDENCE: the view is a browser global that may expose the Trusted Types API. The cast adds that optional property for a runtime check.\n const trustedTypes = (view as { trustedTypes?: TrustedTypesApi }).trustedTypes;\n\n if (!trustedTypes || typeof trustedTypes.createPolicy !== \"function\") {\n return null;\n }\n\n try {\n return trustedTypes.createPolicy(FRAMEWORK_TRUSTED_TYPES_POLICY, {\n // The framework passes only a URL that the server rendered into its own\n // placeholder attribute. `script-src` and `worker-src` still govern that\n // URL, so this policy adds a type without widening the source rules.\n createScriptURL: (value: string) => value,\n });\n } catch (error) {\n // The document policy refuses the name. Another caller may have created\n // it. Report the refusal. Fall back to the raw string. An enforcing\n // document then blocks that string. The developer can see the block.\n console.error(\n `Demiurge could not create the ${JSON.stringify(FRAMEWORK_TRUSTED_TYPES_POLICY)} Trusted Types policy. Add ${JSON.stringify(FRAMEWORK_TRUSTED_TYPES_POLICY)} to the document trusted-types directive.`,\n error,\n );\n\n return null;\n }\n}\n","import type { ScriptStrategy } from \"./scripts\";\nimport { createFrameworkScriptUrl } from \"./trusted-types\";\n\n// A deferred strategy cannot be a plain script tag, because the browser fetches\n// and runs a plain script tag as soon as it parses one. The document therefore\n// carries an inert placeholder element. The client runtime finds the\n// placeholder after hydration and starts the real work.\nexport const DEFERRED_SCRIPT_TYPE = \"text/demiurge-script\";\nexport const DEFERRED_SCRIPT_ATTRIBUTE = \"data-demiurge-script\";\nexport const DEFERRED_SCRIPT_SRC_ATTRIBUTE = \"data-demiurge-script-src\";\nexport const DEFERRED_SCRIPT_TYPE_ATTRIBUTE = \"data-demiurge-script-type\";\nexport const DEFERRED_SCRIPT_STARTED_ATTRIBUTE = \"data-demiurge-script-started\";\n\n// An idle callback that never gets an idle period would never run the script.\n// The timeout makes the browser run it anyway once the deadline passes.\nconst IDLE_TIMEOUT_MS = 2_000;\n\nconst COPIED_ATTRIBUTES = [\n \"data-api\",\n \"data-demiurge-script-placement\",\n \"data-domain\",\n \"id\",\n \"integrity\",\n \"referrerpolicy\",\n] as const;\n\nexport type DeferredScriptStrategy = \"idle\" | \"worker\";\n\nconst workers = new Map<string, Worker>();\n\nexport function isDeferredScriptStrategy(\n strategy: ScriptStrategy,\n): strategy is DeferredScriptStrategy {\n return strategy === \"idle\" || strategy === \"worker\";\n}\n\n// The client entry calls this after it hands the document to React. Repeated\n// calls are safe, because every placeholder is marked once it starts.\nexport function startDeferredScripts(target?: Document) {\n const owner = target ?? (typeof document === \"undefined\" ? undefined : document);\n\n if (!owner) {\n return;\n }\n\n const placeholders = owner.querySelectorAll<HTMLScriptElement>(\n `script[${DEFERRED_SCRIPT_ATTRIBUTE}]:not([${DEFERRED_SCRIPT_STARTED_ATTRIBUTE}])`,\n );\n\n for (const placeholder of [...placeholders]) {\n const strategy = placeholder.getAttribute(DEFERRED_SCRIPT_ATTRIBUTE);\n\n if (strategy !== \"idle\" && strategy !== \"worker\") {\n continue;\n }\n\n placeholder.setAttribute(DEFERRED_SCRIPT_STARTED_ATTRIBUTE, \"\");\n\n if (strategy === \"worker\") {\n startScriptWorker(placeholder);\n continue;\n }\n\n scheduleIdleCallback(placeholder, () => loadIdleScript(placeholder));\n }\n}\n\n// A worker strategy script runs off the main thread, so the application talks\n// to it through the worker handle. The client entry starts every worker before\n// React runs a route effect, so a route can read the handle on mount.\nexport function getScriptWorker(src: string) {\n return workers.get(src);\n}\n\nfunction scheduleIdleCallback(\n placeholder: HTMLScriptElement,\n callback: () => void,\n) {\n const view = placeholder.ownerDocument.defaultView;\n\n if (view && typeof view.requestIdleCallback === \"function\") {\n view.requestIdleCallback(() => callback(), { timeout: IDLE_TIMEOUT_MS });\n return;\n }\n\n // Browsers without requestIdleCallback fall back to a macrotask. The script\n // still runs after the current task, and it still never blocks hydration.\n const timers = view ?? globalThis;\n timers.setTimeout(callback, 1);\n}\n\n// The placeholder stays in the document, because a component render can own it\n// and React must keep the node it created. The loaded script goes to the head\n// instead, which is where a script added after parsing normally belongs.\nfunction loadIdleScript(placeholder: HTMLScriptElement) {\n const owner = placeholder.ownerDocument;\n const src = placeholder.getAttribute(DEFERRED_SCRIPT_SRC_ATTRIBUTE);\n\n if (!src) {\n return;\n }\n\n const element = owner.createElement(\"script\");\n const type = placeholder.getAttribute(DEFERRED_SCRIPT_TYPE_ATTRIBUTE);\n\n for (const name of COPIED_ATTRIBUTES) {\n const value = placeholder.getAttribute(name);\n\n if (value !== null) {\n element.setAttribute(name, value);\n }\n }\n\n // Only one element can own an identifier, so the loaded script takes it.\n placeholder.removeAttribute(\"id\");\n\n if (type) {\n element.type = type;\n }\n\n // A script element created after parsing is always async. The nonce carries\n // over for policies that list a nonce without strict-dynamic.\n element.async = true;\n element.nonce = placeholder.nonce;\n element.src = createFrameworkScriptUrl(owner.defaultView, src);\n owner.head.appendChild(element);\n}\n\nfunction startScriptWorker(placeholder: HTMLScriptElement) {\n const src = placeholder.getAttribute(DEFERRED_SCRIPT_SRC_ATTRIBUTE);\n const view = placeholder.ownerDocument.defaultView;\n\n if (!src) {\n return;\n }\n\n // The worker strategy is client-only by construction. A server render and a\n // static export have no Worker constructor. The strategy reports that gap\n // instead of falling back to the main thread.\n if (!view || typeof view.Worker !== \"function\") {\n console.error(\n `Demiurge could not start the worker script ${JSON.stringify(src)}. This runtime has no Worker constructor.`,\n );\n return;\n }\n\n const type = placeholder.getAttribute(DEFERRED_SCRIPT_TYPE_ATTRIBUTE);\n\n try {\n workers.set(\n src,\n new view.Worker(createFrameworkScriptUrl(view, src), {\n type: type === \"module\" ? \"module\" : \"classic\",\n }),\n );\n } catch (error) {\n // A worker URL has to be same-origin or a blob URL, and the document policy\n // has to allow it through worker-src. Report the refusal instead of\n // falling back to the main thread, which would defeat the strategy.\n console.error(\n `Demiurge could not start the worker script ${JSON.stringify(src)}.`,\n error,\n );\n }\n}\n","import {\n createContext,\n createElement,\n useContext,\n useEffect,\n type ReactNode,\n} from \"react\";\nimport type { HttpRouteContext, MaybePromise } from \"../route\";\nimport {\n DEFERRED_SCRIPT_ATTRIBUTE,\n DEFERRED_SCRIPT_SRC_ATTRIBUTE,\n DEFERRED_SCRIPT_TYPE,\n DEFERRED_SCRIPT_TYPE_ATTRIBUTE,\n isDeferredScriptStrategy,\n startDeferredScripts,\n} from \"./deferred-scripts\";\n\nexport type ScriptStrategy =\n | \"afterInteractive\"\n | \"beforeInteractive\"\n | \"idle\"\n | \"module\"\n | \"worker\";\n\nconst SCRIPT_STRATEGIES = new Set<ScriptStrategy>([\n \"afterInteractive\",\n \"beforeInteractive\",\n \"idle\",\n \"module\",\n \"worker\",\n]);\n\nexport const scriptPlacement = Symbol(\"demiurge.scriptPlacement\");\n\n/**\n * Directives a script needs at runtime beyond its own `script-src` entry. A\n * beacon or an API call needs `connect-src`. A tracking pixel needs `img-src`.\n * The build reads these and fails when the effective policy omits a source.\n */\nexport type ScriptCspNeeds = {\n connect?: readonly string[];\n img?: readonly string[];\n};\n\nexport type ScriptTag = {\n async?: boolean;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n dataApi?: string;\n dataDomain?: string;\n defer?: boolean;\n id?: string;\n integrity?: string;\n kind: \"script\";\n needs?: ScriptCspNeeds;\n nonce?: string;\n purpose?: string;\n referrerPolicy?: ReferrerPolicy;\n src: string;\n strategy: ScriptStrategy;\n type?: \"module\" | \"text/javascript\";\n [scriptPlacement]?: \"hoisted\" | \"in-place\";\n};\n\nexport type ScriptContribution =\n | readonly ScriptTag[]\n | ((context: HttpRouteContext) => MaybePromise<readonly ScriptTag[]>);\n\nexport type ScriptProps = Omit<\n ScriptTag,\n \"kind\" | \"nonce\" | \"strategy\" | typeof scriptPlacement\n> & {\n strategy?: ScriptStrategy;\n};\n\nexport type ScriptRenderContext = {\n dev: boolean;\n headFlushed: boolean;\n flushHead: () => void;\n nonce?: string;\n register: (scriptTag: ScriptTag) => \"hoist\" | \"render\" | \"skip\";\n scripts: () => ScriptTag[];\n};\n\nexport const ScriptContext = createContext<ScriptRenderContext | undefined>(\n undefined,\n);\n\nexport function createScriptRenderContext(options: {\n dev?: boolean;\n nonce?: string;\n scripts?: readonly ScriptTag[];\n} = {}): ScriptRenderContext {\n let headFlushed = false;\n const staticScripts = [...(options.scripts ?? [])];\n const staticSources = new Set(staticScripts.map((tag) => tag.src));\n const registeredSources = new Set<string>();\n const hoisted = new Map<string, ScriptTag>();\n\n return {\n get dev() {\n return options.dev ?? false;\n },\n get headFlushed() {\n return headFlushed;\n },\n flushHead() {\n headFlushed = true;\n },\n nonce: options.nonce,\n register(scriptTag) {\n if (staticSources.has(scriptTag.src) || registeredSources.has(scriptTag.src)) {\n return \"skip\";\n }\n\n registeredSources.add(scriptTag.src);\n\n if (!headFlushed) {\n hoisted.set(scriptTag.src, {\n ...scriptTag,\n [scriptPlacement]: \"hoisted\",\n });\n return \"hoist\";\n }\n\n if (scriptTag.strategy === \"beforeInteractive\" && (options.dev ?? false)) {\n throw new Error(\n `A render-discovered beforeInteractive script ${JSON.stringify(scriptTag.src)} was found after the document head flushed. Declare it in export const scripts.`,\n );\n }\n\n return \"render\";\n },\n scripts() {\n return sortScripts([...staticScripts, ...hoisted.values()]);\n },\n };\n}\n\nexport function Script(props: ScriptProps): ReactNode {\n const context = useContext(ScriptContext);\n const scriptTag = script(props);\n\n // A deferred strategy renders an inert placeholder. The client entry starts\n // the placeholders it finds at hydration. A component that mounts later needs\n // its own start, so the effect covers that case.\n useEffect(() => {\n if (isDeferredScriptStrategy(scriptTag.strategy)) {\n startDeferredScripts();\n }\n });\n\n if (!context) {\n if (typeof document === \"undefined\") {\n throw new Error(\n `The script ${JSON.stringify(scriptTag.src)} rendered outside a Demiurge document render context. A server render must wrap its component tree with the script render context.`,\n );\n }\n\n if (hasExistingScript(scriptTag.src)) {\n return null;\n }\n\n return renderScriptElement({\n ...scriptTag,\n [scriptPlacement]: \"in-place\",\n }, documentNonce());\n }\n\n const placement = context.register(scriptTag);\n\n if (placement !== \"render\") {\n return null;\n }\n\n return renderScriptElement({\n ...scriptTag,\n [scriptPlacement]: \"in-place\",\n }, context.nonce);\n}\n\nfunction renderScriptElement(scriptTag: ScriptTag, nonce?: string) {\n if (isDeferredScriptStrategy(scriptTag.strategy)) {\n return createElement(\"script\", {\n \"data-api\": scriptTag.dataApi,\n [DEFERRED_SCRIPT_ATTRIBUTE]: scriptTag.strategy,\n \"data-demiurge-script-placement\": scriptTag[scriptPlacement],\n [DEFERRED_SCRIPT_SRC_ATTRIBUTE]: scriptTag.src,\n [DEFERRED_SCRIPT_TYPE_ATTRIBUTE]: scriptTag.type,\n \"data-domain\": scriptTag.dataDomain,\n id: scriptTag.id,\n integrity: scriptTag.integrity,\n nonce: scriptTag.nonce ?? nonce,\n referrerPolicy: scriptTag.referrerPolicy,\n type: DEFERRED_SCRIPT_TYPE,\n });\n }\n\n return createElement(\"script\", {\n async: scriptTag.async,\n crossOrigin: scriptTag.crossOrigin,\n \"data-api\": scriptTag.dataApi,\n \"data-domain\": scriptTag.dataDomain,\n \"data-demiurge-script-placement\": scriptTag[scriptPlacement],\n defer: scriptTag.defer,\n id: scriptTag.id,\n integrity: scriptTag.integrity,\n nonce: scriptTag.nonce ?? nonce,\n referrerPolicy: scriptTag.referrerPolicy,\n src: scriptTag.src,\n type: scriptTag.type ?? scriptTypeForStrategy(scriptTag.strategy),\n });\n}\n\nfunction hasExistingScript(src: string) {\n if (typeof document === \"undefined\") {\n return false;\n }\n\n const expected = new URL(src, document.baseURI).href;\n\n return [...document.scripts].some((element) =>\n element.src === expected &&\n element.dataset.demiurgeScriptPlacement !== \"in-place\"\n );\n}\n\nfunction documentNonce() {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n return [...document.scripts].reverse().find((element) => element.nonce)?.nonce;\n}\n\nexport function defineScripts(contribution: ScriptContribution) {\n return contribution;\n}\n\nexport function script(options: Omit<ScriptTag, \"kind\" | \"strategy\"> & {\n strategy?: ScriptStrategy;\n}): ScriptTag {\n const strategy = options.strategy ?? \"afterInteractive\";\n\n if (!SCRIPT_STRATEGIES.has(strategy)) {\n throw new Error(\n `Unsupported script strategy ${JSON.stringify(strategy)}. Demiurge supports \"beforeInteractive\", \"module\", \"afterInteractive\", \"idle\", and \"worker\".`,\n );\n }\n\n if (strategy === \"module\" && options.type && options.type !== \"module\") {\n throw new Error(\n 'The \"module\" script strategy cannot be combined with type=\"text/javascript\".',\n );\n }\n\n if (strategy === \"worker\" && (options.async || options.defer)) {\n throw new Error(\n 'The \"worker\" script strategy runs off the main thread, so it cannot be combined with async or defer.',\n );\n }\n\n return {\n ...options,\n kind: \"script\",\n strategy,\n };\n}\n\nexport function withScriptContext(\n context: ScriptRenderContext,\n children: ReactNode,\n) {\n return createElement(ScriptContext.Provider, { value: context, children });\n}\n\nexport async function resolveScripts(\n contributions: Array<ScriptContribution | false | undefined>,\n context: HttpRouteContext,\n) {\n const scripts: ScriptTag[] = [];\n\n for (const contribution of contributions) {\n if (!contribution) {\n continue;\n }\n\n const resolved =\n typeof contribution === \"function\"\n ? await contribution(context)\n : contribution;\n\n scripts.push(...resolved);\n }\n\n return sortScripts(dedupeScripts(scripts));\n}\n\nfunction dedupeScripts(scripts: ScriptTag[]) {\n const deduped = new Map<string, ScriptTag>();\n\n for (const scriptTag of scripts) {\n deduped.set(scriptKey(scriptTag), {\n ...deduped.get(scriptKey(scriptTag)),\n ...scriptTag,\n });\n }\n\n return [...deduped.values()];\n}\n\nfunction scriptKey(scriptTag: ScriptTag) {\n return [\n scriptTag.src,\n scriptTag.type ?? \"\",\n scriptTag.integrity ?? \"\",\n scriptTag.strategy,\n ].join(\"\\0\");\n}\n\nfunction compareScripts(left: ScriptTag, right: ScriptTag) {\n return (\n scriptStrategyOrder(left.strategy) - scriptStrategyOrder(right.strategy) ||\n left.src.localeCompare(right.src)\n );\n}\n\nfunction sortScripts(scripts: ScriptTag[]) {\n return scripts.sort(compareScripts);\n}\n\nfunction scriptTypeForStrategy(strategy: ScriptTag[\"strategy\"]) {\n return strategy === \"module\" ? \"module\" : undefined;\n}\n\nfunction scriptStrategyOrder(strategy: ScriptStrategy) {\n if (strategy === \"beforeInteractive\") {\n return 0;\n }\n\n if (strategy === \"module\") {\n return 1;\n }\n\n if (strategy === \"afterInteractive\") {\n return 2;\n }\n\n return strategy === \"idle\" ? 3 : 4;\n}\n","import {\n HYDRATION_DATA_ELEMENT_ID,\n HYDRATION_FALLBACK_ATTRIBUTE,\n HYDRATION_ROOT_ATTRIBUTE,\n serializeInitialRouteData,\n} from \"./hydration\";\nimport type {\n DocumentMetadataTag,\n LinkTag,\n ResolvedMetadata,\n StructuredDataTag,\n} from \"./metadata\";\nimport {\n DEFERRED_SCRIPT_ATTRIBUTE,\n DEFERRED_SCRIPT_SRC_ATTRIBUTE,\n DEFERRED_SCRIPT_TYPE,\n DEFERRED_SCRIPT_TYPE_ATTRIBUTE,\n isDeferredScriptStrategy,\n} from \"./deferred-scripts\";\nimport { scriptPlacement, type ScriptTag } from \"./scripts\";\n\nexport const STRUCTURED_DATA_ATTRIBUTE = \"data-demiurge-structured-data\";\n\nexport type DocumentBody = {\n data: unknown;\n fallback?: \"not-found\";\n html: string;\n navigation?: \"document\";\n};\n\nexport type RenderDocumentOptions = {\n body?: DocumentBody;\n entrySrc?: string;\n lang?: string;\n links?: LinkTag[];\n metadata?: ResolvedMetadata;\n nonce?: string;\n scripts?: ScriptTag[];\n styles?: string[];\n title?: string;\n};\n\nexport type RenderDocumentShellOptions = Omit<RenderDocumentOptions, \"body\"> & {\n body: Omit<DocumentBody, \"html\">;\n};\n\nexport function renderDocument(options: RenderDocumentOptions) {\n if (options.body) {\n const { html, ...body } = options.body;\n const { prefix, suffix } = renderDocumentShell({ ...options, body });\n\n return `${prefix}${html}${suffix}`;\n }\n\n return renderDocumentWithoutBody(options);\n}\n\nexport function renderDocumentShell({\n body,\n entrySrc,\n lang = \"en\",\n links = [],\n metadata,\n nonce,\n scripts = [],\n styles = [],\n title = \"Demiurge App\",\n}: RenderDocumentShellOptions) {\n const documentTitle = metadata?.title ?? title;\n const trailingBodyContent = [\n ...scripts\n .filter((scriptTag) => scriptTag[scriptPlacement] !== \"hoisted\")\n .map((scriptTag) => ` ${renderScriptTag(scriptTag, nonce)}`),\n renderBootstrapData(body.data, body.navigation),\n ...(entrySrc ? [renderEntryScript(entrySrc, nonce)] : []),\n ].join(\"\\n\");\n\n return {\n prefix: `<!doctype html>\n<html lang=\"${escapeHtml(lang)}\">\n <head>\n${renderHeadTags({ links, metadata, nonce, scripts, styles, title: documentTitle })}\n </head>\n <body>\n${renderRootStart(body)}`,\n suffix: `</div>\n${trailingBodyContent}\n </body>\n</html>\n`,\n };\n}\n\nfunction renderDocumentWithoutBody({\n entrySrc,\n lang = \"en\",\n links = [],\n metadata,\n nonce,\n scripts = [],\n styles = [],\n title = \"Demiurge App\",\n}: RenderDocumentOptions) {\n const documentTitle = metadata?.title ?? title;\n const bodyContent = [\n renderRootElement(),\n ...scripts\n .filter((scriptTag) => scriptTag[scriptPlacement] !== \"hoisted\")\n .map((scriptTag) => ` ${renderScriptTag(scriptTag, nonce)}`),\n ...(entrySrc ? [renderEntryScript(entrySrc, nonce)] : []),\n ].join(\"\\n\");\n\n return `<!doctype html>\n<html lang=\"${escapeHtml(lang)}\">\n <head>\n${renderHeadTags({ links, metadata, nonce, scripts, styles, title: documentTitle })}\n </head>\n <body>\n${bodyContent}\n </body>\n</html>\n`;\n}\n\nfunction renderRootElement(body?: DocumentBody) {\n if (!body) {\n return ` <div id=\"root\"></div>`;\n }\n\n return `${renderRootStart(body)}${body.html}</div>`;\n}\n\nfunction renderRootStart(body: Omit<DocumentBody, \"html\">) {\n const fallback = body.fallback\n ? ` ${HYDRATION_FALLBACK_ATTRIBUTE}=\"${escapeHtml(body.fallback)}\"`\n : \"\";\n\n return ` <div id=\"root\" ${HYDRATION_ROOT_ATTRIBUTE}=\"\"${fallback}>`;\n}\n\nfunction renderBootstrapData(data: unknown, navigation?: \"document\") {\n return ` <template id=\"${HYDRATION_DATA_ELEMENT_ID}\">${serializeInitialRouteData(data, { navigation })}</template>`;\n}\n\nfunction renderEntryScript(entrySrc: string, nonce: string | undefined) {\n return ` <script type=\"module\" src=\"${escapeHtml(entrySrc)}\"${renderAttribute(\"nonce\", nonce)}></script>`;\n}\n\nfunction renderHeadTags({\n links,\n metadata,\n nonce,\n scripts,\n styles,\n title,\n}: {\n links: LinkTag[];\n metadata: ResolvedMetadata | undefined;\n nonce: string | undefined;\n scripts: ScriptTag[];\n styles: string[];\n title: string;\n}) {\n return [\n renderMetaTag({\n content: metadata?.charset ?? \"UTF-8\",\n kind: \"meta\",\n name: \"charset\",\n }),\n renderMetaTag({\n content: metadata?.viewport ?? \"width=device-width, initial-scale=1.0\",\n kind: \"meta\",\n name: \"viewport\",\n }),\n ` <title>${escapeHtml(title)}</title>`,\n ...(metadata?.description\n ? [\n renderMetaTag({\n content: metadata.description,\n kind: \"meta\",\n name: \"description\",\n }),\n ]\n : []),\n ...(metadata?.canonical\n ? [\n renderLinkTag({\n href: metadata.canonical,\n kind: \"link\",\n rel: \"canonical\",\n }),\n ]\n : []),\n ...renderRobotsTags(metadata),\n ...renderOpenGraphTags(metadata),\n ...(metadata?.custom ?? []).map(renderDocumentMetadataTag),\n ...(metadata?.structuredData ?? []).map((tag) =>\n renderStructuredDataTag(tag, nonce),\n ),\n ...styles.map(\n (href) => ` <link rel=\"stylesheet\" href=\"${escapeHtml(href)}\" />`,\n ),\n ...links.map(renderLinkTag),\n ...scripts\n .filter((scriptTag) => scriptTag[scriptPlacement] === \"hoisted\")\n .map((scriptTag) => ` ${renderScriptTag(scriptTag, nonce)}`),\n ].join(\"\\n\");\n}\n\nfunction renderRobotsTags(metadata: ResolvedMetadata | undefined) {\n if (!metadata?.robots) {\n return [];\n }\n\n const directives = [\n metadata.robots.index === false ? \"noindex\" : \"index\",\n metadata.robots.follow === false ? \"nofollow\" : \"follow\",\n ];\n\n return [\n renderMetaTag({\n content: directives.join(\", \"),\n kind: \"meta\",\n name: \"robots\",\n }),\n ];\n}\n\nfunction renderOpenGraphTags(metadata: ResolvedMetadata | undefined) {\n if (!metadata?.openGraph) {\n return [];\n }\n\n return [\n metadata.openGraph.title\n ? renderMetaTag({\n content: metadata.openGraph.title,\n kind: \"meta\",\n property: \"og:title\",\n })\n : null,\n metadata.openGraph.description\n ? renderMetaTag({\n content: metadata.openGraph.description,\n kind: \"meta\",\n property: \"og:description\",\n })\n : null,\n metadata.openGraph.image\n ? renderMetaTag({\n content: metadata.openGraph.image,\n kind: \"meta\",\n property: \"og:image\",\n })\n : null,\n ].filter((tag): tag is string => Boolean(tag));\n}\n\nfunction renderDocumentMetadataTag(tag: DocumentMetadataTag) {\n if (tag.kind === \"link\") {\n return renderLinkTag(tag);\n }\n\n return renderMetaTag(tag);\n}\n\nfunction renderStructuredDataTag(\n tag: StructuredDataTag,\n nonce: string | undefined,\n) {\n const ownership = nonce ? \"\" : ` ${STRUCTURED_DATA_ATTRIBUTE}`;\n\n return ` <script type=\"application/ld+json\"${ownership}${renderAttribute(\"nonce\", nonce)}>${escapeJsonScript(JSON.stringify(tag.value))}</script>`;\n}\n\nfunction renderMetaTag(tag: DocumentMetadataTag & { kind: \"meta\" }) {\n if (tag.name === \"charset\") {\n return ` <meta charset=\"${escapeHtml(tag.content)}\" />`;\n }\n\n const name = tag.name ? ` name=\"${escapeHtml(tag.name)}\"` : \"\";\n const property = tag.property ? ` property=\"${escapeHtml(tag.property)}\"` : \"\";\n\n return ` <meta${name}${property} content=\"${escapeHtml(tag.content)}\" />`;\n}\n\nfunction renderLinkTag(tag: LinkTag) {\n return ` <link${renderAttribute(\"rel\", tag.rel)}${renderAttribute(\"href\", tag.href)}${renderAttribute(\"as\", tag.as)}${renderAttribute(\"type\", tag.type)}${renderAttribute(\"crossorigin\", tag.crossOrigin)}${renderAttribute(\"hreflang\", tag.hrefLang)} />`;\n}\n\nfunction renderScriptTag(scriptTag: ScriptTag, nonce: string | undefined) {\n if (isDeferredScriptStrategy(scriptTag.strategy)) {\n return renderDeferredScriptTag(scriptTag, nonce);\n }\n\n return `<script${renderAttribute(\"id\", scriptTag.id)}${renderAttribute(\"src\", scriptTag.src)}${renderAttribute(\"type\", scriptTag.type ?? scriptTypeForStrategy(scriptTag.strategy))}${renderAttribute(\"nonce\", scriptTag.nonce ?? nonce)}${renderAttribute(\"integrity\", scriptTag.integrity)}${renderAttribute(\"crossorigin\", scriptTag.crossOrigin)}${renderAttribute(\"referrerpolicy\", scriptTag.referrerPolicy)}${renderAttribute(\"data-api\", scriptTag.dataApi)}${renderAttribute(\"data-domain\", scriptTag.dataDomain)}${renderAttribute(\"data-demiurge-script-placement\", scriptTag[scriptPlacement])}${renderBooleanAttribute(\"async\", scriptTag.async)}${renderBooleanAttribute(\"defer\", scriptTag.defer)}></script>`;\n}\n\n// An idle or worker script must not run while the browser parses the document.\n// The placeholder carries an inert type and keeps the source in a data\n// attribute, so nothing fetches it until the client runtime asks for it.\nfunction renderDeferredScriptTag(\n scriptTag: ScriptTag,\n nonce: string | undefined,\n) {\n return `<script${renderAttribute(\"id\", scriptTag.id)}${renderAttribute(\"type\", DEFERRED_SCRIPT_TYPE)}${renderAttribute(\"nonce\", scriptTag.nonce ?? nonce)}${renderAttribute(\"integrity\", scriptTag.integrity)}${renderAttribute(\"crossorigin\", scriptTag.crossOrigin)}${renderAttribute(\"referrerpolicy\", scriptTag.referrerPolicy)}${renderAttribute(\"data-api\", scriptTag.dataApi)}${renderAttribute(\"data-domain\", scriptTag.dataDomain)}${renderAttribute(DEFERRED_SCRIPT_ATTRIBUTE, scriptTag.strategy)}${renderAttribute(DEFERRED_SCRIPT_SRC_ATTRIBUTE, scriptTag.src)}${renderAttribute(DEFERRED_SCRIPT_TYPE_ATTRIBUTE, scriptTag.type)}${renderAttribute(\"data-demiurge-script-placement\", scriptTag[scriptPlacement])}></script>`;\n}\n\nfunction scriptTypeForStrategy(strategy: ScriptTag[\"strategy\"]) {\n return strategy === \"module\" ? \"module\" : undefined;\n}\n\nfunction renderAttribute(name: string, value: string | undefined) {\n return value ? ` ${name}=\"${escapeHtml(value)}\"` : \"\";\n}\n\nfunction renderBooleanAttribute(name: string, value: boolean | undefined) {\n return value ? ` ${name}` : \"\";\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\");\n}\n\nfunction escapeJsonScript(value: string) {\n return value\n .replaceAll(\"<\", \"\\\\u003c\")\n .replaceAll(\">\", \"\\\\u003e\")\n .replaceAll(\"
\", \"\\\\u2028\")\n .replaceAll(\"
\", \"\\\\u2029\");\n}\n","import type { HttpRouteContext, MaybePromise } from \"../route\";\nimport type { LinkTag } from \"./metadata\";\n\nexport type LinkContribution =\n | readonly LinkTag[]\n | ((context: HttpRouteContext) => MaybePromise<readonly LinkTag[]>);\n\nexport type PreloadOptions = {\n as: string;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n type?: string;\n};\n\nexport type PreconnectOptions = {\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n};\n\nexport function defineLinks(contribution: LinkContribution) {\n return contribution;\n}\n\nexport function preconnect(\n href: string,\n options: PreconnectOptions = {},\n): LinkTag {\n return {\n ...options,\n href,\n kind: \"link\",\n rel: \"preconnect\",\n };\n}\n\nexport function preload(href: string, options: PreloadOptions): LinkTag {\n return {\n ...options,\n href,\n kind: \"link\",\n rel: \"preload\",\n };\n}\n\nexport function modulePreload(href: string): LinkTag {\n return {\n href,\n kind: \"link\",\n rel: \"modulepreload\",\n };\n}\n\nexport async function resolveLinks(\n contributions: Array<LinkContribution | false | undefined>,\n context: HttpRouteContext,\n) {\n const links: LinkTag[] = [];\n\n for (const contribution of contributions) {\n if (!contribution) {\n continue;\n }\n\n const resolved =\n typeof contribution === \"function\"\n ? await contribution(context)\n : contribution;\n\n links.push(...resolved);\n }\n\n return dedupeLinks(links).sort(compareLinks);\n}\n\nfunction dedupeLinks(links: LinkTag[]) {\n const deduped = new Map<string, LinkTag>();\n\n for (const linkTag of links) {\n deduped.set(linkKey(linkTag), {\n ...deduped.get(linkKey(linkTag)),\n ...linkTag,\n });\n }\n\n return [...deduped.values()];\n}\n\nfunction linkKey(linkTag: LinkTag) {\n return [\n linkTag.rel,\n linkTag.href,\n linkTag.as ?? \"\",\n linkTag.type ?? \"\",\n linkTag.crossOrigin ?? \"\",\n ].join(\"\\0\");\n}\n\nfunction compareLinks(left: LinkTag, right: LinkTag) {\n return linkRelOrder(left.rel) - linkRelOrder(right.rel) ||\n left.href.localeCompare(right.href);\n}\n\nfunction linkRelOrder(rel: string) {\n if (rel === \"preconnect\") {\n return 0;\n }\n\n if (rel === \"preload\") {\n return 1;\n }\n\n if (rel === \"modulepreload\") {\n return 2;\n }\n\n return 3;\n}\n","import { createElement, type ReactNode } from \"react\";\nimport {\n createScriptRenderContext,\n withScriptContext,\n type ScriptRenderContext,\n} from \"../document/scripts\";\nimport type { LoadedRouteMatch } from \"../router\";\n\nexport function createPageRenderTree(\n match: LoadedRouteMatch,\n scripts?: ScriptRenderContext,\n) {\n const page = createElement(match.page, {\n data: match.data,\n path: match.path,\n pathname: match.pathname,\n });\n\n const tree = match.layouts.reduceRight<ReactNode>(\n (children, Layout) =>\n createElement(Layout, {\n children,\n path: match.path,\n pathname: match.pathname,\n }),\n page,\n );\n\n return scripts ? withScriptContext(scripts, tree) : tree;\n}\n\nexport function createPageScriptContext(\n match: LoadedRouteMatch,\n options: { dev?: boolean; nonce?: string } = {},\n) {\n return createScriptRenderContext({\n dev: options.dev,\n nonce: options.nonce,\n scripts: match.scripts,\n });\n}\n","import { renderToString } from \"react-dom/server\";\nimport { renderDocument } from \"../document\";\nimport type { LoadedRouteMatch } from \"../router\";\nimport { createPageRenderTree, createPageScriptContext } from \"./render-tree\";\n\nexport type SsrOptions = {\n clientEntry?: string;\n lang?: string;\n navigation?: \"document\";\n styles?: string[];\n title?: string;\n};\n\nexport type SsrRenderOptions = SsrOptions & {\n dev?: boolean;\n nonce?: string;\n onStreamError?: (error: unknown) => void;\n signal?: AbortSignal;\n transformDocument?: (html: string) => string | Promise<string>;\n};\n\nexport function renderPageDocument(\n match: LoadedRouteMatch,\n options: SsrRenderOptions = {},\n) {\n const scripts = createPageScriptContext(match, options);\n const html = renderToString(createPageRenderTree(match, scripts));\n\n return renderDocument({\n body: {\n data: match.data,\n html,\n navigation: match.render.mode === \"static\"\n ? \"document\"\n : options.navigation,\n },\n entrySrc: options.clientEntry,\n lang: options.lang,\n links: match.links,\n metadata: match.metadata,\n nonce: options.nonce,\n scripts: scripts.scripts(),\n styles: options.styles,\n title: options.title,\n });\n}\n\nexport function renderPageResponse(\n match: LoadedRouteMatch,\n options: SsrRenderOptions = {},\n) {\n const html = renderPageDocument(match, options);\n\n return new Response(html, {\n headers: {\n \"content-type\": \"text/html; charset=utf-8\",\n },\n });\n}\n","export type RequestConnectionMetadata = {\n clientIp: string;\n};\n\nconst connectionMetadata = new WeakMap<Request, RequestConnectionMetadata>();\n\nexport function getRequestConnectionMetadata(request: Request) {\n return connectionMetadata.get(request);\n}\n\nexport function setRequestConnectionMetadata(\n request: Request,\n metadata: RequestConnectionMetadata,\n) {\n connectionMetadata.set(request, metadata);\n}\n\nexport function copyRequestConnectionMetadata(from: Request, to: Request) {\n const metadata = connectionMetadata.get(from);\n\n if (metadata) {\n connectionMetadata.set(to, metadata);\n }\n}\n"],"names":["defaultCapabilities","defineAdapter","definition","checkAdapterCapabilities","adapter","required","uniqueRequired","missing","capability","assertAdapterCapabilities","check","HYDRATION_DATA_ELEMENT_ID","HYDRATION_ROOT_ATTRIBUTE","HYDRATION_FALLBACK_ATTRIBUTE","serializeInitialRouteData","data","options","escapeJsonScript","readInitialRouteData","source","element","serialized","error","value","FRAMEWORK_TRUSTED_TYPES_POLICY","frameworkPolicies","createFrameworkScriptUrl","view","url","resolveFrameworkPolicy","cached","policy","createFrameworkPolicy","trustedTypes","DEFERRED_SCRIPT_TYPE","DEFERRED_SCRIPT_ATTRIBUTE","DEFERRED_SCRIPT_SRC_ATTRIBUTE","DEFERRED_SCRIPT_TYPE_ATTRIBUTE","DEFERRED_SCRIPT_STARTED_ATTRIBUTE","IDLE_TIMEOUT_MS","COPIED_ATTRIBUTES","workers","isDeferredScriptStrategy","strategy","startDeferredScripts","target","owner","placeholders","placeholder","startScriptWorker","scheduleIdleCallback","loadIdleScript","getScriptWorker","src","callback","type","name","SCRIPT_STRATEGIES","scriptPlacement","ScriptContext","createContext","createScriptRenderContext","headFlushed","staticScripts","staticSources","tag","registeredSources","hoisted","scriptTag","sortScripts","Script","props","context","useContext","script","useEffect","hasExistingScript","renderScriptElement","documentNonce","nonce","createElement","scriptTypeForStrategy","expected","defineScripts","contribution","withScriptContext","children","resolveScripts","contributions","scripts","resolved","dedupeScripts","deduped","scriptKey","compareScripts","left","right","scriptStrategyOrder","STRUCTURED_DATA_ATTRIBUTE","renderDocument","html","body","prefix","suffix","renderDocumentShell","renderDocumentWithoutBody","entrySrc","lang","links","metadata","styles","title","documentTitle","trailingBodyContent","renderScriptTag","renderBootstrapData","renderEntryScript","escapeHtml","renderHeadTags","renderRootStart","bodyContent","renderRootElement","fallback","navigation","renderAttribute","renderMetaTag","renderLinkTag","renderRobotsTags","renderOpenGraphTags","renderDocumentMetadataTag","renderStructuredDataTag","href","directives","property","renderDeferredScriptTag","renderBooleanAttribute","defineLinks","preconnect","preload","modulePreload","resolveLinks","dedupeLinks","compareLinks","linkTag","linkKey","linkRelOrder","rel","createPageRenderTree","match","page","tree","Layout","createPageScriptContext","renderPageDocument","renderToString","renderPageResponse","connectionMetadata","getRequestConnectionMetadata","request","setRequestConnectionMetadata","copyRequestConnectionMetadata","from","to"],"mappings":";;AA6BA,MAAMA,IAAsB;AAAA,EAC1B,oBAAoB;AAAA,EACpB,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,cAAc;AAChB;AAEO,SAASC,GAAcC,GAAwC;AACpE,SAAO;AAAA,IACL,cAAc;AAAA,MACZ,GAAGF;AAAA,MACH,GAAGE,EAAW;AAAA,IAAA;AAAA,IAEhB,MAAMA,EAAW;AAAA,EAAA;AAErB;AAEO,SAASC,EACdC,GACAC,GACwB;AACxB,QAAMC,IAAiB,CAAC,GAAG,IAAI,IAAID,CAAQ,CAAC,GACtCE,IAAUD,EAAe;AAAA,IAC7B,CAACE,MAAe,CAACJ,EAAQ,aAAaI,CAAU;AAAA,EAAA;AAGlD,SAAO;AAAA,IACL,SAASJ,EAAQ;AAAA,IACjB,SAAAG;AAAA,IACA,IAAIA,EAAQ,WAAW;AAAA,IACvB,UAAUD;AAAA,EAAA;AAEd;AAEO,SAASG,GACdL,GACAC,GACA;AACA,QAAMK,IAAQP,EAAyBC,GAASC,CAAQ;AAExD,MAAI,CAACK,EAAM;AACT,UAAM,IAAI;AAAA,MACR,YAAYN,EAAQ,IAAI,6CAA6CM,EAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,IAAA;AAIjG,SAAOA;AACT;AC1EO,MAAMC,IAA4B,mBAC5BC,IAA2B,yBAI3BC,IAA+B;AAErC,SAASC,EACdC,GACAC,IAAuC,IACvC;AACA,SAAOC;AAAAA,IACL,KAAK,UAAU,EAAE,MAAAF,GAAM,SAAS,IAAM,GAAGC,GAAS;AAAA,EAAA;AAEtD;AAEO,SAASE,GAAqBC,GAAkB;AACrD,QAAMC,IAAUD,EAAO,eAAeR,CAAyB,GAEzDU,IAAaD,GAAS,YAAY,aACnCA,EAAgC,QAAQ,cACzCA,GAAS;AAEb,MAAKC;AAIL,QAAI;AAEF,aAAO,KAAK,MAAMA,CAAU;AAAA,IAC9B,SAASC,GAAO;AACd,YAAM,IAAI;AAAA,QACR;AAAA,QACA,EAAE,OAAOA,EAAA;AAAA,MAAM;AAAA,IAEnB;AACF;AAEA,SAASL,EAAiBM,GAAe;AACvC,SAAOA,EACJ,QAAQ,MAAM,SAAS,EACvB,QAAQ,MAAM,SAAS,EACvB,QAAQ,MAAM,SAAS,EACvB,QAAQ,WAAW,SAAS,EAC5B,QAAQ,WAAW,SAAS;AACjC;AC9CO,MAAMC,IAAiC,YAkBxCC,wBAAwB,QAAA;AASvB,SAASC,EACdC,GACAC,GACA;AACA,SAAOC,EAAuBF,CAAI,GAAG,gBAAgBC,CAAG,KAAKA;AAC/D;AAEA,SAASC,EACPF,GACA;AACA,MAAI,CAACA;AACH,WAAO;AAGT,QAAMG,IAASL,EAAkB,IAAIE,CAAI;AAEzC,MAAIG,MAAW;AACb,WAAOA;AAGT,QAAMC,IAASC,EAAsBL,CAAI;AACzC,SAAAF,EAAkB,IAAIE,GAAMI,CAAM,GAE3BA;AACT;AAEA,SAASC,EAAsBL,GAAc;AAE3C,QAAMM,IAAgBN,EAA4C;AAElE,MAAI,CAACM,KAAgB,OAAOA,EAAa,gBAAiB;AACxD,WAAO;AAGT,MAAI;AACF,WAAOA,EAAa,aAAaT,GAAgC;AAAA;AAAA;AAAA;AAAA,MAI/D,iBAAiB,CAACD,MAAkBA;AAAA,IAAA,CACrC;AAAA,EACH,SAASD,GAAO;AAId,mBAAQ;AAAA,MACN,iCAAiC,KAAK,UAAUE,CAA8B,CAAC,8BAA8B,KAAK,UAAUA,CAA8B,CAAC;AAAA,MAC3JF;AAAA,IAAA,GAGK;AAAA,EACT;AACF;AC7EO,MAAMY,IAAuB,wBACvBC,IAA4B,wBAC5BC,IAAgC,4BAChCC,IAAiC,6BACjCC,IAAoC,gCAI3CC,IAAkB,KAElBC,KAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAIMC,wBAAc,IAAA;AAEb,SAASC,EACdC,GACoC;AACpC,SAAOA,MAAa,UAAUA,MAAa;AAC7C;AAIO,SAASC,GAAqBC,GAAmB;AACtD,QAAMC,IAAQD,MAAW,OAAO,WAAa,MAAc,SAAY;AAEvE,MAAI,CAACC;AACH;AAGF,QAAMC,IAAeD,EAAM;AAAA,IACzB,UAAUX,CAAyB,UAAUG,CAAiC;AAAA,EAAA;AAGhF,aAAWU,KAAe,CAAC,GAAGD,CAAY,GAAG;AAC3C,UAAMJ,IAAWK,EAAY,aAAab,CAAyB;AAEnE,QAAI,EAAAQ,MAAa,UAAUA,MAAa,WAMxC;AAAA,UAFAK,EAAY,aAAaV,GAAmC,EAAE,GAE1DK,MAAa,UAAU;AACzB,QAAAM,GAAkBD,CAAW;AAC7B;AAAA,MACF;AAEA,MAAAE,GAAqBF,GAAa,MAAMG,GAAeH,CAAW,CAAC;AAAA;AAAA,EACrE;AACF;AAKO,SAASI,GAAgBC,GAAa;AAC3C,SAAOZ,EAAQ,IAAIY,CAAG;AACxB;AAEA,SAASH,GACPF,GACAM,GACA;AACA,QAAM3B,IAAOqB,EAAY,cAAc;AAEvC,MAAIrB,KAAQ,OAAOA,EAAK,uBAAwB,YAAY;AAC1D,IAAAA,EAAK,oBAAoB,MAAM2B,EAAA,GAAY,EAAE,SAASf,GAAiB;AACvE;AAAA,EACF;AAKA,GADeZ,KAAQ,YAChB,WAAW2B,GAAU,CAAC;AAC/B;AAKA,SAASH,GAAeH,GAAgC;AACtD,QAAMF,IAAQE,EAAY,eACpBK,IAAML,EAAY,aAAaZ,CAA6B;AAElE,MAAI,CAACiB;AACH;AAGF,QAAMjC,IAAU0B,EAAM,cAAc,QAAQ,GACtCS,IAAOP,EAAY,aAAaX,CAA8B;AAEpE,aAAWmB,KAAQhB,IAAmB;AACpC,UAAMjB,IAAQyB,EAAY,aAAaQ,CAAI;AAE3C,IAAIjC,MAAU,QACZH,EAAQ,aAAaoC,GAAMjC,CAAK;AAAA,EAEpC;AAGA,EAAAyB,EAAY,gBAAgB,IAAI,GAE5BO,MACFnC,EAAQ,OAAOmC,IAKjBnC,EAAQ,QAAQ,IAChBA,EAAQ,QAAQ4B,EAAY,OAC5B5B,EAAQ,MAAMM,EAAyBoB,EAAM,aAAaO,CAAG,GAC7DP,EAAM,KAAK,YAAY1B,CAAO;AAChC;AAEA,SAAS6B,GAAkBD,GAAgC;AACzD,QAAMK,IAAML,EAAY,aAAaZ,CAA6B,GAC5DT,IAAOqB,EAAY,cAAc;AAEvC,MAAI,CAACK;AACH;AAMF,MAAI,CAAC1B,KAAQ,OAAOA,EAAK,UAAW,YAAY;AAC9C,YAAQ;AAAA,MACN,8CAA8C,KAAK,UAAU0B,CAAG,CAAC;AAAA,IAAA;AAEnE;AAAA,EACF;AAEA,QAAME,IAAOP,EAAY,aAAaX,CAA8B;AAEpE,MAAI;AACF,IAAAI,EAAQ;AAAA,MACNY;AAAA,MACA,IAAI1B,EAAK,OAAOD,EAAyBC,GAAM0B,CAAG,GAAG;AAAA,QACnD,MAAME,MAAS,WAAW,WAAW;AAAA,MAAA,CACtC;AAAA,IAAA;AAAA,EAEL,SAASjC,GAAO;AAId,YAAQ;AAAA,MACN,8CAA8C,KAAK,UAAU+B,CAAG,CAAC;AAAA,MACjE/B;AAAA,IAAA;AAAA,EAEJ;AACF;AC5IA,MAAMmC,yBAAwB,IAAoB;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC,GAEYC,IAAkB,OAAO,0BAA0B,GAmDnDC,IAAgBC;AAAA,EAC3B;AACF;AAEO,SAASC,GAA0B7C,IAItC,IAAyB;AAC3B,MAAI8C,IAAc;AAClB,QAAMC,IAAgB,CAAC,GAAI/C,EAAQ,WAAW,CAAA,CAAG,GAC3CgD,IAAgB,IAAI,IAAID,EAAc,IAAI,CAACE,MAAQA,EAAI,GAAG,CAAC,GAC3DC,wBAAwB,IAAA,GACxBC,wBAAc,IAAA;AAEpB,SAAO;AAAA,IACL,IAAI,MAAM;AACR,aAAOnD,EAAQ,OAAO;AAAA,IACxB;AAAA,IACA,IAAI,cAAc;AAChB,aAAO8C;AAAA,IACT;AAAA,IACA,YAAY;AACV,MAAAA,IAAc;AAAA,IAChB;AAAA,IACA,OAAO9C,EAAQ;AAAA,IACf,SAASoD,GAAW;AAClB,UAAIJ,EAAc,IAAII,EAAU,GAAG,KAAKF,EAAkB,IAAIE,EAAU,GAAG;AACzE,eAAO;AAKT,UAFAF,EAAkB,IAAIE,EAAU,GAAG,GAE/B,CAACN;AACH,eAAAK,EAAQ,IAAIC,EAAU,KAAK;AAAA,UACzB,GAAGA;AAAA,UACH,CAACV,CAAe,GAAG;AAAA,QAAA,CACpB,GACM;AAGT,UAAIU,EAAU,aAAa,wBAAwBpD,EAAQ,OAAO;AAChE,cAAM,IAAI;AAAA,UACR,gDAAgD,KAAK,UAAUoD,EAAU,GAAG,CAAC;AAAA,QAAA;AAIjF,aAAO;AAAA,IACT;AAAA,IACA,UAAU;AACR,aAAOC,EAAY,CAAC,GAAGN,GAAe,GAAGI,EAAQ,OAAA,CAAQ,CAAC;AAAA,IAC5D;AAAA,EAAA;AAEJ;AAEO,SAASG,GAAOC,GAA+B;AACpD,QAAMC,IAAUC,EAAWd,CAAa,GAClCS,IAAYM,GAAOH,CAAK;AAW9B,MANAI,EAAU,MAAM;AACd,IAAIjC,EAAyB0B,EAAU,QAAQ,KAC7CxB,GAAA;AAAA,EAEJ,CAAC,GAEG,CAAC4B,GAAS;AACZ,QAAI,OAAO,WAAa;AACtB,YAAM,IAAI;AAAA,QACR,cAAc,KAAK,UAAUJ,EAAU,GAAG,CAAC;AAAA,MAAA;AAI/C,WAAIQ,GAAkBR,EAAU,GAAG,IAC1B,OAGFS,EAAoB;AAAA,MACzB,GAAGT;AAAA,MACH,CAACV,CAAe,GAAG;AAAA,IAAA,GAClBoB,IAAe;AAAA,EACpB;AAIA,SAFkBN,EAAQ,SAASJ,CAAS,MAE1B,WACT,OAGFS,EAAoB;AAAA,IACzB,GAAGT;AAAA,IACH,CAACV,CAAe,GAAG;AAAA,EAAA,GAClBc,EAAQ,KAAK;AAClB;AAEA,SAASK,EAAoBT,GAAsBW,GAAgB;AACjE,SAAIrC,EAAyB0B,EAAU,QAAQ,IACtCY,EAAc,UAAU;AAAA,IAC7B,YAAYZ,EAAU;AAAA,IACtB,CAACjC,CAAyB,GAAGiC,EAAU;AAAA,IACvC,kCAAkCA,EAAUV,CAAe;AAAA,IAC3D,CAACtB,CAA6B,GAAGgC,EAAU;AAAA,IAC3C,CAAC/B,CAA8B,GAAG+B,EAAU;AAAA,IAC5C,eAAeA,EAAU;AAAA,IACzB,IAAIA,EAAU;AAAA,IACd,WAAWA,EAAU;AAAA,IACrB,OAAOA,EAAU,SAASW;AAAA,IAC1B,gBAAgBX,EAAU;AAAA,IAC1B,MAAMlC;AAAA,EAAA,CACP,IAGI8C,EAAc,UAAU;AAAA,IAC7B,OAAOZ,EAAU;AAAA,IACjB,aAAaA,EAAU;AAAA,IACvB,YAAYA,EAAU;AAAA,IACtB,eAAeA,EAAU;AAAA,IACzB,kCAAkCA,EAAUV,CAAe;AAAA,IAC3D,OAAOU,EAAU;AAAA,IACjB,IAAIA,EAAU;AAAA,IACd,WAAWA,EAAU;AAAA,IACrB,OAAOA,EAAU,SAASW;AAAA,IAC1B,gBAAgBX,EAAU;AAAA,IAC1B,KAAKA,EAAU;AAAA,IACf,MAAMA,EAAU,QAAQa,GAAsBb,EAAU,QAAQ;AAAA,EAAA,CACjE;AACH;AAEA,SAASQ,GAAkBvB,GAAa;AACtC,MAAI,OAAO,WAAa;AACtB,WAAO;AAGT,QAAM6B,IAAW,IAAI,IAAI7B,GAAK,SAAS,OAAO,EAAE;AAEhD,SAAO,CAAC,GAAG,SAAS,OAAO,EAAE;AAAA,IAAK,CAACjC,MACjCA,EAAQ,QAAQ8D,KAChB9D,EAAQ,QAAQ,4BAA4B;AAAA,EAAA;AAEhD;AAEA,SAAS0D,KAAgB;AACvB,MAAI,SAAO,WAAa;AAIxB,WAAO,CAAC,GAAG,SAAS,OAAO,EAAE,QAAA,EAAU,KAAK,CAAC1D,MAAYA,EAAQ,KAAK,GAAG;AAC3E;AAEO,SAAS+D,GAAcC,GAAkC;AAC9D,SAAOA;AACT;AAEO,SAASV,GAAO1D,GAET;AACZ,QAAM2B,IAAW3B,EAAQ,YAAY;AAErC,MAAI,CAACyC,GAAkB,IAAId,CAAQ;AACjC,UAAM,IAAI;AAAA,MACR,+BAA+B,KAAK,UAAUA,CAAQ,CAAC;AAAA,IAAA;AAI3D,MAAIA,MAAa,YAAY3B,EAAQ,QAAQA,EAAQ,SAAS;AAC5D,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAIJ,MAAI2B,MAAa,aAAa3B,EAAQ,SAASA,EAAQ;AACrD,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAIJ,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,MAAM;AAAA,IACN,UAAA2B;AAAA,EAAA;AAEJ;AAEO,SAAS0C,GACdb,GACAc,GACA;AACA,SAAON,EAAcrB,EAAc,UAAU,EAAE,OAAOa,GAAS,UAAAc,GAAU;AAC3E;AAEA,eAAsBC,GACpBC,GACAhB,GACA;AACA,QAAMiB,IAAuB,CAAA;AAE7B,aAAWL,KAAgBI,GAAe;AACxC,QAAI,CAACJ;AACH;AAGF,UAAMM,IACJ,OAAON,KAAiB,aACpB,MAAMA,EAAaZ,CAAO,IAC1BY;AAEN,IAAAK,EAAQ,KAAK,GAAGC,CAAQ;AAAA,EAC1B;AAEA,SAAOrB,EAAYsB,GAAcF,CAAO,CAAC;AAC3C;AAEA,SAASE,GAAcF,GAAsB;AAC3C,QAAMG,wBAAc,IAAA;AAEpB,aAAWxB,KAAaqB;AACtB,IAAAG,EAAQ,IAAIC,EAAUzB,CAAS,GAAG;AAAA,MAChC,GAAGwB,EAAQ,IAAIC,EAAUzB,CAAS,CAAC;AAAA,MACnC,GAAGA;AAAA,IAAA,CACJ;AAGH,SAAO,CAAC,GAAGwB,EAAQ,QAAQ;AAC7B;AAEA,SAASC,EAAUzB,GAAsB;AACvC,SAAO;AAAA,IACLA,EAAU;AAAA,IACVA,EAAU,QAAQ;AAAA,IAClBA,EAAU,aAAa;AAAA,IACvBA,EAAU;AAAA,EAAA,EACV,KAAK,IAAI;AACb;AAEA,SAAS0B,GAAeC,GAAiBC,GAAkB;AACzD,SACEC,EAAoBF,EAAK,QAAQ,IAAIE,EAAoBD,EAAM,QAAQ,KACvED,EAAK,IAAI,cAAcC,EAAM,GAAG;AAEpC;AAEA,SAAS3B,EAAYoB,GAAsB;AACzC,SAAOA,EAAQ,KAAKK,EAAc;AACpC;AAEA,SAASb,GAAsBtC,GAAiC;AAC9D,SAAOA,MAAa,WAAW,WAAW;AAC5C;AAEA,SAASsD,EAAoBtD,GAA0B;AACrD,SAAIA,MAAa,sBACR,IAGLA,MAAa,WACR,IAGLA,MAAa,qBACR,IAGFA,MAAa,SAAS,IAAI;AACnC;ACvUO,MAAMuD,KAA4B;AAyBlC,SAASC,GAAenF,GAAgC;AAC7D,MAAIA,EAAQ,MAAM;AAChB,UAAM,EAAE,MAAAoF,GAAM,GAAGC,EAAA,IAASrF,EAAQ,MAC5B,EAAE,QAAAsF,GAAQ,QAAAC,EAAA,IAAWC,GAAoB,EAAE,GAAGxF,GAAS,MAAAqF,GAAM;AAEnE,WAAO,GAAGC,CAAM,GAAGF,CAAI,GAAGG,CAAM;AAAA,EAClC;AAEA,SAAOE,GAA0BzF,CAAO;AAC1C;AAEO,SAASwF,GAAoB;AAAA,EAClC,MAAAH;AAAA,EACA,UAAAK;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ,CAAA;AAAA,EACR,UAAAC;AAAA,EACA,OAAA9B;AAAA,EACA,SAAAU,IAAU,CAAA;AAAA,EACV,QAAAqB,IAAS,CAAA;AAAA,EACT,OAAAC,IAAQ;AACV,GAA+B;AAC7B,QAAMC,IAAgBH,GAAU,SAASE,GACnCE,IAAsB;AAAA,IAC1B,GAAGxB,EACA,OAAO,CAACrB,MAAcA,EAAUV,CAAe,MAAM,SAAS,EAC9D,IAAI,CAACU,MAAc,OAAO8C,EAAgB9C,GAAWW,CAAK,CAAC,EAAE;AAAA,IAChEoC,GAAoBd,EAAK,MAAMA,EAAK,UAAU;AAAA,IAC9C,GAAIK,IAAW,CAACU,EAAkBV,GAAU3B,CAAK,CAAC,IAAI,CAAA;AAAA,EAAC,EACvD,KAAK;AAAA,CAAI;AAEX,SAAO;AAAA,IACL,QAAQ;AAAA,cACEsC,EAAWV,CAAI,CAAC;AAAA;AAAA,EAE5BW,EAAe,EAAE,OAAAV,GAAO,UAAAC,GAAU,OAAA9B,GAAO,SAAAU,GAAS,QAAAqB,GAAQ,OAAOE,GAAe,CAAC;AAAA;AAAA;AAAA,EAGjFO,GAAgBlB,CAAI,CAAC;AAAA,IACnB,QAAQ;AAAA,EACVY,CAAmB;AAAA;AAAA;AAAA;AAAA,EAAA;AAKrB;AAEA,SAASR,GAA0B;AAAA,EACjC,UAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ,CAAA;AAAA,EACR,UAAAC;AAAA,EACA,OAAA9B;AAAA,EACA,SAAAU,IAAU,CAAA;AAAA,EACV,QAAAqB,IAAS,CAAA;AAAA,EACT,OAAAC,IAAQ;AACV,GAA0B;AACxB,QAAMC,IAAgBH,GAAU,SAASE,GACnCS,IAAc;AAAA,IAClBC,GAAA;AAAA,IACA,GAAGhC,EACA,OAAO,CAACrB,MAAcA,EAAUV,CAAe,MAAM,SAAS,EAC9D,IAAI,CAACU,MAAc,OAAO8C,EAAgB9C,GAAWW,CAAK,CAAC,EAAE;AAAA,IAChE,GAAI2B,IAAW,CAACU,EAAkBV,GAAU3B,CAAK,CAAC,IAAI,CAAA;AAAA,EAAC,EACvD,KAAK;AAAA,CAAI;AAEX,SAAO;AAAA,cACKsC,EAAWV,CAAI,CAAC;AAAA;AAAA,EAE5BW,EAAe,EAAE,OAAAV,GAAO,UAAAC,GAAU,OAAA9B,GAAO,SAAAU,GAAS,QAAAqB,GAAQ,OAAOE,GAAe,CAAC;AAAA;AAAA;AAAA,EAGjFQ,CAAW;AAAA;AAAA;AAAA;AAIb;AAEA,SAASC,GAAkBpB,GAAqB;AAE5C,SAAO;AAIX;AAEA,SAASkB,GAAgBlB,GAAkC;AACzD,QAAMqB,IAAWrB,EAAK,WAClB,IAAIxF,CAA4B,KAAKwG,EAAWhB,EAAK,QAAQ,CAAC,MAC9D;AAEJ,SAAO,sBAAsBzF,CAAwB,MAAM8G,CAAQ;AACrE;AAEA,SAASP,GAAoBpG,GAAe4G,GAAyB;AACnE,SAAO,qBAAqBhH,CAAyB,KAAKG,EAA0BC,GAAM,EAAE,YAAA4G,GAAY,CAAC;AAC3G;AAEA,SAASP,EAAkBV,GAAkB3B,GAA2B;AACtE,SAAO,kCAAkCsC,EAAWX,CAAQ,CAAC,IAAIkB,EAAgB,SAAS7C,CAAK,CAAC;AAClG;AAEA,SAASuC,EAAe;AAAA,EACtB,OAAAV;AAAA,EACA,UAAAC;AAAA,EACA,OAAA9B;AAAA,EACA,SAAAU;AAAA,EACA,QAAAqB;AAAA,EACA,OAAAC;AACF,GAOG;AACD,SAAO;AAAA,IACLc,EAAc;AAAA,MACZ,SAAShB,GAAU,WAAW;AAAA,MAE9B,MAAM;AAAA,IAAA,CACP;AAAA,IACDgB,EAAc;AAAA,MACZ,SAAShB,GAAU,YAAY;AAAA,MAE/B,MAAM;AAAA,IAAA,CACP;AAAA,IACD,cAAcQ,EAAWN,CAAK,CAAC;AAAA,IAC/B,GAAIF,GAAU,cACV;AAAA,MACAgB,EAAc;AAAA,QACZ,SAAShB,EAAS;AAAA,QAElB,MAAM;AAAA,MAAA,CACP;AAAA,IAAA,IAED,CAAA;AAAA,IACJ,GAAIA,GAAU,YACV;AAAA,MACAiB,EAAc;AAAA,QACZ,MAAMjB,EAAS;AAAA,QAEf,KAAK;AAAA,MAAA,CACN;AAAA,IAAA,IAED,CAAA;AAAA,IACJ,GAAGkB,GAAiBlB,CAAQ;AAAA,IAC5B,GAAGmB,GAAoBnB,CAAQ;AAAA,IAC/B,IAAIA,GAAU,UAAU,CAAA,GAAI,IAAIoB,EAAyB;AAAA,IACzD,IAAIpB,GAAU,kBAAkB,CAAA,GAAI;AAAA,MAAI,CAAC5C,MACvCiE,GAAwBjE,GAAKc,CAAK;AAAA,IAAA;AAAA,IAEpC,GAAG+B,EAAO;AAAA,MACR,CAACqB,MAAS,oCAAoCd,EAAWc,CAAI,CAAC;AAAA,IAAA;AAAA,IAEhE,GAAGvB,EAAM,IAAIkB,CAAa;AAAA,IAC1B,GAAGrC,EACA,OAAO,CAACrB,MAAcA,EAAUV,CAAe,MAAM,SAAS,EAC9D,IAAI,CAACU,MAAc,OAAO8C,EAAgB9C,GAAWW,CAAK,CAAC,EAAE;AAAA,EAAA,EAChE,KAAK;AAAA,CAAI;AACb;AAEA,SAASgD,GAAiBlB,GAAwC;AAChE,MAAI,CAACA,GAAU;AACb,WAAO,CAAA;AAGT,QAAMuB,IAAa;AAAA,IACjBvB,EAAS,OAAO,UAAU,KAAQ,YAAY;AAAA,IAC9CA,EAAS,OAAO,WAAW,KAAQ,aAAa;AAAA,EAAA;AAGlD,SAAO;AAAA,IACLgB,EAAc;AAAA,MACZ,SAASO,EAAW,KAAK,IAAI;AAAA,MAE7B,MAAM;AAAA,IAAA,CACP;AAAA,EAAA;AAEL;AAEA,SAASJ,GAAoBnB,GAAwC;AACnE,SAAKA,GAAU,YAIR;AAAA,IACLA,EAAS,UAAU,QACfgB,EAAc;AAAA,MACd,SAAShB,EAAS,UAAU;AAAA,MAE5B,UAAU;AAAA,IAAA,CACX,IACC;AAAA,IACJA,EAAS,UAAU,cACfgB,EAAc;AAAA,MACd,SAAShB,EAAS,UAAU;AAAA,MAE5B,UAAU;AAAA,IAAA,CACX,IACC;AAAA,IACJA,EAAS,UAAU,QACfgB,EAAc;AAAA,MACd,SAAShB,EAAS,UAAU;AAAA,MAE5B,UAAU;AAAA,IAAA,CACX,IACC;AAAA,EAAA,EACJ,OAAO,CAAC5C,MAAuB,EAAQA,CAAI,IAzBpC,CAAA;AA0BX;AAEA,SAASgE,GAA0BhE,GAA0B;AAC3D,SAAIA,EAAI,SAAS,SACR6D,EAAc7D,CAAG,IAGnB4D,EAAc5D,CAAG;AAC1B;AAEA,SAASiE,GACPjE,GACAc,GACA;AAGA,SAAO,yCAFWA,IAAQ,KAAK,IAAImB,EAAyB,EAEH,GAAG0B,EAAgB,SAAS7C,CAAK,CAAC,IAAI9D,GAAiB,KAAK,UAAUgD,EAAI,KAAK,CAAC,CAAC;AAC5I;AAEA,SAAS4D,EAAc5D,GAA6C;AAClE,MAAIA,EAAI,SAAS;AACf,WAAO,sBAAsBoD,EAAWpD,EAAI,OAAO,CAAC;AAGtD,QAAMT,IAAOS,EAAI,OAAO,UAAUoD,EAAWpD,EAAI,IAAI,CAAC,MAAM,IACtDoE,IAAWpE,EAAI,WAAW,cAAcoD,EAAWpD,EAAI,QAAQ,CAAC,MAAM;AAE5E,SAAO,YAAYT,CAAI,GAAG6E,CAAQ,aAAahB,EAAWpD,EAAI,OAAO,CAAC;AACxE;AAEA,SAAS6D,EAAc7D,GAAc;AACnC,SAAO,YAAY2D,EAAgB,OAAO3D,EAAI,GAAG,CAAC,GAAG2D,EAAgB,QAAQ3D,EAAI,IAAI,CAAC,GAAG2D,EAAgB,MAAM3D,EAAI,EAAE,CAAC,GAAG2D,EAAgB,QAAQ3D,EAAI,IAAI,CAAC,GAAG2D,EAAgB,eAAe3D,EAAI,WAAW,CAAC,GAAG2D,EAAgB,YAAY3D,EAAI,QAAQ,CAAC;AAC1P;AAEA,SAASiD,EAAgB9C,GAAsBW,GAA2B;AACxE,SAAIrC,EAAyB0B,EAAU,QAAQ,IACtCkE,GAAwBlE,GAAWW,CAAK,IAG1C,UAAU6C,EAAgB,MAAMxD,EAAU,EAAE,CAAC,GAAGwD,EAAgB,OAAOxD,EAAU,GAAG,CAAC,GAAGwD,EAAgB,QAAQxD,EAAU,QAAQa,GAAsBb,EAAU,QAAQ,CAAC,CAAC,GAAGwD,EAAgB,SAASxD,EAAU,SAASW,CAAK,CAAC,GAAG6C,EAAgB,aAAaxD,EAAU,SAAS,CAAC,GAAGwD,EAAgB,eAAexD,EAAU,WAAW,CAAC,GAAGwD,EAAgB,kBAAkBxD,EAAU,cAAc,CAAC,GAAGwD,EAAgB,YAAYxD,EAAU,OAAO,CAAC,GAAGwD,EAAgB,eAAexD,EAAU,UAAU,CAAC,GAAGwD,EAAgB,kCAAkCxD,EAAUV,CAAe,CAAC,CAAC,GAAG6E,EAAuB,SAASnE,EAAU,KAAK,CAAC,GAAGmE,EAAuB,SAASnE,EAAU,KAAK,CAAC;AAClrB;AAKA,SAASkE,GACPlE,GACAW,GACA;AACA,SAAO,UAAU6C,EAAgB,MAAMxD,EAAU,EAAE,CAAC,GAAGwD,EAAgB,QAAQ1F,CAAoB,CAAC,GAAG0F,EAAgB,SAASxD,EAAU,SAASW,CAAK,CAAC,GAAG6C,EAAgB,aAAaxD,EAAU,SAAS,CAAC,GAAGwD,EAAgB,eAAexD,EAAU,WAAW,CAAC,GAAGwD,EAAgB,kBAAkBxD,EAAU,cAAc,CAAC,GAAGwD,EAAgB,YAAYxD,EAAU,OAAO,CAAC,GAAGwD,EAAgB,eAAexD,EAAU,UAAU,CAAC,GAAGwD,EAAgBzF,GAA2BiC,EAAU,QAAQ,CAAC,GAAGwD,EAAgBxF,GAA+BgC,EAAU,GAAG,CAAC,GAAGwD,EAAgBvF,GAAgC+B,EAAU,IAAI,CAAC,GAAGwD,EAAgB,kCAAkCxD,EAAUV,CAAe,CAAC,CAAC;AAChsB;AAEA,SAASuB,GAAsBtC,GAAiC;AAC9D,SAAOA,MAAa,WAAW,WAAW;AAC5C;AAEA,SAASiF,EAAgBpE,GAAcjC,GAA2B;AAChE,SAAOA,IAAQ,IAAIiC,CAAI,KAAK6D,EAAW9F,CAAK,CAAC,MAAM;AACrD;AAEA,SAASgH,EAAuB/E,GAAcjC,GAA4B;AACxE,SAAOA,IAAQ,IAAIiC,CAAI,KAAK;AAC9B;AAEA,SAAS6D,EAAW9F,GAAe;AACjC,SAAOA,EACJ,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,QAAQ;AAC7B;AAEA,SAASN,GAAiBM,GAAe;AACvC,SAAOA,EACJ,WAAW,KAAK,SAAS,EACzB,WAAW,KAAK,SAAS,EACzB,WAAW,UACb,SAAS,EACP,WAAW,UACb,SAAS;AACZ;AC/TO,SAASiH,GAAYpD,GAAgC;AAC1D,SAAOA;AACT;AAEO,SAASqD,GACdN,GACAnH,IAA6B,IACpB;AACT,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,MAAAmH;AAAA,IACA,MAAM;AAAA,IACN,KAAK;AAAA,EAAA;AAET;AAEO,SAASO,GAAQP,GAAcnH,GAAkC;AACtE,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,MAAAmH;AAAA,IACA,MAAM;AAAA,IACN,KAAK;AAAA,EAAA;AAET;AAEO,SAASQ,GAAcR,GAAuB;AACnD,SAAO;AAAA,IACL,MAAAA;AAAA,IACA,MAAM;AAAA,IACN,KAAK;AAAA,EAAA;AAET;AAEA,eAAsBS,GACpBpD,GACAhB,GACA;AACA,QAAMoC,IAAmB,CAAA;AAEzB,aAAWxB,KAAgBI,GAAe;AACxC,QAAI,CAACJ;AACH;AAGF,UAAMM,IACJ,OAAON,KAAiB,aACpB,MAAMA,EAAaZ,CAAO,IAC1BY;AAEN,IAAAwB,EAAM,KAAK,GAAGlB,CAAQ;AAAA,EACxB;AAEA,SAAOmD,GAAYjC,CAAK,EAAE,KAAKkC,EAAY;AAC7C;AAEA,SAASD,GAAYjC,GAAkB;AACrC,QAAMhB,wBAAc,IAAA;AAEpB,aAAWmD,KAAWnC;AACpB,IAAAhB,EAAQ,IAAIoD,EAAQD,CAAO,GAAG;AAAA,MAC5B,GAAGnD,EAAQ,IAAIoD,EAAQD,CAAO,CAAC;AAAA,MAC/B,GAAGA;AAAA,IAAA,CACJ;AAGH,SAAO,CAAC,GAAGnD,EAAQ,QAAQ;AAC7B;AAEA,SAASoD,EAAQD,GAAkB;AACjC,SAAO;AAAA,IACLA,EAAQ;AAAA,IACRA,EAAQ;AAAA,IACRA,EAAQ,MAAM;AAAA,IACdA,EAAQ,QAAQ;AAAA,IAChBA,EAAQ,eAAe;AAAA,EAAA,EACvB,KAAK,IAAI;AACb;AAEA,SAASD,GAAa/C,GAAeC,GAAgB;AACnD,SAAOiD,EAAalD,EAAK,GAAG,IAAIkD,EAAajD,EAAM,GAAG,KACpDD,EAAK,KAAK,cAAcC,EAAM,IAAI;AACtC;AAEA,SAASiD,EAAaC,GAAa;AACjC,SAAIA,MAAQ,eACH,IAGLA,MAAQ,YACH,IAGLA,MAAQ,kBACH,IAGF;AACT;AC1GO,SAASC,GACdC,GACA3D,GACA;AACA,QAAM4D,IAAOrE,EAAcoE,EAAM,MAAM;AAAA,IACrC,MAAMA,EAAM;AAAA,IACZ,MAAMA,EAAM;AAAA,IACZ,UAAUA,EAAM;AAAA,EAAA,CACjB,GAEKE,IAAOF,EAAM,QAAQ;AAAA,IACzB,CAAC9D,GAAUiE,MACTvE,EAAcuE,GAAQ;AAAA,MACpB,UAAAjE;AAAA,MACA,MAAM8D,EAAM;AAAA,MACZ,UAAUA,EAAM;AAAA,IAAA,CACjB;AAAA,IACHC;AAAA,EAAA;AAGF,SAAO5D,IAAUJ,GAAkBI,GAAS6D,CAAI,IAAIA;AACtD;AAEO,SAASE,GACdJ,GACApI,IAA6C,IAC7C;AACA,SAAO6C,GAA0B;AAAA,IAC/B,KAAK7C,EAAQ;AAAA,IACb,OAAOA,EAAQ;AAAA,IACf,SAASoI,EAAM;AAAA,EAAA,CAChB;AACH;ACnBO,SAASK,GACdL,GACApI,IAA4B,IAC5B;AACA,QAAMyE,IAAU+D,GAAwBJ,GAAOpI,CAAO,GAChDoF,IAAOsD,EAAeP,GAAqBC,GAAO3D,CAAO,CAAC;AAEhE,SAAOU,GAAe;AAAA,IACpB,MAAM;AAAA,MACJ,MAAMiD,EAAM;AAAA,MACZ,MAAAhD;AAAA,MACA,YAAYgD,EAAM,OAAO,SAAS,WAC9B,aACApI,EAAQ;AAAA,IAAA;AAAA,IAEd,UAAUA,EAAQ;AAAA,IAClB,MAAMA,EAAQ;AAAA,IACd,OAAOoI,EAAM;AAAA,IACb,UAAUA,EAAM;AAAA,IAChB,OAAOpI,EAAQ;AAAA,IACf,SAASyE,EAAQ,QAAA;AAAA,IACjB,QAAQzE,EAAQ;AAAA,IAChB,OAAOA,EAAQ;AAAA,EAAA,CAChB;AACH;AAEO,SAAS2I,GACdP,GACApI,IAA4B,IAC5B;AACA,QAAMoF,IAAOqD,GAAmBL,GAAOpI,CAAO;AAE9C,SAAO,IAAI,SAASoF,GAAM;AAAA,IACxB,SAAS;AAAA,MACP,gBAAgB;AAAA,IAAA;AAAA,EAClB,CACD;AACH;ACtDA,MAAMwD,wBAAyB,QAAA;AAExB,SAASC,GAA6BC,GAAkB;AAC7D,SAAOF,EAAmB,IAAIE,CAAO;AACvC;AAEO,SAASC,GACdD,GACAjD,GACA;AACA,EAAA+C,EAAmB,IAAIE,GAASjD,CAAQ;AAC1C;AAEO,SAASmD,GAA8BC,GAAeC,GAAa;AACxE,QAAMrD,IAAW+C,EAAmB,IAAIK,CAAI;AAE5C,EAAIpD,KACF+C,EAAmB,IAAIM,GAAIrD,CAAQ;AAEvC;"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
const t = /-[A-Za-z0-9_-]{8,}\.[A-Za-z0-9]+$/, e = "public, max-age=31536000, immutable", E = "public, max-age=0, must-revalidate";
|
|
2
|
-
function s(a) {
|
|
3
|
-
return t.test(a);
|
|
4
|
-
}
|
|
5
|
-
export {
|
|
6
|
-
t as C,
|
|
7
|
-
e as I,
|
|
8
|
-
E as R,
|
|
9
|
-
s as i
|
|
10
|
-
};
|
|
11
|
-
//# sourceMappingURL=static-files-DUjHw-4H.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static-files-DUjHw-4H.js","sources":["../../src/static-files.ts"],"sourcesContent":["export const CONTENT_HASHED_FILE_NAME_PATTERN =\n /-[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9]+$/;\n\nexport const IMMUTABLE_FILE_CACHE_CONTROL =\n \"public, max-age=31536000, immutable\";\n\nexport const REVALIDATED_FILE_CACHE_CONTROL =\n \"public, max-age=0, must-revalidate\";\n\nexport function isContentHashedFileName(fileName: string) {\n return CONTENT_HASHED_FILE_NAME_PATTERN.test(fileName);\n}\n"],"names":["CONTENT_HASHED_FILE_NAME_PATTERN","IMMUTABLE_FILE_CACHE_CONTROL","REVALIDATED_FILE_CACHE_CONTROL","isContentHashedFileName","fileName"],"mappings":"AAAO,MAAMA,IACX,qCAEWC,IACX,uCAEWC,IACX;AAEK,SAASC,EAAwBC,GAAkB;AACxD,SAAOJ,EAAiC,KAAKI,CAAQ;AACvD;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streaming-D0fGAuiO.js","sources":["../../src/node/http.ts","../../src/node/font.ts","../../src/node/image.ts","../../src/node/streaming.ts"],"sourcesContent":["import { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { isIP } from \"node:net\";\nimport type {\n IncomingHttpHeaders,\n IncomingMessage,\n ServerResponse,\n} from \"node:http\";\nimport { setRequestConnectionMetadata } from \"../server/request-metadata\";\n\nexport type HttpScheme = \"http\" | \"https\";\n\nexport type NodeOriginPolicy = {\n allowedHosts: readonly string[];\n trustProxy?: TrustProxy;\n};\n\nexport type ToWebRequestOptions = NodeOriginPolicy & {\n signal?: AbortSignal;\n};\n\nexport type TrustProxy =\n | false\n | { hops: number }\n | { ranges: readonly string[] };\n\nconst forwardedHeaders = {\n for: \"x-forwarded-for\",\n host: \"x-forwarded-host\",\n protocol: \"x-forwarded-proto\",\n} as const satisfies Record<\"for\" | \"host\" | \"protocol\", string>;\nconst defaultTrustProxy = false satisfies TrustProxy;\n\n// The Fetch specification prohibits these methods in the `Request` constructor.\n// `new Request(...)` throws for them. Without this guard, an unauthenticated\n// client can make a generic 500 response and add stack traces to the server log.\nconst forbiddenMethods = new Set([\"CONNECT\", \"TRACE\", \"TRACK\"]);\n\nexport class UnsupportedMethodError extends Error {\n method: string;\n\n constructor(method: string) {\n super(`HTTP method \"${method}\" is not supported.`);\n this.method = method;\n this.name = \"UnsupportedMethodError\";\n }\n}\n\nexport class UntrustedHostError extends Error {\n host: string;\n\n constructor(host: string) {\n super(`HTTP host \"${host}\" is not allowed.`);\n this.host = host;\n this.name = \"UntrustedHostError\";\n }\n}\n\nexport function validateNodeOriginPolicy(policy: NodeOriginPolicy) {\n if (policy.allowedHosts.length === 0) {\n throw new Error(\"Demiurge Node allowedHosts must contain at least one host.\");\n }\n\n for (const host of policy.allowedHosts) {\n if (!parseAuthority(host)) {\n throw new Error(`Demiurge Node allowed host \"${host}\" is invalid.`);\n }\n }\n\n const trustProxy = policy.trustProxy ?? defaultTrustProxy;\n\n if (trustProxy === false) {\n return;\n }\n\n if (\"hops\" in trustProxy) {\n if (!Number.isSafeInteger(trustProxy.hops) || trustProxy.hops < 0) {\n throw new Error(\n \"Demiurge Node trustProxy hop count must be a non-negative integer.\",\n );\n }\n\n return;\n }\n\n for (const range of trustProxy.ranges) {\n const network = range.split(\"/\")[0];\n ipMatchesRange(network, range);\n }\n}\n\nexport function toWebRequest(\n request: IncomingMessage,\n options: ToWebRequestOptions,\n) {\n validateNodeOriginPolicy(options);\n const method = request.method ?? \"GET\";\n\n if (forbiddenMethods.has(method.toUpperCase())) {\n throw new UnsupportedMethodError(method);\n }\n\n const peerAddress = normalizeIpAddress(request.socket?.remoteAddress);\n const proxy = resolveProxyChain(\n peerAddress,\n request.headers[forwardedHeaders.for],\n options.trustProxy ?? defaultTrustProxy,\n );\n const forwardedProtocol = selectForwardedValue(\n request.headers[forwardedHeaders.protocol],\n proxy.forwardedDepth,\n );\n const protocol = resolveProtocol(request, forwardedProtocol);\n const host = selectForwardedValue(\n request.headers[forwardedHeaders.host],\n proxy.forwardedDepth,\n ) ?? request.headers.host;\n const authority = validateAllowedHost(host, options.allowedHosts);\n const origin = `${protocol}://${authority}`;\n const url = new URL(request.url ?? \"/\", origin);\n const init: RequestInit & { duplex?: \"half\" } = {\n headers: toHeaders(request.headers),\n method,\n signal: options.signal,\n };\n\n if (method !== \"GET\" && method !== \"HEAD\") {\n // TYPE-EVIDENCE: Readable.toWeb returns a web stream that matches the DOM ReadableStream body type.\n init.body = Readable.toWeb(request) as ReadableStream;\n init.duplex = \"half\";\n }\n\n const webRequest = new Request(url, init);\n setRequestConnectionMetadata(webRequest, { clientIp: proxy.clientIp });\n\n return webRequest;\n}\n\nfunction resolveProtocol(\n request: IncomingMessage,\n forwardedProtocol: string | undefined,\n) {\n if (forwardedProtocol) {\n const protocol = forwardedProtocol.toLowerCase();\n\n if (protocol !== \"http\" && protocol !== \"https\") {\n throw new Error(`Unsupported forwarded protocol \"${forwardedProtocol}\".`);\n }\n\n return protocol;\n }\n\n // TYPE-EVIDENCE: the socket may expose the encrypted flag that Node sets for TLS connections. The cast reads that optional flag.\n return (request.socket as { encrypted?: boolean } | undefined)?.encrypted\n ? \"https\"\n : \"http\";\n}\n\nfunction validateAllowedHost(\n host: string | undefined,\n allowedHosts: readonly string[],\n) {\n if (allowedHosts.length === 0) {\n throw new Error(\"Demiurge Node allowedHosts must contain at least one host.\");\n }\n\n if (!host) {\n throw new UntrustedHostError(\"\");\n }\n\n const authority = parseAuthority(host);\n\n if (!authority) {\n throw new UntrustedHostError(host);\n }\n\n const allowed = allowedHosts.some((candidate) => {\n const expected = parseAuthority(candidate);\n\n if (!expected) {\n throw new Error(`Demiurge Node allowed host \"${candidate}\" is invalid.`);\n }\n\n return expected.port\n ? expected.host === authority.host\n : expected.hostname === authority.hostname;\n });\n\n if (!allowed) {\n throw new UntrustedHostError(host);\n }\n\n return authority.host;\n}\n\nfunction parseAuthority(value: string) {\n if (value.trim() !== value || value.includes(\"@\")) {\n return null;\n }\n\n try {\n const parsed = new URL(`http://${value}`);\n\n if (\n !parsed.hostname ||\n parsed.pathname !== \"/\" ||\n parsed.search ||\n parsed.hash ||\n parsed.host.toLowerCase() !== value.toLowerCase()\n ) {\n return null;\n }\n\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction resolveProxyChain(\n peerAddress: string,\n forwardedFor: string | readonly string[] | undefined,\n trustProxy: TrustProxy,\n) {\n const forwarded = headerValues(forwardedFor);\n const chain = [...forwarded, peerAddress];\n\n if (trustProxy === false) {\n return { clientIp: peerAddress, forwardedDepth: 0 };\n }\n\n if (\"hops\" in trustProxy) {\n if (!Number.isSafeInteger(trustProxy.hops) || trustProxy.hops < 0) {\n throw new Error(\n \"Demiurge Node trustProxy hop count must be a non-negative integer.\",\n );\n }\n\n const clientHops = Math.min(trustProxy.hops, forwarded.length);\n\n return {\n clientIp: chain[chain.length - 1 - clientHops],\n forwardedDepth: trustProxy.hops,\n };\n }\n\n let index = chain.length - 1;\n let trustedHops = 0;\n\n while (\n index > 0 &&\n isAddressTrusted(chain[index], trustProxy.ranges)\n ) {\n index -= 1;\n trustedHops += 1;\n }\n\n return {\n clientIp: chain[index],\n forwardedDepth:\n trustedHops || (isAddressTrusted(peerAddress, trustProxy.ranges) ? 1 : 0),\n };\n}\n\nfunction selectForwardedValue(\n header: string | readonly string[] | undefined,\n trustedDepth: number,\n) {\n if (trustedDepth === 0) {\n return undefined;\n }\n\n const values = headerValues(header);\n\n if (values.length === 0) {\n return undefined;\n }\n\n return values[Math.max(0, values.length - trustedDepth)];\n}\n\nfunction headerValues(value: string | readonly string[] | undefined) {\n return (Array.isArray(value) ? value : [value])\n .flatMap((item) => item?.split(\",\") ?? [])\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction isAddressTrusted(address: string, ranges: readonly string[]) {\n return ranges.some((range) => ipMatchesRange(address, range));\n}\n\nfunction ipMatchesRange(address: string, range: string) {\n const [networkValue, prefixValue] = range.split(\"/\");\n const addressBytes = ipBytes(normalizeIpAddress(address));\n const networkBytes = ipBytes(normalizeIpAddress(networkValue));\n\n if (!addressBytes || !networkBytes || addressBytes.length !== networkBytes.length) {\n if (!networkBytes) {\n throw new Error(`Demiurge Node trustProxy range \"${range}\" is invalid.`);\n }\n\n return false;\n }\n\n const maximumPrefix = addressBytes.length * 8;\n const prefix = prefixValue === undefined ? maximumPrefix : Number(prefixValue);\n\n if (!Number.isInteger(prefix) || prefix < 0 || prefix > maximumPrefix) {\n throw new Error(`Demiurge Node trustProxy range \"${range}\" is invalid.`);\n }\n\n for (let bit = 0; bit < prefix; bit += 1) {\n const mask = 1 << (7 - (bit % 8));\n\n if ((addressBytes[Math.floor(bit / 8)] & mask) !==\n (networkBytes[Math.floor(bit / 8)] & mask)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction normalizeIpAddress(address: string | undefined) {\n if (!address) {\n return \"unknown\";\n }\n\n return address.startsWith(\"::ffff:\") ? address.slice(7) : address;\n}\n\nfunction ipBytes(address: string) {\n const version = isIP(address);\n\n if (version === 4) {\n return address.split(\".\").map(Number);\n }\n\n if (version !== 6) {\n return null;\n }\n\n const [left = \"\", right = \"\"] = address.split(\"::\");\n const leftGroups = left ? left.split(\":\") : [];\n const rightGroups = right ? right.split(\":\") : [];\n const missing = 8 - leftGroups.length - rightGroups.length;\n const groups = [\n ...leftGroups,\n ...Array.from({ length: missing }, () => \"0\"),\n ...rightGroups,\n ];\n\n return groups.flatMap((group) => {\n const value = Number.parseInt(group, 16);\n return [value >> 8, value & 255];\n });\n}\n\n// Shared by the Node adapter and the Vite dev middleware so a request the\n// Fetch layer cannot represent gets the same answer in both.\nexport function writeNotImplemented(serverResponse: ServerResponse) {\n serverResponse.statusCode = 501;\n serverResponse.setHeader(\"content-type\", \"text/plain; charset=utf-8\");\n serverResponse.end(\"Not Implemented\");\n}\n\nexport async function writeWebResponse(\n serverResponse: ServerResponse,\n webResponse: Response,\n) {\n // `Headers.forEach` joins repeated headers with a comma, which is wrong for\n // `set-cookie`: two cookies would arrive as one malformed header. Node's\n // `setHeader` takes an array for exactly this case.\n const cookies = getSetCookies(webResponse.headers);\n\n webResponse.headers.forEach((value, name) => {\n if (name === \"set-cookie\") {\n return;\n }\n\n serverResponse.setHeader(name, value);\n });\n\n if (cookies.length > 0) {\n serverResponse.setHeader(\"set-cookie\", cookies);\n }\n\n serverResponse.statusCode = webResponse.status;\n\n // An empty status text would otherwise overwrite Node's default reason\n // phrase with nothing at all.\n if (webResponse.statusText) {\n serverResponse.statusMessage = webResponse.statusText;\n }\n\n if (!webResponse.body) {\n serverResponse.end();\n return;\n }\n\n // `Readable.pipe()` does not destroy its source when the destination closes\n // or has an error. An aborted client can leave the source stream open. It can\n // also leave an associated file descriptor open. `pipeline` destroys the\n // source when either side closes.\n try {\n // TYPE-EVIDENCE: the DOM body stream matches the Node web stream shape that fromWeb reads.\n await pipeline(\n Readable.fromWeb(\n webResponse.body as import(\"node:stream/web\").ReadableStream,\n ),\n serverResponse,\n );\n } catch (error) {\n if (!isClientDisconnect(error)) {\n throw error;\n }\n }\n}\n\n// A client disconnect during a response is ordinary traffic, not a server\n// fault. A new throw would run the caller error path for each canceled download.\n// This path records a stack trace and creates an unused 500 response. An\n// unauthenticated client can cause this condition.\nconst clientDisconnectCodes = new Set([\n \"ECONNRESET\",\n \"EPIPE\",\n \"ERR_STREAM_DESTROYED\",\n \"ERR_STREAM_PREMATURE_CLOSE\",\n]);\n\nfunction isClientDisconnect(error: unknown) {\n return (\n error instanceof Error &&\n \"code\" in error &&\n typeof error.code === \"string\" &&\n clientDisconnectCodes.has(error.code)\n );\n}\n\nexport function toHeaders(headers: IncomingHttpHeaders) {\n const nextHeaders = new Headers();\n\n for (const [name, value] of Object.entries(headers)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n nextHeaders.append(name, item);\n }\n continue;\n }\n\n if (value) {\n nextHeaders.set(name, value);\n }\n }\n\n return nextHeaders;\n}\n\nfunction getSetCookies(headers: Headers) {\n // TYPE-EVIDENCE: the getSetCookie method is a vendor extension present in some server runtimes. The cast reads that optional method for the runtime check.\n const getSetCookie = (headers as Headers & {\n getSetCookie?: () => string[];\n }).getSetCookie;\n\n if (getSetCookie) {\n return getSetCookie.call(headers);\n }\n\n const combined = headers.get(\"set-cookie\");\n\n return combined ? splitSetCookies(combined) : [];\n}\n\nfunction splitSetCookies(value: string) {\n return value.split(/,\\s*(?=[^;,=\\s]+\\s*=)/);\n}\n","import { createHash } from \"node:crypto\";\nimport {\n resolveFontAssets,\n type FontAsset,\n type FontAssetOptions,\n} from \"../platform/font-assets\";\nimport { defaultFontPath } from \"../platform/fonts\";\nimport { REVALIDATED_FILE_CACHE_CONTROL } from \"../static-files\";\nimport type { StaticFileHandler } from \"./static\";\n\nexport type FontAssetHandlerOptions = FontAssetOptions;\n\n// The handler answers the self-hosted font URLs that the document declares.\n// It returns null for every other path, so it composes with the static file\n// handler and the route pipeline. The image optimizer composes the same way.\nexport function createFontAssetHandler(\n options: FontAssetHandlerOptions,\n): StaticFileHandler {\n const basePath = options.basePath ?? defaultFontPath;\n let pending: Promise<Map<string, FontAsset>> | undefined;\n\n return async function handleFontRequest(request) {\n const url = new URL(request.url);\n\n if (!url.pathname.startsWith(`${basePath}/`)) {\n return null;\n }\n\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return new Response(\"Method Not Allowed\", {\n headers: {\n allow: \"GET, HEAD\",\n \"content-type\": \"text/plain; charset=utf-8\",\n },\n status: 405,\n });\n }\n\n pending ??= loadAssets();\n\n let assets: Map<string, FontAsset>;\n\n try {\n assets = await pending;\n } catch (error) {\n pending = undefined;\n throw error;\n }\n\n const asset = assets.get(url.pathname);\n\n return asset ? respond(request, asset) : null;\n };\n\n async function loadAssets() {\n const assets = await resolveFontAssets({ ...options, basePath });\n\n return new Map(assets.map((asset) => [asset.url, asset]));\n }\n}\n\n// A font URL names the family, the weight, and the style rather than the\n// content of the file. A strong entity tag keeps a replaced file cheap to\n// revalidate, the same trade the image optimizer makes.\nfunction respond(request: Request, asset: FontAsset) {\n const etag = `\"${createHash(\"sha256\").update(asset.body).digest(\"base64url\").slice(0, 27)}\"`;\n const headers = new Headers({\n \"cache-control\": REVALIDATED_FILE_CACHE_CONTROL,\n \"content-type\": asset.contentType,\n etag,\n });\n\n if (request.headers.get(\"if-none-match\") === etag) {\n return new Response(null, { headers, status: 304 });\n }\n\n headers.set(\"content-length\", String(asset.body.byteLength));\n\n // TYPE-EVIDENCE: the font body is an ArrayBuffer-backed view that the DOM body type accepts.\n return new Response(\n request.method === \"HEAD\" ? null : (asset.body as Uint8Array<ArrayBuffer>),\n { headers, status: 200 },\n );\n}\n","import { readFile } from \"node:fs/promises\";\nimport { relative, resolve, sep } from \"node:path\";\nimport {\n negotiateImageFormat,\n transformImage,\n type EncodedImage,\n} from \"../platform/image-codec\";\nimport { defaultImageOptimizerPath } from \"../platform/image-url\";\nimport type { ImageVariantDescriptor } from \"../platform/image-url\";\nimport {\n isAllowedImageSource,\n parseImageOptimizerRequest,\n} from \"../platform/images\";\nimport type { ImagePolicy } from \"../platform/images\";\nimport type { StaticFileHandler } from \"./static\";\nimport { REVALIDATED_FILE_CACHE_CONTROL } from \"../static-files\";\n\nexport type ImageOptimizerFetch = (\n input: string,\n init?: { signal?: AbortSignal },\n) => Promise<Response>;\n\nexport type ImageOptimizerOptions = {\n // The number of encoded variants that stay in memory. The optimizer keeps\n // the most recent request at the front.\n cacheSize?: number;\n fetch?: ImageOptimizerFetch;\n policy?: ImagePolicy;\n // Maps a static loader variant path back to the transform behind it. The\n // development server passes the recorded plans, so a page renders the same\n // URL in development and in the static build.\n resolveVariant?: (pathname: string) => ImageVariantDescriptor | undefined;\n // The directory that holds every local source image, normally the client\n // build output.\n root: string;\n};\n\nconst defaultCacheSize = 64;\nconst maximumRemoteImageBytes = 20 * 1024 * 1024;\n\n// The optimizer answers the same URL that `planImageTransform` writes. It\n// returns null for every other path, so it composes with the static file\n// handler and the route pipeline.\nexport function createImageOptimizer(\n options: ImageOptimizerOptions,\n): StaticFileHandler {\n const root = resolve(options.root);\n const policy = options.policy ?? {};\n const optimizerPath = policy.optimizerPath ?? defaultImageOptimizerPath;\n const cacheSize = options.cacheSize ?? defaultCacheSize;\n const load = options.fetch ?? ((input, init) => fetch(input, init));\n const cache = new Map<string, EncodedImage>();\n\n return async function handleImageRequest(request) {\n const url = new URL(request.url);\n const variant = url.pathname === optimizerPath\n ? undefined\n : options.resolveVariant?.(url.pathname);\n\n if (url.pathname !== optimizerPath && !variant) {\n return null;\n }\n\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return plainText(405, \"Method Not Allowed\", {\n allow: \"GET, HEAD\",\n });\n }\n\n if (variant && !isAllowedImageSource(variant.src, policy)) {\n return plainText(403, \"The image policy does not allow this image source.\");\n }\n\n const parsed = variant\n ? ({ descriptor: variant, ok: true } as const)\n : parseImageOptimizerRequest(url, policy);\n\n if (!parsed.ok) {\n return plainText(parsed.rejection.status, parsed.rejection.reason);\n }\n\n const format = negotiateImageFormat(\n parsed.descriptor,\n variant ? null : request.headers.get(\"accept\"),\n );\n const key = `${format}|${url.pathname}${url.search}`;\n let encoded = cache.get(key);\n\n if (encoded) {\n cache.delete(key);\n } else {\n const source = await readSource(parsed.descriptor);\n\n if (!source) {\n return plainText(404, \"The image source does not exist.\");\n }\n\n encoded = await transformImage(source, {\n format,\n quality: parsed.descriptor.quality,\n width: parsed.descriptor.width,\n });\n }\n\n cache.set(key, encoded);\n\n while (cache.size > cacheSize) {\n // TYPE-EVIDENCE: the loop runs only while the cache holds an entry. The next key therefore exists as a string.\n cache.delete(cache.keys().next().value as string);\n }\n\n return respond(\n request,\n encoded,\n !variant && parsed.descriptor.format === \"auto\",\n );\n };\n\n async function readSource(descriptor: ImageVariantDescriptor) {\n if (descriptor.sourceKind === \"remote\") {\n const response = await load(descriptor.src);\n\n if (!response.ok) {\n return undefined;\n }\n\n const body = new Uint8Array(await response.arrayBuffer());\n\n return body.byteLength > maximumRemoteImageBytes ? undefined : body;\n }\n\n const file = resolveLocalFile(root, descriptor.src);\n\n if (!file) {\n return undefined;\n }\n\n try {\n return new Uint8Array(await readFile(file));\n } catch {\n return undefined;\n }\n }\n}\n\n// The URL carries the source path rather than a content hash, so a long\n// immutable lifetime would outlive a replaced source file. A strong entity\n// tag keeps the revalidation cheap instead.\nfunction respond(request: Request, encoded: EncodedImage, varyOnAccept: boolean) {\n const etag = `\"${weakHash(encoded.body)}\"`;\n const headers = new Headers({\n \"cache-control\": REVALIDATED_FILE_CACHE_CONTROL,\n \"content-type\": encoded.contentType,\n etag,\n });\n\n if (varyOnAccept) {\n headers.set(\"vary\", \"accept\");\n }\n\n if (request.headers.get(\"if-none-match\") === etag) {\n return new Response(null, { headers, status: 304 });\n }\n\n headers.set(\"content-length\", String(encoded.body.byteLength));\n\n // TYPE-EVIDENCE: the encoded body is an ArrayBuffer-backed view that the DOM body type accepts.\n return new Response(\n request.method === \"HEAD\" ? null : (encoded.body as Uint8Array<ArrayBuffer>),\n { headers, status: 200 },\n );\n}\n\nfunction plainText(\n status: number,\n body: string,\n extraHeaders: Record<string, string> = {},\n) {\n return new Response(body, {\n headers: { \"content-type\": \"text/plain; charset=utf-8\", ...extraHeaders },\n status,\n });\n}\n\nfunction resolveLocalFile(root: string, src: string) {\n let decoded: string;\n\n try {\n decoded = decodeURIComponent(src.split(\"?\")[0]!.split(\"#\")[0]!);\n } catch {\n return undefined;\n }\n\n if (decoded.split(/[\\\\/]/).includes(\"..\")) {\n return undefined;\n }\n\n const file = resolve(root, `.${decoded}`);\n\n return relative(root, file).split(sep).includes(\"..\") ? undefined : file;\n}\n\nfunction weakHash(body: Uint8Array) {\n let low = 0x811c9dc5;\n let high = 0x01000193;\n\n for (const byte of body) {\n low = Math.imul(low ^ byte, 0x01000193) >>> 0;\n high = Math.imul(high ^ byte, 0x85ebca6b) >>> 0;\n }\n\n return `${low.toString(36)}${high.toString(36)}${body.byteLength.toString(36)}`;\n}\n","import { Transform } from \"node:stream\";\nimport { renderToPipeableStream } from \"react-dom/server\";\nimport type { LoadedRouteMatch } from \"../router\";\nimport { createDocumentShell } from \"../server/document-shell\";\nimport { createPageRenderTree } from \"../server/render-tree\";\nimport { createPageScriptContext } from \"../server/render-tree\";\nimport {\n renderPageResponse,\n type SsrRenderOptions,\n} from \"../server/ssr\";\n\nexport function renderNodePageResponse(\n match: LoadedRouteMatch,\n options: SsrRenderOptions = {},\n) {\n return match.render.mode === \"streaming\"\n ? renderStreamingPageResponse(match, options)\n : renderPageResponse(match, options);\n}\n\nexport async function renderStreamingPageResponse(\n match: LoadedRouteMatch,\n options: SsrRenderOptions = {},\n) {\n if (options.signal?.aborted) {\n throw options.signal.reason;\n }\n\n const scripts = createPageScriptContext(match, options);\n const content = createPageRenderTree(match, scripts);\n\n return await new Promise<Response>((resolveResponse, rejectResponse) => {\n let completed = false;\n let cancelled = false;\n let responseCommitted = false;\n let documentSuffix = \"\";\n // TYPE-EVIDENCE: undefined is a member of the declared union type. The cast only makes the variable type explicit.\n let stream = undefined as ReturnType<typeof renderToPipeableStream> | undefined;\n const documentStream = new Transform({\n destroy(error, callback) {\n if (!completed) {\n cancelled = true;\n }\n\n callback(error);\n },\n flush(callback) {\n callback(null, documentSuffix);\n },\n transform(chunk, _encoding, callback) {\n callback(null, chunk);\n },\n });\n const abort = () => {\n cancelled = true;\n stream?.abort(options.signal?.reason);\n documentStream.destroy();\n };\n const cleanup = () => options.signal?.removeEventListener(\"abort\", abort);\n\n documentStream.once(\"finish\", () => {\n completed = true;\n });\n documentStream.once(\"close\", () => {\n cleanup();\n\n if (!completed) {\n cancelled = true;\n stream?.abort(new Error(\"Demiurge streaming response was cancelled.\"));\n }\n });\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n\n stream = renderToPipeableStream(content, {\n nonce: options.nonce,\n onError(error) {\n if (responseCommitted && !cancelled) {\n options.onStreamError?.(error);\n }\n },\n onShellError(error) {\n cleanup();\n rejectResponse(error);\n },\n onShellReady() {\n void (async () => {\n try {\n const shell = await createDocumentShell(match, {\n ...options,\n scripts: scripts.scripts(),\n });\n documentSuffix = shell.suffix;\n scripts.flushHead();\n documentStream.push(shell.prefix);\n responseCommitted = true;\n stream?.pipe(documentStream);\n resolveResponse(\n new Response(toWebReadableStream(documentStream), {\n headers: { \"content-type\": \"text/html; charset=utf-8\" },\n }),\n );\n } catch (error) {\n cleanup();\n stream?.abort(error);\n documentStream.destroy();\n rejectResponse(error);\n }\n })();\n },\n });\n });\n}\n\nexport function toWebReadableStream(stream: Transform) {\n let closed = false;\n let removeListeners = () => {};\n\n return new ReadableStream<Uint8Array>({\n cancel() {\n closed = true;\n removeListeners();\n stream.pause();\n stream.destroy();\n },\n pull() {\n stream.resume();\n },\n start(controller) {\n stream.on(\"data\", onData);\n stream.once(\"end\", onEnd);\n stream.once(\"error\", onError);\n stream.once(\"close\", onClose);\n\n function onData(chunk: Buffer) {\n if (closed) {\n return;\n }\n\n controller.enqueue(Uint8Array.from(chunk));\n\n if ((controller.desiredSize ?? 1) <= 0) {\n stream.pause();\n }\n }\n\n function onEnd() {\n if (!closed) {\n closed = true;\n cleanup();\n controller.close();\n }\n }\n\n function onError(error: Error) {\n if (!closed) {\n closed = true;\n cleanup();\n controller.error(error);\n }\n }\n\n function onClose() {\n if (!closed) {\n closed = true;\n cleanup();\n controller.close();\n }\n }\n\n function cleanup() {\n stream.off(\"data\", onData);\n stream.off(\"end\", onEnd);\n stream.off(\"error\", onError);\n stream.off(\"close\", onClose);\n }\n\n removeListeners = cleanup;\n },\n });\n}\n"],"names":["forwardedHeaders","defaultTrustProxy","forbiddenMethods","UnsupportedMethodError","method","UntrustedHostError","host","validateNodeOriginPolicy","policy","parseAuthority","trustProxy","range","network","ipMatchesRange","toWebRequest","request","options","peerAddress","normalizeIpAddress","proxy","resolveProxyChain","forwardedProtocol","selectForwardedValue","protocol","resolveProtocol","authority","validateAllowedHost","origin","url","init","toHeaders","Readable","webRequest","setRequestConnectionMetadata","allowedHosts","candidate","expected","value","parsed","forwardedFor","forwarded","headerValues","chain","clientHops","index","trustedHops","isAddressTrusted","header","trustedDepth","values","item","address","ranges","networkValue","prefixValue","addressBytes","ipBytes","networkBytes","maximumPrefix","prefix","bit","mask","version","isIP","left","right","leftGroups","rightGroups","missing","group","writeNotImplemented","serverResponse","writeWebResponse","webResponse","cookies","getSetCookies","name","pipeline","error","isClientDisconnect","clientDisconnectCodes","headers","nextHeaders","getSetCookie","combined","splitSetCookies","createFontAssetHandler","basePath","defaultFontPath","pending","loadAssets","assets","asset","respond","resolveFontAssets","etag","createHash","REVALIDATED_FILE_CACHE_CONTROL","defaultCacheSize","maximumRemoteImageBytes","createImageOptimizer","root","resolve","optimizerPath","defaultImageOptimizerPath","cacheSize","load","input","cache","variant","plainText","isAllowedImageSource","parseImageOptimizerRequest","format","negotiateImageFormat","key","encoded","source","readSource","transformImage","descriptor","response","body","file","resolveLocalFile","readFile","varyOnAccept","weakHash","status","extraHeaders","src","decoded","relative","sep","low","high","byte","renderNodePageResponse","match","renderStreamingPageResponse","renderPageResponse","scripts","createPageScriptContext","content","createPageRenderTree","resolveResponse","rejectResponse","completed","cancelled","responseCommitted","documentSuffix","stream","documentStream","Transform","callback","chunk","_encoding","abort","cleanup","renderToPipeableStream","shell","createDocumentShell","toWebReadableStream","closed","removeListeners","controller","onData","onEnd","onError","onClose"],"mappings":"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"}
|