@wular/pnext 0.0.3 → 0.0.6

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 (392) hide show
  1. package/README.md +11 -11
  2. package/bin/pnext +1 -1
  3. package/config/lint/base.js +7 -7
  4. package/config/ts/base.json +2 -4
  5. package/config/ts/react.json +2 -6
  6. package/package.json +23 -2
  7. package/reference/compat.md +1 -1
  8. package/reference/config.md +2 -2
  9. package/reference/css.md +13 -9
  10. package/reference/dev.md +1 -1
  11. package/reference/metadata.md +7 -7
  12. package/reference/navigation.md +35 -28
  13. package/reference/performance.md +70 -70
  14. package/reference/rendering.md +17 -17
  15. package/reference/routing.md +17 -17
  16. package/reference/typegen.md +12 -8
  17. package/src/api/cache.ts +36 -37
  18. package/src/api/client-cache.ts +2 -2
  19. package/src/api/client-navigation.ts +113 -109
  20. package/src/api/dynamic.tsx +58 -55
  21. package/src/api/link.tsx +49 -52
  22. package/src/api/navigation.ts +59 -58
  23. package/src/api/server.ts +152 -144
  24. package/src/api/suspense.ts +4 -4
  25. package/src/cli/adapters/vercel-warm.ts +126 -121
  26. package/src/cli/adapters/vercel.ts +437 -443
  27. package/src/cli/analyze.ts +333 -144
  28. package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
  29. package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
  30. package/src/cli/build.ts +976 -978
  31. package/src/cli/create.ts +71 -63
  32. package/src/cli/dev.ts +116 -116
  33. package/src/cli/index.ts +88 -85
  34. package/src/cli/migrate/package-json.ts +73 -71
  35. package/src/cli/migrate/report.ts +32 -33
  36. package/src/cli/migrate/{index.ts → run.ts} +48 -49
  37. package/src/cli/migrate/scan.ts +46 -46
  38. package/src/cli/migrate/spinner.ts +9 -9
  39. package/src/cli/migrate/tsconfig.ts +35 -35
  40. package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
  41. package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
  42. package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
  43. package/src/cli/start.ts +65 -66
  44. package/src/{typegen.ts → cli/typegen.ts} +59 -59
  45. package/src/client/build.ts +794 -768
  46. package/src/client/chunk-fold.ts +245 -240
  47. package/src/client/{paths.ts → chunk-name.ts} +6 -6
  48. package/src/client/entry.ts +162 -147
  49. package/src/client/prebuilt.ts +231 -223
  50. package/src/client/profile.ts +29 -29
  51. package/src/client/react-compiler.ts +20 -15
  52. package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
  53. package/src/client/reference-stub.ts +51 -51
  54. package/src/client/reference.ts +19 -19
  55. package/src/{api → client}/router/events.ts +17 -17
  56. package/src/{api → client}/router/history.ts +16 -16
  57. package/src/{api → client}/router/hub.ts +52 -53
  58. package/src/{api/router.ts → client/router/index.ts} +61 -60
  59. package/src/{api → client}/router/policies.ts +24 -24
  60. package/src/{api → client}/router/runtime.ts +1988 -1961
  61. package/src/{api → client}/router/types.ts +93 -98
  62. package/src/compat/actions/client-plugin.ts +42 -43
  63. package/src/compat/actions/client-stub.ts +14 -14
  64. package/src/compat/actions/{action-client.ts → client.ts} +194 -193
  65. package/src/compat/actions/config.ts +63 -64
  66. package/src/compat/actions/detect.ts +68 -68
  67. package/src/compat/actions/discovery.ts +105 -105
  68. package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
  69. package/src/compat/actions/early-submit.ts +1 -1
  70. package/src/compat/actions/endpoint.ts +198 -198
  71. package/src/compat/actions/extensions.ts +811 -0
  72. package/src/compat/actions/flight.ts +23 -23
  73. package/src/compat/actions/form-state.ts +34 -34
  74. package/src/compat/actions/hoist.ts +382 -236
  75. package/src/compat/actions/ids.ts +7 -12
  76. package/src/compat/actions/index.ts +8 -8
  77. package/src/compat/actions/instances.ts +46 -46
  78. package/src/compat/actions/origin.ts +47 -48
  79. package/src/compat/actions/protocol.ts +22 -22
  80. package/src/compat/actions/registry.ts +19 -19
  81. package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
  82. package/src/compat/actions/rewrite.ts +125 -125
  83. package/src/compat/actions/{action-router.ts → router.ts} +10 -10
  84. package/src/compat/actions/serve.ts +132 -136
  85. package/src/compat/actions/server-tag.ts +4 -4
  86. package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
  87. package/src/compat/actions/unrecognized-error.ts +4 -4
  88. package/src/compat/{index.ts → aliases.ts} +112 -109
  89. package/src/compat/bundler/bun-externals.ts +18 -18
  90. package/src/compat/bundler/cjs-exports.ts +271 -223
  91. package/src/compat/bundler/config.ts +116 -111
  92. package/src/compat/bundler/externals.ts +12 -12
  93. package/src/compat/bundler/import-meta-url.ts +19 -19
  94. package/src/compat/bundler/modularize-imports.ts +36 -33
  95. package/src/compat/bundler/new-url-asset.ts +22 -24
  96. package/src/compat/bundler/optimize-package-imports.ts +111 -107
  97. package/src/compat/bundler/polyfill.ts +28 -28
  98. package/src/compat/bundler/react-compiler.ts +35 -29
  99. package/src/compat/bundler/react-profiler.tsx +11 -11
  100. package/src/compat/bundler/relay-transform.ts +48 -47
  101. package/src/compat/bundler/require-context.ts +119 -113
  102. package/src/compat/bundler/resolve-extensions.ts +19 -19
  103. package/src/compat/bundler/source-cache.ts +25 -25
  104. package/src/compat/bundler/static-imports.ts +7 -7
  105. package/src/compat/bundler/symlink-imports.ts +46 -46
  106. package/src/compat/bundler/tsconfig-paths.ts +13 -15
  107. package/src/compat/bundler/wasm.ts +58 -60
  108. package/src/compat/bundler/webpack-loaders.ts +254 -241
  109. package/src/compat/bundler/worker.ts +101 -104
  110. package/src/compat/cache/build-flags.ts +29 -29
  111. package/src/compat/cache/build-prerender-errors.ts +40 -44
  112. package/src/compat/cache/custom-handler.ts +60 -53
  113. package/src/compat/cache/fetch-patch.ts +240 -240
  114. package/src/compat/cache/handler.ts +27 -31
  115. package/src/compat/cache/modern-handler.ts +148 -126
  116. package/src/compat/cache/resume-data-cache.ts +47 -45
  117. package/src/compat/cache/revalidate.ts +233 -232
  118. package/src/compat/cache/runtime-error.ts +35 -35
  119. package/src/compat/cache/use-cache-transform.ts +442 -417
  120. package/src/compat/cache/use-cache.ts +650 -614
  121. package/src/compat/cache-control.ts +140 -142
  122. package/src/compat/client/base-path.ts +21 -20
  123. package/src/compat/client/css-order.ts +18 -18
  124. package/src/compat/client/errors/bare-boundary.ts +11 -11
  125. package/src/compat/client/errors/control-flow.ts +23 -23
  126. package/src/compat/client/errors/error-boundary.ts +61 -61
  127. package/src/compat/client/errors/global-error.ts +101 -91
  128. package/src/compat/client/errors/install.ts +71 -72
  129. package/src/compat/client/errors/lazy.ts +23 -23
  130. package/src/compat/client/errors/primitive-throw.ts +47 -45
  131. package/src/compat/client/errors/soft-refresh.ts +4 -4
  132. package/src/compat/client/link-status.ts +33 -33
  133. package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
  134. package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
  135. package/src/compat/client/navigation-scroll.ts +63 -63
  136. package/src/compat/client/optimistic-routing.ts +93 -88
  137. package/src/compat/client/prefetch-cache.ts +23 -24
  138. package/src/compat/client/route-announcer.ts +35 -35
  139. package/src/compat/client/segment-cache-policy.ts +20 -20
  140. package/src/compat/client/segment-cache.ts +309 -315
  141. package/src/compat/client/segment-prefetch.ts +127 -132
  142. package/src/compat/client/trailing-slash.ts +5 -4
  143. package/src/compat/css/chunking.ts +113 -116
  144. package/src/compat/css/inline-css.ts +21 -21
  145. package/src/compat/css/lightningcss.ts +37 -38
  146. package/src/compat/css/modules.ts +161 -175
  147. package/src/compat/css/nonce.ts +7 -7
  148. package/src/compat/css/sass-plugin.ts +18 -21
  149. package/src/compat/css/sass.ts +150 -152
  150. package/src/compat/css/styled-jsx-runtime.ts +27 -27
  151. package/src/compat/css/styled-jsx.ts +21 -21
  152. package/src/compat/edge-runtime.ts +27 -27
  153. package/src/compat/{adapter → export}/build-complete.ts +72 -75
  154. package/src/compat/export/client.ts +29 -31
  155. package/src/compat/export/{index.ts → emit.ts} +111 -110
  156. package/src/compat/export/standalone.ts +62 -54
  157. package/src/compat/image-optimizer/cache.ts +51 -49
  158. package/src/compat/image-optimizer/detect.ts +52 -52
  159. package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
  160. package/src/compat/image-optimizer/source.ts +77 -80
  161. package/src/compat/lifecycle/after-scope.ts +26 -26
  162. package/src/compat/lifecycle/after.ts +48 -45
  163. package/src/compat/lifecycle/error-funnel.ts +98 -102
  164. package/src/compat/lifecycle/error-serialize.ts +30 -26
  165. package/src/compat/lifecycle/error-ui.ts +67 -32
  166. package/src/compat/lifecycle/instrumentation-client.ts +36 -38
  167. package/src/compat/lifecycle/instrumentation.ts +85 -85
  168. package/src/compat/lifecycle/node-console.ts +11 -11
  169. package/src/compat/lifecycle/testmode.ts +160 -132
  170. package/src/compat/mdx/compile.ts +60 -57
  171. package/src/compat/mdx/plugin.ts +11 -11
  172. package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
  173. package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
  174. package/src/compat/metadata.ts +75 -81
  175. package/src/compat/next/cache.ts +68 -69
  176. package/src/compat/next/canonical-url.ts +9 -9
  177. package/src/compat/next/client-cache.ts +19 -19
  178. package/src/compat/next/client-navigation.ts +112 -116
  179. package/src/compat/next/client-only.ts +1 -1
  180. package/src/compat/next/client-script.tsx +99 -93
  181. package/src/compat/next/client-server.ts +10 -10
  182. package/src/compat/next/config-loader.ts +176 -173
  183. package/src/compat/next/config.ts +7 -7
  184. package/src/compat/next/constants.cjs +6 -6
  185. package/src/compat/next/constants.ts +6 -6
  186. package/src/compat/next/custom-server.ts +26 -24
  187. package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
  188. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
  189. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
  190. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
  191. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
  192. package/src/compat/next/dynamic.tsx +21 -18
  193. package/src/compat/next/error.tsx +52 -52
  194. package/src/compat/next/font/cache.ts +74 -74
  195. package/src/compat/next/font/google.ts +2 -2
  196. package/src/compat/next/font/index.ts +1 -1
  197. package/src/compat/next/font/local.ts +3 -3
  198. package/src/compat/next/font/runtime-client.ts +17 -15
  199. package/src/compat/next/font/runtime.ts +443 -408
  200. package/src/compat/next/font/shared.ts +120 -108
  201. package/src/compat/next/form.tsx +63 -63
  202. package/src/compat/next/head.tsx +2 -2
  203. package/src/compat/next/headers.ts +103 -95
  204. package/src/compat/next/image/client.tsx +220 -0
  205. package/src/compat/next/image/config.ts +56 -58
  206. package/src/compat/next/image/optimizer.ts +40 -36
  207. package/src/compat/next/image/patterns.ts +37 -40
  208. package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
  209. package/src/compat/next/image/shared.ts +65 -57
  210. package/src/compat/next/image/static-metadata.ts +98 -107
  211. package/src/compat/next/image/validate.ts +79 -88
  212. package/src/compat/next/image.tsx +19 -23
  213. package/src/compat/next/index.ts +1 -1
  214. package/src/compat/next/legacy-image.tsx +59 -60
  215. package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
  216. package/src/compat/next/link.tsx +158 -158
  217. package/src/compat/next/navigation.cjs +12 -3
  218. package/src/compat/next/navigation.ts +48 -50
  219. package/src/compat/next/offline.ts +27 -27
  220. package/src/compat/next/og.ts +121 -124
  221. package/src/compat/next/preferred-region.ts +13 -14
  222. package/src/compat/next/redirects.ts +58 -56
  223. package/src/compat/next/resource-hints.ts +73 -76
  224. package/src/compat/next/rewrites.ts +130 -133
  225. package/src/compat/next/root-params.ts +45 -45
  226. package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
  227. package/src/compat/next/router.cjs +4 -2
  228. package/src/compat/next/router.ts +58 -61
  229. package/src/compat/next/script.tsx +108 -108
  230. package/src/compat/next/server-only.ts +1 -1
  231. package/src/compat/next/server.ts +19 -19
  232. package/src/compat/next/svgr.ts +18 -17
  233. package/src/compat/next/telemetry.ts +24 -24
  234. package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
  235. package/src/compat/next/user-agent.ts +53 -49
  236. package/src/compat/next/web-vitals.ts +22 -24
  237. package/src/compat/otel/api.ts +41 -41
  238. package/src/compat/otel/client-trace-metadata.ts +25 -27
  239. package/src/compat/otel/fetch-span.ts +29 -29
  240. package/src/compat/otel/tracer.ts +331 -331
  241. package/src/compat/pages/api.ts +456 -0
  242. package/src/compat/pages/client-plugin.ts +36 -36
  243. package/src/compat/pages/router-state.ts +34 -34
  244. package/src/compat/pages/{index.ts → router.ts} +130 -135
  245. package/src/compat/ppr/io.ts +12 -12
  246. package/src/compat/ppr/missing-root-params.ts +34 -38
  247. package/src/compat/ppr/root-params-scan.ts +66 -66
  248. package/src/compat/ppr/root-params-transform.ts +24 -26
  249. package/src/compat/ppr/root-params.ts +30 -30
  250. package/src/compat/ppr/segment-config-incompat.ts +6 -7
  251. package/src/compat/protocol.ts +71 -70
  252. package/src/compat/react/action-state.ts +47 -48
  253. package/src/compat/react/client-lite.ts +15 -15
  254. package/src/compat/react/client.ts +4 -4
  255. package/src/compat/react/compiler-runtime.ts +11 -11
  256. package/src/compat/react/dom-client.ts +44 -44
  257. package/src/compat/react/dom-react-server.ts +10 -16
  258. package/src/compat/react/dom-server.ts +10 -10
  259. package/src/compat/react/dom.ts +52 -52
  260. package/src/compat/react/hooks-extra.ts +34 -35
  261. package/src/compat/react/parity.ts +64 -61
  262. package/src/compat/react/preact.ts +81 -82
  263. package/src/compat/react/react-server.ts +28 -28
  264. package/src/compat/react/router-shim.ts +1 -1
  265. package/src/compat/react/server-component-use.ts +8 -8
  266. package/src/compat/react/server-inserted-html.ts +30 -31
  267. package/src/compat/react/server.ts +53 -55
  268. package/src/compat/react/use.ts +32 -32
  269. package/src/compat/react/view-transition.ts +20 -20
  270. package/src/compat/register/actions.ts +35 -824
  271. package/src/compat/register/boot.ts +41 -41
  272. package/src/compat/register/build-tier.ts +5 -5
  273. package/src/compat/register/build.ts +74 -70
  274. package/src/compat/register/bundler.ts +161 -156
  275. package/src/compat/register/cache.ts +20 -20
  276. package/src/compat/register/client-errors.ts +3 -3
  277. package/src/compat/register/config.ts +6 -6
  278. package/src/compat/register/css-extras.ts +30 -34
  279. package/src/compat/register/edge-runtime.ts +3 -3
  280. package/src/compat/register/errors.ts +10 -12
  281. package/src/compat/register/export.ts +16 -16
  282. package/src/compat/register/font.ts +11 -11
  283. package/src/compat/register/hooks.ts +2 -2
  284. package/src/compat/register/image.ts +40 -40
  285. package/src/compat/register/index.ts +59 -62
  286. package/src/compat/register/instrumentation-client.ts +10 -10
  287. package/src/compat/register/lifecycle.ts +25 -28
  288. package/src/compat/register/mdx.ts +10 -10
  289. package/src/compat/register/middleware.ts +226 -16
  290. package/src/compat/register/otel.ts +80 -88
  291. package/src/compat/register/pages-api.ts +10 -463
  292. package/src/compat/register/ppr.ts +16 -16
  293. package/src/compat/register/protocol.ts +17 -18
  294. package/src/compat/register/proxy.ts +49 -51
  295. package/src/compat/register/render.ts +79 -76
  296. package/src/compat/register/routing.ts +162 -159
  297. package/src/compat/register/segment.ts +24 -1887
  298. package/src/compat/register/static-image.ts +3 -3
  299. package/src/compat/register/{misc.ts → taint.ts} +9 -9
  300. package/src/compat/register/typed-routes.ts +14 -14
  301. package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
  302. package/src/compat/register/validation.ts +18 -18
  303. package/src/compat/segment/loading-boundary.ts +43 -45
  304. package/src/compat/segment/page-slot.ts +69 -69
  305. package/src/compat/segment/serve.ts +1884 -0
  306. package/src/compat/segment/tree.ts +113 -112
  307. package/src/compat/segment/vary-key.ts +38 -38
  308. package/src/compat/segment/vary-params.ts +138 -142
  309. package/src/compat/static-params.ts +14 -12
  310. package/src/compat/tsconfig-defaults.ts +87 -91
  311. package/src/compat/typecheck/{index.ts → check.ts} +234 -212
  312. package/src/compat/typecheck/worker.ts +15 -12
  313. package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
  314. package/src/compat/typed-routes/manifest.ts +174 -170
  315. package/src/compat/typed-routes/typegen.ts +127 -110
  316. package/src/compat/validation/errors.ts +16 -19
  317. package/src/compat/validation/prerender-diagnostics.ts +521 -504
  318. package/src/compat/validation/{index.ts → validate.ts} +647 -648
  319. package/src/compat-bootstrap.ts +16 -16
  320. package/src/config.ts +69 -69
  321. package/src/css/build.ts +230 -227
  322. package/src/css/postcss.ts +79 -80
  323. package/src/css/worker.ts +14 -15
  324. package/src/dev/client-actions.ts +10 -10
  325. package/src/dev/client-chunk-store.ts +27 -27
  326. package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
  327. package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
  328. package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
  329. package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
  330. package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
  331. package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
  332. package/src/dev/server.ts +804 -820
  333. package/src/env.ts +46 -43
  334. package/src/extensions.ts +491 -478
  335. package/src/index.ts +8 -8
  336. package/src/internal.ts +20 -23
  337. package/src/{islands → render}/boundary-error.ts +3 -3
  338. package/src/render/hooks.ts +71 -71
  339. package/src/render/island-context.ts +14 -14
  340. package/src/render/metadata.ts +310 -310
  341. package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
  342. package/src/{ppr.ts → render/ppr.ts} +244 -245
  343. package/src/render/renderer.ts +2076 -2082
  344. package/src/render/resource-hints.ts +16 -17
  345. package/src/render/slots.tsx +224 -235
  346. package/src/{islands → render}/static-children.ts +9 -12
  347. package/src/{islands → render}/static-slots.ts +37 -37
  348. package/src/{cache/context.ts → request/cache.ts} +20 -20
  349. package/src/request/context.ts +107 -107
  350. package/src/{dynamic/source.ts → resolve/dynamic.ts} +152 -143
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +442 -186
  354. package/src/resolve/source-text.ts +37 -37
  355. package/src/{dynamic → resolve}/tree-shake.ts +132 -128
  356. package/src/routing/forwarded.ts +19 -19
  357. package/src/routing/handler.ts +84 -91
  358. package/src/routing/href.ts +69 -70
  359. package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
  360. package/src/{proxy.ts → routing/proxy.ts} +306 -312
  361. package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
  362. package/src/routing/routes.ts +833 -848
  363. package/src/routing/slots.ts +164 -160
  364. package/src/runtime/loader.ts +952 -0
  365. package/src/{dev → runtime}/module-cache.ts +309 -287
  366. package/src/{dev → runtime}/module-generations.ts +9 -9
  367. package/src/{dev → runtime}/module-transform.ts +81 -72
  368. package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
  369. package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
  370. package/src/runtime/vendor.ts +425 -404
  371. package/src/styles.d.ts +9 -0
  372. package/src/types.ts +320 -335
  373. package/src/utils/ansi.ts +5 -5
  374. package/src/utils/{source.ts → code.ts} +15 -12
  375. package/src/utils/content-type.ts +3 -3
  376. package/src/utils/decode.ts +2 -2
  377. package/src/utils/dev-profile.ts +13 -13
  378. package/src/utils/error-log.ts +6 -6
  379. package/src/utils/esbuild.ts +18 -18
  380. package/src/utils/fs-cache.ts +13 -13
  381. package/src/utils/fs.ts +57 -49
  382. package/src/utils/html.ts +20 -24
  383. package/src/utils/native-require.ts +8 -8
  384. package/src/utils/serialize.ts +139 -146
  385. package/src/utils/verbose.ts +18 -18
  386. package/src/cli/analyze-print.ts +0 -181
  387. package/src/compat/middleware/manifest.ts +0 -210
  388. package/src/compat/next/image-client.tsx +0 -215
  389. package/src/compat/next/link-usage.ts +0 -29
  390. package/src/css/index.ts +0 -2
  391. package/src/render/index.ts +0 -1
  392. package/src/style-modules.d.ts +0 -9
