@wular/pnext 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/README.md +153 -0
  2. package/bin/pnext +67 -0
  3. package/config/lint/base.js +48 -0
  4. package/config/ts/base.json +26 -0
  5. package/config/ts/react.json +13 -0
  6. package/package.json +70 -0
  7. package/reference/compat.md +63 -0
  8. package/reference/config.md +120 -0
  9. package/reference/css.md +58 -0
  10. package/reference/dev.md +69 -0
  11. package/reference/env.md +40 -0
  12. package/reference/metadata.md +86 -0
  13. package/reference/navigation.md +149 -0
  14. package/reference/overview.md +35 -0
  15. package/reference/performance.md +97 -0
  16. package/reference/rendering.md +127 -0
  17. package/reference/routing.md +167 -0
  18. package/reference/typegen.md +64 -0
  19. package/src/api/cache.ts +80 -0
  20. package/src/api/client-cache.ts +9 -0
  21. package/src/api/client-navigation.ts +279 -0
  22. package/src/api/dynamic.tsx +102 -0
  23. package/src/api/link.tsx +119 -0
  24. package/src/api/navigation.ts +198 -0
  25. package/src/api/router/events.ts +53 -0
  26. package/src/api/router/history.ts +70 -0
  27. package/src/api/router/hub.ts +194 -0
  28. package/src/api/router/policies.ts +107 -0
  29. package/src/api/router/runtime.ts +5238 -0
  30. package/src/api/router/types.ts +299 -0
  31. package/src/api/router.ts +167 -0
  32. package/src/api/server.ts +323 -0
  33. package/src/api/suspense.ts +16 -0
  34. package/src/cache/context.ts +61 -0
  35. package/src/cli/adapters/vercel-warm.ts +375 -0
  36. package/src/cli/adapters/vercel.ts +1310 -0
  37. package/src/cli/analyze-print.ts +181 -0
  38. package/src/cli/analyze.ts +328 -0
  39. package/src/cli/boot-trace.ts +29 -0
  40. package/src/cli/build.ts +3114 -0
  41. package/src/cli/dev.ts +276 -0
  42. package/src/cli/index.ts +196 -0
  43. package/src/cli/named-bin.ts +119 -0
  44. package/src/cli/serve-ui.ts +160 -0
  45. package/src/cli/start.ts +1425 -0
  46. package/src/client/build.ts +2136 -0
  47. package/src/client/chunk-fold.ts +526 -0
  48. package/src/client/entry.ts +1525 -0
  49. package/src/client/paths.ts +22 -0
  50. package/src/client/prebuilt.ts +621 -0
  51. package/src/client/profile.ts +75 -0
  52. package/src/client/react-compiler.ts +94 -0
  53. package/src/client/reference-stub.ts +145 -0
  54. package/src/client/reference.ts +47 -0
  55. package/src/compat/actions/action-client.ts +531 -0
  56. package/src/compat/actions/action-dispatch.ts +676 -0
  57. package/src/compat/actions/action-router.ts +40 -0
  58. package/src/compat/actions/action-shared.ts +95 -0
  59. package/src/compat/actions/client-plugin.ts +135 -0
  60. package/src/compat/actions/client-stub.ts +65 -0
  61. package/src/compat/actions/config.ts +164 -0
  62. package/src/compat/actions/detect.ts +208 -0
  63. package/src/compat/actions/discovery.ts +244 -0
  64. package/src/compat/actions/early-submit.ts +40 -0
  65. package/src/compat/actions/endpoint.ts +602 -0
  66. package/src/compat/actions/flight.ts +52 -0
  67. package/src/compat/actions/form-state.ts +73 -0
  68. package/src/compat/actions/hoist.ts +485 -0
  69. package/src/compat/actions/ids.ts +39 -0
  70. package/src/compat/actions/index.ts +41 -0
  71. package/src/compat/actions/instances.ts +144 -0
  72. package/src/compat/actions/origin.ts +109 -0
  73. package/src/compat/actions/protocol.ts +125 -0
  74. package/src/compat/actions/registry.ts +74 -0
  75. package/src/compat/actions/rewrite.ts +282 -0
  76. package/src/compat/actions/serve.ts +414 -0
  77. package/src/compat/actions/server-tag.ts +21 -0
  78. package/src/compat/actions/unrecognized-error.ts +30 -0
  79. package/src/compat/adapter/build-complete.ts +257 -0
  80. package/src/compat/bundler/bun-externals.ts +53 -0
  81. package/src/compat/bundler/cjs-exports.ts +542 -0
  82. package/src/compat/bundler/config.ts +363 -0
  83. package/src/compat/bundler/externals.ts +34 -0
  84. package/src/compat/bundler/import-meta-url.ts +60 -0
  85. package/src/compat/bundler/modularize-imports.ts +119 -0
  86. package/src/compat/bundler/new-url-asset.ts +87 -0
  87. package/src/compat/bundler/optimize-package-imports.ts +273 -0
  88. package/src/compat/bundler/polyfill.ts +88 -0
  89. package/src/compat/bundler/react-compiler.ts +61 -0
  90. package/src/compat/bundler/react-profiler.tsx +25 -0
  91. package/src/compat/bundler/relay-transform.ts +116 -0
  92. package/src/compat/bundler/require-context.ts +281 -0
  93. package/src/compat/bundler/resolve-extensions.ts +75 -0
  94. package/src/compat/bundler/source-cache.ts +61 -0
  95. package/src/compat/bundler/static-imports.ts +25 -0
  96. package/src/compat/bundler/symlink-imports.ts +119 -0
  97. package/src/compat/bundler/tsconfig-paths.ts +50 -0
  98. package/src/compat/bundler/wasm.ts +153 -0
  99. package/src/compat/bundler/webpack-loaders.ts +685 -0
  100. package/src/compat/bundler/worker.ts +278 -0
  101. package/src/compat/cache/build-flags.ts +81 -0
  102. package/src/compat/cache/build-prerender-errors.ts +163 -0
  103. package/src/compat/cache/custom-handler.ts +159 -0
  104. package/src/compat/cache/fetch-patch.ts +745 -0
  105. package/src/compat/cache/handler.ts +100 -0
  106. package/src/compat/cache/modern-handler.ts +275 -0
  107. package/src/compat/cache/resume-data-cache.ts +143 -0
  108. package/src/compat/cache/revalidate.ts +759 -0
  109. package/src/compat/cache/runtime-error.ts +124 -0
  110. package/src/compat/cache/use-cache-transform.ts +961 -0
  111. package/src/compat/cache/use-cache.ts +1695 -0
  112. package/src/compat/cache-control.ts +269 -0
  113. package/src/compat/client/base-path.ts +64 -0
  114. package/src/compat/client/css-order.ts +36 -0
  115. package/src/compat/client/errors/control-flow.ts +92 -0
  116. package/src/compat/client/errors/error-boundary.ts +222 -0
  117. package/src/compat/client/errors/global-error.ts +238 -0
  118. package/src/compat/client/errors/install.ts +217 -0
  119. package/src/compat/client/errors/lazy.ts +53 -0
  120. package/src/compat/client/errors/primitive-throw.ts +126 -0
  121. package/src/compat/client/errors/soft-refresh.ts +14 -0
  122. package/src/compat/client/link-status.ts +86 -0
  123. package/src/compat/client/nav-compat-runtime.ts +57 -0
  124. package/src/compat/client/nav-compat.ts +42 -0
  125. package/src/compat/client/navigation-scroll.ts +154 -0
  126. package/src/compat/client/optimistic-routing.ts +206 -0
  127. package/src/compat/client/prefetch-cache.ts +111 -0
  128. package/src/compat/client/route-announcer.ts +72 -0
  129. package/src/compat/client/segment-cache-policy.ts +159 -0
  130. package/src/compat/client/segment-cache.ts +1077 -0
  131. package/src/compat/client/segment-prefetch.ts +375 -0
  132. package/src/compat/client/trailing-slash.ts +24 -0
  133. package/src/compat/css/chunking.ts +254 -0
  134. package/src/compat/css/inline-css.ts +73 -0
  135. package/src/compat/css/lightningcss.ts +90 -0
  136. package/src/compat/css/modules.ts +373 -0
  137. package/src/compat/css/nonce.ts +30 -0
  138. package/src/compat/css/sass-plugin.ts +65 -0
  139. package/src/compat/css/sass.ts +392 -0
  140. package/src/compat/css/styled-jsx-runtime.ts +80 -0
  141. package/src/compat/css/styled-jsx.ts +49 -0
  142. package/src/compat/edge-runtime.ts +71 -0
  143. package/src/compat/export/client.ts +112 -0
  144. package/src/compat/export/index.ts +272 -0
  145. package/src/compat/export/standalone.ts +207 -0
  146. package/src/compat/image-optimizer/cache.ts +119 -0
  147. package/src/compat/image-optimizer/detect.ts +143 -0
  148. package/src/compat/image-optimizer/index.ts +601 -0
  149. package/src/compat/image-optimizer/source.ts +243 -0
  150. package/src/compat/index.ts +458 -0
  151. package/src/compat/lifecycle/after-scope.ts +86 -0
  152. package/src/compat/lifecycle/after.ts +173 -0
  153. package/src/compat/lifecycle/error-funnel.ts +306 -0
  154. package/src/compat/lifecycle/error-serialize.ts +87 -0
  155. package/src/compat/lifecycle/error-ui.ts +167 -0
  156. package/src/compat/lifecycle/instrumentation-client.ts +138 -0
  157. package/src/compat/lifecycle/instrumentation.ts +277 -0
  158. package/src/compat/lifecycle/node-console.ts +19 -0
  159. package/src/compat/lifecycle/testmode.ts +263 -0
  160. package/src/compat/mdx/compile.ts +219 -0
  161. package/src/compat/mdx/next-mdx-stub.ts +46 -0
  162. package/src/compat/mdx/plugin.ts +37 -0
  163. package/src/compat/metadata-route-artifacts.ts +458 -0
  164. package/src/compat/metadata.ts +295 -0
  165. package/src/compat/middleware/manifest.ts +210 -0
  166. package/src/compat/misc/action-return.ts +173 -0
  167. package/src/compat/next/cache.ts +211 -0
  168. package/src/compat/next/canonical-url.ts +35 -0
  169. package/src/compat/next/client-cache.ts +57 -0
  170. package/src/compat/next/client-navigation.ts +313 -0
  171. package/src/compat/next/client-only.ts +3 -0
  172. package/src/compat/next/client-script.tsx +215 -0
  173. package/src/compat/next/client-server.ts +39 -0
  174. package/src/compat/next/config-loader.ts +569 -0
  175. package/src/compat/next/config.ts +29 -0
  176. package/src/compat/next/constants.cjs +6 -0
  177. package/src/compat/next/constants.ts +6 -0
  178. package/src/compat/next/custom-server.ts +236 -0
  179. package/src/compat/next/dist/client/components/app-router-headers.ts +32 -0
  180. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +38 -0
  181. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -0
  182. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -0
  183. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -0
  184. package/src/compat/next/dynamic.tsx +46 -0
  185. package/src/compat/next/error.tsx +148 -0
  186. package/src/compat/next/font/cache.ts +171 -0
  187. package/src/compat/next/font/google.ts +2 -0
  188. package/src/compat/next/font/index.ts +8 -0
  189. package/src/compat/next/font/local.ts +5 -0
  190. package/src/compat/next/font/runtime-client.ts +71 -0
  191. package/src/compat/next/font/runtime.ts +974 -0
  192. package/src/compat/next/font/shared.ts +281 -0
  193. package/src/compat/next/form.tsx +156 -0
  194. package/src/compat/next/head.tsx +10 -0
  195. package/src/compat/next/headers.ts +247 -0
  196. package/src/compat/next/image/config.ts +196 -0
  197. package/src/compat/next/image/optimizer.ts +96 -0
  198. package/src/compat/next/image/patterns.ts +103 -0
  199. package/src/compat/next/image/shared.ts +141 -0
  200. package/src/compat/next/image/static-metadata.ts +283 -0
  201. package/src/compat/next/image/validate.ts +269 -0
  202. package/src/compat/next/image-client.tsx +215 -0
  203. package/src/compat/next/image-props.ts +575 -0
  204. package/src/compat/next/image-usage.ts +102 -0
  205. package/src/compat/next/image.tsx +56 -0
  206. package/src/compat/next/index.ts +1 -0
  207. package/src/compat/next/legacy-image.tsx +97 -0
  208. package/src/compat/next/link-usage.ts +29 -0
  209. package/src/compat/next/link-validation-transform.ts +200 -0
  210. package/src/compat/next/link.tsx +466 -0
  211. package/src/compat/next/navigation.cjs +21 -0
  212. package/src/compat/next/navigation.ts +188 -0
  213. package/src/compat/next/offline.ts +51 -0
  214. package/src/compat/next/og.ts +324 -0
  215. package/src/compat/next/optimistic-route-state.ts +188 -0
  216. package/src/compat/next/preferred-region.ts +39 -0
  217. package/src/compat/next/redirects.ts +131 -0
  218. package/src/compat/next/resource-hints.ts +136 -0
  219. package/src/compat/next/rewrites.ts +350 -0
  220. package/src/compat/next/root-params.ts +142 -0
  221. package/src/compat/next/router.cjs +49 -0
  222. package/src/compat/next/router.ts +143 -0
  223. package/src/compat/next/script.tsx +355 -0
  224. package/src/compat/next/server-only.ts +3 -0
  225. package/src/compat/next/server.ts +28 -0
  226. package/src/compat/next/svgr.ts +58 -0
  227. package/src/compat/next/telemetry.ts +77 -0
  228. package/src/compat/next/user-agent.ts +100 -0
  229. package/src/compat/next/web-vitals.ts +56 -0
  230. package/src/compat/otel/api.ts +95 -0
  231. package/src/compat/otel/client-trace-metadata.ts +71 -0
  232. package/src/compat/otel/fetch-span.ts +77 -0
  233. package/src/compat/otel/tracer.ts +944 -0
  234. package/src/compat/pages/client-plugin.ts +108 -0
  235. package/src/compat/pages/index.ts +527 -0
  236. package/src/compat/pages/router-state.ts +94 -0
  237. package/src/compat/ppr/io.ts +38 -0
  238. package/src/compat/ppr/missing-root-params.ts +105 -0
  239. package/src/compat/ppr/root-params-scan.ts +164 -0
  240. package/src/compat/ppr/root-params-transform.ts +75 -0
  241. package/src/compat/ppr/root-params.ts +129 -0
  242. package/src/compat/ppr/segment-config-incompat.ts +34 -0
  243. package/src/compat/protocol.ts +202 -0
  244. package/src/compat/react/client.ts +59 -0
  245. package/src/compat/react/compiler-runtime.ts +60 -0
  246. package/src/compat/react/dom-client.ts +115 -0
  247. package/src/compat/react/dom-react-server.ts +20 -0
  248. package/src/compat/react/dom-server.ts +40 -0
  249. package/src/compat/react/dom.ts +154 -0
  250. package/src/compat/react/preact.ts +522 -0
  251. package/src/compat/react/react-server.ts +84 -0
  252. package/src/compat/react/router-shim.ts +26 -0
  253. package/src/compat/react/server-component-use.ts +48 -0
  254. package/src/compat/react/server-inserted-html.ts +87 -0
  255. package/src/compat/react/server.ts +156 -0
  256. package/src/compat/react/view-transition.ts +60 -0
  257. package/src/compat/register/actions.ts +875 -0
  258. package/src/compat/register/boot.ts +141 -0
  259. package/src/compat/register/build-tier.ts +11 -0
  260. package/src/compat/register/build.ts +182 -0
  261. package/src/compat/register/bundler.ts +587 -0
  262. package/src/compat/register/cache.ts +85 -0
  263. package/src/compat/register/client-errors.ts +18 -0
  264. package/src/compat/register/config.ts +17 -0
  265. package/src/compat/register/css-extras.ts +120 -0
  266. package/src/compat/register/edge-runtime.ts +6 -0
  267. package/src/compat/register/errors.ts +46 -0
  268. package/src/compat/register/export.ts +23 -0
  269. package/src/compat/register/font.ts +36 -0
  270. package/src/compat/register/hooks.ts +34 -0
  271. package/src/compat/register/image.ts +133 -0
  272. package/src/compat/register/index.ts +111 -0
  273. package/src/compat/register/instrumentation-client.ts +35 -0
  274. package/src/compat/register/lifecycle.ts +86 -0
  275. package/src/compat/register/mdx.ts +48 -0
  276. package/src/compat/register/middleware.ts +36 -0
  277. package/src/compat/register/misc.ts +44 -0
  278. package/src/compat/register/otel.ts +288 -0
  279. package/src/compat/register/pages-api.ts +473 -0
  280. package/src/compat/register/ppr.ts +56 -0
  281. package/src/compat/register/protocol.ts +57 -0
  282. package/src/compat/register/proxy.ts +127 -0
  283. package/src/compat/register/render.ts +268 -0
  284. package/src/compat/register/routing.ts +410 -0
  285. package/src/compat/register/segment.ts +1903 -0
  286. package/src/compat/register/static-image.ts +21 -0
  287. package/src/compat/register/typed-routes.ts +35 -0
  288. package/src/compat/register/usecache.ts +131 -0
  289. package/src/compat/register/validation.ts +56 -0
  290. package/src/compat/segment/loading-boundary.ts +113 -0
  291. package/src/compat/segment/page-slot.ts +200 -0
  292. package/src/compat/segment/tree.ts +481 -0
  293. package/src/compat/segment/vary-key.ts +102 -0
  294. package/src/compat/segment/vary-params.ts +551 -0
  295. package/src/compat/static-params.ts +33 -0
  296. package/src/compat/tsconfig-defaults.ts +301 -0
  297. package/src/compat/typecheck/index.ts +1481 -0
  298. package/src/compat/typecheck/worker.ts +26 -0
  299. package/src/compat/typed-routes/index.ts +92 -0
  300. package/src/compat/typed-routes/manifest.ts +356 -0
  301. package/src/compat/typed-routes/typegen.ts +566 -0
  302. package/src/compat/validation/errors.ts +159 -0
  303. package/src/compat/validation/index.ts +1770 -0
  304. package/src/compat/validation/prerender-diagnostics.ts +1508 -0
  305. package/src/compat-bootstrap.ts +67 -0
  306. package/src/config.ts +218 -0
  307. package/src/css/build.ts +697 -0
  308. package/src/css/index.ts +2 -0
  309. package/src/css/postcss.ts +236 -0
  310. package/src/css/worker.ts +34 -0
  311. package/src/dev/client-actions.ts +35 -0
  312. package/src/dev/client-chunk-store.ts +92 -0
  313. package/src/dev/client-key-cache.ts +178 -0
  314. package/src/dev/global-css-cache.ts +212 -0
  315. package/src/dev/imports.ts +2430 -0
  316. package/src/dev/module-cache.ts +721 -0
  317. package/src/dev/module-generations.ts +38 -0
  318. package/src/dev/module-transform.ts +188 -0
  319. package/src/dev/node-module-bundle-cache.ts +63 -0
  320. package/src/dev/restart-cache.ts +10 -0
  321. package/src/dev/route-bundle-key-cache.ts +154 -0
  322. package/src/dev/route-facts-cache.ts +223 -0
  323. package/src/dev/server.ts +1710 -0
  324. package/src/dynamic/source.ts +307 -0
  325. package/src/dynamic/tree-shake.ts +262 -0
  326. package/src/env.ts +92 -0
  327. package/src/extensions.ts +1898 -0
  328. package/src/index.ts +34 -0
  329. package/src/internal.ts +43 -0
  330. package/src/islands/boundary-error.ts +8 -0
  331. package/src/islands/static-children.ts +37 -0
  332. package/src/islands/static-slots.ts +106 -0
  333. package/src/ppr-postpone.ts +24 -0
  334. package/src/ppr.ts +784 -0
  335. package/src/proxy.ts +752 -0
  336. package/src/render/hooks.ts +384 -0
  337. package/src/render/index.ts +1 -0
  338. package/src/render/island-context.ts +47 -0
  339. package/src/render/metadata.ts +857 -0
  340. package/src/render/renderer.ts +7391 -0
  341. package/src/render/resource-hints.ts +44 -0
  342. package/src/render/slots.tsx +679 -0
  343. package/src/request/context.ts +396 -0
  344. package/src/resolve/engine.ts +219 -0
  345. package/src/resolve/imports.ts +1104 -0
  346. package/src/resolve/scan-facts.ts +474 -0
  347. package/src/resolve/source-text.ts +86 -0
  348. package/src/routing/forwarded.ts +41 -0
  349. package/src/routing/handler.ts +271 -0
  350. package/src/routing/href.ts +203 -0
  351. package/src/routing/metadata.ts +1018 -0
  352. package/src/routing/request-runtime.ts +43 -0
  353. package/src/routing/routes.ts +2560 -0
  354. package/src/routing/slots.ts +432 -0
  355. package/src/runtime/server.ts +3453 -0
  356. package/src/runtime/vendor.ts +1160 -0
  357. package/src/style-modules.d.ts +9 -0
  358. package/src/typegen.ts +151 -0
  359. package/src/types.ts +725 -0
  360. package/src/utils/ansi.ts +9 -0
  361. package/src/utils/content-type.ts +31 -0
  362. package/src/utils/decode.ts +7 -0
  363. package/src/utils/dev-profile.ts +31 -0
  364. package/src/utils/error-log.ts +29 -0
  365. package/src/utils/fs-cache.ts +31 -0
  366. package/src/utils/fs.ts +119 -0
  367. package/src/utils/html.ts +46 -0
  368. package/src/utils/serialize.ts +378 -0
  369. package/src/utils/source.ts +35 -0
  370. package/src/utils/verbose.ts +39 -0
  371. package/tsconfig.json +10 -0
