vinext 0.0.50 → 0.0.51

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 (309) hide show
  1. package/dist/build/google-fonts/fallback-metrics-data.js +14031 -0
  2. package/dist/build/google-fonts/fallback-metrics-data.js.map +1 -0
  3. package/dist/build/google-fonts/fallback-metrics.d.ts +13 -0
  4. package/dist/build/google-fonts/fallback-metrics.js +46 -0
  5. package/dist/build/google-fonts/fallback-metrics.js.map +1 -0
  6. package/dist/build/precompress.d.ts +13 -2
  7. package/dist/build/precompress.js +12 -3
  8. package/dist/build/precompress.js.map +1 -1
  9. package/dist/build/prerender.d.ts +1 -1
  10. package/dist/build/prerender.js +44 -14
  11. package/dist/build/prerender.js.map +1 -1
  12. package/dist/build/report.d.ts +5 -4
  13. package/dist/build/report.js +196 -348
  14. package/dist/build/report.js.map +1 -1
  15. package/dist/check.js +1 -0
  16. package/dist/check.js.map +1 -1
  17. package/dist/cli.js +60 -3
  18. package/dist/cli.js.map +1 -1
  19. package/dist/client/window-next.d.ts +3 -1
  20. package/dist/client/window-next.js.map +1 -1
  21. package/dist/config/dotenv.d.ts +11 -1
  22. package/dist/config/dotenv.js.map +1 -1
  23. package/dist/config/next-config.d.ts +87 -3
  24. package/dist/config/next-config.js +222 -6
  25. package/dist/config/next-config.js.map +1 -1
  26. package/dist/config/tsconfig-paths.d.ts +13 -0
  27. package/dist/config/tsconfig-paths.js +117 -0
  28. package/dist/config/tsconfig-paths.js.map +1 -0
  29. package/dist/deploy.js +3 -2
  30. package/dist/deploy.js.map +1 -1
  31. package/dist/entries/app-browser-entry.d.ts +2 -2
  32. package/dist/entries/app-browser-entry.js +26 -1
  33. package/dist/entries/app-browser-entry.js.map +1 -1
  34. package/dist/entries/app-rsc-entry.d.ts +19 -1
  35. package/dist/entries/app-rsc-entry.js +38 -12
  36. package/dist/entries/app-rsc-entry.js.map +1 -1
  37. package/dist/entries/app-rsc-manifest.d.ts +9 -0
  38. package/dist/entries/app-rsc-manifest.js +4 -1
  39. package/dist/entries/app-rsc-manifest.js.map +1 -1
  40. package/dist/entries/pages-client-entry.js +3 -5
  41. package/dist/entries/pages-client-entry.js.map +1 -1
  42. package/dist/entries/pages-server-entry.js +19 -1
  43. package/dist/entries/pages-server-entry.js.map +1 -1
  44. package/dist/index.js +130 -37
  45. package/dist/index.js.map +1 -1
  46. package/dist/plugins/client-reference-dedup.d.ts +15 -2
  47. package/dist/plugins/client-reference-dedup.js +138 -16
  48. package/dist/plugins/client-reference-dedup.js.map +1 -1
  49. package/dist/plugins/fonts.d.ts +2 -2
  50. package/dist/plugins/fonts.js +15 -6
  51. package/dist/plugins/fonts.js.map +1 -1
  52. package/dist/plugins/sass.d.ts +34 -0
  53. package/dist/plugins/sass.js +22 -0
  54. package/dist/plugins/sass.js.map +1 -0
  55. package/dist/routing/app-route-graph.d.ts +31 -2
  56. package/dist/routing/app-route-graph.js +82 -10
  57. package/dist/routing/app-route-graph.js.map +1 -1
  58. package/dist/routing/route-pattern.d.ts +56 -1
  59. package/dist/routing/route-pattern.js +60 -1
  60. package/dist/routing/route-pattern.js.map +1 -1
  61. package/dist/server/app-browser-action-result.d.ts +27 -2
  62. package/dist/server/app-browser-action-result.js +63 -2
  63. package/dist/server/app-browser-action-result.js.map +1 -1
  64. package/dist/server/app-browser-entry.js +262 -108
  65. package/dist/server/app-browser-entry.js.map +1 -1
  66. package/dist/server/app-browser-hydration.d.ts +13 -1
  67. package/dist/server/app-browser-hydration.js +9 -1
  68. package/dist/server/app-browser-hydration.js.map +1 -1
  69. package/dist/server/app-browser-navigation-controller.d.ts +14 -1
  70. package/dist/server/app-browser-navigation-controller.js +28 -9
  71. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  72. package/dist/server/app-browser-popstate.d.ts +16 -0
  73. package/dist/server/app-browser-popstate.js +17 -0
  74. package/dist/server/app-browser-popstate.js.map +1 -0
  75. package/dist/server/app-browser-rsc-redirect.d.ts +28 -0
  76. package/dist/server/app-browser-rsc-redirect.js +37 -0
  77. package/dist/server/app-browser-rsc-redirect.js.map +1 -0
  78. package/dist/server/app-browser-state.d.ts +11 -7
  79. package/dist/server/app-browser-state.js +45 -27
  80. package/dist/server/app-browser-state.js.map +1 -1
  81. package/dist/server/app-browser-stream.d.ts +5 -4
  82. package/dist/server/app-browser-stream.js +5 -6
  83. package/dist/server/app-browser-stream.js.map +1 -1
  84. package/dist/server/app-browser-visible-commit.d.ts +5 -0
  85. package/dist/server/app-browser-visible-commit.js +38 -5
  86. package/dist/server/app-browser-visible-commit.js.map +1 -1
  87. package/dist/server/app-elements-wire.d.ts +38 -6
  88. package/dist/server/app-elements-wire.js +106 -6
  89. package/dist/server/app-elements-wire.js.map +1 -1
  90. package/dist/server/app-elements.d.ts +2 -2
  91. package/dist/server/app-elements.js +2 -2
  92. package/dist/server/app-elements.js.map +1 -1
  93. package/dist/server/app-fallback-renderer.d.ts +10 -1
  94. package/dist/server/app-fallback-renderer.js +37 -1
  95. package/dist/server/app-fallback-renderer.js.map +1 -1
  96. package/dist/server/app-history-state.d.ts +26 -0
  97. package/dist/server/app-history-state.js +53 -0
  98. package/dist/server/app-history-state.js.map +1 -0
  99. package/dist/server/app-page-boundary-render.d.ts +10 -1
  100. package/dist/server/app-page-boundary-render.js +13 -6
  101. package/dist/server/app-page-boundary-render.js.map +1 -1
  102. package/dist/server/app-page-boundary.js +3 -2
  103. package/dist/server/app-page-boundary.js.map +1 -1
  104. package/dist/server/app-page-cache.d.ts +13 -0
  105. package/dist/server/app-page-cache.js +25 -8
  106. package/dist/server/app-page-cache.js.map +1 -1
  107. package/dist/server/app-page-dispatch.d.ts +5 -0
  108. package/dist/server/app-page-dispatch.js +68 -11
  109. package/dist/server/app-page-dispatch.js.map +1 -1
  110. package/dist/server/app-page-element-builder.d.ts +7 -0
  111. package/dist/server/app-page-element-builder.js +32 -4
  112. package/dist/server/app-page-element-builder.js.map +1 -1
  113. package/dist/server/app-page-execution.js +2 -3
  114. package/dist/server/app-page-execution.js.map +1 -1
  115. package/dist/server/app-page-head.d.ts +7 -0
  116. package/dist/server/app-page-head.js +2 -1
  117. package/dist/server/app-page-head.js.map +1 -1
  118. package/dist/server/app-page-probe.d.ts +23 -1
  119. package/dist/server/app-page-probe.js +29 -1
  120. package/dist/server/app-page-probe.js.map +1 -1
  121. package/dist/server/app-page-render-observation.d.ts +35 -0
  122. package/dist/server/app-page-render-observation.js +68 -0
  123. package/dist/server/app-page-render-observation.js.map +1 -0
  124. package/dist/server/app-page-render.d.ts +5 -1
  125. package/dist/server/app-page-render.js +79 -3
  126. package/dist/server/app-page-render.js.map +1 -1
  127. package/dist/server/app-page-request.d.ts +1 -0
  128. package/dist/server/app-page-request.js.map +1 -1
  129. package/dist/server/app-page-response.js +3 -2
  130. package/dist/server/app-page-response.js.map +1 -1
  131. package/dist/server/app-page-route-wiring.d.ts +3 -1
  132. package/dist/server/app-page-route-wiring.js +42 -14
  133. package/dist/server/app-page-route-wiring.js.map +1 -1
  134. package/dist/server/app-page-stream.d.ts +2 -0
  135. package/dist/server/app-page-stream.js +1 -0
  136. package/dist/server/app-page-stream.js.map +1 -1
  137. package/dist/server/app-router-entry.js +1 -13
  138. package/dist/server/app-router-entry.js.map +1 -1
  139. package/dist/server/app-rsc-cache-busting.d.ts +19 -1
  140. package/dist/server/app-rsc-cache-busting.js +36 -1
  141. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  142. package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
  143. package/dist/server/app-rsc-embedded-chunks.js +34 -0
  144. package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
  145. package/dist/server/app-rsc-errors.d.ts +4 -1
  146. package/dist/server/app-rsc-errors.js +1 -1
  147. package/dist/server/app-rsc-errors.js.map +1 -1
  148. package/dist/server/app-rsc-handler.d.ts +12 -4
  149. package/dist/server/app-rsc-handler.js +6 -1
  150. package/dist/server/app-rsc-handler.js.map +1 -1
  151. package/dist/server/app-rsc-route-matching.d.ts +23 -0
  152. package/dist/server/app-rsc-route-matching.js +45 -23
  153. package/dist/server/app-rsc-route-matching.js.map +1 -1
  154. package/dist/server/app-server-action-execution.d.ts +35 -3
  155. package/dist/server/app-server-action-execution.js +87 -33
  156. package/dist/server/app-server-action-execution.js.map +1 -1
  157. package/dist/server/app-ssr-entry.d.ts +1 -0
  158. package/dist/server/app-ssr-entry.js +37 -13
  159. package/dist/server/app-ssr-entry.js.map +1 -1
  160. package/dist/server/app-ssr-error-meta.d.ts +14 -0
  161. package/dist/server/app-ssr-error-meta.js +50 -0
  162. package/dist/server/app-ssr-error-meta.js.map +1 -0
  163. package/dist/server/app-ssr-stream.d.ts +1 -1
  164. package/dist/server/app-ssr-stream.js +9 -12
  165. package/dist/server/app-ssr-stream.js.map +1 -1
  166. package/dist/server/artifact-compatibility.d.ts +12 -2
  167. package/dist/server/artifact-compatibility.js +12 -8
  168. package/dist/server/artifact-compatibility.js.map +1 -1
  169. package/dist/server/cache-proof.d.ts +124 -5
  170. package/dist/server/cache-proof.js +416 -18
  171. package/dist/server/cache-proof.js.map +1 -1
  172. package/dist/server/dev-lockfile.d.ts +110 -0
  173. package/dist/server/dev-lockfile.js +180 -0
  174. package/dist/server/dev-lockfile.js.map +1 -0
  175. package/dist/server/dev-server.js +15 -5
  176. package/dist/server/dev-server.js.map +1 -1
  177. package/dist/server/file-based-metadata.d.ts +13 -0
  178. package/dist/server/file-based-metadata.js +49 -2
  179. package/dist/server/file-based-metadata.js.map +1 -1
  180. package/dist/server/headers.d.ts +3 -1
  181. package/dist/server/headers.js +5 -2
  182. package/dist/server/headers.js.map +1 -1
  183. package/dist/server/html.js +1 -1
  184. package/dist/server/html.js.map +1 -1
  185. package/dist/server/http-error-responses.d.ts +10 -0
  186. package/dist/server/http-error-responses.js +11 -1
  187. package/dist/server/http-error-responses.js.map +1 -1
  188. package/dist/server/isr-cache.d.ts +2 -1
  189. package/dist/server/isr-cache.js +4 -2
  190. package/dist/server/isr-cache.js.map +1 -1
  191. package/dist/server/metadata-route-response.js +22 -5
  192. package/dist/server/metadata-route-response.js.map +1 -1
  193. package/dist/server/metadata-routes.js +27 -8
  194. package/dist/server/metadata-routes.js.map +1 -1
  195. package/dist/server/middleware-runtime.js +1 -0
  196. package/dist/server/middleware-runtime.js.map +1 -1
  197. package/dist/server/middleware.d.ts +12 -0
  198. package/dist/server/middleware.js +12 -0
  199. package/dist/server/middleware.js.map +1 -1
  200. package/dist/server/navigation-planner.d.ts +19 -5
  201. package/dist/server/navigation-planner.js +278 -17
  202. package/dist/server/navigation-planner.js.map +1 -1
  203. package/dist/server/navigation-trace.d.ts +8 -1
  204. package/dist/server/navigation-trace.js +7 -0
  205. package/dist/server/navigation-trace.js.map +1 -1
  206. package/dist/server/normalize-path.d.ts +2 -1
  207. package/dist/server/normalize-path.js +4 -1
  208. package/dist/server/normalize-path.js.map +1 -1
  209. package/dist/server/pages-api-route.js +1 -0
  210. package/dist/server/pages-api-route.js.map +1 -1
  211. package/dist/server/pages-page-data.d.ts +3 -2
  212. package/dist/server/pages-page-data.js +22 -3
  213. package/dist/server/pages-page-data.js.map +1 -1
  214. package/dist/server/pages-page-response.js +1 -1
  215. package/dist/server/prod-server.d.ts +28 -1
  216. package/dist/server/prod-server.js +62 -9
  217. package/dist/server/prod-server.js.map +1 -1
  218. package/dist/server/server-action-not-found.d.ts +16 -3
  219. package/dist/server/server-action-not-found.js +19 -1
  220. package/dist/server/server-action-not-found.js.map +1 -1
  221. package/dist/server/server-globals.d.ts +5 -0
  222. package/dist/server/server-globals.js +37 -0
  223. package/dist/server/server-globals.js.map +1 -0
  224. package/dist/server/static-file-cache.js +1 -1
  225. package/dist/server/static-file-cache.js.map +1 -1
  226. package/dist/shims/cache-runtime.d.ts +19 -2
  227. package/dist/shims/cache-runtime.js +67 -11
  228. package/dist/shims/cache-runtime.js.map +1 -1
  229. package/dist/shims/cache.d.ts +5 -18
  230. package/dist/shims/cache.js +2 -0
  231. package/dist/shims/cache.js.map +1 -1
  232. package/dist/shims/error-boundary.js +6 -8
  233. package/dist/shims/error-boundary.js.map +1 -1
  234. package/dist/shims/error.d.ts +18 -1
  235. package/dist/shims/error.js +56 -1
  236. package/dist/shims/error.js.map +1 -1
  237. package/dist/shims/fetch-cache.d.ts +4 -1
  238. package/dist/shims/fetch-cache.js +40 -5
  239. package/dist/shims/fetch-cache.js.map +1 -1
  240. package/dist/shims/font-google-base.d.ts +22 -8
  241. package/dist/shims/font-google-base.js +41 -71
  242. package/dist/shims/font-google-base.js.map +1 -1
  243. package/dist/shims/font-local.d.ts +3 -20
  244. package/dist/shims/font-local.js +23 -75
  245. package/dist/shims/font-local.js.map +1 -1
  246. package/dist/shims/font-utils.d.ts +51 -0
  247. package/dist/shims/font-utils.js +97 -0
  248. package/dist/shims/font-utils.js.map +1 -0
  249. package/dist/shims/hash-scroll.d.ts +7 -0
  250. package/dist/shims/hash-scroll.js +30 -0
  251. package/dist/shims/hash-scroll.js.map +1 -0
  252. package/dist/shims/headers.d.ts +8 -11
  253. package/dist/shims/headers.js +22 -2
  254. package/dist/shims/headers.js.map +1 -1
  255. package/dist/shims/image.d.ts +1 -0
  256. package/dist/shims/image.js +144 -78
  257. package/dist/shims/image.js.map +1 -1
  258. package/dist/shims/internal/app-router-context.d.ts +6 -6
  259. package/dist/shims/internal/app-router-context.js +17 -6
  260. package/dist/shims/internal/app-router-context.js.map +1 -1
  261. package/dist/shims/link-prefetch.d.ts +9 -1
  262. package/dist/shims/link-prefetch.js +11 -6
  263. package/dist/shims/link-prefetch.js.map +1 -1
  264. package/dist/shims/link.d.ts +12 -2
  265. package/dist/shims/link.js +78 -32
  266. package/dist/shims/link.js.map +1 -1
  267. package/dist/shims/metadata.d.ts +16 -30
  268. package/dist/shims/metadata.js +87 -28
  269. package/dist/shims/metadata.js.map +1 -1
  270. package/dist/shims/navigation.d.ts +158 -17
  271. package/dist/shims/navigation.js +324 -74
  272. package/dist/shims/navigation.js.map +1 -1
  273. package/dist/shims/navigation.react-server.d.ts +3 -2
  274. package/dist/shims/navigation.react-server.js +5 -2
  275. package/dist/shims/navigation.react-server.js.map +1 -1
  276. package/dist/shims/pages-router-runtime.d.ts +7 -0
  277. package/dist/shims/pages-router-runtime.js +16 -0
  278. package/dist/shims/pages-router-runtime.js.map +1 -0
  279. package/dist/shims/router.d.ts +32 -6
  280. package/dist/shims/router.js +197 -242
  281. package/dist/shims/router.js.map +1 -1
  282. package/dist/shims/script.js +110 -32
  283. package/dist/shims/script.js.map +1 -1
  284. package/dist/shims/server.js +2 -1
  285. package/dist/shims/server.js.map +1 -1
  286. package/dist/shims/slot.d.ts +1 -0
  287. package/dist/shims/slot.js +41 -1
  288. package/dist/shims/slot.js.map +1 -1
  289. package/dist/shims/unified-request-context.js +2 -0
  290. package/dist/shims/unified-request-context.js.map +1 -1
  291. package/dist/shims/unrecognized-action-error.d.ts +35 -0
  292. package/dist/shims/unrecognized-action-error.js +41 -0
  293. package/dist/shims/unrecognized-action-error.js.map +1 -0
  294. package/dist/shims/url-utils.d.ts +21 -1
  295. package/dist/shims/url-utils.js +67 -3
  296. package/dist/shims/url-utils.js.map +1 -1
  297. package/dist/utils/asset-prefix.d.ts +69 -0
  298. package/dist/utils/asset-prefix.js +91 -0
  299. package/dist/utils/asset-prefix.js.map +1 -0
  300. package/dist/utils/base-path.d.ts +7 -1
  301. package/dist/utils/base-path.js +10 -1
  302. package/dist/utils/base-path.js.map +1 -1
  303. package/dist/utils/navigation-signal.d.ts +1 -2
  304. package/dist/utils/navigation-signal.js +1 -1
  305. package/dist/utils/navigation-signal.js.map +1 -1
  306. package/dist/utils/sorted-array.d.ts +9 -0
  307. package/dist/utils/sorted-array.js +22 -0
  308. package/dist/utils/sorted-array.js.map +1 -0
  309. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-routes.js","names":[],"sources":["../../src/server/metadata-routes.ts"],"sourcesContent":["/**\n * File-based metadata route handling.\n *\n * Next.js supports special files in the app/ directory that auto-generate\n * metadata routes:\n * - sitemap.ts/.xml → /sitemap.xml (application/xml)\n * - robots.ts/.txt → /robots.txt (text/plain)\n * - manifest.ts/.json/.webmanifest → /manifest.webmanifest (application/manifest+json)\n * - icon.tsx/.png → /icon (image/*)\n * - opengraph-image.tsx/.png → /opengraph-image (image/*)\n * - twitter-image.tsx/.png → /twitter-image (image/*)\n * - apple-icon.tsx/.png → /apple-icon (image/*)\n * - favicon.ico → /favicon.ico (image/x-icon)\n *\n * Dynamic versions (ts/tsx/js) export a default function that returns the data.\n * Static versions (xml/txt/json/png/etc.) are served as-is.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { matchRoutePattern } from \"../routing/route-pattern.js\";\n\n// -------------------------------------------------------------------\n// Types matching Next.js MetadataRoute\n// -------------------------------------------------------------------\n\nexport type SitemapEntry = {\n url: string;\n lastModified?: string | Date;\n changeFrequency?: \"always\" | \"hourly\" | \"daily\" | \"weekly\" | \"monthly\" | \"yearly\" | \"never\";\n priority?: number;\n alternates?: {\n languages?: Record<string, string>;\n };\n images?: string[];\n videos?: Array<{\n title: string;\n thumbnail_loc: string;\n description: string;\n content_loc?: string;\n player_loc?: string;\n duration?: number;\n expiration_date?: string | Date;\n rating?: number;\n view_count?: number;\n publication_date?: string | Date;\n family_friendly?: \"yes\" | \"no\";\n restriction?: { relationship: \"allow\" | \"deny\"; content: string };\n platform?: { relationship: \"allow\" | \"deny\"; content: string };\n requires_subscription?: \"yes\" | \"no\";\n uploader?: {\n info?: string;\n content?: string;\n };\n live?: \"yes\" | \"no\";\n tag?: string;\n }>;\n};\n\nexport type RobotsRule = {\n userAgent?: string | string[];\n allow?: string | string[];\n disallow?: string | string[];\n crawlDelay?: number;\n other?: Record<string, string | number | Array<string | number>>;\n};\n\nexport type RobotsConfig = {\n rules: RobotsRule | RobotsRule[];\n sitemap?: string | string[];\n host?: string;\n};\n\nexport type ManifestConfig = {\n name?: string;\n short_name?: string;\n description?: string;\n start_url?: string;\n display?: \"fullscreen\" | \"standalone\" | \"minimal-ui\" | \"browser\";\n background_color?: string;\n theme_color?: string;\n icons?: Array<{\n src: string;\n sizes?: string;\n type?: string;\n purpose?: string;\n }>;\n [key: string]: unknown;\n};\n\n// -------------------------------------------------------------------\n// Known metadata file patterns\n// -------------------------------------------------------------------\n\n/** Map of metadata file base names to their URL path and content type. */\nexport const METADATA_FILE_MAP: Record<\n string,\n {\n /** URL path this file is served at */\n urlPath: string;\n /** Content type for the response */\n contentType: string;\n /** Whether this can be dynamic (.ts/.tsx/.js) */\n canBeDynamic: boolean;\n /** File extensions for static variants */\n staticExtensions: string[];\n /** File extensions for dynamic variants */\n dynamicExtensions: string[];\n /** Whether this can be nested in sub-segments */\n nestable: boolean;\n }\n> = {\n sitemap: {\n urlPath: \"/sitemap.xml\",\n contentType: \"application/xml\",\n canBeDynamic: true,\n staticExtensions: [\".xml\"],\n dynamicExtensions: [\".ts\", \".js\"],\n nestable: true,\n },\n robots: {\n urlPath: \"/robots.txt\",\n contentType: \"text/plain\",\n canBeDynamic: true,\n staticExtensions: [\".txt\"],\n dynamicExtensions: [\".ts\", \".js\"],\n nestable: false,\n },\n manifest: {\n urlPath: \"/manifest.webmanifest\",\n contentType: \"application/manifest+json\",\n canBeDynamic: true,\n staticExtensions: [\".json\", \".webmanifest\"],\n dynamicExtensions: [\".ts\", \".js\"],\n nestable: false,\n },\n favicon: {\n urlPath: \"/favicon.ico\",\n contentType: \"image/x-icon\",\n canBeDynamic: false,\n staticExtensions: [\".ico\"],\n dynamicExtensions: [],\n nestable: false,\n },\n icon: {\n urlPath: \"/icon\",\n contentType: \"image/png\",\n canBeDynamic: true,\n staticExtensions: [\".ico\", \".jpg\", \".jpeg\", \".png\", \".svg\"],\n dynamicExtensions: [\".ts\", \".tsx\", \".js\"],\n nestable: true,\n },\n \"opengraph-image\": {\n urlPath: \"/opengraph-image\",\n contentType: \"image/png\",\n canBeDynamic: true,\n staticExtensions: [\".jpg\", \".jpeg\", \".png\", \".gif\"],\n dynamicExtensions: [\".ts\", \".tsx\", \".js\"],\n nestable: true,\n },\n \"twitter-image\": {\n urlPath: \"/twitter-image\",\n contentType: \"image/png\",\n canBeDynamic: true,\n staticExtensions: [\".jpg\", \".jpeg\", \".png\", \".gif\"],\n dynamicExtensions: [\".ts\", \".tsx\", \".js\"],\n nestable: true,\n },\n \"apple-icon\": {\n urlPath: \"/apple-icon\",\n contentType: \"image/png\",\n canBeDynamic: true,\n staticExtensions: [\".jpg\", \".jpeg\", \".png\"],\n dynamicExtensions: [\".ts\", \".tsx\", \".js\"],\n nestable: true,\n },\n};\n\n// -------------------------------------------------------------------\n// Serializers\n// -------------------------------------------------------------------\n\n/** Escape the five XML special characters in text content and attribute values. */\nfunction escapeXml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n\n/**\n * Convert a sitemap array to XML string.\n */\nexport function sitemapToXml(entries: SitemapEntry[]): string {\n const hasAlternates = entries.some((entry) => Object.keys(entry.alternates ?? {}).length > 0);\n const hasImages = entries.some((entry) => Boolean(entry.images?.length));\n const hasVideos = entries.some((entry) => Boolean(entry.videos?.length));\n let content = \"\";\n\n content += '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n content += '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"';\n if (hasImages) {\n content += ' xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"';\n }\n if (hasVideos) {\n content += ' xmlns:video=\"http://www.google.com/schemas/sitemap-video/1.1\"';\n }\n if (hasAlternates) {\n content += ' xmlns:xhtml=\"http://www.w3.org/1999/xhtml\">\\n';\n } else {\n content += \">\\n\";\n }\n\n for (const entry of entries) {\n content += \"<url>\\n\";\n content += `<loc>${escapeXml(entry.url)}</loc>\\n`;\n\n const languages = entry.alternates?.languages;\n if (languages && Object.keys(languages).length) {\n for (const language in languages) {\n content += `<xhtml:link rel=\"alternate\" hreflang=\"${escapeXml(language)}\" href=\"${escapeXml(languages[language])}\" />\\n`;\n }\n }\n\n if (entry.images?.length) {\n for (const image of entry.images) {\n content += `<image:image>\\n<image:loc>${escapeXml(image)}</image:loc>\\n</image:image>\\n`;\n }\n }\n\n if (entry.videos?.length) {\n for (const video of entry.videos) {\n const videoFields = [\n \"<video:video>\",\n `<video:title>${escapeXml(String(video.title))}</video:title>`,\n `<video:thumbnail_loc>${escapeXml(String(video.thumbnail_loc))}</video:thumbnail_loc>`,\n `<video:description>${escapeXml(String(video.description))}</video:description>`,\n video.content_loc &&\n `<video:content_loc>${escapeXml(String(video.content_loc))}</video:content_loc>`,\n video.player_loc &&\n `<video:player_loc>${escapeXml(String(video.player_loc))}</video:player_loc>`,\n video.duration && `<video:duration>${video.duration}</video:duration>`,\n video.view_count && `<video:view_count>${video.view_count}</video:view_count>`,\n video.tag && `<video:tag>${escapeXml(String(video.tag))}</video:tag>`,\n video.rating && `<video:rating>${video.rating}</video:rating>`,\n video.expiration_date &&\n `<video:expiration_date>${escapeXml(String(video.expiration_date))}</video:expiration_date>`,\n video.publication_date &&\n `<video:publication_date>${escapeXml(String(video.publication_date))}</video:publication_date>`,\n video.family_friendly &&\n `<video:family_friendly>${video.family_friendly}</video:family_friendly>`,\n video.requires_subscription &&\n `<video:requires_subscription>${video.requires_subscription}</video:requires_subscription>`,\n video.live && `<video:live>${video.live}</video:live>`,\n video.restriction &&\n `<video:restriction relationship=\"${escapeXml(String(video.restriction.relationship))}\">${escapeXml(String(video.restriction.content))}</video:restriction>`,\n video.platform &&\n `<video:platform relationship=\"${escapeXml(String(video.platform.relationship))}\">${escapeXml(String(video.platform.content))}</video:platform>`,\n video.uploader &&\n `<video:uploader${video.uploader.info ? ` info=\"${escapeXml(String(video.uploader.info))}\"` : \"\"}>${escapeXml(String(video.uploader.content))}</video:uploader>`,\n \"</video:video>\\n\",\n ].filter(Boolean);\n content += videoFields.join(\"\\n\");\n }\n }\n\n if (entry.lastModified) {\n content += `<lastmod>${serializeDate(entry.lastModified)}</lastmod>\\n`;\n }\n if (entry.changeFrequency) {\n content += `<changefreq>${entry.changeFrequency}</changefreq>\\n`;\n }\n if (typeof entry.priority === \"number\") {\n content += `<priority>${entry.priority}</priority>\\n`;\n }\n content += \"</url>\\n\";\n }\n\n content += \"</urlset>\\n\";\n return content;\n}\n\n/**\n * Convert a robots config to text format.\n */\nexport function robotsToText(config: RobotsConfig): string {\n const lines: string[] = [];\n const rules = Array.isArray(config.rules) ? config.rules : [config.rules];\n\n for (const rule of rules) {\n const agents = Array.isArray(rule.userAgent) ? rule.userAgent : [rule.userAgent ?? \"*\"];\n\n for (const agent of agents) {\n lines.push(`User-Agent: ${agent}`);\n }\n\n if (rule.allow) {\n const allows = Array.isArray(rule.allow) ? rule.allow : [rule.allow];\n for (const allow of allows) {\n lines.push(`Allow: ${allow}`);\n }\n }\n\n if (rule.disallow) {\n const disallows = Array.isArray(rule.disallow) ? rule.disallow : [rule.disallow];\n for (const disallow of disallows) {\n lines.push(`Disallow: ${disallow}`);\n }\n }\n\n if (rule.crawlDelay !== undefined) {\n lines.push(`Crawl-delay: ${rule.crawlDelay}`);\n }\n\n if (rule.other) {\n for (const key of Object.keys(rule.other)) {\n const value = rule.other[key];\n if (value == null) continue;\n const values = Array.isArray(value) ? value : [value];\n for (const v of values) {\n lines.push(`${key}: ${v}`);\n }\n }\n }\n\n lines.push(\"\");\n }\n\n if (config.sitemap) {\n const sitemaps = Array.isArray(config.sitemap) ? config.sitemap : [config.sitemap];\n for (const sitemap of sitemaps) {\n lines.push(`Sitemap: ${sitemap}`);\n }\n }\n\n if (config.host) {\n lines.push(`Host: ${config.host}`);\n }\n\n return lines.join(\"\\n\").trim() + \"\\n\";\n}\n\n/**\n * Convert a manifest config to JSON string.\n */\nexport function manifestToJson(config: ManifestConfig): string {\n return JSON.stringify(config, null, 2);\n}\n\nfunction serializeDate(value: string | Date): string {\n return value instanceof Date ? value.toISOString() : value;\n}\n\n// -------------------------------------------------------------------\n// Static metadata URL resolution\n//\n// Ported from Next.js: packages/next/src/lib/metadata/get-metadata-route.ts\n// https://github.com/vercel/next.js/blob/7873aea/packages/next/src/lib/metadata/get-metadata-route.ts\n//\n// Static metadata files (like favicon.ico, icon.png) under dynamic parents\n// get a fixed URL with \"-\" placeholders instead of literal \"[param]\" segments.\n// Route groups and parallel route parents trigger a unique hash suffix to\n// avoid collisions.\n// -------------------------------------------------------------------\n\n/**\n * Regular expression pattern used to match route parameters.\n * Matches both single parameters and parameter groups.\n * Examples:\n * - `[[...slug]]` matches parameter group with key 'slug', repeat: true, optional: true\n * - `[...slug]` matches parameter group with key 'slug', repeat: true, optional: false\n * - `[[foo]]` matches parameter with key 'foo', repeat: false, optional: true\n * - `[bar]` matches parameter with key 'bar', repeat: false, optional: false\n */\nconst PARAMETER_PATTERN = /^([^[]*)\\[((?:\\[[^\\]]*\\])|[^\\]]+)\\](.*)$/;\n\nfunction isGroupSegment(segment: string): boolean {\n return segment.startsWith(\"(\") && segment.endsWith(\")\");\n}\n\nfunction isParallelRouteSegment(segment: string): boolean {\n return segment.startsWith(\"@\") && segment !== \"@children\";\n}\n\nfunction normalizeStaticMetadataRouteSegment(segment: string): string {\n let normalizedSegment = segment;\n let match = normalizedSegment.match(PARAMETER_PATTERN);\n while (match) {\n normalizedSegment = `${match[1]}-${match[3]}`;\n match = normalizedSegment.match(PARAMETER_PATTERN);\n }\n return normalizedSegment;\n}\n\nfunction getStaticMetadataRoute(appDirPath: string): string {\n const segments = appDirPath.split(\"/\").filter(Boolean);\n const normalizedSegments: string[] = [];\n for (const seg of segments) {\n // Strip route groups and all parallel route slots (including @children)\n // from the URL path. The @children slot is the default parallel route\n // and must also be invisible in the URL, matching Next.js behavior.\n if (isGroupSegment(seg) || seg.startsWith(\"@\")) continue;\n normalizedSegments.push(normalizeStaticMetadataRouteSegment(seg));\n }\n return normalizedSegments.length > 0 ? `/${normalizedSegments.join(\"/\")}` : \"\";\n}\n\nfunction hashMetadataRouteParentPath(parentPathname: string): string {\n let hash = 5381;\n for (let i = 0; i < parentPathname.length; i++) {\n hash = ((hash << 5) + hash + parentPathname.charCodeAt(i)) & 0xffffffff;\n }\n return (hash >>> 0).toString(36).slice(0, 6);\n}\n\nfunction getMetadataRouteSuffix(page: string): string {\n const lastSlash = page.lastIndexOf(\"/\");\n const parentPathname = lastSlash > 0 ? page.slice(0, lastSlash) : \"\";\n if (page.endsWith(\"/sitemap\") || page.endsWith(\"/sitemap.xml\")) return \"\";\n const segments = parentPathname.split(\"/\");\n const hasInvisibleParent = segments.some(\n (seg) => isGroupSegment(seg) || isParallelRouteSegment(seg),\n );\n if (!hasInvisibleParent) return \"\";\n return hashMetadataRouteParentPath(parentPathname);\n}\n\nfunction computeMetadataRouteSuffix(\n appDirPath: string,\n leafName: string,\n): { route: string; suffix: string } {\n const route = getStaticMetadataRoute(appDirPath);\n const pagePath =\n appDirPath === \"\" || appDirPath === \"/\" ? `/${leafName}` : `${appDirPath}/${leafName}`;\n const suffix = getMetadataRouteSuffix(pagePath);\n return { route, suffix };\n}\n\nfunction getMetadataRouteFilename(appDirPath: string, lastSegment: string): string {\n const ext = path.posix.extname(lastSegment);\n const name = lastSegment.slice(0, -ext.length || undefined);\n const { suffix } = computeMetadataRouteSuffix(appDirPath, name);\n const routeSuffix = suffix ? `-${suffix}` : \"\";\n return `${name}${routeSuffix}${ext}`;\n}\n\n/**\n * Compute the static URL for a metadata file given its app directory\n * parent path and filename.\n *\n * Example:\n * fillStaticMetadataSegment(\"/\", \"favicon.ico\") -> \"/favicon.ico\"\n * fillStaticMetadataSegment(\"/blog/[slug]\", \"favicon.ico\") -> \"/blog/-/favicon.ico\"\n * fillStaticMetadataSegment(\"/(group)/group\", \"icon.png\") -> \"/group/icon-131tc6.png\"\n */\nexport function fillStaticMetadataSegment(appDirPath: string, lastSegment: string): string {\n const route = getStaticMetadataRoute(appDirPath);\n const filename = getMetadataRouteFilename(appDirPath, lastSegment);\n return route === \"\" ? `/${filename}` : `${route}/${filename}`;\n}\n\n// -------------------------------------------------------------------\n// Metadata route discovery\n// -------------------------------------------------------------------\n\nexport type MetadataFileRoute = {\n /** Type of metadata file */\n type: string;\n /** Whether this is a dynamic (code-generated) route */\n isDynamic: boolean;\n /** Imported dynamic module for code-generated metadata routes. */\n module?: Record<string, unknown>;\n /** Absolute file path */\n filePath: string;\n /** Route prefix where this metadata applies, preserving dynamic segment names. */\n routePrefix: string;\n /** Raw app tree segments where this metadata file is colocated. */\n routeSegments?: string[];\n /** Pattern parts for matching dynamic metadata routes at request time. */\n patternParts?: string[];\n /** URL path this file is served at */\n servedUrl: string;\n /** Content type for the response */\n contentType: string;\n /** Optional metadata used to inject file-based routes into <head>. */\n headData?: MetadataRouteHeadData;\n /** Optional content hash for cache-busting metadata links. */\n contentHash?: string;\n /** Sibling .alt.txt file for static social image metadata routes. */\n altFilePath?: string;\n};\n\nexport type MetadataRouteHeadData =\n | {\n kind: \"favicon\" | \"icon\" | \"apple\";\n href: string;\n type?: string;\n sizes?: string;\n }\n | {\n kind: \"openGraph\" | \"twitter\";\n href: string;\n type?: string;\n width?: number;\n height?: number;\n alt?: string;\n }\n | {\n kind: \"manifest\";\n href: string;\n };\n\nexport function getMetadataRouteKind(\n route: Pick<MetadataFileRoute, \"type\">,\n): MetadataRouteHeadData[\"kind\"] | null {\n if (route.type === \"favicon\") return \"favicon\";\n if (route.type === \"icon\") return \"icon\";\n if (route.type === \"apple-icon\") return \"apple\";\n if (route.type === \"opengraph-image\") return \"openGraph\";\n if (route.type === \"twitter-image\") return \"twitter\";\n if (route.type === \"manifest\") return \"manifest\";\n return null;\n}\n\nexport function getMetadataImageRouteKind(\n route: Pick<MetadataFileRoute, \"type\">,\n): Extract<MetadataRouteHeadData[\"kind\"], \"icon\" | \"apple\" | \"openGraph\" | \"twitter\"> | null {\n const kind = getMetadataRouteKind(route);\n if (kind === \"icon\" || kind === \"apple\" || kind === \"openGraph\" || kind === \"twitter\") {\n return kind;\n }\n return null;\n}\n\nconst metadataImageIdPattern = /^[a-zA-Z0-9-_.]+$/;\n\nexport function isValidMetadataImageId(id: string): boolean {\n return metadataImageIdPattern.test(id);\n}\n\nexport function matchMetadataRoutePattern(\n urlParts: string[],\n patternParts: string[],\n): Record<string, string | string[]> | null {\n return matchRoutePattern(urlParts, patternParts);\n}\n\nfunction metadataRouteSuffix(parentSegments: string[], metaType: string): string {\n if (metaType === \"sitemap\") {\n // Sitemap is exempt per Next.js (robots/manifest are root-only, so\n // invisible parents never apply — but we keep the exemption list\n // matching getMetadataRouteSuffix for defensive consistency).\n return \"\";\n }\n\n const hasInvisibleParent = parentSegments.some(\n (segment) =>\n (segment.startsWith(\"(\") && segment.endsWith(\")\")) ||\n (segment.startsWith(\"@\") && segment !== \"@children\"),\n );\n if (!hasInvisibleParent) return \"\";\n\n return hashMetadataRouteParentPath(`/${parentSegments.join(\"/\")}`);\n}\n\nfunction withMetadataSuffix(urlPath: string, suffix: string): string {\n if (!suffix) return urlPath;\n const parsed = path.posix.parse(urlPath);\n return path.posix.join(parsed.dir || \"/\", `${parsed.name}-${suffix}${parsed.ext}`);\n}\n\nfunction getMetadataServedUrl(\n metaType: string,\n config: { urlPath: string },\n ext: string,\n isDynamic: boolean,\n suffix: string,\n routeBaseName: string,\n): string {\n if (\n isDynamic &&\n (metaType === \"icon\" ||\n metaType === \"apple-icon\" ||\n metaType === \"opengraph-image\" ||\n metaType === \"twitter-image\")\n ) {\n return withMetadataSuffix(`/${routeBaseName}`, suffix);\n }\n\n if (isDynamic) {\n return withMetadataSuffix(config.urlPath, suffix);\n }\n\n if (metaType === \"manifest\") {\n return withMetadataSuffix(`/${routeBaseName}${ext}`, suffix);\n }\n\n if (\n metaType === \"icon\" ||\n metaType === \"apple-icon\" ||\n metaType === \"opengraph-image\" ||\n metaType === \"twitter-image\"\n ) {\n return withMetadataSuffix(`/${routeBaseName}${ext}`, suffix);\n }\n\n return withMetadataSuffix(config.urlPath, suffix);\n}\n\nexport function matchMetadataFileBaseName(metaType: string, baseName: string): string | null {\n if (baseName === metaType) {\n return baseName;\n }\n\n if (\n metaType === \"icon\" ||\n metaType === \"apple-icon\" ||\n metaType === \"opengraph-image\" ||\n metaType === \"twitter-image\"\n ) {\n const suffix = baseName.slice(metaType.length);\n if (/^\\d$/.test(suffix)) {\n return baseName;\n }\n }\n\n return null;\n}\n\n/**\n * Scan an app directory for metadata files.\n */\nexport function scanMetadataFiles(appDir: string): MetadataFileRoute[] {\n const routes: MetadataFileRoute[] = [];\n\n // Scan the app directory recursively\n function scan(dir: string, urlPrefix: string, parentSegments: string[]): void {\n if (!fs.existsSync(dir)) return;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const dirName = entry.name;\n if (dirName.startsWith(\"_\")) continue;\n\n const isRouteGroup = dirName.startsWith(\"(\") && dirName.endsWith(\")\");\n const isParallelRoute = dirName.startsWith(\"@\");\n const nextUrlPrefix =\n isRouteGroup || isParallelRoute ? urlPrefix : `${urlPrefix}/${dirName}`;\n scan(path.join(dir, dirName), nextUrlPrefix, [...parentSegments, dirName]);\n continue;\n }\n\n // Check each metadata file pattern\n const fileName = entry.name;\n const baseName = fileName.replace(/\\.[^.]+$/, \"\");\n const ext = fileName.slice(baseName.length);\n\n for (const [metaType, config] of Object.entries(METADATA_FILE_MAP)) {\n const routeBaseName = matchMetadataFileBaseName(metaType, baseName);\n if (!routeBaseName) continue;\n\n // Check nestability — non-nestable types only at root\n if (!config.nestable && urlPrefix !== \"\") continue;\n\n // Check if this is a static or dynamic variant\n const isStatic = config.staticExtensions.includes(ext);\n const isDynamic = config.dynamicExtensions.includes(ext);\n\n if (!isStatic && !isDynamic) continue;\n const appDirPath = parentSegments.length > 0 ? `/${parentSegments.join(\"/\")}` : \"\";\n const suffix = metadataRouteSuffix(parentSegments, metaType);\n const urlPath = getMetadataServedUrl(\n metaType,\n config,\n ext,\n isDynamic,\n suffix,\n routeBaseName,\n );\n const servedUrl = isStatic\n ? fillStaticMetadataSegment(appDirPath, `${routeBaseName}${ext}`)\n : urlPrefix === \"\"\n ? urlPath\n : `${urlPrefix}${urlPath}`;\n const altFilePath =\n isStatic && (metaType === \"opengraph-image\" || metaType === \"twitter-image\")\n ? resolveStaticMetadataAltFilePath(dir, baseName)\n : undefined;\n\n routes.push({\n type: metaType,\n isDynamic,\n filePath: path.join(dir, fileName),\n routePrefix: urlPrefix,\n routeSegments: parentSegments,\n servedUrl,\n contentType:\n isStatic && metaType === \"manifest\"\n ? config.contentType\n : isStatic\n ? getStaticContentType(ext, config.contentType)\n : config.contentType,\n altFilePath,\n });\n }\n }\n }\n\n scan(appDir, \"\", []);\n\n // Deduplicate: if both dynamic and static variants exist at the same URL,\n // keep only the dynamic one (matches Next.js behavior).\n const byUrl = new Map<string, MetadataFileRoute>();\n for (const route of routes) {\n const existing = byUrl.get(route.servedUrl);\n if (!existing) {\n byUrl.set(route.servedUrl, route);\n } else if (route.isDynamic && !existing.isDynamic) {\n // Dynamic takes priority over static\n byUrl.set(route.servedUrl, route);\n }\n // If both are static or both dynamic, keep the first one found\n }\n return Array.from(byUrl.values());\n}\n\nfunction resolveStaticMetadataAltFilePath(dir: string, baseName: string): string | undefined {\n const altPath = path.join(dir, `${baseName}.alt.txt`);\n return fs.existsSync(altPath) ? altPath : undefined;\n}\n\nfunction getStaticContentType(ext: string, fallback: string): string {\n const map: Record<string, string> = {\n \".xml\": \"application/xml\",\n \".txt\": \"text/plain\",\n \".json\": \"application/json\",\n \".webmanifest\": \"application/manifest+json\",\n \".ico\": \"image/x-icon\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n };\n return map[ext] ?? fallback;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA8FA,MAAa,oBAgBT;CACF,SAAS;EACP,SAAS;EACT,aAAa;EACb,cAAc;EACd,kBAAkB,CAAC,OAAO;EAC1B,mBAAmB,CAAC,OAAO,MAAM;EACjC,UAAU;EACX;CACD,QAAQ;EACN,SAAS;EACT,aAAa;EACb,cAAc;EACd,kBAAkB,CAAC,OAAO;EAC1B,mBAAmB,CAAC,OAAO,MAAM;EACjC,UAAU;EACX;CACD,UAAU;EACR,SAAS;EACT,aAAa;EACb,cAAc;EACd,kBAAkB,CAAC,SAAS,eAAe;EAC3C,mBAAmB,CAAC,OAAO,MAAM;EACjC,UAAU;EACX;CACD,SAAS;EACP,SAAS;EACT,aAAa;EACb,cAAc;EACd,kBAAkB,CAAC,OAAO;EAC1B,mBAAmB,EAAE;EACrB,UAAU;EACX;CACD,MAAM;EACJ,SAAS;EACT,aAAa;EACb,cAAc;EACd,kBAAkB;GAAC;GAAQ;GAAQ;GAAS;GAAQ;GAAO;EAC3D,mBAAmB;GAAC;GAAO;GAAQ;GAAM;EACzC,UAAU;EACX;CACD,mBAAmB;EACjB,SAAS;EACT,aAAa;EACb,cAAc;EACd,kBAAkB;GAAC;GAAQ;GAAS;GAAQ;GAAO;EACnD,mBAAmB;GAAC;GAAO;GAAQ;GAAM;EACzC,UAAU;EACX;CACD,iBAAiB;EACf,SAAS;EACT,aAAa;EACb,cAAc;EACd,kBAAkB;GAAC;GAAQ;GAAS;GAAQ;GAAO;EACnD,mBAAmB;GAAC;GAAO;GAAQ;GAAM;EACzC,UAAU;EACX;CACD,cAAc;EACZ,SAAS;EACT,aAAa;EACb,cAAc;EACd,kBAAkB;GAAC;GAAQ;GAAS;GAAO;EAC3C,mBAAmB;GAAC;GAAO;GAAQ;GAAM;EACzC,UAAU;EACX;CACF;;AAOD,SAAS,UAAU,GAAmB;CACpC,OAAO,EACJ,QAAQ,MAAM,QAAQ,CACtB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,SAAS,CACvB,QAAQ,MAAM,SAAS;;;;;AAM5B,SAAgB,aAAa,SAAiC;CAC5D,MAAM,gBAAgB,QAAQ,MAAM,UAAU,OAAO,KAAK,MAAM,cAAc,EAAE,CAAC,CAAC,SAAS,EAAE;CAC7F,MAAM,YAAY,QAAQ,MAAM,UAAU,QAAQ,MAAM,QAAQ,OAAO,CAAC;CACxE,MAAM,YAAY,QAAQ,MAAM,UAAU,QAAQ,MAAM,QAAQ,OAAO,CAAC;CACxE,IAAI,UAAU;CAEd,WAAW;CACX,WAAW;CACX,IAAI,WACF,WAAW;CAEb,IAAI,WACF,WAAW;CAEb,IAAI,eACF,WAAW;MAEX,WAAW;CAGb,KAAK,MAAM,SAAS,SAAS;EAC3B,WAAW;EACX,WAAW,QAAQ,UAAU,MAAM,IAAI,CAAC;EAExC,MAAM,YAAY,MAAM,YAAY;EACpC,IAAI,aAAa,OAAO,KAAK,UAAU,CAAC,QACtC,KAAK,MAAM,YAAY,WACrB,WAAW,yCAAyC,UAAU,SAAS,CAAC,UAAU,UAAU,UAAU,UAAU,CAAC;EAIrH,IAAI,MAAM,QAAQ,QAChB,KAAK,MAAM,SAAS,MAAM,QACxB,WAAW,6BAA6B,UAAU,MAAM,CAAC;EAI7D,IAAI,MAAM,QAAQ,QAChB,KAAK,MAAM,SAAS,MAAM,QAAQ;GAChC,MAAM,cAAc;IAClB;IACA,gBAAgB,UAAU,OAAO,MAAM,MAAM,CAAC,CAAC;IAC/C,wBAAwB,UAAU,OAAO,MAAM,cAAc,CAAC,CAAC;IAC/D,sBAAsB,UAAU,OAAO,MAAM,YAAY,CAAC,CAAC;IAC3D,MAAM,eACJ,sBAAsB,UAAU,OAAO,MAAM,YAAY,CAAC,CAAC;IAC7D,MAAM,cACJ,qBAAqB,UAAU,OAAO,MAAM,WAAW,CAAC,CAAC;IAC3D,MAAM,YAAY,mBAAmB,MAAM,SAAS;IACpD,MAAM,cAAc,qBAAqB,MAAM,WAAW;IAC1D,MAAM,OAAO,cAAc,UAAU,OAAO,MAAM,IAAI,CAAC,CAAC;IACxD,MAAM,UAAU,iBAAiB,MAAM,OAAO;IAC9C,MAAM,mBACJ,0BAA0B,UAAU,OAAO,MAAM,gBAAgB,CAAC,CAAC;IACrE,MAAM,oBACJ,2BAA2B,UAAU,OAAO,MAAM,iBAAiB,CAAC,CAAC;IACvE,MAAM,mBACJ,0BAA0B,MAAM,gBAAgB;IAClD,MAAM,yBACJ,gCAAgC,MAAM,sBAAsB;IAC9D,MAAM,QAAQ,eAAe,MAAM,KAAK;IACxC,MAAM,eACJ,oCAAoC,UAAU,OAAO,MAAM,YAAY,aAAa,CAAC,CAAC,IAAI,UAAU,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC;IACzI,MAAM,YACJ,iCAAiC,UAAU,OAAO,MAAM,SAAS,aAAa,CAAC,CAAC,IAAI,UAAU,OAAO,MAAM,SAAS,QAAQ,CAAC,CAAC;IAChI,MAAM,YACJ,kBAAkB,MAAM,SAAS,OAAO,UAAU,UAAU,OAAO,MAAM,SAAS,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,UAAU,OAAO,MAAM,SAAS,QAAQ,CAAC,CAAC;IAChJ;IACD,CAAC,OAAO,QAAQ;GACjB,WAAW,YAAY,KAAK,KAAK;;EAIrC,IAAI,MAAM,cACR,WAAW,YAAY,cAAc,MAAM,aAAa,CAAC;EAE3D,IAAI,MAAM,iBACR,WAAW,eAAe,MAAM,gBAAgB;EAElD,IAAI,OAAO,MAAM,aAAa,UAC5B,WAAW,aAAa,MAAM,SAAS;EAEzC,WAAW;;CAGb,WAAW;CACX,OAAO;;;;;AAMT,SAAgB,aAAa,QAA8B;CACzD,MAAM,QAAkB,EAAE;CAC1B,MAAM,QAAQ,MAAM,QAAQ,OAAO,MAAM,GAAG,OAAO,QAAQ,CAAC,OAAO,MAAM;CAEzE,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,SAAS,MAAM,QAAQ,KAAK,UAAU,GAAG,KAAK,YAAY,CAAC,KAAK,aAAa,IAAI;EAEvF,KAAK,MAAM,SAAS,QAClB,MAAM,KAAK,eAAe,QAAQ;EAGpC,IAAI,KAAK,OAAO;GACd,MAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,GAAG,KAAK,QAAQ,CAAC,KAAK,MAAM;GACpE,KAAK,MAAM,SAAS,QAClB,MAAM,KAAK,UAAU,QAAQ;;EAIjC,IAAI,KAAK,UAAU;GACjB,MAAM,YAAY,MAAM,QAAQ,KAAK,SAAS,GAAG,KAAK,WAAW,CAAC,KAAK,SAAS;GAChF,KAAK,MAAM,YAAY,WACrB,MAAM,KAAK,aAAa,WAAW;;EAIvC,IAAI,KAAK,eAAe,KAAA,GACtB,MAAM,KAAK,gBAAgB,KAAK,aAAa;EAG/C,IAAI,KAAK,OACP,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,MAAM,EAAE;GACzC,MAAM,QAAQ,KAAK,MAAM;GACzB,IAAI,SAAS,MAAM;GACnB,MAAM,SAAS,MAAM,QAAQ,MAAM,GAAG,QAAQ,CAAC,MAAM;GACrD,KAAK,MAAM,KAAK,QACd,MAAM,KAAK,GAAG,IAAI,IAAI,IAAI;;EAKhC,MAAM,KAAK,GAAG;;CAGhB,IAAI,OAAO,SAAS;EAClB,MAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,GAAG,OAAO,UAAU,CAAC,OAAO,QAAQ;EAClF,KAAK,MAAM,WAAW,UACpB,MAAM,KAAK,YAAY,UAAU;;CAIrC,IAAI,OAAO,MACT,MAAM,KAAK,SAAS,OAAO,OAAO;CAGpC,OAAO,MAAM,KAAK,KAAK,CAAC,MAAM,GAAG;;;;;AAMnC,SAAgB,eAAe,QAAgC;CAC7D,OAAO,KAAK,UAAU,QAAQ,MAAM,EAAE;;AAGxC,SAAS,cAAc,OAA8B;CACnD,OAAO,iBAAiB,OAAO,MAAM,aAAa,GAAG;;;;;;;;;;;AAwBvD,MAAM,oBAAoB;AAE1B,SAAS,eAAe,SAA0B;CAChD,OAAO,QAAQ,WAAW,IAAI,IAAI,QAAQ,SAAS,IAAI;;AAGzD,SAAS,uBAAuB,SAA0B;CACxD,OAAO,QAAQ,WAAW,IAAI,IAAI,YAAY;;AAGhD,SAAS,oCAAoC,SAAyB;CACpE,IAAI,oBAAoB;CACxB,IAAI,QAAQ,kBAAkB,MAAM,kBAAkB;CACtD,OAAO,OAAO;EACZ,oBAAoB,GAAG,MAAM,GAAG,GAAG,MAAM;EACzC,QAAQ,kBAAkB,MAAM,kBAAkB;;CAEpD,OAAO;;AAGT,SAAS,uBAAuB,YAA4B;CAC1D,MAAM,WAAW,WAAW,MAAM,IAAI,CAAC,OAAO,QAAQ;CACtD,MAAM,qBAA+B,EAAE;CACvC,KAAK,MAAM,OAAO,UAAU;EAI1B,IAAI,eAAe,IAAI,IAAI,IAAI,WAAW,IAAI,EAAE;EAChD,mBAAmB,KAAK,oCAAoC,IAAI,CAAC;;CAEnE,OAAO,mBAAmB,SAAS,IAAI,IAAI,mBAAmB,KAAK,IAAI,KAAK;;AAG9E,SAAS,4BAA4B,gBAAgC;CACnE,IAAI,OAAO;CACX,KAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,KACzC,QAAS,QAAQ,KAAK,OAAO,eAAe,WAAW,EAAE,GAAI;CAE/D,QAAQ,SAAS,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE;;AAG9C,SAAS,uBAAuB,MAAsB;CACpD,MAAM,YAAY,KAAK,YAAY,IAAI;CACvC,MAAM,iBAAiB,YAAY,IAAI,KAAK,MAAM,GAAG,UAAU,GAAG;CAClE,IAAI,KAAK,SAAS,WAAW,IAAI,KAAK,SAAS,eAAe,EAAE,OAAO;CAKvE,IAAI,CAJa,eAAe,MAAM,IACH,CAAC,MACjC,QAAQ,eAAe,IAAI,IAAI,uBAAuB,IAAI,CAEtC,EAAE,OAAO;CAChC,OAAO,4BAA4B,eAAe;;AAGpD,SAAS,2BACP,YACA,UACmC;CAKnC,OAAO;EAAE,OAJK,uBAAuB,WAIvB;EAAE,QADD,uBADb,eAAe,MAAM,eAAe,MAAM,IAAI,aAAa,GAAG,WAAW,GAAG,WAExD;EAAE;;AAG1B,SAAS,yBAAyB,YAAoB,aAA6B;CACjF,MAAM,MAAM,KAAK,MAAM,QAAQ,YAAY;CAC3C,MAAM,OAAO,YAAY,MAAM,GAAG,CAAC,IAAI,UAAU,KAAA,EAAU;CAC3D,MAAM,EAAE,WAAW,2BAA2B,YAAY,KAAK;CAE/D,OAAO,GAAG,OADU,SAAS,IAAI,WAAW,KACb;;;;;;;;;;;AAYjC,SAAgB,0BAA0B,YAAoB,aAA6B;CACzF,MAAM,QAAQ,uBAAuB,WAAW;CAChD,MAAM,WAAW,yBAAyB,YAAY,YAAY;CAClE,OAAO,UAAU,KAAK,IAAI,aAAa,GAAG,MAAM,GAAG;;AAsDrD,SAAgB,qBACd,OACsC;CACtC,IAAI,MAAM,SAAS,WAAW,OAAO;CACrC,IAAI,MAAM,SAAS,QAAQ,OAAO;CAClC,IAAI,MAAM,SAAS,cAAc,OAAO;CACxC,IAAI,MAAM,SAAS,mBAAmB,OAAO;CAC7C,IAAI,MAAM,SAAS,iBAAiB,OAAO;CAC3C,IAAI,MAAM,SAAS,YAAY,OAAO;CACtC,OAAO;;AAGT,SAAgB,0BACd,OAC2F;CAC3F,MAAM,OAAO,qBAAqB,MAAM;CACxC,IAAI,SAAS,UAAU,SAAS,WAAW,SAAS,eAAe,SAAS,WAC1E,OAAO;CAET,OAAO;;AAGT,MAAM,yBAAyB;AAE/B,SAAgB,uBAAuB,IAAqB;CAC1D,OAAO,uBAAuB,KAAK,GAAG;;AAGxC,SAAgB,0BACd,UACA,cAC0C;CAC1C,OAAO,kBAAkB,UAAU,aAAa;;AAGlD,SAAS,oBAAoB,gBAA0B,UAA0B;CAC/E,IAAI,aAAa,WAIf,OAAO;CAQT,IAAI,CALuB,eAAe,MACvC,YACE,QAAQ,WAAW,IAAI,IAAI,QAAQ,SAAS,IAAI,IAChD,QAAQ,WAAW,IAAI,IAAI,YAAY,YAErB,EAAE,OAAO;CAEhC,OAAO,4BAA4B,IAAI,eAAe,KAAK,IAAI,GAAG;;AAGpE,SAAS,mBAAmB,SAAiB,QAAwB;CACnE,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,SAAS,KAAK,MAAM,MAAM,QAAQ;CACxC,OAAO,KAAK,MAAM,KAAK,OAAO,OAAO,KAAK,GAAG,OAAO,KAAK,GAAG,SAAS,OAAO,MAAM;;AAGpF,SAAS,qBACP,UACA,QACA,KACA,WACA,QACA,eACQ;CACR,IACE,cACC,aAAa,UACZ,aAAa,gBACb,aAAa,qBACb,aAAa,kBAEf,OAAO,mBAAmB,IAAI,iBAAiB,OAAO;CAGxD,IAAI,WACF,OAAO,mBAAmB,OAAO,SAAS,OAAO;CAGnD,IAAI,aAAa,YACf,OAAO,mBAAmB,IAAI,gBAAgB,OAAO,OAAO;CAG9D,IACE,aAAa,UACb,aAAa,gBACb,aAAa,qBACb,aAAa,iBAEb,OAAO,mBAAmB,IAAI,gBAAgB,OAAO,OAAO;CAG9D,OAAO,mBAAmB,OAAO,SAAS,OAAO;;AAGnD,SAAgB,0BAA0B,UAAkB,UAAiC;CAC3F,IAAI,aAAa,UACf,OAAO;CAGT,IACE,aAAa,UACb,aAAa,gBACb,aAAa,qBACb,aAAa,iBACb;EACA,MAAM,SAAS,SAAS,MAAM,SAAS,OAAO;EAC9C,IAAI,OAAO,KAAK,OAAO,EACrB,OAAO;;CAIX,OAAO;;;;;AAMT,SAAgB,kBAAkB,QAAqC;CACrE,MAAM,SAA8B,EAAE;CAGtC,SAAS,KAAK,KAAa,WAAmB,gBAAgC;EAC5E,IAAI,CAAC,GAAG,WAAW,IAAI,EAAE;EAEzB,MAAM,UAAU,GAAG,YAAY,KAAK,EAAE,eAAe,MAAM,CAAC;EAC5D,KAAK,MAAM,SAAS,SAAS;GAC3B,IAAI,MAAM,aAAa,EAAE;IACvB,MAAM,UAAU,MAAM;IACtB,IAAI,QAAQ,WAAW,IAAI,EAAE;IAE7B,MAAM,eAAe,QAAQ,WAAW,IAAI,IAAI,QAAQ,SAAS,IAAI;IACrE,MAAM,kBAAkB,QAAQ,WAAW,IAAI;IAC/C,MAAM,gBACJ,gBAAgB,kBAAkB,YAAY,GAAG,UAAU,GAAG;IAChE,KAAK,KAAK,KAAK,KAAK,QAAQ,EAAE,eAAe,CAAC,GAAG,gBAAgB,QAAQ,CAAC;IAC1E;;GAIF,MAAM,WAAW,MAAM;GACvB,MAAM,WAAW,SAAS,QAAQ,YAAY,GAAG;GACjD,MAAM,MAAM,SAAS,MAAM,SAAS,OAAO;GAE3C,KAAK,MAAM,CAAC,UAAU,WAAW,OAAO,QAAQ,kBAAkB,EAAE;IAClE,MAAM,gBAAgB,0BAA0B,UAAU,SAAS;IACnE,IAAI,CAAC,eAAe;IAGpB,IAAI,CAAC,OAAO,YAAY,cAAc,IAAI;IAG1C,MAAM,WAAW,OAAO,iBAAiB,SAAS,IAAI;IACtD,MAAM,YAAY,OAAO,kBAAkB,SAAS,IAAI;IAExD,IAAI,CAAC,YAAY,CAAC,WAAW;IAC7B,MAAM,aAAa,eAAe,SAAS,IAAI,IAAI,eAAe,KAAK,IAAI,KAAK;IAEhF,MAAM,UAAU,qBACd,UACA,QACA,KACA,WALa,oBAAoB,gBAAgB,SAM3C,EACN,cACD;IACD,MAAM,YAAY,WACd,0BAA0B,YAAY,GAAG,gBAAgB,MAAM,GAC/D,cAAc,KACZ,UACA,GAAG,YAAY;IACrB,MAAM,cACJ,aAAa,aAAa,qBAAqB,aAAa,mBACxD,iCAAiC,KAAK,SAAS,GAC/C,KAAA;IAEN,OAAO,KAAK;KACV,MAAM;KACN;KACA,UAAU,KAAK,KAAK,KAAK,SAAS;KAClC,aAAa;KACb,eAAe;KACf;KACA,aACE,YAAY,aAAa,aACrB,OAAO,cACP,WACE,qBAAqB,KAAK,OAAO,YAAY,GAC7C,OAAO;KACf;KACD,CAAC;;;;CAKR,KAAK,QAAQ,IAAI,EAAE,CAAC;CAIpB,MAAM,wBAAQ,IAAI,KAAgC;CAClD,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,WAAW,MAAM,IAAI,MAAM,UAAU;EAC3C,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,WAAW,MAAM;OAC5B,IAAI,MAAM,aAAa,CAAC,SAAS,WAEtC,MAAM,IAAI,MAAM,WAAW,MAAM;;CAIrC,OAAO,MAAM,KAAK,MAAM,QAAQ,CAAC;;AAGnC,SAAS,iCAAiC,KAAa,UAAsC;CAC3F,MAAM,UAAU,KAAK,KAAK,KAAK,GAAG,SAAS,UAAU;CACrD,OAAO,GAAG,WAAW,QAAQ,GAAG,UAAU,KAAA;;AAG5C,SAAS,qBAAqB,KAAa,UAA0B;CAanE,OAAO;EAXL,QAAQ;EACR,QAAQ;EACR,SAAS;EACT,gBAAgB;EAChB,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,SAAS;EACT,QAAQ;EACR,QAAQ;EAEA,CAAC,QAAQ"}
1
+ {"version":3,"file":"metadata-routes.js","names":[],"sources":["../../src/server/metadata-routes.ts"],"sourcesContent":["/**\n * File-based metadata route handling.\n *\n * Next.js supports special files in the app/ directory that auto-generate\n * metadata routes:\n * - sitemap.ts/.xml → /sitemap.xml (application/xml)\n * - robots.ts/.txt → /robots.txt (text/plain)\n * - manifest.ts/.json/.webmanifest → /manifest.webmanifest (application/manifest+json)\n * - icon.tsx/.png → /icon (image/*)\n * - opengraph-image.tsx/.png → /opengraph-image (image/*)\n * - twitter-image.tsx/.png → /twitter-image (image/*)\n * - apple-icon.tsx/.png → /apple-icon (image/*)\n * - favicon.ico → /favicon.ico (image/x-icon)\n *\n * Dynamic versions (ts/tsx/js) export a default function that returns the data.\n * Static versions (xml/txt/json/png/etc.) are served as-is.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { matchRoutePattern } from \"../routing/route-pattern.js\";\n\n// -------------------------------------------------------------------\n// Types matching Next.js MetadataRoute\n// -------------------------------------------------------------------\n\nexport type SitemapEntry = {\n url: string;\n lastModified?: string | Date;\n changeFrequency?: \"always\" | \"hourly\" | \"daily\" | \"weekly\" | \"monthly\" | \"yearly\" | \"never\";\n priority?: number;\n alternates?: {\n languages?: Record<string, string>;\n };\n images?: string[];\n videos?: Array<{\n title: string;\n thumbnail_loc: string;\n description: string;\n content_loc?: string;\n player_loc?: string;\n duration?: number;\n expiration_date?: string | Date;\n rating?: number;\n view_count?: number;\n publication_date?: string | Date;\n family_friendly?: \"yes\" | \"no\";\n restriction?: { relationship: \"allow\" | \"deny\"; content: string };\n platform?: { relationship: \"allow\" | \"deny\"; content: string };\n requires_subscription?: \"yes\" | \"no\";\n uploader?: {\n info?: string;\n content?: string;\n };\n live?: \"yes\" | \"no\";\n tag?: string;\n }>;\n};\n\nexport type RobotsRule = {\n userAgent?: string | string[];\n allow?: string | string[];\n disallow?: string | string[];\n crawlDelay?: number;\n other?: Record<string, string | number | Array<string | number>>;\n};\n\nexport type RobotsConfig = {\n rules: RobotsRule | RobotsRule[];\n sitemap?: string | string[];\n host?: string;\n};\n\nexport type ManifestConfig = {\n name?: string;\n short_name?: string;\n description?: string;\n start_url?: string;\n display?: \"fullscreen\" | \"standalone\" | \"minimal-ui\" | \"browser\";\n background_color?: string;\n theme_color?: string;\n icons?: Array<{\n src: string;\n sizes?: string;\n type?: string;\n purpose?: string;\n }>;\n [key: string]: unknown;\n};\n\n// -------------------------------------------------------------------\n// Known metadata file patterns\n// -------------------------------------------------------------------\n\n/** Map of metadata file base names to their URL path and content type. */\nexport const METADATA_FILE_MAP: Record<\n string,\n {\n /** URL path this file is served at */\n urlPath: string;\n /** Content type for the response */\n contentType: string;\n /** Whether this can be dynamic (.ts/.tsx/.js) */\n canBeDynamic: boolean;\n /** File extensions for static variants */\n staticExtensions: string[];\n /** File extensions for dynamic variants */\n dynamicExtensions: string[];\n /** Whether this can be nested in sub-segments */\n nestable: boolean;\n }\n> = {\n sitemap: {\n urlPath: \"/sitemap.xml\",\n contentType: \"application/xml\",\n canBeDynamic: true,\n staticExtensions: [\".xml\"],\n dynamicExtensions: [\".tsx\", \".ts\", \".jsx\", \".js\"],\n nestable: true,\n },\n robots: {\n urlPath: \"/robots.txt\",\n contentType: \"text/plain\",\n canBeDynamic: true,\n staticExtensions: [\".txt\"],\n dynamicExtensions: [\".tsx\", \".ts\", \".jsx\", \".js\"],\n nestable: false,\n },\n manifest: {\n urlPath: \"/manifest.webmanifest\",\n contentType: \"application/manifest+json\",\n canBeDynamic: true,\n staticExtensions: [\".json\", \".webmanifest\"],\n dynamicExtensions: [\".tsx\", \".ts\", \".jsx\", \".js\"],\n nestable: false,\n },\n favicon: {\n urlPath: \"/favicon.ico\",\n contentType: \"image/x-icon\",\n canBeDynamic: false,\n staticExtensions: [\".ico\"],\n dynamicExtensions: [],\n nestable: false,\n },\n icon: {\n urlPath: \"/icon\",\n contentType: \"image/png\",\n canBeDynamic: true,\n staticExtensions: [\".ico\", \".jpg\", \".jpeg\", \".png\", \".svg\"],\n dynamicExtensions: [\".tsx\", \".ts\", \".jsx\", \".js\"],\n nestable: true,\n },\n \"opengraph-image\": {\n urlPath: \"/opengraph-image\",\n contentType: \"image/png\",\n canBeDynamic: true,\n staticExtensions: [\".jpg\", \".jpeg\", \".png\", \".gif\"],\n dynamicExtensions: [\".tsx\", \".ts\", \".jsx\", \".js\"],\n nestable: true,\n },\n \"twitter-image\": {\n urlPath: \"/twitter-image\",\n contentType: \"image/png\",\n canBeDynamic: true,\n staticExtensions: [\".jpg\", \".jpeg\", \".png\", \".gif\"],\n dynamicExtensions: [\".tsx\", \".ts\", \".jsx\", \".js\"],\n nestable: true,\n },\n \"apple-icon\": {\n urlPath: \"/apple-icon\",\n contentType: \"image/png\",\n canBeDynamic: true,\n staticExtensions: [\".jpg\", \".jpeg\", \".png\"],\n dynamicExtensions: [\".tsx\", \".ts\", \".jsx\", \".js\"],\n nestable: true,\n },\n};\n\n// -------------------------------------------------------------------\n// Serializers\n// -------------------------------------------------------------------\n\n/** Escape the five XML special characters in text content and attribute values. */\nfunction escapeXml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n\n/**\n * Convert a sitemap array to XML string.\n */\nexport function sitemapToXml(entries: SitemapEntry[]): string {\n const hasAlternates = entries.some((entry) => Object.keys(entry.alternates ?? {}).length > 0);\n const hasImages = entries.some((entry) => Boolean(entry.images?.length));\n const hasVideos = entries.some((entry) => Boolean(entry.videos?.length));\n let content = \"\";\n\n content += '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n content += '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"';\n if (hasImages) {\n content += ' xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"';\n }\n if (hasVideos) {\n content += ' xmlns:video=\"http://www.google.com/schemas/sitemap-video/1.1\"';\n }\n if (hasAlternates) {\n content += ' xmlns:xhtml=\"http://www.w3.org/1999/xhtml\">\\n';\n } else {\n content += \">\\n\";\n }\n\n for (const entry of entries) {\n content += \"<url>\\n\";\n content += `<loc>${escapeXml(entry.url)}</loc>\\n`;\n\n const languages = entry.alternates?.languages;\n if (languages && Object.keys(languages).length) {\n for (const language in languages) {\n content += `<xhtml:link rel=\"alternate\" hreflang=\"${escapeXml(language)}\" href=\"${escapeXml(languages[language])}\" />\\n`;\n }\n }\n\n if (entry.images?.length) {\n for (const image of entry.images) {\n content += `<image:image>\\n<image:loc>${escapeXml(image)}</image:loc>\\n</image:image>\\n`;\n }\n }\n\n if (entry.videos?.length) {\n for (const video of entry.videos) {\n const videoFields = [\n \"<video:video>\",\n `<video:title>${escapeXml(String(video.title))}</video:title>`,\n `<video:thumbnail_loc>${escapeXml(String(video.thumbnail_loc))}</video:thumbnail_loc>`,\n `<video:description>${escapeXml(String(video.description))}</video:description>`,\n video.content_loc &&\n `<video:content_loc>${escapeXml(String(video.content_loc))}</video:content_loc>`,\n video.player_loc &&\n `<video:player_loc>${escapeXml(String(video.player_loc))}</video:player_loc>`,\n video.duration && `<video:duration>${video.duration}</video:duration>`,\n video.view_count && `<video:view_count>${video.view_count}</video:view_count>`,\n video.tag && `<video:tag>${escapeXml(String(video.tag))}</video:tag>`,\n video.rating && `<video:rating>${video.rating}</video:rating>`,\n video.expiration_date &&\n `<video:expiration_date>${escapeXml(String(video.expiration_date))}</video:expiration_date>`,\n video.publication_date &&\n `<video:publication_date>${escapeXml(String(video.publication_date))}</video:publication_date>`,\n video.family_friendly &&\n `<video:family_friendly>${video.family_friendly}</video:family_friendly>`,\n video.requires_subscription &&\n `<video:requires_subscription>${video.requires_subscription}</video:requires_subscription>`,\n video.live && `<video:live>${video.live}</video:live>`,\n video.restriction &&\n `<video:restriction relationship=\"${escapeXml(String(video.restriction.relationship))}\">${escapeXml(String(video.restriction.content))}</video:restriction>`,\n video.platform &&\n `<video:platform relationship=\"${escapeXml(String(video.platform.relationship))}\">${escapeXml(String(video.platform.content))}</video:platform>`,\n video.uploader &&\n `<video:uploader${video.uploader.info ? ` info=\"${escapeXml(String(video.uploader.info))}\"` : \"\"}>${escapeXml(String(video.uploader.content))}</video:uploader>`,\n \"</video:video>\\n\",\n ].filter(Boolean);\n content += videoFields.join(\"\\n\");\n }\n }\n\n if (entry.lastModified) {\n content += `<lastmod>${serializeDate(entry.lastModified)}</lastmod>\\n`;\n }\n if (entry.changeFrequency) {\n content += `<changefreq>${entry.changeFrequency}</changefreq>\\n`;\n }\n if (typeof entry.priority === \"number\") {\n content += `<priority>${entry.priority}</priority>\\n`;\n }\n content += \"</url>\\n\";\n }\n\n content += \"</urlset>\\n\";\n return content;\n}\n\n/**\n * Convert a robots config to text format.\n */\nexport function robotsToText(config: RobotsConfig): string {\n const lines: string[] = [];\n const rules = Array.isArray(config.rules) ? config.rules : [config.rules];\n\n for (const rule of rules) {\n const agents = Array.isArray(rule.userAgent) ? rule.userAgent : [rule.userAgent ?? \"*\"];\n\n for (const agent of agents) {\n lines.push(`User-Agent: ${agent}`);\n }\n\n if (rule.allow) {\n const allows = Array.isArray(rule.allow) ? rule.allow : [rule.allow];\n for (const allow of allows) {\n lines.push(`Allow: ${allow}`);\n }\n }\n\n if (rule.disallow) {\n const disallows = Array.isArray(rule.disallow) ? rule.disallow : [rule.disallow];\n for (const disallow of disallows) {\n lines.push(`Disallow: ${disallow}`);\n }\n }\n\n if (rule.crawlDelay !== undefined) {\n lines.push(`Crawl-delay: ${rule.crawlDelay}`);\n }\n\n if (rule.other) {\n for (const key of Object.keys(rule.other)) {\n const value = rule.other[key];\n if (value == null) continue;\n const values = Array.isArray(value) ? value : [value];\n for (const v of values) {\n lines.push(`${key}: ${v}`);\n }\n }\n }\n\n lines.push(\"\");\n }\n\n if (config.host) {\n lines.push(`Host: ${config.host}`);\n }\n\n if (config.sitemap) {\n const sitemaps = Array.isArray(config.sitemap) ? config.sitemap : [config.sitemap];\n for (const sitemap of sitemaps) {\n lines.push(`Sitemap: ${sitemap}`);\n }\n }\n\n return lines.join(\"\\n\").trim() + \"\\n\";\n}\n\n/**\n * Convert a manifest config to JSON string.\n */\nexport function manifestToJson(config: ManifestConfig): string {\n return JSON.stringify(config, null, 2);\n}\n\nfunction serializeDate(value: string | Date): string {\n return value instanceof Date ? value.toISOString() : value;\n}\n\n// -------------------------------------------------------------------\n// Static metadata URL resolution\n//\n// Ported from Next.js: packages/next/src/lib/metadata/get-metadata-route.ts\n// https://github.com/vercel/next.js/blob/7873aea/packages/next/src/lib/metadata/get-metadata-route.ts\n//\n// Static metadata files (like favicon.ico, icon.png) under dynamic parents\n// get a fixed URL with \"-\" placeholders instead of literal \"[param]\" segments.\n// Route groups and parallel route parents trigger a unique hash suffix to\n// avoid collisions.\n// -------------------------------------------------------------------\n\n/**\n * Regular expression pattern used to match route parameters.\n * Matches both single parameters and parameter groups.\n * Examples:\n * - `[[...slug]]` matches parameter group with key 'slug', repeat: true, optional: true\n * - `[...slug]` matches parameter group with key 'slug', repeat: true, optional: false\n * - `[[foo]]` matches parameter with key 'foo', repeat: false, optional: true\n * - `[bar]` matches parameter with key 'bar', repeat: false, optional: false\n */\nconst PARAMETER_PATTERN = /^([^[]*)\\[((?:\\[[^\\]]*\\])|[^\\]]+)\\](.*)$/;\n\nfunction isGroupSegment(segment: string): boolean {\n return segment.startsWith(\"(\") && segment.endsWith(\")\");\n}\n\nfunction isParallelRouteSegment(segment: string): boolean {\n return segment.startsWith(\"@\") && segment !== \"@children\";\n}\n\nfunction normalizeStaticMetadataRouteSegment(segment: string): string {\n let normalizedSegment = segment;\n let match = normalizedSegment.match(PARAMETER_PATTERN);\n while (match) {\n normalizedSegment = `${match[1]}-${match[3]}`;\n match = normalizedSegment.match(PARAMETER_PATTERN);\n }\n return normalizedSegment;\n}\n\nfunction getStaticMetadataRoute(appDirPath: string): string {\n const segments = appDirPath.split(\"/\").filter(Boolean);\n const normalizedSegments: string[] = [];\n for (const seg of segments) {\n // Strip route groups and all parallel route slots (including @children)\n // from the URL path. The @children slot is the default parallel route\n // and must also be invisible in the URL, matching Next.js behavior.\n if (isGroupSegment(seg) || seg.startsWith(\"@\")) continue;\n normalizedSegments.push(normalizeStaticMetadataRouteSegment(seg));\n }\n return normalizedSegments.length > 0 ? `/${normalizedSegments.join(\"/\")}` : \"\";\n}\n\nfunction hashMetadataRouteParentPath(parentPathname: string): string {\n let hash = 5381;\n for (let i = 0; i < parentPathname.length; i++) {\n hash = ((hash << 5) + hash + parentPathname.charCodeAt(i)) & 0xffffffff;\n }\n return (hash >>> 0).toString(36).slice(0, 6);\n}\n\nfunction getMetadataRouteSuffix(page: string): string {\n const lastSlash = page.lastIndexOf(\"/\");\n const parentPathname = lastSlash > 0 ? page.slice(0, lastSlash) : \"\";\n if (page.endsWith(\"/sitemap\") || page.endsWith(\"/sitemap.xml\")) return \"\";\n const segments = parentPathname.split(\"/\");\n const hasInvisibleParent = segments.some(\n (seg) => isGroupSegment(seg) || isParallelRouteSegment(seg),\n );\n if (!hasInvisibleParent) return \"\";\n return hashMetadataRouteParentPath(parentPathname);\n}\n\nfunction computeMetadataRouteSuffix(\n appDirPath: string,\n leafName: string,\n): { route: string; suffix: string } {\n const route = getStaticMetadataRoute(appDirPath);\n const pagePath =\n appDirPath === \"\" || appDirPath === \"/\" ? `/${leafName}` : `${appDirPath}/${leafName}`;\n const suffix = getMetadataRouteSuffix(pagePath);\n return { route, suffix };\n}\n\nfunction getMetadataRouteFilename(appDirPath: string, lastSegment: string): string {\n const ext = path.posix.extname(lastSegment);\n const name = lastSegment.slice(0, -ext.length || undefined);\n const { suffix } = computeMetadataRouteSuffix(appDirPath, name);\n const routeSuffix = suffix ? `-${suffix}` : \"\";\n return `${name}${routeSuffix}${ext}`;\n}\n\n/**\n * Compute the static URL for a metadata file given its app directory\n * parent path and filename.\n *\n * Example:\n * fillStaticMetadataSegment(\"/\", \"favicon.ico\") -> \"/favicon.ico\"\n * fillStaticMetadataSegment(\"/blog/[slug]\", \"favicon.ico\") -> \"/blog/-/favicon.ico\"\n * fillStaticMetadataSegment(\"/(group)/group\", \"icon.png\") -> \"/group/icon-131tc6.png\"\n */\nexport function fillStaticMetadataSegment(appDirPath: string, lastSegment: string): string {\n const route = getStaticMetadataRoute(appDirPath);\n const filename = getMetadataRouteFilename(appDirPath, lastSegment);\n return route === \"\" ? `/${filename}` : `${route}/${filename}`;\n}\n\n// -------------------------------------------------------------------\n// Metadata route discovery\n// -------------------------------------------------------------------\n\nexport type MetadataFileRoute = {\n /** Type of metadata file */\n type: string;\n /** Whether this is a dynamic (code-generated) route */\n isDynamic: boolean;\n /** Imported dynamic module for code-generated metadata routes. */\n module?: Record<string, unknown>;\n /** Absolute file path */\n filePath: string;\n /** Route prefix where this metadata applies, preserving dynamic segment names. */\n routePrefix: string;\n /** Raw app tree segments where this metadata file is colocated. */\n routeSegments?: string[];\n /** Pattern parts for matching dynamic metadata routes at request time. */\n patternParts?: string[];\n /** URL path this file is served at */\n servedUrl: string;\n /** Content type for the response */\n contentType: string;\n /** Optional metadata used to inject file-based routes into <head>. */\n headData?: MetadataRouteHeadData;\n /** Optional content hash for cache-busting metadata links. */\n contentHash?: string;\n /** Sibling .alt.txt file for static social image metadata routes. */\n altFilePath?: string;\n};\n\nexport type MetadataRouteHeadData =\n | {\n kind: \"favicon\" | \"icon\" | \"apple\";\n href: string;\n type?: string;\n sizes?: string;\n }\n | {\n kind: \"openGraph\" | \"twitter\";\n href: string;\n type?: string;\n width?: number;\n height?: number;\n alt?: string;\n }\n | {\n kind: \"manifest\";\n href: string;\n };\n\nexport function getMetadataRouteKind(\n route: Pick<MetadataFileRoute, \"type\">,\n): MetadataRouteHeadData[\"kind\"] | null {\n if (route.type === \"favicon\") return \"favicon\";\n if (route.type === \"icon\") return \"icon\";\n if (route.type === \"apple-icon\") return \"apple\";\n if (route.type === \"opengraph-image\") return \"openGraph\";\n if (route.type === \"twitter-image\") return \"twitter\";\n if (route.type === \"manifest\") return \"manifest\";\n return null;\n}\n\nexport function getMetadataImageRouteKind(\n route: Pick<MetadataFileRoute, \"type\">,\n): Extract<MetadataRouteHeadData[\"kind\"], \"icon\" | \"apple\" | \"openGraph\" | \"twitter\"> | null {\n const kind = getMetadataRouteKind(route);\n if (kind === \"icon\" || kind === \"apple\" || kind === \"openGraph\" || kind === \"twitter\") {\n return kind;\n }\n return null;\n}\n\nconst metadataImageIdPattern = /^[a-zA-Z0-9-_.]+$/;\n\nexport function isValidMetadataImageId(id: string): boolean {\n return metadataImageIdPattern.test(id);\n}\n\nexport function matchMetadataRoutePattern(\n urlParts: string[],\n patternParts: string[],\n): Record<string, string | string[]> | null {\n return matchRoutePattern(urlParts, patternParts);\n}\n\nfunction metadataRouteSuffix(parentSegments: string[], metaType: string): string {\n if (metaType === \"sitemap\") {\n // Sitemap is exempt per Next.js (robots/manifest are root-only, so\n // invisible parents never apply — but we keep the exemption list\n // matching getMetadataRouteSuffix for defensive consistency).\n return \"\";\n }\n\n const hasInvisibleParent = parentSegments.some(\n (segment) =>\n (segment.startsWith(\"(\") && segment.endsWith(\")\")) ||\n (segment.startsWith(\"@\") && segment !== \"@children\"),\n );\n if (!hasInvisibleParent) return \"\";\n\n return hashMetadataRouteParentPath(`/${parentSegments.join(\"/\")}`);\n}\n\nfunction withMetadataSuffix(urlPath: string, suffix: string): string {\n if (!suffix) return urlPath;\n const parsed = path.posix.parse(urlPath);\n return path.posix.join(parsed.dir || \"/\", `${parsed.name}-${suffix}${parsed.ext}`);\n}\n\nfunction getMetadataServedUrl(\n metaType: string,\n config: { urlPath: string },\n ext: string,\n isDynamic: boolean,\n suffix: string,\n routeBaseName: string,\n): string {\n if (\n isDynamic &&\n (metaType === \"icon\" ||\n metaType === \"apple-icon\" ||\n metaType === \"opengraph-image\" ||\n metaType === \"twitter-image\")\n ) {\n return withMetadataSuffix(`/${routeBaseName}`, suffix);\n }\n\n if (isDynamic) {\n return withMetadataSuffix(config.urlPath, suffix);\n }\n\n if (metaType === \"manifest\") {\n return withMetadataSuffix(`/${routeBaseName}${ext}`, suffix);\n }\n\n if (\n metaType === \"icon\" ||\n metaType === \"apple-icon\" ||\n metaType === \"opengraph-image\" ||\n metaType === \"twitter-image\"\n ) {\n return withMetadataSuffix(`/${routeBaseName}${ext}`, suffix);\n }\n\n return withMetadataSuffix(config.urlPath, suffix);\n}\n\nexport function matchMetadataFileBaseName(metaType: string, baseName: string): string | null {\n if (baseName === metaType) {\n return baseName;\n }\n\n if (\n metaType === \"icon\" ||\n metaType === \"apple-icon\" ||\n metaType === \"opengraph-image\" ||\n metaType === \"twitter-image\"\n ) {\n const suffix = baseName.slice(metaType.length);\n if (/^\\d$/.test(suffix)) {\n return baseName;\n }\n }\n\n return null;\n}\n\n/**\n * Scan an app directory for metadata files.\n */\nexport function scanMetadataFiles(appDir: string): MetadataFileRoute[] {\n const routes: MetadataFileRoute[] = [];\n\n // Scan the app directory recursively\n function scan(dir: string, urlPrefix: string, parentSegments: string[]): void {\n if (!fs.existsSync(dir)) return;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const dirName = entry.name;\n if (dirName.startsWith(\"_\")) continue;\n\n const isRouteGroup = dirName.startsWith(\"(\") && dirName.endsWith(\")\");\n const isParallelRoute = dirName.startsWith(\"@\");\n const nextUrlPrefix =\n isRouteGroup || isParallelRoute ? urlPrefix : `${urlPrefix}/${dirName}`;\n scan(path.join(dir, dirName), nextUrlPrefix, [...parentSegments, dirName]);\n continue;\n }\n\n // Check each metadata file pattern\n const fileName = entry.name;\n const baseName = fileName.replace(/\\.[^.]+$/, \"\");\n const ext = fileName.slice(baseName.length);\n\n for (const [metaType, config] of Object.entries(METADATA_FILE_MAP)) {\n const routeBaseName = matchMetadataFileBaseName(metaType, baseName);\n if (!routeBaseName) continue;\n\n // Check nestability — non-nestable types only at root\n if (!config.nestable && urlPrefix !== \"\") continue;\n\n // Check if this is a static or dynamic variant\n const isStatic = config.staticExtensions.includes(ext);\n const isDynamic = config.dynamicExtensions.includes(ext);\n\n if (!isStatic && !isDynamic) continue;\n const appDirPath = parentSegments.length > 0 ? `/${parentSegments.join(\"/\")}` : \"\";\n const suffix = metadataRouteSuffix(parentSegments, metaType);\n const urlPath = getMetadataServedUrl(\n metaType,\n config,\n ext,\n isDynamic,\n suffix,\n routeBaseName,\n );\n const servedUrl = isStatic\n ? fillStaticMetadataSegment(appDirPath, `${routeBaseName}${ext}`)\n : urlPrefix === \"\"\n ? urlPath\n : `${urlPrefix}${urlPath}`;\n const altFilePath =\n isStatic && (metaType === \"opengraph-image\" || metaType === \"twitter-image\")\n ? resolveStaticMetadataAltFilePath(dir, baseName)\n : undefined;\n\n routes.push({\n type: metaType,\n isDynamic,\n filePath: path.join(dir, fileName),\n routePrefix: urlPrefix,\n routeSegments: parentSegments,\n servedUrl,\n contentType:\n isStatic && metaType === \"manifest\"\n ? config.contentType\n : isStatic\n ? getStaticContentType(ext, config.contentType)\n : config.contentType,\n altFilePath,\n });\n }\n }\n }\n\n scan(appDir, \"\", []);\n\n // Deduplicate: if both dynamic and static variants exist at the same URL,\n // keep only the dynamic one (matches Next.js behavior).\n const byUrl = new Map<string, MetadataFileRoute>();\n for (const route of routes) {\n const existing = byUrl.get(route.servedUrl);\n if (!existing) {\n byUrl.set(route.servedUrl, route);\n } else if (route.isDynamic && !existing.isDynamic) {\n // Dynamic takes priority over static\n byUrl.set(route.servedUrl, route);\n }\n // If both are static or both dynamic, keep the first one found\n }\n return Array.from(byUrl.values());\n}\n\nfunction resolveStaticMetadataAltFilePath(dir: string, baseName: string): string | undefined {\n const altPath = path.join(dir, `${baseName}.alt.txt`);\n return fs.existsSync(altPath) ? altPath : undefined;\n}\n\nfunction getStaticContentType(ext: string, fallback: string): string {\n const map: Record<string, string> = {\n \".xml\": \"application/xml\",\n \".txt\": \"text/plain\",\n \".json\": \"application/json\",\n \".webmanifest\": \"application/manifest+json\",\n \".ico\": \"image/x-icon\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n };\n return map[ext] ?? fallback;\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { normalizePathnameForRouteMatchStrict } from "../routing/utils.js";
2
+ import "./server-globals.js";
2
3
  import { getRequestExecutionContext, runWithExecutionContext } from "../shims/request-context.js";
3
4
  import { MIDDLEWARE_REWRITE_HEADER } from "./headers.js";
4
5
  import { shouldKeepMiddlewareHeader } from "./middleware-request-headers.js";
@@ -1 +1 @@
1
- {"version":3,"file":"middleware-runtime.js","names":[],"sources":["../../src/server/middleware-runtime.ts"],"sourcesContent":["import type { NextI18nConfig } from \"../config/next-config.js\";\nimport { normalizePathnameForRouteMatchStrict } from \"../routing/utils.js\";\nimport {\n getRequestExecutionContext,\n runWithExecutionContext,\n type ExecutionContextLike,\n} from \"vinext/shims/request-context\";\nimport { NextFetchEvent, NextRequest } from \"vinext/shims/server\";\nimport { normalizePath } from \"./normalize-path.js\";\nimport {\n MIDDLEWARE_HEADER_PREFIX,\n MIDDLEWARE_NEXT_HEADER,\n MIDDLEWARE_REWRITE_HEADER,\n} from \"./headers.js\";\nimport { MatcherConfig, matchesMiddleware } from \"./middleware-matcher.js\";\nimport { shouldKeepMiddlewareHeader } from \"./middleware-request-headers.js\";\nimport { processMiddlewareHeaders } from \"./request-pipeline.js\";\nimport { badRequestResponse, internalServerErrorResponse } from \"./http-error-responses.js\";\n\nexport type MiddlewareModule = Record<string, unknown>;\n\nexport type MiddlewareResult = {\n continue: boolean;\n redirectUrl?: string;\n redirectStatus?: number;\n rewriteUrl?: string;\n rewriteStatus?: number;\n status?: number;\n responseHeaders?: Headers;\n response?: Response;\n waitUntilPromises?: Promise<unknown>[];\n};\n\ntype MiddlewareHandler = (\n request: NextRequest,\n event: NextFetchEvent,\n) => Response | undefined | void | Promise<Response | undefined | void>;\n\ntype MiddlewareConfigExport = {\n matcher?: MatcherConfig;\n};\n\ntype ExecuteMiddlewareOptions = {\n basePath?: string;\n filePath?: string;\n i18nConfig?: NextI18nConfig | null;\n includeErrorDetails?: boolean;\n isProxy: boolean;\n module: MiddlewareModule;\n normalizedPathname?: string;\n request: Request;\n};\n\ntype RunGeneratedMiddlewareOptions = ExecuteMiddlewareOptions & {\n ctx?: ExecutionContextLike;\n};\n\nfunction isMiddlewareHandler(value: unknown): value is MiddlewareHandler {\n return typeof value === \"function\";\n}\n\nfunction isMiddlewareConfigExport(value: unknown): value is MiddlewareConfigExport {\n return !!value && typeof value === \"object\";\n}\n\nfunction middlewareFileLabel(isProxy: boolean): string {\n return isProxy ? \"Proxy\" : \"Middleware\";\n}\n\nfunction middlewareExpectedExport(isProxy: boolean): string {\n return isProxy ? \"proxy\" : \"middleware\";\n}\n\nexport function resolveMiddlewareModuleHandler(\n mod: MiddlewareModule,\n options: { filePath?: string; isProxy: boolean },\n): MiddlewareHandler {\n const handler = options.isProxy ? (mod.proxy ?? mod.default) : (mod.middleware ?? mod.default);\n if (isMiddlewareHandler(handler)) return handler;\n\n const fileLabel = middlewareFileLabel(options.isProxy);\n const expectedExport = middlewareExpectedExport(options.isProxy);\n const fileSuffix = options.filePath ? ` \"${options.filePath}\"` : \"\";\n throw new Error(\n `The ${fileLabel} file${fileSuffix} must export a function named \\`${expectedExport}\\` or a \\`default\\` function.`,\n );\n}\n\nfunction middlewareMatcher(mod: MiddlewareModule): MatcherConfig | undefined {\n const config = mod.config;\n if (!isMiddlewareConfigExport(config)) return undefined;\n return config.matcher;\n}\n\nfunction stripMiddlewareHeadersFromResponse(response: Response): Response {\n const headers = new Headers(response.headers);\n processMiddlewareHeaders(headers);\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nfunction collectMiddlewareHeaders(response: Response): Headers {\n const responseHeaders = new Headers();\n for (const [key, value] of response.headers) {\n if (!key.startsWith(MIDDLEWARE_HEADER_PREFIX) || shouldKeepMiddlewareHeader(key)) {\n responseHeaders.append(key, value);\n }\n }\n return responseHeaders;\n}\n\nfunction drainFetchEvent(fetchEvent: NextFetchEvent): Promise<unknown>[] {\n const waitUntilPromises = fetchEvent.waitUntilPromises;\n const drained = fetchEvent.drainWaitUntil();\n const executionContext = getRequestExecutionContext();\n if (executionContext) {\n executionContext.waitUntil(drained);\n } else {\n void drained;\n }\n return waitUntilPromises;\n}\n\nfunction resolveMiddlewarePathname(request: Request): string | Response {\n const url = new URL(request.url);\n try {\n return normalizePath(normalizePathnameForRouteMatchStrict(url.pathname));\n } catch {\n return badRequestResponse();\n }\n}\n\nfunction createNextRequest(\n request: Request,\n normalizedPathname: string,\n i18nConfig?: NextI18nConfig | null,\n basePath?: string,\n): NextRequest {\n const url = new URL(request.url);\n // Middleware gets an isolated body branch; downstream routing keeps owning\n // the original request body.\n let mwRequest = request.body && !request.bodyUsed ? request.clone() : request;\n if (normalizedPathname !== url.pathname) {\n const mwUrl = new URL(url);\n mwUrl.pathname = normalizedPathname;\n mwRequest = new Request(mwUrl, mwRequest);\n }\n\n const nextConfig =\n basePath || i18nConfig\n ? { basePath: basePath ?? \"\", i18n: i18nConfig ?? undefined }\n : undefined;\n\n return mwRequest instanceof NextRequest\n ? mwRequest\n : new NextRequest(mwRequest, nextConfig ? { nextConfig } : undefined);\n}\n\nexport async function executeMiddleware(\n options: ExecuteMiddlewareOptions,\n): Promise<MiddlewareResult> {\n const middlewareFn = resolveMiddlewareModuleHandler(options.module, {\n filePath: options.filePath,\n isProxy: options.isProxy,\n });\n const normalizedPathname =\n options.normalizedPathname ?? resolveMiddlewarePathname(options.request);\n if (normalizedPathname instanceof Response) {\n return { continue: false, response: normalizedPathname };\n }\n\n if (\n !matchesMiddleware(\n normalizedPathname,\n middlewareMatcher(options.module),\n options.request,\n options.i18nConfig,\n )\n ) {\n return { continue: true };\n }\n\n const nextRequest = createNextRequest(\n options.request,\n normalizedPathname,\n options.i18nConfig,\n options.basePath,\n );\n const fetchEvent = new NextFetchEvent({ page: normalizedPathname });\n\n let response: Response | undefined | void;\n try {\n response = await middlewareFn(nextRequest, fetchEvent);\n } catch (e) {\n console.error(\"[vinext] Middleware error:\", e);\n const waitUntilPromises = drainFetchEvent(fetchEvent);\n const message = options.includeErrorDetails\n ? \"Middleware Error: \" + (e instanceof Error ? e.message : String(e))\n : \"Internal Server Error\";\n return {\n continue: false,\n response: internalServerErrorResponse(message),\n waitUntilPromises,\n };\n }\n\n const waitUntilPromises = drainFetchEvent(fetchEvent);\n\n if (!response) {\n return { continue: true, waitUntilPromises };\n }\n\n if (response.headers.get(MIDDLEWARE_NEXT_HEADER) === \"1\") {\n return {\n continue: true,\n responseHeaders: collectMiddlewareHeaders(response),\n status: response.status !== 200 ? response.status : undefined,\n waitUntilPromises,\n };\n }\n\n if (response.status >= 300 && response.status < 400) {\n const location = response.headers.get(\"Location\") ?? response.headers.get(\"location\");\n if (location) {\n const responseHeaders = new Headers();\n for (const [key, value] of response.headers) {\n if (!key.startsWith(MIDDLEWARE_HEADER_PREFIX) && key.toLowerCase() !== \"location\") {\n responseHeaders.append(key, value);\n }\n }\n return {\n continue: false,\n redirectUrl: location,\n redirectStatus: response.status,\n response: stripMiddlewareHeadersFromResponse(response),\n responseHeaders,\n waitUntilPromises,\n };\n }\n }\n\n const rewriteUrl = response.headers.get(MIDDLEWARE_REWRITE_HEADER);\n if (rewriteUrl) {\n let rewritePath: string;\n try {\n const rewriteParsed = new URL(rewriteUrl, options.request.url);\n const requestOrigin = new URL(options.request.url).origin;\n rewritePath =\n rewriteParsed.origin === requestOrigin\n ? rewriteParsed.pathname + rewriteParsed.search\n : rewriteParsed.href;\n } catch {\n rewritePath = rewriteUrl;\n }\n return {\n continue: true,\n rewriteUrl: rewritePath,\n rewriteStatus: response.status !== 200 ? response.status : undefined,\n responseHeaders: collectMiddlewareHeaders(response),\n status: response.status !== 200 ? response.status : undefined,\n waitUntilPromises,\n };\n }\n\n return {\n continue: false,\n response: stripMiddlewareHeadersFromResponse(response),\n waitUntilPromises,\n };\n}\n\nexport async function runGeneratedMiddleware(\n options: RunGeneratedMiddlewareOptions,\n): Promise<MiddlewareResult> {\n const run = () => executeMiddleware(options);\n return options.ctx ? runWithExecutionContext(options.ctx, run) : run();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"middleware-runtime.js","names":[],"sources":["../../src/server/middleware-runtime.ts"],"sourcesContent":["import \"./server-globals.js\";\nimport type { NextI18nConfig } from \"../config/next-config.js\";\nimport { normalizePathnameForRouteMatchStrict } from \"../routing/utils.js\";\nimport {\n getRequestExecutionContext,\n runWithExecutionContext,\n type ExecutionContextLike,\n} from \"vinext/shims/request-context\";\nimport { NextFetchEvent, NextRequest } from \"vinext/shims/server\";\nimport { normalizePath } from \"./normalize-path.js\";\nimport {\n MIDDLEWARE_HEADER_PREFIX,\n MIDDLEWARE_NEXT_HEADER,\n MIDDLEWARE_REWRITE_HEADER,\n} from \"./headers.js\";\nimport { MatcherConfig, matchesMiddleware } from \"./middleware-matcher.js\";\nimport { shouldKeepMiddlewareHeader } from \"./middleware-request-headers.js\";\nimport { processMiddlewareHeaders } from \"./request-pipeline.js\";\nimport { badRequestResponse, internalServerErrorResponse } from \"./http-error-responses.js\";\n\nexport type MiddlewareModule = Record<string, unknown>;\n\nexport type MiddlewareResult = {\n continue: boolean;\n redirectUrl?: string;\n redirectStatus?: number;\n rewriteUrl?: string;\n rewriteStatus?: number;\n status?: number;\n responseHeaders?: Headers;\n response?: Response;\n waitUntilPromises?: Promise<unknown>[];\n};\n\ntype MiddlewareHandler = (\n request: NextRequest,\n event: NextFetchEvent,\n) => Response | undefined | void | Promise<Response | undefined | void>;\n\ntype MiddlewareConfigExport = {\n matcher?: MatcherConfig;\n};\n\ntype ExecuteMiddlewareOptions = {\n basePath?: string;\n filePath?: string;\n i18nConfig?: NextI18nConfig | null;\n includeErrorDetails?: boolean;\n isProxy: boolean;\n module: MiddlewareModule;\n normalizedPathname?: string;\n request: Request;\n};\n\ntype RunGeneratedMiddlewareOptions = ExecuteMiddlewareOptions & {\n ctx?: ExecutionContextLike;\n};\n\nfunction isMiddlewareHandler(value: unknown): value is MiddlewareHandler {\n return typeof value === \"function\";\n}\n\nfunction isMiddlewareConfigExport(value: unknown): value is MiddlewareConfigExport {\n return !!value && typeof value === \"object\";\n}\n\nfunction middlewareFileLabel(isProxy: boolean): string {\n return isProxy ? \"Proxy\" : \"Middleware\";\n}\n\nfunction middlewareExpectedExport(isProxy: boolean): string {\n return isProxy ? \"proxy\" : \"middleware\";\n}\n\nexport function resolveMiddlewareModuleHandler(\n mod: MiddlewareModule,\n options: { filePath?: string; isProxy: boolean },\n): MiddlewareHandler {\n const handler = options.isProxy ? (mod.proxy ?? mod.default) : (mod.middleware ?? mod.default);\n if (isMiddlewareHandler(handler)) return handler;\n\n const fileLabel = middlewareFileLabel(options.isProxy);\n const expectedExport = middlewareExpectedExport(options.isProxy);\n const fileSuffix = options.filePath ? ` \"${options.filePath}\"` : \"\";\n throw new Error(\n `The ${fileLabel} file${fileSuffix} must export a function named \\`${expectedExport}\\` or a \\`default\\` function.`,\n );\n}\n\nfunction middlewareMatcher(mod: MiddlewareModule): MatcherConfig | undefined {\n const config = mod.config;\n if (!isMiddlewareConfigExport(config)) return undefined;\n return config.matcher;\n}\n\nfunction stripMiddlewareHeadersFromResponse(response: Response): Response {\n const headers = new Headers(response.headers);\n processMiddlewareHeaders(headers);\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nfunction collectMiddlewareHeaders(response: Response): Headers {\n const responseHeaders = new Headers();\n for (const [key, value] of response.headers) {\n if (!key.startsWith(MIDDLEWARE_HEADER_PREFIX) || shouldKeepMiddlewareHeader(key)) {\n responseHeaders.append(key, value);\n }\n }\n return responseHeaders;\n}\n\nfunction drainFetchEvent(fetchEvent: NextFetchEvent): Promise<unknown>[] {\n const waitUntilPromises = fetchEvent.waitUntilPromises;\n const drained = fetchEvent.drainWaitUntil();\n const executionContext = getRequestExecutionContext();\n if (executionContext) {\n executionContext.waitUntil(drained);\n } else {\n void drained;\n }\n return waitUntilPromises;\n}\n\nfunction resolveMiddlewarePathname(request: Request): string | Response {\n const url = new URL(request.url);\n try {\n return normalizePath(normalizePathnameForRouteMatchStrict(url.pathname));\n } catch {\n return badRequestResponse();\n }\n}\n\nfunction createNextRequest(\n request: Request,\n normalizedPathname: string,\n i18nConfig?: NextI18nConfig | null,\n basePath?: string,\n): NextRequest {\n const url = new URL(request.url);\n // Middleware gets an isolated body branch; downstream routing keeps owning\n // the original request body.\n let mwRequest = request.body && !request.bodyUsed ? request.clone() : request;\n if (normalizedPathname !== url.pathname) {\n const mwUrl = new URL(url);\n mwUrl.pathname = normalizedPathname;\n mwRequest = new Request(mwUrl, mwRequest);\n }\n\n const nextConfig =\n basePath || i18nConfig\n ? { basePath: basePath ?? \"\", i18n: i18nConfig ?? undefined }\n : undefined;\n\n return mwRequest instanceof NextRequest\n ? mwRequest\n : new NextRequest(mwRequest, nextConfig ? { nextConfig } : undefined);\n}\n\nexport async function executeMiddleware(\n options: ExecuteMiddlewareOptions,\n): Promise<MiddlewareResult> {\n const middlewareFn = resolveMiddlewareModuleHandler(options.module, {\n filePath: options.filePath,\n isProxy: options.isProxy,\n });\n const normalizedPathname =\n options.normalizedPathname ?? resolveMiddlewarePathname(options.request);\n if (normalizedPathname instanceof Response) {\n return { continue: false, response: normalizedPathname };\n }\n\n if (\n !matchesMiddleware(\n normalizedPathname,\n middlewareMatcher(options.module),\n options.request,\n options.i18nConfig,\n )\n ) {\n return { continue: true };\n }\n\n const nextRequest = createNextRequest(\n options.request,\n normalizedPathname,\n options.i18nConfig,\n options.basePath,\n );\n const fetchEvent = new NextFetchEvent({ page: normalizedPathname });\n\n let response: Response | undefined | void;\n try {\n response = await middlewareFn(nextRequest, fetchEvent);\n } catch (e) {\n console.error(\"[vinext] Middleware error:\", e);\n const waitUntilPromises = drainFetchEvent(fetchEvent);\n const message = options.includeErrorDetails\n ? \"Middleware Error: \" + (e instanceof Error ? e.message : String(e))\n : \"Internal Server Error\";\n return {\n continue: false,\n response: internalServerErrorResponse(message),\n waitUntilPromises,\n };\n }\n\n const waitUntilPromises = drainFetchEvent(fetchEvent);\n\n if (!response) {\n return { continue: true, waitUntilPromises };\n }\n\n if (response.headers.get(MIDDLEWARE_NEXT_HEADER) === \"1\") {\n return {\n continue: true,\n responseHeaders: collectMiddlewareHeaders(response),\n status: response.status !== 200 ? response.status : undefined,\n waitUntilPromises,\n };\n }\n\n if (response.status >= 300 && response.status < 400) {\n const location = response.headers.get(\"Location\") ?? response.headers.get(\"location\");\n if (location) {\n const responseHeaders = new Headers();\n for (const [key, value] of response.headers) {\n if (!key.startsWith(MIDDLEWARE_HEADER_PREFIX) && key.toLowerCase() !== \"location\") {\n responseHeaders.append(key, value);\n }\n }\n return {\n continue: false,\n redirectUrl: location,\n redirectStatus: response.status,\n response: stripMiddlewareHeadersFromResponse(response),\n responseHeaders,\n waitUntilPromises,\n };\n }\n }\n\n const rewriteUrl = response.headers.get(MIDDLEWARE_REWRITE_HEADER);\n if (rewriteUrl) {\n let rewritePath: string;\n try {\n const rewriteParsed = new URL(rewriteUrl, options.request.url);\n const requestOrigin = new URL(options.request.url).origin;\n rewritePath =\n rewriteParsed.origin === requestOrigin\n ? rewriteParsed.pathname + rewriteParsed.search\n : rewriteParsed.href;\n } catch {\n rewritePath = rewriteUrl;\n }\n return {\n continue: true,\n rewriteUrl: rewritePath,\n rewriteStatus: response.status !== 200 ? response.status : undefined,\n responseHeaders: collectMiddlewareHeaders(response),\n status: response.status !== 200 ? response.status : undefined,\n waitUntilPromises,\n };\n }\n\n return {\n continue: false,\n response: stripMiddlewareHeadersFromResponse(response),\n waitUntilPromises,\n };\n}\n\nexport async function runGeneratedMiddleware(\n options: RunGeneratedMiddlewareOptions,\n): Promise<MiddlewareResult> {\n const run = () => executeMiddleware(options);\n return options.ctx ? runWithExecutionContext(options.ctx, run) : run();\n}\n"],"mappings":";;;;;;;;;;;AA0DA,SAAS,oBAAoB,OAA4C;CACvE,OAAO,OAAO,UAAU;;AAG1B,SAAS,yBAAyB,OAAiD;CACjF,OAAO,CAAC,CAAC,SAAS,OAAO,UAAU;;AAGrC,SAAS,oBAAoB,SAA0B;CACrD,OAAO,UAAU,UAAU;;AAG7B,SAAS,yBAAyB,SAA0B;CAC1D,OAAO,UAAU,UAAU;;AAG7B,SAAgB,+BACd,KACA,SACmB;CACnB,MAAM,UAAU,QAAQ,UAAW,IAAI,SAAS,IAAI,UAAY,IAAI,cAAc,IAAI;CACtF,IAAI,oBAAoB,QAAQ,EAAE,OAAO;CAEzC,MAAM,YAAY,oBAAoB,QAAQ,QAAQ;CACtD,MAAM,iBAAiB,yBAAyB,QAAQ,QAAQ;CAChE,MAAM,aAAa,QAAQ,WAAW,KAAK,QAAQ,SAAS,KAAK;CACjE,MAAM,IAAI,MACR,OAAO,UAAU,OAAO,WAAW,kCAAkC,eAAe,+BACrF;;AAGH,SAAS,kBAAkB,KAAkD;CAC3E,MAAM,SAAS,IAAI;CACnB,IAAI,CAAC,yBAAyB,OAAO,EAAE,OAAO,KAAA;CAC9C,OAAO,OAAO;;AAGhB,SAAS,mCAAmC,UAA8B;CACxE,MAAM,UAAU,IAAI,QAAQ,SAAS,QAAQ;CAC7C,yBAAyB,QAAQ;CACjC,OAAO,IAAI,SAAS,SAAS,MAAM;EACjC,QAAQ,SAAS;EACjB,YAAY,SAAS;EACrB;EACD,CAAC;;AAGJ,SAAS,yBAAyB,UAA6B;CAC7D,MAAM,kBAAkB,IAAI,SAAS;CACrC,KAAK,MAAM,CAAC,KAAK,UAAU,SAAS,SAClC,IAAI,CAAC,IAAI,WAAA,gBAAoC,IAAI,2BAA2B,IAAI,EAC9E,gBAAgB,OAAO,KAAK,MAAM;CAGtC,OAAO;;AAGT,SAAS,gBAAgB,YAAgD;CACvE,MAAM,oBAAoB,WAAW;CACrC,MAAM,UAAU,WAAW,gBAAgB;CAC3C,MAAM,mBAAmB,4BAA4B;CACrD,IAAI,kBACF,iBAAiB,UAAU,QAAQ;CAIrC,OAAO;;AAGT,SAAS,0BAA0B,SAAqC;CACtE,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;CAChC,IAAI;EACF,OAAO,cAAc,qCAAqC,IAAI,SAAS,CAAC;SAClE;EACN,OAAO,oBAAoB;;;AAI/B,SAAS,kBACP,SACA,oBACA,YACA,UACa;CACb,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;CAGhC,IAAI,YAAY,QAAQ,QAAQ,CAAC,QAAQ,WAAW,QAAQ,OAAO,GAAG;CACtE,IAAI,uBAAuB,IAAI,UAAU;EACvC,MAAM,QAAQ,IAAI,IAAI,IAAI;EAC1B,MAAM,WAAW;EACjB,YAAY,IAAI,QAAQ,OAAO,UAAU;;CAG3C,MAAM,aACJ,YAAY,aACR;EAAE,UAAU,YAAY;EAAI,MAAM,cAAc,KAAA;EAAW,GAC3D,KAAA;CAEN,OAAO,qBAAqB,cACxB,YACA,IAAI,YAAY,WAAW,aAAa,EAAE,YAAY,GAAG,KAAA,EAAU;;AAGzE,eAAsB,kBACpB,SAC2B;CAC3B,MAAM,eAAe,+BAA+B,QAAQ,QAAQ;EAClE,UAAU,QAAQ;EAClB,SAAS,QAAQ;EAClB,CAAC;CACF,MAAM,qBACJ,QAAQ,sBAAsB,0BAA0B,QAAQ,QAAQ;CAC1E,IAAI,8BAA8B,UAChC,OAAO;EAAE,UAAU;EAAO,UAAU;EAAoB;CAG1D,IACE,CAAC,kBACC,oBACA,kBAAkB,QAAQ,OAAO,EACjC,QAAQ,SACR,QAAQ,WACT,EAED,OAAO,EAAE,UAAU,MAAM;CAG3B,MAAM,cAAc,kBAClB,QAAQ,SACR,oBACA,QAAQ,YACR,QAAQ,SACT;CACD,MAAM,aAAa,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;CAEnE,IAAI;CACJ,IAAI;EACF,WAAW,MAAM,aAAa,aAAa,WAAW;UAC/C,GAAG;EACV,QAAQ,MAAM,8BAA8B,EAAE;EAC9C,MAAM,oBAAoB,gBAAgB,WAAW;EAIrD,OAAO;GACL,UAAU;GACV,UAAU,4BALI,QAAQ,sBACpB,wBAAwB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,IAClE,wBAG4C;GAC9C;GACD;;CAGH,MAAM,oBAAoB,gBAAgB,WAAW;CAErD,IAAI,CAAC,UACH,OAAO;EAAE,UAAU;EAAM;EAAmB;CAG9C,IAAI,SAAS,QAAQ,IAAA,oBAA2B,KAAK,KACnD,OAAO;EACL,UAAU;EACV,iBAAiB,yBAAyB,SAAS;EACnD,QAAQ,SAAS,WAAW,MAAM,SAAS,SAAS,KAAA;EACpD;EACD;CAGH,IAAI,SAAS,UAAU,OAAO,SAAS,SAAS,KAAK;EACnD,MAAM,WAAW,SAAS,QAAQ,IAAI,WAAW,IAAI,SAAS,QAAQ,IAAI,WAAW;EACrF,IAAI,UAAU;GACZ,MAAM,kBAAkB,IAAI,SAAS;GACrC,KAAK,MAAM,CAAC,KAAK,UAAU,SAAS,SAClC,IAAI,CAAC,IAAI,WAAA,gBAAoC,IAAI,IAAI,aAAa,KAAK,YACrE,gBAAgB,OAAO,KAAK,MAAM;GAGtC,OAAO;IACL,UAAU;IACV,aAAa;IACb,gBAAgB,SAAS;IACzB,UAAU,mCAAmC,SAAS;IACtD;IACA;IACD;;;CAIL,MAAM,aAAa,SAAS,QAAQ,IAAI,0BAA0B;CAClE,IAAI,YAAY;EACd,IAAI;EACJ,IAAI;GACF,MAAM,gBAAgB,IAAI,IAAI,YAAY,QAAQ,QAAQ,IAAI;GAC9D,MAAM,gBAAgB,IAAI,IAAI,QAAQ,QAAQ,IAAI,CAAC;GACnD,cACE,cAAc,WAAW,gBACrB,cAAc,WAAW,cAAc,SACvC,cAAc;UACd;GACN,cAAc;;EAEhB,OAAO;GACL,UAAU;GACV,YAAY;GACZ,eAAe,SAAS,WAAW,MAAM,SAAS,SAAS,KAAA;GAC3D,iBAAiB,yBAAyB,SAAS;GACnD,QAAQ,SAAS,WAAW,MAAM,SAAS,SAAS,KAAA;GACpD;GACD;;CAGH,OAAO;EACL,UAAU;EACV,UAAU,mCAAmC,SAAS;EACtD;EACD;;AAGH,eAAsB,uBACpB,SAC2B;CAC3B,MAAM,YAAY,kBAAkB,QAAQ;CAC5C,OAAO,QAAQ,MAAM,wBAAwB,QAAQ,KAAK,IAAI,GAAG,KAAK"}
@@ -31,6 +31,18 @@ declare function resolveMiddlewareHandler(mod: MiddlewareModule, filePath: strin
31
31
  * Find the proxy or middleware file in the project root.
32
32
  * Checks for proxy.ts (Next.js 16) first, then falls back to middleware.ts.
33
33
  * If middleware.ts is found, logs a deprecation warning.
34
+ *
35
+ * Note on log noise: this function is called from Vite's `config` hook, which
36
+ * fires once per build environment (RSC, SSR, client, …). That means a project
37
+ * still using `middleware.ts` will see this warning emitted 2–3 times per
38
+ * build. The warning is benign — it does not abort the build. Next.js itself
39
+ * emits the same message via `Log.warnOnce`; matching that parity would
40
+ * require either a per-root deduplication map or hoisting the warning out of
41
+ * this function (e.g. into the plugin's `configResolved` hook). Tracked as a
42
+ * follow-up; see the deploy-suite investigation in run 25870737355.
43
+ *
44
+ * @see https://github.com/vercel/next.js/blob/canary/packages/next/src/build/index.ts
45
+ * (search for "MIDDLEWARE_FILENAME" + "file convention is deprecated")
34
46
  */
35
47
  declare function findMiddlewareFile(root: string, fileMatcher: ValidFileMatcher): string | null;
36
48
  /**
@@ -37,6 +37,18 @@ const MIDDLEWARE_LOCATIONS = ["", "src/"];
37
37
  * Find the proxy or middleware file in the project root.
38
38
  * Checks for proxy.ts (Next.js 16) first, then falls back to middleware.ts.
39
39
  * If middleware.ts is found, logs a deprecation warning.
40
+ *
41
+ * Note on log noise: this function is called from Vite's `config` hook, which
42
+ * fires once per build environment (RSC, SSR, client, …). That means a project
43
+ * still using `middleware.ts` will see this warning emitted 2–3 times per
44
+ * build. The warning is benign — it does not abort the build. Next.js itself
45
+ * emits the same message via `Log.warnOnce`; matching that parity would
46
+ * require either a per-root deduplication map or hoisting the warning out of
47
+ * this function (e.g. into the plugin's `configResolved` hook). Tracked as a
48
+ * follow-up; see the deploy-suite investigation in run 25870737355.
49
+ *
50
+ * @see https://github.com/vercel/next.js/blob/canary/packages/next/src/build/index.ts
51
+ * (search for "MIDDLEWARE_FILENAME" + "file convention is deprecated")
40
52
  */
41
53
  function findMiddlewareFile(root, fileMatcher) {
42
54
  for (const dir of MIDDLEWARE_LOCATIONS) for (const ext of fileMatcher.dottedExtensions) {
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","names":[],"sources":["../../src/server/middleware.ts"],"sourcesContent":["/**\n * proxy.ts / middleware.ts runner\n *\n * Loads and executes the user's proxy.ts (Next.js 16) or middleware.ts file\n * before routing. Runs in Node (not Edge Runtime), per the vinext design.\n *\n * In Next.js 16, proxy.ts replaces middleware.ts:\n * - proxy.ts: default export OR named `proxy` function, runs on Node.js runtime\n * - middleware.ts: deprecated but still supported for Edge runtime use cases\n *\n * The proxy/middleware receives a NextRequest and can:\n * - Return NextResponse.next() to continue to the route\n * - Return NextResponse.redirect() to redirect\n * - Return NextResponse.rewrite() to rewrite the URL\n * - Set/modify headers and cookies\n * - Return a Response directly (e.g., for auth guards)\n *\n * Supports the `config.matcher` export for path filtering.\n */\n\nimport type { ModuleRunner } from \"vite/module-runner\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { NextI18nConfig } from \"../config/next-config.js\";\nimport { ValidFileMatcher } from \"../routing/file-matcher.js\";\nimport {\n resolveMiddlewareModuleHandler,\n runGeneratedMiddleware,\n type MiddlewareModule,\n type MiddlewareResult,\n} from \"./middleware-runtime.js\";\n\nexport { matchPattern, matchesMiddleware } from \"./middleware-matcher.js\";\n\n/**\n * Determine whether a middleware/proxy file path refers to a proxy file.\n * proxy.ts files accept `proxy` or `default` exports.\n * middleware.ts files accept `middleware` or `default` exports.\n *\n * Matches Next.js behavior where each file type only accepts its own\n * named export or a default export:\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/build/templates/middleware.ts\n */\nexport function isProxyFile(filePath: string): boolean {\n const base = path.basename(filePath).replace(/\\.\\w+$/, \"\");\n return base === \"proxy\";\n}\n\n/**\n * Resolve the middleware/proxy handler function from a module's exports.\n * Matches Next.js behavior: for proxy files, check `proxy` then `default`;\n * for middleware files, check `middleware` then `default`.\n *\n * Throws if the file exists but doesn't export a valid function, matching\n * Next.js's ProxyMissingExportError behavior.\n *\n * @see https://github.com/vercel/next.js/blob/canary/packages/next/src/build/templates/middleware.ts\n * @see https://github.com/vercel/next.js/blob/canary/test/e2e/app-dir/proxy-missing-export/proxy-missing-export.test.ts\n */\nexport function resolveMiddlewareHandler(mod: MiddlewareModule, filePath: string) {\n return resolveMiddlewareModuleHandler(mod, {\n filePath,\n isProxy: isProxyFile(filePath),\n });\n}\n\nconst MIDDLEWARE_LOCATIONS = [\"\", \"src/\"];\n\n/**\n * Find the proxy or middleware file in the project root.\n * Checks for proxy.ts (Next.js 16) first, then falls back to middleware.ts.\n * If middleware.ts is found, logs a deprecation warning.\n */\nexport function findMiddlewareFile(root: string, fileMatcher: ValidFileMatcher): string | null {\n // Check proxy.ts first (Next.js 16 replacement for middleware.ts)\n for (const dir of MIDDLEWARE_LOCATIONS) {\n for (const ext of fileMatcher.dottedExtensions) {\n const fullPath = path.join(root, dir, `proxy${ext}`);\n if (fs.existsSync(fullPath)) {\n return fullPath;\n }\n }\n }\n\n // Fall back to middleware.ts (deprecated in Next.js 16)\n for (const dir of MIDDLEWARE_LOCATIONS) {\n for (const ext of fileMatcher.dottedExtensions) {\n const fullPath = path.join(root, dir, `middleware${ext}`);\n if (fs.existsSync(fullPath)) {\n console.warn(\n \"[vinext] middleware.ts is deprecated in Next.js 16. \" +\n \"Rename to proxy.ts and export a default or named proxy function.\",\n );\n return fullPath;\n }\n }\n }\n return null;\n}\n\nfunction isMiddlewareModule(value: unknown): value is MiddlewareModule {\n return !!value && typeof value === \"object\";\n}\n\n/**\n * Load and execute middleware for a given request.\n *\n * @param runner - A ModuleRunner used to load the middleware module.\n * Must be a long-lived instance created once (e.g. in configureServer) via\n * createDirectRunner() — NOT recreated per request. Using server.ssrLoadModule\n * directly crashes with `outsideEmitter` when @cloudflare/vite-plugin is\n * present because SSRCompatModuleRunner reads environment.hot.api synchronously.\n * @param middlewarePath - Absolute path to the middleware file\n * @param request - The incoming Request object\n * @returns Middleware result describing what action to take\n */\nexport async function runMiddleware(\n runner: ModuleRunner,\n middlewarePath: string,\n request: Request,\n i18nConfig?: NextI18nConfig | null,\n basePath?: string,\n): Promise<MiddlewareResult> {\n // Load the middleware module via the direct-call ModuleRunner.\n // This bypasses the hot channel entirely and is safe with all Vite plugin\n // combinations, including @cloudflare/vite-plugin.\n const mod = await runner.import(middlewarePath);\n if (!isMiddlewareModule(mod)) {\n throw new Error(`Middleware module \"${middlewarePath}\" did not evaluate to an object.`);\n }\n\n return runGeneratedMiddleware({\n basePath,\n filePath: middlewarePath,\n i18nConfig,\n includeErrorDetails: process.env.NODE_ENV !== \"production\",\n isProxy: isProxyFile(middlewarePath),\n module: mod,\n request,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;AA2CA,SAAgB,YAAY,UAA2B;CAErD,OADa,KAAK,SAAS,SAAS,CAAC,QAAQ,UAAU,GAC5C,KAAK;;;;;;;;;;;;;AAclB,SAAgB,yBAAyB,KAAuB,UAAkB;CAChF,OAAO,+BAA+B,KAAK;EACzC;EACA,SAAS,YAAY,SAAS;EAC/B,CAAC;;AAGJ,MAAM,uBAAuB,CAAC,IAAI,OAAO;;;;;;AAOzC,SAAgB,mBAAmB,MAAc,aAA8C;CAE7F,KAAK,MAAM,OAAO,sBAChB,KAAK,MAAM,OAAO,YAAY,kBAAkB;EAC9C,MAAM,WAAW,KAAK,KAAK,MAAM,KAAK,QAAQ,MAAM;EACpD,IAAI,GAAG,WAAW,SAAS,EACzB,OAAO;;CAMb,KAAK,MAAM,OAAO,sBAChB,KAAK,MAAM,OAAO,YAAY,kBAAkB;EAC9C,MAAM,WAAW,KAAK,KAAK,MAAM,KAAK,aAAa,MAAM;EACzD,IAAI,GAAG,WAAW,SAAS,EAAE;GAC3B,QAAQ,KACN,uHAED;GACD,OAAO;;;CAIb,OAAO;;AAGT,SAAS,mBAAmB,OAA2C;CACrE,OAAO,CAAC,CAAC,SAAS,OAAO,UAAU;;;;;;;;;;;;;;AAerC,eAAsB,cACpB,QACA,gBACA,SACA,YACA,UAC2B;CAI3B,MAAM,MAAM,MAAM,OAAO,OAAO,eAAe;CAC/C,IAAI,CAAC,mBAAmB,IAAI,EAC1B,MAAM,IAAI,MAAM,sBAAsB,eAAe,kCAAkC;CAGzF,OAAO,uBAAuB;EAC5B;EACA,UAAU;EACV;EACA,qBAAqB,QAAQ,IAAI,aAAa;EAC9C,SAAS,YAAY,eAAe;EACpC,QAAQ;EACR;EACD,CAAC"}
1
+ {"version":3,"file":"middleware.js","names":[],"sources":["../../src/server/middleware.ts"],"sourcesContent":["/**\n * proxy.ts / middleware.ts runner\n *\n * Loads and executes the user's proxy.ts (Next.js 16) or middleware.ts file\n * before routing. Runs in Node (not Edge Runtime), per the vinext design.\n *\n * In Next.js 16, proxy.ts replaces middleware.ts:\n * - proxy.ts: default export OR named `proxy` function, runs on Node.js runtime\n * - middleware.ts: deprecated but still supported for Edge runtime use cases\n *\n * The proxy/middleware receives a NextRequest and can:\n * - Return NextResponse.next() to continue to the route\n * - Return NextResponse.redirect() to redirect\n * - Return NextResponse.rewrite() to rewrite the URL\n * - Set/modify headers and cookies\n * - Return a Response directly (e.g., for auth guards)\n *\n * Supports the `config.matcher` export for path filtering.\n */\n\nimport type { ModuleRunner } from \"vite/module-runner\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { NextI18nConfig } from \"../config/next-config.js\";\nimport { ValidFileMatcher } from \"../routing/file-matcher.js\";\nimport {\n resolveMiddlewareModuleHandler,\n runGeneratedMiddleware,\n type MiddlewareModule,\n type MiddlewareResult,\n} from \"./middleware-runtime.js\";\n\nexport { matchPattern, matchesMiddleware } from \"./middleware-matcher.js\";\n\n/**\n * Determine whether a middleware/proxy file path refers to a proxy file.\n * proxy.ts files accept `proxy` or `default` exports.\n * middleware.ts files accept `middleware` or `default` exports.\n *\n * Matches Next.js behavior where each file type only accepts its own\n * named export or a default export:\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/build/templates/middleware.ts\n */\nexport function isProxyFile(filePath: string): boolean {\n const base = path.basename(filePath).replace(/\\.\\w+$/, \"\");\n return base === \"proxy\";\n}\n\n/**\n * Resolve the middleware/proxy handler function from a module's exports.\n * Matches Next.js behavior: for proxy files, check `proxy` then `default`;\n * for middleware files, check `middleware` then `default`.\n *\n * Throws if the file exists but doesn't export a valid function, matching\n * Next.js's ProxyMissingExportError behavior.\n *\n * @see https://github.com/vercel/next.js/blob/canary/packages/next/src/build/templates/middleware.ts\n * @see https://github.com/vercel/next.js/blob/canary/test/e2e/app-dir/proxy-missing-export/proxy-missing-export.test.ts\n */\nexport function resolveMiddlewareHandler(mod: MiddlewareModule, filePath: string) {\n return resolveMiddlewareModuleHandler(mod, {\n filePath,\n isProxy: isProxyFile(filePath),\n });\n}\n\nconst MIDDLEWARE_LOCATIONS = [\"\", \"src/\"];\n\n/**\n * Find the proxy or middleware file in the project root.\n * Checks for proxy.ts (Next.js 16) first, then falls back to middleware.ts.\n * If middleware.ts is found, logs a deprecation warning.\n *\n * Note on log noise: this function is called from Vite's `config` hook, which\n * fires once per build environment (RSC, SSR, client, …). That means a project\n * still using `middleware.ts` will see this warning emitted 2–3 times per\n * build. The warning is benign — it does not abort the build. Next.js itself\n * emits the same message via `Log.warnOnce`; matching that parity would\n * require either a per-root deduplication map or hoisting the warning out of\n * this function (e.g. into the plugin's `configResolved` hook). Tracked as a\n * follow-up; see the deploy-suite investigation in run 25870737355.\n *\n * @see https://github.com/vercel/next.js/blob/canary/packages/next/src/build/index.ts\n * (search for \"MIDDLEWARE_FILENAME\" + \"file convention is deprecated\")\n */\nexport function findMiddlewareFile(root: string, fileMatcher: ValidFileMatcher): string | null {\n // Check proxy.ts first (Next.js 16 replacement for middleware.ts)\n for (const dir of MIDDLEWARE_LOCATIONS) {\n for (const ext of fileMatcher.dottedExtensions) {\n const fullPath = path.join(root, dir, `proxy${ext}`);\n if (fs.existsSync(fullPath)) {\n return fullPath;\n }\n }\n }\n\n // Fall back to middleware.ts (deprecated in Next.js 16).\n // This is a warning, not an error: middleware.ts is still fully supported\n // by both Next.js 16 and vinext. Do not change to `throw` or `process.exit`.\n for (const dir of MIDDLEWARE_LOCATIONS) {\n for (const ext of fileMatcher.dottedExtensions) {\n const fullPath = path.join(root, dir, `middleware${ext}`);\n if (fs.existsSync(fullPath)) {\n console.warn(\n \"[vinext] middleware.ts is deprecated in Next.js 16. \" +\n \"Rename to proxy.ts and export a default or named proxy function.\",\n );\n return fullPath;\n }\n }\n }\n return null;\n}\n\nfunction isMiddlewareModule(value: unknown): value is MiddlewareModule {\n return !!value && typeof value === \"object\";\n}\n\n/**\n * Load and execute middleware for a given request.\n *\n * @param runner - A ModuleRunner used to load the middleware module.\n * Must be a long-lived instance created once (e.g. in configureServer) via\n * createDirectRunner() — NOT recreated per request. Using server.ssrLoadModule\n * directly crashes with `outsideEmitter` when @cloudflare/vite-plugin is\n * present because SSRCompatModuleRunner reads environment.hot.api synchronously.\n * @param middlewarePath - Absolute path to the middleware file\n * @param request - The incoming Request object\n * @returns Middleware result describing what action to take\n */\nexport async function runMiddleware(\n runner: ModuleRunner,\n middlewarePath: string,\n request: Request,\n i18nConfig?: NextI18nConfig | null,\n basePath?: string,\n): Promise<MiddlewareResult> {\n // Load the middleware module via the direct-call ModuleRunner.\n // This bypasses the hot channel entirely and is safe with all Vite plugin\n // combinations, including @cloudflare/vite-plugin.\n const mod = await runner.import(middlewarePath);\n if (!isMiddlewareModule(mod)) {\n throw new Error(`Middleware module \"${middlewarePath}\" did not evaluate to an object.`);\n }\n\n return runGeneratedMiddleware({\n basePath,\n filePath: middlewarePath,\n i18nConfig,\n includeErrorDetails: process.env.NODE_ENV !== \"production\",\n isProxy: isProxyFile(middlewarePath),\n module: mod,\n request,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;AA2CA,SAAgB,YAAY,UAA2B;CAErD,OADa,KAAK,SAAS,SAAS,CAAC,QAAQ,UAAU,GAC5C,KAAK;;;;;;;;;;;;;AAclB,SAAgB,yBAAyB,KAAuB,UAAkB;CAChF,OAAO,+BAA+B,KAAK;EACzC;EACA,SAAS,YAAY,SAAS;EAC/B,CAAC;;AAGJ,MAAM,uBAAuB,CAAC,IAAI,OAAO;;;;;;;;;;;;;;;;;;AAmBzC,SAAgB,mBAAmB,MAAc,aAA8C;CAE7F,KAAK,MAAM,OAAO,sBAChB,KAAK,MAAM,OAAO,YAAY,kBAAkB;EAC9C,MAAM,WAAW,KAAK,KAAK,MAAM,KAAK,QAAQ,MAAM;EACpD,IAAI,GAAG,WAAW,SAAS,EACzB,OAAO;;CAQb,KAAK,MAAM,OAAO,sBAChB,KAAK,MAAM,OAAO,YAAY,kBAAkB;EAC9C,MAAM,WAAW,KAAK,KAAK,MAAM,KAAK,aAAa,MAAM;EACzD,IAAI,GAAG,WAAW,SAAS,EAAE;GAC3B,QAAQ,KACN,uHAED;GACD,OAAO;;;CAIb,OAAO;;AAGT,SAAS,mBAAmB,OAA2C;CACrE,OAAO,CAAC,CAAC,SAAS,OAAO,UAAU;;;;;;;;;;;;;;AAerC,eAAsB,cACpB,QACA,gBACA,SACA,YACA,UAC2B;CAI3B,MAAM,MAAM,MAAM,OAAO,OAAO,eAAe;CAC/C,IAAI,CAAC,mBAAmB,IAAI,EAC1B,MAAM,IAAI,MAAM,sBAAsB,eAAe,kCAAkC;CAGzF,OAAO,uBAAuB;EAC5B;EACA,UAAU;EACV;EACA,qBAAqB,QAAQ,IAAI,aAAa;EAC9C,SAAS,YAAY,eAAe;EACpC,QAAQ;EACR;EACD,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { RouteManifest } from "../routing/app-route-graph.js";
2
+ import { AppElementsSlotBinding } from "./app-elements-wire.js";
2
3
  import { NavigationTrace, NavigationTraceFields } from "./navigation-trace.js";
3
4
 
4
5
  //#region src/server/navigation-planner.d.ts
@@ -13,17 +14,28 @@ type OperationToken = {
13
14
  cacheVariantFingerprint?: string;
14
15
  };
15
16
  type RouteSnapshotV0 = {
17
+ interception: InterceptionSnapshotV0 | null;
18
+ interceptionContext: string | null;
16
19
  routeId: string;
17
20
  layoutIds: readonly string[];
18
21
  mountedParallelSlots: readonly MountedParallelSlotSnapshotV0[];
19
22
  rootBoundaryId: string | null;
20
23
  displayUrl: string;
21
24
  matchedUrl: string;
25
+ slotBindings: readonly ParallelSlotBindingSnapshotV0[];
26
+ };
27
+ type InterceptionSnapshotV0 = {
28
+ sourceMatchedUrl: string;
29
+ sourceRouteId: string;
30
+ slotId: string;
31
+ targetMatchedUrl: string;
32
+ targetRouteId: string;
22
33
  };
23
34
  type MountedParallelSlotSnapshotV0 = {
24
35
  slotId: string;
25
36
  ownerLayoutId: string | null;
26
37
  };
38
+ type ParallelSlotBindingSnapshotV0 = AppElementsSlotBinding;
27
39
  type NavigationPlannerStateV0 = {
28
40
  nextOperationToken: OperationToken;
29
41
  traceFields?: NavigationTraceFields;
@@ -31,6 +43,7 @@ type NavigationPlannerStateV0 = {
31
43
  visibleSnapshot: RouteSnapshotV0;
32
44
  };
33
45
  type RefreshScope = "visible";
46
+ type TraverseDirection = "back" | "forward" | "unknown";
34
47
  type NavigationEvent = {
35
48
  kind: "navigate";
36
49
  href: string;
@@ -40,7 +53,7 @@ type NavigationEvent = {
40
53
  scope: RefreshScope;
41
54
  } | {
42
55
  kind: "traverse";
43
- direction: "back" | "forward";
56
+ direction: TraverseDirection;
44
57
  historyState: unknown;
45
58
  } | {
46
59
  kind: "prefetch";
@@ -55,7 +68,7 @@ type RequestedWork = {
55
68
  href: string;
56
69
  mode: "push" | "replace" | "refresh";
57
70
  } | {
58
- direction: "back" | "forward";
71
+ direction: TraverseDirection;
59
72
  historyState: unknown;
60
73
  kind: "traverseFlight";
61
74
  } | {
@@ -65,11 +78,12 @@ type RequestedWork = {
65
78
  type CommitProposal = {
66
79
  preserveAbsentSlots: boolean;
67
80
  preserveElementIds: readonly string[];
68
- reason: "currentRootBoundary" | "rootBoundaryUnknownFallback";
81
+ preservePreviousSlotIds: readonly string[];
82
+ reason: "currentRootBoundary" | "interceptedCurrentRootBoundary" | "rootBoundaryUnknownFallback";
69
83
  targetSnapshot: RouteSnapshotV0;
70
84
  };
71
85
  type NoCommitReason = "prefetchOnly";
72
- type HardNavigationReason = "rootBoundaryChanged";
86
+ type HardNavigationReason = "interceptionProofRejected" | "rootBoundaryChanged";
73
87
  type RootBoundaryTransition = "currentRootBoundary" | "rootBoundaryChanged" | "rootBoundaryUnknownFallback";
74
88
  type NavigationDecisionV0 = {
75
89
  kind: "requestWork";
@@ -115,5 +129,5 @@ declare const navigationPlanner: {
115
129
  resolveSameLayoutAncestorPersistence: typeof resolveSameLayoutAncestorPersistence;
116
130
  };
117
131
  //#endregion
118
- export { CommitProposal, FlightResultV0, HardNavigationReason, MountedParallelSlotSnapshotV0, NavigationDecisionV0, NavigationEvent, NavigationPlannerInput, NavigationPlannerStateV0, NoCommitReason, OperationLane, OperationToken, RefreshScope, RequestedWork, RootBoundaryTransition, RouteSnapshotV0, navigationPlanner };
132
+ export { CommitProposal, FlightResultV0, HardNavigationReason, InterceptionSnapshotV0, MountedParallelSlotSnapshotV0, NavigationDecisionV0, NavigationEvent, NavigationPlannerInput, NavigationPlannerStateV0, NoCommitReason, OperationLane, OperationToken, ParallelSlotBindingSnapshotV0, RefreshScope, RequestedWork, RootBoundaryTransition, RouteSnapshotV0, TraverseDirection, navigationPlanner };
119
133
  //# sourceMappingURL=navigation-planner.d.ts.map