@demiurgejs/core 0.2.0-beta.2 → 0.2.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/testing.js.map +1 -1
- package/dist/browser/file-router.d.ts.map +1 -1
- package/dist/chunks/{document-shell-D1xo6cEA.js → document-shell-WoM8yZlR.js} +2 -2
- package/dist/chunks/{document-shell-D1xo6cEA.js.map → document-shell-WoM8yZlR.js.map} +1 -1
- package/dist/chunks/{image-codec-BGTx_t5K.js → image-codec-Di53WpcH.js} +2 -2
- package/dist/chunks/{image-codec-BGTx_t5K.js.map → image-codec-Di53WpcH.js.map} +1 -1
- package/dist/chunks/{images-B9MqcjSA.js → images-Edar3eU1.js} +2 -2
- package/dist/chunks/{images-B9MqcjSA.js.map → images-Edar3eU1.js.map} +1 -1
- package/dist/chunks/{request-metadata-D5NrT8ks.js → request-metadata-DaIYq4Ea.js} +214 -179
- package/dist/chunks/request-metadata-DaIYq4Ea.js.map +1 -0
- package/dist/chunks/{streaming-BQ1bykDo.js → streaming-D0fGAuiO.js} +5 -5
- package/dist/chunks/streaming-D0fGAuiO.js.map +1 -0
- package/dist/chunks/{testing-B_iMFYz_.js → testing-CRflAw4X.js} +1228 -1074
- package/dist/chunks/testing-CRflAw4X.js.map +1 -0
- package/dist/data/cache.d.ts +8 -0
- package/dist/data/cache.d.ts.map +1 -1
- package/dist/data/idempotency.d.ts.map +1 -1
- package/dist/data/index.d.ts +3 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/testing.d.ts.map +1 -1
- package/dist/data/testing.js +94 -72
- package/dist/data/testing.js.map +1 -1
- package/dist/data/tiered.d.ts +7 -0
- package/dist/data/tiered.d.ts.map +1 -0
- package/dist/document/deferred-scripts.d.ts.map +1 -1
- package/dist/document/hydration.d.ts.map +1 -1
- package/dist/document/index.d.ts +1 -0
- package/dist/document/index.d.ts.map +1 -1
- package/dist/document/trusted-types.d.ts +10 -0
- package/dist/document/trusted-types.d.ts.map +1 -0
- package/dist/edge/index.js +3 -3
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +768 -432
- package/dist/index.js.map +1 -1
- package/dist/internal/testing.js +9 -9
- package/dist/kv/index.d.ts +2 -0
- package/dist/kv/index.d.ts.map +1 -1
- package/dist/kv/index.js +71 -48
- package/dist/kv/index.js.map +1 -1
- package/dist/kv/rate-limit-store.d.ts +8 -0
- package/dist/kv/rate-limit-store.d.ts.map +1 -0
- package/dist/kv/store.d.ts.map +1 -1
- package/dist/node/http.d.ts.map +1 -1
- package/dist/node/image.d.ts.map +1 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +3 -3
- package/dist/node/index.js.map +1 -1
- package/dist/node/static.d.ts.map +1 -1
- package/dist/node/streaming.d.ts.map +1 -1
- package/dist/platform/images.d.ts.map +1 -1
- package/dist/platform/index.d.ts +5 -1
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/platform/observability.d.ts +2 -1
- package/dist/platform/observability.d.ts.map +1 -1
- package/dist/platform/web-vitals-client.d.ts +32 -0
- package/dist/platform/web-vitals-client.d.ts.map +1 -0
- package/dist/platform/web-vitals.d.ts +78 -0
- package/dist/platform/web-vitals.d.ts.map +1 -0
- package/dist/redis/index.d.ts +2 -0
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js +84 -46
- package/dist/redis/index.js.map +1 -1
- package/dist/redis/rate-limit-store.d.ts +8 -0
- package/dist/redis/rate-limit-store.d.ts.map +1 -0
- package/dist/redis/store.d.ts.map +1 -1
- package/dist/route/action.d.ts.map +1 -1
- package/dist/route/middleware.d.ts.map +1 -1
- package/dist/route/response.d.ts.map +1 -1
- package/dist/router/index.d.ts +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/manifest.d.ts +1 -0
- package/dist/router/manifest.d.ts.map +1 -1
- package/dist/security/cookies.d.ts +26 -0
- package/dist/security/cookies.d.ts.map +1 -0
- package/dist/security/env.d.ts.map +1 -1
- package/dist/security/fetch-metadata.d.ts +29 -0
- package/dist/security/fetch-metadata.d.ts.map +1 -0
- package/dist/security/index.d.ts +5 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/policy.d.ts.map +1 -1
- package/dist/security/rate-limit.d.ts +6 -3
- package/dist/security/rate-limit.d.ts.map +1 -1
- package/dist/security/request.d.ts.map +1 -1
- package/dist/security/types.d.ts +72 -3
- package/dist/security/types.d.ts.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/request-handler.d.ts +6 -2
- package/dist/server/request-handler.d.ts.map +1 -1
- package/dist/static/index.d.ts.map +1 -1
- package/dist/static/index.js +4 -4
- package/dist/static/index.js.map +1 -1
- package/dist/vite/index.d.ts +3 -0
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +1030 -666
- package/dist/vite/index.js.map +1 -1
- package/dist/vite/plugin.d.ts +2 -0
- package/dist/vite/plugin.d.ts.map +1 -1
- package/dist/vite/policy-verification.d.ts.map +1 -1
- package/dist/vite/route-audit.d.ts +50 -0
- package/dist/vite/route-audit.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/chunks/request-metadata-D5NrT8ks.js.map +0 -1
- package/dist/chunks/streaming-BQ1bykDo.js.map +0 -1
- package/dist/chunks/testing-B_iMFYz_.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"testing-B_iMFYz_.js","sources":["../../src/data/cache.ts","../../src/document/metadata.ts","../../src/router/manifest.ts","../../src/router/navigation-data.ts","../../src/routing/types.ts","../../src/route/response.ts","../../src/route/http-error.ts","../../src/server/fallbacks.tsx","../../src/server/negotiate.ts","../../src/server/problem.ts","../../src/server/errors.ts","../../src/security/policy.ts","../../src/security/cors.ts","../../src/security/audit.ts","../../src/security/csrf.ts","../../src/security/rate-limit.ts","../../src/security/request.ts","../../src/security/verification.ts","../../src/server/not-found.ts","../../src/server/request-handler.ts"],"sourcesContent":["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 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 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 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 scope: definition.scope,\n staleWhileRevalidate: definition.staleWhileRevalidate,\n tags: definition.tags?.(...args),\n ttl: definition.ttl,\n });\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 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 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 return await currentPending.promise as TResult;\n }\n\n const state = { invalidated: false };\n const value = Promise.resolve().then(request.fn).then(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 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 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 entries.delete(key);\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 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 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 (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 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","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 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","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 RouteImporter,\n RouteProps,\n} from \"../route\";\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 metadata: ResolvedMetadata;\n path: PathVars;\n pathname: string;\n render: PageRenderOptions;\n scripts: ScriptTag[];\n};\n\nexport type StaticRoutePath = {\n file: string;\n path: PathVars;\n pattern: string;\n pathname: string;\n};\n\nexport type LoadedNotFoundMatch = {\n layouts: ComponentType<LayoutProps>[];\n metadata: ResolvedMetadata;\n notFound?: ComponentType<NotFoundProps>;\n pathname: string;\n};\n\nexport type PendingRouteMatch =\n | {\n error: unknown;\n Error?: ComponentType<RouteErrorProps>;\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 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 })),\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 })),\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 path: routeMatch.path,\n pathname,\n request,\n search: url.searchParams,\n url,\n };\n\n return {\n status: \"ready\",\n match: {\n data:\n pageModule.GET.data && !initialData?.hasData\n ? await pageModule.GET.data(context)\n : initialData?.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 metadata: documentContributions\n ? resolveMetadata(\n ...layoutModules.map((module) => module.metadata),\n pageModule.metadata,\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: { includeResources?: boolean } = {},\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 (\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({ cache });\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 } = {},\n): Promise<LoadedNotFoundMatch> {\n const fallback =\n options.fallback ??\n findClosestFallbackForPath(manifest.fallbacks.notFound, pathname);\n const fallbackModule = await fallback?.load();\n const notFound = fallbackModule?.default as\n | ComponentType<NotFoundProps>\n | undefined;\n const documentContributions = options.documentContributions ?? true;\n\n if (fallbackModule?.layout === false) {\n return {\n layouts: [],\n metadata: documentContributions\n ? resolveMetadata(fallbackModule.metadata)\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 return {\n layouts: layoutModules.map(\n (module) => module.default as ComponentType<LayoutProps>,\n ),\n metadata: documentContributions\n ? resolveMetadata(\n ...layoutModules.map((module) => module.metadata),\n fallbackModule?.metadata,\n )\n : resolveMetadata(),\n notFound,\n pathname,\n };\n } catch (error) {\n options.onLayoutError?.(error);\n\n return {\n layouts: [],\n metadata: documentContributions\n ? resolveMetadata(fallbackModule?.metadata)\n : resolveMetadata(),\n notFound,\n pathname,\n };\n }\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 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 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\nfunction 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 } 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(data: unknown) {\n return Response.json(\n { data, hasData: true } satisfies InitialRouteData,\n {\n headers: {\n \"cache-control\": \"no-store\",\n [NAVIGATION_DATA_HEADER]: NAVIGATION_DATA_RESPONSE,\n vary: NAVIGATION_DATA_HEADER,\n },\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","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\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","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 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 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","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 { renderDocument } from \"../document\";\nimport { createScriptRenderContext, withScriptContext } from \"../document/scripts\";\nimport { loadErrorFallback, type RouteManifest } 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 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 site === \"page\" || (site === \"middleware\" && prefersHtmlDocument(request));\n\n if (!wantsDocument) {\n return createErrorProblemResponse(url, error, options);\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 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, pathname, status: errorStatus(error) }),\n ),\n );\n\n return renderDocument({\n body: { data: undefined, html, 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 {\n ContentSecurityPolicy,\n CspHashAlgorithm,\n CspDirectiveValue,\n ReportingEndpointUrl,\n RoutePolicy,\n RouteSecurityNeeds,\n RouteSecurityPolicy,\n SecurityHeadersOptions,\n SecurityHeaderPolicy,\n SecurityPolicy,\n SecurityPreset,\n StrictTransportSecurityPolicy,\n TrustedTypesPolicy,\n} from \"./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) {\n const merged = policies.reduce<RoutePolicy>((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 return {\n ...merged,\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 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 if (!document?.csp || !needs) {\n return document;\n }\n\n let csp = document.csp;\n\n for (const { directive, need } of routeNeedDirectives) {\n csp = applyPolicyNeed(csp, directive, need, needs[need]);\n }\n\n return csp === document.csp ? 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 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 if (policy.csp) {\n validateCspDirectiveValues(policy.csp);\n }\n\n validateReportingConfiguration(policy);\n\n const headers = new Headers();\n const csp = policy.csp !== false && policy.csp\n ? renderCsp(policy.csp, options)\n : 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(policy.csp))\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 if (!policy || !policy.csp) {\n return false;\n }\n\n return cspDirectiveEntries(policy.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: ContentSecurityPolicy | false | undefined,\n override: ContentSecurityPolicy | false | undefined,\n) {\n if (override === false) {\n return false;\n }\n\n if (!override) {\n return base;\n }\n\n if (!base) {\n return normalizeCsp(override);\n }\n\n const normalizedBase = normalizeCsp(base);\n const normalizedOverride = normalizeCsp(override);\n const merged: ContentSecurityPolicy = {\n ...normalizedBase,\n ...normalizedOverride,\n };\n\n for (const [name, value] of cspDirectiveEntries(override)) {\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 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 if (policy.policies.length > 0) {\n directives.push(`trusted-types ${policy.policies.join(\" \")}`);\n }\n\n return joinCspDirectives(...directives);\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 if (resolved === true) {\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 = 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 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 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 type { ScriptTag } from \"../document/scripts\";\nimport { createSecurityHeaders } from \"./policy\";\nimport { validateCorsPolicy } from \"./cors\";\nimport type {\n ContentSecurityPolicy,\n CorsPolicy,\n CspSource,\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 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 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\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 = 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: SecurityPolicy[\"csp\"],\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 auditUnsafeMethodPolicy(route.method, route.security, findings);\n\n return {\n cors: route.cors,\n method: route.method,\n security: route.security,\n };\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 if (policy?.csrf === false) {\n findings.push({\n code: \"csrf-disabled\",\n message: \"CSRF protection is explicitly disabled for this unsafe route.\",\n severity: \"info\",\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 if (!policy?.request?.maxBodySize) {\n findings.push({\n code: \"request-body-limit-missing\",\n message: \"Unsafe routes should declare a request body size limit.\",\n severity: \"warning\",\n });\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 type { CsrfPolicy } 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 function enforceCsrfProtection(\n policy: CsrfPolicy | undefined,\n request: Request,\n) {\n if (!unsafeMethods.has(request.method.toUpperCase()) || policy === 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 (policy === undefined && !cookieHeader?.trim()) {\n return null;\n }\n\n const options = normalizeCsrfPolicy(policy ?? true);\n const cookies = parseCookieHeader(cookieHeader);\n const cookieToken = cookies.get(options.cookie);\n const headerToken = request.headers.get(options.header);\n\n if (!cookieToken || !headerToken || !constantTimeEqual(cookieToken, headerToken)) {\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: Exclude<CsrfPolicy, false>) {\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 header: policy.header ?? \"x-csrf-token\",\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 {\n MemoryRateLimitStoreOptions,\n RateLimitKey,\n RateLimitPolicy,\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\nexport function createMemoryRateLimitStore(\n options: MemoryRateLimitStoreOptions = {},\n): RateLimitStore {\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 return next;\n }\n\n existing.count += 1;\n return existing;\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 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 = 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 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 type { HttpMethod } from \"../route/types\";\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\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 if (policy?.maxBodySize === undefined) {\n return null;\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(policy.maxBodySize);\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 (policy?.maxBodySize === undefined || request.body === null) {\n return request;\n }\n\n const maximumBytes = parseBodySize(policy.maxBodySize);\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 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 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 {\n assertAdapterCapabilities,\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 { 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 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\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 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(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(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 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 { renderDocument } from \"../document\";\nimport { createScriptRenderContext, withScriptContext } from \"../document/scripts\";\nimport {\n findPoliciesForPath,\n loadNotFoundMatch,\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 // 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\n if (!prefersHtmlDocument(request)) {\n return createNotFoundProblemResponse(url);\n }\n\n const match = await loadNotFoundMatch(manifest, url.pathname, {\n onLayoutError: (error) => options.onError?.(error, \"page\"),\n });\n const documentPolicy = await loadDocumentPolicy(manifest, url.pathname);\n const nonce = options.nonce ?? (\n securityPolicyRequiresNonce(documentPolicy) ? createCspNonce() : undefined\n );\n const html = renderNotFoundDocument(match, { ...options, nonce });\n const headers = createSecurityHeaders(documentPolicy ?? {}, {\n nonce,\n request,\n });\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 path: {},\n pathname: match.pathname,\n }),\n createElement(NotFound, { 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 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 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 CacheDuration,\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 createCorsPreflightResponse,\n createMemoryRateLimitStore,\n createSecurityHeaders,\n enforceCsrfProtection,\n enforceRateLimit,\n enforceRequestSecurity,\n mergeRoutePolicies,\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\";\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 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 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 rateLimitStore = options.rateLimitStore ?? createMemoryRateLimitStore();\n\n if (options.cacheStore) {\n serializeCacheNamespace(options.cacheStore.namespace);\n }\n\n return async function handleRequest(request: Request) {\n return await handleRequestWithManifest(manifest, request, {\n cacheStore: options.cacheStore,\n onError: options.onError,\n rateLimitStore,\n renderPage: options.renderPage,\n ssr: options.ssr,\n });\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 fallbackOptions = createFallbackOptions(url, options);\n const navigationDataRequest = isNavigationDataRequest(request);\n let routeMatch: ReturnType<typeof findRouteMatch>;\n\n try {\n routeMatch = findRouteMatch(manifest.routes, url.pathname);\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 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 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 const csrfResponse = enforceCsrfProtection(routeSecurity?.csrf, request);\n\n if (csrfResponse) {\n return applyCorsHeaders(csrfResponse, getCapabilityCors(capability), request);\n }\n\n const rateLimitResponse = enforceRateLimit(\n routeSecurity?.rateLimit,\n request,\n options.rateLimitStore ?? defaultRateLimitStore,\n );\n\n if (rateLimitResponse) {\n return applyCorsHeaders(\n rateLimitResponse,\n getCapabilityCors(capability),\n request,\n );\n }\n\n const requestSecurityResponse = enforceRequestSecurity(\n routeSecurity?.request,\n request,\n method,\n );\n\n if (requestSecurityResponse) {\n return applyCorsHeaders(\n requestSecurityResponse,\n getCapabilityCors(capability),\n request,\n );\n }\n\n request = limitRequestBody(routeSecurity?.request, request);\n const requestContext: Record<string, unknown> = {};\n\n if (capability.kind === \"page\") {\n const context = {\n path: routeMatch.path,\n pathname: url.pathname,\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 const cache = createRequestCache(options.cacheStore);\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 const match = await loadPageRoute(\n manifest,\n url.pathname,\n request,\n undefined,\n cache,\n { requestContext },\n );\n\n if (match.status !== \"ready\") {\n return await renderNotFoundResponse(manifest, request, {\n ...fallbackOptions,\n nonce,\n });\n }\n\n if (isNavigationDataRequest(request)) {\n return createNavigationDataResponse(match.match.data);\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 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 path: routeMatch.path,\n pathname: url.pathname,\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 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 return finalizeRouteResponse(response, capability, request, method);\n } catch (error) {\n return await renderFailureResponse(\n manifest,\n request,\n error,\n \"route\",\n fallbackOptions,\n );\n }\n}\n\nfunction createRequestCache(options: RequestCacheStoreOptions | undefined) {\n return options\n ? createCache(options)\n : createMemoryCache();\n}\n\nfunction createFallbackOptions(url: URL, options: RequestRuntimeOptions) {\n return {\n ...options.ssr,\n dev: options.dev,\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\nasync function loadInheritedRoutePolicy(\n manifest: RouteManifest,\n route: RouteRecord,\n routeModule: RouteModule,\n capability: RouteCapability,\n) {\n const policyModules = await Promise.all(\n manifest.policies\n .filter((policy) =>\n isAttachedFileForRoute(policy.fileSegments, route.fileSegments),\n )\n .map((policy) => policy.load()),\n );\n\n return mergeRoutePolicies(\n ...policyModules.map((module) => module.policy),\n routeModule.policy,\n {\n security: capability.kind === \"page\" ? undefined : capability.security,\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 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":["sharedScopes","memoryNamespace","defaultMemoryCacheMaximumEntries","defaultRefreshLeaseTtl","query","definition","args","tag","id","defineTags","tags","createCache","options","now","refreshLeaseTtl","parseRefreshLeaseTtl","namespace","serializeCacheNamespace","requestEntries","sharedPending","request","scope","rawKey","serializeCacheKey","getRequestValue","key","serializeStoreKey","value","serializeStoreTag","serializeCacheTag","existing","isStaleEntryUsable","refreshStore","requireRefreshStore","token","refresh","refreshStaleEntry","currentPending","state","result","storeExpirationTime","storeStaleTime","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","error","ttl","staleWhileRevalidate","milliseconds","store","name","containsControlCharacter","character","code","entryTag","ancestors","ownKeys","expectedKeys","_","index","descriptor","serialized","part","prototype","objectValue","defineMetadata","metadata","meta","link","structuredData","resolveMetadata","metadataEntries","applyMetadata","title","resolveTitle","description","openGraph","resolveOpenGraph","applyTitle","createRouteManifest","routes","manifest","file","load","routePath","basename","toRouteSegments","scoreRoute","validateRoutePatterns","compareRouteSpecificity","a","b","shapes","route","catchallIndex","segment","shape","canonicalRouteSegment","routeWitnessPath","segments","left","right","length","difference","routeSegmentSpecificity","loadPageRoute","pathname","initialData","documentContributions","routeMatch","findRouteMatch","loadNotFoundMatch","matchingLayouts","layout","isAttachedFileForRoute","pageModule","findClosestAttachedFile","layoutModules","url","context","loadErrorFallbackForRoute","resolveLinks","module","resolveScripts","collectStaticRoutePaths","paths","routeModule","pattern","toRoutePattern","getDynamicSegmentNames","routePaths","path","normalizedPath","normalizeStaticPath","fillStaticPathname","loadLoadingFallback","loadFallbackComponent","loadErrorFallback","MalformedPathnameError","loadErrorFallbackComponent","fallback","loadErrorFallbackForPath","findClosestFallbackForPath","fallbackModule","notFound","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","data","markNavigationResponse","response","kind","href","target","embedded","splitHref","fillPath","search","serializeSearch","hash","hashIndex","beforeHash","searchIndex","createSearchParams","params","rawValue","values","_match","catchall","json","init","normalizeServerTiming","withoutRouteOptions","jsonl","lines","text","html","redirect","to","isLinkTargetObject","body","stream","sse","events","serverTiming","metrics","toResponse","capability","resolveValue","withDefaultHeader","createJsonLinesStream","withDefaultHeaders","headers","createGenericStream","createSseStream","defaults","nextHeaders","encoder","iterator","toAsyncIteratorSource","controller","next","formatServerSentEvent","encodeStreamChunk","chunk","source","reader","toAsyncIterator","event","formatSseData","formatSseField","stringifySseData","line","_cors","_security","_timing","responseInit","applyServerTimingHeader","timing","timingHeader","renderServerTimingHeader","existingTimingHeader","renderServerTimingMetric","metric","isServerTimingToken","parts","formatServerTimingDuration","escapeServerTimingDescription","HTTP_ERROR_STATUSES","statusTitles","statusSet","HttpError","status","details","assertHttpErrorStatus","normalized","detail","type","extensions","httpError","isHttpError","BuiltInNotFound","jsx","BuiltInError","DevError","message","stack","describeError","jsxs","HTML_MEDIA_TYPES","prefersHtmlDocument","acceptsHtmlDocument","header","parseAcceptHeader","range","parameters","normalizedType","parseQuality","parameter","quality","PROBLEM_CONTENT_TYPE","createProblemDetails","instance","createProblemResponse","problem","PLAIN_TEXT_ERROR","isDevErrorRendering","dev","renderFailureResponse","site","renderErrorDocumentResponse","createErrorProblemResponse","errorStatus","renderErrorDocument","renderError","createPlainTextErrorResponse","Error","resolveErrorComponent","scripts","createScriptRenderContext","renderToString","withScriptContext","createElement","renderDocument","nonceToken","cspNonce","strictCsp","staticCsp","strictHeaders","apiHeaders","security","mergeSecurityPolicy","defineSecurityPolicy","defineRoutePolicy","mergeSecurityPolicies","policies","merged","mergeRoutePolicies","mergeRouteSecurityPolicies","applyPolicyNeeds","mergeRouteNeeds","mergeObject","routeNeedDirectives","base","override","need","sources","document","needs","csp","directive","applyPolicyNeed","current","resolveCspDirectiveValue","cspHash","algorithm","digest","toWebCryptoAlgorithm","toBase64","createSecurityHeaders","validateCspDirectiveValues","validateReportingConfiguration","renderCsp","trustedTypes","renderTrustedTypes","reportsTrustedTypes","setHeader","joinCspDirectives","renderCspReportingDirectives","applySecurityHeaders","securityPolicyRequiresNonce","cspDirectiveEntries","resolved","createCspNonce","bytes","mergeCsp","mergeSecurityHeaders","normalizeCsp","normalizedBase","normalizedOverride","baseValue","isCspDirectiveReplacement","setCspDirective","dedupeSources","renderReportingEndpoints","renderStrictTransportSecurity","directives","present","directiveName","toCspDirectiveName","renderCspSources","reporting","reportUri","endpoints","escapeStructuredFieldString","validateReportingEndpointName","validateReportingEndpointUrl","reportUris","label","isAsciiHeaderValue","parsed","letter","binary","byte","createCorsHeaders","validateCorsPolicy","origin","appendVary","allowedOrigin","resolveAllowedOrigin","requestedHeaders","allowedHeaders","applyCorsHeaders","mergeHeaders","createCorsPreflightResponse","requestedMethod","method","normalizeCorsMethod","getMethodCapability","methods","allowedCorsMethods","validateCorsOrigin","invalidCorsOrigin","field","upperMethod","isHttpMethod","responseCapability","unsafeMethods","createSecurityAudit","findings","auditDocumentPolicy","auditReportOnlyDelivery","auditRoutePolicy","auditDocumentScripts","auditScriptDependencies","normalizeScriptDependencyAuditOptions","hasLegacyTarget","resolveCspArray","hasReportingApiTarget","requirePurpose","script","dependency","getExternalScriptDependency","isGoogleTagManager","scriptSrc","getScriptSources","requiresScriptNonce","allowsScriptSource","src","isStrictDynamicActive","isSameOriginPath","sourceMatchesScriptSource","sourceUrl","scriptUrl","hostnameMatches","pathMatches","auditCorsPolicy","auditUnsafeMethodPolicy","cookieNamePattern","createCsrfToken","createCsrfCookie","cookie","attributes","issueCsrfToken","enforceCsrfProtection","cookieHeader","normalizeCsrfPolicy","cookieToken","parseCookieHeader","headerToken","constantTimeEqual","cookies","separator","decodeCookieValue","diff","maxLength","durationUnits","defaultMaximumEntries","createMemoryRateLimitStore","windowMs","sweepExpiredEntries","findNextExpiration","evictOldestEntry","enforceRateLimit","validateRateLimitPolicy","parseRateLimitWindow","rateLimitStoreKey","remaining","amount","rateLimitKeyName","resolveRateLimitKey","clientIp","getRequestConnectionMetadata","byteUnits","enforceRequestSecurity","methodResponse","enforceAllowedMethods","contentLength","declaredSize","parseContentLength","maxBodySize","parseBodySize","RequestBodyTooLargeError","limitRequestBody","maximumBytes","bytesRead","reason","limitedRequest","copyRequestConnectionMetadata","requestBodyTooLargeResponse","isAllowedMethod","allowedMethodsHeader","size","allowedMethods","httpMethods","validateRouteModules","modules","validateModulePolicy","validateResponseCapability","validatePagePolicies","rateLimit","validateWithContext","validateCorsMethods","exportName","responseCapabilityForMethod","isResponseCapability","adapter","page","effectivePolicy","validateEffectiveDocument","validateRenderModePolicy","validateStaticRouteScripts","contributions","contribution","nonce","blocked","finding","validateScriptCspNeeds","candidate","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","rateLimitStore","handleRequestWithManifest","fallbackOptions","createFallbackOptions","navigationDataRequest","handleMatchedRoute","preflightResponse","normalizeMethod","methodNotAllowed","loadInheritedRoutePolicy","routeSecurity","csrfResponse","getCapabilityCors","rateLimitResponse","requestSecurityResponse","requestContext","middlewares","loadInheritedRouteMiddleware","createRequestCache","runRouteMiddleware","renderPageResponse","applyCapabilityInit","finalizeRouteResponse","capabilityHeaders","policyModules","middleware","handler","dispatch","nextIndex","corsResponse"],"mappings":"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"}
|