@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.
- package/bin/pnext +9 -2
- package/dist/server/_chunks/aliases-pycbtjt1.js +46 -0
- package/dist/server/_chunks/analyze-4d9e00g9.js +449 -0
- package/dist/server/_chunks/boot-bhemypxz.js +38 -0
- package/dist/server/_chunks/build-c991dv65.js +86 -0
- package/dist/server/_chunks/build-kh5e3x48.js +3341 -0
- package/dist/server/_chunks/build-tier-0a96kmx3.js +2456 -0
- package/dist/server/_chunks/compile-040r79gj.js +22 -0
- package/dist/server/_chunks/config-0tvz03a6.js +24 -0
- package/dist/server/_chunks/config-27rj7830.js +36 -0
- package/dist/server/_chunks/create-9rvwshsp.js +135 -0
- package/dist/server/_chunks/dev-ex9exynt.js +220 -0
- package/dist/server/_chunks/esbuild-yyktfrtt.js +15 -0
- package/dist/server/_chunks/generate-myw9hef7.js +22 -0
- package/dist/server/_chunks/index-0r5eqfc7.js +279 -0
- package/dist/server/_chunks/index-0yjv5v47.js +105 -0
- package/dist/server/_chunks/index-11xpbfej.js +17 -0
- package/dist/server/_chunks/index-141vcwk6.js +109 -0
- package/dist/server/_chunks/index-1pzm1hdy.js +4130 -0
- package/dist/server/_chunks/index-29pq0kax.js +590 -0
- package/dist/server/_chunks/index-2vz0wzdn.js +59 -0
- package/dist/server/_chunks/index-2wfv4kvx.js +182 -0
- package/dist/server/_chunks/index-38xpdxwd.js +194 -0
- package/dist/server/_chunks/index-3e075kny.js +128 -0
- package/dist/server/_chunks/index-3ycf5ckv.js +472 -0
- package/dist/server/_chunks/index-4399bvd2.js +18 -0
- package/dist/server/_chunks/index-4da76t62.js +297 -0
- package/dist/server/_chunks/index-4t92hdxd.js +172 -0
- package/dist/server/_chunks/index-4zzebszd.js +10 -0
- package/dist/server/_chunks/index-52k54ykj.js +95 -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-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-71885zaq.js +284 -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-8ct7rqy3.js +198 -0
- package/dist/server/_chunks/index-8kcxdfya.js +206 -0
- package/dist/server/_chunks/index-9ch50vtq.js +18 -0
- package/dist/server/_chunks/index-9f49w76j.js +213 -0
- package/dist/server/_chunks/index-9hz3s0m8.js +851 -0
- package/dist/server/_chunks/index-akkrvjn6.js +535 -0
- package/dist/server/_chunks/index-b6wtkdp4.js +24 -0
- package/dist/server/_chunks/index-b7j671dj.js +207 -0
- package/dist/server/_chunks/index-bcws5eh2.js +35 -0
- package/dist/server/_chunks/index-bzd2ef7t.js +10 -0
- package/dist/server/_chunks/index-cjgqs13g.js +65 -0
- package/dist/server/_chunks/index-ckkdpht5.js +41 -0
- package/dist/server/_chunks/index-cn86z041.js +296 -0
- package/dist/server/_chunks/index-cvr4z22m.js +92 -0
- package/dist/server/_chunks/index-cyfednwb.js +87 -0
- package/dist/server/_chunks/index-d158y67j.js +152 -0
- package/dist/server/_chunks/index-d1jsmhhk.js +955 -0
- package/dist/server/_chunks/index-dg0f05zs.js +199 -0
- package/dist/server/_chunks/index-dgr390q7.js +9438 -0
- package/dist/server/_chunks/index-drwv61cc.js +185 -0
- package/dist/server/_chunks/index-e3a6yx84.js +18 -0
- package/dist/server/_chunks/index-e88tyv35.js +45 -0
- package/dist/server/_chunks/index-en7n9f7m.js +22 -0
- package/dist/server/_chunks/index-entm8bmz.js +28 -0
- package/dist/server/_chunks/index-evhd413j.js +57 -0
- package/dist/server/_chunks/index-ezgj0tr1.js +88 -0
- package/dist/server/_chunks/index-fjv96re1.js +5295 -0
- package/dist/server/_chunks/index-fn1chkkd.js +214 -0
- package/dist/server/_chunks/index-fp8r0sqs.js +64 -0
- package/dist/server/_chunks/index-gcmj16xy.js +92 -0
- package/dist/server/_chunks/index-gkndxkxf.js +736 -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-hdbwtdv2.js +352 -0
- package/dist/server/_chunks/index-he6n2bvp.js +1270 -0
- package/dist/server/_chunks/index-j0m1jxqa.js +1253 -0
- package/dist/server/_chunks/index-j2zrcp1k.js +66 -0
- package/dist/server/_chunks/index-j681c48a.js +2530 -0
- package/dist/server/_chunks/index-jbj7ehef.js +50 -0
- package/dist/server/_chunks/index-jcsjq3d1.js +20 -0
- package/dist/server/_chunks/index-jks0x0a1.js +14 -0
- package/dist/server/_chunks/index-jn9rbhrx.js +1599 -0
- package/dist/server/_chunks/index-jt8e1pje.js +12 -0
- package/dist/server/_chunks/index-kdhxpwyq.js +483 -0
- package/dist/server/_chunks/index-knp0s912.js +7 -0
- package/dist/server/_chunks/index-kqyy1d4f.js +50 -0
- package/dist/server/_chunks/index-kresp2n8.js +445 -0
- package/dist/server/_chunks/index-m63czgq5.js +590 -0
- package/dist/server/_chunks/index-ms9v9tnx.js +31 -0
- package/dist/server/_chunks/index-n4hxpng2.js +11 -0
- package/dist/server/_chunks/index-n629dy38.js +1071 -0
- package/dist/server/_chunks/index-nf3df4jy.js +266 -0
- package/dist/server/_chunks/index-nqh3xhdc.js +57 -0
- package/dist/server/_chunks/index-pym1cezq.js +39 -0
- package/dist/server/_chunks/index-q3r9z8mq.js +213 -0
- package/dist/server/_chunks/index-q738kkhj.js +100 -0
- package/dist/server/_chunks/index-qcrvt6er.js +112 -0
- package/dist/server/_chunks/index-qjj6gddn.js +54 -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-rgj5mx84.js +101 -0
- package/dist/server/_chunks/index-rjegyfx4.js +1435 -0
- package/dist/server/_chunks/index-rt9qq1va.js +4 -0
- package/dist/server/_chunks/index-rthrsed5.js +356 -0
- package/dist/server/_chunks/index-sq3kvz3g.js +200 -0
- package/dist/server/_chunks/index-stbk3jhn.js +31 -0
- package/dist/server/_chunks/index-tf4j19ge.js +130 -0
- package/dist/server/_chunks/index-tgcakdxc.js +125 -0
- package/dist/server/_chunks/index-tgsfjmep.js +74 -0
- package/dist/server/_chunks/index-tq1f96v7.js +51 -0
- package/dist/server/_chunks/index-tq3b39a5.js +107 -0
- package/dist/server/_chunks/index-typcbcsv.js +819 -0
- package/dist/server/_chunks/index-v1ags1na.js +132 -0
- package/dist/server/_chunks/index-vmr35jjw.js +170 -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-wm36rj4v.js +311 -0
- package/dist/server/_chunks/index-x0y005nh.js +283 -0
- package/dist/server/_chunks/index-x2m17v9c.js +6166 -0
- package/dist/server/_chunks/index-x3yn4ywm.js +22 -0
- package/dist/server/_chunks/index-x9c55pzy.js +871 -0
- package/dist/server/_chunks/index-xh1nbk46.js +1299 -0
- package/dist/server/_chunks/index-xvj80c3a.js +30 -0
- package/dist/server/_chunks/index-xywjg2vc.js +100 -0
- package/dist/server/_chunks/index-y4d02znn.js +66 -0
- package/dist/server/_chunks/index-y7mzvq2q.js +110 -0
- package/dist/server/_chunks/index-ye9hmsvf.js +47 -0
- package/dist/server/_chunks/index-yhxkxghe.js +56 -0
- package/dist/server/_chunks/index-yrjkqtfj.js +86 -0
- package/dist/server/_chunks/index-z88qv16t.js +11 -0
- package/dist/server/_chunks/index-zfrwq472.js +154 -0
- package/dist/server/_chunks/index-zqpqyg8p.js +666 -0
- package/dist/server/_chunks/loader-5en7wpt5.js +80 -0
- package/dist/server/_chunks/modules-t92favpj.js +76 -0
- package/dist/server/_chunks/pipeline-4t9q43ht.js +836 -0
- package/dist/server/_chunks/production-385bw8df.js +55 -0
- package/dist/server/_chunks/proxy-config-60gprphe.js +23 -0
- package/dist/server/_chunks/proxy-gfhmktbk.js +35 -0
- package/dist/server/_chunks/router-xnrva921.js +501 -0
- package/dist/server/_chunks/routes-ht868pdc.js +66 -0
- package/dist/server/_chunks/run-d40d63ag.js +697 -0
- package/dist/server/_chunks/server-2p8fgqq2.js +1839 -0
- package/dist/server/_chunks/tsconfig-defaults-bcn34eqb.js +21 -0
- package/dist/server/_chunks/typegen-dvtcjtaw.js +37 -0
- package/dist/server/api/client-cache.js +14 -0
- package/dist/server/cli/index.js +375 -0
- package/dist/server/cli/start.js +158 -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 +34 -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 +21 -0
- package/dist/server/compat/next/error.js +112 -0
- package/dist/server/compat/next/font/cache.js +16 -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 +24 -0
- package/dist/server/compat/next/font/runtime-client.js +33 -0
- package/dist/server/compat/next/font/runtime.js +43 -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 +15 -0
- package/dist/server/compat/next/link.js +14 -0
- package/dist/server/compat/next/navigation.js +191 -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 +32 -0
- package/dist/server/compat/next/resource-hints.js +30 -0
- package/dist/server/compat/next/rewrites.js +43 -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/reference/compat.md +1 -1
- package/reference/config.md +2 -2
- package/reference/dev.md +1 -1
- package/reference/getting-started.md +1 -1
- package/reference/rendering.md +4 -4
- package/src/api/dynamic.tsx +86 -4
- package/src/api/server.ts +24 -6
- package/src/cli/adapters/vercel-warm.ts +327 -62
- package/src/cli/adapters/vercel.ts +164 -1054
- package/src/cli/analyze.ts +3 -2
- package/src/cli/build/cache.ts +6 -6
- package/src/cli/build.ts +78 -45
- package/src/cli/index.ts +21 -3
- package/src/cli/serve/immutable.ts +31 -0
- package/src/cli/serve/pipeline.ts +97 -93
- package/src/cli/serve/standalone-worker.ts +8 -0
- package/src/cli/serve/standalone.ts +703 -0
- package/src/cli/start.ts +31 -8
- package/src/client/build.ts +1 -1
- package/src/client/chunk-fold.ts +19 -6
- package/src/client/react-tier.ts +3 -2
- package/src/client/reference-stub.ts +23 -36
- package/src/compat/actions/client-plugin.ts +4 -2
- package/src/compat/actions/config.ts +6 -5
- package/src/compat/actions/extensions.ts +5 -5
- 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/bundler/require-context.ts +2 -1
- package/src/compat/bundler/webpack-loaders.ts +3 -2
- package/src/compat/bundler/worker.ts +2 -2
- package/src/compat/cache-control.ts +16 -8
- package/src/compat/css/inline-css.ts +1 -1
- package/src/compat/css/modules.ts +18 -5
- package/src/compat/export/build-complete.ts +1 -1
- package/src/compat/export/emit.ts +4 -4
- package/src/compat/export/standalone.ts +30 -65
- package/src/compat/image-optimizer/optimize.ts +1 -1
- package/src/compat/lifecycle/error-funnel.ts +1 -1
- package/src/compat/lifecycle/instrumentation-client.ts +4 -3
- package/src/compat/lifecycle/instrumentation.ts +117 -24
- package/src/compat/lifecycle/testmode.ts +3 -2
- package/src/compat/metadata-artifacts.ts +1 -1
- package/src/compat/next/config-loader.ts +140 -13
- package/src/compat/next/dynamic.tsx +10 -23
- package/src/compat/next/font/cache.ts +2 -1
- package/src/compat/next/font/runtime.ts +23 -3
- 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/image.ts +1 -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/typecheck/check.ts +6 -4
- package/src/compat/validation/validate.ts +10 -7
- package/src/config.ts +76 -9
- package/src/css/assets.ts +213 -0
- package/src/css/build.ts +190 -247
- package/src/dev/client-chunk-store.ts +2 -1
- package/src/dev/restart/client-key.ts +2 -1
- package/src/dev/restart/global-css.ts +2 -1
- package/src/dev/restart/route-bundle-key.ts +2 -1
- package/src/dev/restart/route-facts.ts +2 -1
- package/src/dev/server.ts +34 -14
- package/src/extensions.ts +4 -0
- package/src/out-paths.ts +10 -0
- package/src/render/hooks.ts +13 -0
- package/src/render/renderer.ts +53 -33
- package/src/request/context.ts +9 -0
- package/src/resolve/dynamic.ts +7 -1
- package/src/resolve/engine.ts +2 -12
- package/src/resolve/imports.ts +12 -52
- package/src/resolve/package-json.ts +56 -0
- package/src/resolve/scan-facts.ts +250 -1
- package/src/routing/href.ts +10 -3
- package/src/routing/match.ts +287 -0
- package/src/routing/metadata-files.ts +20 -6
- 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 +218 -44
- package/src/runtime/module-cache.ts +15 -1
- package/src/runtime/modules.ts +405 -82
- package/src/runtime/prebundle.ts +101 -0
- package/src/runtime/production.ts +456 -0
- package/src/runtime/release-graph.ts +342 -0
- package/src/runtime/vendor-build.ts +750 -17
- package/src/runtime/vendor.ts +16 -3
- package/src/types.ts +4 -3
- package/src/utils/directive.ts +40 -0
- package/src/utils/fs.ts +95 -4
- package/src/utils/resource-query.ts +12 -0
- 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
|
+
}
|
package/src/runtime/loader.ts
CHANGED
|
@@ -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([...
|
|
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([...
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
372
|
-
|
|
373
|
-
|
|
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, '
|
|
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, '
|
|
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
|