@wular/pnext 0.0.4 → 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 -1992
  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 -1897
  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} +139 -139
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +318 -296
  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 +827 -815
  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
@@ -20,34 +20,34 @@
20
20
  * routes' server modules as soon as the route scan hands them over, and blocks on stdin for the
21
21
  * go-ahead to finish the rest once the manifest is written.
22
22
  */
23
- import { existsSync } from 'node:fs';
24
- import { readFile } from 'node:fs/promises';
25
- import path from 'node:path';
26
- import { fileURLToPath } from 'node:url';
27
- import { loadConfig, pathToFileHref, type ResolvedConfig } from '../../config';
28
- import { bootstrapCompat } from '../../compat-bootstrap';
29
- import { ssrClientReference } from '../../client/reference';
23
+ import { existsSync } from 'node:fs'
24
+ import { readFile } from 'node:fs/promises'
25
+ import path from 'node:path'
26
+ import { fileURLToPath } from 'node:url'
27
+ import { loadConfig, pathToFileHref, type ResolvedConfig } from '../../config'
28
+ import { bootstrapCompat } from '../../compat-bootstrap'
29
+ import { ssrClientReference } from '../../client/reference'
30
30
  import {
31
31
  devClientModuleHref,
32
32
  devServerModuleHref,
33
33
  setEmitCompiledSpecifiersManifest,
34
- } from '../../dev/imports';
35
- import { getCompatModeExtensions } from '../../extensions';
36
- import { findConventionFiles, findLayouts } from '../../routing/routes';
37
- import { registerServerRuntime } from '../../runtime/server';
38
- import { namedBunBinary } from '../named-bin';
39
- import type { VerboseLogger } from '../../utils/verbose';
40
- import type { BuildManifest } from '../../types';
34
+ } from '../../runtime/modules'
35
+ import { getCompatModeExtensions } from '../../extensions'
36
+ import { findConventionFiles, findLayouts } from '../../routing/routes'
37
+ import { registerServerRuntime } from '../../runtime/loader'
38
+ import { namedBunBinary } from '../boot/named-bin'
39
+ import type { VerboseLogger } from '../../utils/verbose'
40
+ import type { BuildManifest } from '../../types'
41
41
 
42
42
  // The child reports one line per file it finishes — `<source>` for an imported
43
43
  // route handler, `<source>\t<compiled>` for a compiled module. Everything else
44
44
  // it prints is app output the parent passes through.
45
- const DONE_MARKER = 'pnext-warm-done:';
45
+ const DONE_MARKER = 'pnext-warm-done:'
46
46
 
47
47
  // Printed once compiles finish and before the handler loop starts: the
48
48
  // compiled artifact set is already final at that boundary, so the parent can
49
49
  // start tracing the node_modules closure while this process runs handlers.
50
- const COMPILED_MARKER = 'pnext-warm-compiled';
50
+ const COMPILED_MARKER = 'pnext-warm-compiled'
51
51
 
52
52
  /**
53
53
  * What the parent sends over stdin, one JSON object per line. A `prewarm`
@@ -56,21 +56,21 @@ const COMPILED_MARKER = 'pnext-warm-compiled';
56
56
  */
57
57
  interface WarmRequest {
58
58
  /** Files a previous attempt already finished — or died on. */
59
- skip: string[];
59
+ skip: string[]
60
60
  }
61
61
  interface PrewarmRequest {
62
62
  /** Page route sources, known from the route scan long before the manifest. */
63
- prewarm: string[];
63
+ prewarm: string[]
64
64
  }
65
65
 
66
66
  // An attempt still running after this long is not going to finish: something in
67
67
  // the app's own code is holding the process. Bounded so the build completes
68
68
  // instead of hanging forever.
69
- const ATTEMPT_TIMEOUT_MS = 10 * 60_000;
69
+ const ATTEMPT_TIMEOUT_MS = 10 * 60_000
70
70
 
71
71
  // One clean pass, plus enough restarts to step over a couple of poisoned files
72
72
  // before concluding the app cannot be warmed.
73
- const MAX_ATTEMPTS = 3;
73
+ const MAX_ATTEMPTS = 3
74
74
 
