@wular/pnext 0.1.5 → 0.1.7

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 (302) hide show
  1. package/bin/pnext +9 -2
  2. package/dist/server/_chunks/aliases-j47a10ce.js +44 -0
  3. package/dist/server/_chunks/analyze-arswqe6s.js +445 -0
  4. package/dist/server/_chunks/boot-af0mv3dy.js +36 -0
  5. package/dist/server/_chunks/build-spy3dxp4.js +84 -0
  6. package/dist/server/_chunks/build-t9h0hec3.js +3550 -0
  7. package/dist/server/_chunks/build-tier-m7yvqz61.js +2472 -0
  8. package/dist/server/_chunks/compile-53j02j27.js +22 -0
  9. package/dist/server/_chunks/config-1yzwexq6.js +27 -0
  10. package/dist/server/_chunks/config-n2z7yxps.js +22 -0
  11. package/dist/server/_chunks/create-meec9hs6.js +134 -0
  12. package/dist/server/_chunks/dev-fjmqg6en.js +220 -0
  13. package/dist/server/_chunks/esbuild-yyktfrtt.js +15 -0
  14. package/dist/server/_chunks/generate-n9sh6hzt.js +21 -0
  15. package/dist/server/_chunks/index-0374j2b9.js +66 -0
  16. package/dist/server/_chunks/index-06nyqntx.js +213 -0
  17. package/dist/server/_chunks/index-1011cscr.js +5263 -0
  18. package/dist/server/_chunks/index-11sfk4hb.js +170 -0
  19. package/dist/server/_chunks/index-20ppawv7.js +297 -0
  20. package/dist/server/_chunks/index-2dv4y4wd.js +1065 -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-357na4a8.js +109 -0
  24. package/dist/server/_chunks/index-3b3at80h.js +109 -0
  25. package/dist/server/_chunks/index-3tf1xjsp.js +6166 -0
  26. package/dist/server/_chunks/index-3xbr4eyv.js +105 -0
  27. package/dist/server/_chunks/index-4399bvd2.js +18 -0
  28. package/dist/server/_chunks/index-4hgjrqh7.js +851 -0
  29. package/dist/server/_chunks/index-4q2gbfwk.js +2530 -0
  30. package/dist/server/_chunks/index-4t92hdxd.js +172 -0
  31. package/dist/server/_chunks/index-4zzebszd.js +10 -0
  32. package/dist/server/_chunks/index-5gyr4emz.js +107 -0
  33. package/dist/server/_chunks/index-5hr4062s.js +70 -0
  34. package/dist/server/_chunks/index-68m3mwbd.js +84 -0
  35. package/dist/server/_chunks/index-6b009mt0.js +56 -0
  36. package/dist/server/_chunks/index-6e4fqv30.js +588 -0
  37. package/dist/server/_chunks/index-6gex3pfa.js +15 -0
  38. package/dist/server/_chunks/index-6kp9r0d9.js +11 -0
  39. package/dist/server/_chunks/index-6q7zvrap.js +134 -0
  40. package/dist/server/_chunks/index-73z4esab.js +38 -0
  41. package/dist/server/_chunks/index-79ngvam8.js +60 -0
  42. package/dist/server/_chunks/index-7wc9n8be.js +25 -0
  43. package/dist/server/_chunks/index-8k7pfejn.js +1599 -0
  44. package/dist/server/_chunks/index-8kcxdfya.js +206 -0
  45. package/dist/server/_chunks/index-91x12ykq.js +274 -0
  46. package/dist/server/_chunks/index-9ch50vtq.js +18 -0
  47. package/dist/server/_chunks/index-9hx2641q.js +28 -0
  48. package/dist/server/_chunks/index-9n2914ww.js +535 -0
  49. package/dist/server/_chunks/index-9ych9ma8.js +207 -0
  50. package/dist/server/_chunks/index-b6wtkdp4.js +24 -0
  51. package/dist/server/_chunks/index-bcws5eh2.js +35 -0
  52. package/dist/server/_chunks/index-c0g2wf3z.js +92 -0
  53. package/dist/server/_chunks/index-cf4rvxv6.js +95 -0
  54. package/dist/server/_chunks/index-cjgqs13g.js +65 -0
  55. package/dist/server/_chunks/index-ckkdpht5.js +41 -0
  56. package/dist/server/_chunks/index-cyfednwb.js +87 -0
  57. package/dist/server/_chunks/index-danncfhy.js +311 -0
  58. package/dist/server/_chunks/index-dg0f05zs.js +199 -0
  59. package/dist/server/_chunks/index-e3a6yx84.js +18 -0
  60. package/dist/server/_chunks/index-e88tyv35.js +45 -0
  61. package/dist/server/_chunks/index-eajaspjk.js +1253 -0
  62. package/dist/server/_chunks/index-eeaanp2e.js +483 -0
  63. package/dist/server/_chunks/index-egykcqg3.js +101 -0
  64. package/dist/server/_chunks/index-en7n9f7m.js +22 -0
  65. package/dist/server/_chunks/index-ezgj0tr1.js +88 -0
  66. package/dist/server/_chunks/index-fkp000p1.js +590 -0
  67. package/dist/server/_chunks/index-fn1chkkd.js +214 -0
  68. package/dist/server/_chunks/index-fp8r0sqs.js +64 -0
  69. package/dist/server/_chunks/index-ggk2j965.js +9432 -0
  70. package/dist/server/_chunks/index-grta8ap3.js +238 -0
  71. package/dist/server/_chunks/index-h2a70tg4.js +7 -0
  72. package/dist/server/_chunks/index-h4xy648y.js +51 -0
  73. package/dist/server/_chunks/index-hkdfj58q.js +92 -0
  74. package/dist/server/_chunks/index-j2zrcp1k.js +66 -0
  75. package/dist/server/_chunks/index-jcsjq3d1.js +20 -0
  76. package/dist/server/_chunks/index-jepjvcrf.js +198 -0
  77. package/dist/server/_chunks/index-jks0x0a1.js +14 -0
  78. package/dist/server/_chunks/index-jx7bqvw1.js +57 -0
  79. package/dist/server/_chunks/index-k1g3epw0.js +1299 -0
  80. package/dist/server/_chunks/index-knp0s912.js +7 -0
  81. package/dist/server/_chunks/index-kq8kpzye.js +472 -0
  82. package/dist/server/_chunks/index-kqyy1d4f.js +50 -0
  83. package/dist/server/_chunks/index-kresp2n8.js +445 -0
  84. package/dist/server/_chunks/index-ms9v9tnx.js +31 -0
  85. package/dist/server/_chunks/index-n4hxpng2.js +11 -0
  86. package/dist/server/_chunks/index-ncnes8c6.js +17 -0
  87. package/dist/server/_chunks/index-nqh3xhdc.js +57 -0
  88. package/dist/server/_chunks/index-nyrba2kr.js +4130 -0
  89. package/dist/server/_chunks/index-p77b4kcx.js +296 -0
  90. package/dist/server/_chunks/index-pym1cezq.js +39 -0
  91. package/dist/server/_chunks/index-q738kkhj.js +100 -0
  92. package/dist/server/_chunks/index-qjj6gddn.js +54 -0
  93. package/dist/server/_chunks/index-qm6kmhqs.js +110 -0
  94. package/dist/server/_chunks/index-qn4z5s3c.js +819 -0
  95. package/dist/server/_chunks/index-qpwsgt3a.js +158 -0
  96. package/dist/server/_chunks/index-r97ptz1q.js +97 -0
  97. package/dist/server/_chunks/index-ras0sdab.js +26 -0
  98. package/dist/server/_chunks/index-rcs322t1.js +19 -0
  99. package/dist/server/_chunks/index-rn8dyr1f.js +126 -0
  100. package/dist/server/_chunks/index-rt9qq1va.js +4 -0
  101. package/dist/server/_chunks/index-rthrsed5.js +356 -0
  102. package/dist/server/_chunks/index-sctcgyvv.js +185 -0
  103. package/dist/server/_chunks/index-sjpckxqn.js +213 -0
  104. package/dist/server/_chunks/index-sq3kvz3g.js +200 -0
  105. package/dist/server/_chunks/index-stbk3jhn.js +31 -0
  106. package/dist/server/_chunks/index-sv8m6789.js +266 -0
  107. package/dist/server/_chunks/index-tgcakdxc.js +125 -0
  108. package/dist/server/_chunks/index-tgsfjmep.js +74 -0
  109. package/dist/server/_chunks/index-tq0pc7eg.js +154 -0
  110. package/dist/server/_chunks/index-tq1f96v7.js +51 -0
  111. package/dist/server/_chunks/index-tqn2qnnn.js +241 -0
  112. package/dist/server/_chunks/index-tvqkq6e6.js +128 -0
  113. package/dist/server/_chunks/index-v1ags1na.js +132 -0
  114. package/dist/server/_chunks/index-vvmmknm1.js +1431 -0
  115. package/dist/server/_chunks/index-vvq7rqtn.js +329 -0
  116. package/dist/server/_chunks/index-vz0km5qk.js +33 -0
  117. package/dist/server/_chunks/index-w6h8m6vp.js +138 -0
  118. package/dist/server/_chunks/index-web361b8.js +138 -0
  119. package/dist/server/_chunks/index-wpfhfbs4.js +194 -0
  120. package/dist/server/_chunks/index-x0y005nh.js +283 -0
  121. package/dist/server/_chunks/index-x3yn4ywm.js +22 -0
  122. package/dist/server/_chunks/index-x93hv0sc.js +271 -0
  123. package/dist/server/_chunks/index-xvj80c3a.js +30 -0
  124. package/dist/server/_chunks/index-xywjg2vc.js +100 -0
  125. package/dist/server/_chunks/index-y2jr2n72.js +152 -0
  126. package/dist/server/_chunks/index-y36a0ybw.js +57 -0
  127. package/dist/server/_chunks/index-ye9hmsvf.js +47 -0
  128. package/dist/server/_chunks/index-yhxkxghe.js +56 -0
  129. package/dist/server/_chunks/index-ym67zqxp.js +130 -0
  130. package/dist/server/_chunks/index-ytjvpbm2.js +736 -0
  131. package/dist/server/_chunks/index-yz54pxrh.js +960 -0
  132. package/dist/server/_chunks/index-z4z9zv3b.js +733 -0
  133. package/dist/server/_chunks/index-z84ab1w0.js +1270 -0
  134. package/dist/server/_chunks/index-z88qv16t.js +11 -0
  135. package/dist/server/_chunks/index-zqpqyg8p.js +666 -0
  136. package/dist/server/_chunks/loader-7yw0j98z.js +78 -0
  137. package/dist/server/_chunks/modules-jn8bmbn8.js +74 -0
  138. package/dist/server/_chunks/pipeline-yy9jhydf.js +832 -0
  139. package/dist/server/_chunks/production-jar9ztm3.js +44 -0
  140. package/dist/server/_chunks/proxy-config-j84dgksn.js +21 -0
  141. package/dist/server/_chunks/proxy-w1d0wmsn.js +33 -0
  142. package/dist/server/_chunks/router-k1reahfn.js +498 -0
  143. package/dist/server/_chunks/routes-2s277fc6.js +64 -0
  144. package/dist/server/_chunks/run-pvd8bs1t.js +696 -0
  145. package/dist/server/_chunks/server-mt4a994c.js +1835 -0
  146. package/dist/server/_chunks/tsconfig-defaults-1nb3308g.js +20 -0
  147. package/dist/server/_chunks/typegen-0qr0459b.js +35 -0
  148. package/dist/server/api/client-cache.js +14 -0
  149. package/dist/server/cli/index.js +378 -0
  150. package/dist/server/cli/start.js +137 -0
  151. package/dist/server/client/reference.js +16 -0
  152. package/dist/server/compat/next/cache.js +56 -0
  153. package/dist/server/compat/next/canonical-url.js +13 -0
  154. package/dist/server/compat/next/client-cache.js +57 -0
  155. package/dist/server/compat/next/client-navigation.js +232 -0
  156. package/dist/server/compat/next/client-only.js +1 -0
  157. package/dist/server/compat/next/client-script.js +178 -0
  158. package/dist/server/compat/next/client-server.js +34 -0
  159. package/dist/server/compat/next/config-headers.js +32 -0
  160. package/dist/server/compat/next/config-loader.js +25 -0
  161. package/dist/server/compat/next/config.js +10 -0
  162. package/dist/server/compat/next/constants.js +18 -0
  163. package/dist/server/compat/next/custom-server.js +10 -0
  164. package/dist/server/compat/next/dist/client/components/app-router-headers.js +48 -0
  165. package/dist/server/compat/next/dist/server/web/spec-extension/revalidate.js +27 -0
  166. package/dist/server/compat/next/dist/server/web/spec-extension/unstable-cache.js +25 -0
  167. package/dist/server/compat/next/dist/server/web/spec-extension/unstable-no-store.js +25 -0
  168. package/dist/server/compat/next/dynamic.js +32 -0
  169. package/dist/server/compat/next/error.js +112 -0
  170. package/dist/server/compat/next/font/cache.js +14 -0
  171. package/dist/server/compat/next/font/google.js +3 -0
  172. package/dist/server/compat/next/font/index.js +1 -0
  173. package/dist/server/compat/next/font/local.js +22 -0
  174. package/dist/server/compat/next/font/runtime-client.js +33 -0
  175. package/dist/server/compat/next/font/runtime.js +41 -0
  176. package/dist/server/compat/next/font/shared.js +22 -0
  177. package/dist/server/compat/next/form.js +129 -0
  178. package/dist/server/compat/next/head.js +10 -0
  179. package/dist/server/compat/next/headers.js +30 -0
  180. package/dist/server/compat/next/image/client.js +11 -0
  181. package/dist/server/compat/next/image/config.js +18 -0
  182. package/dist/server/compat/next/image/optimizer.js +25 -0
  183. package/dist/server/compat/next/image/patterns.js +12 -0
  184. package/dist/server/compat/next/image/props.js +16 -0
  185. package/dist/server/compat/next/image/shared.js +86 -0
  186. package/dist/server/compat/next/image/static-metadata.js +32 -0
  187. package/dist/server/compat/next/image/validate.js +8 -0
  188. package/dist/server/compat/next/image.js +59 -0
  189. package/dist/server/compat/next/index.js +1 -0
  190. package/dist/server/compat/next/legacy-image.js +78 -0
  191. package/dist/server/compat/next/legacy-request-apis.js +24 -0
  192. package/dist/server/compat/next/link-transform.js +14 -0
  193. package/dist/server/compat/next/link.js +14 -0
  194. package/dist/server/compat/next/navigation.js +190 -0
  195. package/dist/server/compat/next/offline.js +45 -0
  196. package/dist/server/compat/next/og.js +8 -0
  197. package/dist/server/compat/next/preferred-region.js +8 -0
  198. package/dist/server/compat/next/redirects.js +30 -0
  199. package/dist/server/compat/next/resource-hints.js +30 -0
  200. package/dist/server/compat/next/rewrites.js +41 -0
  201. package/dist/server/compat/next/root-params.js +121 -0
  202. package/dist/server/compat/next/route-state.js +23 -0
  203. package/dist/server/compat/next/router.js +103 -0
  204. package/dist/server/compat/next/script.js +37 -0
  205. package/dist/server/compat/next/server-only.js +1 -0
  206. package/dist/server/compat/next/server.js +131 -0
  207. package/dist/server/compat/next/svgr.js +14 -0
  208. package/dist/server/compat/next/telemetry.js +10 -0
  209. package/dist/server/compat/next/usage.js +13 -0
  210. package/dist/server/compat/next/user-agent.js +12 -0
  211. package/dist/server/compat/next/web-vitals.js +35 -0
  212. package/dist/server/compat/react/action-state.js +11 -0
  213. package/dist/server/compat/react/client-lite.js +83 -0
  214. package/dist/server/compat/react/client.js +131 -0
  215. package/dist/server/compat/react/compiler-runtime.js +42 -0
  216. package/dist/server/compat/react/dom-client.js +106 -0
  217. package/dist/server/compat/react/dom-react-server.js +37 -0
  218. package/dist/server/compat/react/dom-server.js +40 -0
  219. package/dist/server/compat/react/dom.js +52 -0
  220. package/dist/server/compat/react/hooks-extra.js +12 -0
  221. package/dist/server/compat/react/internals.js +14 -0
  222. package/dist/server/compat/react/parity.js +11 -0
  223. package/dist/server/compat/react/preact.js +113 -0
  224. package/dist/server/compat/react/react-server.js +133 -0
  225. package/dist/server/compat/react/router-shim.js +8 -0
  226. package/dist/server/compat/react/server-component-use.js +14 -0
  227. package/dist/server/compat/react/server-inserted-html.js +14 -0
  228. package/dist/server/compat/react/server.js +194 -0
  229. package/dist/server/compat/react/style-values.js +10 -0
  230. package/dist/server/compat/react/use.js +10 -0
  231. package/dist/server/compat/react/view-transition.js +12 -0
  232. package/dist/server/generation.json +1 -0
  233. package/package.json +4 -1
  234. package/src/api/dynamic.tsx +2 -0
  235. package/src/api/server.ts +24 -6
  236. package/src/cli/adapters/vercel-warm.ts +315 -61
  237. package/src/cli/adapters/vercel.ts +348 -71
  238. package/src/cli/build.ts +58 -33
  239. package/src/cli/index.ts +23 -10
  240. package/src/cli/serve/entry.ts +21 -159
  241. package/src/cli/serve/immutable.ts +31 -0
  242. package/src/cli/serve/pipeline.ts +82 -84
  243. package/src/cli/start.ts +3 -1
  244. package/src/client/chunk-fold.ts +19 -6
  245. package/src/client/react-tier.ts +3 -2
  246. package/src/client/reference-stub.ts +21 -2
  247. package/src/compat/actions/client-plugin.ts +4 -2
  248. package/src/compat/actions/config.ts +6 -5
  249. package/src/compat/actions/extensions.ts +2 -3
  250. package/src/compat/aliases.ts +8 -1
  251. package/src/compat/bundler/config.ts +88 -0
  252. package/src/compat/bundler/optimize-package-imports.ts +86 -26
  253. package/src/compat/bundler/relay-transform.ts +15 -3
  254. package/src/compat/cache-control.ts +16 -8
  255. package/src/compat/css/modules.ts +18 -5
  256. package/src/compat/lifecycle/error-funnel.ts +1 -1
  257. package/src/compat/lifecycle/instrumentation.ts +117 -24
  258. package/src/compat/lifecycle/testmode.ts +3 -2
  259. package/src/compat/next/config-loader.ts +137 -13
  260. package/src/compat/next/font/runtime.ts +22 -2
  261. package/src/compat/next/og.ts +3 -3
  262. package/src/compat/next/usage.ts +3 -2
  263. package/src/compat/pages/api.ts +83 -14
  264. package/src/compat/pages/router.ts +30 -14
  265. package/src/compat/register/bundler.ts +3 -1
  266. package/src/compat/register/middleware.ts +1 -1
  267. package/src/compat/register/otel.ts +5 -9
  268. package/src/compat/register/render.ts +3 -1
  269. package/src/compat/register/use-cache.ts +3 -1
  270. package/src/compat/release.ts +46 -0
  271. package/src/compat/segment/serve.ts +1 -1
  272. package/src/compat/validation/validate.ts +10 -7
  273. package/src/config.ts +51 -7
  274. package/src/css/assets.ts +213 -0
  275. package/src/css/build.ts +174 -238
  276. package/src/dev/server.ts +27 -8
  277. package/src/extensions.ts +4 -0
  278. package/src/render/hooks.ts +13 -0
  279. package/src/render/renderer.ts +52 -32
  280. package/src/request/context.ts +9 -0
  281. package/src/resolve/dynamic.ts +3 -1
  282. package/src/resolve/imports.ts +12 -52
  283. package/src/resolve/package-json.ts +56 -0
  284. package/src/resolve/scan-facts.ts +65 -0
  285. package/src/routing/href.ts +10 -3
  286. package/src/routing/match.ts +287 -0
  287. package/src/routing/metadata-files.ts +19 -5
  288. package/src/routing/proxy-config.ts +137 -0
  289. package/src/routing/proxy.ts +35 -134
  290. package/src/routing/routes.ts +22 -281
  291. package/src/runtime/fingerprint.ts +23 -8
  292. package/src/runtime/load.ts +170 -0
  293. package/src/runtime/loader.ts +215 -43
  294. package/src/runtime/module-cache.ts +13 -0
  295. package/src/runtime/modules.ts +370 -81
  296. package/src/runtime/prebundle.ts +81 -0
  297. package/src/runtime/production.ts +391 -0
  298. package/src/runtime/release-graph.ts +334 -0
  299. package/src/runtime/vendor-build.ts +724 -13
  300. package/src/runtime/vendor.ts +16 -3
  301. package/src/types.ts +2 -0
  302. package/src/utils/fs.ts +89 -3
