@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
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Server module loading as the request path sees it. A release answers from its compiled artifacts;
3
+ * only a dev or build compile loads the compiler side (`./modules`, `./loader`), on demand, so a
4
+ * production server never parses it.
5
+ */
6
+ import type { CompatAliasTarget, ResolvedConfig } from '../config'
7
+ import { setBasePathPrefix, setDefaultPrefetchMode, setTrailingSlashUrls } from '../routing/href'
8
+ import type { DevServerModuleOptions } from './modules'
9
+ import { productionRelease, releaseModuleHref } from './production'
10
+
11
+ let modules: Promise<typeof import('./modules')> | undefined
12
+ let loader: Promise<typeof import('./loader')> | undefined
13
+ const compiler = () => (modules ??= import('./modules'))
14
+
15
+ export type ServerBundleTarget =
16
+ CompatAliasTarget | 'edge' | 'pages-api' | 'pages-api-edge' | 'pages' | 'pages-edge'
17
+
18
+ export function serverBundleTargetForRuntime(runtime: string | undefined): ServerBundleTarget {
19
+ return runtime === 'edge' || runtime === 'experimental-edge' ? 'edge' : 'server'
20
+ }
21
+
22
+ export function pagesApiBundleTargetForRuntime(runtime: string | undefined): ServerBundleTarget {
23
+ return runtime === 'edge' || runtime === 'experimental-edge' ? 'pages-api-edge' : 'pages-api'
24
+ }
25
+
26
+ /** The href state server-rendered links read: trailing slashes, basePath, the prefetch default. */
27
+ export function applyServerHrefConfig(config: ResolvedConfig) {
28
+ setTrailingSlashUrls(Boolean(config.trailingSlash))
29
+ setBasePathPrefix(typeof config.basePath === 'string' ? config.basePath : '')
30
+ setDefaultPrefetchMode(config.prefetch)
31
+ }
32
+
33
+ /** A release only sets the href state; a compile also registers the loader's Bun plugins. */
34
+ export async function registerServerRuntime(config: ResolvedConfig, sourceFiles: string[] = []) {
35
+ if (productionRelease(config)) return applyServerHrefConfig(config)
36
+ ;(await (loader ??= import('./loader'))).registerServerRuntime(config, sourceFiles)
37
+ }
38
+
39
+ export async function devServerModuleHref(
40
+ config: ResolvedConfig,
41
+ file: string,
42
+ version?: string,
43
+ options: DevServerModuleOptions = {},
44
+ ) {
45
+ const served = productionRelease(config)
46
+ if (served) return releaseModuleHref(served, 'server', options.conditionTarget ?? 'server', file)
47
+ return (await compiler()).devServerModuleHref(config, file, version, options)
48
+ }
49
+
50
+ export async function devClientModuleHref(
51
+ config: ResolvedConfig,
52
+ file: string,
53
+ version?: string,
54
+ serverTarget?: ServerBundleTarget,
55
+ ) {
56
+ const served = productionRelease(config)
57
+ if (served) return releaseModuleHref(served, 'client', serverTarget ?? 'server', file)
58
+ return (await compiler()).devClientModuleHref(config, file, version, serverTarget)
59
+ }
60
+
61
+ export async function importDevModule<T>(href: string, options?: { warm?: boolean }): Promise<T> {
62
+ return (await compiler()).importDevModule<T>(href, options)
63
+ }
64
+
65
+ let releaseCompile = false
66
+
67
+ /** Whether this process is compiling a production release. */
68
+ export function isReleaseCompile() {
69
+ return releaseCompile
70
+ }
71
+
72
+ /** The flag alone; `setReleaseCompile` in ./modules also resets the compile caches. */
73
+ export function setReleaseCompileFlag(enabled: boolean) {
74
+ releaseCompile = enabled
75
+ }
76
+
77
+ // B4/B5: extra esbuild resolve conditions layered onto the server (RSC) vendor
78
+ // bundle. Core always applies `react-server` (the server graph IS the RSC
79
+ // layer). Compat can add `next-js` (only when cacheComponents is on) via the
80
+ // setter. Kept as a module-level seam so core carries no static edge into
81
+ // compat's config reader.
82
+ let extraServerBundleConditions: (target: ServerBundleTarget) => string[] = () => []
83
+
84
+ /** Install compat-driven extra vendor-bundle conditions (B5 `next-js`). */
85
+ export function setServerBundleConditions(
86
+ factory: ((target: ServerBundleTarget) => string[]) | undefined,
87
+ ): void {
88
+ extraServerBundleConditions = factory ?? (() => [])
89
+ }
90
+
91
+ export function serverBundleExtraConditions(target: ServerBundleTarget): string[] {
92
+ return extraServerBundleConditions(target)
93
+ }
94
+
95
+ let preplanDrain: (() => Promise<void>) | undefined
96
+
97
+ /** Installed by the vendor pipeline when it loads; before that no build can be pending. */
98
+ export function setPreplanDrain(drain: () => Promise<void>) {
99
+ preplanDrain = drain
100
+ }
101
+
102
+ /** Settle every pre-planned vendor build before anything evaluates. */
103
+ export async function drainPreplanBuilds() {
104
+ await preplanDrain?.()
105
+ }
106
+
107
+ let moduleGraphFailure: Error | undefined
108
+
109
+ export function clearModuleGraphFailure(): void {
110
+ moduleGraphFailure = undefined
111
+ }
112
+
113
+ /**
114
+ * Fail a build even when its renderer converted a module-resolution exception
115
+ * into a 500 response. Rendering may recover from user-code errors, but a
116
+ * missing content-addressed artifact means the build output itself is broken.
117
+ */
118
+ export function throwIfModuleGraphFailed(): void {
119
+ if (moduleGraphFailure !== undefined) throw moduleGraphFailure
120
+ }
121
+
122
+ export function noteModuleGraphFailure(error: unknown): void {
123
+ moduleGraphFailure ??= error instanceof Error ? error : new Error(String(error))
124
+ }
125
+
126
+ function isCompiledModuleResolutionError(error: unknown, href: string): boolean {
127
+ const message = error instanceof Error ? error.message : String(error)
128
+ if (!message.includes('Cannot find module')) return false
129
+ return (
130
+ href.includes('/cache/server/') ||
131
+ /[/\\]cache[/\\]server[/\\]/.test(message) ||
132
+ message.includes('/cache/server/')
133
+ )
134
+ }
135
+
136
+ // A module that throws while evaluating stays failed in Bun's registry for the process lifetime, and
137
+ // re-importing it surfaces downstream symptoms (a missing bundle entry, TDZ on an export) instead of
138
+ // the original error. Record the first failure per compiled href and re-throw THAT on every later
139
+ // request. Compiled hrefs are content-addressed, so a save that fixes the module yields a new href
140
+ // and the entry is never consulted again.
141
+ const moduleEvalErrors = new Map<string, unknown>()
142
+
143
+ /** Re-throw `href`'s recorded first evaluation error, if any. */
144
+ export function throwIfModuleEvalFailed(href: string): void {
145
+ if (moduleEvalErrors.has(href)) throw moduleEvalErrors.get(href)
146
+ }
147
+
148
+ /** Drop `href`'s recorded failure when it is still `error`. */
149
+ export function forgetModuleEvalError(href: string, error: unknown): void {
150
+ if (moduleEvalErrors.get(href) === error) moduleEvalErrors.delete(href)
151
+ }
152
+
153
+ /**
154
+ * Import a compiled module, re-throwing its first evaluation error on later imports.
155
+ *
156
+ * Production needs this as much as dev: a re-import resolves with a half-evaluated namespace whose
157
+ * `export const` bindings are still in TDZ, so the render's next read (`module.metadata`) throws
158
+ * `Cannot access 'metadata' before initialization` and that replaces the real error in the response.
159
+ * Prod hrefs are content-addressed too, so the entry keys the same way dev's does.
160
+ */
161
+ export async function importModuleOnce<T>(href: string): Promise<T> {
162
+ throwIfModuleEvalFailed(href)
163
+ try {
164
+ return (await import(href)) as T
165
+ } catch (error) {
166
+ if (isCompiledModuleResolutionError(error, href)) noteModuleGraphFailure(error)
167
+ moduleEvalErrors.set(href, error)
168
+ throw error
169
+ }
170
+ }
@@ -8,7 +8,7 @@
8
8
 