75
75
  export interface WarmChild {
76
76
  /**
@@ -78,17 +78,17 @@ export interface WarmChild {
78
78
  * under the rest of the build. Optional and fire-and-forget: whatever it does
79
79
  * not get to, `finish` compiles.
80
80
  */
81
- prewarm(files: string[]): void;
81
+ prewarm(files: string[]): void
82
82
  /**
83
83
  * Release the child to warm, and collect the module paths it compiled. `onCompiled`, if given,
84
84
  * fires once - as soon as the child reaches its handler phase - with the modules compiled so far,
85
85
  * which is already the final set: the caller can start tracing the node_modules closure while the
86
86
  * child runs handlers concurrently.
87
87
  */
88
- finish(log: VerboseLogger, onCompiled?: (modules: string[]) => void): Promise<string[]>;
88
+ finish(log: VerboseLogger, onCompiled?: (modules: string[]) => void): Promise<string[]>
89
89
  }
90
90
 
91
- type WarmProcess = Bun.Subprocess<'pipe', 'pipe', 'inherit'>;
91
+ type WarmProcess = Bun.Subprocess<'pipe', 'pipe', 'inherit'>
92
92
 
93
93
  /**
94
94
  * Spawn the warm child. Call as early in the build as possible: it boots while the build runs and
@@ -96,31 +96,31 @@ type WarmProcess = Bun.Subprocess<'pipe', 'pipe', 'inherit'>;
96
96
  * throws - a warm-up that cannot start degrades to "no warmed modules", which `finish` reports.
97
97
  */
98
98
  export function startWarmChild(config: ResolvedConfig): WarmChild {
99
- const spawn = () => spawnWarmProcess(config);
100
- const first = spawn();
99
+ const spawn = () => spawnWarmProcess(config)
100
+ const first = spawn()
101
101
  return {
102
102
  prewarm(files) {
103
- if (!first || files.length === 0) return;
103
+ if (!first || files.length === 0) return
104
104
  try {
105
- void first.stdin.write(`${JSON.stringify({ prewarm: files } satisfies PrewarmRequest)}\n`);
106
- void first.stdin.flush();
105
+ void first.stdin.write(`${JSON.stringify({ prewarm: files } satisfies PrewarmRequest)}\n`)
106
+ void first.stdin.flush()
107
107
  } catch {
108
108
  // broken pipe: the child is gone; `finish` reports why
109
109
  }
110
110
  },
111
111
  finish: (log, onCompiled) => warmWithRestarts(first, spawn, log, onCompiled),
112
- };
112
+ }
113
113
  }
114
114
 
115
115
  function spawnWarmProcess(config: ResolvedConfig): WarmProcess | undefined {
116
- const entry = fileURLToPath(new URL(import.meta.url));
116
+ const entry = fileURLToPath(new URL(import.meta.url))
117
117
  try {
118
118
  return Bun.spawn(
119
119
  [namedBunBinary('pnext-warm'), '--conditions=react-server', entry, config.root],
120
120
  { cwd: config.root, stdin: 'pipe', stdout: 'pipe', stderr: 'inherit', env: process.env },
121
- );
121
+ )
122
122
  } catch {
123
- return undefined; // no child (fork limit, unsupported platform)
123
+ return undefined // no child (fork limit, unsupported platform)
124
124
  }
125
125
  }
126
126
 
@@ -132,34 +132,39 @@ async function warmWithRestarts(
132
132
  ) {
133
133
  // Source file -> compiled artifact. Handlers map to nothing but still count as
134
134
  // finished, so a restart does not import them a second time.
135
- const finished = new Map<string, string | undefined>();
136
- const compiled = () => [...finished.values()].filter((file): file is string => Boolean(file));
135
+ const finished = new Map<string, string | undefined>()
136
+ const compiled = () => [...finished.values()].filter((file): file is string => Boolean(file))
137
137
  // The marker can only mean "compiled set final" the first time it fires —
138
138
  // whichever attempt reaches its own handler phase first.
139
- let fired = false;
139
+ let fired = false
140
140
  const fireOnCompiled = onCompiled
141
141
  ? () => {
142
- if (fired) return;
143
- fired = true;
144
- onCompiled(compiled());
142
+ if (fired) return
143
+ fired = true
144
+ onCompiled(compiled())
145
145
  }
146
- : undefined;
147
- let child = first;
146
+ : undefined
147
+ let child = first
148
148
  for (let attempt = 1; attempt <= MAX_ATTEMPTS && child; attempt++) {
149
- const before = finished.size;
150
- const failure = await runAttempt(child, { skip: [...finished.keys()] }, finished, fireOnCompiled);
149
+ const before = finished.size
150
+ const failure = await runAttempt(
151
+ child,
152
+ { skip: [...finished.keys()] },
153
+ finished,
154
+ fireOnCompiled,
155
+ )
151
156
  if (!failure) {
152
- log.log(`warmed ${compiled().length} modules`);
153
- return compiled();
157
+ log.log(`warmed ${compiled().length} modules`)
158
+ return compiled()
154
159
  }
155
160
  // A restart only helps if the last one got somewhere; otherwise the first
156
161
  // thing it would redo is what killed it.
157
- child = finished.size > before && attempt < MAX_ATTEMPTS ? spawn() : undefined;
158
- if (child) log.log(`warm-up ${failure} after ${finished.size} files; restarting past them`);
159
- else warmIncomplete(failure, finished.size);
162
+ child = finished.size > before && attempt < MAX_ATTEMPTS ? spawn() : undefined
163
+ if (child) log.log(`warm-up ${failure} after ${finished.size} files; restarting past them`)
164
+ else warmIncomplete(failure, finished.size)
160
165
  }
161
- fireOnCompiled?.();
162
- return compiled();
166
+ fireOnCompiled?.()
167
+ return compiled()
163
168
  }
