@demiurgejs/core 0.2.0-beta.1 → 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/README.md +2 -0
- package/dist/adapter/testing.d.ts +33 -0
- package/dist/adapter/testing.d.ts.map +1 -0
- package/dist/adapter/testing.js +251 -0
- package/dist/adapter/testing.js.map +1 -0
- package/dist/browser/file-router.d.ts.map +1 -1
- package/dist/chunks/document-shell-WoM8yZlR.js +35 -0
- package/dist/chunks/document-shell-WoM8yZlR.js.map +1 -0
- package/dist/chunks/image-codec-Di53WpcH.js +141 -0
- package/dist/chunks/image-codec-Di53WpcH.js.map +1 -0
- package/dist/chunks/images-Edar3eU1.js +339 -0
- package/dist/chunks/images-Edar3eU1.js.map +1 -0
- package/dist/chunks/request-metadata-DaIYq4Ea.js +677 -0
- package/dist/chunks/request-metadata-DaIYq4Ea.js.map +1 -0
- package/dist/chunks/streaming-D0fGAuiO.js +469 -0
- package/dist/chunks/streaming-D0fGAuiO.js.map +1 -0
- package/dist/chunks/{testing-DBjVCN5v.js → testing-CRflAw4X.js} +1300 -1139
- package/dist/chunks/testing-CRflAw4X.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +63 -54
- package/dist/cli.js.map +1 -1
- 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 +11 -0
- package/dist/document/deferred-scripts.d.ts.map +1 -0
- package/dist/document/hydration.d.ts.map +1 -1
- package/dist/document/index.d.ts +4 -1
- package/dist/document/index.d.ts.map +1 -1
- package/dist/document/render.d.ts.map +1 -1
- package/dist/document/scripts.d.ts +12 -1
- package/dist/document/scripts.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/assets.d.ts +14 -0
- package/dist/edge/assets.d.ts.map +1 -0
- package/dist/edge/index.d.ts +19 -0
- package/dist/edge/index.d.ts.map +1 -0
- package/dist/edge/index.js +286 -0
- package/dist/edge/index.js.map +1 -0
- package/dist/edge/stores.d.ts +8 -0
- package/dist/edge/stores.d.ts.map +1 -0
- package/dist/edge/streaming.d.ts +7 -0
- package/dist/edge/streaming.d.ts.map +1 -0
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +895 -556
- package/dist/index.js.map +1 -1
- package/dist/internal/testing.js +6 -6
- package/dist/kv/index.d.ts +5 -0
- package/dist/kv/index.d.ts.map +1 -0
- package/dist/kv/index.js +126 -0
- package/dist/kv/index.js.map +1 -0
- 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 +28 -0
- package/dist/kv/store.d.ts.map +1 -0
- package/dist/node/font.d.ts +5 -0
- package/dist/node/font.d.ts.map +1 -0
- package/dist/node/http.d.ts.map +1 -1
- package/dist/node/image.d.ts +15 -0
- package/dist/node/image.d.ts.map +1 -0
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +25 -23
- 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/analytics.d.ts +58 -5
- package/dist/platform/analytics.d.ts.map +1 -1
- package/dist/platform/font-assets.d.ts +19 -0
- package/dist/platform/font-assets.d.ts.map +1 -0
- package/dist/platform/fonts.d.ts +14 -4
- package/dist/platform/fonts.d.ts.map +1 -1
- package/dist/platform/image-codec.d.ts +15 -0
- package/dist/platform/image-codec.d.ts.map +1 -0
- package/dist/platform/image-url.d.ts +17 -0
- package/dist/platform/image-url.d.ts.map +1 -0
- package/dist/platform/image.d.ts +8 -0
- package/dist/platform/image.d.ts.map +1 -0
- package/dist/platform/images.d.ts +15 -0
- package/dist/platform/images.d.ts.map +1 -1
- package/dist/platform/index.d.ts +13 -6
- 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 +5 -0
- package/dist/redis/index.d.ts.map +1 -0
- package/dist/redis/index.js +209 -0
- package/dist/redis/index.js.map +1 -0
- 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 +8 -0
- package/dist/redis/store.d.ts.map +1 -0
- 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 +2 -27
- 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 +82 -6
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/verification.d.ts.map +1 -1
- package/dist/server/document-shell.d.ts +12 -0
- package/dist/server/document-shell.d.ts.map +1 -0
- 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/images.d.ts +13 -0
- package/dist/static/images.d.ts.map +1 -0
- package/dist/static/index.d.ts +8 -0
- package/dist/static/index.d.ts.map +1 -1
- package/dist/static/index.js +421 -313
- package/dist/static/index.js.map +1 -1
- package/dist/static/vercel.d.ts +3 -0
- package/dist/static/vercel.d.ts.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 +1041 -652
- package/dist/vite/index.js.map +1 -1
- package/dist/vite/plugin.d.ts +9 -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 +34 -3
- package/dist/chunks/request-metadata-DwEO1EAS.js +0 -477
- package/dist/chunks/request-metadata-DwEO1EAS.js.map +0 -1
- package/dist/chunks/streaming-Ci6vf3BB.js +0 -353
- package/dist/chunks/streaming-Ci6vf3BB.js.map +0 -1
- package/dist/chunks/testing-DBjVCN5v.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/data/idempotency.ts","../src/document/seo.ts","../src/route/action.ts","../src/route/page.ts","../src/route/middleware.ts","../src/route/webhook.ts","../src/security/env.ts","../src/security/report.ts","../src/security/upload.ts","../src/security/websocket.ts","../src/browser/file-router.tsx","../src/platform/images.ts","../src/platform/fonts.ts","../src/platform/analytics.ts","../src/platform/observability.ts"],"sourcesContent":["import {\n parseCacheDuration,\n serializeCacheKey,\n type CacheDuration,\n type CacheKey,\n} from \"./cache\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type IdempotencyRequest<TResult> = {\n fn: () => MaybePromise<TResult>;\n key: CacheKey;\n ttl?: CacheDuration;\n};\n\nexport type IdempotencyResult<TResult> = {\n key: string;\n replayed: boolean;\n value: TResult;\n};\n\nexport type IdempotencyStore = {\n run: <TResult>(\n request: IdempotencyRequest<TResult>,\n ) => Promise<IdempotencyResult<TResult>>;\n};\n\ntype IdempotencyEntry<TResult> = {\n expiresAt: number;\n pending: boolean;\n value: Promise<TResult>;\n};\n\nexport type MemoryIdempotencyStoreOptions = {\n defaultTtl?: CacheDuration;\n maximumEntries?: number;\n now?: () => number;\n};\n\nconst defaultIdempotencyTtl = \"24h\";\nconst defaultMaximumEntries = 10_000;\n\nexport function createMemoryIdempotencyStore(\n options: MemoryIdempotencyStoreOptions = {},\n): IdempotencyStore {\n const now = options.now ?? Date.now;\n const defaultTtl = options.defaultTtl ?? defaultIdempotencyTtl;\n const maximumEntries = options.maximumEntries ?? defaultMaximumEntries;\n\n if (!Number.isSafeInteger(maximumEntries) || maximumEntries <= 0) {\n throw new Error(\n \"Demiurge idempotency maximumEntries must be a positive integer.\",\n );\n }\n\n const defaultTtlMs = parseCacheDuration(defaultTtl);\n\n if (!Number.isFinite(defaultTtlMs)) {\n throw new Error(\"Demiurge idempotency defaultTtl must be finite.\");\n }\n\n const entries = new Map<string, IdempotencyEntry<unknown>>();\n\n return {\n async run<TResult>(request: IdempotencyRequest<TResult>) {\n const key = serializeCacheKey(request.key);\n const currentTime = now();\n sweepExpiredIdempotencyEntries(entries, currentTime);\n const existing = entries.get(key);\n\n if (existing && (existing.pending || existing.expiresAt > currentTime)) {\n return {\n key,\n replayed: true,\n value: await (existing.value as Promise<TResult>),\n };\n }\n\n if (entries.size >= maximumEntries) {\n evictOldestCompletedIdempotencyEntry(entries);\n }\n\n if (entries.size >= maximumEntries) {\n throw new Error(\n \"Demiurge idempotency store is at capacity with in-flight mutations.\",\n );\n }\n\n const value = Promise.resolve().then(request.fn);\n const entry: IdempotencyEntry<TResult> = {\n expiresAt: Number.POSITIVE_INFINITY,\n pending: true,\n value,\n };\n\n entries.set(key, entry);\n\n try {\n const result = await value;\n entry.pending = false;\n entry.expiresAt = now() + parseCacheDuration(request.ttl ?? defaultTtl);\n\n return {\n key,\n replayed: false,\n value: result,\n };\n } catch (error) {\n if (entries.get(key) === entry) {\n entries.delete(key);\n }\n\n throw error;\n }\n },\n };\n}\n\nfunction sweepExpiredIdempotencyEntries(\n entries: Map<string, IdempotencyEntry<unknown>>,\n now: number,\n) {\n for (const [key, entry] of entries) {\n if (!entry.pending && entry.expiresAt <= now) {\n entries.delete(key);\n }\n }\n}\n\nfunction evictOldestCompletedIdempotencyEntry(\n entries: Map<string, IdempotencyEntry<unknown>>,\n) {\n for (const [key, entry] of entries) {\n if (!entry.pending) {\n entries.delete(key);\n return;\n }\n }\n}\n\nexport function runIdempotentMutation<TResult>(\n store: IdempotencyStore,\n request: IdempotencyRequest<TResult>,\n) {\n return store.run(request);\n}\n","export type SitemapChangeFrequency =\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n\nexport type SitemapAlternate = {\n href: string;\n hrefLang: string;\n};\n\nexport type SitemapEntry = {\n alternates?: readonly SitemapAlternate[];\n changeFrequency?: SitemapChangeFrequency;\n lastModified?: Date | string;\n priority?: number;\n url: string;\n};\n\nexport type Sitemap = {\n entries: readonly SitemapEntry[];\n};\n\nexport type RobotsDirective = {\n allow?: string | readonly string[];\n disallow?: string | readonly string[];\n userAgent: string | readonly string[];\n};\n\nexport type Robots = {\n host?: string;\n rules?: readonly RobotsDirective[];\n sitemap?: string | readonly string[];\n};\n\nexport type OgImage = {\n background?: string;\n brand?: string;\n foreground?: string;\n height?: number;\n subtitle?: string;\n title: string;\n width?: number;\n};\n\nexport function defineSitemap(entries: readonly SitemapEntry[]): Sitemap {\n return {\n entries,\n };\n}\n\nexport function renderSitemap(sitemap: Sitemap) {\n const hasAlternates = sitemap.entries.some((entry) => entry.alternates?.length);\n\n return [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n `<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"${hasAlternates ? ' xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"' : \"\"}>`,\n ...sitemap.entries.map(renderSitemapEntry),\n \"</urlset>\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport function defineRobots(options: Robots): Robots {\n return options;\n}\n\nexport function defineOgImage(options: OgImage): OgImage {\n return options;\n}\n\nexport function renderRobots(robots: Robots) {\n const lines: string[] = [];\n\n for (const rule of robots.rules ?? []) {\n for (const userAgent of toArray(rule.userAgent)) {\n lines.push(`User-agent: ${userAgent}`);\n }\n\n for (const allow of toArray(rule.allow)) {\n lines.push(`Allow: ${allow}`);\n }\n\n for (const disallow of toArray(rule.disallow)) {\n lines.push(`Disallow: ${disallow}`);\n }\n\n lines.push(\"\");\n }\n\n if (robots.host) {\n lines.push(`Host: ${robots.host}`);\n }\n\n for (const sitemap of toArray(robots.sitemap)) {\n lines.push(`Sitemap: ${sitemap}`);\n }\n\n return `${lines.join(\"\\n\").replace(/\\n+$/, \"\")}\\n`;\n}\n\nexport function renderOgImageSvg(image: OgImage) {\n const width = image.width ?? 1200;\n const height = image.height ?? 630;\n const background = image.background ?? \"#101820\";\n const foreground = image.foreground ?? \"#ffffff\";\n const title = clampText(image.title, 120);\n const subtitle = image.subtitle ? clampText(image.subtitle, 160) : undefined;\n const brand = image.brand ? clampText(image.brand, 80) : undefined;\n\n validateOgImageDimensions(width, height);\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\" role=\"img\" aria-label=\"${escapeXmlAttribute(title)}\">`,\n ` <rect width=\"100%\" height=\"100%\" fill=\"${escapeXmlAttribute(background)}\" />`,\n brand\n ? ` <text x=\"72\" y=\"96\" fill=\"${escapeXmlAttribute(foreground)}\" font-family=\"Inter, ui-sans-serif, system-ui, sans-serif\" font-size=\"32\" font-weight=\"700\">${escapeXml(brand)}</text>`\n : null,\n ` <text x=\"72\" y=\"${subtitle ? 300 : 340}\" fill=\"${escapeXmlAttribute(foreground)}\" font-family=\"Inter, ui-sans-serif, system-ui, sans-serif\" font-size=\"76\" font-weight=\"800\">${escapeXml(title)}</text>`,\n subtitle\n ? ` <text x=\"72\" y=\"392\" fill=\"${escapeXmlAttribute(foreground)}\" fill-opacity=\"0.78\" font-family=\"Inter, ui-sans-serif, system-ui, sans-serif\" font-size=\"38\" font-weight=\"500\">${escapeXml(subtitle)}</text>`\n : null,\n \"</svg>\",\n ].filter((line): line is string => Boolean(line)).join(\"\\n\");\n}\n\nexport function renderOgImageResponse(image: OgImage) {\n return new Response(renderOgImageSvg(image), {\n headers: {\n \"cache-control\": \"public, max-age=31536000, immutable\",\n \"content-type\": \"image/svg+xml; charset=utf-8\",\n },\n });\n}\n\nfunction renderSitemapEntry(entry: SitemapEntry) {\n return [\n \" <url>\",\n ` <loc>${escapeXml(entry.url)}</loc>`,\n entry.lastModified\n ? ` <lastmod>${escapeXml(formatLastModified(entry.lastModified))}</lastmod>`\n : null,\n entry.changeFrequency\n ? ` <changefreq>${entry.changeFrequency}</changefreq>`\n : null,\n entry.priority !== undefined\n ? ` <priority>${formatPriority(entry.priority)}</priority>`\n : null,\n ...(entry.alternates ?? []).map(\n (alternate) =>\n ` <xhtml:link rel=\"alternate\" hreflang=\"${escapeXmlAttribute(alternate.hrefLang)}\" href=\"${escapeXmlAttribute(alternate.href)}\" />`,\n ),\n \" </url>\",\n ].filter((line): line is string => Boolean(line)).join(\"\\n\");\n}\n\nfunction formatLastModified(value: Date | string) {\n return value instanceof Date ? value.toISOString() : value;\n}\n\nfunction formatPriority(priority: number) {\n if (priority < 0 || priority > 1) {\n throw new Error(\"Sitemap entry priority must be between 0 and 1.\");\n }\n\n return String(priority);\n}\n\nfunction toArray<T>(value: T | readonly T[] | undefined) {\n if (value === undefined) {\n return [];\n }\n\n return Array.isArray(value) ? value : [value];\n}\n\nfunction escapeXml(value: string) {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nfunction escapeXmlAttribute(value: string) {\n return escapeXml(value)\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nfunction clampText(value: string, maxLength: number) {\n return value.length > maxLength ? `${value.slice(0, maxLength - 3)}...` : value;\n}\n\nfunction validateOgImageDimensions(width: number, height: number) {\n if (!Number.isSafeInteger(width) || width <= 0) {\n throw new Error(\"OG image width must be a positive integer.\");\n }\n\n if (!Number.isSafeInteger(height) || height <= 0) {\n throw new Error(\"OG image height must be a positive integer.\");\n }\n}\n","import type {\n CacheDuration,\n CacheKey,\n IdempotencyStore,\n} from \"../data\";\nimport type {\n CorsPolicy,\n RouteSecurityPolicy,\n} from \"../security\";\nimport type {\n HttpRouteContext,\n MaybePromise,\n ResponseCapability,\n RouteRequestContextFor,\n ServerTimingInput,\n} from \"./types\";\nimport { response, toResponse } from \"./response\";\n\nexport type ActionInput<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n> = (\n context: HttpRouteContext<TPath, TValues>,\n) => MaybePromise<TInput>;\n\nexport type ActionContext<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n> = HttpRouteContext<TPath, TValues> & {\n input: TInput;\n};\n\nexport type ActionIdempotency<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n> = {\n key: CacheKey | ((context: ActionContext<TInput, TPath, TValues>) => CacheKey);\n store: IdempotencyStore;\n ttl?: CacheDuration;\n};\n\nexport type ActionOptions<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n> = {\n cors?: CorsPolicy;\n handler: (\n context: ActionContext<TInput, TPath, TValues>,\n ) => MaybePromise<Response | ResponseCapability<TPath, TValues>>;\n idempotency?: ActionIdempotency<TInput, TPath, TValues>;\n input?: ActionInput<TInput, TPath, TValues>;\n security?: RouteSecurityPolicy;\n timing?: ServerTimingInput;\n};\n\nexport function action<\n TInput = undefined,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n options: ActionOptions<TInput, TPath, TValues>,\n) {\n return response<TPath, TValues>(\n async (context) => {\n const input = options.input\n ? await options.input(context)\n : undefined as TInput;\n const actionContext = {\n ...context,\n input,\n } as unknown as ActionContext<TInput, TPath, TValues>;\n const run = async () => await resolveActionResult(\n await options.handler(actionContext),\n context,\n );\n\n if (!options.idempotency) {\n return await run();\n }\n\n const key = typeof options.idempotency.key === \"function\"\n ? options.idempotency.key(actionContext)\n : options.idempotency.key;\n const result = await options.idempotency.store.run({\n fn: run,\n key,\n ttl: options.idempotency.ttl,\n });\n\n return result.value;\n },\n {\n cors: options.cors,\n security: options.security,\n timing: options.timing,\n },\n );\n}\n\nexport const actionInput = {\n async formData({ request }: HttpRouteContext) {\n return await request.formData();\n },\n async json({ request }: HttpRouteContext) {\n return await request.json() as unknown;\n },\n async text({ request }: HttpRouteContext) {\n return await request.text();\n },\n};\n\nasync function resolveActionResult<\n TPath extends string,\n TValues extends object,\n>(\n result: Response | ResponseCapability<TPath, TValues>,\n context: HttpRouteContext<TPath, TValues>,\n) {\n if (result instanceof Response) {\n return result;\n }\n\n return await toResponse(result, context);\n}\n","import type { ComponentType } from \"react\";\nimport type {\n PageCapability,\n PageOptions,\n RouteProps,\n RouteRequestContextFor,\n} from \"./types\";\n\nexport function page<const TPath extends string = string>(\n options: ComponentType<RouteProps<TPath>>,\n): PageCapability<TPath>;\nexport function page<\n const TPath extends string = string,\n TData = undefined,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n options: PageOptions<TPath, TData, TValues>,\n): PageCapability<TPath, TData, TValues>;\nexport function page<\n const TPath extends string = string,\n TData = undefined,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n options: PageOptions<TPath, TData, TValues> | ComponentType<RouteProps<TPath>>,\n): PageCapability<TPath, TData, TValues> | PageCapability<TPath> {\n if (typeof options === \"function\") {\n return {\n kind: \"page\",\n render: { mode: \"ssr\" },\n view: options,\n } satisfies PageCapability<TPath>;\n }\n\n return {\n data: options.data,\n kind: \"page\",\n layout: options.layout,\n render: options.render ?? { mode: \"ssr\" },\n view: options.view,\n } as PageCapability<TPath, TData, TValues>;\n}\n","import type {\n HttpRouteContext,\n MaybePromise,\n MiddlewareContextContribution,\n RouteMiddleware,\n RouteMiddlewareNext,\n} from \"./types\";\n\n/**\n * Declares the request-context values that a middleware can read and write.\n * The framework passes one carrier to every inherited middleware in a request.\n */\nexport function defineMiddleware<TValues extends object>(\n middleware: (\n context: HttpRouteContext<string, TValues>,\n next: RouteMiddlewareNext,\n ) => MaybePromise<Response>,\n): RouteMiddleware<string, TValues> & MiddlewareContextContribution<TValues> {\n return middleware as RouteMiddleware<string, TValues> &\n MiddlewareContextContribution<TValues>;\n}\n","import type {\n HttpRouteContext,\n MaybePromise,\n RawResponseCapability,\n} from \"./types\";\n\nexport type WebhookHmacEncoding = \"base64\" | \"hex\";\nexport type WebhookHmacAlgorithm = \"SHA-256\" | \"SHA-384\" | \"SHA-512\";\n\nexport type WebhookHmacContext = HttpRouteContext & {\n rawBody: Uint8Array;\n text: () => string;\n};\n\nexport type WebhookHmacOptions = {\n algorithm?: WebhookHmacAlgorithm;\n encoding?: WebhookHmacEncoding;\n handler: (context: WebhookHmacContext) => MaybePromise<Response>;\n header?: string;\n prefix?: false | string;\n secret: string;\n};\n\nexport const webhook = {\n hmac(options: WebhookHmacOptions) {\n return {\n kind: \"response\",\n response: async (context) => {\n const rawBody = new Uint8Array(await context.request.arrayBuffer());\n const signature = context.request.headers.get(\n options.header ?? \"x-webhook-signature\",\n );\n\n if (!signature) {\n return new Response(\"Missing webhook signature.\", {\n status: 401,\n });\n }\n\n if (!(await verifyHmacSignature(rawBody, signature, options))) {\n return new Response(\"Invalid webhook signature.\", {\n status: 401,\n });\n }\n\n return await options.handler({\n ...context,\n rawBody,\n text: () => new TextDecoder().decode(rawBody),\n });\n },\n security: {\n csrf: false,\n },\n } satisfies RawResponseCapability;\n },\n};\n\nasync function verifyHmacSignature(\n rawBody: Uint8Array,\n suppliedSignature: string,\n options: WebhookHmacOptions,\n) {\n const algorithm = options.algorithm ?? \"SHA-256\";\n const encoding = options.encoding ?? \"hex\";\n const normalized = normalizeSignature(\n suppliedSignature,\n algorithm,\n options.prefix,\n );\n const signature = decodeSignature(normalized, encoding);\n\n if (!signature) {\n return false;\n }\n\n const key = await globalThis.crypto.subtle.importKey(\n \"raw\",\n new TextEncoder().encode(options.secret),\n {\n hash: algorithm,\n name: \"HMAC\",\n },\n false,\n [\"verify\"],\n );\n return await globalThis.crypto.subtle.verify(\n \"HMAC\",\n key,\n signature,\n Uint8Array.from(rawBody).buffer,\n );\n}\n\nfunction normalizeSignature(\n signature: string,\n algorithm: WebhookHmacAlgorithm,\n configuredPrefix: false | string | undefined,\n) {\n const trimmed = signature.trim();\n const prefix =\n configuredPrefix === undefined\n ? `${algorithm.toLowerCase().replace(\"-\", \"\")}=`\n : configuredPrefix;\n\n if (prefix !== false && trimmed.startsWith(prefix)) {\n return trimmed.slice(prefix.length).trim();\n }\n\n return trimmed;\n}\n\nfunction decodeSignature(value: string, encoding: WebhookHmacEncoding) {\n if (encoding === \"hex\") {\n if (!/^(?:[0-9a-f]{2})+$/i.test(value)) {\n return null;\n }\n\n return Uint8Array.from(value.match(/.{2}/g) ?? [], (pair) =>\n Number.parseInt(pair, 16),\n );\n }\n\n if (\n !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n )\n ) {\n return null;\n }\n\n try {\n const binary =\n typeof atob === \"function\"\n ? atob(value)\n : Buffer.from(value, \"base64\").toString(\"binary\");\n\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\n } catch {\n return null;\n }\n}\n","export type EnvSource = Record<string, string | undefined>;\n\nexport type EnvValidationIssue = {\n code: \"invalid\" | \"missing\";\n key: string;\n message: string;\n};\n\nexport class EnvValidationError extends Error {\n issues: EnvValidationIssue[];\n\n constructor(issues: EnvValidationIssue[]) {\n super(formatEnvValidationError(issues));\n this.name = \"EnvValidationError\";\n this.issues = issues;\n }\n}\n\nexport type EnvVariable<T, Optional extends boolean = false> = {\n optional: Optional;\n parse: (key: string, value: string) => T;\n sensitive: boolean;\n};\n\nexport type EnvSchema = Record<string, EnvVariable<unknown, boolean>>;\n\nexport type InferEnvSchema<Schema extends EnvSchema> = {\n [Key in keyof Schema]: Schema[Key] extends EnvVariable<infer Value, infer Optional>\n ? Optional extends true\n ? Value | undefined\n : Value\n : never;\n};\n\ntype RequiredEnvVariableOptions = {\n optional?: false;\n};\n\ntype OptionalEnvVariableOptions = {\n optional: true;\n};\n\ntype EnvVariableOptions = RequiredEnvVariableOptions | OptionalEnvVariableOptions;\n\ntype RequiredStringEnvOptions = RequiredEnvVariableOptions & {\n minLength?: number;\n};\n\ntype OptionalStringEnvOptions = OptionalEnvVariableOptions & {\n minLength?: number;\n};\n\ntype StringEnvOptions = RequiredStringEnvOptions | OptionalStringEnvOptions;\n\ntype RequiredUrlEnvOptions = RequiredEnvVariableOptions & {\n protocols?: readonly string[];\n};\n\ntype OptionalUrlEnvOptions = OptionalEnvVariableOptions & {\n protocols?: readonly string[];\n};\n\ntype UrlEnvOptions = RequiredUrlEnvOptions | OptionalUrlEnvOptions;\n\ntype RequiredIntegerEnvOptions = RequiredEnvVariableOptions & {\n max?: number;\n min?: number;\n};\n\ntype OptionalIntegerEnvOptions = OptionalEnvVariableOptions & {\n max?: number;\n min?: number;\n};\n\ntype IntegerEnvOptions = RequiredIntegerEnvOptions | OptionalIntegerEnvOptions;\n\nexport function defineEnvSchema<Schema extends EnvSchema>(schema: Schema) {\n return schema;\n}\n\nexport function validateEnv<Schema extends EnvSchema>(\n schema: Schema,\n source: EnvSource,\n): InferEnvSchema<Schema> {\n const issues: EnvValidationIssue[] = [];\n const values: Partial<Record<keyof Schema, unknown>> = {};\n\n for (const key of Object.keys(schema) as Array<keyof Schema>) {\n const variable = schema[key];\n const rawValue = source[String(key)];\n\n if (rawValue === undefined || rawValue === \"\") {\n if (variable.optional) {\n values[key] = undefined;\n continue;\n }\n\n issues.push({\n code: \"missing\",\n key: String(key),\n message: `Environment variable ${String(key)} is required.`,\n });\n continue;\n }\n\n try {\n values[key] = variable.parse(String(key), rawValue);\n } catch (error) {\n issues.push({\n code: \"invalid\",\n key: String(key),\n message: error instanceof Error\n ? error.message\n : `Environment variable ${String(key)} is invalid.`,\n });\n }\n }\n\n if (issues.length) {\n throw new EnvValidationError(issues);\n }\n\n return values as InferEnvSchema<Schema>;\n}\n\nfunction booleanEnv(options: OptionalEnvVariableOptions): EnvVariable<boolean, true>;\nfunction booleanEnv(options?: RequiredEnvVariableOptions): EnvVariable<boolean, false>;\nfunction booleanEnv(options: EnvVariableOptions = {}) {\n return createVariable(options, false, (key, value) => {\n if (value === \"true\" || value === \"1\") {\n return true;\n }\n\n if (value === \"false\" || value === \"0\") {\n return false;\n }\n\n throw new Error(`Environment variable ${key} must be true, false, 1, or 0.`);\n });\n}\n\nfunction enumEnv<const Values extends readonly [string, ...string[]]>(\n values: Values,\n options: OptionalEnvVariableOptions,\n): EnvVariable<Values[number], true>;\nfunction enumEnv<const Values extends readonly [string, ...string[]]>(\n values: Values,\n options?: RequiredEnvVariableOptions,\n): EnvVariable<Values[number], false>;\nfunction enumEnv<const Values extends readonly [string, ...string[]]>(\n values: Values,\n options: EnvVariableOptions = {},\n) {\n return createVariable(options, false, (key, value) => {\n if (values.includes(value)) {\n return value;\n }\n\n throw new Error(\n `Environment variable ${key} must be one of: ${values.join(\", \")}.`,\n );\n });\n}\n\nfunction integerEnv(options: OptionalIntegerEnvOptions): EnvVariable<number, true>;\nfunction integerEnv(options?: RequiredIntegerEnvOptions): EnvVariable<number, false>;\nfunction integerEnv(options: IntegerEnvOptions = {}) {\n return createVariable(options, false, (key, value) => {\n if (!/^-?\\d+$/.test(value)) {\n throw new Error(`Environment variable ${key} must be an integer.`);\n }\n\n const parsed = Number(value);\n\n if (!Number.isSafeInteger(parsed)) {\n throw new Error(`Environment variable ${key} must be a safe integer.`);\n }\n\n if (options.min !== undefined && parsed < options.min) {\n throw new Error(\n `Environment variable ${key} must be greater than or equal to ${options.min}.`,\n );\n }\n\n if (options.max !== undefined && parsed > options.max) {\n throw new Error(\n `Environment variable ${key} must be less than or equal to ${options.max}.`,\n );\n }\n\n return parsed;\n });\n}\n\nfunction secretEnv(options: OptionalStringEnvOptions): EnvVariable<string, true>;\nfunction secretEnv(options?: RequiredStringEnvOptions): EnvVariable<string, false>;\nfunction secretEnv(options: StringEnvOptions = {}) {\n return createVariable(options, true, (key, value) =>\n parseString(key, value, options),\n );\n}\n\nfunction stringEnv(options: OptionalStringEnvOptions): EnvVariable<string, true>;\nfunction stringEnv(options?: RequiredStringEnvOptions): EnvVariable<string, false>;\nfunction stringEnv(options: StringEnvOptions = {}) {\n return createVariable(options, false, (key, value) =>\n parseString(key, value, options),\n );\n}\n\nfunction urlEnv(options: OptionalUrlEnvOptions): EnvVariable<URL, true>;\nfunction urlEnv(options?: RequiredUrlEnvOptions): EnvVariable<URL, false>;\nfunction urlEnv(options: UrlEnvOptions = {}) {\n return createVariable(options, false, (key, value) => {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(`Environment variable ${key} must be a valid URL.`);\n }\n\n if (\n options.protocols?.length &&\n !options.protocols.includes(url.protocol)\n ) {\n throw new Error(\n `Environment variable ${key} must use one of these protocols: ${options.protocols.join(\", \")}.`,\n );\n }\n\n return url;\n });\n}\n\nexport const env = {\n boolean: booleanEnv,\n enum: enumEnv,\n integer: integerEnv,\n secret: secretEnv,\n string: stringEnv,\n url: urlEnv,\n};\n\nfunction createVariable<T>(\n options: EnvVariableOptions,\n sensitive: boolean,\n parse: (key: string, value: string) => T,\n): EnvVariable<T, boolean> {\n return {\n optional: options.optional ?? false,\n parse,\n sensitive,\n };\n}\n\nfunction parseString(\n key: string,\n value: string,\n options: StringEnvOptions,\n) {\n if (options.minLength !== undefined && value.length < options.minLength) {\n throw new Error(\n `Environment variable ${key} must be at least ${options.minLength} characters.`,\n );\n }\n\n return value;\n}\n\nfunction formatEnvValidationError(issues: EnvValidationIssue[]) {\n if (issues.length === 1) {\n return issues[0].message;\n }\n\n return `Environment validation failed with ${issues.length} issues.`;\n}\n","import {\n limitRequestBody,\n parseBodySize,\n RequestBodyTooLargeError,\n} from \"./request\";\n\ntype MaybePromise<T> = Promise<T> | T;\n\nexport type SecurityReportPayload = unknown;\n\nexport type SecurityReportHandlerOptions = {\n maxBodySize?: number | `${number}${\"b\" | \"gb\" | \"kb\" | \"mb\"}`;\n onReport?: (\n report: SecurityReportPayload,\n context: SecurityReportContext,\n ) => MaybePromise<void>;\n};\n\nexport type SecurityReportContext = {\n index: number;\n request: Request;\n};\n\nexport function createSecurityReportHandler(\n options: SecurityReportHandlerOptions = {},\n) {\n return async function handleSecurityReport(request: Request) {\n if (request.method.toUpperCase() !== \"POST\") {\n return new Response(null, {\n headers: {\n allow: \"POST\",\n },\n status: 405,\n });\n }\n\n const contentTypeResponse = enforceReportContentType(request);\n\n if (contentTypeResponse) {\n return contentTypeResponse;\n }\n\n const bodySizeResponse = enforceReportBodySize(options, request);\n\n if (bodySizeResponse) {\n return bodySizeResponse;\n }\n\n if (options.maxBodySize !== undefined) {\n request = limitRequestBody({ maxBodySize: options.maxBodySize }, request);\n }\n\n let payload: unknown;\n\n try {\n payload = await request.json();\n } catch (error) {\n if (error instanceof RequestBodyTooLargeError) {\n return new Response(\"Security report body too large.\", { status: 413 });\n }\n\n return new Response(\"Invalid security report JSON.\", {\n status: 400,\n });\n }\n\n const reports = normalizeSecurityReports(payload);\n\n for (let index = 0; index < reports.length; index += 1) {\n await options.onReport?.(reports[index], {\n index,\n request,\n });\n }\n\n return new Response(null, {\n status: 204,\n });\n };\n}\n\nconst supportedReportContentTypes = new Set([\n \"application/csp-report\",\n \"application/reports+json\",\n]);\n\nfunction enforceReportContentType(request: Request) {\n const value = request.headers.get(\"content-type\");\n\n // Keep direct/programmatic calls compatible. Browser-generated reports\n // always send one of the two media types below.\n if (!value) {\n return null;\n }\n\n const mediaType = value.split(\";\", 1)[0]?.trim().toLowerCase();\n\n if (mediaType && supportedReportContentTypes.has(mediaType)) {\n return null;\n }\n\n return new Response(\"Unsupported security report Content-Type.\", {\n status: 415,\n });\n}\n\nfunction enforceReportBodySize(\n options: SecurityReportHandlerOptions,\n request: Request,\n) {\n if (options.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 if (!/^\\d+$/.test(contentLength)) {\n return new Response(\"Invalid Content-Length.\", {\n status: 400,\n });\n }\n\n const declaredSize = Number(contentLength);\n\n if (!Number.isSafeInteger(declaredSize)) {\n return new Response(\"Invalid Content-Length.\", {\n status: 400,\n });\n }\n\n if (declaredSize > parseBodySize(options.maxBodySize)) {\n return new Response(\"Security report body too large.\", {\n status: 413,\n });\n }\n\n return null;\n}\n\nfunction normalizeSecurityReports(payload: unknown) {\n if (Array.isArray(payload)) {\n return payload;\n }\n\n if (isObject(payload) && \"csp-report\" in payload) {\n return [payload[\"csp-report\"]];\n }\n\n return [payload];\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","import { parseBodySize } from \"./request\";\nimport type { RequestSecurityPolicy } from \"./types\";\n\nexport type UploadFilePolicy = {\n maxSize?: RequestSecurityPolicy[\"maxBodySize\"];\n required?: boolean;\n types?: readonly string[];\n};\n\nexport type UploadPolicy = {\n files: Record<string, UploadFilePolicy>;\n maxTotalSize?: RequestSecurityPolicy[\"maxBodySize\"];\n};\n\nexport type UploadValidationIssue = {\n code:\n | \"file-missing\"\n | \"file-too-large\"\n | \"file-type-not-allowed\"\n | \"total-upload-too-large\";\n field: string;\n message: string;\n};\n\nexport type UploadValidationResult = {\n files: Record<string, File[]>;\n issues: UploadValidationIssue[];\n ok: boolean;\n totalSize: number;\n};\n\nexport function validateUploads(\n formData: FormData,\n policy: UploadPolicy,\n): UploadValidationResult {\n const files: Record<string, File[]> = {};\n const issues: UploadValidationIssue[] = [];\n let totalSize = 0;\n\n for (const [field, filePolicy] of Object.entries(policy.files)) {\n const fieldFiles = formData.getAll(field).filter(isFile);\n files[field] = fieldFiles;\n\n if (filePolicy.required && fieldFiles.length === 0) {\n issues.push({\n code: \"file-missing\",\n field,\n message: `Upload field ${field} requires at least one file.`,\n });\n }\n\n for (const file of fieldFiles) {\n totalSize += file.size;\n validateFile(field, file, filePolicy, issues);\n }\n }\n\n if (\n policy.maxTotalSize !== undefined &&\n totalSize > parseBodySize(policy.maxTotalSize)\n ) {\n issues.push({\n code: \"total-upload-too-large\",\n field: \"*\",\n message: `Uploaded files exceed the maximum total size of ${policy.maxTotalSize}.`,\n });\n }\n\n return {\n files,\n issues,\n ok: issues.length === 0,\n totalSize,\n };\n}\n\nfunction validateFile(\n field: string,\n file: File,\n policy: UploadFilePolicy,\n issues: UploadValidationIssue[],\n) {\n if (policy.maxSize !== undefined && file.size > parseBodySize(policy.maxSize)) {\n issues.push({\n code: \"file-too-large\",\n field,\n message: `Upload field ${field} contains ${file.name || \"a file\"} larger than ${policy.maxSize}.`,\n });\n }\n\n if (policy.types?.length && !isAllowedFileType(file.type, policy.types)) {\n issues.push({\n code: \"file-type-not-allowed\",\n field,\n message: `Upload field ${field} contains ${file.name || \"a file\"} with disallowed type ${file.type || \"unknown\"}.`,\n });\n }\n}\n\nfunction isAllowedFileType(type: string, allowedTypes: readonly string[]) {\n return allowedTypes.some((allowedType) => {\n if (allowedType.endsWith(\"/*\")) {\n return type.startsWith(allowedType.slice(0, -1));\n }\n\n return type === allowedType;\n });\n}\n\nfunction isFile(value: FormDataEntryValue): value is File {\n return value instanceof File;\n}\n","export type WebSocketOriginPolicy = {\n allowMissingOrigin?: boolean;\n origins: \"same-origin\" | readonly string[];\n};\n\nexport type WebSocketOriginCheck = {\n allowed: boolean;\n expected: \"same-origin\" | readonly string[];\n origin: string | null;\n reason?: \"invalid-origin\" | \"missing-origin\" | \"origin-not-allowed\";\n};\n\nexport function checkWebSocketOrigin(\n policy: WebSocketOriginPolicy,\n request: Request,\n): WebSocketOriginCheck {\n const origin = request.headers.get(\"origin\");\n\n if (!origin) {\n return {\n allowed: Boolean(policy.allowMissingOrigin),\n expected: policy.origins,\n origin,\n reason: policy.allowMissingOrigin ? undefined : \"missing-origin\",\n };\n }\n\n const normalizedOrigin = normalizeOrigin(origin);\n\n if (!normalizedOrigin) {\n return {\n allowed: false,\n expected: policy.origins,\n origin,\n reason: \"invalid-origin\",\n };\n }\n\n const allowed = isAllowedOrigin(policy, normalizedOrigin, request);\n\n return {\n allowed,\n expected: policy.origins,\n origin: normalizedOrigin,\n reason: allowed ? undefined : \"origin-not-allowed\",\n };\n}\n\nexport function enforceWebSocketOrigin(\n policy: WebSocketOriginPolicy | undefined,\n request: Request,\n) {\n if (!policy) {\n return null;\n }\n\n const check = checkWebSocketOrigin(policy, request);\n\n if (check.allowed) {\n return null;\n }\n\n return new Response(\"WebSocket origin not allowed.\", {\n status: 403,\n });\n}\n\nfunction isAllowedOrigin(\n policy: WebSocketOriginPolicy,\n origin: string,\n request: Request,\n) {\n if (policy.origins === \"same-origin\") {\n return origin === new URL(request.url).origin;\n }\n\n return policy.origins.some((allowedOrigin) =>\n originMatches(allowedOrigin, origin),\n );\n}\n\nfunction originMatches(allowedOrigin: string, actualOrigin: string) {\n if (allowedOrigin === \"null\") {\n return actualOrigin === \"null\";\n }\n\n return normalizeOrigin(allowedOrigin) === actualOrigin;\n}\n\nfunction normalizeOrigin(origin: string) {\n if (origin === \"null\") {\n return origin;\n }\n\n try {\n // Origin is a serialized origin, not an arbitrary URL. `new URL()` alone\n // would silently discard a path, query, fragment, or credentials and could\n // turn a malformed attacker-supplied header into an allowed origin.\n if (origin !== origin.trim()) {\n return null;\n }\n\n const schemeSeparator = origin.indexOf(\"://\");\n\n if (schemeSeparator === -1) {\n return null;\n }\n\n const authority = origin.slice(schemeSeparator + 3);\n\n if (!authority || /[/?#]/.test(authority)) {\n return null;\n }\n\n const url = new URL(origin);\n\n if (\n (url.protocol !== \"http:\" && url.protocol !== \"https:\") ||\n url.username ||\n url.password\n ) {\n return null;\n }\n\n return url.origin;\n } catch {\n return null;\n }\n}\n","import {\n Component,\n ComponentType,\n MouseEvent,\n ReactNode,\n createContext,\n createElement,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n HYDRATION_FALLBACK_ATTRIBUTE,\n HYDRATION_ROOT_ATTRIBUTE,\n readInitialRouteData,\n type InitialRouteData,\n} from \"../document\";\nimport {\n HTTP_ERROR_STATUSES,\n httpError,\n isHttpError,\n type NotFoundProps,\n type RouteErrorProps,\n type RouteImporter,\n} from \"../route\";\nimport {\n createRouteManifest,\n loadErrorFallback,\n loadLoadingFallback,\n loadPageRoute,\n NAVIGATION_DATA_HEADER,\n NAVIGATION_DATA_REQUEST,\n NAVIGATION_DATA_RESPONSE,\n NAVIGATION_ERROR_RESPONSE,\n NAVIGATION_NOT_FOUND_RESPONSE,\n type PendingRouteMatch,\n} from \"../router\";\nimport { BuiltInNotFound } from \"../server/fallbacks\";\nimport { href, type AppHref, type LinkTarget, type LinkTo } from \"../routing\";\n\nexport type NavigationDataLoader = (\n request: Request,\n) => Promise<InitialRouteData>;\n\nexport type FileRouterOptions = {\n initialMatch?: PendingRouteMatch;\n loadNavigationData?: NavigationDataLoader;\n navigation?: \"document\" | \"server\";\n routes: Record<string, RouteImporter>;\n loading?: ComponentType;\n notFound?: ComponentType<NotFoundProps>;\n};\n\nexport function createFileRouter(options: FileRouterOptions) {\n const manifest = createRouteManifest(options.routes);\n const navigationDataLoader = options.loadNavigationData ?? loadNavigationData;\n\n return function FileRouter() {\n const [location, setLocation] = useState(() => getCurrentLocation());\n const [match, setMatch] = useState<PendingRouteMatch>(\n () => options.initialMatch ?? { status: \"loading\" },\n );\n const initialMatchPending = useRef(Boolean(options.initialMatch));\n const navigationSequence = useRef(0);\n\n useEffect(() => {\n function onPopState() {\n setLocation(getCurrentLocation());\n }\n\n window.addEventListener(\"popstate\", onPopState);\n return () => window.removeEventListener(\"popstate\", onPopState);\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n let settled = false;\n const sequence = ++navigationSequence.current;\n const controller = new AbortController();\n const isCurrent = () =>\n !cancelled && sequence === navigationSequence.current;\n\n if (\n initialMatchPending.current &&\n getMatchPathname(options.initialMatch) === location.pathname\n ) {\n initialMatchPending.current = false;\n return () => {\n cancelled = true;\n };\n }\n\n setMatch({ status: \"loading\" });\n loadLoadingFallback(manifest, location.pathname).then((Loading) => {\n if (isCurrent() && !settled && Loading) {\n setMatch({ loading: Loading, status: \"loading\" });\n }\n }).catch(() => {\n // Loading UI is optional. A malformed pathname or broken loading\n // module must not become an unhandled rejection while the main route\n // pipeline resolves the controlled error state.\n });\n const request = new Request(location.href, { signal: controller.signal });\n Promise.resolve(navigationDataLoader(request))\n .then((initialData) =>\n loadPageRoute(\n manifest,\n location.pathname,\n request,\n initialData,\n undefined,\n { documentContributions: false },\n ),\n )\n .then((nextMatch) => {\n settled = true;\n if (isCurrent()) {\n setMatch(nextMatch);\n }\n })\n .catch(async (error: unknown) => {\n settled = true;\n\n if (!isCurrent() || controller.signal.aborted) {\n return;\n }\n\n const ErrorFallback = await loadErrorFallback(\n manifest,\n location.pathname,\n );\n\n if (isCurrent()) {\n setMatch({\n Error: ErrorFallback,\n error,\n pathname: location.pathname,\n status: \"error\",\n });\n }\n });\n\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [location.pathname, location.search]);\n\n const router = useMemo(\n () => ({\n navigation: options.navigation ?? \"server\",\n push(to: string) {\n const previous = getCurrentLocation();\n window.history.pushState(null, \"\", to);\n const next = getCurrentLocation();\n setLocation(next);\n\n if (\n previous.pathname === next.pathname &&\n previous.search === next.search &&\n previous.hash !== next.hash\n ) {\n scrollToHash(next.hash);\n }\n },\n }),\n [],\n );\n\n return createElement(RouterContext.Provider, {\n value: router,\n children: createElement(RouteRenderer, {\n key: `${location.pathname}${location.search}`,\n Loading: options.loading,\n NotFound: options.notFound,\n match,\n }),\n });\n };\n}\n\n// Hydration is safe only when the client reproduces the server output. The\n// client replaces a page document when its route no longer matches. The client\n// hydrates a document that the server marked as a 404. This action preserves\n// the layouts that the server resolved.\nfunction isHydratableMatch(match: PendingRouteMatch, root: Element) {\n const fallback = root.getAttribute(HYDRATION_FALLBACK_ATTRIBUTE);\n\n return match.status === \"not-found\"\n ? fallback === \"not-found\"\n : match.status === \"ready\" && fallback === null;\n}\n\nfunction getMatchPathname(match: PendingRouteMatch | undefined) {\n if (!match) {\n return undefined;\n }\n\n if (match.status === \"ready\") {\n return match.match.pathname;\n }\n\n return match.status === \"loading\" ? undefined : match.pathname;\n}\n\nexport type HydrateFileRouterOptions = Omit<\n FileRouterOptions,\n \"initialMatch\"\n> & {\n initialData?: InitialRouteData;\n root?: Element;\n};\n\nexport async function hydrateFileRouter(options: HydrateFileRouterOptions) {\n const root = options.root ?? document.getElementById(\"root\");\n\n if (!root) {\n throw new Error(\n \"Demiurge expected a #root element in the framework document.\",\n );\n }\n\n const manifest = createRouteManifest(options.routes);\n const navigationDataLoader = options.loadNavigationData ?? loadNavigationData;\n const initialData = options.initialData ?? readInitialRouteData(document);\n const match = await loadPageRoute(\n manifest,\n window.location.pathname,\n new Request(window.location.href),\n initialData ?? await navigationDataLoader(new Request(window.location.href)),\n undefined,\n { documentContributions: false },\n );\n const hydratable = isHydratableMatch(match, root);\n const Router = createFileRouter(\n hydratable\n ? {\n ...options,\n initialMatch: match,\n loadNavigationData: navigationDataLoader,\n navigation: initialData?.navigation ?? options.navigation,\n }\n : {\n ...options,\n loadNavigationData: navigationDataLoader,\n navigation: initialData?.navigation ?? options.navigation,\n },\n );\n const { createRoot, hydrateRoot } = resolveReactDomClient(\n await import(\"react-dom/client\"),\n );\n\n // Only documents rendered by the framework server carry markup to hydrate.\n // A static shell has an empty root, so hydrating it would mismatch. A\n // server-rendered 404 carries markup too, and hydrating it is what keeps the\n // layouts the server resolved from being torn down on the client.\n if (hydratable && root.hasAttribute(HYDRATION_ROOT_ATTRIBUTE)) {\n hydrateRoot(root, createElement(Router));\n return;\n }\n\n root.replaceChildren();\n createRoot(root).render(createElement(Router));\n}\n\ntype ReactDomClientApi = Pick<\n typeof import(\"react-dom/client\"),\n \"createRoot\" | \"hydrateRoot\"\n>;\n\ntype ReactDomClientModule = Partial<ReactDomClientApi> & {\n default?: ReactDomClientApi;\n};\n\nexport function resolveReactDomClient(module: ReactDomClientModule) {\n const client = typeof module.createRoot === \"function\" &&\n typeof module.hydrateRoot === \"function\"\n ? module as ReactDomClientApi\n : module.default;\n\n if (\n !client ||\n typeof client.createRoot !== \"function\" ||\n typeof client.hydrateRoot !== \"function\"\n ) {\n throw new Error(\n \"Demiurge could not load the React DOM client from the Vite module.\",\n );\n }\n\n return client;\n}\n\nexport function Link<const TTo extends AppHref>(\n props: LinkTo<TTo> & {\n children: ReactNode;\n className?: string;\n },\n) {\n const router = useRouter();\n const to = href(props as LinkTarget<TTo>);\n\n return (\n <a\n className={props.className}\n href={to}\n onClick={(event) => {\n if (\n router.navigation === \"server\" &&\n shouldHandleLinkClick(event)\n ) {\n event.preventDefault();\n router.push(to);\n }\n }}\n >\n {props.children}\n </a>\n );\n}\n\nfunction RouteRenderer({\n Loading,\n NotFound,\n match,\n}: {\n Loading?: ComponentType;\n NotFound?: ComponentType<{ pathname: string }>;\n match: PendingRouteMatch;\n}) {\n if (match.status === \"loading\") {\n const AppLoading = match.loading ?? Loading;\n\n return AppLoading ? createElement(AppLoading) : null;\n }\n\n if (match.status === \"not-found\") {\n const AppNotFound = match.notFound ?? NotFound ?? BuiltInNotFound;\n\n return match.layouts.reduceRight<ReactNode>(\n (children, Layout) =>\n createElement(Layout, {\n children,\n path: {},\n pathname: match.pathname,\n }),\n createElement(AppNotFound, { pathname: match.pathname }),\n );\n }\n\n if (match.status === \"error\") {\n return match.Error\n ? createElement(match.Error, {\n error: match.error,\n pathname: match.pathname,\n status: errorStatus(match.error),\n })\n : null;\n }\n\n const { data, error, page, layouts, path, pathname } = match.match;\n const pageElement = createElement(page, { data, path, pathname });\n const routeElement = layouts.reduceRight<ReactNode>(\n (children, Layout) => createElement(Layout, { path, pathname, children }),\n pageElement,\n );\n\n return createElement(RouteErrorBoundary, {\n Error: error,\n children: routeElement,\n pathname,\n });\n}\n\nclass RouteErrorBoundary extends Component<\n {\n children: ReactNode;\n Error?: ComponentType<RouteErrorProps>;\n pathname: string;\n },\n { error?: unknown }\n> {\n static getDerivedStateFromError(error: unknown) {\n return { error };\n }\n\n override state: { error?: unknown } = {};\n\n override componentDidUpdate(previousProps: {\n children: ReactNode;\n Error?: ComponentType<RouteErrorProps>;\n pathname: string;\n }) {\n if (\n this.state.error !== undefined &&\n previousProps.pathname !== this.props.pathname\n ) {\n this.setState({ error: undefined });\n }\n }\n\n override render() {\n if (this.state.error !== undefined) {\n return this.props.Error\n ? createElement(this.props.Error, {\n error: this.state.error,\n pathname: this.props.pathname,\n status: errorStatus(this.state.error),\n })\n : null;\n }\n\n return this.props.children;\n }\n}\n\nfunction errorStatus(error: unknown) {\n return isHttpError(error) ? error.status : 500;\n}\n\nfunction getCurrentLocation() {\n return {\n hash: window.location.hash,\n href: window.location.href,\n pathname: window.location.pathname,\n search: window.location.search,\n };\n}\n\nasync function loadNavigationData(request: Request) {\n const headers = new Headers(request.headers);\n headers.set(\"accept\", \"application/json\");\n headers.set(NAVIGATION_DATA_HEADER, NAVIGATION_DATA_REQUEST);\n const response = await fetch(new Request(request, {\n credentials: \"same-origin\",\n headers,\n }));\n const kind = response.headers.get(NAVIGATION_DATA_HEADER);\n\n if (kind === NAVIGATION_DATA_RESPONSE) {\n const value = await response.json() as Partial<InitialRouteData>;\n\n if (value.hasData !== true) {\n throw new Error(\"Demiurge received malformed navigation route data.\");\n }\n\n return { data: value.data, hasData: true };\n }\n\n if (kind === NAVIGATION_NOT_FOUND_RESPONSE) {\n return { hasData: true };\n }\n\n if (kind === NAVIGATION_ERROR_RESPONSE || !response.ok) {\n const problem = await readProblem(response);\n const status = HTTP_ERROR_STATUSES.includes(\n response.status as (typeof HTTP_ERROR_STATUSES)[number],\n )\n ? response.status as (typeof HTTP_ERROR_STATUSES)[number]\n : 500;\n\n throw httpError(status, {\n detail: typeof problem?.detail === \"string\" ? problem.detail : undefined,\n title: typeof problem?.title === \"string\" ? problem.title : undefined,\n });\n }\n\n throw new Error(\n \"Demiurge expected a navigation data response from the application server.\",\n );\n}\n\nasync function readProblem(response: Response) {\n try {\n return await response.json() as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction scrollToHash(hash: string) {\n queueMicrotask(() => {\n if (!hash) {\n window.scrollTo?.(0, 0);\n return;\n }\n\n let id: string;\n try {\n id = decodeURIComponent(hash.slice(1));\n } catch {\n id = hash.slice(1);\n }\n document.getElementById(id)?.scrollIntoView?.();\n });\n}\n\nfunction shouldHandleLinkClick(event: MouseEvent<HTMLAnchorElement>) {\n return (\n event.button === 0 &&\n !event.metaKey &&\n !event.altKey &&\n !event.ctrlKey &&\n !event.shiftKey\n );\n}\n\ntype RouterApi = {\n navigation: \"document\" | \"server\";\n push(to: string): void;\n};\n\nconst RouterContext = createContext<RouterApi>({\n navigation: \"document\",\n push(to) {\n window.location.href = to;\n },\n});\n\nfunction useRouter() {\n return useContext(RouterContext);\n}\n","export type ImageFormat = \"auto\" | \"avif\" | \"webp\" | \"jpeg\" | \"png\";\n\nexport type RemoteImagePattern = {\n hostname: string;\n pathname?: string;\n port?: string;\n protocol?: \"http:\" | \"https:\";\n};\n\nexport type ImagePolicy = {\n local?: boolean;\n optimizerPath?: string;\n remote?: readonly (string | RemoteImagePattern)[];\n};\n\nexport type ImageTransformOptions = {\n alt: string;\n format?: ImageFormat;\n height: number;\n priority?: boolean;\n quality?: number;\n sizes?: string;\n src: string;\n width: number;\n widths?: readonly number[];\n};\n\nexport type ImageVariant = {\n format: ImageFormat;\n height: number;\n src: string;\n width: number;\n};\n\nexport type ImageTransformPlan = {\n alt: string;\n decoding: \"async\";\n fetchPriority?: \"high\";\n height: number;\n loading: \"eager\" | \"lazy\";\n sizes?: string;\n source: {\n kind: \"local\" | \"remote\";\n src: string;\n };\n src: string;\n srcSet: string;\n variants: ImageVariant[];\n width: number;\n};\n\nconst defaultOptimizerPath = \"/_demiurge/image\";\n\nexport function defineImages(policy: ImagePolicy): ImagePolicy {\n return policy;\n}\n\nexport function isAllowedImageSource(src: string, policy: ImagePolicy = {}) {\n return classifyImageSource(src, policy) !== null;\n}\n\nexport function planImageTransform(\n options: ImageTransformOptions,\n policy: ImagePolicy = {},\n): ImageTransformPlan {\n const source = classifyImageSource(options.src, policy);\n\n if (!source) {\n throw new Error(`Image source \"${options.src}\" is not allowed by the image policy.`);\n }\n\n validateImageDimension(\"width\", options.width);\n validateImageDimension(\"height\", options.height);\n validateImageQuality(options.quality);\n\n const format = options.format ?? \"auto\";\n const widths = normalizeVariantWidths(options.width, options.widths);\n const variants = widths.map((width) => {\n const height = Math.round((options.height / options.width) * width);\n\n return {\n format,\n height,\n src: createOptimizerUrl({\n format,\n optimizerPath: policy.optimizerPath ?? defaultOptimizerPath,\n quality: options.quality,\n src: options.src,\n width,\n }),\n width,\n };\n });\n const primaryVariant = variants[0];\n\n return {\n alt: options.alt,\n decoding: \"async\",\n fetchPriority: options.priority ? \"high\" : undefined,\n height: options.height,\n loading: options.priority ? \"eager\" : \"lazy\",\n sizes: options.sizes,\n source,\n src: primaryVariant.src,\n srcSet: variants\n .map((variant) => `${variant.src} ${variant.width}w`)\n .join(\", \"),\n variants,\n width: options.width,\n };\n}\n\nfunction classifyImageSource(\n src: string,\n policy: ImagePolicy,\n): ImageTransformPlan[\"source\"] | null {\n if (src.startsWith(\"/\") && !src.startsWith(\"//\")) {\n return policy.local === false ? null : { kind: \"local\", src };\n }\n\n let url: URL;\n\n try {\n url = new URL(src);\n } catch {\n return null;\n }\n\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n return null;\n }\n\n return isAllowedRemoteImage(url, policy.remote ?? [])\n ? { kind: \"remote\", src: url.toString() }\n : null;\n}\n\nfunction isAllowedRemoteImage(\n url: URL,\n remotes: readonly (string | RemoteImagePattern)[],\n) {\n return remotes.some((remote) =>\n typeof remote === \"string\"\n ? matchesRemoteOrigin(url, remote)\n : matchesRemotePattern(url, remote),\n );\n}\n\nfunction matchesRemoteOrigin(url: URL, origin: string) {\n try {\n return url.origin === new URL(origin).origin;\n } catch {\n return false;\n }\n}\n\nfunction matchesRemotePattern(url: URL, pattern: RemoteImagePattern) {\n if (pattern.protocol && url.protocol !== pattern.protocol) {\n return false;\n }\n\n if (url.hostname !== pattern.hostname) {\n return false;\n }\n\n if (pattern.port !== undefined && url.port !== pattern.port) {\n return false;\n }\n\n return pattern.pathname\n ? matchesPathnamePattern(url.pathname, pattern.pathname)\n : true;\n}\n\nfunction matchesPathnamePattern(pathname: string, pattern: string) {\n if (pattern.endsWith(\"*\")) {\n return pathname.startsWith(pattern.slice(0, -1));\n }\n\n return pathname === pattern;\n}\n\nfunction validateImageDimension(name: \"height\" | \"width\", value: number) {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`Image ${name} must be a positive integer.`);\n }\n}\n\nfunction validateImageQuality(quality: number | undefined) {\n if (quality === undefined) {\n return;\n }\n\n if (!Number.isInteger(quality) || quality < 1 || quality > 100) {\n throw new Error(\"Image quality must be an integer between 1 and 100.\");\n }\n}\n\nfunction normalizeVariantWidths(width: number, widths: readonly number[] | undefined) {\n const candidates = widths ?? [width, width * 2];\n const uniqueWidths = [...new Set(candidates)];\n\n for (const candidate of uniqueWidths) {\n validateImageDimension(\"width\", candidate);\n }\n\n return uniqueWidths.sort((left, right) => left - right);\n}\n\nfunction createOptimizerUrl({\n format,\n optimizerPath,\n quality,\n src,\n width,\n}: {\n format: ImageFormat;\n optimizerPath: string;\n quality: number | undefined;\n src: string;\n width: number;\n}) {\n const params = new URLSearchParams({\n src,\n w: String(width),\n });\n\n if (quality !== undefined) {\n params.set(\"q\", String(quality));\n }\n\n if (format !== \"auto\") {\n params.set(\"f\", format);\n }\n\n return `${optimizerPath}?${params.toString()}`;\n}\n","import type { LinkTag } from \"../document\";\n\nexport type FontStyle = \"normal\" | \"italic\" | \"oblique\";\n\nexport type FontDefinition = {\n display: \"auto\" | \"block\" | \"fallback\" | \"optional\" | \"swap\";\n family: string;\n kind: \"font\";\n source: \"google\" | \"local\";\n src?: string;\n style: FontStyle;\n weight: number | `${number} ${number}`;\n};\n\nexport type LocalFontOptions = {\n display?: FontDefinition[\"display\"];\n name: string;\n src: string;\n style?: FontStyle;\n weight?: FontDefinition[\"weight\"];\n};\n\nexport type GoogleFontOptions = {\n display?: FontDefinition[\"display\"];\n family: string;\n selfHost?: boolean;\n src?: string;\n style?: FontStyle;\n weight?: FontDefinition[\"weight\"];\n};\n\nexport type FontContribution = readonly FontDefinition[];\n\nexport const font = {\n google(options: GoogleFontOptions): FontDefinition {\n return {\n display: options.display ?? \"swap\",\n family: options.family,\n kind: \"font\",\n source: \"google\",\n src: options.src,\n style: options.style ?? \"normal\",\n weight: options.weight ?? 400,\n };\n },\n local(options: LocalFontOptions): FontDefinition {\n if (!options.src.trim()) {\n throw new Error(\"Local font source must not be empty.\");\n }\n\n return {\n display: options.display ?? \"swap\",\n family: options.name,\n kind: \"font\",\n source: \"local\",\n src: options.src,\n style: options.style ?? \"normal\",\n weight: options.weight ?? 400,\n };\n },\n};\n\nexport function defineFonts(fonts: FontContribution): FontContribution {\n return [...fonts];\n}\n\nexport function fontPreloadLinks(fonts: FontContribution): LinkTag[] {\n return fonts\n .filter((definition) => definition.src)\n .map((definition) => ({\n as: \"font\",\n crossOrigin: \"anonymous\",\n href: definition.src as string,\n kind: \"link\" as const,\n rel: \"preload\",\n type: fontType(definition.src as string),\n }));\n}\n\nexport function renderFontFaceCss(fonts: FontContribution): string {\n return fonts\n .filter((definition) => definition.source === \"local\" && definition.src)\n .map((definition) => {\n const src = definition.src as string;\n\n return [\n \"@font-face {\",\n ` font-family: \"${escapeCss(definition.family)}\";`,\n ` src: url(\"${escapeCss(src)}\") format(\"${fontFormat(src)}\");`,\n ` font-style: ${definition.style};`,\n ` font-weight: ${definition.weight};`,\n ` font-display: ${definition.display};`,\n \"}\",\n ].join(\"\\n\");\n })\n .join(\"\\n\");\n}\n\nfunction fontType(src: string) {\n const extension = src.split(\"?\")[0].split(\"#\")[0].split(\".\").pop()?.toLowerCase();\n\n return extension === \"woff\" ? \"font/woff\" : \"font/woff2\";\n}\n\nfunction fontFormat(src: string) {\n const extension = src.split(\"?\")[0].split(\"#\")[0].split(\".\").pop()?.toLowerCase();\n\n return extension === \"woff\" ? \"woff\" : \"woff2\";\n}\n\nfunction escapeCss(value: string) {\n return value.replace(/[\\\\\"]/g, \"\\\\$&\");\n}\n","import { script, type ScriptTag } from \"../document\";\n\nexport type AnalyticsConsent = boolean | \"required\";\n\nexport type PlausibleAnalyticsOptions = {\n consent?: AnalyticsConsent;\n domain: string;\n endpoint?: string;\n strategy?: ScriptTag[\"strategy\"];\n};\n\nexport type PlausibleAnalytics = {\n connectSrc: string;\n consent: AnalyticsConsent;\n domain: string;\n kind: \"analytics\";\n provider: \"plausible\";\n script: ScriptTag;\n};\n\nexport const analytics = {\n plausible(options: PlausibleAnalyticsOptions): PlausibleAnalytics {\n const domain = normalizeDomain(options.domain);\n const endpointUrl = parseEndpoint(options.endpoint ?? \"https://plausible.io\");\n\n return {\n connectSrc: endpointUrl.origin,\n consent: options.consent ?? false,\n domain,\n kind: \"analytics\",\n provider: \"plausible\",\n script: script({\n dataApi: `${endpointUrl.origin}/api/event`,\n dataDomain: domain,\n purpose: \"analytics\",\n src: `${endpointUrl.origin}/js/script.js`,\n strategy: options.strategy ?? \"afterInteractive\",\n }),\n };\n },\n};\n\nfunction normalizeDomain(domain: string) {\n const normalized = domain.trim();\n\n if (!normalized || normalized.includes(\"/\") || normalized.includes(\" \")) {\n throw new Error(\"Analytics domain must be a hostname without a path.\");\n }\n\n return normalized;\n}\n\nfunction parseEndpoint(endpoint: string) {\n let url: URL;\n\n try {\n url = new URL(endpoint);\n } catch {\n throw new Error(\"Analytics endpoint must be an absolute URL.\");\n }\n\n if (url.protocol !== \"https:\") {\n throw new Error(\"Analytics endpoint must use HTTPS.\");\n }\n\n return url;\n}\n","export type ObservabilityValue =\n | boolean\n | null\n | number\n | string\n | readonly ObservabilityValue[]\n | { readonly [key: string]: ObservabilityValue };\n\nexport type RequestSignal = {\n duration?: number;\n method: string;\n pathname: string;\n status?: number;\n attributes?: Readonly<Record<string, ObservabilityValue>>;\n};\n\nexport type ServerStartSignal = {\n adapter?: string;\n attributes?: Readonly<Record<string, ObservabilityValue>>;\n timestamp?: number;\n};\n\nexport type TraceSignal = {\n attributes?: Readonly<Record<string, ObservabilityValue>>;\n duration?: number;\n name: string;\n status?: \"error\" | \"ok\" | \"unset\";\n traceId?: string;\n};\n\nexport type WebVitalName = \"CLS\" | \"FCP\" | \"FID\" | \"INP\" | \"LCP\" | \"TTFB\";\n\nexport type WebVitalSignal = {\n id?: string;\n name: WebVitalName;\n navigationType?: string;\n rating?: \"good\" | \"needs-improvement\" | \"poor\";\n value: number;\n attributes?: Readonly<Record<string, ObservabilityValue>>;\n};\n\nexport type InstrumentationEvent =\n | { kind: \"request\"; signal: RequestSignal }\n | { kind: \"server-start\"; signal: ServerStartSignal }\n | { kind: \"trace\"; signal: TraceSignal }\n | { kind: \"web-vital\"; signal: WebVitalSignal };\n\nexport type InstrumentationHandler<T> = (signal: T) => void | Promise<void>;\n\nexport type InstrumentationOptions = {\n onEvent?: InstrumentationHandler<InstrumentationEvent>;\n request?: InstrumentationHandler<RequestSignal>;\n serverStart?: InstrumentationHandler<ServerStartSignal>;\n trace?: InstrumentationHandler<TraceSignal>;\n webVitals?: InstrumentationHandler<WebVitalSignal>;\n};\n\nexport type Instrumentation = {\n request: (signal: RequestSignal) => Promise<void>;\n serverStart: (signal?: ServerStartSignal) => Promise<void>;\n trace: (signal: TraceSignal) => Promise<void>;\n reportWebVitals: (signal: WebVitalSignal) => Promise<void>;\n};\n\nexport function defineInstrumentation(\n options: InstrumentationOptions = {},\n): Instrumentation {\n return {\n async request(signal) {\n await dispatch({ kind: \"request\", signal }, options);\n },\n async serverStart(signal = {}) {\n await dispatch({ kind: \"server-start\", signal }, options);\n },\n async trace(signal) {\n await dispatch({ kind: \"trace\", signal }, options);\n },\n async reportWebVitals(signal) {\n await dispatch({ kind: \"web-vital\", signal }, options);\n },\n };\n}\n\nasync function dispatch(\n event: InstrumentationEvent,\n options: InstrumentationOptions,\n) {\n await options.onEvent?.(event);\n\n if (event.kind === \"request\") {\n await options.request?.(event.signal);\n } else if (event.kind === \"server-start\") {\n await options.serverStart?.(event.signal);\n } else if (event.kind === \"trace\") {\n await options.trace?.(event.signal);\n } else {\n await options.webVitals?.(event.signal);\n }\n}\n"],"names":["defaultIdempotencyTtl","defaultMaximumEntries","createMemoryIdempotencyStore","options","now","defaultTtl","maximumEntries","defaultTtlMs","parseCacheDuration","entries","request","key","serializeCacheKey","currentTime","sweepExpiredIdempotencyEntries","existing","evictOldestCompletedIdempotencyEntry","value","entry","result","error","runIdempotentMutation","store","defineSitemap","renderSitemap","sitemap","renderSitemapEntry","defineRobots","defineOgImage","renderRobots","robots","lines","rule","userAgent","toArray","allow","disallow","renderOgImageSvg","image","width","height","background","foreground","title","clampText","subtitle","brand","validateOgImageDimensions","escapeXmlAttribute","escapeXml","line","renderOgImageResponse","formatLastModified","formatPriority","alternate","priority","maxLength","action","response","context","input","actionContext","run","resolveActionResult","actionInput","toResponse","page","defineMiddleware","middleware","webhook","rawBody","signature","verifyHmacSignature","suppliedSignature","algorithm","encoding","normalized","normalizeSignature","decodeSignature","configuredPrefix","trimmed","prefix","pair","binary","character","EnvValidationError","issues","formatEnvValidationError","defineEnvSchema","schema","validateEnv","source","values","variable","rawValue","booleanEnv","createVariable","enumEnv","integerEnv","parsed","secretEnv","parseString","stringEnv","urlEnv","url","env","sensitive","parse","createSecurityReportHandler","contentTypeResponse","enforceReportContentType","bodySizeResponse","enforceReportBodySize","limitRequestBody","payload","RequestBodyTooLargeError","reports","normalizeSecurityReports","index","supportedReportContentTypes","mediaType","contentLength","declaredSize","parseBodySize","isObject","validateUploads","formData","policy","files","totalSize","field","filePolicy","fieldFiles","isFile","file","validateFile","isAllowedFileType","type","allowedTypes","allowedType","checkWebSocketOrigin","origin","normalizedOrigin","normalizeOrigin","allowed","isAllowedOrigin","enforceWebSocketOrigin","allowedOrigin","originMatches","actualOrigin","schemeSeparator","authority","createFileRouter","manifest","createRouteManifest","navigationDataLoader","loadNavigationData","location","setLocation","useState","getCurrentLocation","match","setMatch","initialMatchPending","useRef","navigationSequence","useEffect","onPopState","cancelled","settled","sequence","controller","isCurrent","getMatchPathname","loadLoadingFallback","Loading","initialData","loadPageRoute","nextMatch","ErrorFallback","loadErrorFallback","router","useMemo","to","previous","next","scrollToHash","createElement","RouterContext","RouteRenderer","isHydratableMatch","root","fallback","HYDRATION_FALLBACK_ATTRIBUTE","hydrateFileRouter","readInitialRouteData","hydratable","Router","createRoot","hydrateRoot","resolveReactDomClient","HYDRATION_ROOT_ATTRIBUTE","module","client","Link","props","useRouter","href","jsx","event","shouldHandleLinkClick","NotFound","AppLoading","AppNotFound","BuiltInNotFound","children","Layout","errorStatus","data","layouts","path","pathname","pageElement","routeElement","RouteErrorBoundary","Component","previousProps","isHttpError","headers","NAVIGATION_DATA_HEADER","NAVIGATION_DATA_REQUEST","kind","NAVIGATION_DATA_RESPONSE","NAVIGATION_NOT_FOUND_RESPONSE","NAVIGATION_ERROR_RESPONSE","problem","readProblem","status","HTTP_ERROR_STATUSES","httpError","hash","id","createContext","useContext","defaultOptimizerPath","defineImages","isAllowedImageSource","src","classifyImageSource","planImageTransform","validateImageDimension","validateImageQuality","format","variants","normalizeVariantWidths","createOptimizerUrl","primaryVariant","variant","isAllowedRemoteImage","remotes","remote","matchesRemoteOrigin","matchesRemotePattern","pattern","matchesPathnamePattern","name","quality","widths","candidates","uniqueWidths","candidate","left","right","optimizerPath","params","font","defineFonts","fonts","fontPreloadLinks","definition","fontType","renderFontFaceCss","escapeCss","fontFormat","analytics","domain","normalizeDomain","endpointUrl","parseEndpoint","script","endpoint","defineInstrumentation","signal","dispatch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/data/idempotency.ts","../src/document/seo.ts","../src/route/action.ts","../src/route/page.ts","../src/route/middleware.ts","../src/route/webhook.ts","../src/security/cookies.ts","../src/security/env.ts","../src/security/report.ts","../src/security/upload.ts","../src/security/websocket.ts","../src/browser/file-router.tsx","../src/platform/image.tsx","../src/platform/analytics.ts","../src/platform/observability.ts","../src/platform/web-vitals.ts","../src/platform/web-vitals-client.ts"],"sourcesContent":["import {\n parseCacheDuration,\n serializeCacheKey,\n type CacheDuration,\n type CacheKey,\n} from \"./cache\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type IdempotencyRequest<TResult> = {\n fn: () => MaybePromise<TResult>;\n key: CacheKey;\n ttl?: CacheDuration;\n};\n\nexport type IdempotencyResult<TResult> = {\n key: string;\n replayed: boolean;\n value: TResult;\n};\n\nexport type IdempotencyStore = {\n run: <TResult>(\n request: IdempotencyRequest<TResult>,\n ) => Promise<IdempotencyResult<TResult>>;\n};\n\ntype IdempotencyEntry<TResult> = {\n expiresAt: number;\n pending: boolean;\n value: Promise<TResult>;\n};\n\nexport type MemoryIdempotencyStoreOptions = {\n defaultTtl?: CacheDuration;\n maximumEntries?: number;\n now?: () => number;\n};\n\nconst defaultIdempotencyTtl = \"24h\";\nconst defaultMaximumEntries = 10_000;\n\nexport function createMemoryIdempotencyStore(\n options: MemoryIdempotencyStoreOptions = {},\n): IdempotencyStore {\n const now = options.now ?? Date.now;\n const defaultTtl = options.defaultTtl ?? defaultIdempotencyTtl;\n const maximumEntries = options.maximumEntries ?? defaultMaximumEntries;\n\n if (!Number.isSafeInteger(maximumEntries) || maximumEntries <= 0) {\n throw new Error(\n \"Demiurge idempotency maximumEntries must be a positive integer.\",\n );\n }\n\n const defaultTtlMs = parseCacheDuration(defaultTtl);\n\n if (!Number.isFinite(defaultTtlMs)) {\n throw new Error(\"Demiurge idempotency defaultTtl must be finite.\");\n }\n\n const entries = new Map<string, IdempotencyEntry<unknown>>();\n\n return {\n async run<TResult>(request: IdempotencyRequest<TResult>) {\n const key = serializeCacheKey(request.key);\n const currentTime = now();\n sweepExpiredIdempotencyEntries(entries, currentTime);\n const existing = entries.get(key);\n\n if (existing && (existing.pending || existing.expiresAt > currentTime)) {\n // TYPE-EVIDENCE: the entry stores the promise from a request typed TResult. The cast restores that generic type.\n return {\n key,\n replayed: true,\n value: await (existing.value as Promise<TResult>),\n };\n }\n\n if (entries.size >= maximumEntries) {\n evictOldestCompletedIdempotencyEntry(entries);\n }\n\n if (entries.size >= maximumEntries) {\n throw new Error(\n \"Demiurge idempotency store is at capacity with in-flight mutations.\",\n );\n }\n\n const value = Promise.resolve().then(request.fn);\n const entry: IdempotencyEntry<TResult> = {\n expiresAt: Number.POSITIVE_INFINITY,\n pending: true,\n value,\n };\n\n entries.set(key, entry);\n\n try {\n const result = await value;\n entry.pending = false;\n entry.expiresAt = now() + parseCacheDuration(request.ttl ?? defaultTtl);\n\n return {\n key,\n replayed: false,\n value: result,\n };\n } catch (error) {\n if (entries.get(key) === entry) {\n entries.delete(key);\n }\n\n throw error;\n }\n },\n };\n}\n\nfunction sweepExpiredIdempotencyEntries(\n entries: Map<string, IdempotencyEntry<unknown>>,\n now: number,\n) {\n for (const [key, entry] of entries) {\n if (!entry.pending && entry.expiresAt <= now) {\n entries.delete(key);\n }\n }\n}\n\nfunction evictOldestCompletedIdempotencyEntry(\n entries: Map<string, IdempotencyEntry<unknown>>,\n) {\n for (const [key, entry] of entries) {\n if (!entry.pending) {\n entries.delete(key);\n return;\n }\n }\n}\n\nexport function runIdempotentMutation<TResult>(\n store: IdempotencyStore,\n request: IdempotencyRequest<TResult>,\n) {\n return store.run(request);\n}\n","export type SitemapChangeFrequency =\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n\nexport type SitemapAlternate = {\n href: string;\n hrefLang: string;\n};\n\nexport type SitemapEntry = {\n alternates?: readonly SitemapAlternate[];\n changeFrequency?: SitemapChangeFrequency;\n lastModified?: Date | string;\n priority?: number;\n url: string;\n};\n\nexport type Sitemap = {\n entries: readonly SitemapEntry[];\n};\n\nexport type RobotsDirective = {\n allow?: string | readonly string[];\n disallow?: string | readonly string[];\n userAgent: string | readonly string[];\n};\n\nexport type Robots = {\n host?: string;\n rules?: readonly RobotsDirective[];\n sitemap?: string | readonly string[];\n};\n\nexport type OgImage = {\n background?: string;\n brand?: string;\n foreground?: string;\n height?: number;\n subtitle?: string;\n title: string;\n width?: number;\n};\n\nexport function defineSitemap(entries: readonly SitemapEntry[]): Sitemap {\n return {\n entries,\n };\n}\n\nexport function renderSitemap(sitemap: Sitemap) {\n const hasAlternates = sitemap.entries.some((entry) => entry.alternates?.length);\n\n return [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n `<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"${hasAlternates ? ' xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"' : \"\"}>`,\n ...sitemap.entries.map(renderSitemapEntry),\n \"</urlset>\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport function defineRobots(options: Robots): Robots {\n return options;\n}\n\nexport function defineOgImage(options: OgImage): OgImage {\n return options;\n}\n\nexport function renderRobots(robots: Robots) {\n const lines: string[] = [];\n\n for (const rule of robots.rules ?? []) {\n for (const userAgent of toArray(rule.userAgent)) {\n lines.push(`User-agent: ${userAgent}`);\n }\n\n for (const allow of toArray(rule.allow)) {\n lines.push(`Allow: ${allow}`);\n }\n\n for (const disallow of toArray(rule.disallow)) {\n lines.push(`Disallow: ${disallow}`);\n }\n\n lines.push(\"\");\n }\n\n if (robots.host) {\n lines.push(`Host: ${robots.host}`);\n }\n\n for (const sitemap of toArray(robots.sitemap)) {\n lines.push(`Sitemap: ${sitemap}`);\n }\n\n return `${lines.join(\"\\n\").replace(/\\n+$/, \"\")}\\n`;\n}\n\nexport function renderOgImageSvg(image: OgImage) {\n const width = image.width ?? 1200;\n const height = image.height ?? 630;\n const background = image.background ?? \"#101820\";\n const foreground = image.foreground ?? \"#ffffff\";\n const title = clampText(image.title, 120);\n const subtitle = image.subtitle ? clampText(image.subtitle, 160) : undefined;\n const brand = image.brand ? clampText(image.brand, 80) : undefined;\n\n validateOgImageDimensions(width, height);\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\" role=\"img\" aria-label=\"${escapeXmlAttribute(title)}\">`,\n ` <rect width=\"100%\" height=\"100%\" fill=\"${escapeXmlAttribute(background)}\" />`,\n brand\n ? ` <text x=\"72\" y=\"96\" fill=\"${escapeXmlAttribute(foreground)}\" font-family=\"Inter, ui-sans-serif, system-ui, sans-serif\" font-size=\"32\" font-weight=\"700\">${escapeXml(brand)}</text>`\n : null,\n ` <text x=\"72\" y=\"${subtitle ? 300 : 340}\" fill=\"${escapeXmlAttribute(foreground)}\" font-family=\"Inter, ui-sans-serif, system-ui, sans-serif\" font-size=\"76\" font-weight=\"800\">${escapeXml(title)}</text>`,\n subtitle\n ? ` <text x=\"72\" y=\"392\" fill=\"${escapeXmlAttribute(foreground)}\" fill-opacity=\"0.78\" font-family=\"Inter, ui-sans-serif, system-ui, sans-serif\" font-size=\"38\" font-weight=\"500\">${escapeXml(subtitle)}</text>`\n : null,\n \"</svg>\",\n ].filter((line): line is string => Boolean(line)).join(\"\\n\");\n}\n\nexport function renderOgImageResponse(image: OgImage) {\n return new Response(renderOgImageSvg(image), {\n headers: {\n \"cache-control\": \"public, max-age=31536000, immutable\",\n \"content-type\": \"image/svg+xml; charset=utf-8\",\n },\n });\n}\n\nfunction renderSitemapEntry(entry: SitemapEntry) {\n return [\n \" <url>\",\n ` <loc>${escapeXml(entry.url)}</loc>`,\n entry.lastModified\n ? ` <lastmod>${escapeXml(formatLastModified(entry.lastModified))}</lastmod>`\n : null,\n entry.changeFrequency\n ? ` <changefreq>${entry.changeFrequency}</changefreq>`\n : null,\n entry.priority !== undefined\n ? ` <priority>${formatPriority(entry.priority)}</priority>`\n : null,\n ...(entry.alternates ?? []).map(\n (alternate) =>\n ` <xhtml:link rel=\"alternate\" hreflang=\"${escapeXmlAttribute(alternate.hrefLang)}\" href=\"${escapeXmlAttribute(alternate.href)}\" />`,\n ),\n \" </url>\",\n ].filter((line): line is string => Boolean(line)).join(\"\\n\");\n}\n\nfunction formatLastModified(value: Date | string) {\n return value instanceof Date ? value.toISOString() : value;\n}\n\nfunction formatPriority(priority: number) {\n if (priority < 0 || priority > 1) {\n throw new Error(\"Sitemap entry priority must be between 0 and 1.\");\n }\n\n return String(priority);\n}\n\nfunction toArray<T>(value: T | readonly T[] | undefined) {\n if (value === undefined) {\n return [];\n }\n\n return Array.isArray(value) ? value : [value];\n}\n\nfunction escapeXml(value: string) {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nfunction escapeXmlAttribute(value: string) {\n return escapeXml(value)\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nfunction clampText(value: string, maxLength: number) {\n return value.length > maxLength ? `${value.slice(0, maxLength - 3)}...` : value;\n}\n\nfunction validateOgImageDimensions(width: number, height: number) {\n if (!Number.isSafeInteger(width) || width <= 0) {\n throw new Error(\"OG image width must be a positive integer.\");\n }\n\n if (!Number.isSafeInteger(height) || height <= 0) {\n throw new Error(\"OG image height must be a positive integer.\");\n }\n}\n","import type {\n CacheDuration,\n CacheKey,\n IdempotencyStore,\n} from \"../data\";\nimport type {\n CorsPolicy,\n RouteSecurityPolicy,\n} from \"../security\";\nimport type {\n HttpRouteContext,\n MaybePromise,\n ResponseCapability,\n RouteRequestContextFor,\n ServerTimingInput,\n} from \"./types\";\nimport { response, toResponse } from \"./response\";\n\nexport type ActionInput<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n> = (\n context: HttpRouteContext<TPath, TValues>,\n) => MaybePromise<TInput>;\n\nexport type ActionContext<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n> = HttpRouteContext<TPath, TValues> & {\n input: TInput;\n};\n\nexport type ActionIdempotency<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n> = {\n key: CacheKey | ((context: ActionContext<TInput, TPath, TValues>) => CacheKey);\n store: IdempotencyStore;\n ttl?: CacheDuration;\n};\n\nexport type ActionOptions<\n TInput,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n> = {\n cors?: CorsPolicy;\n handler: (\n context: ActionContext<TInput, TPath, TValues>,\n ) => MaybePromise<Response | ResponseCapability<TPath, TValues>>;\n idempotency?: ActionIdempotency<TInput, TPath, TValues>;\n input?: ActionInput<TInput, TPath, TValues>;\n security?: RouteSecurityPolicy;\n timing?: ServerTimingInput;\n};\n\nexport function action<\n TInput = undefined,\n TPath extends string = string,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n options: ActionOptions<TInput, TPath, TValues>,\n) {\n return response<TPath, TValues>(\n async (context) => {\n // TYPE-EVIDENCE: the input defaults to undefined when the caller did not provide a parser. The cast labels that fallback as TInput.\n const input = options.input\n ? await options.input(context)\n : undefined as TInput;\n const actionContext: ActionContext<TInput, TPath, TValues> = {\n ...context,\n input,\n };\n const run = async () => await resolveActionResult(\n await options.handler(actionContext),\n context,\n );\n\n if (!options.idempotency) {\n return await run();\n }\n\n const key = typeof options.idempotency.key === \"function\"\n ? options.idempotency.key(actionContext)\n : options.idempotency.key;\n const result = await options.idempotency.store.run({\n fn: run,\n key,\n ttl: options.idempotency.ttl,\n });\n\n return result.value;\n },\n {\n cors: options.cors,\n security: options.security,\n timing: options.timing,\n },\n );\n}\n\nexport const actionInput = {\n async formData({ request }: HttpRouteContext) {\n return await request.formData();\n },\n async json({ request }: HttpRouteContext) {\n // TYPE-EVIDENCE: the request body is JSON and the caller parses it to a known type. The cast widens the parsed value to unknown.\n return await request.json() as unknown;\n },\n async text({ request }: HttpRouteContext) {\n return await request.text();\n },\n};\n\nasync function resolveActionResult<\n TPath extends string,\n TValues extends object,\n>(\n result: Response | ResponseCapability<TPath, TValues>,\n context: HttpRouteContext<TPath, TValues>,\n) {\n if (result instanceof Response) {\n return result;\n }\n\n return await toResponse(result, context);\n}\n","import type { ComponentType } from \"react\";\nimport type {\n PageCapability,\n PageOptions,\n RouteProps,\n RouteRequestContextFor,\n} from \"./types\";\n\nexport function page<const TPath extends string = string>(\n options: ComponentType<RouteProps<TPath>>,\n): PageCapability<TPath>;\nexport function page<\n const TPath extends string = string,\n TData = undefined,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n options: PageOptions<TPath, TData, TValues>,\n): PageCapability<TPath, TData, TValues>;\nexport function page<\n const TPath extends string = string,\n TData = undefined,\n TValues extends object = RouteRequestContextFor<TPath>,\n>(\n options: PageOptions<TPath, TData, TValues> | ComponentType<RouteProps<TPath>>,\n): PageCapability<TPath, TData, TValues> | PageCapability<TPath> {\n if (typeof options === \"function\") {\n return {\n kind: \"page\",\n render: { mode: \"ssr\" },\n view: options,\n } satisfies PageCapability<TPath>;\n }\n\n // TYPE-EVIDENCE: the object literal carries the fields that the page capability type requires. The cast asserts that structural match.\n return {\n data: options.data,\n kind: \"page\",\n layout: options.layout,\n render: options.render ?? { mode: \"ssr\" },\n view: options.view,\n } as PageCapability<TPath, TData, TValues>;\n}\n","import type {\n HttpRouteContext,\n MaybePromise,\n MiddlewareContextContribution,\n RouteMiddleware,\n RouteMiddlewareNext,\n} from \"./types\";\n\n/**\n * Declares the request-context values that a middleware can read and write.\n * The framework passes one carrier to every inherited middleware in a request.\n */\nexport function defineMiddleware<TValues extends object>(\n middleware: (\n context: HttpRouteContext<string, TValues>,\n next: RouteMiddlewareNext,\n ) => MaybePromise<Response>,\n): RouteMiddleware<string, TValues> & MiddlewareContextContribution<TValues> {\n // TYPE-EVIDENCE: the middleware function matches the declared route middleware signature. The cast adds the context contribution marker type.\n return middleware as RouteMiddleware<string, TValues> &\n MiddlewareContextContribution<TValues>;\n}\n","import type {\n HttpRouteContext,\n MaybePromise,\n RawResponseCapability,\n} from \"./types\";\n\nexport type WebhookHmacEncoding = \"base64\" | \"hex\";\nexport type WebhookHmacAlgorithm = \"SHA-256\" | \"SHA-384\" | \"SHA-512\";\n\nexport type WebhookHmacContext = HttpRouteContext & {\n rawBody: Uint8Array;\n text: () => string;\n};\n\nexport type WebhookHmacOptions = {\n algorithm?: WebhookHmacAlgorithm;\n encoding?: WebhookHmacEncoding;\n handler: (context: WebhookHmacContext) => MaybePromise<Response>;\n header?: string;\n prefix?: false | string;\n secret: string;\n};\n\nexport const webhook = {\n hmac(options: WebhookHmacOptions) {\n return {\n kind: \"response\",\n response: async (context) => {\n const rawBody = new Uint8Array(await context.request.arrayBuffer());\n const signature = context.request.headers.get(\n options.header ?? \"x-webhook-signature\",\n );\n\n if (!signature) {\n return new Response(\"Missing webhook signature.\", {\n status: 401,\n });\n }\n\n if (!(await verifyHmacSignature(rawBody, signature, options))) {\n return new Response(\"Invalid webhook signature.\", {\n status: 401,\n });\n }\n\n return await options.handler({\n ...context,\n rawBody,\n text: () => new TextDecoder().decode(rawBody),\n });\n },\n security: {\n csrf: false,\n },\n } satisfies RawResponseCapability;\n },\n};\n\nasync function verifyHmacSignature(\n rawBody: Uint8Array,\n suppliedSignature: string,\n options: WebhookHmacOptions,\n) {\n const algorithm = options.algorithm ?? \"SHA-256\";\n const encoding = options.encoding ?? \"hex\";\n const normalized = normalizeSignature(\n suppliedSignature,\n algorithm,\n options.prefix,\n );\n const signature = decodeSignature(normalized, encoding);\n\n if (!signature) {\n return false;\n }\n\n const key = await globalThis.crypto.subtle.importKey(\n \"raw\",\n new TextEncoder().encode(options.secret),\n {\n hash: algorithm,\n name: \"HMAC\",\n },\n false,\n [\"verify\"],\n );\n return await globalThis.crypto.subtle.verify(\n \"HMAC\",\n key,\n signature,\n Uint8Array.from(rawBody).buffer,\n );\n}\n\nfunction normalizeSignature(\n signature: string,\n algorithm: WebhookHmacAlgorithm,\n configuredPrefix: false | string | undefined,\n) {\n const trimmed = signature.trim();\n const prefix =\n configuredPrefix === undefined\n ? `${algorithm.toLowerCase().replace(\"-\", \"\")}=`\n : configuredPrefix;\n\n if (prefix !== false && trimmed.startsWith(prefix)) {\n return trimmed.slice(prefix.length).trim();\n }\n\n return trimmed;\n}\n\nfunction decodeSignature(value: string, encoding: WebhookHmacEncoding) {\n if (encoding === \"hex\") {\n if (!/^(?:[0-9a-f]{2})+$/i.test(value)) {\n return null;\n }\n\n return Uint8Array.from(value.match(/.{2}/g) ?? [], (pair) =>\n Number.parseInt(pair, 16),\n );\n }\n\n if (\n !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n )\n ) {\n return null;\n }\n\n try {\n const binary =\n typeof atob === \"function\"\n ? atob(value)\n : Buffer.from(value, \"base64\").toString(\"binary\");\n\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\n } catch {\n return null;\n }\n}\n","import { parseCookieHeader } from \"./csrf\";\n\n// Cookie prefixes are the one cookie control that the browser enforces without\n// server cooperation. A browser refuses a `__Host-` cookie that lacks `Secure`,\n// that lacks `Path=/`, or that carries a `Domain` attribute. A browser also\n// refuses a `__Secure-` cookie that lacks `Secure`. A refused cookie is\n// dropped without a network error, so a mistake looks like a lost session\n// rather than a policy failure. These helpers make the invariants explicit and\n// report a violation before the response leaves the server.\nexport type CookieScope = \"host\" | \"none\" | \"secure\";\n\nexport type CookieSameSite = \"Lax\" | \"None\" | \"Strict\";\n\nexport type SecureCookieDeclaration = {\n domain?: string;\n expires?: Date;\n httpOnly?: boolean;\n maxAge?: number;\n name: string;\n path?: string;\n sameSite?: CookieSameSite;\n scope?: CookieScope;\n secure?: boolean;\n value: string;\n};\n\n// The part of a declaration that determines a cookie's identity rather than\n// one write's payload. An application declares this once, in a module both\n// the route and the client bundle import. It spreads the definition into\n// `createSecureCookie({ ...definition, value })` on the server, and passes it\n// straight to `readSecureCookie(definition)` on the client. Neither side\n// retypes the name or the scope, so a rename in one place changes both.\nexport type SecureCookieDefinition = Omit<SecureCookieDeclaration, \"value\">;\n\nexport type CookieIssueCode =\n | \"cookie-domain-not-allowed\"\n | \"cookie-max-age-invalid\"\n | \"cookie-name-carries-prefix\"\n | \"cookie-name-invalid\"\n | \"cookie-path-not-allowed\"\n | \"cookie-same-site-none-requires-secure\"\n | \"cookie-scope-requires-secure\"\n | \"cookie-too-large\";\n\nexport type CookieIssue = {\n code: CookieIssueCode;\n message: string;\n name: string;\n};\n\nconst namePattern = /^[!#$%&'*+\\-.^_`|~A-Za-z0-9]+$/;\nconst prefixes: Record<CookieScope, string> = {\n host: \"__Host-\",\n none: \"\",\n secure: \"__Secure-\",\n};\n// Browsers keep about 4096 bytes for one cookie, including the name, the value,\n// and the attributes. A larger cookie is dropped without a report.\nconst maxCookieBytes = 4096;\n\nexport function secureCookieName(name: string, scope: CookieScope = \"host\") {\n return `${prefixes[scope]}${name}`;\n}\n\nexport function validateSecureCookie(\n declaration: SecureCookieDeclaration,\n): CookieIssue[] {\n const scope = declaration.scope ?? \"host\";\n const name = secureCookieName(declaration.name, scope);\n const issues: CookieIssue[] = [];\n const report = (code: CookieIssueCode, message: string) => {\n issues.push({ code, message, name });\n };\n\n if (!namePattern.test(declaration.name)) {\n report(\n \"cookie-name-invalid\",\n `Cookie name ${JSON.stringify(declaration.name)} contains a character that a cookie name cannot hold. Use letters, digits, or the token characters that RFC 6265 allows.`,\n );\n }\n\n // Demiurge adds the prefix from the declared scope. A name that already holds\n // a prefix is reported, because a silent rename would change the cookie that\n // the application reads back.\n if (\n declaration.name.startsWith(\"__Host-\") ||\n declaration.name.startsWith(\"__Secure-\")\n ) {\n report(\n \"cookie-name-carries-prefix\",\n `Cookie name ${JSON.stringify(declaration.name)} already carries a prefix. Remove the prefix from name and declare scope ${JSON.stringify(scope === \"none\" ? \"host\" : scope)} instead.`,\n );\n }\n\n if (scope !== \"none\" && declaration.secure === false) {\n report(\n \"cookie-scope-requires-secure\",\n `Cookie ${name} uses scope ${JSON.stringify(scope)}, so it requires Secure. Remove secure: false, or declare scope \"none\" for a cookie that a browser must accept over plain HTTP.`,\n );\n }\n\n if (scope === \"host\" && declaration.domain !== undefined) {\n report(\n \"cookie-domain-not-allowed\",\n `Cookie ${name} uses scope \"host\", so it cannot carry a Domain attribute. Remove domain, or declare scope \"secure\" to share the cookie with subdomains.`,\n );\n }\n\n if (scope === \"host\" && declaration.path !== undefined && declaration.path !== \"/\") {\n report(\n \"cookie-path-not-allowed\",\n `Cookie ${name} uses scope \"host\", so it requires Path=/. Remove path, or declare scope \"secure\" for a cookie that a path must limit.`,\n );\n }\n\n if (declaration.sameSite === \"None\" && declaration.secure === false) {\n report(\n \"cookie-same-site-none-requires-secure\",\n `Cookie ${name} declares SameSite=None, so it requires Secure. Remove secure: false, or declare a SameSite policy of \"Lax\" or \"Strict\".`,\n );\n }\n\n if (\n declaration.maxAge !== undefined &&\n (!Number.isInteger(declaration.maxAge) || declaration.maxAge < 0)\n ) {\n report(\n \"cookie-max-age-invalid\",\n `Cookie ${name} declares maxAge ${JSON.stringify(declaration.maxAge)}. Use a whole number of seconds that is zero or greater.`,\n );\n }\n\n if (issues.length === 0) {\n const size = new TextEncoder().encode(serialize(declaration, scope, name)).length;\n\n if (size > maxCookieBytes) {\n report(\n \"cookie-too-large\",\n `Cookie ${name} serializes to ${size} bytes, and a browser drops a cookie above ${maxCookieBytes} bytes. Store the payload on the server and keep an identifier in the cookie.`,\n );\n }\n }\n\n return issues;\n}\n\n// A page reads a cookie only where the application chose `httpOnly: false`.\n// This helper computes the same prefixed name `createSecureCookie` wrote, so\n// browser code never hardcodes a `__Host-`/`__Secure-` prefix by hand.\n// Pass the same `SecureCookieDefinition` the route spread into\n// `createSecureCookie(...)`. A rename or a scope change in that declaration\n// then reaches both the write and the read. A bare name is also accepted for\n// a cookie with no shared definition. Returns `undefined` outside a browser\n// and for a cookie that is absent.\nexport function readSecureCookie(\n reference: SecureCookieDefinition | string,\n scope: CookieScope = \"host\",\n) {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n const definition: SecureCookieDefinition =\n typeof reference === \"string\" ? { name: reference, scope } : reference;\n\n return parseCookieHeader(document.cookie).get(\n secureCookieName(definition.name, definition.scope ?? \"host\"),\n );\n}\n\nexport function createSecureCookie(declaration: SecureCookieDeclaration) {\n const issues = validateSecureCookie(declaration);\n\n if (issues.length > 0) {\n throw new Error(\n `Demiurge rejected a cookie declaration. ${issues.map((issue) => issue.message).join(\" \")}`,\n );\n }\n\n const scope = declaration.scope ?? \"host\";\n\n return serialize(declaration, scope, secureCookieName(declaration.name, scope));\n}\n\nfunction serialize(\n declaration: SecureCookieDeclaration,\n scope: CookieScope,\n name: string,\n) {\n // The defaults carry the safe answer. A session cookie stays out of page\n // script, stays on the origin that set it, and travels only over HTTPS. An\n // application opts out of one default at a time, and the opt-out stays\n // visible in the route source.\n const attributes = [`${name}=${encodeURIComponent(declaration.value)}`];\n const path = scope === \"host\" ? \"/\" : declaration.path ?? \"/\";\n\n attributes.push(`Path=${path}`);\n\n if (scope !== \"host\" && declaration.domain !== undefined) {\n attributes.push(`Domain=${declaration.domain}`);\n }\n\n if (declaration.expires) {\n attributes.push(`Expires=${declaration.expires.toUTCString()}`);\n }\n\n if (declaration.maxAge !== undefined) {\n attributes.push(`Max-Age=${declaration.maxAge}`);\n }\n\n attributes.push(`SameSite=${declaration.sameSite ?? \"Lax\"}`);\n\n // A JavaScript-readable cookie is the narrow exception. The double-submit\n // CSRF token is the one case that needs it, because page script must copy the\n // token into a request header.\n if (declaration.httpOnly ?? true) {\n attributes.push(\"HttpOnly\");\n }\n\n if (scope !== \"none\" || (declaration.secure ?? true)) {\n attributes.push(\"Secure\");\n }\n\n return attributes.join(\"; \");\n}\n","export type EnvSource = Record<string, string | undefined>;\n\nexport type EnvValidationIssue = {\n code: \"invalid\" | \"missing\";\n key: string;\n message: string;\n};\n\nexport class EnvValidationError extends Error {\n issues: EnvValidationIssue[];\n\n constructor(issues: EnvValidationIssue[]) {\n super(formatEnvValidationError(issues));\n this.name = \"EnvValidationError\";\n this.issues = issues;\n }\n}\n\nexport type EnvVariable<T, Optional extends boolean = false> = {\n optional: Optional;\n parse: (key: string, value: string) => T;\n sensitive: boolean;\n};\n\nexport type EnvSchema = Record<string, EnvVariable<unknown, boolean>>;\n\nexport type InferEnvSchema<Schema extends EnvSchema> = {\n [Key in keyof Schema]: Schema[Key] extends EnvVariable<infer Value, infer Optional>\n ? Optional extends true\n ? Value | undefined\n : Value\n : never;\n};\n\ntype RequiredEnvVariableOptions = {\n optional?: false;\n};\n\ntype OptionalEnvVariableOptions = {\n optional: true;\n};\n\ntype EnvVariableOptions = RequiredEnvVariableOptions | OptionalEnvVariableOptions;\n\ntype RequiredStringEnvOptions = RequiredEnvVariableOptions & {\n minLength?: number;\n};\n\ntype OptionalStringEnvOptions = OptionalEnvVariableOptions & {\n minLength?: number;\n};\n\ntype StringEnvOptions = RequiredStringEnvOptions | OptionalStringEnvOptions;\n\ntype RequiredUrlEnvOptions = RequiredEnvVariableOptions & {\n protocols?: readonly string[];\n};\n\ntype OptionalUrlEnvOptions = OptionalEnvVariableOptions & {\n protocols?: readonly string[];\n};\n\ntype UrlEnvOptions = RequiredUrlEnvOptions | OptionalUrlEnvOptions;\n\ntype RequiredIntegerEnvOptions = RequiredEnvVariableOptions & {\n max?: number;\n min?: number;\n};\n\ntype OptionalIntegerEnvOptions = OptionalEnvVariableOptions & {\n max?: number;\n min?: number;\n};\n\ntype IntegerEnvOptions = RequiredIntegerEnvOptions | OptionalIntegerEnvOptions;\n\nexport function defineEnvSchema<Schema extends EnvSchema>(schema: Schema) {\n return schema;\n}\n\nexport function validateEnv<Schema extends EnvSchema>(\n schema: Schema,\n source: EnvSource,\n): InferEnvSchema<Schema> {\n const issues: EnvValidationIssue[] = [];\n const values: Partial<Record<keyof Schema, unknown>> = {};\n\n // TYPE-EVIDENCE: Object.keys returns the schema keys as strings. The cast narrows them to the schema key type because they come from the schema.\n for (const key of Object.keys(schema) as Array<keyof Schema>) {\n const variable = schema[key];\n const rawValue = source[String(key)];\n\n if (rawValue === undefined || rawValue === \"\") {\n if (variable.optional) {\n values[key] = undefined;\n continue;\n }\n\n issues.push({\n code: \"missing\",\n key: String(key),\n message: `Environment variable ${String(key)} is required.`,\n });\n continue;\n }\n\n try {\n values[key] = variable.parse(String(key), rawValue);\n } catch (error) {\n issues.push({\n code: \"invalid\",\n key: String(key),\n message: error instanceof Error\n ? error.message\n : `Environment variable ${String(key)} is invalid.`,\n });\n }\n }\n\n if (issues.length) {\n throw new EnvValidationError(issues);\n }\n\n // TYPE-EVIDENCE: the loop above populated values from the validated schema entries. The cast restores the inferred schema type.\n return values as InferEnvSchema<Schema>;\n}\n\nfunction booleanEnv(options: OptionalEnvVariableOptions): EnvVariable<boolean, true>;\nfunction booleanEnv(options?: RequiredEnvVariableOptions): EnvVariable<boolean, false>;\nfunction booleanEnv(options: EnvVariableOptions = {}) {\n return createVariable(options, false, (key, value) => {\n if (value === \"true\" || value === \"1\") {\n return true;\n }\n\n if (value === \"false\" || value === \"0\") {\n return false;\n }\n\n throw new Error(`Environment variable ${key} must be true, false, 1, or 0.`);\n });\n}\n\nfunction enumEnv<const Values extends readonly [string, ...string[]]>(\n values: Values,\n options: OptionalEnvVariableOptions,\n): EnvVariable<Values[number], true>;\nfunction enumEnv<const Values extends readonly [string, ...string[]]>(\n values: Values,\n options?: RequiredEnvVariableOptions,\n): EnvVariable<Values[number], false>;\nfunction enumEnv<const Values extends readonly [string, ...string[]]>(\n values: Values,\n options: EnvVariableOptions = {},\n) {\n return createVariable(options, false, (key, value) => {\n if (values.includes(value)) {\n return value;\n }\n\n throw new Error(\n `Environment variable ${key} must be one of: ${values.join(\", \")}.`,\n );\n });\n}\n\nfunction integerEnv(options: OptionalIntegerEnvOptions): EnvVariable<number, true>;\nfunction integerEnv(options?: RequiredIntegerEnvOptions): EnvVariable<number, false>;\nfunction integerEnv(options: IntegerEnvOptions = {}) {\n return createVariable(options, false, (key, value) => {\n if (!/^-?\\d+$/.test(value)) {\n throw new Error(`Environment variable ${key} must be an integer.`);\n }\n\n const parsed = Number(value);\n\n if (!Number.isSafeInteger(parsed)) {\n throw new Error(`Environment variable ${key} must be a safe integer.`);\n }\n\n if (options.min !== undefined && parsed < options.min) {\n throw new Error(\n `Environment variable ${key} must be greater than or equal to ${options.min}.`,\n );\n }\n\n if (options.max !== undefined && parsed > options.max) {\n throw new Error(\n `Environment variable ${key} must be less than or equal to ${options.max}.`,\n );\n }\n\n return parsed;\n });\n}\n\nfunction secretEnv(options: OptionalStringEnvOptions): EnvVariable<string, true>;\nfunction secretEnv(options?: RequiredStringEnvOptions): EnvVariable<string, false>;\nfunction secretEnv(options: StringEnvOptions = {}) {\n return createVariable(options, true, (key, value) =>\n parseString(key, value, options),\n );\n}\n\nfunction stringEnv(options: OptionalStringEnvOptions): EnvVariable<string, true>;\nfunction stringEnv(options?: RequiredStringEnvOptions): EnvVariable<string, false>;\nfunction stringEnv(options: StringEnvOptions = {}) {\n return createVariable(options, false, (key, value) =>\n parseString(key, value, options),\n );\n}\n\nfunction urlEnv(options: OptionalUrlEnvOptions): EnvVariable<URL, true>;\nfunction urlEnv(options?: RequiredUrlEnvOptions): EnvVariable<URL, false>;\nfunction urlEnv(options: UrlEnvOptions = {}) {\n return createVariable(options, false, (key, value) => {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(`Environment variable ${key} must be a valid URL.`);\n }\n\n if (\n options.protocols?.length &&\n !options.protocols.includes(url.protocol)\n ) {\n throw new Error(\n `Environment variable ${key} must use one of these protocols: ${options.protocols.join(\", \")}.`,\n );\n }\n\n return url;\n });\n}\n\nexport const env = {\n boolean: booleanEnv,\n enum: enumEnv,\n integer: integerEnv,\n secret: secretEnv,\n string: stringEnv,\n url: urlEnv,\n};\n\nfunction createVariable<T>(\n options: EnvVariableOptions,\n sensitive: boolean,\n parse: (key: string, value: string) => T,\n): EnvVariable<T, boolean> {\n return {\n optional: options.optional ?? false,\n parse,\n sensitive,\n };\n}\n\nfunction parseString(\n key: string,\n value: string,\n options: StringEnvOptions,\n) {\n if (options.minLength !== undefined && value.length < options.minLength) {\n throw new Error(\n `Environment variable ${key} must be at least ${options.minLength} characters.`,\n );\n }\n\n return value;\n}\n\nfunction formatEnvValidationError(issues: EnvValidationIssue[]) {\n if (issues.length === 1) {\n return issues[0].message;\n }\n\n return `Environment validation failed with ${issues.length} issues.`;\n}\n","import {\n limitRequestBody,\n parseBodySize,\n RequestBodyTooLargeError,\n} from \"./request\";\n\ntype MaybePromise<T> = Promise<T> | T;\n\nexport type SecurityReportPayload = unknown;\n\nexport type SecurityReportHandlerOptions = {\n maxBodySize?: number | `${number}${\"b\" | \"gb\" | \"kb\" | \"mb\"}`;\n onReport?: (\n report: SecurityReportPayload,\n context: SecurityReportContext,\n ) => MaybePromise<void>;\n};\n\nexport type SecurityReportContext = {\n index: number;\n request: Request;\n};\n\nexport function createSecurityReportHandler(\n options: SecurityReportHandlerOptions = {},\n) {\n return async function handleSecurityReport(request: Request) {\n if (request.method.toUpperCase() !== \"POST\") {\n return new Response(null, {\n headers: {\n allow: \"POST\",\n },\n status: 405,\n });\n }\n\n const contentTypeResponse = enforceReportContentType(request);\n\n if (contentTypeResponse) {\n return contentTypeResponse;\n }\n\n const bodySizeResponse = enforceReportBodySize(options, request);\n\n if (bodySizeResponse) {\n return bodySizeResponse;\n }\n\n if (options.maxBodySize !== undefined) {\n request = limitRequestBody({ maxBodySize: options.maxBodySize }, request);\n }\n\n let payload: unknown;\n\n try {\n payload = await request.json();\n } catch (error) {\n if (error instanceof RequestBodyTooLargeError) {\n return new Response(\"Security report body too large.\", { status: 413 });\n }\n\n return new Response(\"Invalid security report JSON.\", {\n status: 400,\n });\n }\n\n const reports = normalizeSecurityReports(payload);\n\n for (let index = 0; index < reports.length; index += 1) {\n await options.onReport?.(reports[index], {\n index,\n request,\n });\n }\n\n return new Response(null, {\n status: 204,\n });\n };\n}\n\nconst supportedReportContentTypes = new Set([\n \"application/csp-report\",\n \"application/reports+json\",\n]);\n\nfunction enforceReportContentType(request: Request) {\n const value = request.headers.get(\"content-type\");\n\n // Keep direct/programmatic calls compatible. Browser-generated reports\n // always send one of the two media types below.\n if (!value) {\n return null;\n }\n\n const mediaType = value.split(\";\", 1)[0]?.trim().toLowerCase();\n\n if (mediaType && supportedReportContentTypes.has(mediaType)) {\n return null;\n }\n\n return new Response(\"Unsupported security report Content-Type.\", {\n status: 415,\n });\n}\n\nfunction enforceReportBodySize(\n options: SecurityReportHandlerOptions,\n request: Request,\n) {\n if (options.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 if (!/^\\d+$/.test(contentLength)) {\n return new Response(\"Invalid Content-Length.\", {\n status: 400,\n });\n }\n\n const declaredSize = Number(contentLength);\n\n if (!Number.isSafeInteger(declaredSize)) {\n return new Response(\"Invalid Content-Length.\", {\n status: 400,\n });\n }\n\n if (declaredSize > parseBodySize(options.maxBodySize)) {\n return new Response(\"Security report body too large.\", {\n status: 413,\n });\n }\n\n return null;\n}\n\nfunction normalizeSecurityReports(payload: unknown) {\n if (Array.isArray(payload)) {\n return payload;\n }\n\n if (isObject(payload) && \"csp-report\" in payload) {\n return [payload[\"csp-report\"]];\n }\n\n return [payload];\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","import { parseBodySize } from \"./request\";\nimport type { RequestSecurityPolicy } from \"./types\";\n\nexport type UploadFilePolicy = {\n maxSize?: RequestSecurityPolicy[\"maxBodySize\"];\n required?: boolean;\n types?: readonly string[];\n};\n\nexport type UploadPolicy = {\n files: Record<string, UploadFilePolicy>;\n maxTotalSize?: RequestSecurityPolicy[\"maxBodySize\"];\n};\n\nexport type UploadValidationIssue = {\n code:\n | \"file-missing\"\n | \"file-too-large\"\n | \"file-type-not-allowed\"\n | \"total-upload-too-large\";\n field: string;\n message: string;\n};\n\nexport type UploadValidationResult = {\n files: Record<string, File[]>;\n issues: UploadValidationIssue[];\n ok: boolean;\n totalSize: number;\n};\n\nexport function validateUploads(\n formData: FormData,\n policy: UploadPolicy,\n): UploadValidationResult {\n const files: Record<string, File[]> = {};\n const issues: UploadValidationIssue[] = [];\n let totalSize = 0;\n\n for (const [field, filePolicy] of Object.entries(policy.files)) {\n const fieldFiles = formData.getAll(field).filter(isFile);\n files[field] = fieldFiles;\n\n if (filePolicy.required && fieldFiles.length === 0) {\n issues.push({\n code: \"file-missing\",\n field,\n message: `Upload field ${field} requires at least one file.`,\n });\n }\n\n for (const file of fieldFiles) {\n totalSize += file.size;\n validateFile(field, file, filePolicy, issues);\n }\n }\n\n if (\n policy.maxTotalSize !== undefined &&\n totalSize > parseBodySize(policy.maxTotalSize)\n ) {\n issues.push({\n code: \"total-upload-too-large\",\n field: \"*\",\n message: `Uploaded files exceed the maximum total size of ${policy.maxTotalSize}.`,\n });\n }\n\n return {\n files,\n issues,\n ok: issues.length === 0,\n totalSize,\n };\n}\n\nfunction validateFile(\n field: string,\n file: File,\n policy: UploadFilePolicy,\n issues: UploadValidationIssue[],\n) {\n if (policy.maxSize !== undefined && file.size > parseBodySize(policy.maxSize)) {\n issues.push({\n code: \"file-too-large\",\n field,\n message: `Upload field ${field} contains ${file.name || \"a file\"} larger than ${policy.maxSize}.`,\n });\n }\n\n if (policy.types?.length && !isAllowedFileType(file.type, policy.types)) {\n issues.push({\n code: \"file-type-not-allowed\",\n field,\n message: `Upload field ${field} contains ${file.name || \"a file\"} with disallowed type ${file.type || \"unknown\"}.`,\n });\n }\n}\n\nfunction isAllowedFileType(type: string, allowedTypes: readonly string[]) {\n return allowedTypes.some((allowedType) => {\n if (allowedType.endsWith(\"/*\")) {\n return type.startsWith(allowedType.slice(0, -1));\n }\n\n return type === allowedType;\n });\n}\n\nfunction isFile(value: FormDataEntryValue): value is File {\n return value instanceof File;\n}\n","export type WebSocketOriginPolicy = {\n allowMissingOrigin?: boolean;\n origins: \"same-origin\" | readonly string[];\n};\n\nexport type WebSocketOriginCheck = {\n allowed: boolean;\n expected: \"same-origin\" | readonly string[];\n origin: string | null;\n reason?: \"invalid-origin\" | \"missing-origin\" | \"origin-not-allowed\";\n};\n\nexport function checkWebSocketOrigin(\n policy: WebSocketOriginPolicy,\n request: Request,\n): WebSocketOriginCheck {\n const origin = request.headers.get(\"origin\");\n\n if (!origin) {\n return {\n allowed: Boolean(policy.allowMissingOrigin),\n expected: policy.origins,\n origin,\n reason: policy.allowMissingOrigin ? undefined : \"missing-origin\",\n };\n }\n\n const normalizedOrigin = normalizeOrigin(origin);\n\n if (!normalizedOrigin) {\n return {\n allowed: false,\n expected: policy.origins,\n origin,\n reason: \"invalid-origin\",\n };\n }\n\n const allowed = isAllowedOrigin(policy, normalizedOrigin, request);\n\n return {\n allowed,\n expected: policy.origins,\n origin: normalizedOrigin,\n reason: allowed ? undefined : \"origin-not-allowed\",\n };\n}\n\nexport function enforceWebSocketOrigin(\n policy: WebSocketOriginPolicy | undefined,\n request: Request,\n) {\n if (!policy) {\n return null;\n }\n\n const check = checkWebSocketOrigin(policy, request);\n\n if (check.allowed) {\n return null;\n }\n\n return new Response(\"WebSocket origin not allowed.\", {\n status: 403,\n });\n}\n\nfunction isAllowedOrigin(\n policy: WebSocketOriginPolicy,\n origin: string,\n request: Request,\n) {\n if (policy.origins === \"same-origin\") {\n return origin === new URL(request.url).origin;\n }\n\n return policy.origins.some((allowedOrigin) =>\n originMatches(allowedOrigin, origin),\n );\n}\n\nfunction originMatches(allowedOrigin: string, actualOrigin: string) {\n if (allowedOrigin === \"null\") {\n return actualOrigin === \"null\";\n }\n\n return normalizeOrigin(allowedOrigin) === actualOrigin;\n}\n\nfunction normalizeOrigin(origin: string) {\n if (origin === \"null\") {\n return origin;\n }\n\n try {\n // Origin is a serialized origin, not an arbitrary URL. `new URL()` alone\n // would silently discard a path, query, fragment, or credentials and could\n // turn a malformed attacker-supplied header into an allowed origin.\n if (origin !== origin.trim()) {\n return null;\n }\n\n const schemeSeparator = origin.indexOf(\"://\");\n\n if (schemeSeparator === -1) {\n return null;\n }\n\n const authority = origin.slice(schemeSeparator + 3);\n\n if (!authority || /[/?#]/.test(authority)) {\n return null;\n }\n\n const url = new URL(origin);\n\n if (\n (url.protocol !== \"http:\" && url.protocol !== \"https:\") ||\n url.username ||\n url.password\n ) {\n return null;\n }\n\n return url.origin;\n } catch {\n return null;\n }\n}\n","import {\n Component,\n ComponentType,\n MouseEvent,\n ReactNode,\n createContext,\n createElement,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n HYDRATION_FALLBACK_ATTRIBUTE,\n HYDRATION_ROOT_ATTRIBUTE,\n readInitialRouteData,\n startDeferredScripts,\n type InitialRouteData,\n} from \"../document\";\nimport {\n HTTP_ERROR_STATUSES,\n httpError,\n isHttpError,\n type NotFoundProps,\n type RouteErrorProps,\n type RouteImporter,\n} from \"../route\";\nimport {\n createRouteManifest,\n loadErrorFallback,\n loadLoadingFallback,\n loadPageRoute,\n NAVIGATION_DATA_HEADER,\n NAVIGATION_DATA_REQUEST,\n NAVIGATION_DATA_RESPONSE,\n NAVIGATION_ERROR_RESPONSE,\n NAVIGATION_NOT_FOUND_RESPONSE,\n type PendingRouteMatch,\n} from \"../router\";\nimport { BuiltInNotFound } from \"../server/fallbacks\";\nimport { href, type AppHref, type LinkTarget, type LinkTo } from \"../routing\";\n\nexport type NavigationDataLoader = (\n request: Request,\n) => Promise<InitialRouteData>;\n\nexport type FileRouterOptions = {\n initialMatch?: PendingRouteMatch;\n loadNavigationData?: NavigationDataLoader;\n navigation?: \"document\" | \"server\";\n routes: Record<string, RouteImporter>;\n loading?: ComponentType;\n notFound?: ComponentType<NotFoundProps>;\n};\n\nexport function createFileRouter(options: FileRouterOptions) {\n const manifest = createRouteManifest(options.routes);\n const navigationDataLoader = options.loadNavigationData ?? loadNavigationData;\n\n return function FileRouter() {\n const [location, setLocation] = useState(() => getCurrentLocation());\n const [match, setMatch] = useState<PendingRouteMatch>(\n () => options.initialMatch ?? { status: \"loading\" },\n );\n const initialMatchPending = useRef(Boolean(options.initialMatch));\n const navigationSequence = useRef(0);\n\n useEffect(() => {\n function onPopState() {\n setLocation(getCurrentLocation());\n }\n\n window.addEventListener(\"popstate\", onPopState);\n return () => window.removeEventListener(\"popstate\", onPopState);\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n let settled = false;\n const sequence = ++navigationSequence.current;\n const controller = new AbortController();\n const isCurrent = () =>\n !cancelled && sequence === navigationSequence.current;\n\n if (\n initialMatchPending.current &&\n getMatchPathname(options.initialMatch) === location.pathname\n ) {\n initialMatchPending.current = false;\n return () => {\n cancelled = true;\n };\n }\n\n setMatch({ status: \"loading\" });\n loadLoadingFallback(manifest, location.pathname).then((Loading) => {\n if (isCurrent() && !settled && Loading) {\n setMatch({ loading: Loading, status: \"loading\" });\n }\n }).catch(() => {\n // Loading UI is optional. A malformed pathname or broken loading\n // module must not become an unhandled rejection while the main route\n // pipeline resolves the controlled error state.\n });\n const request = new Request(location.href, { signal: controller.signal });\n Promise.resolve(navigationDataLoader(request))\n .then((initialData) =>\n loadPageRoute(\n manifest,\n location.pathname,\n request,\n initialData,\n undefined,\n { documentContributions: false },\n ),\n )\n .then((nextMatch) => {\n settled = true;\n if (isCurrent()) {\n setMatch(nextMatch);\n }\n })\n .catch(async (error: unknown) => {\n settled = true;\n\n if (!isCurrent() || controller.signal.aborted) {\n return;\n }\n\n const ErrorFallback = await loadErrorFallback(\n manifest,\n location.pathname,\n );\n\n if (isCurrent()) {\n setMatch({\n Error: ErrorFallback,\n error,\n pathname: location.pathname,\n status: \"error\",\n });\n }\n });\n\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [location.pathname, location.search]);\n\n const router = useMemo(\n () => ({\n navigation: options.navigation ?? \"server\",\n push(to: string) {\n const previous = getCurrentLocation();\n window.history.pushState(null, \"\", to);\n const next = getCurrentLocation();\n setLocation(next);\n\n if (\n previous.pathname === next.pathname &&\n previous.search === next.search &&\n previous.hash !== next.hash\n ) {\n scrollToHash(next.hash);\n }\n },\n }),\n [],\n );\n\n return createElement(RouterContext.Provider, {\n value: router,\n children: createElement(RouteRenderer, {\n key: `${location.pathname}${location.search}`,\n Loading: options.loading,\n NotFound: options.notFound,\n match,\n }),\n });\n };\n}\n\n// Hydration is safe only when the client reproduces the server output. The\n// client replaces a page document when its route no longer matches. The client\n// hydrates a document that the server marked as a 404. This action preserves\n// the layouts that the server resolved.\nfunction isHydratableMatch(match: PendingRouteMatch, root: Element) {\n const fallback = root.getAttribute(HYDRATION_FALLBACK_ATTRIBUTE);\n\n return match.status === \"not-found\"\n ? fallback === \"not-found\"\n : match.status === \"ready\" && fallback === null;\n}\n\nfunction getMatchPathname(match: PendingRouteMatch | undefined) {\n if (!match) {\n return undefined;\n }\n\n if (match.status === \"ready\") {\n return match.match.pathname;\n }\n\n return match.status === \"loading\" ? undefined : match.pathname;\n}\n\nexport type HydrateFileRouterOptions = Omit<\n FileRouterOptions,\n \"initialMatch\"\n> & {\n initialData?: InitialRouteData;\n root?: Element;\n};\n\nexport async function hydrateFileRouter(options: HydrateFileRouterOptions) {\n const root = options.root ?? document.getElementById(\"root\");\n\n if (!root) {\n throw new Error(\n \"Demiurge expected a #root element in the framework document.\",\n );\n }\n\n const manifest = createRouteManifest(options.routes);\n const navigationDataLoader = options.loadNavigationData ?? loadNavigationData;\n const initialData = options.initialData ?? readInitialRouteData(document);\n const match = await loadPageRoute(\n manifest,\n window.location.pathname,\n new Request(window.location.href),\n initialData ?? await navigationDataLoader(new Request(window.location.href)),\n undefined,\n { documentContributions: false },\n );\n const hydratable = isHydratableMatch(match, root);\n const Router = createFileRouter(\n hydratable\n ? {\n ...options,\n initialMatch: match,\n loadNavigationData: navigationDataLoader,\n navigation: initialData?.navigation ?? options.navigation,\n }\n : {\n ...options,\n loadNavigationData: navigationDataLoader,\n navigation: initialData?.navigation ?? options.navigation,\n },\n );\n const { createRoot, hydrateRoot } = resolveReactDomClient(\n await import(\"react-dom/client\"),\n );\n\n // Only documents rendered by the framework server carry markup to hydrate.\n // A static shell has an empty root, so hydrating it would mismatch. A\n // server-rendered 404 carries markup too, and hydrating it is what keeps the\n // layouts the server resolved from being torn down on the client.\n if (hydratable && root.hasAttribute(HYDRATION_ROOT_ATTRIBUTE)) {\n hydrateRoot(root, createElement(Router));\n startDeferredScripts();\n return;\n }\n\n root.replaceChildren();\n createRoot(root).render(createElement(Router));\n startDeferredScripts();\n}\n\ntype ReactDomClientApi = Pick<\n typeof import(\"react-dom/client\"),\n \"createRoot\" | \"hydrateRoot\"\n>;\n\ntype ReactDomClientModule = Partial<ReactDomClientApi> & {\n default?: ReactDomClientApi;\n};\n\nexport function resolveReactDomClient(module: ReactDomClientModule) {\n // TYPE-EVIDENCE: the runtime checks confirm both client functions exist. The module therefore matches the client API shape.\n const client = typeof module.createRoot === \"function\" &&\n typeof module.hydrateRoot === \"function\"\n ? module as ReactDomClientApi\n : module.default;\n\n if (\n !client ||\n typeof client.createRoot !== \"function\" ||\n typeof client.hydrateRoot !== \"function\"\n ) {\n throw new Error(\n \"Demiurge could not load the React DOM client from the Vite module.\",\n );\n }\n\n return client;\n}\n\nexport function Link<const TTo extends AppHref>(\n props: LinkTo<TTo> & {\n children: ReactNode;\n className?: string;\n },\n) {\n const router = useRouter();\n // TYPE-EVIDENCE: the props type adds only children and className to a link target. The cast removes those extra fields.\n const to = href(props as LinkTarget<TTo>);\n\n return (\n <a\n className={props.className}\n href={to}\n onClick={(event) => {\n if (\n router.navigation === \"server\" &&\n shouldHandleLinkClick(event)\n ) {\n event.preventDefault();\n router.push(to);\n }\n }}\n >\n {props.children}\n </a>\n );\n}\n\nfunction RouteRenderer({\n Loading,\n NotFound,\n match,\n}: {\n Loading?: ComponentType;\n NotFound?: ComponentType<{ pathname: string }>;\n match: PendingRouteMatch;\n}) {\n if (match.status === \"loading\") {\n const AppLoading = match.loading ?? Loading;\n\n return AppLoading ? createElement(AppLoading) : null;\n }\n\n if (match.status === \"not-found\") {\n const AppNotFound = match.notFound ?? NotFound ?? BuiltInNotFound;\n\n return match.layouts.reduceRight<ReactNode>(\n (children, Layout) =>\n createElement(Layout, {\n children,\n path: {},\n pathname: match.pathname,\n }),\n createElement(AppNotFound, { pathname: match.pathname }),\n );\n }\n\n if (match.status === \"error\") {\n return match.Error\n ? createElement(match.Error, {\n error: match.error,\n pathname: match.pathname,\n status: errorStatus(match.error),\n })\n : null;\n }\n\n const { data, error, page, layouts, path, pathname } = match.match;\n const pageElement = createElement(page, { data, path, pathname });\n const routeElement = layouts.reduceRight<ReactNode>(\n (children, Layout) => createElement(Layout, { path, pathname, children }),\n pageElement,\n );\n\n return createElement(RouteErrorBoundary, {\n Error: error,\n children: routeElement,\n pathname,\n });\n}\n\nclass RouteErrorBoundary extends Component<\n {\n children: ReactNode;\n Error?: ComponentType<RouteErrorProps>;\n pathname: string;\n },\n { error?: unknown }\n> {\n static getDerivedStateFromError(error: unknown) {\n return { error };\n }\n\n override state: { error?: unknown } = {};\n\n override componentDidUpdate(previousProps: {\n children: ReactNode;\n Error?: ComponentType<RouteErrorProps>;\n pathname: string;\n }) {\n if (\n this.state.error !== undefined &&\n previousProps.pathname !== this.props.pathname\n ) {\n this.setState({ error: undefined });\n }\n }\n\n override render() {\n if (this.state.error !== undefined) {\n return this.props.Error\n ? createElement(this.props.Error, {\n error: this.state.error,\n pathname: this.props.pathname,\n status: errorStatus(this.state.error),\n })\n : null;\n }\n\n return this.props.children;\n }\n}\n\nfunction errorStatus(error: unknown) {\n return isHttpError(error) ? error.status : 500;\n}\n\nfunction getCurrentLocation() {\n return {\n hash: window.location.hash,\n href: window.location.href,\n pathname: window.location.pathname,\n search: window.location.search,\n };\n}\n\nasync function loadNavigationData(request: Request) {\n const headers = new Headers(request.headers);\n headers.set(\"accept\", \"application/json\");\n headers.set(NAVIGATION_DATA_HEADER, NAVIGATION_DATA_REQUEST);\n const response = await fetch(new Request(request, {\n credentials: \"same-origin\",\n headers,\n }));\n const kind = response.headers.get(NAVIGATION_DATA_HEADER);\n\n if (kind === NAVIGATION_DATA_RESPONSE) {\n // TYPE-EVIDENCE: the response body is JSON that the server serialized as initial route data. The next check validates the required hasData field.\n const value = await response.json() as Partial<InitialRouteData>;\n\n if (value.hasData !== true) {\n throw new Error(\"Demiurge received malformed navigation route data.\");\n }\n\n return { data: value.data, hasData: true };\n }\n\n if (kind === NAVIGATION_NOT_FOUND_RESPONSE) {\n return { hasData: true };\n }\n\n if (kind === NAVIGATION_ERROR_RESPONSE || !response.ok) {\n const problem = await readProblem(response);\n // TYPE-EVIDENCE: the includes check confirms the status is a member of the error status tuple. The second cast reuses that same narrowing.\n const status = HTTP_ERROR_STATUSES.includes(\n response.status as (typeof HTTP_ERROR_STATUSES)[number],\n )\n ? response.status as (typeof HTTP_ERROR_STATUSES)[number]\n : 500;\n\n throw httpError(status, {\n detail: typeof problem?.detail === \"string\" ? problem.detail : undefined,\n title: typeof problem?.title === \"string\" ? problem.title : undefined,\n });\n }\n\n throw new Error(\n \"Demiurge expected a navigation data response from the application server.\",\n );\n}\n\nasync function readProblem(response: Response) {\n try {\n // TYPE-EVIDENCE: the response body is JSON that parses to a plain object. The record type describes any JSON object.\n return await response.json() as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction scrollToHash(hash: string) {\n queueMicrotask(() => {\n if (!hash) {\n window.scrollTo?.(0, 0);\n return;\n }\n\n let id: string;\n try {\n id = decodeURIComponent(hash.slice(1));\n } catch {\n id = hash.slice(1);\n }\n document.getElementById(id)?.scrollIntoView?.();\n });\n}\n\nfunction shouldHandleLinkClick(event: MouseEvent<HTMLAnchorElement>) {\n return (\n event.button === 0 &&\n !event.metaKey &&\n !event.altKey &&\n !event.ctrlKey &&\n !event.shiftKey\n );\n}\n\ntype RouterApi = {\n navigation: \"document\" | \"server\";\n push(to: string): void;\n};\n\nconst RouterContext = createContext<RouterApi>({\n navigation: \"document\",\n push(to) {\n window.location.href = to;\n },\n});\n\nfunction useRouter() {\n return useContext(RouterContext);\n}\n","import {\n planImageTransform,\n type ImagePolicy,\n type ImageTransformOptions,\n} from \"./images\";\n\nexport type ImageProps = ImageTransformOptions & {\n className?: string;\n id?: string;\n policy?: ImagePolicy;\n};\n\n// The component is the surface that connects the planner to the build. A\n// rendered `Image` emits a self-describing variant path in `src`/`srcSet`.\n// The static build scans the rendered document for that path, and the\n// runtime optimizer parses it back into a real transform request.\nexport function Image({ className, id, policy, ...options }: ImageProps) {\n const plan = planImageTransform(options, policy);\n\n return (\n <img\n alt={plan.alt}\n className={className}\n decoding={plan.decoding}\n fetchPriority={plan.fetchPriority}\n height={plan.height}\n id={id}\n loading={plan.loading}\n sizes={plan.sizes}\n src={plan.src}\n srcSet={plan.srcSet}\n width={plan.width}\n />\n );\n}\n","import { script, type ScriptTag } from \"../document\";\nimport type { CspSource, RoutePolicy, RouteSecurityNeeds } from \"../security/types\";\n\nexport type AnalyticsConsent = boolean | \"required\";\n\nexport type AnalyticsProvider = \"opentelemetry\" | \"plausible\" | \"sentry\";\n\n/**\n * An integration descriptor. `scripts` goes into `export const scripts` and\n * `needs` goes into the route policy. The build compares the two, so wiring\n * only one half fails with a diagnostic that names the missing directive.\n */\nexport type AnalyticsIntegration = {\n consent: AnalyticsConsent;\n kind: \"analytics\";\n needs: RouteSecurityNeeds;\n provider: AnalyticsProvider;\n scripts: readonly ScriptTag[];\n};\n\nexport type PlausibleAnalyticsOptions = {\n consent?: AnalyticsConsent;\n domain: string;\n endpoint?: string;\n strategy?: ScriptTag[\"strategy\"];\n};\n\nexport type PlausibleAnalytics = AnalyticsIntegration & {\n domain: string;\n provider: \"plausible\";\n};\n\nexport type SentryAnalyticsOptions = {\n consent?: AnalyticsConsent;\n dsn: string;\n loaderHost?: string;\n strategy?: ScriptTag[\"strategy\"];\n};\n\nexport type SentryAnalytics = AnalyticsIntegration & {\n ingestOrigin: string;\n projectId: string;\n provider: \"sentry\";\n};\n\nexport type OpenTelemetryAnalyticsOptions = {\n consent?: AnalyticsConsent;\n endpoint: string;\n script?: string;\n strategy?: ScriptTag[\"strategy\"];\n};\n\nexport type OpenTelemetryAnalytics = AnalyticsIntegration & {\n endpoint: string;\n provider: \"opentelemetry\";\n};\n\nconst sentryLoaderHost = \"https://js.sentry-cdn.com\";\n\nexport const analytics = {\n /**\n * Plausible loads one script and posts events to its own API. The snippet\n * carries configuration in `data-domain`, so no inline code is involved.\n * `endpoint` accepts a same-origin path prefix for a proxied deployment.\n */\n plausible(options: PlausibleAnalyticsOptions): PlausibleAnalytics {\n const domain = normalizeDomain(options.domain);\n const endpoint = parseEndpoint(options.endpoint ?? \"https://plausible.io\");\n\n return {\n consent: options.consent ?? false,\n domain,\n kind: \"analytics\",\n needs: {\n connect: [endpoint.source],\n script: [endpoint.source],\n },\n provider: \"plausible\",\n scripts: [\n script({\n dataApi: `${endpoint.base}/api/event`,\n dataDomain: domain,\n defer: true,\n needs: { connect: [endpoint.source] },\n purpose: \"analytics\",\n src: `${endpoint.base}/js/script.js`,\n strategy: options.strategy ?? \"afterInteractive\",\n }),\n ],\n };\n },\n /**\n * The Sentry loader script carries the DSN in its own filename, so a page\n * needs no inline configuration call. Events go to the DSN host, which is\n * why the integration also declares a `connect-src` need.\n */\n sentry(options: SentryAnalyticsOptions): SentryAnalytics {\n const dsn = parseSentryDsn(options.dsn);\n const loader = parseHttpsOrigin(\n options.loaderHost ?? sentryLoaderHost,\n \"Sentry loader host\",\n );\n\n return {\n consent: options.consent ?? false,\n ingestOrigin: dsn.origin,\n kind: \"analytics\",\n needs: {\n connect: [dsn.origin],\n script: [loader],\n },\n projectId: dsn.projectId,\n provider: \"sentry\",\n scripts: [\n script({\n crossOrigin: \"anonymous\",\n needs: { connect: [dsn.origin] },\n purpose: \"error-monitoring\",\n src: `${loader}/${dsn.publicKey}.min.js`,\n // Errors thrown before the app is interactive are the ones an\n // application can least afford to lose.\n strategy: options.strategy ?? \"beforeInteractive\",\n }),\n ],\n };\n },\n /**\n * OpenTelemetry publishes no hosted browser loader. Browser instrumentation\n * is application code bundled from npm packages, so this helper describes\n * the part a policy has to know about: the OTLP endpoint the exporter posts\n * to, and an optional same-origin entry script that starts the SDK.\n */\n openTelemetry(\n options: OpenTelemetryAnalyticsOptions,\n ): OpenTelemetryAnalytics {\n const endpoint = parseEndpoint(options.endpoint);\n const entry = options.script;\n\n if (entry !== undefined && !entry.startsWith(\"/\")) {\n throw new Error(\n \"OpenTelemetry browser instrumentation must be a same-origin script path.\",\n );\n }\n\n return {\n consent: options.consent ?? false,\n endpoint: endpoint.base || \"/\",\n kind: \"analytics\",\n needs: entry\n ? { connect: [endpoint.source], script: [\"'self'\"] }\n : { connect: [endpoint.source] },\n provider: \"opentelemetry\",\n scripts: entry\n ? [\n script({\n needs: { connect: [endpoint.source] },\n purpose: \"observability\",\n src: entry,\n strategy: options.strategy ?? \"module\",\n }),\n ]\n : [],\n };\n },\n /** Merges the CSP needs of every integration into one route policy. */\n policy(...integrations: readonly AnalyticsIntegration[]): RoutePolicy {\n const needs: { -readonly [Key in keyof RouteSecurityNeeds]: CspSource[] } =\n {};\n\n for (const integration of integrations) {\n for (const need of [\"connect\", \"img\", \"script\"] as const) {\n const sources = integration.needs[need];\n\n if (!sources || sources.length === 0) {\n continue;\n }\n\n needs[need] = [...new Set([...(needs[need] ?? []), ...sources])];\n }\n }\n\n return { security: { needs } };\n },\n /** Collects the script contributions of every integration. */\n scripts(...integrations: readonly AnalyticsIntegration[]): ScriptTag[] {\n return integrations.flatMap((integration) => [...integration.scripts]);\n },\n};\n\nfunction normalizeDomain(domain: string) {\n const normalized = domain.trim();\n\n if (!normalized || normalized.includes(\"/\") || normalized.includes(\" \")) {\n throw new Error(\"Analytics domain must be a hostname without a path.\");\n }\n\n return normalized;\n}\n\n// An endpoint is either a vendor origin or a same-origin path prefix. A proxied\n// deployment serves the vendor through the application origin, which `'self'`\n// already covers, so the returned CSP source differs in that case.\nfunction parseEndpoint(endpoint: string) {\n if (endpoint.startsWith(\"/\")) {\n if (endpoint.startsWith(\"//\")) {\n throw new Error(\"Analytics endpoint must not be a scheme-relative URL.\");\n }\n\n // TYPE-EVIDENCE: the self string literal is a valid CSP source keyword. The cast labels it as the CspSource type.\n return {\n base: endpoint === \"/\" ? \"\" : endpoint.replace(/\\/+$/, \"\"),\n source: \"'self'\" as CspSource,\n };\n }\n\n const url = parseAbsoluteEndpoint(endpoint);\n\n // TYPE-EVIDENCE: the parsed URL origin is a valid same-origin CSP source string. The cast labels it as the CspSource type.\n return { base: url.origin, source: url.origin as CspSource };\n}\n\nfunction parseAbsoluteEndpoint(endpoint: string) {\n let url: URL;\n\n try {\n url = new URL(endpoint);\n } catch {\n throw new Error(\"Analytics endpoint must be an absolute URL.\");\n }\n\n if (url.protocol !== \"https:\") {\n throw new Error(\"Analytics endpoint must use HTTPS.\");\n }\n\n return url;\n}\n\nfunction parseHttpsOrigin(value: string, label: string) {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(`${label} must be an absolute URL.`);\n }\n\n if (url.protocol !== \"https:\") {\n throw new Error(`${label} must use HTTPS.`);\n }\n\n return url.origin;\n}\n\n// A Sentry DSN is https://<publicKey>@<host>/<projectId>. Every part the\n// browser needs comes from it, so an application configures one value.\nfunction parseSentryDsn(dsn: string) {\n let url: URL;\n\n try {\n url = new URL(dsn);\n } catch {\n throw new Error(\"Sentry DSN must be an absolute URL.\");\n }\n\n if (url.protocol !== \"https:\") {\n throw new Error(\"Sentry DSN must use HTTPS.\");\n }\n\n const projectId = url.pathname.replace(/^\\//, \"\");\n\n if (!url.username || url.password) {\n throw new Error(\n \"Sentry DSN must carry a public key and no secret key.\",\n );\n }\n\n if (!/^[A-Za-z0-9_-]+$/.test(projectId)) {\n throw new Error(\"Sentry DSN must end with a project identifier.\");\n }\n\n return {\n origin: url.origin,\n projectId,\n publicKey: url.username,\n };\n}\n","export type ObservabilityValue =\n | boolean\n | null\n | number\n | string\n | readonly ObservabilityValue[]\n | { readonly [key: string]: ObservabilityValue };\n\nexport type RequestSignal = {\n duration?: number;\n method: string;\n pathname: string;\n status?: number;\n attributes?: Readonly<Record<string, ObservabilityValue>>;\n};\n\nexport type ServerStartSignal = {\n adapter?: string;\n attributes?: Readonly<Record<string, ObservabilityValue>>;\n timestamp?: number;\n};\n\nexport type TraceSignal = {\n attributes?: Readonly<Record<string, ObservabilityValue>>;\n duration?: number;\n name: string;\n status?: \"error\" | \"ok\" | \"unset\";\n traceId?: string;\n};\n\nexport type WebVitalName = \"CLS\" | \"FCP\" | \"FID\" | \"INP\" | \"LCP\" | \"TTFB\";\n\nexport type WebVitalRating = \"good\" | \"needs-improvement\" | \"poor\";\n\nexport type WebVitalSignal = {\n id?: string;\n name: WebVitalName;\n navigationType?: string;\n rating?: WebVitalRating;\n value: number;\n attributes?: Readonly<Record<string, ObservabilityValue>>;\n};\n\nexport type InstrumentationEvent =\n | { kind: \"request\"; signal: RequestSignal }\n | { kind: \"server-start\"; signal: ServerStartSignal }\n | { kind: \"trace\"; signal: TraceSignal }\n | { kind: \"web-vital\"; signal: WebVitalSignal };\n\nexport type InstrumentationHandler<T> = (signal: T) => void | Promise<void>;\n\nexport type InstrumentationOptions = {\n onEvent?: InstrumentationHandler<InstrumentationEvent>;\n request?: InstrumentationHandler<RequestSignal>;\n serverStart?: InstrumentationHandler<ServerStartSignal>;\n trace?: InstrumentationHandler<TraceSignal>;\n webVitals?: InstrumentationHandler<WebVitalSignal>;\n};\n\nexport type Instrumentation = {\n request: (signal: RequestSignal) => Promise<void>;\n serverStart: (signal?: ServerStartSignal) => Promise<void>;\n trace: (signal: TraceSignal) => Promise<void>;\n reportWebVitals: (signal: WebVitalSignal) => Promise<void>;\n};\n\nexport function defineInstrumentation(\n options: InstrumentationOptions = {},\n): Instrumentation {\n return {\n async request(signal) {\n await dispatch({ kind: \"request\", signal }, options);\n },\n async serverStart(signal = {}) {\n await dispatch({ kind: \"server-start\", signal }, options);\n },\n async trace(signal) {\n await dispatch({ kind: \"trace\", signal }, options);\n },\n async reportWebVitals(signal) {\n await dispatch({ kind: \"web-vital\", signal }, options);\n },\n };\n}\n\nasync function dispatch(\n event: InstrumentationEvent,\n options: InstrumentationOptions,\n) {\n await options.onEvent?.(event);\n\n if (event.kind === \"request\") {\n await options.request?.(event.signal);\n } else if (event.kind === \"server-start\") {\n await options.serverStart?.(event.signal);\n } else if (event.kind === \"trace\") {\n await options.trace?.(event.signal);\n } else {\n await options.webVitals?.(event.signal);\n }\n}\n","import type { CspSource, RoutePolicy, RouteSecurityNeeds } from \"../security/types\";\nimport type { WebVitalName, WebVitalRating } from \"./observability\";\n\nexport const WEB_VITAL_NAMES: readonly WebVitalName[] = [\n \"CLS\",\n \"FCP\",\n \"FID\",\n \"INP\",\n \"LCP\",\n \"TTFB\",\n];\n\n/** The metrics the browser collector measures without a vendor script. */\nexport const COLLECTED_WEB_VITAL_NAMES: readonly WebVitalName[] = [\n \"CLS\",\n \"FCP\",\n \"INP\",\n \"LCP\",\n \"TTFB\",\n];\n\nexport type WebVitalNavigationType =\n | \"back-forward\"\n | \"back-forward-cache\"\n | \"navigate\"\n | \"prerender\"\n | \"reload\"\n | \"restore\";\n\n// Each set is read as a set of plain strings, so a guard narrows an unknown\n// value without a type assertion.\nconst METRIC_NAMES: ReadonlySet<string> = new Set(WEB_VITAL_NAMES);\n\nconst NAVIGATION_TYPES: ReadonlySet<string> = new Set<WebVitalNavigationType>([\n \"back-forward\",\n \"back-forward-cache\",\n \"navigate\",\n \"prerender\",\n \"reload\",\n \"restore\",\n]);\n\nconst RATINGS: ReadonlySet<string> = new Set<WebVitalRating>([\n \"good\",\n \"needs-improvement\",\n \"poor\",\n]);\n\nfunction isWebVitalName(value: unknown): value is WebVitalName {\n return typeof value === \"string\" && METRIC_NAMES.has(value);\n}\n\nfunction isNavigationType(value: unknown): value is WebVitalNavigationType {\n return typeof value === \"string\" && NAVIGATION_TYPES.has(value);\n}\n\nfunction isRating(value: unknown): value is WebVitalRating {\n return typeof value === \"string\" && RATINGS.has(value);\n}\n\n/**\n * One measurement of one metric. The shape is also a `WebVitalSignal`, so an\n * application can pass a report straight to `instrumentation.reportWebVitals`.\n */\nexport type WebVitalReport = {\n id: string;\n name: WebVitalName;\n navigationType: WebVitalNavigationType;\n rating: WebVitalRating;\n url: string;\n value: number;\n};\n\n/** The body the browser collector posts to the application endpoint. */\nexport type WebVitalsBeacon = {\n metrics: readonly WebVitalReport[];\n};\n\nexport type WebVitalsOptions = {\n endpoint: string;\n metrics?: readonly WebVitalName[];\n sampleRate?: number;\n};\n\n/**\n * An integration descriptor. `needs` goes into the route policy and the rest\n * configures the browser collector. The application owns the endpoint route,\n * so the framework sends no measurement to a third party.\n */\nexport type WebVitalsIntegration = {\n endpoint: string;\n kind: \"web-vitals\";\n metrics: readonly WebVitalName[];\n needs: RouteSecurityNeeds;\n sampleRate: number;\n};\n\n/**\n * The published good and poor limits for each metric. A value at the good\n * limit or below rates `good`. A value above the poor limit rates `poor`.\n * See https://web.dev/articles/defining-core-web-vitals-thresholds.\n */\nexport const WEB_VITAL_THRESHOLDS: Readonly<\n Record<WebVitalName, { good: number; poor: number }>\n> = {\n CLS: { good: 0.1, poor: 0.25 },\n FCP: { good: 1_800, poor: 3_000 },\n FID: { good: 100, poor: 300 },\n INP: { good: 200, poor: 500 },\n LCP: { good: 2_500, poor: 4_000 },\n TTFB: { good: 800, poor: 1_800 },\n};\n\n/** Rates one measurement against the published limits for its metric. */\nexport function webVitalRating(\n name: WebVitalName,\n value: number,\n): WebVitalRating {\n const threshold = WEB_VITAL_THRESHOLDS[name];\n\n if (value <= threshold.good) {\n return \"good\";\n }\n\n return value > threshold.poor ? \"poor\" : \"needs-improvement\";\n}\n\nexport type WebVitalsBeaconResult =\n | { ok: true; metrics: readonly WebVitalReport[] }\n | { ok: false; reason: WebVitalsBeaconRejection };\n\nexport type WebVitalsBeaconRejection =\n | \"invalid-payload\"\n | \"too-many-metrics\"\n | \"unreadable-body\";\n\nexport type ReadWebVitalsBeaconOptions = {\n maxMetrics?: number;\n};\n\nconst defaultMaxMetrics = 32;\n\n/**\n * Describes the beacon endpoint and the metrics to collect. The endpoint is a\n * same-origin path or an HTTPS URL. A same-origin path needs `'self'` in\n * `connect-src`, which `webVitalsPolicy` contributes.\n */\nexport function defineWebVitals(options: WebVitalsOptions): WebVitalsIntegration {\n const endpoint = parseBeaconEndpoint(options.endpoint);\n const metrics = parseMetricNames(options.metrics);\n const sampleRate = parseSampleRate(options.sampleRate);\n\n return {\n endpoint: endpoint.url,\n kind: \"web-vitals\",\n metrics,\n needs: { connect: [endpoint.source] },\n sampleRate,\n };\n}\n\n/** Merges the CSP needs of every integration into one route policy. */\nexport function webVitalsPolicy(\n ...integrations: readonly WebVitalsIntegration[]\n): RoutePolicy {\n const connect = new Set<CspSource>();\n\n for (const integration of integrations) {\n for (const source of integration.needs.connect ?? []) {\n connect.add(source);\n }\n }\n\n if (connect.size === 0) {\n return { security: { needs: {} } };\n }\n\n return { security: { needs: { connect: [...connect] } } };\n}\n\n/**\n * Reads and validates a beacon body on the server. The result carries only\n * reports that match the contract, so a handler never forwards unchecked\n * browser input to a metrics backend.\n */\nexport async function readWebVitalsBeacon(\n request: Request,\n options: ReadWebVitalsBeaconOptions = {},\n): Promise<WebVitalsBeaconResult> {\n const maxMetrics = options.maxMetrics ?? defaultMaxMetrics;\n let payload: unknown;\n\n try {\n payload = await request.json();\n } catch {\n return { ok: false, reason: \"unreadable-body\" };\n }\n\n return parseWebVitalsBeacon(payload, maxMetrics);\n}\n\n/** The synchronous half of `readWebVitalsBeacon`, for an already parsed body. */\nexport function parseWebVitalsBeacon(\n payload: unknown,\n maxMetrics: number = defaultMaxMetrics,\n): WebVitalsBeaconResult {\n if (!isRecord(payload) || !Array.isArray(payload.metrics)) {\n return { ok: false, reason: \"invalid-payload\" };\n }\n\n if (payload.metrics.length > maxMetrics) {\n return { ok: false, reason: \"too-many-metrics\" };\n }\n\n const metrics: WebVitalReport[] = [];\n\n for (const entry of payload.metrics) {\n const report = parseWebVitalReport(entry);\n\n if (!report) {\n return { ok: false, reason: \"invalid-payload\" };\n }\n\n metrics.push(report);\n }\n\n return { metrics, ok: true };\n}\n\nfunction parseWebVitalReport(entry: unknown): WebVitalReport | undefined {\n if (!isRecord(entry)) {\n return undefined;\n }\n\n const { id, name, navigationType, rating, url, value } = entry;\n\n if (typeof id !== \"string\" || id.length === 0 || id.length > 128) {\n return undefined;\n }\n\n if (!isWebVitalName(name) || !isNavigationType(navigationType)) {\n return undefined;\n }\n\n if (!isRating(rating)) {\n return undefined;\n }\n\n if (typeof url !== \"string\" || url.length === 0 || url.length > 2048) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n return undefined;\n }\n\n return { id, name, navigationType, rating, url, value };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n// The endpoint is either a same-origin path or an HTTPS collector URL. A\n// same-origin path is already covered by `'self'`, so the CSP source differs.\nfunction parseBeaconEndpoint(\n endpoint: string,\n): { source: CspSource; url: string } {\n if (endpoint.startsWith(\"/\")) {\n if (endpoint.startsWith(\"//\")) {\n throw new Error(\n \"The web vitals endpoint must not be a scheme-relative URL.\",\n );\n }\n\n return { source: \"'self'\", url: endpoint };\n }\n\n let url: URL;\n\n try {\n url = new URL(endpoint);\n } catch {\n throw new Error(\n \"The web vitals endpoint must be a same-origin path or an absolute URL.\",\n );\n }\n\n if (url.protocol !== \"https:\") {\n throw new Error(\"The web vitals endpoint must use HTTPS.\");\n }\n\n return { source: url.origin, url: url.href };\n}\n\nfunction parseMetricNames(metrics: readonly WebVitalName[] | undefined) {\n if (!metrics) {\n return COLLECTED_WEB_VITAL_NAMES;\n }\n\n const selected: WebVitalName[] = [];\n\n for (const metric of metrics) {\n if (!COLLECTED_WEB_VITAL_NAMES.includes(metric)) {\n throw new Error(\n `The browser collector does not measure ${JSON.stringify(metric)}. Demiurge collects ${COLLECTED_WEB_VITAL_NAMES.join(\", \")}.`,\n );\n }\n\n if (!selected.includes(metric)) {\n selected.push(metric);\n }\n }\n\n if (selected.length === 0) {\n throw new Error(\"A web vitals integration must collect one metric or more.\");\n }\n\n return selected;\n}\n\nfunction parseSampleRate(sampleRate: number | undefined) {\n if (sampleRate === undefined) {\n return 1;\n }\n\n if (!Number.isFinite(sampleRate) || sampleRate < 0 || sampleRate > 1) {\n throw new Error(\"The web vitals sample rate must be between 0 and 1.\");\n }\n\n return sampleRate;\n}\n","import { useEffect } from \"react\";\nimport type { WebVitalName } from \"./observability\";\nimport {\n webVitalRating,\n type WebVitalNavigationType,\n type WebVitalReport,\n type WebVitalsBeacon,\n type WebVitalsIntegration,\n} from \"./web-vitals\";\n\nexport type WebVitalsTransport = (\n endpoint: string,\n beacon: WebVitalsBeacon,\n) => void;\n\nexport type CollectWebVitalsOptions = {\n onReport?: (report: WebVitalReport) => void;\n random?: () => number;\n transport?: WebVitalsTransport;\n};\n\nexport type WebVitalsProps = {\n integration: WebVitalsIntegration;\n onReport?: (report: WebVitalReport) => void;\n transport?: WebVitalsTransport;\n};\n\n// A layout shift stays in the current session window while it starts less than\n// one second after the last shift. The window also ends five seconds after its\n// first shift. The reported value is the largest window.\nconst sessionGapMs = 1_000;\nconst sessionWindowMs = 5_000;\n\n// An interaction shorter than this cannot become the reported INP value, and\n// the browser does not have to buffer it.\nconst interactionDurationThresholdMs = 40;\n\ntype LayoutShiftEntry = PerformanceEntry & {\n hadRecentInput: boolean;\n value: number;\n};\n\ntype NavigationEntry = PerformanceEntry & {\n responseStart: number;\n type: string;\n};\n\n/**\n * Measures Core Web Vitals in the browser and posts them to the endpoint of\n * the integration. The collector uses `PerformanceObserver` only, so no inline\n * script and no vendor script is involved, and a strict policy needs no\n * `script-src` source for it.\n *\n * The returned function stops every observer and sends nothing more.\n */\nexport function collectWebVitals(\n integration: WebVitalsIntegration,\n options: CollectWebVitalsOptions = {},\n): () => void {\n if (typeof window === \"undefined\" || typeof PerformanceObserver === \"undefined\") {\n return () => undefined;\n }\n\n const random = options.random ?? Math.random;\n\n if (integration.sampleRate < 1 && random() >= integration.sampleRate) {\n return () => undefined;\n }\n\n const transport = options.transport ?? sendWebVitalsBeacon;\n const wanted = new Set(integration.metrics);\n const observers: PerformanceObserver[] = [];\n const pending: WebVitalReport[] = [];\n const reported = new Set<WebVitalName>();\n let navigationType = readNavigationType();\n let clsValue = 0;\n let sessionValue = 0;\n let sessionFirst = 0;\n let sessionLast = 0;\n let lcpValue: number | undefined;\n let inpValue: number | undefined;\n let stopped = false;\n\n const report = (name: WebVitalName, value: number) => {\n if (stopped || reported.has(name)) {\n return;\n }\n\n reported.add(name);\n\n const entry: WebVitalReport = {\n id: `${name}-${Date.now()}-${Math.floor(random() * 1_000_000_000)}`,\n name,\n navigationType,\n rating: webVitalRating(name, value),\n url: window.location.href,\n value: Math.round(value * 1_000) / 1_000,\n };\n\n pending.push(entry);\n options.onReport?.(entry);\n };\n\n const flush = () => {\n if (stopped) {\n return;\n }\n\n if (lcpValue !== undefined) {\n report(\"LCP\", lcpValue);\n }\n\n if (inpValue !== undefined) {\n report(\"INP\", inpValue);\n }\n\n if (wanted.has(\"CLS\")) {\n report(\"CLS\", clsValue);\n }\n\n if (pending.length === 0) {\n return;\n }\n\n const metrics = pending.splice(0, pending.length);\n\n transport(integration.endpoint, { metrics });\n };\n\n const onVisibilityChange = () => {\n if (document.visibilityState === \"hidden\") {\n flush();\n }\n };\n\n // A page restored from the back-forward cache reuses its JavaScript\n // context, so the effect that started this collector never reruns. A\n // restored view would report nothing without this listener. Reset the\n // accumulators and tag the next report with the restore, the same way the\n // Navigation Timing entry names a real reload.\n const onPageShow = (event: PageTransitionEvent) => {\n if (!event.persisted) {\n return;\n }\n\n navigationType = \"back-forward-cache\";\n reported.clear();\n clsValue = 0;\n sessionValue = 0;\n sessionFirst = 0;\n sessionLast = 0;\n lcpValue = undefined;\n inpValue = undefined;\n\n // No new \"first-contentful-paint\" entry fires after a restore, because the\n // browser did not repaint from a blank page. Report the restore itself as\n // the paint moment, which is what a person actually experienced.\n if (wanted.has(\"FCP\")) {\n report(\"FCP\", performance.now() - event.timeStamp);\n }\n };\n\n if (wanted.has(\"TTFB\")) {\n const navigation = readNavigationEntry();\n\n if (navigation && navigation.responseStart > 0) {\n report(\"TTFB\", navigation.responseStart);\n }\n }\n\n if (wanted.has(\"FCP\")) {\n observe(observers, { buffered: true, type: \"paint\" }, (entries) => {\n for (const entry of entries) {\n if (entry.name === \"first-contentful-paint\") {\n report(\"FCP\", entry.startTime);\n }\n }\n });\n }\n\n if (wanted.has(\"LCP\")) {\n observe(\n observers,\n { buffered: true, type: \"largest-contentful-paint\" },\n (entries) => {\n const last = entries.at(-1);\n\n if (last) {\n lcpValue = last.startTime;\n }\n },\n );\n }\n\n if (wanted.has(\"CLS\")) {\n observe(observers, { buffered: true, type: \"layout-shift\" }, (entries) => {\n for (const shift of entries) {\n // TYPE-EVIDENCE: the observer subscribes to the layout-shift entry\n // type, so the browser delivers LayoutShift entries here. The cast\n // adds the two fields that lib.dom does not declare.\n const entry = shift as LayoutShiftEntry;\n\n if (entry.hadRecentInput) {\n continue;\n }\n\n const withinSession =\n sessionValue > 0 &&\n entry.startTime - sessionLast < sessionGapMs &&\n entry.startTime - sessionFirst < sessionWindowMs;\n\n if (withinSession) {\n sessionValue += entry.value;\n } else {\n sessionValue = entry.value;\n sessionFirst = entry.startTime;\n }\n\n sessionLast = entry.startTime;\n clsValue = Math.max(clsValue, sessionValue);\n }\n });\n }\n\n // The published metric is close to the 98th percentile of every\n // interaction on the page. It takes the single slowest interaction while\n // the page has 50 or fewer, then a less extreme rank as the count grows.\n // One outlier does not fix the score at its worst for the rest of the\n // visit. Ranking by percentile needs each interaction grouped by its\n // browser-assigned `interactionId`. Chrome increments that value by 7 per\n // interaction, an internal detail the specification does not guarantee.\n // This collector reports the plain maximum instead. That value matches\n // the published metric on a typical content page, and reports a worse\n // number on an interaction-heavy page or a long session. An application\n // that needs the published percentile can call\n // `instrumentation.reportWebVitals` with the output of the `web-vitals`\n // npm package instead of `defineWebVitals`.\n if (wanted.has(\"INP\")) {\n observe(\n observers,\n {\n buffered: true,\n durationThreshold: interactionDurationThresholdMs,\n type: \"event\",\n },\n (entries) => {\n for (const entry of entries) {\n inpValue = Math.max(inpValue ?? 0, entry.duration);\n }\n },\n );\n }\n\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n window.addEventListener(\"pagehide\", flush);\n window.addEventListener(\"pageshow\", onPageShow);\n\n return () => {\n flush();\n stopped = true;\n\n for (const observer of observers) {\n observer.disconnect();\n }\n\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n window.removeEventListener(\"pagehide\", flush);\n window.removeEventListener(\"pageshow\", onPageShow);\n };\n}\n\n/**\n * Starts the browser collector for the lifetime of the component. Put it in a\n * layout so that every page of the application reports.\n */\nexport function WebVitals({ integration, onReport, transport }: WebVitalsProps) {\n useEffect(\n () => collectWebVitals(integration, { onReport, transport }),\n [integration, onReport, transport],\n );\n\n return null;\n}\n\n/**\n * Posts one beacon. `navigator.sendBeacon` survives a page that unloads. When\n * the browser refuses the beacon, a `keepalive` fetch takes its place.\n */\nexport function sendWebVitalsBeacon(\n endpoint: string,\n beacon: WebVitalsBeacon,\n): void {\n const body = JSON.stringify(beacon);\n\n if (typeof navigator !== \"undefined\" && typeof navigator.sendBeacon === \"function\") {\n const blob = new Blob([body], { type: \"application/json\" });\n\n if (navigator.sendBeacon(endpoint, blob)) {\n return;\n }\n }\n\n void fetch(endpoint, {\n body,\n headers: { \"content-type\": \"application/json\" },\n keepalive: true,\n method: \"POST\",\n }).catch(() => undefined);\n}\n\n// A browser that does not support an entry type throws on `observe`. The\n// collector then reports the metrics it can measure instead of failing.\nfunction observe(\n observers: PerformanceObserver[],\n init: PerformanceObserverInit & { durationThreshold?: number; type: string },\n handle: (entries: PerformanceEntryList) => void,\n) {\n try {\n const observer = new PerformanceObserver((list) => handle(list.getEntries()));\n\n observer.observe(init);\n observers.push(observer);\n } catch {\n return;\n }\n}\n\nfunction readNavigationEntry(): NavigationEntry | undefined {\n if (typeof performance === \"undefined\") {\n return undefined;\n }\n\n // TYPE-EVIDENCE: the browser returns PerformanceNavigationTiming entries for\n // the navigation entry type. The cast adds the two fields this file reads.\n return performance.getEntriesByType(\"navigation\")[0] as\n | NavigationEntry\n | undefined;\n}\n\nfunction readNavigationType(): WebVitalNavigationType {\n const navigation = readNavigationEntry();\n\n if (navigation?.type === \"back_forward\") {\n return \"back-forward\";\n }\n\n if (navigation?.type === \"reload\" || navigation?.type === \"prerender\") {\n return navigation.type;\n }\n\n return \"navigate\";\n}\n"],"names":["defaultIdempotencyTtl","defaultMaximumEntries","createMemoryIdempotencyStore","options","now","defaultTtl","maximumEntries","defaultTtlMs","parseCacheDuration","entries","request","key","serializeCacheKey","currentTime","sweepExpiredIdempotencyEntries","existing","evictOldestCompletedIdempotencyEntry","value","entry","result","error","runIdempotentMutation","store","defineSitemap","renderSitemap","sitemap","renderSitemapEntry","defineRobots","defineOgImage","renderRobots","robots","lines","rule","userAgent","toArray","allow","disallow","renderOgImageSvg","image","width","height","background","foreground","title","clampText","subtitle","brand","validateOgImageDimensions","escapeXmlAttribute","escapeXml","line","renderOgImageResponse","formatLastModified","formatPriority","alternate","priority","maxLength","action","response","context","input","actionContext","run","resolveActionResult","actionInput","toResponse","page","defineMiddleware","middleware","webhook","rawBody","signature","verifyHmacSignature","suppliedSignature","algorithm","encoding","normalized","normalizeSignature","decodeSignature","configuredPrefix","trimmed","prefix","pair","binary","character","namePattern","prefixes","maxCookieBytes","secureCookieName","name","scope","validateSecureCookie","declaration","issues","report","code","message","size","serialize","readSecureCookie","reference","definition","parseCookieHeader","createSecureCookie","issue","attributes","path","EnvValidationError","formatEnvValidationError","defineEnvSchema","schema","validateEnv","source","values","variable","rawValue","booleanEnv","createVariable","enumEnv","integerEnv","parsed","secretEnv","parseString","stringEnv","urlEnv","url","env","sensitive","parse","createSecurityReportHandler","contentTypeResponse","enforceReportContentType","bodySizeResponse","enforceReportBodySize","limitRequestBody","payload","RequestBodyTooLargeError","reports","normalizeSecurityReports","index","supportedReportContentTypes","mediaType","contentLength","declaredSize","parseBodySize","isObject","validateUploads","formData","policy","files","totalSize","field","filePolicy","fieldFiles","isFile","file","validateFile","isAllowedFileType","type","allowedTypes","allowedType","checkWebSocketOrigin","origin","normalizedOrigin","normalizeOrigin","allowed","isAllowedOrigin","enforceWebSocketOrigin","allowedOrigin","originMatches","actualOrigin","schemeSeparator","authority","createFileRouter","manifest","createRouteManifest","navigationDataLoader","loadNavigationData","location","setLocation","useState","getCurrentLocation","match","setMatch","initialMatchPending","useRef","navigationSequence","useEffect","onPopState","cancelled","settled","sequence","controller","isCurrent","getMatchPathname","loadLoadingFallback","Loading","initialData","loadPageRoute","nextMatch","ErrorFallback","loadErrorFallback","router","useMemo","to","previous","next","scrollToHash","createElement","RouterContext","RouteRenderer","isHydratableMatch","root","fallback","HYDRATION_FALLBACK_ATTRIBUTE","hydrateFileRouter","readInitialRouteData","hydratable","Router","createRoot","hydrateRoot","resolveReactDomClient","HYDRATION_ROOT_ATTRIBUTE","startDeferredScripts","module","client","Link","props","useRouter","href","jsx","event","shouldHandleLinkClick","NotFound","AppLoading","AppNotFound","BuiltInNotFound","children","Layout","errorStatus","data","layouts","pathname","pageElement","routeElement","RouteErrorBoundary","Component","previousProps","isHttpError","headers","NAVIGATION_DATA_HEADER","NAVIGATION_DATA_REQUEST","kind","NAVIGATION_DATA_RESPONSE","NAVIGATION_NOT_FOUND_RESPONSE","NAVIGATION_ERROR_RESPONSE","problem","readProblem","status","HTTP_ERROR_STATUSES","httpError","hash","id","createContext","useContext","Image","className","plan","planImageTransform","sentryLoaderHost","analytics","domain","normalizeDomain","endpoint","parseEndpoint","script","dsn","parseSentryDsn","loader","parseHttpsOrigin","integrations","needs","integration","need","sources","parseAbsoluteEndpoint","label","projectId","defineInstrumentation","signal","dispatch","WEB_VITAL_NAMES","COLLECTED_WEB_VITAL_NAMES","METRIC_NAMES","NAVIGATION_TYPES","RATINGS","isWebVitalName","isNavigationType","isRating","WEB_VITAL_THRESHOLDS","webVitalRating","threshold","defaultMaxMetrics","defineWebVitals","parseBeaconEndpoint","metrics","parseMetricNames","sampleRate","parseSampleRate","webVitalsPolicy","connect","readWebVitalsBeacon","maxMetrics","parseWebVitalsBeacon","isRecord","parseWebVitalReport","navigationType","rating","selected","metric","sessionGapMs","sessionWindowMs","interactionDurationThresholdMs","collectWebVitals","random","transport","sendWebVitalsBeacon","wanted","observers","pending","reported","readNavigationType","clsValue","sessionValue","sessionFirst","sessionLast","lcpValue","inpValue","stopped","flush","onVisibilityChange","onPageShow","navigation","readNavigationEntry","observe","last","shift","observer","WebVitals","onReport","beacon","body","blob","init","handle","list"],"mappings":"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"}
|