@qzsy/vinext 0.1.7

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 (803) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +773 -0
  3. package/dist/build/assets-ignore.d.ts +32 -0
  4. package/dist/build/assets-ignore.js +48 -0
  5. package/dist/build/clean-output.d.ts +13 -0
  6. package/dist/build/clean-output.js +34 -0
  7. package/dist/build/client-build-config.d.ts +171 -0
  8. package/dist/build/client-build-config.js +270 -0
  9. package/dist/build/css-url-assets.d.ts +29 -0
  10. package/dist/build/css-url-assets.js +213 -0
  11. package/dist/build/google-fonts/build-url.d.ts +9 -0
  12. package/dist/build/google-fonts/build-url.js +28 -0
  13. package/dist/build/google-fonts/fallback-metrics-data.js +14029 -0
  14. package/dist/build/google-fonts/fallback-metrics.d.ts +12 -0
  15. package/dist/build/google-fonts/fallback-metrics.js +44 -0
  16. package/dist/build/google-fonts/find-font-files-in-css.d.ts +16 -0
  17. package/dist/build/google-fonts/find-font-files-in-css.js +28 -0
  18. package/dist/build/google-fonts/font-data.js +24983 -0
  19. package/dist/build/google-fonts/font-metadata.d.ts +16 -0
  20. package/dist/build/google-fonts/font-metadata.js +5 -0
  21. package/dist/build/google-fonts/get-axes.d.ts +6 -0
  22. package/dist/build/google-fonts/get-axes.js +37 -0
  23. package/dist/build/google-fonts/sort-variants.d.ts +4 -0
  24. package/dist/build/google-fonts/sort-variants.js +12 -0
  25. package/dist/build/google-fonts/validate.d.ts +27 -0
  26. package/dist/build/google-fonts/validate.js +54 -0
  27. package/dist/build/inline-css.d.ts +6 -0
  28. package/dist/build/inline-css.js +48 -0
  29. package/dist/build/layout-classification-types.d.ts +61 -0
  30. package/dist/build/layout-classification-types.js +1 -0
  31. package/dist/build/layout-classification.d.ts +59 -0
  32. package/dist/build/layout-classification.js +98 -0
  33. package/dist/build/next-client-runtime-manifests.d.ts +14 -0
  34. package/dist/build/next-client-runtime-manifests.js +39 -0
  35. package/dist/build/nitro-route-rules.d.ts +49 -0
  36. package/dist/build/nitro-route-rules.js +79 -0
  37. package/dist/build/precompress.d.ts +27 -0
  38. package/dist/build/precompress.js +110 -0
  39. package/dist/build/prerender.d.ts +209 -0
  40. package/dist/build/prerender.js +932 -0
  41. package/dist/build/report.d.ts +132 -0
  42. package/dist/build/report.js +504 -0
  43. package/dist/build/route-classification-injector.d.ts +34 -0
  44. package/dist/build/route-classification-injector.js +59 -0
  45. package/dist/build/route-classification-manifest.d.ts +52 -0
  46. package/dist/build/route-classification-manifest.js +143 -0
  47. package/dist/build/run-prerender.d.ts +61 -0
  48. package/dist/build/run-prerender.js +224 -0
  49. package/dist/build/server-manifest.d.ts +18 -0
  50. package/dist/build/server-manifest.js +22 -0
  51. package/dist/build/ssr-manifest.d.ts +18 -0
  52. package/dist/build/ssr-manifest.js +69 -0
  53. package/dist/build/standalone.d.ts +31 -0
  54. package/dist/build/standalone.js +203 -0
  55. package/dist/build/static-export.d.ts +55 -0
  56. package/dist/build/static-export.js +60 -0
  57. package/dist/cache/cache-adapters-virtual.d.ts +50 -0
  58. package/dist/cache/cache-adapters-virtual.js +45 -0
  59. package/dist/cache.d.ts +2 -0
  60. package/dist/cache.js +2 -0
  61. package/dist/check.d.ts +87 -0
  62. package/dist/check.js +1037 -0
  63. package/dist/cli-args.d.ts +33 -0
  64. package/dist/cli-args.js +124 -0
  65. package/dist/cli.d.ts +1 -0
  66. package/dist/cli.js +744 -0
  67. package/dist/client/app-nav-failure-handler.d.ts +8 -0
  68. package/dist/client/app-nav-failure-handler.js +44 -0
  69. package/dist/client/empty-module.d.ts +1 -0
  70. package/dist/client/empty-module.js +1 -0
  71. package/dist/client/instrumentation-client-inject.d.ts +33 -0
  72. package/dist/client/instrumentation-client-inject.js +55 -0
  73. package/dist/client/instrumentation-client-state.d.ts +9 -0
  74. package/dist/client/instrumentation-client-state.js +17 -0
  75. package/dist/client/instrumentation-client.d.ts +7 -0
  76. package/dist/client/instrumentation-client.js +6 -0
  77. package/dist/client/navigation-runtime.d.ts +70 -0
  78. package/dist/client/navigation-runtime.js +169 -0
  79. package/dist/client/pages-router-link-navigation.d.ts +61 -0
  80. package/dist/client/pages-router-link-navigation.js +42 -0
  81. package/dist/client/validate-module-path.d.ts +17 -0
  82. package/dist/client/validate-module-path.js +24 -0
  83. package/dist/client/vinext-next-data.d.ts +44 -0
  84. package/dist/client/vinext-next-data.js +50 -0
  85. package/dist/client/window-next.d.ts +168 -0
  86. package/dist/client/window-next.js +57 -0
  87. package/dist/cloudflare/index.d.ts +3 -0
  88. package/dist/cloudflare/index.js +3 -0
  89. package/dist/cloudflare/src/cache/cdn-adapter.runtime.js +102 -0
  90. package/dist/cloudflare/src/cache/kv-data-adapter.runtime.d.ts +126 -0
  91. package/dist/cloudflare/src/cache/kv-data-adapter.runtime.js +435 -0
  92. package/dist/cloudflare/src/utils/cache-control-metadata.js +20 -0
  93. package/dist/cloudflare/tpr.d.ts +82 -0
  94. package/dist/cloudflare/tpr.js +558 -0
  95. package/dist/config/config-matchers.d.ts +257 -0
  96. package/dist/config/config-matchers.js +1046 -0
  97. package/dist/config/dotenv.d.ts +56 -0
  98. package/dist/config/dotenv.js +88 -0
  99. package/dist/config/next-config.d.ts +540 -0
  100. package/dist/config/next-config.js +1050 -0
  101. package/dist/config/tsconfig-paths.d.ts +21 -0
  102. package/dist/config/tsconfig-paths.js +157 -0
  103. package/dist/deploy.d.ts +190 -0
  104. package/dist/deploy.js +1033 -0
  105. package/dist/entries/app-browser-entry.d.ts +29 -0
  106. package/dist/entries/app-browser-entry.js +83 -0
  107. package/dist/entries/app-rsc-entry.d.ts +81 -0
  108. package/dist/entries/app-rsc-entry.js +943 -0
  109. package/dist/entries/app-rsc-manifest.d.ts +53 -0
  110. package/dist/entries/app-rsc-manifest.js +294 -0
  111. package/dist/entries/app-ssr-entry.d.ts +15 -0
  112. package/dist/entries/app-ssr-entry.js +24 -0
  113. package/dist/entries/pages-client-entry.d.ts +11 -0
  114. package/dist/entries/pages-client-entry.js +204 -0
  115. package/dist/entries/pages-entry-helpers.d.ts +2 -0
  116. package/dist/entries/pages-entry-helpers.js +2 -0
  117. package/dist/entries/pages-server-entry.d.ts +11 -0
  118. package/dist/entries/pages-server-entry.js +398 -0
  119. package/dist/entries/runtime-entry-module.d.ts +25 -0
  120. package/dist/entries/runtime-entry-module.js +46 -0
  121. package/dist/index.d.ts +115 -0
  122. package/dist/index.js +2661 -0
  123. package/dist/init.d.ts +69 -0
  124. package/dist/init.js +253 -0
  125. package/dist/plugins/ast-utils.d.ts +20 -0
  126. package/dist/plugins/ast-utils.js +78 -0
  127. package/dist/plugins/async-hooks-stub.d.ts +18 -0
  128. package/dist/plugins/async-hooks-stub.js +40 -0
  129. package/dist/plugins/client-reference-dedup.d.ts +35 -0
  130. package/dist/plugins/client-reference-dedup.js +189 -0
  131. package/dist/plugins/css-data-url.d.ts +6 -0
  132. package/dist/plugins/css-data-url.js +83 -0
  133. package/dist/plugins/dynamic-preload-metadata.d.ts +13 -0
  134. package/dist/plugins/dynamic-preload-metadata.js +413 -0
  135. package/dist/plugins/extensionless-dynamic-import.d.ts +6 -0
  136. package/dist/plugins/extensionless-dynamic-import.js +155 -0
  137. package/dist/plugins/fonts.d.ts +95 -0
  138. package/dist/plugins/fonts.js +711 -0
  139. package/dist/plugins/import-meta-url.d.ts +16 -0
  140. package/dist/plugins/import-meta-url.js +353 -0
  141. package/dist/plugins/instrumentation-client.d.ts +6 -0
  142. package/dist/plugins/instrumentation-client.js +27 -0
  143. package/dist/plugins/middleware-export-validation.d.ts +5 -0
  144. package/dist/plugins/middleware-export-validation.js +36 -0
  145. package/dist/plugins/middleware-server-only.d.ts +53 -0
  146. package/dist/plugins/middleware-server-only.js +90 -0
  147. package/dist/plugins/og-asset-ownership.d.ts +27 -0
  148. package/dist/plugins/og-asset-ownership.js +285 -0
  149. package/dist/plugins/og-assets.d.ts +50 -0
  150. package/dist/plugins/og-assets.js +229 -0
  151. package/dist/plugins/optimize-imports.d.ts +42 -0
  152. package/dist/plugins/optimize-imports.js +587 -0
  153. package/dist/plugins/postcss.d.ts +26 -0
  154. package/dist/plugins/postcss.js +96 -0
  155. package/dist/plugins/remove-console.d.ts +21 -0
  156. package/dist/plugins/remove-console.js +177 -0
  157. package/dist/plugins/require-context.d.ts +6 -0
  158. package/dist/plugins/require-context.js +185 -0
  159. package/dist/plugins/rsc-client-reference-loaders.d.ts +6 -0
  160. package/dist/plugins/rsc-client-reference-loaders.js +46 -0
  161. package/dist/plugins/rsc-client-shim-excludes.d.ts +6 -0
  162. package/dist/plugins/rsc-client-shim-excludes.js +35 -0
  163. package/dist/plugins/sass.d.ts +62 -0
  164. package/dist/plugins/sass.js +268 -0
  165. package/dist/plugins/server-externals-manifest.d.ts +26 -0
  166. package/dist/plugins/server-externals-manifest.js +81 -0
  167. package/dist/plugins/strip-server-exports.d.ts +21 -0
  168. package/dist/plugins/strip-server-exports.js +519 -0
  169. package/dist/plugins/typeof-window.d.ts +14 -0
  170. package/dist/plugins/typeof-window.js +150 -0
  171. package/dist/plugins/wasm-module-import.d.ts +15 -0
  172. package/dist/plugins/wasm-module-import.js +50 -0
  173. package/dist/routing/app-route-graph.d.ts +336 -0
  174. package/dist/routing/app-route-graph.js +1518 -0
  175. package/dist/routing/app-router.d.ts +30 -0
  176. package/dist/routing/app-router.js +59 -0
  177. package/dist/routing/file-matcher.d.ts +60 -0
  178. package/dist/routing/file-matcher.js +147 -0
  179. package/dist/routing/pages-router.d.ts +48 -0
  180. package/dist/routing/pages-router.js +163 -0
  181. package/dist/routing/route-matching.d.ts +27 -0
  182. package/dist/routing/route-matching.js +42 -0
  183. package/dist/routing/route-pattern.d.ts +64 -0
  184. package/dist/routing/route-pattern.js +165 -0
  185. package/dist/routing/route-trie.d.ts +67 -0
  186. package/dist/routing/route-trie.js +143 -0
  187. package/dist/routing/route-validation.d.ts +10 -0
  188. package/dist/routing/route-validation.js +101 -0
  189. package/dist/routing/utils.d.ts +117 -0
  190. package/dist/routing/utils.js +242 -0
  191. package/dist/server/accept-encoding.d.ts +29 -0
  192. package/dist/server/accept-encoding.js +95 -0
  193. package/dist/server/api-handler.d.ts +17 -0
  194. package/dist/server/api-handler.js +276 -0
  195. package/dist/server/app-action-request.d.ts +4 -0
  196. package/dist/server/app-action-request.js +9 -0
  197. package/dist/server/app-bfcache-id.d.ts +5 -0
  198. package/dist/server/app-bfcache-id.js +5 -0
  199. package/dist/server/app-bfcache-identity.d.ts +36 -0
  200. package/dist/server/app-bfcache-identity.js +156 -0
  201. package/dist/server/app-browser-action-result.d.ts +64 -0
  202. package/dist/server/app-browser-action-result.js +111 -0
  203. package/dist/server/app-browser-client-reuse-manifest.d.ts +12 -0
  204. package/dist/server/app-browser-client-reuse-manifest.js +101 -0
  205. package/dist/server/app-browser-entry.d.ts +1 -0
  206. package/dist/server/app-browser-entry.js +1087 -0
  207. package/dist/server/app-browser-error.d.ts +13 -0
  208. package/dist/server/app-browser-error.js +52 -0
  209. package/dist/server/app-browser-history-controller.d.ts +104 -0
  210. package/dist/server/app-browser-history-controller.js +210 -0
  211. package/dist/server/app-browser-hydration.d.ts +32 -0
  212. package/dist/server/app-browser-hydration.js +29 -0
  213. package/dist/server/app-browser-interception-context.d.ts +24 -0
  214. package/dist/server/app-browser-interception-context.js +43 -0
  215. package/dist/server/app-browser-mpa-navigation.d.ts +16 -0
  216. package/dist/server/app-browser-mpa-navigation.js +42 -0
  217. package/dist/server/app-browser-navigation-controller.d.ts +109 -0
  218. package/dist/server/app-browser-navigation-controller.js +465 -0
  219. package/dist/server/app-browser-popstate.d.ts +26 -0
  220. package/dist/server/app-browser-popstate.js +44 -0
  221. package/dist/server/app-browser-rsc-redirect.d.ts +38 -0
  222. package/dist/server/app-browser-rsc-redirect.js +64 -0
  223. package/dist/server/app-browser-server-action-client.d.ts +32 -0
  224. package/dist/server/app-browser-server-action-client.js +128 -0
  225. package/dist/server/app-browser-server-action-navigation.d.ts +6 -0
  226. package/dist/server/app-browser-server-action-navigation.js +9 -0
  227. package/dist/server/app-browser-state.d.ts +140 -0
  228. package/dist/server/app-browser-state.js +315 -0
  229. package/dist/server/app-browser-stream.d.ts +28 -0
  230. package/dist/server/app-browser-stream.js +122 -0
  231. package/dist/server/app-browser-visible-commit.d.ts +78 -0
  232. package/dist/server/app-browser-visible-commit.js +241 -0
  233. package/dist/server/app-client-reference-preloader.d.ts +14 -0
  234. package/dist/server/app-client-reference-preloader.js +44 -0
  235. package/dist/server/app-elements-wire.d.ts +192 -0
  236. package/dist/server/app-elements-wire.js +443 -0
  237. package/dist/server/app-elements.d.ts +9 -0
  238. package/dist/server/app-elements.js +18 -0
  239. package/dist/server/app-fallback-renderer.d.ts +89 -0
  240. package/dist/server/app-fallback-renderer.js +136 -0
  241. package/dist/server/app-history-state.d.ts +85 -0
  242. package/dist/server/app-history-state.js +223 -0
  243. package/dist/server/app-hook-warning-suppression.d.ts +6 -0
  244. package/dist/server/app-hook-warning-suppression.js +10 -0
  245. package/dist/server/app-inline-css-client.d.ts +6 -0
  246. package/dist/server/app-inline-css-client.js +35 -0
  247. package/dist/server/app-interception-context-header.d.ts +32 -0
  248. package/dist/server/app-interception-context-header.js +42 -0
  249. package/dist/server/app-layout-param-observation.d.ts +43 -0
  250. package/dist/server/app-layout-param-observation.js +168 -0
  251. package/dist/server/app-middleware.d.ts +46 -0
  252. package/dist/server/app-middleware.js +168 -0
  253. package/dist/server/app-mounted-slots-header.d.ts +35 -0
  254. package/dist/server/app-mounted-slots-header.js +58 -0
  255. package/dist/server/app-optimistic-routing.d.ts +53 -0
  256. package/dist/server/app-optimistic-routing.js +227 -0
  257. package/dist/server/app-page-boundary-render.d.ts +85 -0
  258. package/dist/server/app-page-boundary-render.js +305 -0
  259. package/dist/server/app-page-boundary.d.ts +102 -0
  260. package/dist/server/app-page-boundary.js +120 -0
  261. package/dist/server/app-page-cache-finalizer.d.ts +62 -0
  262. package/dist/server/app-page-cache-finalizer.js +122 -0
  263. package/dist/server/app-page-cache-render.d.ts +53 -0
  264. package/dist/server/app-page-cache-render.js +91 -0
  265. package/dist/server/app-page-cache.d.ts +83 -0
  266. package/dist/server/app-page-cache.js +272 -0
  267. package/dist/server/app-page-dispatch.d.ts +223 -0
  268. package/dist/server/app-page-dispatch.js +610 -0
  269. package/dist/server/app-page-element-builder.d.ts +96 -0
  270. package/dist/server/app-page-element-builder.js +205 -0
  271. package/dist/server/app-page-execution.d.ts +138 -0
  272. package/dist/server/app-page-execution.js +328 -0
  273. package/dist/server/app-page-head.d.ts +65 -0
  274. package/dist/server/app-page-head.js +228 -0
  275. package/dist/server/app-page-method.d.ts +15 -0
  276. package/dist/server/app-page-method.js +25 -0
  277. package/dist/server/app-page-params.d.ts +8 -0
  278. package/dist/server/app-page-params.js +39 -0
  279. package/dist/server/app-page-ppr-runtime.d.ts +7 -0
  280. package/dist/server/app-page-ppr-runtime.js +70 -0
  281. package/dist/server/app-page-probe.d.ts +134 -0
  282. package/dist/server/app-page-probe.js +276 -0
  283. package/dist/server/app-page-render-identity.d.ts +21 -0
  284. package/dist/server/app-page-render-identity.js +40 -0
  285. package/dist/server/app-page-render-observation.d.ts +36 -0
  286. package/dist/server/app-page-render-observation.js +82 -0
  287. package/dist/server/app-page-render.d.ts +111 -0
  288. package/dist/server/app-page-render.js +602 -0
  289. package/dist/server/app-page-request.d.ts +137 -0
  290. package/dist/server/app-page-request.js +216 -0
  291. package/dist/server/app-page-response.d.ts +68 -0
  292. package/dist/server/app-page-response.js +120 -0
  293. package/dist/server/app-page-route-wiring.d.ts +151 -0
  294. package/dist/server/app-page-route-wiring.js +452 -0
  295. package/dist/server/app-page-search-params-observation.d.ts +10 -0
  296. package/dist/server/app-page-search-params-observation.js +20 -0
  297. package/dist/server/app-page-segment-state.d.ts +9 -0
  298. package/dist/server/app-page-segment-state.js +80 -0
  299. package/dist/server/app-page-stream.d.ts +151 -0
  300. package/dist/server/app-page-stream.js +143 -0
  301. package/dist/server/app-pages-bridge.d.ts +63 -0
  302. package/dist/server/app-pages-bridge.js +63 -0
  303. package/dist/server/app-post-middleware-context.d.ts +15 -0
  304. package/dist/server/app-post-middleware-context.js +26 -0
  305. package/dist/server/app-ppr-fallback-shell-render.d.ts +18 -0
  306. package/dist/server/app-ppr-fallback-shell-render.js +26 -0
  307. package/dist/server/app-ppr-fallback-shell.d.ts +33 -0
  308. package/dist/server/app-ppr-fallback-shell.js +89 -0
  309. package/dist/server/app-prerender-endpoints.d.ts +18 -0
  310. package/dist/server/app-prerender-endpoints.js +94 -0
  311. package/dist/server/app-prerender-static-params.d.ts +30 -0
  312. package/dist/server/app-prerender-static-params.js +81 -0
  313. package/dist/server/app-render-dependency.d.ts +14 -0
  314. package/dist/server/app-render-dependency.js +41 -0
  315. package/dist/server/app-request-context.d.ts +20 -0
  316. package/dist/server/app-request-context.js +29 -0
  317. package/dist/server/app-route-handler-cache.d.ts +46 -0
  318. package/dist/server/app-route-handler-cache.js +78 -0
  319. package/dist/server/app-route-handler-dispatch.d.ts +49 -0
  320. package/dist/server/app-route-handler-dispatch.js +163 -0
  321. package/dist/server/app-route-handler-execution.d.ts +86 -0
  322. package/dist/server/app-route-handler-execution.js +128 -0
  323. package/dist/server/app-route-handler-policy.d.ts +55 -0
  324. package/dist/server/app-route-handler-policy.js +58 -0
  325. package/dist/server/app-route-handler-response.d.ts +28 -0
  326. package/dist/server/app-route-handler-response.js +145 -0
  327. package/dist/server/app-route-handler-runtime.d.ts +39 -0
  328. package/dist/server/app-route-handler-runtime.js +250 -0
  329. package/dist/server/app-route-module-loader.d.ts +91 -0
  330. package/dist/server/app-route-module-loader.js +83 -0
  331. package/dist/server/app-router-entry.d.ts +13 -0
  332. package/dist/server/app-router-entry.js +49 -0
  333. package/dist/server/app-rsc-cache-busting.d.ts +64 -0
  334. package/dist/server/app-rsc-cache-busting.js +206 -0
  335. package/dist/server/app-rsc-embedded-chunks.d.ts +8 -0
  336. package/dist/server/app-rsc-embedded-chunks.js +32 -0
  337. package/dist/server/app-rsc-error-handler.d.ts +20 -0
  338. package/dist/server/app-rsc-error-handler.js +28 -0
  339. package/dist/server/app-rsc-errors.d.ts +40 -0
  340. package/dist/server/app-rsc-errors.js +60 -0
  341. package/dist/server/app-rsc-handler.d.ts +201 -0
  342. package/dist/server/app-rsc-handler.js +538 -0
  343. package/dist/server/app-rsc-render-mode.d.ts +11 -0
  344. package/dist/server/app-rsc-render-mode.js +25 -0
  345. package/dist/server/app-rsc-request-normalization.d.ts +48 -0
  346. package/dist/server/app-rsc-request-normalization.js +75 -0
  347. package/dist/server/app-rsc-response-finalizer.d.ts +37 -0
  348. package/dist/server/app-rsc-response-finalizer.js +54 -0
  349. package/dist/server/app-rsc-route-matching.d.ts +93 -0
  350. package/dist/server/app-rsc-route-matching.js +134 -0
  351. package/dist/server/app-segment-config.d.ts +46 -0
  352. package/dist/server/app-segment-config.js +113 -0
  353. package/dist/server/app-server-action-execution.d.ts +219 -0
  354. package/dist/server/app-server-action-execution.js +767 -0
  355. package/dist/server/app-ssr-entry.d.ts +52 -0
  356. package/dist/server/app-ssr-entry.js +295 -0
  357. package/dist/server/app-ssr-error-meta.d.ts +13 -0
  358. package/dist/server/app-ssr-error-meta.js +48 -0
  359. package/dist/server/app-ssr-router-instance.d.ts +6 -0
  360. package/dist/server/app-ssr-router-instance.js +24 -0
  361. package/dist/server/app-ssr-stream.d.ts +60 -0
  362. package/dist/server/app-ssr-stream.js +408 -0
  363. package/dist/server/app-static-generation.d.ts +15 -0
  364. package/dist/server/app-static-generation.js +19 -0
  365. package/dist/server/app-visited-response-cache.d.ts +23 -0
  366. package/dist/server/app-visited-response-cache.js +19 -0
  367. package/dist/server/artifact-compatibility.d.ts +54 -0
  368. package/dist/server/artifact-compatibility.js +91 -0
  369. package/dist/server/before-interactive-head.d.ts +17 -0
  370. package/dist/server/before-interactive-head.js +35 -0
  371. package/dist/server/cache-control.d.ts +37 -0
  372. package/dist/server/cache-control.js +56 -0
  373. package/dist/server/cache-headers.d.ts +6 -0
  374. package/dist/server/cache-headers.js +17 -0
  375. package/dist/server/cache-proof.d.ts +364 -0
  376. package/dist/server/cache-proof.js +794 -0
  377. package/dist/server/client-reuse-manifest.d.ts +104 -0
  378. package/dist/server/client-reuse-manifest.js +209 -0
  379. package/dist/server/client-trace-metadata.d.ts +30 -0
  380. package/dist/server/client-trace-metadata.js +81 -0
  381. package/dist/server/cookie-utils.d.ts +12 -0
  382. package/dist/server/cookie-utils.js +18 -0
  383. package/dist/server/csp.d.ts +10 -0
  384. package/dist/server/csp.js +41 -0
  385. package/dist/server/default-global-error-module.d.ts +19 -0
  386. package/dist/server/default-global-error-module.js +18 -0
  387. package/dist/server/default-not-found-module.d.ts +19 -0
  388. package/dist/server/default-not-found-module.js +18 -0
  389. package/dist/server/defer-until-stream-consumed.d.ts +7 -0
  390. package/dist/server/defer-until-stream-consumed.js +34 -0
  391. package/dist/server/dev-error-overlay-store.d.ts +39 -0
  392. package/dist/server/dev-error-overlay-store.js +86 -0
  393. package/dist/server/dev-error-overlay.d.ts +51 -0
  394. package/dist/server/dev-error-overlay.js +1341 -0
  395. package/dist/server/dev-initial-server-error.d.ts +9 -0
  396. package/dist/server/dev-initial-server-error.js +26 -0
  397. package/dist/server/dev-lockfile.d.ts +109 -0
  398. package/dist/server/dev-lockfile.js +179 -0
  399. package/dist/server/dev-module-runner.d.ts +30 -0
  400. package/dist/server/dev-module-runner.js +91 -0
  401. package/dist/server/dev-origin-check.d.ts +62 -0
  402. package/dist/server/dev-origin-check.js +156 -0
  403. package/dist/server/dev-route-files.d.ts +6 -0
  404. package/dist/server/dev-route-files.js +71 -0
  405. package/dist/server/dev-server.d.ts +58 -0
  406. package/dist/server/dev-server.js +1114 -0
  407. package/dist/server/dev-stack-sourcemap-endpoint.d.ts +4 -0
  408. package/dist/server/dev-stack-sourcemap-endpoint.js +4 -0
  409. package/dist/server/dev-stack-sourcemap.d.ts +43 -0
  410. package/dist/server/dev-stack-sourcemap.js +443 -0
  411. package/dist/server/document-initial-head.d.ts +6 -0
  412. package/dist/server/document-initial-head.js +33 -0
  413. package/dist/server/edge-api-runtime.d.ts +4 -0
  414. package/dist/server/edge-api-runtime.js +6 -0
  415. package/dist/server/file-based-metadata.d.ts +29 -0
  416. package/dist/server/file-based-metadata.js +401 -0
  417. package/dist/server/headers.d.ts +114 -0
  418. package/dist/server/headers.js +136 -0
  419. package/dist/server/html.d.ts +28 -0
  420. package/dist/server/html.js +41 -0
  421. package/dist/server/http-error-responses.d.ts +91 -0
  422. package/dist/server/http-error-responses.js +105 -0
  423. package/dist/server/hybrid-route-priority.d.ts +22 -0
  424. package/dist/server/hybrid-route-priority.js +33 -0
  425. package/dist/server/image-optimization.d.ts +130 -0
  426. package/dist/server/image-optimization.js +247 -0
  427. package/dist/server/implicit-tags.d.ts +6 -0
  428. package/dist/server/implicit-tags.js +44 -0
  429. package/dist/server/instrumentation-runtime.d.ts +49 -0
  430. package/dist/server/instrumentation-runtime.js +35 -0
  431. package/dist/server/instrumentation.d.ts +85 -0
  432. package/dist/server/instrumentation.js +130 -0
  433. package/dist/server/isr-cache.d.ts +127 -0
  434. package/dist/server/isr-cache.js +282 -0
  435. package/dist/server/isr-decision.d.ts +79 -0
  436. package/dist/server/isr-decision.js +70 -0
  437. package/dist/server/metadata-route-build-data.d.ts +24 -0
  438. package/dist/server/metadata-route-build-data.js +148 -0
  439. package/dist/server/metadata-route-response.d.ts +16 -0
  440. package/dist/server/metadata-route-response.js +205 -0
  441. package/dist/server/metadata-routes.d.ts +139 -0
  442. package/dist/server/metadata-routes.js +433 -0
  443. package/dist/server/middleware-matcher.d.ts +14 -0
  444. package/dist/server/middleware-matcher.js +111 -0
  445. package/dist/server/middleware-request-headers.d.ts +11 -0
  446. package/dist/server/middleware-request-headers.js +65 -0
  447. package/dist/server/middleware-response-headers.d.ts +12 -0
  448. package/dist/server/middleware-response-headers.js +42 -0
  449. package/dist/server/middleware-runtime.d.ts +67 -0
  450. package/dist/server/middleware-runtime.js +240 -0
  451. package/dist/server/middleware.d.ts +62 -0
  452. package/dist/server/middleware.js +114 -0
  453. package/dist/server/navigation-planner.d.ts +308 -0
  454. package/dist/server/navigation-planner.js +831 -0
  455. package/dist/server/navigation-trace.d.ts +68 -0
  456. package/dist/server/navigation-trace.js +71 -0
  457. package/dist/server/next-error-digest.d.ts +44 -0
  458. package/dist/server/next-error-digest.js +40 -0
  459. package/dist/server/normalize-path.d.ts +38 -0
  460. package/dist/server/normalize-path.js +70 -0
  461. package/dist/server/open-redirect.d.ts +12 -0
  462. package/dist/server/open-redirect.js +21 -0
  463. package/dist/server/operation-token.d.ts +40 -0
  464. package/dist/server/operation-token.js +85 -0
  465. package/dist/server/otel-tracer-extension.d.ts +45 -0
  466. package/dist/server/otel-tracer-extension.js +89 -0
  467. package/dist/server/pages-api-route.d.ts +83 -0
  468. package/dist/server/pages-api-route.js +75 -0
  469. package/dist/server/pages-asset-tags.d.ts +78 -0
  470. package/dist/server/pages-asset-tags.js +126 -0
  471. package/dist/server/pages-body-parser-config.d.ts +59 -0
  472. package/dist/server/pages-body-parser-config.js +77 -0
  473. package/dist/server/pages-data-route.d.ts +121 -0
  474. package/dist/server/pages-data-route.js +157 -0
  475. package/dist/server/pages-default-404.d.ts +30 -0
  476. package/dist/server/pages-default-404.js +38 -0
  477. package/dist/server/pages-dev-module-url.d.ts +4 -0
  478. package/dist/server/pages-dev-module-url.js +15 -0
  479. package/dist/server/pages-document-initial-props.d.ts +77 -0
  480. package/dist/server/pages-document-initial-props.js +109 -0
  481. package/dist/server/pages-get-initial-props.d.ts +67 -0
  482. package/dist/server/pages-get-initial-props.js +92 -0
  483. package/dist/server/pages-i18n.d.ts +106 -0
  484. package/dist/server/pages-i18n.js +183 -0
  485. package/dist/server/pages-media-type.d.ts +15 -0
  486. package/dist/server/pages-media-type.js +24 -0
  487. package/dist/server/pages-node-compat.d.ts +55 -0
  488. package/dist/server/pages-node-compat.js +235 -0
  489. package/dist/server/pages-page-data.d.ts +223 -0
  490. package/dist/server/pages-page-data.js +484 -0
  491. package/dist/server/pages-page-handler.d.ts +100 -0
  492. package/dist/server/pages-page-handler.js +403 -0
  493. package/dist/server/pages-page-method.d.ts +47 -0
  494. package/dist/server/pages-page-method.js +17 -0
  495. package/dist/server/pages-page-response.d.ts +138 -0
  496. package/dist/server/pages-page-response.js +285 -0
  497. package/dist/server/pages-readiness.d.ts +36 -0
  498. package/dist/server/pages-readiness.js +21 -0
  499. package/dist/server/pages-request-pipeline.d.ts +116 -0
  500. package/dist/server/pages-request-pipeline.js +311 -0
  501. package/dist/server/pages-revalidate.d.ts +15 -0
  502. package/dist/server/pages-revalidate.js +19 -0
  503. package/dist/server/pages-serializable-props.d.ts +24 -0
  504. package/dist/server/pages-serializable-props.js +67 -0
  505. package/dist/server/pregenerated-concrete-paths.d.ts +16 -0
  506. package/dist/server/pregenerated-concrete-paths.js +61 -0
  507. package/dist/server/prerender-manifest.d.ts +33 -0
  508. package/dist/server/prerender-manifest.js +54 -0
  509. package/dist/server/prerender-route-params.d.ts +23 -0
  510. package/dist/server/prerender-route-params.js +113 -0
  511. package/dist/server/prerender-work-unit-setup.d.ts +6 -0
  512. package/dist/server/prerender-work-unit-setup.js +28 -0
  513. package/dist/server/prod-server.d.ts +148 -0
  514. package/dist/server/prod-server.js +1136 -0
  515. package/dist/server/proxy-trust.d.ts +40 -0
  516. package/dist/server/proxy-trust.js +68 -0
  517. package/dist/server/request-log.d.ts +39 -0
  518. package/dist/server/request-log.js +56 -0
  519. package/dist/server/request-pipeline.d.ts +187 -0
  520. package/dist/server/request-pipeline.js +447 -0
  521. package/dist/server/rsc-stream-hints.d.ts +10 -0
  522. package/dist/server/rsc-stream-hints.js +41 -0
  523. package/dist/server/seed-cache.d.ts +29 -0
  524. package/dist/server/seed-cache.js +125 -0
  525. package/dist/server/server-action-not-found.d.ts +21 -0
  526. package/dist/server/server-action-not-found.js +62 -0
  527. package/dist/server/server-globals.d.ts +4 -0
  528. package/dist/server/server-globals.js +35 -0
  529. package/dist/server/skip-cache-proof.d.ts +61 -0
  530. package/dist/server/skip-cache-proof.js +168 -0
  531. package/dist/server/socket-error-backstop.d.ts +34 -0
  532. package/dist/server/socket-error-backstop.js +200 -0
  533. package/dist/server/static-file-cache.d.ts +56 -0
  534. package/dist/server/static-file-cache.js +231 -0
  535. package/dist/server/static-layout-client-reuse-proof.d.ts +15 -0
  536. package/dist/server/static-layout-client-reuse-proof.js +33 -0
  537. package/dist/server/streaming-metadata.d.ts +4 -0
  538. package/dist/server/streaming-metadata.js +8 -0
  539. package/dist/server/worker-utils.d.ts +7 -0
  540. package/dist/server/worker-utils.js +99 -0
  541. package/dist/shims/amp.d.ts +19 -0
  542. package/dist/shims/amp.js +23 -0
  543. package/dist/shims/app-router-scroll-state.d.ts +15 -0
  544. package/dist/shims/app-router-scroll-state.js +61 -0
  545. package/dist/shims/app-router-scroll.d.ts +29 -0
  546. package/dist/shims/app-router-scroll.js +141 -0
  547. package/dist/shims/app.d.ts +42 -0
  548. package/dist/shims/app.js +48 -0
  549. package/dist/shims/before-interactive-context.d.ts +40 -0
  550. package/dist/shims/before-interactive-context.js +8 -0
  551. package/dist/shims/cache-for-request.d.ts +57 -0
  552. package/dist/shims/cache-for-request.js +72 -0
  553. package/dist/shims/cache-handler.d.ts +106 -0
  554. package/dist/shims/cache-handler.js +176 -0
  555. package/dist/shims/cache-request-state.d.ts +47 -0
  556. package/dist/shims/cache-request-state.js +126 -0
  557. package/dist/shims/cache-runtime.d.ts +83 -0
  558. package/dist/shims/cache-runtime.js +452 -0
  559. package/dist/shims/cache.d.ts +145 -0
  560. package/dist/shims/cache.js +401 -0
  561. package/dist/shims/cdn-cache.d.ts +125 -0
  562. package/dist/shims/cdn-cache.js +100 -0
  563. package/dist/shims/client-hook-error.d.ts +13 -0
  564. package/dist/shims/client-hook-error.js +17 -0
  565. package/dist/shims/client-locale.d.ts +14 -0
  566. package/dist/shims/client-locale.js +11 -0
  567. package/dist/shims/client-only.d.ts +1 -0
  568. package/dist/shims/client-only.js +1 -0
  569. package/dist/shims/compat-router.d.ts +16 -0
  570. package/dist/shims/compat-router.js +25 -0
  571. package/dist/shims/config.d.ts +28 -0
  572. package/dist/shims/config.js +21 -0
  573. package/dist/shims/constants.d.ts +130 -0
  574. package/dist/shims/constants.js +167 -0
  575. package/dist/shims/default-global-error.d.ts +31 -0
  576. package/dist/shims/default-global-error.js +179 -0
  577. package/dist/shims/default-not-found.d.ts +11 -0
  578. package/dist/shims/default-not-found.js +59 -0
  579. package/dist/shims/document.d.ts +92 -0
  580. package/dist/shims/document.js +76 -0
  581. package/dist/shims/dynamic-preload-chunks.d.ts +8 -0
  582. package/dist/shims/dynamic-preload-chunks.js +79 -0
  583. package/dist/shims/dynamic.d.ts +35 -0
  584. package/dist/shims/dynamic.js +204 -0
  585. package/dist/shims/error-boundary-navigation.d.ts +7 -0
  586. package/dist/shims/error-boundary-navigation.js +44 -0
  587. package/dist/shims/error-boundary.d.ts +155 -0
  588. package/dist/shims/error-boundary.js +342 -0
  589. package/dist/shims/error.d.ts +31 -0
  590. package/dist/shims/error.js +123 -0
  591. package/dist/shims/error.react-server.d.ts +9 -0
  592. package/dist/shims/error.react-server.js +6 -0
  593. package/dist/shims/fetch-cache.d.ts +136 -0
  594. package/dist/shims/fetch-cache.js +766 -0
  595. package/dist/shims/font-google-base.d.ts +83 -0
  596. package/dist/shims/font-google-base.js +290 -0
  597. package/dist/shims/font-google.d.ts +2 -0
  598. package/dist/shims/font-google.js +2 -0
  599. package/dist/shims/font-local.d.ts +50 -0
  600. package/dist/shims/font-local.js +195 -0
  601. package/dist/shims/font-utils.d.ts +56 -0
  602. package/dist/shims/font-utils.js +107 -0
  603. package/dist/shims/form.d.ts +19 -0
  604. package/dist/shims/form.js +236 -0
  605. package/dist/shims/hash-scroll.d.ts +10 -0
  606. package/dist/shims/hash-scroll.js +47 -0
  607. package/dist/shims/head-state.d.ts +16 -0
  608. package/dist/shims/head-state.js +43 -0
  609. package/dist/shims/head.d.ts +73 -0
  610. package/dist/shims/head.js +340 -0
  611. package/dist/shims/headers.d.ts +253 -0
  612. package/dist/shims/headers.js +754 -0
  613. package/dist/shims/i18n-context.d.ts +22 -0
  614. package/dist/shims/i18n-context.js +42 -0
  615. package/dist/shims/i18n-state.d.ts +14 -0
  616. package/dist/shims/i18n-state.js +38 -0
  617. package/dist/shims/image-config.d.ts +45 -0
  618. package/dist/shims/image-config.js +85 -0
  619. package/dist/shims/image.d.ts +55 -0
  620. package/dist/shims/image.js +582 -0
  621. package/dist/shims/internal/als-registry.d.ts +14 -0
  622. package/dist/shims/internal/als-registry.js +80 -0
  623. package/dist/shims/internal/api-utils.d.ts +14 -0
  624. package/dist/shims/internal/api-utils.js +1 -0
  625. package/dist/shims/internal/app-page-props-cache-key.d.ts +5 -0
  626. package/dist/shims/internal/app-page-props-cache-key.js +16 -0
  627. package/dist/shims/internal/app-route-detection.d.ts +39 -0
  628. package/dist/shims/internal/app-route-detection.js +62 -0
  629. package/dist/shims/internal/app-router-context.d.ts +31 -0
  630. package/dist/shims/internal/app-router-context.js +28 -0
  631. package/dist/shims/internal/cookie-serialize.d.ts +45 -0
  632. package/dist/shims/internal/cookie-serialize.js +49 -0
  633. package/dist/shims/internal/cookies.d.ts +2 -0
  634. package/dist/shims/internal/cookies.js +2 -0
  635. package/dist/shims/internal/hybrid-client-route-owner.d.ts +31 -0
  636. package/dist/shims/internal/hybrid-client-route-owner.js +143 -0
  637. package/dist/shims/internal/interpolate-as.d.ts +25 -0
  638. package/dist/shims/internal/interpolate-as.js +196 -0
  639. package/dist/shims/internal/link-status-registry.d.ts +43 -0
  640. package/dist/shims/internal/link-status-registry.js +42 -0
  641. package/dist/shims/internal/make-hanging-promise.d.ts +15 -0
  642. package/dist/shims/internal/make-hanging-promise.js +44 -0
  643. package/dist/shims/internal/navigation-untracked.d.ts +35 -0
  644. package/dist/shims/internal/navigation-untracked.js +56 -0
  645. package/dist/shims/internal/pages-data-fetch-dedup.d.ts +54 -0
  646. package/dist/shims/internal/pages-data-fetch-dedup.js +121 -0
  647. package/dist/shims/internal/pages-data-target.d.ts +62 -0
  648. package/dist/shims/internal/pages-data-target.js +98 -0
  649. package/dist/shims/internal/pages-data-url.d.ts +41 -0
  650. package/dist/shims/internal/pages-data-url.js +71 -0
  651. package/dist/shims/internal/pages-router-accessor.d.ts +19 -0
  652. package/dist/shims/internal/pages-router-accessor.js +13 -0
  653. package/dist/shims/internal/route-pattern-for-warning.d.ts +27 -0
  654. package/dist/shims/internal/route-pattern-for-warning.js +40 -0
  655. package/dist/shims/internal/router-context.d.ts +7 -0
  656. package/dist/shims/internal/router-context.js +13 -0
  657. package/dist/shims/internal/utils.d.ts +52 -0
  658. package/dist/shims/internal/utils.js +27 -0
  659. package/dist/shims/internal/work-unit-async-storage.d.ts +30 -0
  660. package/dist/shims/internal/work-unit-async-storage.js +17 -0
  661. package/dist/shims/layout-segment-context.d.ts +24 -0
  662. package/dist/shims/layout-segment-context.js +39 -0
  663. package/dist/shims/legacy-image.d.ts +41 -0
  664. package/dist/shims/legacy-image.js +49 -0
  665. package/dist/shims/link-prefetch.d.ts +41 -0
  666. package/dist/shims/link-prefetch.js +43 -0
  667. package/dist/shims/link.d.ts +102 -0
  668. package/dist/shims/link.js +687 -0
  669. package/dist/shims/metadata.d.ts +285 -0
  670. package/dist/shims/metadata.js +820 -0
  671. package/dist/shims/navigation-context-state.d.ts +40 -0
  672. package/dist/shims/navigation-context-state.js +116 -0
  673. package/dist/shims/navigation-errors.d.ts +55 -0
  674. package/dist/shims/navigation-errors.js +110 -0
  675. package/dist/shims/navigation-server.d.ts +3 -0
  676. package/dist/shims/navigation-server.js +3 -0
  677. package/dist/shims/navigation-state.d.ts +25 -0
  678. package/dist/shims/navigation-state.js +66 -0
  679. package/dist/shims/navigation.d.ts +286 -0
  680. package/dist/shims/navigation.js +1206 -0
  681. package/dist/shims/navigation.react-server.d.ts +14 -0
  682. package/dist/shims/navigation.react-server.js +32 -0
  683. package/dist/shims/offline.d.ts +4 -0
  684. package/dist/shims/offline.js +15 -0
  685. package/dist/shims/og.d.ts +17 -0
  686. package/dist/shims/og.js +48 -0
  687. package/dist/shims/pages-router-runtime.d.ts +12 -0
  688. package/dist/shims/pages-router-runtime.js +24 -0
  689. package/dist/shims/ppr-fallback-shell.d.ts +33 -0
  690. package/dist/shims/ppr-fallback-shell.js +170 -0
  691. package/dist/shims/readonly-url-search-params.d.ts +13 -0
  692. package/dist/shims/readonly-url-search-params.js +26 -0
  693. package/dist/shims/request-context.d.ts +58 -0
  694. package/dist/shims/request-context.js +45 -0
  695. package/dist/shims/request-state-types.d.ts +12 -0
  696. package/dist/shims/request-state-types.js +1 -0
  697. package/dist/shims/root-params.d.ts +12 -0
  698. package/dist/shims/root-params.js +30 -0
  699. package/dist/shims/router-state.d.ts +32 -0
  700. package/dist/shims/router-state.js +39 -0
  701. package/dist/shims/router.d.ts +192 -0
  702. package/dist/shims/router.js +1786 -0
  703. package/dist/shims/script-nonce-context.d.ts +11 -0
  704. package/dist/shims/script-nonce-context.js +23 -0
  705. package/dist/shims/script.d.ts +43 -0
  706. package/dist/shims/script.js +370 -0
  707. package/dist/shims/server-only.d.ts +1 -0
  708. package/dist/shims/server-only.js +1 -0
  709. package/dist/shims/server.d.ts +323 -0
  710. package/dist/shims/server.js +729 -0
  711. package/dist/shims/slot.d.ts +45 -0
  712. package/dist/shims/slot.js +230 -0
  713. package/dist/shims/thenable-params.d.ts +11 -0
  714. package/dist/shims/thenable-params.js +176 -0
  715. package/dist/shims/unified-request-context.d.ts +68 -0
  716. package/dist/shims/unified-request-context.js +86 -0
  717. package/dist/shims/unrecognized-action-error.d.ts +34 -0
  718. package/dist/shims/unrecognized-action-error.js +39 -0
  719. package/dist/shims/url-safety.d.ts +34 -0
  720. package/dist/shims/url-safety.js +70 -0
  721. package/dist/shims/url-utils.d.ts +51 -0
  722. package/dist/shims/url-utils.js +156 -0
  723. package/dist/shims/use-merged-ref.d.ts +6 -0
  724. package/dist/shims/use-merged-ref.js +38 -0
  725. package/dist/shims/web-vitals.d.ts +8 -0
  726. package/dist/shims/web-vitals.js +22 -0
  727. package/dist/typegen.d.ts +9 -0
  728. package/dist/typegen.js +228 -0
  729. package/dist/utils/asset-prefix.d.ts +96 -0
  730. package/dist/utils/asset-prefix.js +122 -0
  731. package/dist/utils/base-path.d.ts +31 -0
  732. package/dist/utils/base-path.js +45 -0
  733. package/dist/utils/built-asset-url.d.ts +4 -0
  734. package/dist/utils/built-asset-url.js +11 -0
  735. package/dist/utils/cache-control-metadata.d.ts +4 -0
  736. package/dist/utils/cache-control-metadata.js +12 -0
  737. package/dist/utils/client-build-manifest.d.ts +21 -0
  738. package/dist/utils/client-build-manifest.js +87 -0
  739. package/dist/utils/client-entry-manifest.d.ts +11 -0
  740. package/dist/utils/client-entry-manifest.js +29 -0
  741. package/dist/utils/client-runtime-metadata.d.ts +45 -0
  742. package/dist/utils/client-runtime-metadata.js +63 -0
  743. package/dist/utils/commonjs-loader.d.ts +16 -0
  744. package/dist/utils/commonjs-loader.js +100 -0
  745. package/dist/utils/compare.d.ts +4 -0
  746. package/dist/utils/compare.js +8 -0
  747. package/dist/utils/deployment-id.d.ts +8 -0
  748. package/dist/utils/deployment-id.js +22 -0
  749. package/dist/utils/dev-error-recovery-event.d.ts +4 -0
  750. package/dist/utils/dev-error-recovery-event.js +4 -0
  751. package/dist/utils/domain-locale.d.ts +26 -0
  752. package/dist/utils/domain-locale.js +50 -0
  753. package/dist/utils/encode-cache-tag.d.ts +30 -0
  754. package/dist/utils/encode-cache-tag.js +36 -0
  755. package/dist/utils/error-cause.d.ts +4 -0
  756. package/dist/utils/error-cause.js +95 -0
  757. package/dist/utils/has-trailing-comma.d.ts +24 -0
  758. package/dist/utils/has-trailing-comma.js +62 -0
  759. package/dist/utils/hash.d.ts +24 -0
  760. package/dist/utils/hash.js +55 -0
  761. package/dist/utils/html-limited-bots.d.ts +21 -0
  762. package/dist/utils/html-limited-bots.js +35 -0
  763. package/dist/utils/lazy-chunks.d.ts +59 -0
  764. package/dist/utils/lazy-chunks.js +112 -0
  765. package/dist/utils/manifest-paths.d.ts +30 -0
  766. package/dist/utils/manifest-paths.js +66 -0
  767. package/dist/utils/mdx-scan.d.ts +9 -0
  768. package/dist/utils/mdx-scan.js +34 -0
  769. package/dist/utils/navigation-signal.d.ts +4 -0
  770. package/dist/utils/navigation-signal.js +12 -0
  771. package/dist/utils/number.d.ts +4 -0
  772. package/dist/utils/number.js +6 -0
  773. package/dist/utils/parse-cookie.d.ts +13 -0
  774. package/dist/utils/parse-cookie.js +52 -0
  775. package/dist/utils/path.d.ts +22 -0
  776. package/dist/utils/path.js +30 -0
  777. package/dist/utils/prerender-output-paths.d.ts +14 -0
  778. package/dist/utils/prerender-output-paths.js +22 -0
  779. package/dist/utils/project.d.ts +76 -0
  780. package/dist/utils/project.js +213 -0
  781. package/dist/utils/promise.d.ts +4 -0
  782. package/dist/utils/promise.js +6 -0
  783. package/dist/utils/public-routes.d.ts +4 -0
  784. package/dist/utils/public-routes.js +48 -0
  785. package/dist/utils/query.d.ts +49 -0
  786. package/dist/utils/query.js +122 -0
  787. package/dist/utils/record.d.ts +4 -0
  788. package/dist/utils/record.js +6 -0
  789. package/dist/utils/regex.d.ts +4 -0
  790. package/dist/utils/regex.js +6 -0
  791. package/dist/utils/safe-json-file.d.ts +17 -0
  792. package/dist/utils/safe-json-file.js +23 -0
  793. package/dist/utils/sorted-array.d.ts +8 -0
  794. package/dist/utils/sorted-array.js +20 -0
  795. package/dist/utils/text-stream.d.ts +28 -0
  796. package/dist/utils/text-stream.js +64 -0
  797. package/dist/utils/vinext-root.d.ts +23 -0
  798. package/dist/utils/vinext-root.js +29 -0
  799. package/dist/utils/virtual-module.d.ts +5 -0
  800. package/dist/utils/virtual-module.js +0 -0
  801. package/dist/utils/vite-version.d.ts +21 -0
  802. package/dist/utils/vite-version.js +42 -0
  803. package/package.json +145 -0