@@ -2,76 +2,76 @@
2
2
  // independent scan of app-dir layouts/slots and the pages/ directory, plus the
3
3
  // redirects/rewrites from next.config. Feeds the Next-identical codegen in
4
4
  // ./typegen.ts. Compat-only.
5
- import { existsSync } from 'node:fs';
6
- import { readdir } from 'node:fs/promises';
7
- import path from 'node:path';
8
- import type { ResolvedConfig } from '../../config';
9
- import type { RouteManifestEntry } from '../../types';
10
- import { toPosixPath } from '../../utils/fs';
5
+ import { existsSync } from 'node:fs'
6
+ import { readdir } from 'node:fs/promises'
7
+ import path from 'node:path'
8
+ import type { ResolvedConfig } from '../../config'
9
+ import type { RouteManifestEntry } from '../../types'
10
+ import { toPosixPath } from '../../utils/fs'
11
11
 
12
12
  /** path-to-regexp group info, mirroring Next's `getRouteRegex().groups`. */
13
13
  export interface Group {
14
- pos: number;
15
- repeat: boolean;
16
- optional: boolean;
14
+ pos: number
15
+ repeat: boolean
16
+ optional: boolean
17
17
  }
18
18
 
19
19
  export interface ManifestRouteInfo {
20
- path: string;
21
- groups: Record<string, Group>;
20
+ path: string
21
+ groups: Record<string, Group>
22
22
  }