@@ -0,0 +1,566 @@
1
+ // Next-identical codegen for `.next/types/{routes.d.ts,link.d.ts,validator.ts}`.
2
+ // Ported near-verbatim from Next 16.3's router-utils/typegen.ts (non-strict
3
+ // variants) so the generated output matches the exact substrings the
4
+ // typed-routes / typed-routes-validator e2e suites assert on. Compat-only.
5
+ import type { ManifestRouteInfo, RouteTypesManifest } from './manifest';
6
+
7
+ function isDynamicRoute(route: string): boolean {
8
+ return /\[.+\]/.test(route);
9
+ }
10
+
11
+ function generateRouteTypes(manifest: RouteTypesManifest): string {
12
+ const appRoutes = Object.keys(manifest.appRoutes).sort();
13
+ const pageRoutes = Object.keys(manifest.pageRoutes).sort();
14
+ const layoutRoutes = Object.keys(manifest.layoutRoutes).sort();
15
+ const redirectRoutes = Object.keys(manifest.redirectRoutes).sort();
16
+ const rewriteRoutes = Object.keys(manifest.rewriteRoutes).sort();
17
+ const appRouteHandlerRoutes = Object.keys(manifest.appRouteHandlerRoutes).sort();
18
+ const hasAppRouteHandlers = appRouteHandlerRoutes.length > 0;
19
+
20
+ const union = (list: string[]) => list.map(route => JSON.stringify(route)).join(' | ');
21
+
22
+ let result = '';
23
+ result += appRoutes.length > 0 ? `type AppRoutes = ${union(appRoutes)}\n` : 'type AppRoutes = never\n';
24
+ if (hasAppRouteHandlers) {
25
+ result += `type AppRouteHandlerRoutes = ${union(appRouteHandlerRoutes)}\n`;
26
+ }
27
+ result += pageRoutes.length > 0 ? `type PageRoutes = ${union(pageRoutes)}\n` : 'type PageRoutes = never\n';
28
+ result +=
29
+ layoutRoutes.length > 0 ? `type LayoutRoutes = ${union(layoutRoutes)}\n` : 'type LayoutRoutes = never\n';
30
+ result +=
31
+ redirectRoutes.length > 0
32
+ ? `type RedirectRoutes = ${union(redirectRoutes)}\n`
33
+ : 'type RedirectRoutes = never\n';
34
+ result +=
35
+ rewriteRoutes.length > 0
36
+ ? `type RewriteRoutes = ${union(rewriteRoutes)}\n`
37
+ : 'type RewriteRoutes = never\n';
38
+
39
+ const routeUnionParts = ['AppRoutes', 'PageRoutes', 'LayoutRoutes', 'RedirectRoutes', 'RewriteRoutes'];
40
+ if (hasAppRouteHandlers) routeUnionParts.push('AppRouteHandlerRoutes');
41
+ result += `type Routes = ${routeUnionParts.join(' | ')}\n`;
42
+ return result;
43
+ }
44
+
45
+ function generateParamTypes(manifest: RouteTypesManifest): string {
46
+ const allRoutes: Record<string, ManifestRouteInfo> = {
47
+ ...manifest.appRoutes,
48
+ ...manifest.appRouteHandlerRoutes,
49
+ ...manifest.pageRoutes,
50
+ ...manifest.layoutRoutes,
51
+ ...manifest.redirectRoutes,
52
+ ...manifest.rewriteRoutes,
53
+ };
54
+
55
+ let paramTypes = 'interface ParamMap {\n';
56
+ const sortedRoutes = Object.entries(allRoutes).sort(([a], [b]) => a.localeCompare(b));
57
+ for (const [route, routeInfo] of sortedRoutes) {
58
+ const groups = routeInfo.groups;
59
+ if (!isDynamicRoute(route) || Object.keys(groups ?? {}).length === 0) {
60
+ paramTypes += ` ${JSON.stringify(route)}: {}\n`;
61
+ continue;
62
+ }
63
+ let paramType = '{';
64
+ for (const [key, group] of Object.entries(groups)) {
65
+ const escapedKey = JSON.stringify(key);
66
+ if (group.repeat) {
67
+ paramType += group.optional ? ` ${escapedKey}?: string[];` : ` ${escapedKey}: string[];`;
68
+ } else {
69
+ paramType += group.optional ? ` ${escapedKey}?: string;` : ` ${escapedKey}: string;`;
70
+ }
71
+ }
72
+ paramType += ' }';
73
+ paramTypes += ` ${JSON.stringify(route)}: ${paramType}\n`;
74
+ }
75
+ paramTypes += '}\n';
76
+ return paramTypes;
77
+ }
78
+
79
+ function generateLayoutSlotMap(manifest: RouteTypesManifest): string {
80
+ let slotMap = 'interface LayoutSlotMap {\n';
81
+ const sorted = Object.entries(manifest.layoutRoutes).sort(([a], [b]) => a.localeCompare(b));
82
+ for (const [route, routeInfo] of sorted) {
83
+ const slots = [...routeInfo.slots].sort();
84
+ slotMap +=
85
+ slots.length > 0
86
+ ? ` ${JSON.stringify(route)}: ${slots.map(slot => JSON.stringify(slot)).join(' | ')}\n`
87
+ : ` ${JSON.stringify(route)}: never\n`;
88
+ }
89
+ slotMap += '}\n';
90
+ return slotMap;
91
+ }
92
+
93
+ function formatRouteToRouteType(route: string): { isDynamic: boolean; routeType: string } {
94
+ const isDynamic = isDynamicRoute(route);
95
+ let routeType = route;
96
+ if (isDynamic) {
97
+ routeType = route
98
+ .split('/')
99
+ .map(part => {
100
+ if (part.startsWith('[') && part.endsWith(']')) {
101
+ if (part.startsWith('[[...') && part.endsWith(']]')) return '${OptionalCatchAllSlug<T>}';
102
+ if (part.startsWith('[...')) return '${CatchAllSlug<T>}';
103
+ return '${SafeSlug<T>}';
104
+ }
105
+ return part;
106
+ })
107
+ .join('/');
108
+ }
109
+ return { isDynamic, routeType };
110
+ }
111
+
112
+ function serializeRouteTypes(routeTypes: [routeType: string, cause: string][]): string {
113
+ routeTypes.sort(([a], [b]) => a.localeCompare(b));
114
+ let union = '';
115
+ for (const [route, cause] of routeTypes) {
116
+ union += `\n | \`${route}\` // ${cause}`;
117
+ }
118
+ return union;
119
+ }
120
+
121
+ export function generateRouteTypesFile(manifest: RouteTypesManifest): string {
122
+ const routeTypes = generateRouteTypes(manifest);
123
+ const paramTypes = generateParamTypes(manifest);
124
+ const layoutSlotMap = generateLayoutSlotMap(manifest);
125
+ const hasAppRouteHandlers = Object.keys(manifest.appRouteHandlerRoutes).length > 0;
126
+
127
+ const routeExports = [
128
+ 'AppRoutes',
129
+ 'PageRoutes',
130
+ 'LayoutRoutes',
131
+ 'RedirectRoutes',
132
+ 'RewriteRoutes',
133
+ 'ParamMap',
134
+ ];
135
+ if (hasAppRouteHandlers) routeExports.push('AppRouteHandlerRoutes');
136
+ const exportStatement = `export type { ${routeExports.join(', ')} }`;
137
+
138
+ const routeContextInterface = hasAppRouteHandlers
139
+ ? `
140
+
141
+ /**
142
+ * Context for Next.js App Router route handlers
143
+ * @example
144
+ * \`\`\`tsx
145
+ * export async function GET(request: NextRequest, context: RouteContext<'/api/users/[id]'>) {
146
+ * const { id } = await context.params
147
+ * return Response.json({ id })
148
+ * }
149
+ * \`\`\`
150
+ */
151
+ interface RouteContext<AppRouteHandlerRoute extends AppRouteHandlerRoutes> {
152
+ params: Promise<ParamMap[AppRouteHandlerRoute]>
153
+ }`
154
+ : '';
155
+
156
+ return `// This file is generated automatically by Next.js
157
+ // Do not edit this file manually
158
+
159
+ ${routeTypes}
160
+
161
+ ${paramTypes}
162
+
163
+ export type ParamsOf<Route extends Routes> = ParamMap[Route]
164
+
165
+ ${layoutSlotMap}
166
+
167
+ ${exportStatement}
168
+
169
+ declare global {
170
+ /**
171
+ * Props for Next.js App Router page components
172
+ * @example
173
+ * \`\`\`tsx
174
+ * export default function Page(props: PageProps<'/blog/[slug]'>) {
175
+ * const { slug } = await props.params
176
+ * return <div>Blog post: {slug}</div>
177
+ * }
178
+ * \`\`\`
179
+ */
180
+ interface PageProps<AppRoute extends AppRoutes> {
181
+ params: Promise<ParamMap[AppRoute]>
182
+ searchParams: Promise<Record<string, string | string[] | undefined>>
183
+ }
184
+
185
+ /**
186
+ * Props for Next.js App Router layout components
187
+ * @example
188
+ * \`\`\`tsx
189
+ * export default function Layout(props: LayoutProps<'/dashboard'>) {
190
+ * return <div>{props.children}</div>
191
+ * }
192
+ * \`\`\`
193
+ */
194
+ type LayoutProps<LayoutRoute extends LayoutRoutes> = {
195
+ params: Promise<ParamMap[LayoutRoute]>
196
+ searchParams: Promise<Record<string, string | string[] | undefined>>
197
+ children: React.ReactNode
198
+ } & {
199
+ [K in LayoutSlotMap[LayoutRoute]]: React.ReactNode
200
+ }${routeContextInterface}
201
+ }
202
+ `;
203
+ }
204
+
205
+ export function generateLinkTypesFile(manifest: RouteTypesManifest): string {
206
+ const visited = new Set<string>();
207
+ const staticRouteTypes: [routeType: string, cause: string][] = [];
208
+ const dynamicRouteTypes: [routeType: string, cause: string][] = [];
209
+
210
+ for (const routeMap of [
211
+ manifest.appRoutes,
212
+ manifest.pageRoutes,
213
+ manifest.redirectRoutes,
214
+ manifest.rewriteRoutes,
215
+ manifest.appRouteHandlerRoutes,
216
+ ]) {
217
+ for (const route in routeMap) {
218
+ if (visited.has(route)) continue;
219
+ visited.add(route);
220
+ const { isDynamic, routeType } = formatRouteToRouteType(route);
221
+ const cause = routeMap[route]!.path;
222
+ (isDynamic ? dynamicRouteTypes : staticRouteTypes).push([routeType, cause]);
223
+ }
224
+ }
225
+
226
+ for (const filePath of manifest.pageApiRoutes) {
227
+ if (visited.has(filePath)) continue;
228
+ visited.add(filePath);
229
+ const { isDynamic, routeType } = formatRouteToRouteType(filePath);
230
+ (isDynamic ? dynamicRouteTypes : staticRouteTypes).push([routeType, filePath]);
231
+ }
232
+
233
+ const serializedStaticRouteTypes = serializeRouteTypes(staticRouteTypes);
234
+ const serializedDynamicRouteTypes = serializeRouteTypes(dynamicRouteTypes);
235
+ const routeTypesFallback =
236
+ !serializedStaticRouteTypes && !serializedDynamicRouteTypes ? 'string & {}' : '';
237
+
238
+ return `// This file is generated automatically by Next.js
239
+ // Do not edit this file manually
240
+
241
+ // Type definitions for Next.js routes
242
+
243
+ /**
244
+ * Internal types used by the Next.js router and Link component.
245
+ * These types are not meant to be used directly.
246
+ * @internal
247
+ */
248
+ declare namespace __next_route_internal_types__ {
249
+ type SearchOrHash = \`?\${string}\` | \`#\${string}\`
250
+ type WithProtocol = \`\${string}:\${string}\`
251
+
252
+ type Suffix = '' | SearchOrHash
253
+
254
+ type SafeSlug<S extends string> = S extends \`\${string}/\${string}\`
255
+ ? never
256
+ : S extends \`\${string}\${SearchOrHash}\`
257
+ ? never
258
+ : S extends ''
259
+ ? never
260
+ : S
261
+
262
+ type CatchAllSlug<S extends string> = S extends \`\${string}\${SearchOrHash}\`
263
+ ? never
264
+ : S extends ''
265
+ ? never
266
+ : S
267
+
268
+ type OptionalCatchAllSlug<S extends string> =
269
+ S extends \`\${string}\${SearchOrHash}\` ? never : S
270
+
271
+ type StaticRoutes = ${serializedStaticRouteTypes || 'never'}
272
+ type DynamicRoutes<T extends string = string> = ${serializedDynamicRouteTypes || 'never'}
273
+
274
+ type RouteImpl<T> = ${
275
+ routeTypesFallback ||
276
+ `
277
+ ${'| StaticRoutes'}
278
+ | SearchOrHash
279
+ | WithProtocol
280
+ | \`\${StaticRoutes}\${SearchOrHash}\`
281
+ | (T extends \`\${DynamicRoutes<infer _>}\${Suffix}\` ? T : never)
282
+ `
283
+ }
284
+ }
285
+
286
+ declare module 'next' {
287
+ export { default } from 'next/types.js'
288
+ export * from 'next/types.js'
289
+
290
+ export type Route<T extends string = string> =
291
+ __next_route_internal_types__.RouteImpl<T>
292
+ }
293
+
294
+ declare module 'next/link' {
295
+ export { useLinkStatus } from 'next/dist/client/link.js'
296
+
297
+ import type { LinkProps as OriginalLinkProps } from 'next/dist/client/link.js'
298
+ import type { AnchorHTMLAttributes, DetailedHTMLProps } from 'react'
299
+ import type { UrlObject } from 'url'
300
+
301
+ type LinkRestProps = Omit<
302
+ Omit<
303
+ DetailedHTMLProps<
304
+ AnchorHTMLAttributes<HTMLAnchorElement>,
305
+ HTMLAnchorElement
306
+ >,
307
+ keyof OriginalLinkProps
308
+ > &
309
+ OriginalLinkProps,
310
+ 'href'
311
+ >
312
+
313
+ export type LinkProps<RouteInferType> = LinkRestProps & {
314
+ /**
315
+ * The path or URL to navigate to. This is the only required prop. It can also be an object.
316
+ * @see https://nextjs.org/docs/api-reference/next/link
317
+ */
318
+ href: __next_route_internal_types__.RouteImpl<RouteInferType> | UrlObject
319
+ }
320
+
321
+ export default function Link<RouteType>(props: LinkProps<RouteType>): JSX.Element
322
+ }
323
+
324
+ declare module 'next/navigation' {
325
+ export * from 'next/dist/client/components/navigation.js'
326
+
327
+ import type { NavigateOptions, PrefetchOptions, AppRouterInstance as OriginalAppRouterInstance } from 'next/dist/shared/lib/app-router-context.shared-runtime.js'
328
+ import type { RedirectType } from 'next/dist/client/components/redirect-error.js'
329
+
330
+ interface AppRouterInstance extends OriginalAppRouterInstance {
331
+ /**
332
+ * Navigate to the provided href.
333
+ * Pushes a new history entry.
334
+ */
335
+ push<RouteType>(href: __next_route_internal_types__.RouteImpl<RouteType>, options?: NavigateOptions): void
336
+ /**
337
+ * Navigate to the provided href.
338
+ * Replaces the current history entry.
339
+ */
340
+ replace<RouteType>(href: __next_route_internal_types__.RouteImpl<RouteType>, options?: NavigateOptions): void
341
+ /**
342
+ * Prefetch the provided href.
343
+ */
344
+ prefetch<RouteType>(href: __next_route_internal_types__.RouteImpl<RouteType>, options?: PrefetchOptions): void
345
+ }
346
+
347
+ export function useRouter(): AppRouterInstance;
348
+
349
+ export function redirect<RouteType>(
350
+ url: __next_route_internal_types__.RouteImpl<RouteType>,
351
+ type?: RedirectType
352
+ ): never;
353
+
354
+ export function permanentRedirect<RouteType>(
355
+ url: __next_route_internal_types__.RouteImpl<RouteType>,
356
+ type?: RedirectType
357
+ ): never;
358
+ }
359
+
360
+ declare module 'next/form' {
361
+ import type { FormProps as OriginalFormProps } from 'next/dist/client/form.js'
362
+
363
+ type FormRestProps = Omit<OriginalFormProps, 'action'>
364
+
365
+ export type FormProps<RouteInferType> = {
366
+ action: __next_route_internal_types__.RouteImpl<RouteInferType> | ((formData: FormData) => void)
367
+ } & FormRestProps
368
+
369
+ export default function Form<RouteType>(props: FormProps<RouteType>): JSX.Element
370
+ }
371
+ `;
372
+ }
373
+
374
+ /**
375
+ * Non-strict validator file. `importDir` is the directory the validator.ts is
376
+ * written to (e.g. `<root>/.next/types`); import specifiers are recomputed
377
+ * relative to it from the manifest's root-relative paths.
378
+ */
379
+ export function generateValidatorFile(
380
+ manifest: RouteTypesManifest,
381
+ toImportSpecifier: (rootRelativePath: string) => string,
382
+ ): string {
383
+ const generateValidations = (
384
+ paths: string[],
385
+ type: 'AppPageConfig' | 'PagesPageConfig' | 'LayoutConfig' | 'RouteHandlerConfig' | 'ApiRouteConfig',
386
+ pathToRouteMap?: Map<string, string>,
387
+ ) =>
388
+ paths
389
+ .sort()
390
+ .filter(filePath => filePath.endsWith('.ts') || filePath.endsWith('.tsx'))
391
+ .filter(
392
+ filePath =>
393
+ type !== 'AppPageConfig' || filePath.endsWith('page.ts') || filePath.endsWith('page.tsx'),
394
+ )
395
+ .map(filePath => {
396
+ const importPath = toImportSpecifier(filePath);
397
+ const route = pathToRouteMap?.get(filePath);
398
+ const typeWithRoute =
399
+ route &&
400
+ (type === 'AppPageConfig' || type === 'LayoutConfig' || type === 'RouteHandlerConfig')
401
+ ? `${type}<${JSON.stringify(route)}>`
402
+ : type;
403
+ return `// Validate ${filePath}
404
+ {
405
+ type __IsExpected<Specific extends ${typeWithRoute}> = Specific
406
+ const handler = {} as typeof import(${JSON.stringify(importPath.replace(/\.tsx?$/, '.js'))})
407
+ type __Check = __IsExpected<typeof handler>
408
+ // @ts-ignore
409
+ type __Unused = __Check
410
+ }`;
411
+ })
412
+ .join('\n\n');
413
+
414
+ const appPageValidations = generateValidations(
415
+ [...manifest.appPagePaths].sort(),
416
+ 'AppPageConfig',
417
+ manifest.filePathToRoute,
418
+ );
419
+ const appRouteHandlerValidations = generateValidations(
420
+ [...manifest.appRouteHandlers].sort(),
421
+ 'RouteHandlerConfig',
422
+ manifest.filePathToRoute,
423
+ );
424
+ const pagesRouterPageValidations = generateValidations(
425
+ [...manifest.pagesRouterPagePaths].sort(),
426
+ 'PagesPageConfig',
427
+ );
428
+ const pagesApiRouteValidations = generateValidations(
429
+ [...manifest.pageApiRoutes].sort(),
430
+ 'ApiRouteConfig',
431
+ );
432
+ const layoutValidations = generateValidations(
433
+ [...manifest.layoutPaths].sort(),
434
+ 'LayoutConfig',
435
+ manifest.filePathToRoute,
436
+ );
437
+
438
+ const hasAppRouteHandlers = Object.keys(manifest.appRouteHandlerRoutes).length > 0;
439
+
440
+ let typeDefinitions = '';
441
+ if (appPageValidations) {
442
+ typeDefinitions += `type AppPageConfig<Route extends AppRoutes = AppRoutes> = {
443
+ default: React.JSXElementConstructor<PageProps<Route>> | ((props: { params: Promise<ParamMap[Route]>, searchParams: Promise<any> }) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
444
+ generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
445
+ generateMetadata?: (
446
+ props: { params: Promise<ParamMap[Route]> } & any,
447
+ parent: ResolvingMetadata
448
+ ) => Promise<any> | any
449
+ generateViewport?: (
450
+ props: { params: Promise<ParamMap[Route]> } & any,
451
+ parent: ResolvingViewport
452
+ ) => Promise<any> | any
453
+ metadata?: any
454
+ viewport?: any
455
+ }
456
+
457
+ `;
458
+ }
459
+
460
+ if (pagesRouterPageValidations) {
461
+ typeDefinitions += `type PagesPageConfig = {
462
+ default: React.ComponentType<any> | ((props: any) => React.ReactNode | Promise<React.ReactNode> | never | void)
463
+ getStaticProps?: (context: any) => Promise<any> | any
464
+ getStaticPaths?: (context: any) => Promise<any> | any
465
+ getServerSideProps?: (context: any) => Promise<any> | any
466
+ getInitialProps?: (context: any) => Promise<any> | any
467
+ /**
468
+ * Segment configuration for legacy Pages Router pages.
469
+ * Validated at build-time by parsePagesSegmentConfig.
470
+ */
471
+ config?: {
472
+ maxDuration?: number
473
+ runtime?: 'edge' | 'experimental-edge' | 'nodejs' | string // necessary unless config is exported as const
474
+ regions?: string[]
475
+ }
476
+ }
477
+
478
+ `;
479
+ }
480
+
481
+ if (layoutValidations) {
482
+ typeDefinitions += `type LayoutConfig<Route extends LayoutRoutes = LayoutRoutes> = {
483
+ default: React.ComponentType<LayoutProps<Route>> | ((props: LayoutProps<Route>) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
484
+ generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
485
+ generateMetadata?: (
486
+ props: { params: Promise<ParamMap[Route]> } & any,
487
+ parent: ResolvingMetadata
488
+ ) => Promise<any> | any
489
+ generateViewport?: (
490
+ props: { params: Promise<ParamMap[Route]> } & any,
491
+ parent: ResolvingViewport
492
+ ) => Promise<any> | any
493
+ metadata?: any
494
+ viewport?: any
495
+ }
496
+
497
+ `;
498
+ }
499
+
500
+ if (appRouteHandlerValidations) {
501
+ typeDefinitions += `type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRoutes> = {
502
+ GET?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
503
+ POST?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
504
+ PUT?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
505
+ PATCH?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
506
+ DELETE?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
507
+ HEAD?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
508
+ OPTIONS?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
509
+ }
510
+
511
+ `;
512
+ }
513
+
514
+ if (pagesApiRouteValidations) {
515
+ typeDefinitions += `type ApiRouteConfig = {
516
+ default: (req: any, res: any) => ReturnType<NextApiHandler>
517
+ config?: {
518
+ api?: {
519
+ bodyParser?: boolean | { sizeLimit?: number | string }
520
+ responseLimit?: string | number | boolean
521
+ externalResolver?: boolean
522
+ }
523
+ runtime?: 'edge' | 'experimental-edge' | 'nodejs' | string // necessary unless config is exported as const
524
+ maxDuration?: number
525
+ }
526
+ }
527
+
528
+ `;
529
+ }
530
+
531
+ const routeImports: string[] = [];
532
+ if (appPageValidations) routeImports.push('AppRoutes');
533
+ if (layoutValidations) routeImports.push('LayoutRoutes');
534
+ if (appPageValidations || layoutValidations || appRouteHandlerValidations) routeImports.push('ParamMap');
535
+ if (hasAppRouteHandlers) routeImports.push('AppRouteHandlerRoutes');
536
+ const routeImportStatement =
537
+ routeImports.length > 0 ? `import type { ${routeImports.join(', ')} } from "./routes.js"` : '';
538
+
539
+ const nextRequestImport = hasAppRouteHandlers
540
+ ? "import type { NextRequest } from 'next/server.js'\n"
541
+ : '';
542
+
543
+ const nextTypes: string[] = [];
544
+ if (pagesApiRouteValidations) nextTypes.push('NextApiHandler');
545
+ if (appPageValidations || layoutValidations) nextTypes.push('ResolvingMetadata', 'ResolvingViewport');
546
+ const nextTypesImport =
547
+ nextTypes.length > 0 ? `import type { ${nextTypes.join(', ')} } from "next/types.js"\n` : '';
548
+
549
+ return `// This file is generated automatically by Next.js
550
+ // Do not edit this file manually
551
+ // This file validates that all pages and layouts export the correct types
552
+
553
+ ${routeImportStatement}
554
+ ${nextTypesImport}${nextRequestImport}
555
+ ${typeDefinitions}
556
+ ${appPageValidations}
557
+
558
+ ${appRouteHandlerValidations}
559
+
560
+ ${pagesRouterPageValidations}
561
+
562
+ ${pagesApiRouteValidations}
563
+
564
+ ${layoutValidations}
565
+ `;
566
+ }