@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { resolveManifest } from '../../utils/fs'
|
|
1
|
+
import { type ExactNames, exactNameIndex, hasExactName, resolveManifest } from '../../utils/fs'
|
|
2
2
|
/**
|
|
3
3
|
* The production request pipeline. Split out of `start.ts` so the prebundled
|
|
4
4
|
* server entry parses only what listening needs: this module (renderer,
|
|
@@ -14,10 +14,19 @@ import { Readable } from 'node:stream'
|
|
|
14
14
|
import { loadConfig, pathToFileHref } from '../../config'
|
|
15
15
|
import type { ResolvedConfig } from '../../config'
|
|
16
16
|
import { bootstrapCompat } from '../../compat-bootstrap'
|
|
17
|
-
import {
|
|
18
|
-
|
|
17
|
+
import {
|
|
18
|
+
importModuleOnce,
|
|
19
|
+
registerServerRuntime,
|
|
20
|
+
serverBundleTargetForRuntime,
|
|
21
|
+
} from '../../runtime/load'
|
|
19
22
|
import { abortUpstreamFetchOnDisconnect } from '../../runtime/fetch-host'
|
|
20
|
-
import { applyProxyResponse, createProxyRunner } from '../../routing/proxy'
|
|
23
|
+
import { applyProxyResponse, createProxyRunner, type ProxyRunnerOptions } from '../../routing/proxy'
|
|
24
|
+
import {
|
|
25
|
+
attachRelease,
|
|
26
|
+
buildManifestFile,
|
|
27
|
+
releaseFrameworkRoot,
|
|
28
|
+
releaseModuleHref,
|
|
29
|
+
} from '../../runtime/production'
|
|
21
30
|
import {
|
|
22
31
|
isPprShellUpgradeEligible,
|
|
23
32
|
renderGlobalNotFoundResponse,
|
|
@@ -32,15 +41,16 @@ import {
|
|
|
32
41
|
import {
|
|
33
42
|
canonicalTrailingSlashPath,
|
|
34
43
|
malformedUrlResponse,
|
|
44
|
+
repeatedSlashRedirect,
|
|
35
45
|
trailingSlashRedirect,
|
|
36
46
|
} from '../../routing/href'
|
|
37
47
|
import { type PeerAddressSource, withForwardedHeaders } from '../../routing/forwarded'
|
|
38
|
-
import { normalizePathname, parseNavState, selectRouteForRequest } from '../../routing/
|
|
48
|
+
import { normalizePathname, parseNavState, selectRouteForRequest } from '../../routing/match'
|
|
39
49
|
import { runWithCacheScope } from '../../request/cache'
|
|
40
50
|
import { metadataRouteHandlerModule } from '../../routing/metadata-files'
|
|
51
|
+
import { immutableAssetPath, immutableCacheControl } from './immutable'
|
|
41
52
|
import {
|
|
42
53
|
finalizeResponse,
|
|
43
|
-
getAssetExtensions,
|
|
44
54
|
getRenderExtensions,
|
|
45
55
|
getProxyExtensions,
|
|
46
56
|
getRequestExtensions,
|
|
@@ -55,13 +65,13 @@ import {
|
|
|
55
65
|
getWorkUnit,
|
|
56
66
|
runWithWorkUnit,
|
|
57
67
|
setPhase,
|
|
68
|
+
setWorkUnitRelease,
|
|
58
69
|
setWorkUnitRoute,
|
|
59
70
|
} from '../../request/context'
|
|
60
71
|
import { setRequestRuntime } from '../../routing/request-environment'
|
|
61
72
|
import { getRenderSpanExtensions } from '../../render/hooks'
|
|
62
|
-
import { publishEmittedAssets } from '../../css/
|
|
73
|
+
import { publishEmittedAssets } from '../../css/assets'
|
|
63
74
|
import { contentType } from '../../utils/content-type'
|
|
64
|
-
import { stopEsbuildService } from '../../utils/esbuild'
|
|
65
75
|
import { markErrorLogged } from '../../utils/error-log'
|
|
66
76
|
import type {
|
|
67
77
|
BuildManifest,
|
|
@@ -70,17 +80,6 @@ import type {
|
|
|
70
80
|
StaticFileMetadata,
|
|
71
81
|
} from '../../types'
|
|
72
82
|
|
|
73
|
-
/** Compat module-mode route hrefs are the only prod use of the dev import layer; keep it off the start graph. */
|
|
74
|
-
async function moduleHrefForRoute(
|
|
75
|
-
config: ResolvedConfig,
|
|
76
|
-
route: RouteManifestEntry,
|
|
77
|
-
): Promise<string> {
|
|
78
|
-
const { devServerModuleHref } = await import('../../runtime/modules')
|
|
79
|
-
return devServerModuleHref(config, route.file, 'build', {
|
|
80
|
-
conditionTarget: serverBundleTargetForRuntime(route.segmentConfig?.runtime),
|
|
81
|
-
})
|
|
82
|
-
}
|
|
83
|
-
|
|
84
83
|
/**
|
|
85
84
|
* The production request handler `pnext start` serves with. Exposed on its own
|
|
86
85
|
* so deployment adapters (e.g. Vercel) can serve the exact same pipeline
|
|
@@ -97,13 +96,30 @@ export async function createRequestHandler(
|
|
|
97
96
|
// extension registries when compat is enabled (no-op for pure-core apps).
|
|
98
97
|
// A prod server answers the very next request, so it takes both tiers here.
|
|
99
98
|
await bootstrapCompat(config)
|
|
100
|
-
const manifestPath =
|
|
99
|
+
const manifestPath = buildManifestFile(config.outPath)
|
|
101
100
|
// `start` reads the manifest before binding the port (a missing build must
|
|
102
101
|
// still fail there, not on the first request) and hands it over.
|
|
103
102
|
const manifest = resolveManifest(
|
|
104
103
|
options.manifest ?? (JSON.parse(await readFile(manifestPath, 'utf8')) as BuildManifest),
|
|
105
104
|
config.outPath,
|
|
106
105
|
config.root,
|
|
106
|
+
releaseFrameworkRoot(config.outPath),
|
|
107
|
+
)
|
|
108
|
+
// Everything a request imports comes from the build's release; each handler resolves once, here.
|
|
109
|
+
const release = attachRelease(config)
|
|
110
|
+
release.staticMetadataFiles = manifest.staticMetadataFiles
|
|
111
|
+
const handlerHrefs = new Map(
|
|
112
|
+
manifest.routes
|
|
113
|
+
.filter(route => route.kind === 'handler')
|
|
114
|
+
.map(route => [
|
|
115
|
+
route.id,
|
|
116
|
+
releaseModuleHref(
|
|
117
|
+
release,
|
|
118
|
+
'server',
|
|
119
|
+
serverBundleTargetForRuntime(route.segmentConfig?.runtime),
|
|
120
|
+
route.file,
|
|
121
|
+
),
|
|
122
|
+
]),
|
|
107
123
|
)
|
|
108
124
|
const persistManifest = async () => {
|
|
109
125
|
const stored = JSON.parse(await readFile(manifestPath, 'utf8')) as BuildManifest
|
|
@@ -120,6 +136,7 @@ export async function createRequestHandler(
|
|
|
120
136
|
// Content-hashed asset names, as the build emitted them: a render in THIS
|
|
121
137
|
// process must link the same files, not the logical `global.css` spelling.
|
|
122
138
|
publishEmittedAssets(config.outPath, manifest.assetNames)
|
|
139
|
+
const exactNames = exactNameIndex(config.outPath)
|
|
123
140
|
// Publish the live routing state the compat request interceptors (action
|
|
124
141
|
// dispatch, rewrites) read; prod loads the route table once.
|
|
125
142
|
setRequestRuntime({ config, routes: manifest.routes, dev: false })
|
|
@@ -127,6 +144,7 @@ export async function createRequestHandler(
|
|
|
127
144
|
compiledModuleHref: manifest.proxyModule
|
|
128
145
|
? pathToFileHref(path.resolve(config.outPath, manifest.proxyModule))
|
|
129
146
|
: undefined,
|
|
147
|
+
released: release.proxy as ProxyRunnerOptions['released'],
|
|
130
148
|
})
|
|
131
149
|
const routesById = new Map(manifest.routes.map(route => [route.id, route]))
|
|
132
150
|
const nextCompat = Boolean(config.compat?.next)
|
|
@@ -149,6 +167,7 @@ export async function createRequestHandler(
|
|
|
149
167
|
const route = routesById.get(metadata.routeId)
|
|
150
168
|
if (!route) return
|
|
151
169
|
await runWithWorkUnit('render', async () => {
|
|
170
|
+
setWorkUnitRelease(release)
|
|
152
171
|
const url = new URL(`http://pnext.local${pathname}`)
|
|
153
172
|
const params = routeParamsFromPath(route, pathname)
|
|
154
173
|
const fetchCache = route.segmentConfig?.fetchCache
|
|
@@ -156,11 +175,10 @@ export async function createRequestHandler(
|
|
|
156
175
|
if (route.kind === 'handler') {
|
|
157
176
|
setWorkUnitRoute('route-handler', 'isr', { revalidateReason: reason })
|
|
158
177
|
setPhase('handler')
|
|
159
|
-
registerServerRuntime(config, route.sourceFiles)
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
const module = await importModuleOnce<Parameters<typeof handleRouteModule>[0]>(href)
|
|
178
|
+
await registerServerRuntime(config, route.sourceFiles)
|
|
179
|
+
const module = await importModuleOnce<Parameters<typeof handleRouteModule>[0]>(
|
|
180
|
+
handlerHrefs.get(route.id)!,
|
|
181
|
+
)
|
|
164
182
|
const rendered = await getRenderExtensions().collectRenderMeta(
|
|
165
183
|
() =>
|
|
166
184
|
withRouteRuntime(route.segmentConfig?.runtime, () =>
|
|
@@ -255,7 +273,13 @@ export async function createRequestHandler(
|
|
|
255
273
|
|
|
256
274
|
setRequestExtensions({
|
|
257
275
|
onDemandRevalidatePath: async pathname => {
|
|
258
|
-
const built = await builtFileInfo(
|
|
276
|
+
const built = await builtFileInfo(
|
|
277
|
+
config.outPath,
|
|
278
|
+
pathname,
|
|
279
|
+
manifest.staticFiles,
|
|
280
|
+
false,
|
|
281
|
+
exactNames,
|
|
282
|
+
)
|
|
259
283
|
if (!built?.metadata) return
|
|
260
284
|
await runRegeneration(pathname, built.file, built.relative, built.metadata, 'on-demand')
|
|
261
285
|
},
|
|
@@ -269,6 +293,8 @@ export async function createRequestHandler(
|
|
|
269
293
|
request.method,
|
|
270
294
|
request.headers,
|
|
271
295
|
nextCompat,
|
|
296
|
+
manifest.publicAssets,
|
|
297
|
+
exactNames,
|
|
272
298
|
)
|
|
273
299
|
if (built) {
|
|
274
300
|
setWorkUnitRoute('html', 'static')
|
|
@@ -293,15 +319,13 @@ export async function createRequestHandler(
|
|
|
293
319
|
)
|
|
294
320
|
}
|
|
295
321
|
|
|
296
|
-
// The boot config compile is the only build work a prod server does; drop the
|
|
297
|
-
// resident esbuild service child (~10+ MB RSS) — it respawns if ever needed.
|
|
298
|
-
stopEsbuildService()
|
|
299
|
-
|
|
300
322
|
return function handleRequest(request: Request, server?: PeerAddressSource): Promise<Response> {
|
|
301
323
|
// One work unit spans the whole request; its after-queue flushes once the
|
|
302
324
|
// response fully closes (stream end, redirect, notFound, error, abort).
|
|
303
325
|
return runWithWorkUnit('render', async () => {
|
|
304
326
|
const unit = getWorkUnit()
|
|
327
|
+
// Every request is work of this release: app-directory facts come from it, never the disk.
|
|
328
|
+
setWorkUnitRelease(release)
|
|
305
329
|
try {
|
|
306
330
|
const raw = await handle(request, server)
|
|
307
331
|
const finalized = await finalizeResponse(
|
|
@@ -343,6 +367,8 @@ export async function createRequestHandler(
|
|
|
343
367
|
if (badRequest) return badRequest
|
|
344
368
|
request = withForwardedHeaders(request, server)
|
|
345
369
|
const requestedUrl = new URL(request.url)
|
|
370
|
+
const slashRedirect = repeatedSlashRedirect(requestedUrl)
|
|
371
|
+
if (slashRedirect) return slashRedirect
|
|
346
372
|
// assetPrefix is independent from basePath. Strip a path-style asset
|
|
347
373
|
// prefix first so `/cdn/_next/static/*` remains servable even when the app
|
|
348
374
|
// itself lives under a different basePath.
|
|
@@ -383,6 +409,11 @@ export async function createRequestHandler(
|
|
|
383
409
|
const revalidateBypass = Boolean(
|
|
384
410
|
bypassToken && request.headers.get('x-prerender-revalidate') === bypassToken,
|
|
385
411
|
)
|
|
412
|
+
// Trailing-slash normalization applies to the browser-visible (as-requested)
|
|
413
|
+
// URL, never to an internal rewrite destination, and precedes the proxy for
|
|
414
|
+
// every method as in Next: the proxy only ever sees canonical paths.
|
|
415
|
+
const canonicalRedirect = trailingSlashRedirect(config, requestedUrl)
|
|
416
|
+
if (canonicalRedirect) return canonicalRedirect
|
|
386
417
|
const canonicalUrl = new URL(request.url)
|
|
387
418
|
const canonicalHeaders = request.headers
|
|
388
419
|
let proxyResponse: Response | undefined
|
|
@@ -427,11 +458,6 @@ export async function createRequestHandler(
|
|
|
427
458
|
: new Request(canonicalRequestUrl, { headers: canonicalHeaders })
|
|
428
459
|
|
|
429
460
|
const method = request.method.toUpperCase()
|
|
430
|
-
// Trailing-slash normalization applies to the browser-visible (as-requested)
|
|
431
|
-
// URL, never to an internal rewrite destination. A middleware/next.config
|
|
432
|
-
// rewrite to `/en/` must render internally, not 308 the visitor to `/en`.
|
|
433
|
-
const canonicalRedirect = trailingSlashRedirect(config, requestedUrl, method)
|
|
434
|
-
if (canonicalRedirect) return applyProxyResponse(canonicalRedirect, proxyResponse)
|
|
435
461
|
// Soft navigations carry the client's parallel-route state; when the
|
|
436
462
|
// target involves slots, interception, or a host render, the response is
|
|
437
463
|
// state-dependent and must render dynamically (never from prebuilt html).
|
|
@@ -461,7 +487,13 @@ export async function createRequestHandler(
|
|
|
461
487
|
// rewrites it.
|
|
462
488
|
const built =
|
|
463
489
|
method === 'GET' || method === 'HEAD'
|
|
464
|
-
? await builtFileInfo(
|
|
490
|
+
? await builtFileInfo(
|
|
491
|
+
config.outPath,
|
|
492
|
+
url.pathname,
|
|
493
|
+
manifest.staticFiles,
|
|
494
|
+
nextCompat,
|
|
495
|
+
exactNames,
|
|
496
|
+
)
|
|
465
497
|
: null
|
|
466
498
|
const hardStaticStale =
|
|
467
499
|
built !== null &&
|
|
@@ -526,6 +558,8 @@ export async function createRequestHandler(
|
|
|
526
558
|
request.method,
|
|
527
559
|
request.headers,
|
|
528
560
|
nextCompat,
|
|
561
|
+
manifest.publicAssets,
|
|
562
|
+
exactNames,
|
|
529
563
|
)
|
|
530
564
|
if (staticFile && !(draftBypass && isHtmlResponse(staticFile))) {
|
|
531
565
|
const staticMode = servedBuilt.metadata?.revalidateSeconds !== undefined ? 'isr' : 'static'
|
|
@@ -594,7 +628,14 @@ export async function createRequestHandler(
|
|
|
594
628
|
// isOnDemandRevalidate semantics) and persist the fresh bytes so
|
|
595
629
|
// subsequent requests serve the regenerated static copy again.
|
|
596
630
|
const renderedHandler = await getRenderExtensions().collectRenderMeta(
|
|
597
|
-
() =>
|
|
631
|
+
() =>
|
|
632
|
+
handleRoute(
|
|
633
|
+
config,
|
|
634
|
+
matched.route,
|
|
635
|
+
handlerHrefs.get(matched.route.id)!,
|
|
636
|
+
canonicalRequest,
|
|
637
|
+
matched.params,
|
|
638
|
+
),
|
|
598
639
|
{
|
|
599
640
|
fetchCache: matched.route.segmentConfig?.fetchCache,
|
|
600
641
|
refreshFetches: staleOnDemand,
|
|
@@ -636,7 +677,7 @@ export async function createRequestHandler(
|
|
|
636
677
|
await mkdir(path.dirname(file), { recursive: true })
|
|
637
678
|
await writeFile(file, new Uint8Array(await handlerResponse.clone().arrayBuffer()))
|
|
638
679
|
const relative = path
|
|
639
|
-
.relative(path.join(config.outPath, '
|
|
680
|
+
.relative(path.join(config.outPath, 'static'), file)
|
|
640
681
|
.split(path.sep)
|
|
641
682
|
.join('/')
|
|
642
683
|
const routeRevalidate = matched.route.segmentConfig?.revalidate
|
|
@@ -812,7 +853,7 @@ export async function createRequestHandler(
|
|
|
812
853
|
await mkdir(path.dirname(file), { recursive: true })
|
|
813
854
|
await writeFile(file, await pageResponse.clone().text())
|
|
814
855
|
const relative = path
|
|
815
|
-
.relative(path.join(config.outPath, '
|
|
856
|
+
.relative(path.join(config.outPath, 'static'), file)
|
|
816
857
|
.split(path.sep)
|
|
817
858
|
.join('/')
|
|
818
859
|
manifest.staticFiles ??= {}
|
|
@@ -971,34 +1012,20 @@ function maybeCloseNodeFetchConnection(response: Response, request: Request) {
|
|
|
971
1012
|
return response
|
|
972
1013
|
}
|
|
973
1014
|
|
|
974
|
-
// Compat mode gate (a pure read of config.compat, no compat import): under
|
|
975
|
-
// compat the compiled module is loaded so bare next/* / react aliases resolve
|
|
976
|
-
// to the compat layer. Mirrors compat/aliases.ts reactCompatEnabled — kept inline
|
|
977
|
-
// so start.ts carries no static edge into compat.
|
|
978
|
-
function compatModuleMode(config: Awaited<ReturnType<typeof loadConfig>>): boolean {
|
|
979
|
-
return Boolean(config.compat?.next || config.compat?.react || config.compat?.reactCompiler)
|
|
980
|
-
}
|
|
981
|
-
|
|
982
1015
|
async function handleRoute(
|
|
983
1016
|
config: Awaited<ReturnType<typeof loadConfig>>,
|
|
984
1017
|
route: RouteManifestEntry,
|
|
1018
|
+
href: string,
|
|
985
1019
|
request: Request,
|
|
986
1020
|
params: Record<string, RouteParamValue>,
|
|
987
1021
|
) {
|
|
988
1022
|
return withRouteRuntime(route.segmentConfig?.runtime, async () => {
|
|
989
|
-
registerServerRuntime(config, route.sourceFiles)
|
|
1023
|
+
await registerServerRuntime(config, route.sourceFiles)
|
|
990
1024
|
// Module resolution and handler invocation run through the render-span seam
|
|
991
1025
|
// (compat/otel emits `resolve page components` + `executing api route`;
|
|
992
1026
|
// pass-through for pure-core apps).
|
|
993
1027
|
const spans = getRenderSpanExtensions()
|
|
994
1028
|
const module = await spans.withFindPageComponentsSpan(route.route, async () => {
|
|
995
|
-
// Compat mode loads the compiled module (aliases baked in): a raw import
|
|
996
|
-
// would resolve bare next/* specifiers (next/headers etc.) against whatever
|
|
997
|
-
// next package is installed instead of the compat layer — Bun's runtime
|
|
998
|
-
// onResolve plugin cannot alias bare imports. Same pattern as pageRender.
|
|
999
|
-
const href = compatModuleMode(config)
|
|
1000
|
-
? await moduleHrefForRoute(config, route)
|
|
1001
|
-
: new URL(`file://${route.file}`).href
|
|
1002
1029
|
const imported = await importModuleOnce<
|
|
1003
1030
|
RouteHandlerModule & Parameters<typeof metadataRouteHandlerModule>[0]
|
|
1004
1031
|
>(href)
|
|
@@ -1067,13 +1094,15 @@ async function builtFileInfo(
|
|
|
1067
1094
|
pathname: string,
|
|
1068
1095
|
staticFiles: Record<string, StaticFileMetadata> = {},
|
|
1069
1096
|
nextStaticFallback = false,
|
|
1097
|
+
exactNames?: ExactNames,
|
|
1070
1098
|
): Promise<BuiltFileInfo | null> {
|
|
1071
1099
|
const file = await firstFile(
|
|
1072
|
-
path.join(outPath, '
|
|
1100
|
+
path.join(outPath, 'static'),
|
|
1073
1101
|
builtFileCandidates(outPath, pathname, nextStaticFallback),
|
|
1102
|
+
exactNames,
|
|
1074
1103
|
)
|
|
1075
1104
|
if (!file) return null
|
|
1076
|
-
const publicPath = path.join(outPath, '
|
|
1105
|
+
const publicPath = path.join(outPath, 'static')
|
|
1077
1106
|
const fileStat = await stat(file)
|
|
1078
1107
|
const relative = path.relative(publicPath, file).split(path.sep).join('/')
|
|
1079
1108
|
return { file, relative, mtimeMs: fileStat.mtimeMs, metadata: staticFiles[relative] }
|
|
@@ -1087,7 +1116,7 @@ function builtFileCandidates(
|
|
|
1087
1116
|
pathname: string,
|
|
1088
1117
|
nextStaticFallback = false,
|
|
1089
1118
|
): string[] {
|
|
1090
|
-
const publicPath = path.join(outPath, '
|
|
1119
|
+
const publicPath = path.join(outPath, 'static')
|
|
1091
1120
|
const trimmed = pathname.replace(/^\/+/, '')
|
|
1092
1121
|
if (pathname === '/') return [path.join(publicPath, 'index.html')]
|
|
1093
1122
|
const candidates = [
|
|
@@ -1119,7 +1148,7 @@ function builtFileCandidates(
|
|
|
1119
1148
|
// Where a lazily generated page for `pathname` is persisted (mirrors the
|
|
1120
1149
|
// build's staticHtmlPath); null when the path would escape public/.
|
|
1121
1150
|
function lazyStaticHtmlPath(outPath: string, pathname: string): string | null {
|
|
1122
|
-
const publicPath = path.join(outPath, '
|
|
1151
|
+
const publicPath = path.join(outPath, 'static')
|
|
1123
1152
|
const file =
|
|
1124
1153
|
pathname === '/'
|
|
1125
1154
|
? path.join(publicPath, 'index.html')
|
|
@@ -1131,7 +1160,7 @@ function lazyStaticHtmlPath(outPath: string, pathname: string): string | null {
|
|
|
1131
1160
|
|
|
1132
1161
|
function lazyStaticHandlerPath(outPath: string, pathname: string): string | null {
|
|
1133
1162
|
if (pathname === '/') return null
|
|
1134
|
-
const publicPath = path.join(outPath, '
|
|
1163
|
+
const publicPath = path.join(outPath, 'static')
|
|
1135
1164
|
const file = path.join(publicPath, pathname.replace(/^\/+|\/+$/g, ''))
|
|
1136
1165
|
const relative = path.relative(publicPath, file)
|
|
1137
1166
|
if (relative.startsWith('..') || path.isAbsolute(relative)) return null
|
|
@@ -1195,14 +1224,17 @@ export async function maybeBuiltFile(
|
|
|
1195
1224
|
method = 'GET',
|
|
1196
1225
|
requestHeaders?: Headers,
|
|
1197
1226
|
nextStaticFallback = false,
|
|
1227
|
+
publicAssets: string[] = [],
|
|
1228
|
+
exactNames?: ExactNames,
|
|
1198
1229
|
) {
|
|
1199
1230
|
const normalizedMethod = method.toUpperCase()
|
|
1200
1231
|
if (normalizedMethod !== 'GET' && normalizedMethod !== 'HEAD') return null
|
|
1201
1232
|
|
|
1202
|
-
const publicPath = path.join(outPath, '
|
|
1233
|
+
const publicPath = path.join(outPath, 'static')
|
|
1203
1234
|
const file = await firstFile(
|
|
1204
1235
|
publicPath,
|
|
1205
1236
|
builtFileCandidates(outPath, pathname, nextStaticFallback),
|
|
1237
|
+
exactNames,
|
|
1206
1238
|
)
|
|
1207
1239
|
if (!file) return null
|
|
1208
1240
|
const relative = path.relative(publicPath, file).split(path.sep).join('/')
|
|
@@ -1219,7 +1251,8 @@ export async function maybeBuiltFile(
|
|
|
1219
1251
|
const variant = requestHeaders?.get('rsc') === '1' ? '-rsc' : ''
|
|
1220
1252
|
const etag = `W/"${fileStat.size.toString(16)}-${Math.trunc(fileStat.mtimeMs).toString(16)}${variant}"`
|
|
1221
1253
|
if (!headers.has('cache-control')) {
|
|
1222
|
-
|
|
1254
|
+
const immutable = immutableAssetPath(relative) && !publicAssets.includes(relative)
|
|
1255
|
+
headers.set('cache-control', immutable ? immutableCacheControl : 'no-cache')
|
|
1223
1256
|
headers.set('etag', etag)
|
|
1224
1257
|
if (requestHeaders?.get('if-none-match') === etag) {
|
|
1225
1258
|
return new Response(null, { status: 304, headers })
|
|
@@ -1344,40 +1377,11 @@ function cachedGzip(key: string, body: Buffer) {
|
|
|
1344
1377
|
return zipped
|
|
1345
1378
|
}
|
|
1346
1379
|
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
/**
|
|
1350
|
-
* Everything the build emits under `assets/` (served at `/_next/static/*` in
|
|
1351
|
-
* compat) is immutable, which is the promise Next makes for that whole
|
|
1352
|
-
* namespace. It holds because every one of those names carries a content hash:
|
|
1353
|
-
* esbuild's for chunks and fonts, assetContentHash for the route entries and the
|
|
1354
|
-
* stylesheets (see fingerprintClientEntries / fingerprintAsset), and a build id
|
|
1355
|
-
* for `_next/static/<id>/_*Manifest.js`. An UNHASHED name must never reach here —
|
|
1356
|
-
* the same URL would answer different bytes after a deploy, and every browser
|
|
1357
|
-
* that saw the old ones would keep them for a year.
|
|
1358
|
-
*
|
|
1359
|
-
* Route outputs (prerendered html, handler bodies) live outside both prefixes
|
|
1360
|
-
* and stay revalidating; the public/ tree the app ships is likewise untouched.
|
|
1361
|
-
*/
|
|
1362
|
-
export function immutableAssetPath(relativePath: string) {
|
|
1363
|
-
return immutableAssetPrefixes().some(prefix => relativePath.startsWith(prefix))
|
|
1364
|
-
}
|
|
1365
|
-
|
|
1366
|
-
/** The public-relative prefixes `immutableAssetPath` covers. */
|
|
1367
|
-
export function immutableAssetPrefixes() {
|
|
1368
|
-
return [
|
|
1369
|
-
'assets/',
|
|
1370
|
-
'_next/static/',
|
|
1371
|
-
...getAssetExtensions()
|
|
1372
|
-
.staticAssetPublicPrefixes()
|
|
1373
|
-
.map(prefix => prefix.replace(/^\/+/, '')),
|
|
1374
|
-
]
|
|
1375
|
-
}
|
|
1376
|
-
|
|
1377
|
-
async function firstFile(root: string, files: string[]) {
|
|
1380
|
+
async function firstFile(root: string, files: string[], exactNames?: ExactNames) {
|
|
1378
1381
|
for (const file of files) {
|
|
1379
1382
|
if (!isInside(root, file)) continue
|
|
1380
1383
|
if (!existsSync(file)) continue
|
|
1384
|
+
if (exactNames && !hasExactName(exactNames, root, path.relative(root, file))) continue
|
|
1381
1385
|
if ((await stat(file)).isFile()) return file
|
|
1382
1386
|
}
|
|
1383
1387
|
return null
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Traces the framework's standalone closure off the build's main thread (see startStandalone).
|
|
2
|
+
import { traceFramework } from './standalone'
|
|
3
|
+
|
|
4
|
+
declare const self: Worker
|
|
5
|
+
|
|
6
|
+
self.onmessage = async (event: MessageEvent) => {
|
|
7
|
+
self.postMessage(await traceFramework(event.data as Parameters<typeof traceFramework>[0]))
|
|
8
|
+
}
|