@@ -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
@@ -667,6 +667,8 @@ export interface BuildManifest {
667
667
  staticFiles?: Record<string, StaticFileMetadata>
668
668
  /** Logical build-asset name -> the content-hashed name emitted (`global.css` -> `global-<hash>.css`). */
669
669
  assetNames?: Record<string, string>
670
+ /** App `public/` files under an immutable asset prefix; they stay revalidating. */
671
+ publicAssets?: string[]
670
672
  staticMetadataFiles?: StaticMetadataFileEntry[]
671
673
  staticModuleMetadata?: Record<string, StaticModuleMetadata>
672
674
  staticRouteMetadata?: Record<string, StaticRouteMetadata>
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: '.',
@@ -220,7 +303,10 @@ export function serializeBuildManifest(data: BuildManifest): string {
220
303
 
221
304
  export function resolveManifest(data: BuildManifest, outPath: string, root: string): BuildManifest {
222
305
  if (path.isAbsolute(data.root)) return data
223
- const absolute = (file: string) => path.join(root, file)
306
+ const absolute = (file: string) =>
307
+ file.startsWith(frameworkPrefix)
308
+ ? path.join(frameworkRoot, file.slice(frameworkPrefix.length))
309
+ : path.join(root, file)
224
310
  return {
225
311
  ...mapSourcePaths(data, absolute),
226
312
  root,