23
23
 
24
24
  export interface RouteTypesManifest {
25
- appRoutes: Record<string, ManifestRouteInfo>;
26
- pageRoutes: Record<string, ManifestRouteInfo>;
27
- layoutRoutes: Record<string, ManifestRouteInfo & { slots: string[] }>;
28
- appRouteHandlerRoutes: Record<string, ManifestRouteInfo>;
29
- redirectRoutes: Record<string, ManifestRouteInfo>;
30
- rewriteRoutes: Record<string, ManifestRouteInfo>;
31
- appPagePaths: Set<string>;
32
- pagesRouterPagePaths: Set<string>;
33
- layoutPaths: Set<string>;
34
- appRouteHandlers: Set<string>;
35
- pageApiRoutes: Set<string>;
36
- filePathToRoute: Map<string, string>;
25
+ appRoutes: Record<string, ManifestRouteInfo>
26
+ pageRoutes: Record<string, ManifestRouteInfo>
27
+ layoutRoutes: Record<string, ManifestRouteInfo & { slots: string[] }>
28
+ appRouteHandlerRoutes: Record<string, ManifestRouteInfo>
29
+ redirectRoutes: Record<string, ManifestRouteInfo>
30
+ rewriteRoutes: Record<string, ManifestRouteInfo>
31
+ appPagePaths: Set<string>
32
+ pagesRouterPagePaths: Set<string>
33
+ layoutPaths: Set<string>
34
+ appRouteHandlers: Set<string>
35
+ pageApiRoutes: Set<string>
36
+ filePathToRoute: Map<string, string>
37
37
  }
