@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
@@ -26,27 +26,54 @@ import { resolveManifest } from '../../utils/fs'
26
26
  * go-ahead to finish the rest once the manifest is written.
27
27
  */
28
28
  import { existsSync } from 'node:fs'
29
- import { readFile } from 'node:fs/promises'
29
+ import { mkdir, readFile, rm } from 'node:fs/promises'
30
30
  import path from 'node:path'
31
31
  import { fileURLToPath } from 'node:url'
32
- import { loadConfig, pathToFileHref, type ResolvedConfig } from '../../config'
32
+ import {
33
+ DEFAULT_OUT_DIR,
34
+ loadConfig,
35
+ pathToFileHref,
36
+ standaloneOutSegment,
37
+ type ResolvedConfig,
38
+ } from '../../config'
33
39
  import { bootstrapCompat } from '../../compat-bootstrap'
34
40
  import { compiledClientReferenceFiles, ssrClientReference } from '../../client/reference'
41
+ import { hasUseClientDirective } from '../../client/reference-stub'
42
+ import { moduleExportNames } from '../../resolve/scan-facts'
43
+ import { globalCssSources } from '../../css/build'
35
44
  import {
36
45
  devClientModuleHref,
46
+ devModuleGraph,
37
47
  devServerModuleHref,
38
48
  setEmitCompiledSpecifiersManifest,
49
+ setReleaseCompile,
39
50
  } from '../../runtime/modules'
40
51
  import { getCompatModeExtensions } from '../../extensions'
41
- import { getFontExtensions } from '../../render/hooks'
52
+ import { getFontExtensions, type ReleasedFont } from '../../render/hooks'
53
+ import { beginSourceScope, readSourceSync } from '../../resolve/source-text'
54
+ import { releasedProxy } from '../../routing/proxy-config'
42
55
  import { findConventionFiles, findLayouts } from '../../routing/routes'
43
56
  import {
44
- prewarmServerTransforms,
57
+ pagesApiBundleTargetForRuntime,
45
58
  registerServerRuntime,
46
59
  serverBundleTargetForRuntime,
60
+ type ServerBundleTarget,
47
61
  } from '../../runtime/loader'
48
- import { cacheRoot } from '../../runtime/module-cache'
49
- import { listFiles } from '../../utils/fs'
62
+ import {
63
+ BUILD_INDEX_VERSION,
64
+ type CompatRelease,
65
+ type ReleaseLayer,
66
+ captureConventions,
67
+ releaseModuleKey,
68
+ releaseSourceKey,
69
+ serializeReleaseConfig,
70
+ writeBuildIndex,
71
+ buildManifestFile,
72
+ buildIndexFile,
73
+ } from '../../runtime/production'
74
+ import { frameworkFingerprint } from '../../runtime/fingerprint'
75
+ import { releaseDependencyLog } from '../../runtime/vendor-build'
76
+ import { linkReleaseLayer, pruneReleaseVendor } from '../../runtime/release-graph'
50
77
  import { namedBunBinary } from '../boot/named-bin'
51
78
  import type { VerboseLogger } from '../../utils/verbose'
52
79
  import type { BuildManifest } from '../../types'
@@ -69,6 +96,11 @@ const COMPILED_MARKER = 'pnext-warm-compiled'
69
96
  interface WarmRequest {
70
97
  /** Files a previous attempt already finished — or died on. */
71
98
  skip: string[]
99
+ /** Release modules a previous attempt compiled, so the release this attempt writes is whole. */
100
+ compiled: Record<string, string>
101
+ /** Facts the parent already holds: the root layout's stylesheet closure and its own compiled client references. */
102
+ globalCss?: string[]
103
+ clientReferences: string[]
72
104
  }
73
105
  interface PrewarmRequest {
74
106
  /** Page route sources, known from the route scan long before the manifest. */
@@ -106,7 +138,11 @@ export interface WarmChild {
106
138
  * which is already the final set: the caller can start tracing the node_modules closure while the
107
139
  * child runs handlers concurrently.
108
140
  */
109
- finish(log: VerboseLogger, onCompiled?: (modules: string[]) => void): Promise<string[]>
141
+ finish(
142
+ log: VerboseLogger,
143
+ onCompiled?: (modules: string[]) => void,
144
+ facts?: Pick<WarmRequest, 'globalCss' | 'clientReferences'>,
145
+ ): Promise<string[]>
110
146
  /** Stop every attempt owned by this build. Safe to call after `finish` or more than once. */
111
147
  kill(): void
112
148
  }
@@ -150,8 +186,8 @@ export function startWarmChild(config: ResolvedConfig, mode: WarmMode = 'full'):
150
186
  // broken pipe: the child is gone; `finish` reports why
151
187
  }
