@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.
- package/bin/pnext +9 -2
- package/dist/server/_chunks/aliases-j47a10ce.js +44 -0
- package/dist/server/_chunks/analyze-arswqe6s.js +445 -0
- package/dist/server/_chunks/boot-af0mv3dy.js +36 -0
- package/dist/server/_chunks/build-spy3dxp4.js +84 -0
- package/dist/server/_chunks/build-t9h0hec3.js +3550 -0
- package/dist/server/_chunks/build-tier-m7yvqz61.js +2472 -0
- package/dist/server/_chunks/compile-53j02j27.js +22 -0
- package/dist/server/_chunks/config-1yzwexq6.js +27 -0
- package/dist/server/_chunks/config-n2z7yxps.js +22 -0
- package/dist/server/_chunks/create-meec9hs6.js +134 -0
- package/dist/server/_chunks/dev-fjmqg6en.js +220 -0
- package/dist/server/_chunks/esbuild-yyktfrtt.js +15 -0
- package/dist/server/_chunks/generate-n9sh6hzt.js +21 -0
- package/dist/server/_chunks/index-0374j2b9.js +66 -0
- package/dist/server/_chunks/index-06nyqntx.js +213 -0
- package/dist/server/_chunks/index-1011cscr.js +5263 -0
- package/dist/server/_chunks/index-11sfk4hb.js +170 -0
- package/dist/server/_chunks/index-20ppawv7.js +297 -0
- package/dist/server/_chunks/index-2dv4y4wd.js +1065 -0
- package/dist/server/_chunks/index-2vz0wzdn.js +59 -0
- package/dist/server/_chunks/index-2wfv4kvx.js +182 -0
- package/dist/server/_chunks/index-357na4a8.js +109 -0
- package/dist/server/_chunks/index-3b3at80h.js +109 -0
- package/dist/server/_chunks/index-3tf1xjsp.js +6166 -0
- package/dist/server/_chunks/index-3xbr4eyv.js +105 -0
- package/dist/server/_chunks/index-4399bvd2.js +18 -0
- package/dist/server/_chunks/index-4hgjrqh7.js +851 -0
- package/dist/server/_chunks/index-4q2gbfwk.js +2530 -0
- package/dist/server/_chunks/index-4t92hdxd.js +172 -0
- package/dist/server/_chunks/index-4zzebszd.js +10 -0
- package/dist/server/_chunks/index-5gyr4emz.js +107 -0
- package/dist/server/_chunks/index-5hr4062s.js +70 -0
- package/dist/server/_chunks/index-68m3mwbd.js +84 -0
- package/dist/server/_chunks/index-6b009mt0.js +56 -0
- package/dist/server/_chunks/index-6e4fqv30.js +588 -0
- package/dist/server/_chunks/index-6gex3pfa.js +15 -0
- package/dist/server/_chunks/index-6kp9r0d9.js +11 -0
- package/dist/server/_chunks/index-6q7zvrap.js +134 -0
- package/dist/server/_chunks/index-73z4esab.js +38 -0
- package/dist/server/_chunks/index-79ngvam8.js +60 -0
- package/dist/server/_chunks/index-7wc9n8be.js +25 -0
- package/dist/server/_chunks/index-8k7pfejn.js +1599 -0
- package/dist/server/_chunks/index-8kcxdfya.js +206 -0
- package/dist/server/_chunks/index-91x12ykq.js +274 -0
- package/dist/server/_chunks/index-9ch50vtq.js +18 -0
- package/dist/server/_chunks/index-9hx2641q.js +28 -0
- package/dist/server/_chunks/index-9n2914ww.js +535 -0
- package/dist/server/_chunks/index-9ych9ma8.js +207 -0
- package/dist/server/_chunks/index-b6wtkdp4.js +24 -0
- package/dist/server/_chunks/index-bcws5eh2.js +35 -0
- package/dist/server/_chunks/index-c0g2wf3z.js +92 -0
- package/dist/server/_chunks/index-cf4rvxv6.js +95 -0
- package/dist/server/_chunks/index-cjgqs13g.js +65 -0
- package/dist/server/_chunks/index-ckkdpht5.js +41 -0
- package/dist/server/_chunks/index-cyfednwb.js +87 -0
- package/dist/server/_chunks/index-danncfhy.js +311 -0
- package/dist/server/_chunks/index-dg0f05zs.js +199 -0
- package/dist/server/_chunks/index-e3a6yx84.js +18 -0
- package/dist/server/_chunks/index-e88tyv35.js +45 -0
- package/dist/server/_chunks/index-eajaspjk.js +1253 -0
- package/dist/server/_chunks/index-eeaanp2e.js +483 -0
- package/dist/server/_chunks/index-egykcqg3.js +101 -0
- package/dist/server/_chunks/index-en7n9f7m.js +22 -0
- package/dist/server/_chunks/index-ezgj0tr1.js +88 -0
- package/dist/server/_chunks/index-fkp000p1.js +590 -0
- package/dist/server/_chunks/index-fn1chkkd.js +214 -0
- package/dist/server/_chunks/index-fp8r0sqs.js +64 -0
- package/dist/server/_chunks/index-ggk2j965.js +9432 -0
- package/dist/server/_chunks/index-grta8ap3.js +238 -0
- package/dist/server/_chunks/index-h2a70tg4.js +7 -0
- package/dist/server/_chunks/index-h4xy648y.js +51 -0
- package/dist/server/_chunks/index-hkdfj58q.js +92 -0
- package/dist/server/_chunks/index-j2zrcp1k.js +66 -0
- package/dist/server/_chunks/index-jcsjq3d1.js +20 -0
- package/dist/server/_chunks/index-jepjvcrf.js +198 -0
- package/dist/server/_chunks/index-jks0x0a1.js +14 -0
- package/dist/server/_chunks/index-jx7bqvw1.js +57 -0
- package/dist/server/_chunks/index-k1g3epw0.js +1299 -0
- package/dist/server/_chunks/index-knp0s912.js +7 -0
- package/dist/server/_chunks/index-kq8kpzye.js +472 -0
- package/dist/server/_chunks/index-kqyy1d4f.js +50 -0
- package/dist/server/_chunks/index-kresp2n8.js +445 -0
- package/dist/server/_chunks/index-ms9v9tnx.js +31 -0
- package/dist/server/_chunks/index-n4hxpng2.js +11 -0
- package/dist/server/_chunks/index-ncnes8c6.js +17 -0
- package/dist/server/_chunks/index-nqh3xhdc.js +57 -0
- package/dist/server/_chunks/index-nyrba2kr.js +4130 -0
- package/dist/server/_chunks/index-p77b4kcx.js +296 -0
- package/dist/server/_chunks/index-pym1cezq.js +39 -0
- package/dist/server/_chunks/index-q738kkhj.js +100 -0
- package/dist/server/_chunks/index-qjj6gddn.js +54 -0
- package/dist/server/_chunks/index-qm6kmhqs.js +110 -0
- package/dist/server/_chunks/index-qn4z5s3c.js +819 -0
- package/dist/server/_chunks/index-qpwsgt3a.js +158 -0
- package/dist/server/_chunks/index-r97ptz1q.js +97 -0
- package/dist/server/_chunks/index-ras0sdab.js +26 -0
- package/dist/server/_chunks/index-rcs322t1.js +19 -0
- package/dist/server/_chunks/index-rn8dyr1f.js +126 -0
- package/dist/server/_chunks/index-rt9qq1va.js +4 -0
- package/dist/server/_chunks/index-rthrsed5.js +356 -0
- package/dist/server/_chunks/index-sctcgyvv.js +185 -0
- package/dist/server/_chunks/index-sjpckxqn.js +213 -0
- package/dist/server/_chunks/index-sq3kvz3g.js +200 -0
- package/dist/server/_chunks/index-stbk3jhn.js +31 -0
- package/dist/server/_chunks/index-sv8m6789.js +266 -0
- package/dist/server/_chunks/index-tgcakdxc.js +125 -0
- package/dist/server/_chunks/index-tgsfjmep.js +74 -0
- package/dist/server/_chunks/index-tq0pc7eg.js +154 -0
- package/dist/server/_chunks/index-tq1f96v7.js +51 -0
- package/dist/server/_chunks/index-tqn2qnnn.js +241 -0
- package/dist/server/_chunks/index-tvqkq6e6.js +128 -0
- package/dist/server/_chunks/index-v1ags1na.js +132 -0
- package/dist/server/_chunks/index-vvmmknm1.js +1431 -0
- package/dist/server/_chunks/index-vvq7rqtn.js +329 -0
- package/dist/server/_chunks/index-vz0km5qk.js +33 -0
- package/dist/server/_chunks/index-w6h8m6vp.js +138 -0
- package/dist/server/_chunks/index-web361b8.js +138 -0
- package/dist/server/_chunks/index-wpfhfbs4.js +194 -0
- package/dist/server/_chunks/index-x0y005nh.js +283 -0
- package/dist/server/_chunks/index-x3yn4ywm.js +22 -0
- package/dist/server/_chunks/index-x93hv0sc.js +271 -0
- package/dist/server/_chunks/index-xvj80c3a.js +30 -0
- package/dist/server/_chunks/index-xywjg2vc.js +100 -0
- package/dist/server/_chunks/index-y2jr2n72.js +152 -0
- package/dist/server/_chunks/index-y36a0ybw.js +57 -0
- package/dist/server/_chunks/index-ye9hmsvf.js +47 -0
- package/dist/server/_chunks/index-yhxkxghe.js +56 -0
- package/dist/server/_chunks/index-ym67zqxp.js +130 -0
- package/dist/server/_chunks/index-ytjvpbm2.js +736 -0
- package/dist/server/_chunks/index-yz54pxrh.js +960 -0
- package/dist/server/_chunks/index-z4z9zv3b.js +733 -0
- package/dist/server/_chunks/index-z84ab1w0.js +1270 -0
- package/dist/server/_chunks/index-z88qv16t.js +11 -0
- package/dist/server/_chunks/index-zqpqyg8p.js +666 -0
- package/dist/server/_chunks/loader-7yw0j98z.js +78 -0
- package/dist/server/_chunks/modules-jn8bmbn8.js +74 -0
- package/dist/server/_chunks/pipeline-yy9jhydf.js +832 -0
- package/dist/server/_chunks/production-jar9ztm3.js +44 -0
- package/dist/server/_chunks/proxy-config-j84dgksn.js +21 -0
- package/dist/server/_chunks/proxy-w1d0wmsn.js +33 -0
- package/dist/server/_chunks/router-k1reahfn.js +498 -0
- package/dist/server/_chunks/routes-2s277fc6.js +64 -0
- package/dist/server/_chunks/run-pvd8bs1t.js +696 -0
- package/dist/server/_chunks/server-mt4a994c.js +1835 -0
- package/dist/server/_chunks/tsconfig-defaults-1nb3308g.js +20 -0
- package/dist/server/_chunks/typegen-0qr0459b.js +35 -0
- package/dist/server/api/client-cache.js +14 -0
- package/dist/server/cli/index.js +378 -0
- package/dist/server/cli/start.js +137 -0
- package/dist/server/client/reference.js +16 -0
- package/dist/server/compat/next/cache.js +56 -0
- package/dist/server/compat/next/canonical-url.js +13 -0
- package/dist/server/compat/next/client-cache.js +57 -0
- package/dist/server/compat/next/client-navigation.js +232 -0
- package/dist/server/compat/next/client-only.js +1 -0
- package/dist/server/compat/next/client-script.js +178 -0
- package/dist/server/compat/next/client-server.js +34 -0
- package/dist/server/compat/next/config-headers.js +32 -0
- package/dist/server/compat/next/config-loader.js +25 -0
- package/dist/server/compat/next/config.js +10 -0
- package/dist/server/compat/next/constants.js +18 -0
- package/dist/server/compat/next/custom-server.js +10 -0
- package/dist/server/compat/next/dist/client/components/app-router-headers.js +48 -0
- package/dist/server/compat/next/dist/server/web/spec-extension/revalidate.js +27 -0
- package/dist/server/compat/next/dist/server/web/spec-extension/unstable-cache.js +25 -0
- package/dist/server/compat/next/dist/server/web/spec-extension/unstable-no-store.js +25 -0
- package/dist/server/compat/next/dynamic.js +32 -0
- package/dist/server/compat/next/error.js +112 -0
- package/dist/server/compat/next/font/cache.js +14 -0
- package/dist/server/compat/next/font/google.js +3 -0
- package/dist/server/compat/next/font/index.js +1 -0
- package/dist/server/compat/next/font/local.js +22 -0
- package/dist/server/compat/next/font/runtime-client.js +33 -0
- package/dist/server/compat/next/font/runtime.js +41 -0
- package/dist/server/compat/next/font/shared.js +22 -0
- package/dist/server/compat/next/form.js +129 -0
- package/dist/server/compat/next/head.js +10 -0
- package/dist/server/compat/next/headers.js +30 -0
- package/dist/server/compat/next/image/client.js +11 -0
- package/dist/server/compat/next/image/config.js +18 -0
- package/dist/server/compat/next/image/optimizer.js +25 -0
- package/dist/server/compat/next/image/patterns.js +12 -0
- package/dist/server/compat/next/image/props.js +16 -0
- package/dist/server/compat/next/image/shared.js +86 -0
- package/dist/server/compat/next/image/static-metadata.js +32 -0
- package/dist/server/compat/next/image/validate.js +8 -0
- package/dist/server/compat/next/image.js +59 -0
- package/dist/server/compat/next/index.js +1 -0
- package/dist/server/compat/next/legacy-image.js +78 -0
- package/dist/server/compat/next/legacy-request-apis.js +24 -0
- package/dist/server/compat/next/link-transform.js +14 -0
- package/dist/server/compat/next/link.js +14 -0
- package/dist/server/compat/next/navigation.js +190 -0
- package/dist/server/compat/next/offline.js +45 -0
- package/dist/server/compat/next/og.js +8 -0
- package/dist/server/compat/next/preferred-region.js +8 -0
- package/dist/server/compat/next/redirects.js +30 -0
- package/dist/server/compat/next/resource-hints.js +30 -0
- package/dist/server/compat/next/rewrites.js +41 -0
- package/dist/server/compat/next/root-params.js +121 -0
- package/dist/server/compat/next/route-state.js +23 -0
- package/dist/server/compat/next/router.js +103 -0
- package/dist/server/compat/next/script.js +37 -0
- package/dist/server/compat/next/server-only.js +1 -0
- package/dist/server/compat/next/server.js +131 -0
- package/dist/server/compat/next/svgr.js +14 -0
- package/dist/server/compat/next/telemetry.js +10 -0
- package/dist/server/compat/next/usage.js +13 -0
- package/dist/server/compat/next/user-agent.js +12 -0
- package/dist/server/compat/next/web-vitals.js +35 -0
- package/dist/server/compat/react/action-state.js +11 -0
- package/dist/server/compat/react/client-lite.js +83 -0
- package/dist/server/compat/react/client.js +131 -0
- package/dist/server/compat/react/compiler-runtime.js +42 -0
- package/dist/server/compat/react/dom-client.js +106 -0
- package/dist/server/compat/react/dom-react-server.js +37 -0
- package/dist/server/compat/react/dom-server.js +40 -0
- package/dist/server/compat/react/dom.js +52 -0
- package/dist/server/compat/react/hooks-extra.js +12 -0
- package/dist/server/compat/react/internals.js +14 -0
- package/dist/server/compat/react/parity.js +11 -0
- package/dist/server/compat/react/preact.js +113 -0
- package/dist/server/compat/react/react-server.js +133 -0
- package/dist/server/compat/react/router-shim.js +8 -0
- package/dist/server/compat/react/server-component-use.js +14 -0
- package/dist/server/compat/react/server-inserted-html.js +14 -0
- package/dist/server/compat/react/server.js +194 -0
- package/dist/server/compat/react/style-values.js +10 -0
- package/dist/server/compat/react/use.js +10 -0
- package/dist/server/compat/react/view-transition.js +12 -0
- package/dist/server/generation.json +1 -0
- package/package.json +4 -1
- package/src/api/dynamic.tsx +2 -0
- package/src/api/server.ts +24 -6
- package/src/cli/adapters/vercel-warm.ts +315 -61
- package/src/cli/adapters/vercel.ts +348 -71
- package/src/cli/build.ts +58 -33
- package/src/cli/index.ts +23 -10
- package/src/cli/serve/entry.ts +21 -159
- package/src/cli/serve/immutable.ts +31 -0
- package/src/cli/serve/pipeline.ts +82 -84
- package/src/cli/start.ts +3 -1
- package/src/client/chunk-fold.ts +19 -6
- package/src/client/react-tier.ts +3 -2
- package/src/client/reference-stub.ts +21 -2
- package/src/compat/actions/client-plugin.ts +4 -2
- package/src/compat/actions/config.ts +6 -5
- package/src/compat/actions/extensions.ts +2 -3
- package/src/compat/aliases.ts +8 -1
- package/src/compat/bundler/config.ts +88 -0
- package/src/compat/bundler/optimize-package-imports.ts +86 -26
- package/src/compat/bundler/relay-transform.ts +15 -3
- package/src/compat/cache-control.ts +16 -8
- package/src/compat/css/modules.ts +18 -5
- package/src/compat/lifecycle/error-funnel.ts +1 -1
- package/src/compat/lifecycle/instrumentation.ts +117 -24
- package/src/compat/lifecycle/testmode.ts +3 -2
- package/src/compat/next/config-loader.ts +137 -13
- package/src/compat/next/font/runtime.ts +22 -2
- package/src/compat/next/og.ts +3 -3
- package/src/compat/next/usage.ts +3 -2
- package/src/compat/pages/api.ts +83 -14
- package/src/compat/pages/router.ts +30 -14
- package/src/compat/register/bundler.ts +3 -1
- package/src/compat/register/middleware.ts +1 -1
- package/src/compat/register/otel.ts +5 -9
- package/src/compat/register/render.ts +3 -1
- package/src/compat/register/use-cache.ts +3 -1
- package/src/compat/release.ts +46 -0
- package/src/compat/segment/serve.ts +1 -1
- package/src/compat/validation/validate.ts +10 -7
- package/src/config.ts +51 -7
- package/src/css/assets.ts +213 -0
- package/src/css/build.ts +174 -238
- package/src/dev/server.ts +27 -8
- package/src/extensions.ts +4 -0
- package/src/render/hooks.ts +13 -0
- package/src/render/renderer.ts +52 -32
- package/src/request/context.ts +9 -0
- package/src/resolve/dynamic.ts +3 -1
- package/src/resolve/imports.ts +12 -52
- package/src/resolve/package-json.ts +56 -0
- package/src/resolve/scan-facts.ts +65 -0
- package/src/routing/href.ts +10 -3
- package/src/routing/match.ts +287 -0
- package/src/routing/metadata-files.ts +19 -5
- package/src/routing/proxy-config.ts +137 -0
- package/src/routing/proxy.ts +35 -134
- package/src/routing/routes.ts +22 -281
- package/src/runtime/fingerprint.ts +23 -8
- package/src/runtime/load.ts +170 -0
- package/src/runtime/loader.ts +215 -43
- package/src/runtime/module-cache.ts +13 -0
- package/src/runtime/modules.ts +370 -81
- package/src/runtime/prebundle.ts +81 -0
- package/src/runtime/production.ts +391 -0
- package/src/runtime/release-graph.ts +334 -0
- package/src/runtime/vendor-build.ts +724 -13
- package/src/runtime/vendor.ts +16 -3
- package/src/types.ts +2 -0
- 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
|
+
}
|
package/src/runtime/loader.ts
CHANGED
|
@@ -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([...
|
|
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([...
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
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
|
-
|
|
372
|
-
|
|
373
|
-
|
|
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
|