38
38
 
39
- const PAGE_EXTENSIONS = ['tsx', 'ts', 'jsx', 'js', 'mdx', 'md'];
40
- const LAYOUT_NAMES = new Set(PAGE_EXTENSIONS.map(ext => `layout.${ext}`));
39
+ const PAGE_EXTENSIONS = ['tsx', 'ts', 'jsx', 'js', 'mdx', 'md']
40
+ const LAYOUT_NAMES = new Set(PAGE_EXTENSIONS.map(ext => `layout.${ext}`))
41
41
 
42
42
  function isGroupSegment(name: string): boolean {
43
- return name.startsWith('(') && name.endsWith(')');
43
+ return name.startsWith('(') && name.endsWith(')')
44
44
  }
45
45
 
46
46
  function isSlotSegment(name: string): boolean {
47
- return name.startsWith('@');
47
+ return name.startsWith('@')
48
48
  }
49
49
 
50
50
  function decodeLiteral(segment: string): string {
51
- return segment.replace(/%5[Ff]/g, '_');
51
+ return segment.replace(/%5[Ff]/g, '_')
52
52
  }
53
53
 
54
54
  /** Extract groups (param name -> shape) from a bracket-syntax route. */
55
55
  function groupsFromBracketRoute(route: string): Record<string, Group> {
56
- const groups: Record<string, Group> = {};
57
- let pos = 1;
56
+ const groups: Record<string, Group> = {}
57
+ let pos = 1
58
58
  for (const segment of route.split('/').filter(Boolean)) {
59
- const optionalCatchAll = /^\[\[\.\.\.(.+)\]\]$/.exec(segment);
59
+ const optionalCatchAll = /^\[\[\.\.\.(.+)\]\]$/.exec(segment)
60
60
  if (optionalCatchAll?.[1]) {
61
- groups[optionalCatchAll[1]] = { pos: pos++, repeat: true, optional: true };
62
- continue;
61
+ groups[optionalCatchAll[1]] = { pos: pos++, repeat: true, optional: true }
62
+ continue
63
63
  }
64
- const catchAll = /^\[\.\.\.(.+)\]$/.exec(segment);
64
+ const catchAll = /^\[\.\.\.(.+)\]$/.exec(segment)
65
65
  if (catchAll?.[1]) {
66
- groups[catchAll[1]] = { pos: pos++, repeat: true, optional: false };
67
- continue;
66
+ groups[catchAll[1]] = { pos: pos++, repeat: true, optional: false }
67
+ continue
68
68
  }
69
- const param = /^\[(.+)\]$/.exec(segment);
69
+ const param = /^\[(.+)\]$/.exec(segment)
70
70
  if (param?.[1]) {
71
- groups[param[1]] = { pos: pos++, repeat: false, optional: false };
71
+ groups[param[1]] = { pos: pos++, repeat: false, optional: false }
72
72
  }
73
73
  }
74
- return groups;
74
+ return groups
75
75
  }