9
9
  import { createHash } from 'node:crypto'
10
10
  import { createRequire } from 'node:module'
11
- import { existsSync, realpathSync } from 'node:fs'
11
+ import { existsSync, readFileSync, realpathSync, statSync, writeFileSync } from 'node:fs'
12
12
  import { mkdir, readFile, stat, writeFile } from 'node:fs/promises'
13
13
  import path from 'node:path'
14
14
  import { fileURLToPath } from 'node:url'
@@ -41,40 +41,29 @@ import {
41
41
  } from '../resolve/dynamic'
42
42
  import { cacheRoot } from './module-cache'
43
43
  import { frameworkFingerprint } from './fingerprint'
44
+ import { prebundledFile } from './prebundle'
44
45
  import { readNodeModuleBundle, writeNodeModuleBundle } from '../dev/restart/node-modules'
45
- import { setBasePathPrefix, setDefaultPrefetchMode, setTrailingSlashUrls } from '../routing/href'
46
46
  import { resolveExternalLoadTarget, resolveImport, workspacePackageRoots } from '../resolve/imports'
47
47
  import { escapeRegex } from '../utils/code'
48
48
  import { traceEnabled } from '../utils/trace-flags'
49
49
  import { writeFileAtomic } from '../utils/fs'
50
+ import { productionRelease } from './production'
51
+ import {
52
+ applyServerHrefConfig,
53
+ isReleaseCompile,
54
+ serverBundleExtraConditions,
55
+ type ServerBundleTarget,
56
+ } from './load'
57
+
58
+ export {
59
+ pagesApiBundleTargetForRuntime,
60
+ serverBundleTargetForRuntime,
61
+ setServerBundleConditions,
62
+ type ServerBundleTarget,
63
+ } from './load'
50
64
 
