@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
|
@@ -26,27 +26,54 @@ import { resolveManifest } from '../../utils/fs'
|
|
|
26
26
|
* go-ahead to finish the rest once the manifest is written.
|
|
27
27
|
*/
|
|
28
28
|
import { existsSync } from 'node:fs'
|
|
29
|
-
import { readFile } from 'node:fs/promises'
|
|
29
|
+
import { mkdir, readFile, rm } from 'node:fs/promises'
|
|
30
30
|
import path from 'node:path'
|
|
31
31
|
import { fileURLToPath } from 'node:url'
|
|
32
|
-
import {
|
|
32
|
+
import {
|
|
33
|
+
DEFAULT_OUT_DIR,
|
|
34
|
+
loadConfig,
|
|
35
|
+
pathToFileHref,
|
|
36
|
+
standaloneOutSegment,
|
|
37
|
+
type ResolvedConfig,
|
|
38
|
+
} from '../../config'
|
|
33
39
|
import { bootstrapCompat } from '../../compat-bootstrap'
|
|
34
40
|
import { compiledClientReferenceFiles, ssrClientReference } from '../../client/reference'
|
|
41
|
+
import { hasUseClientDirective } from '../../client/reference-stub'
|
|
42
|
+
import { moduleExportNames } from '../../resolve/scan-facts'
|
|
43
|
+
import { globalCssSources } from '../../css/build'
|
|
35
44
|
import {
|
|
36
45
|
devClientModuleHref,
|
|
46
|
+
devModuleGraph,
|
|
37
47
|
devServerModuleHref,
|
|
38
48
|
setEmitCompiledSpecifiersManifest,
|
|
49
|
+
setReleaseCompile,
|
|
39
50
|
} from '../../runtime/modules'
|
|
40
51
|
import { getCompatModeExtensions } from '../../extensions'
|
|
41
|
-
import { getFontExtensions } from '../../render/hooks'
|
|
52
|
+
import { getFontExtensions, type ReleasedFont } from '../../render/hooks'
|
|
53
|
+
import { beginSourceScope, readSourceSync } from '../../resolve/source-text'
|
|
54
|
+
import { releasedProxy } from '../../routing/proxy-config'
|
|
42
55
|
import { findConventionFiles, findLayouts } from '../../routing/routes'
|
|
43
56
|
import {
|
|
44
|
-
|
|
57
|
+
pagesApiBundleTargetForRuntime,
|
|
45
58
|
registerServerRuntime,
|
|
46
59
|
serverBundleTargetForRuntime,
|
|
60
|
+
type ServerBundleTarget,
|
|
47
61
|
} from '../../runtime/loader'
|
|
48
|
-
import {
|
|
49
|
-
|
|
62
|
+
import {
|
|
63
|
+
BUILD_INDEX_VERSION,
|
|
64
|
+
type CompatRelease,
|
|
65
|
+
type ReleaseLayer,
|
|
66
|
+
captureConventions,
|
|
67
|
+
releaseModuleKey,
|
|
68
|
+
releaseSourceKey,
|
|
69
|
+
serializeReleaseConfig,
|
|
70
|
+
writeBuildIndex,
|
|
71
|
+
buildManifestFile,
|
|
72
|
+
buildIndexFile,
|
|
73
|
+
} from '../../runtime/production'
|
|
74
|
+
import { frameworkFingerprint } from '../../runtime/fingerprint'
|
|
75
|
+
import { releaseDependencyLog } from '../../runtime/vendor-build'
|
|
76
|
+
import { linkReleaseLayer, pruneReleaseVendor } from '../../runtime/release-graph'
|
|
50
77
|
import { namedBunBinary } from '../boot/named-bin'
|
|
51
78
|
import type { VerboseLogger } from '../../utils/verbose'
|
|
52
79
|
import type { BuildManifest } from '../../types'
|
|
@@ -69,6 +96,11 @@ const COMPILED_MARKER = 'pnext-warm-compiled'
|
|
|
69
96
|
interface WarmRequest {
|
|
70
97
|
/** Files a previous attempt already finished — or died on. */
|
|
71
98
|
skip: string[]
|
|
99
|
+
/** Release modules a previous attempt compiled, so the release this attempt writes is whole. */
|
|
100
|
+
compiled: Record<string, string>
|
|
101
|
+
/** Facts the parent already holds: the root layout's stylesheet closure and its own compiled client references. */
|
|
102
|
+
globalCss?: string[]
|
|
103
|
+
clientReferences: string[]
|
|
72
104
|
}
|
|
73
105
|
interface PrewarmRequest {
|
|
74
106
|
/** Page route sources, known from the route scan long before the manifest. */
|
|
@@ -106,7 +138,11 @@ export interface WarmChild {
|
|
|
106
138
|
* which is already the final set: the caller can start tracing the node_modules closure while the
|
|
107
139
|
* child runs handlers concurrently.
|
|
108
140
|
*/
|
|
109
|
-
finish(
|
|
141
|
+
finish(
|
|
142
|
+
log: VerboseLogger,
|
|
143
|
+
onCompiled?: (modules: string[]) => void,
|
|
144
|
+
facts?: Pick<WarmRequest, 'globalCss' | 'clientReferences'>,
|
|
145
|
+
): Promise<string[]>
|
|
110
146
|
/** Stop every attempt owned by this build. Safe to call after `finish` or more than once. */
|
|
111
147
|
kill(): void
|
|
112
148
|
}
|
|
@@ -150,8 +186,8 @@ export function startWarmChild(config: ResolvedConfig, mode: WarmMode = 'full'):
|
|
|
150
186
|
// broken pipe: the child is gone; `finish` reports why
|
|
151
187
|
}
|
|
152
188
|
},
|
|
153
|
-
finish: (log, onCompiled) =>
|
|
154
|
-
warmWithRestarts(first, spawn, mode, log, onCompiled).finally(kill),
|
|
189
|
+
finish: (log, onCompiled, facts = { clientReferences: [] }) =>
|
|
190
|
+
warmWithRestarts(first, spawn, mode, log, facts, onCompiled).finally(kill),
|
|
155
191
|
kill,
|
|
156
192
|
}
|
|
157
193
|
}
|
|
@@ -191,10 +227,11 @@ async function warmWithRestarts(
|
|
|
191
227
|
spawn: () => WarmProcess | undefined,
|
|
192
228
|
mode: WarmMode,
|
|
193
229
|
log: VerboseLogger,
|
|
230
|
+
facts: Pick<WarmRequest, 'globalCss' | 'clientReferences'>,
|
|
194
231
|
onCompiled?: (modules: string[]) => void,
|
|
195
232
|
) {
|
|
196
|
-
//
|
|
197
|
-
// finished, so a restart does not import them a second time.
|
|
233
|
+
// Release module key (or a handler's source file) -> compiled artifact. Handlers map to nothing
|
|
234
|
+
// but still count as finished, so a restart does not import them a second time.
|
|
198
235
|
const finished = new Map<string, string | undefined>()
|
|
199
236
|
const compiled = () => [...finished.values()].filter((file): file is string => Boolean(file))
|
|
200
237
|
// The marker can only mean "compiled set final" the first time it fires —
|
|
@@ -212,7 +249,13 @@ async function warmWithRestarts(
|
|
|
212
249
|
const before = finished.size
|
|
213
250
|
const failure = await runAttempt(
|
|
214
251
|
child,
|
|
215
|
-
{
|
|
252
|
+
{
|
|
253
|
+
skip: [...finished.keys()],
|
|
254
|
+
compiled: Object.fromEntries(
|
|
255
|
+
[...finished].filter((entry): entry is [string, string] => Boolean(entry[1])),
|
|
256
|
+
),
|
|
257
|
+
...facts,
|
|
258
|
+
},
|
|
216
259
|
finished,
|
|
217
260
|
fireOnCompiled,
|
|
218
261
|
)
|
|
@@ -317,8 +360,87 @@ function pageServerFiles(config: ResolvedConfig, routeFiles: Iterable<string>) {
|
|
|
317
360
|
return files
|
|
318
361
|
}
|
|
319
362
|
|
|
320
|
-
|
|
321
|
-
|
|
363
|
+
interface ReleaseEntry {
|
|
364
|
+
layer: ReleaseLayer
|
|
365
|
+
target: ServerBundleTarget
|
|
366
|
+
file: string
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/** Compile one release module, reporting it under its release key. */
|
|
370
|
+
async function compileEntry(
|
|
371
|
+
config: ResolvedConfig,
|
|
372
|
+
entry: ReleaseEntry,
|
|
373
|
+
compiled: Map<string, string>,
|
|
374
|
+
) {
|
|
375
|
+
const href =
|
|
376
|
+
entry.layer === 'client'
|
|
377
|
+
? await devClientModuleHref(config, entry.file, 'build', entry.target)
|
|
378
|
+
: await devServerModuleHref(config, entry.file, 'build', { conditionTarget: entry.target })
|
|
379
|
+
const key = releaseModuleKey(entry.layer, entry.target, entry.file)
|
|
380
|
+
compiled.set(key, fileURLToPath(href))
|
|
381
|
+
report(key, fileURLToPath(href))
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Every module a production server can import, by layer and target: each convention file of the app
|
|
386
|
+
* tree, each handler, and each client reference the render marks or SSRs.
|
|
387
|
+
*/
|
|
388
|
+
function releaseEntries(
|
|
389
|
+
config: ResolvedConfig,
|
|
390
|
+
routes: BuildManifest['routes'],
|
|
391
|
+
conventionFiles: string[],
|
|
392
|
+
clientReferences: Iterable<string>,
|
|
393
|
+
) {
|
|
394
|
+
const compat = getCompatModeExtensions().reactEnabled(config)
|
|
395
|
+
const entries = new Map<string, ReleaseEntry>()
|
|
396
|
+
const add = (layer: ReleaseLayer, target: ServerBundleTarget, file: string) =>
|
|
397
|
+
entries.set(releaseModuleKey(layer, target, file), { layer, target, file })
|
|
398
|
+
const addConvention = (target: ServerBundleTarget, file: string) => {
|
|
399
|
+
add('server', target, file)
|
|
400
|
+
if (compat && hasUseClientDirective(readSourceSync(file))) add('client', target, file)
|
|
401
|
+
}
|
|
402
|
+
const pageFiles = conventionFiles.filter(file => !path.basename(file).startsWith('route.'))
|
|
403
|
+
for (const file of pageFiles) addConvention('server', file)
|
|
404
|
+
const targets = new Set<ServerBundleTarget>(['server'])
|
|
405
|
+
for (const route of routes) {
|
|
406
|
+
const target = serverBundleTargetForRuntime(route.segmentConfig?.runtime)
|
|
407
|
+
targets.add(target)
|
|
408
|
+
if (route.kind === 'handler') {
|
|
409
|
+
add('server', target, route.file)
|
|
410
|
+
continue
|
|
411
|
+
}
|
|
412
|
+
if (target !== 'server') {
|
|
413
|
+
const dirs = [path.dirname(route.file), ...(route.slotDirs ?? [])]
|
|
414
|
+
for (const file of pageFiles) {
|
|
415
|
+
const dir = path.dirname(file)
|
|
416
|
+
if (dirs.some(owner => isInsideDir(dir, owner) || isInsideDir(owner, dir))) {
|
|
417
|
+
addConvention(target, file)
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
if (compat && route.client && existsSync(route.file)) add('client', target, route.file)
|
|
422
|
+
// Inline actions recover cold by importing their owning module by source key, helpers included.
|
|
423
|
+
if (compat) {
|
|
424
|
+
for (const file of route.sourceFiles) {
|
|
425
|
+
if (/\.[cm]?[jt]sx?$/.test(file) && readSourceSync(file).includes('use server')) {
|
|
426
|
+
add('server', 'server', file)
|
|
427
|
+
add('server', target, file)
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
for (const reference of route.clientReferences) {
|
|
432
|
+
if (ssrClientReference(reference)) add(compat ? 'client' : 'server', target, reference.file)
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
if (compat) {
|
|
436
|
+
for (const file of clientReferences) for (const target of targets) add('client', target, file)
|
|
437
|
+
}
|
|
438
|
+
return [...entries.values()]
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
function isInsideDir(dir: string, file: string) {
|
|
442
|
+
return file === dir || file.startsWith(`${dir}${path.sep}`)
|
|
443
|
+
}
|
|
322
444
|
|
|
323
445
|
/**
|
|
324
446
|
* Compile the page routes' server modules from the build's route scan, long before the manifest
|
|
@@ -326,29 +448,49 @@ const compileServer = (config: ResolvedConfig, file: string) =>
|
|
|
326
448
|
* pass below - the point is to spend this CPU under the build's client stage. Nothing here runs app
|
|
327
449
|
* code, so it is safe to overlap (see the handler note below).
|
|
328
450
|
*/
|
|
329
|
-
export async function prewarmPageModules(
|
|
330
|
-
|
|
451
|
+
export async function prewarmPageModules(
|
|
452
|
+
config: ResolvedConfig,
|
|
453
|
+
routeFiles: string[],
|
|
454
|
+
compiled = new Map<string, string>(),
|
|
455
|
+
) {
|
|
456
|
+
const { files } = captureConventions(config.root, config.appPath)
|
|
457
|
+
const entries = [
|
|
458
|
+
...new Set([...files.filter(file => !path.basename(file).startsWith('route.')), ...routeFiles]),
|
|
459
|
+
].filter(file => existsSync(file))
|
|
460
|
+
const compile = (layer: ReleaseLayer, file: string) =>
|
|
461
|
+
compileEntry(config, { layer, target: 'server', file }, compiled).catch(() => undefined)
|
|
462
|
+
await Promise.all(entries.map(file => compile('server', file)))
|
|
463
|
+
// The client components those entries reach are core's client references: publish them now, under
|
|
464
|
+
// the build, rather than after the manifest. Compat's client layer stays after the build's own
|
|
465
|
+
// prerender, whose vendor plan it must share.
|
|
466
|
+
if (getCompatModeExtensions().reactEnabled(config)) return
|
|
467
|
+
const graph = devModuleGraph(config)
|
|
468
|
+
const sources = await graph.graphSources(entries).catch(() => [])
|
|
331
469
|
await Promise.all(
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
470
|
+
sources.map(async ([file]) => {
|
|
471
|
+
if (/\.[cm]?[jt]sx?$/.test(file) && (await graph.isClientSource(file))) {
|
|
472
|
+
await compile('server', file)
|
|
473
|
+
}
|
|
474
|
+
}),
|
|
335
475
|
)
|
|
336
476
|
}
|
|
337
477
|
|
|
338
478
|
/**
|
|
339
|
-
* The warm pass itself, in the child.
|
|
340
|
-
*
|
|
479
|
+
* The warm pass itself, in the child. Compiles every release module, reporting each as it lands so a
|
|
480
|
+
* parent restart can step over one that takes the process down, then publishes the build index.
|
|
341
481
|
*/
|
|
342
482
|
export async function warmRouteModules(
|
|
343
483
|
config: ResolvedConfig,
|
|
344
484
|
manifest: BuildManifest,
|
|
345
|
-
|
|
485
|
+
request: Pick<WarmRequest, 'skip' | 'compiled' | 'globalCss' | 'clientReferences'>,
|
|
346
486
|
mode: WarmMode = 'full',
|
|
487
|
+
compiled = new Map<string, string>(),
|
|
347
488
|
) {
|
|
489
|
+
const skip = new Set(request.skip)
|
|
490
|
+
for (const [key, artifact] of Object.entries(request.compiled)) compiled.set(key, artifact)
|
|
348
491
|
const clientFiles = new Set<string>()
|
|
349
492
|
const handlers: BuildManifest['routes'] = []
|
|
350
493
|
const pages: BuildManifest['routes'] = []
|
|
351
|
-
const pageRoutes: string[] = []
|
|
352
494
|
|
|
353
495
|
for (const route of manifest.routes) {
|
|
354
496
|
if (route.kind === 'handler') {
|
|
@@ -356,7 +498,6 @@ export async function warmRouteModules(
|
|
|
356
498
|
continue
|
|
357
499
|
}
|
|
358
500
|
pages.push(route)
|
|
359
|
-
pageRoutes.push(route.file)
|
|
360
501
|
for (const reference of route.clientReferences) {
|
|
361
502
|
if (ssrClientReference(reference) && existsSync(reference.file)) {
|
|
362
503
|
clientFiles.add(reference.file)
|
|
@@ -364,41 +505,61 @@ export async function warmRouteModules(
|
|
|
364
505
|
}
|
|
365
506
|
}
|
|
366
507
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
508
|
+
const { conventions, files } = captureConventions(config.root, config.appPath)
|
|
509
|
+
const serverDir = path.join(config.outPath, 'server')
|
|
510
|
+
await mkdir(serverDir, { recursive: true })
|
|
511
|
+
// Compat's release facts (compiled config, handlers, instrumentation) build beside the module compile.
|
|
512
|
+
const compat = config.compat?.next
|
|
513
|
+
? import('../../compat/release').then(release => release.compatReleaseFacts(config, serverDir))
|
|
514
|
+
: Promise.resolve(undefined)
|
|
515
|
+
compat.catch(() => undefined)
|
|
516
|
+
const compileAll = (entries: ReleaseEntry[]) =>
|
|
517
|
+
Promise.all(
|
|
518
|
+
entries
|
|
519
|
+
.filter(entry => !compiled.has(releaseModuleKey(entry.layer, entry.target, entry.file)))
|
|
520
|
+
.map(entry => compileEntry(config, entry, compiled)),
|
|
521
|
+
)
|
|
522
|
+
await compileAll(releaseEntries(config, manifest.routes, files, request.clientReferences))
|
|
523
|
+
// Client references only a server compile discovers (a 'use client' module inside a package).
|
|
524
|
+
await compileAll(releaseEntries(config, manifest.routes, files, compiledClientReferenceFiles()))
|
|
525
|
+
const compatFacts = await compat
|
|
526
|
+
await compileAll(
|
|
527
|
+
Object.entries(compatFacts?.compat?.pagesApi ?? {}).map(([file, runtime]) => ({
|
|
528
|
+
layer: 'server',
|
|
529
|
+
target: pagesApiBundleTargetForRuntime(runtime),
|
|
530
|
+
file: path.resolve(config.root, file),
|
|
531
|
+
})),
|
|
532
|
+
)
|
|
533
|
+
const fonts = await releaseFonts(config, manifest.routes, compiled)
|
|
534
|
+
// One graph per App Router layer for the server dependencies the release imports.
|
|
535
|
+
const layerSources = new Map<string, string>()
|
|
536
|
+
const rsc = await linkReleaseLayer(config, 'server:server', [...compiled.values()], layerSources)
|
|
537
|
+
// The server graph can reach a package's 'use client' file no compile saw.
|
|
538
|
+
await compileAll(releaseEntries(config, manifest.routes, files, compiledClientReferenceFiles()))
|
|
539
|
+
const ssr = await linkReleaseLayer(config, 'client:client', [...compiled.values()], layerSources)
|
|
540
|
+
for (const [key, artifact] of compiled) {
|
|
541
|
+
const layer = key.startsWith('server:server:')
|
|
542
|
+
? rsc
|
|
543
|
+
: key.startsWith('client:server:')
|
|
544
|
+
? ssr
|
|
545
|
+
: undefined
|
|
546
|
+
const moved = layer?.moved.get(artifact)
|
|
547
|
+
if (moved) compiled.set(key, moved)
|
|
391
548
|
}
|
|
549
|
+
if (rsc || ssr) await pruneReleaseVendor(config, layerSources)
|
|
550
|
+
await rm(releaseDependencyLog(config), { force: true })
|
|
551
|
+
await writeRelease(
|
|
552
|
+
config,
|
|
553
|
+
compiled,
|
|
554
|
+
conventions,
|
|
555
|
+
files,
|
|
556
|
+
compatFacts ?? {},
|
|
557
|
+
fonts,
|
|
558
|
+
[...(rsc?.files ?? []), ...(ssr?.files ?? [])],
|
|
559
|
+
request.globalCss,
|
|
560
|
+
)
|
|
392
561
|
console.log(COMPILED_MARKER)
|
|
393
|
-
if (mode === 'compile')
|
|
394
|
-
// Transform is the tail of the compile pipeline: an artifact is transformed when it is first
|
|
395
|
-
// imported, so a server that skipped every compile would still start esbuild for this alone.
|
|
396
|
-
// The import pass below covers it in `full` mode; here it runs standalone, without app code.
|
|
397
|
-
for (const route of [...pages, ...handlers]) registerServerRuntime(config, route.sourceFiles)
|
|
398
|
-
const modules = cacheRoot(config.outPath)
|
|
399
|
-
await prewarmServerTransforms(modules, await listFiles(modules))
|
|
400
|
-
return
|
|
401
|
-
}
|
|
562
|
+
if (mode === 'compile') return
|
|
402
563
|
// Everything below runs the app's own code to capture what only an import
|
|
403
564
|
// writes (vendor bundles, next/font bytes). A normal build serves from a
|
|
404
565
|
// writable disk and creates those on demand; only a read-only deployment
|
|
@@ -506,11 +667,103 @@ async function importPageModules(
|
|
|
506
667
|
}
|
|
507
668
|
}
|
|
508
669
|
|
|
670
|
+
/**
|
|
671
|
+
* Resolve the app's next/font declarations for the release. A declaration only exists once its module
|
|
672
|
+
* evaluates, so the modules that call a font loader are imported here, as `next build` does.
|
|
673
|
+
*/
|
|
674
|
+
async function releaseFonts(
|
|
675
|
+
config: ResolvedConfig,
|
|
676
|
+
routes: BuildManifest['routes'],
|
|
677
|
+
compiled: Map<string, string>,
|
|
678
|
+
) {
|
|
679
|
+
if (!config.compat?.next) return undefined
|
|
680
|
+
const files = new Set(
|
|
681
|
+
routes
|
|
682
|
+
.flatMap(route => route.sourceFiles)
|
|
683
|
+
.filter(file => /\.(?:[cm]?[jt]sx?|mdx?)$/.test(file))
|
|
684
|
+
.filter(file => readSourceSync(file).includes('next/font/')),
|
|
685
|
+
)
|
|
686
|
+
if (files.size === 0) return undefined
|
|
687
|
+
for (const file of files) {
|
|
688
|
+
const entry = { layer: 'server', target: 'server', file } as const
|
|
689
|
+
await compileEntry(config, entry, compiled)
|
|
690
|
+
try {
|
|
691
|
+
await import(pathToFileHref(compiled.get(releaseModuleKey('server', 'server', file))!))
|
|
692
|
+
} catch (error) {
|
|
693
|
+
console.warn(`pnext build: importing ${file} for its fonts failed:`, error)
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
const fonts = await getFontExtensions().releaseFonts(config)
|
|
697
|
+
return Object.fromEntries(
|
|
698
|
+
Object.entries(fonts).map(([key, font]) => [
|
|
699
|
+
key,
|
|
700
|
+
{ ...font, files: font.files.map(file => path.relative(config.outPath, file)) },
|
|
701
|
+
]),
|
|
702
|
+
)
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
/** Publish the build index: every compiled module plus the source facts production reads instead of source. */
|
|
706
|
+
async function writeRelease(
|
|
707
|
+
config: ResolvedConfig,
|
|
708
|
+
compiled: ReadonlyMap<string, string>,
|
|
709
|
+
conventions: Record<string, string[]>,
|
|
710
|
+
conventionFiles: string[],
|
|
711
|
+
compat: CompatRelease,
|
|
712
|
+
fonts: Record<string, ReleasedFont> | undefined,
|
|
713
|
+
dependencies: string[],
|
|
714
|
+
globalCss = globalCssSources(config),
|
|
715
|
+
) {
|
|
716
|
+
const toPosix = (file: string) => file.split(path.sep).join('/')
|
|
717
|
+
const fromRoot = (file: string) => toPosix(path.relative(config.root, file))
|
|
718
|
+
const modules: Record<string, string> = {}
|
|
719
|
+
// Sorted: compiles land in completion order, and an unchanged build must publish identical bytes.
|
|
720
|
+
for (const [key, artifact] of [...compiled].sort(([a], [b]) => (a < b ? -1 : 1))) {
|
|
721
|
+
const match = /^((?:server|client):[^:]+:)(.*)$/s.exec(key)
|
|
722
|
+
if (!match) continue
|
|
723
|
+
modules[`${match[1]}${releaseSourceKey(match[2]!, config.root, config.workspaceRoot)}`] =
|
|
724
|
+
toPosix(path.relative(config.outPath, artifact))
|
|
725
|
+
}
|
|
726
|
+
const source = (file: string) => readSourceSync(file)
|
|
727
|
+
const proxy = releasedProxy(config)
|
|
728
|
+
await writeBuildIndex(config, {
|
|
729
|
+
version: BUILD_INDEX_VERSION,
|
|
730
|
+
framework: frameworkFingerprint(),
|
|
731
|
+
config: serializeReleaseConfig(config),
|
|
732
|
+
...compat,
|
|
733
|
+
modules,
|
|
734
|
+
conventions,
|
|
735
|
+
clientConventions: conventionFiles
|
|
736
|
+
.filter(file => hasUseClientDirective(source(file)))
|
|
737
|
+
.map(fromRoot),
|
|
738
|
+
documentLayouts: conventionFiles
|
|
739
|
+
.filter(
|
|
740
|
+
file =>
|
|
741
|
+
path.basename(file).startsWith('layout.') &&
|
|
742
|
+
moduleExportNames(source(file), file).includes('default'),
|
|
743
|
+
)
|
|
744
|
+
.map(fromRoot),
|
|
745
|
+
globalCss: globalCss.map(fromRoot),
|
|
746
|
+
...(proxy ? { proxy: { ...proxy, file: fromRoot(proxy.file) } } : {}),
|
|
747
|
+
...(fonts ? { fonts } : {}),
|
|
748
|
+
...(dependencies.length > 0
|
|
749
|
+
? { dependencies: dependencies.map(file => toPosix(path.relative(config.outPath, file))) }
|
|
750
|
+
: {}),
|
|
751
|
+
})
|
|
752
|
+
// A build that moved outDir leaves no default-dir release behind for `pnext start` to serve.
|
|
753
|
+
const defaultRelease = path.join(config.root, DEFAULT_OUT_DIR, standaloneOutSegment)
|
|
754
|
+
if (path.resolve(config.outPath) !== defaultRelease) {
|
|
755
|
+
await rm(buildIndexFile(defaultRelease), { force: true })
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
|
|
509
759
|
/**
|
|
510
760
|
* Read the parent's line-delimited requests until the `skip` message, running
|
|
511
761
|
* each prewarm batch as it arrives. Returns the final request.
|
|
512
762
|
*/
|
|
513
|
-
async function readWarmRequests(
|
|
763
|
+
async function readWarmRequests(
|
|
764
|
+
config: ResolvedConfig,
|
|
765
|
+
prewarmed: Map<string, string>,
|
|
766
|
+
): Promise<Partial<WarmRequest>> {
|
|
514
767
|
let buffer = ''
|
|
515
768
|
const decoder = new TextDecoder()
|
|
516
769
|
const reader = Bun.stdin.stream().getReader()
|
|
@@ -525,7 +778,7 @@ async function readWarmRequests(config: ResolvedConfig): Promise<Partial<WarmReq
|
|
|
525
778
|
if (!line) continue
|
|
526
779
|
const message = JSON.parse(line) as Partial<WarmRequest & PrewarmRequest>
|
|
527
780
|
if (message.skip) return message
|
|
528
|
-
if (message.prewarm) await prewarmPageModules(config, message.prewarm)
|
|
781
|
+
if (message.prewarm) await prewarmPageModules(config, message.prewarm, prewarmed)
|
|
529
782
|
}
|
|
530
783
|
}
|
|
531
784
|
const rest = buffer.trim()
|
|
@@ -542,20 +795,32 @@ if (import.meta.main) {
|
|
|
542
795
|
// Only the vercel adapter reads the specifier manifests back (its trace step);
|
|
543
796
|
// a plain build would write them for nothing.
|
|
544
797
|
setEmitCompiledSpecifiersManifest(mode === 'full')
|
|
798
|
+
setReleaseCompile(true)
|
|
799
|
+
// Idle until the route scan arrives: read the framework generation every compile keys on now.
|
|
800
|
+
frameworkFingerprint()
|
|
801
|
+
// One read per source for the child's life: its release facts re-read what the compile read.
|
|
802
|
+
beginSourceScope()
|
|
545
803
|
// Blocks until the parent sends the go-ahead, i.e. until the manifest is
|
|
546
804
|
// written; a prewarm batch may arrive and run before that.
|
|
547
|
-
const
|
|
805
|
+
const prewarmed = new Map<string, string>()
|
|
806
|
+
const request = await readWarmRequests(config, prewarmed)
|
|
548
807
|
// A build that fails closes stdin without a go-ahead and never writes the manifest. There is
|
|
549
808
|
// nothing to warm and nothing to report: exiting quietly keeps the failed build's own error the
|
|
550
809
|
// only thing on stderr.
|
|
551
|
-
const manifestFile =
|
|
810
|
+
const manifestFile = buildManifestFile(config.outPath)
|
|
552
811
|
if (!request.skip || !existsSync(manifestFile)) process.exit(0)
|
|
553
812
|
const manifest = resolveManifest(
|
|
554
813
|
JSON.parse(await readFile(manifestFile, 'utf8')) as BuildManifest,
|
|
555
814
|
config.outPath,
|
|
556
815
|
config.root,
|
|
557
816
|
)
|
|
558
|
-
await warmRouteModules(
|
|
817
|
+
await warmRouteModules(
|
|
818
|
+
config,
|
|
819
|
+
manifest,
|
|
820
|
+
{ skip: [], compiled: {}, clientReferences: [], ...request },
|
|
821
|
+
mode,
|
|
822
|
+
prewarmed,
|
|
823
|
+
)
|
|
559
824
|
// App code reached through a route handler can leave the loop alive (a db
|
|
560
825
|
// pool, a stray interval); the warm pass is done either way.
|
|
561
826
|
process.exit(0)
|