76
76
 
77
77
  /**
@@ -79,52 +79,53 @@ function groupsFromBracketRoute(route: string): Record<string, Group> {
79
79
  * `%5F` decoded) plus its catch-all flags into Next bracket syntax.
80
80
  */
81
81
  function bracketRouteFromEntry(entry: RouteManifestEntry): string {
82
- const segments = entry.route.split('/').filter(Boolean).map(segment => {
83
- const catchAll = /^:(.+)\*$/.exec(segment);
84
- if (catchAll?.[1]) {
85
- const name = catchAll[1];
86
- return name === entry.catchAll && entry.catchAllOptional
87
- ? `[[...${name}]]`
88
- : `[...${name}]`;
89
- }
90
- const param = /^:(.+)$/.exec(segment);
91
- if (param?.[1]) return `[${param[1]}]`;
92
- return segment;
93
- });
94
- return `/${segments.join('/')}`.replace(/\/$/, '') || '/';
82
+ const segments = entry.route
83
+ .split('/')
84
+ .filter(Boolean)
85
+ .map(segment => {
86
+ const catchAll = /^:(.+)\*$/.exec(segment)
87
+ if (catchAll?.[1]) {
88
+ const name = catchAll[1]
89
+ return name === entry.catchAll && entry.catchAllOptional ? `[[...${name}]]` : `[...${name}]`
90
+ }
91
+ const param = /^:(.+)$/.exec(segment)
92
+ if (param?.[1]) return `[${param[1]}]`
93
+ return segment
94
+ })
95
+ return `/${segments.join('/')}`.replace(/\/$/, '') || '/'
95
96
  }
96
97
 
97
98
  /** Bracket route derived from a directory path relative to app/ (for layouts). */
98
99
  function bracketRouteFromDir(relativeDir: string): string {
99
- const segments: string[] = [];
100
+ const segments: string[] = []
100
101
  for (const segment of relativeDir.split('/').filter(Boolean)) {
101
- if (isGroupSegment(segment) || isSlotSegment(segment)) continue;
102
+ if (isGroupSegment(segment) || isSlotSegment(segment)) continue
102
103
  if (/^\[\[?\.\.\..+\]\]?$/.test(segment) || /^\[.+\]$/.test(segment)) {
103
- segments.push(segment);
104
+ segments.push(segment)
104
105
  } else {
105
- segments.push(decodeLiteral(segment));
106
+ segments.push(decodeLiteral(segment))
106
107
  }
107
108
  }
108
- return `/${segments.join('/')}`.replace(/\/$/, '') || '/';
109
+ return `/${segments.join('/')}`.replace(/\/$/, '') || '/'
109
110
  }
110
111
 
111
112
  function pagesRouteFromRelative(relative: string): string {
112
- const withoutExt = relative.replace(/\.[^.]+$/, '');
113
- const trimmed = withoutExt.replace(/\/index$/, '').replace(/^index$/, '');
114
- const route = `/${trimmed}`.replace(/\/$/, '') || '/';
115
- return route;
113
+ const withoutExt = relative.replace(/\.[^.]+$/, '')
114
+ const trimmed = withoutExt.replace(/\/index$/, '').replace(/^index$/, '')
115
+ const route = `/${trimmed}`.replace(/\/$/, '') || '/'
116
+ return route
116
117
  }
117
118
 
