@reckona/mreact-router 0.0.141 → 0.0.142

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 (62) hide show
  1. package/README.md +4 -2
  2. package/dist/actions.d.ts +1 -1
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +28 -8
  5. package/dist/actions.js.map +1 -1
  6. package/dist/adapters/cloudflare.d.ts.map +1 -1
  7. package/dist/adapters/cloudflare.js +31 -12
  8. package/dist/adapters/cloudflare.js.map +1 -1
  9. package/dist/build.d.ts.map +1 -1
  10. package/dist/build.js +470 -12
  11. package/dist/build.js.map +1 -1
  12. package/dist/cli-options.js +1 -1
  13. package/dist/cli-options.js.map +1 -1
  14. package/dist/client-route-inference.d.ts +1 -1
  15. package/dist/client-route-inference.d.ts.map +1 -1
  16. package/dist/client-route-inference.js +1 -1
  17. package/dist/client-route-inference.js.map +1 -1
  18. package/dist/client.d.ts +8 -1
  19. package/dist/client.d.ts.map +1 -1
  20. package/dist/client.js +16 -0
  21. package/dist/client.js.map +1 -1
  22. package/dist/config.js +1 -1
  23. package/dist/config.js.map +1 -1
  24. package/dist/import-policy.js +7 -0
  25. package/dist/import-policy.js.map +1 -1
  26. package/dist/index.d.ts +2 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +1 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/metadata.d.ts +1 -0
  31. package/dist/metadata.d.ts.map +1 -1
  32. package/dist/metadata.js +288 -1
  33. package/dist/metadata.js.map +1 -1
  34. package/dist/middleware.d.ts +5 -0
  35. package/dist/middleware.d.ts.map +1 -1
  36. package/dist/middleware.js +13 -0
  37. package/dist/middleware.js.map +1 -1
  38. package/dist/render.d.ts.map +1 -1
  39. package/dist/render.js +41 -9
  40. package/dist/render.js.map +1 -1
  41. package/dist/typed-routes.d.ts +24 -0
  42. package/dist/typed-routes.d.ts.map +1 -0
  43. package/dist/typed-routes.js +60 -0
  44. package/dist/typed-routes.js.map +1 -0
  45. package/dist/vite.d.ts.map +1 -1
  46. package/dist/vite.js +22 -1
  47. package/dist/vite.js.map +1 -1
  48. package/package.json +11 -11
  49. package/src/actions.ts +39 -12
  50. package/src/adapters/cloudflare.ts +48 -12
  51. package/src/build.ts +491 -11
  52. package/src/cli-options.ts +1 -1
  53. package/src/client-route-inference.ts +1 -0
  54. package/src/client.ts +28 -1
  55. package/src/config.ts +1 -1
  56. package/src/import-policy.ts +8 -0
  57. package/src/index.ts +9 -0
  58. package/src/metadata.ts +388 -1
  59. package/src/middleware.ts +22 -0
  60. package/src/render.ts +58 -7
  61. package/src/typed-routes.ts +121 -0
  62. package/src/vite.ts +25 -0
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n escapeHtmlAttribute,\n escapeHtmlText as escapeHtml,\n} from \"@reckona/mreact-shared/html-escape\";\nimport { contentSecurityPolicy } from \"./csp.js\";\nimport type { AppFileConvention } from \"./file-conventions.js\";\nimport type { AppRoute } from \"./routes.js\";\nimport { routeSecurityHeaders } from \"./security-headers.js\";\nimport type {\n MetadataImage,\n MetadataScalar,\n MetadataThemeColor,\n MetadataViewport,\n RobotsManifest,\n RouteHeadDescriptor,\n RouteMetadata,\n RouteParams,\n SitemapEntry,\n} from \"./types.js\";\n\ntype CspDirectiveMap = Record<string, readonly string[] | string>;\n\nconst DEFAULT_HTML_RESPONSE_HEADERS = Object.freeze({\n \"content-type\": \"text/html; charset=utf-8\",\n});\n\nexport function mergeRouteMetadata(metadata: readonly RouteMetadata[]): RouteMetadata | undefined {\n if (metadata.length === 0) {\n return undefined;\n }\n\n return metadata.reduce<RouteMetadata>((merged, next) => {\n const mergedMetadata: RouteMetadata = { ...merged, ...next };\n const alternates = mergeObject(merged.alternates, next.alternates);\n const csp = mergeCspMetadata(merged.csp, next.csp);\n const head = mergeReadonlyArrays(merged.head, next.head);\n const icons = mergeObject(merged.icons, next.icons);\n const openGraph = mergeOpenGraphMetadata(merged.openGraph, next.openGraph);\n\n if (alternates !== undefined) {\n mergedMetadata.alternates = alternates;\n }\n if (csp !== undefined) {\n mergedMetadata.csp = csp;\n }\n if (head !== undefined) {\n mergedMetadata.head = head;\n }\n if (icons !== undefined) {\n mergedMetadata.icons = icons;\n }\n if (openGraph !== undefined) {\n mergedMetadata.openGraph = openGraph;\n }\n\n return mergedMetadata;\n }, {});\n}\n\nexport function applyFileConventionMetadata(\n metadata: RouteMetadata | undefined,\n routes: readonly AppRoute[],\n filename: string,\n params: RouteParams,\n): RouteMetadata | undefined {\n const next: RouteMetadata = metadata === undefined ? {} : { ...metadata };\n const iconRoute = routes.find((route) => route.kind === \"asset\" && route.convention === \"icon\");\n const appleIconRoute = routes.find(\n (route) => route.kind === \"asset\" && route.convention === \"apple-icon\",\n );\n const openGraphImagePath = fileConventionMetadataRoutePath(\n routes,\n filename,\n params,\n \"opengraph-image\",\n );\n\n if (iconRoute !== undefined && next.icons?.icon === undefined) {\n next.icons = { ...next.icons, icon: iconRoute.path };\n }\n if (appleIconRoute !== undefined && next.icons?.apple === undefined) {\n next.icons = { ...next.icons, apple: appleIconRoute.path };\n }\n if (\n openGraphImagePath !== undefined &&\n next.openGraph?.image === undefined &&\n (next.openGraph?.images === undefined || next.openGraph.images.length === 0)\n ) {\n next.openGraph = { ...next.openGraph, image: openGraphImagePath };\n }\n\n return Object.keys(next).length === 0 ? undefined : next;\n}\n\nexport function injectHeadMetadata(html: string, metadata: RouteMetadata | undefined): string {\n if (metadata === undefined) {\n return html;\n }\n\n let nextHtml =\n metadata.lang === undefined\n ? html\n : injectHtmlLangAttribute(html, metadataString(metadata.lang, \"lang\"));\n const tags = [\n metadata.title === undefined\n ? undefined\n : `<title>${escapeHtml(metadataString(metadata.title, \"title\"))}</title>`,\n metadata.description === undefined\n ? undefined\n : `<meta name=\"description\" content=\"${escapeHtmlAttribute(metadataString(metadata.description, \"description\"))}\">`,\n metadata.alternates?.canonical === undefined\n ? undefined\n : `<link rel=\"canonical\" href=\"${escapeHtmlAttribute(metadataString(metadata.alternates.canonical, \"alternates.canonical\"))}\">`,\n metadata.openGraph?.title === undefined\n ? undefined\n : `<meta property=\"og:title\" content=\"${escapeHtmlAttribute(metadataString(metadata.openGraph.title, \"openGraph.title\"))}\">`,\n metadata.openGraph?.description === undefined\n ? undefined\n : `<meta property=\"og:description\" content=\"${escapeHtmlAttribute(metadataString(metadata.openGraph.description, \"openGraph.description\"))}\">`,\n ...openGraphImages(metadata.openGraph).map(\n (image) => `<meta property=\"og:image\" content=\"${escapeHtmlAttribute(image)}\">`,\n ),\n metadata.icons?.icon === undefined\n ? undefined\n : `<link rel=\"icon\" href=\"${escapeHtmlAttribute(metadataString(metadata.icons.icon, \"icons.icon\"))}\">`,\n metadata.icons?.apple === undefined\n ? undefined\n : `<link rel=\"apple-touch-icon\" href=\"${escapeHtmlAttribute(metadataString(metadata.icons.apple, \"icons.apple\"))}\">`,\n metadata.robots === undefined\n ? undefined\n : `<meta name=\"robots\" content=\"${escapeHtmlAttribute(robotsContent(metadata.robots))}\">`,\n metadata.themeColor === undefined ? undefined : themeColorTag(metadata.themeColor),\n metadata.viewport === undefined\n ? undefined\n : `<meta name=\"viewport\" content=\"${escapeHtmlAttribute(viewportContent(metadata.viewport))}\">`,\n ...headDescriptorTags(metadata.head, metadata.csp?.nonce),\n ]\n .filter((tag): tag is string => tag !== undefined)\n .join(\"\");\n\n if (tags === \"\") {\n return nextHtml;\n }\n\n if (/<head(?:\\s[^>]*)?>/i.test(nextHtml)) {\n return nextHtml.replace(/<head(\\s[^>]*)?>/i, (match) => `${match}${tags}`);\n }\n\n if (/<html(?:\\s[^>]*)?>/i.test(nextHtml)) {\n return nextHtml.replace(/<html(\\s[^>]*)?>/i, (match) => `${match}<head>${tags}</head>`);\n }\n\n return `<head>${tags}</head>${nextHtml}`;\n}\n\nexport function responseHeadersForMetadata(\n metadata: RouteMetadata | undefined,\n request: Request,\n extra?: Readonly<Record<string, string>>,\n): HeadersInit {\n const csp = contentSecurityPolicy(metadata?.csp);\n const security = routeSecurityHeaders({\n request,\n security: metadata?.security,\n });\n\n if (csp === undefined && extra === undefined) {\n return {\n ...DEFAULT_HTML_RESPONSE_HEADERS,\n ...security,\n };\n }\n\n return {\n ...DEFAULT_HTML_RESPONSE_HEADERS,\n ...security,\n ...(csp === undefined ? undefined : { \"content-security-policy\": csp }),\n ...extra,\n };\n}\n\nexport function serializeRobots(manifest: RobotsManifest): string {\n const lines: string[] = [];\n const rules =\n manifest.rules === undefined\n ? []\n : Array.isArray(manifest.rules)\n ? manifest.rules\n : [manifest.rules];\n\n for (const rule of rules) {\n for (const userAgent of arrayValue(rule.userAgent)) {\n lines.push(`User-agent: ${userAgent}`);\n }\n for (const allow of arrayValue(rule.allow)) {\n lines.push(`Allow: ${allow}`);\n }\n for (const disallow of arrayValue(rule.disallow)) {\n lines.push(`Disallow: ${disallow}`);\n }\n }\n\n for (const sitemap of arrayValue(manifest.sitemap)) {\n lines.push(`Sitemap: ${sitemap}`);\n }\n if (manifest.host !== undefined) {\n lines.push(`Host: ${manifest.host}`);\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport function serializeSitemap(entries: readonly SitemapEntry[]): string {\n const urls = entries\n .map((entry) => {\n const fields = [\n `<loc>${escapeXml(entry.url)}</loc>`,\n entry.lastModified === undefined\n ? undefined\n : `<lastmod>${escapeXml(sitemapDate(entry.lastModified))}</lastmod>`,\n entry.changeFrequency === undefined\n ? undefined\n : `<changefreq>${escapeXml(entry.changeFrequency)}</changefreq>`,\n entry.priority === undefined ? undefined : `<priority>${entry.priority}</priority>`,\n ].filter((field): field is string => field !== undefined);\n\n return `<url>${fields.join(\"\")}</url>`;\n })\n .join(\"\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?><urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">${urls}</urlset>`;\n}\n\nfunction fileConventionMetadataRoutePath(\n routes: readonly AppRoute[],\n filename: string,\n params: RouteParams,\n convention: AppFileConvention,\n): string | undefined {\n const pageRoute = routes.find((route) => route.kind === \"page\" && route.file === filename);\n const candidateRoutes = routes.filter(\n (route) =>\n (route.kind === \"asset\" || route.kind === \"metadata\") &&\n route.convention === convention,\n );\n\n if (pageRoute !== undefined) {\n const expectedPath = pageRoute.path === \"/\" ? `/${convention}` : `${pageRoute.path}/${convention}`;\n const routeLocal = candidateRoutes.find((route) => route.path === expectedPath);\n const routeLocalPath =\n routeLocal === undefined ? undefined : concreteRoutePath(routeLocal.path, params);\n\n if (routeLocalPath !== undefined) {\n return routeLocalPath;\n }\n }\n\n return candidateRoutes.find((route) => route.path === `/${convention}`)?.path;\n}\n\nfunction concreteRoutePath(path: string, params: RouteParams): string | undefined {\n const segments = path === \"/\" ? [] : path.slice(1).split(\"/\");\n const concrete: string[] = [];\n\n for (const segment of segments) {\n if (segment.startsWith(\":...\")) {\n const value = params[segment.slice(4)];\n const values = Array.isArray(value)\n ? value\n : typeof value === \"string\"\n ? value.split(\"/\").filter((part) => part !== \"\")\n : undefined;\n\n if (values === undefined) {\n return undefined;\n }\n concrete.push(...values.map((part) => encodeURIComponent(part)));\n continue;\n }\n\n if (segment.startsWith(\":\")) {\n const value = params[segment.slice(1)];\n const stringValue = Array.isArray(value) ? value[0] : value;\n\n if (typeof stringValue !== \"string\") {\n return undefined;\n }\n concrete.push(encodeURIComponent(stringValue));\n continue;\n }\n\n concrete.push(segment);\n }\n\n return `/${concrete.join(\"/\")}`;\n}\n\nfunction mergeObject<T extends object>(left: T | undefined, right: T | undefined): T | undefined {\n if (left === undefined) {\n return right;\n }\n\n if (right === undefined) {\n return left;\n }\n\n return { ...left, ...right };\n}\n\nfunction mergeReadonlyArrays<T>(\n left: readonly T[] | undefined,\n right: readonly T[] | undefined,\n): readonly T[] | undefined {\n if (left === undefined || left.length === 0) {\n return right;\n }\n\n if (right === undefined || right.length === 0) {\n return left;\n }\n\n return [...left, ...right];\n}\n\nfunction mergeCspMetadata(\n left: RouteMetadata[\"csp\"],\n right: RouteMetadata[\"csp\"],\n): RouteMetadata[\"csp\"] | undefined {\n if (right?.disable === true) {\n return { disable: true };\n }\n\n if (left === undefined) {\n if (right === undefined) {\n return undefined;\n }\n\n const merged: NonNullable<RouteMetadata[\"csp\"]> = { ...right };\n const directives = applyCspOverrides(undefined, right);\n\n if (directives !== undefined) {\n merged.directives = directives;\n } else {\n delete merged.directives;\n }\n\n return merged;\n }\n\n if (right === undefined) {\n return left;\n }\n\n const merged: NonNullable<RouteMetadata[\"csp\"]> = {\n ...left,\n ...right,\n };\n const directives = applyCspOverrides(left.directives, right);\n\n if (directives !== undefined) {\n merged.directives = directives;\n } else {\n delete merged.directives;\n }\n\n return merged;\n}\n\nfunction applyCspOverrides(\n left: CspDirectiveMap | undefined,\n right: RouteMetadata[\"csp\"] | undefined,\n): CspDirectiveMap | undefined {\n if (right === undefined) {\n return left;\n }\n\n const merged = { ...left, ...right.directives };\n\n for (const [name, value] of Object.entries(right.replace ?? {})) {\n merged[name] = value;\n }\n\n for (const name of right.remove ?? []) {\n delete merged[name];\n }\n\n return Object.keys(merged).length === 0 ? undefined : merged;\n}\n\nfunction mergeOpenGraphMetadata(\n left: RouteMetadata[\"openGraph\"],\n right: RouteMetadata[\"openGraph\"],\n): RouteMetadata[\"openGraph\"] | undefined {\n if (left === undefined) {\n return right;\n }\n\n if (right === undefined) {\n return left;\n }\n\n const merged: NonNullable<RouteMetadata[\"openGraph\"]> = {\n ...left,\n ...right,\n };\n const images = mergeReadonlyArrays(openGraphImages(left), openGraphImages(right));\n\n if (images !== undefined && images.length > 0) {\n merged.images = images;\n }\n\n return merged;\n}\n\nfunction injectHtmlLangAttribute(html: string, lang: string): string {\n const escapedLang = escapeHtmlAttribute(lang);\n\n if (!/<html(?:\\s[^>]*)?>/i.test(html)) {\n return html;\n }\n\n return html.replace(/<html(\\s[^>]*)?>/i, (_match, attrs = \"\") => {\n const strippedAttrs = String(attrs).replace(/\\s+lang=(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/i, \"\");\n return `<html lang=\"${escapedLang}\"${strippedAttrs}>`;\n });\n}\n\nfunction sitemapDate(value: Date | number | string): string {\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n return typeof value === \"number\" ? new Date(value).toISOString() : value;\n}\n\nfunction arrayValue<T>(value: T | readonly T[] | undefined): readonly T[] {\n if (value === undefined) {\n return [];\n }\n\n return Array.isArray(value) ? (value as readonly T[]) : [value as T];\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\");\n}\n\nfunction headDescriptorTags(\n descriptors: readonly RouteHeadDescriptor[] | undefined,\n nonce: string | undefined,\n): string[] {\n return (descriptors ?? []).flatMap((descriptor) => {\n const descriptorNonce = descriptor.nonce === true ? nonce : descriptor.nonce || undefined;\n const attrs: Record<string, boolean | number | string | undefined> = {\n ...descriptor.attrs,\n ...(descriptorNonce === undefined ? {} : { nonce: descriptorNonce }),\n };\n const attrText = Object.entries(attrs)\n .flatMap(([name, value]) => {\n if (value === undefined || value === false) {\n return [];\n }\n\n return value === true\n ? [escapeHtmlAttribute(name)]\n : [`${escapeHtmlAttribute(name)}=\"${escapeHtmlAttribute(String(value))}\"`];\n })\n .join(\" \");\n const open = attrText === \"\" ? `<${descriptor.tag}>` : `<${descriptor.tag} ${attrText}>`;\n\n if (descriptor.tag === \"meta\" || descriptor.tag === \"link\" || descriptor.tag === \"base\") {\n return [open.slice(0, -1) + \">\"];\n }\n\n return [`${open}${escapeHeadTextContent(descriptor.content ?? \"\")}</${descriptor.tag}>`];\n });\n}\n\nfunction escapeHeadTextContent(value: string): string {\n return value.replaceAll(\"<\", \"\\\\u003c\");\n}\n\nfunction metadataString(value: MetadataScalar, path: string): string {\n if (isMetadataScalar(value)) {\n return String(value);\n }\n\n throw new Error(`Invalid metadata field ${path}: expected string, number, or boolean.`);\n}\n\nfunction metadataKebabName(name: string): string {\n return name.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`);\n}\n\nfunction viewportContent(viewport: MetadataScalar | MetadataViewport): string {\n if (isMetadataScalar(viewport)) {\n return metadataString(viewport, \"viewport\");\n }\n\n return Object.entries(viewport)\n .flatMap(([key, value]) => {\n if (value === undefined || value === null || value === false) {\n return [];\n }\n\n return [`${metadataKebabName(key)}=${metadataString(value, `viewport.${key}`)}`];\n })\n .join(\", \");\n}\n\nfunction themeColorTag(themeColor: MetadataScalar | MetadataThemeColor): string {\n if (isMetadataScalar(themeColor)) {\n return `<meta name=\"theme-color\" content=\"${escapeHtmlAttribute(metadataString(themeColor, \"themeColor\"))}\">`;\n }\n\n const content = themeColor.color;\n if (!isMetadataScalar(content)) {\n throw new Error(\n \"Invalid metadata field themeColor.color: expected string, number, or boolean.\",\n );\n }\n\n const media =\n themeColor.media === undefined\n ? \"\"\n : ` media=\"${escapeHtmlAttribute(metadataString(metadataScalarField(themeColor.media, \"themeColor.media\"), \"themeColor.media\"))}\"`;\n\n return `<meta name=\"theme-color\"${media} content=\"${escapeHtmlAttribute(metadataString(content, \"themeColor.color\"))}\">`;\n}\n\nfunction metadataScalarField(value: unknown, path: string): MetadataScalar {\n if (isMetadataScalar(value)) {\n return value;\n }\n\n throw new Error(`Invalid metadata field ${path}: expected string, number, or boolean.`);\n}\n\nfunction isMetadataScalar(value: unknown): value is MetadataScalar {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n\nfunction openGraphImages(openGraph: RouteMetadata[\"openGraph\"]): readonly string[] {\n if (openGraph?.images !== undefined) {\n return openGraph.images.map((image, index) =>\n metadataImageUrl(image, `openGraph.images.${index}`),\n );\n }\n\n return openGraph?.image === undefined ? [] : [metadataImageUrl(openGraph.image, \"openGraph.image\")];\n}\n\nfunction metadataImageUrl(value: MetadataImage | MetadataScalar, path: string): string {\n if (isMetadataScalar(value)) {\n return metadataString(value, path);\n }\n\n if (typeof value === \"object\" && value !== null && \"url\" in value) {\n return metadataString(value.url, `${path}.url`);\n }\n\n throw new Error(`Invalid metadata field ${path}: expected string, number, boolean, or object with url.`);\n}\n\nfunction robotsContent(robots: NonNullable<RouteMetadata[\"robots\"]>): string {\n if (typeof robots === \"string\") {\n return robots;\n }\n\n return [\n robots.index === false ? \"noindex\" : \"index\",\n robots.follow === false ? \"nofollow\" : \"follow\",\n ].join(\",\");\n}\n"]}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n escapeHtmlAttribute,\n escapeHtmlText as escapeHtml,\n} from \"@reckona/mreact-shared/html-escape\";\nimport {\n isDangerousHtmlAttribute,\n isUnsafeUrlAttribute,\n} from \"@reckona/mreact-shared/url-safety\";\nimport { contentSecurityPolicy } from \"./csp.js\";\nimport type { AppFileConvention } from \"./file-conventions.js\";\nimport type { AppRoute } from \"./routes.js\";\nimport { routeSecurityHeaders } from \"./security-headers.js\";\nimport type {\n MetadataImage,\n MetadataScalar,\n MetadataThemeColor,\n MetadataViewport,\n RobotsManifest,\n RouteHeadDescriptor,\n RouteMetadata,\n RouteParams,\n SitemapEntry,\n} from \"./types.js\";\n\ntype CspDirectiveMap = Record<string, readonly string[] | string>;\n\nconst DEFAULT_HTML_RESPONSE_HEADERS = Object.freeze({\n \"content-type\": \"text/html; charset=utf-8\",\n});\n\nexport function mergeRouteMetadata(metadata: readonly RouteMetadata[]): RouteMetadata | undefined {\n if (metadata.length === 0) {\n return undefined;\n }\n\n return metadata.reduce<RouteMetadata>((merged, next) => {\n const mergedMetadata: RouteMetadata = { ...merged, ...next };\n const alternates = mergeObject(merged.alternates, next.alternates);\n const csp = mergeCspMetadata(merged.csp, next.csp);\n const head = mergeReadonlyArrays(merged.head, next.head);\n const icons = mergeObject(merged.icons, next.icons);\n const openGraph = mergeOpenGraphMetadata(merged.openGraph, next.openGraph);\n\n if (alternates !== undefined) {\n mergedMetadata.alternates = alternates;\n }\n if (csp !== undefined) {\n mergedMetadata.csp = csp;\n }\n if (head !== undefined) {\n mergedMetadata.head = head;\n }\n if (icons !== undefined) {\n mergedMetadata.icons = icons;\n }\n if (openGraph !== undefined) {\n mergedMetadata.openGraph = openGraph;\n }\n\n return mergedMetadata;\n }, {});\n}\n\nexport function applyFileConventionMetadata(\n metadata: RouteMetadata | undefined,\n routes: readonly AppRoute[],\n filename: string,\n params: RouteParams,\n): RouteMetadata | undefined {\n const next: RouteMetadata = metadata === undefined ? {} : { ...metadata };\n const iconRoute = routes.find((route) => route.kind === \"asset\" && route.convention === \"icon\");\n const appleIconRoute = routes.find(\n (route) => route.kind === \"asset\" && route.convention === \"apple-icon\",\n );\n const openGraphImagePath = fileConventionMetadataRoutePath(\n routes,\n filename,\n params,\n \"opengraph-image\",\n );\n\n if (iconRoute !== undefined && next.icons?.icon === undefined) {\n next.icons = { ...next.icons, icon: iconRoute.path };\n }\n if (appleIconRoute !== undefined && next.icons?.apple === undefined) {\n next.icons = { ...next.icons, apple: appleIconRoute.path };\n }\n if (\n openGraphImagePath !== undefined &&\n next.openGraph?.image === undefined &&\n (next.openGraph?.images === undefined || next.openGraph.images.length === 0)\n ) {\n next.openGraph = { ...next.openGraph, image: openGraphImagePath };\n }\n\n return Object.keys(next).length === 0 ? undefined : next;\n}\n\nexport function injectHeadMetadata(html: string, metadata: RouteMetadata | undefined): string {\n validateRouteMetadata(metadata);\n\n if (metadata === undefined) {\n return html;\n }\n\n let nextHtml =\n metadata.lang === undefined\n ? html\n : injectHtmlLangAttribute(html, metadataString(metadata.lang, \"lang\"));\n const tags = [\n metadata.title === undefined\n ? undefined\n : `<title>${escapeHtml(metadataString(metadata.title, \"title\"))}</title>`,\n metadata.description === undefined\n ? undefined\n : `<meta name=\"description\" content=\"${escapeHtmlAttribute(metadataString(metadata.description, \"description\"))}\">`,\n metadata.alternates?.canonical === undefined\n ? undefined\n : `<link rel=\"canonical\" href=\"${escapeHtmlAttribute(metadataString(metadata.alternates.canonical, \"alternates.canonical\"))}\">`,\n metadata.openGraph?.title === undefined\n ? undefined\n : `<meta property=\"og:title\" content=\"${escapeHtmlAttribute(metadataString(metadata.openGraph.title, \"openGraph.title\"))}\">`,\n metadata.openGraph?.description === undefined\n ? undefined\n : `<meta property=\"og:description\" content=\"${escapeHtmlAttribute(metadataString(metadata.openGraph.description, \"openGraph.description\"))}\">`,\n ...openGraphImages(metadata.openGraph).map(\n (image) => `<meta property=\"og:image\" content=\"${escapeHtmlAttribute(image)}\">`,\n ),\n metadata.icons?.icon === undefined\n ? undefined\n : `<link rel=\"icon\" href=\"${escapeHtmlAttribute(metadataString(metadata.icons.icon, \"icons.icon\"))}\">`,\n metadata.icons?.apple === undefined\n ? undefined\n : `<link rel=\"apple-touch-icon\" href=\"${escapeHtmlAttribute(metadataString(metadata.icons.apple, \"icons.apple\"))}\">`,\n metadata.robots === undefined\n ? undefined\n : `<meta name=\"robots\" content=\"${escapeHtmlAttribute(robotsContent(metadata.robots))}\">`,\n metadata.themeColor === undefined ? undefined : themeColorTag(metadata.themeColor),\n metadata.viewport === undefined\n ? undefined\n : `<meta name=\"viewport\" content=\"${escapeHtmlAttribute(viewportContent(metadata.viewport))}\">`,\n ...headDescriptorTags(metadata.head, metadata.csp?.nonce),\n ]\n .filter((tag): tag is string => tag !== undefined)\n .join(\"\");\n\n if (tags === \"\") {\n return nextHtml;\n }\n\n if (/<head(?:\\s[^>]*)?>/i.test(nextHtml)) {\n return nextHtml.replace(/<head(\\s[^>]*)?>/i, (match) => `${match}${tags}`);\n }\n\n if (/<html(?:\\s[^>]*)?>/i.test(nextHtml)) {\n return nextHtml.replace(/<html(\\s[^>]*)?>/i, (match) => `${match}<head>${tags}</head>`);\n }\n\n return `<head>${tags}</head>${nextHtml}`;\n}\n\nexport function responseHeadersForMetadata(\n metadata: RouteMetadata | undefined,\n request: Request,\n extra?: Readonly<Record<string, string>>,\n): HeadersInit {\n const csp = contentSecurityPolicy(metadata?.csp);\n const security = routeSecurityHeaders({\n request,\n security: metadata?.security,\n });\n\n if (csp === undefined && extra === undefined) {\n return {\n ...DEFAULT_HTML_RESPONSE_HEADERS,\n ...security,\n };\n }\n\n return {\n ...DEFAULT_HTML_RESPONSE_HEADERS,\n ...security,\n ...(csp === undefined ? undefined : { \"content-security-policy\": csp }),\n ...extra,\n };\n}\n\nexport function validateRouteMetadata(\n metadata: RouteMetadata | undefined,\n path = \"metadata\",\n): RouteMetadata | undefined {\n if (metadata === undefined) {\n return undefined;\n }\n\n assertPlainMetadataObject(metadata, path);\n validateOptionalMetadataObject(metadata.alternates, `${path}.alternates`, {\n canonical: validateMetadataScalar,\n });\n validateOptionalCspMetadata(metadata.csp, `${path}.csp`);\n validateOptionalMetadataScalar(metadata.description, `${path}.description`);\n validateOptionalHeadMetadata(metadata.head, `${path}.head`);\n validateOptionalMetadataObject(metadata.icons, `${path}.icons`, {\n apple: validateMetadataScalar,\n icon: validateMetadataScalar,\n });\n validateOptionalOpenGraphMetadata(metadata.openGraph, `${path}.openGraph`);\n validateOptionalMetadataScalar(metadata.lang, `${path}.lang`);\n validateOptionalRobotsMetadata(metadata.robots, `${path}.robots`);\n validateOptionalSecurityMetadata(metadata.security, `${path}.security`);\n validateOptionalThemeColorMetadata(metadata.themeColor, `${path}.themeColor`);\n validateOptionalMetadataScalar(metadata.title, `${path}.title`);\n validateOptionalViewportMetadata(metadata.viewport, `${path}.viewport`);\n validateUnknownMetadataFields(metadata, path);\n\n return metadata;\n}\n\nexport function serializeRobots(manifest: RobotsManifest): string {\n const lines: string[] = [];\n const rules =\n manifest.rules === undefined\n ? []\n : Array.isArray(manifest.rules)\n ? manifest.rules\n : [manifest.rules];\n\n for (const rule of rules) {\n for (const userAgent of arrayValue(rule.userAgent)) {\n lines.push(`User-agent: ${userAgent}`);\n }\n for (const allow of arrayValue(rule.allow)) {\n lines.push(`Allow: ${allow}`);\n }\n for (const disallow of arrayValue(rule.disallow)) {\n lines.push(`Disallow: ${disallow}`);\n }\n }\n\n for (const sitemap of arrayValue(manifest.sitemap)) {\n lines.push(`Sitemap: ${sitemap}`);\n }\n if (manifest.host !== undefined) {\n lines.push(`Host: ${manifest.host}`);\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport function serializeSitemap(entries: readonly SitemapEntry[]): string {\n const urls = entries\n .map((entry) => {\n const fields = [\n `<loc>${escapeXml(entry.url)}</loc>`,\n entry.lastModified === undefined\n ? undefined\n : `<lastmod>${escapeXml(sitemapDate(entry.lastModified))}</lastmod>`,\n entry.changeFrequency === undefined\n ? undefined\n : `<changefreq>${escapeXml(entry.changeFrequency)}</changefreq>`,\n entry.priority === undefined ? undefined : `<priority>${entry.priority}</priority>`,\n ].filter((field): field is string => field !== undefined);\n\n return `<url>${fields.join(\"\")}</url>`;\n })\n .join(\"\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?><urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">${urls}</urlset>`;\n}\n\nfunction fileConventionMetadataRoutePath(\n routes: readonly AppRoute[],\n filename: string,\n params: RouteParams,\n convention: AppFileConvention,\n): string | undefined {\n const pageRoute = routes.find((route) => route.kind === \"page\" && route.file === filename);\n const candidateRoutes = routes.filter(\n (route) =>\n (route.kind === \"asset\" || route.kind === \"metadata\") &&\n route.convention === convention,\n );\n\n if (pageRoute !== undefined) {\n const expectedPath = pageRoute.path === \"/\" ? `/${convention}` : `${pageRoute.path}/${convention}`;\n const routeLocal = candidateRoutes.find((route) => route.path === expectedPath);\n const routeLocalPath =\n routeLocal === undefined ? undefined : concreteRoutePath(routeLocal.path, params);\n\n if (routeLocalPath !== undefined) {\n return routeLocalPath;\n }\n }\n\n return candidateRoutes.find((route) => route.path === `/${convention}`)?.path;\n}\n\nfunction concreteRoutePath(path: string, params: RouteParams): string | undefined {\n const segments = path === \"/\" ? [] : path.slice(1).split(\"/\");\n const concrete: string[] = [];\n\n for (const segment of segments) {\n if (segment.startsWith(\":...\")) {\n const value = params[segment.slice(4)];\n const values = Array.isArray(value)\n ? value\n : typeof value === \"string\"\n ? value.split(\"/\").filter((part) => part !== \"\")\n : undefined;\n\n if (values === undefined) {\n return undefined;\n }\n concrete.push(...values.map((part) => encodeURIComponent(part)));\n continue;\n }\n\n if (segment.startsWith(\":\")) {\n const value = params[segment.slice(1)];\n const stringValue = Array.isArray(value) ? value[0] : value;\n\n if (typeof stringValue !== \"string\") {\n return undefined;\n }\n concrete.push(encodeURIComponent(stringValue));\n continue;\n }\n\n concrete.push(segment);\n }\n\n return `/${concrete.join(\"/\")}`;\n}\n\nfunction mergeObject<T extends object>(left: T | undefined, right: T | undefined): T | undefined {\n if (left === undefined) {\n return right;\n }\n\n if (right === undefined) {\n return left;\n }\n\n return { ...left, ...right };\n}\n\nfunction mergeReadonlyArrays<T>(\n left: readonly T[] | undefined,\n right: readonly T[] | undefined,\n): readonly T[] | undefined {\n if (left === undefined || left.length === 0) {\n return right;\n }\n\n if (right === undefined || right.length === 0) {\n return left;\n }\n\n return [...left, ...right];\n}\n\nfunction mergeCspMetadata(\n left: RouteMetadata[\"csp\"],\n right: RouteMetadata[\"csp\"],\n): RouteMetadata[\"csp\"] | undefined {\n if (right?.disable === true) {\n return { disable: true };\n }\n\n if (left === undefined) {\n if (right === undefined) {\n return undefined;\n }\n\n const merged: NonNullable<RouteMetadata[\"csp\"]> = { ...right };\n const directives = applyCspOverrides(undefined, right);\n\n if (directives !== undefined) {\n merged.directives = directives;\n } else {\n delete merged.directives;\n }\n\n return merged;\n }\n\n if (right === undefined) {\n return left;\n }\n\n const merged: NonNullable<RouteMetadata[\"csp\"]> = {\n ...left,\n ...right,\n };\n const directives = applyCspOverrides(left.directives, right);\n\n if (directives !== undefined) {\n merged.directives = directives;\n } else {\n delete merged.directives;\n }\n\n return merged;\n}\n\nfunction applyCspOverrides(\n left: CspDirectiveMap | undefined,\n right: RouteMetadata[\"csp\"] | undefined,\n): CspDirectiveMap | undefined {\n if (right === undefined) {\n return left;\n }\n\n const merged = { ...left, ...right.directives };\n\n for (const [name, value] of Object.entries(right.replace ?? {})) {\n merged[name] = value;\n }\n\n for (const name of right.remove ?? []) {\n delete merged[name];\n }\n\n return Object.keys(merged).length === 0 ? undefined : merged;\n}\n\nfunction mergeOpenGraphMetadata(\n left: RouteMetadata[\"openGraph\"],\n right: RouteMetadata[\"openGraph\"],\n): RouteMetadata[\"openGraph\"] | undefined {\n if (left === undefined) {\n return right;\n }\n\n if (right === undefined) {\n return left;\n }\n\n const merged: NonNullable<RouteMetadata[\"openGraph\"]> = {\n ...left,\n ...right,\n };\n const images = mergeReadonlyArrays(openGraphImages(left), openGraphImages(right));\n\n if (images !== undefined && images.length > 0) {\n merged.images = images;\n }\n\n return merged;\n}\n\nfunction injectHtmlLangAttribute(html: string, lang: string): string {\n const escapedLang = escapeHtmlAttribute(lang);\n\n if (!/<html(?:\\s[^>]*)?>/i.test(html)) {\n return html;\n }\n\n return html.replace(/<html(\\s[^>]*)?>/i, (_match, attrs = \"\") => {\n const strippedAttrs = String(attrs).replace(/\\s+lang=(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/i, \"\");\n return `<html lang=\"${escapedLang}\"${strippedAttrs}>`;\n });\n}\n\nfunction sitemapDate(value: Date | number | string): string {\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n return typeof value === \"number\" ? new Date(value).toISOString() : value;\n}\n\nfunction arrayValue<T>(value: T | readonly T[] | undefined): readonly T[] {\n if (value === undefined) {\n return [];\n }\n\n return Array.isArray(value) ? (value as readonly T[]) : [value as T];\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\");\n}\n\nfunction headDescriptorTags(\n descriptors: readonly RouteHeadDescriptor[] | undefined,\n nonce: string | undefined,\n): string[] {\n return (descriptors ?? []).flatMap((descriptor) => {\n const descriptorNonce = descriptor.nonce === true ? nonce : descriptor.nonce || undefined;\n const attrs: Record<string, boolean | number | string | undefined> = {\n ...descriptor.attrs,\n ...(descriptorNonce === undefined ? {} : { nonce: descriptorNonce }),\n };\n const attrText = Object.entries(attrs)\n .flatMap(([name, value]) => {\n if (value === undefined || value === false) {\n return [];\n }\n\n return value === true\n ? [escapeHtmlAttribute(name)]\n : [`${escapeHtmlAttribute(name)}=\"${escapeHtmlAttribute(String(value))}\"`];\n })\n .join(\" \");\n const open = attrText === \"\" ? `<${descriptor.tag}>` : `<${descriptor.tag} ${attrText}>`;\n\n if (descriptor.tag === \"meta\" || descriptor.tag === \"link\" || descriptor.tag === \"base\") {\n return [open.slice(0, -1) + \">\"];\n }\n\n return [`${open}${escapeHeadTextContent(descriptor.content ?? \"\")}</${descriptor.tag}>`];\n });\n}\n\nfunction escapeHeadTextContent(value: string): string {\n return value.replaceAll(\"<\", \"\\\\u003c\");\n}\n\nfunction metadataString(value: MetadataScalar, path: string): string {\n if (isMetadataScalar(value)) {\n return String(value);\n }\n\n throw new Error(`Invalid metadata field ${path}: expected string, number, or boolean.`);\n}\n\nfunction metadataKebabName(name: string): string {\n return name.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`);\n}\n\nfunction viewportContent(viewport: MetadataScalar | MetadataViewport): string {\n if (isMetadataScalar(viewport)) {\n return metadataString(viewport, \"viewport\");\n }\n\n return Object.entries(viewport)\n .flatMap(([key, value]) => {\n if (value === undefined || value === null || value === false) {\n return [];\n }\n\n return [`${metadataKebabName(key)}=${metadataString(value, `viewport.${key}`)}`];\n })\n .join(\", \");\n}\n\nfunction themeColorTag(themeColor: MetadataScalar | MetadataThemeColor): string {\n if (isMetadataScalar(themeColor)) {\n return `<meta name=\"theme-color\" content=\"${escapeHtmlAttribute(metadataString(themeColor, \"themeColor\"))}\">`;\n }\n\n const content = themeColor.color;\n if (!isMetadataScalar(content)) {\n throw new Error(\n \"Invalid metadata field themeColor.color: expected string, number, or boolean.\",\n );\n }\n\n const media =\n themeColor.media === undefined\n ? \"\"\n : ` media=\"${escapeHtmlAttribute(metadataString(metadataScalarField(themeColor.media, \"themeColor.media\"), \"themeColor.media\"))}\"`;\n\n return `<meta name=\"theme-color\"${media} content=\"${escapeHtmlAttribute(metadataString(content, \"themeColor.color\"))}\">`;\n}\n\nfunction metadataScalarField(value: unknown, path: string): MetadataScalar {\n if (isMetadataScalar(value)) {\n return value;\n }\n\n throw new Error(`Invalid metadata field ${path}: expected string, number, or boolean.`);\n}\n\nfunction isMetadataScalar(value: unknown): value is MetadataScalar {\n return (\n typeof value === \"string\" ||\n (typeof value === \"number\" && Number.isFinite(value)) ||\n typeof value === \"boolean\"\n );\n}\n\nfunction validateOptionalMetadataScalar(value: unknown, path: string): void {\n if (value !== undefined) {\n validateMetadataScalar(value, path);\n }\n}\n\nfunction validateMetadataScalar(value: unknown, path: string): void {\n if (!isMetadataScalar(value)) {\n throw new Error(`Invalid metadata field ${path}: expected string, number, or boolean.`);\n }\n}\n\nfunction validateOptionalMetadataObject<T extends Record<string, unknown>>(\n value: unknown,\n path: string,\n validators: Record<string, (value: unknown, path: string) => void>,\n): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n for (const [key, validator] of Object.entries(validators)) {\n const fieldValue = (value as T)[key];\n if (fieldValue !== undefined) {\n validator(fieldValue, `${path}.${key}`);\n }\n }\n validateUnknownJsonMetadataFields(\n value as Record<string, unknown>,\n path,\n new Set(Object.keys(validators)),\n );\n}\n\nfunction validateOptionalCspMetadata(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n const csp = value as NonNullable<RouteMetadata[\"csp\"]>;\n if (csp.disable !== undefined && typeof csp.disable !== \"boolean\") {\n throw new Error(`Invalid metadata field ${path}.disable: expected boolean.`);\n }\n if (csp.nonce !== undefined && typeof csp.nonce !== \"string\") {\n throw new Error(`Invalid metadata field ${path}.nonce: expected string.`);\n }\n validateOptionalDirectiveMap(csp.directives, `${path}.directives`);\n validateOptionalDirectiveMap(csp.replace, `${path}.replace`);\n if (csp.remove !== undefined) {\n validateStringArray(csp.remove, `${path}.remove`);\n }\n validateUnknownJsonMetadataFields(\n csp as Record<string, unknown>,\n path,\n new Set([\"directives\", \"disable\", \"nonce\", \"remove\", \"replace\"]),\n );\n}\n\nfunction validateOptionalDirectiveMap(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n for (const [name, directive] of Object.entries(value)) {\n if (typeof directive === \"string\") {\n continue;\n }\n validateStringArray(directive, `${path}.${name}`);\n }\n}\n\nfunction validateStringArray(value: unknown, path: string): void {\n if (!Array.isArray(value)) {\n throw new Error(`Invalid metadata field ${path}: expected string or string array.`);\n }\n\n value.forEach((entry, index) => {\n if (typeof entry !== \"string\") {\n throw new Error(`Invalid metadata field ${path}.${index}: expected string.`);\n }\n });\n}\n\nfunction validateOptionalHeadMetadata(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n if (!Array.isArray(value)) {\n throw new Error(`Invalid metadata field ${path}: expected array.`);\n }\n\n value.forEach((descriptor, index) => {\n const descriptorPath = `${path}.${index}`;\n assertPlainMetadataObject(descriptor, descriptorPath);\n const head = descriptor as unknown as RouteHeadDescriptor;\n if (![\"base\", \"link\", \"meta\", \"script\", \"style\"].includes(String(head.tag))) {\n throw new Error(`Invalid metadata field ${descriptorPath}.tag: expected supported head tag.`);\n }\n if (head.content !== undefined && typeof head.content !== \"string\") {\n throw new Error(`Invalid metadata field ${descriptorPath}.content: expected string.`);\n }\n if (\n head.nonce !== undefined &&\n typeof head.nonce !== \"boolean\" &&\n typeof head.nonce !== \"string\"\n ) {\n throw new Error(`Invalid metadata field ${descriptorPath}.nonce: expected string or boolean.`);\n }\n if (head.attrs !== undefined) {\n assertPlainMetadataObject(head.attrs, `${descriptorPath}.attrs`);\n for (const [name, attr] of Object.entries(head.attrs)) {\n validateHeadAttribute(name, attr, `${descriptorPath}.attrs.${name}`);\n if (\n attr !== undefined &&\n typeof attr !== \"boolean\" &&\n typeof attr !== \"number\" &&\n typeof attr !== \"string\"\n ) {\n throw new Error(\n `Invalid metadata field ${descriptorPath}.attrs.${name}: expected string, number, boolean, or undefined.`,\n );\n }\n }\n }\n validateUnknownJsonMetadataFields(\n descriptor as Record<string, unknown>,\n descriptorPath,\n new Set([\"attrs\", \"content\", \"nonce\", \"tag\"]),\n );\n });\n}\n\nfunction validateHeadAttribute(name: string, value: unknown, path: string): void {\n if (!isSafeHeadAttributeName(name)) {\n throw new Error(`Invalid metadata field ${path}: expected safe HTML attribute name.`);\n }\n\n const canonicalName = name.toLowerCase();\n if (canonicalName.startsWith(\"on\") || isDangerousHtmlAttribute(canonicalName)) {\n throw new Error(`Invalid metadata field ${path}: event and dangerous attributes are not allowed.`);\n }\n\n if (typeof value === \"string\" && isUnsafeUrlAttribute(canonicalName, value)) {\n throw new Error(`Invalid metadata field ${path}: unsafe URL value.`);\n }\n}\n\nfunction isSafeHeadAttributeName(name: string): boolean {\n if (name.length === 0) {\n return false;\n }\n\n for (let index = 0; index < name.length; index += 1) {\n const code = name.charCodeAt(index);\n\n if (\n code <= 0x20 ||\n code === 0x22 ||\n code === 0x27 ||\n code === 0x2f ||\n code === 0x3c ||\n code === 0x3d ||\n code === 0x3e ||\n code === 0x60 ||\n code === 0x7f\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction validateOptionalOpenGraphMetadata(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n const openGraph = value as NonNullable<RouteMetadata[\"openGraph\"]>;\n validateOptionalMetadataScalar(openGraph.description, `${path}.description`);\n validateOptionalMetadataImage(openGraph.image, `${path}.image`);\n if (openGraph.images !== undefined) {\n if (!Array.isArray(openGraph.images)) {\n throw new Error(`Invalid metadata field ${path}.images: expected array.`);\n }\n openGraph.images.forEach((image, index) =>\n validateOptionalMetadataImage(image, `${path}.images.${index}`),\n );\n }\n validateOptionalMetadataScalar(openGraph.title, `${path}.title`);\n validateUnknownJsonMetadataFields(\n openGraph as Record<string, unknown>,\n path,\n new Set([\"description\", \"image\", \"images\", \"title\"]),\n );\n}\n\nfunction validateOptionalMetadataImage(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n if (isMetadataScalar(value)) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n const image = value as unknown as MetadataImage;\n validateMetadataScalar(image.url, `${path}.url`);\n validateOptionalMetadataScalar(image.alt, `${path}.alt`);\n validateOptionalMetadataScalar(image.height, `${path}.height`);\n validateOptionalMetadataScalar(image.type, `${path}.type`);\n validateOptionalMetadataScalar(image.width, `${path}.width`);\n validateUnknownJsonMetadataFields(\n image as unknown as Record<string, unknown>,\n path,\n new Set([\"alt\", \"height\", \"type\", \"url\", \"width\"]),\n );\n}\n\nfunction validateOptionalRobotsMetadata(value: unknown, path: string): void {\n if (value === undefined || typeof value === \"string\") {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n const robots = value as Extract<NonNullable<RouteMetadata[\"robots\"]>, object>;\n if (robots.follow !== undefined && typeof robots.follow !== \"boolean\") {\n throw new Error(`Invalid metadata field ${path}.follow: expected boolean.`);\n }\n if (robots.index !== undefined && typeof robots.index !== \"boolean\") {\n throw new Error(`Invalid metadata field ${path}.index: expected boolean.`);\n }\n validateUnknownJsonMetadataFields(\n robots as Record<string, unknown>,\n path,\n new Set([\"follow\", \"index\"]),\n );\n}\n\nfunction validateOptionalSecurityMetadata(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n validateJsonSerializableMetadata(value, path);\n}\n\nfunction validateOptionalThemeColorMetadata(value: unknown, path: string): void {\n if (value === undefined || isMetadataScalar(value)) {\n return;\n }\n\n validateOptionalMetadataObject(value, path, {\n color: validateMetadataScalar,\n media: validateMetadataScalar,\n });\n}\n\nfunction validateOptionalViewportMetadata(value: unknown, path: string): void {\n if (value === undefined || isMetadataScalar(value)) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n for (const [key, viewportValue] of Object.entries(value)) {\n if (viewportValue !== undefined && viewportValue !== null && !isMetadataScalar(viewportValue)) {\n throw new Error(\n `Invalid metadata field ${path}.${key}: expected string, number, boolean, null, or undefined.`,\n );\n }\n }\n}\n\nfunction validateUnknownMetadataFields(metadata: RouteMetadata, path: string): void {\n validateUnknownJsonMetadataFields(metadata as Record<string, unknown>, path, new Set([\n \"alternates\",\n \"csp\",\n \"description\",\n \"head\",\n \"icons\",\n \"lang\",\n \"openGraph\",\n \"robots\",\n \"security\",\n \"themeColor\",\n \"title\",\n \"viewport\",\n ]));\n}\n\nfunction validateUnknownJsonMetadataFields(\n value: Record<string, unknown>,\n path: string,\n knownFields: ReadonlySet<string>,\n): void {\n for (const [key, entry] of Object.entries(value)) {\n if (!knownFields.has(key)) {\n validateJsonSerializableMetadata(entry, `${path}.${key}`);\n }\n }\n}\n\nfunction validateJsonSerializableMetadata(value: unknown, path: string): void {\n if (value === undefined || value === null || isMetadataScalar(value)) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((entry, index) => validateJsonSerializableMetadata(entry, `${path}.${index}`));\n return;\n }\n\n if (isPlainMetadataObject(value)) {\n for (const [key, entry] of Object.entries(value)) {\n validateJsonSerializableMetadata(entry, `${path}.${key}`);\n }\n return;\n }\n\n throw new Error(\n `Invalid metadata field ${path}: expected a JSON-serializable value.`,\n );\n}\n\nfunction assertPlainMetadataObject(value: unknown, path: string): asserts value is Record<string, unknown> {\n if (!isPlainMetadataObject(value)) {\n throw new Error(`Invalid metadata field ${path}: expected object.`);\n }\n}\n\nfunction isPlainMetadataObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction openGraphImages(openGraph: RouteMetadata[\"openGraph\"]): readonly string[] {\n if (openGraph?.images !== undefined) {\n return openGraph.images.map((image, index) =>\n metadataImageUrl(image, `openGraph.images.${index}`),\n );\n }\n\n return openGraph?.image === undefined ? [] : [metadataImageUrl(openGraph.image, \"openGraph.image\")];\n}\n\nfunction metadataImageUrl(value: MetadataImage | MetadataScalar, path: string): string {\n if (isMetadataScalar(value)) {\n return metadataString(value, path);\n }\n\n if (typeof value === \"object\" && value !== null && \"url\" in value) {\n return metadataString(value.url, `${path}.url`);\n }\n\n throw new Error(`Invalid metadata field ${path}: expected string, number, boolean, or object with url.`);\n}\n\nfunction robotsContent(robots: NonNullable<RouteMetadata[\"robots\"]>): string {\n if (typeof robots === \"string\") {\n return robots;\n }\n\n return [\n robots.index === false ? \"noindex\" : \"index\",\n robots.follow === false ? \"nofollow\" : \"follow\",\n ].join(\",\");\n}\n"]}
@@ -15,6 +15,11 @@ export interface StaticMiddlewareConfig {
15
15
  matcher?: string | readonly string[] | undefined;
16
16
  }
