@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
@@ -44,6 +44,7 @@ import { esbuildEntryExportNames, isIdentifier, uniqueIdentifier } from '../util
44
44
  import { cachedExistsSync } from '../utils/fs-cache'
45
45
  import { traceEnabled, traceValue } from '../utils/trace-flags'
46
46
  import { writeFileAtomic } from '../utils/fs'
47
+ import { setPreplanDrain } from './load'
47
48
 
48
49
  // --------------------------------------------------------------------------
49
50
  // demand scheduling
@@ -61,6 +62,8 @@ export interface VendorGroupPlan {
61
62
  key: string
62
63
  /** The demanded subpath — the only thing a group is ever allowed to compile. */
63
64
  member: VendorGroupMember
65
+ /** Unbuilt subpaths that must compile in the member's round: they reach a stateful file it reaches. */
66
+ companions?: () => Promise<VendorGroupMember[]>
64
67
  /** `external` are siblings already on disk: referenced, never re-parsed. */
65
68
  build: (
66
69
  members: VendorGroupMember[],
@@ -455,10 +458,13 @@ function vendorGroupingEnabled() {
455
458
  * may not even have installed), so compiling the published set fans one demand out into hundreds of
456
459
  * foreign builds. A later sibling therefore grows the entry set and triggers another round;
457
460
  * artifacts from earlier rounds stay valid and are referenced as externals, so a growth round costs
458
- * what that sibling's own build would have cost.
461
+ * what that sibling's own build would have cost. The exception is `companions`: subpaths sharing a
462
+ * stateful file with the demand compile in its round, so that file is one chunk, one instance.
459
463
  */
460
464
  async function joinVendorGroup(group: VendorGroupPlan, nested: boolean, ticket: VendorPromotable) {
461
465
  if (!vendorGroupingEnabled()) return false
466
+ // Resolved before joining, so the companions land in the same round's snapshot.
467
+ const companions = (await group.companions?.()) ?? []
462
468
  let state = vendorGroups.get(group.key)
463
469
  if (!state) {
464
470
  state = {
@@ -480,6 +486,12 @@ async function joinVendorGroup(group: VendorGroupPlan, nested: boolean, ticket:
480
486
  return false
481
487
  }
482
488
  state.pending.set(specifier, group.member)
489
+ for (const companion of companions) {
490
+ const known = (members: Map<string, VendorGroupMember>) => members.has(companion.specifier)
491
+ if (!known(state.pending) && !known(state.produced) && !known(state.solo)) {
492
+ state.pending.set(companion.specifier, companion)
493
+ }
494
+ }
483
495
  // While this demand waits on a shared round, promoting IT has to promote the
484
496
  // round — that is the only work its result depends on.
485
497
  const groupState = state
@@ -572,6 +584,7 @@ export async function drainPreplanBuilds() {
572
584
  throw error
573
585
  }
574
586
  }
587
+ setPreplanDrain(drainPreplanBuilds)
575
588
 
576
589
  /**
577
590
  * Forget a bundle whose artifact turned out to be gone (a `pnext build` wiping
@@ -727,9 +740,9 @@ export function emittedExportNames(code: string): Set<string> | undefined {
727
740
  * Republish a bundled CommonJS entry's named exports off its default export.
728
741
  * Applied to the bundle itself (not a separate module) for the inlined case.
729
742
  */
730
- export function addCommonJsNamedExports(code: string) {
743
+ export function addCommonJsNamedExports(code: string, body = code) {
731
744
  if (hasNonDefaultExport(code)) return code
732
- const names = [...new Set([...commonJsExportNames(code), ...esbuildEntryExportNames(code)])]
745
+ const names = [...new Set([...commonJsExportNames(body), ...esbuildEntryExportNames(body)])]
733
746
  .filter(name => name !== 'default' && name !== '__esModule')
734
747
  .sort()
735
748
  if (names.length === 0) return code
package/src/types.ts CHANGED
@@ -45,9 +45,8 @@ export interface PNextConfig {
45
45
  }
46
46
 
47
47
  /**
48
- * What a deployment adapter packs into the server function. It ships the closure the runtime can reach, minus
49
- * build debris and files no runtime reads - serverless size limits are hard. These lists are the escape hatch
50
- * when that classification is wrong for an app: `exclude` drops more, `keep` overrides a built-in drop.
48
+ * What `<outDir>/standalone` ships beyond the files its server imports. `exclude` drops traced
49
+ * `node_modules` files; `keep` ships app files the server reads at runtime, at their root-relative paths.
51
50
  * Entries are directory names (`storybook-static`) or file suffixes (`.map`).
52
51
  */
53
52
  export interface PNextAdapterConfig {
@@ -667,6 +666,8 @@ export interface BuildManifest {
667
666
  staticFiles?: Record<string, StaticFileMetadata>
668
667
  /** Logical build-asset name -> the content-hashed name emitted (`global.css` -> `global-<hash>.css`). */
669
668
  assetNames?: Record<string, string>
669
+ /** App `public/` files under an immutable asset prefix; they stay revalidating. */
670
+ publicAssets?: string[]
670
671
  staticMetadataFiles?: StaticMetadataFileEntry[]
671
672
  staticModuleMetadata?: Record<string, StaticModuleMetadata>
672
673
  staticRouteMetadata?: Record<string, StaticRouteMetadata>
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Whether `source` opens with the `directive` prologue string. Linear and allocation-free: a regex
3
+ * over leading comments backtracks catastrophically on files with many comments and no directive.
4
+ */
5
+ export function hasModuleDirective(source: string, directive: string) {
6
+ const isSpace = (index: number) => {
7
+ const code = source.charCodeAt(index)
8
+ return code === 32 || (code >= 9 && code <= 13) || (code > 127 && /\s/.test(source[index]!))
9
+ }
10
+ let i = 0
11
+ for (;;) {
12
+ while (i < source.length && isSpace(i)) i += 1
13
+ if (source.startsWith('//', i)) {
14
+ const newline = source.indexOf('\n', i)
15
+ if (newline === -1) return false
16
+ i = newline + 1
17
+ continue
18
+ }
19
+ if (source.startsWith('/*', i)) {
20
+ const end = source.indexOf('*/', i + 2)
21
+ if (end === -1) return false
22
+ i = end + 2
23
+ continue
24
+ }
25
+ // Anything that is not a string literal ends the prologue.
26
+ const quote = source[i]
27
+ if (quote !== '"' && quote !== "'") return false
28
+ let end = i + 1
29
+ while (end < source.length) {
30
+ const char = source[end]!
31
+ if (char === quote || char === '\n' || char === '\\') break
32
+ end += 1
33
+ }
34
+ if (source[end] !== quote) return false
35
+ if (source.slice(i + 1, end) === directive) return true
36
+ i = end + 1
37
+ while (i < source.length && isSpace(i)) i += 1
38
+ if (source[i] === ';') i += 1
39
+ }
40
+ }
package/src/utils/fs.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { existsSync, readdirSync, readFileSync } from 'node:fs'
1
+ import { type Dirent, existsSync, readdirSync, readFileSync } from 'node:fs'
2
2
  import { mkdir, readdir, rename, rm, stat, readFile, writeFile } from 'node:fs/promises'
3
3
  import path from 'node:path'
4
4
  import { fileURLToPath } from 'node:url'
5
+ import { frozenDirListing } from '../runtime/production'
5
6
  import type { BuildManifest } from '../types'
6
7
 
7
8
  // Write-then-rename so a concurrent import never observes a truncated file; Bun caches a failed load for the
@@ -75,6 +76,8 @@ export function withDirCache<T>(run: () => T): T {
75
76
 
76
77
  /** File and subdirectory names of `dir` (both empty when it does not exist). */
77
78
  export function readDirListing(dir: string): DirListing {
79
+ const frozen = frozenDirListing(dir)
80
+ if (frozen) return frozen
78
81
  const cached = dirListings?.get(dir)
79
82
  if (cached) return cached
80
83
  let listing: DirListing
@@ -94,6 +97,75 @@ export function readDirListing(dir: string): DirListing {
94
97
  return listing
95
98
  }
96
99
 
100
+ /** On-disk names per directory and recent wrong-case misses, kept by one server; undefined on a case-sensitive filesystem. */
101
+ export type ExactNames = { dirs: Map<string, Set<string>>; misses: Set<string> } | undefined
102
+
103
+ const maxExactNameMisses = 1024
104
+
105
+ /** Only a case-insensitive filesystem (macOS, Windows) needs `hasExactName`; one probe per server, on `dir`'s own mount. */
106
+ export function exactNameIndex(dir: string): ExactNames {
107
+ let entries: Dirent[] = []
108
+ try {
109
+ entries = readdirSync(dir, { withFileTypes: true })
110
+ } catch {
111
+ // Probe `dir` itself under its parent.
112
+ }
113
+ // A symlink's flipped name answers for its target, and a dangling one never exists.
114
+ const entry = entries.find(item => !item.isSymbolicLink() && hasCase(item.name))
115
+ const probe = entry ? path.join(dir, entry.name) : dir
116
+ const name = path.basename(probe)
117
+ if (!hasCase(name)) return undefined
118
+ return existsSync(path.join(path.dirname(probe), flipCase(name)))
119
+ ? { dirs: new Map(), misses: new Set() }
120
+ : undefined
121
+ }
122
+
123
+ function flipCase(name: string) {
124
+ return name === name.toUpperCase() ? name.toLowerCase() : name.toUpperCase()
125
+ }
126
+
127
+ function hasCase(name: string) {
128
+ return flipCase(name) !== name
129
+ }
130
+
131
+ /** Whether `relative` under `root` is spelled exactly as on disk (Next serves static files by exact name). */
132
+ export function hasExactName(names: NonNullable<ExactNames>, root: string, relative: string) {
133
+ let dir = root
134
+ for (const name of relative.split(path.sep)) {
135
+ const file = `${dir}${path.sep}${name}`
136
+ const listing = dirNames(names, dir)
137
+ // An unreadable directory fails this request only; nothing about it is remembered.
138
+ if (!listing) return false
139
+ if (!listing.has(name)) {
140
+ if (names.misses.has(file)) return false
141
+ // A miss re-reads the directory once: the server may have written the file since.
142
+ const fresh = dirNames(names, dir, true)
143
+ if (!fresh?.has(name)) {
144
+ if (fresh) {
145
+ if (names.misses.size >= maxExactNameMisses) names.misses.clear()
146
+ names.misses.add(file)
147
+ }
148
+ return false
149
+ }
150
+ }
151
+ dir = file
152
+ }
153
+ return true
154
+ }
155
+
156
+ function dirNames(names: NonNullable<ExactNames>, dir: string, refresh = false) {
157
+ let entries = refresh ? undefined : names.dirs.get(dir)
158
+ if (!entries) {
159
+ try {
160
+ entries = new Set(readdirSync(dir))
161
+ } catch {
162
+ return undefined
163
+ }
164
+ names.dirs.set(dir, entries)
165
+ }
166
+ return entries
167
+ }
168
+
97
169
  /** listFiles for callers already running synchronously (route fact scans). */
98
170
  export function listFilesSync(root: string): string[] {
99
171
  if (!existsSync(root)) return []
@@ -206,11 +278,22 @@ export function includeTypes(config: { include?: unknown }, files: string[], def
206
278
  return added
207
279
  }
208
280
 
281
+ // pnext's own files outside the app (a linked or store install) are named from the framework root,
282
+ // so a build moved to another machine finds them wherever pnext is installed there.
283
+ const frameworkRoot = path.resolve(import.meta.dirname, '..', '..')
284
+ const frameworkPrefix = 'pnext:'
285
+
209
286
  /** Relativize only source-path fields while writing; build hooks keep absolute paths. */
210
287
  export function serializeBuildManifest(data: BuildManifest): string {
211
288
  const { root, appDir, outDir } = data
289
+ const relative = (file: string) => {
290
+ const inRoot = toPosixPath(path.relative(root, file))
291
+ if (!inRoot.startsWith('..')) return inRoot
292
+ const inFramework = toPosixPath(path.relative(frameworkRoot, file))
293
+ return inFramework.startsWith('..') ? inRoot : `${frameworkPrefix}${inFramework}`
294
+ }
212
295
  const stored = {
213
- ...mapSourcePaths(data, file => toPosixPath(path.relative(root, file))),
296
+ ...mapSourcePaths(data, relative),
214
297
  root: toPosixPath(path.relative(outDir, root)) || '.',
215
298
  appDir: toPosixPath(path.relative(root, appDir)),
216
299
  outDir: '.',
@@ -218,9 +301,17 @@ export function serializeBuildManifest(data: BuildManifest): string {
218
301
  return `${JSON.stringify(stored, null, 2)}\n`
219
302
  }
220
303
 
221
- export function resolveManifest(data: BuildManifest, outPath: string, root: string): BuildManifest {
304
+ export function resolveManifest(
305
+ data: BuildManifest,
306
+ outPath: string,
307
+ root: string,
308
+ framework = frameworkRoot,
309
+ ): BuildManifest {
222
310
  if (path.isAbsolute(data.root)) return data
223
- const absolute = (file: string) => path.join(root, file)
311
+ const absolute = (file: string) =>
312
+ file.startsWith(frameworkPrefix)
313
+ ? path.join(framework, file.slice(frameworkPrefix.length))
314
+ : path.join(root, file)
224
315
  return {
225
316
  ...mapSourcePaths(data, absolute),
226
317
  root,
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Split a webpack resource specifier into its file request and its `?query#fragment` suffix - loader
3
+ * plumbing (turbopack rules, `.wasm?module`) that takes no part in the on-disk lookup. A leading `#` is a
4
+ * package-imports specifier, not a fragment.
5
+ */
6
+ export function splitResourceQuery(specifier: string): { path: string; query: string } {
7
+ const offset = specifier.startsWith('#') ? 1 : 0
8
+ const match = /[?#]/.exec(specifier.slice(offset))
9
+ if (!match) return { path: specifier, query: '' }
10
+ const index = offset + match.index
11
+ return { path: specifier.slice(0, index), query: specifier.slice(index) }
12
+ }
@@ -1,45 +0,0 @@
1
- /**
2
- * Server entry for hosts that serve a build through `createRequestHandler`: a thin loader that
3
- * resolves `@wular/pnext` from the output's own location (as `.next/server` loads `next`), so the
4
- * output carries no framework code and no build-machine paths.
5
- */
6
- import { readFileSync } from 'node:fs'
7
- import { mkdir, writeFile } from 'node:fs/promises'
8
- import path from 'node:path'
9
- import { frameworkFingerprint } from '../../runtime/fingerprint'
10
-
11
- const frameworkRoot = path.resolve(import.meta.dirname, '..', '..', '..')
12
-
13
- /** Stamped into the filename so an upgraded framework never runs a stale bundle. */
14
- function frameworkVersion(): string {
15
- try {
16
- const pkg = readFileSync(path.join(frameworkRoot, 'package.json'), 'utf8')
17
- return (JSON.parse(pkg) as { version?: string }).version ?? '0'
18
- } catch {
19
- return '0'
20
- }
21
- }
22
-
23
- /**
24
- * Version AND framework fingerprint: the version alone let an edited `src` keep serving the bundle
25
- * built from the previous source, so a fix appeared to have no effect until the app was rebuilt.
26
- * The fingerprint is the same one every other compiled artifact is keyed on, taken through the
27
- * cache-root record so a restart pays one stat per file rather than re-reading the tree.
28
- */
29
- export function serverEntryDir(outPath: string): string {
30
- const generation = frameworkFingerprint(path.join(outPath, 'cache', 'server'))
31
- return path.join(outPath, 'server', `bundle-${frameworkVersion()}-${generation}`)
32
- }
33
-
34
- /** Write `<outPath>/server/bundle-<version>-<fingerprint>/entry.js`, re-exporting src/cli/start.ts. */
35
- export async function emitServerEntry(outPath: string): Promise<void> {
36
- const start = await Bun.file(path.join(import.meta.dirname, '..', 'start.ts')).text()
37
- const names = new Bun.Transpiler({ loader: 'ts' }).scan(start).exports
38
- const dir = serverEntryDir(outPath)
39
- await mkdir(dir, { recursive: true })
40
- await writeFile(
41
- path.join(dir, 'entry.js'),
42
- `const pnext = await import(new URL('./cli/start.ts', import.meta.resolve('@wular/pnext')).href)\n` +
43
- `export const { ${names.join(', ')} } = pnext\n`,
44
- )
45
- }