@@ -0,0 +1,1518 @@
1
+ import { normalizePathSeparators } from "../utils/path.js";
2
+ import { decodeRouteSegment, isInvisibleSegment, sortRoutes } from "./utils.js";
3
+ import { findFileWithExts, scanWithExtensions } from "./file-matcher.js";
4
+ import { validateRoutePatterns } from "./route-validation.js";
5
+ import { compareStrings } from "../utils/compare.js";
6
+ import fs from "node:fs";
7
+ import path from "node:path";
8
+ import { createHash } from "node:crypto";
9
+ //#region src/routing/app-route-graph.ts
10
+ /**
11
+ * App Router route graph construction.
12
+ *
13
+ * Scans app/ directories and materializes route metadata before the request-time
14
+ * matcher consumes it. Keep request matching and cache ownership in app-router.ts.
15
+ */
16
+ function createAppRouteGraphRouteId(pattern) {
17
+ return `route:${pattern}`;
18
+ }
19
+ function createAppRouteGraphPageId(pattern) {
20
+ return `page:${pattern}`;
21
+ }
22
+ function createAppRouteGraphRouteHandlerId(pattern) {
23
+ return `route-handler:${pattern}`;
24
+ }
25
+ function createAppRouteGraphLayoutId(treePath) {
26
+ return `layout:${treePath}`;
27
+ }
28
+ function createAppRouteGraphTemplateId(treePath) {
29
+ return `template:${treePath}`;
30
+ }
31
+ function createAppRouteGraphSlotId(slotName, ownerTreePath) {
32
+ return `slot:${slotName}:${ownerTreePath}`;
33
+ }
34
+ function createAppRouteGraphDefaultId(slotId) {
35
+ return `default:${slotId}`;
36
+ }
37
+ const SIBLING_INTERCEPT_SLOT_NAME = "__vinext_sibling_intercept";
38
+ function createAppRouteGraphSiblingInterceptSlotId(sourcePattern) {
39
+ return createAppRouteGraphSlotId(SIBLING_INTERCEPT_SLOT_NAME, sourcePattern);
40
+ }
41
+ function createAppRouteGraphInterceptionId(slotId, sourcePattern, targetPattern) {
42
+ return `interception:${slotId}:${sourcePattern}->${targetPattern}`;
43
+ }
44
+ function createAppRouteGraphRootBoundaryId(treePath) {
45
+ return `root-boundary:${treePath}`;
46
+ }
47
+ const compareStableStrings = compareStrings;
48
+ function sortedMapValues(map) {
49
+ return Array.from(map.entries()).sort(([left], [right]) => compareStableStrings(left, right)).map(([, value]) => value);
50
+ }
51
+ function createRouteManifest(routes) {
52
+ const segmentGraph = createStaticSegmentGraph(routes);
53
+ return {
54
+ graphVersion: createRouteManifestGraphVersion(segmentGraph),
55
+ segmentGraph
56
+ };
57
+ }
58
+ function createStaticSegmentGraph(routes) {
59
+ const routeEntries = /* @__PURE__ */ new Map();
60
+ const pages = /* @__PURE__ */ new Map();
61
+ const routeHandlers = /* @__PURE__ */ new Map();
62
+ const layouts = /* @__PURE__ */ new Map();
63
+ const templates = /* @__PURE__ */ new Map();
64
+ const slots = /* @__PURE__ */ new Map();
65
+ const defaults = /* @__PURE__ */ new Map();
66
+ const slotBindings = /* @__PURE__ */ new Map();
67
+ const interceptions = /* @__PURE__ */ new Map();
68
+ const boundaries = /* @__PURE__ */ new Map();
69
+ const rootBoundaries = /* @__PURE__ */ new Map();
70
+ const routeIdByPattern = createRouteManifestRouteIdByPattern(routes);
71
+ for (const route of routes) {
72
+ routeEntries.set(route.ids.route, {
73
+ id: route.ids.route,
74
+ pattern: route.pattern,
75
+ patternParts: [...route.patternParts],
76
+ isDynamic: route.isDynamic,
77
+ paramNames: [...route.params],
78
+ rootParamNames: [...route.rootParamNames],
79
+ rootBoundaryId: route.ids.rootBoundary,
80
+ pageId: route.ids.page,
81
+ routeHandlerId: route.ids.routeHandler,
82
+ layoutIds: [...route.ids.layouts],
83
+ templateIds: [...route.ids.templates],
84
+ slotIds: route.parallelSlots.map((slot) => slot.id).sort(compareStableStrings)
85
+ });
86
+ if (route.ids.page) pages.set(route.ids.page, {
87
+ id: route.ids.page,
88
+ routeId: route.ids.route,
89
+ pattern: route.pattern
90
+ });
91
+ if (route.ids.routeHandler) routeHandlers.set(route.ids.routeHandler, {
92
+ id: route.ids.routeHandler,
93
+ routeId: route.ids.route,
94
+ pattern: route.pattern
95
+ });
96
+ for (const [index, layoutId] of route.ids.layouts.entries()) {
97
+ const treePosition = route.layoutTreePositions[index];
98
+ assertRouteManifestTreePosition("layout", route, layoutId, treePosition);
99
+ const treePath = createAppRouteGraphTreePath(route.routeSegments, treePosition);
100
+ const existingLayout = layouts.get(layoutId);
101
+ if (existingLayout) assertRouteManifestRootBoundary("layout", route, layoutId, existingLayout.rootBoundaryId);
102
+ const layoutRouteParts = convertTreePathToRouteParts(treePath);
103
+ const layout = {
104
+ id: layoutId,
105
+ treePath,
106
+ patternParts: layoutRouteParts.urlSegments,
107
+ paramNames: layoutRouteParts.params,
108
+ rootBoundaryId: route.ids.rootBoundary
109
+ };
110
+ layouts.set(layoutId, layout);
111
+ addRouteManifestBoundaryFacts({
112
+ boundaries,
113
+ route,
114
+ layoutId,
115
+ treePath,
116
+ layoutIndex: index
117
+ });
118
+ if (index === 0 && route.ids.rootBoundary) rootBoundaries.set(route.ids.rootBoundary, {
119
+ id: route.ids.rootBoundary,
120
+ layoutId,
121
+ treePath
122
+ });
123
+ }
124
+ addRouteManifestSegmentErrorBoundaryFacts({
125
+ boundaries,
126
+ route
127
+ });
128
+ for (const [index, templateId] of route.ids.templates.entries()) {
129
+ const treePosition = route.templateTreePositions?.[index];
130
+ assertRouteManifestTreePosition("template", route, templateId, treePosition);
131
+ const treePath = createAppRouteGraphTreePath(route.routeSegments, treePosition);
132
+ const existingTemplate = templates.get(templateId);
133
+ if (existingTemplate) assertRouteManifestRootBoundary("template", route, templateId, existingTemplate.rootBoundaryId);
134
+ templates.set(templateId, {
135
+ id: templateId,
136
+ treePath,
137
+ rootBoundaryId: route.ids.rootBoundary,
138
+ ownerLayoutId: findRouteManifestOwnerLayoutId(route, treePosition),
139
+ reset: {
140
+ kind: "remountSubtree",
141
+ treePath
142
+ }
143
+ });
144
+ }
145
+ for (const slot of route.parallelSlots) {
146
+ const ownerLayoutId = findSlotOwnerLayoutId(route, slot);
147
+ const defaultId = slot.defaultPath ? createAppRouteGraphDefaultId(slot.id) : null;
148
+ if (slot.layoutPath) {
149
+ const slotLayoutTreePath = createSlotLayoutTreePath(slot);
150
+ const slotLayoutId = createAppRouteGraphLayoutId(slotLayoutTreePath);
151
+ const existingLayout = layouts.get(slotLayoutId);
152
+ if (existingLayout) assertRouteManifestRootBoundary("layout", route, slotLayoutId, existingLayout.rootBoundaryId);
153
+ const slotLayoutRouteParts = convertTreePathToRouteParts(slotLayoutTreePath);
154
+ layouts.set(slotLayoutId, {
155
+ id: slotLayoutId,
156
+ treePath: slotLayoutTreePath,
157
+ patternParts: slotLayoutRouteParts.urlSegments,
158
+ paramNames: slotLayoutRouteParts.params,
159
+ rootBoundaryId: route.ids.rootBoundary
160
+ });
161
+ }
162
+ slots.set(slot.id, {
163
+ id: slot.id,
164
+ key: slot.key,
165
+ name: slot.name,
166
+ ownerTreePath: slot.ownerTreePath,
167
+ ownerLayoutId,
168
+ rootBoundaryId: ownerLayoutId ? route.ids.rootBoundary : null,
169
+ defaultId,
170
+ hasDefault: slot.defaultPath !== null,
171
+ hasPage: slot.hasPage
172
+ });
173
+ if (defaultId) defaults.set(defaultId, {
174
+ id: defaultId,
175
+ slotId: slot.id,
176
+ ownerTreePath: slot.ownerTreePath,
177
+ ownerLayoutId,
178
+ rootBoundaryId: ownerLayoutId ? route.ids.rootBoundary : null
179
+ });
180
+ const binding = createRouteManifestSlotBinding(route, slot, ownerLayoutId, defaultId);
181
+ slotBindings.set(binding.id, binding);
182
+ addRouteManifestInterceptionFacts({
183
+ interceptions,
184
+ ownerLayoutId,
185
+ route,
186
+ routeIdByPattern,
187
+ slot
188
+ });
189
+ }
190
+ for (const ir of route.siblingIntercepts) {
191
+ if (!ir.slotId) continue;
192
+ const id = createAppRouteGraphInterceptionId(ir.slotId, ir.sourceMatchPattern, ir.targetPattern);
193
+ interceptions.set(id, {
194
+ id,
195
+ sourcePattern: ir.sourceMatchPattern,
196
+ sourcePatternParts: splitRouteManifestPatternParts(ir.sourceMatchPattern),
197
+ targetPattern: ir.targetPattern,
198
+ targetPatternParts: splitRouteManifestPatternParts(ir.targetPattern),
199
+ slotId: ir.slotId,
200
+ ownerLayoutId: null,
201
+ interceptingRouteId: routeIdByPattern.get(ir.sourceMatchPattern) ?? null,
202
+ targetRouteId: routeIdByPattern.get(ir.targetPattern) ?? null
203
+ });
204
+ }
205
+ }
206
+ return {
207
+ routes: routeEntries,
208
+ pages,
209
+ routeHandlers,
210
+ layouts,
211
+ templates,
212
+ slots,
213
+ defaults,
214
+ slotBindings,
215
+ interceptions,
216
+ interceptionsBySlotId: createRouteManifestInterceptionsBySlotId(interceptions),
217
+ boundaries,
218
+ rootBoundaries
219
+ };
220
+ }
221
+ function createRouteManifestRouteIdByPattern(routes) {
222
+ return new Map(routes.map((route) => [route.pattern, route.ids.route]));
223
+ }
224
+ function findRouteManifestOwnerLayoutId(route, treePosition) {
225
+ const layoutIndex = route.layoutTreePositions.indexOf(treePosition);
226
+ return route.ids.layouts[layoutIndex] ?? null;
227
+ }
228
+ function findSlotOwnerLayoutId(route, slot) {
229
+ if (slot.layoutIndex < 0) return null;
230
+ return route.ids.layouts[slot.layoutIndex] ?? null;
231
+ }
232
+ function createSlotLayoutTreePath(slot) {
233
+ const slotSegment = `@${slot.name}`;
234
+ if (slot.ownerTreePath === "/") return `/${slotSegment}`;
235
+ return `${slot.ownerTreePath}/${slotSegment}`;
236
+ }
237
+ function createRouteManifestSlotBinding(route, slot, ownerLayoutId, defaultId) {
238
+ const state = getRouteManifestSlotBindingState(slot);
239
+ const binding = {
240
+ id: `${route.ids.route}::${slot.id}`,
241
+ routeId: route.ids.route,
242
+ slotId: slot.id,
243
+ ownerLayoutId,
244
+ state,
245
+ defaultId: state === "default" ? defaultId : null,
246
+ routeSegments: slot.routeSegments ? [...slot.routeSegments] : null
247
+ };
248
+ if (slot.slotPatternParts) binding.slotPatternParts = [...slot.slotPatternParts];
249
+ if (slot.slotParamNames) binding.slotParamNames = [...slot.slotParamNames];
250
+ return binding;
251
+ }
252
+ function addRouteManifestInterceptionFacts(input) {
253
+ for (const interception of input.slot.interceptingRoutes) {
254
+ const id = createAppRouteGraphInterceptionId(input.slot.id, interception.sourceMatchPattern, interception.targetPattern);
255
+ input.interceptions.set(id, {
256
+ id,
257
+ sourcePattern: interception.sourceMatchPattern,
258
+ sourcePatternParts: splitRouteManifestPatternParts(interception.sourceMatchPattern),
259
+ targetPattern: interception.targetPattern,
260
+ targetPatternParts: splitRouteManifestPatternParts(interception.targetPattern),
261
+ slotId: input.slot.id,
262
+ ownerLayoutId: input.ownerLayoutId,
263
+ interceptingRouteId: input.routeIdByPattern.get(interception.sourceMatchPattern) ?? null,
264
+ targetRouteId: input.routeIdByPattern.get(interception.targetPattern) ?? null
265
+ });
266
+ }
267
+ }
268
+ function createRouteManifestInterceptionsBySlotId(interceptions) {
269
+ const interceptionsBySlotId = /* @__PURE__ */ new Map();
270
+ for (const interception of interceptions.values()) {
271
+ const existing = interceptionsBySlotId.get(interception.slotId);
272
+ if (existing) existing.push(interception);
273
+ else interceptionsBySlotId.set(interception.slotId, [interception]);
274
+ }
275
+ for (const slotInterceptions of interceptionsBySlotId.values()) slotInterceptions.sort((left, right) => compareStableStrings(left.id, right.id));
276
+ return new Map(Array.from(interceptionsBySlotId.entries()).sort(([left], [right]) => compareStableStrings(left, right)));
277
+ }
278
+ function splitRouteManifestPatternParts(pattern) {
279
+ return pattern.split("/").filter((part) => part.length > 0);
280
+ }
281
+ function getRouteManifestSlotBindingState(slot) {
282
+ if (slot.pagePath) return "active";
283
+ if (slot.defaultPath) return "default";
284
+ return "unmatched";
285
+ }
286
+ function addRouteManifestBoundaryFacts(input) {
287
+ addRouteManifestBoundaryFact(input, "error", input.route.layoutErrorPaths[input.layoutIndex]);
288
+ addRouteManifestBoundaryFact(input, "notFound", input.route.notFoundPaths[input.layoutIndex]);
289
+ addRouteManifestBoundaryFact(input, "forbidden", input.route.forbiddenPaths[input.layoutIndex]);
290
+ addRouteManifestBoundaryFact(input, "unauthorized", input.route.unauthorizedPaths[input.layoutIndex]);
291
+ }
292
+ function addRouteManifestSegmentErrorBoundaryFacts(input) {
293
+ for (const [index, boundaryPath] of (input.route.errorPaths ?? []).entries()) {
294
+ const treePosition = input.route.errorTreePositions?.[index];
295
+ assertRouteManifestBoundaryTreePosition(input.route, boundaryPath, treePosition);
296
+ const ownerLayoutId = findRouteManifestOwnerLayoutId(input.route, treePosition);
297
+ if (ownerLayoutId !== null) continue;
298
+ const treePath = createAppRouteGraphTreePath(input.route.routeSegments, treePosition);
299
+ addRouteManifestBoundaryFact({
300
+ boundaries: input.boundaries,
301
+ route: input.route,
302
+ layoutId: ownerLayoutId,
303
+ treePath
304
+ }, "error", boundaryPath);
305
+ }
306
+ }
307
+ function addRouteManifestBoundaryFact(input, outcome, boundaryPath) {
308
+ if (!boundaryPath) return;
309
+ const id = `boundary:${outcome}:${input.treePath}`;
310
+ input.boundaries.set(id, {
311
+ id,
312
+ outcome,
313
+ treePath: input.treePath,
314
+ ownerLayoutId: input.layoutId,
315
+ rootBoundaryId: input.route.ids.rootBoundary
316
+ });
317
+ }
318
+ function assertRouteManifestTreePosition(kind, route, id, treePosition) {
319
+ if (treePosition !== void 0) return;
320
+ throw new Error(`[vinext] App route graph invariant violated: missing ${kind} tree position for ${id} on ${route.pattern}`);
321
+ }
322
+ function assertRouteManifestBoundaryTreePosition(route, boundaryPath, treePosition) {
323
+ if (treePosition !== void 0) return;
324
+ throw new Error(`[vinext] App route graph invariant violated: missing boundary tree position for ${boundaryPath} on ${route.pattern}`);
325
+ }
326
+ function assertRouteManifestRootBoundary(kind, route, id, existingRootBoundaryId) {
327
+ if (existingRootBoundaryId === route.ids.rootBoundary) return;
328
+ throw new Error(`[vinext] App route graph invariant violated: ${kind} ${id} is shared across root boundaries (${existingRootBoundaryId ?? "none"} and ${route.ids.rootBoundary ?? "none"}) on ${route.pattern}`);
329
+ }
330
+ function createRouteManifestGraphVersion(segmentGraph) {
331
+ const stableShape = {
332
+ routes: sortedMapValues(segmentGraph.routes),
333
+ pages: sortedMapValues(segmentGraph.pages),
334
+ routeHandlers: sortedMapValues(segmentGraph.routeHandlers),
335
+ layouts: sortedMapValues(segmentGraph.layouts),
336
+ templates: sortedMapValues(segmentGraph.templates),
337
+ slots: sortedMapValues(segmentGraph.slots),
338
+ defaults: sortedMapValues(segmentGraph.defaults),
339
+ slotBindings: sortedMapValues(segmentGraph.slotBindings),
340
+ interceptions: sortedMapValues(segmentGraph.interceptions),
341
+ interceptionsBySlotId: sortedMapValues(segmentGraph.interceptionsBySlotId),
342
+ boundaries: sortedMapValues(segmentGraph.boundaries),
343
+ rootBoundaries: sortedMapValues(segmentGraph.rootBoundaries)
344
+ };
345
+ return `graph:${createHash("sha256").update(JSON.stringify(stableShape)).digest("hex")}`;
346
+ }
347
+ async function buildAppRouteGraph(appDir, matcher) {
348
+ const routes = [];
349
+ const scanMatcher = { ...matcher };
350
+ findFileProbeCache.set(scanMatcher, /* @__PURE__ */ new Map());
351
+ const excludeDir = (name) => name.startsWith("@") && name !== "@children" || name.startsWith("_") || isInterceptionMarkerDir(name);
352
+ for await (const file of scanWithExtensions("**/page", appDir, scanMatcher.extensions, excludeDir)) {
353
+ const route = fileToAppRoute(file, appDir, "page", scanMatcher);
354
+ if (route) routes.push(route);
355
+ }
356
+ for await (const file of scanWithExtensions("**/route", appDir, scanMatcher.extensions, excludeDir)) {
357
+ const route = fileToAppRoute(file, appDir, "route", scanMatcher);
358
+ if (route) routes.push(route);
359
+ }
360
+ const routePatterns = new Set(routes.map((route) => route.pattern));
361
+ const ghostParentRoutes = [];
362
+ for await (const file of scanWithExtensions("**/layout", appDir, scanMatcher.extensions, excludeDir)) {
363
+ const dir = path.dirname(file);
364
+ const routeDir = dir === "." ? appDir : path.join(appDir, dir);
365
+ if (!hasParallelSlotDirectory(routeDir)) continue;
366
+ if (discoverParallelSlots(routeDir, appDir, scanMatcher).length === 0) continue;
367
+ const route = directoryToAppRoute(dir, appDir, scanMatcher, null, null);
368
+ if (!route) continue;
369
+ if (routePatterns.has(route.pattern)) {
370
+ ghostParentRoutes.push(route);
371
+ continue;
372
+ }
373
+ routes.push(route);
374
+ routePatterns.add(route.pattern);
375
+ }
376
+ const slotSubRoutes = discoverSlotSubRoutes(routes, scanMatcher, ghostParentRoutes);
377
+ routes.push(...slotSubRoutes);
378
+ discoverSiblingInterceptingRoutes(routes, appDir, scanMatcher);
379
+ validatePageRouteConflicts(routes, appDir);
380
+ validateRoutePatterns(routes.map((route) => route.pattern));
381
+ validateRoutePatterns([...new Set(routes.flatMap((route) => [...route.parallelSlots.flatMap((slot) => slot.interceptingRoutes.map((intercept) => intercept.targetPattern)), ...route.siblingIntercepts.map((intercept) => intercept.targetPattern)]))]);
382
+ sortRoutes(routes);
383
+ return {
384
+ routes,
385
+ routeManifest: createRouteManifest(routes)
386
+ };
387
+ }
388
+ function hasParallelSlotDirectory(dir) {
389
+ try {
390
+ return fs.readdirSync(dir, { withFileTypes: true }).some((entry) => entry.isDirectory() && entry.name.startsWith("@") && entry.name !== "@children");
391
+ } catch {
392
+ return false;
393
+ }
394
+ }
395
+ function validatePageRouteConflicts(routes, appDir) {
396
+ const byPattern = /* @__PURE__ */ new Map();
397
+ for (const route of routes) {
398
+ const entry = byPattern.get(route.pattern);
399
+ if (!entry) {
400
+ byPattern.set(route.pattern, {
401
+ pagePath: route.pagePath,
402
+ routePath: route.routePath
403
+ });
404
+ continue;
405
+ }
406
+ if (!entry.pagePath && route.pagePath) entry.pagePath = route.pagePath;
407
+ if (!entry.routePath && route.routePath) entry.routePath = route.routePath;
408
+ }
409
+ for (const [pattern, entry] of byPattern) {
410
+ if (!entry.pagePath || !entry.routePath) continue;
411
+ throw new Error(`Conflicting route and page at ${pattern}: route at ${formatAppFilePath(entry.routePath, appDir)} and page at ${formatAppFilePath(entry.pagePath, appDir)}`);
412
+ }
413
+ }
414
+ function formatAppFilePath(filePath, appDir) {
415
+ const relativePath = path.relative(appDir, filePath).replace(/\\/g, "/");
416
+ const parsedPath = path.parse(relativePath);
417
+ const withoutExtension = path.join(parsedPath.dir, parsedPath.name).replace(/\\/g, "/");
418
+ return withoutExtension.startsWith("/") ? withoutExtension : `/${withoutExtension}`;
419
+ }
420
+ /**
421
+ * Discover sub-routes created by nested pages within parallel slots.
422
+ *
423
+ * In Next.js, pages nested inside @slot directories create additional URL routes.
424
+ * For example, given:
425
+ * app/parallel-routes/@audience/demographics/page.tsx
426
+ * This creates a route at /parallel-routes/demographics where:
427
+ * - children slot → parent's default.tsx
428
+ * - @audience slot → @audience/demographics/page.tsx (matched)
429
+ * - other slots → their default.tsx (fallback)
430
+ */
431
+ function discoverSlotSubRoutes(routes, matcher, ghostParents = []) {
432
+ const syntheticRoutes = [];
433
+ const routesByPattern = new Map(routes.map((r) => [r.pattern, r]));
434
+ const applySlotSubPages = (route, slotPages, rawSegments) => {
435
+ route.parallelSlots = route.parallelSlots.map((slot) => {
436
+ const subPage = slotPages.get(slot.key);
437
+ if (subPage !== void 0) return {
438
+ ...slot,
439
+ pagePath: subPage,
440
+ routeSegments: rawSegments
441
+ };
442
+ return slot;
443
+ });
444
+ };
445
+ const allParents = [...routes, ...ghostParents];
446
+ for (const parentRoute of allParents) {
447
+ if (parentRoute.parallelSlots.length === 0) continue;
448
+ const isLayoutOnlyUiRoute = !parentRoute.pagePath && !parentRoute.routePath && parentRoute.layouts.length > 0;
449
+ if (!parentRoute.pagePath && !isLayoutOnlyUiRoute) continue;
450
+ const parentPageDir = parentRoute.pagePath ? path.dirname(parentRoute.pagePath) : path.dirname(parentRoute.layouts[parentRoute.layouts.length - 1]);
451
+ const subPathMap = /* @__PURE__ */ new Map();
452
+ for (const slot of parentRoute.parallelSlots) {
453
+ if (path.dirname(slot.ownerDir) !== parentPageDir) continue;
454
+ const slotDir = slot.ownerDir;
455
+ if (!fs.existsSync(slotDir)) continue;
456
+ const subPages = findSlotSubPages(slotDir, matcher);
457
+ for (const { relativePath, pagePath } of subPages) {
458
+ const subSegments = relativePath.split(path.sep);
459
+ const convertedSubRoute = convertSegmentsToRouteParts(subSegments);
460
+ if (!convertedSubRoute) continue;
461
+ const { urlSegments } = convertedSubRoute;
462
+ const normalizedSubPath = urlSegments.join("/");
463
+ let subPathEntry = subPathMap.get(normalizedSubPath);
464
+ if (!subPathEntry) {
465
+ subPathEntry = {
466
+ rawSegments: subSegments,
467
+ converted: convertedSubRoute,
468
+ slotPages: /* @__PURE__ */ new Map()
469
+ };
470
+ subPathMap.set(normalizedSubPath, subPathEntry);
471
+ }
472
+ if (subPathEntry.slotPages.get(slot.key)) {
473
+ const pattern = joinRoutePattern(parentRoute.pattern, normalizedSubPath);
474
+ throw new Error(`You cannot have two routes that resolve to the same path ("${pattern}").`);
475
+ }
476
+ subPathEntry.slotPages.set(slot.key, pagePath);
477
+ }
478
+ }
479
+ if (subPathMap.size === 0) continue;
480
+ const childrenDefault = findFile(parentPageDir, "default", matcher);
481
+ if (parentRoute.pagePath && !childrenDefault) continue;
482
+ const childrenCatchAll = childrenDefault ? null : findCatchAllPage(parentPageDir, matcher);
483
+ const childrenFallback = childrenDefault ?? childrenCatchAll;
484
+ for (const { rawSegments, converted: convertedSubRoute, slotPages } of subPathMap.values()) {
485
+ const { urlSegments: urlParts, params: subParams, isDynamic: subIsDynamic } = convertedSubRoute;
486
+ const subUrlPath = urlParts.join("/");
487
+ const pattern = joinRoutePattern(parentRoute.pattern, subUrlPath);
488
+ const existingRoute = routesByPattern.get(pattern);
489
+ if (existingRoute) {
490
+ if (existingRoute.routePath && !existingRoute.pagePath) throw new Error(`You cannot have two routes that resolve to the same path ("${pattern}").`);
491
+ if (urlParts.length > 0) applySlotSubPages(existingRoute, slotPages, rawSegments);
492
+ continue;
493
+ }
494
+ const syntheticParts = [...parentRoute.patternParts, ...urlParts];
495
+ if (Array.from(routesByPattern.values()).some((r) => patternsStructurallyEquivalent(r.patternParts, syntheticParts))) continue;
496
+ const subSlots = parentRoute.parallelSlots.map((slot) => {
497
+ const subPage = slotPages.get(slot.key);
498
+ return {
499
+ ...slot,
500
+ pagePath: subPage || null,
501
+ routeSegments: subPage ? rawSegments : null
502
+ };
503
+ });
504
+ const newRoute = {
505
+ ids: createAppRouteSemanticIds({
506
+ pattern,
507
+ pagePath: childrenFallback,
508
+ routePath: null,
509
+ routeSegments: [...parentRoute.routeSegments, ...rawSegments],
510
+ layoutTreePositions: parentRoute.layoutTreePositions,
511
+ templateTreePositions: parentRoute.templateTreePositions,
512
+ slots: subSlots
513
+ }),
514
+ pattern,
515
+ pagePath: childrenFallback,
516
+ routePath: null,
517
+ layouts: parentRoute.layouts,
518
+ templates: parentRoute.templates,
519
+ parallelSlots: subSlots,
520
+ loadingPath: parentRoute.loadingPath,
521
+ errorPath: parentRoute.errorPath,
522
+ layoutErrorPaths: parentRoute.layoutErrorPaths,
523
+ notFoundPath: parentRoute.notFoundPath,
524
+ notFoundPaths: parentRoute.notFoundPaths,
525
+ forbiddenPaths: parentRoute.forbiddenPaths,
526
+ forbiddenPath: parentRoute.forbiddenPath,
527
+ unauthorizedPath: parentRoute.unauthorizedPath,
528
+ unauthorizedPaths: parentRoute.unauthorizedPaths,
529
+ routeSegments: [...parentRoute.routeSegments, ...rawSegments],
530
+ templateTreePositions: parentRoute.templateTreePositions,
531
+ layoutTreePositions: parentRoute.layoutTreePositions,
532
+ isDynamic: parentRoute.isDynamic || subIsDynamic,
533
+ params: [...parentRoute.params, ...subParams],
534
+ rootParamNames: parentRoute.rootParamNames,
535
+ patternParts: [...parentRoute.patternParts, ...urlParts],
536
+ siblingIntercepts: []
537
+ };
538
+ syntheticRoutes.push(newRoute);
539
+ routesByPattern.set(pattern, newRoute);
540
+ }
541
+ }
542
+ return syntheticRoutes;
543
+ }
544
+ const findSlotSubPagesCache = /* @__PURE__ */ new WeakMap();
545
+ function findSlotSubPages(slotDir, matcher) {
546
+ let perMatcher = findSlotSubPagesCache.get(matcher);
547
+ if (!perMatcher) {
548
+ perMatcher = /* @__PURE__ */ new Map();
549
+ findSlotSubPagesCache.set(matcher, perMatcher);
550
+ }
551
+ const cached = perMatcher.get(slotDir);
552
+ if (cached) return cached;
553
+ const results = [];
554
+ function scan(dir) {
555
+ if (!fs.existsSync(dir)) return;
556
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
557
+ for (const entry of entries) {
558
+ if (!entry.isDirectory()) continue;
559
+ if (matchInterceptConvention(entry.name)) continue;
560
+ if (entry.name.startsWith("_")) continue;
561
+ const subDir = path.join(dir, entry.name);
562
+ const page = findFile(subDir, "page", matcher);
563
+ if (page) {
564
+ const relativePath = path.relative(slotDir, subDir);
565
+ results.push({
566
+ relativePath,
567
+ pagePath: page
568
+ });
569
+ }
570
+ scan(subDir);
571
+ }
572
+ }
573
+ scan(slotDir);
574
+ perMatcher.set(slotDir, results);
575
+ return results;
576
+ }
577
+ /**
578
+ * Find a sibling catch-all page directly under `dir`, i.e. a `[...slug]` or
579
+ * `[[...slug]]` directory that contains a `page` file. Returns the absolute
580
+ * page path, or null when no catch-all sibling exists.
581
+ *
582
+ * Used as the children fallback for slot-only sub-routes (an explicit `@slot`
583
+ * sub-page with no corresponding children page or `default.tsx`): Next.js
584
+ * serves the children prop from the nearest catch-all, so `/baz` renders
585
+ * `[...catchAll]/page.tsx` for children while `@slot/baz/page.tsx` fills the
586
+ * slot. Optional catch-alls (`[[...slug]]`) qualify because they also match a
587
+ * single extra segment.
588
+ */
589
+ function findCatchAllPage(dir, matcher) {
590
+ let entries;
591
+ try {
592
+ entries = fs.readdirSync(dir, { withFileTypes: true });
593
+ } catch {
594
+ return null;
595
+ }
596
+ for (const entry of entries) {
597
+ if (!entry.isDirectory()) continue;
598
+ const name = entry.name;
599
+ if (!(name.startsWith("[...") && name.endsWith("]") || name.startsWith("[[...") && name.endsWith("]]"))) continue;
600
+ const page = findFile(path.join(dir, name), "page", matcher);
601
+ if (page) return page;
602
+ }
603
+ return null;
604
+ }
605
+ /**
606
+ * Convert a file path relative to app/ into an AppRoute.
607
+ */
608
+ function fileToAppRoute(file, appDir, type, matcher) {
609
+ let dir = path.dirname(file);
610
+ if (type === "page" && dir !== "." && path.basename(dir) === "@children") {
611
+ const parent = path.dirname(dir);
612
+ dir = parent === "" || parent === "." ? "." : parent;
613
+ }
614
+ return directoryToAppRoute(dir, appDir, matcher, type === "page" ? path.join(appDir, file) : null, type === "route" ? path.join(appDir, file) : null);
615
+ }
616
+ function directoryToAppRoute(dir, appDir, matcher, pagePath, routePath) {
617
+ const segments = dir === "." ? [] : dir.split(path.sep);
618
+ const params = [];
619
+ let isDynamic = false;
620
+ const convertedRoute = convertSegmentsToRouteParts(segments);
621
+ if (!convertedRoute) return null;
622
+ const { urlSegments, params: routeParams, isDynamic: routeIsDynamic } = convertedRoute;
623
+ params.push(...routeParams);
624
+ isDynamic = routeIsDynamic;
625
+ const pattern = "/" + urlSegments.join("/");
626
+ const layouts = discoverLayouts(segments, appDir, matcher);
627
+ const templates = discoverTemplates(segments, appDir, matcher);
628
+ const templateTreePositions = computeLayoutTreePositions(appDir, templates);
629
+ const layoutTreePositions = computeLayoutTreePositions(appDir, layouts);
630
+ const layoutErrorPaths = discoverLayoutAlignedErrors(segments, appDir, matcher);
631
+ const errorEntries = discoverSegmentErrors(segments, appDir, matcher);
632
+ const errorPaths = errorEntries.map((entry) => entry.path);
633
+ const errorTreePositions = errorEntries.map((entry) => entry.treePosition);
634
+ const routeDir = dir === "." ? appDir : path.join(appDir, dir);
635
+ const loadingPath = findFile(routeDir, "loading", matcher);
636
+ const errorPath = findFile(routeDir, "error", matcher);
637
+ const notFoundPath = discoverBoundaryFile(segments, appDir, "not-found", matcher);
638
+ const forbiddenPath = discoverBoundaryFile(segments, appDir, "forbidden", matcher);
639
+ const unauthorizedPath = discoverBoundaryFile(segments, appDir, "unauthorized", matcher);
640
+ const notFoundPaths = discoverBoundaryFilePerLayout(layouts, "not-found", matcher);
641
+ const forbiddenPaths = discoverBoundaryFilePerLayout(layouts, "forbidden", matcher);
642
+ const unauthorizedPaths = discoverBoundaryFilePerLayout(layouts, "unauthorized", matcher);
643
+ const parallelSlots = discoverInheritedParallelSlots(segments, appDir, routeDir, matcher);
644
+ return {
645
+ ids: createAppRouteSemanticIds({
646
+ pattern: pattern === "/" ? "/" : pattern,
647
+ pagePath,
648
+ routePath,
649
+ routeSegments: segments,
650
+ layoutTreePositions,
651
+ templateTreePositions,
652
+ slots: parallelSlots
653
+ }),
654
+ pattern: pattern === "/" ? "/" : pattern,
655
+ pagePath,
656
+ routePath,
657
+ layouts,
658
+ templates,
659
+ parallelSlots,
660
+ loadingPath,
661
+ errorPath,
662
+ layoutErrorPaths,
663
+ errorPaths,
664
+ errorTreePositions,
665
+ notFoundPath,
666
+ notFoundPaths,
667
+ forbiddenPaths,
668
+ forbiddenPath,
669
+ unauthorizedPath,
670
+ unauthorizedPaths,
671
+ routeSegments: segments,
672
+ templateTreePositions,
673
+ layoutTreePositions,
674
+ isDynamic,
675
+ params,
676
+ rootParamNames: computeRootParamNames(segments, layoutTreePositions),
677
+ patternParts: urlSegments,
678
+ siblingIntercepts: []
679
+ };
680
+ }
681
+ function dynamicParamNameFromSegment(segment) {
682
+ if (segment.startsWith("[[...") && segment.endsWith("]]")) return segment.slice(5, -2);
683
+ if (segment.startsWith("[...") && segment.endsWith("]")) return segment.slice(4, -1);
684
+ if (segment.startsWith("[") && segment.endsWith("]")) return segment.slice(1, -1);
685
+ return null;
686
+ }
687
+ function computeRootParamNames(routeSegments, layoutTreePositions) {
688
+ const rootLayoutPosition = layoutTreePositions[0];
689
+ if (rootLayoutPosition == null || rootLayoutPosition <= 0) return [];
690
+ const names = [];
691
+ for (const segment of routeSegments.slice(0, rootLayoutPosition)) {
692
+ const name = dynamicParamNameFromSegment(segment);
693
+ if (name && !names.includes(name)) names.push(name);
694
+ }
695
+ return names;
696
+ }
697
+ function resolveRootBoundaryId(routeSegments, layoutTreePositions) {
698
+ const rootLayoutPosition = layoutTreePositions[0];
699
+ if (rootLayoutPosition === void 0) return null;
700
+ return createAppRouteGraphRootBoundaryId(createAppRouteGraphTreePath(routeSegments, rootLayoutPosition));
701
+ }
702
+ function createAppRouteSemanticIds(input) {
703
+ const slots = {};
704
+ for (const slot of input.slots) slots[slot.key] = slot.id;
705
+ return {
706
+ route: createAppRouteGraphRouteId(input.pattern),
707
+ page: input.pagePath ? createAppRouteGraphPageId(input.pattern) : null,
708
+ routeHandler: input.routePath ? createAppRouteGraphRouteHandlerId(input.pattern) : null,
709
+ rootBoundary: resolveRootBoundaryId(input.routeSegments, input.layoutTreePositions),
710
+ layouts: input.layoutTreePositions.map((treePosition) => createAppRouteGraphLayoutId(createAppRouteGraphTreePath(input.routeSegments, treePosition))),
711
+ templates: (input.templateTreePositions ?? []).map((treePosition) => createAppRouteGraphTemplateId(createAppRouteGraphTreePath(input.routeSegments, treePosition))),
712
+ slots
713
+ };
714
+ }
715
+ function createAppRouteGraphTreePath(routeSegments, treePosition) {
716
+ const treePathSegments = routeSegments.slice(0, treePosition);
717
+ if (treePathSegments.length === 0) return "/";
718
+ return `/${treePathSegments.join("/")}`;
719
+ }
720
+ function convertTreePathToRouteParts(treePath) {
721
+ if (treePath === "/") return {
722
+ urlSegments: [],
723
+ params: []
724
+ };
725
+ const routeParts = convertSegmentsToRouteParts(treePath.split("/").filter(Boolean));
726
+ if (!routeParts) throw new Error(`Invalid App Router layout tree path "${treePath}".`);
727
+ return {
728
+ urlSegments: routeParts.urlSegments,
729
+ params: routeParts.params
730
+ };
731
+ }
732
+ /**
733
+ * Compute the tree position (directory depth from app root) for each layout.
734
+ * Root layout = 0, a layout at app/blog/ = 1, app/blog/(group)/ = 2.
735
+ * Counts ALL directory levels including route groups and parallel slots.
736
+ */
737
+ function computeLayoutTreePositions(appDir, layouts) {
738
+ return layouts.map((layoutPath) => {
739
+ const layoutDir = path.dirname(layoutPath);
740
+ if (layoutDir === appDir) return 0;
741
+ return path.relative(appDir, layoutDir).split(path.sep).length;
742
+ });
743
+ }
744
+ /**
745
+ * Discover all layout files from root to the given directory.
746
+ * Each level of the directory tree may have a layout.tsx.
747
+ */
748
+ function discoverLayouts(segments, appDir, matcher) {
749
+ const layouts = [];
750
+ const rootLayout = findFile(appDir, "layout", matcher);
751
+ if (rootLayout) layouts.push(rootLayout);
752
+ let currentDir = appDir;
753
+ for (const segment of segments) {
754
+ currentDir = path.join(currentDir, segment);
755
+ const layout = findFile(currentDir, "layout", matcher);
756
+ if (layout) layouts.push(layout);
757
+ }
758
+ return layouts;
759
+ }
760
+ /**
761
+ * Discover all template files from root to the given directory.
762
+ * Each level of the directory tree may have a template.tsx.
763
+ * Templates are like layouts but re-mount on navigation.
764
+ */
765
+ function discoverTemplates(segments, appDir, matcher) {
766
+ const templates = [];
767
+ const rootTemplate = findFile(appDir, "template", matcher);
768
+ if (rootTemplate) templates.push(rootTemplate);
769
+ let currentDir = appDir;
770
+ for (const segment of segments) {
771
+ currentDir = path.join(currentDir, segment);
772
+ const template = findFile(currentDir, "template", matcher);
773
+ if (template) templates.push(template);
774
+ }
775
+ return templates;
776
+ }
777
+ /**
778
+ * Discover error.tsx files by segment tree position.
779
+ *
780
+ * Next.js stores conventions on every loader-tree segment; a route-group
781
+ * directory with error.tsx but no sibling layout.tsx must still wrap its
782
+ * descendants. Keeping positions explicit avoids conflating segment boundaries
783
+ * with layout component ownership.
784
+ */
785
+ function discoverSegmentErrors(segments, appDir, matcher) {
786
+ const errors = [];
787
+ const rootError = findFile(appDir, "error", matcher);
788
+ if (rootError) errors.push({
789
+ path: rootError,
790
+ treePosition: 0
791
+ });
792
+ let currentDir = appDir;
793
+ for (let index = 0; index < segments.length; index++) {
794
+ const segment = segments[index];
795
+ currentDir = path.join(currentDir, segment);
796
+ const error = findFile(currentDir, "error", matcher);
797
+ if (error) errors.push({
798
+ path: error,
799
+ treePosition: index + 1
800
+ });
801
+ }
802
+ return errors;
803
+ }
804
+ /**
805
+ * Discover error.tsx files aligned with the layouts array.
806
+ *
807
+ * Route manifests still model layout-owned boundary facts by layout index.
808
+ * Keep this layout-aligned compatibility shape separate from segment-owned
809
+ * error boundaries so route-group errors without layouts do not get attributed
810
+ * to unrelated layouts.
811
+ */
812
+ function discoverLayoutAlignedErrors(segments, appDir, matcher) {
813
+ const errors = [];
814
+ if (findFile(appDir, "layout", matcher)) errors.push(findFile(appDir, "error", matcher));
815
+ let currentDir = appDir;
816
+ for (const segment of segments) {
817
+ currentDir = path.join(currentDir, segment);
818
+ if (findFile(currentDir, "layout", matcher)) errors.push(findFile(currentDir, "error", matcher));
819
+ }
820
+ return errors;
821
+ }
822
+ /**
823
+ * Discover the nearest boundary file (not-found, forbidden, unauthorized)
824
+ * by walking from the route's directory up to the app root.
825
+ * Returns the first (closest) file found, or null.
826
+ */
827
+ function discoverBoundaryFile(segments, appDir, fileName, matcher) {
828
+ const dirs = [];
829
+ let dir = appDir;
830
+ dirs.push(dir);
831
+ for (const segment of segments) {
832
+ dir = path.join(dir, segment);
833
+ dirs.push(dir);
834
+ }
835
+ for (let i = dirs.length - 1; i >= 0; i--) {
836
+ const f = findFile(dirs[i], fileName, matcher);
837
+ if (f) return f;
838
+ }
839
+ return null;
840
+ }
841
+ /**
842
+ * Discover boundary files (not-found, forbidden, unauthorized) at each layout directory.
843
+ * Returns an array aligned with the layouts array, where each entry is the boundary
844
+ * file at that layout's directory, or null if none exists there.
845
+ *
846
+ * This is used for per-layout error boundaries. In Next.js, each layout level
847
+ * has its own boundary that wraps the layout's children. When notFound() is thrown
848
+ * from a layout, it propagates up to the parent layout's boundary.
849
+ */
850
+ function discoverBoundaryFilePerLayout(layouts, fileName, matcher) {
851
+ return layouts.map((layoutPath) => {
852
+ return findFile(path.dirname(layoutPath), fileName, matcher);
853
+ });
854
+ }
855
+ /**
856
+ * Discover parallel slots inherited from ancestor directories.
857
+ *
858
+ * In Next.js, parallel slots belong to the layout that defines them. When a
859
+ * child route is rendered, its parent layout's slots must still be present.
860
+ * If the child doesn't have matching content in a slot, the slot's default.tsx
861
+ * is rendered instead.
862
+ *
863
+ * Walk from appDir through each segment to the route's directory. At each level
864
+ * that has @slot dirs, collect them. Slots at the route's own directory level
865
+ * use page.tsx; slots at ancestor levels use default.tsx only.
866
+ */
867
+ function discoverInheritedParallelSlots(segments, appDir, routeDir, matcher) {
868
+ const slotMap = /* @__PURE__ */ new Map();
869
+ let currentDir = appDir;
870
+ const dirsToCheck = [];
871
+ let layoutIdx = findFile(appDir, "layout", matcher) ? 0 : -1;
872
+ dirsToCheck.push({
873
+ dir: appDir,
874
+ layoutIdx,
875
+ segmentIndex: 0
876
+ });
877
+ for (let i = 0; i < segments.length; i++) {
878
+ currentDir = path.join(currentDir, segments[i]);
879
+ if (findFile(currentDir, "layout", matcher)) layoutIdx++;
880
+ dirsToCheck.push({
881
+ dir: currentDir,
882
+ layoutIdx,
883
+ segmentIndex: i + 1
884
+ });
885
+ }
886
+ const routeHasLayout = layoutIdx >= 0;
887
+ for (const { dir, layoutIdx: lvlLayoutIdx, segmentIndex } of dirsToCheck) {
888
+ if (lvlLayoutIdx < 0 && routeHasLayout) continue;
889
+ const slotLayoutIdx = Math.max(lvlLayoutIdx, 0);
890
+ const slotsAtLevel = discoverParallelSlots(dir, appDir, matcher);
891
+ const segmentsBelow = segments.slice(segmentIndex);
892
+ const isActiveUrlLevel = dir === routeDir || segmentsBelow.every(isInvisibleSegment);
893
+ for (const slot of slotsAtLevel) if (isActiveUrlLevel) {
894
+ slot.layoutIndex = slotLayoutIdx;
895
+ slotMap.set(slot.key, slot);
896
+ } else {
897
+ const mirror = findMirroredSlotPage(slot.ownerDir, segmentsBelow, matcher);
898
+ let slotPatternParts;
899
+ let slotParamNames;
900
+ if (mirror) {
901
+ const ownerUrl = convertSegmentsToRouteParts([...segments.slice(0, segmentIndex)]);
902
+ slotPatternParts = [...ownerUrl?.urlSegments ?? [], ...mirror.slotUrlSegments];
903
+ slotParamNames = [...ownerUrl?.params ?? [], ...mirror.slotParamNames];
904
+ }
905
+ const inheritedSlot = {
906
+ ...slot,
907
+ pagePath: mirror?.pagePath ?? null,
908
+ layoutIndex: slotLayoutIdx,
909
+ routeSegments: mirror?.segments ?? null,
910
+ slotPatternParts,
911
+ slotParamNames
912
+ };
913
+ slotMap.set(slot.key, inheritedSlot);
914
+ }
915
+ }
916
+ return Array.from(slotMap.values());
917
+ }
918
+ /**
919
+ * Look for a page file inside a parallel slot directory that mirrors the
920
+ * route's path below the slot's owner. The match falls through two tiers:
921
+ * 1. Literal filesystem path — fast path when route and slot share shape.
922
+ * 2. Scored pattern compatibility — enumerate sub-pages, accept those
923
+ * whose URL pattern can match the route's URL space (slot dynamic
924
+ * markers may have different names than the route's, and slot
925
+ * catch-alls may subsume the route), and pick the most-specific via
926
+ * `scoreSlotPattern`. Exact URL-parts equality (e.g. through route
927
+ * groups appearing on only one side, like `(marketing)/about` ↔
928
+ * `@breadcrumbs/about`) naturally wins because all literal segments
929
+ * score highest.
930
+ *
931
+ * Returns the slot sub-page's absolute path, its raw filesystem segments
932
+ * (for `routeSegments`), and its URL parts / param names (for
933
+ * `slotPatternParts` / `slotParamNames`). Returns null when no mirror matches.
934
+ */
935
+ function findMirroredSlotPage(slotDir, segmentsBelow, matcher) {
936
+ if (segmentsBelow.length === 0) return null;
937
+ const routeUrl = convertSegmentsToRouteParts([...segmentsBelow]);
938
+ const literalPage = findFile(path.join(slotDir, ...segmentsBelow), "page", matcher);
939
+ if (literalPage) return {
940
+ pagePath: literalPage,
941
+ segments: [...segmentsBelow],
942
+ slotUrlSegments: routeUrl?.urlSegments ?? [],
943
+ slotParamNames: routeUrl?.params ?? []
944
+ };
945
+ if (!routeUrl || routeUrl.urlSegments.length === 0) return null;
946
+ let best = null;
947
+ for (const { relativePath, pagePath } of findSlotSubPages(slotDir, matcher)) {
948
+ const slotSegments = relativePath.split(path.sep);
949
+ const slotUrl = convertSegmentsToRouteParts(slotSegments);
950
+ if (!slotUrl) continue;
951
+ if (!patternsCompatible(slotUrl.urlSegments, routeUrl.urlSegments)) continue;
952
+ const score = scoreSlotPattern(slotUrl.urlSegments);
953
+ if (!best || score > best.score) best = {
954
+ pagePath,
955
+ segments: slotSegments,
956
+ slotUrlSegments: slotUrl.urlSegments,
957
+ slotParamNames: slotUrl.params,
958
+ score
959
+ };
960
+ }
961
+ return best;
962
+ }
963
+ /**
964
+ * Whether a slot pattern can match the same URL space as the route's URL
965
+ * parts (where the route's parts are themselves a pattern, since a route
966
+ * file like `[id]/page.tsx` produces `:id`).
967
+ *
968
+ * - `:name+` (catch-all) consumes one-or-more remaining segments.
969
+ * - `:name*` (optional catch-all) consumes zero-or-more.
970
+ * - `:name` (single dynamic) consumes exactly one segment, matching any
971
+ * route segment (literal or dynamic).
972
+ * - Literal slot segments must equal the route's segment exactly; a literal
973
+ * slot segment paired with a dynamic route segment is rejected because we
974
+ * can't know statically whether the runtime value will equal the literal.
975
+ * This also means a literal slot sub-page never matches a catch-all route
976
+ * (e.g. slot `about/page.tsx` is not bound to a route `[...slug]`) — the
977
+ * catch-all might or might not resolve to "about" at request time.
978
+ */
979
+ function patternsCompatible(slotParts, routeParts) {
980
+ let i = 0;
981
+ let j = 0;
982
+ while (i < slotParts.length) {
983
+ const sp = slotParts[i];
984
+ if (sp.endsWith("+")) return j < routeParts.length;
985
+ if (sp.endsWith("*")) return true;
986
+ if (j >= routeParts.length) return false;
987
+ const rp = routeParts[j];
988
+ if (sp.startsWith(":")) {
989
+ i++;
990
+ j++;
991
+ continue;
992
+ }
993
+ if (rp.startsWith(":")) return false;
994
+ if (sp !== rp) return false;
995
+ i++;
996
+ j++;
997
+ }
998
+ return j === routeParts.length;
999
+ }
1000
+ /**
1001
+ * Score a slot pattern by specificity so the most-specific match wins:
1002
+ * literal > single dynamic > catch-all > optional catch-all.
1003
+ *
1004
+ * Required catch-all (`:name+`, ≥1 segment) is more constrained than the
1005
+ * optional variant (`:name*`, ≥0 segments), so it scores higher.
1006
+ */
1007
+ function scoreSlotPattern(urlSegments) {
1008
+ let score = 0;
1009
+ for (const seg of urlSegments) if (seg.endsWith("*")) score += 1;
1010
+ else if (seg.endsWith("+")) score += 2;
1011
+ else if (seg.startsWith(":")) score += 3;
1012
+ else score += 4;
1013
+ return score;
1014
+ }
1015
+ /**
1016
+ * Map a pattern segment to the tree-node type used by Next.js' route
1017
+ * validator. Two segments are structurally equivalent iff they share the
1018
+ * same tree-node type.
1019
+ */
1020
+ function segmentTreeNodeType(seg) {
1021
+ if (!seg.startsWith(":")) return `literal:${seg}`;
1022
+ if (seg.endsWith("*")) return "optionalCatchAll";
1023
+ if (seg.endsWith("+")) return "catchAll";
1024
+ return "dynamic";
1025
+ }
1026
+ function patternsStructurallyEquivalent(a, b) {
1027
+ if (a.length !== b.length) return false;
1028
+ for (let i = 0; i < a.length; i++) if (segmentTreeNodeType(a[i]) !== segmentTreeNodeType(b[i])) return false;
1029
+ return true;
1030
+ }
1031
+ /**
1032
+ * Find a page file at the root URL level of a parallel slot directory, including
1033
+ * through transparent route-group subdirectories (e.g. `@slot/(group)/page.tsx`
1034
+ * is equivalent to `@slot/page.tsx` since `(group)` is invisible in the URL).
1035
+ *
1036
+ * Returns the absolute page path, or null if no root-level page is found.
1037
+ *
1038
+ * Only descends into route-group directories (those whose name starts with `(`
1039
+ * and ends with `)`). Dynamic segments, regular named dirs, and `@slot` dirs
1040
+ * are not transparent and are therefore not searched.
1041
+ */
1042
+ function findSlotRootPage(slotDir, matcher) {
1043
+ const directPage = findFile(slotDir, "page", matcher);
1044
+ if (directPage) return directPage;
1045
+ let entries;
1046
+ try {
1047
+ entries = fs.readdirSync(slotDir, { withFileTypes: true });
1048
+ } catch {
1049
+ return null;
1050
+ }
1051
+ for (const entry of entries) {
1052
+ if (!entry.isDirectory()) continue;
1053
+ if (!entry.name.startsWith("(") || !entry.name.endsWith(")")) continue;
1054
+ const found = findSlotRootPage(path.join(slotDir, entry.name), matcher);
1055
+ if (found) return found;
1056
+ }
1057
+ return null;
1058
+ }
1059
+ /**
1060
+ * Discover parallel route slots (@team, @analytics, etc.) in a directory.
1061
+ * Returns a ParallelSlot for each @-prefixed subdirectory that has a page or default component.
1062
+ */
1063
+ function discoverParallelSlots(dir, appDir, matcher) {
1064
+ if (!fs.existsSync(dir)) return [];
1065
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
1066
+ const slots = [];
1067
+ for (const entry of entries) {
1068
+ if (!entry.isDirectory() || !entry.name.startsWith("@")) continue;
1069
+ if (entry.name === "@children") continue;
1070
+ const slotName = entry.name.slice(1);
1071
+ const slotDir = path.join(dir, entry.name);
1072
+ const pagePath = findSlotRootPage(slotDir, matcher);
1073
+ const defaultPath = findFile(slotDir, "default", matcher);
1074
+ const interceptingRoutes = discoverInterceptingRoutes(slotDir, dir, appDir, matcher);
1075
+ if (!pagePath && !defaultPath && interceptingRoutes.length === 0) continue;
1076
+ const ownerSegments = path.relative(appDir, dir).split(path.sep).filter((segment) => segment.length > 0);
1077
+ const ownerTreePath = createAppRouteGraphTreePath(ownerSegments, ownerSegments.length);
1078
+ slots.push({
1079
+ id: createAppRouteGraphSlotId(slotName, ownerTreePath),
1080
+ key: `${slotName}@${path.relative(appDir, slotDir).replace(/\\/g, "/")}`,
1081
+ name: slotName,
1082
+ ownerDir: slotDir,
1083
+ ownerTreePath,
1084
+ hasPage: pagePath !== null,
1085
+ pagePath,
1086
+ defaultPath,
1087
+ layoutPath: findFile(slotDir, "layout", matcher),
1088
+ loadingPath: findFile(slotDir, "loading", matcher),
1089
+ errorPath: findFile(slotDir, "error", matcher),
1090
+ interceptingRoutes,
1091
+ layoutIndex: -1,
1092
+ routeSegments: pagePath ? [] : null
1093
+ });
1094
+ }
1095
+ return slots;
1096
+ }
1097
+ /**
1098
+ * The interception convention prefix patterns.
1099
+ * (.) — same level, (..) — one level up, (..)(..)" — two levels up, (...) — root
1100
+ */
1101
+ const INTERCEPT_PATTERNS = [
1102
+ {
1103
+ prefix: "(...)",
1104
+ convention: "..."
1105
+ },
1106
+ {
1107
+ prefix: "(..)(..)",
1108
+ convention: "../.."
1109
+ },
1110
+ {
1111
+ prefix: "(..)",
1112
+ convention: ".."
1113
+ },
1114
+ {
1115
+ prefix: "(.)",
1116
+ convention: "."
1117
+ }
1118
+ ];
1119
+ /**
1120
+ * Check whether a directory name begins with an interception route marker.
1121
+ *
1122
+ * Matches the prefixes listed in {@link INTERCEPT_PATTERNS}: `(.)`, `(..)`,
1123
+ * `(...)`, `(..)(..)`. The marker is not a real URL segment, so the global
1124
+ * page/route scanner must skip these directories to avoid materialising
1125
+ * literal patterns like `/templates/(..)showcase`. Interception target
1126
+ * registration happens separately via {@link discoverInterceptingRoutes}.
1127
+ */
1128
+ function isInterceptionMarkerDir(name) {
1129
+ return matchInterceptConvention(name) !== null;
1130
+ }
1131
+ /**
1132
+ * Discover intercepting routes inside a parallel slot directory.
1133
+ *
1134
+ * Intercepting routes use conventions like (.)photo, (..)feed, (...), etc.
1135
+ * They intercept navigation to another route and render within the slot instead.
1136
+ *
1137
+ * @param slotDir - The parallel slot directory (e.g. app/feed/@modal)
1138
+ * @param routeDir - The directory of the route that owns this slot (e.g. app/feed)
1139
+ * @param appDir - The root app directory
1140
+ */
1141
+ function discoverInterceptingRoutes(slotDir, routeDir, appDir, matcher) {
1142
+ if (!fs.existsSync(slotDir)) return [];
1143
+ const results = [];
1144
+ scanForInterceptingPages(slotDir, routeDir, appDir, results, matcher);
1145
+ return results;
1146
+ }
1147
+ /**
1148
+ * Discover sibling-style interception markers — interception marker directories
1149
+ * (e.g. `(..)showcase`, `(..)(..)hoge`) that are NOT wrapped inside an `@slot`
1150
+ * directory. Mutates each matching route's `siblingIntercepts` array.
1151
+ *
1152
+ * Sibling intercepts use the same conventions and target-computation logic as
1153
+ * slot intercepts, but their intercepting page replaces the full page response
1154
+ * (not a slot) during soft navigation.
1155
+ */
1156
+ function discoverSiblingInterceptingRoutes(routes, appDir, matcher) {
1157
+ const routesByDir = /* @__PURE__ */ new Map();
1158
+ for (const route of routes) {
1159
+ const filePath = route.pagePath ?? route.routePath;
1160
+ if (!filePath) continue;
1161
+ const routeDir = normalizePathSeparators(path.dirname(filePath));
1162
+ if (!routesByDir.has(routeDir)) routesByDir.set(routeDir, route);
1163
+ }
1164
+ function walk(dir) {
1165
+ let entries;
1166
+ try {
1167
+ entries = fs.readdirSync(dir, { withFileTypes: true });
1168
+ } catch {
1169
+ return;
1170
+ }
1171
+ for (const entry of entries) {
1172
+ if (!entry.isDirectory()) continue;
1173
+ if (entry.name.startsWith("_")) continue;
1174
+ if (entry.name.startsWith("@")) continue;
1175
+ const childDir = path.join(dir, entry.name);
1176
+ const marker = matchInterceptConvention(entry.name);
1177
+ if (marker) {
1178
+ const restOfName = entry.name.slice(marker.prefix.length);
1179
+ const parentDir = dir;
1180
+ const results = [];
1181
+ collectInterceptingPages(childDir, childDir, marker.convention, restOfName, parentDir, appDir, parentDir, results, matcher);
1182
+ for (const ir of results) {
1183
+ ir.slotId = createAppRouteGraphSiblingInterceptSlotId(ir.sourceMatchPattern);
1184
+ const owner = findOwnerRouteForDir(parentDir, appDir, routes, routesByDir);
1185
+ if (owner) owner.siblingIntercepts.push(ir);
1186
+ }
1187
+ continue;
1188
+ }
1189
+ walk(childDir);
1190
+ }
1191
+ }
1192
+ walk(appDir);
1193
+ }
1194
+ /**
1195
+ * Find the best route to attach a sibling intercept to, given the directory
1196
+ * that contains the interception marker.
1197
+ *
1198
+ * 1. Exact hit: a route whose page/handler lives directly in `dir`.
1199
+ * 2. Subtree hit: shallowest route whose page lives anywhere under `dir`
1200
+ * (handles catch-all routes like `/templates/:catchAll+`).
1201
+ * 3. Ancestor walk: walk up the directory tree toward `appDir` looking for
1202
+ * any of the above. This handles the case where the marker directory has
1203
+ * no sibling pages at all (e.g. `deep/path/(...)target` with no
1204
+ * `deep/path/page.tsx`).
1205
+ *
1206
+ * All comparisons happen in forward-slash space: `appDir` is forward-slash
1207
+ * (normalized once in the config hook), but `dir` and route file paths
1208
+ * descend through native `path.join`/`path.dirname`, which reintroduce
1209
+ * backslashes on Windows. Without normalizing, the `current === appDir`
1210
+ * termination never fires there and the walk overshoots the app root.
1211
+ * `routesByDir` keys must be forward-slash dirnames of the route file paths.
1212
+ *
1213
+ * Exported for tests.
1214
+ */
1215
+ function findOwnerRouteForDir(dir, appDir, routes, routesByDir) {
1216
+ const appRoot = normalizePathSeparators(appDir);
1217
+ let current = normalizePathSeparators(dir);
1218
+ while (true) {
1219
+ const exact = routesByDir.get(current);
1220
+ if (exact) return exact;
1221
+ const currentWithSep = current + "/";
1222
+ let best = null;
1223
+ for (const route of routes) {
1224
+ const filePath = route.pagePath ?? route.routePath;
1225
+ if (!filePath) continue;
1226
+ if (!normalizePathSeparators(filePath).startsWith(currentWithSep)) continue;
1227
+ if (!best || route.patternParts.length < best.patternParts.length) best = route;
1228
+ }
1229
+ if (best) return best;
1230
+ if (current === appRoot) break;
1231
+ const parent = path.dirname(current);
1232
+ if (parent === current) break;
1233
+ current = parent;
1234
+ }
1235
+ return null;
1236
+ }
1237
+ /**
1238
+ * Recursively scan a directory tree for page.tsx files that are inside
1239
+ * intercepting route directories.
1240
+ */
1241
+ function scanForInterceptingPages(currentDir, routeDir, appDir, results, matcher) {
1242
+ if (!fs.existsSync(currentDir)) return;
1243
+ const entries = fs.readdirSync(currentDir, { withFileTypes: true });
1244
+ for (const entry of entries) {
1245
+ if (!entry.isDirectory()) continue;
1246
+ if (entry.name.startsWith("_")) continue;
1247
+ const interceptMatch = matchInterceptConvention(entry.name);
1248
+ if (interceptMatch) {
1249
+ const restOfName = entry.name.slice(interceptMatch.prefix.length);
1250
+ const interceptDir = path.join(currentDir, entry.name);
1251
+ collectInterceptingPages(interceptDir, interceptDir, interceptMatch.convention, restOfName, routeDir, appDir, currentDir, results, matcher);
1252
+ } else scanForInterceptingPages(path.join(currentDir, entry.name), routeDir, appDir, results, matcher);
1253
+ }
1254
+ }
1255
+ /**
1256
+ * Match a directory name against interception convention prefixes.
1257
+ */
1258
+ function matchInterceptConvention(name) {
1259
+ for (const pattern of INTERCEPT_PATTERNS) if (name.startsWith(pattern.prefix)) return pattern;
1260
+ return null;
1261
+ }
1262
+ /**
1263
+ * Collect page.tsx files inside an intercepting route directory tree
1264
+ * and compute their target URL patterns.
1265
+ */
1266
+ function collectInterceptingPages(currentDir, interceptRoot, convention, interceptSegment, routeDir, appDir, interceptParentDir, results, matcher, parentLayoutPaths = []) {
1267
+ const currentLayoutPath = findFile(currentDir, "layout", matcher);
1268
+ const layoutPaths = currentLayoutPath ? [...parentLayoutPaths, currentLayoutPath] : parentLayoutPaths;
1269
+ const page = findFile(currentDir, "page", matcher);
1270
+ if (page) {
1271
+ const targetPattern = computeInterceptTarget(convention, interceptSegment, currentDir, interceptRoot, routeDir, appDir);
1272
+ if (targetPattern) {
1273
+ const sourceMatchPattern = computeInterceptSourceMatchPattern(interceptParentDir, appDir);
1274
+ results.push({
1275
+ convention,
1276
+ layoutPaths: [...layoutPaths],
1277
+ targetPattern: targetPattern.pattern,
1278
+ sourceMatchPattern,
1279
+ pagePath: page,
1280
+ sourcePageSegments: normalizePathSeparators(path.relative(appDir, path.dirname(page))).split("/").filter(Boolean),
1281
+ params: targetPattern.params
1282
+ });
1283
+ }
1284
+ }
1285
+ if (!fs.existsSync(currentDir)) return;
1286
+ const entries = fs.readdirSync(currentDir, { withFileTypes: true });
1287
+ for (const entry of entries) {
1288
+ if (!entry.isDirectory()) continue;
1289
+ if (entry.name.startsWith("_")) continue;
1290
+ collectInterceptingPages(path.join(currentDir, entry.name), interceptRoot, convention, interceptSegment, routeDir, appDir, interceptParentDir, results, matcher, layoutPaths);
1291
+ }
1292
+ }
1293
+ /**
1294
+ * Compute the URL pattern for the *intercepting route* — the path that
1295
+ * owns the slot containing the interception marker. Route groups (`(name)`)
1296
+ * and parallel slots (`@slot`) are stripped because Next.js'
1297
+ * `normalizeAppPath` treats them as invisible in the URL.
1298
+ *
1299
+ * Mirrors Next.js' computation in `extractInterceptionRouteInformation`:
1300
+ * `interceptingRoute = normalizeAppPath(path.split(marker, 2)[0])`.
1301
+ *
1302
+ * Returns `/` for the app root.
1303
+ *
1304
+ * @see https://github.com/vercel/next.js/blob/canary/packages/next/src/shared/lib/router/utils/interception-routes.ts
1305
+ */
1306
+ function computeInterceptSourceMatchPattern(interceptParentDir, appDir) {
1307
+ const segments = path.relative(appDir, interceptParentDir).split(path.sep).filter(Boolean);
1308
+ const converted = convertSegmentsToRouteParts(segments);
1309
+ const urlSegments = converted ? converted.urlSegments : segments.filter((segment) => !isInvisibleSegment(segment));
1310
+ if (urlSegments.length === 0) return "/";
1311
+ return "/" + urlSegments.join("/");
1312
+ }
1313
+ /**
1314
+ * Compute the target URL pattern for an intercepting route.
1315
+ *
1316
+ * Interception conventions (..), (..)(..)" climb by *visible route segments*
1317
+ * (not filesystem directories). Route groups like (marketing) and parallel
1318
+ * slots like @modal are invisible and must be skipped when counting levels.
1319
+ *
1320
+ * - (.) same level: resolve relative to routeDir
1321
+ * - (..) one level up: climb 1 visible segment
1322
+ * - (..)(..) two levels up: climb 2 visible segments
1323
+ * - (...) root: resolve from appDir
1324
+ */
1325
+ function computeInterceptTarget(convention, interceptSegment, currentDir, interceptRoot, routeDir, appDir) {
1326
+ const routeSegments = path.relative(appDir, routeDir).split(path.sep).filter(Boolean);
1327
+ let baseParts;
1328
+ switch (convention) {
1329
+ case ".": {
1330
+ const interceptParentDir = path.dirname(interceptRoot);
1331
+ baseParts = path.relative(appDir, interceptParentDir).split(path.sep).filter(Boolean);
1332
+ break;
1333
+ }
1334
+ case "..":
1335
+ case "../..": {
1336
+ const levelsToClimb = convention === ".." ? 1 : 2;
1337
+ let climbed = 0;
1338
+ let cutIndex = routeSegments.length;
1339
+ while (cutIndex > 0 && climbed < levelsToClimb) {
1340
+ cutIndex--;
1341
+ if (!isInvisibleSegment(routeSegments[cutIndex])) climbed++;
1342
+ }
1343
+ if (climbed < levelsToClimb) {
1344
+ const interceptionRoute = formatInterceptionRoutePath(routeSegments, convention, interceptSegment, path.relative(interceptRoot, currentDir).split(path.sep).filter(Boolean));
1345
+ if (convention === "..") throw new Error(`Invalid interception route: ${interceptionRoute}. Cannot use (..) marker at the root level, use (.) instead.`);
1346
+ throw new Error(`Invalid interception route: ${interceptionRoute}. Cannot use (..)(..) marker at the root level or one level up.`);
1347
+ }
1348
+ baseParts = routeSegments.slice(0, cutIndex);
1349
+ break;
1350
+ }
1351
+ case "...":
1352
+ baseParts = [];
1353
+ break;
1354
+ default: return null;
1355
+ }
1356
+ const nestedParts = path.relative(interceptRoot, currentDir).split(path.sep).filter(Boolean);
1357
+ const convertedTarget = convertSegmentsToRouteParts([
1358
+ ...baseParts,
1359
+ interceptSegment,
1360
+ ...nestedParts
1361
+ ]);
1362
+ if (!convertedTarget) return null;
1363
+ const { urlSegments, params } = convertedTarget;
1364
+ const pattern = "/" + urlSegments.join("/");
1365
+ return {
1366
+ pattern: pattern === "/" ? "/" : pattern,
1367
+ params
1368
+ };
1369
+ }
1370
+ function formatInterceptionRoutePath(routeSegments, convention, interceptSegment, nestedParts) {
1371
+ const marker = markerForInterceptionConvention(convention);
1372
+ const convertedRoute = convertSegmentsToRouteParts(routeSegments);
1373
+ const routePath = [
1374
+ ...convertedRoute ? convertedRoute.urlSegments : routeSegments.filter((segment) => !isInvisibleSegment(segment)),
1375
+ `${marker}${interceptSegment}`,
1376
+ ...nestedParts
1377
+ ].filter(Boolean).join("/");
1378
+ return routePath ? `/${routePath}` : "/";
1379
+ }
1380
+ function markerForInterceptionConvention(convention) {
1381
+ switch (convention) {
1382
+ case ".": return "(.)";
1383
+ case "..": return "(..)";
1384
+ case "../..": return "(..)(..)";
1385
+ case "...": return "(...)";
1386
+ default: return "";
1387
+ }
1388
+ }
1389
+ /**
1390
+ * Scan-scoped cache of convention-file probes, keyed by the per-scan matcher
1391
+ * created in `buildAppRouteGraph`. A single scan walks the appDir→leaf chain
1392
+ * separately for every route (layouts, templates, errors, boundaries, slots),
1393
+ * so shared ancestor directories — the `app/` root above all — get re-probed
1394
+ * once per descendant route. The probe result is deterministic within one scan
1395
+ * (the filesystem does not change mid-build), so memoizing it removes the
1396
+ * dominant cross-route redundancy.
1397
+ *
1398
+ * Keyed by matcher so the cache lifetime is exactly one `buildAppRouteGraph`
1399
+ * call: the scan registers a fresh matcher clone, and the entry is unreachable
1400
+ * (and GC-eligible) once the scan returns. A fresh key per scan is also what
1401
+ * makes this concurrency-safe — overlapping builds never share probe state.
1402
+ */
1403
+ const findFileProbeCache = /* @__PURE__ */ new WeakMap();
1404
+ /**
1405
+ * Find a file by name (without extension) in a directory, checking configured
1406
+ * pageExtensions. Memoizes through `findFileProbeCache` when the matcher has a
1407
+ * registered per-scan cache; otherwise falls back to a direct probe (identical
1408
+ * result). The `null` "not found" outcome is cached too, so repeated misses on
1409
+ * shared ancestors cost a single set of `existsSync` calls per scan.
1410
+ */
1411
+ function findFile(dir, name, matcher) {
1412
+ const cache = findFileProbeCache.get(matcher);
1413
+ if (!cache) return findFileWithExts(dir, name, matcher);
1414
+ const key = `${dir}\0${name}`;
1415
+ const cached = cache.get(key);
1416
+ if (cached !== void 0) return cached;
1417
+ const result = findFileWithExts(dir, name, matcher);
1418
+ cache.set(key, result);
1419
+ return result;
1420
+ }
1421
+ /**
1422
+ * Convert filesystem path segments to URL route parts, skipping invisible segments
1423
+ * (route groups, @slots, ".") and converting dynamic segment syntax to Express-style
1424
+ * patterns (e.g. "[id]" → ":id", "[...slug]" → ":slug+").
1425
+ */
1426
+ function convertSegmentsToRouteParts(segments) {
1427
+ const urlSegments = [];
1428
+ const params = [];
1429
+ let isDynamic = false;
1430
+ for (let i = 0; i < segments.length; i++) {
1431
+ const segment = segments[i];
1432
+ if (isInvisibleSegment(segment)) continue;
1433
+ const catchAllMatch = segment.match(/^\[\.\.\.([^\]]+)\]$/);
1434
+ if (catchAllMatch) {
1435
+ if (hasRemainingVisibleSegments(segments, i + 1)) return null;
1436
+ if (catchAllMatch[1].endsWith("+") || catchAllMatch[1].endsWith("*")) return null;
1437
+ isDynamic = true;
1438
+ params.push(catchAllMatch[1]);
1439
+ urlSegments.push(`:${catchAllMatch[1]}+`);
1440
+ continue;
1441
+ }
1442
+ const optionalCatchAllMatch = segment.match(/^\[\[\.\.\.([^\]]+)\]\]$/);
1443
+ if (optionalCatchAllMatch) {
1444
+ if (hasRemainingVisibleSegments(segments, i + 1)) return null;
1445
+ if (optionalCatchAllMatch[1].endsWith("+") || optionalCatchAllMatch[1].endsWith("*")) return null;
1446
+ isDynamic = true;
1447
+ params.push(optionalCatchAllMatch[1]);
1448
+ urlSegments.push(`:${optionalCatchAllMatch[1]}*`);
1449
+ continue;
1450
+ }
1451
+ const dynamicMatch = segment.match(/^\[([^\]]+)\]$/);
1452
+ if (dynamicMatch) {
1453
+ if (dynamicMatch[1].endsWith("+") || dynamicMatch[1].endsWith("*")) return null;
1454
+ isDynamic = true;
1455
+ params.push(dynamicMatch[1]);
1456
+ urlSegments.push(`:${dynamicMatch[1]}`);
1457
+ continue;
1458
+ }
1459
+ urlSegments.push(decodeRouteSegment(segment));
1460
+ }
1461
+ return {
1462
+ urlSegments,
1463
+ params,
1464
+ isDynamic
1465
+ };
1466
+ }
1467
+ function hasRemainingVisibleSegments(segments, startIndex) {
1468
+ for (let i = startIndex; i < segments.length; i++) if (!isInvisibleSegment(segments[i])) return true;
1469
+ return false;
1470
+ }
1471
+ function joinRoutePattern(basePattern, subPath) {
1472
+ if (!subPath) return basePattern;
1473
+ return basePattern === "/" ? `/${subPath}` : `${basePattern}/${subPath}`;
1474
+ }
1475
+ /**
1476
+ * Returns the unique static sibling segment names at each dynamic URL level
1477
+ * of the matched route. Mirrors Next.js's `getStaticSiblingSegments` from
1478
+ * the next-app-loader: for `/products/[id]` with a sibling route at
1479
+ * `/products/sale`, the dynamic `[id]` segment has `staticSiblings: ['sale']`.
1480
+ *
1481
+ * The returned list flattens siblings across all dynamic positions and is
1482
+ * intended for the RSC payload — the client router uses it to determine if
1483
+ * a cached dynamic-route prefetch can be reused when navigating to a static
1484
+ * sibling URL.
1485
+ *
1486
+ * Ported from Next.js: packages/next/src/build/webpack/loaders/next-app-loader/index.ts
1487
+ * (getStaticSiblingSegments).
1488
+ *
1489
+ * Route group segments and parallel-route slot segments are part of the
1490
+ * filesystem tree but not the URL namespace — sibling computation is done on
1491
+ * the URL-level `patternParts`, so they are correctly transparent here.
1492
+ */
1493
+ function computeAppRouteStaticSiblings(allRoutes, matchedRoute) {
1494
+ const siblings = /* @__PURE__ */ new Set();
1495
+ const parts = matchedRoute.patternParts;
1496
+ if (!parts) return [];
1497
+ for (let level = 0; level < parts.length; level++) {
1498
+ const segmentAtLevel = parts[level];
1499
+ if (!segmentAtLevel.startsWith(":")) continue;
1500
+ for (const otherRoute of allRoutes) {
1501
+ const otherParts = otherRoute.patternParts;
1502
+ if (!otherParts || otherParts.length <= level) continue;
1503
+ let prefixMatches = true;
1504
+ for (let i = 0; i < level; i++) if (parts[i] !== otherParts[i]) {
1505
+ prefixMatches = false;
1506
+ break;
1507
+ }
1508
+ if (!prefixMatches) continue;
1509
+ const otherSegmentAtLevel = otherParts[level];
1510
+ if (otherSegmentAtLevel === segmentAtLevel) continue;
1511
+ if (otherSegmentAtLevel.startsWith(":")) continue;
1512
+ siblings.add(otherSegmentAtLevel);
1513
+ }
1514
+ }
1515
+ return Array.from(siblings);
1516
+ }
1517
+ //#endregion
1518
+ export { buildAppRouteGraph, computeAppRouteStaticSiblings, computeRootParamNames, convertSegmentsToRouteParts, findOwnerRouteForDir, isInvisibleSegment };