17
17
  export declare function shouldSkipMiddleware(config: Pick<NonNullable<MiddlewareModule["config"]>, "id"> | undefined, control: RouteMiddlewareControl | undefined): boolean;
18
+ export declare function validateRouteMiddlewareControl(options: {
19
+ availableIds: ReadonlySet<string>;
20
+ control: RouteMiddlewareControl | undefined;
21
+ routePath: string;
22
+ }): void;
18
23
  export declare function parseStaticMiddlewareConfig(code: string): StaticMiddlewareConfig;
19
24
  export declare function middlewareMatches(config: MiddlewareModule["config"], pathname: string): boolean;
20
25
  export declare function parseRouteMiddlewareControl(code: string): RouteMiddlewareControl | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE;QACP,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;KAC3D,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAClD;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,SAAS,EACvE,OAAO,EAAE,sBAAsB,GAAG,SAAS,GAC1C,OAAO,CAUT;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,CAqChF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAgB/F;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAqB5F;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,SAAS,CAAC,sBAAsB,GAAG,SAAS,CAAC,EAAE,GACxD,sBAAsB,GAAG,SAAS,CAgBpC"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE;QACP,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;KAC3D,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAClD;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,SAAS,EACvE,OAAO,EAAE,sBAAsB,GAAG,SAAS,GAC1C,OAAO,CAUT;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE;IACtD,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAYP;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,CAqChF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAgB/F;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAqB5F;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,SAAS,CAAC,sBAAsB,GAAG,SAAS,CAAC,EAAE,GACxD,sBAAsB,GAAG,SAAS,CAgBpC"}