118
119
  async function walkFiles(dir: string): Promise<string[]> {
119
- if (!existsSync(dir)) return [];
120
- const out: string[] = [];
121
- const entries = await readdir(dir, { withFileTypes: true });
120
+ if (!existsSync(dir)) return []
121
+ const out: string[] = []
122
+ const entries = await readdir(dir, { withFileTypes: true })
122
123
  for (const entry of entries) {
123
- const full = path.join(dir, entry.name);
124
- if (entry.isDirectory()) out.push(...(await walkFiles(full)));
125
- else out.push(full);
124
+ const full = path.join(dir, entry.name)
125
+ if (entry.isDirectory()) out.push(...(await walkFiles(full)))
126
+ else out.push(full)
126
127
  }
127
- return out;
128
+ return out
128
129
  }
129
130
 
130
131
  /**
@@ -134,41 +135,44 @@ async function walkFiles(dir: string): Promise<string[]> {
134
135
  function isPrivate(relativeDir: string): boolean {
135
136
  return relativeDir
136
137
  .split('/')
137
- .some(seg => seg.startsWith('_') && !isGroupSegment(seg) && !isSlotSegment(seg));
138
+ .some(seg => seg.startsWith('_') && !isGroupSegment(seg) && !isSlotSegment(seg))
138
139
  }
139
140
 
140
141
  // path-to-regexp custom-route source -> bracket routes. The fixture only uses
141
142
  // `:name`, `:name+`, `:name*`; other modifiers/patterns are skipped like Next.
142
143
  function convertCustomRouteSource(source: string): string[] {
143
- const normalized = source.startsWith('/') ? source : `/${source}`;
144
+ const normalized = source.startsWith('/') ? source : `/${source}`
144
145
  const converted = normalized
145
146
  .split('/')
146
147
  .map(segment => {
147
- const optional = /^:(.+)\*$/.exec(segment);
148
- if (optional?.[1]) return `[[...${optional[1]}]]`;
149
- const catchAll = /^:(.+)\+$/.exec(segment);
150
- if (catchAll?.[1]) return `[...${catchAll[1]}]`;
151
- const param = /^:([A-Za-z0-9_]+)$/.exec(segment);
152
- if (param?.[1]) return `[${param[1]}]`;
153
- return segment;
148
+ const optional = /^:(.+)\*$/.exec(segment)
149
+ if (optional?.[1]) return `[[...${optional[1]}]]`
150
+ const catchAll = /^:(.+)\+$/.exec(segment)
151
+ if (catchAll?.[1]) return `[...${catchAll[1]}]`
152
+ const param = /^:([A-Za-z0-9_]+)$/.exec(segment)
153
+ if (param?.[1]) return `[${param[1]}]`
154
+ return segment
154
155
  })
155
- .join('/');
156
- return [converted.replace(/\/$/, '') || '/'];
156
+ .join('/')
157
+ return [converted.replace(/\/$/, '') || '/']
157
158
  }
158
159
 
159
160
  interface CustomRoute {
160
- source: string;
161
+ source: string
161
162
  }
162
- type RedirectsFn = () => Promise<CustomRoute[]> | CustomRoute[];
163
+ type RedirectsFn = () => Promise<CustomRoute[]> | CustomRoute[]
163
164
  type RewritesFn = () =>
164
- | Promise<CustomRoute[] | { beforeFiles?: CustomRoute[]; afterFiles?: CustomRoute[]; fallback?: CustomRoute[] }>
165
+ | Promise<
166
+ | CustomRoute[]
167
+ | { beforeFiles?: CustomRoute[]; afterFiles?: CustomRoute[]; fallback?: CustomRoute[] }
168
+ >
165
169
  | CustomRoute[]
166
- | { beforeFiles?: CustomRoute[]; afterFiles?: CustomRoute[]; fallback?: CustomRoute[] };
170
+ | { beforeFiles?: CustomRoute[]; afterFiles?: CustomRoute[]; fallback?: CustomRoute[] }
167
171
 
168
172
  export interface BuildManifestInput {
169
- config: ResolvedConfig;
170
- routes: RouteManifestEntry[];
171
- nextConfig: { redirects?: unknown; rewrites?: unknown };
173
+ config: ResolvedConfig
174
+ routes: RouteManifestEntry[]
175
+ nextConfig: { redirects?: unknown; rewrites?: unknown }
172
176
  }
173
177
 
174
178
  export async function buildRouteTypesManifest({
@@ -176,19 +180,19 @@ export async function buildRouteTypesManifest({
176
180
  routes,
177
181
  nextConfig,
178
182
  }: BuildManifestInput): Promise<RouteTypesManifest> {
179
- const relApp = (file: string) => toPosixPath(path.relative(config.root, file));
180
- const isHybrid = config.appPath.includes('pnext-pages-compat');
183
+ const relApp = (file: string) => toPosixPath(path.relative(config.root, file))
184
+ const isHybrid = config.appPath.includes('pnext-pages-compat')
181
185
  const sourceAppPath = (entry: RouteManifestEntry): string | undefined => {
182
- if (!isHybrid) return entry.file;
183
- const basename = entry.kind === 'page' ? /^page\.(?:tsx?|jsx?|mdx?)$/ : /^route\.(?:tsx?|jsx?)$/;
186
+ if (!isHybrid) return entry.file
187
+ const basename = entry.kind === 'page' ? /^page\.(?:tsx?|jsx?|mdx?)$/ : /^route\.(?:tsx?|jsx?)$/
184
188
  const source = entry.sourceFiles.find(file => {
185
- const normalized = toPosixPath(file);
186
- return normalized.includes('/source-app/') && basename.test(path.basename(normalized));
187
- });
188
- if (!source) return undefined;
189
- const relative = toPosixPath(source).split('/source-app/')[1];
190
- return relative ? path.join(config.root, 'app', relative) : undefined;
191
- };
189
+ const normalized = toPosixPath(file)
190
+ return normalized.includes('/source-app/') && basename.test(path.basename(normalized))
191
+ })
192
+ if (!source) return undefined
193
+ const relative = toPosixPath(source).split('/source-app/')[1]
194
+ return relative ? path.join(config.root, 'app', relative) : undefined
195
+ }
192
196
 
193
197
  const manifest: RouteTypesManifest = {
194
198
  appRoutes: {},
@@ -203,7 +207,7 @@ export async function buildRouteTypesManifest({
203
207
  appRouteHandlers: new Set(),
204
208
  pageApiRoutes: new Set(),
205
209
  filePathToRoute: new Map(),
206
- };
210
+ }
207
211
 
208
212
  // App pages + route handlers from pnext's scanned entries. Skip synthetic /
209
213
  // interception entries (typegen resolves interceptors to their canonical page
@@ -213,55 +217,55 @@ export async function buildRouteTypesManifest({
213
217
  // wrappers which belong in PageRoutes.
214
218
  const hybridFilteredRoutes = isHybrid
215
219
  ? routes.filter(entry => {
216
- const file = entry.file;
217
- if (!file.includes('pnext-pages-compat')) return true;
218
- const sourceFiles = (entry as { sourceFiles?: string[] }).sourceFiles ?? [];
219
- const isPagesWrapper = sourceFiles.some(sf => sf.includes('source-pages'));
220
- if (isPagesWrapper) return false;
221
- return true;
220
+ const file = entry.file
221
+ if (!file.includes('pnext-pages-compat')) return true
222
+ const sourceFiles = (entry as { sourceFiles?: string[] }).sourceFiles ?? []
223
+ const isPagesWrapper = sourceFiles.some(sf => sf.includes('source-pages'))
224
+ if (isPagesWrapper) return false
225
+ return true
222
226
  })
223
- : routes;
227
+ : routes
224
228
 
225
229
  for (const entry of hybridFilteredRoutes) {
226
- if (entry.synthetic || entry.interception || entry.metadataRoute) continue;
227
- const source = sourceAppPath(entry);
228
- if (!source) continue;
229
- const bracket = bracketRouteFromEntry(entry);
230
- const rel = relApp(source);
231
- const info: ManifestRouteInfo = { path: rel, groups: groupsFromBracketRoute(bracket) };
230
+ if (entry.synthetic || entry.interception || entry.metadataRoute) continue
231
+ const source = sourceAppPath(entry)
232
+ if (!source) continue
233
+ const bracket = bracketRouteFromEntry(entry)
234
+ const rel = relApp(source)
235
+ const info: ManifestRouteInfo = { path: rel, groups: groupsFromBracketRoute(bracket) }
232
236
  if (entry.kind === 'page') {
233
- if (!manifest.appRoutes[bracket]) manifest.appRoutes[bracket] = info;
237
+ if (!manifest.appRoutes[bracket]) manifest.appRoutes[bracket] = info
234
238
  // appPagePaths/filePathToRoute (the validator inputs) are populated by an independent filesystem scan
235
239
  // below, NOT from runtime entries: pnext's scanner collapses parallel-route slot pages onto a single
236
240
  // representative route entry, which mis-maps a slot page's route and drops its siblings, breaking the
237
241
  // generated validator's tsc.
238
242
  } else {
239
- if (!manifest.appRouteHandlerRoutes[bracket]) manifest.appRouteHandlerRoutes[bracket] = info;
240
- manifest.appRouteHandlers.add(rel);
241
- manifest.filePathToRoute.set(rel, bracket);
243
+ if (!manifest.appRouteHandlerRoutes[bracket]) manifest.appRouteHandlerRoutes[bracket] = info
244
+ manifest.appRouteHandlers.add(rel)
245
+ manifest.filePathToRoute.set(rel, bracket)
242
246
  }
243
247
  }
244
248
 
245
249
  // Layouts + slots: independent app-dir scan (pnext entries don't carry them).
246
- const appFiles = await walkFiles(isHybrid ? path.join(config.root, 'app') : config.appPath);
247
- const appPath = isHybrid ? path.join(config.root, 'app') : config.appPath;
250
+ const appFiles = await walkFiles(isHybrid ? path.join(config.root, 'app') : config.appPath)
251
+ const appPath = isHybrid ? path.join(config.root, 'app') : config.appPath
248
252
  for (const file of appFiles) {
249
- const relative = toPosixPath(path.relative(appPath, file));
250
- const base = path.basename(relative);
251
- if (!LAYOUT_NAMES.has(base)) continue;
252
- const dir = path.dirname(relative) === '.' ? '' : path.dirname(relative);
253
- if (isPrivate(dir)) continue;
254
- const bracket = bracketRouteFromDir(dir);
255
- const rel = relApp(file);
253
+ const relative = toPosixPath(path.relative(appPath, file))
254
+ const base = path.basename(relative)
255
+ if (!LAYOUT_NAMES.has(base)) continue
256
+ const dir = path.dirname(relative) === '.' ? '' : path.dirname(relative)
257
+ if (isPrivate(dir)) continue
258
+ const bracket = bracketRouteFromDir(dir)
259
+ const rel = relApp(file)
256
260
  if (!manifest.layoutRoutes[bracket]) {
257
261
  manifest.layoutRoutes[bracket] = {
258
262
  path: rel,
259
263
  groups: groupsFromBracketRoute(bracket),
260
264
  slots: [],
261
- };
265
+ }
262
266
  }
263
- manifest.layoutPaths.add(rel);
264
- manifest.filePathToRoute.set(rel, bracket);
267
+ manifest.layoutPaths.add(rel)
268
+ manifest.filePathToRoute.set(rel, bracket)
265
269
  }
266
270
 
267
271
  // Slots: `@name` dirs whose nearest ancestor layout owns them. A path can
@@ -269,22 +273,22 @@ export async function buildRouteTypesManifest({
269
273
  // the slot that owns a given file is the deepest (last) one on the path,
270
274
  // not the first, since the layout receiving the prop lives directly under it.
271
275
  for (const file of appFiles) {
272
- const relative = toPosixPath(path.relative(appPath, file));
273
- const segments = relative.split('/');
274
- let slotIndex = -1;
276
+ const relative = toPosixPath(path.relative(appPath, file))
277
+ const segments = relative.split('/')
278
+ let slotIndex = -1
275
279
  for (let i = segments.length - 1; i >= 0; i--) {
276
280
  if (isSlotSegment(segments[i]!)) {
277
- slotIndex = i;
278
- break;
281
+ slotIndex = i
282
+ break
279
283
  }
280
284
  }
281
- if (slotIndex === -1) continue;
282
- const slotName = segments[slotIndex]!.slice(1);
283
- const ownerDir = segments.slice(0, slotIndex).join('/');
284
- if (isPrivate(ownerDir)) continue;
285
- const ownerRoute = bracketRouteFromDir(ownerDir);
286
- const layout = manifest.layoutRoutes[ownerRoute];
287
- if (layout && !layout.slots.includes(slotName)) layout.slots.push(slotName);
285
+ if (slotIndex === -1) continue
286
+ const slotName = segments[slotIndex]!.slice(1)
287
+ const ownerDir = segments.slice(0, slotIndex).join('/')
288
+ if (isPrivate(ownerDir)) continue
289
+ const ownerRoute = bracketRouteFromDir(ownerDir)
290
+ const layout = manifest.layoutRoutes[ownerRoute]
291
+ if (layout && !layout.slots.includes(slotName)) layout.slots.push(slotName)
288
292
  }
289
293
 
290
294
  // App pages for the validator: an independent filesystem scan of every `page.{ext}` (including
@@ -293,64 +297,64 @@ export async function buildRouteTypesManifest({
293
297
  // `dashboard/@analytics/page.tsx` renders at `/dashboard`, so it must validate against `/dashboard`.
294
298
  // Guarded to routes that are actually routable, so private and interception pages are excluded - the
295
299
  // AppPageConfig<Route> constraint requires `Route extends AppRoutes`.
296
- const PAGE_BASENAMES = new Set(PAGE_EXTENSIONS.map(ext => `page.${ext}`));
300
+ const PAGE_BASENAMES = new Set(PAGE_EXTENSIONS.map(ext => `page.${ext}`))
297
301
  for (const file of appFiles) {
298
- const relative = toPosixPath(path.relative(appPath, file));
299
- if (!PAGE_BASENAMES.has(path.basename(relative))) continue;
300
- const dir = path.dirname(relative) === '.' ? '' : path.dirname(relative);
301
- if (isPrivate(dir)) continue;
302
- const route = bracketRouteFromDir(dir);
303
- if (!manifest.appRoutes[route]) continue;
304
- const rel = relApp(file);
305
- manifest.appPagePaths.add(rel);
306
- manifest.filePathToRoute.set(rel, route);
302
+ const relative = toPosixPath(path.relative(appPath, file))
303
+ if (!PAGE_BASENAMES.has(path.basename(relative))) continue
304
+ const dir = path.dirname(relative) === '.' ? '' : path.dirname(relative)
305
+ if (isPrivate(dir)) continue
306
+ const route = bracketRouteFromDir(dir)
307
+ if (!manifest.appRoutes[route]) continue
308
+ const rel = relApp(file)
309
+ manifest.appPagePaths.add(rel)
310
+ manifest.filePathToRoute.set(rel, route)
307
311
  }
308
312
 
309
313
  // Pages Router: pages/*.{ext} (non-api) -> pageRoutes; pages/api/** -> pageApiRoutes.
310
- const pagesDir = path.join(config.root, 'pages');
314
+ const pagesDir = path.join(config.root, 'pages')
311
315
  for (const file of await walkFiles(pagesDir)) {
312
- const relative = toPosixPath(path.relative(pagesDir, file));
313
- if (!PAGE_EXTENSIONS.some(ext => relative.endsWith(`.${ext}`))) continue;
314
- const base = path.basename(relative);
316
+ const relative = toPosixPath(path.relative(pagesDir, file))
317
+ if (!PAGE_EXTENSIONS.some(ext => relative.endsWith(`.${ext}`))) continue
318
+ const base = path.basename(relative)
315
319
  if (base.startsWith('_app.') || base.startsWith('_document.') || base.startsWith('_error.')) {
316
- continue;
320
+ continue
317
321
  }
318
- const rel = relApp(file);
319
- const isApi = relative === 'api' || relative.startsWith('api/');
320
- const route = pagesRouteFromRelative(relative);
322
+ const rel = relApp(file)
323
+ const isApi = relative === 'api' || relative.startsWith('api/')
324
+ const route = pagesRouteFromRelative(relative)
321
325
  if (isApi) {
322
- manifest.pageApiRoutes.add(rel);
323
- manifest.filePathToRoute.set(rel, route);
326
+ manifest.pageApiRoutes.add(rel)
327
+ manifest.filePathToRoute.set(rel, route)
324
328
  } else {
325
- manifest.pageRoutes[route] = { path: rel, groups: groupsFromBracketRoute(route) };
326
- manifest.pagesRouterPagePaths.add(rel);
327
- manifest.filePathToRoute.set(rel, route);
329
+ manifest.pageRoutes[route] = { path: rel, groups: groupsFromBracketRoute(route) }
330
+ manifest.pagesRouterPagePaths.add(rel)
331
+ manifest.filePathToRoute.set(rel, route)
328
332
  }
329
333
  }
330
334
 
331
335
  // redirects / rewrites from next.config.
332
- const redirects = nextConfig.redirects;
336
+ const redirects = nextConfig.redirects
333
337
  if (typeof redirects === 'function') {
334
- const list = await (redirects as RedirectsFn)();
338
+ const list = await (redirects as RedirectsFn)()
335
339
  for (const item of list ?? []) {
336
340
  for (const route of convertCustomRouteSource(item.source)) {
337
- manifest.redirectRoutes[route] = { path: route, groups: groupsFromBracketRoute(route) };
341
+ manifest.redirectRoutes[route] = { path: route, groups: groupsFromBracketRoute(route) }
338
342
  }
339
343
  }
340
344
  }
341
345
 
342
- const rewrites = nextConfig.rewrites;
346
+ const rewrites = nextConfig.rewrites
343
347
  if (typeof rewrites === 'function') {
344
- const result = await (rewrites as RewritesFn)();
348
+ const result = await (rewrites as RewritesFn)()
345
349
  const sources = Array.isArray(result)
346
350
  ? result
347
- : [...(result?.beforeFiles ?? []), ...(result?.afterFiles ?? []), ...(result?.fallback ?? [])];
351
+ : [...(result?.beforeFiles ?? []), ...(result?.afterFiles ?? []), ...(result?.fallback ?? [])]
348
352
  for (const item of sources) {
349
353
  for (const route of convertCustomRouteSource(item.source)) {
350
- manifest.rewriteRoutes[route] = { path: route, groups: groupsFromBracketRoute(route) };
354
+ manifest.rewriteRoutes[route] = { path: route, groups: groupsFromBracketRoute(route) }
351
355
  }
352
356
  }
353
357
  }
354
358
 
355
- return manifest;
359
+ return manifest
356
360
  }