152
188
  },
153
- finish: (log, onCompiled) =>
154
- warmWithRestarts(first, spawn, mode, log, onCompiled).finally(kill),
189
+ finish: (log, onCompiled, facts = { clientReferences: [] }) =>
190
+ warmWithRestarts(first, spawn, mode, log, facts, onCompiled).finally(kill),
155
191
  kill,
156
192
  }
157
193
  }
@@ -191,10 +227,11 @@ async function warmWithRestarts(
191
227
  spawn: () => WarmProcess | undefined,
192
228
  mode: WarmMode,
193
229
  log: VerboseLogger,
230
+ facts: Pick<WarmRequest, 'globalCss' | 'clientReferences'>,
194
231
  onCompiled?: (modules: string[]) => void,
195
232
  ) {
196
- // Source file -> compiled artifact. Handlers map to nothing but still count as
197
- // finished, so a restart does not import them a second time.
233
+ // Release module key (or a handler's source file) -> compiled artifact. Handlers map to nothing
234
+ // but still count as finished, so a restart does not import them a second time.
198
235
  const finished = new Map<string, string | undefined>()
199
236
  const compiled = () => [...finished.values()].filter((file): file is string => Boolean(file))
200
237
  // The marker can only mean "compiled set final" the first time it fires —
@@ -212,7 +249,13 @@ async function warmWithRestarts(
212
249
  const before = finished.size
213
250
  const failure = await runAttempt(
214
251
  child,
215
- { skip: [...finished.keys()] },
252
+ {
253
+ skip: [...finished.keys()],
254
+ compiled: Object.fromEntries(
255
+ [...finished].filter((entry): entry is [string, string] => Boolean(entry[1])),
256
+ ),
257
+ ...facts,
258
+ },
216
259
  finished,
217
260
  fireOnCompiled,
218
261
  )
@@ -317,8 +360,87 @@ function pageServerFiles(config: ResolvedConfig, routeFiles: Iterable<string>) {
317
360
  return files
318
361
  }
319
362
 
320
- const compileServer = (config: ResolvedConfig, file: string) =>
321
- devServerModuleHref(config, file, 'build').then(href => report(file, fileURLToPath(href)))
363
+ interface ReleaseEntry {
364
+ layer: ReleaseLayer
365
+ target: ServerBundleTarget
366
+ file: string
367
+ }
368
+
369
+ /** Compile one release module, reporting it under its release key. */
370
+ async function compileEntry(
371
+ config: ResolvedConfig,
372
+ entry: ReleaseEntry,
373
+ compiled: Map<string, string>,
374
+ ) {
375
+ const href =
376
+ entry.layer === 'client'
377
+ ? await devClientModuleHref(config, entry.file, 'build', entry.target)
378
+ : await devServerModuleHref(config, entry.file, 'build', { conditionTarget: entry.target })
379
+ const key = releaseModuleKey(entry.layer, entry.target, entry.file)
380
+ compiled.set(key, fileURLToPath(href))
381
+ report(key, fileURLToPath(href))
382
+ }
383
+
384
+ /**
385
+ * Every module a production server can import, by layer and target: each convention file of the app
386
+ * tree, each handler, and each client reference the render marks or SSRs.
387
+ */
388
+ function releaseEntries(
389
+ config: ResolvedConfig,
390
+ routes: BuildManifest['routes'],
391
+ conventionFiles: string[],
392
+ clientReferences: Iterable<string>,
393
+ ) {
394
+ const compat = getCompatModeExtensions().reactEnabled(config)
395
+ const entries = new Map<string, ReleaseEntry>()
396
+ const add = (layer: ReleaseLayer, target: ServerBundleTarget, file: string) =>
397
+ entries.set(releaseModuleKey(layer, target, file), { layer, target, file })
398
+ const addConvention = (target: ServerBundleTarget, file: string) => {
399
+ add('server', target, file)
400
+ if (compat && hasUseClientDirective(readSourceSync(file))) add('client', target, file)
401
+ }
402
+ const pageFiles = conventionFiles.filter(file => !path.basename(file).startsWith('route.'))
403
+ for (const file of pageFiles) addConvention('server', file)
404
+ const targets = new Set<ServerBundleTarget>(['server'])
405
+ for (const route of routes) {
406
+ const target = serverBundleTargetForRuntime(route.segmentConfig?.runtime)
407
+ targets.add(target)
408
+ if (route.kind === 'handler') {
409
+ add('server', target, route.file)
410
+ continue
411
+ }
412
+ if (target !== 'server') {
413
+ const dirs = [path.dirname(route.file), ...(route.slotDirs ?? [])]
414
+ for (const file of pageFiles) {
415
+ const dir = path.dirname(file)
416
+ if (dirs.some(owner => isInsideDir(dir, owner) || isInsideDir(owner, dir))) {
417
+ addConvention(target, file)
418
+ }
419
+ }
420
+ }
421
+ if (compat && route.client && existsSync(route.file)) add('client', target, route.file)
422
+ // Inline actions recover cold by importing their owning module by source key, helpers included.
423
+ if (compat) {
424
+ for (const file of route.sourceFiles) {
425
+ if (/\.[cm]?[jt]sx?$/.test(file) && readSourceSync(file).includes('use server')) {
426
+ add('server', 'server', file)
427
+ add('server', target, file)
428
+ }
429
+ }
430
+ }
431
+ for (const reference of route.clientReferences) {
432
+ if (ssrClientReference(reference)) add(compat ? 'client' : 'server', target, reference.file)
433
+ }
434
+ }
435
+ if (compat) {
436
+ for (const file of clientReferences) for (const target of targets) add('client', target, file)
437
+ }
438
+ return [...entries.values()]
439
+ }
440
+
441
+ function isInsideDir(dir: string, file: string) {
442
+ return file === dir || file.startsWith(`${dir}${path.sep}`)
443
+ }
322
444
 
323
445
  /**
324
446
  * Compile the page routes' server modules from the build's route scan, long before the manifest
@@ -326,29 +448,49 @@ const compileServer = (config: ResolvedConfig, file: string) =>
326
448
  * pass below - the point is to spend this CPU under the build's client stage. Nothing here runs app
327
449
  * code, so it is safe to overlap (see the handler note below).
328
450
  */
329
- export async function prewarmPageModules(config: ResolvedConfig, routeFiles: string[]) {
330
- if (!getCompatModeExtensions().reactEnabled(config)) return
451
+ export async function prewarmPageModules(
452
+ config: ResolvedConfig,
453
+ routeFiles: string[],
454
+ compiled = new Map<string, string>(),
455
+ ) {
456
+ const { files } = captureConventions(config.root, config.appPath)
457
+ const entries = [
458
+ ...new Set([...files.filter(file => !path.basename(file).startsWith('route.')), ...routeFiles]),
459
+ ].filter(file => existsSync(file))
460
+ const compile = (layer: ReleaseLayer, file: string) =>
461
+ compileEntry(config, { layer, target: 'server', file }, compiled).catch(() => undefined)
462
+ await Promise.all(entries.map(file => compile('server', file)))
463
+ // The client components those entries reach are core's client references: publish them now, under
464
+ // the build, rather than after the manifest. Compat's client layer stays after the build's own
465
+ // prerender, whose vendor plan it must share.
466
+ if (getCompatModeExtensions().reactEnabled(config)) return
467
+ const graph = devModuleGraph(config)
468
+ const sources = await graph.graphSources(entries).catch(() => [])
331
469
  await Promise.all(
332
- [...pageServerFiles(config, routeFiles)].map(file =>
333
- compileServer(config, file).catch(() => undefined),
334
- ),
470
+ sources.map(async ([file]) => {
471
+ if (/\.[cm]?[jt]sx?$/.test(file) && (await graph.isClientSource(file))) {
472
+ await compile('server', file)
473
+ }
474
+ }),
335
475
  )
336
476
  }
337
477
 
338
478
  /**
339
- * The warm pass itself, in the child. Reports every file it finishes as it
340
- * lands, so a parent restart can step over one that takes the process down.
479
+ * The warm pass itself, in the child. Compiles every release module, reporting each as it lands so a
480
+ * parent restart can step over one that takes the process down, then publishes the build index.
341
481
  */
342
482
  export async function warmRouteModules(
343
483
  config: ResolvedConfig,
344
484
  manifest: BuildManifest,
345
- skip: ReadonlySet<string> = new Set(),
485
+ request: Pick<WarmRequest, 'skip' | 'compiled' | 'globalCss' | 'clientReferences'>,
346
486
  mode: WarmMode = 'full',
487
+ compiled = new Map<string, string>(),
347
488
  ) {
489
+ const skip = new Set(request.skip)
490
+ for (const [key, artifact] of Object.entries(request.compiled)) compiled.set(key, artifact)
348
491
  const clientFiles = new Set<string>()
349
492
  const handlers: BuildManifest['routes'] = []
350
493
  const pages: BuildManifest['routes'] = []
351
- const pageRoutes: string[] = []
352
494
 
353
495
  for (const route of manifest.routes) {
354
496
  if (route.kind === 'handler') {
@@ -356,7 +498,6 @@ export async function warmRouteModules(
356
498
  continue
357
499
  }
358
500
  pages.push(route)
359
- pageRoutes.push(route.file)
360
501
  for (const reference of route.clientReferences) {
361
502
  if (ssrClientReference(reference) && existsSync(reference.file)) {
362
503
  clientFiles.add(reference.file)
@@ -364,41 +505,61 @@ export async function warmRouteModules(
364
505
  }
365
506
  }
366
507
 
367
- // Without react compat the runtime imports page sources directly (Bun
368
- // transforms in memory); the compiled build cache is only used with compat.
369
- if (getCompatModeExtensions().reactEnabled(config)) {
370
- await Promise.all([
371
- ...[...pageServerFiles(config, pageRoutes)]
372
- .filter(file => !skip.has(file))
373
- .map(file => compileServer(config, file)),
374
- ...[...clientFiles]
375
- .filter(file => !skip.has(file))
376
- .map(file =>
377
- devClientModuleHref(config, file, 'build').then(href =>
378
- report(file, fileURLToPath(href)),
379
- ),
380
- ),
381
- // Handler artifacts are otherwise only written by the import below, which
382
- // `compile` mode does not run: compiling them here is what keeps a handler
383
- // route's first served request off the compile pipeline too.
384
- ...(mode === 'compile'
385
- ? handlers.map(async route => {
386
- registerServerRuntime(config, route.sourceFiles)
387
- report(route.file, fileURLToPath(await handlerModuleHref(config, route)))
388
- })
389
- : []),
390
- ])
508
+ const { conventions, files } = captureConventions(config.root, config.appPath)
509
+ const serverDir = path.join(config.outPath, 'server')
510
+ await mkdir(serverDir, { recursive: true })
511
+ // Compat's release facts (compiled config, handlers, instrumentation) build beside the module compile.
512
+ const compat = config.compat?.next
513
+ ? import('../../compat/release').then(release => release.compatReleaseFacts(config, serverDir))
514
+ : Promise.resolve(undefined)
515
+ compat.catch(() => undefined)
516
+ const compileAll = (entries: ReleaseEntry[]) =>
517
+ Promise.all(
518
+ entries
519
+ .filter(entry => !compiled.has(releaseModuleKey(entry.layer, entry.target, entry.file)))
520
+ .map(entry => compileEntry(config, entry, compiled)),
521
+ )
522
+ await compileAll(releaseEntries(config, manifest.routes, files, request.clientReferences))
523
+ // Client references only a server compile discovers (a 'use client' module inside a package).
524
+ await compileAll(releaseEntries(config, manifest.routes, files, compiledClientReferenceFiles()))
525
+ const compatFacts = await compat
526
+ await compileAll(
527
+ Object.entries(compatFacts?.compat?.pagesApi ?? {}).map(([file, runtime]) => ({
528
+ layer: 'server',
529
+ target: pagesApiBundleTargetForRuntime(runtime),
530
+ file: path.resolve(config.root, file),
531
+ })),
532
+ )
533
+ const fonts = await releaseFonts(config, manifest.routes, compiled)
534
+ // One graph per App Router layer for the server dependencies the release imports.
535
+ const layerSources = new Map<string, string>()
536
+ const rsc = await linkReleaseLayer(config, 'server:server', [...compiled.values()], layerSources)
537
+ // The server graph can reach a package's 'use client' file no compile saw.
538
+ await compileAll(releaseEntries(config, manifest.routes, files, compiledClientReferenceFiles()))
539
+ const ssr = await linkReleaseLayer(config, 'client:client', [...compiled.values()], layerSources)
540
+ for (const [key, artifact] of compiled) {
541
+ const layer = key.startsWith('server:server:')
542
+ ? rsc
543
+ : key.startsWith('client:server:')
544
+ ? ssr
545
+ : undefined
546
+ const moved = layer?.moved.get(artifact)
547
+ if (moved) compiled.set(key, moved)
391
548
  }
549
+ if (rsc || ssr) await pruneReleaseVendor(config, layerSources)
550
+ await rm(releaseDependencyLog(config), { force: true })
551
+ await writeRelease(
552
+ config,
553
+ compiled,
554
+ conventions,
555
+ files,
556
+ compatFacts ?? {},
557
+ fonts,
558
+ [...(rsc?.files ?? []), ...(ssr?.files ?? [])],
559
+ request.globalCss,
560
+ )
392
561
  console.log(COMPILED_MARKER)
393
- if (mode === 'compile') {
394
- // Transform is the tail of the compile pipeline: an artifact is transformed when it is first
395
- // imported, so a server that skipped every compile would still start esbuild for this alone.
396
- // The import pass below covers it in `full` mode; here it runs standalone, without app code.
397
- for (const route of [...pages, ...handlers]) registerServerRuntime(config, route.sourceFiles)
398
- const modules = cacheRoot(config.outPath)
399
- await prewarmServerTransforms(modules, await listFiles(modules))
400
- return
401
- }
562
+ if (mode === 'compile') return
402
563
  // Everything below runs the app's own code to capture what only an import
403
564
  // writes (vendor bundles, next/font bytes). A normal build serves from a
404
565
  // writable disk and creates those on demand; only a read-only deployment
@@ -506,11 +667,103 @@ async function importPageModules(
506
667
  }
507
668
  }
508
669
 
670
+ /**
671
+ * Resolve the app's next/font declarations for the release. A declaration only exists once its module
672
+ * evaluates, so the modules that call a font loader are imported here, as `next build` does.
673
+ */
674
+ async function releaseFonts(
675
+ config: ResolvedConfig,
676
+ routes: BuildManifest['routes'],
677
+ compiled: Map<string, string>,
678
+ ) {
679
+ if (!config.compat?.next) return undefined
680
+ const files = new Set(
681
+ routes
682
+ .flatMap(route => route.sourceFiles)
683
+ .filter(file => /\.(?:[cm]?[jt]sx?|mdx?)$/.test(file))
684
+ .filter(file => readSourceSync(file).includes('next/font/')),
685
+ )
686
+ if (files.size === 0) return undefined
687
+ for (const file of files) {
688
+ const entry = { layer: 'server', target: 'server', file } as const
689
+ await compileEntry(config, entry, compiled)
690
+ try {
691
+ await import(pathToFileHref(compiled.get(releaseModuleKey('server', 'server', file))!))
692
+ } catch (error) {
693
+ console.warn(`pnext build: importing ${file} for its fonts failed:`, error)
694
+ }
695
+ }
696
+ const fonts = await getFontExtensions().releaseFonts(config)
697
+ return Object.fromEntries(
698
+ Object.entries(fonts).map(([key, font]) => [
699
+ key,
700
+ { ...font, files: font.files.map(file => path.relative(config.outPath, file)) },
701
+ ]),
702
+ )
703
+ }
704
+
705
+ /** Publish the build index: every compiled module plus the source facts production reads instead of source. */
706
+ async function writeRelease(
707
+ config: ResolvedConfig,
708
+ compiled: ReadonlyMap<string, string>,
709
+ conventions: Record<string, string[]>,
710
+ conventionFiles: string[],
711
+ compat: CompatRelease,
712
+ fonts: Record<string, ReleasedFont> | undefined,
713
+ dependencies: string[],
714
+ globalCss = globalCssSources(config),
715
+ ) {
716
+ const toPosix = (file: string) => file.split(path.sep).join('/')
717
+ const fromRoot = (file: string) => toPosix(path.relative(config.root, file))
718
+ const modules: Record<string, string> = {}
719
+ // Sorted: compiles land in completion order, and an unchanged build must publish identical bytes.
720
+ for (const [key, artifact] of [...compiled].sort(([a], [b]) => (a < b ? -1 : 1))) {
721
+ const match = /^((?:server|client):[^:]+:)(.*)$/s.exec(key)
722
+ if (!match) continue
723
+ modules[`${match[1]}${releaseSourceKey(match[2]!, config.root, config.workspaceRoot)}`] =
724
+ toPosix(path.relative(config.outPath, artifact))
725
+ }
726
+ const source = (file: string) => readSourceSync(file)
727
+ const proxy = releasedProxy(config)
728
+ await writeBuildIndex(config, {
729
+ version: BUILD_INDEX_VERSION,
730
+ framework: frameworkFingerprint(),
731
+ config: serializeReleaseConfig(config),
732
+ ...compat,
733
+ modules,
734
+ conventions,
735
+ clientConventions: conventionFiles
736
+ .filter(file => hasUseClientDirective(source(file)))
737
+ .map(fromRoot),
738
+ documentLayouts: conventionFiles
739
+ .filter(
740
+ file =>
741
+ path.basename(file).startsWith('layout.') &&
742
+ moduleExportNames(source(file), file).includes('default'),
743
+ )
744
+ .map(fromRoot),
745
+ globalCss: globalCss.map(fromRoot),
746
+ ...(proxy ? { proxy: { ...proxy, file: fromRoot(proxy.file) } } : {}),
747
+ ...(fonts ? { fonts } : {}),
748
+ ...(dependencies.length > 0
749
+ ? { dependencies: dependencies.map(file => toPosix(path.relative(config.outPath, file))) }
750
+ : {}),
751
+ })
752
+ // A build that moved outDir leaves no default-dir release behind for `pnext start` to serve.
753
+ const defaultRelease = path.join(config.root, DEFAULT_OUT_DIR, standaloneOutSegment)
754
+ if (path.resolve(config.outPath) !== defaultRelease) {
755
+ await rm(buildIndexFile(defaultRelease), { force: true })
756
+ }
757
+ }
758
+
509
759
  /**
510
760
  * Read the parent's line-delimited requests until the `skip` message, running
511
761
  * each prewarm batch as it arrives. Returns the final request.
512
762
  */
513
- async function readWarmRequests(config: ResolvedConfig): Promise<Partial<WarmRequest>> {
763
+ async function readWarmRequests(
764
+ config: ResolvedConfig,
765
+ prewarmed: Map<string, string>,
766
+ ): Promise<Partial<WarmRequest>> {
514
767
  let buffer = ''
515
768
  const decoder = new TextDecoder()
516
769
  const reader = Bun.stdin.stream().getReader()
@@ -525,7 +778,7 @@ async function readWarmRequests(config: ResolvedConfig): Promise<Partial<WarmReq
525
778
  if (!line) continue
526
779
  const message = JSON.parse(line) as Partial<WarmRequest & PrewarmRequest>
527
780
  if (message.skip) return message
528
- if (message.prewarm) await prewarmPageModules(config, message.prewarm)
781
+ if (message.prewarm) await prewarmPageModules(config, message.prewarm, prewarmed)
529
782
  }
530
783
  }
531
784
  const rest = buffer.trim()
@@ -542,20 +795,32 @@ if (import.meta.main) {
542
795
  // Only the vercel adapter reads the specifier manifests back (its trace step);
543
796
  // a plain build would write them for nothing.
544
797
  setEmitCompiledSpecifiersManifest(mode === 'full')
798
+ setReleaseCompile(true)
799
+ // Idle until the route scan arrives: read the framework generation every compile keys on now.
800
+ frameworkFingerprint()
801
+ // One read per source for the child's life: its release facts re-read what the compile read.
802
+ beginSourceScope()
545
803
  // Blocks until the parent sends the go-ahead, i.e. until the manifest is
546
804
  // written; a prewarm batch may arrive and run before that.
547
- const request = await readWarmRequests(config)
805
+ const prewarmed = new Map<string, string>()
806
+ const request = await readWarmRequests(config, prewarmed)
548
807
  // A build that fails closes stdin without a go-ahead and never writes the manifest. There is
549
808
  // nothing to warm and nothing to report: exiting quietly keeps the failed build's own error the
550
809
  // only thing on stderr.
551
- const manifestFile = path.join(config.outPath, 'manifest.json')
810
+ const manifestFile = buildManifestFile(config.outPath)
552
811
  if (!request.skip || !existsSync(manifestFile)) process.exit(0)
553
812
  const manifest = resolveManifest(
554
813
  JSON.parse(await readFile(manifestFile, 'utf8')) as BuildManifest,
555
814
  config.outPath,
556
815
  config.root,
557
816
  )
558
- await warmRouteModules(config, manifest, new Set(request.skip ?? []), mode)
817
+ await warmRouteModules(
818
+ config,
819
+ manifest,
820
+ { skip: [], compiled: {}, clientReferences: [], ...request },
821
+ mode,
822
+ prewarmed,
823
+ )
559
824
  // App code reached through a route handler can leave the loop alive (a db
560
825
  // pool, a stray interval); the warm pass is done either way.
561
826
  process.exit(0)