@@ -8,6 +8,16 @@ export function shouldSkipMiddleware(config, control) {
8
8
  }
9
9
  return typeof config?.id === "string" && control.skip.includes(config.id);
10
10
  }
11
+ export function validateRouteMiddlewareControl(options) {
12
+ if (!Array.isArray(options.control?.skip)) {
13
+ return;
14
+ }
15
+ for (const id of options.control.skip) {
16
+ if (!options.availableIds.has(id)) {
17
+ throw new Error(`Unknown middleware skip id "${id}" for route "${options.routePath}". Available middleware ids: ${formatAvailableMiddlewareIds(options.availableIds)}.`);
18
+ }
19
+ }
20
+ }
11
21
  export function parseStaticMiddlewareConfig(code) {
12
22
  const configBody = /\bexport\s+const\s+config\s*=\s*\{(?<body>[\s\S]*?)\}\s*;?/.exec(code)
13
23
  ?.groups?.body;
@@ -94,4 +104,7 @@ function middlewarePatternMatches(pattern, pathname) {
94
104
  }
95
105
  return false;
96
106
  }
107
+ function formatAvailableMiddlewareIds(ids) {
108
+ return ids.size === 0 ? "(none)" : [...ids].sort().join(", ");
109
+ }
97
110
  //# sourceMappingURL=middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalizeRoutePath } from \"./route-path.js\";\n\nexport interface RouteMiddlewareControl {\n skip?: boolean | readonly string[];\n}\n\nexport interface MiddlewareModule {\n config?: {\n id?: string | undefined;\n matcher?: string | RegExp | readonly string[] | undefined;\n };\n default?: unknown;\n middleware?: unknown;\n}\n\nexport interface StaticMiddlewareConfig {\n hasMatcher: boolean;\n id?: string | undefined;\n matcher?: string | readonly string[] | undefined;\n}\n\nexport function shouldSkipMiddleware(\n config: Pick<NonNullable<MiddlewareModule[\"config\"]>, \"id\"> | undefined,\n control: RouteMiddlewareControl | undefined,\n): boolean {\n if (control?.skip === true) {\n return true;\n }\n\n if (!Array.isArray(control?.skip)) {\n return false;\n }\n\n return typeof config?.id === \"string\" && control.skip.includes(config.id);\n}\n\nexport function parseStaticMiddlewareConfig(code: string): StaticMiddlewareConfig {\n const configBody = /\\bexport\\s+const\\s+config\\s*=\\s*\\{(?<body>[\\s\\S]*?)\\}\\s*;?/.exec(code)\n ?.groups?.body;\n\n if (configBody === undefined) {\n return { hasMatcher: false };\n }\n\n const id = /\\bid\\s*:\\s*[\"'](?<id>[^\"']+)[\"']/.exec(configBody)?.groups?.id;\n const stringMatcher = /\\bmatcher\\s*:\\s*[\"'](?<matcher>[^\"']+)[\"']/.exec(configBody)?.groups\n ?.matcher;\n\n if (stringMatcher !== undefined) {\n return {\n hasMatcher: true,\n ...(id === undefined ? {} : { id }),\n matcher: stringMatcher,\n };\n }\n\n const matcherArray = /\\bmatcher\\s*:\\s*\\[(?<items>[\\s\\S]*?)\\]/.exec(configBody)?.groups?.items;\n\n if (matcherArray !== undefined) {\n return {\n hasMatcher: true,\n ...(id === undefined ? {} : { id }),\n matcher: Array.from(\n matcherArray.matchAll(/[\"'](?<matcher>[^\"']+)[\"']/g),\n (match) => match.groups?.matcher,\n ).filter((matcher): matcher is string => matcher !== undefined),\n };\n }\n\n return {\n hasMatcher: /\\bmatcher\\s*:/.test(configBody),\n ...(id === undefined ? {} : { id }),\n };\n}\n\nexport function middlewareMatches(config: MiddlewareModule[\"config\"], pathname: string): boolean {\n const matcher = config?.matcher;\n\n if (matcher === undefined) {\n return true;\n }\n\n if (matcher instanceof RegExp) {\n return matcher.test(pathname);\n }\n\n if (Array.isArray(matcher)) {\n return matcher.some((item) => middlewarePatternMatches(item, pathname));\n }\n\n return typeof matcher === \"string\" && middlewarePatternMatches(matcher, pathname);\n}\n\nexport function parseRouteMiddlewareControl(code: string): RouteMiddlewareControl | undefined {\n if (!/\\bexport\\s+const\\s+middleware\\s*=/.test(code)) {\n return undefined;\n }\n\n if (/\\bmiddleware\\s*=\\s*\\{[\\s\\S]*?\\bskip\\s*:\\s*true\\b/.test(code)) {\n return { skip: true };\n }\n\n const skipArray = /\\bmiddleware\\s*=\\s*\\{[\\s\\S]*?\\bskip\\s*:\\s*\\[([\\s\\S]*?)\\]/.exec(code);\n\n if (skipArray === null) {\n return undefined;\n }\n\n const ids = Array.from(\n skipArray[1]?.matchAll(/[\"']([^\"']+)[\"']/g) ?? [],\n (match) => match[1],\n ).filter((id) => id !== undefined);\n\n return ids.length === 0 ? undefined : { skip: ids };\n}\n\nexport function mergeRouteMiddlewareControls(\n controls: readonly (RouteMiddlewareControl | undefined)[],\n): RouteMiddlewareControl | undefined {\n const skippedIds = new Set<string>();\n\n for (const control of controls) {\n if (control?.skip === true) {\n return { skip: true };\n }\n\n if (Array.isArray(control?.skip)) {\n for (const id of control.skip) {\n skippedIds.add(id);\n }\n }\n }\n\n return skippedIds.size === 0 ? undefined : { skip: [...skippedIds] };\n}\n\nfunction middlewarePatternMatches(pattern: string, pathname: string): boolean {\n const normalizedPattern = normalizeRoutePath(pattern);\n const normalizedPathname = normalizeRoutePath(pathname);\n\n if (normalizedPattern === normalizedPathname) {\n return true;\n }\n\n if (normalizedPattern.endsWith(\"/:path*\")) {\n const prefix = normalizedPattern.slice(0, -\"/:path*\".length);\n\n return normalizedPathname === prefix || normalizedPathname.startsWith(`${prefix}/`);\n }\n\n if (normalizedPattern.endsWith(\"*\")) {\n const prefix = normalizedPattern.slice(0, -1);\n\n return normalizedPathname.startsWith(prefix);\n }\n\n return false;\n}\n"]}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalizeRoutePath } from \"./route-path.js\";\n\nexport interface RouteMiddlewareControl {\n skip?: boolean | readonly string[];\n}\n\nexport interface MiddlewareModule {\n config?: {\n id?: string | undefined;\n matcher?: string | RegExp | readonly string[] | undefined;\n };\n default?: unknown;\n middleware?: unknown;\n}\n\nexport interface StaticMiddlewareConfig {\n hasMatcher: boolean;\n id?: string | undefined;\n matcher?: string | readonly string[] | undefined;\n}\n\nexport function shouldSkipMiddleware(\n config: Pick<NonNullable<MiddlewareModule[\"config\"]>, \"id\"> | undefined,\n control: RouteMiddlewareControl | undefined,\n): boolean {\n if (control?.skip === true) {\n return true;\n }\n\n if (!Array.isArray(control?.skip)) {\n return false;\n }\n\n return typeof config?.id === \"string\" && control.skip.includes(config.id);\n}\n\nexport function validateRouteMiddlewareControl(options: {\n availableIds: ReadonlySet<string>;\n control: RouteMiddlewareControl | undefined;\n routePath: string;\n}): void {\n if (!Array.isArray(options.control?.skip)) {\n return;\n }\n\n for (const id of options.control.skip) {\n if (!options.availableIds.has(id)) {\n throw new Error(\n `Unknown middleware skip id \"${id}\" for route \"${options.routePath}\". Available middleware ids: ${formatAvailableMiddlewareIds(options.availableIds)}.`,\n );\n }\n }\n}\n\nexport function parseStaticMiddlewareConfig(code: string): StaticMiddlewareConfig {\n const configBody = /\\bexport\\s+const\\s+config\\s*=\\s*\\{(?<body>[\\s\\S]*?)\\}\\s*;?/.exec(code)\n ?.groups?.body;\n\n if (configBody === undefined) {\n return { hasMatcher: false };\n }\n\n const id = /\\bid\\s*:\\s*[\"'](?<id>[^\"']+)[\"']/.exec(configBody)?.groups?.id;\n const stringMatcher = /\\bmatcher\\s*:\\s*[\"'](?<matcher>[^\"']+)[\"']/.exec(configBody)?.groups\n ?.matcher;\n\n if (stringMatcher !== undefined) {\n return {\n hasMatcher: true,\n ...(id === undefined ? {} : { id }),\n matcher: stringMatcher,\n };\n }\n\n const matcherArray = /\\bmatcher\\s*:\\s*\\[(?<items>[\\s\\S]*?)\\]/.exec(configBody)?.groups?.items;\n\n if (matcherArray !== undefined) {\n return {\n hasMatcher: true,\n ...(id === undefined ? {} : { id }),\n matcher: Array.from(\n matcherArray.matchAll(/[\"'](?<matcher>[^\"']+)[\"']/g),\n (match) => match.groups?.matcher,\n ).filter((matcher): matcher is string => matcher !== undefined),\n };\n }\n\n return {\n hasMatcher: /\\bmatcher\\s*:/.test(configBody),\n ...(id === undefined ? {} : { id }),\n };\n}\n\nexport function middlewareMatches(config: MiddlewareModule[\"config\"], pathname: string): boolean {\n const matcher = config?.matcher;\n\n if (matcher === undefined) {\n return true;\n }\n\n if (matcher instanceof RegExp) {\n return matcher.test(pathname);\n }\n\n if (Array.isArray(matcher)) {\n return matcher.some((item) => middlewarePatternMatches(item, pathname));\n }\n\n return typeof matcher === \"string\" && middlewarePatternMatches(matcher, pathname);\n}\n\nexport function parseRouteMiddlewareControl(code: string): RouteMiddlewareControl | undefined {\n if (!/\\bexport\\s+const\\s+middleware\\s*=/.test(code)) {\n return undefined;\n }\n\n if (/\\bmiddleware\\s*=\\s*\\{[\\s\\S]*?\\bskip\\s*:\\s*true\\b/.test(code)) {\n return { skip: true };\n }\n\n const skipArray = /\\bmiddleware\\s*=\\s*\\{[\\s\\S]*?\\bskip\\s*:\\s*\\[([\\s\\S]*?)\\]/.exec(code);\n\n if (skipArray === null) {\n return undefined;\n }\n\n const ids = Array.from(\n skipArray[1]?.matchAll(/[\"']([^\"']+)[\"']/g) ?? [],\n (match) => match[1],\n ).filter((id) => id !== undefined);\n\n return ids.length === 0 ? undefined : { skip: ids };\n}\n\nexport function mergeRouteMiddlewareControls(\n controls: readonly (RouteMiddlewareControl | undefined)[],\n): RouteMiddlewareControl | undefined {\n const skippedIds = new Set<string>();\n\n for (const control of controls) {\n if (control?.skip === true) {\n return { skip: true };\n }\n\n if (Array.isArray(control?.skip)) {\n for (const id of control.skip) {\n skippedIds.add(id);\n }\n }\n }\n\n return skippedIds.size === 0 ? undefined : { skip: [...skippedIds] };\n}\n\nfunction middlewarePatternMatches(pattern: string, pathname: string): boolean {\n const normalizedPattern = normalizeRoutePath(pattern);\n const normalizedPathname = normalizeRoutePath(pathname);\n\n if (normalizedPattern === normalizedPathname) {\n return true;\n }\n\n if (normalizedPattern.endsWith(\"/:path*\")) {\n const prefix = normalizedPattern.slice(0, -\"/:path*\".length);\n\n return normalizedPathname === prefix || normalizedPathname.startsWith(`${prefix}/`);\n }\n\n if (normalizedPattern.endsWith(\"*\")) {\n const prefix = normalizedPattern.slice(0, -1);\n\n return normalizedPathname.startsWith(prefix);\n }\n\n return false;\n}\n\nfunction formatAvailableMiddlewareIds(ids: ReadonlySet<string>): string {\n return ids.size === 0 ? \"(none)\" : [...ids].sort().join(\", \");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
