@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
@@ -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
+ }
@@ -6,9 +6,10 @@
6
6
  * imports them; this module never imports from `./vendor-build`.
7
7
  */
8
8
 
9
+ import { hasModuleDirective } from '../utils/directive'
9
10
  import { createHash } from 'node:crypto'
10
11
  import { createRequire } from 'node:module'
11
- import { existsSync, realpathSync } from 'node:fs'
12
+ import { existsSync, readFileSync, realpathSync, statSync, writeFileSync } from 'node:fs'
12
13
  import { mkdir, readFile, stat, writeFile } from 'node:fs/promises'
13
14
  import path from 'node:path'
14
15
  import { fileURLToPath } from 'node:url'
@@ -33,6 +34,7 @@ import {
33
34
  pnextAliases,
34
35
  type CompatAliasTarget,
35
36
  type ResolvedConfig,
37
+ outCachePath,
36
38
  } from '../config'
37
39
  import {
38
40
  rewriteDynamicCallTargets,
@@ -41,40 +43,29 @@ import {
41
43
  } from '../resolve/dynamic'
42
44
  import { cacheRoot } from './module-cache'
43
45
  import { frameworkFingerprint } from './fingerprint'
46
+ import { prebundledFile } from './prebundle'
44
47
  import { readNodeModuleBundle, writeNodeModuleBundle } from '../dev/restart/node-modules'
45
- import { setBasePathPrefix, setDefaultPrefetchMode, setTrailingSlashUrls } from '../routing/href'
46
48
  import { resolveExternalLoadTarget, resolveImport, workspacePackageRoots } from '../resolve/imports'
47
49
  import { escapeRegex } from '../utils/code'
48
50
  import { traceEnabled } from '../utils/trace-flags'
49
51
  import { writeFileAtomic } from '../utils/fs'
52
+ import { productionRelease } from './production'
53
+ import {
54
+ applyServerHrefConfig,
55
+ isReleaseCompile,
56
+ serverBundleExtraConditions,
57
+ type ServerBundleTarget,
58
+ } from './load'
59
+
60
+ export {
61
+ pagesApiBundleTargetForRuntime,
62
+ serverBundleTargetForRuntime,
63
+ setServerBundleConditions,
64
+ type ServerBundleTarget,
65
+ } from './load'
50
66
 
51
67
  const require = createRequire(import.meta.url)
52
68
 
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
69
  /**
79
70
  * Pages-router PAGE SSR layer: Next compiles it in the server bundle with `node` (or
80
71
  * `edge-light`/`browser` for edge) export conditions but WITHOUT `react-server` - a pages page is
@@ -102,7 +93,7 @@ export function serverBundleConditions(target: ServerBundleTarget): string[] {
102
93
  : target === 'pages'
103
94
  ? ['node', 'module', 'import']
104
95
  : ['react-server', 'node', 'module', 'import']
105
- return [...new Set([...extraServerBundleConditions(target), ...base])]
96
+ return [...new Set([...serverBundleExtraConditions(target), ...base])]
106
97
  }
107
98
 
108
99
  export function serverBundleRequireConditions(target: ServerBundleTarget): string[] {
@@ -120,7 +111,7 @@ export function serverBundleRequireConditions(target: ServerBundleTarget): strin
120
111
  : target === 'pages'
121
112
  ? ['node', 'module', 'require']
122
113
  : ['react-server', 'node', 'module', 'require']
123
- return [...new Set([...extraServerBundleConditions(target), ...base])]
114
+ return [...new Set([...serverBundleExtraConditions(target), ...base])]
124
115
  }
125
116
 
126
117
  const runtimeConfigs = new Map<string, RuntimeConfig>()
@@ -167,14 +158,10 @@ interface TransformCacheEntry {
167
158
  }
168
159
 
169
160
  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
161
+ applyServerHrefConfig(config)
162
+ // A release imports compiled artifacts natively: no resolve or transform plugins.
163
+ if (typeof Bun === 'undefined' || productionRelease(config)) return
164
+ nativeStoreFor(config)
178
165
  const sourceRoots = [...new Set(sourceFiles.map(file => sourceRootForFile(config, file)))].sort()
179
166
  const signature = sourceRoots.join('\0')
180
167
  let registered = registeredSignatures.get(config)
@@ -189,7 +176,8 @@ export function registerServerRuntime(config: ResolvedConfig, sourceFiles: strin
189
176
  const roots = [
190
177
  ...rootPaths(config.root),
191
178
  ...rootPaths(config.appPath),
192
- ...rootPaths(path.join(config.outPath, 'cache', 'server')),
179
+ // A release build evaluates its compiled artifacts as the release will: natively.
180
+ ...(isReleaseCompile() ? [] : rootPaths(path.join(outCachePath(config.outPath), 'server'))),
193
181
  // The pnext src root, so the framework's own source transforms too.
194
182
  ...rootPaths(path.join(import.meta.dirname, '..')),
195
183
  ...sourceRoots.flatMap(rootPaths),
@@ -286,7 +274,7 @@ function registerResolvePlugin() {
286
274
  const runtime = runtimeConfigForFile(args.importer)
287
275
  const resolved = runtime?.aliases.get(args.path) ?? firstAliasForSpecifier(args.path)
288
276
  const target = resolved ? serverRequireAlias(args.path, resolved, args.kind) : undefined
289
- if (target) return { path: target }
277
+ if (target) return { path: prebundledFile(target) }
290
278
  const message = (runtime ?? firstRuntimeConfig())?.missingImportError(args.path)
291
279
  if (message) throw new Error(message)
292
280
  return undefined
@@ -302,7 +290,7 @@ function registerResolvePlugin() {
302
290
  target: 'server',
303
291
  })
304
292
  if (!target) return undefined
305
- return { path: target }
293
+ return { path: prebundledFile(target) }
306
294
  })
307
295
  },
308
296
  })
@@ -368,15 +356,201 @@ function registerNodeModulesLoadPlugin() {
368
356
  filter:
369
357
  /\/node_modules\/.*(?:\.mjs|\.esm\.js|\/(?:es|esm|dist\/esm|build\/modern)\/.*\.js)$/,
370
358
  },
371
- async ({ path: file }) => {
372
- const code = await transformNodeModuleSource(file)
373
- return { contents: code, loader: 'js' }
359
+ ({ path: file }) => {
360
+ if (isRecordedNativeFile(file) || nodeModuleGraphLoadsAsIs(file)) {
361
+ return { contents: takeNodeModuleSource(file), loader: 'js' }
362
+ }
363
+ return transformNodeModuleSource(file).then(code => ({ contents: code, loader: 'js' }))
374
364
  },
375
365
  )
376
366
  },
377
367
  })
378
368
  }
379
369
 
370
+ const nodeModuleImportScanner = new Bun.Transpiler({ loader: 'js' })
371
+
372
+ /**
373
+ * Whether a node_modules ESM file loads exactly as written: one module per file, as Node loads it.
374
+ * Bundling it with its relative imports inlined gave every entry file of a package its own copy of
375
+ * the files they share, and of their module state. Only an aliased import, a directive, a non-JS
376
+ * import or a configured `define` still needs the bundle.
377
+ */
378
+ export function nodeModuleSourceLoadsAsIs(source: string) {
379
+ return nodeModuleRelativeImports(source) !== undefined
380
+ }
381
+
382
+ /** The relative specifiers of a file that loads as-is, or undefined when it needs the bundle. */
383
+ function nodeModuleRelativeImports(source: string) {
384
+ if (serverDefineOptions().define || source.includes('use cache')) return undefined
385
+ if (hasModuleDirective(source, 'use client') || hasModuleDirective(source, 'use server')) {
386
+ return undefined
387
+ }
388
+ try {
389
+ const relative: string[] = []
390
+ for (const { path: specifier } of nodeModuleImportScanner.scanImports(source)) {
391
+ if (specifier.startsWith('.') || specifier.startsWith('/')) {
392
+ if (!/(?:\.[cm]?js|\.json|\/[^./]+)$/.test(specifier)) return undefined
393
+ if (specifier.startsWith('.')) relative.push(specifier)
394
+ } else if (aliasSpecifierFilter.test(specifier) || firstAliasForSpecifier(specifier)) {
395
+ return undefined
396
+ }
397
+ }
398
+ return relative
399
+ } catch {
400
+ return undefined
401
+ }
402
+ }
403
+
404
+ /**
405
+ * Files the server's native verdict (vendor-build) proved load as-is. Recorded with the build, so a
406
+ * started server answers from this set instead of re-scanning every file of every native package.
407
+ */
408
+ const nativeNodeModuleFiles = new Map<string, string>()
409
+ const nativeNodeModuleStores = new Map<
410
+ string,
411
+ { config: ResolvedConfig; files: Map<string, string> }
412
+ >()
413
+ let nativeStoreFlushArmed = false
414
+
415
+ // Not keyed on pnext's fingerprint: a started server never computes it, and walking pnext's tree for
416
+ // it cost more than the scans this store saves. Bump the version when the as-is rule changes.
417
+ const NATIVE_STORE_VERSION = 1
418
+ const nativeNodeModuleStore = (config: ResolvedConfig) =>
419
+ path.join(cacheRoot(config.outPath), 'native-files.json')
420
+
421
+ /** A file's stat signature: a reinstalled package must be scanned again. */
422
+ export function statSignature(file: string) {
423
+ try {
424
+ const { mtimeMs, size } = statSync(file)
425
+ return `${mtimeMs}:${size}`
426
+ } catch {
427
+ return undefined
428
+ }
429
+ }
430
+
431
+ function nativeStoreFor(config: ResolvedConfig) {
432
+ let stored = nativeNodeModuleStores.get(config.outPath)?.files
433
+ if (!stored) {
434
+ stored = new Map()
435
+ nativeNodeModuleStores.set(config.outPath, { config, files: stored })
436
+ for (const [file, signature] of Object.entries(readNativeStore(config))) {
437
+ stored.set(file, signature)
438
+ nativeNodeModuleFiles.set(path.resolve(config.workspaceRoot, file), signature)
439
+ }
440
+ }
441
+ return stored
442
+ }
443
+
444
+ function readNativeStore(config: ResolvedConfig): Record<string, string> {
445
+ try {
446
+ const store = JSON.parse(readFileSync(nativeNodeModuleStore(config), 'utf8')) as {
447
+ version: number
448
+ files: Record<string, string>
449
+ }
450
+ return store.version === NATIVE_STORE_VERSION ? store.files : {}
451
+ } catch {
452
+ // No store yet: the plugin scans until the verdicts are recorded.
453
+ return {}
454
+ }
455
+ }
456
+
457
+ function isRecordedNativeFile(file: string) {
458
+ const signature = nativeNodeModuleFiles.get(file)
459
+ return signature !== undefined && signature === statSignature(file)
460
+ }
461
+
462
+ export function recordNativeNodeModuleFiles(config: ResolvedConfig, files: Iterable<string>) {
463
+ const stored = nativeStoreFor(config)
464
+ let added = false
465
+ for (const file of files) {
466
+ if (nativeNodeModuleFiles.has(file)) continue
467
+ const signature = statSignature(file)
468
+ if (!signature) continue
469
+ nativeNodeModuleFiles.set(file, signature)
470
+ stored.set(path.relative(config.workspaceRoot, file), signature)
471
+ added = true
472
+ }
473
+ if (!added || nativeStoreFlushArmed) return
474
+ nativeStoreFlushArmed = true
475
+ // Written once, at exit: a build records hundreds of native entries.
476
+ process.once('exit', () => {
477
+ for (const { config: owner, files } of nativeNodeModuleStores.values()) {
478
+ try {
479
+ // Another process (a build's warm child) may have written since this one loaded.
480
+ for (const [file, signature] of Object.entries(readNativeStore(owner))) {
481
+ if (!files.has(file)) files.set(file, signature)
482
+ }
483
+ writeFileSync(
484
+ nativeNodeModuleStore(owner),
485
+ JSON.stringify({ version: NATIVE_STORE_VERSION, files: Object.fromEntries(files) }),
486
+ )
487
+ } catch {
488
+ // A missing store only costs the scan.
489
+ }
490
+ }
491
+ })
492
+ }
493
+
494
+ /** Per file: its source and relative imports when it loads as-is, or null. Sources are dropped once loaded. */
495
+ const nodeModuleScans = new Map<string, { source?: string; imports: string[] } | null>()
496
+ const nodeModuleGraphVerdicts = new Map<string, boolean>()
497
+
498
+ function nodeModuleScan(file: string) {
499
+ let scan = nodeModuleScans.get(file)
500
+ if (scan === undefined) {
501
+ try {
502
+ const source = readFileSync(file, 'utf8')
503
+ const relative = nodeModuleRelativeImports(source)
504
+ const dir = path.dirname(file)
505
+ scan = relative
506
+ ? {
507
+ source,
508
+ imports: relative.map(specifier =>
509
+ /\.[cm]?js$/.test(specifier)
510
+ ? path.resolve(dir, specifier)
511
+ : Bun.resolveSync(specifier, dir),
512
+ ),
513
+ }
514
+ : null
515
+ } catch {
516
+ scan = null
517
+ }
518
+ nodeModuleScans.set(file, scan)
519
+ }
520
+ return scan
521
+ }
522
+
523
+ /**
524
+ * Whether `file` and everything it reaches by relative import load as-is. A raw file importing one
525
+ * that is bundled would meet a second, inlined copy of the files that bundle shares with it.
526
+ */
527
+ function nodeModuleGraphLoadsAsIs(file: string) {
528
+ const known = nodeModuleGraphVerdicts.get(file)
529
+ if (known !== undefined) return known
530
+ const seen = new Set<string>()
531
+ const stack = [file]
532
+ let verdict = true
533
+ while (stack.length > 0 && verdict) {
534
+ const next = stack.pop()!
535
+ if (seen.has(next) || nodeModuleGraphVerdicts.get(next) === true) continue
536
+ seen.add(next)
537
+ const scan = nodeModuleScan(next)
538
+ if (!scan) verdict = false
539
+ else stack.push(...scan.imports)
540
+ }
541
+ if (verdict) for (const covered of seen) nodeModuleGraphVerdicts.set(covered, true)
542
+ else nodeModuleGraphVerdicts.set(file, false)
543
+ return verdict
544
+ }
545
+
546
+ /** The source Bun loads for an as-is file, read once. */
547
+ function takeNodeModuleSource(file: string) {
548
+ const scan = nodeModuleScans.get(file)
549
+ const source = scan?.source ?? readFileSync(file, 'utf8')
550
+ if (scan) scan.source = undefined
551
+ return source
552
+ }
553
+
380
554
  function runtimeConfigForFile(file: string | undefined) {
381
555
  if (!file) return undefined
382
556
  const key = path.resolve(file)
@@ -968,7 +1142,7 @@ async function staticImageModuleSource(config: ResolvedConfig | undefined, file:
968
1142
  const source = compat ?? coreStaticAssetModule(sourcePath, bytes, emit)
969
1143
  if (config) {
970
1144
  for (const asset of emitted) {
971
- const target = path.join(config.outPath, 'public', ...asset.relative.split('/'))
1145
+ const target = path.join(config.outPath, 'static', ...asset.relative.split('/'))
972
1146
  await mkdir(path.dirname(target), { recursive: true })
973
1147
  if (!existsSync(target)) await Bun.write(target, asset.bytes)
974
1148
  }
@@ -17,6 +17,7 @@ import { fileURLToPath } from 'node:url'
17
17
  import type { ResolvedConfig } from '../config'
18
18
  import { writeFileAtomic } from '../utils/fs'
19
19
  import { traceEnabled } from '../utils/trace-flags'
20
+ import { outCachePath } from '../out-paths'
20
21
 
21
22
  /**
22
23
  * Kill switch for the request-head trims: the naming walk's synchronous source
@@ -205,7 +206,7 @@ export function devModuleCache(
205
206
  }
206
207
 
207
208
  export function cacheRoot(outPath: string) {
208
- return path.join(outPath, 'cache', 'server')
209
+ return path.join(outCachePath(outPath), 'server')
209
210
  }
210
211
 
211
212
  function createDevModuleCache(
@@ -706,6 +707,19 @@ interface IndexFile {
706
707
  /** Bumped whenever a record's shape changes; an older index is simply ignored. */
707
708
  const INDEX_VERSION = 4
708
709
 
710
+ /** The persisted compile graph: each source's local import targets, absolute. */
711
+ export function compiledSourceGraph(outPath: string, workspaceRoot: string) {
712
+ const graph = new Map<string, string[]>()
713
+ const parsed = readIndexFile(path.join(cacheRoot(outPath), 'graph.json'))
714
+ for (const [source, entry] of Object.entries(parsed?.files ?? {})) {
715
+ graph.set(
716
+ absoluteSourcePath(source, workspaceRoot),
717
+ entry[3].map(file => absoluteSourcePath(file, workspaceRoot)),
718
+ )
719
+ }
720
+ return graph
721
+ }
722
+
709
723
  function readIndexFile(file: string): IndexFile | undefined {
710
724
  try {
711
725
  return JSON.parse(readFileSync(file, 'utf8')) as IndexFile