@wular/pnext 0.1.6 → 0.1.8

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 (337) hide show
  1. package/bin/pnext +9 -2
  2. package/dist/server/_chunks/aliases-pycbtjt1.js +46 -0
  3. package/dist/server/_chunks/analyze-4d9e00g9.js +449 -0
  4. package/dist/server/_chunks/boot-bhemypxz.js +38 -0
  5. package/dist/server/_chunks/build-c991dv65.js +86 -0
  6. package/dist/server/_chunks/build-kh5e3x48.js +3341 -0
  7. package/dist/server/_chunks/build-tier-0a96kmx3.js +2456 -0
  8. package/dist/server/_chunks/compile-040r79gj.js +22 -0
  9. package/dist/server/_chunks/config-0tvz03a6.js +24 -0
  10. package/dist/server/_chunks/config-27rj7830.js +36 -0
  11. package/dist/server/_chunks/create-9rvwshsp.js +135 -0
  12. package/dist/server/_chunks/dev-ex9exynt.js +220 -0
  13. package/dist/server/_chunks/esbuild-yyktfrtt.js +15 -0
  14. package/dist/server/_chunks/generate-myw9hef7.js +22 -0
  15. package/dist/server/_chunks/index-0r5eqfc7.js +279 -0
  16. package/dist/server/_chunks/index-0yjv5v47.js +105 -0
  17. package/dist/server/_chunks/index-11xpbfej.js +17 -0
  18. package/dist/server/_chunks/index-141vcwk6.js +109 -0
  19. package/dist/server/_chunks/index-1pzm1hdy.js +4130 -0
  20. package/dist/server/_chunks/index-29pq0kax.js +590 -0
  21. package/dist/server/_chunks/index-2vz0wzdn.js +59 -0
  22. package/dist/server/_chunks/index-2wfv4kvx.js +182 -0
  23. package/dist/server/_chunks/index-38xpdxwd.js +194 -0
  24. package/dist/server/_chunks/index-3e075kny.js +128 -0
  25. package/dist/server/_chunks/index-3ycf5ckv.js +472 -0
  26. package/dist/server/_chunks/index-4399bvd2.js +18 -0
  27. package/dist/server/_chunks/index-4da76t62.js +297 -0
  28. package/dist/server/_chunks/index-4t92hdxd.js +172 -0
  29. package/dist/server/_chunks/index-4zzebszd.js +10 -0
  30. package/dist/server/_chunks/index-52k54ykj.js +95 -0
  31. package/dist/server/_chunks/index-5hr4062s.js +70 -0
  32. package/dist/server/_chunks/index-68m3mwbd.js +84 -0
  33. package/dist/server/_chunks/index-6b009mt0.js +56 -0
  34. package/dist/server/_chunks/index-6gex3pfa.js +15 -0
  35. package/dist/server/_chunks/index-6kp9r0d9.js +11 -0
  36. package/dist/server/_chunks/index-6q7zvrap.js +134 -0
  37. package/dist/server/_chunks/index-71885zaq.js +284 -0
  38. package/dist/server/_chunks/index-73z4esab.js +38 -0
  39. package/dist/server/_chunks/index-79ngvam8.js +60 -0
  40. package/dist/server/_chunks/index-7wc9n8be.js +25 -0
  41. package/dist/server/_chunks/index-8ct7rqy3.js +198 -0
  42. package/dist/server/_chunks/index-8kcxdfya.js +206 -0
  43. package/dist/server/_chunks/index-9ch50vtq.js +18 -0
  44. package/dist/server/_chunks/index-9f49w76j.js +213 -0
  45. package/dist/server/_chunks/index-9hz3s0m8.js +851 -0
  46. package/dist/server/_chunks/index-akkrvjn6.js +535 -0
  47. package/dist/server/_chunks/index-b6wtkdp4.js +24 -0
  48. package/dist/server/_chunks/index-b7j671dj.js +207 -0
  49. package/dist/server/_chunks/index-bcws5eh2.js +35 -0
  50. package/dist/server/_chunks/index-bzd2ef7t.js +10 -0
  51. package/dist/server/_chunks/index-cjgqs13g.js +65 -0
  52. package/dist/server/_chunks/index-ckkdpht5.js +41 -0
  53. package/dist/server/_chunks/index-cn86z041.js +296 -0
  54. package/dist/server/_chunks/index-cvr4z22m.js +92 -0
  55. package/dist/server/_chunks/index-cyfednwb.js +87 -0
  56. package/dist/server/_chunks/index-d158y67j.js +152 -0
  57. package/dist/server/_chunks/index-d1jsmhhk.js +955 -0
  58. package/dist/server/_chunks/index-dg0f05zs.js +199 -0
  59. package/dist/server/_chunks/index-dgr390q7.js +9438 -0
  60. package/dist/server/_chunks/index-drwv61cc.js +185 -0
  61. package/dist/server/_chunks/index-e3a6yx84.js +18 -0
  62. package/dist/server/_chunks/index-e88tyv35.js +45 -0
  63. package/dist/server/_chunks/index-en7n9f7m.js +22 -0
  64. package/dist/server/_chunks/index-entm8bmz.js +28 -0
  65. package/dist/server/_chunks/index-evhd413j.js +57 -0
  66. package/dist/server/_chunks/index-ezgj0tr1.js +88 -0
  67. package/dist/server/_chunks/index-fjv96re1.js +5295 -0
  68. package/dist/server/_chunks/index-fn1chkkd.js +214 -0
  69. package/dist/server/_chunks/index-fp8r0sqs.js +64 -0
  70. package/dist/server/_chunks/index-gcmj16xy.js +92 -0
  71. package/dist/server/_chunks/index-gkndxkxf.js +736 -0
  72. package/dist/server/_chunks/index-grta8ap3.js +238 -0
  73. package/dist/server/_chunks/index-h2a70tg4.js +7 -0
  74. package/dist/server/_chunks/index-h4xy648y.js +51 -0
  75. package/dist/server/_chunks/index-hdbwtdv2.js +352 -0
  76. package/dist/server/_chunks/index-he6n2bvp.js +1270 -0
  77. package/dist/server/_chunks/index-j0m1jxqa.js +1253 -0
  78. package/dist/server/_chunks/index-j2zrcp1k.js +66 -0
  79. package/dist/server/_chunks/index-j681c48a.js +2530 -0
  80. package/dist/server/_chunks/index-jbj7ehef.js +50 -0
  81. package/dist/server/_chunks/index-jcsjq3d1.js +20 -0
  82. package/dist/server/_chunks/index-jks0x0a1.js +14 -0
  83. package/dist/server/_chunks/index-jn9rbhrx.js +1599 -0
  84. package/dist/server/_chunks/index-jt8e1pje.js +12 -0
  85. package/dist/server/_chunks/index-kdhxpwyq.js +483 -0
  86. package/dist/server/_chunks/index-knp0s912.js +7 -0
  87. package/dist/server/_chunks/index-kqyy1d4f.js +50 -0
  88. package/dist/server/_chunks/index-kresp2n8.js +445 -0
  89. package/dist/server/_chunks/index-m63czgq5.js +590 -0
  90. package/dist/server/_chunks/index-ms9v9tnx.js +31 -0
  91. package/dist/server/_chunks/index-n4hxpng2.js +11 -0
  92. package/dist/server/_chunks/index-n629dy38.js +1071 -0
  93. package/dist/server/_chunks/index-nf3df4jy.js +266 -0
  94. package/dist/server/_chunks/index-nqh3xhdc.js +57 -0
  95. package/dist/server/_chunks/index-pym1cezq.js +39 -0
  96. package/dist/server/_chunks/index-q3r9z8mq.js +213 -0
  97. package/dist/server/_chunks/index-q738kkhj.js +100 -0
  98. package/dist/server/_chunks/index-qcrvt6er.js +112 -0
  99. package/dist/server/_chunks/index-qjj6gddn.js +54 -0
  100. package/dist/server/_chunks/index-qpwsgt3a.js +158 -0
  101. package/dist/server/_chunks/index-r97ptz1q.js +97 -0
  102. package/dist/server/_chunks/index-ras0sdab.js +26 -0
  103. package/dist/server/_chunks/index-rcs322t1.js +19 -0
  104. package/dist/server/_chunks/index-rgj5mx84.js +101 -0
  105. package/dist/server/_chunks/index-rjegyfx4.js +1435 -0
  106. package/dist/server/_chunks/index-rt9qq1va.js +4 -0
  107. package/dist/server/_chunks/index-rthrsed5.js +356 -0
  108. package/dist/server/_chunks/index-sq3kvz3g.js +200 -0
  109. package/dist/server/_chunks/index-stbk3jhn.js +31 -0
  110. package/dist/server/_chunks/index-tf4j19ge.js +130 -0
  111. package/dist/server/_chunks/index-tgcakdxc.js +125 -0
  112. package/dist/server/_chunks/index-tgsfjmep.js +74 -0
  113. package/dist/server/_chunks/index-tq1f96v7.js +51 -0
  114. package/dist/server/_chunks/index-tq3b39a5.js +107 -0
  115. package/dist/server/_chunks/index-typcbcsv.js +819 -0
  116. package/dist/server/_chunks/index-v1ags1na.js +132 -0
  117. package/dist/server/_chunks/index-vmr35jjw.js +170 -0
  118. package/dist/server/_chunks/index-vvq7rqtn.js +329 -0
  119. package/dist/server/_chunks/index-vz0km5qk.js +33 -0
  120. package/dist/server/_chunks/index-w6h8m6vp.js +138 -0
  121. package/dist/server/_chunks/index-web361b8.js +138 -0
  122. package/dist/server/_chunks/index-wm36rj4v.js +311 -0
  123. package/dist/server/_chunks/index-x0y005nh.js +283 -0
  124. package/dist/server/_chunks/index-x2m17v9c.js +6166 -0
  125. package/dist/server/_chunks/index-x3yn4ywm.js +22 -0
  126. package/dist/server/_chunks/index-x9c55pzy.js +871 -0
  127. package/dist/server/_chunks/index-xh1nbk46.js +1299 -0
  128. package/dist/server/_chunks/index-xvj80c3a.js +30 -0
  129. package/dist/server/_chunks/index-xywjg2vc.js +100 -0
  130. package/dist/server/_chunks/index-y4d02znn.js +66 -0
  131. package/dist/server/_chunks/index-y7mzvq2q.js +110 -0
  132. package/dist/server/_chunks/index-ye9hmsvf.js +47 -0
  133. package/dist/server/_chunks/index-yhxkxghe.js +56 -0
  134. package/dist/server/_chunks/index-yrjkqtfj.js +86 -0
  135. package/dist/server/_chunks/index-z88qv16t.js +11 -0
  136. package/dist/server/_chunks/index-zfrwq472.js +154 -0
  137. package/dist/server/_chunks/index-zqpqyg8p.js +666 -0
  138. package/dist/server/_chunks/loader-5en7wpt5.js +80 -0
  139. package/dist/server/_chunks/modules-t92favpj.js +76 -0
  140. package/dist/server/_chunks/pipeline-4t9q43ht.js +836 -0
  141. package/dist/server/_chunks/production-385bw8df.js +55 -0
  142. package/dist/server/_chunks/proxy-config-60gprphe.js +23 -0
  143. package/dist/server/_chunks/proxy-gfhmktbk.js +35 -0
  144. package/dist/server/_chunks/router-xnrva921.js +501 -0
  145. package/dist/server/_chunks/routes-ht868pdc.js +66 -0
  146. package/dist/server/_chunks/run-d40d63ag.js +697 -0
  147. package/dist/server/_chunks/server-2p8fgqq2.js +1839 -0
  148. package/dist/server/_chunks/tsconfig-defaults-bcn34eqb.js +21 -0
  149. package/dist/server/_chunks/typegen-dvtcjtaw.js +37 -0
  150. package/dist/server/api/client-cache.js +14 -0
  151. package/dist/server/cli/index.js +375 -0
  152. package/dist/server/cli/start.js +158 -0
  153. package/dist/server/client/reference.js +16 -0
  154. package/dist/server/compat/next/cache.js +56 -0
  155. package/dist/server/compat/next/canonical-url.js +13 -0
  156. package/dist/server/compat/next/client-cache.js +57 -0
  157. package/dist/server/compat/next/client-navigation.js +232 -0
  158. package/dist/server/compat/next/client-only.js +1 -0
  159. package/dist/server/compat/next/client-script.js +178 -0
  160. package/dist/server/compat/next/client-server.js +34 -0
  161. package/dist/server/compat/next/config-headers.js +34 -0
  162. package/dist/server/compat/next/config-loader.js +25 -0
  163. package/dist/server/compat/next/config.js +10 -0
  164. package/dist/server/compat/next/constants.js +18 -0
  165. package/dist/server/compat/next/custom-server.js +10 -0
  166. package/dist/server/compat/next/dist/client/components/app-router-headers.js +48 -0
  167. package/dist/server/compat/next/dist/server/web/spec-extension/revalidate.js +27 -0
  168. package/dist/server/compat/next/dist/server/web/spec-extension/unstable-cache.js +25 -0
  169. package/dist/server/compat/next/dist/server/web/spec-extension/unstable-no-store.js +25 -0
  170. package/dist/server/compat/next/dynamic.js +21 -0
  171. package/dist/server/compat/next/error.js +112 -0
  172. package/dist/server/compat/next/font/cache.js +16 -0
  173. package/dist/server/compat/next/font/google.js +3 -0
  174. package/dist/server/compat/next/font/index.js +1 -0
  175. package/dist/server/compat/next/font/local.js +24 -0
  176. package/dist/server/compat/next/font/runtime-client.js +33 -0
  177. package/dist/server/compat/next/font/runtime.js +43 -0
  178. package/dist/server/compat/next/font/shared.js +22 -0
  179. package/dist/server/compat/next/form.js +129 -0
  180. package/dist/server/compat/next/head.js +10 -0
  181. package/dist/server/compat/next/headers.js +30 -0
  182. package/dist/server/compat/next/image/client.js +11 -0
  183. package/dist/server/compat/next/image/config.js +18 -0
  184. package/dist/server/compat/next/image/optimizer.js +25 -0
  185. package/dist/server/compat/next/image/patterns.js +12 -0
  186. package/dist/server/compat/next/image/props.js +16 -0
  187. package/dist/server/compat/next/image/shared.js +86 -0
  188. package/dist/server/compat/next/image/static-metadata.js +32 -0
  189. package/dist/server/compat/next/image/validate.js +8 -0
  190. package/dist/server/compat/next/image.js +59 -0
  191. package/dist/server/compat/next/index.js +1 -0
  192. package/dist/server/compat/next/legacy-image.js +78 -0
  193. package/dist/server/compat/next/legacy-request-apis.js +24 -0
  194. package/dist/server/compat/next/link-transform.js +15 -0
  195. package/dist/server/compat/next/link.js +14 -0
  196. package/dist/server/compat/next/navigation.js +191 -0
  197. package/dist/server/compat/next/offline.js +45 -0
  198. package/dist/server/compat/next/og.js +8 -0
  199. package/dist/server/compat/next/preferred-region.js +8 -0
  200. package/dist/server/compat/next/redirects.js +32 -0
  201. package/dist/server/compat/next/resource-hints.js +30 -0
  202. package/dist/server/compat/next/rewrites.js +43 -0
  203. package/dist/server/compat/next/root-params.js +121 -0
  204. package/dist/server/compat/next/route-state.js +23 -0
  205. package/dist/server/compat/next/router.js +103 -0
  206. package/dist/server/compat/next/script.js +37 -0
  207. package/dist/server/compat/next/server-only.js +1 -0
  208. package/dist/server/compat/next/server.js +131 -0
  209. package/dist/server/compat/next/svgr.js +14 -0
  210. package/dist/server/compat/next/telemetry.js +10 -0
  211. package/dist/server/compat/next/usage.js +13 -0
  212. package/dist/server/compat/next/user-agent.js +12 -0
  213. package/dist/server/compat/next/web-vitals.js +35 -0
  214. package/dist/server/compat/react/action-state.js +11 -0
  215. package/dist/server/compat/react/client-lite.js +83 -0
  216. package/dist/server/compat/react/client.js +131 -0
  217. package/dist/server/compat/react/compiler-runtime.js +42 -0
  218. package/dist/server/compat/react/dom-client.js +106 -0
  219. package/dist/server/compat/react/dom-react-server.js +37 -0
  220. package/dist/server/compat/react/dom-server.js +40 -0
  221. package/dist/server/compat/react/dom.js +52 -0
  222. package/dist/server/compat/react/hooks-extra.js +12 -0
  223. package/dist/server/compat/react/internals.js +14 -0
  224. package/dist/server/compat/react/parity.js +11 -0
  225. package/dist/server/compat/react/preact.js +113 -0
  226. package/dist/server/compat/react/react-server.js +133 -0
  227. package/dist/server/compat/react/router-shim.js +8 -0
  228. package/dist/server/compat/react/server-component-use.js +14 -0
  229. package/dist/server/compat/react/server-inserted-html.js +14 -0
  230. package/dist/server/compat/react/server.js +194 -0
  231. package/dist/server/compat/react/style-values.js +10 -0
  232. package/dist/server/compat/react/use.js +10 -0
  233. package/dist/server/compat/react/view-transition.js +12 -0
  234. package/dist/server/generation.json +1 -0
  235. package/package.json +4 -1
  236. package/reference/compat.md +1 -1
  237. package/reference/config.md +2 -2
  238. package/reference/dev.md +1 -1
  239. package/reference/getting-started.md +1 -1
  240. package/reference/rendering.md +4 -4
  241. package/src/api/dynamic.tsx +86 -4
  242. package/src/api/server.ts +24 -6
  243. package/src/cli/adapters/vercel-warm.ts +327 -62
  244. package/src/cli/adapters/vercel.ts +164 -1054
  245. package/src/cli/analyze.ts +3 -2
  246. package/src/cli/build/cache.ts +6 -6
  247. package/src/cli/build.ts +78 -45
  248. package/src/cli/index.ts +21 -3
  249. package/src/cli/serve/immutable.ts +31 -0
  250. package/src/cli/serve/pipeline.ts +97 -93
  251. package/src/cli/serve/standalone-worker.ts +8 -0
  252. package/src/cli/serve/standalone.ts +703 -0
  253. package/src/cli/start.ts +31 -8
  254. package/src/client/build.ts +1 -1
  255. package/src/client/chunk-fold.ts +19 -6
  256. package/src/client/react-tier.ts +3 -2
  257. package/src/client/reference-stub.ts +23 -36
  258. package/src/compat/actions/client-plugin.ts +4 -2
  259. package/src/compat/actions/config.ts +6 -5
  260. package/src/compat/actions/extensions.ts +5 -5
  261. package/src/compat/aliases.ts +8 -1
  262. package/src/compat/bundler/config.ts +88 -0
  263. package/src/compat/bundler/optimize-package-imports.ts +86 -26
  264. package/src/compat/bundler/relay-transform.ts +15 -3
  265. package/src/compat/bundler/require-context.ts +2 -1
  266. package/src/compat/bundler/webpack-loaders.ts +3 -2
  267. package/src/compat/bundler/worker.ts +2 -2
  268. package/src/compat/cache-control.ts +16 -8
  269. package/src/compat/css/inline-css.ts +1 -1
  270. package/src/compat/css/modules.ts +18 -5
  271. package/src/compat/export/build-complete.ts +1 -1
  272. package/src/compat/export/emit.ts +4 -4
  273. package/src/compat/export/standalone.ts +30 -65
  274. package/src/compat/image-optimizer/optimize.ts +1 -1
  275. package/src/compat/lifecycle/error-funnel.ts +1 -1
  276. package/src/compat/lifecycle/instrumentation-client.ts +4 -3
  277. package/src/compat/lifecycle/instrumentation.ts +117 -24
  278. package/src/compat/lifecycle/testmode.ts +3 -2
  279. package/src/compat/metadata-artifacts.ts +1 -1
  280. package/src/compat/next/config-loader.ts +140 -13
  281. package/src/compat/next/dynamic.tsx +10 -23
  282. package/src/compat/next/font/cache.ts +2 -1
  283. package/src/compat/next/font/runtime.ts +23 -3
  284. package/src/compat/next/og.ts +3 -3
  285. package/src/compat/next/usage.ts +3 -2
  286. package/src/compat/pages/api.ts +83 -14
  287. package/src/compat/pages/router.ts +30 -14
  288. package/src/compat/register/bundler.ts +3 -1
  289. package/src/compat/register/image.ts +1 -1
  290. package/src/compat/register/middleware.ts +1 -1
  291. package/src/compat/register/otel.ts +5 -9
  292. package/src/compat/register/render.ts +3 -1
  293. package/src/compat/register/use-cache.ts +3 -1
  294. package/src/compat/release.ts +46 -0
  295. package/src/compat/segment/serve.ts +1 -1
  296. package/src/compat/typecheck/check.ts +6 -4
  297. package/src/compat/validation/validate.ts +10 -7
  298. package/src/config.ts +76 -9
  299. package/src/css/assets.ts +213 -0
  300. package/src/css/build.ts +190 -247
  301. package/src/dev/client-chunk-store.ts +2 -1
  302. package/src/dev/restart/client-key.ts +2 -1
  303. package/src/dev/restart/global-css.ts +2 -1
  304. package/src/dev/restart/route-bundle-key.ts +2 -1
  305. package/src/dev/restart/route-facts.ts +2 -1
  306. package/src/dev/server.ts +34 -14
  307. package/src/extensions.ts +4 -0
  308. package/src/out-paths.ts +10 -0
  309. package/src/render/hooks.ts +13 -0
  310. package/src/render/renderer.ts +53 -33
  311. package/src/request/context.ts +9 -0
  312. package/src/resolve/dynamic.ts +7 -1
  313. package/src/resolve/engine.ts +2 -12
  314. package/src/resolve/imports.ts +12 -52
  315. package/src/resolve/package-json.ts +56 -0
  316. package/src/resolve/scan-facts.ts +250 -1
  317. package/src/routing/href.ts +10 -3
  318. package/src/routing/match.ts +287 -0
  319. package/src/routing/metadata-files.ts +20 -6
  320. package/src/routing/proxy-config.ts +137 -0
  321. package/src/routing/proxy.ts +35 -134
  322. package/src/routing/routes.ts +22 -281
  323. package/src/runtime/fingerprint.ts +23 -8
  324. package/src/runtime/load.ts +170 -0
  325. package/src/runtime/loader.ts +218 -44
  326. package/src/runtime/module-cache.ts +15 -1
  327. package/src/runtime/modules.ts +405 -82
  328. package/src/runtime/prebundle.ts +101 -0
  329. package/src/runtime/production.ts +456 -0
  330. package/src/runtime/release-graph.ts +342 -0
  331. package/src/runtime/vendor-build.ts +750 -17
  332. package/src/runtime/vendor.ts +16 -3
  333. package/src/types.ts +4 -3
  334. package/src/utils/directive.ts +40 -0
  335. package/src/utils/fs.ts +95 -4
  336. package/src/utils/resource-query.ts +12 -0
  337. package/src/cli/serve/entry.ts +0 -45
