@demiurgejs/core 0.2.0-beta.3 → 0.2.0-beta.5
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 +36 -11
- package/bin/demiurge.mjs +47 -13
- package/dist/adapter/index.d.ts +1 -1
- package/dist/adapter/index.d.ts.map +1 -1
- 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-9GPwtcTt.js +36 -0
- package/dist/chunks/document-shell-9GPwtcTt.js.map +1 -0
- package/dist/chunks/{image-codec-Di53WpcH.js → image-codec-Dh1POFhE.js} +2 -2
- package/dist/chunks/{image-codec-Di53WpcH.js.map → image-codec-Dh1POFhE.js.map} +1 -1
- package/dist/chunks/{images-Edar3eU1.js → images-CG7ZzayG.js} +99 -91
- package/dist/chunks/images-CG7ZzayG.js.map +1 -0
- package/dist/chunks/index-0MNiR_wo.js +833 -0
- package/dist/chunks/index-0MNiR_wo.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-BZauDxRY.js +2310 -0
- package/dist/chunks/plugin-BZauDxRY.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-GYIsVTQH.js +560 -0
- package/dist/chunks/streaming-GYIsVTQH.js.map +1 -0
- package/dist/chunks/testing-CUwGj2ie.js +4751 -0
- package/dist/chunks/testing-CUwGj2ie.js.map +1 -0
- package/dist/chunks/vite-QoqrGl6f.js +259 -0
- package/dist/chunks/vite-QoqrGl6f.js.map +1 -0
- package/dist/cli.d.ts +19 -25
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +289 -128
- 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 +74 -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 +1883 -692
- package/dist/index.js.map +1 -1
- package/dist/inspect/command.d.ts +28 -0
- package/dist/inspect/command.d.ts.map +1 -0
- package/dist/inspect/index.d.ts +9 -0
- package/dist/inspect/index.d.ts.map +1 -0
- package/dist/inspect/redact.d.ts +35 -0
- package/dist/inspect/redact.d.ts.map +1 -0
- package/dist/inspect/report.d.ts +24 -0
- package/dist/inspect/report.d.ts.map +1 -0
- package/dist/inspect/types.d.ts +102 -0
- package/dist/inspect/types.d.ts.map +1 -0
- package/dist/internal/testing.js +5 -5
- 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/http.d.ts +5 -0
- package/dist/node/http.d.ts.map +1 -1
- package/dist/node/image.d.ts.map +1 -1
- package/dist/node/index.d.ts +4 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +257 -182
- 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 +3 -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/serialization.d.ts +24 -0
- package/dist/route/serialization.d.ts.map +1 -0
- package/dist/route/types.d.ts +6 -1
- package/dist/route/types.d.ts.map +1 -1
- package/dist/route/webhook.d.ts +6 -1
- package/dist/route/webhook.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/audit.d.ts +2 -1
- package/dist/security/audit.d.ts.map +1 -1
- package/dist/security/authorization.d.ts +36 -0
- package/dist/security/authorization.d.ts.map +1 -0
- 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 +13 -0
- package/dist/security/env-startup.d.ts.map +1 -0
- package/dist/security/env.d.ts +49 -11
- package/dist/security/env.d.ts.map +1 -1
- package/dist/security/exceptions.d.ts +29 -0
- package/dist/security/exceptions.d.ts.map +1 -0
- package/dist/security/finding-codes.d.ts +56 -0
- package/dist/security/finding-codes.d.ts.map +1 -0
- package/dist/security/index.d.ts +14 -3
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/policy.d.ts +2 -5
- package/dist/security/policy.d.ts.map +1 -1
- package/dist/security/report.d.ts +2 -1
- package/dist/security/report.d.ts.map +1 -1
- package/dist/security/request.d.ts +1 -0
- package/dist/security/request.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 +139 -5
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/upload.d.ts +3 -3
- package/dist/security/upload.d.ts.map +1 -1
- package/dist/security/verification.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 +7 -2
- 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/server-only/browser.d.ts +2 -0
- package/dist/server-only/browser.d.ts.map +1 -0
- package/dist/server-only/browser.js +4 -0
- package/dist/server-only/browser.js.map +1 -0
- package/dist/server-only/index.d.ts +2 -0
- package/dist/server-only/index.d.ts.map +1 -0
- package/dist/server-only/index.js +2 -0
- package/dist/server-only/index.js.map +1 -0
- 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 +13 -6
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +29 -1560
- package/dist/vite/index.js.map +1 -1
- package/dist/vite/plugin.d.ts +24 -3
- package/dist/vite/plugin.d.ts.map +1 -1
- package/dist/vite/policy-verification.d.ts +33 -2
- package/dist/vite/policy-verification.d.ts.map +1 -1
- package/dist/vite/route-audit.d.ts +14 -2
- package/dist/vite/route-audit.d.ts.map +1 -1
- package/dist/vite/server-only-boundary.d.ts +8 -0
- package/dist/vite/server-only-boundary.d.ts.map +1 -0
- package/package.json +24 -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 +0 -469
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing-CUwGj2ie.js","sources":["../../src/document/metadata.ts","../../src/data/cache.ts","../../src/route/serialization.ts","../../src/router/manifest.ts","../../src/router/navigation-data.ts","../../src/type-guards.ts","../../src/routing/types.ts","../../src/routing/locale.ts","../../src/route/response.ts","../../src/route/mutation.ts","../../src/route/http-error.ts","../../src/server/fallbacks.tsx","../../src/server/negotiate.ts","../../src/server/problem.ts","../../src/server/errors.ts","../../src/security/authorization.ts","../../src/security/exceptions.ts","../../src/security/policy.ts","../../src/security/cors.ts","../../src/security/request.ts","../../src/security/audit.ts","../../src/security/csrf.ts","../../src/security/fetch-metadata.ts","../../src/security/env.ts","../../src/security/env-startup.ts","../../src/security/rate-limit.ts","../../src/security/verification.ts","../../src/server/not-found.ts","../../src/server/request-handler.ts"],"sourcesContent":["export type MetadataTitle =\n | string\n | {\n default?: string;\n format?: (title: string) => string;\n };\n\nexport type RobotsMetadata = {\n follow?: boolean;\n index?: boolean;\n};\n\nexport type OpenGraphMetadata = {\n description?: string;\n image?: string;\n title?: string;\n};\n\nexport type MetaTag = {\n content: string;\n kind: \"meta\";\n name?: string;\n property?: string;\n};\n\nexport type LinkTag = {\n as?: string;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n href: string;\n hrefLang?: string;\n kind: \"link\";\n rel: string;\n type?: string;\n};\n\nexport type StructuredDataValue =\n | boolean\n | null\n | number\n | string\n | readonly StructuredDataValue[]\n | { readonly [key: string]: StructuredDataValue };\n\nexport type StructuredDataTag = {\n kind: \"structured-data\";\n value: StructuredDataValue;\n};\n\nexport type Metadata = {\n canonical?: string;\n custom?: readonly DocumentMetadataTag[];\n description?: string;\n openGraph?: OpenGraphMetadata;\n robots?: RobotsMetadata;\n structuredData?: readonly StructuredDataTag[];\n title?: MetadataTitle;\n};\n\nexport type DocumentMetadataTag = LinkTag | MetaTag;\n\nexport type ResolvedMetadata = {\n canonical?: string;\n charset: \"utf-8\";\n custom: DocumentMetadataTag[];\n description?: string;\n openGraph?: OpenGraphMetadata;\n robots?: RobotsMetadata;\n structuredData: StructuredDataTag[];\n title?: string;\n viewport: \"width=device-width, initial-scale=1\";\n};\n\nexport type LocalizedMetadataAlternate = {\n href: string;\n hrefLang: string;\n};\n\nexport function applyLocalizedMetadata(\n metadata: ResolvedMetadata,\n options: {\n alternates: readonly LocalizedMetadataAlternate[];\n canonical: string;\n },\n): ResolvedMetadata {\n const canonical = normalizeMetadataUrl(options.canonical);\n if (\n metadata.canonical &&\n normalizeMetadataUrl(metadata.canonical, canonical) !== canonical\n ) {\n throw new Error(\n `Localized metadata canonical URL ${JSON.stringify(metadata.canonical)} conflicts with ${JSON.stringify(options.canonical)}.`,\n );\n }\n\n const applicationAlternates = metadata.custom.filter(\n (tag): tag is LinkTag => tag.kind === \"link\" && tag.rel.toLowerCase() === \"alternate\" && Boolean(tag.hrefLang),\n );\n const byLanguage = new Map<string, string>();\n const byUrl = new Map<string, string>();\n\n for (const alternate of [...options.alternates, ...applicationAlternates]) {\n const language = alternate.hrefLang!.toLowerCase();\n const url = normalizeMetadataUrl(alternate.href, canonical);\n const languageUrl = byLanguage.get(language);\n const urlLanguage = byUrl.get(url);\n if (languageUrl && languageUrl !== url) {\n throw new Error(`Localized metadata language ${JSON.stringify(alternate.hrefLang)} has conflicting URLs.`);\n }\n if (\n urlLanguage &&\n urlLanguage !== language &&\n urlLanguage !== \"x-default\" &&\n language !== \"x-default\"\n ) {\n throw new Error(`Localized metadata URL ${JSON.stringify(alternate.href)} has conflicting languages.`);\n }\n byLanguage.set(language, url);\n byUrl.set(url, language);\n }\n\n const nonAlternate = metadata.custom.filter(\n (tag) => !(tag.kind === \"link\" && tag.rel.toLowerCase() === \"alternate\" && tag.hrefLang),\n );\n\n return {\n ...metadata,\n canonical,\n custom: [\n ...nonAlternate,\n ...[...byLanguage].map(([hrefLang, href]) => link({ href, hrefLang, rel: \"alternate\" })),\n ],\n };\n}\n\nfunction normalizeMetadataUrl(value: string, base?: string) {\n try {\n return new URL(value, base).href;\n } catch {\n throw new Error(`Localized metadata URL must be an absolute or root-relative URL: ${JSON.stringify(value)}.`);\n }\n}\n\nexport function defineMetadata(metadata: Metadata) {\n return metadata;\n}\n\nexport function meta(tag: Omit<MetaTag, \"kind\">): MetaTag {\n return {\n ...tag,\n kind: \"meta\",\n };\n}\n\nexport function link(tag: Omit<LinkTag, \"kind\">): LinkTag {\n return {\n ...tag,\n kind: \"link\",\n };\n}\n\nexport function structuredData(value: StructuredDataValue): StructuredDataTag {\n return {\n kind: \"structured-data\",\n value,\n };\n}\n\nexport function resolveMetadata(\n ...metadataEntries: Array<Metadata | false | undefined>\n): ResolvedMetadata {\n const state: MetadataState = {\n custom: [],\n structuredData: [],\n };\n\n for (const metadata of metadataEntries) {\n if (!metadata) {\n continue;\n }\n\n applyMetadata(state, metadata);\n }\n\n const title = resolveTitle(state);\n const description = state.description;\n const openGraph = resolveOpenGraph(state.openGraph, title, description);\n\n return {\n canonical: state.canonical,\n charset: \"utf-8\",\n custom: state.custom,\n description,\n openGraph,\n robots: state.robots,\n structuredData: state.structuredData,\n title,\n viewport: \"width=device-width, initial-scale=1\",\n };\n}\n\ntype MetadataState = {\n canonical?: string;\n custom: DocumentMetadataTag[];\n description?: string;\n openGraph?: OpenGraphMetadata;\n robots?: RobotsMetadata;\n structuredData: StructuredDataTag[];\n title?: string;\n titleDefault?: string;\n titleFormat?: (title: string) => string;\n};\n\nfunction applyMetadata(state: MetadataState, metadata: Metadata) {\n applyTitle(state, metadata.title);\n\n if (metadata.description !== undefined) {\n state.description = metadata.description;\n }\n\n if (metadata.canonical !== undefined) {\n state.canonical = metadata.canonical;\n }\n\n if (metadata.robots) {\n state.robots = {\n ...(state.robots ?? {}),\n ...metadata.robots,\n };\n }\n\n if (metadata.openGraph) {\n state.openGraph = {\n ...(state.openGraph ?? {}),\n ...metadata.openGraph,\n };\n }\n\n if (metadata.custom) {\n state.custom.push(...metadata.custom);\n }\n\n if (metadata.structuredData) {\n state.structuredData.push(...metadata.structuredData);\n }\n}\n\nfunction applyTitle(state: MetadataState, title: MetadataTitle | undefined) {\n if (title === undefined) {\n return;\n }\n\n if (typeof title === \"string\") {\n state.title = title;\n return;\n }\n\n if (title.default !== undefined) {\n state.titleDefault = title.default;\n }\n\n if (title.format) {\n state.titleFormat = title.format;\n }\n}\n\nfunction resolveTitle(state: MetadataState) {\n // A default title stands alone. The inherited formatter changes only a title\n // that a route supplies. Otherwise, a layout that declares both values can\n // render its name twice on each route that has no title.\n if (state.title === undefined) {\n return state.titleDefault;\n }\n\n return state.titleFormat ? state.titleFormat(state.title) : state.title;\n}\n\nfunction resolveOpenGraph(\n openGraph: OpenGraphMetadata | undefined,\n title: string | undefined,\n description: string | undefined,\n) {\n if (!openGraph && !title && !description) {\n return undefined;\n }\n\n return {\n ...(title ? { title } : {}),\n ...(description ? { description } : {}),\n ...(openGraph ?? {}),\n };\n}\n","export type CacheScope =\n | \"build\"\n | \"none\"\n | \"private\"\n | \"public\"\n | \"request\";\n\nexport type CacheKeyPart =\n | boolean\n | null\n | number\n | string\n | { readonly [key: string]: CacheKeyPart }\n | readonly CacheKeyPart[];\n\nexport type CacheKey = readonly CacheKeyPart[];\n\nexport type CacheTag = {\n id: string;\n};\n\nexport type CacheDuration = number | `${number}${\"h\" | \"m\" | \"ms\" | \"s\"}`;\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type CacheRequest<TResult> = {\n fn: () => MaybePromise<TResult>;\n key: CacheKey;\n locale?: \"neutral\";\n // TTL for a negative entry (the loader called `cacheNotFound()`). Kept\n // separate from `ttl` because \"does not currently exist\" tends to change\n // sooner than \"currently exists.\" Falls back to `ttl` when omitted.\n notFoundTtl?: CacheDuration;\n scope?: CacheScope;\n staleWhileRevalidate?: CacheDuration;\n tags?: readonly CacheTag[];\n ttl?: CacheDuration;\n};\n\nexport type QueryDefinition<TArgs extends readonly unknown[], TResult> = {\n fn: (...args: TArgs) => MaybePromise<TResult>;\n key: (...args: TArgs) => CacheKey;\n locale?: \"neutral\";\n notFoundTtl?: CacheDuration;\n scope?: CacheScope;\n staleWhileRevalidate?: CacheDuration;\n tags?: (...args: TArgs) => readonly CacheTag[];\n ttl?: CacheDuration;\n};\n\nexport type Query<TArgs extends readonly unknown[], TResult> = (\n ...args: TArgs\n) => CacheRequest<TResult>;\n\nexport type Cache = {\n get: <TResult>(request: CacheRequest<TResult>) => Promise<TResult>;\n invalidateKey: (key: CacheKey) => Promise<boolean>;\n invalidateTags: (tags: readonly CacheTag[]) => Promise<number>;\n};\n\nexport type CacheNamespace = {\n app: string;\n environment: string;\n schemaVersion: number | string;\n};\n\nexport type CacheStoreEntry = {\n expiresAt: number | null;\n // Present and true only for a negative entry: a stored record of a\n // loader reporting `cacheNotFound()` instead of a real result. `value`\n // then holds the CacheNotFoundError message (or undefined), not a result.\n negative?: boolean;\n staleUntil: number | null;\n tags: readonly string[];\n value: unknown;\n};\n\nexport type CacheStore = {\n acquireRefreshLease?: (\n key: string,\n token: string,\n expiresAt: number,\n ) => MaybePromise<boolean>;\n delete: (key: string) => MaybePromise<boolean>;\n get: (key: string) => MaybePromise<CacheStoreEntry | undefined>;\n invalidateTags: (tags: readonly string[]) => MaybePromise<number>;\n publishRefresh?: (\n key: string,\n token: string,\n entry: CacheStoreEntry,\n ) => MaybePromise<boolean>;\n releaseRefreshLease?: (key: string, token: string) => MaybePromise<void>;\n set: (key: string, entry: CacheStoreEntry) => MaybePromise<void>;\n};\n\nexport type CreateCacheOptions = {\n namespace: CacheNamespace;\n now?: () => number;\n onBackgroundError?: (error: unknown) => void;\n refreshLeaseTtl?: CacheDuration;\n store: CacheStore;\n waitUntil?: (promise: Promise<void>) => void;\n};\n\nexport type Invalidation = {\n key: (key: CacheKey) => Promise<InvalidationResult>;\n keys: (keys: readonly CacheKey[]) => Promise<InvalidationResult>;\n tag: (tag: CacheTag) => Promise<InvalidationResult>;\n tags: (tags: readonly CacheTag[]) => Promise<InvalidationResult>;\n};\n\nexport type InvalidationResult = {\n deleted: number;\n kind: \"key\" | \"tag\";\n};\n\ntype RequestCacheEntry<TResult> = {\n expiresAt: number;\n tags: readonly string[];\n value: Promise<TResult>;\n};\n\ntype PendingStoreEntry = {\n promise: Promise<unknown>;\n state: { invalidated: boolean };\n tags: readonly string[];\n};\n\ntype CoordinatedCacheStore = CacheStore &\n Required<\n Pick<\n CacheStore,\n | \"acquireRefreshLease\"\n | \"publishRefresh\"\n | \"releaseRefreshLease\"\n >\n >;\n\nexport type MemoryCacheOptions = {\n maximumEntries?: number;\n now?: () => number;\n onBackgroundError?: (error: unknown) => void;\n refreshLeaseTtl?: CacheDuration;\n waitUntil?: (promise: Promise<void>) => void;\n};\n\nexport type MemoryCacheStoreOptions = {\n entries?: Map<string, CacheStoreEntry>;\n maximumEntries?: number;\n now?: () => number;\n};\n\nconst sharedScopes = [\"build\", \"private\", \"public\"] as const;\nconst memoryNamespace = {\n app: \"demiurge-memory\",\n environment: \"local\",\n schemaVersion: 1,\n} satisfies CacheNamespace;\nconst defaultMemoryCacheMaximumEntries = 10_000;\nconst defaultRefreshLeaseTtl = 30_000;\n\nexport function query<TArgs extends readonly unknown[], TResult>(\n definition: QueryDefinition<TArgs, TResult>,\n): Query<TArgs, TResult> {\n return (...args) => ({\n fn: () => definition.fn(...args),\n key: definition.key(...args),\n locale: definition.locale,\n notFoundTtl: definition.notFoundTtl,\n scope: definition.scope,\n staleWhileRevalidate: definition.staleWhileRevalidate,\n tags: definition.tags?.(...args),\n ttl: definition.ttl,\n });\n}\n\n// The framework route/data layer already signals \"not found\" by throwing a\n// specific error class, `HttpError` with a 404 status, rather than\n// returning a sentinel value. `CacheNotFoundError` follows the same\n// convention at the cache layer. A `fn` passed to `cache.get()` throws it,\n// typically via `cacheNotFound()`, to report a negative result the cache\n// should still store. `data/` sits below `route/` in the package's\n// dependency order, so this stays independent of `HttpError`. Callers that\n// need an HTTP response translate `CacheNotFoundError` into `httpError(404)`\n// themselves.\nexport class CacheNotFoundError extends Error {\n constructor(message?: string) {\n super(message ?? \"Not found\");\n this.name = \"CacheNotFoundError\";\n }\n}\n\nexport function cacheNotFound(message?: string): never {\n throw new CacheNotFoundError(message);\n}\n\nexport function isCacheNotFoundError(\n error: unknown,\n): error is CacheNotFoundError {\n return error instanceof CacheNotFoundError;\n}\n\nexport function tag(id: string): CacheTag {\n return { id };\n}\n\nexport function defineTags<\n TTags extends Record<string, (...args: never[]) => CacheTag>,\n>(tags: TTags) {\n return tags;\n}\n\nexport function createCache(options: CreateCacheOptions): Cache {\n const now = options.now ?? Date.now;\n const refreshLeaseTtl = parseRefreshLeaseTtl(options.refreshLeaseTtl);\n const namespace = serializeCacheNamespace(options.namespace);\n const requestEntries = new Map<string, RequestCacheEntry<unknown>>();\n const sharedPending = new Map<string, PendingStoreEntry>();\n\n return {\n async get<TResult>(request: CacheRequest<TResult>) {\n const scope = request.scope ?? \"request\";\n\n if (scope === \"none\") {\n return await request.fn();\n }\n\n const rawKey = serializeCacheKey(request.key);\n\n if (scope === \"request\") {\n return await getRequestValue(requestEntries, rawKey, request, now);\n }\n\n const key = serializeStoreKey(namespace, scope, rawKey);\n const tags = (request.tags ?? []).map((value) =>\n serializeStoreTag(namespace, scope, serializeCacheTag(value))\n );\n const existing = await options.store.get(key);\n\n if (\n existing &&\n (existing.expiresAt === null || existing.expiresAt > now())\n ) {\n if (existing.negative) {\n throw new CacheNotFoundError(\n typeof existing.value === \"string\" ? existing.value : undefined,\n );\n }\n\n // TYPE-EVIDENCE: the store entry holds a value that the caller stored as TResult. The cast restores that generic type after storage erased it.\n return existing.value as TResult;\n }\n\n if (existing && isStaleEntryUsable(existing, now())) {\n const refreshStore = requireRefreshStore(options.store);\n const token = globalThis.crypto.randomUUID();\n const acquired = await refreshStore.acquireRefreshLease(\n key,\n token,\n now() + refreshLeaseTtl,\n );\n\n if (acquired) {\n const refresh = refreshStaleEntry({\n key,\n now,\n onBackgroundError: options.onBackgroundError,\n refreshStore,\n request,\n tags,\n token,\n });\n\n options.waitUntil?.(refresh);\n }\n\n // TYPE-EVIDENCE: the store entry holds a value that the caller stored as TResult. The cast restores that generic type after storage erased it.\n return existing.value as TResult;\n }\n\n if (existing) {\n await options.store.delete(key);\n }\n\n const currentPending = sharedPending.get(key);\n\n if (currentPending) {\n // TYPE-EVIDENCE: the pending entry wraps the request function that returns TResult. The cast restores that generic type.\n return await currentPending.promise as TResult;\n }\n\n const state = { invalidated: false };\n const value = Promise.resolve().then(request.fn).then(\n async (result) => {\n if (!state.invalidated) {\n await options.store.set(key, {\n expiresAt: storeExpirationTime(now(), request.ttl),\n staleUntil: storeStaleTime(\n now(),\n request.ttl,\n request.staleWhileRevalidate,\n ),\n tags,\n value: result,\n });\n }\n\n return result;\n },\n async (error) => {\n if (!state.invalidated && error instanceof CacheNotFoundError) {\n await options.store.set(key, negativeStoreEntry(now(), request, tags, error));\n }\n\n throw error;\n },\n );\n const pending: PendingStoreEntry = {\n promise: value,\n state,\n tags,\n };\n sharedPending.set(key, pending);\n\n try {\n return await value;\n } finally {\n if (sharedPending.get(key) === pending) {\n sharedPending.delete(key);\n }\n }\n },\n async invalidateKey(key: CacheKey) {\n const rawKey = serializeCacheKey(key);\n const deletedRequest = requestEntries.delete(rawKey);\n let deletedPending = false;\n\n const deletedShared = await Promise.all(\n sharedScopes.map((scope) => {\n const storeKey = serializeStoreKey(namespace, scope, rawKey);\n const pending = sharedPending.get(storeKey);\n\n if (pending) {\n pending.state.invalidated = true;\n deletedPending = true;\n }\n\n return options.store.delete(storeKey);\n }),\n );\n\n return deletedRequest || deletedPending || deletedShared.some(Boolean);\n },\n async invalidateTags(tags: readonly CacheTag[]) {\n const rawTags = tags.map(serializeCacheTag);\n const deletedRequest = deleteMatchingRequestTags(\n requestEntries,\n new Set(rawTags),\n );\n const storeTags = new Set(\n sharedScopes.flatMap((scope) =>\n rawTags.map((value) => serializeStoreTag(namespace, scope, value))\n ),\n );\n let deletedPending = 0;\n\n for (const pending of sharedPending.values()) {\n if (\n !pending.state.invalidated &&\n pending.tags.some((value) => storeTags.has(value))\n ) {\n pending.state.invalidated = true;\n deletedPending += 1;\n }\n }\n\n const deletedShared = await options.store.invalidateTags([...storeTags]);\n\n return deletedRequest + deletedPending + deletedShared;\n },\n };\n}\n\nexport function createMemoryCache(options: MemoryCacheOptions = {}): Cache {\n const now = options.now ?? Date.now;\n\n return createCache({\n namespace: memoryNamespace,\n now,\n onBackgroundError: options.onBackgroundError,\n refreshLeaseTtl: options.refreshLeaseTtl,\n store: createMemoryCacheStore({\n maximumEntries: options.maximumEntries,\n now,\n }),\n waitUntil: options.waitUntil,\n });\n}\n\nexport function createMemoryCacheStore(\n options: MemoryCacheStoreOptions = {},\n): CacheStore {\n const entries = options.entries ?? new Map<string, CacheStoreEntry>();\n const refreshLeases = new Map<string, { expiresAt: number; token: string }>();\n const maximumEntries =\n options.maximumEntries ?? defaultMemoryCacheMaximumEntries;\n const now = options.now ?? Date.now;\n\n if (!Number.isSafeInteger(maximumEntries) || maximumEntries <= 0) {\n throw new Error(\n \"Demiurge memory cache maximumEntries must be a positive integer.\",\n );\n }\n\n sweepExpiredCacheEntries(entries, refreshLeases, now());\n evictOldestCacheEntries(entries, maximumEntries);\n let nextExpiration = findNextCacheExpiration(entries);\n\n return {\n acquireRefreshLease(key, token, expiresAt) {\n const currentTime = now();\n const existing = refreshLeases.get(key);\n\n if (existing && existing.expiresAt > currentTime) {\n return false;\n }\n\n refreshLeases.set(key, { expiresAt, token });\n return true;\n },\n delete(key) {\n refreshLeases.delete(key);\n return entries.delete(key);\n },\n get(key) {\n if (now() >= nextExpiration) {\n sweepExpiredCacheEntries(entries, refreshLeases, now());\n nextExpiration = findNextCacheExpiration(entries);\n }\n\n return entries.get(key);\n },\n invalidateTags(tags) {\n const serializedTags = new Set(tags);\n let deleted = 0;\n\n for (const [key, entry] of entries) {\n if (entry.tags.some((value) => serializedTags.has(value))) {\n entries.delete(key);\n refreshLeases.delete(key);\n deleted += 1;\n }\n }\n\n return deleted;\n },\n publishRefresh(key, token, entry) {\n const lease = refreshLeases.get(key);\n\n if (!lease || lease.token !== token || lease.expiresAt <= now()) {\n return false;\n }\n\n setMemoryCacheEntry(\n entries,\n refreshLeases,\n maximumEntries,\n key,\n entry,\n );\n refreshLeases.delete(key);\n\n if (entry.staleUntil !== null) {\n nextExpiration = Math.min(nextExpiration, entry.staleUntil);\n }\n\n return true;\n },\n releaseRefreshLease(key, token) {\n if (refreshLeases.get(key)?.token === token) {\n refreshLeases.delete(key);\n }\n },\n set(key, entry) {\n const currentTime = now();\n\n if (currentTime >= nextExpiration) {\n sweepExpiredCacheEntries(entries, refreshLeases, currentTime);\n nextExpiration = findNextCacheExpiration(entries);\n }\n\n refreshLeases.delete(key);\n setMemoryCacheEntry(\n entries,\n refreshLeases,\n maximumEntries,\n key,\n entry,\n );\n\n if (entry.staleUntil !== null) {\n nextExpiration = Math.min(nextExpiration, entry.staleUntil);\n }\n },\n };\n}\n\nfunction sweepExpiredCacheEntries(\n entries: Map<string, CacheStoreEntry>,\n refreshLeases: Map<string, { expiresAt: number; token: string }>,\n now: number,\n) {\n for (const [key, entry] of entries) {\n if (entry.staleUntil !== null && entry.staleUntil <= now) {\n entries.delete(key);\n refreshLeases.delete(key);\n }\n }\n}\n\nfunction setMemoryCacheEntry(\n entries: Map<string, CacheStoreEntry>,\n refreshLeases: Map<string, { expiresAt: number; token: string }>,\n maximumEntries: number,\n key: string,\n entry: CacheStoreEntry,\n) {\n if (!entries.has(key) && entries.size >= maximumEntries) {\n while (entries.size >= maximumEntries) {\n const oldestKey = entries.keys().next().value;\n\n if (oldestKey === undefined) {\n break;\n }\n\n entries.delete(oldestKey);\n refreshLeases.delete(oldestKey);\n }\n }\n\n entries.set(key, entry);\n}\n\nfunction evictOldestCacheEntries(\n entries: Map<string, CacheStoreEntry>,\n targetSize: number,\n) {\n while (entries.size > targetSize) {\n const oldestKey = entries.keys().next().value;\n\n if (oldestKey === undefined) {\n return;\n }\n\n entries.delete(oldestKey);\n }\n}\n\nfunction findNextCacheExpiration(entries: Map<string, CacheStoreEntry>) {\n let nextExpiration = Number.POSITIVE_INFINITY;\n\n for (const entry of entries.values()) {\n if (entry.staleUntil !== null) {\n nextExpiration = Math.min(nextExpiration, entry.staleUntil);\n }\n }\n\n return nextExpiration;\n}\n\nexport function serializeCacheNamespace(namespace: CacheNamespace) {\n const app = validateNamespacePart(\"app\", namespace.app);\n const environment = validateNamespacePart(\n \"environment\",\n namespace.environment,\n );\n\n if (\n typeof namespace.schemaVersion === \"number\" &&\n (!Number.isInteger(namespace.schemaVersion) || namespace.schemaVersion < 0)\n ) {\n throw new Error(\n \"Demiurge cache namespace schemaVersion must be a non-negative integer or string.\",\n );\n }\n\n const schemaVersion = validateNamespacePart(\n \"schemaVersion\",\n String(namespace.schemaVersion),\n );\n\n return `${app}:${environment}:${schemaVersion}`;\n}\n\nexport function createInvalidation(\n cache: Pick<Cache, \"invalidateKey\" | \"invalidateTags\">,\n): Invalidation {\n return {\n async key(key) {\n return {\n deleted: await cache.invalidateKey(key) ? 1 : 0,\n kind: \"key\",\n };\n },\n async keys(keys) {\n let deleted = 0;\n\n for (const key of keys) {\n if (await cache.invalidateKey(key)) {\n deleted += 1;\n }\n }\n\n return {\n deleted,\n kind: \"key\",\n };\n },\n async tag(tag) {\n return {\n deleted: await cache.invalidateTags([tag]),\n kind: \"tag\",\n };\n },\n async tags(tags) {\n return {\n deleted: await cache.invalidateTags(tags),\n kind: \"tag\",\n };\n },\n };\n}\n\nexport function parseCacheDuration(duration: CacheDuration | undefined) {\n if (duration === undefined) {\n return Number.POSITIVE_INFINITY;\n }\n\n if (typeof duration === \"number\") {\n if (!Number.isInteger(duration) || duration < 0) {\n throw new Error(\"Demiurge cache duration must be a non-negative integer.\");\n }\n\n return duration;\n }\n\n const match = /^(\\d+)(ms|s|m|h)$/.exec(duration);\n\n if (!match) {\n throw new Error(\"Demiurge cache duration must use an ms/s/m/h suffix.\");\n }\n\n const value = Number(match[1]);\n const unit = match[2];\n\n if (unit === \"h\") {\n return value * 3_600_000;\n }\n\n if (unit === \"m\") {\n return value * 60_000;\n }\n\n if (unit === \"s\") {\n return value * 1_000;\n }\n\n return value;\n}\n\nexport function serializeCacheKey(key: CacheKey) {\n return stableSerialize(key, new Set<object>());\n}\n\nexport function serializeCacheTag(tag: CacheTag) {\n return tag.id;\n}\n\nasync function getRequestValue<TResult>(\n entries: Map<string, RequestCacheEntry<unknown>>,\n key: string,\n request: CacheRequest<TResult>,\n now: () => number,\n) {\n const existing = entries.get(key);\n\n if (existing && existing.expiresAt > now()) {\n // TYPE-EVIDENCE: the entry holds a promise that the request produced as TResult. The cast restores that generic type after the map erased it.\n return await existing.value as TResult;\n }\n\n const value = Promise.resolve().then(request.fn);\n const entry = {\n expiresAt: now() + parseCacheDuration(request.ttl),\n tags: (request.tags ?? []).map(serializeCacheTag),\n value,\n } satisfies RequestCacheEntry<TResult>;\n\n entries.set(key, entry);\n\n try {\n return await value;\n } catch (error) {\n if (entries.get(key) === entry) {\n // A negative result stays cached, the same as a positive one, just\n // under its own (usually shorter) TTL. It re-throws on every hit\n // until it expires.\n if (error instanceof CacheNotFoundError) {\n entry.expiresAt = now() +\n parseCacheDuration(request.notFoundTtl ?? request.ttl);\n } else {\n entries.delete(key);\n }\n }\n\n throw error;\n }\n}\n\nfunction serializeStoreKey(\n namespace: string,\n scope: (typeof sharedScopes)[number],\n key: string,\n) {\n return `${namespace}:${scope}:key:${key}`;\n}\n\nfunction serializeStoreTag(\n namespace: string,\n scope: (typeof sharedScopes)[number],\n tag: string,\n) {\n return `${namespace}:${scope}:tag:${tag}`;\n}\n\nfunction storeExpirationTime(now: number, ttl: CacheDuration | undefined) {\n const duration = parseCacheDuration(ttl);\n return Number.isFinite(duration) ? now + duration : null;\n}\n\nfunction negativeStoreEntry<TResult>(\n now: number,\n request: CacheRequest<TResult>,\n tags: readonly string[],\n error: CacheNotFoundError,\n): CacheStoreEntry {\n const notFoundTtl = request.notFoundTtl ?? request.ttl;\n\n return {\n expiresAt: storeExpirationTime(now, notFoundTtl),\n negative: true,\n // Negative entries do not participate in stale-while-revalidate: they\n // expire outright and recompute on the next request.\n staleUntil: storeStaleTime(now, notFoundTtl, undefined),\n tags,\n value: error.message,\n };\n}\n\nfunction storeStaleTime(\n now: number,\n ttl: CacheDuration | undefined,\n staleWhileRevalidate: CacheDuration | undefined,\n) {\n const duration = parseCacheDuration(ttl);\n\n if (!Number.isFinite(duration)) {\n if (staleWhileRevalidate !== undefined) {\n throw new Error(\n \"Demiurge staleWhileRevalidate requires a finite cache ttl.\",\n );\n }\n\n return null;\n }\n\n return now + duration + parseCacheDuration(staleWhileRevalidate ?? 0);\n}\n\nfunction parseRefreshLeaseTtl(duration: CacheDuration | undefined) {\n const milliseconds = parseCacheDuration(duration ?? defaultRefreshLeaseTtl);\n\n if (!Number.isFinite(milliseconds) || milliseconds <= 0) {\n throw new Error(\n \"Demiurge cache refreshLeaseTtl must be a positive finite duration.\",\n );\n }\n\n return milliseconds;\n}\n\nfunction isStaleEntryUsable(entry: CacheStoreEntry, now: number) {\n return (\n entry.expiresAt !== null &&\n entry.expiresAt <= now &&\n (entry.staleUntil === null || entry.staleUntil > now)\n );\n}\n\nfunction requireRefreshStore(store: CacheStore): CoordinatedCacheStore {\n if (\n !store.acquireRefreshLease ||\n !store.publishRefresh ||\n !store.releaseRefreshLease\n ) {\n throw new Error(\n \"Demiurge staleWhileRevalidate requires a cache store with acquireRefreshLease, publishRefresh, and releaseRefreshLease coordination methods.\",\n );\n }\n\n // TYPE-EVIDENCE: the guard above confirms each coordination method exists on the store. The cast reflects that runtime check.\n return store as CoordinatedCacheStore;\n}\n\nasync function refreshStaleEntry<TResult>(options: {\n key: string;\n now: () => number;\n onBackgroundError: ((error: unknown) => void) | undefined;\n refreshStore: CoordinatedCacheStore;\n request: CacheRequest<TResult>;\n tags: readonly string[];\n token: string;\n}) {\n try {\n const result = await options.request.fn();\n const currentTime = options.now();\n await options.refreshStore.publishRefresh(options.key, options.token, {\n expiresAt: storeExpirationTime(currentTime, options.request.ttl),\n staleUntil: storeStaleTime(\n currentTime,\n options.request.ttl,\n options.request.staleWhileRevalidate,\n ),\n tags: options.tags,\n value: result,\n });\n } catch (error) {\n if (error instanceof CacheNotFoundError) {\n await options.refreshStore.publishRefresh(\n options.key,\n options.token,\n negativeStoreEntry(options.now(), options.request, options.tags, error),\n );\n return;\n }\n\n if (options.onBackgroundError) {\n options.onBackgroundError(error);\n } else {\n console.error(\"Demiurge stale cache refresh failed.\", error);\n }\n } finally {\n await options.refreshStore.releaseRefreshLease(options.key, options.token);\n }\n}\n\nfunction validateNamespacePart(name: string, value: string) {\n const containsControlCharacter = [...value].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 31 || code === 127;\n });\n\n if (\n !value ||\n value.trim() !== value ||\n value.includes(\":\") ||\n containsControlCharacter\n ) {\n throw new Error(\n `Demiurge cache namespace ${name} must be non-empty and cannot contain whitespace padding, colons, or control characters.`,\n );\n }\n\n return value;\n}\n\nfunction deleteMatchingRequestTags(\n entries: Map<string, RequestCacheEntry<unknown>>,\n tags: Set<string>,\n) {\n let deleted = 0;\n\n for (const [key, entry] of entries) {\n if (entry.tags.some((entryTag) => tags.has(entryTag))) {\n entries.delete(key);\n deleted += 1;\n }\n }\n\n return deleted;\n}\n\nfunction stableSerialize(value: CacheKeyPart, ancestors: Set<object>): string {\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"string\"\n ) {\n return JSON.stringify(value);\n }\n\n if (typeof value === \"number\") {\n if (!Number.isFinite(value) || Object.is(value, -0)) {\n throw new Error(\n \"Demiurge cache keys require finite numbers and do not accept negative zero.\",\n );\n }\n\n return JSON.stringify(value);\n }\n\n if (typeof value !== \"object\") {\n throw new Error(\n `Demiurge cache keys do not accept values of type ${typeof value}.`,\n );\n }\n\n if (ancestors.has(value)) {\n throw new Error(\"Demiurge cache keys cannot contain circular references.\");\n }\n\n ancestors.add(value);\n\n if (Array.isArray(value)) {\n const ownKeys = Reflect.ownKeys(value);\n const expectedKeys = [\n ...Array.from({ length: value.length }, (_, index) => String(index)),\n \"length\",\n ];\n\n if (\n ownKeys.length !== expectedKeys.length ||\n ownKeys.some((key, index) => key !== expectedKeys[index]) ||\n expectedKeys.slice(0, -1).some((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n return !descriptor?.enumerable || !(\"value\" in descriptor);\n })\n ) {\n ancestors.delete(value);\n throw new Error(\n \"Demiurge cache key arrays must be dense and cannot contain accessors or custom properties.\",\n );\n }\n\n const serialized = `[${value\n .map((part) => stableSerialize(part, ancestors))\n .join(\",\")}]`;\n ancestors.delete(value);\n return serialized;\n }\n\n const prototype = Object.getPrototypeOf(value);\n\n if (prototype !== Object.prototype && prototype !== null) {\n throw new Error(\n \"Demiurge cache keys accept only primitives, arrays, and plain objects.\",\n );\n }\n\n const ownKeys = Reflect.ownKeys(value);\n\n if (\n ownKeys.some((key) => typeof key === \"symbol\") ||\n ownKeys.some((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n return !descriptor?.enumerable || !(\"value\" in descriptor);\n })\n ) {\n throw new Error(\n \"Demiurge cache key objects require enumerable string data properties.\",\n );\n }\n\n // TYPE-EVIDENCE: the checks above confirm the value is a plain object with enumerable string properties. The cast adds the string index signature.\n const objectValue = value as { readonly [key: string]: CacheKeyPart };\n const serialized = `{${Object.keys(objectValue)\n .sort()\n .map(\n (key) =>\n `${JSON.stringify(key)}:${stableSerialize(objectValue[key], ancestors)}`,\n )\n .join(\",\")}}`;\n ancestors.delete(value);\n return serialized;\n}\n","/**\n * The error that the framework reports for a browser payload that it cannot\n * serialize.\n *\n * The message names the route and the field path. The message does not\n * contain the value.\n */\nexport class RouteSerializationError extends Error {\n readonly field?: string;\n readonly route: string;\n\n constructor(message: string, route: string, field?: string) {\n super(message);\n this.name = \"RouteSerializationError\";\n this.route = route;\n this.field = field;\n }\n}\n\n/**\n * Proves that the framework can serialize a page route browser payload.\n *\n * The return value of a page `data` function is the browser payload. This\n * check names the value that `JSON.stringify` cannot represent, so it\n * matches exactly the failures that already occur: a circular reference and\n * a `bigint` value. It does not add a check for a value that\n * `JSON.stringify` already accepts or silently drops, such as `undefined`,\n * a function, a symbol key, or a non-finite number.\n */\nexport function assertSerializableValue(\n value: unknown,\n route: string,\n path: readonly string[] = [],\n seen = new Set<object>(),\n): void {\n if (value === null) return;\n\n const kind = typeof value;\n\n if (kind === \"bigint\") {\n throw unserializableValue(route, path, \"a bigint value\");\n }\n\n if (kind !== \"object\") return;\n\n // TYPE-EVIDENCE: the typeof check above proves that the value is an object.\n const objectValue = value as object;\n\n if (seen.has(objectValue)) {\n throw unserializableValue(route, path, \"a circular reference\");\n }\n\n seen.add(objectValue);\n\n if (Array.isArray(objectValue)) {\n for (let index = 0; index < objectValue.length; index += 1) {\n assertSerializableValue(\n objectValue[index],\n route,\n [...path, String(index)],\n seen,\n );\n }\n seen.delete(objectValue);\n return;\n }\n\n for (const key of Object.keys(objectValue)) {\n // TYPE-EVIDENCE: Object.keys returns the own enumerable string keys of objectValue. The cast reads one property that a checked key names.\n assertSerializableValue(\n (objectValue as Record<string, unknown>)[key],\n route,\n [...path, key],\n seen,\n );\n }\n\n seen.delete(objectValue);\n}\n\nfunction unserializableValue(\n route: string,\n path: readonly string[],\n reason: string,\n) {\n const field = path.length === 0 ? \"<root>\" : path.join(\".\");\n return new RouteSerializationError(\n `Route ${route} could not serialize the field ${field} for the browser. The value contains ${reason}.`,\n route,\n field,\n );\n}\n","import type { ComponentType } from \"react\";\nimport { createMemoryCache, type Cache } from \"../data\";\nimport {\n resolveLinks,\n resolveMetadata,\n resolveScripts,\n type InitialRouteData,\n type LinkTag,\n type ResolvedMetadata,\n type ScriptTag,\n} from \"../document\";\nimport type {\n LayoutProps,\n NotFoundProps,\n PageRenderOptions,\n PathVars,\n RouteErrorProps,\n RouteContext,\n RouteImporter,\n RouteModule,\n RouteProps,\n} from \"../route\";\nimport { assertSerializableValue } from \"../route/serialization\";\n\nexport type RouteRecord = {\n file: string;\n fileSegments: string[];\n segments: string[];\n score: number;\n load: RouteImporter;\n};\n\nexport type LayoutRoute = {\n file: string;\n fileSegments: string[];\n segments: string[];\n load: RouteImporter;\n};\n\nexport type PolicyRoute = {\n file: string;\n fileSegments: string[];\n segments: string[];\n load: RouteImporter;\n};\n\nexport type MiddlewareRoute = {\n file: string;\n fileSegments: string[];\n segments: string[];\n load: RouteImporter;\n};\n\nexport type FallbackRoute = {\n file: string;\n fileSegments: string[];\n segments: string[];\n load: RouteImporter;\n};\n\nexport type RouteManifest = {\n fallbacks: {\n error: FallbackRoute[];\n loading: FallbackRoute[];\n notFound: FallbackRoute[];\n };\n routes: RouteRecord[];\n layouts: LayoutRoute[];\n middlewares: MiddlewareRoute[];\n policies: PolicyRoute[];\n};\n\nexport type LoadedRouteMatch = {\n data?: unknown;\n error?: ComponentType<RouteErrorProps>;\n links: LinkTag[];\n page: ComponentType<RouteProps<string, unknown>>;\n layouts: ComponentType<LayoutProps>[];\n locale?: string;\n metadata: ResolvedMetadata;\n path: PathVars;\n pathname: string;\n render: PageRenderOptions;\n scripts: ScriptTag[];\n};\n\nexport type StaticRoutePath = {\n file: string;\n locale?: string;\n path: PathVars;\n pattern: string;\n pathname: string;\n};\n\nexport type LoadedNotFoundMatch = {\n layouts: ComponentType<LayoutProps>[];\n locale?: string;\n metadata: ResolvedMetadata;\n notFound?: ComponentType<NotFoundProps>;\n pathname: string;\n};\n\nexport type PendingRouteMatch =\n | {\n error: unknown;\n Error?: ComponentType<RouteErrorProps>;\n locale?: string;\n pathname: string;\n status: \"error\";\n }\n | { loading?: ComponentType; status: \"loading\" }\n | (LoadedNotFoundMatch & { status: \"not-found\" })\n | { status: \"ready\"; match: LoadedRouteMatch };\n\nexport function createRouteManifest(routes: Record<string, RouteImporter>) {\n const manifest: RouteManifest = {\n fallbacks: {\n error: [],\n loading: [],\n notFound: [],\n },\n routes: [],\n layouts: [],\n middlewares: [],\n policies: [],\n };\n\n for (const [file, load] of Object.entries(routes)) {\n const routePath = file\n .replace(/^\\/src\\/routes\\//, \"\")\n .replace(/^\\.\\/routes\\//, \"\")\n .replace(/\\.tsx?$/, \"\")\n .split(\"/\");\n\n const basename = routePath.at(-1);\n\n if (basename === \"@layout\") {\n manifest.layouts.push({\n file,\n fileSegments: routePath.slice(0, -1),\n segments: toRouteSegments(routePath.slice(0, -1)),\n load,\n });\n continue;\n }\n\n if (basename === \"@policy\") {\n manifest.policies.push({\n file,\n fileSegments: routePath.slice(0, -1),\n segments: toRouteSegments(routePath.slice(0, -1)),\n load,\n });\n continue;\n }\n\n if (basename === \"@middleware\") {\n manifest.middlewares.push({\n file,\n fileSegments: routePath.slice(0, -1),\n segments: toRouteSegments(routePath.slice(0, -1)),\n load,\n });\n continue;\n }\n\n if (basename === \"@loading\") {\n manifest.fallbacks.loading.push({\n file,\n fileSegments: routePath.slice(0, -1),\n segments: toRouteSegments(routePath.slice(0, -1)),\n load,\n });\n continue;\n }\n\n if (basename === \"@error\") {\n manifest.fallbacks.error.push({\n file,\n fileSegments: routePath.slice(0, -1),\n segments: toRouteSegments(routePath.slice(0, -1)),\n load,\n });\n continue;\n }\n\n if (basename === \"@not-found\") {\n manifest.fallbacks.notFound.push({\n file,\n fileSegments: routePath.slice(0, -1),\n segments: toRouteSegments(routePath.slice(0, -1)),\n load,\n });\n continue;\n }\n\n manifest.routes.push({\n file,\n fileSegments: routePath,\n segments: toRouteSegments(routePath),\n score: scoreRoute(routePath),\n load,\n });\n }\n\n validateRoutePatterns(manifest.routes);\n manifest.routes.sort(compareRouteSpecificity);\n manifest.layouts.sort(\n (a, b) => a.fileSegments.length - b.fileSegments.length || a.file.localeCompare(b.file),\n );\n manifest.policies.sort(\n (a, b) => a.fileSegments.length - b.fileSegments.length || a.file.localeCompare(b.file),\n );\n manifest.middlewares.sort(\n (a, b) => a.fileSegments.length - b.fileSegments.length || a.file.localeCompare(b.file),\n );\n manifest.fallbacks.loading.sort(\n (a, b) => a.fileSegments.length - b.fileSegments.length || a.file.localeCompare(b.file),\n );\n manifest.fallbacks.error.sort(\n (a, b) => a.fileSegments.length - b.fileSegments.length || a.file.localeCompare(b.file),\n );\n manifest.fallbacks.notFound.sort(\n (a, b) => a.fileSegments.length - b.fileSegments.length || a.file.localeCompare(b.file),\n );\n\n return manifest;\n}\n\nfunction validateRoutePatterns(routes: RouteRecord[]) {\n const shapes = new Map<string, RouteRecord>();\n\n for (const route of routes) {\n const catchallIndex = route.segments.findIndex((segment) =>\n segment.startsWith(\"*\"),\n );\n\n if (catchallIndex !== -1 && catchallIndex !== route.segments.length - 1) {\n throw new Error(\n `Catchall route segment in \"${route.file}\" must be the final URL segment.`,\n );\n }\n\n const shape = route.segments.map(canonicalRouteSegment).join(\"/\");\n const existing = shapes.get(shape);\n\n if (existing) {\n throw new Error(\n `Ambiguous routes \"${existing.file}\" and \"${route.file}\" have the same runtime shape and both match \"${routeWitnessPath(route.segments)}\".`,\n );\n }\n\n shapes.set(shape, route);\n }\n}\n\nfunction canonicalRouteSegment(segment: string) {\n if (segment.startsWith(\"*\")) {\n return \"*\";\n }\n\n if (segment.startsWith(\":\")) {\n return \":\";\n }\n\n return `=${segment}`;\n}\n\nfunction routeWitnessPath(segments: string[]) {\n if (segments.length === 0) {\n return \"/\";\n }\n\n return `/${segments\n .map((segment) => segment.startsWith(\":\") || segment.startsWith(\"*\")\n ? \"example\"\n : segment)\n .join(\"/\")}`;\n}\n\nfunction compareRouteSpecificity(left: RouteRecord, right: RouteRecord) {\n const length = Math.max(left.segments.length, right.segments.length);\n\n for (let index = 0; index < length; index += 1) {\n const difference =\n routeSegmentSpecificity(right.segments[index]) -\n routeSegmentSpecificity(left.segments[index]);\n\n if (difference !== 0) {\n return difference;\n }\n }\n\n return left.file.localeCompare(right.file);\n}\n\nfunction routeSegmentSpecificity(segment: string | undefined) {\n if (segment === undefined) {\n return 4;\n }\n\n if (segment.startsWith(\"*\")) {\n return 1;\n }\n\n if (segment.startsWith(\":\")) {\n return 2;\n }\n\n return 3;\n}\n\nexport async function loadPageRoute(\n manifest: RouteManifest,\n pathname: string,\n request = new Request(`http://demiurge.local${pathname}`),\n initialData?: InitialRouteData,\n cache: Cache = createMemoryCache(),\n options: {\n documentContributions?: boolean;\n locale?: string;\n requestContext?: Record<string, unknown>;\n } = {},\n): Promise<PendingRouteMatch> {\n const documentContributions = options.documentContributions ?? true;\n const routeMatch = findRouteMatch(manifest.routes, pathname);\n\n if (!routeMatch) {\n return {\n ...(await loadNotFoundMatch(manifest, pathname, {\n documentContributions,\n locale: options.locale,\n })),\n status: \"not-found\",\n };\n }\n\n const matchingLayouts = manifest.layouts.filter((layout) =>\n isAttachedFileForRoute(layout.fileSegments, routeMatch.route.fileSegments),\n );\n\n const pageModule = await routeMatch.route.load();\n\n if (!pageModule.GET || pageModule.GET.kind !== \"page\") {\n return {\n ...(await loadNotFoundMatch(manifest, pathname, {\n fallback: findClosestAttachedFile(\n manifest.fallbacks.notFound,\n routeMatch.route,\n ),\n documentContributions,\n layouts: matchingLayouts,\n locale: options.locale,\n })),\n status: \"not-found\",\n };\n }\n\n const layoutModules =\n pageModule.GET.layout === false\n ? []\n : await Promise.all(matchingLayouts.map((layout) => layout.load()));\n const url = new URL(request.url);\n const context = {\n cache,\n context: options.requestContext ?? {},\n locale: options.locale,\n path: routeMatch.path,\n pathname,\n request,\n search: url.searchParams,\n url,\n };\n\n // The framework serializes the return value of `data` into the initial\n // document, the hydration payload, and the navigation response. This check\n // runs once, before that value reaches any of the three. It catches an\n // unserializable value at the single place where the framework computes\n // the value.\n let data: unknown;\n\n if (pageModule.GET.data && !initialData?.hasData) {\n data = await pageModule.GET.data(context);\n assertSerializableValue(data, toRoutePattern(routeMatch.route.segments));\n } else {\n data = initialData?.data;\n }\n\n // TYPE-EVIDENCE: the route module view and layout exports are React components. The casts label them as component types.\n return {\n status: \"ready\",\n match: {\n data,\n error: await loadErrorFallbackForRoute(manifest, routeMatch.route),\n links: documentContributions\n ? await resolveLinks(\n [\n ...layoutModules.map((module) => module.links),\n pageModule.links,\n ],\n context,\n )\n : [],\n page: pageModule.GET.view as ComponentType<RouteProps<string, unknown>>,\n layouts: layoutModules.map(\n (module) => module.default as ComponentType<LayoutProps>,\n ),\n locale: options.locale,\n metadata: documentContributions\n ? resolveMetadata(...await Promise.all([\n ...layoutModules.map((module) => resolveRouteMetadata(module, context)),\n resolveRouteMetadata(pageModule, context),\n ]))\n : resolveMetadata(),\n path: routeMatch.path,\n pathname,\n render: pageModule.GET.render,\n scripts: documentContributions\n ? await resolveScripts(\n [\n ...layoutModules.map((module) => module.scripts),\n pageModule.scripts,\n ],\n context,\n )\n : [],\n },\n };\n}\n\nexport async function collectStaticRoutePaths(\n manifest: RouteManifest,\n options: {\n includePages?: boolean;\n includeResources?: boolean;\n locale?: string;\n } = {},\n): Promise<StaticRoutePath[]> {\n const cache = createMemoryCache();\n const paths: StaticRoutePath[] = [];\n\n for (const route of manifest.routes) {\n const routeModule = await route.load();\n\n if (!routeModule.GET) {\n continue;\n }\n\n if (routeModule.GET.kind !== \"page\" && !options.includeResources) {\n continue;\n }\n\n if (routeModule.GET.kind === \"page\" && options.includePages === false) {\n continue;\n }\n\n if (\n routeModule.GET.kind === \"page\" &&\n routeModule.GET.render.mode !== \"static\"\n ) {\n throw new Error(\n `Page route \"${route.file}\" uses render mode \"${routeModule.GET.render.mode}\" and cannot be emitted as static output. Set render: { mode: \"static\" } or deploy a runtime adapter.`,\n );\n }\n\n const pattern = toRoutePattern(route.segments);\n const dynamicNames = getDynamicSegmentNames(route.segments);\n\n if (dynamicNames.length === 0) {\n paths.push({\n file: route.file,\n path: {},\n pattern,\n pathname: pattern,\n });\n continue;\n }\n\n if (!routeModule.paths) {\n throw new Error(\n `Dynamic static route \"${route.file}\" must export paths for \"${pattern}\".`,\n );\n }\n\n const routePaths = await routeModule.paths({\n cache,\n locale: options.locale,\n });\n\n for (const path of routePaths) {\n const normalizedPath = normalizeStaticPath(route, pattern, path);\n\n paths.push({\n file: route.file,\n path: normalizedPath,\n pattern,\n pathname: fillStaticPathname(route.segments, normalizedPath),\n });\n }\n }\n\n return paths;\n}\n\nexport async function loadLoadingFallback(\n manifest: RouteManifest,\n pathname: string,\n) {\n const routeMatch = findRouteMatch(manifest.routes, pathname);\n\n if (!routeMatch) {\n return undefined;\n }\n\n return await loadFallbackComponent(\n findClosestAttachedFile(manifest.fallbacks.loading, routeMatch.route),\n );\n}\n\nexport async function loadErrorFallback(\n manifest: RouteManifest,\n pathname: string,\n) {\n let routeMatch: ReturnType<typeof findRouteMatch>;\n\n try {\n routeMatch = findRouteMatch(manifest.routes, pathname);\n } catch (error) {\n if (!(error instanceof MalformedPathnameError)) throw error;\n\n return await loadErrorFallbackComponent(\n manifest.fallbacks.error.find((fallback) =>\n fallback.fileSegments.length === 0\n ),\n );\n }\n\n if (routeMatch) {\n return await loadErrorFallbackForRoute(manifest, routeMatch.route);\n }\n\n return await loadErrorFallbackForPath(manifest, pathname);\n}\n\nasync function loadErrorFallbackForRoute(\n manifest: RouteManifest,\n route: RouteRecord,\n) {\n return await loadErrorFallbackComponent(\n findClosestAttachedFile(manifest.fallbacks.error, route),\n );\n}\n\nasync function loadErrorFallbackForPath(\n manifest: RouteManifest,\n pathname: string,\n) {\n return await loadErrorFallbackComponent(\n findClosestFallbackForPath(manifest.fallbacks.error, pathname),\n );\n}\n\n// A not-found render has no matched route. Therefore, layouts resolve from the\n// requested pathname. Layout loading tolerates errors. A layout above\n// `/admin/nope` can require a session and throw. This error must select the\n// layout-free document, not a 500 response. This path prevents a blank page.\nexport async function loadNotFoundMatch(\n manifest: RouteManifest,\n pathname: string,\n options: {\n documentContributions?: boolean;\n fallback?: FallbackRoute;\n layouts?: LayoutRoute[];\n onLayoutError?: (error: unknown) => void;\n locale?: string;\n } = {},\n): Promise<LoadedNotFoundMatch> {\n const fallback =\n options.fallback ??\n findClosestFallbackForPath(manifest.fallbacks.notFound, pathname);\n const fallbackModule = await fallback?.load();\n // TYPE-EVIDENCE: the fallback module default export is a React component. The cast labels it as a not found component type.\n const notFound = fallbackModule?.default as\n | ComponentType<NotFoundProps>\n | undefined;\n const documentContributions = options.documentContributions ?? true;\n const metadataContext = { locale: options.locale, path: {}, pathname };\n\n if (fallbackModule?.layout === false) {\n return {\n layouts: [],\n locale: options.locale,\n metadata: documentContributions\n ? resolveMetadata(await resolveRouteMetadata(fallbackModule, metadataContext))\n : resolveMetadata(),\n notFound,\n pathname,\n };\n }\n\n const layoutRoutes = options.layouts ?? findLayoutsForPath(manifest, pathname);\n\n try {\n const layoutModules = await Promise.all(\n layoutRoutes.map((layout) => layout.load()),\n );\n\n // TYPE-EVIDENCE: the layout module default export is a React component. The cast labels it as a layout component type.\n return {\n layouts: layoutModules.map(\n (module) => module.default as ComponentType<LayoutProps>,\n ),\n locale: options.locale,\n metadata: documentContributions\n ? resolveMetadata(...await Promise.all([\n ...layoutModules.map((module) => resolveRouteMetadata(module, metadataContext)),\n resolveRouteMetadata(fallbackModule, metadataContext),\n ]))\n : resolveMetadata(),\n notFound,\n pathname,\n };\n } catch (error) {\n options.onLayoutError?.(error);\n\n return {\n layouts: [],\n locale: options.locale,\n metadata: documentContributions\n ? resolveMetadata(await resolveRouteMetadata(fallbackModule, metadataContext))\n : resolveMetadata(),\n notFound,\n pathname,\n };\n }\n}\n\nasync function resolveRouteMetadata(\n module: RouteModule | undefined,\n context: RouteContext,\n) {\n return typeof module?.metadata === \"function\"\n ? await module.metadata(context)\n : module?.metadata;\n}\n\nexport function findLayoutsForPath(\n manifest: RouteManifest,\n pathname: string,\n) {\n const pathnameSegments = splitPathname(pathname);\n\n // A route group contributes no URL segment, so a layout inside one cannot be\n // resolved from a pathname alone. Skipping them keeps an unmatched path from\n // picking up a layout it would never have inherited.\n return manifest.layouts.filter(\n (layout) =>\n !layout.fileSegments.some(isRouteGroupSegment) &&\n isFallbackForPath(layout.segments, pathnameSegments),\n );\n}\n\nexport function findPoliciesForPath(\n manifest: RouteManifest,\n pathname: string,\n) {\n const pathnameSegments = splitPathname(pathname);\n\n return manifest.policies.filter(\n (policy) =>\n !policy.fileSegments.some(isRouteGroupSegment) &&\n isFallbackForPath(policy.segments, pathnameSegments),\n );\n}\n\nfunction findClosestAttachedFile(\n fallbacks: FallbackRoute[],\n route: RouteRecord,\n) {\n for (let index = fallbacks.length - 1; index >= 0; index -= 1) {\n const fallback = fallbacks[index];\n\n if (isAttachedFileForRoute(fallback.fileSegments, route.fileSegments)) {\n return fallback;\n }\n }\n\n return undefined;\n}\n\nfunction findClosestFallbackForPath(\n fallbacks: FallbackRoute[],\n pathname: string,\n) {\n const pathnameSegments = splitPathname(pathname);\n\n for (let index = fallbacks.length - 1; index >= 0; index -= 1) {\n const fallback = fallbacks[index];\n\n if (\n !fallback.fileSegments.some(isRouteGroupSegment) &&\n isFallbackForPath(fallback.segments, pathnameSegments)\n ) {\n return fallback;\n }\n }\n\n return undefined;\n}\n\nfunction isFallbackForPath(\n fallbackSegments: string[],\n pathnameSegments: string[],\n) {\n return fallbackSegments.every((segment, index) => {\n if (segment.startsWith(\"*\")) {\n return pathnameSegments.length > index;\n }\n\n if (segment.startsWith(\":\")) {\n return Boolean(pathnameSegments[index]);\n }\n\n return pathnameSegments[index] === segment;\n });\n}\n\nasync function loadFallbackComponent(fallback: FallbackRoute | undefined) {\n if (!fallback) {\n return undefined;\n }\n\n const module = await fallback.load();\n\n // TYPE-EVIDENCE: the fallback module default export is a React component. The cast labels it as a component type.\n return module.default as ComponentType | undefined;\n}\n\nasync function loadErrorFallbackComponent(fallback: FallbackRoute | undefined) {\n if (!fallback) {\n return undefined;\n }\n\n const module = await fallback.load();\n\n // TYPE-EVIDENCE: the fallback module default export is a React component. The cast labels it as a route error component type.\n return module.default as ComponentType<RouteErrorProps> | undefined;\n}\n\nexport function findRouteMatch(routes: RouteRecord[], pathname: string) {\n const pathnameSegments = splitPathname(pathname);\n\n for (const route of routes) {\n const path = matchSegments(route.segments, pathnameSegments);\n\n if (path) {\n return { route, path };\n }\n }\n\n return null;\n}\n\nexport const loadRoute = loadPageRoute;\nexport const findPageMatch = findRouteMatch;\n\nexport function matchSegments(\n routeSegments: string[],\n pathnameSegments: string[],\n) {\n const path: PathVars = {};\n\n for (let index = 0; index < routeSegments.length; index += 1) {\n const routeSegment = routeSegments[index];\n const pathnameSegment = pathnameSegments[index];\n\n if (routeSegment?.startsWith(\"*\")) {\n path[routeSegment.slice(1)] = pathnameSegments.slice(index).join(\"/\");\n return path;\n }\n\n if (!pathnameSegment) {\n return null;\n }\n\n if (routeSegment.startsWith(\":\")) {\n path[routeSegment.slice(1)] = pathnameSegment;\n continue;\n }\n\n if (routeSegment !== pathnameSegment) {\n return null;\n }\n }\n\n return routeSegments.length === pathnameSegments.length ? path : null;\n}\n\nexport function isLayoutForPage(layoutSegments: string[], pageSegments: string[]) {\n return layoutSegments.every(\n (segment, index) => pageSegments[index] === segment,\n );\n}\n\nexport function isAttachedFileForRoute(\n attachedFileSegments: string[],\n routeFileSegments: string[],\n) {\n return attachedFileSegments.every(\n (segment, index) => routeFileSegments[index] === segment,\n );\n}\n\nexport function toRouteSegments(fileSegments: string[]) {\n return fileSegments.flatMap((segment) => {\n if (isRouteGroupSegment(segment)) {\n return [];\n }\n\n if (segment === \"index\") {\n return [];\n }\n\n if (segment.startsWith(\"[...\") && segment.endsWith(\"]\")) {\n return [`*${segment.slice(4, -1)}`];\n }\n\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n return [`:${segment.slice(1, -1)}`];\n }\n\n return [segment];\n });\n}\n\nexport function isRouteGroupSegment(segment: string) {\n return segment.startsWith(\"(\") && segment.endsWith(\")\");\n}\n\nexport function toRoutePattern(routeSegments: string[]) {\n if (routeSegments.length === 0) {\n return \"/\";\n }\n\n return `/${routeSegments.map(toRoutePatternSegment).join(\"/\")}`;\n}\n\nfunction toRoutePatternSegment(segment: string) {\n if (segment.startsWith(\"*\")) {\n return `[...${segment.slice(1)}]`;\n }\n\n if (segment.startsWith(\":\")) {\n return `[${segment.slice(1)}]`;\n }\n\n return segment;\n}\n\nfunction getDynamicSegmentNames(routeSegments: string[]) {\n return routeSegments.flatMap((segment) => {\n if (segment.startsWith(\":\") || segment.startsWith(\"*\")) {\n return [segment.slice(1)];\n }\n\n return [];\n });\n}\n\nfunction normalizeStaticPath(\n route: RouteRecord,\n pattern: string,\n path: Record<string, unknown>,\n) {\n const normalizedPath: PathVars = {};\n\n for (const segment of route.segments) {\n if (!segment.startsWith(\":\") && !segment.startsWith(\"*\")) {\n continue;\n }\n\n const name = segment.slice(1);\n const value = path[name];\n\n if (value === undefined) {\n throw new Error(\n `Static paths for \"${route.file}\" must include \"${name}\" for \"${pattern}\".`,\n );\n }\n\n if (!isStaticPathValue(value)) {\n throw new Error(\n `Static path \"${name}\" for \"${route.file}\" must be a string, number, or boolean.`,\n );\n }\n\n normalizedPath[name] = String(value);\n }\n\n return normalizedPath;\n}\n\nfunction isStaticPathValue(value: unknown): value is string | number | boolean {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n );\n}\n\nfunction fillStaticPathname(routeSegments: string[], path: PathVars) {\n const pathname = routeSegments.map((segment) => {\n if (segment.startsWith(\"*\")) {\n return path[segment.slice(1)]\n .split(\"/\")\n .filter(Boolean)\n .map(encodeURIComponent)\n .join(\"/\");\n }\n\n if (segment.startsWith(\":\")) {\n return encodeURIComponent(path[segment.slice(1)]);\n }\n\n return encodeURIComponent(segment);\n }).filter(Boolean).join(\"/\");\n\n return `/${pathname}`;\n}\n\nexport function scoreRoute(fileSegments: string[]) {\n return toRouteSegments(fileSegments).reduce((score, segment) => {\n if (segment.startsWith(\"*\")) {\n return score;\n }\n\n if (segment.startsWith(\":\")) {\n return score + 1;\n }\n\n return score + 2;\n }, 0);\n}\n\nexport function splitPathname(pathname: string) {\n return pathname\n .replace(/^\\/|\\/$/g, \"\")\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => {\n try {\n // Split before decoding so `%2F` remains content in one segment\n // instead of silently changing the route shape.\n return decodeURIComponent(segment);\n } catch (cause) {\n throw new MalformedPathnameError(pathname, { cause });\n }\n });\n}\n\nexport class MalformedPathnameError extends URIError {\n readonly pathname: string;\n\n constructor(pathname: string, options?: ErrorOptions) {\n super(\n `Malformed percent encoding in URL pathname ${JSON.stringify(pathname)}.`,\n options,\n );\n this.name = \"MalformedPathnameError\";\n this.pathname = pathname;\n }\n}\n","import type { InitialRouteData, NavigationDocument } from \"../document\";\n\nexport const NAVIGATION_DATA_HEADER = \"x-demiurge-navigation\";\nexport const NAVIGATION_DATA_REQUEST = \"data\";\nexport const NAVIGATION_DATA_RESPONSE = \"data\";\nexport const NAVIGATION_ERROR_RESPONSE = \"error\";\nexport const NAVIGATION_NOT_FOUND_RESPONSE = \"not-found\";\n\nexport function isNavigationDataRequest(request: Request) {\n return request.headers.get(NAVIGATION_DATA_HEADER) === NAVIGATION_DATA_REQUEST;\n}\n\nexport function createNavigationDataResponse(\n data: unknown,\n options: {\n document?: NavigationDocument;\n error?: InitialRouteData[\"error\"];\n headers?: HeadersInit;\n kind?: typeof NAVIGATION_DATA_RESPONSE |\n typeof NAVIGATION_ERROR_RESPONSE |\n typeof NAVIGATION_NOT_FOUND_RESPONSE;\n status?: number;\n locale?: string;\n } = {},\n) {\n const headers = new Headers(options.headers);\n headers.set(\"cache-control\", \"no-store\");\n headers.set(\n NAVIGATION_DATA_HEADER,\n options.kind ?? NAVIGATION_DATA_RESPONSE,\n );\n headers.append(\"vary\", NAVIGATION_DATA_HEADER);\n\n return Response.json(\n {\n data,\n document: options.document,\n error: options.error,\n hasData: true,\n locale: options.locale,\n } satisfies InitialRouteData,\n {\n headers,\n status: options.status,\n },\n );\n}\n\nexport function markNavigationResponse(\n response: Response,\n kind: typeof NAVIGATION_ERROR_RESPONSE | typeof NAVIGATION_NOT_FOUND_RESPONSE,\n) {\n response.headers.set(\"cache-control\", \"no-store\");\n response.headers.set(NAVIGATION_DATA_HEADER, kind);\n response.headers.append(\"vary\", NAVIGATION_DATA_HEADER);\n return response;\n}\n","/**\n * Narrows a value to a keyed object, rejecting arrays.\n *\n * This is the guard for parsing a value that is supposed to be a record: a\n * decoded session payload, a policy object, a cache key map. An array is a\n * `typeof \"object\"` too, so a caller that reads named properties needs the\n * array rejected rather than narrowed to a record whose keys are all\n * missing. Use this one unless a caller genuinely accepts either shape.\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Narrows a value to any non-null object, arrays included.\n *\n * This is the weaker guard, for the callers that only need to know a value is\n * not a primitive before probing it further. Reach for {@link isPlainObject}\n * instead whenever an array reaching the narrowed branch would be a defect.\n */\nexport function isObjectLike(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","export type PathValue = string | number | boolean;\nexport type SearchValue = PathValue | null | undefined;\nexport type SearchValues = Record<\n string,\n SearchValue | readonly SearchValue[]\n>;\nexport type PathVars = Record<string, string>;\n\nexport interface RoutePathVars {}\n\nexport interface RouteConcretePaths {}\n\nexport interface RouteRequestContexts {}\n\nexport interface RouteMutationMethods {}\n\ntype KnownMutationPath = keyof RouteMutationMethods & string;\ntype HasGeneratedMutations = [KnownMutationPath] extends [never] ? false : true;\n\nexport type MutationRoute = HasGeneratedMutations extends true\n ? KnownMutationPath\n : string;\n\nexport type MutationMethodFor<TPath extends MutationRoute> =\n TPath extends KnownMutationPath\n ? keyof RouteMutationMethods[TPath] & string\n : \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport type MutationDataFor<\n TPath extends MutationRoute,\n TMethod extends MutationMethodFor<TPath>,\n> = TPath extends KnownMutationPath\n ? TMethod extends keyof RouteMutationMethods[TPath]\n ? RouteMutationMethods[TPath][TMethod] extends { data: infer TData }\n ? TData\n : never\n : never\n : unknown;\n\nexport type MutationFieldsFor<\n TPath extends MutationRoute,\n TMethod extends MutationMethodFor<TPath>,\n> = TPath extends KnownMutationPath\n ? TMethod extends keyof RouteMutationMethods[TPath]\n ? RouteMutationMethods[TPath][TMethod] extends { fields: infer TField extends string }\n ? TField\n : never\n : never\n : string;\n\ntype KnownRoutePath = keyof RoutePathVars & string;\ntype KnownConcretePath = RouteConcretePaths[keyof RouteConcretePaths] & string;\ntype HasGeneratedRoutes = [KnownRoutePath] extends [never] ? false : true;\ntype WithUrlSuffix<TPath extends string> =\n | TPath\n | `${TPath}?${string}`\n | `${TPath}#${string}`\n | `${TPath}?${string}#${string}`;\ntype PathnameOf<THref extends string> =\n THref extends `${infer TWithoutHash}#${string}`\n ? TWithoutHash extends `${infer TPath}?${string}` ? TPath : TWithoutHash\n : THref extends `${infer TPath}?${string}` ? TPath : THref;\n\nexport type AppPath = HasGeneratedRoutes extends true ? KnownRoutePath : string;\n\nexport type AppHref = HasGeneratedRoutes extends true\n ? WithUrlSuffix<KnownRoutePath | KnownConcretePath>\n : string;\n\nexport type PathVarsFor<TPath extends string> =\n TPath extends KnownRoutePath ? RoutePathVars[TPath] : never;\n\nexport type RouteParamsFor<TPath extends string> =\n TPath extends KnownRoutePath\n ? { [K in keyof RoutePathVars[TPath]]: string }\n : PathVars;\n\ntype HasPathVars<TPath extends string> =\n keyof PathVarsFor<TPath> extends never ? false : true;\n\ntype LinkOptions = {\n hash?: string;\n search?: string | URLSearchParams | SearchValues;\n};\n\nexport type LinkTo<TTo extends AppHref = AppHref> = LinkOptions & (\n PathnameOf<TTo> extends KnownRoutePath\n ? HasPathVars<PathnameOf<TTo>> extends true\n ? { to: TTo; path: PathVarsFor<PathnameOf<TTo>> }\n : { to: TTo; path?: never }\n : { to: TTo; path?: never }\n);\n\nexport type LinkTarget<TTo extends AppHref = AppHref> = TTo | LinkTo<TTo>;\n\nexport function href<const TTo extends AppHref>(target: LinkTarget<TTo>) {\n if (typeof target === \"string\") {\n return target;\n }\n\n const embedded = splitHref(fillPath(\n target.to,\n \"path\" in target ? target.path : undefined,\n ));\n const search = target.search === undefined\n ? embedded.search\n : serializeSearch(target.search);\n const hash = target.hash === undefined\n ? embedded.hash\n : target.hash\n ? target.hash.startsWith(\"#\") ? target.hash : `#${target.hash}`\n : \"\";\n\n return `${embedded.pathname}${search}${hash}`;\n}\n\nfunction splitHref(value: string) {\n const hashIndex = value.indexOf(\"#\");\n const beforeHash = hashIndex === -1 ? value : value.slice(0, hashIndex);\n const searchIndex = beforeHash.indexOf(\"?\");\n\n return {\n hash: hashIndex === -1 ? \"\" : value.slice(hashIndex),\n pathname: searchIndex === -1\n ? beforeHash\n : beforeHash.slice(0, searchIndex),\n search: searchIndex === -1 ? \"\" : beforeHash.slice(searchIndex),\n };\n}\n\nfunction serializeSearch(search: LinkOptions[\"search\"]) {\n if (!search) {\n return \"\";\n }\n\n if (typeof search === \"string\") {\n return search.startsWith(\"?\") ? search : `?${search}`;\n }\n\n const params = search instanceof URLSearchParams\n ? search\n : createSearchParams(search);\n const value = params.toString();\n return value ? `?${value}` : \"\";\n}\n\nfunction createSearchParams(search: SearchValues) {\n const params = new URLSearchParams();\n\n for (const [name, rawValue] of Object.entries(search)) {\n const values = Array.isArray(rawValue) ? rawValue : [rawValue];\n\n for (const value of values) {\n if (value !== null && value !== undefined) {\n params.append(name, String(value));\n }\n }\n }\n\n return params;\n}\n\nfunction fillPath(pattern: string, path: Record<string, PathValue> | undefined) {\n if (!path) {\n return pattern;\n }\n\n return pattern.replace(\n /\\[(\\.\\.\\.)?([a-zA-Z_$][a-zA-Z0-9_$]*)\\]/g,\n (_match, catchall: string | undefined, name: string) => {\n const value = path[name];\n\n if (value === undefined) {\n throw new Error(`Missing path value for \"${name}\" in route \"${pattern}\".`);\n }\n\n if (catchall) {\n return String(value)\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => encodeURIComponent(segment))\n .join(\"/\");\n }\n\n return encodeURIComponent(String(value));\n },\n );\n}\n","export interface RouteLocales {}\n\ntype KnownLocale = keyof RouteLocales & string;\nexport type AppLocale = [KnownLocale] extends [never] ? string : KnownLocale;\nexport type LocaleSource = \"path\" | \"domain\" | \"cookie\" | \"accept-language\" | \"default\";\n\nexport type LocaleConfiguration<TLocale extends string = string> = {\n aliases?: Readonly<Record<string, TLocale>>;\n cookie?: { name: string };\n defaultLocale: TLocale;\n directions?: Partial<Readonly<Record<TLocale, \"ltr\" | \"rtl\">>>;\n domains?: Partial<Readonly<Record<TLocale, string>>>;\n path?: {\n labels: Readonly<Record<TLocale, string>>;\n prefixDefault?: boolean;\n reserved?: readonly string[];\n };\n resolver?: LocaleResolver<TLocale>;\n supportedLocales: readonly TLocale[];\n xDefault?: TLocale;\n};\n\nexport type LocaleDirection = \"ltr\" | \"rtl\";\n\nexport type LocaleResolverInput<TLocale extends string = string> = {\n configuration: LocaleConfiguration<TLocale>;\n defaultResolution: LocaleResolution<TLocale>;\n request: Request;\n};\n\nexport type LocaleResolver<TLocale extends string = string> = (\n input: LocaleResolverInput<TLocale>,\n) => LocaleResolution<TLocale>;\n\nexport type LocaleResolution<TLocale extends string = string> = {\n locale: TLocale;\n pathname: string;\n redirect?: URL;\n source: LocaleSource;\n unsupported: boolean;\n};\n\nexport function defineLocales<const TLocale extends string>(\n configuration: LocaleConfiguration<TLocale>,\n): LocaleConfiguration<TLocale> {\n validateLocales(configuration);\n const canonical = new Map(\n configuration.supportedLocales.map((locale) => [locale, canonicalLocale(locale)]),\n );\n const normalizeTarget = (locale: string) => {\n const supported = configuration.supportedLocales.find((value) => value === locale);\n if (!supported) throw new Error(`The locale target \"${locale}\" must be supported.`);\n return canonical.get(supported) ?? supported;\n };\n const normalizedLabels = configuration.path && Object.fromEntries(\n configuration.supportedLocales.map((locale) => [\n canonicalLocale(locale),\n configuration.path?.labels[locale].toLowerCase(),\n ]),\n );\n // TYPE-EVIDENCE: the entries above include one normalized label for every TLocale value.\n const labels = normalizedLabels as Record<TLocale, string> | undefined;\n const normalizedDomains = configuration.domains && Object.fromEntries(\n configuration.supportedLocales.flatMap((locale) => {\n const domain = configuration.domains?.[locale];\n return domain ? [[canonicalLocale(locale), normalizeDomain(domain)]] : [];\n }),\n );\n // TYPE-EVIDENCE: each domain entry uses a supported TLocale value as its key.\n const domains = normalizedDomains as Partial<Record<TLocale, string>> | undefined;\n return {\n ...configuration,\n aliases: configuration.aliases && Object.fromEntries(\n Object.entries(configuration.aliases).map(([alias, locale]) => [alias.toLowerCase(), normalizeTarget(String(locale))]),\n ),\n defaultLocale: normalizeTarget(configuration.defaultLocale),\n // TYPE-EVIDENCE: validation restricts each direction key to a supported TLocale value.\n directions: configuration.directions && Object.fromEntries(\n Object.entries(configuration.directions).map(([locale, direction]) => [\n canonicalLocale(locale),\n direction,\n ]),\n ) as Partial<Record<TLocale, LocaleDirection>>,\n domains,\n path: configuration.path && {\n ...configuration.path,\n labels: labels!,\n reserved: configuration.path.reserved?.map((label) => label.toLowerCase()),\n },\n supportedLocales: configuration.supportedLocales.map(canonicalLocale),\n xDefault: configuration.xDefault && normalizeTarget(configuration.xDefault),\n };\n}\n\nexport function localeDirection<TLocale extends string>(\n locale: TLocale,\n configuration?: LocaleConfiguration<TLocale>,\n): LocaleDirection {\n const configured = configuration?.directions?.[locale];\n if (configured) return configured;\n\n const localeInformation = new Intl.Locale(locale);\n const direction = localeInformation.textInfo?.direction;\n if (direction) return direction;\n\n return rtlScripts.has(localeInformation.maximize().script ?? \"\") ? \"rtl\" : \"ltr\";\n}\n\nexport function resolveLocale<TLocale extends string>(\n request: Request,\n configuration: LocaleConfiguration<TLocale>,\n): LocaleResolution<TLocale> {\n validateLocales(configuration);\n const url = new URL(request.url);\n const [label = \"\", ...rest] = url.pathname.slice(1).split(\"/\");\n const pathLocale = localeForLabel(label, configuration);\n const unsupported = configuration.path?.reserved?.some(\n (value) => value.toLowerCase() === label.toLowerCase(),\n ) ?? false;\n const domainLocale = localeForDomain(url.hostname, configuration);\n const cookie = cookieLocale(request, configuration);\n const language = languageLocale(request.headers.get(\"accept-language\"), configuration);\n const locale = pathLocale ?? domainLocale ?? cookie ?? language ?? configuration.defaultLocale;\n const source: LocaleSource = pathLocale ? \"path\" : domainLocale ? \"domain\" : cookie ? \"cookie\" : language ? \"accept-language\" : \"default\";\n const pathname = pathLocale || unsupported ? `/${rest.join(\"/\")}`.replace(/\\/$/, \"\") || \"/\" : url.pathname;\n const canonical = localeUrl(url, pathname, locale, configuration);\n const defaultResolution: LocaleResolution<TLocale> = {\n locale,\n pathname,\n redirect: !unsupported && canonical.href !== url.href ? canonical : undefined,\n source,\n unsupported,\n };\n const resolution = configuration.resolver?.({\n configuration,\n defaultResolution,\n request,\n }) ?? defaultResolution;\n\n if (!configuration.supportedLocales.includes(resolution.locale)) {\n throw new Error(\n `The locale resolver returned unsupported locale ${JSON.stringify(resolution.locale)}.`,\n );\n }\n\n if (\n resolution.redirect &&\n resolution.redirect.origin !== url.origin &&\n !Object.values(configuration.domains ?? {}).includes(resolution.redirect.hostname)\n ) {\n throw new Error(\"The locale resolver returned an external redirect.\");\n }\n\n return resolution;\n}\n\nexport function localizeHref<TLocale extends string>(\n href: string,\n locale: TLocale,\n configuration: LocaleConfiguration<TLocale>,\n base = \"http://demiurge.local\",\n) {\n const url = new URL(href, base);\n const current = localeForLabel(url.pathname.slice(1).split(\"/\")[0] ?? \"\", configuration);\n const pathname = current ? `/${url.pathname.slice(1).split(\"/\").slice(1).join(\"/\")}`.replace(/\\/$/, \"\") || \"/\" : url.pathname;\n const result = localeUrl(url, pathname, locale, configuration);\n const baseUrl = new URL(base);\n return result.origin === baseUrl.origin\n ? `${result.pathname}${result.search}${result.hash}`\n : result.href;\n}\n\nexport function applicationPathname<TLocale extends string>(pathname: string, configuration?: LocaleConfiguration<TLocale>) {\n if (!configuration) return pathname;\n const parts = pathname.slice(1).split(\"/\");\n return localeForLabel(parts[0] ?? \"\", configuration)\n ? `/${parts.slice(1).join(\"/\")}`.replace(/\\/$/, \"\") || \"/\"\n : pathname;\n}\n\nfunction localeUrl<TLocale extends string>(source: URL, pathname: string, locale: TLocale, configuration: LocaleConfiguration<TLocale>) {\n const result = new URL(source);\n const label = configuration.path?.labels[locale];\n const prefix = label && (locale !== configuration.defaultLocale || configuration.path?.prefixDefault);\n result.pathname = prefix ? `/${label}${pathname === \"/\" ? \"\" : pathname}` : pathname;\n const domain = configuration.domains?.[locale];\n if (domain) result.hostname = domain;\n return result;\n}\n\nfunction localeForLabel<TLocale extends string>(label: string, configuration: LocaleConfiguration<TLocale>) {\n const entry = Object.entries(configuration.path?.labels ?? {}).find(([, value]) => String(value).toLowerCase() === label.toLowerCase());\n if (entry) {\n // TYPE-EVIDENCE: LocaleConfiguration keys each path label with TLocale.\n return entry[0] as TLocale;\n }\n // TYPE-EVIDENCE: LocaleConfiguration constrains every alias target to TLocale.\n return Object.entries(configuration.aliases ?? {}).find(([value]) => value.toLowerCase() === label.toLowerCase())?.[1] as TLocale | undefined;\n}\n\nfunction localeForDomain<TLocale extends string>(host: string, configuration: LocaleConfiguration<TLocale>) {\n // TYPE-EVIDENCE: LocaleConfiguration keys each domain with TLocale.\n return Object.entries(configuration.domains ?? {}).find(([, value]) => String(value).toLowerCase() === host.toLowerCase())?.[0] as TLocale | undefined;\n}\n\nfunction cookieLocale<TLocale extends string>(request: Request, configuration: LocaleConfiguration<TLocale>) {\n const name = configuration.cookie?.name;\n if (!name) return undefined;\n const value = request.headers.get(\"cookie\")?.split(\";\").map((part) => part.trim()).find((part) => part.startsWith(`${name}=`))?.slice(name.length + 1);\n return configuration.supportedLocales.find((locale) => locale === value);\n}\n\nfunction languageLocale<TLocale extends string>(header: string | null, configuration: LocaleConfiguration<TLocale>) {\n if (!header) return undefined;\n const values = header.split(\",\").map((part, order) => {\n const [tag = \"\", ...parameters] = part.trim().split(\";\");\n const quality = parameters.find((parameter) => parameter.trim().toLowerCase().startsWith(\"q=\"));\n const q = quality ? Number(quality.trim().slice(2)) : 1;\n return { order, q, tag: tag.trim() };\n }).filter(({ q, tag }) => tag !== \"\" && Number.isFinite(q) && q > 0 && q <= 1)\n .sort((a, b) => b.q - a.q || a.order - b.order);\n for (const value of values) {\n if (value.tag === \"*\") return configuration.defaultLocale;\n let candidate = value.tag.toLowerCase();\n while (candidate) {\n const match = configuration.supportedLocales.find((locale) => locale.toLowerCase() === candidate) ??\n configuration.supportedLocales.find((locale) => locale.toLowerCase().startsWith(`${candidate}-`));\n if (match) return match;\n const separator = candidate.lastIndexOf(\"-\");\n if (separator < 0) break;\n candidate = candidate.slice(0, separator);\n }\n }\n return undefined;\n}\n\nfunction validateLocales<TLocale extends string>(configuration: LocaleConfiguration<TLocale>) {\n if (configuration.supportedLocales.length === 0) throw new Error(\"Locale configuration requires at least one supported locale.\");\n const canonical = configuration.supportedLocales.map(canonicalLocale);\n if (new Set(canonical).size !== canonical.length) throw new Error(\"Locale configuration contains duplicate canonical locales.\");\n if (!canonical.includes(canonicalLocale(configuration.defaultLocale))) throw new Error(\"The default locale must be supported.\");\n if (configuration.supportedLocales.length > 1 && !configuration.path && !configuration.domains) throw new Error(\"Multiple locales require a path or domain binding.\");\n const supported = new Set<string>(canonical);\n const assertTarget = (locale: string, kind: string) => {\n if (!supported.has(canonicalLocale(locale))) throw new Error(`The ${kind} target \"${locale}\" must be supported.`);\n };\n const identifiers = new Map<string, string>();\n const addIdentifier = (value: string, kind: string) => {\n const key = value.toLowerCase();\n const previous = identifiers.get(key);\n if (previous) throw new Error(`Locale ${kind} \"${value}\" conflicts with ${previous}.`);\n identifiers.set(key, `${kind} \"${value}\"`);\n };\n for (const [locale, label] of Object.entries(configuration.path?.labels ?? {})) {\n assertTarget(locale, \"path label\");\n if (!/^[a-z0-9][a-z0-9-]*$/i.test(String(label))) throw new Error(`Locale path label \"${label}\" is invalid.`);\n addIdentifier(String(label), \"path label\");\n }\n for (const [alias, locale] of Object.entries(configuration.aliases ?? {})) {\n assertTarget(String(locale), \"alias\");\n if (!/^[a-z0-9][a-z0-9-]*$/i.test(alias)) throw new Error(`Locale alias \"${alias}\" is invalid.`);\n addIdentifier(alias, \"alias\");\n }\n for (const value of configuration.path?.reserved ?? []) addIdentifier(value, \"reserved label\");\n const domains = new Set<string>();\n for (const [locale, domain] of Object.entries(configuration.domains ?? {})) {\n assertTarget(locale, \"domain\");\n const normalized = normalizeDomain(String(domain));\n if (domains.has(normalized)) throw new Error(`Locale domain \"${domain}\" is duplicated.`);\n domains.add(normalized);\n }\n for (const [locale, direction] of Object.entries(configuration.directions ?? {})) {\n assertTarget(locale, \"direction\");\n if (direction !== \"ltr\" && direction !== \"rtl\") {\n throw new Error(`Locale direction for \"${locale}\" must be \"ltr\" or \"rtl\".`);\n }\n }\n if (configuration.cookie && !/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(configuration.cookie.name)) {\n throw new Error(\"The locale cookie name is invalid.\");\n }\n if (configuration.xDefault) assertTarget(configuration.xDefault, \"x-default\");\n}\n\nfunction canonicalLocale<TLocale extends string>(locale: TLocale): TLocale {\n const [canonical] = Intl.getCanonicalLocales(locale);\n if (!canonical) throw new Error(`Locale \"${locale}\" is invalid.`);\n // TYPE-EVIDENCE: canonicalization changes spelling only. It preserves the locale represented by TLocale.\n return canonical as TLocale;\n}\n\n// This list follows the CLDR scriptMetadata RTL field. Update it when the CLDR version changes.\nconst rtlScripts = new Set([\n \"Adlm\",\n \"Arab\",\n \"Armi\",\n \"Avst\",\n \"Chrs\",\n \"Cprt\",\n \"Elym\",\n \"Gara\",\n \"Hatr\",\n \"Hebr\",\n \"Hung\",\n \"Khar\",\n \"Lydi\",\n \"Mand\",\n \"Mani\",\n \"Mend\",\n \"Merc\",\n \"Mero\",\n \"Narb\",\n \"Nbat\",\n \"Nkoo\",\n \"Orkh\",\n \"Ougr\",\n \"Palm\",\n \"Phli\",\n \"Phlp\",\n \"Phnx\",\n \"Prti\",\n \"Rohg\",\n \"Samr\",\n \"Sarb\",\n \"Sidt\",\n \"Sogd\",\n \"Sogo\",\n \"Syrc\",\n \"Thaa\",\n \"Yezi\",\n]);\n\nfunction normalizeDomain(domain: string) {\n if (domain.includes(\":\" ) || domain.includes(\"/\") || domain.trim() !== domain) {\n throw new Error(`Locale domain \"${domain}\" must be a hostname.`);\n }\n const hostname = new URL(`https://${domain}`).hostname.toLowerCase();\n if (!hostname || hostname !== domain.toLowerCase()) throw new Error(`Locale domain \"${domain}\" must be a hostname.`);\n return hostname;\n}\n","import type {\n HtmlCapability,\n HttpRouteContext,\n JsonCapability,\n JsonLinesCapability,\n JsonLinesSource,\n MaybePromise,\n NotFoundCapability,\n RawResponseCapability,\n RedirectCapability,\n ResponseOptions,\n ResponseCapability,\n RouteValue,\n RouteRequestContextFor,\n ServerTimingInput,\n ServerTimingMetric,\n ServerSentEvent,\n ServerSentEventsCapability,\n ServerSentEventSource,\n TextCapability,\n StreamCapability,\n StreamChunk,\n StreamSource,\n} from \"./types\";\nimport { href, type AppHref, type LinkTarget } from \"../routing\";\n\nexport function json<\n T,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n value: JsonCapability<T, TPath, TValues>[\"value\"],\n init?: ResponseOptions,\n) {\n return {\n cors: init?.cors,\n kind: \"json\",\n security: init?.security,\n timing: normalizeServerTiming(init?.timing),\n value,\n init: withoutRouteOptions(init),\n } satisfies JsonCapability<T, TPath, TValues>;\n}\n\nexport function jsonl<\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n lines: RouteValue<JsonLinesSource, TPath, TValues>,\n init?: ResponseOptions,\n) {\n return {\n cors: init?.cors,\n init: withoutRouteOptions(init),\n kind: \"jsonl\",\n lines,\n security: init?.security,\n timing: normalizeServerTiming(init?.timing),\n } satisfies JsonLinesCapability<TPath, TValues>;\n}\n\nexport function text<\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n value: RouteValue<string, TPath, TValues>,\n init?: ResponseOptions,\n) {\n return {\n cors: init?.cors,\n kind: \"text\",\n security: init?.security,\n timing: normalizeServerTiming(init?.timing),\n value,\n init: withoutRouteOptions(init),\n } satisfies TextCapability<TPath, TValues>;\n}\n\nexport function html<\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n value: RouteValue<string, TPath, TValues>,\n init?: ResponseOptions,\n) {\n return {\n cors: init?.cors,\n kind: \"html\",\n security: init?.security,\n timing: normalizeServerTiming(init?.timing),\n value,\n init: withoutRouteOptions(init),\n } satisfies HtmlCapability<TPath, TValues>;\n}\n\nexport function redirect<const TTo extends AppHref>(\n to: LinkTarget<TTo>,\n init?: ResponseOptions | number,\n): RedirectCapability;\nexport function redirect<\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n to: RouteValue<string | URL, TPath, TValues>,\n init?: ResponseOptions | number,\n): RedirectCapability<TPath, TValues>;\nexport function redirect<\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n to: LinkTarget | RouteValue<string | URL, TPath, TValues>,\n init?: ResponseOptions | number,\n) {\n const options = typeof init === \"number\" ? undefined : init;\n\n // TYPE-EVIDENCE: the object literal carries the fields that the redirect capability type requires. The cast asserts that structural match.\n return {\n cors: options?.cors,\n kind: \"redirect\",\n security: options?.security,\n timing: normalizeServerTiming(options?.timing),\n to: isLinkTargetObject(to) ? href(to) : to,\n init: typeof init === \"number\" ? { status: init } : withoutRouteOptions(init),\n } as RedirectCapability<TPath, TValues>;\n}\n\nexport function notFound<\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n body?: RouteValue<string, TPath, TValues>,\n init?: ResponseOptions,\n) {\n return {\n cors: init?.cors,\n kind: \"not-found\",\n security: init?.security,\n timing: normalizeServerTiming(init?.timing),\n body,\n init: withoutRouteOptions(init),\n } satisfies NotFoundCapability<TPath, TValues>;\n}\n\nexport function response<\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n response: RouteValue<Response, TPath, TValues>,\n init?: Pick<ResponseOptions, \"cors\" | \"security\" | \"timing\">,\n) {\n return {\n cors: init?.cors,\n kind: \"response\",\n response,\n security: init?.security,\n timing: normalizeServerTiming(init?.timing),\n } satisfies RawResponseCapability<TPath, TValues>;\n}\n\nexport function stream<\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n body: RouteValue<StreamSource, TPath, TValues>,\n init?: ResponseOptions,\n) {\n return {\n body,\n cors: init?.cors,\n init: withoutRouteOptions(init),\n kind: \"stream\",\n security: init?.security,\n timing: normalizeServerTiming(init?.timing),\n } satisfies StreamCapability<TPath, TValues>;\n}\n\nexport function sse<\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n events: RouteValue<ServerSentEventSource, TPath, TValues>,\n init?: ResponseOptions,\n) {\n return {\n cors: init?.cors,\n events,\n init: withoutRouteOptions(init),\n kind: \"sse\",\n security: init?.security,\n timing: normalizeServerTiming(init?.timing),\n } satisfies ServerSentEventsCapability<TPath, TValues>;\n}\n\nexport function serverTiming(\n ...metrics: readonly ServerTimingMetric[]\n): readonly ServerTimingMetric[] {\n return metrics;\n}\n\nexport async function toResponse<\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n capability: ResponseCapability<TPath, TValues>,\n context: HttpRouteContext<TPath, TValues>,\n) {\n switch (capability.kind) {\n case \"json\": {\n return new Response(JSON.stringify(await resolveValue(capability.value, context)), {\n ...capability.init,\n headers: withDefaultHeader(\n capability.init?.headers,\n \"content-type\",\n \"application/json; charset=utf-8\",\n ),\n });\n }\n case \"jsonl\": {\n return new Response(\n createJsonLinesStream(await resolveValue(capability.lines, context)),\n {\n ...capability.init,\n headers: withDefaultHeaders(capability.init?.headers, {\n \"cache-control\": \"no-cache\",\n \"content-type\": \"application/x-ndjson; charset=utf-8\",\n \"x-accel-buffering\": \"no\",\n }),\n },\n );\n }\n case \"text\": {\n return new Response(await resolveValue(capability.value, context), {\n ...capability.init,\n headers: withDefaultHeader(\n capability.init?.headers,\n \"content-type\",\n \"text/plain; charset=utf-8\",\n ),\n });\n }\n case \"html\": {\n return new Response(await resolveValue(capability.value, context), {\n ...capability.init,\n headers: withDefaultHeader(\n capability.init?.headers,\n \"content-type\",\n \"text/html; charset=utf-8\",\n ),\n });\n }\n case \"redirect\": {\n const headers = new Headers(capability.init?.headers);\n headers.set(\"location\", String(await resolveValue(capability.to, context)));\n\n return new Response(null, {\n ...capability.init,\n headers,\n status: capability.init?.status ?? 302,\n });\n }\n case \"not-found\": {\n return new Response(\n capability.body ? await resolveValue(capability.body, context) : null,\n {\n ...capability.init,\n status: capability.init?.status ?? 404,\n },\n );\n }\n case \"response\": {\n return await resolveValue(capability.response, context);\n }\n case \"stream\": {\n return new Response(\n createGenericStream(await resolveValue(capability.body, context)),\n {\n ...capability.init,\n headers: withDefaultHeaders(capability.init?.headers, {\n \"content-type\": \"application/octet-stream\",\n \"x-accel-buffering\": \"no\",\n }),\n },\n );\n }\n case \"sse\": {\n return new Response(\n createSseStream(await resolveValue(capability.events, context)),\n {\n ...capability.init,\n headers: withDefaultHeaders(capability.init?.headers, {\n \"cache-control\": \"no-cache\",\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"x-accel-buffering\": \"no\",\n }),\n },\n );\n }\n }\n}\n\nasync function resolveValue<\n T,\n TPath extends string,\n TValues extends object,\n>(\n value: RouteValue<T, TPath, TValues>,\n context: HttpRouteContext<TPath, TValues>,\n) {\n if (typeof value !== \"function\") {\n return value;\n }\n\n // TYPE-EVIDENCE: the typeof check above confirms the value is a function. The cast gives it the route value function signature.\n return await (value as (context: HttpRouteContext) => MaybePromise<T>)(\n context,\n );\n}\n\nfunction withDefaultHeader(\n headers: HeadersInit | undefined,\n name: string,\n value: string,\n) {\n return withDefaultHeaders(headers, { [name]: value });\n}\n\nfunction withDefaultHeaders(\n headers: HeadersInit | undefined,\n defaults: Record<string, string>,\n) {\n const nextHeaders = new Headers(headers);\n\n for (const [name, value] of Object.entries(defaults)) {\n if (!nextHeaders.has(name)) {\n nextHeaders.set(name, value);\n }\n }\n\n return nextHeaders;\n}\n\nfunction createSseStream(events: ServerSentEventSource) {\n const encoder = new TextEncoder();\n const iterator = toAsyncIteratorSource(events);\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const next = await iterator.next();\n\n if (next.done) {\n controller.close();\n return;\n }\n\n controller.enqueue(encoder.encode(formatServerSentEvent(next.value)));\n },\n async cancel() {\n await iterator.return?.();\n },\n });\n}\n\nfunction createJsonLinesStream(lines: JsonLinesSource) {\n const encoder = new TextEncoder();\n const iterator = toAsyncIteratorSource(lines);\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const next = await iterator.next();\n\n if (next.done) {\n controller.close();\n return;\n }\n\n controller.enqueue(encoder.encode(`${JSON.stringify(next.value)}\\n`));\n },\n async cancel() {\n await iterator.return?.();\n },\n });\n}\n\nfunction createGenericStream(body: StreamSource) {\n const encoder = new TextEncoder();\n const iterator = toAsyncIteratorSource(body);\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const next = await iterator.next();\n\n if (next.done) {\n controller.close();\n return;\n }\n\n controller.enqueue(encodeStreamChunk(next.value, encoder));\n },\n async cancel() {\n await iterator.return?.();\n },\n });\n}\n\nfunction encodeStreamChunk(chunk: StreamChunk, encoder: TextEncoder) {\n return typeof chunk === \"string\" ? encoder.encode(chunk) : chunk;\n}\n\nfunction toAsyncIteratorSource<T>(\n source: Iterable<T> | AsyncIterable<T> | ReadableStream<T>,\n): AsyncIterator<T> {\n if (source instanceof ReadableStream) {\n const reader = source.getReader();\n\n return {\n async next() {\n return await reader.read();\n },\n async return() {\n reader.releaseLock();\n return { done: true, value: undefined };\n },\n };\n }\n\n if (Symbol.asyncIterator in source) {\n return source[Symbol.asyncIterator]();\n }\n\n return toAsyncIterator(source[Symbol.iterator]());\n}\n\nfunction toAsyncIterator<T>(iterator: Iterator<T>): AsyncIterator<T> {\n return {\n async next() {\n return iterator.next();\n },\n async return() {\n iterator.return?.();\n return { done: true, value: undefined };\n },\n };\n}\n\nfunction formatServerSentEvent(event: ServerSentEvent | string) {\n if (typeof event === \"string\") {\n return formatSseData(event);\n }\n\n const lines: string[] = [];\n\n if (event.comment !== undefined) {\n lines.push(...formatSseField(\"\", event.comment));\n }\n\n if (event.id !== undefined) {\n lines.push(...formatSseField(\"id\", event.id));\n }\n\n if (event.event !== undefined) {\n lines.push(...formatSseField(\"event\", event.event));\n }\n\n if (event.retry !== undefined) {\n if (!Number.isInteger(event.retry) || event.retry < 0) {\n throw new Error(\"SSE retry must be a non-negative integer.\");\n }\n\n lines.push(`retry: ${event.retry}`);\n }\n\n if (event.data !== undefined) {\n lines.push(...formatSseField(\"data\", stringifySseData(event.data)));\n }\n\n return `${lines.join(\"\\n\")}\\n\\n`;\n}\n\nfunction formatSseData(data: string) {\n return `${formatSseField(\"data\", data).join(\"\\n\")}\\n\\n`;\n}\n\nfunction formatSseField(name: string, value: string) {\n return value.split(/\\r\\n|\\r|\\n/).map((line) =>\n name ? `${name}: ${line}` : `: ${line}`,\n );\n}\n\nfunction stringifySseData(data: unknown) {\n return typeof data === \"string\" ? data : JSON.stringify(data);\n}\n\nfunction isLinkTargetObject(value: unknown): value is LinkTarget {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !(value instanceof URL) &&\n \"to\" in value\n );\n}\n\nfunction withoutRouteOptions(options: ResponseOptions | undefined) {\n if (!options) {\n return undefined;\n }\n\n const {\n cors: _cors,\n security: _security,\n timing: _timing,\n ...responseInit\n } = options;\n return responseInit;\n}\n\nexport function applyServerTimingHeader(\n response: Response,\n timing: readonly ServerTimingMetric[] | undefined,\n) {\n if (!timing?.length) {\n return response;\n }\n\n const headers = new Headers(response.headers);\n const timingHeader = renderServerTimingHeader(timing);\n const existingTimingHeader = headers.get(\"server-timing\");\n\n headers.set(\n \"server-timing\",\n existingTimingHeader\n ? `${existingTimingHeader}, ${timingHeader}`\n : timingHeader,\n );\n\n return new Response(response.body, {\n headers,\n status: response.status,\n statusText: response.statusText,\n });\n}\n\nexport function renderServerTimingHeader(\n timing: readonly ServerTimingMetric[],\n) {\n return timing.map(renderServerTimingMetric).join(\", \");\n}\n\nfunction normalizeServerTiming(timing: ServerTimingInput | undefined) {\n if (!timing) {\n return undefined;\n }\n\n return Array.isArray(timing) ? timing : [timing];\n}\n\nfunction renderServerTimingMetric(metric: ServerTimingMetric) {\n if (!isServerTimingToken(metric.name)) {\n throw new Error(\n `Server-Timing metric name \"${metric.name}\" is not a valid token.`,\n );\n }\n\n const parts = [metric.name];\n\n if (metric.duration !== undefined) {\n if (!Number.isFinite(metric.duration) || metric.duration < 0) {\n throw new Error(\"Server-Timing metric duration must be a non-negative finite number.\");\n }\n\n parts.push(`dur=${formatServerTimingDuration(metric.duration)}`);\n }\n\n if (metric.description !== undefined) {\n parts.push(`desc=\"${escapeServerTimingDescription(metric.description)}\"`);\n }\n\n return parts.join(\";\");\n}\n\nfunction isServerTimingToken(value: string) {\n return /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/.test(value);\n}\n\nfunction formatServerTimingDuration(duration: number) {\n return Number.isInteger(duration) ? String(duration) : String(duration);\n}\n\nfunction escapeServerTimingDescription(value: string) {\n return value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"');\n}\n","import type {\n CacheDuration,\n CacheKey,\n CacheTag,\n IdempotencyStore,\n} from \"../data\";\nimport type {\n CorsPolicy,\n RouteSecurityPolicy,\n} from \"../security\";\nimport type {\n HttpRouteContext,\n MaybePromise,\n JsonCapability,\n RawResponseCapability,\n ResponseCapability,\n RouteRequestContextFor,\n ServerTimingInput,\n} from \"./types\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { response, toResponse } from \"./response\";\nimport { RouteSerializationError } from \"./serialization\";\n\ndeclare const mutationInputFields: unique symbol;\n\nexport type MutationInput<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n> = {\n (context: HttpRouteContext<TPath, TValues>): MaybePromise<TInput>;\n};\n\ntype TypedMutationInput<\n TInput,\n TPath extends string,\n TValues extends object,\n TField extends string,\n> = MutationInput<TInput, TPath, TValues> & {\n readonly [mutationInputFields]: { field: TField; input: TInput };\n};\n\ntype MutationInputValue<TParser> = TParser extends {\n readonly [mutationInputFields]: { input: infer TInput };\n} ? TInput : never;\n\ntype MutationInputField<TParser> = TParser extends {\n readonly [mutationInputFields]: { field: infer TField extends string };\n} ? TField : never;\n\nexport const MUTATION_REQUEST_HEADER = \"x-demiurge-mutation\";\nexport const MUTATION_REQUEST_VALUE = \"data;v=1\";\nexport const MUTATION_RESPONSE_MEDIA_TYPE = \"application/vnd.demiurge.mutation+json;v=1\";\n\ndeclare const mutationResultType: unique symbol;\n\nexport type MutationMethod = \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport type MutationCapability<\n TResult = unknown,\n TField extends string = string,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n> = RawResponseCapability<TPath, TValues> & {\n mutation: true;\n readonly [mutationResultType]: {\n data: TResult;\n fields: TField;\n };\n};\n\nexport type MutationMethodsOf<TModule> = {\n [TMethod in keyof TModule as\n TMethod extends MutationMethod\n ? TModule[TMethod] extends MutationCapability ? TMethod : never\n : never]: TModule[TMethod] extends MutationCapability<infer TResult>\n ? TModule[TMethod] extends MutationCapability<TResult, infer TField>\n ? { data: TResult; fields: TField }\n : never\n : never;\n};\n\ntype MutationResponseData<TResult> = Awaited<TResult> extends\n JsonCapability<infer TData, string, object> ? TData : unknown;\n\nexport type MutationValidationIssue<TField extends string = string> = {\n code: string;\n message: string;\n path: readonly [] | readonly [TField, ...(string | number)[]];\n};\n\nexport type MutationValidation<TField extends string = string> = {\n issues: readonly MutationValidationIssue<TField>[];\n};\n\nexport class MutationValidationError<TField extends string = string>\n extends Error {\n readonly validation: MutationValidation<TField>;\n\n constructor(validation: MutationValidation<TField>) {\n super(\"Mutation input validation failed.\");\n this.name = \"MutationValidationError\";\n this.validation = {\n issues: validation.issues.map((issue) => ({\n ...issue,\n path: [...issue.path],\n })),\n };\n }\n}\n\nexport type MutationContext<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n> = HttpRouteContext<TPath, TValues> & {\n input: TInput;\n};\n\nexport type MutationIdempotency<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n> = {\n key: CacheKey | ((context: MutationContext<TInput, TPath, TValues>) => CacheKey);\n store: IdempotencyStore;\n ttl?: CacheDuration;\n};\n\nexport type MutationRevalidation<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n> =\n | MutationRevalidationDeclaration\n | ((\n context: MutationContext<TInput, TPath, TValues>,\n ) => MaybePromise<MutationRevalidationDeclaration>);\n\nexport type MutationRevalidationDeclaration = {\n keys?: readonly CacheKey[];\n tags?: readonly CacheTag[];\n};\n\nexport const MUTATION_REVALIDATION_HEADER = \"x-demiurge-revalidate-tags\";\n\nexport type MutationOptions<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n TResult extends Response | ResponseCapability<TPath, TValues> =\n Response | ResponseCapability<TPath, TValues>,\n> = {\n cors?: CorsPolicy;\n handler: (\n context: MutationContext<NoInfer<TInput>, TPath, TValues>,\n ) => MaybePromise<TResult>;\n idempotency?: MutationIdempotency<NoInfer<TInput>, TPath, TValues>;\n input?: MutationInput<TInput, TPath, TValues>;\n revalidateRoute?: boolean;\n revalidate?: MutationRevalidation<NoInfer<TInput>, TPath, TValues>;\n security?: RouteSecurityPolicy;\n timing?: ServerTimingInput;\n};\n\nexport function mutation<\n TParser extends TypedMutationInput<unknown, TPath, TValues, string>,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n TResult extends Response | ResponseCapability<TPath, TValues> =\n Response | ResponseCapability<TPath, TValues>,\n>(\n options: Omit<MutationOptions<\n MutationInputValue<TParser>,\n TPath,\n TValues,\n TResult\n >, \"input\"> & {\n input: TParser;\n },\n): MutationCapability<\n MutationResponseData<TResult>,\n MutationInputField<TParser>,\n TPath,\n TValues\n>;\n\nexport function mutation<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n TResult extends Response | ResponseCapability<TPath, TValues> =\n Response | ResponseCapability<TPath, TValues>,\n>(\n options: MutationOptions<TInput, TPath, TValues, TResult> & {\n input: MutationInput<TInput, TPath, TValues>;\n },\n): MutationCapability<MutationResponseData<TResult>, string, TPath, TValues>;\n\nexport function mutation<\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n TResult extends Response | ResponseCapability<TPath, TValues> =\n Response | ResponseCapability<TPath, TValues>,\n>(\n options: MutationOptions<undefined, TPath, TValues, TResult> & {\n input?: undefined;\n },\n): MutationCapability<MutationResponseData<TResult>, string, TPath, TValues>;\n\nexport function mutation<\n TInput = undefined,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n TResult extends Response | ResponseCapability<TPath, TValues> =\n Response | ResponseCapability<TPath, TValues>,\n TField extends string = string,\n>(\n options: MutationOptions<TInput, TPath, TValues, TResult>,\n): MutationCapability<MutationResponseData<TResult>, TField, TPath, TValues> {\n const capability = response<TPath, TValues>(\n async (context) => {\n let input: TInput;\n try {\n // TYPE-EVIDENCE: the input defaults to undefined when the caller did not provide a parser. The cast labels that fallback as TInput.\n const absentInput = undefined as TInput;\n input = options.input\n ? await options.input(context)\n : absentInput;\n } catch (error) {\n if (!(error instanceof MutationValidationError)) throw error;\n return mutationValidationResponse(\n context.request,\n error.validation,\n context.pathname,\n );\n }\n const mutationContext: MutationContext<TInput, TPath, TValues> = {\n ...context,\n input,\n };\n const run = async () => {\n const result = await options.handler(mutationContext);\n const authoritative = result instanceof Response ||\n result.kind === \"response\" || result.kind === \"not-found\";\n const response = await resolveMutationResult(\n await validateMutationCapability(result, context),\n context,\n );\n return authoritative || !isMutationProtocolRequest(context.request)\n ? response\n : await mutationProtocolResponse(\n response,\n options.revalidateRoute === true,\n context.pathname,\n );\n };\n\n if (!options.idempotency) {\n const result = await run();\n if (!isSuccessfulMutationResponse(result)) return result;\n const revalidation = await resolveRevalidation(\n options.revalidate,\n mutationContext,\n );\n return await addRevalidationHeader(\n result,\n revalidation,\n context.pathname,\n );\n }\n\n const key = typeof options.idempotency.key === \"function\"\n ? options.idempotency.key(mutationContext)\n : options.idempotency.key;\n const result = await options.idempotency.store.run({\n fn: run,\n key,\n ttl: options.idempotency.ttl,\n });\n\n if (result.replayed) return withoutRevalidationHeader(result.value);\n if (!isSuccessfulMutationResponse(result.value)) return result.value;\n const revalidation = await resolveRevalidation(\n options.revalidate,\n mutationContext,\n );\n return await addRevalidationHeader(\n result.value,\n revalidation,\n context.pathname,\n );\n },\n {\n cors: options.cors,\n security: options.security,\n timing: options.timing,\n },\n );\n\n // TYPE-EVIDENCE: mutation() creates the raw response capability above. The\n // brand records the handler's JSON result type without adding runtime data.\n return {\n ...capability,\n mutation: true,\n } as MutationCapability<\n MutationResponseData<TResult>,\n TField,\n TPath,\n TValues\n >;\n}\n\nfunction isMutationProtocolRequest(request: Request) {\n return request.headers.get(MUTATION_REQUEST_HEADER) === MUTATION_REQUEST_VALUE;\n}\n\nfunction mutationValidationResponse(\n request: Request,\n validation: MutationValidation,\n route: string,\n) {\n const body = isMutationProtocolRequest(request)\n ? { version: 1, status: \"invalid\", validation }\n : { type: \"validation-error\", validation };\n const serialized = serializeMutationResult(body, route);\n if (isMutationProtocolRequest(request)) {\n return new Response(serialized, {\n headers: { \"content-type\": MUTATION_RESPONSE_MEDIA_TYPE },\n status: 400,\n });\n }\n return new Response(serialized, {\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n status: 400,\n });\n}\n\nasync function mutationProtocolResponse(\n response: Response,\n revalidateRoute: boolean,\n route: string,\n) {\n if (response.status >= 300 && response.status < 400) {\n const location = response.headers.get(\"location\");\n if (!location) return response;\n return new Response(serializeMutationResult({\n version: 1,\n status: \"redirect\",\n location,\n history: response.status === 301 || response.status === 308 ? \"replace\" : \"push\",\n }, route), {\n headers: { \"content-type\": MUTATION_RESPONSE_MEDIA_TYPE },\n status: 200,\n });\n }\n const data = response.headers.get(\"content-type\")?.includes(\"json\")\n ? await response.clone().json().catch(() => undefined)\n : undefined;\n return new Response(serializeMutationResult({\n version: 1,\n status: response.ok ? \"success\" : \"failed\",\n ...(revalidateRoute && response.ok ? { revalidate: true } : {}),\n ...(response.ok && data !== undefined ? { data } : {}),\n }, route), {\n headers: { \"content-type\": MUTATION_RESPONSE_MEDIA_TYPE },\n status: response.status,\n });\n}\n\nasync function validateMutationCapability<\n TPath extends string,\n TValues extends object,\n>(\n result: Response | ResponseCapability<TPath, TValues>,\n context: HttpRouteContext<TPath, TValues>,\n) {\n if (result instanceof Response || result.kind !== \"json\") return result;\n const value = typeof result.value === \"function\"\n ? await result.value(context)\n : result.value;\n // The value of a JSON mutation result is the browser payload. The framework\n // sends the same value in the mutation response.\n assertJsonValue(value, context.pathname);\n return { ...result, value };\n}\n\nfunction serializeMutationResult(value: unknown, route: string) {\n assertJsonValue(value, route);\n return JSON.stringify(value);\n}\n\nfunction assertJsonValue(\n value: unknown,\n route: string,\n path: readonly string[] = [],\n seen = new Set<object>(),\n): void {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") {\n return;\n }\n if (typeof value === \"number\") {\n if (Number.isFinite(value)) return;\n throw unsupportedMutationValue(route, path);\n }\n if (typeof value !== \"object\") throw unsupportedMutationValue(route, path);\n if (seen.has(value)) throw unsupportedMutationValue(route, path);\n seen.add(value);\n\n if (Array.isArray(value)) {\n for (const key of Reflect.ownKeys(value)) {\n if (key === \"length\") continue;\n if (typeof key !== \"string\" || !/^(0|[1-9][0-9]*)$/.test(key)) {\n throw unsupportedMutationValue(route, [...path, String(key)]);\n }\n }\n for (let index = 0; index < value.length; index += 1) {\n if (!(index in value)) {\n throw unsupportedMutationValue(route, [...path, String(index)]);\n }\n assertJsonValue(value[index], route, [...path, String(index)], seen);\n }\n } else {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw unsupportedMutationValue(route, path);\n }\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== \"string\") {\n throw unsupportedMutationValue(route, [...path, \"<symbol>\"]);\n }\n assertJsonValue(\n Object.getOwnPropertyDescriptor(value, key)?.value,\n route,\n [...path, key],\n seen,\n );\n }\n }\n seen.delete(value);\n}\n\nfunction unsupportedMutationValue(route: string, path: readonly string[]) {\n const field = path.length === 0 ? \"<root>\" : path.join(\".\");\n return new RouteSerializationError(\n `Route ${route} could not serialize the field ${field} for the browser. A mutation result contains a value that JSON cannot serialize.`,\n route,\n field,\n );\n}\n\nfunction isSuccessfulMutationResponse(response: Response) {\n return response.status >= 200 && response.status < 400;\n}\n\nasync function resolveRevalidation<\n TInput,\n TPath extends string,\n TValues extends object,\n>(\n revalidate: MutationRevalidation<TInput, TPath, TValues> | undefined,\n context: MutationContext<TInput, TPath, TValues>,\n) {\n if (!revalidate) return {};\n return typeof revalidate === \"function\"\n ? await revalidate(context)\n : revalidate;\n}\n\nasync function addRevalidationHeader(\n result: Response,\n invalidation: MutationRevalidationDeclaration,\n route: string,\n) {\n const headers = new Headers(result.headers);\n headers.delete(MUTATION_REVALIDATION_HEADER);\n const keys = invalidation.keys ?? [];\n const tags = invalidation.tags ?? [];\n if (keys.length > 0 || tags.length > 0) {\n headers.set(\n MUTATION_REVALIDATION_HEADER,\n encodeURIComponent(serializeMutationResult({\n keys,\n tags: tags.map((value) => value.id),\n version: 1,\n }, route)),\n );\n }\n return new Response(result.body, {\n headers,\n status: result.status,\n statusText: result.statusText,\n });\n}\n\nfunction withoutRevalidationHeader(result: Response) {\n if (!result.headers.has(MUTATION_REVALIDATION_HEADER)) return result;\n const headers = new Headers(result.headers);\n headers.delete(MUTATION_REVALIDATION_HEADER);\n return new Response(result.body, {\n headers,\n status: result.status,\n statusText: result.statusText,\n });\n}\n\nexport const mutationInput = {\n custom<\n TField extends string = string,\n TInput = unknown,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n >(\n parse: (\n context: HttpRouteContext<TPath, TValues>,\n ) => MaybePromise<TInput>,\n ): TypedMutationInput<TInput, TPath, TValues, TField> {\n // TYPE-EVIDENCE: the brand records parser types and does not require runtime data.\n return parse as TypedMutationInput<TInput, TPath, TValues, TField>;\n },\n form<\n TSchema extends StandardSchemaV1,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n >(\n schema: TSchema,\n map: (\n form: FormData,\n context: HttpRouteContext<TPath, TValues>,\n ) => MaybePromise<StandardSchemaV1.InferInput<TSchema>>,\n ): TypedMutationInput<\n StandardSchemaV1.InferOutput<TSchema>,\n TPath,\n TValues,\n Extract<keyof StandardSchemaV1.InferOutput<TSchema>, string>\n > {\n const parse = async (context: HttpRouteContext<TPath, TValues>) => {\n const form = await context.request.formData();\n const candidate = await map(form, context);\n const result = await schema[\"~standard\"].validate(candidate);\n if (result.issues) {\n throw new MutationValidationError({\n issues: result.issues.map((issue) => ({\n code: \"invalid\",\n message: issue.message,\n path: normalizeStandardSchemaPath(issue.path),\n })),\n });\n }\n return result.value;\n };\n // TYPE-EVIDENCE: the brand records the verified schema output and field types without adding runtime data.\n return parse as TypedMutationInput<\n StandardSchemaV1.InferOutput<TSchema>,\n TPath,\n TValues,\n Extract<keyof StandardSchemaV1.InferOutput<TSchema>, string>\n >;\n },\n async formData({ request }: HttpRouteContext) {\n return await request.formData();\n },\n async json({ request }: HttpRouteContext) {\n // TYPE-EVIDENCE: the request body is JSON and the caller parses it to a known type. The cast widens the parsed value to unknown.\n return await request.json() as unknown;\n },\n async text({ request }: HttpRouteContext) {\n return await request.text();\n },\n};\n\nfunction normalizeStandardSchemaPath(\n path: StandardSchemaV1.Issue[\"path\"],\n): readonly [] | readonly [string, ...(string | number)[]] {\n if (!path) return [];\n const normalized = path.map((segment) =>\n typeof segment === \"object\" ? segment.key : segment\n );\n if (typeof normalized[0] !== \"string\") return [];\n if (normalized.some((segment) =>\n typeof segment !== \"string\" && typeof segment !== \"number\"\n )) return [];\n // TYPE-EVIDENCE: the checks above prove that the first segment is a string and each remaining segment is a string or number.\n return normalized as [string, ...(string | number)[]];\n}\n\nasync function resolveMutationResult<\n TPath extends string,\n TValues extends object,\n>(\n result: Response | ResponseCapability<TPath, TValues>,\n context: HttpRouteContext<TPath, TValues>,\n) {\n if (result instanceof Response) {\n return result;\n }\n\n return await toResponse(result, context);\n}\n","export const HTTP_ERROR_STATUSES = [\n 400,\n 401,\n 402,\n 403,\n 404,\n 405,\n 406,\n 407,\n 408,\n 409,\n 410,\n 411,\n 412,\n 413,\n 414,\n 415,\n 416,\n 417,\n 418,\n 421,\n 422,\n 423,\n 424,\n 425,\n 426,\n 428,\n 429,\n 431,\n 451,\n 500,\n 501,\n 502,\n 503,\n 504,\n 505,\n 506,\n 507,\n 508,\n 510,\n 511,\n] as const;\n\nexport type HttpErrorStatus = (typeof HTTP_ERROR_STATUSES)[number];\n\nexport type HttpErrorDetails = {\n detail?: string;\n title?: string;\n type?: string;\n [extension: string]: unknown;\n};\n\nexport type HttpErrorInit = {\n cause?: unknown;\n headers?: HeadersInit;\n};\n\nconst statusTitles: Record<HttpErrorStatus, string> = {\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 402: \"Payment Required\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 405: \"Method Not Allowed\",\n 406: \"Not Acceptable\",\n 407: \"Proxy Authentication Required\",\n 408: \"Request Timeout\",\n 409: \"Conflict\",\n 410: \"Gone\",\n 411: \"Length Required\",\n 412: \"Precondition Failed\",\n 413: \"Content Too Large\",\n 414: \"URI Too Long\",\n 415: \"Unsupported Media Type\",\n 416: \"Range Not Satisfiable\",\n 417: \"Expectation Failed\",\n 418: \"I'm a Teapot\",\n 421: \"Misdirected Request\",\n 422: \"Unprocessable Content\",\n 423: \"Locked\",\n 424: \"Failed Dependency\",\n 425: \"Too Early\",\n 426: \"Upgrade Required\",\n 428: \"Precondition Required\",\n 429: \"Too Many Requests\",\n 431: \"Request Header Fields Too Large\",\n 451: \"Unavailable For Legal Reasons\",\n 500: \"Internal Server Error\",\n 501: \"Not Implemented\",\n 502: \"Bad Gateway\",\n 503: \"Service Unavailable\",\n 504: \"Gateway Timeout\",\n 505: \"HTTP Version Not Supported\",\n 506: \"Variant Also Negotiates\",\n 507: \"Insufficient Storage\",\n 508: \"Loop Detected\",\n 510: \"Not Extended\",\n 511: \"Network Authentication Required\",\n};\n\nconst statusSet = new Set<number>(HTTP_ERROR_STATUSES);\n\nexport class HttpError extends Error {\n readonly detail?: string;\n readonly extensions: Readonly<Record<string, unknown>>;\n readonly headers: Headers;\n readonly status: HttpErrorStatus;\n readonly title: string;\n readonly type: string;\n\n constructor(\n status: HttpErrorStatus,\n details: string | HttpErrorDetails = {},\n init: HttpErrorInit = {},\n ) {\n assertHttpErrorStatus(status);\n\n const normalized = typeof details === \"string\"\n ? { detail: details }\n : details;\n const {\n detail,\n title = statusTitles[status],\n type = \"about:blank\",\n ...extensions\n } = normalized;\n\n super(detail ?? title, { cause: init.cause });\n this.name = \"HttpError\";\n this.detail = detail;\n this.extensions = Object.freeze({ ...extensions });\n this.headers = new Headers(init.headers);\n this.status = status;\n this.title = title;\n this.type = type;\n }\n}\n\nexport function httpError(\n status: HttpErrorStatus,\n details?: string | HttpErrorDetails,\n init?: HttpErrorInit,\n) {\n return new HttpError(status, details, init);\n}\n\nexport function isHttpError(error: unknown): error is HttpError {\n return error instanceof HttpError;\n}\n\nfunction assertHttpErrorStatus(status: number): asserts status is HttpErrorStatus {\n if (!statusSet.has(status)) {\n throw new RangeError(\n `HTTP error status must be a standard 4xx or 5xx status; received ${JSON.stringify(status)}.`,\n );\n }\n}\n","import type { NotFoundProps, RouteErrorProps } from \"../route\";\n\n// This fallback is deliberately plain. It prevents a blank 404 response. The\n// build gate prevents an application from using it in production. The framework\n// must not show a generic page to users.\nexport function BuiltInNotFound({ pathname }: NotFoundProps) {\n return (\n <main>\n <h1>404</h1>\n <p>No route matched {pathname}.</p>\n </main>\n );\n}\n\nexport function BuiltInError({ status }: RouteErrorProps) {\n return (\n <main>\n <h1>{status}</h1>\n <p>Something went wrong.</p>\n </main>\n );\n}\n\n// Dev only. Everything this renders is a file path or a stack frame, which is\n// exactly what must never reach a production body.\nexport function DevError({ error, pathname, status }: RouteErrorProps) {\n const { message, name, stack } = describeError(error);\n\n return (\n <main>\n <h1>\n {status} {name} at {pathname}\n </h1>\n <p>{message}</p>\n {stack ? <pre>{stack}</pre> : null}\n </main>\n );\n}\n\nexport function describeError(error: unknown) {\n if (error instanceof Error) {\n return {\n message: error.message,\n name: error.name,\n stack: error.stack,\n };\n }\n\n return {\n message: typeof error === \"string\" ? error : String(error),\n name: \"Error\",\n stack: undefined,\n };\n}\n","const HTML_MEDIA_TYPES = [\"text/html\", \"application/xhtml+xml\"];\n\ntype MediaRange = {\n quality: number;\n type: string;\n};\n\n// On an unmatched path there is no route to consult, so `accept` is the only\n// signal available. The rule is deliberately strict: only an explicit HTML\n// range counts. A missing header, a malformed one, or a bare `*/*` gets\n// problem+json.\n//\n// The machine format is the safe default. A browser sends an explicit\n// `text/html` value and receives the document. An API client that sends `*/*`\n// or nothing receives a machine-readable response.\nexport function prefersHtmlDocument(request: Request) {\n return acceptsHtmlDocument(request.headers.get(\"accept\"));\n}\n\nexport function acceptsHtmlDocument(header: string | null) {\n if (!header) {\n return false;\n }\n\n return parseAcceptHeader(header).some(\n (range) => range.quality > 0 && HTML_MEDIA_TYPES.includes(range.type),\n );\n}\n\nfunction parseAcceptHeader(header: string): MediaRange[] {\n return header\n .split(\",\")\n .flatMap((entry) => {\n const [type, ...parameters] = entry.split(\";\");\n const normalizedType = type.trim().toLowerCase();\n\n if (!normalizedType) {\n return [];\n }\n\n return [\n {\n quality: parseQuality(parameters),\n type: normalizedType,\n },\n ];\n });\n}\n\nfunction parseQuality(parameters: string[]) {\n for (const parameter of parameters) {\n const [name, value] = parameter.split(\"=\");\n\n if (name?.trim().toLowerCase() !== \"q\") {\n continue;\n }\n\n const quality = Number.parseFloat(value ?? \"\");\n\n // A `q` that does not parse is a malformed header. It is not a request to\n // exclude the type. Therefore, the function uses the default weight.\n return Number.isNaN(quality) ? 1 : quality;\n }\n\n return 1;\n}\n","export const PROBLEM_CONTENT_TYPE = \"application/problem+json\";\n\nexport type ProblemDetails = {\n detail?: string;\n instance?: string;\n status: number;\n title: string;\n type?: string;\n [extension: string]: unknown;\n};\n\n// RFC 9457 replaced RFC 7807. This framework default gives applications correct\n// status codes and a parseable error format. Applications do not need to create\n// separate `{ \"error\": \"...\" }` formats.\nexport function createProblemDetails({\n detail,\n instance,\n status,\n title,\n type = \"about:blank\",\n ...extensions\n}: ProblemDetails) {\n return {\n type,\n title,\n status,\n ...(detail === undefined ? {} : { detail }),\n ...(instance === undefined ? {} : { instance }),\n ...extensions,\n };\n}\n\nexport function createProblemResponse(\n problem: ProblemDetails,\n init?: ResponseInit,\n) {\n // Merge through `Headers` rather than object spread: `init.headers` may be\n // a Headers instance or an array of tuples, and spreading either silently\n // drops every header. The content type is set last because a problem+json\n // body announcing itself as something else is worse than ignoring a caller.\n const headers = new Headers(init?.headers);\n\n headers.set(\"content-type\", `${PROBLEM_CONTENT_TYPE}; charset=utf-8`);\n\n return new Response(JSON.stringify(createProblemDetails(problem)), {\n ...init,\n headers,\n status: problem.status,\n });\n}\n","import { createElement, type ComponentType } from \"react\";\nimport { renderToString } from \"react-dom/server\";\nimport {\n createNavigationDocument,\n renderDocument,\n resolveMetadata,\n} from \"../document\";\nimport { createScriptRenderContext, withScriptContext } from \"../document/scripts\";\nimport {\n createNavigationDataResponse,\n isNavigationDataRequest,\n loadErrorFallback,\n NAVIGATION_ERROR_RESPONSE,\n type RouteManifest,\n} from \"../router\";\nimport type { RouteErrorProps } from \"../route\";\nimport { isHttpError, type HttpErrorStatus } from \"../route/http-error\";\nimport { BuiltInError, DevError, describeError } from \"./fallbacks\";\nimport type { FailureSite } from \"./failure-site\";\nimport { prefersHtmlDocument } from \"./negotiate\";\nimport { createProblemResponse } from \"./problem\";\nimport type { SsrRenderOptions } from \"./ssr\";\n\nexport type ErrorRenderOptions = SsrRenderOptions & {\n dev?: boolean;\n onError?: (error: unknown, site: FailureSite) => void;\n pathname?: string;\n transformDocument?: (html: string) => string | Promise<string>;\n};\n\nconst PLAIN_TEXT_ERROR = \"Internal Server Error\";\n\n// The build mode controls development output. An application option cannot\n// control it. This second control prevents stack traces in a production process.\nexport function isDevErrorRendering(dev: boolean | undefined) {\n return dev === true && process.env.NODE_ENV !== \"production\";\n}\n\nexport async function renderFailureResponse(\n manifest: RouteManifest,\n request: Request,\n error: unknown,\n site: FailureSite,\n options: ErrorRenderOptions = {},\n) {\n options.onError?.(error, site);\n\n const url = new URL(request.url);\n\n // An API route never gets HTML. A page render already committed to a\n // document. Middleware and policy run before either is decided, so they\n // negotiate the same way an unmatched path does.\n const wantsDocument =\n isNavigationDataRequest(request) ||\n site === \"page\" ||\n (site === \"middleware\" && prefersHtmlDocument(request));\n\n if (!wantsDocument) {\n return createErrorProblemResponse(url, error, options);\n }\n\n if (isNavigationDataRequest(request)) {\n const described = describeError(error);\n const headers = isHttpError(error)\n ? new Headers(error.headers)\n : new Headers();\n\n return createNavigationDataResponse(undefined, {\n document: createNavigationDocument({\n dir: options.dir,\n lang: options.lang,\n metadata: resolveMetadata(),\n title: options.title,\n }),\n locale: options.locale,\n error: {\n detail: isHttpError(error)\n ? error.detail\n : isDevErrorRendering(options.dev) ? described.message : undefined,\n title: isHttpError(error) ? error.title : \"Internal Server Error\",\n },\n headers,\n kind: NAVIGATION_ERROR_RESPONSE,\n status: errorStatus(error),\n });\n }\n\n return await renderErrorDocumentResponse(manifest, url, error, options);\n}\n\nexport function createErrorProblemResponse(\n url: URL,\n error: unknown,\n options: ErrorRenderOptions = {},\n) {\n if (isHttpError(error)) {\n return createProblemResponse(\n {\n ...error.extensions,\n detail: error.detail,\n instance: `${url.pathname}${url.search}`,\n status: error.status,\n title: error.title,\n type: error.type,\n },\n { headers: error.headers },\n );\n }\n\n const { message } = describeError(error);\n\n return createProblemResponse({\n // `detail` carries the thrown message, so it is dev only for the same\n // reason the stack is.\n ...(isDevErrorRendering(options.dev) ? { detail: message } : {}),\n instance: `${url.pathname}${url.search}`,\n status: 500,\n title: \"Internal Server Error\",\n });\n}\n\nasync function renderErrorDocumentResponse(\n manifest: RouteManifest,\n url: URL,\n error: unknown,\n options: ErrorRenderOptions,\n) {\n const status = errorStatus(error);\n\n try {\n const html = await renderErrorDocument(\n manifest,\n options.pathname ?? url.pathname,\n error,\n options,\n );\n\n const headers = isHttpError(error)\n ? new Headers(error.headers)\n : new Headers();\n headers.set(\"content-type\", \"text/html; charset=utf-8\");\n\n return new Response((await options.transformDocument?.(html)) ?? html, {\n headers,\n status,\n });\n } catch (renderError) {\n // Error page rendering is the final attempt. After the error path fails, the\n // framework cannot trust the application path again in the same request.\n // The response uses plain text and does not run application code again.\n options.onError?.(renderError, \"page\");\n\n return createPlainTextErrorResponse();\n }\n}\n\nexport function createPlainTextErrorResponse() {\n return new Response(PLAIN_TEXT_ERROR, {\n headers: { \"content-type\": \"text/plain; charset=utf-8\" },\n status: 500,\n });\n}\n\nasync function renderErrorDocument(\n manifest: RouteManifest,\n pathname: string,\n error: unknown,\n options: ErrorRenderOptions,\n) {\n const Error = await resolveErrorComponent(manifest, pathname, options);\n const scripts = createScriptRenderContext({\n dev: options.dev,\n nonce: options.nonce,\n });\n const html = renderToString(\n withScriptContext(\n scripts,\n createElement(Error, { error, locale: options.locale, pathname, status: errorStatus(error) }),\n ),\n );\n\n return renderDocument({\n body: { data: undefined, html, locale: options.locale, navigation: options.navigation },\n entrySrc: options.clientEntry,\n lang: options.lang,\n nonce: options.nonce,\n scripts: scripts.scripts(),\n styles: options.styles,\n title: options.title,\n });\n}\n\nfunction errorStatus(error: unknown): HttpErrorStatus {\n return isHttpError(error) ? error.status : 500;\n}\n\nasync function resolveErrorComponent(\n manifest: RouteManifest,\n pathname: string,\n options: ErrorRenderOptions,\n): Promise<ComponentType<RouteErrorProps>> {\n // In dev the stack is the whole point, so the framework document wins over\n // the app's `@error.tsx`. Production never sees it.\n if (isDevErrorRendering(options.dev)) {\n return DevError;\n }\n\n try {\n return (await loadErrorFallback(manifest, pathname)) ?? BuiltInError;\n } catch {\n return BuiltInError;\n }\n}\n","import type { HttpRouteContext, MaybePromise } from \"../route/types\";\nimport { isPlainObject } from \"../type-guards\";\nimport type {\n AuthorizationDecision,\n AuthorizationDenialStatus,\n ResolvedRouteAccess,\n RouteAccessException,\n RouteAccessPolicy,\n RouteAccessSource,\n RouteAuthorizationEntry,\n RouteAuthorizationHook,\n} from \"./types\";\n\nconst defaultDenyStatus: AuthorizationDenialStatus = 403;\n\n/**\n * Declares an authorization hook with the request context values that\n * inherited middleware supplies.\n */\nexport function defineAuthorization<\n TValues extends object = Record<never, never>,\n>(\n hook: (\n context: HttpRouteContext<string, TValues>,\n ) => MaybePromise<AuthorizationDecision>,\n): RouteAuthorizationHook {\n // TYPE-EVIDENCE: the hook reads the request context values that its own route subtree supplies. The cast labels it with the shared hook shape.\n return hook as RouteAuthorizationHook;\n}\n\n/**\n * Reads the access declarations of one cascade, from the root of the route\n * tree to the route file.\n *\n * A declaration adds a restriction. The framework keeps each inherited hook,\n * because a child must not weaken an ancestor. Only an explicit exception\n * removes the inherited hooks.\n */\nexport function resolveRouteAccess(\n sources: readonly RouteAccessSource[],\n): ResolvedRouteAccess {\n const chain: RouteAuthorizationEntry[] = [];\n const exceptions: RouteAccessException[] = [];\n let declared = false;\n let denyStatus = defaultDenyStatus;\n\n for (const { policy, source } of sources) {\n if (!policy) {\n continue;\n }\n\n if (policy.replaces) {\n declared = true;\n chain.length = 0;\n exceptions.push({\n ...policy.replaces,\n source: policy.replaces.source ?? source,\n });\n }\n\n if (policy.public) {\n declared = true;\n }\n\n if (policy.denyStatus) {\n denyStatus = policy.denyStatus;\n }\n\n if (policy.authorize) {\n declared = true;\n chain.push({ authorize: policy.authorize, source });\n }\n }\n\n return {\n chain,\n declared,\n denyStatus,\n exceptions,\n public: declared && chain.length === 0,\n };\n}\n\n/**\n * Merges the access declarations that `mergeRoutePolicies` receives.\n */\nexport function mergeRouteAccess(\n policies: readonly (RouteAccessPolicy | undefined)[],\n): ResolvedRouteAccess {\n return resolveRouteAccess(policies.map((policy) => ({ policy })));\n}\n\n/**\n * Runs each inherited authorization hook, from the root of the subtree to the\n * route. The function returns a denial response. It returns `null` when every\n * hook permits the request.\n *\n * The framework runs this check before a protected data loader, before a read\n * of a protected cache entry, before a render, and before the effect of a\n * mutation.\n */\nexport async function authorizeRoute(\n access: ResolvedRouteAccess,\n context: HttpRouteContext<string, object>,\n): Promise<Response | null> {\n if (!access.declared) {\n return createAuthorizationDenial(\n access.denyStatus,\n \"Forbidden. This route inherits no access declaration.\",\n );\n }\n\n for (const entry of access.chain) {\n let decision: AuthorizationDecision;\n\n try {\n decision = await entry.authorize(context);\n } catch {\n // A hook that throws denies. The framework never reads a failure as a\n // permission.\n return createAuthorizationDenial(access.denyStatus);\n }\n\n if (permitsRequest(decision)) {\n continue;\n }\n\n return createAuthorizationDenial(denialStatus(decision, access.denyStatus));\n }\n\n return null;\n}\n\n/**\n * Reports if one decision permits the request. Each value other than `true`\n * and `{ allow: true }` denies the request.\n */\nexport function permitsRequest(decision: unknown) {\n if (decision === true) {\n return true;\n }\n\n return isPlainObject(decision) && decision.allow === true;\n}\n\nfunction denialStatus(\n decision: unknown,\n fallback: AuthorizationDenialStatus,\n): AuthorizationDenialStatus {\n if (isPlainObject(decision) && isDenialStatus(decision.status)) {\n return decision.status;\n }\n\n return fallback;\n}\n\nfunction isDenialStatus(value: unknown): value is AuthorizationDenialStatus {\n return value === 401 || value === 403 || value === 404;\n}\n\nfunction createAuthorizationDenial(\n status: AuthorizationDenialStatus,\n body = denialBody(status),\n) {\n // The body names no record and no person, so a denial gives an attacker no\n // information. `no-store` keeps a denial out of each cache.\n return new Response(body, {\n headers: {\n \"cache-control\": \"private, no-store\",\n \"content-type\": \"text/plain; charset=utf-8\",\n },\n status,\n });\n}\n\nfunction denialBody(status: AuthorizationDenialStatus) {\n if (status === 401) {\n return \"Unauthorized.\";\n }\n\n if (status === 404) {\n return \"Not Found.\";\n }\n\n return \"Forbidden.\";\n}\n","import { isPlainObject } from \"../type-guards\";\nimport type {\n BodySizeException,\n BodySizeValue,\n ContentSecurityPolicy,\n CspException,\n CsrfException,\n CsrfPolicy,\n CsrfPolicyOptions,\n RequestSecurityPolicy,\n RoutePolicy,\n SecurityException,\n SecurityPolicy,\n} from \"./types\";\n\n/**\n * Reports if a declaration is a typed security exception.\n *\n * An exception carries a `reason` and a `value`. No policy object of the\n * framework uses both names, so the two fields identify the shape.\n */\nexport function isSecurityException(\n value: unknown,\n): value is SecurityException<unknown> {\n return (\n isPlainObject(value) &&\n typeof value.reason === \"string\" &&\n \"value\" in value\n );\n}\n\n/** Returns the Content-Security-Policy that a document declaration selects. */\nexport function resolveCsp(\n csp: SecurityPolicy[\"csp\"],\n): ContentSecurityPolicy | false | undefined {\n if (isSecurityException(csp)) {\n return false;\n }\n\n return csp;\n}\n\n/** Returns the exception of a document declaration, or `undefined`. */\nexport function getCspException(\n csp: SecurityPolicy[\"csp\"],\n): CspException | undefined {\n // TYPE-EVIDENCE: the exception guard confirms the object carries a reason and a value. The cast labels it as the document exception.\n return isSecurityException(csp) ? csp as CspException : undefined;\n}\n\n/** Returns the CSRF policy that a route declaration selects. */\nexport function resolveCsrf(\n csrf: CsrfPolicy | undefined,\n): true | false | CsrfPolicyOptions | undefined {\n if (isSecurityException(csrf)) {\n return false;\n }\n\n return csrf;\n}\n\n/** Returns the exception of a CSRF declaration, or `undefined`. */\nexport function getCsrfException(\n csrf: CsrfPolicy | undefined,\n): CsrfException | undefined {\n // TYPE-EVIDENCE: the exception guard confirms the object carries a reason and a value. The cast labels it as the CSRF exception.\n return isSecurityException(csrf) ? csrf as CsrfException : undefined;\n}\n\n/** Returns the request body limit that a route declaration selects. */\nexport function resolveMaxBodySize(\n maxBodySize: RequestSecurityPolicy[\"maxBodySize\"],\n): BodySizeValue | undefined {\n if (isSecurityException(maxBodySize)) {\n // TYPE-EVIDENCE: the exception guard confirms the object carries a value. The cast labels that value as a body size.\n return maxBodySize.value as BodySizeValue;\n }\n\n return maxBodySize;\n}\n\n/** Returns the exception of a body limit declaration, or `undefined`. */\nexport function getBodySizeException(\n maxBodySize: RequestSecurityPolicy[\"maxBodySize\"],\n): BodySizeException | undefined {\n // TYPE-EVIDENCE: the exception guard confirms the object carries a reason and a value. The cast labels it as the body size exception.\n return isSecurityException(maxBodySize)\n ? maxBodySize as BodySizeException\n : undefined;\n}\n\n/**\n * Adds the declaring file to each exception of one policy file.\n *\n * The framework merges the policy cascade into one policy, and the merge\n * keeps no file name. This function stamps the file before the merge, so the\n * audit can report the source of each exception.\n */\nexport function attachExceptionSource(\n policy: RoutePolicy | undefined,\n source: string | undefined,\n): RoutePolicy | undefined {\n if (!policy || !source) {\n return policy;\n }\n\n const document = withDocumentSource(policy.document, source);\n const security = withSecuritySource(policy.security, source);\n\n if (document === policy.document && security === policy.security) {\n return policy;\n }\n\n return { ...policy, document, security };\n}\n\nfunction withDocumentSource(\n document: RoutePolicy[\"document\"],\n source: string,\n) {\n const exception = getCspException(document?.csp);\n\n if (!document || !exception || exception.source) {\n return document;\n }\n\n return { ...document, csp: { ...exception, source } };\n}\n\nfunction withSecuritySource(\n security: RoutePolicy[\"security\"],\n source: string,\n) {\n if (!security) {\n return security;\n }\n\n const csrf = getCsrfException(security.csrf);\n const bodySize = getBodySizeException(security.request?.maxBodySize);\n\n if ((!csrf || csrf.source) && (!bodySize || bodySize.source)) {\n return security;\n }\n\n return {\n ...security,\n csrf: csrf && !csrf.source ? { ...csrf, source } : security.csrf,\n request: bodySize && !bodySize.source\n ? { ...security.request, maxBodySize: { ...bodySize, source } }\n : security.request,\n };\n}\n","import { mergeRouteAccess } from \"./authorization\";\nimport { isSecurityException, resolveCsp } from \"./exceptions\";\nimport type {\n ContentSecurityPolicy,\n CspHashAlgorithm,\n CspDirectiveValue,\n ReportingEndpointUrl,\n MergedRoutePolicy,\n RoutePolicy,\n RouteSecurityNeeds,\n RouteSecurityPolicy,\n SecurityHeadersOptions,\n SecurityHeaderPolicy,\n SecurityPolicy,\n SecurityPreset,\n StrictTransportSecurityPolicy,\n TrustedTypesPolicy,\n} from \"./types\";\nimport { FRAMEWORK_TRUSTED_TYPES_POLICY } from \"../document/trusted-types\";\n\nconst nonceToken = \"{nonce}\";\n\nexport const cspNonce = `'nonce-${nonceToken}'` as const;\n\nconst strictCsp = {\n baseUri: [\"'self'\"],\n connectSrc: [\"'self'\"],\n defaultSrc: [\"'self'\"],\n fontSrc: [\"'self'\"],\n formAction: [\"'self'\"],\n frameAncestors: [\"'none'\"],\n imgSrc: [\"'self'\", \"data:\", \"blob:\"],\n objectSrc: [\"'none'\"],\n scriptSrc: [cspNonce, \"'strict-dynamic'\"],\n styleSrc: [\"'self'\", cspNonce],\n upgradeInsecureRequests: true,\n} satisfies ContentSecurityPolicy;\n\nconst staticCsp = {\n ...strictCsp,\n scriptSrc: [\"'self'\"],\n styleSrc: [\"'self'\"],\n} satisfies ContentSecurityPolicy;\n\nconst strictHeaders = {\n contentTypeOptions: \"nosniff\",\n crossOriginOpenerPolicy: \"same-origin\",\n crossOriginResourcePolicy: \"same-origin\",\n permissionsPolicy: \"camera=(), microphone=(), geolocation=(), payment=()\",\n referrerPolicy: \"strict-origin-when-cross-origin\",\n strictTransportSecurity: {\n includeSubDomains: false,\n maxAge: 31536000,\n preload: false,\n },\n} satisfies SecurityHeaderPolicy;\n\nconst apiHeaders = {\n contentTypeOptions: \"nosniff\",\n crossOriginResourcePolicy: \"same-origin\",\n referrerPolicy: \"strict-origin-when-cross-origin\",\n} satisfies SecurityHeaderPolicy;\n\nexport const security = {\n api(options: SecurityPolicy = {}) {\n return mergeSecurityPolicy(\n {\n headers: apiHeaders,\n },\n options,\n );\n },\n preset(name: SecurityPreset, options: SecurityPolicy = {}) {\n if (name === \"api\") {\n return security.api(options);\n }\n\n if (name === \"cross-origin-isolated\") {\n return security.crossOriginIsolated(options);\n }\n\n if (name === \"static\") {\n return security.static(options);\n }\n\n return security.strict(options);\n },\n static(options: SecurityPolicy = {}) {\n return mergeSecurityPolicy(\n {\n csp: staticCsp,\n headers: strictHeaders,\n },\n options,\n );\n },\n strict(options: SecurityPolicy = {}) {\n return mergeSecurityPolicy(\n {\n csp: strictCsp,\n headers: strictHeaders,\n },\n options,\n );\n },\n crossOriginIsolated(options: SecurityPolicy = {}) {\n return mergeSecurityPolicy(\n security.strict({\n headers: {\n crossOriginEmbedderPolicy: \"require-corp\",\n crossOriginOpenerPolicy: \"same-origin\",\n },\n }),\n options,\n );\n },\n};\n\nexport function defineSecurityPolicy(policy: SecurityPolicy) {\n return policy;\n}\n\nexport function defineRoutePolicy(policy: RoutePolicy) {\n return policy;\n}\n\nexport function mergeSecurityPolicies(\n ...policies: Array<SecurityPolicy | false | undefined>\n) {\n return policies.reduce<SecurityPolicy>((merged, policy) => {\n if (!policy) {\n return merged;\n }\n\n return mergeSecurityPolicy(merged, policy);\n }, {});\n}\n\nexport function mergeRoutePolicies(\n ...policies: Array<RoutePolicy | false | undefined>\n): MergedRoutePolicy {\n const merged = policies.reduce<Omit<RoutePolicy, \"access\">>((result, policy) => {\n if (!policy) {\n return result;\n }\n\n return {\n document: mergeSecurityPolicies(result.document, policy.document),\n security: mergeRouteSecurityPolicies(result.security, policy.security),\n };\n }, {});\n\n // The access declaration accumulates rather than replaces. A child hook adds\n // a restriction, so the framework keeps each inherited hook in order.\n return {\n ...merged,\n access: mergeRouteAccess(\n policies.map((policy) => (policy ? policy.access : undefined)),\n ),\n document: applyPolicyNeeds(merged.document, merged.security?.needs),\n };\n}\n\nexport function mergeRouteSecurityPolicies(\n ...policies: Array<RouteSecurityPolicy | false | undefined>\n) {\n return policies.reduce<RouteSecurityPolicy>((merged, policy) => {\n if (!policy) {\n return merged;\n }\n\n return {\n csrf: policy.csrf ?? merged.csrf,\n fetchMetadata: policy.fetchMetadata ?? merged.fetchMetadata,\n needs: mergeRouteNeeds(merged.needs, policy.needs),\n rateLimit: policy.rateLimit ?? merged.rateLimit,\n request: mergeObject(merged.request, policy.request),\n };\n }, {});\n}\n\n// Each need widens exactly one directive. The pairing lives here so a\n// diagnostic can name both the declared need and the directive it targets.\nconst routeNeedDirectives = [\n { directive: \"connectSrc\", need: \"connect\" },\n { directive: \"imgSrc\", need: \"img\" },\n { directive: \"scriptSrc\", need: \"script\" },\n] as const satisfies readonly {\n directive: keyof ContentSecurityPolicy;\n need: keyof RouteSecurityNeeds;\n}[];\n\nfunction mergeRouteNeeds(\n base: RouteSecurityPolicy[\"needs\"],\n override: RouteSecurityPolicy[\"needs\"],\n) {\n const merged: { -readonly [Key in keyof RouteSecurityNeeds]: string[] } = {};\n\n for (const { need } of routeNeedDirectives) {\n const sources = [...new Set([\n ...(base?.[need] ?? []),\n ...(override?.[need] ?? []),\n ])];\n\n if (sources.length > 0) {\n merged[need] = sources;\n }\n }\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction applyPolicyNeeds(\n document: SecurityPolicy | undefined,\n needs: RouteSecurityNeeds | undefined,\n) {\n const declared = resolveCsp(document?.csp);\n\n if (!document || !declared || !needs) {\n return document;\n }\n\n let csp = declared;\n\n for (const { directive, need } of routeNeedDirectives) {\n csp = applyPolicyNeed(csp, directive, need, needs[need]);\n }\n\n return csp === declared ? document : { ...document, csp };\n}\n\nfunction applyPolicyNeed(\n csp: ContentSecurityPolicy,\n directive: keyof ContentSecurityPolicy,\n need: keyof RouteSecurityNeeds,\n sources: readonly string[] | undefined,\n) {\n if (!sources || sources.length === 0) {\n return csp;\n }\n\n // A removed directive makes default-src govern that resource type. A need\n // could then widen only default-src, which also grants the source to every\n // other fetch directive. The framework refuses that silent grant and asks\n // for an explicit directive instead.\n if (csp[directive] === false) {\n throw new Error(\n `A route policy declares security.needs.${need} and sets csp.${directive} to false. Set an explicit csp.${directive} that includes ${sources.join(\", \")}.`,\n );\n }\n\n if (csp[directive] === undefined && csp.defaultSrc === undefined) {\n return csp;\n }\n\n // TYPE-EVIDENCE: the directive value is a CSP source list or a replacement. The cast labels it with the directive value union.\n const current = resolveCspDirectiveValue(\n (csp[directive] ?? csp.defaultSrc) as CspDirectiveValue | undefined,\n ) ?? [];\n\n if (!Array.isArray(current)) {\n return csp;\n }\n\n return {\n ...csp,\n [directive]: [...new Set([...current, ...sources])],\n };\n}\n\nexport async function cspHash(\n source: string,\n algorithm: CspHashAlgorithm = \"sha256\",\n) {\n const digest = await globalThis.crypto.subtle.digest(\n toWebCryptoAlgorithm(algorithm),\n new TextEncoder().encode(source),\n );\n\n return `'${algorithm}-${toBase64(new Uint8Array(digest))}'`;\n}\n\nexport function createSecurityHeaders(\n policy: SecurityPolicy,\n options: SecurityHeadersOptions = {},\n) {\n const declaredCsp = resolveCsp(policy.csp);\n\n if (declaredCsp) {\n validateCspDirectiveValues(declaredCsp);\n }\n\n validateReportingConfiguration(policy);\n\n const headers = new Headers();\n const csp = declaredCsp ? renderCsp(declaredCsp, options) : undefined;\n const trustedTypes = renderTrustedTypes(policy.trustedTypes);\n\n // Trusted Types is carried by CSP directives, so report-only means moving\n // those directives to the report-only header rather than enforcing them. The\n // report-only header deliberately carries nothing else: repeating the base\n // policy there would report every ordinary CSP violation a second time.\n const reportsTrustedTypes = policy.trustedTypes\n ? policy.trustedTypes.mode === \"report-only\"\n : false;\n\n setHeader(\n headers,\n \"content-security-policy\",\n joinCspDirectives(csp, reportsTrustedTypes ? undefined : trustedTypes),\n );\n setHeader(\n headers,\n \"content-security-policy-report-only\",\n reportsTrustedTypes\n ? joinCspDirectives(trustedTypes, renderCspReportingDirectives(declaredCsp))\n : undefined,\n );\n\n applySecurityHeaders(headers, policy.headers, options);\n\n return headers;\n}\n\nexport function securityPolicyRequiresNonce(\n policy: SecurityPolicy | false | undefined,\n) {\n const csp = policy ? resolveCsp(policy.csp) : undefined;\n\n if (!csp) {\n return false;\n }\n\n return cspDirectiveEntries(csp).some(([, value]) => {\n const resolved = resolveCspDirectiveValue(value);\n\n return Array.isArray(resolved) &&\n resolved.some((source) => source.includes(nonceToken));\n });\n}\n\nexport function createCspNonce() {\n const bytes = new Uint8Array(16);\n globalThis.crypto.getRandomValues(bytes);\n\n return btoa(String.fromCharCode(...bytes));\n}\n\nfunction mergeSecurityPolicy(\n base: SecurityPolicy,\n override: SecurityPolicy,\n): SecurityPolicy {\n return {\n csp: mergeCsp(base.csp, override.csp),\n headers: mergeSecurityHeaders(base.headers, override.headers),\n trustedTypes: override.trustedTypes ?? base.trustedTypes,\n };\n}\n\nfunction mergeSecurityHeaders(\n base: SecurityHeaderPolicy | undefined,\n override: SecurityHeaderPolicy | undefined,\n) {\n const merged = mergeObject(base, override);\n\n if (!merged || override?.reportingEndpoints === false) {\n return merged;\n }\n\n if (base?.reportingEndpoints && override?.reportingEndpoints) {\n merged.reportingEndpoints = {\n ...base.reportingEndpoints,\n ...override.reportingEndpoints,\n };\n }\n\n return merged;\n}\n\nfunction mergeObject<T extends object>(\n base: T | undefined,\n override: T | undefined,\n) {\n if (override) {\n return {\n ...(base ?? {}),\n ...override,\n };\n }\n\n return base;\n}\n\nfunction mergeCsp(\n base: SecurityPolicy[\"csp\"],\n override: SecurityPolicy[\"csp\"],\n): SecurityPolicy[\"csp\"] {\n if (isSecurityException(override)) {\n return override;\n }\n\n if (!override) {\n return base;\n }\n\n const resolvedBase = resolveCsp(base);\n\n if (!resolvedBase) {\n return normalizeCsp(override);\n }\n\n const normalizedBase = normalizeCsp(resolvedBase);\n const normalizedOverride = normalizeCsp(override);\n const merged: ContentSecurityPolicy = {\n ...normalizedBase,\n ...normalizedOverride,\n };\n\n for (const [name, value] of cspDirectiveEntries(override)) {\n // TYPE-EVIDENCE: the indexed base value is a CSP directive value or undefined. The cast labels it with the directive value union.\n const baseValue = resolveCspDirectiveValue(\n normalizedBase[name] as CspDirectiveValue | undefined,\n );\n\n if (\n !isCspDirectiveReplacement(value) &&\n Array.isArray(baseValue) &&\n Array.isArray(value)\n ) {\n setCspDirective(\n merged,\n name,\n dedupeSources([...baseValue, ...value]),\n );\n }\n }\n\n return merged;\n}\n\nfunction normalizeCsp(policy: ContentSecurityPolicy) {\n const normalized = { ...policy };\n\n for (const [name, value] of cspDirectiveEntries(policy)) {\n if (isCspDirectiveReplacement(value)) {\n setCspDirective(normalized, name, value.replace);\n }\n }\n\n return normalized;\n}\n\nfunction dedupeSources(sources: readonly string[]) {\n return [...new Set(sources)];\n}\n\nfunction setCspDirective(\n policy: ContentSecurityPolicy,\n name: keyof ContentSecurityPolicy,\n value: readonly string[],\n) {\n if (name === \"reportTo\" || name === \"upgradeInsecureRequests\") {\n return;\n }\n\n if (name === \"reportUri\") {\n // TYPE-EVIDENCE: the reportUri directive value is an array of reporting endpoint URL strings. The cast labels it with that specific array type.\n policy.reportUri = value as readonly ReportingEndpointUrl[];\n return;\n }\n\n policy[name] = value;\n}\n\nfunction applySecurityHeaders(\n headers: Headers,\n policy: SecurityHeaderPolicy | undefined,\n options: SecurityHeadersOptions,\n) {\n if (!policy) {\n return;\n }\n\n setHeader(headers, \"referrer-policy\", policy.referrerPolicy);\n setHeader(headers, \"x-content-type-options\", policy.contentTypeOptions);\n setHeader(headers, \"cross-origin-opener-policy\", policy.crossOriginOpenerPolicy);\n setHeader(headers, \"cross-origin-embedder-policy\", policy.crossOriginEmbedderPolicy);\n setHeader(headers, \"cross-origin-resource-policy\", policy.crossOriginResourcePolicy);\n setHeader(headers, \"permissions-policy\", policy.permissionsPolicy);\n setHeader(\n headers,\n \"reporting-endpoints\",\n renderReportingEndpoints(policy.reportingEndpoints),\n );\n\n if (\n policy.strictTransportSecurity &&\n (!options.request || new URL(options.request.url).protocol === \"https:\")\n ) {\n headers.set(\n \"strict-transport-security\",\n renderStrictTransportSecurity(policy.strictTransportSecurity),\n );\n }\n}\n\n// `trusted-types` and `require-trusted-types-for` are CSP directives. There is\n// no `trusted-types:` HTTP header, and a browser drops an unknown header\n// without complaining, so emitting them standalone reads as configured and\n// protects nothing.\nfunction renderTrustedTypes(policy: TrustedTypesPolicy | false | undefined) {\n if (!policy) {\n return undefined;\n }\n\n const directives: string[] = [];\n\n if (policy.requireFor?.includes(\"script\")) {\n directives.push(\"require-trusted-types-for 'script'\");\n }\n\n directives.push(renderTrustedTypesDirective(policy));\n\n return joinCspDirectives(...directives);\n}\n\nfunction renderTrustedTypesDirective(policy: TrustedTypesPolicy) {\n // An explicit empty list refuses every policy name, including the\n // framework policy. It is the one way to close a policy the application\n // does not need.\n if (policy.policies !== undefined && policy.policies.length === 0) {\n return \"trusted-types 'none'\";\n }\n\n const names = [FRAMEWORK_TRUSTED_TYPES_POLICY];\n\n if (policy.allowDefaultPolicy) {\n names.push(\"default\");\n }\n\n for (const name of policy.policies ?? []) {\n names.push(name);\n }\n\n return `trusted-types ${[...new Set(names)].join(\" \")}`;\n}\n\nfunction joinCspDirectives(...parts: Array<string | undefined>) {\n const present = parts.filter((part) => part);\n\n return present.length > 0 ? present.join(\"; \") : undefined;\n}\n\nfunction setHeader(\n headers: Headers,\n name: string,\n value: false | string | undefined,\n) {\n if (value) {\n headers.set(name, value);\n }\n}\n\nfunction renderStrictTransportSecurity(policy: StrictTransportSecurityPolicy) {\n const directives = [`max-age=${policy.maxAge}`];\n\n if (policy.includeSubDomains) {\n directives.push(\"includeSubDomains\");\n }\n\n if (policy.preload) {\n directives.push(\"preload\");\n }\n\n return directives.join(\"; \");\n}\n\nfunction renderCsp(\n policy: ContentSecurityPolicy,\n options: SecurityHeadersOptions,\n) {\n const directives: string[] = [];\n\n for (const [name, value] of cspDirectiveEntries(policy)) {\n if (name === \"reportTo\" || name === \"reportUri\") {\n continue;\n }\n\n const resolved = resolveCspDirectiveValue(value);\n\n if (resolved === false || resolved === undefined) {\n continue;\n }\n\n const directiveName = toCspDirectiveName(name);\n\n // A bare `sandbox` (no tokens) is the maximally restrictive form, same\n // as an empty token list, so both render as the directive name alone.\n if (\n resolved === true ||\n (name === \"sandbox\" && Array.isArray(resolved) && resolved.length === 0)\n ) {\n directives.push(directiveName);\n continue;\n }\n\n directives.push(\n `${directiveName} ${renderCspSources(resolved, options).join(\" \")}`,\n );\n }\n\n const reporting = renderCspReportingDirectives(policy);\n\n if (reporting) {\n directives.push(reporting);\n }\n\n return directives.join(\"; \");\n}\n\nfunction renderCspReportingDirectives(\n policy: ContentSecurityPolicy | false | undefined,\n) {\n if (!policy) {\n return undefined;\n }\n\n const directives: string[] = [];\n\n const reportUri = resolveCspDirectiveValue(policy.reportUri);\n\n if (Array.isArray(reportUri) && reportUri.length) {\n directives.push(`report-uri ${reportUri.join(\" \")}`);\n }\n\n if (policy.reportTo) {\n directives.push(`report-to ${policy.reportTo}`);\n }\n\n return joinCspDirectives(...directives);\n}\n\nfunction renderReportingEndpoints(\n endpoints: SecurityHeaderPolicy[\"reportingEndpoints\"],\n) {\n if (!endpoints) {\n return undefined;\n }\n\n return Object.entries(endpoints)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([name, url]) => `${name}=\"${escapeStructuredFieldString(url)}\"`)\n .join(\", \");\n}\n\nfunction escapeStructuredFieldString(value: string) {\n return value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"');\n}\n\nfunction validateReportingConfiguration(policy: SecurityPolicy) {\n const endpoints = policy.headers?.reportingEndpoints;\n\n if (endpoints) {\n const entries = Object.entries(endpoints);\n\n if (entries.length === 0) {\n throw new Error(\"Demiurge Reporting-Endpoints requires at least one endpoint.\");\n }\n\n for (const [name, url] of entries) {\n validateReportingEndpointName(name);\n validateReportingEndpointUrl(url, `Reporting-Endpoints member ${JSON.stringify(name)}`);\n }\n }\n\n const csp = resolveCsp(policy.csp) || undefined;\n\n if (csp?.reportTo) {\n validateReportingEndpointName(csp.reportTo);\n\n if (!endpoints || !(csp.reportTo in endpoints)) {\n throw new Error(\n `Demiurge CSP report-to group ${JSON.stringify(csp.reportTo)} is not defined in headers.reportingEndpoints.`,\n );\n }\n }\n\n const reportUris = resolveCspDirectiveValue(csp?.reportUri);\n\n for (const url of Array.isArray(reportUris) ? reportUris : []) {\n validateReportingEndpointUrl(url, \"CSP report-uri target\");\n }\n}\n\nfunction validateCspDirectiveValues(policy: ContentSecurityPolicy) {\n for (const [name, value] of cspDirectiveEntries(policy)) {\n const directive = toCspDirectiveName(name);\n\n if (value === undefined) {\n continue;\n }\n\n if (name === \"reportTo\") {\n if (typeof value !== \"string\") {\n throw new Error(\n `Demiurge CSP directive ${JSON.stringify(directive)} must be a string.`,\n );\n }\n\n continue;\n }\n\n if (name === \"upgradeInsecureRequests\") {\n if (typeof value !== \"boolean\") {\n throw new Error(\n `Demiurge CSP directive ${JSON.stringify(directive)} must be a boolean.`,\n );\n }\n\n continue;\n }\n\n if (name === \"sandbox\") {\n if (\n typeof value !== \"boolean\" &&\n (!Array.isArray(value) ||\n !value.every((token) => typeof token === \"string\"))\n ) {\n throw new Error(\n `Demiurge CSP directive ${JSON.stringify(directive)} must be a boolean or a list of sandbox tokens.`,\n );\n }\n\n continue;\n }\n\n const sources = resolveCspDirectiveValue(value);\n\n if (\n sources !== false &&\n (!Array.isArray(sources) ||\n !sources.every((source) => typeof source === \"string\"))\n ) {\n throw new Error(\n `Demiurge CSP directive ${JSON.stringify(directive)} must be a source list, false, or a replacement object with a source list.`,\n );\n }\n }\n}\n\nfunction isCspDirectiveReplacement(\n value: CspDirectiveValue | undefined,\n): value is Extract<CspDirectiveValue, { replace: readonly string[] }> {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n \"replace\" in value,\n );\n}\n\nfunction resolveCspDirectiveValue(value: CspDirectiveValue | undefined) {\n return isCspDirectiveReplacement(value) ? value.replace : value;\n}\n\nfunction validateReportingEndpointName(name: string) {\n // Reporting-Endpoints is an RFC 8941 dictionary, whose member names are\n // lowercase Structured Field keys. CSP `report-to` uses the same name.\n if (!/^(?:[a-z]|\\*)[a-z0-9_.*-]*$/.test(name)) {\n throw new Error(\n `Invalid reporting endpoint name ${JSON.stringify(name)}. Use a lowercase Structured Field key.`,\n );\n }\n}\n\nfunction validateReportingEndpointUrl(url: string, label: string) {\n if (\n !isAsciiHeaderValue(url) ||\n /[\\s,;\"\\\\]/.test(url) ||\n (!url.startsWith(\"/\") && !url.startsWith(\"https://\"))\n ) {\n throw new Error(`${label} must be a same-origin path or an HTTPS URL.`);\n }\n\n if (url.startsWith(\"//\")) {\n throw new Error(`${label} must not be a scheme-relative URL.`);\n }\n\n let parsed: URL;\n\n try {\n parsed = new URL(url, \"https://demiurge.invalid\");\n } catch {\n throw new Error(`${label} must be a valid URI reference.`);\n }\n\n if (parsed.username || parsed.password || parsed.hash) {\n throw new Error(`${label} must not contain credentials or a fragment.`);\n }\n}\n\nfunction isAsciiHeaderValue(value: string) {\n return /^[\\x20-\\x7e]+$/.test(value);\n}\n\nfunction cspDirectiveEntries(policy: ContentSecurityPolicy) {\n // TYPE-EVIDENCE: Object.entries returns the policy entries as string keyed pairs. The cast narrows the keys to the policy key type.\n return Object.entries(policy) as Array<[\n keyof ContentSecurityPolicy,\n CspDirectiveValue | undefined,\n ]>;\n}\n\nfunction renderCspSources(\n sources: readonly string[],\n options: SecurityHeadersOptions,\n) {\n return sources.map((source) => {\n if (!source.includes(nonceToken)) {\n return source;\n }\n\n if (!options.nonce) {\n throw new Error(\"Demiurge security policy requires a CSP nonce.\");\n }\n\n return source.replaceAll(nonceToken, options.nonce);\n });\n}\n\nfunction toCspDirectiveName(name: keyof ContentSecurityPolicy) {\n return name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\nfunction toWebCryptoAlgorithm(algorithm: CspHashAlgorithm) {\n if (algorithm === \"sha384\") {\n return \"SHA-384\";\n }\n\n if (algorithm === \"sha512\") {\n return \"SHA-512\";\n }\n\n return \"SHA-256\";\n}\n\nfunction toBase64(bytes: Uint8Array) {\n let binary = \"\";\n\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n\n if (typeof btoa === \"function\") {\n return btoa(binary);\n }\n\n return Buffer.from(binary, \"binary\").toString(\"base64\");\n}\n","import type { HttpMethod, ResponseCapability, RouteModule } from \"../route/types\";\nimport type {\n CorsPolicy,\n CorsRequestContext,\n CorsResponseOptions,\n} from \"./types\";\n\nexport function createCorsHeaders(\n policy: CorsPolicy,\n context: CorsRequestContext,\n options: CorsResponseOptions = {},\n) {\n validateCorsPolicy(policy);\n\n const origin = context.request.headers.get(\"origin\");\n const headers = new Headers();\n\n // An allowlist makes the representation depend on the origin. This rule also\n // applies when the request has no Origin header or has a denied origin. Each\n // branch must contain the Vary field. Otherwise, a shared cache can reuse a\n // response for the wrong origin.\n if (policy.origins !== \"*\") {\n appendVary(headers, \"Origin\");\n }\n\n if (!origin) {\n return headers;\n }\n\n const allowedOrigin = resolveAllowedOrigin(policy, origin);\n\n if (!allowedOrigin) {\n return headers;\n }\n\n headers.set(\"access-control-allow-origin\", allowedOrigin);\n\n if (policy.credentials) {\n headers.set(\"access-control-allow-credentials\", \"true\");\n }\n\n if (policy.exposeHeaders?.length) {\n headers.set(\"access-control-expose-headers\", policy.exposeHeaders.join(\", \"));\n }\n\n if (options.preflight) {\n headers.set(\"access-control-allow-methods\", options.methods.join(\", \"));\n\n const requestedHeaders = context.request.headers.get(\n \"access-control-request-headers\",\n );\n const allowedHeaders = policy.headers?.join(\", \") ?? requestedHeaders;\n\n if (allowedHeaders) {\n headers.set(\"access-control-allow-headers\", allowedHeaders);\n }\n\n if (policy.maxAge !== undefined) {\n headers.set(\"access-control-max-age\", String(policy.maxAge));\n }\n }\n\n return headers;\n}\n\nexport function applyCorsHeaders(\n response: Response,\n policy: CorsPolicy | undefined,\n request: Request,\n) {\n if (!policy) {\n return response;\n }\n\n const headers = new Headers(response.headers);\n mergeHeaders(headers, createCorsHeaders(policy, { request }));\n\n return new Response(response.body, {\n headers,\n status: response.status,\n statusText: response.statusText,\n });\n}\n\nexport function createCorsPreflightResponse(\n routeModule: RouteModule,\n request: Request,\n) {\n const requestedMethod = request.headers.get(\"access-control-request-method\");\n const method = normalizeCorsMethod(requestedMethod);\n\n if (!method) {\n return null;\n }\n\n const capability = getMethodCapability(routeModule, method);\n\n if (!capability?.cors) {\n return null;\n }\n\n const methods = capability.cors.methods ?? allowedCorsMethods(routeModule);\n\n if (!methods.includes(method)) {\n return null;\n }\n\n return new Response(null, {\n headers: createCorsHeaders(\n capability.cors,\n { request },\n {\n methods,\n preflight: true,\n },\n ),\n status: 204,\n });\n}\n\nexport function validateCorsPolicy(policy: CorsPolicy) {\n if (policy.credentials && policy.origins === \"*\") {\n throw new Error(\n \"Demiurge CORS policy cannot use wildcard origins with credentials.\",\n );\n }\n\n if (\n policy.credentials &&\n (policy.headers?.includes(\"*\") || policy.exposeHeaders?.includes(\"*\"))\n ) {\n throw new Error(\n \"Demiurge credentialed CORS policy must list allowed and exposed headers explicitly.\",\n );\n }\n\n if (policy.origins !== \"*\") {\n for (const origin of policy.origins) {\n validateCorsOrigin(origin);\n }\n }\n\n if (\n policy.maxAge !== undefined &&\n (!Number.isSafeInteger(policy.maxAge) || policy.maxAge < 0)\n ) {\n throw new Error(\n \"Demiurge CORS maxAge must be a non-negative integer number of seconds.\",\n );\n }\n}\n\nfunction validateCorsOrigin(origin: string) {\n let parsed: URL;\n\n try {\n parsed = new URL(origin);\n } catch {\n throw invalidCorsOrigin(origin);\n }\n\n if (\n (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") ||\n parsed.origin !== origin\n ) {\n throw invalidCorsOrigin(origin);\n }\n}\n\nfunction invalidCorsOrigin(origin: string) {\n return new Error(\n `Demiurge CORS origin ${JSON.stringify(origin)} must be a canonical HTTP(S) origin without credentials, a path, query, or fragment.`,\n );\n}\n\nfunction resolveAllowedOrigin(policy: CorsPolicy, origin: string) {\n if (policy.origins === \"*\") {\n return \"*\";\n }\n\n return policy.origins.includes(origin) ? origin : null;\n}\n\nfunction mergeHeaders(target: Headers, source: Headers) {\n source.forEach((value, name) => {\n if (name === \"vary\" && target.has(\"vary\")) {\n for (const field of value.split(\",\")) {\n appendVary(target, field.trim());\n }\n return;\n }\n\n target.set(name, value);\n });\n}\n\nfunction appendVary(headers: Headers, field: string) {\n if (!field) {\n return;\n }\n\n const existing = headers.get(\"vary\")\n ?.split(\",\")\n .map((value) => value.trim())\n .filter(Boolean) ?? [];\n\n if (existing.some((value) => value.toLowerCase() === field.toLowerCase())) {\n return;\n }\n\n headers.set(\"vary\", [...existing, field].join(\", \"));\n}\n\nfunction normalizeCorsMethod(method: string | null): HttpMethod | null {\n if (!method) {\n return null;\n }\n\n const upperMethod = method.toUpperCase();\n return isHttpMethod(upperMethod) ? upperMethod : null;\n}\n\nfunction getMethodCapability(\n routeModule: RouteModule,\n method: HttpMethod,\n): ResponseCapability | undefined {\n if (method === \"HEAD\") {\n return routeModule.HEAD ?? responseCapability(routeModule.GET);\n }\n\n return responseCapability(routeModule[method]);\n}\n\nfunction responseCapability(\n capability: RouteModule[HttpMethod],\n): ResponseCapability | undefined {\n return capability?.kind === \"page\" ? undefined : capability;\n}\n\nfunction allowedCorsMethods(routeModule: RouteModule) {\n return ([\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"OPTIONS\",\n \"HEAD\",\n ] satisfies HttpMethod[]).filter((method) => getMethodCapability(routeModule, method));\n}\n\nfunction isHttpMethod(method: string): method is HttpMethod {\n return (\n method === \"GET\" ||\n method === \"POST\" ||\n method === \"PUT\" ||\n method === \"PATCH\" ||\n method === \"DELETE\" ||\n method === \"OPTIONS\" ||\n method === \"HEAD\"\n );\n}\n","import type { HttpMethod } from \"../route/types\";\nimport { resolveMaxBodySize } from \"./exceptions\";\nimport type { RequestSecurityPolicy } from \"./types\";\nimport { copyRequestConnectionMetadata } from \"../server/request-metadata\";\n\nconst byteUnits = {\n b: 1,\n gb: 1024 ** 3,\n kb: 1024,\n mb: 1024 ** 2,\n} as const;\n\n// ADR 0015 sets this bound. A route that omits a request policy still\n// inherits a bounded body limit, so a route never buffers a body of any size\n// by omission. A route that needs a larger limit declares\n// `security.request.maxBodySize` and the audit reports the exception.\nexport const DEFAULT_MAX_BODY_SIZE = \"1mb\" as const;\n\nexport function enforceRequestSecurity(\n policy: RequestSecurityPolicy | undefined,\n request: Request,\n method: HttpMethod,\n) {\n const methodResponse = enforceAllowedMethods(policy, method);\n\n if (methodResponse) {\n return methodResponse;\n }\n\n const contentLength = request.headers.get(\"content-length\");\n\n if (!contentLength) {\n return null;\n }\n\n const declaredSize = parseContentLength(contentLength);\n\n if (declaredSize === null) {\n return new Response(\"Invalid Content-Length.\", {\n status: 400,\n });\n }\n\n const maxBodySize = parseBodySize(resolveMaxBodySize(policy?.maxBodySize) ?? DEFAULT_MAX_BODY_SIZE);\n\n if (declaredSize > maxBodySize) {\n return new Response(\"Request body too large.\", {\n status: 413,\n });\n }\n\n return null;\n}\n\nexport class RequestBodyTooLargeError extends Error {\n constructor() {\n super(\"Demiurge request body exceeded maxBodySize while being read.\");\n this.name = \"RequestBodyTooLargeError\";\n }\n}\n\nexport function limitRequestBody(\n policy: RequestSecurityPolicy | undefined,\n request: Request,\n) {\n if (request.body === null) {\n return request;\n }\n\n const maximumBytes = parseBodySize(resolveMaxBodySize(policy?.maxBodySize) ?? DEFAULT_MAX_BODY_SIZE);\n const reader = request.body.getReader();\n let bytesRead = 0;\n const body = new ReadableStream<Uint8Array>({\n async pull(controller) {\n const result = await reader.read();\n\n if (result.done) {\n controller.close();\n return;\n }\n\n bytesRead += result.value.byteLength;\n\n if (bytesRead > maximumBytes) {\n const error = new RequestBodyTooLargeError();\n controller.error(error);\n\n try {\n await reader.cancel(error);\n } catch {\n // The size error is authoritative even if the source rejects cancel.\n }\n\n return;\n }\n\n controller.enqueue(result.value);\n },\n async cancel(reason) {\n try {\n await reader.cancel(reason);\n } catch {\n // The downstream cancellation has already completed.\n }\n },\n });\n\n // TYPE-EVIDENCE: the duplex field is a runtime extension required for stream request bodies. The cast adds it to the standard init type.\n const limitedRequest = new Request(request, {\n body,\n duplex: \"half\",\n } as RequestInit);\n copyRequestConnectionMetadata(request, limitedRequest);\n\n return limitedRequest;\n}\n\nexport function requestBodyTooLargeResponse() {\n return new Response(\"Request body too large.\", { status: 413 });\n}\n\nexport function enforceAllowedMethods(\n policy: RequestSecurityPolicy | undefined,\n method: HttpMethod,\n) {\n if (!policy?.allowedMethods) {\n return null;\n }\n\n if (isAllowedMethod(policy.allowedMethods, method)) {\n return null;\n }\n\n return new Response(null, {\n headers: {\n allow: allowedMethodsHeader(policy.allowedMethods),\n },\n status: 405,\n });\n}\n\nexport function parseBodySize(value: number | string) {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(\"Demiurge request maxBodySize must be a non-negative integer.\");\n }\n\n return value;\n }\n\n const match = /^(\\d+)(b|kb|mb|gb)$/i.exec(value.trim());\n\n if (!match) {\n throw new Error(\n \"Demiurge request maxBodySize must use bytes or a b/kb/mb/gb suffix.\",\n );\n }\n\n const amount = Number(match[1]);\n // TYPE-EVIDENCE: the regex restricts the unit to a byte size suffix. The lowercase value is therefore a key of the byte units map.\n const unit = match[2].toLowerCase() as keyof typeof byteUnits;\n const size = amount * byteUnits[unit];\n\n if (!Number.isSafeInteger(size)) {\n throw new Error(\"Demiurge request maxBodySize is too large.\");\n }\n\n return size;\n}\n\nfunction parseContentLength(value: string) {\n if (!/^\\d+$/.test(value)) {\n return null;\n }\n\n const contentLength = Number(value);\n return Number.isSafeInteger(contentLength) ? contentLength : null;\n}\n\nfunction isAllowedMethod(\n allowedMethods: readonly HttpMethod[],\n method: HttpMethod,\n) {\n return (\n allowedMethods.includes(method) ||\n (method === \"HEAD\" && allowedMethods.includes(\"GET\"))\n );\n}\n\nfunction allowedMethodsHeader(allowedMethods: readonly HttpMethod[]) {\n const methods = [...allowedMethods];\n\n if (methods.includes(\"GET\") && !methods.includes(\"HEAD\")) {\n methods.push(\"HEAD\");\n }\n\n return methods.join(\", \");\n}\n","import type { HttpMethod } from \"../route/types\";\nimport type { ScriptTag } from \"../document/scripts\";\nimport { createSecurityHeaders } from \"./policy\";\nimport { validateCorsPolicy } from \"./cors\";\nimport { DEFAULT_MAX_BODY_SIZE, parseBodySize } from \"./request\";\nimport {\n getBodySizeException,\n getCspException,\n getCsrfException,\n resolveCsp,\n resolveMaxBodySize,\n} from \"./exceptions\";\nimport type {\n ContentSecurityPolicy,\n SecurityException,\n CorsPolicy,\n CspSource,\n ResolvedRouteAccess,\n RouteSecurityPolicy,\n ScriptDependencyAuditOptions,\n SecurityAudit,\n SecurityAuditFinding,\n SecurityAuditOptions,\n SecurityHeadersOptions,\n SecurityPolicy,\n} from \"./types\";\n\nconst unsafeMethods = new Set<HttpMethod>([\"DELETE\", \"PATCH\", \"POST\", \"PUT\"]);\n\nexport function createSecurityAudit(options: SecurityAuditOptions = {}) {\n const findings: SecurityAuditFinding[] = [];\n const document = options.document;\n const headers = document\n ? auditDocumentPolicy(document.policy, document.headers, findings)\n : {};\n\n if (document) {\n auditMissingCsp(document.policy, findings);\n auditReportOnlyDelivery(document.policy, findings);\n }\n const route = options.route\n ? auditRoutePolicy(options.route, findings)\n : undefined;\n\n if (document?.scripts) {\n auditDocumentScripts(\n resolveCsp(document.policy.csp),\n document.scripts,\n document.headers,\n findings,\n );\n\n if (document.scriptDependencies) {\n findings.push(\n ...auditScriptDependencies(\n document.scripts,\n normalizeScriptDependencyAuditOptions(document.scriptDependencies),\n ),\n );\n }\n }\n\n return {\n findings,\n headers,\n route,\n } satisfies SecurityAudit;\n}\n\n// A document that declares no CSP sends none. The policy stays valid, so no\n// other check speaks. This finding makes the absent policy visible.\n//\n// An absent CSP and a declared exception are different states. An absent CSP\n// is the unsafe default that the build refuses. An exception is typed and\n// deliberate, so it gets its own visible finding instead of the error below.\nfunction auditMissingCsp(\n policy: SecurityPolicy,\n findings: SecurityAuditFinding[],\n) {\n const exception = getCspException(policy.csp);\n\n if (exception) {\n findings.push({\n code: \"csp-disabled\",\n message: `This document accepts no Content-Security-Policy. ${\n describeExceptionSource(exception)\n } Reason: ${exception.reason}`,\n origin: exception.origin ?? \"application\",\n severity: \"info\",\n source: exception.source,\n });\n return;\n }\n\n if (policy.csp !== undefined) {\n return;\n }\n\n findings.push({\n code: \"document-policy-missing\",\n message:\n \"This document declares no Content-Security-Policy. Add document: security.strict() to the @policy.ts file of the route. To accept a document without a Content-Security-Policy, declare csp with a value of false and a reason.\",\n severity: \"error\",\n });\n}\n\n// A finding names the declaration source, so a reader separates an\n// application decision from a framework helper decision.\nfunction describeExceptionSource(exception: SecurityException<unknown>) {\n const origin = exception.origin ?? \"application\";\n const actor = origin === \"framework\"\n ? \"A framework helper declared this exception\"\n : \"The application declared this exception\";\n\n return exception.source ? `${actor} in ${exception.source}.` : `${actor}.`;\n}\n\nfunction auditReportOnlyDelivery(\n policy: SecurityPolicy,\n findings: SecurityAuditFinding[],\n) {\n if (!policy.trustedTypes || policy.trustedTypes.mode !== \"report-only\") {\n return;\n }\n\n const csp = resolveCsp(policy.csp) || undefined;\n const hasLegacyTarget = Boolean(resolveCspArray(csp?.reportUri)?.length);\n const endpoints = policy.headers?.reportingEndpoints;\n const hasReportingApiTarget = Boolean(\n csp?.reportTo && endpoints && endpoints[csp.reportTo],\n );\n\n if (!hasLegacyTarget && !hasReportingApiTarget) {\n findings.push({\n code: \"report-only-target-missing\",\n message:\n \"Trusted Types report-only mode has no deliverable target. Configure CSP reportTo with a matching Reporting-Endpoints member, reportUri for compatibility, or both.\",\n severity: \"warning\",\n });\n }\n}\n\nexport function auditScriptDependencies(\n scripts: readonly ScriptTag[],\n options: ScriptDependencyAuditOptions = {},\n) {\n const requirePurpose = options.requirePurpose ?? true;\n const findings: SecurityAuditFinding[] = [];\n\n for (const script of scripts) {\n const dependency = getExternalScriptDependency(script);\n\n if (!dependency) {\n continue;\n }\n\n if (requirePurpose && !script.purpose) {\n findings.push({\n code: \"script-purpose-missing\",\n message: `Third-party script ${script.src} should declare a purpose for audits and consent flows.`,\n severity: \"warning\",\n });\n }\n\n if (options.requireIntegrity && !script.integrity) {\n findings.push({\n code: \"script-integrity-missing\",\n message: `Third-party script ${script.src} should declare an integrity hash or an explicit trust-boundary exception.`,\n severity: \"warning\",\n });\n }\n\n if (\n script.strategy === \"beforeInteractive\" &&\n !options.allowBeforeInteractiveThirdParty\n ) {\n findings.push({\n code: \"script-third-party-before-interactive\",\n message: `Third-party script ${script.src} runs before the app is interactive and should be justified by policy.`,\n severity: \"warning\",\n });\n }\n\n if (isGoogleTagManager(dependency)) {\n findings.push({\n code: \"script-gtm-wide-trust-boundary\",\n message:\n \"Google Tag Manager can load additional scripts at runtime and should be treated as a wide trust boundary.\",\n severity: \"warning\",\n });\n }\n }\n\n return findings;\n}\n\nfunction auditDocumentPolicy(\n policy: SecurityPolicy,\n options: SecurityHeadersOptions | undefined,\n findings: SecurityAuditFinding[],\n) {\n try {\n return Object.fromEntries(createSecurityHeaders(policy, options));\n } catch (error) {\n findings.push({\n code: \"security-header-render-failed\",\n message: error instanceof Error ? error.message : \"Security headers failed to render.\",\n severity: \"error\",\n });\n\n return {};\n }\n}\n\nfunction auditDocumentScripts(\n policy: ContentSecurityPolicy | false | undefined,\n scripts: readonly ScriptTag[],\n options: SecurityHeadersOptions | undefined,\n findings: SecurityAuditFinding[],\n) {\n if (!policy) {\n return;\n }\n\n const scriptSrc = getScriptSources(policy);\n\n for (const script of scripts) {\n if (requiresScriptNonce(scriptSrc) && !script.nonce) {\n findings.push({\n code: \"csp-script-missing-nonce\",\n message: `Document script ${script.src} needs a nonce for the effective script-src policy.`,\n severity: \"error\",\n });\n continue;\n }\n\n if (script.nonce && options?.nonce && script.nonce === options.nonce) {\n continue;\n }\n\n if (!allowsScriptSource(scriptSrc, script.src)) {\n findings.push({\n code: \"csp-script-src-blocked\",\n message: `Document script ${script.src} is not allowed by the effective script-src policy.`,\n severity: \"error\",\n });\n }\n }\n}\n\nfunction normalizeScriptDependencyAuditOptions(\n options: boolean | ScriptDependencyAuditOptions,\n): ScriptDependencyAuditOptions {\n return typeof options === \"boolean\" ? {} : options;\n}\n\nfunction getScriptSources(policy: ContentSecurityPolicy) {\n return resolveCspArray(policy.scriptSrc) ??\n resolveCspArray(policy.defaultSrc) ??\n [];\n}\n\nfunction resolveCspArray<T extends string>(\n value: false | readonly T[] | { replace: readonly T[] } | undefined,\n) {\n if (!value) {\n return undefined;\n }\n\n return \"replace\" in value ? value.replace : value;\n}\n\nfunction requiresScriptNonce(sources: readonly CspSource[]) {\n return sources.some((source) => source.includes(\"'nonce-{nonce}'\"));\n}\n\nfunction allowsScriptSource(sources: readonly CspSource[], src: string) {\n if (isStrictDynamicActive(sources)) {\n return false;\n }\n\n if (sources.includes(\"*\")) {\n return true;\n }\n\n if (sources.includes(\"'none'\")) {\n return false;\n }\n\n if (sources.some((source) => source.startsWith(\"'nonce-\"))) {\n return false;\n }\n\n if (sources.includes(\"'self'\") && isSameOriginPath(src)) {\n return true;\n }\n\n if (src.startsWith(\"https:\") && sources.includes(\"https:\")) {\n return true;\n }\n\n if (src.startsWith(\"http:\") && sources.includes(\"http:\")) {\n return true;\n }\n\n return sources.some((source) => sourceMatchesScriptSource(source, src));\n}\n\nfunction isSameOriginPath(src: string) {\n return src.startsWith(\"/\") && !src.startsWith(\"//\");\n}\n\nfunction sourceMatchesScriptSource(source: CspSource, src: string) {\n if (source.startsWith(\"'\")) {\n return false;\n }\n\n try {\n const sourceUrl = new URL(source);\n const scriptUrl = new URL(src);\n\n const hostnameMatches = sourceUrl.hostname.startsWith(\"*.\")\n ? scriptUrl.hostname.endsWith(sourceUrl.hostname.slice(1)) &&\n scriptUrl.hostname !== sourceUrl.hostname.slice(2)\n : scriptUrl.hostname === sourceUrl.hostname;\n const pathMatches = sourceUrl.pathname === \"/\" ||\n sourceUrl.pathname.endsWith(\"/\")\n ? scriptUrl.pathname.startsWith(sourceUrl.pathname)\n : scriptUrl.pathname === sourceUrl.pathname;\n\n return (\n scriptUrl.protocol === sourceUrl.protocol &&\n hostnameMatches &&\n scriptUrl.port === sourceUrl.port &&\n pathMatches\n );\n } catch {\n return false;\n }\n}\n\nfunction isStrictDynamicActive(sources: readonly CspSource[]) {\n return sources.includes(\"'strict-dynamic'\") && sources.some((source) =>\n source.startsWith(\"'nonce-\") || /^'sha(?:256|384|512)-/.test(source)\n );\n}\n\nfunction auditRoutePolicy(\n route: NonNullable<SecurityAuditOptions[\"route\"]>,\n findings: SecurityAuditFinding[],\n) {\n auditCorsPolicy(route.cors, findings);\n auditRouteAccess(route.access, findings);\n auditUnsafeMethodPolicy(route.method, route.security, findings);\n auditRequestBodyLimit(route.security, findings);\n\n return {\n access: route.access,\n cors: route.cors,\n method: route.method,\n security: route.security,\n };\n}\n\n// The effective authorization of a route is the ordered chain of inherited\n// hooks. The audit names that chain, and it names each exception that removed\n// an inherited hook.\nfunction auditRouteAccess(\n access: ResolvedRouteAccess | undefined,\n findings: SecurityAuditFinding[],\n) {\n if (!access) {\n return;\n }\n\n if (!access.declared) {\n findings.push({\n code: \"access-declaration-missing\",\n message:\n \"This route inherits no access declaration, so the request pipeline denies each request. Add access to this route or an ancestor @policy.ts file.\",\n severity: \"error\",\n });\n } else if (access.public) {\n findings.push({\n code: \"access-public\",\n message: \"This route declares public access, so it runs no authorization hook.\",\n severity: \"info\",\n });\n } else {\n findings.push({\n code: \"access-authorized\",\n message: `This route runs ${access.chain.length} inherited authorization ${\n access.chain.length === 1 ? \"hook\" : \"hooks\"\n }, from ${describeAccessSources(access)}. A denial uses status ${access.denyStatus}.`,\n severity: \"info\",\n });\n }\n\n for (const exception of access.exceptions) {\n findings.push({\n code: \"access-exception\",\n message: `An access exception in ${\n exception.source ?? \"an unnamed policy file\"\n } removed each inherited authorization hook for ${\n exception.scope ?? \"this subtree\"\n }. Reason: ${exception.reason}`,\n severity: \"warning\",\n source: exception.source,\n });\n }\n}\n\nfunction describeAccessSources(access: ResolvedRouteAccess) {\n const sources = access.chain.map((entry) => entry.source ?? \"an unnamed policy file\");\n\n return sources.join(\", \");\n}\n\nfunction auditCorsPolicy(\n policy: CorsPolicy | undefined,\n findings: SecurityAuditFinding[],\n) {\n if (!policy) {\n return;\n }\n\n try {\n validateCorsPolicy(policy);\n } catch (error) {\n findings.push({\n code: \"cors-invalid\",\n message: error instanceof Error ? error.message : \"CORS policy is invalid.\",\n severity: \"error\",\n });\n }\n}\n\nfunction auditUnsafeMethodPolicy(\n method: HttpMethod,\n policy: RouteSecurityPolicy | undefined,\n findings: SecurityAuditFinding[],\n) {\n if (!unsafeMethods.has(method)) {\n return;\n }\n\n const csrfException = getCsrfException(policy?.csrf);\n\n if (csrfException) {\n findings.push({\n code: \"csrf-disabled\",\n message: `This unsafe route runs no CSRF check. ${\n describeExceptionSource(csrfException)\n } Reason: ${csrfException.reason}`,\n origin: csrfException.origin ?? \"application\",\n severity: \"info\",\n source: csrfException.source,\n });\n }\n\n if (!policy?.rateLimit) {\n findings.push({\n code: \"rate-limit-missing\",\n message: \"Unsafe routes should declare rate limiting.\",\n severity: \"warning\",\n });\n }\n}\n\n// ADR 0015 gives every route an inherited, bounded request body limit, so an\n// omitted declaration is no longer a gap. A route that raises the limit above\n// the default is the one exception that stays typed. This finding makes that\n// exception visible in inspection and audit output.\nfunction auditRequestBodyLimit(\n policy: RouteSecurityPolicy | undefined,\n findings: SecurityAuditFinding[],\n) {\n const exception = getBodySizeException(policy?.request?.maxBodySize);\n const declared = resolveMaxBodySize(policy?.request?.maxBodySize);\n\n if (declared === undefined) {\n return;\n }\n\n let declaredBytes: number;\n let defaultBytes: number;\n\n try {\n declaredBytes = parseBodySize(declared);\n defaultBytes = parseBodySize(DEFAULT_MAX_BODY_SIZE);\n } catch {\n // An invalid declaration fails at request time with a typed error. The\n // audit does not repeat that failure.\n return;\n }\n\n if (declaredBytes <= defaultBytes) {\n return;\n }\n\n if (!exception) {\n findings.push({\n code: \"security-exception-reason-missing\",\n message:\n `This route raises the inherited request body limit to ${declared} and states no reason. Declare maxBodySize with a limit value and a reason.`,\n severity: \"error\",\n });\n return;\n }\n\n findings.push({\n code: \"request-body-limit-raised\",\n message: `This route raises the inherited request body limit to ${declared}. ${\n describeExceptionSource(exception)\n } Reason: ${exception.reason}`,\n origin: exception.origin ?? \"application\",\n severity: \"info\",\n source: exception.source,\n });\n}\n\nfunction getExternalScriptDependency(script: ScriptTag) {\n try {\n const url = new URL(script.src);\n\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n return url;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction isGoogleTagManager(url: URL) {\n return (\n url.hostname === \"www.googletagmanager.com\" &&\n (url.pathname === \"/gtm.js\" || url.pathname === \"/ns.html\")\n );\n}\n","import { resolveCsrf } from \"./exceptions\";\nimport type { CsrfPolicy, CsrfPolicyOptions } from \"./types\";\n\nconst unsafeMethods = new Set([\"DELETE\", \"PATCH\", \"POST\", \"PUT\"]);\nconst cookieNamePattern = /^[!#$%&'*+\\-.^_`|~A-Za-z0-9]+$/;\n\nexport type CsrfCookieOptions = {\n cookie?: string;\n secure?: boolean;\n};\n\nexport type IssuedCsrfToken = {\n cookie: string;\n token: string;\n};\n\nexport function createCsrfToken() {\n const bytes = new Uint8Array(32);\n globalThis.crypto.getRandomValues(bytes);\n\n return btoa(String.fromCharCode(...bytes))\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/, \"\");\n}\n\nexport function createCsrfCookie(\n token: string,\n options: CsrfCookieOptions = {},\n) {\n const cookie = options.cookie ?? \"csrf-token\";\n\n if (!cookieNamePattern.test(cookie)) {\n throw new Error(\"Demiurge CSRF cookie name is invalid.\");\n }\n\n if (!token) {\n throw new Error(\"Demiurge CSRF token must not be empty.\");\n }\n\n const attributes = [\n `${cookie}=${encodeURIComponent(token)}`,\n \"Path=/\",\n \"SameSite=Lax\",\n ];\n\n if (options.secure ?? true) {\n attributes.push(\"Secure\");\n }\n\n return attributes.join(\"; \");\n}\n\nexport function issueCsrfToken(options: CsrfCookieOptions = {}): IssuedCsrfToken {\n const token = createCsrfToken();\n\n return {\n cookie: createCsrfCookie(token, options),\n token,\n };\n}\n\nexport async function enforceCsrfProtection(\n policy: CsrfPolicy | undefined,\n request: Request,\n) {\n const declared = resolveCsrf(policy);\n\n if (!unsafeMethods.has(request.method.toUpperCase()) || declared === false) {\n return null;\n }\n\n const cookieHeader = request.headers.get(\"cookie\");\n\n // An omitted policy uses the secure default only when browser credentials\n // are present. Explicit `true` remains useful for routes that require a\n // double-submit token regardless of whether another cookie was sent.\n if (declared === undefined && !cookieHeader?.trim()) {\n return null;\n }\n\n const options = normalizeCsrfPolicy(declared ?? true);\n const cookies = parseCookieHeader(cookieHeader);\n const cookieToken = cookies.get(options.cookie);\n const headerToken = request.headers.get(options.header);\n const headerMatches = Boolean(\n cookieToken && headerToken && constantTimeEqual(cookieToken, headerToken),\n );\n\n if (headerMatches) {\n return null;\n }\n\n const fieldToken = options.field\n ? await readFormToken(request.clone(), options.field)\n : null;\n const fieldMatches = Boolean(\n cookieToken && fieldToken && constantTimeEqual(cookieToken, fieldToken),\n );\n\n if (!fieldMatches) {\n return new Response(\"Invalid CSRF token.\", {\n status: 403,\n });\n }\n\n return null;\n}\n\nexport function parseCookieHeader(header: string | null) {\n const cookies = new Map<string, string>();\n\n if (!header) {\n return cookies;\n }\n\n for (const part of header.split(\";\")) {\n const separator = part.indexOf(\"=\");\n\n if (separator === -1) {\n continue;\n }\n\n const name = part.slice(0, separator).trim();\n const value = part.slice(separator + 1).trim();\n\n if (name) {\n cookies.set(name, decodeCookieValue(value));\n }\n }\n\n return cookies;\n}\n\nfunction normalizeCsrfPolicy(policy: true | CsrfPolicyOptions) {\n if (policy === true) {\n return {\n cookie: \"csrf-token\",\n header: \"x-csrf-token\",\n };\n }\n\n return {\n cookie: policy.cookie ?? \"csrf-token\",\n field: policy.field,\n header: policy.header ?? \"x-csrf-token\",\n };\n}\n\nasync function readFormToken(request: Request, field: string) {\n const contentType = request.headers.get(\"content-type\")?.toLowerCase() ?? \"\";\n\n if (\n !contentType.startsWith(\"application/x-www-form-urlencoded\") &&\n !contentType.startsWith(\"multipart/form-data\")\n ) {\n return null;\n }\n\n try {\n const value = (await request.formData()).get(field);\n return typeof value === \"string\" ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction decodeCookieValue(value: string) {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction constantTimeEqual(left: string, right: string) {\n let diff = left.length ^ right.length;\n const maxLength = Math.max(left.length, right.length);\n\n for (let index = 0; index < maxLength; index += 1) {\n diff |= left.charCodeAt(index) ^ right.charCodeAt(index);\n }\n\n return diff === 0;\n}\n","import type { HttpMethod } from \"../route/types\";\nimport type {\n FetchMetadataCheck,\n FetchMetadataPolicy,\n FetchMetadataPolicyOptions,\n} from \"./types\";\n\n// The canonical field names used in `Vary`. A shared cache compares field\n// names without case, but a stable spelling keeps the header readable.\nconst destinationField = \"Sec-Fetch-Dest\";\nconst modeField = \"Sec-Fetch-Mode\";\nconst siteField = \"Sec-Fetch-Site\";\n\n// A browser sets these destinations when one document embeds another one. A\n// navigation allowance must not cover them, because an attacker page can\n// frame the route and read the framed document through a side channel.\nconst embeddedDestinations = new Set([\"embed\", \"object\"]);\n\n// Only a method that the browser can produce from a plain link or address bar\n// counts as a safe top-level navigation.\nconst safeNavigationMethods = new Set<string>([\"GET\", \"HEAD\"]);\n\nconst defaultOptions: Required<\n Omit<FetchMetadataPolicyOptions, \"allowedDestinations\">\n> = {\n allowCrossSite: false,\n allowNavigation: true,\n allowSameSite: false,\n};\n\n/**\n * Applies the MDN resource-isolation algorithm to one request.\n *\n * The check reads a Fetch Metadata header only when the decision needs it.\n * The returned `vary` list names exactly the fields that the decision read.\n */\nexport function checkFetchMetadata(\n policy: Exclude<FetchMetadataPolicy, false>,\n request: Request,\n method: HttpMethod | string = request.method,\n): FetchMetadataCheck {\n const options = policy === true ? defaultOptions : { ...defaultOptions, ...policy };\n const vary: string[] = [];\n\n // A CORS preflight carries no application data and reads no route body. The\n // browser sends it before the request that the policy does judge.\n if (isCorsPreflight(request, method)) {\n return { allowed: true, reason: \"cors-preflight\", vary };\n }\n\n vary.push(siteField);\n const site = request.headers.get(\"sec-fetch-site\");\n\n // A client that sends no Fetch Metadata stays compatible. MDN gives the\n // same guidance, because an old browser or a server-to-server client sends\n // no `Sec-Fetch-Site`.\n if (site === null) {\n return { allowed: true, reason: \"metadata-absent\", vary };\n }\n\n if (site === \"same-origin\") {\n return { allowed: true, reason: \"same-origin\", vary };\n }\n\n // `none` identifies a request that the user started, such as a bookmark or\n // an address bar entry.\n if (site === \"none\") {\n return { allowed: true, reason: \"user-initiated\", vary };\n }\n\n if (site === \"same-site\" && options.allowSameSite) {\n return { allowed: true, reason: \"same-site-trusted\", vary };\n }\n\n if (options.allowCrossSite) {\n return { allowed: true, reason: \"cross-site-exempt\", vary };\n }\n\n const allowedDestinations = policy === true\n ? undefined\n : policy.allowedDestinations;\n\n if (allowedDestinations?.length) {\n vary.push(destinationField);\n\n if (allowedDestinations.includes(request.headers.get(\"sec-fetch-dest\") ?? \"\")) {\n return { allowed: true, reason: \"destination-exempt\", vary };\n }\n }\n\n if (options.allowNavigation && safeNavigationMethods.has(method.toUpperCase())) {\n vary.push(modeField);\n\n if (request.headers.get(\"sec-fetch-mode\") === \"navigate\") {\n const destination = request.headers.get(\"sec-fetch-dest\") ?? \"\";\n\n if (!vary.includes(destinationField)) {\n vary.push(destinationField);\n }\n\n if (!embeddedDestinations.has(destination)) {\n return { allowed: true, reason: \"top-level-navigation\", vary };\n }\n }\n }\n\n // An unknown `Sec-Fetch-Site` value is not one of the trusted values, so the\n // policy treats it the same way it treats a cross-site value.\n return {\n allowed: false,\n reason: site === \"same-site\" ? \"same-site-denied\" : \"cross-site-denied\",\n vary,\n };\n}\n\nexport type FetchMetadataEnforcement = {\n response: Response | null;\n vary: readonly string[];\n};\n\n/**\n * Runs the policy before a route body runs.\n *\n * `response` holds a 403 response when the policy denies the request. `vary`\n * names the fields that every response for this route must declare, including\n * the responses that the route itself produces.\n */\nexport function enforceFetchMetadataPolicy(\n policy: FetchMetadataPolicy | undefined,\n request: Request,\n method: HttpMethod | string = request.method,\n): FetchMetadataEnforcement {\n if (!policy) {\n return { response: null, vary: [] };\n }\n\n const check = checkFetchMetadata(policy, request, method);\n\n if (check.allowed) {\n return { response: null, vary: check.vary };\n }\n\n const response = new Response(\"Request blocked by the Fetch Metadata policy.\", {\n headers: { \"content-type\": \"text/plain; charset=utf-8\" },\n status: 403,\n });\n applyFetchMetadataVary(response, check.vary);\n\n return { response, vary: check.vary };\n}\n\n/**\n * Adds the consulted Fetch Metadata fields to `Vary` without a duplicate.\n *\n * A shared cache must key on every field that changed the decision. The W3C\n * Fetch Metadata specification makes this requirement.\n */\nexport function applyFetchMetadataVary(\n response: Response,\n fields: readonly string[],\n) {\n if (fields.length === 0) {\n return response;\n }\n\n const existing = response.headers.get(\"vary\")\n ?.split(\",\")\n .map((field) => field.trim())\n .filter(Boolean) ?? [];\n\n // A wildcard already prevents every shared-cache reuse. Adding a field name\n // beside it would make the header weaker to read and no stronger.\n if (existing.includes(\"*\")) {\n return response;\n }\n\n const merged = [...existing];\n\n for (const field of fields) {\n if (!merged.some((value) => value.toLowerCase() === field.toLowerCase())) {\n merged.push(field);\n }\n }\n\n response.headers.set(\"vary\", merged.join(\", \"));\n\n return response;\n}\n\nfunction isCorsPreflight(request: Request, method: HttpMethod | string) {\n return (\n method.toUpperCase() === \"OPTIONS\" &&\n request.headers.has(\"access-control-request-method\")\n );\n}\n","export type EnvSource = Record<string, string | undefined>;\n\nexport type EnvValidationIssue = {\n code: \"invalid\" | \"missing\";\n key: string;\n message: string;\n};\n\nexport class EnvValidationError extends Error {\n issues: EnvValidationIssue[];\n\n constructor(issues: EnvValidationIssue[]) {\n super(formatEnvValidationError(issues));\n this.name = \"EnvValidationError\";\n this.issues = issues;\n }\n}\n\nexport type EnvVariableKind =\n | \"boolean\"\n | \"enum\"\n | \"integer\"\n | \"secret\"\n | \"string\"\n | \"url\";\n\n// The serializable description of one variable. The framework writes this\n// description into the generated server entry, so the schema of the\n// configuration file reaches the production process without the file.\nexport type EnvVariableDescriptor = {\n // A client variable reaches the browser bundle. The build refuses a client\n // bundle that reads a variable which this field does not mark.\n client: boolean;\n // A deferred variable postpones validation until the first server access of\n // the value. The framework does not stop the start when the value is absent\n // or invalid.\n deferred: boolean;\n kind: EnvVariableKind;\n optional: boolean;\n options: Record<string, unknown>;\n sensitive: boolean;\n};\n\nexport type EnvSchemaDescriptor = Record<string, EnvVariableDescriptor>;\n\nexport type EnvVariable<T, Optional extends boolean = false> =\n & Omit<EnvVariableDescriptor, \"optional\">\n & {\n optional: Optional;\n parse: (key: string, value: string) => T;\n };\n\nexport type EnvSchema = Record<string, EnvVariable<unknown, boolean>>;\n\nexport type InferEnvSchema<Schema extends EnvSchema> = {\n [Key in keyof Schema]: Schema[Key] extends EnvVariable<infer Value, infer Optional>\n ? Optional extends true\n ? Value | undefined\n : Value\n : never;\n};\n\ntype SharedEnvVariableOptions = {\n // A client variable reaches the browser bundle. The build inlines its value.\n // The default value is false, and the value then stays on the server.\n client?: boolean;\n};\n\n// A required variable stops the server start when it is absent or invalid.\n// This is the default declaration.\ntype RequiredEnvVariableOptions = SharedEnvVariableOptions & {\n deferred?: false;\n optional?: false;\n};\n\n// An optional variable permits absence. The framework validates a supplied\n// optional value at startup.\ntype OptionalEnvVariableOptions = SharedEnvVariableOptions & {\n deferred?: false;\n optional: true;\n};\n\n// A deferred variable postpones validation to the first server access of the\n// value. The build inlines a client variable, so a client variable has no\n// deferred form.\ntype DeferredEnvVariableOptions = {\n client?: never;\n deferred: true;\n optional?: false;\n};\n\ntype EnvVariableOptions =\n | RequiredEnvVariableOptions\n | OptionalEnvVariableOptions\n | DeferredEnvVariableOptions;\n\ntype RequiredStringEnvOptions = RequiredEnvVariableOptions & {\n minLength?: number;\n};\n\ntype OptionalStringEnvOptions = OptionalEnvVariableOptions & {\n minLength?: number;\n};\n\ntype DeferredStringEnvOptions = DeferredEnvVariableOptions & {\n minLength?: number;\n};\n\ntype StringEnvOptions =\n | RequiredStringEnvOptions\n | OptionalStringEnvOptions\n | DeferredStringEnvOptions;\n\n// A secret variable never reaches the browser. The option is absent from the\n// type of the builder, and the builder also refuses it at run time.\ntype RequiredSecretEnvOptions = RequiredStringEnvOptions & { client?: never };\n\ntype OptionalSecretEnvOptions = OptionalStringEnvOptions & { client?: never };\n\ntype DeferredSecretEnvOptions = DeferredStringEnvOptions & { client?: never };\n\ntype SecretEnvOptions =\n | RequiredSecretEnvOptions\n | OptionalSecretEnvOptions\n | DeferredSecretEnvOptions;\n\ntype RequiredUrlEnvOptions = RequiredEnvVariableOptions & {\n protocols?: readonly string[];\n};\n\ntype OptionalUrlEnvOptions = OptionalEnvVariableOptions & {\n protocols?: readonly string[];\n};\n\ntype DeferredUrlEnvOptions = DeferredEnvVariableOptions & {\n protocols?: readonly string[];\n};\n\ntype UrlEnvOptions =\n | RequiredUrlEnvOptions\n | OptionalUrlEnvOptions\n | DeferredUrlEnvOptions;\n\ntype RequiredIntegerEnvOptions = RequiredEnvVariableOptions & {\n max?: number;\n min?: number;\n};\n\ntype OptionalIntegerEnvOptions = OptionalEnvVariableOptions & {\n max?: number;\n min?: number;\n};\n\ntype DeferredIntegerEnvOptions = DeferredEnvVariableOptions & {\n max?: number;\n min?: number;\n};\n\ntype IntegerEnvOptions =\n | RequiredIntegerEnvOptions\n | OptionalIntegerEnvOptions\n | DeferredIntegerEnvOptions;\n\nexport function defineEnvSchema<Schema extends EnvSchema>(schema: Schema) {\n return schema;\n}\n\nexport function validateEnv<Schema extends EnvSchema>(\n schema: Schema,\n source: EnvSource,\n): InferEnvSchema<Schema> {\n const issues: EnvValidationIssue[] = [];\n const values: Partial<Record<keyof Schema, unknown>> = {};\n\n // TYPE-EVIDENCE: Object.keys returns the schema keys as strings. The cast narrows them to the schema key type because they come from the schema.\n for (const key of Object.keys(schema) as Array<keyof Schema>) {\n const variable = schema[key];\n const rawValue = source[String(key)];\n\n if (rawValue === undefined || rawValue === \"\") {\n if (variable.optional) {\n values[key] = undefined;\n continue;\n }\n\n issues.push({\n code: \"missing\",\n key: String(key),\n message: `Environment variable ${String(key)} is required.`,\n });\n continue;\n }\n\n try {\n values[key] = variable.parse(String(key), rawValue);\n } catch (error) {\n issues.push({\n code: \"invalid\",\n key: String(key),\n message: error instanceof Error\n ? error.message\n : `Environment variable ${String(key)} is invalid.`,\n });\n }\n }\n\n if (issues.length) {\n throw new EnvValidationError(issues);\n }\n\n // TYPE-EVIDENCE: the loop above populated values from the validated schema entries. The cast restores the inferred schema type.\n return values as InferEnvSchema<Schema>;\n}\n\nfunction booleanEnv(options: OptionalEnvVariableOptions): EnvVariable<boolean, true>;\nfunction booleanEnv(\n options?: RequiredEnvVariableOptions | DeferredEnvVariableOptions,\n): EnvVariable<boolean, false>;\nfunction booleanEnv(options: EnvVariableOptions = {}) {\n return createVariable(options, false, (key, value) => {\n if (value === \"true\" || value === \"1\") {\n return true;\n }\n\n if (value === \"false\" || value === \"0\") {\n return false;\n }\n\n throw new Error(`Environment variable ${key} must be true, false, 1, or 0.`);\n }, \"boolean\");\n}\n\nfunction enumEnv<const Values extends readonly [string, ...string[]]>(\n values: Values,\n options: OptionalEnvVariableOptions,\n): EnvVariable<Values[number], true>;\nfunction enumEnv<const Values extends readonly [string, ...string[]]>(\n values: Values,\n options?: RequiredEnvVariableOptions | DeferredEnvVariableOptions,\n): EnvVariable<Values[number], false>;\nfunction enumEnv<const Values extends readonly [string, ...string[]]>(\n values: Values,\n options: EnvVariableOptions = {},\n) {\n return createVariable(options, false, (key, value) => {\n if (values.includes(value)) {\n return value;\n }\n\n throw new Error(\n `Environment variable ${key} must be one of: ${values.join(\", \")}.`,\n );\n }, \"enum\", { values: [...values] });\n}\n\nfunction integerEnv(options: OptionalIntegerEnvOptions): EnvVariable<number, true>;\nfunction integerEnv(\n options?: RequiredIntegerEnvOptions | DeferredIntegerEnvOptions,\n): EnvVariable<number, false>;\nfunction integerEnv(options: IntegerEnvOptions = {}) {\n return createVariable(options, false, (key, value) => {\n if (!/^-?\\d+$/.test(value)) {\n throw new Error(`Environment variable ${key} must be an integer.`);\n }\n\n const parsed = Number(value);\n\n if (!Number.isSafeInteger(parsed)) {\n throw new Error(`Environment variable ${key} must be a safe integer.`);\n }\n\n if (options.min !== undefined && parsed < options.min) {\n throw new Error(\n `Environment variable ${key} must be greater than or equal to ${options.min}.`,\n );\n }\n\n if (options.max !== undefined && parsed > options.max) {\n throw new Error(\n `Environment variable ${key} must be less than or equal to ${options.max}.`,\n );\n }\n\n return parsed;\n }, \"integer\");\n}\n\nfunction secretEnv(options: OptionalSecretEnvOptions): EnvVariable<string, true>;\nfunction secretEnv(\n options?: RequiredSecretEnvOptions | DeferredSecretEnvOptions,\n): EnvVariable<string, false>;\nfunction secretEnv(options: SecretEnvOptions = {}) {\n return createVariable(\n options,\n true,\n (key, value) => parseString(key, value, options),\n \"secret\",\n );\n}\n\nfunction stringEnv(options: OptionalStringEnvOptions): EnvVariable<string, true>;\nfunction stringEnv(\n options?: RequiredStringEnvOptions | DeferredStringEnvOptions,\n): EnvVariable<string, false>;\nfunction stringEnv(options: StringEnvOptions = {}) {\n return createVariable(\n options,\n false,\n (key, value) => parseString(key, value, options),\n \"string\",\n );\n}\n\nfunction urlEnv(options: OptionalUrlEnvOptions): EnvVariable<URL, true>;\nfunction urlEnv(\n options?: RequiredUrlEnvOptions | DeferredUrlEnvOptions,\n): EnvVariable<URL, false>;\nfunction urlEnv(options: UrlEnvOptions = {}) {\n return createVariable(options, false, (key, value) => {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(`Environment variable ${key} must be a valid URL.`);\n }\n\n if (\n options.protocols?.length &&\n !options.protocols.includes(url.protocol)\n ) {\n throw new Error(\n `Environment variable ${key} must use one of these protocols: ${options.protocols.join(\", \")}.`,\n );\n }\n\n return url;\n }, \"url\");\n}\n\nexport const env = {\n boolean: booleanEnv,\n enum: enumEnv,\n integer: integerEnv,\n secret: secretEnv,\n string: stringEnv,\n url: urlEnv,\n};\n\nfunction createVariable<T>(\n options: EnvVariableOptions,\n sensitive: boolean,\n parse: (key: string, value: string) => T,\n kind: EnvVariableKind = \"string\",\n extra: Record<string, unknown> = {},\n): EnvVariable<T, boolean> {\n // TYPE-EVIDENCE: each builder passes its own declared options and its own extra values. The cast reads the shared options and keeps the rest as the serializable description.\n const merged = { ...options, ...extra } as\n & Record<string, unknown>\n & EnvVariableOptions\n & { client?: boolean; deferred?: boolean };\n const { client = false, deferred = false, optional = false, ...rest } = merged;\n\n if (client && sensitive) {\n throw new Error(\n \"A secret environment variable cannot reach client code. Declare a separate variable for the browser.\",\n );\n }\n\n if (optional && deferred) {\n throw new Error(\n \"An environment variable cannot combine optional with deferred. Declare one of the two options.\",\n );\n }\n\n if (client && deferred) {\n throw new Error(\n \"A client environment variable cannot be deferred. The build validates the value of a client variable.\",\n );\n }\n\n return {\n client,\n deferred,\n kind,\n optional,\n options: rest,\n parse,\n sensitive,\n };\n}\n\nfunction parseString(\n key: string,\n value: string,\n options: StringEnvOptions,\n) {\n if (options.minLength !== undefined && value.length < options.minLength) {\n throw new Error(\n `Environment variable ${key} must be at least ${options.minLength} characters.`,\n );\n }\n\n return value;\n}\n\nfunction formatEnvValidationError(issues: EnvValidationIssue[]) {\n if (issues.length === 1) {\n return issues[0].message;\n }\n\n return `Environment validation failed with ${issues.length} issues.`;\n}\n","import {\n env,\n EnvValidationError,\n type EnvSchema,\n type EnvSchemaDescriptor,\n type EnvSource,\n type EnvValidationIssue,\n type EnvVariable,\n type EnvVariableDescriptor,\n type InferEnvSchema,\n} from \"./env\";\n\nexport type EnvStartupOptions = {\n source?: EnvSource;\n};\n\nexport type EnvStartupResult = {\n values: Record<string, unknown>;\n};\n\ntype DeferredEnvEntry = {\n rawValue: string | undefined;\n variable: EnvVariable<unknown, boolean>;\n};\n\n// Vite can load the plugin and the application entry from separate package\n// bundles. Store the values on registered symbols so both bundles share one\n// process-wide environment state.\nconst environmentState = Symbol.for(\"demiurge.environmentState\");\nconst deferredEnvironmentState = Symbol.for(\"demiurge.deferredEnvironmentState\");\n// TYPE-EVIDENCE: globalThis stores the process-local maps under the registered symbols.\nconst runtime = globalThis as typeof globalThis & Record<symbol, unknown>;\nconst initialized = getInitializedEnvironment();\nconst deferred = getDeferredEnvironment();\n\nfunction getInitializedEnvironment(): Map<string, unknown> {\n const existing = runtime[environmentState];\n if (existing instanceof Map) return existing;\n\n const values = new Map<string, unknown>();\n runtime[environmentState] = values;\n return values;\n}\n\nfunction getDeferredEnvironment(): Map<string, DeferredEnvEntry> {\n const existing = runtime[deferredEnvironmentState];\n if (existing instanceof Map) return existing;\n\n const values = new Map<string, DeferredEnvEntry>();\n runtime[deferredEnvironmentState] = values;\n return values;\n}\n\n// The configuration file declares the schema. The build writes this\n// description into the generated server entry, because the production process\n// does not read the configuration file.\nexport function serializeEnvSchema(schema: EnvSchema): EnvSchemaDescriptor {\n return Object.fromEntries(\n Object.entries(schema).map(([key, variable]) => [key, {\n client: variable.client,\n deferred: variable.deferred,\n kind: variable.kind,\n optional: variable.optional,\n options: variable.options,\n sensitive: variable.sensitive,\n }]),\n );\n}\n\nexport function deserializeEnvSchema(\n descriptor: EnvSchemaDescriptor,\n): EnvSchema {\n return Object.fromEntries(\n Object.entries(descriptor).map(([key, variable]) => [\n key,\n createVariableFromDescriptor(key, variable),\n ]),\n );\n}\n\n// The server entry calls this function while the module graph loads. A\n// required value that is absent or invalid therefore stops the process before\n// it accepts traffic. A deferred value postpones its validation to the first\n// server access of the value.\nexport function startEnvironment(\n schema: EnvSchema | EnvSchemaDescriptor,\n options: EnvStartupOptions = {},\n): EnvStartupResult {\n const resolved = isEnvSchema(schema) ? schema : deserializeEnvSchema(schema);\n const source = options.source ?? readProcessEnvironment();\n const issues: EnvValidationIssue[] = [];\n const values: Record<string, unknown> = {};\n\n for (const [key, variable] of Object.entries(resolved)) {\n const rawValue = source[key];\n\n if (variable.deferred) {\n deferred.set(key, { rawValue, variable });\n continue;\n }\n\n if (rawValue === undefined || rawValue === \"\") {\n values[key] = undefined;\n if (variable.optional) continue;\n issues.push({\n code: \"missing\",\n key,\n message: `Environment variable ${key} is required.`,\n });\n continue;\n }\n\n try {\n values[key] = variable.parse(key, rawValue);\n } catch (error) {\n values[key] = undefined;\n issues.push({\n code: \"invalid\",\n key,\n message: error instanceof Error\n ? error.message\n : `Environment variable ${key} is invalid.`,\n });\n }\n }\n\n if (issues.length) throw new EnvValidationError(issues);\n\n for (const [key, value] of Object.entries(values)) initialized.set(key, value);\n\n return { values };\n}\n\n// Applications read the validated values with the types that the schema\n// declares. This function is server-only. A deferred value validates here, on\n// its first access, and reports a clear error that does not contain the value.\nexport function readEnv<Schema extends EnvSchema>(\n schema: Schema,\n): InferEnvSchema<Schema> {\n const values: Record<string, unknown> = {};\n\n for (const key of Object.keys(schema)) {\n if (deferred.has(key)) {\n values[key] = resolveDeferredValue(key);\n continue;\n }\n\n if (!initialized.has(key)) {\n throw new Error(\n `Demiurge did not validate the environment variable ${key}. The framework validates the schema of demiurge.config.ts when the server starts.`,\n );\n }\n values[key] = initialized.get(key);\n }\n\n // TYPE-EVIDENCE: startEnvironment parsed each value with the same schema. The cast restores the inferred schema type.\n return values as InferEnvSchema<Schema>;\n}\n\nexport function resetEnvironment() {\n initialized.clear();\n deferred.clear();\n}\n\nfunction resolveDeferredValue(key: string): unknown {\n // TYPE-EVIDENCE: the has check above proves the map holds an entry for this key.\n const entry = deferred.get(key) as DeferredEnvEntry;\n const { rawValue, variable } = entry;\n\n if (rawValue === undefined || rawValue === \"\") {\n if (variable.optional) {\n deferred.delete(key);\n initialized.set(key, undefined);\n return undefined;\n }\n\n throw new Error(\n `Environment variable ${key} is required. Give the variable a value before the code reads it.`,\n );\n }\n\n let value: unknown;\n try {\n value = variable.parse(key, rawValue);\n } catch (error) {\n throw new Error(\n error instanceof Error\n ? error.message\n : `Environment variable ${key} is invalid.`,\n { cause: error },\n );\n }\n\n deferred.delete(key);\n initialized.set(key, value);\n return value;\n}\n\nfunction createVariableFromDescriptor(\n key: string,\n descriptor: EnvVariableDescriptor,\n): EnvVariable<unknown, boolean> {\n // TYPE-EVIDENCE: serializeEnvSchema wrote these options from a builder call. The cast returns them to the overloaded builder parameter.\n const options = {\n ...descriptor.options,\n client: descriptor.client,\n deferred: descriptor.deferred,\n optional: descriptor.optional,\n } as never;\n\n if (descriptor.kind === \"boolean\") return env.boolean(options);\n if (descriptor.kind === \"integer\") return env.integer(options);\n if (descriptor.kind === \"secret\") return env.secret(options);\n if (descriptor.kind === \"url\") return env.url(options);\n if (descriptor.kind === \"enum\") {\n const values = descriptor.options.values;\n if (!Array.isArray(values) || !values.length) {\n throw new Error(\n `The environment variable ${key} does not have the values of its enum.`,\n );\n }\n // TYPE-EVIDENCE: the descriptor keeps the declared enum values. The cast restores the tuple type that the builder needs.\n return env.enum(values as [string, ...string[]], options);\n }\n return env.string(options);\n}\n\nfunction isEnvSchema(\n schema: EnvSchema | EnvSchemaDescriptor,\n): schema is EnvSchema {\n return Object.values(schema).every(\n (variable) => \"parse\" in variable && typeof variable.parse === \"function\",\n );\n}\n\nfunction readProcessEnvironment(): EnvSource {\n // TYPE-EVIDENCE: the framework runs this function on a server runtime. The cast reads the process environment without a Node type dependency here.\n const runtime = globalThis as { process?: { env?: EnvSource } };\n return runtime.process?.env ?? {};\n}\n","import type {\n MemoryRateLimitStoreOptions,\n RateLimitKey,\n RateLimitPolicy,\n RateLimitResult,\n RateLimitStore,\n} from \"./types\";\nimport { getRequestConnectionMetadata } from \"../server/request-metadata\";\n\nconst durationUnits = {\n h: 60 * 60 * 1000,\n m: 60 * 1000,\n s: 1000,\n} as const;\n\ntype MemoryRateLimitEntry = {\n count: number;\n resetAt: number;\n};\n\nconst defaultMaximumEntries = 10_000;\n\n// The memory store has no I/O to await, so its `increment` stays\n// synchronous. The shared `RateLimitStore` interface also allows an async\n// store (Redis, a KV service) to return a promise. This narrower return\n// type lets callers that specifically hold a memory store keep using the\n// result without an `await`.\nexport type MemoryRateLimitStore = {\n increment: (key: string, windowMs: number, now: number) => RateLimitResult;\n};\n\nexport function createMemoryRateLimitStore(\n options: MemoryRateLimitStoreOptions = {},\n): MemoryRateLimitStore {\n const maximumEntries = options.maximumEntries ?? defaultMaximumEntries;\n\n if (!Number.isSafeInteger(maximumEntries) || maximumEntries <= 0) {\n throw new Error(\n \"Demiurge rate limit maximumEntries must be a positive integer.\",\n );\n }\n\n const entries = new Map<string, MemoryRateLimitEntry>();\n let nextExpiration = Number.POSITIVE_INFINITY;\n\n return {\n increment(key, windowMs, now) {\n if (now >= nextExpiration) {\n sweepExpiredEntries(entries, now);\n nextExpiration = findNextExpiration(entries);\n }\n\n const existing = entries.get(key);\n\n if (!existing || existing.resetAt <= now) {\n const next = {\n count: 1,\n resetAt: now + windowMs,\n };\n\n if (!existing && entries.size >= maximumEntries) {\n evictOldestEntry(entries);\n }\n\n entries.set(key, next);\n nextExpiration = Math.min(nextExpiration, next.resetAt);\n // A copy of the stored entry, not the entry itself. `increment()`\n // can return before its caller reads the result, because\n // `enforceRateLimit` awaits it. A later call for the same key\n // would otherwise keep mutating the object an earlier caller is\n // still holding.\n return { count: next.count, resetAt: next.resetAt };\n }\n\n existing.count += 1;\n return { count: existing.count, resetAt: existing.resetAt };\n },\n };\n}\n\nfunction sweepExpiredEntries(\n entries: Map<string, MemoryRateLimitEntry>,\n now: number,\n) {\n for (const [key, entry] of entries) {\n if (entry.resetAt <= now) {\n entries.delete(key);\n }\n }\n}\n\nfunction findNextExpiration(entries: Map<string, MemoryRateLimitEntry>) {\n let nextExpiration = Number.POSITIVE_INFINITY;\n\n for (const entry of entries.values()) {\n nextExpiration = Math.min(nextExpiration, entry.resetAt);\n }\n\n return nextExpiration;\n}\n\nfunction evictOldestEntry(entries: Map<string, MemoryRateLimitEntry>) {\n const oldestKey = entries.keys().next().value;\n\n if (oldestKey !== undefined) {\n entries.delete(oldestKey);\n }\n}\n\nexport async function enforceRateLimit(\n policy: RateLimitPolicy | undefined,\n request: Request,\n store: RateLimitStore,\n now = Date.now(),\n) {\n if (!policy) {\n return null;\n }\n\n validateRateLimitPolicy(policy);\n\n const windowMs = parseRateLimitWindow(policy.window);\n const key = rateLimitStoreKey(policy, request);\n const result = await store.increment(key, windowMs, now);\n const remaining = Math.max(0, policy.limit - result.count);\n const headers = new Headers({\n \"retry-after\": String(Math.ceil(Math.max(0, result.resetAt - now) / 1000)),\n \"x-ratelimit-limit\": String(policy.limit),\n \"x-ratelimit-remaining\": String(remaining),\n \"x-ratelimit-reset\": String(Math.ceil(result.resetAt / 1000)),\n });\n\n if (result.count > policy.limit) {\n return new Response(\"Rate limit exceeded.\", {\n headers,\n status: 429,\n });\n }\n\n return null;\n}\n\nexport function parseRateLimitWindow(value: number | string) {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(\"Demiurge rate limit window must be a positive integer.\");\n }\n\n return value;\n }\n\n const match = /^(\\d+)(s|m|h)$/i.exec(value.trim());\n\n if (!match) {\n throw new Error(\"Demiurge rate limit window must use an s/m/h suffix.\");\n }\n\n const amount = Number(match[1]);\n // TYPE-EVIDENCE: the regex restricts the unit to s, m, or h. The lowercase value is therefore a key of the duration units map.\n const unit = match[2].toLowerCase() as keyof typeof durationUnits;\n const duration = amount * durationUnits[unit];\n\n if (!Number.isSafeInteger(duration)) {\n throw new Error(\"Demiurge rate limit window is too large.\");\n }\n\n return duration;\n}\n\nexport function validateRateLimitPolicy(policy: RateLimitPolicy) {\n if (!Number.isSafeInteger(policy.limit) || policy.limit <= 0) {\n throw new Error(\"Demiurge rate limit limit must be a positive integer.\");\n }\n\n parseRateLimitWindow(policy.window);\n}\n\nfunction rateLimitStoreKey(policy: RateLimitPolicy, request: Request) {\n return `${rateLimitKeyName(policy.key)}:${resolveRateLimitKey(policy.key, request)}`;\n}\n\nfunction rateLimitKeyName(key: RateLimitKey) {\n return typeof key === \"string\" ? key : `header:${key.header.toLowerCase()}`;\n}\n\nfunction resolveRateLimitKey(key: RateLimitKey, request: Request) {\n if (key === \"ip\") {\n return clientIp(request);\n }\n\n return request.headers.get(key.header) ?? \"missing\";\n}\n\nfunction clientIp(request: Request) {\n return getRequestConnectionMetadata(request)?.clientIp ?? \"unknown\";\n}\n","import {\n assertAdapterCapabilities,\n checkAdapterCapabilities,\n type Adapter,\n} from \"../adapter\";\nimport {\n createRouteManifest,\n isAttachedFileForRoute,\n type RouteManifest,\n} from \"../router\";\nimport type {\n HttpMethod,\n PageRenderMode,\n ResponseCapability,\n RouteCapability,\n RouteModule,\n} from \"../route\";\nimport { validateCorsPolicy } from \"./cors\";\nimport { resolveCsp } from \"./exceptions\";\nimport { createSecurityAudit } from \"./audit\";\nimport {\n createSecurityHeaders,\n mergeRoutePolicies,\n securityPolicyRequiresNonce,\n} from \"./policy\";\nimport { validateRateLimitPolicy } from \"./rate-limit\";\nimport type { ScriptTag } from \"../document\";\nimport type { ContentSecurityPolicy, CspDirectiveValue } from \"./types\";\n\nexport type RouteModuleVerificationOptions = {\n adapter?: Adapter;\n};\n\nconst httpMethods = [\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"OPTIONS\",\n \"HEAD\",\n] as const satisfies readonly HttpMethod[];\n\nexport function validateRouteModules(\n modules: Readonly<Record<string, RouteModule>>,\n options: RouteModuleVerificationOptions = {},\n) {\n if (options.adapter) {\n warnUnsupportedRequestBoundaries(options.adapter);\n }\n\n for (const [file, routeModule] of Object.entries(modules)) {\n validateModulePolicy(file, routeModule);\n\n for (const method of httpMethods) {\n const capability = routeModule[method];\n\n if (!capability || capability.kind === \"page\") {\n continue;\n }\n\n validateResponseCapability(file, method, capability, routeModule);\n }\n }\n\n // Verification has to build a manifest to resolve the policy cascade.\n // Returning it lets a caller that needs the same manifest reuse this one\n // instead of building a second identical copy.\n const manifest = createRouteManifest(\n Object.fromEntries(\n Object.entries(modules).map(([file, routeModule]) => [\n file,\n async () => routeModule,\n ]),\n ),\n );\n\n validatePagePolicies(manifest, modules, options.adapter);\n\n return manifest;\n}\n\n// Every route inherits a bounded body limit, so a request without\n// `Content-Length` cannot read past it. An adapter with no\n// `requestTimeoutEnforcement` guarantee still lets a slow request hold a\n// connection open below that limit. The shared pipeline does not own every\n// timeout. This names the gap once per handler construction rather than\n// refusing to build. The gap is inherent to the adapter, not a mistake in an\n// application's declared policy.\nfunction warnUnsupportedRequestBoundaries(adapter: Adapter) {\n const check = checkAdapterCapabilities(adapter, [\"requestTimeoutEnforcement\"]);\n\n if (check.ok) {\n return;\n }\n\n console.warn(\n `Demiurge adapter \"${adapter.name}\" does not report requestTimeoutEnforcement. Every route inherits a bounded request body limit. This adapter gives the shared pipeline no guarantee against a slow request. A slow request can hold a connection open below that limit. Bound connection duration at the host or platform.`,\n );\n}\n\nfunction validateModulePolicy(file: string, routeModule: RouteModule) {\n const rateLimit = routeModule.policy?.security?.rateLimit;\n\n if (rateLimit) {\n validateWithContext(file, \"policy\", \"rate limit\", () => {\n validateRateLimitPolicy(rateLimit);\n });\n }\n}\n\nfunction validateResponseCapability(\n file: string,\n method: HttpMethod,\n capability: ResponseCapability,\n routeModule: RouteModule,\n) {\n if (capability.cors) {\n validateWithContext(file, method, \"CORS\", () => {\n validateCorsPolicy(capability.cors!);\n validateCorsMethods(file, method, capability.cors!.methods, routeModule);\n });\n }\n\n if (capability.security?.rateLimit) {\n validateWithContext(file, method, \"rate limit\", () => {\n validateRateLimitPolicy(capability.security!.rateLimit!);\n });\n }\n}\n\nfunction validateCorsMethods(\n file: string,\n exportName: HttpMethod,\n methods: readonly HttpMethod[] | undefined,\n routeModule: RouteModule,\n) {\n if (!methods) {\n return;\n }\n\n for (const method of methods) {\n // Demiurge answers preflight itself, so a route never exports an OPTIONS\n // capability to serve one. Listing OPTIONS is a habit carried in from\n // other CORS configuration, and it changes nothing at request time.\n if (method === \"OPTIONS\") {\n continue;\n }\n\n if (responseCapabilityForMethod(routeModule, method)) {\n continue;\n }\n\n throw new Error(\n `Route ${JSON.stringify(file)} export ${exportName} allows CORS method ${method}, but the route does not export that response capability.`,\n );\n }\n}\n\nfunction responseCapabilityForMethod(\n routeModule: RouteModule,\n method: HttpMethod,\n): ResponseCapability | undefined {\n const capability = method === \"HEAD\"\n ? routeModule.HEAD ?? routeModule.GET\n : routeModule[method];\n\n return isResponseCapability(capability) ? capability : undefined;\n}\n\nfunction isResponseCapability(\n capability: RouteCapability | undefined,\n): capability is ResponseCapability {\n return Boolean(capability && capability.kind !== \"page\");\n}\n\nfunction validatePagePolicies(\n manifest: RouteManifest,\n modules: Readonly<Record<string, RouteModule>>,\n adapter: Adapter | undefined,\n) {\n for (const route of manifest.routes) {\n const routeModule = modules[route.file];\n const page = routeModule?.GET;\n\n if (!page || page.kind !== \"page\") {\n continue;\n }\n\n const effectivePolicy = mergeRoutePolicies(\n ...manifest.policies\n .filter((policy) =>\n isAttachedFileForRoute(policy.fileSegments, route.fileSegments)\n )\n .map((policy) => modules[policy.file]?.policy),\n routeModule.policy,\n );\n\n validateEffectiveDocument(route.file, \"GET\", effectivePolicy, adapter);\n validateRenderModePolicy(\n route.file,\n page.render.mode,\n effectivePolicy.document,\n );\n validateStaticRouteScripts(\n route.file,\n \"GET\",\n effectivePolicy,\n [\n ...manifest.layouts\n .filter((layout) =>\n isAttachedFileForRoute(layout.fileSegments, route.fileSegments)\n )\n .map((layout) => modules[layout.file]?.scripts),\n routeModule.scripts,\n ],\n );\n }\n\n const fallbacks = [\n ...manifest.fallbacks.error,\n ...manifest.fallbacks.loading,\n ...manifest.fallbacks.notFound,\n ];\n\n for (const fallback of fallbacks) {\n const effectivePolicy = mergeRoutePolicies(\n ...manifest.policies\n .filter((policy) =>\n isAttachedFileForRoute(policy.fileSegments, fallback.fileSegments)\n )\n .map((policy) => modules[policy.file]?.policy),\n modules[fallback.file]?.policy,\n );\n\n validateEffectiveDocument(\n fallback.file,\n \"policy\",\n effectivePolicy,\n adapter,\n );\n }\n}\n\nfunction validateStaticRouteScripts(\n file: string,\n exportName: HttpMethod,\n effectivePolicy: ReturnType<typeof mergeRoutePolicies>,\n contributions: readonly (RouteModule[\"scripts\"] | undefined)[],\n) {\n const scripts = contributions.flatMap((contribution) =>\n Array.isArray(contribution) ? contribution : []\n );\n\n if (scripts.length === 0 || !effectivePolicy.document) {\n return;\n }\n\n const nonce = \"startup-verification-nonce\";\n const audit = createSecurityAudit({\n document: {\n headers: { nonce },\n policy: effectivePolicy.document,\n scripts: scripts.map((script) => ({\n ...script,\n nonce: securityPolicyRequiresNonce(effectivePolicy.document)\n ? nonce\n : script.nonce,\n })),\n },\n });\n const blocked = audit.findings.find((finding) =>\n finding.code === \"csp-script-src-blocked\"\n );\n\n if (!blocked) {\n validateScriptCspNeeds(\n file,\n exportName,\n resolveCsp(effectivePolicy.document.csp),\n scripts,\n );\n return;\n }\n\n const script = scripts.find((candidate) =>\n blocked.message.includes(candidate.src)\n );\n const csp = createSecurityHeaders(effectivePolicy.document, { nonce })\n .get(\"content-security-policy\") ?? \"\";\n const scriptDirective = csp.split(\"; \").find((directive) =>\n directive.startsWith(\"script-src \")\n ) ?? \"default-src (script-src fallback)\";\n\n throw new Error(\n `Route ${JSON.stringify(file)} export ${exportName} declares script ${JSON.stringify(script?.src)} that violates the effective ${scriptDirective} policy.`,\n );\n}\n\n// A vendor script also talks to its own backend. The script tag declares the\n// directives that traffic needs. A route that contributes the script without\n// widening the matching directive fails here, rather than failing silently in\n// a browser the application does not own.\nconst scriptNeedDirectives = [\n { directive: \"connectSrc\", name: \"connect-src\", need: \"connect\" },\n { directive: \"imgSrc\", name: \"img-src\", need: \"img\" },\n] as const;\n\nfunction validateScriptCspNeeds(\n file: string,\n exportName: HttpMethod,\n csp: ContentSecurityPolicy | false | undefined,\n scripts: readonly ScriptTag[],\n) {\n if (!csp) {\n return;\n }\n\n for (const scriptTag of scripts) {\n for (const { directive, name, need } of scriptNeedDirectives) {\n const required = scriptTag.needs?.[need] ?? [];\n\n if (required.length === 0) {\n continue;\n }\n\n const allowed = resolveCspDirectiveValue(csp[directive]) ??\n resolveCspDirectiveValue(csp.defaultSrc);\n\n // No directive and no default-src means the policy places no limit on\n // this resource type, so there is nothing left to satisfy.\n if (allowed === undefined) {\n continue;\n }\n\n for (const source of required) {\n if (Array.isArray(allowed) && cspSourceListAllows(allowed, source)) {\n continue;\n }\n\n throw new Error(\n `Route ${JSON.stringify(file)} export ${exportName} declares script ${JSON.stringify(scriptTag.src)} that needs ${name} ${source}, which the effective policy does not allow. Add ${source} to security.needs.${need} or to csp.${directive} for this route.`,\n );\n }\n }\n }\n}\n\nfunction cspSourceListAllows(sources: readonly string[], required: string) {\n if (sources.includes(\"'none'\")) {\n return false;\n }\n\n if (sources.includes(\"*\") || sources.includes(required)) {\n return true;\n }\n\n if (required.startsWith(\"'\")) {\n return false;\n }\n\n return sources.some((source) => cspSourceMatchesOrigin(source, required));\n}\n\nfunction cspSourceMatchesOrigin(source: string, required: string) {\n if (source.startsWith(\"'\")) {\n return false;\n }\n\n let requiredUrl: URL;\n\n try {\n requiredUrl = new URL(required);\n } catch {\n return false;\n }\n\n if (source === `${requiredUrl.protocol}`) {\n return true;\n }\n\n let sourceUrl: URL;\n\n try {\n sourceUrl = new URL(source);\n } catch {\n return false;\n }\n\n if (\n sourceUrl.protocol !== requiredUrl.protocol ||\n sourceUrl.port !== requiredUrl.port\n ) {\n return false;\n }\n\n if (sourceUrl.hostname.startsWith(\"*.\")) {\n const suffix = sourceUrl.hostname.slice(1);\n\n return requiredUrl.hostname.endsWith(suffix) &&\n requiredUrl.hostname !== sourceUrl.hostname.slice(2);\n }\n\n return sourceUrl.hostname === requiredUrl.hostname;\n}\n\nfunction validateEffectiveDocument(\n file: string,\n exportName: HttpMethod | \"policy\",\n effectivePolicy: ReturnType<typeof mergeRoutePolicies>,\n adapter: Adapter | undefined,\n) {\n validateWithContext(file, exportName, \"effective document\", () => {\n createSecurityHeaders(effectivePolicy.document ?? {}, {\n nonce: \"startup-verification-nonce\",\n });\n });\n\n if (!adapter || !securityPolicyRequiresNonce(effectivePolicy.document)) {\n return;\n }\n\n validateWithContext(file, exportName, \"effective CSP\", () => {\n assertAdapterCapabilities(adapter, [\"nonceInjection\"]);\n });\n}\n\nfunction validateRenderModePolicy(\n file: string,\n mode: PageRenderMode,\n policy: ReturnType<typeof mergeRoutePolicies>[\"document\"],\n) {\n if (mode === \"static\") {\n const nonceDirective = findNonceDirective(resolveCsp(policy?.csp));\n\n if (nonceDirective) {\n throw new Error(\n `Route ${JSON.stringify(file)} uses render mode \"static\" with an effective ${nonceDirective} directive that depends on a CSP nonce. Use security.static() for static output or remove the nonce source from the document policy.`,\n );\n }\n\n return;\n }\n\n if (mode !== \"streaming\") {\n return;\n }\n\n const scriptPolicy = findEffectiveScriptPolicy(resolveCsp(policy?.csp));\n\n if (!scriptPolicy || allowsStreamingInlineScripts(scriptPolicy.sources)) {\n return;\n }\n\n throw new Error(\n `Route ${JSON.stringify(file)} uses render mode \"streaming\" with an effective ${scriptPolicy.name} directive that does not allow React runtime inline payload scripts. Add a nonce placeholder or allow 'unsafe-inline' without nonce or hash sources.`,\n );\n}\n\nfunction findNonceDirective(policy: ContentSecurityPolicy | false | undefined) {\n if (!policy) {\n return undefined;\n }\n\n for (const [name, value] of Object.entries(policy)) {\n // TYPE-EVIDENCE: the policy entries carry CSP directive values. The cast labels the entry value with the directive value type.\n const sources = resolveCspDirectiveValue(value as CspDirectiveValue);\n\n if (\n Array.isArray(sources) &&\n sources.some((source) => isNonceSource(source))\n ) {\n return toCspDirectiveName(name);\n }\n }\n\n return undefined;\n}\n\nfunction findEffectiveScriptPolicy(policy: ContentSecurityPolicy | false | undefined) {\n if (!policy) {\n return undefined;\n }\n\n const scriptSources = resolveCspDirectiveValue(policy.scriptSrc);\n\n if (Array.isArray(scriptSources)) {\n return { name: \"script-src\", sources: scriptSources };\n }\n\n const defaultSources = resolveCspDirectiveValue(policy.defaultSrc);\n\n if (Array.isArray(defaultSources)) {\n return { name: \"default-src\", sources: defaultSources };\n }\n\n return undefined;\n}\n\nfunction allowsStreamingInlineScripts(sources: readonly string[]) {\n if (sources.some((source) => isNoncePlaceholder(source))) {\n return true;\n }\n\n return sources.includes(\"'unsafe-inline'\") &&\n !sources.some((source) => isNonceOrHashSource(source));\n}\n\nfunction isNonceSource(source: string) {\n return isNoncePlaceholder(source) || /^'nonce-[^']*'$/i.test(source);\n}\n\nfunction isNoncePlaceholder(source: string) {\n return source.includes(\"{nonce}\");\n}\n\nfunction isNonceOrHashSource(source: string) {\n return /^'(?:nonce-|sha256-|sha384-|sha512-)/i.test(source);\n}\n\nfunction resolveCspDirectiveValue(value: CspDirectiveValue | undefined) {\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n \"replace\" in value\n ) {\n return value.replace;\n }\n\n return value;\n}\n\nfunction toCspDirectiveName(name: string) {\n return name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\nfunction validateWithContext(\n file: string,\n exportName: HttpMethod | \"policy\",\n policyName: string,\n validate: () => void,\n) {\n try {\n validate();\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.startsWith(`Route ${JSON.stringify(file)} export `)\n ) {\n throw error;\n }\n\n const message = error instanceof Error\n ? error.message\n : `${policyName} validation failed.`;\n\n throw new Error(\n `Route ${JSON.stringify(file)} export ${exportName} has an invalid ${policyName} policy. ${message}`,\n { cause: error },\n );\n }\n}\n","import { createElement, type ComponentType, type ReactNode } from \"react\";\nimport { renderToString } from \"react-dom/server\";\nimport { createNavigationDocument, renderDocument } from \"../document\";\nimport { createScriptRenderContext, withScriptContext } from \"../document/scripts\";\nimport {\n findPoliciesForPath,\n createNavigationDataResponse,\n isNavigationDataRequest,\n loadNotFoundMatch,\n NAVIGATION_NOT_FOUND_RESPONSE,\n type LoadedNotFoundMatch,\n type RouteManifest,\n} from \"../router\";\nimport type { NotFoundProps } from \"../route\";\nimport { createSecurityHeaders, mergeRoutePolicies } from \"../security\";\nimport {\n createCspNonce,\n securityPolicyRequiresNonce,\n} from \"../security/policy\";\nimport { BuiltInNotFound } from \"./fallbacks\";\nimport type { FailureSite } from \"./failure-site\";\nimport { prefersHtmlDocument } from \"./negotiate\";\nimport { createProblemResponse } from \"./problem\";\nimport type { SsrRenderOptions } from \"./ssr\";\n\nexport type NotFoundRenderOptions = SsrRenderOptions & {\n onError?: (error: unknown, site: FailureSite) => void;\n pathname?: string;\n // Dev passes Vite's `transformIndexHtml` here so a framework-rendered\n // fallback document gets the same client entry and HMR wiring a page does.\n transformDocument?: (html: string) => string | Promise<string>;\n};\n\nexport function createNotFoundProblemResponse(url: URL) {\n return createProblemResponse({\n instance: `${url.pathname}${url.search}`,\n status: 404,\n title: \"Not Found\",\n });\n}\n\n// The only place a 404 is produced. Both the unmatched-path case and the\n// `notFound()` response capability route through here so an app cannot end up\n// with two different 404 shapes.\nexport async function renderNotFoundResponse(\n manifest: RouteManifest,\n request: Request,\n options: NotFoundRenderOptions = {},\n) {\n const url = new URL(request.url);\n const pathname = options.pathname ?? url.pathname;\n\n if (!isNavigationDataRequest(request) && !prefersHtmlDocument(request)) {\n return createNotFoundProblemResponse(url);\n }\n\n const match = await loadNotFoundMatch(manifest, pathname, {\n locale: options.locale,\n onLayoutError: (error) => options.onError?.(error, \"page\"),\n });\n const documentPolicy = await loadDocumentPolicy(manifest, pathname);\n const nonce = options.nonce ?? (\n securityPolicyRequiresNonce(documentPolicy) ? createCspNonce() : undefined\n );\n const headers = createSecurityHeaders(documentPolicy ?? {}, {\n nonce,\n request,\n });\n\n if (isNavigationDataRequest(request)) {\n return createNavigationDataResponse(undefined, {\n document: createNavigationDocument({\n dir: options.dir,\n lang: options.lang,\n metadata: match.metadata,\n title: options.title,\n }),\n locale: options.locale,\n headers,\n kind: NAVIGATION_NOT_FOUND_RESPONSE,\n status: 404,\n });\n }\n\n const html = renderNotFoundDocument(match, { ...options, nonce });\n headers.set(\"content-type\", \"text/html; charset=utf-8\");\n\n return new Response(\n (await options.transformDocument?.(html)) ?? html,\n {\n headers,\n status: 404,\n },\n );\n}\n\nasync function loadDocumentPolicy(\n manifest: RouteManifest,\n pathname: string,\n) {\n const modules = await Promise.all(\n findPoliciesForPath(manifest, pathname).map((policy) => policy.load()),\n );\n\n return mergeRoutePolicies(...modules.map((module) => module.policy)).document;\n}\n\nexport function renderNotFoundDocument(\n match: LoadedNotFoundMatch,\n options: NotFoundRenderOptions = {},\n) {\n const NotFound = match.notFound ?? BuiltInNotFound;\n\n // Three attempts remove one application layer at a time. A layout for an\n // unmatched path can cause an error. The layout-free document prevents this\n // error from changing a 404 response to a 500 response.\n try {\n return renderAttempt(match, NotFound, match.layouts, options);\n } catch (error) {\n options.onError?.(error, \"page\");\n }\n\n try {\n return renderAttempt(match, NotFound, [], options);\n } catch (error) {\n options.onError?.(error, \"page\");\n }\n\n return renderAttempt(match, BuiltInNotFound, [], options);\n}\n\nfunction renderAttempt(\n match: LoadedNotFoundMatch,\n NotFound: ComponentType<NotFoundProps>,\n layouts: LoadedNotFoundMatch[\"layouts\"],\n options: NotFoundRenderOptions,\n) {\n const content = layouts.reduceRight<ReactNode>(\n (children, Layout) =>\n createElement(Layout, {\n children,\n locale: match.locale,\n path: {},\n pathname: match.pathname,\n }),\n createElement(NotFound, { locale: match.locale, pathname: match.pathname }),\n );\n const scripts = createScriptRenderContext({\n dev: options.dev,\n nonce: options.nonce,\n });\n\n return renderDocument({\n body: {\n data: undefined,\n fallback: \"not-found\",\n html: renderToString(withScriptContext(scripts, content)),\n locale: options.locale,\n navigation: options.navigation,\n },\n entrySrc: options.clientEntry,\n lang: options.lang,\n metadata: match.metadata,\n nonce: options.nonce,\n scripts: scripts.scripts(),\n styles: options.styles,\n title: options.title,\n });\n}\n","import {\n applyLocalizedMetadata,\n createNavigationDocument,\n} from \"../document\";\nimport { isPlainObject } from \"../type-guards\";\nimport {\n createNavigationDataResponse,\n createRouteManifest,\n findRouteMatch,\n isNavigationDataRequest,\n isAttachedFileForRoute,\n loadPageRoute,\n MalformedPathnameError,\n markNavigationResponse,\n NAVIGATION_DATA_HEADER,\n NAVIGATION_ERROR_RESPONSE,\n NAVIGATION_NOT_FOUND_RESPONSE,\n type LoadedRouteMatch,\n type RouteManifest,\n type RouteRecord,\n} from \"../router\";\nimport {\n createCache,\n createMemoryCache,\n serializeCacheNamespace,\n type Cache,\n type CacheDuration,\n type CacheKey,\n type CacheNamespace,\n type CacheStore,\n} from \"../data\";\nimport {\n toResponse,\n type HttpMethod,\n type HttpRouteContext,\n type ResponseCapability,\n type RouteCapability,\n type RouteImporter,\n type RouteMiddleware,\n type RouteModule,\n} from \"../route\";\nimport { applyServerTimingHeader } from \"../route/response\";\nimport {\n renderPageResponse,\n type SsrOptions,\n type SsrRenderOptions,\n} from \"./ssr\";\nimport { renderFailureResponse } from \"./errors\";\nimport type { FailureSite } from \"./failure-site\";\nimport { renderNotFoundResponse } from \"./not-found\";\nimport { createProblemResponse } from \"./problem\";\nimport {\n applyCorsHeaders,\n applyFetchMetadataVary,\n attachExceptionSource,\n authorizeRoute,\n createCorsPreflightResponse,\n createMemoryRateLimitStore,\n createSecurityHeaders,\n enforceCsrfProtection,\n enforceFetchMetadataPolicy,\n enforceRateLimit,\n enforceRequestSecurity,\n mergeRoutePolicies,\n resolveRouteAccess,\n type RateLimitStore,\n validateRouteModules,\n} from \"../security\";\nimport type { Adapter } from \"../adapter\";\nimport {\n limitRequestBody,\n RequestBodyTooLargeError,\n requestBodyTooLargeResponse,\n} from \"../security/request\";\nimport {\n createCspNonce,\n securityPolicyRequiresNonce,\n} from \"../security/policy\";\nimport { MUTATION_REVALIDATION_HEADER } from \"../route/mutation\";\nimport { defineLocales, localeDirection, localizeHref, resolveLocale, type LocaleConfiguration } from \"../routing\";\n\nexport type RequestErrorReporter = (\n error: unknown,\n context: { pathname: string; site: FailureSite },\n) => void;\n\nexport type RequestHandlerOptions = {\n adapter?: Adapter;\n cacheStore?: RequestCacheStoreOptions;\n onError?: RequestErrorReporter;\n renderPage?: PageRenderer;\n rateLimitStore?: RateLimitStore;\n routes: Record<string, RouteImporter>;\n locales?: LocaleConfiguration;\n routeModules?: Readonly<Record<string, RouteModule>>;\n ssr?: SsrOptions;\n};\n\nexport type RequestCacheStoreOptions = {\n namespace: CacheNamespace;\n onBackgroundError?: (error: unknown) => void;\n refreshLeaseTtl?: CacheDuration;\n store: CacheStore;\n waitUntil?: (promise: Promise<void>) => void;\n};\n\n// Public `RequestHandlerOptions` deliberately excludes `dev` and\n// `transformDocument`. The Vite plugin sets development mode when it calls\n// `handleRequestWithManifest` directly. An application cannot enable this mode\n// in production and expose a stack trace.\ntype RequestRuntimeOptions = {\n cacheStore?: RequestCacheStoreOptions;\n dev?: boolean;\n onError?: RequestErrorReporter;\n renderPage?: PageRenderer;\n locales?: LocaleConfiguration;\n routePathname?: string;\n rateLimitStore?: RateLimitStore;\n ssr?: SsrOptions;\n transformDocument?: (html: string) => string | Promise<string>;\n};\n\nexport type RequestHandler = (request: Request) => Promise<Response>;\n\nexport type PageRenderer = (\n match: LoadedRouteMatch,\n options: SsrRenderOptions,\n) => Response | Promise<Response>;\n\nconst supportedMethods = [\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"OPTIONS\",\n \"HEAD\",\n] satisfies HttpMethod[];\n\nconst defaultRateLimitStore = createMemoryRateLimitStore();\n\nexport function createRequestHandler(options: RequestHandlerOptions) {\n if (options.routeModules) {\n validateRouteModules(options.routeModules, { adapter: options.adapter });\n }\n\n const manifest = createRouteManifest(options.routes);\n const locales = options.locales ? defineLocales(options.locales) : undefined;\n const rateLimitStore = options.rateLimitStore ?? createMemoryRateLimitStore();\n\n if (options.cacheStore) {\n serializeCacheNamespace(options.cacheStore.namespace);\n }\n\n return async function handleRequest(request: Request) {\n let ssr = options.ssr;\n if (locales) {\n const resolution = resolveLocale(request, locales);\n if (resolution.unsupported) {\n return await renderNotFoundResponse(manifest, request, {\n ...options.ssr,\n dir: localeDirection(resolution.locale, locales),\n lang: resolution.locale,\n locale: resolution.locale,\n pathname: resolution.pathname,\n });\n }\n if (resolution.redirect) {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return createProblemResponse({ status: 400, title: \"The locale URL is not canonical.\" });\n }\n const preference = resolution.source === \"cookie\" || resolution.source === \"accept-language\";\n if (preference && !(await isPagePath(manifest, resolution.pathname))) {\n return await handleRequestWithManifest(manifest, request, {\n cacheStore: options.cacheStore,\n onError: options.onError,\n rateLimitStore,\n renderPage: options.renderPage,\n routePathname: resolution.pathname,\n ssr: {\n ...options.ssr,\n dir: localeDirection(locales.defaultLocale, locales),\n lang: locales.defaultLocale,\n locale: locales.defaultLocale,\n },\n });\n }\n const headers = new Headers({ location: resolution.redirect.href });\n if (preference) {\n headers.set(\"cache-control\", \"private, no-store\");\n headers.set(\"vary\", [locales.cookie ? \"Cookie\" : undefined, \"Accept-Language\"].filter(Boolean).join(\", \"));\n }\n return new Response(null, { headers, status: preference ? 307 : 308 });\n }\n ssr = {\n ...options.ssr,\n dir: localeDirection(resolution.locale, locales),\n lang: resolution.locale,\n locale: resolution.locale,\n };\n const response = await handleRequestWithManifest(manifest, request, {\n cacheStore: options.cacheStore,\n locales,\n onError: options.onError,\n rateLimitStore,\n renderPage: options.renderPage,\n routePathname: resolution.pathname,\n ssr,\n });\n localizeResponseLocation(response, request, resolution.locale, locales);\n return response;\n }\n return await handleRequestWithManifest(manifest, request, {\n cacheStore: options.cacheStore,\n onError: options.onError,\n rateLimitStore,\n renderPage: options.renderPage,\n ssr,\n });\n };\n}\n\nasync function isPagePath(manifest: RouteManifest, pathname: string) {\n const match = findRouteMatch(manifest.routes, pathname);\n if (!match) return true;\n const module = await match.route.load();\n return module.GET?.kind === \"page\";\n}\n\nfunction localizeResponseLocation(\n response: Response,\n request: Request,\n locale: string,\n configuration: LocaleConfiguration,\n) {\n const location = response.headers.get(\"location\");\n if (!location) return;\n const requestUrl = new URL(request.url);\n const destination = new URL(location, requestUrl);\n if (destination.origin !== requestUrl.origin) return;\n response.headers.set(\n \"location\",\n localizeHref(location, locale, configuration, requestUrl.href),\n );\n}\n\nexport async function handleRequestWithManifest(\n manifest: RouteManifest,\n request: Request,\n options: RequestRuntimeOptions = {\n rateLimitStore: defaultRateLimitStore,\n },\n) {\n const url = new URL(request.url);\n const routePathname = options.routePathname ?? url.pathname;\n const fallbackOptions = createFallbackOptions(url, options);\n const navigationDataRequest = isNavigationDataRequest(request);\n let routeMatch: ReturnType<typeof findRouteMatch>;\n\n try {\n routeMatch = findRouteMatch(manifest.routes, routePathname);\n } catch (error) {\n if (!(error instanceof MalformedPathnameError)) {\n throw error;\n }\n\n const response = createProblemResponse({\n instance: `${url.pathname}${url.search}`,\n status: 400,\n title: \"Bad Request\",\n });\n return navigationDataRequest\n ? markNavigationResponse(response, NAVIGATION_ERROR_RESPONSE)\n : response;\n }\n\n if (!routeMatch) {\n try {\n const response = await renderNotFoundResponse(\n manifest,\n request,\n fallbackOptions,\n );\n\n return navigationDataRequest\n ? markNavigationResponse(response, NAVIGATION_NOT_FOUND_RESPONSE)\n : response;\n } catch (error) {\n fallbackOptions.onError(error, \"page\");\n\n return new Response(\"Not Found\", {\n headers: { \"content-type\": \"text/plain; charset=utf-8\" },\n status: 404,\n });\n }\n }\n\n try {\n const response = await handleMatchedRoute(\n manifest,\n request,\n url,\n routeMatch,\n routePathname,\n options,\n fallbackOptions,\n );\n\n if (\n navigationDataRequest &&\n !response.headers.has(NAVIGATION_DATA_HEADER)\n ) {\n return markNavigationResponse(\n response,\n response.status === 404\n ? NAVIGATION_NOT_FOUND_RESPONSE\n : NAVIGATION_ERROR_RESPONSE,\n );\n }\n\n return response;\n } catch (error) {\n // Anything escaping here failed before a route body ran: loading the route\n // module, resolving its capability or inherited policy, or a middleware\n // throwing. That is the one failure site with no committed response shape,\n // so it negotiates on `accept` the way an unmatched path does.\n const response = await renderFailureResponse(\n manifest,\n request,\n error,\n \"middleware\",\n fallbackOptions,\n );\n\n return navigationDataRequest\n ? markNavigationResponse(response, NAVIGATION_ERROR_RESPONSE)\n : response;\n }\n}\n\nasync function handleMatchedRoute(\n manifest: RouteManifest,\n request: Request,\n url: URL,\n routeMatch: NonNullable<ReturnType<typeof findRouteMatch>>,\n routePathname: string,\n options: RequestRuntimeOptions,\n fallbackOptions: ReturnType<typeof createFallbackOptions>,\n) {\n const routeModule = await routeMatch.route.load();\n\n if (request.method.toUpperCase() === \"OPTIONS\") {\n const preflightResponse = createCorsPreflightResponse(routeModule, request);\n\n if (preflightResponse) {\n return preflightResponse;\n }\n }\n\n const method = normalizeMethod(request.method);\n\n if (!method) {\n return methodNotAllowed(routeModule);\n }\n\n const capability = getMethodCapability(routeModule, method);\n\n if (!capability) {\n return methodNotAllowed(routeModule);\n }\n\n const policy = await loadInheritedRoutePolicy(\n manifest,\n routeMatch.route,\n routeModule,\n capability,\n );\n const routeSecurity = policy.security;\n\n // Every response for this route must declare the Fetch Metadata fields that\n // the decision read, including the responses that the route body produces.\n // Otherwise a shared cache can give one client the response of another one.\n const fetchMetadata = enforceFetchMetadataPolicy(\n routeSecurity?.fetchMetadata,\n request,\n method,\n );\n const withFetchMetadataVary = (response: Response) =>\n applyFetchMetadataVary(response, fetchMetadata.vary);\n\n if (fetchMetadata.response) {\n return withFetchMetadataVary(\n applyCorsHeaders(\n fetchMetadata.response,\n getCapabilityCors(capability),\n request,\n ),\n );\n }\n\n const csrfResponse = await enforceCsrfProtection(routeSecurity?.csrf, request);\n\n if (csrfResponse) {\n return withFetchMetadataVary(\n applyCorsHeaders(csrfResponse, getCapabilityCors(capability), request),\n );\n }\n\n const rateLimitResponse = await enforceRateLimit(\n routeSecurity?.rateLimit,\n request,\n options.rateLimitStore ?? defaultRateLimitStore,\n );\n\n if (rateLimitResponse) {\n return withFetchMetadataVary(\n applyCorsHeaders(\n rateLimitResponse,\n getCapabilityCors(capability),\n request,\n ),\n );\n }\n\n const requestSecurityResponse = enforceRequestSecurity(\n routeSecurity?.request,\n request,\n method,\n );\n\n if (requestSecurityResponse) {\n return withFetchMetadataVary(\n applyCorsHeaders(\n requestSecurityResponse,\n getCapabilityCors(capability),\n request,\n ),\n );\n }\n\n request = limitRequestBody(routeSecurity?.request, request);\n const requestContext: Record<string, unknown> = {};\n const cache = createRequestCache(options.cacheStore, options.ssr?.locale);\n\n if (capability.kind === \"page\") {\n const context = {\n locale: options.ssr?.locale,\n path: routeMatch.path,\n pathname: routePathname,\n request,\n context: requestContext,\n search: url.searchParams,\n url,\n } satisfies HttpRouteContext;\n const middlewares = await loadInheritedRouteMiddleware(\n manifest,\n routeMatch.route,\n );\n const nonce = securityPolicyRequiresNonce(policy.document)\n ? createCspNonce()\n : undefined;\n let response: Response;\n\n try {\n response = await runRouteMiddleware(middlewares, context, async () => {\n // A page render has already committed to a document, so a failure here\n // renders the error document rather than negotiating. Returning the\n // response instead of throwing keeps the failure site distinguishable\n // from a middleware failure further out.\n try {\n // Authorization runs before the data loader, before a read of a\n // protected cache entry, and before the render. A document request\n // and a navigation data request share this path, so one person gets\n // one answer through each entry point.\n const denial = await authorizeRoute(policy.access, context);\n\n if (denial) {\n return denial;\n }\n\n const match = await loadPageRoute(\n manifest,\n routePathname,\n request,\n undefined,\n cache,\n { locale: options.ssr?.locale, requestContext },\n );\n\n if (match.status !== \"ready\") {\n return await renderNotFoundResponse(manifest, request, {\n ...fallbackOptions,\n nonce,\n });\n }\n\n if (options.locales && options.ssr?.locale) {\n match.match.metadata = createLocalizedPageMetadata(\n match.match.metadata,\n request,\n routePathname,\n options.ssr.locale,\n options.locales,\n );\n }\n\n if (isNavigationDataRequest(request)) {\n return createNavigationDataResponse(match.match.data, {\n document: createNavigationDocument({\n dir: options.ssr?.dir,\n lang: options.ssr?.lang,\n links: match.match.links,\n metadata: match.match.metadata,\n scripts: match.match.scripts,\n title: options.ssr?.title,\n }),\n locale: options.ssr?.locale,\n });\n }\n\n if (match.match.render.mode === \"streaming\" && !options.renderPage) {\n throw new Error(\n \"Streaming page routes require an adapter renderer. Pass renderNodePageResponse from @demiurgejs/core/node as createRequestHandler({ renderPage }).\",\n );\n }\n\n const renderPage = options.renderPage ?? renderPageResponse;\n\n return await renderPage(match.match, {\n ...options.ssr,\n dev: options.dev,\n nonce,\n onStreamError: (error) => {\n options.onError?.(error, {\n pathname: url.pathname,\n site: \"page\",\n });\n },\n signal: request.signal,\n });\n } catch (error) {\n if (error instanceof RequestBodyTooLargeError) {\n return requestBodyTooLargeResponse();\n }\n\n return await renderFailureResponse(manifest, request, error, \"page\", {\n ...fallbackOptions,\n nonce,\n });\n }\n });\n } catch (error) {\n if (!(error instanceof RequestBodyTooLargeError)) {\n throw error;\n }\n\n response = requestBodyTooLargeResponse();\n }\n const headers = createSecurityHeaders(policy.document ?? {}, {\n nonce,\n request,\n });\n\n for (const [name, value] of headers) {\n response.headers.set(name, value);\n }\n\n // A CSP nonce must be unpredictable for every transmitted response. A\n // browser or shared HTTP cache replaying this document would also replay\n // its nonce, so nonce-backed documents are never reusable HTTP cache\n // representations. This intentionally overrides app-provided public cache\n // directives. Cache data or a nonce-free render artifact below this layer\n // instead.\n if (nonce) {\n response.headers.set(\"cache-control\", \"private, no-store\");\n }\n\n withFetchMetadataVary(response);\n\n if (method === \"HEAD\") {\n await response.body?.cancel();\n\n return new Response(null, {\n headers: response.headers,\n status: response.status,\n });\n }\n\n return response;\n }\n\n const context = {\n locale: options.ssr?.locale,\n path: routeMatch.path,\n pathname: routePathname,\n request,\n context: requestContext,\n search: url.searchParams,\n url,\n } satisfies HttpRouteContext;\n const middlewares = await loadInheritedRouteMiddleware(\n manifest,\n routeMatch.route,\n );\n let response: Response;\n\n try {\n response = await runRouteMiddleware(middlewares, context, async () => {\n // An API route never gets HTML, whatever the caller asked for.\n try {\n // Authorization runs before the capability, so a mutation denies\n // before its effect.\n const denial = await authorizeRoute(policy.access, context);\n\n if (denial) {\n return denial;\n }\n\n if (capability.kind === \"not-found\" && capability.body === undefined) {\n return applyCapabilityInit(\n await renderNotFoundResponse(manifest, request, fallbackOptions),\n capability.init,\n );\n }\n\n return await toResponse(capability, context);\n } catch (error) {\n if (error instanceof RequestBodyTooLargeError) {\n return requestBodyTooLargeResponse();\n }\n\n return await renderFailureResponse(\n manifest,\n request,\n error,\n \"route\",\n fallbackOptions,\n );\n }\n });\n } catch (error) {\n if (!(error instanceof RequestBodyTooLargeError)) {\n throw error;\n }\n\n response = requestBodyTooLargeResponse();\n }\n\n // Finalization is part of the route failure site. Therefore, an invalid\n // `timing` or `cors` value on an API route gives a problem+json response. It\n // cannot enter the negotiated path and produce HTML.\n try {\n await revalidateMutation(response, cache, \"mutation\" in capability && capability.mutation === true);\n return withFetchMetadataVary(\n finalizeRouteResponse(response, capability, request, method),\n );\n } catch (error) {\n return withFetchMetadataVary(\n await renderFailureResponse(\n manifest,\n request,\n error,\n \"route\",\n fallbackOptions,\n ),\n );\n }\n}\n\nfunction createLocalizedPageMetadata(\n metadata: LoadedRouteMatch[\"metadata\"],\n request: Request,\n pathname: string,\n locale: string,\n locales: LocaleConfiguration,\n) {\n const base = request.url;\n const localizedUrl = (targetLocale: string) =>\n new URL(localizeHref(pathname, targetLocale, locales, base), base).href;\n const alternates = locales.supportedLocales.map((targetLocale) => ({\n href: localizedUrl(targetLocale),\n hrefLang: targetLocale,\n }));\n\n if (locales.xDefault) {\n alternates.push({\n href: localizedUrl(locales.xDefault),\n hrefLang: \"x-default\",\n });\n }\n\n return applyLocalizedMetadata(metadata, {\n alternates,\n canonical: localizedUrl(locale),\n });\n}\n\nasync function revalidateMutation(\n response: Response,\n cache: Cache,\n mutation: boolean,\n) {\n const value = response.headers.get(MUTATION_REVALIDATION_HEADER);\n response.headers.delete(MUTATION_REVALIDATION_HEADER);\n if (!value) return;\n if (!mutation || response.status < 200 || response.status >= 400) return;\n const invalidation = parseMutationInvalidation(value);\n for (const key of invalidation.keys) await cache.invalidateKey(key);\n if (invalidation.tags.length > 0) {\n await cache.invalidateTags(\n invalidation.tags.map((id) => ({ id })),\n );\n }\n}\n\nfunction parseMutationInvalidation(value: string) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(decodeURIComponent(value));\n } catch {\n throw invalidMutationInvalidation();\n }\n if (!isPlainObject(parsed) || parsed.version !== 1) {\n throw invalidMutationInvalidation();\n }\n const names = Object.keys(parsed).sort();\n if (names.join(\",\") !== \"keys,tags,version\") {\n throw invalidMutationInvalidation();\n }\n if (\n !Array.isArray(parsed.keys) ||\n !parsed.keys.every(isCacheKey) ||\n !Array.isArray(parsed.tags) ||\n !parsed.tags.every((tag) => typeof tag === \"string\")\n ) {\n throw invalidMutationInvalidation();\n }\n return { keys: parsed.keys, tags: parsed.tags };\n}\n\nfunction isCacheKey(value: unknown): value is CacheKey {\n return Array.isArray(value) && value.every(isCacheKeyPart);\n}\n\nfunction isCacheKeyPart(value: unknown): boolean {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return true;\n }\n if (typeof value === \"number\") return Number.isFinite(value);\n if (Array.isArray(value)) return value.every(isCacheKeyPart);\n return isPlainObject(value) && Object.values(value).every(isCacheKeyPart);\n}\n\nfunction invalidMutationInvalidation() {\n return new Error(\"Demiurge received invalid internal mutation invalidation metadata.\");\n}\n\nfunction createRequestCache(\n options: RequestCacheStoreOptions | undefined,\n locale?: string,\n) {\n const cache = options\n ? createCache(options)\n : createMemoryCache();\n\n if (!locale) return cache;\n\n const localeTag = (id: string) => ({ id: `demiurge:locale:${locale}:${id}` });\n const localeKey = (key: CacheKey): CacheKey => [\n { \"demiurge:locale\": locale },\n ...key,\n ];\n\n return {\n get: (request) => cache.get(\n request.locale === \"neutral\"\n ? request\n : {\n ...request,\n key: localeKey(request.key),\n tags: request.tags?.map((tag) => localeTag(tag.id)),\n },\n ),\n invalidateKey: (key) => cache.invalidateKey(localeKey(key)),\n invalidateTags: (tags) => cache.invalidateTags(\n tags.map((tag) => localeTag(tag.id)),\n ),\n } satisfies Cache;\n}\n\nfunction createFallbackOptions(url: URL, options: RequestRuntimeOptions) {\n return {\n ...options.ssr,\n dev: options.dev,\n pathname: options.routePathname ?? url.pathname,\n onError: (error: unknown, site: FailureSite) => {\n options.onError?.(error, { pathname: url.pathname, site });\n },\n transformDocument: options.transformDocument,\n };\n}\n\n// `notFound()` without a body uses the negotiated path. Thus, an application\n// cannot publish two different 404 formats. An explicit capability status or\n// header still has priority.\nfunction applyCapabilityInit(response: Response, init: ResponseInit | undefined) {\n if (!init) {\n return response;\n }\n\n const headers = new Headers(response.headers);\n const capabilityHeaders = new Headers(init.headers);\n\n for (const [name, value] of capabilityHeaders) {\n if (name === \"set-cookie\") {\n continue;\n }\n\n headers.set(name, value);\n }\n\n // `set-cookie` is the one header that legitimately repeats, and iterating a\n // `Headers` collapses it into a single comma-joined value. Appending each\n // cookie back is the same guarantee `writeWebResponse` already makes.\n for (const cookie of capabilityHeaders.getSetCookie()) {\n headers.append(\"set-cookie\", cookie);\n }\n\n return new Response(response.body, {\n headers,\n status: init.status ?? response.status,\n statusText: init.statusText ?? response.statusText,\n });\n}\n\n// The route argument is narrower than `RouteRecord` because the route audit\n// resolves the policy of a path that matches no route file.\nexport async function loadInheritedRoutePolicy(\n manifest: RouteManifest,\n route: Pick<RouteRecord, \"fileSegments\">,\n routeModule: RouteModule,\n capability: RouteCapability | undefined,\n) {\n const policyFiles = manifest.policies.filter((policy) =>\n isAttachedFileForRoute(policy.fileSegments, route.fileSegments),\n );\n const policyModules = await Promise.all(\n policyFiles.map((policy) => policy.load()),\n );\n\n // ADR 0018: the audit reports the declaring file of each exception. The\n // merge keeps no file name, so the framework stamps the file before it\n // merges the cascade.\n const merged = mergeRoutePolicies(\n ...policyModules.map((module, index) =>\n attachExceptionSource(module.policy, policyFiles[index]?.file)\n ),\n routeModule.policy,\n {\n security: !capability || capability.kind === \"page\"\n ? undefined\n : capability.security,\n },\n );\n\n // The merged access carries no file name. Resolving it a second time with\n // the policy files gives the audit the source of each hook and exception.\n return {\n ...merged,\n access: resolveRouteAccess([\n ...policyModules.map((module, index) => ({\n policy: module.policy?.access,\n source: policyFiles[index]?.file,\n })),\n { policy: routeModule.policy?.access },\n ]),\n };\n}\n\nasync function loadInheritedRouteMiddleware(\n manifest: RouteManifest,\n route: RouteRecord,\n) {\n const middlewareModules = await Promise.all(\n manifest.middlewares\n .filter((middleware) =>\n isAttachedFileForRoute(middleware.fileSegments, route.fileSegments),\n )\n .map((middleware) => middleware.load()),\n );\n\n return middlewareModules.flatMap((module) =>\n module.middleware ? [module.middleware] : [],\n );\n}\n\nasync function runRouteMiddleware(\n middlewares: RouteMiddleware[],\n context: HttpRouteContext,\n handler: () => Promise<Response>,\n) {\n let index = -1;\n\n async function dispatch(nextIndex: number): Promise<Response> {\n if (nextIndex <= index) {\n throw new Error(\"Demiurge route middleware next() called multiple times.\");\n }\n\n index = nextIndex;\n\n const middleware = middlewares[nextIndex];\n\n if (!middleware) {\n return await handler();\n }\n\n return await middleware(context, () => dispatch(nextIndex + 1));\n }\n\n return await dispatch(0);\n}\n\nfunction finalizeRouteResponse(\n response: Response,\n capability: ResponseCapability,\n request: Request,\n method: HttpMethod,\n) {\n const corsResponse = applyServerTimingHeader(\n applyCorsHeaders(response, capability.cors, request),\n capability.timing,\n );\n\n if (method === \"HEAD\") {\n return new Response(null, {\n headers: corsResponse.headers,\n status: corsResponse.status,\n statusText: corsResponse.statusText,\n });\n }\n\n return corsResponse;\n}\n\nfunction getCapabilityCors(capability: RouteCapability) {\n return capability.kind === \"page\" ? undefined : capability.cors;\n}\n\nfunction normalizeMethod(method: string): HttpMethod | null {\n const upperMethod = method.toUpperCase();\n // TYPE-EVIDENCE: the includes check confirms the upper method is a member of the supported methods tuple. The second cast reuses that narrowing.\n return supportedMethods.includes(upperMethod as HttpMethod)\n ? (upperMethod as HttpMethod)\n : null;\n}\n\nfunction getMethodCapability(\n routeModule: RouteModule,\n method: HttpMethod,\n): RouteCapability | ResponseCapability | undefined {\n if (method === \"HEAD\") {\n return routeModule.HEAD ?? routeModule.GET;\n }\n\n return routeModule[method];\n}\n\nfunction methodNotAllowed(routeModule: RouteModule) {\n return new Response(null, {\n headers: {\n allow: allowedMethods(routeModule).join(\", \"),\n },\n status: 405,\n });\n}\n\nfunction allowedMethods(routeModule: RouteModule) {\n const methods = supportedMethods.filter((method) => routeModule[method]);\n\n if (routeModule.GET && !methods.includes(\"HEAD\")) {\n methods.push(\"HEAD\");\n }\n\n return methods;\n}\n"],"names":["applyLocalizedMetadata","metadata","options","canonical","normalizeMetadataUrl","applicationAlternates","tag","byLanguage","byUrl","alternate","language","url","languageUrl","urlLanguage","nonAlternate","hrefLang","href","link","value","base","defineMetadata","meta","structuredData","resolveMetadata","metadataEntries","state","applyMetadata","title","resolveTitle","description","openGraph","resolveOpenGraph","applyTitle","sharedScopes","memoryNamespace","defaultMemoryCacheMaximumEntries","defaultRefreshLeaseTtl","query","definition","args","CacheNotFoundError","message","cacheNotFound","isCacheNotFoundError","error","id","defineTags","tags","createCache","now","refreshLeaseTtl","parseRefreshLeaseTtl","namespace","serializeCacheNamespace","requestEntries","sharedPending","request","scope","rawKey","serializeCacheKey","getRequestValue","key","serializeStoreKey","serializeStoreTag","serializeCacheTag","existing","isStaleEntryUsable","refreshStore","requireRefreshStore","token","refresh","refreshStaleEntry","currentPending","result","storeExpirationTime","storeStaleTime","negativeStoreEntry","pending","deletedRequest","deletedPending","deletedShared","storeKey","rawTags","deleteMatchingRequestTags","storeTags","createMemoryCache","createMemoryCacheStore","entries","refreshLeases","maximumEntries","sweepExpiredCacheEntries","evictOldestCacheEntries","nextExpiration","findNextCacheExpiration","expiresAt","currentTime","serializedTags","deleted","entry","lease","setMemoryCacheEntry","oldestKey","targetSize","app","validateNamespacePart","environment","schemaVersion","createInvalidation","cache","keys","parseCacheDuration","duration","match","unit","stableSerialize","ttl","notFoundTtl","staleWhileRevalidate","milliseconds","store","name","containsControlCharacter","character","code","entryTag","ancestors","ownKeys","expectedKeys","_","index","descriptor","serialized","part","prototype","objectValue","RouteSerializationError","route","field","assertSerializableValue","path","seen","kind","unserializableValue","reason","createRouteManifest","routes","manifest","file","load","routePath","basename","toRouteSegments","scoreRoute","validateRoutePatterns","compareRouteSpecificity","a","b","shapes","catchallIndex","segment","shape","canonicalRouteSegment","routeWitnessPath","segments","left","right","length","difference","routeSegmentSpecificity","loadPageRoute","pathname","initialData","documentContributions","routeMatch","findRouteMatch","loadNotFoundMatch","matchingLayouts","layout","isAttachedFileForRoute","pageModule","findClosestAttachedFile","layoutModules","context","data","toRoutePattern","loadErrorFallbackForRoute","resolveLinks","module","resolveRouteMetadata","resolveScripts","collectStaticRoutePaths","paths","routeModule","pattern","getDynamicSegmentNames","routePaths","normalizedPath","normalizeStaticPath","fillStaticPathname","loadLoadingFallback","loadFallbackComponent","loadErrorFallback","MalformedPathnameError","loadErrorFallbackComponent","fallback","loadErrorFallbackForPath","findClosestFallbackForPath","fallbackModule","notFound","metadataContext","layoutRoutes","findLayoutsForPath","pathnameSegments","splitPathname","isRouteGroupSegment","isFallbackForPath","findPoliciesForPath","policy","fallbacks","fallbackSegments","matchSegments","loadRoute","findPageMatch","routeSegments","routeSegment","pathnameSegment","isLayoutForPage","layoutSegments","pageSegments","attachedFileSegments","routeFileSegments","fileSegments","toRoutePatternSegment","isStaticPathValue","score","cause","NAVIGATION_DATA_HEADER","NAVIGATION_DATA_REQUEST","NAVIGATION_DATA_RESPONSE","NAVIGATION_ERROR_RESPONSE","NAVIGATION_NOT_FOUND_RESPONSE","isNavigationDataRequest","createNavigationDataResponse","headers","markNavigationResponse","response","isPlainObject","isObjectLike","target","embedded","splitHref","fillPath","search","serializeSearch","hash","hashIndex","beforeHash","searchIndex","createSearchParams","params","rawValue","values","_match","catchall","defineLocales","configuration","validateLocales","locale","canonicalLocale","normalizeTarget","supported","labels","domains","domain","normalizeDomain","alias","direction","label","localeDirection","configured","localeInformation","rtlScripts","resolveLocale","rest","pathLocale","localeForLabel","unsupported","domainLocale","localeForDomain","cookie","cookieLocale","languageLocale","source","localeUrl","defaultResolution","resolution","localizeHref","baseUrl","applicationPathname","parts","prefix","host","header","order","parameters","quality","parameter","q","candidate","separator","assertTarget","identifiers","addIdentifier","previous","normalized","hostname","json","init","normalizeServerTiming","withoutRouteOptions","jsonl","lines","text","html","redirect","to","isLinkTargetObject","body","stream","sse","events","serverTiming","metrics","toResponse","capability","resolveValue","withDefaultHeader","createJsonLinesStream","withDefaultHeaders","createGenericStream","createSseStream","defaults","nextHeaders","encoder","iterator","toAsyncIteratorSource","controller","next","formatServerSentEvent","encodeStreamChunk","chunk","reader","toAsyncIterator","event","formatSseData","formatSseField","stringifySseData","line","_cors","_security","_timing","responseInit","applyServerTimingHeader","timing","timingHeader","renderServerTimingHeader","existingTimingHeader","renderServerTimingMetric","metric","isServerTimingToken","formatServerTimingDuration","escapeServerTimingDescription","MUTATION_REQUEST_HEADER","MUTATION_REQUEST_VALUE","MUTATION_RESPONSE_MEDIA_TYPE","MutationValidationError","validation","issue","MUTATION_REVALIDATION_HEADER","mutation","input","mutationValidationResponse","mutationContext","run","authoritative","resolveMutationResult","validateMutationCapability","isMutationProtocolRequest","mutationProtocolResponse","isSuccessfulMutationResponse","revalidation","resolveRevalidation","addRevalidationHeader","withoutRevalidationHeader","serializeMutationResult","revalidateRoute","location","assertJsonValue","unsupportedMutationValue","revalidate","invalidation","mutationInput","parse","schema","map","form","normalizeStandardSchemaPath","HTTP_ERROR_STATUSES","statusTitles","statusSet","HttpError","status","details","assertHttpErrorStatus","detail","type","extensions","httpError","isHttpError","BuiltInNotFound","jsx","BuiltInError","DevError","stack","describeError","jsxs","HTML_MEDIA_TYPES","prefersHtmlDocument","acceptsHtmlDocument","parseAcceptHeader","range","normalizedType","parseQuality","PROBLEM_CONTENT_TYPE","createProblemDetails","instance","createProblemResponse","problem","PLAIN_TEXT_ERROR","isDevErrorRendering","dev","renderFailureResponse","site","createErrorProblemResponse","described","createNavigationDocument","errorStatus","renderErrorDocumentResponse","renderErrorDocument","renderError","createPlainTextErrorResponse","Error","resolveErrorComponent","scripts","createScriptRenderContext","renderToString","withScriptContext","createElement","renderDocument","defaultDenyStatus","defineAuthorization","hook","resolveRouteAccess","sources","chain","exceptions","declared","denyStatus","mergeRouteAccess","policies","authorizeRoute","access","createAuthorizationDenial","decision","permitsRequest","denialStatus","isDenialStatus","denialBody","isSecurityException","resolveCsp","csp","getCspException","resolveCsrf","csrf","getCsrfException","resolveMaxBodySize","maxBodySize","getBodySizeException","attachExceptionSource","document","withDocumentSource","security","withSecuritySource","exception","bodySize","nonceToken","cspNonce","strictCsp","staticCsp","strictHeaders","apiHeaders","mergeSecurityPolicy","defineSecurityPolicy","defineRoutePolicy","mergeSecurityPolicies","merged","mergeRoutePolicies","mergeRouteSecurityPolicies","applyPolicyNeeds","mergeRouteNeeds","mergeObject","routeNeedDirectives","override","need","needs","directive","applyPolicyNeed","current","resolveCspDirectiveValue","cspHash","algorithm","digest","toWebCryptoAlgorithm","toBase64","createSecurityHeaders","declaredCsp","validateCspDirectiveValues","validateReportingConfiguration","renderCsp","trustedTypes","renderTrustedTypes","reportsTrustedTypes","setHeader","joinCspDirectives","renderCspReportingDirectives","applySecurityHeaders","securityPolicyRequiresNonce","cspDirectiveEntries","resolved","createCspNonce","bytes","mergeCsp","mergeSecurityHeaders","resolvedBase","normalizeCsp","normalizedBase","normalizedOverride","baseValue","isCspDirectiveReplacement","setCspDirective","dedupeSources","renderReportingEndpoints","renderStrictTransportSecurity","directives","renderTrustedTypesDirective","names","FRAMEWORK_TRUSTED_TYPES_POLICY","present","directiveName","toCspDirectiveName","renderCspSources","reporting","reportUri","endpoints","escapeStructuredFieldString","validateReportingEndpointName","validateReportingEndpointUrl","reportUris","isAsciiHeaderValue","parsed","letter","binary","byte","createCorsHeaders","validateCorsPolicy","origin","appendVary","allowedOrigin","resolveAllowedOrigin","requestedHeaders","allowedHeaders","applyCorsHeaders","mergeHeaders","createCorsPreflightResponse","requestedMethod","method","normalizeCorsMethod","getMethodCapability","methods","allowedCorsMethods","validateCorsOrigin","invalidCorsOrigin","upperMethod","isHttpMethod","responseCapability","byteUnits","DEFAULT_MAX_BODY_SIZE","enforceRequestSecurity","methodResponse","enforceAllowedMethods","contentLength","declaredSize","parseContentLength","parseBodySize","RequestBodyTooLargeError","limitRequestBody","maximumBytes","bytesRead","limitedRequest","copyRequestConnectionMetadata","requestBodyTooLargeResponse","isAllowedMethod","allowedMethodsHeader","amount","size","allowedMethods","unsafeMethods","createSecurityAudit","findings","auditDocumentPolicy","auditMissingCsp","auditReportOnlyDelivery","auditRoutePolicy","auditDocumentScripts","auditScriptDependencies","normalizeScriptDependencyAuditOptions","describeExceptionSource","actor","hasLegacyTarget","resolveCspArray","hasReportingApiTarget","requirePurpose","script","dependency","getExternalScriptDependency","isGoogleTagManager","scriptSrc","getScriptSources","requiresScriptNonce","allowsScriptSource","src","isStrictDynamicActive","isSameOriginPath","sourceMatchesScriptSource","sourceUrl","scriptUrl","hostnameMatches","pathMatches","auditCorsPolicy","auditRouteAccess","auditUnsafeMethodPolicy","auditRequestBodyLimit","describeAccessSources","csrfException","declaredBytes","defaultBytes","cookieNamePattern","createCsrfToken","createCsrfCookie","attributes","issueCsrfToken","enforceCsrfProtection","cookieHeader","normalizeCsrfPolicy","cookieToken","parseCookieHeader","headerToken","constantTimeEqual","fieldToken","readFormToken","cookies","decodeCookieValue","contentType","diff","maxLength","destinationField","modeField","siteField","embeddedDestinations","safeNavigationMethods","defaultOptions","checkFetchMetadata","vary","isCorsPreflight","allowedDestinations","destination","enforceFetchMetadataPolicy","check","applyFetchMetadataVary","fields","EnvValidationError","issues","formatEnvValidationError","defineEnvSchema","validateEnv","variable","booleanEnv","createVariable","enumEnv","integerEnv","secretEnv","parseString","stringEnv","urlEnv","env","sensitive","extra","client","deferred","optional","environmentState","deferredEnvironmentState","runtime","initialized","getInitializedEnvironment","getDeferredEnvironment","serializeEnvSchema","deserializeEnvSchema","createVariableFromDescriptor","startEnvironment","isEnvSchema","readProcessEnvironment","readEnv","resolveDeferredValue","resetEnvironment","durationUnits","defaultMaximumEntries","createMemoryRateLimitStore","windowMs","sweepExpiredEntries","findNextExpiration","evictOldestEntry","enforceRateLimit","validateRateLimitPolicy","parseRateLimitWindow","rateLimitStoreKey","remaining","rateLimitKeyName","resolveRateLimitKey","clientIp","getRequestConnectionMetadata","httpMethods","validateRouteModules","modules","warnUnsupportedRequestBoundaries","validateModulePolicy","validateResponseCapability","validatePagePolicies","adapter","checkAdapterCapabilities","rateLimit","validateWithContext","validateCorsMethods","exportName","responseCapabilityForMethod","isResponseCapability","page","effectivePolicy","validateEffectiveDocument","validateRenderModePolicy","validateStaticRouteScripts","contributions","contribution","nonce","blocked","finding","validateScriptCspNeeds","scriptDirective","scriptNeedDirectives","scriptTag","required","allowed","cspSourceListAllows","cspSourceMatchesOrigin","requiredUrl","suffix","assertAdapterCapabilities","mode","nonceDirective","findNonceDirective","scriptPolicy","findEffectiveScriptPolicy","allowsStreamingInlineScripts","isNonceSource","scriptSources","defaultSources","isNoncePlaceholder","isNonceOrHashSource","policyName","validate","createNotFoundProblemResponse","renderNotFoundResponse","documentPolicy","loadDocumentPolicy","renderNotFoundDocument","NotFound","renderAttempt","layouts","content","children","Layout","supportedMethods","defaultRateLimitStore","createRequestHandler","locales","rateLimitStore","ssr","preference","isPagePath","handleRequestWithManifest","localizeResponseLocation","requestUrl","routePathname","fallbackOptions","createFallbackOptions","navigationDataRequest","handleMatchedRoute","preflightResponse","normalizeMethod","methodNotAllowed","loadInheritedRoutePolicy","routeSecurity","fetchMetadata","withFetchMetadataVary","getCapabilityCors","csrfResponse","rateLimitResponse","requestSecurityResponse","requestContext","createRequestCache","middlewares","loadInheritedRouteMiddleware","runRouteMiddleware","denial","createLocalizedPageMetadata","renderPageResponse","applyCapabilityInit","revalidateMutation","finalizeRouteResponse","localizedUrl","targetLocale","alternates","parseMutationInvalidation","invalidMutationInvalidation","isCacheKey","isCacheKeyPart","localeTag","localeKey","capabilityHeaders","policyFiles","policyModules","middleware","handler","dispatch","nextIndex","corsResponse"],"mappings":"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"}
|