164
169
 
165
170
  /** Runs one attempt to completion. Returns undefined on success, else why it died. */
@@ -172,48 +177,48 @@ async function runAttempt(
172
177
  try {
173
178
  // Writing the request and closing stdin is the go-ahead; until then the
174
179
  // child sits parked after its boot (or busy on a prewarm batch).
175
- void child.stdin.write(`${JSON.stringify(request)}\n`);
176
- void child.stdin.end();
180
+ void child.stdin.write(`${JSON.stringify(request)}\n`)
181
+ void child.stdin.end()
177
182
  } catch {
178
183
  // broken pipe: the child is already gone, and its exit below says why
179
184
  }
180
- const timeout = setTimeout(() => child.kill('SIGKILL'), ATTEMPT_TIMEOUT_MS);
181
- timeout.unref?.();
185
+ const timeout = setTimeout(() => child.kill('SIGKILL'), ATTEMPT_TIMEOUT_MS)
186
+ timeout.unref?.()
182
187
 
183
188
  // Streamed rather than buffered to completion: the compiled-phase marker
184
189
  // has to reach the caller while this attempt is still running (the child's
185
190
  // handler phase), not after the process exits.
186
191
  const processLine = (line: string) => {
187
- if (!line) return;
192
+ if (!line) return
188
193
  if (line === COMPILED_MARKER) {
189
- onCompiled?.();
190
- return;
194
+ onCompiled?.()
195
+ return
191
196
  }
192
197
  if (!line.startsWith(DONE_MARKER)) {
193
- console.log(line); // app output
194
- return;
198
+ console.log(line) // app output
199
+ return
195
200
  }
196
- const [source, artifact] = line.slice(DONE_MARKER.length).split('\t');
197
- if (source) finished.set(source, artifact || undefined);
198
- };
199
- const reader = child.stdout.getReader();
200
- const decoder = new TextDecoder();
201
- let buffer = '';
201
+ const [source, artifact] = line.slice(DONE_MARKER.length).split('\t')
202
+ if (source) finished.set(source, artifact || undefined)
203
+ }
204
+ const reader = child.stdout.getReader()
205
+ const decoder = new TextDecoder()
206
+ let buffer = ''
202
207
  for (;;) {
203
- const { done, value } = await reader.read();
204
- if (done) break;
205
- buffer += decoder.decode(value, { stream: true });
206
- let newline: number;
208
+ const { done, value } = await reader.read()
209
+ if (done) break
210
+ buffer += decoder.decode(value, { stream: true })
211
+ let newline: number
207
212
  while ((newline = buffer.indexOf('\n')) >= 0) {
208
- processLine(buffer.slice(0, newline));
209
- buffer = buffer.slice(newline + 1);
213
+ processLine(buffer.slice(0, newline))
214
+ buffer = buffer.slice(newline + 1)
210
215
  }
211
216
  }
212
- if (buffer) processLine(buffer);
217
+ if (buffer) processLine(buffer)
213
218
 
214
- const code = await child.exited.finally(() => clearTimeout(timeout));
215
- if (code === 0) return undefined;
216
- return child.signalCode ? `was killed by ${child.signalCode}` : `exited with code ${code}`;
219
+ const code = await child.exited.finally(() => clearTimeout(timeout))
220
+ if (code === 0) return undefined
221
+ return child.signalCode ? `was killed by ${child.signalCode}` : `exited with code ${code}`
217
222
  }
218
223
 