@@ -1,4 +1,4 @@
1
- import { resolveManifest } from '../../utils/fs'
1
+ import { type ExactNames, exactNameIndex, hasExactName, resolveManifest } from '../../utils/fs'
2
2
  /**
3
3
  * The production request pipeline. Split out of `start.ts` so the prebundled
4
4
  * server entry parses only what listening needs: this module (renderer,
@@ -14,10 +14,19 @@ import { Readable } from 'node:stream'
14
14
  import { loadConfig, pathToFileHref } from '../../config'
15
15
  import type { ResolvedConfig } from '../../config'
16
16
  import { bootstrapCompat } from '../../compat-bootstrap'
17
- import { registerServerRuntime, serverBundleTargetForRuntime } from '../../runtime/loader'
18
- import { importModuleOnce } from '../../runtime/modules'
17
+ import {
18
+ importModuleOnce,
19
+ registerServerRuntime,
20
+ serverBundleTargetForRuntime,
21
+ } from '../../runtime/load'
19
22
  import { abortUpstreamFetchOnDisconnect } from '../../runtime/fetch-host'
20
- import { applyProxyResponse, createProxyRunner } from '../../routing/proxy'
23
+ import { applyProxyResponse, createProxyRunner, type ProxyRunnerOptions } from '../../routing/proxy'
24
+ import {
25
+ attachRelease,
26
+ buildManifestFile,
27
+ releaseFrameworkRoot,
28
+ releaseModuleHref,
29
+ } from '../../runtime/production'
21
30
  import {
22
31
  isPprShellUpgradeEligible,
23
32
  renderGlobalNotFoundResponse,
@@ -32,15 +41,16 @@ import {
32
41
  import {
33
42
  canonicalTrailingSlashPath,
34
43
  malformedUrlResponse,
44
+ repeatedSlashRedirect,
35
45
  trailingSlashRedirect,
36
46
  } from '../../routing/href'
37
47
  import { type PeerAddressSource, withForwardedHeaders } from '../../routing/forwarded'
38
- import { normalizePathname, parseNavState, selectRouteForRequest } from '../../routing/routes'
48
+ import { normalizePathname, parseNavState, selectRouteForRequest } from '../../routing/match'
39
49
  import { runWithCacheScope } from '../../request/cache'
40
50
  import { metadataRouteHandlerModule } from '../../routing/metadata-files'
51
+ import { immutableAssetPath, immutableCacheControl } from './immutable'
41
52
  import {
42
53
  finalizeResponse,
43
- getAssetExtensions,
44
54
  getRenderExtensions,
45
55
  getProxyExtensions,
46
56
  getRequestExtensions,
@@ -55,13 +65,13 @@ import {
55
65
  getWorkUnit,
56
66
  runWithWorkUnit,
57
67
  setPhase,
68
+ setWorkUnitRelease,
58
69
  setWorkUnitRoute,
59
70
  } from '../../request/context'
60
71
  import { setRequestRuntime } from '../../routing/request-environment'
61
72
  import { getRenderSpanExtensions } from '../../render/hooks'
62
- import { publishEmittedAssets } from '../../css/build'
73
+ import { publishEmittedAssets } from '../../css/assets'
63
74
  import { contentType } from '../../utils/content-type'
64
- import { stopEsbuildService } from '../../utils/esbuild'
65
75
  import { markErrorLogged } from '../../utils/error-log'
66
76
  import type {
67
77
  BuildManifest,
@@ -70,17 +80,6 @@ import type {
70
80
  StaticFileMetadata,
71
81
  } from '../../types'
72
82
 
73
- /** Compat module-mode route hrefs are the only prod use of the dev import layer; keep it off the start graph. */
74
- async function moduleHrefForRoute(
75
- config: ResolvedConfig,
76
- route: RouteManifestEntry,
77
- ): Promise<string> {
78
- const { devServerModuleHref } = await import('../../runtime/modules')
79
- return devServerModuleHref(config, route.file, 'build', {
80
- conditionTarget: serverBundleTargetForRuntime(route.segmentConfig?.runtime),
81
- })
82
- }
83
-
84
83
  /**
85
84
  * The production request handler `pnext start` serves with. Exposed on its own
86
85
  * so deployment adapters (e.g. Vercel) can serve the exact same pipeline
@@ -97,13 +96,30 @@ export async function createRequestHandler(
97
96
  // extension registries when compat is enabled (no-op for pure-core apps).
98
97
  // A prod server answers the very next request, so it takes both tiers here.
99
98
  await bootstrapCompat(config)
100
- const manifestPath = path.join(config.outPath, 'manifest.json')
99
+ const manifestPath = buildManifestFile(config.outPath)
101
100
  // `start` reads the manifest before binding the port (a missing build must
102
101
  // still fail there, not on the first request) and hands it over.
103
102
  const manifest = resolveManifest(
104
103
  options.manifest ?? (JSON.parse(await readFile(manifestPath, 'utf8')) as BuildManifest),
105
104
  config.outPath,
106
105
  config.root,
106
+ releaseFrameworkRoot(config.outPath),
107
+ )
108
+ // Everything a request imports comes from the build's release; each handler resolves once, here.
109
+ const release = attachRelease(config)
110
+ release.staticMetadataFiles = manifest.staticMetadataFiles
111
+ const handlerHrefs = new Map(
112
+ manifest.routes
113
+ .filter(route => route.kind === 'handler')
114
+ .map(route => [
115
+ route.id,
116
+ releaseModuleHref(
117
+ release,
118
+ 'server',
119
+ serverBundleTargetForRuntime(route.segmentConfig?.runtime),
120
+ route.file,
121
+ ),
122
+ ]),
107
123
  )
108
124
  const persistManifest = async () => {
109
125
  const stored = JSON.parse(await readFile(manifestPath, 'utf8')) as BuildManifest
@@ -120,6 +136,7 @@ export async function createRequestHandler(
120
136
  // Content-hashed asset names, as the build emitted them: a render in THIS
121
137
  // process must link the same files, not the logical `global.css` spelling.
122
138
  publishEmittedAssets(config.outPath, manifest.assetNames)
139
+ const exactNames = exactNameIndex(config.outPath)
123
140
  // Publish the live routing state the compat request interceptors (action
124
141
  // dispatch, rewrites) read; prod loads the route table once.
125
142
  setRequestRuntime({ config, routes: manifest.routes, dev: false })
@@ -127,6 +144,7 @@ export async function createRequestHandler(
127
144
  compiledModuleHref: manifest.proxyModule
128
145
  ? pathToFileHref(path.resolve(config.outPath, manifest.proxyModule))
129
146
  : undefined,
147
+ released: release.proxy as ProxyRunnerOptions['released'],
130
148
  })
131
149
  const routesById = new Map(manifest.routes.map(route => [route.id, route]))
132
150
  const nextCompat = Boolean(config.compat?.next)
@@ -149,6 +167,7 @@ export async function createRequestHandler(
149
167
  const route = routesById.get(metadata.routeId)
150
168
  if (!route) return
151
169
  await runWithWorkUnit('render', async () => {
170
+ setWorkUnitRelease(release)
152
171
  const url = new URL(`http://pnext.local${pathname}`)
153
172
  const params = routeParamsFromPath(route, pathname)
154
173
  const fetchCache = route.segmentConfig?.fetchCache
@@ -156,11 +175,10 @@ export async function createRequestHandler(
156
175
  if (route.kind === 'handler') {
157
176
  setWorkUnitRoute('route-handler', 'isr', { revalidateReason: reason })
158
177
  setPhase('handler')
159
- registerServerRuntime(config, route.sourceFiles)
160
- const href = compatModuleMode(config)
161
- ? await moduleHrefForRoute(config, route)
162
- : pathToFileHref(route.file)
163
- const module = await importModuleOnce<Parameters<typeof handleRouteModule>[0]>(href)
178
+ await registerServerRuntime(config, route.sourceFiles)
179
+ const module = await importModuleOnce<Parameters<typeof handleRouteModule>[0]>(
180
+ handlerHrefs.get(route.id)!,
181
+ )
164
182
  const rendered = await getRenderExtensions().collectRenderMeta(
165
183
  () =>
166
184
  withRouteRuntime(route.segmentConfig?.runtime, () =>
@@ -255,7 +273,13 @@ export async function createRequestHandler(
255
273
 
256
274
  setRequestExtensions({
257
275
  onDemandRevalidatePath: async pathname => {
258
- const built = await builtFileInfo(config.outPath, pathname, manifest.staticFiles)
276
+ const built = await builtFileInfo(
277
+ config.outPath,
278
+ pathname,
279
+ manifest.staticFiles,
280
+ false,
281
+ exactNames,
282
+ )
259
283
  if (!built?.metadata) return
260
284
  await runRegeneration(pathname, built.file, built.relative, built.metadata, 'on-demand')
261
285
  },
@@ -269,6 +293,8 @@ export async function createRequestHandler(
269
293
  request.method,
270
294
  request.headers,
271
295
  nextCompat,
296
+ manifest.publicAssets,
297
+ exactNames,
272
298
  )
273
299
  if (built) {
274
300
  setWorkUnitRoute('html', 'static')
@@ -293,15 +319,13 @@ export async function createRequestHandler(
293
319
  )
294
320
  }
295
321
 
296
- // The boot config compile is the only build work a prod server does; drop the
297
- // resident esbuild service child (~10+ MB RSS) — it respawns if ever needed.
298
- stopEsbuildService()
299
-
300
322
  return function handleRequest(request: Request, server?: PeerAddressSource): Promise<Response> {
301
323
  // One work unit spans the whole request; its after-queue flushes once the
302
324
  // response fully closes (stream end, redirect, notFound, error, abort).
303
325
  return runWithWorkUnit('render', async () => {
304
326
  const unit = getWorkUnit()
327
+ // Every request is work of this release: app-directory facts come from it, never the disk.
328
+ setWorkUnitRelease(release)
305
329
  try {
306
330
  const raw = await handle(request, server)
307
331
  const finalized = await finalizeResponse(
@@ -343,6 +367,8 @@ export async function createRequestHandler(
343
367
  if (badRequest) return badRequest
344
368
  request = withForwardedHeaders(request, server)
345
369
  const requestedUrl = new URL(request.url)
370
+ const slashRedirect = repeatedSlashRedirect(requestedUrl)
371
+ if (slashRedirect) return slashRedirect
346
372
  // assetPrefix is independent from basePath. Strip a path-style asset
347
373
  // prefix first so `/cdn/_next/static/*` remains servable even when the app
348
374
  // itself lives under a different basePath.
@@ -383,6 +409,11 @@ export async function createRequestHandler(
383
409
  const revalidateBypass = Boolean(
384
410
  bypassToken && request.headers.get('x-prerender-revalidate') === bypassToken,
385
411
  )
412
+ // Trailing-slash normalization applies to the browser-visible (as-requested)
413
+ // URL, never to an internal rewrite destination, and precedes the proxy for
414
+ // every method as in Next: the proxy only ever sees canonical paths.
415
+ const canonicalRedirect = trailingSlashRedirect(config, requestedUrl)
416
+ if (canonicalRedirect) return canonicalRedirect
386
417
  const canonicalUrl = new URL(request.url)
387
418
  const canonicalHeaders = request.headers
388
419
  let proxyResponse: Response | undefined
@@ -427,11 +458,6 @@ export async function createRequestHandler(
427
458
  : new Request(canonicalRequestUrl, { headers: canonicalHeaders })
428
459
 
429
460
  const method = request.method.toUpperCase()
430
- // Trailing-slash normalization applies to the browser-visible (as-requested)
431
- // URL, never to an internal rewrite destination. A middleware/next.config
432
- // rewrite to `/en/` must render internally, not 308 the visitor to `/en`.
433
- const canonicalRedirect = trailingSlashRedirect(config, requestedUrl, method)
434
- if (canonicalRedirect) return applyProxyResponse(canonicalRedirect, proxyResponse)
435
461
  // Soft navigations carry the client's parallel-route state; when the
436
462
  // target involves slots, interception, or a host render, the response is
437
463
  // state-dependent and must render dynamically (never from prebuilt html).
@@ -461,7 +487,13 @@ export async function createRequestHandler(
461
487
  // rewrites it.
462
488
  const built =
463
489
  method === 'GET' || method === 'HEAD'
464
- ? await builtFileInfo(config.outPath, url.pathname, manifest.staticFiles, nextCompat)
490
+ ? await builtFileInfo(
491
+ config.outPath,
492
+ url.pathname,
493
+ manifest.staticFiles,
494
+ nextCompat,
495
+ exactNames,
496
+ )
465
497
  : null
466
498
  const hardStaticStale =
467
499
  built !== null &&
@@ -526,6 +558,8 @@ export async function createRequestHandler(
526
558
  request.method,
527
559
  request.headers,
528
560
  nextCompat,
561
+ manifest.publicAssets,
562
+ exactNames,
529
563
  )
530
564
  if (staticFile && !(draftBypass && isHtmlResponse(staticFile))) {
531
565
  const staticMode = servedBuilt.metadata?.revalidateSeconds !== undefined ? 'isr' : 'static'
@@ -594,7 +628,14 @@ export async function createRequestHandler(
594
628
  // isOnDemandRevalidate semantics) and persist the fresh bytes so
595
629
  // subsequent requests serve the regenerated static copy again.
596
630
  const renderedHandler = await getRenderExtensions().collectRenderMeta(
597
- () => handleRoute(config, matched.route, canonicalRequest, matched.params),
631
+ () =>
632
+ handleRoute(
633
+ config,
634
+ matched.route,
635
+ handlerHrefs.get(matched.route.id)!,
636
+ canonicalRequest,
637
+ matched.params,
638
+ ),
598
639
  {
599
640
  fetchCache: matched.route.segmentConfig?.fetchCache,
600
641
  refreshFetches: staleOnDemand,
@@ -636,7 +677,7 @@ export async function createRequestHandler(
636
677
  await mkdir(path.dirname(file), { recursive: true })
637
678
  await writeFile(file, new Uint8Array(await handlerResponse.clone().arrayBuffer()))
638
679
  const relative = path
639
- .relative(path.join(config.outPath, 'public'), file)
680
+ .relative(path.join(config.outPath, 'static'), file)
640
681
  .split(path.sep)
641
682
  .join('/')
642
683
  const routeRevalidate = matched.route.segmentConfig?.revalidate
@@ -812,7 +853,7 @@ export async function createRequestHandler(
812
853
  await mkdir(path.dirname(file), { recursive: true })
813
854
  await writeFile(file, await pageResponse.clone().text())
814
855
  const relative = path
815
- .relative(path.join(config.outPath, 'public'), file)
856
+ .relative(path.join(config.outPath, 'static'), file)
816
857
  .split(path.sep)
817
858
  .join('/')
818
859
  manifest.staticFiles ??= {}
@@ -971,34 +1012,20 @@ function maybeCloseNodeFetchConnection(response: Response, request: Request) {
971
1012
  return response
972
1013
  }
973
1014
 
974
- // Compat mode gate (a pure read of config.compat, no compat import): under
975
- // compat the compiled module is loaded so bare next/* / react aliases resolve
976
- // to the compat layer. Mirrors compat/aliases.ts reactCompatEnabled — kept inline
977
- // so start.ts carries no static edge into compat.
978
- function compatModuleMode(config: Awaited<ReturnType<typeof loadConfig>>): boolean {
979
- return Boolean(config.compat?.next || config.compat?.react || config.compat?.reactCompiler)
980
- }
981
-
982
1015
  async function handleRoute(
983
1016
  config: Awaited<ReturnType<typeof loadConfig>>,
984
1017
  route: RouteManifestEntry,
1018
+ href: string,
985
1019
  request: Request,
986
1020
  params: Record<string, RouteParamValue>,
987
1021
  ) {
988
1022
  return withRouteRuntime(route.segmentConfig?.runtime, async () => {
989
- registerServerRuntime(config, route.sourceFiles)
1023
+ await registerServerRuntime(config, route.sourceFiles)
990
1024
  // Module resolution and handler invocation run through the render-span seam
991
1025
  // (compat/otel emits `resolve page components` + `executing api route`;
992
1026
  // pass-through for pure-core apps).
993
1027
  const spans = getRenderSpanExtensions()
994
1028
  const module = await spans.withFindPageComponentsSpan(route.route, async () => {
995
- // Compat mode loads the compiled module (aliases baked in): a raw import
996
- // would resolve bare next/* specifiers (next/headers etc.) against whatever
997
- // next package is installed instead of the compat layer — Bun's runtime
998
- // onResolve plugin cannot alias bare imports. Same pattern as pageRender.
999
- const href = compatModuleMode(config)
1000
- ? await moduleHrefForRoute(config, route)
1001
- : new URL(`file://${route.file}`).href
1002
1029
  const imported = await importModuleOnce<
1003
1030
  RouteHandlerModule & Parameters<typeof metadataRouteHandlerModule>[0]
1004
1031
  >(href)
@@ -1067,13 +1094,15 @@ async function builtFileInfo(
1067
1094
  pathname: string,
1068
1095
  staticFiles: Record<string, StaticFileMetadata> = {},
1069
1096
  nextStaticFallback = false,
1097
+ exactNames?: ExactNames,
1070
1098
  ): Promise<BuiltFileInfo | null> {
1071
1099
  const file = await firstFile(
1072
- path.join(outPath, 'public'),
1100
+ path.join(outPath, 'static'),
1073
1101
  builtFileCandidates(outPath, pathname, nextStaticFallback),
1102
+ exactNames,
1074
1103
  )
1075
1104
  if (!file) return null
1076
- const publicPath = path.join(outPath, 'public')
1105
+ const publicPath = path.join(outPath, 'static')
1077
1106
  const fileStat = await stat(file)
1078
1107
  const relative = path.relative(publicPath, file).split(path.sep).join('/')
1079
1108
  return { file, relative, mtimeMs: fileStat.mtimeMs, metadata: staticFiles[relative] }
@@ -1087,7 +1116,7 @@ function builtFileCandidates(
1087
1116
  pathname: string,
1088
1117
  nextStaticFallback = false,
1089
1118
  ): string[] {
1090
- const publicPath = path.join(outPath, 'public')
1119
+ const publicPath = path.join(outPath, 'static')
1091
1120
  const trimmed = pathname.replace(/^\/+/, '')
1092
1121
  if (pathname === '/') return [path.join(publicPath, 'index.html')]
1093
1122
  const candidates = [
@@ -1119,7 +1148,7 @@ function builtFileCandidates(
1119
1148
  // Where a lazily generated page for `pathname` is persisted (mirrors the
1120
1149
  // build's staticHtmlPath); null when the path would escape public/.
1121
1150
  function lazyStaticHtmlPath(outPath: string, pathname: string): string | null {
1122
- const publicPath = path.join(outPath, 'public')
1151
+ const publicPath = path.join(outPath, 'static')
1123
1152
  const file =
1124
1153
  pathname === '/'
1125
1154
  ? path.join(publicPath, 'index.html')
@@ -1131,7 +1160,7 @@ function lazyStaticHtmlPath(outPath: string, pathname: string): string | null {
1131
1160
 
1132
1161
  function lazyStaticHandlerPath(outPath: string, pathname: string): string | null {
1133
1162
  if (pathname === '/') return null
1134
- const publicPath = path.join(outPath, 'public')
1163
+ const publicPath = path.join(outPath, 'static')
1135
1164
  const file = path.join(publicPath, pathname.replace(/^\/+|\/+$/g, ''))
1136
1165
  const relative = path.relative(publicPath, file)
1137
1166
  if (relative.startsWith('..') || path.isAbsolute(relative)) return null
@@ -1195,14 +1224,17 @@ export async function maybeBuiltFile(
1195
1224
  method = 'GET',
1196
1225
  requestHeaders?: Headers,
1197
1226
  nextStaticFallback = false,
1227
+ publicAssets: string[] = [],
1228
+ exactNames?: ExactNames,
1198
1229
  ) {
1199
1230
  const normalizedMethod = method.toUpperCase()
1200
1231
  if (normalizedMethod !== 'GET' && normalizedMethod !== 'HEAD') return null
1201
1232
 
1202
- const publicPath = path.join(outPath, 'public')
1233
+ const publicPath = path.join(outPath, 'static')
1203
1234
  const file = await firstFile(
1204
1235
  publicPath,
1205
1236
  builtFileCandidates(outPath, pathname, nextStaticFallback),
1237
+ exactNames,
1206
1238
  )
1207
1239
  if (!file) return null
1208
1240
  const relative = path.relative(publicPath, file).split(path.sep).join('/')
@@ -1219,7 +1251,8 @@ export async function maybeBuiltFile(
1219
1251
  const variant = requestHeaders?.get('rsc') === '1' ? '-rsc' : ''
1220
1252
  const etag = `W/"${fileStat.size.toString(16)}-${Math.trunc(fileStat.mtimeMs).toString(16)}${variant}"`
1221
1253
  if (!headers.has('cache-control')) {
1222
- headers.set('cache-control', immutableAssetPath(relative) ? immutableCacheControl : 'no-cache')
1254
+ const immutable = immutableAssetPath(relative) && !publicAssets.includes(relative)
1255
+ headers.set('cache-control', immutable ? immutableCacheControl : 'no-cache')
1223
1256
  headers.set('etag', etag)
1224
1257
  if (requestHeaders?.get('if-none-match') === etag) {
1225
1258
  return new Response(null, { status: 304, headers })
@@ -1344,40 +1377,11 @@ function cachedGzip(key: string, body: Buffer) {
1344
1377
  return zipped
1345
1378
  }
1346
1379
 
1347
- export const immutableCacheControl = 'public, max-age=31536000, immutable'
1348
-
1349
- /**
1350
- * Everything the build emits under `assets/` (served at `/_next/static/*` in
1351
- * compat) is immutable, which is the promise Next makes for that whole
1352
- * namespace. It holds because every one of those names carries a content hash:
1353
- * esbuild's for chunks and fonts, assetContentHash for the route entries and the
1354
- * stylesheets (see fingerprintClientEntries / fingerprintAsset), and a build id
1355
- * for `_next/static/<id>/_*Manifest.js`. An UNHASHED name must never reach here —
1356
- * the same URL would answer different bytes after a deploy, and every browser
1357
- * that saw the old ones would keep them for a year.
1358
- *
1359
- * Route outputs (prerendered html, handler bodies) live outside both prefixes
1360
- * and stay revalidating; the public/ tree the app ships is likewise untouched.
1361
- */
1362
- export function immutableAssetPath(relativePath: string) {
1363
- return immutableAssetPrefixes().some(prefix => relativePath.startsWith(prefix))
1364
- }
1365
-
1366
- /** The public-relative prefixes `immutableAssetPath` covers. */
1367
- export function immutableAssetPrefixes() {
1368
- return [
1369
- 'assets/',
1370
- '_next/static/',
1371
- ...getAssetExtensions()
1372
- .staticAssetPublicPrefixes()
1373
- .map(prefix => prefix.replace(/^\/+/, '')),
1374
- ]
1375
- }
1376
-
1377
- async function firstFile(root: string, files: string[]) {
1380
+ async function firstFile(root: string, files: string[], exactNames?: ExactNames) {
1378
1381
  for (const file of files) {
1379
1382
  if (!isInside(root, file)) continue
1380
1383
  if (!existsSync(file)) continue
1384
+ if (exactNames && !hasExactName(exactNames, root, path.relative(root, file))) continue
1381
1385
  if ((await stat(file)).isFile()) return file
1382
1386
  }
1383
1387
  return null
@@ -0,0 +1,8 @@
1
+ // Traces the framework's standalone closure off the build's main thread (see startStandalone).
2
+ import { traceFramework } from './standalone'
3
+
4
+ declare const self: Worker
5
+
6
+ self.onmessage = async (event: MessageEvent) => {
7
+ self.postMessage(await traceFramework(event.data as Parameters<typeof traceFramework>[0]))
8
+ }