package/dist/render.js CHANGED
@@ -26,8 +26,8 @@ import { createRouterRuntimeCacheCounters, readRouterRuntimeCacheEntry, routerRu
26
26
  import { bundleRouterModule } from "./bundle-pipeline.js";
27
27
  import { viteDefineCacheKey, vitePluginsCacheKey } from "./vite-plugin-cache-key.js";
28
28
  import { invokeRouterInstrumentation, traceContextFromRequest, } from "./trace.js";
29
- import { mergeRouteMiddlewareControls, middlewareMatches, parseRouteMiddlewareControl, parseStaticMiddlewareConfig, shouldSkipMiddleware, } from "./middleware.js";
30
- import { applyFileConventionMetadata, injectHeadMetadata, mergeRouteMetadata, responseHeadersForMetadata, serializeRobots, serializeSitemap, } from "./metadata.js";
29
+ import { mergeRouteMiddlewareControls, middlewareMatches, parseRouteMiddlewareControl, parseStaticMiddlewareConfig, shouldSkipMiddleware, validateRouteMiddlewareControl, } from "./middleware.js";
30
+ import { applyFileConventionMetadata, injectHeadMetadata, mergeRouteMetadata, responseHeadersForMetadata, serializeRobots, serializeSitemap, validateRouteMetadata, } from "./metadata.js";
31
31
  import { createSlotRenderContext, markShellBoundary, shellBoundaryId, splitLayoutSlot, warnUnconsumedRouteSlots, } from "./layout-composer.js";
32
32
  import { importPolicyCacheKey, memoizedHashText, prebuiltRequestModuleArtifact, prebuiltRouteLoaderModuleArtifact, prebuiltServerComponentModuleCode, prebuiltServerModuleOutputMatches, } from "./route-module-loader.js";
33
33
  const nativeEscapeTransform = {
@@ -1438,6 +1438,17 @@ async function runMiddleware(options) {
1438
1438
  join(options.appDir, "middleware.mreact.ts"),
1439
1439
  ];
1440
1440
  const pathname = new URL(options.request.url).pathname;
1441
+ if (Array.isArray(options.middlewareControl?.skip)) {
1442
+ validateRouteMiddlewareControl({
1443
+ availableIds: await collectAvailableMiddlewareIds({
1444
+ candidates,
1445
+ serverModuleCacheVersion: options.serverModuleCacheVersion,
1446
+ serverSourceFiles: options.serverSourceFiles,
1447
+ }),
1448
+ control: options.middlewareControl,
1449
+ routePath: pathname,
1450
+ });
1451
+ }
1441
1452
  for (const file of candidates) {
1442
1453
  try {
1443
1454
  await access(file);
@@ -1523,6 +1534,23 @@ async function runMiddleware(options) {
1523
1534
  }
1524
1535
  return undefined;
1525
1536
  }
1537
+ async function collectAvailableMiddlewareIds(options) {
1538
+ const ids = new Set();
1539
+ for (const file of options.candidates) {
1540
+ try {
1541
+ await access(file);
1542
+ }
1543
+ catch {
1544
+ continue;
1545
+ }
1546
+ const code = await readServerSourceFile(file, options.serverModuleCacheVersion, options.serverSourceFiles);
1547
+ const id = parseStaticMiddlewareConfig(code).id;
1548
+ if (id !== undefined) {
1549
+ ids.add(id);
1550
+ }
1551
+ }
1552
+ return ids;
1553
+ }
1526
1554
  async function loadMiddlewareModule(options) {
1527
1555
  const code = options.code ??
1528
1556
  (await readServerSourceFile(options.file, options.serverModuleCacheVersion, options.serverSourceFiles));
@@ -2708,21 +2736,25 @@ async function loadRouteMetadata(options) {
2708
2736
  return await resolveRouteMetadataModule(module, options.context);
2709
2737
  }
2710
2738
  async function resolveRouteMetadataModule(module, context) {
2739
+ const staticMetadata = validateRouteMetadata(module.metadata);
2711
2740
  if (module.generateMetadata === undefined) {
2712
- return module.metadata;
2741
+ return staticMetadata;
2713
2742
  }
2743
+ let generated;
2714
2744
  try {
2715
- const generated = await module.generateMetadata(context);
2716
- return generated === undefined
2717
- ? module.metadata
2718
- : mergeRouteMetadata([module.metadata, generated].filter(isRouteMetadata));
2745
+ generated = await module.generateMetadata(context);
2719
2746
  }
2720
2747
  catch (error) {
2721
- if (module.metadata !== undefined) {
2722
- return module.metadata;
2748
+ if (staticMetadata !== undefined) {
2749
+ return staticMetadata;
2723
2750
  }
2724
2751
  throw error;
2725
2752
  }
2753
+ const validatedGenerated = validateRouteMetadata(generated, "generateMetadata");
2754
+ const merged = validatedGenerated === undefined
2755
+ ? staticMetadata
2756
+ : mergeRouteMetadata([staticMetadata, validatedGenerated].filter(isRouteMetadata));
2757
+ return validateRouteMetadata(merged);
2726
2758
  }
2727
2759
  function isRouteMetadata(value) {
2728
2760
  return value !== undefined;