219
224
  function warmIncomplete(failure: string, done: number) {
@@ -221,18 +226,18 @@ function warmIncomplete(failure: string, done: number) {
221
226
  `vercel adapter: module warm-up ${failure} after warming ${done} file(s). The function ships ` +
222
227
  'without the rest of its module cache and may fail to render those routes at request time, ' +
223
228
  "where Vercel's filesystem is read-only.",
224
- );
229
+ )
225
230
  }
226
231
 
227
232
  const report = (file: string, artifact?: string) => {
228
- console.log(`${DONE_MARKER}${file}${artifact ? `\t${artifact}` : ''}`);
229
- };
233
+ console.log(`${DONE_MARKER}${file}${artifact ? `\t${artifact}` : ''}`)
234
+ }
230
235
 
231
236
  /** Every server module a page route pulls in: the page, its layouts, its conventions. */
232
237
  function pageServerFiles(config: ResolvedConfig, routeFiles: Iterable<string>) {
233
- const files = new Set<string>();
234
- const globalNotFound = path.join(config.appPath, 'not-found.tsx');
235
- if (existsSync(globalNotFound)) files.add(globalNotFound);
238
+ const files = new Set<string>()
239
+ const globalNotFound = path.join(config.appPath, 'not-found.tsx')
240
+ if (existsSync(globalNotFound)) files.add(globalNotFound)
236
241
  for (const routeFile of routeFiles) {
237
242
  for (const file of [
238
243
  routeFile,
@@ -241,14 +246,14 @@ function pageServerFiles(config: ResolvedConfig, routeFiles: Iterable<string>) {
241
246
  findConventionFiles(config.appPath, routeFile, name),
242
247
  ),
243
248
  ]) {
244
- if (existsSync(file)) files.add(file);
249
+ if (existsSync(file)) files.add(file)
245
250
  }
246
251
  }
247
- return files;
252
+ return files
248
253
  }
249
254
 
250
255
  const compileServer = (config: ResolvedConfig, file: string) =>
251
- devServerModuleHref(config, file, 'build').then(href => report(file, fileURLToPath(href)));
256
+ devServerModuleHref(config, file, 'build').then(href => report(file, fileURLToPath(href)))
252
257
 
253
258
  /**
254
259
  * Compile the page routes' server modules from the build's route scan, long before the manifest
@@ -257,12 +262,12 @@ const compileServer = (config: ResolvedConfig, file: string) =>
257
262
  * code, so it is safe to overlap (see the handler note below).
258
263
  */
259
264
  export async function prewarmPageModules(config: ResolvedConfig, routeFiles: string[]) {
260
- if (!getCompatModeExtensions().reactEnabled(config)) return;
265
+ if (!getCompatModeExtensions().reactEnabled(config)) return
261
266
  await Promise.all(
262
267
  [...pageServerFiles(config, routeFiles)].map(file =>
263
268
  compileServer(config, file).catch(() => undefined),
264
269
  ),
265
- );
270
+ )
266
271
  }
267
272
 
268
273
  /**
@@ -274,19 +279,19 @@ export async function warmRouteModules(
274
279
  manifest: BuildManifest,
275
280
  skip: ReadonlySet<string> = new Set(),
276
281
  ) {
277
- const clientFiles = new Set<string>();
278
- const handlers: BuildManifest['routes'] = [];
279
- const pageRoutes: string[] = [];
282
+ const clientFiles = new Set<string>()
283
+ const handlers: BuildManifest['routes'] = []
284
+ const pageRoutes: string[] = []
280
285
 
281
286
  for (const route of manifest.routes) {
282
287
  if (route.kind === 'handler') {
283
- if (!skip.has(route.file)) handlers.push(route);
284
- continue;
288
+ if (!skip.has(route.file)) handlers.push(route)
289
+ continue
285
290
  }
286
- pageRoutes.push(route.file);
291
+ pageRoutes.push(route.file)
287
292
  for (const reference of route.clientReferences) {
288
293
  if (ssrClientReference(reference) && existsSync(reference.file)) {
289
- clientFiles.add(reference.file);
294
+ clientFiles.add(reference.file)
290
295
  }
291
296
  }
292
297
  }
@@ -305,9 +310,9 @@ export async function warmRouteModules(
305
310
  report(file, fileURLToPath(href)),
306
311
  ),
307
312
  ),
308
- ]);
313
+ ])
309
314
  }
310
- console.log(COMPILED_MARKER);
315
+ console.log(COMPILED_MARKER)
311
316
 
312
317
  // Handlers come last, and only once nothing else is in flight. Importing them runs the app's own
313
318
  // server code (auth, db pools, telemetry), and that code running *concurrently* with the compile
@@ -315,16 +320,16 @@ export async function warmRouteModules(
315
320
  // handlers alone against a populated cache never crash. Doing them after the compiles also means a
316
321
  // crash here costs only the remaining handlers, not the whole module pass.
317
322
  for (const route of handlers) {
318
- registerServerRuntime(config, route.sourceFiles);
323
+ registerServerRuntime(config, route.sourceFiles)
319
324
  // Reported before the import, not after: handlers are imported one at a
320
325
  // time, so a handler that takes the process down is unambiguous and a
321
326
  // restart must not run it again (Bun caches a failed import for the
322
327
  // process' lifetime anyway, so a retry could not succeed either).
323
- report(route.file);
328
+ report(route.file)
324
329
  try {
325
- await import(pathToFileHref(route.file));
330
+ await import(pathToFileHref(route.file))
326
331
  } catch (error) {
327
- console.warn(`vercel adapter: importing ${route.file} failed during warmup:`, error);
332
+ console.warn(`vercel adapter: importing ${route.file} failed during warmup:`, error)
328
333
  }
329
334
  }
330
335
  }
@@ -334,42 +339,42 @@ export async function warmRouteModules(
334
339
  * each prewarm batch as it arrives. Returns the final request.
335
340
  */
