@demiurgejs/core 0.0.0 → 0.1.1

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.
Files changed (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +75 -2
  3. package/dist/adapter/index.d.ts +20 -0
  4. package/dist/adapter/index.d.ts.map +1 -0
  5. package/dist/browser/file-router.d.ts +35 -0
  6. package/dist/browser/file-router.d.ts.map +1 -0
  7. package/dist/browser/index.d.ts +3 -0
  8. package/dist/browser/index.d.ts.map +1 -0
  9. package/dist/chunks/index-BnX9Qxbm.js +44 -0
  10. package/dist/chunks/index-BnX9Qxbm.js.map +1 -0
  11. package/dist/chunks/ssr-BJejKlkZ.js +275 -0
  12. package/dist/chunks/ssr-BJejKlkZ.js.map +1 -0
  13. package/dist/chunks/static-files-DUjHw-4H.js +11 -0
  14. package/dist/chunks/static-files-DUjHw-4H.js.map +1 -0
  15. package/dist/chunks/streaming-DN1DnbRE.js +343 -0
  16. package/dist/chunks/streaming-DN1DnbRE.js.map +1 -0
  17. package/dist/chunks/testing-DR3eQAvY.js +2872 -0
  18. package/dist/chunks/testing-DR3eQAvY.js.map +1 -0
  19. package/dist/data/cache.d.ts +95 -0
  20. package/dist/data/cache.d.ts.map +1 -0
  21. package/dist/data/idempotency.d.ts +24 -0
  22. package/dist/data/idempotency.d.ts.map +1 -0
  23. package/dist/data/index.d.ts +5 -0
  24. package/dist/data/index.d.ts.map +1 -0
  25. package/dist/data/testing.d.ts +7 -0
  26. package/dist/data/testing.d.ts.map +1 -0
  27. package/dist/data/testing.js +134 -0
  28. package/dist/data/testing.js.map +1 -0
  29. package/dist/document/hydration.d.ts +13 -0
  30. package/dist/document/hydration.d.ts.map +1 -0
  31. package/dist/document/index.d.ts +13 -0
  32. package/dist/document/index.d.ts.map +1 -0
  33. package/dist/document/links.d.ts +17 -0
  34. package/dist/document/links.d.ts.map +1 -0
  35. package/dist/document/metadata.d.ts +62 -0
  36. package/dist/document/metadata.d.ts.map +1 -0
  37. package/dist/document/render.d.ts +29 -0
  38. package/dist/document/render.d.ts.map +1 -0
  39. package/dist/document/scripts.d.ts +24 -0
  40. package/dist/document/scripts.d.ts.map +1 -0
  41. package/dist/document/seo.d.ts +42 -0
  42. package/dist/document/seo.d.ts.map +1 -0
  43. package/dist/index.d.ts +23 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +1328 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/internal/testing.d.ts +3 -0
  48. package/dist/internal/testing.d.ts.map +1 -0
  49. package/dist/internal/testing.js +22 -0
  50. package/dist/internal/testing.js.map +1 -0
  51. package/dist/node/http.d.ts +28 -0
  52. package/dist/node/http.d.ts.map +1 -0
  53. package/dist/node/index.d.ts +45 -0
  54. package/dist/node/index.d.ts.map +1 -0
  55. package/dist/node/index.js +386 -0
  56. package/dist/node/index.js.map +1 -0
  57. package/dist/node/static.d.ts +9 -0
  58. package/dist/node/static.d.ts.map +1 -0
  59. package/dist/node/streaming.d.ts +5 -0
  60. package/dist/node/streaming.d.ts.map +1 -0
  61. package/dist/package-name.d.ts +2 -0
  62. package/dist/package-name.d.ts.map +1 -0
  63. package/dist/platform/analytics.d.ts +20 -0
  64. package/dist/platform/analytics.d.ts.map +1 -0
  65. package/dist/platform/fonts.d.ts +35 -0
  66. package/dist/platform/fonts.d.ts.map +1 -0
  67. package/dist/platform/images.d.ts +49 -0
  68. package/dist/platform/images.d.ts.map +1 -0
  69. package/dist/platform/index.d.ts +9 -0
  70. package/dist/platform/index.d.ts.map +1 -0
  71. package/dist/platform/observability.d.ts +60 -0
  72. package/dist/platform/observability.d.ts.map +1 -0
  73. package/dist/route/action.d.ts +33 -0
  74. package/dist/route/action.d.ts.map +1 -0
  75. package/dist/route/http-error.d.ts +24 -0
  76. package/dist/route/http-error.d.ts.map +1 -0
  77. package/dist/route/index.d.ts +10 -0
  78. package/dist/route/index.d.ts.map +1 -0
  79. package/dist/route/page.d.ts +5 -0
  80. package/dist/route/page.d.ts.map +1 -0
  81. package/dist/route/response.d.ts +100 -0
  82. package/dist/route/response.d.ts.map +1 -0
  83. package/dist/route/types.d.ts +186 -0
  84. package/dist/route/types.d.ts.map +1 -0
  85. package/dist/route/webhook.d.ts +25 -0
  86. package/dist/route/webhook.d.ts.map +1 -0
  87. package/dist/router/index.d.ts +5 -0
  88. package/dist/router/index.d.ts.map +1 -0
  89. package/dist/router/manifest.d.ts +119 -0
  90. package/dist/router/manifest.d.ts.map +1 -0
  91. package/dist/router/navigation-data.d.ts +9 -0
  92. package/dist/router/navigation-data.d.ts.map +1 -0
  93. package/dist/routing/generate.d.ts +14 -0
  94. package/dist/routing/generate.d.ts.map +1 -0
  95. package/dist/routing/index.d.ts +3 -0
  96. package/dist/routing/index.d.ts.map +1 -0
  97. package/dist/routing/types.d.ts +38 -0
  98. package/dist/routing/types.d.ts.map +1 -0
  99. package/dist/security/audit.d.ts +16 -0
  100. package/dist/security/audit.d.ts.map +1 -0
  101. package/dist/security/cors.d.ts +7 -0
  102. package/dist/security/cors.d.ts.map +1 -0
  103. package/dist/security/csrf.d.ts +15 -0
  104. package/dist/security/csrf.d.ts.map +1 -0
  105. package/dist/security/env.d.ts +69 -0
  106. package/dist/security/env.d.ts.map +1 -0
  107. package/dist/security/index.d.ts +17 -0
  108. package/dist/security/index.d.ts.map +1 -0
  109. package/dist/security/policy.d.ts +18 -0
  110. package/dist/security/policy.d.ts.map +1 -0
  111. package/dist/security/rate-limit.d.ts +6 -0
  112. package/dist/security/rate-limit.d.ts.map +1 -0
  113. package/dist/security/report.d.ts +13 -0
  114. package/dist/security/report.d.ts.map +1 -0
  115. package/dist/security/request.d.ts +11 -0
  116. package/dist/security/request.d.ts.map +1 -0
  117. package/dist/security/types.d.ts +137 -0
  118. package/dist/security/types.d.ts.map +1 -0
  119. package/dist/security/upload.d.ts +23 -0
  120. package/dist/security/upload.d.ts.map +1 -0
  121. package/dist/security/websocket.d.ts +13 -0
  122. package/dist/security/websocket.d.ts.map +1 -0
  123. package/dist/server/errors.d.ts +13 -0
  124. package/dist/server/errors.d.ts.map +1 -0
  125. package/dist/server/failure-site.d.ts +2 -0
  126. package/dist/server/failure-site.d.ts.map +1 -0
  127. package/dist/server/fallbacks.d.ts +10 -0
  128. package/dist/server/fallbacks.d.ts.map +1 -0
  129. package/dist/server/index.d.ts +14 -0
  130. package/dist/server/index.d.ts.map +1 -0
  131. package/dist/server/negotiate.d.ts +3 -0
  132. package/dist/server/negotiate.d.ts.map +1 -0
  133. package/dist/server/not-found.d.ts +11 -0
  134. package/dist/server/not-found.d.ts.map +1 -0
  135. package/dist/server/problem.d.ts +18 -0
  136. package/dist/server/problem.d.ts.map +1 -0
  137. package/dist/server/render-tree.d.ts +4 -0
  138. package/dist/server/render-tree.d.ts.map +1 -0
  139. package/dist/server/request-handler.d.ts +40 -0
  140. package/dist/server/request-handler.d.ts.map +1 -0
  141. package/dist/server/request-metadata.d.ts +7 -0
  142. package/dist/server/request-metadata.d.ts.map +1 -0
  143. package/dist/server/ssr.d.ts +17 -0
  144. package/dist/server/ssr.d.ts.map +1 -0
  145. package/dist/static/index.d.ts +28 -0
  146. package/dist/static/index.d.ts.map +1 -0
  147. package/dist/static/index.js +377 -0
  148. package/dist/static/index.js.map +1 -0
  149. package/dist/static-files.d.ts +5 -0
  150. package/dist/static-files.d.ts.map +1 -0
  151. package/dist/vite/index.d.ts +4 -0
  152. package/dist/vite/index.d.ts.map +1 -0
  153. package/dist/vite/index.js +746 -0
  154. package/dist/vite/index.js.map +1 -0
  155. package/dist/vite/plugin.d.ts +37 -0
  156. package/dist/vite/plugin.d.ts.map +1 -0
  157. package/package.json +93 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/document/seo.ts","../src/route/action.ts","../src/route/page.ts","../src/route/webhook.ts","../src/data/idempotency.ts","../src/browser/file-router.tsx","../src/platform/images.ts","../src/platform/fonts.ts","../src/platform/analytics.ts","../src/platform/observability.ts","../src/security/audit.ts","../src/security/env.ts","../src/security/report.ts","../src/security/upload.ts","../src/security/websocket.ts"],"sourcesContent":["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(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n\nfunction escapeXmlAttribute(value: string) {\n return escapeXml(value)\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&apos;\");\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 ServerTimingInput,\n} from \"./types\";\nimport { response, toResponse } from \"./response\";\n\nexport type ActionInput<TInput> = (\n context: HttpRouteContext,\n) => MaybePromise<TInput>;\n\nexport type ActionContext<TInput> = HttpRouteContext & {\n input: TInput;\n};\n\nexport type ActionIdempotency<TInput> = {\n key: CacheKey | ((context: ActionContext<TInput>) => CacheKey);\n store: IdempotencyStore;\n ttl?: CacheDuration;\n};\n\nexport type ActionOptions<TInput> = {\n cors?: CorsPolicy;\n handler: (\n context: ActionContext<TInput>,\n ) => MaybePromise<Response | ResponseCapability>;\n idempotency?: ActionIdempotency<TInput>;\n input?: ActionInput<TInput>;\n security?: RouteSecurityPolicy;\n timing?: ServerTimingInput;\n};\n\nexport function action<TInput = undefined>(\n options: ActionOptions<TInput>,\n) {\n return response(\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 } satisfies ActionContext<TInput>;\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 result: Response | ResponseCapability,\n context: HttpRouteContext,\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 { PageCapability, PageOptions, RouteProps } from \"./types\";\n\nexport function page<const TPath extends string = string>(\n options: ComponentType<RouteProps<TPath>>,\n): PageCapability<TPath>;\nexport function page<const TPath extends string = string, TData = undefined>(\n options: PageOptions<TPath, TData>,\n): PageCapability<TPath, TData>;\nexport function page<const TPath extends string = string, TData = undefined>(\n options: PageOptions<TPath, TData> | ComponentType<RouteProps<TPath>>,\n): PageCapability<TPath, TData> | 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 } satisfies PageCapability<TPath, TData>;\n}\n","import type {\n HttpRouteContext,\n MaybePromise,\n RawResponseCapability,\n} from \"./types\";\n\nexport type WebhookHmacEncoding = \"base64\" | \"hex\";\nexport type WebhookHmacAlgorithm = \"SHA-256\" | \"SHA-384\" | \"SHA-512\";\n\nexport type WebhookHmacContext = HttpRouteContext & {\n rawBody: Uint8Array;\n text: () => string;\n};\n\nexport type WebhookHmacOptions = {\n algorithm?: WebhookHmacAlgorithm;\n encoding?: WebhookHmacEncoding;\n handler: (context: WebhookHmacContext) => MaybePromise<Response>;\n header?: string;\n prefix?: false | string;\n secret: string;\n};\n\nexport const webhook = {\n hmac(options: WebhookHmacOptions) {\n return {\n kind: \"response\",\n response: async (context) => {\n const rawBody = new Uint8Array(await context.request.arrayBuffer());\n const signature = context.request.headers.get(\n options.header ?? \"x-webhook-signature\",\n );\n\n if (!signature) {\n return new Response(\"Missing webhook signature.\", {\n status: 401,\n });\n }\n\n if (!(await verifyHmacSignature(rawBody, signature, options))) {\n return new Response(\"Invalid webhook signature.\", {\n status: 401,\n });\n }\n\n return await options.handler({\n ...context,\n rawBody,\n text: () => new TextDecoder().decode(rawBody),\n });\n },\n security: {\n csrf: false,\n },\n } satisfies RawResponseCapability;\n },\n};\n\nasync function verifyHmacSignature(\n rawBody: Uint8Array,\n suppliedSignature: string,\n options: WebhookHmacOptions,\n) {\n const algorithm = options.algorithm ?? \"SHA-256\";\n const encoding = options.encoding ?? \"hex\";\n const normalized = normalizeSignature(\n suppliedSignature,\n algorithm,\n options.prefix,\n );\n const signature = decodeSignature(normalized, encoding);\n\n if (!signature) {\n return false;\n }\n\n const key = await globalThis.crypto.subtle.importKey(\n \"raw\",\n new TextEncoder().encode(options.secret),\n {\n hash: algorithm,\n name: \"HMAC\",\n },\n false,\n [\"verify\"],\n );\n return await globalThis.crypto.subtle.verify(\n \"HMAC\",\n key,\n signature,\n Uint8Array.from(rawBody).buffer,\n );\n}\n\nfunction normalizeSignature(\n signature: string,\n algorithm: WebhookHmacAlgorithm,\n configuredPrefix: false | string | undefined,\n) {\n const trimmed = signature.trim();\n const prefix =\n configuredPrefix === undefined\n ? `${algorithm.toLowerCase().replace(\"-\", \"\")}=`\n : configuredPrefix;\n\n if (prefix !== false && trimmed.startsWith(prefix)) {\n return trimmed.slice(prefix.length).trim();\n }\n\n return trimmed;\n}\n\nfunction decodeSignature(value: string, encoding: WebhookHmacEncoding) {\n if (encoding === \"hex\") {\n if (!/^(?:[0-9a-f]{2})+$/i.test(value)) {\n return null;\n }\n\n return Uint8Array.from(value.match(/.{2}/g) ?? [], (pair) =>\n Number.parseInt(pair, 16),\n );\n }\n\n if (\n !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n )\n ) {\n return null;\n }\n\n try {\n const binary =\n typeof atob === \"function\"\n ? atob(value)\n : Buffer.from(value, \"base64\").toString(\"binary\");\n\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\n } catch {\n return null;\n }\n}\n","import {\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","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","import type { HttpMethod } from \"../route/types\";\nimport type { ScriptTag } from \"../document/scripts\";\nimport { createSecurityHeaders } from \"./policy\";\nimport { validateCorsPolicy } from \"./cors\";\nimport type {\n ContentSecurityPolicy,\n CorsPolicy,\n CspSource,\n RouteSecurityPolicy,\n ScriptDependencyAuditOptions,\n SecurityAudit,\n SecurityAuditFinding,\n SecurityAuditOptions,\n SecurityHeadersOptions,\n SecurityPolicy,\n} from \"./types\";\n\nconst unsafeMethods = new Set<HttpMethod>([\"DELETE\", \"PATCH\", \"POST\", \"PUT\"]);\n\nexport function createSecurityAudit(options: SecurityAuditOptions = {}) {\n const findings: SecurityAuditFinding[] = [];\n const document = options.document;\n const headers = document\n ? auditDocumentPolicy(document.policy, document.headers, findings)\n : {};\n\n if (document) {\n auditReportOnlyDelivery(document.policy, findings);\n }\n const route = options.route\n ? auditRoutePolicy(options.route, findings)\n : undefined;\n\n if (document?.scripts) {\n auditDocumentScripts(\n document.policy.csp,\n document.scripts,\n document.headers,\n findings,\n );\n\n if (document.scriptDependencies) {\n findings.push(\n ...auditScriptDependencies(\n document.scripts,\n normalizeScriptDependencyAuditOptions(document.scriptDependencies),\n ),\n );\n }\n }\n\n return {\n findings,\n headers,\n route,\n } satisfies SecurityAudit;\n}\n\nfunction auditReportOnlyDelivery(\n policy: SecurityPolicy,\n findings: SecurityAuditFinding[],\n) {\n if (!policy.trustedTypes || policy.trustedTypes.mode !== \"report-only\") {\n return;\n }\n\n const csp = policy.csp || undefined;\n const hasLegacyTarget = Boolean(csp?.reportUri?.length);\n const endpoints = policy.headers?.reportingEndpoints;\n const hasReportingApiTarget = Boolean(\n csp?.reportTo && endpoints && endpoints[csp.reportTo],\n );\n\n if (!hasLegacyTarget && !hasReportingApiTarget) {\n findings.push({\n code: \"report-only-target-missing\",\n message:\n \"Trusted Types report-only mode has no deliverable target. Configure CSP reportTo with a matching Reporting-Endpoints member, reportUri for compatibility, or both.\",\n severity: \"warning\",\n });\n }\n}\n\nexport function auditScriptDependencies(\n scripts: readonly ScriptTag[],\n options: ScriptDependencyAuditOptions = {},\n) {\n const requirePurpose = options.requirePurpose ?? true;\n const findings: SecurityAuditFinding[] = [];\n\n for (const script of scripts) {\n const dependency = getExternalScriptDependency(script);\n\n if (!dependency) {\n continue;\n }\n\n if (requirePurpose && !script.purpose) {\n findings.push({\n code: \"script-purpose-missing\",\n message: `Third-party script ${script.src} should declare a purpose for audits and consent flows.`,\n severity: \"warning\",\n });\n }\n\n if (options.requireIntegrity && !script.integrity) {\n findings.push({\n code: \"script-integrity-missing\",\n message: `Third-party script ${script.src} should declare an integrity hash or an explicit trust-boundary exception.`,\n severity: \"warning\",\n });\n }\n\n if (\n script.strategy === \"beforeInteractive\" &&\n !options.allowBeforeInteractiveThirdParty\n ) {\n findings.push({\n code: \"script-third-party-before-interactive\",\n message: `Third-party script ${script.src} runs before the app is interactive and should be justified by policy.`,\n severity: \"warning\",\n });\n }\n\n if (isGoogleTagManager(dependency)) {\n findings.push({\n code: \"script-gtm-wide-trust-boundary\",\n message:\n \"Google Tag Manager can load additional scripts at runtime and should be treated as a wide trust boundary.\",\n severity: \"warning\",\n });\n }\n }\n\n return findings;\n}\n\nfunction auditDocumentPolicy(\n policy: SecurityPolicy,\n options: SecurityHeadersOptions | undefined,\n findings: SecurityAuditFinding[],\n) {\n try {\n return Object.fromEntries(createSecurityHeaders(policy, options));\n } catch (error) {\n findings.push({\n code: \"security-header-render-failed\",\n message: error instanceof Error ? error.message : \"Security headers failed to render.\",\n severity: \"error\",\n });\n\n return {};\n }\n}\n\nfunction auditDocumentScripts(\n policy: SecurityPolicy[\"csp\"],\n scripts: readonly ScriptTag[],\n options: SecurityHeadersOptions | undefined,\n findings: SecurityAuditFinding[],\n) {\n if (!policy) {\n return;\n }\n\n const scriptSrc = getScriptSources(policy);\n\n for (const script of scripts) {\n if (requiresScriptNonce(scriptSrc) && !script.nonce) {\n findings.push({\n code: \"csp-script-missing-nonce\",\n message: `Document script ${script.src} needs a nonce for the effective script-src policy.`,\n severity: \"error\",\n });\n continue;\n }\n\n if (script.nonce && options?.nonce && script.nonce === options.nonce) {\n continue;\n }\n\n if (!allowsScriptSource(scriptSrc, script.src)) {\n findings.push({\n code: \"csp-script-src-blocked\",\n message: `Document script ${script.src} is not allowed by the effective script-src policy.`,\n severity: \"error\",\n });\n }\n }\n}\n\nfunction normalizeScriptDependencyAuditOptions(\n options: boolean | ScriptDependencyAuditOptions,\n): ScriptDependencyAuditOptions {\n return typeof options === \"boolean\" ? {} : options;\n}\n\nfunction getScriptSources(policy: ContentSecurityPolicy) {\n return policy.scriptSrc ?? policy.defaultSrc ?? [];\n}\n\nfunction requiresScriptNonce(sources: readonly CspSource[]) {\n return sources.some((source) => source.includes(\"'nonce-{nonce}'\"));\n}\n\nfunction allowsScriptSource(sources: readonly CspSource[], src: string) {\n if (sources.includes(\"*\")) {\n return true;\n }\n\n if (sources.includes(\"'none'\")) {\n return false;\n }\n\n if (sources.some((source) => source.startsWith(\"'nonce-\"))) {\n return false;\n }\n\n if (sources.includes(\"'self'\") && isSameOriginPath(src)) {\n return true;\n }\n\n if (src.startsWith(\"https:\") && sources.includes(\"https:\")) {\n return true;\n }\n\n if (src.startsWith(\"http:\") && sources.includes(\"http:\")) {\n return true;\n }\n\n return sources.some((source) => sourceMatchesScriptSource(source, src));\n}\n\nfunction isSameOriginPath(src: string) {\n return src.startsWith(\"/\") && !src.startsWith(\"//\");\n}\n\nfunction sourceMatchesScriptSource(source: CspSource, src: string) {\n if (source.startsWith(\"'\")) {\n return false;\n }\n\n try {\n const sourceUrl = new URL(source);\n const scriptUrl = new URL(src);\n\n return (\n scriptUrl.protocol === sourceUrl.protocol &&\n scriptUrl.hostname === sourceUrl.hostname &&\n scriptUrl.port === sourceUrl.port &&\n (sourceUrl.pathname === \"/\" || scriptUrl.pathname.startsWith(sourceUrl.pathname))\n );\n } catch {\n return false;\n }\n}\n\nfunction auditRoutePolicy(\n route: NonNullable<SecurityAuditOptions[\"route\"]>,\n findings: SecurityAuditFinding[],\n) {\n auditCorsPolicy(route.cors, findings);\n auditUnsafeMethodPolicy(route.method, route.security, findings);\n\n return {\n cors: route.cors,\n method: route.method,\n security: route.security,\n };\n}\n\nfunction auditCorsPolicy(\n policy: CorsPolicy | undefined,\n findings: SecurityAuditFinding[],\n) {\n if (!policy) {\n return;\n }\n\n try {\n validateCorsPolicy(policy);\n } catch (error) {\n findings.push({\n code: \"cors-invalid\",\n message: error instanceof Error ? error.message : \"CORS policy is invalid.\",\n severity: \"error\",\n });\n }\n}\n\nfunction auditUnsafeMethodPolicy(\n method: HttpMethod,\n policy: RouteSecurityPolicy | undefined,\n findings: SecurityAuditFinding[],\n) {\n if (!unsafeMethods.has(method)) {\n return;\n }\n\n if (policy?.csrf === false) {\n findings.push({\n code: \"csrf-disabled\",\n message: \"CSRF protection is explicitly disabled for this unsafe route.\",\n severity: \"info\",\n });\n }\n\n if (!policy?.rateLimit) {\n findings.push({\n code: \"rate-limit-missing\",\n message: \"Unsafe routes should declare rate limiting.\",\n severity: \"warning\",\n });\n }\n\n if (!policy?.request?.maxBodySize) {\n findings.push({\n code: \"request-body-limit-missing\",\n message: \"Unsafe routes should declare a request body size limit.\",\n severity: \"warning\",\n });\n }\n}\n\nfunction getExternalScriptDependency(script: ScriptTag) {\n try {\n const url = new URL(script.src);\n\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n return url;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction isGoogleTagManager(url: URL) {\n return (\n url.hostname === \"www.googletagmanager.com\" &&\n (url.pathname === \"/gtm.js\" || url.pathname === \"/ns.html\")\n );\n}\n","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"],"names":["defineSitemap","entries","renderSitemap","sitemap","entry","renderSitemapEntry","defineRobots","options","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","value","priority","maxLength","action","response","context","input","actionContext","run","resolveActionResult","key","actionInput","request","result","toResponse","page","webhook","rawBody","signature","verifyHmacSignature","suppliedSignature","algorithm","encoding","normalized","normalizeSignature","decodeSignature","configuredPrefix","trimmed","prefix","pair","binary","character","defaultIdempotencyTtl","defaultMaximumEntries","createMemoryIdempotencyStore","now","defaultTtl","maximumEntries","defaultTtlMs","parseCacheDuration","serializeCacheKey","currentTime","sweepExpiredIdempotencyEntries","existing","evictOldestCompletedIdempotencyEntry","error","runIdempotentMutation","store","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","policy","isAllowedImageSource","src","classifyImageSource","planImageTransform","source","validateImageDimension","validateImageQuality","format","variants","normalizeVariantWidths","createOptimizerUrl","primaryVariant","variant","url","isAllowedRemoteImage","remotes","remote","matchesRemoteOrigin","matchesRemotePattern","origin","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","unsafeMethods","createSecurityAudit","findings","document","auditDocumentPolicy","auditReportOnlyDelivery","route","auditRoutePolicy","auditDocumentScripts","auditScriptDependencies","normalizeScriptDependencyAuditOptions","csp","hasLegacyTarget","endpoints","hasReportingApiTarget","scripts","requirePurpose","dependency","getExternalScriptDependency","isGoogleTagManager","createSecurityHeaders","scriptSrc","getScriptSources","requiresScriptNonce","allowsScriptSource","sources","isSameOriginPath","sourceMatchesScriptSource","sourceUrl","scriptUrl","auditCorsPolicy","auditUnsafeMethodPolicy","validateCorsPolicy","method","EnvValidationError","issues","formatEnvValidationError","defineEnvSchema","schema","validateEnv","values","variable","rawValue","booleanEnv","createVariable","enumEnv","integerEnv","parsed","secretEnv","parseString","stringEnv","urlEnv","env","sensitive","parse","createSecurityReportHandler","contentTypeResponse","enforceReportContentType","bodySizeResponse","enforceReportBodySize","limitRequestBody","payload","RequestBodyTooLargeError","reports","normalizeSecurityReports","index","supportedReportContentTypes","mediaType","contentLength","declaredSize","parseBodySize","isObject","validateUploads","formData","files","totalSize","field","filePolicy","fieldFiles","isFile","file","validateFile","isAllowedFileType","type","allowedTypes","allowedType","checkWebSocketOrigin","normalizedOrigin","normalizeOrigin","allowed","isAllowedOrigin","enforceWebSocketOrigin","allowedOrigin","originMatches","actualOrigin","schemeSeparator","authority"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { collectStaticRoutePaths as unstable_collectStaticRoutePaths, createRouteManifest as unstable_createRouteManifest, findPageMatch as unstable_findPageMatch, findRouteMatch as unstable_findRouteMatch, isAttachedFileForRoute as unstable_isAttachedFileForRoute, isLayoutForPage as unstable_isLayoutForPage, loadErrorFallback as unstable_loadErrorFallback, loadLoadingFallback as unstable_loadLoadingFallback, loadPageRoute as unstable_loadPageRoute, loadRoute as unstable_loadRoute, matchSegments as unstable_matchSegments, scoreRoute as unstable_scoreRoute, splitPathname as unstable_splitPathname, toRouteSegments as unstable_toRouteSegments, } from "../router";
2
+ export { handleRequestWithManifest } from "../server";
3
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/internal/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,IAAI,gCAAgC,EAC3D,mBAAmB,IAAI,4BAA4B,EACnD,aAAa,IAAI,sBAAsB,EACvC,cAAc,IAAI,uBAAuB,EACzC,sBAAsB,IAAI,+BAA+B,EACzD,eAAe,IAAI,wBAAwB,EAC3C,iBAAiB,IAAI,0BAA0B,EAC/C,mBAAmB,IAAI,4BAA4B,EACnD,aAAa,IAAI,sBAAsB,EACvC,SAAS,IAAI,kBAAkB,EAC/B,aAAa,IAAI,sBAAsB,EACvC,UAAU,IAAI,mBAAmB,EACjC,aAAa,IAAI,sBAAsB,EACvC,eAAe,IAAI,wBAAwB,GAC5C,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { h as o, a as u, c as n, aq as b, f as i, ar as _, as as r, k as c, l as d, j as h, at as R, au as m, av as f, aw as g, ax as p } from "../chunks/testing-DR3eQAvY.js";
2
+ import "react-dom/server";
3
+ import "react";
4
+ import "react/jsx-runtime";
5
+ export {
6
+ o as handleRequestWithManifest,
7
+ u as unstable_collectStaticRoutePaths,
8
+ n as unstable_createRouteManifest,
9
+ b as unstable_findPageMatch,
10
+ i as unstable_findRouteMatch,
11
+ _ as unstable_isAttachedFileForRoute,
12
+ r as unstable_isLayoutForPage,
13
+ c as unstable_loadErrorFallback,
14
+ d as unstable_loadLoadingFallback,
15
+ h as unstable_loadPageRoute,
16
+ R as unstable_loadRoute,
17
+ m as unstable_matchSegments,
18
+ f as unstable_scoreRoute,
19
+ g as unstable_splitPathname,
20
+ p as unstable_toRouteSegments
21
+ };
22
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,28 @@
1
+ import type { IncomingHttpHeaders, IncomingMessage, ServerResponse } from "node:http";
2
+ export type HttpScheme = "http" | "https";
3
+ export type NodeOriginPolicy = {
4
+ allowedHosts: readonly string[];
5
+ trustProxy?: TrustProxy;
6
+ };
7
+ export type ToWebRequestOptions = NodeOriginPolicy & {
8
+ signal?: AbortSignal;
9
+ };
10
+ export type TrustProxy = false | {
11
+ hops: number;
12
+ } | {
13
+ ranges: readonly string[];
14
+ };
15
+ export declare class UnsupportedMethodError extends Error {
16
+ method: string;
17
+ constructor(method: string);
18
+ }
19
+ export declare class UntrustedHostError extends Error {
20
+ host: string;
21
+ constructor(host: string);
22
+ }
23
+ export declare function validateNodeOriginPolicy(policy: NodeOriginPolicy): void;
24
+ export declare function toWebRequest(request: IncomingMessage, options: ToWebRequestOptions): Request;
25
+ export declare function writeNotImplemented(serverResponse: ServerResponse): void;
26
+ export declare function writeWebResponse(serverResponse: ServerResponse, webResponse: Response): Promise<void>;
27
+ export declare function toHeaders(headers: IncomingHttpHeaders): Headers;
28
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/node/http.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EACf,cAAc,EACf,MAAM,WAAW,CAAC;AAGnB,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB,KAAK,GACL;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAclC,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,EAAE,MAAM,CAAC;gBAEH,MAAM,EAAE,MAAM;CAK3B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,IAAI,EAAE,MAAM,CAAC;gBAED,IAAI,EAAE,MAAM;CAKzB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,QA+BhE;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,mBAAmB,WA0C7B;AAgOD,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,cAAc,QAIjE;AAED,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,QAAQ,iBAgDtB;AAsBD,wBAAgB,SAAS,CAAC,OAAO,EAAE,mBAAmB,WAiBrD"}
@@ -0,0 +1,45 @@
1
+ import type { IncomingMessage, Server, ServerResponse } from "node:http";
2
+ import type { RequestHandler } from "../server";
3
+ import type { StaticFileHandler, StaticFileHandlerOptions } from "./static";
4
+ export { UntrustedHostError, UnsupportedMethodError, toHeaders, toWebRequest, validateNodeOriginPolicy, writeWebResponse, } from "./http";
5
+ export { createStaticFileHandler } from "./static";
6
+ export { renderNodePageResponse, renderStreamingPageResponse, } from "./streaming";
7
+ export type { HttpScheme, NodeOriginPolicy, ToWebRequestOptions, TrustProxy, } from "./http";
8
+ export type { StaticFileHandler, StaticFileHandlerOptions } from "./static";
9
+ export declare const nodeAdapter: import("..").Adapter;
10
+ export type NodeRequestListener = (request: IncomingMessage, response: ServerResponse) => void;
11
+ export type NodeRequestListenerOptions = import("./http").NodeOriginPolicy & {
12
+ handler: RequestHandler;
13
+ onError?: (error: unknown, request: IncomingMessage) => void;
14
+ static?: StaticFileHandler | StaticFileHandlerOptions;
15
+ };
16
+ export type NodeServerTimeouts = {
17
+ headersTimeout: number;
18
+ keepAliveTimeout: number;
19
+ requestTimeout: number;
20
+ };
21
+ export type NodeShutdownSignal = "SIGINT" | "SIGTERM";
22
+ export type NodeServerState = "draining" | "ready" | "stopped";
23
+ export type NodeGracefulShutdownOptions = {
24
+ gracePeriod?: number;
25
+ onBackgroundError?: (error: unknown) => void;
26
+ onStateChange?: (state: NodeServerState) => void;
27
+ signals?: readonly NodeShutdownSignal[];
28
+ };
29
+ export type NodeServerOptions = NodeRequestListenerOptions & {
30
+ shutdown?: NodeGracefulShutdownOptions;
31
+ timeouts?: Partial<NodeServerTimeouts>;
32
+ };
33
+ export type NodeServer = Server & {
34
+ isReady: () => boolean;
35
+ shutdown: () => Promise<void>;
36
+ waitUntil: (promise: Promise<unknown>) => void;
37
+ };
38
+ export declare const defaultNodeServerTimeouts: {
39
+ readonly headersTimeout: 66000;
40
+ readonly keepAliveTimeout: 65000;
41
+ readonly requestTimeout: 300000;
42
+ };
43
+ export declare function createNodeRequestListener(options: NodeRequestListenerOptions): NodeRequestListener;
44
+ export declare function createNodeServer(options: NodeServerOptions): NodeServer;
45
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAUhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAE5E,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,SAAS,EACT,YAAY,EACZ,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EACL,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,QAAQ,CAAC;AAChB,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAE5E,eAAO,MAAM,WAAW,sBAQtB,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAChC,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,cAAc,KACrB,IAAI,CAAC;AAEV,MAAM,MAAM,0BAA0B,GAAG,OAAO,QAAQ,EAAE,gBAAgB,GAAG;IAC3E,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IAC7D,MAAM,CAAC,EAAE,iBAAiB,GAAG,wBAAwB,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,CAAC;AACtD,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/D,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACjD,OAAO,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,0BAA0B,GAAG;IAC3D,QAAQ,CAAC,EAAE,2BAA2B,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAChC,OAAO,EAAE,MAAM,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CAChD,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;CAIC,CAAC;AAIxC,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,0BAA0B,GAClC,mBAAmB,CAsDrB;AAoCD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,iBAAiB,GACzB,UAAU,CAQZ"}