51
65
  const require = createRequire(import.meta.url)
52
66
 
53
- // B4/B5: extra esbuild resolve conditions layered onto the server (RSC) vendor
54
- // bundle. Core always applies `react-server` (the server graph IS the RSC
55
- // layer). Compat can add `next-js` (only when cacheComponents is on) via the
56
- // setter. Kept as a module-level seam so core carries no static edge into
57
- // compat's config reader.
58
- export type ServerBundleTarget =
59
- CompatAliasTarget | 'edge' | 'pages-api' | 'pages-api-edge' | 'pages' | 'pages-edge'
60
-
61
- let extraServerBundleConditions: (target: ServerBundleTarget) => string[] = () => []
62
-
63
- /** Install compat-driven extra vendor-bundle conditions (B5 `next-js`). */
64
- export function setServerBundleConditions(
65
- factory: ((target: ServerBundleTarget) => string[]) | undefined,
66
- ): void {
67
- extraServerBundleConditions = factory ?? (() => [])
68
- }
69
-
70
- export function serverBundleTargetForRuntime(runtime: string | undefined): ServerBundleTarget {
71
- return runtime === 'edge' || runtime === 'experimental-edge' ? 'edge' : 'server'
72
- }
73
-
74
- export function pagesApiBundleTargetForRuntime(runtime: string | undefined): ServerBundleTarget {
75
- return runtime === 'edge' || runtime === 'experimental-edge' ? 'pages-api-edge' : 'pages-api'
76
- }
77
-
78
67
  /**
79
68
  * Pages-router PAGE SSR layer: Next compiles it in the server bundle with `node` (or
80
69
  * `edge-light`/`browser` for edge) export conditions but WITHOUT `react-server` - a pages page is
@@ -102,7 +91,7 @@ export function serverBundleConditions(target: ServerBundleTarget): string[] {
102
91
  : target === 'pages'
103
92
  ? ['node', 'module', 'import']
104
93
  : ['react-server', 'node', 'module', 'import']
105
- return [...new Set([...extraServerBundleConditions(target), ...base])]
94
+ return [...new Set([...serverBundleExtraConditions(target), ...base])]
106
95
  }
107
96
 
108
97
  export function serverBundleRequireConditions(target: ServerBundleTarget): string[] {
@@ -120,7 +109,7 @@ export function serverBundleRequireConditions(target: ServerBundleTarget): strin
120
109
  : target === 'pages'
121
110
  ? ['node', 'module', 'require']
122
111
  : ['react-server', 'node', 'module', 'require']
123
- return [...new Set([...extraServerBundleConditions(target), ...base])]
112
+ return [...new Set([...serverBundleExtraConditions(target), ...base])]
124
113
  }
125
114
 
126
115
  const runtimeConfigs = new Map<string, RuntimeConfig>()
@@ -167,14 +156,10 @@ interface TransformCacheEntry {
167
156
  }
168
157
 
169
158
  export function registerServerRuntime(config: ResolvedConfig, sourceFiles: string[] = []) {
170
- // Server-rendered Links emit canonical (slashed) hrefs under trailingSlash.
171
- setTrailingSlashUrls(Boolean(config.trailingSlash))
172
- // File-convention metadata asset hrefs (og-image, manifest) carry the
173
- // basePath prefix; core render reads it through the href seam.
174
- setBasePathPrefix(typeof config.basePath === 'string' ? config.basePath : '')
175
- // Server-rendered Links bake the configured default into `data-prefetch`.
176
- setDefaultPrefetchMode(config.prefetch)
177
- if (typeof Bun === 'undefined') return
159
+ applyServerHrefConfig(config)
160
+ // A release imports compiled artifacts natively: no resolve or transform plugins.
161
+ if (typeof Bun === 'undefined' || productionRelease(config)) return
162
+ nativeStoreFor(config)
178
163
  const sourceRoots = [...new Set(sourceFiles.map(file => sourceRootForFile(config, file)))].sort()
179
164
  const signature = sourceRoots.join('\0')
180
165
  let registered = registeredSignatures.get(config)
@@ -189,7 +174,8 @@ export function registerServerRuntime(config: ResolvedConfig, sourceFiles: strin
189
174
  const roots = [
190
175
  ...rootPaths(config.root),
191
176
  ...rootPaths(config.appPath),
192
- ...rootPaths(path.join(config.outPath, 'cache', 'server')),
177
+ // A release build evaluates its compiled artifacts as the release will: natively.
178
+ ...(isReleaseCompile() ? [] : rootPaths(path.join(config.outPath, 'cache', 'server'))),
193
179
  // The pnext src root, so the framework's own source transforms too.
194
180
  ...rootPaths(path.join(import.meta.dirname, '..')),
195
181
  ...sourceRoots.flatMap(rootPaths),
@@ -286,7 +272,7 @@ function registerResolvePlugin() {
286
272
  const runtime = runtimeConfigForFile(args.importer)
287
273
  const resolved = runtime?.aliases.get(args.path) ?? firstAliasForSpecifier(args.path)
288
274
  const target = resolved ? serverRequireAlias(args.path, resolved, args.kind) : undefined
289
- if (target) return { path: target }
275
+ if (target) return { path: prebundledFile(target) }
290
276
  const message = (runtime ?? firstRuntimeConfig())?.missingImportError(args.path)
291
277
  if (message) throw new Error(message)
292
278
  return undefined
@@ -302,7 +288,7 @@ function registerResolvePlugin() {
302
288
  target: 'server',
303
289
  })
304
290
  if (!target) return undefined
305
- return { path: target }
291
+ return { path: prebundledFile(target) }
306
292
  })
307
293
  },
308
294
  })
@@ -368,15 +354,201 @@ function registerNodeModulesLoadPlugin() {
368
354
  filter:
369
355
  /\/node_modules\/.*(?:\.mjs|\.esm\.js|\/(?:es|esm|dist\/esm|build\/modern)\/.*\.js)$/,
370
356
  },
371
- async ({ path: file }) => {
372
- const code = await transformNodeModuleSource(file)
373
- return { contents: code, loader: 'js' }
357
+ ({ path: file }) => {
358
+ if (isRecordedNativeFile(file) || nodeModuleGraphLoadsAsIs(file)) {
359
+ return { contents: takeNodeModuleSource(file), loader: 'js' }
360
+ }
361
+ return transformNodeModuleSource(file).then(code => ({ contents: code, loader: 'js' }))
374
362
  },
375
363
  )
376
364
  },
377
365
  })
378
366
  }
379
367
 
368
+ const nodeModuleImportScanner = new Bun.Transpiler({ loader: 'js' })
369
+
370
+ /**
371
+ * Whether a node_modules ESM file loads exactly as written: one module per file, as Node loads it.
372
+ * Bundling it with its relative imports inlined gave every entry file of a package its own copy of
373
+ * the files they share, and of their module state. Only an aliased import, a directive, a non-JS
374
+ * import or a configured `define` still needs the bundle.
375
+ */
376
+ export function nodeModuleSourceLoadsAsIs(source: string) {
377
+ return nodeModuleRelativeImports(source) !== undefined
378
+ }
379
+
380
+ /** The relative specifiers of a file that loads as-is, or undefined when it needs the bundle. */
381
+ function nodeModuleRelativeImports(source: string) {
382
+ if (serverDefineOptions().define || source.includes('use cache')) return undefined
383
+ if (/^\s*(?:(?:\/\/[^\n]*\n|\/\*[\s\S]*?\*\/)\s*)*['"]use (?:client|server)['"]/.test(source)) {
384
+ return undefined
385
+ }
386
+ try {
387
+ const relative: string[] = []
388
+ for (const { path: specifier } of nodeModuleImportScanner.scanImports(source)) {
389
+ if (specifier.startsWith('.') || specifier.startsWith('/')) {
390
+ if (!/(?:\.[cm]?js|\.json|\/[^./]+)$/.test(specifier)) return undefined
391
+ if (specifier.startsWith('.')) relative.push(specifier)
392
+ } else if (aliasSpecifierFilter.test(specifier) || firstAliasForSpecifier(specifier)) {
393
+ return undefined
394
+ }
395
+ }
396
+ return relative
397
+ } catch {
398
+ return undefined
399
+ }
400
+ }
401
+
402
+ /**
403
+ * Files the server's native verdict (vendor-build) proved load as-is. Recorded with the build, so a
404
+ * started server answers from this set instead of re-scanning every file of every native package.
405
+ */
406
+ const nativeNodeModuleFiles = new Map<string, string>()
407
+ const nativeNodeModuleStores = new Map<
408
+ string,
409
+ { config: ResolvedConfig; files: Map<string, string> }
410
+ >()
411
+ let nativeStoreFlushArmed = false
412
+
413
+ // Not keyed on pnext's fingerprint: a started server never computes it, and walking pnext's tree for
414
+ // it cost more than the scans this store saves. Bump the version when the as-is rule changes.
415
+ const NATIVE_STORE_VERSION = 1
416
+ const nativeNodeModuleStore = (config: ResolvedConfig) =>
417
+ path.join(cacheRoot(config.outPath), 'native-files.json')
418
+
419
+ /** A file's stat signature: a reinstalled package must be scanned again. */
420
+ export function statSignature(file: string) {
421
+ try {
422
+ const { mtimeMs, size } = statSync(file)
423
+ return `${mtimeMs}:${size}`
424
+ } catch {
425
+ return undefined
426
+ }
427
+ }
428
+
429
+ function nativeStoreFor(config: ResolvedConfig) {
430
+ let stored = nativeNodeModuleStores.get(config.outPath)?.files
431
+ if (!stored) {
432
+ stored = new Map()
433
+ nativeNodeModuleStores.set(config.outPath, { config, files: stored })
434
+ for (const [file, signature] of Object.entries(readNativeStore(config))) {
435
+ stored.set(file, signature)
436
+ nativeNodeModuleFiles.set(path.resolve(config.workspaceRoot, file), signature)
437
+ }
438
+ }
439
+ return stored
440
+ }
441
+
442
+ function readNativeStore(config: ResolvedConfig): Record<string, string> {
443
+ try {
444
+ const store = JSON.parse(readFileSync(nativeNodeModuleStore(config), 'utf8')) as {
445
+ version: number
446
+ files: Record<string, string>
447
+ }
448
+ return store.version === NATIVE_STORE_VERSION ? store.files : {}
449
+ } catch {
450
+ // No store yet: the plugin scans until the verdicts are recorded.
451
+ return {}
452
+ }
453
+ }
454
+
455
+ function isRecordedNativeFile(file: string) {
456
+ const signature = nativeNodeModuleFiles.get(file)
457
+ return signature !== undefined && signature === statSignature(file)
458
+ }
459
+
460
+ export function recordNativeNodeModuleFiles(config: ResolvedConfig, files: Iterable<string>) {
461
+ const stored = nativeStoreFor(config)
462
+ let added = false
463
+ for (const file of files) {
464
+ if (nativeNodeModuleFiles.has(file)) continue
465
+ const signature = statSignature(file)
466
+ if (!signature) continue
467
+ nativeNodeModuleFiles.set(file, signature)
468
+ stored.set(path.relative(config.workspaceRoot, file), signature)
469
+ added = true
470
+ }
471
+ if (!added || nativeStoreFlushArmed) return
472
+ nativeStoreFlushArmed = true
473
+ // Written once, at exit: a build records hundreds of native entries.
474
+ process.once('exit', () => {
475
+ for (const { config: owner, files } of nativeNodeModuleStores.values()) {
476
+ try {
477
+ // Another process (a build's warm child) may have written since this one loaded.
478
+ for (const [file, signature] of Object.entries(readNativeStore(owner))) {
479
+ if (!files.has(file)) files.set(file, signature)
480
+ }
481
+ writeFileSync(
482
+ nativeNodeModuleStore(owner),
483
+ JSON.stringify({ version: NATIVE_STORE_VERSION, files: Object.fromEntries(files) }),
484
+ )
485
+ } catch {
486
+ // A missing store only costs the scan.
487
+ }
488
+ }
489
+ })
490
+ }
491
+
492
+ /** Per file: its source and relative imports when it loads as-is, or null. Sources are dropped once loaded. */
493
+ const nodeModuleScans = new Map<string, { source?: string; imports: string[] } | null>()
494
+ const nodeModuleGraphVerdicts = new Map<string, boolean>()
495
+
496
+ function nodeModuleScan(file: string) {
497
+ let scan = nodeModuleScans.get(file)
498
+ if (scan === undefined) {
499
+ try {
500
+ const source = readFileSync(file, 'utf8')
501
+ const relative = nodeModuleRelativeImports(source)
502
+ const dir = path.dirname(file)
503
+ scan = relative
504
+ ? {
505
+ source,
506
+ imports: relative.map(specifier =>
507
+ /\.[cm]?js$/.test(specifier)
508
+ ? path.resolve(dir, specifier)
509
+ : Bun.resolveSync(specifier, dir),
510
+ ),
511
+ }
512
+ : null
513
+ } catch {
514
+ scan = null
515
+ }
516
+ nodeModuleScans.set(file, scan)
517
+ }
518
+ return scan
519
+ }
520
+
521
+ /**
522
+ * Whether `file` and everything it reaches by relative import load as-is. A raw file importing one
523
+ * that is bundled would meet a second, inlined copy of the files that bundle shares with it.
524
+ */
525
+ function nodeModuleGraphLoadsAsIs(file: string) {
526
+ const known = nodeModuleGraphVerdicts.get(file)
527
+ if (known !== undefined) return known
528
+ const seen = new Set<string>()
529
+ const stack = [file]
530
+ let verdict = true
531
+ while (stack.length > 0 && verdict) {
532
+ const next = stack.pop()!
533
+ if (seen.has(next) || nodeModuleGraphVerdicts.get(next) === true) continue
534
+ seen.add(next)
535
+ const scan = nodeModuleScan(next)
536
+ if (!scan) verdict = false
537
+ else stack.push(...scan.imports)
538
+ }
539
+ if (verdict) for (const covered of seen) nodeModuleGraphVerdicts.set(covered, true)
540
+ else nodeModuleGraphVerdicts.set(file, false)
541
+ return verdict
542
+ }
543
+
544
+ /** The source Bun loads for an as-is file, read once. */
545
+ function takeNodeModuleSource(file: string) {
546
+ const scan = nodeModuleScans.get(file)
547
+ const source = scan?.source ?? readFileSync(file, 'utf8')
548
+ if (scan) scan.source = undefined
549
+ return source
550
+ }
551
+
380
552
  function runtimeConfigForFile(file: string | undefined) {
381
553
  if (!file) return undefined
382
554
  const key = path.resolve(file)
@@ -706,6 +706,19 @@ interface IndexFile {
706
706
  /** Bumped whenever a record's shape changes; an older index is simply ignored. */
707
707
  const INDEX_VERSION = 4
708
708
 
709
+ /** The persisted compile graph: each source's local import targets, absolute. */
710
+ export function compiledSourceGraph(outPath: string, workspaceRoot: string) {
711
+ const graph = new Map<string, string[]>()
712
+ const parsed = readIndexFile(path.join(cacheRoot(outPath), 'graph.json'))
713
+ for (const [source, entry] of Object.entries(parsed?.files ?? {})) {
714
+ graph.set(
715
+ absoluteSourcePath(source, workspaceRoot),
716
+ entry[3].map(file => absoluteSourcePath(file, workspaceRoot)),
717
+ )
718
+ }
719
+ return graph
720
+ }
721
+
709
722
  function readIndexFile(file: string): IndexFile | undefined {
710
723
  try {
711
724
  return JSON.parse(readFileSync(file, 'utf8')) as IndexFile