@demiurgejs/core 0.2.0-beta.1 → 0.2.0-beta.2
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-D1xo6cEA.js +35 -0
- package/dist/chunks/document-shell-D1xo6cEA.js.map +1 -0
- package/dist/chunks/image-codec-BGTx_t5K.js +141 -0
- package/dist/chunks/image-codec-BGTx_t5K.js.map +1 -0
- package/dist/chunks/images-B9MqcjSA.js +339 -0
- package/dist/chunks/images-B9MqcjSA.js.map +1 -0
- package/dist/chunks/request-metadata-D5NrT8ks.js +642 -0
- package/dist/chunks/request-metadata-D5NrT8ks.js.map +1 -0
- package/dist/chunks/streaming-BQ1bykDo.js +469 -0
- package/dist/chunks/streaming-BQ1bykDo.js.map +1 -0
- package/dist/chunks/{testing-DBjVCN5v.js → testing-B_iMFYz_.js} +768 -761
- package/dist/chunks/testing-B_iMFYz_.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/document/deferred-scripts.d.ts +11 -0
- package/dist/document/deferred-scripts.d.ts.map +1 -0
- package/dist/document/index.d.ts +3 -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/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 +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +423 -420
- package/dist/index.js.map +1 -1
- package/dist/internal/testing.js +9 -9
- package/dist/kv/index.d.ts +3 -0
- package/dist/kv/index.d.ts.map +1 -0
- package/dist/kv/index.js +103 -0
- package/dist/kv/index.js.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/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/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 +8 -5
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/redis/index.d.ts +3 -0
- package/dist/redis/index.d.ts.map +1 -0
- package/dist/redis/index.js +171 -0
- package/dist/redis/index.js.map +1 -0
- package/dist/redis/store.d.ts +8 -0
- package/dist/redis/store.d.ts.map +1 -0
- package/dist/security/index.d.ts +1 -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/types.d.ts +10 -3
- 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/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.js +412 -387
- package/dist/vite/index.js.map +1 -1
- package/dist/vite/plugin.d.ts +7 -0
- package/dist/vite/plugin.d.ts.map +1 -1
- 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/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"],"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 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 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","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 return {\n base: endpoint === \"/\" ? \"\" : endpoint.replace(/\\/+$/, \"\"),\n source: \"'self'\" as CspSource,\n };\n }\n\n const url = parseAbsoluteEndpoint(endpoint);\n\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 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","startDeferredScripts","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","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"],"mappings":"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"}
|
package/dist/internal/testing.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { h as
|
|
1
|
+
import { h as n, b as u, k as b, am as i, j as r, an as _, ao as c, y as m, w as d, x as h, ap as R, aq as p, ar as g, as as f, at as F } from "../chunks/testing-B_iMFYz_.js";
|
|
2
2
|
import "react-dom/server";
|
|
3
|
-
import "../chunks/request-metadata-
|
|
3
|
+
import "../chunks/request-metadata-D5NrT8ks.js";
|
|
4
4
|
import "react";
|
|
5
5
|
import "react/jsx-runtime";
|
|
6
6
|
export {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
n as handleRequestWithManifest,
|
|
8
|
+
u as unstable_collectStaticRoutePaths,
|
|
9
9
|
b as unstable_createRouteManifest,
|
|
10
10
|
i as unstable_findPageMatch,
|
|
11
11
|
r as unstable_findRouteMatch,
|
|
12
12
|
_ as unstable_isAttachedFileForRoute,
|
|
13
13
|
c as unstable_isLayoutForPage,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
m as unstable_loadErrorFallback,
|
|
15
|
+
d as unstable_loadLoadingFallback,
|
|
16
|
+
h as unstable_loadPageRoute,
|
|
17
17
|
R as unstable_loadRoute,
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
p as unstable_matchSegments,
|
|
19
|
+
g as unstable_scoreRoute,
|
|
20
20
|
f as unstable_splitPathname,
|
|
21
21
|
F as unstable_toRouteSegments
|
|
22
22
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/kv/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,SAAS,CAAC"}
|