336
341
  async function readWarmRequests(config: ResolvedConfig): Promise<Partial<WarmRequest>> {
337
- let buffer = '';
338
- const decoder = new TextDecoder();
339
- const reader = Bun.stdin.stream().getReader();
342
+ let buffer = ''
343
+ const decoder = new TextDecoder()
344
+ const reader = Bun.stdin.stream().getReader()
340
345
  for (;;) {
341
- const { done, value } = await reader.read();
342
- if (done) break;
343
- buffer += decoder.decode(value, { stream: true });
344
- let newline: number;
346
+ const { done, value } = await reader.read()
347
+ if (done) break
348
+ buffer += decoder.decode(value, { stream: true })
349
+ let newline: number
345
350
  while ((newline = buffer.indexOf('\n')) >= 0) {
346
- const line = buffer.slice(0, newline).trim();
347
- buffer = buffer.slice(newline + 1);
348
- if (!line) continue;
349
- const message = JSON.parse(line) as Partial<WarmRequest & PrewarmRequest>;
350
- if (message.skip) return message;
351
- if (message.prewarm) await prewarmPageModules(config, message.prewarm);
351
+ const line = buffer.slice(0, newline).trim()
352
+ buffer = buffer.slice(newline + 1)
353
+ if (!line) continue
354
+ const message = JSON.parse(line) as Partial<WarmRequest & PrewarmRequest>
355
+ if (message.skip) return message
356
+ if (message.prewarm) await prewarmPageModules(config, message.prewarm)
352
357
  }
353
358
  }
354
- const rest = buffer.trim();
355
- return rest ? (JSON.parse(rest) as Partial<WarmRequest>) : {};
359
+ const rest = buffer.trim()
360
+ return rest ? (JSON.parse(rest) as Partial<WarmRequest>) : {}
356
361
  }
357
362
 
358
363
  if (import.meta.main) {
359
- const root = process.argv[2];
360
- const config = await loadConfig(root);
361
- await bootstrapCompat(config);
364
+ const root = process.argv[2]
365
+ const config = await loadConfig(root)
366
+ await bootstrapCompat(config)
362
367
  // This process only ever runs for a vercel-adapter build; record each
363
368
  // artifact's specifiers so the parent's trace step can read them back.
364
- setEmitCompiledSpecifiersManifest(true);
369
+ setEmitCompiledSpecifiersManifest(true)
365
370
  // Blocks until the parent sends the go-ahead, i.e. until the manifest is
366
371
  // written; a prewarm batch may arrive and run before that.
367
- const request = await readWarmRequests(config);
372
+ const request = await readWarmRequests(config)
368
373
  const manifest = JSON.parse(
369
374
  await readFile(path.join(config.outPath, 'manifest.json'), 'utf8'),
370
- ) as BuildManifest;
371
- await warmRouteModules(config, manifest, new Set(request.skip ?? []));
375
+ ) as BuildManifest
376
+ await warmRouteModules(config, manifest, new Set(request.skip ?? []))
372
377
  // App code reached through a route handler can leave the loop alive (a db
373
378
  // pool, a stray interval); the warm pass is done either way.
374
- process.exit(0);
379
+ process.exit(0)
375
380
  }