@wular/pnext 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/pnext +9 -2
- package/dist/server/_chunks/aliases-j47a10ce.js +44 -0
- package/dist/server/_chunks/analyze-arswqe6s.js +445 -0
- package/dist/server/_chunks/boot-af0mv3dy.js +36 -0
- package/dist/server/_chunks/build-spy3dxp4.js +84 -0
- package/dist/server/_chunks/build-t9h0hec3.js +3550 -0
- package/dist/server/_chunks/build-tier-m7yvqz61.js +2472 -0
- package/dist/server/_chunks/compile-53j02j27.js +22 -0
- package/dist/server/_chunks/config-1yzwexq6.js +27 -0
- package/dist/server/_chunks/config-n2z7yxps.js +22 -0
- package/dist/server/_chunks/create-meec9hs6.js +134 -0
- package/dist/server/_chunks/dev-fjmqg6en.js +220 -0
- package/dist/server/_chunks/esbuild-yyktfrtt.js +15 -0
- package/dist/server/_chunks/generate-n9sh6hzt.js +21 -0
- package/dist/server/_chunks/index-0374j2b9.js +66 -0
- package/dist/server/_chunks/index-06nyqntx.js +213 -0
- package/dist/server/_chunks/index-1011cscr.js +5263 -0
- package/dist/server/_chunks/index-11sfk4hb.js +170 -0
- package/dist/server/_chunks/index-20ppawv7.js +297 -0
- package/dist/server/_chunks/index-2dv4y4wd.js +1065 -0
- package/dist/server/_chunks/index-2vz0wzdn.js +59 -0
- package/dist/server/_chunks/index-2wfv4kvx.js +182 -0
- package/dist/server/_chunks/index-357na4a8.js +109 -0
- package/dist/server/_chunks/index-3b3at80h.js +109 -0
- package/dist/server/_chunks/index-3tf1xjsp.js +6166 -0
- package/dist/server/_chunks/index-3xbr4eyv.js +105 -0
- package/dist/server/_chunks/index-4399bvd2.js +18 -0
- package/dist/server/_chunks/index-4hgjrqh7.js +851 -0
- package/dist/server/_chunks/index-4q2gbfwk.js +2530 -0
- package/dist/server/_chunks/index-4t92hdxd.js +172 -0
- package/dist/server/_chunks/index-4zzebszd.js +10 -0
- package/dist/server/_chunks/index-5gyr4emz.js +107 -0
- package/dist/server/_chunks/index-5hr4062s.js +70 -0
- package/dist/server/_chunks/index-68m3mwbd.js +84 -0
- package/dist/server/_chunks/index-6b009mt0.js +56 -0
- package/dist/server/_chunks/index-6e4fqv30.js +588 -0
- package/dist/server/_chunks/index-6gex3pfa.js +15 -0
- package/dist/server/_chunks/index-6kp9r0d9.js +11 -0
- package/dist/server/_chunks/index-6q7zvrap.js +134 -0
- package/dist/server/_chunks/index-73z4esab.js +38 -0
- package/dist/server/_chunks/index-79ngvam8.js +60 -0
- package/dist/server/_chunks/index-7wc9n8be.js +25 -0
- package/dist/server/_chunks/index-8k7pfejn.js +1599 -0
- package/dist/server/_chunks/index-8kcxdfya.js +206 -0
- package/dist/server/_chunks/index-91x12ykq.js +274 -0
- package/dist/server/_chunks/index-9ch50vtq.js +18 -0
- package/dist/server/_chunks/index-9hx2641q.js +28 -0
- package/dist/server/_chunks/index-9n2914ww.js +535 -0
- package/dist/server/_chunks/index-9ych9ma8.js +207 -0
- package/dist/server/_chunks/index-b6wtkdp4.js +24 -0
- package/dist/server/_chunks/index-bcws5eh2.js +35 -0
- package/dist/server/_chunks/index-c0g2wf3z.js +92 -0
- package/dist/server/_chunks/index-cf4rvxv6.js +95 -0
- package/dist/server/_chunks/index-cjgqs13g.js +65 -0
- package/dist/server/_chunks/index-ckkdpht5.js +41 -0
- package/dist/server/_chunks/index-cyfednwb.js +87 -0
- package/dist/server/_chunks/index-danncfhy.js +311 -0
- package/dist/server/_chunks/index-dg0f05zs.js +199 -0
- package/dist/server/_chunks/index-e3a6yx84.js +18 -0
- package/dist/server/_chunks/index-e88tyv35.js +45 -0
- package/dist/server/_chunks/index-eajaspjk.js +1253 -0
- package/dist/server/_chunks/index-eeaanp2e.js +483 -0
- package/dist/server/_chunks/index-egykcqg3.js +101 -0
- package/dist/server/_chunks/index-en7n9f7m.js +22 -0
- package/dist/server/_chunks/index-ezgj0tr1.js +88 -0
- package/dist/server/_chunks/index-fkp000p1.js +590 -0
- package/dist/server/_chunks/index-fn1chkkd.js +214 -0
- package/dist/server/_chunks/index-fp8r0sqs.js +64 -0
- package/dist/server/_chunks/index-ggk2j965.js +9432 -0
- package/dist/server/_chunks/index-grta8ap3.js +238 -0
- package/dist/server/_chunks/index-h2a70tg4.js +7 -0
- package/dist/server/_chunks/index-h4xy648y.js +51 -0
- package/dist/server/_chunks/index-hkdfj58q.js +92 -0
- package/dist/server/_chunks/index-j2zrcp1k.js +66 -0
- package/dist/server/_chunks/index-jcsjq3d1.js +20 -0
- package/dist/server/_chunks/index-jepjvcrf.js +198 -0
- package/dist/server/_chunks/index-jks0x0a1.js +14 -0
- package/dist/server/_chunks/index-jx7bqvw1.js +57 -0
- package/dist/server/_chunks/index-k1g3epw0.js +1299 -0
- package/dist/server/_chunks/index-knp0s912.js +7 -0
- package/dist/server/_chunks/index-kq8kpzye.js +472 -0
- package/dist/server/_chunks/index-kqyy1d4f.js +50 -0
- package/dist/server/_chunks/index-kresp2n8.js +445 -0
- package/dist/server/_chunks/index-ms9v9tnx.js +31 -0
- package/dist/server/_chunks/index-n4hxpng2.js +11 -0
- package/dist/server/_chunks/index-ncnes8c6.js +17 -0
- package/dist/server/_chunks/index-nqh3xhdc.js +57 -0
- package/dist/server/_chunks/index-nyrba2kr.js +4130 -0
- package/dist/server/_chunks/index-p77b4kcx.js +296 -0
- package/dist/server/_chunks/index-pym1cezq.js +39 -0
- package/dist/server/_chunks/index-q738kkhj.js +100 -0
- package/dist/server/_chunks/index-qjj6gddn.js +54 -0
- package/dist/server/_chunks/index-qm6kmhqs.js +110 -0
- package/dist/server/_chunks/index-qn4z5s3c.js +819 -0
- package/dist/server/_chunks/index-qpwsgt3a.js +158 -0
- package/dist/server/_chunks/index-r97ptz1q.js +97 -0
- package/dist/server/_chunks/index-ras0sdab.js +26 -0
- package/dist/server/_chunks/index-rcs322t1.js +19 -0
- package/dist/server/_chunks/index-rn8dyr1f.js +126 -0
- package/dist/server/_chunks/index-rt9qq1va.js +4 -0
- package/dist/server/_chunks/index-rthrsed5.js +356 -0
- package/dist/server/_chunks/index-sctcgyvv.js +185 -0
- package/dist/server/_chunks/index-sjpckxqn.js +213 -0
- package/dist/server/_chunks/index-sq3kvz3g.js +200 -0
- package/dist/server/_chunks/index-stbk3jhn.js +31 -0
- package/dist/server/_chunks/index-sv8m6789.js +266 -0
- package/dist/server/_chunks/index-tgcakdxc.js +125 -0
- package/dist/server/_chunks/index-tgsfjmep.js +74 -0
- package/dist/server/_chunks/index-tq0pc7eg.js +154 -0
- package/dist/server/_chunks/index-tq1f96v7.js +51 -0
- package/dist/server/_chunks/index-tqn2qnnn.js +241 -0
- package/dist/server/_chunks/index-tvqkq6e6.js +128 -0
- package/dist/server/_chunks/index-v1ags1na.js +132 -0
- package/dist/server/_chunks/index-vvmmknm1.js +1431 -0
- package/dist/server/_chunks/index-vvq7rqtn.js +329 -0
- package/dist/server/_chunks/index-vz0km5qk.js +33 -0
- package/dist/server/_chunks/index-w6h8m6vp.js +138 -0
- package/dist/server/_chunks/index-web361b8.js +138 -0
- package/dist/server/_chunks/index-wpfhfbs4.js +194 -0
- package/dist/server/_chunks/index-x0y005nh.js +283 -0
- package/dist/server/_chunks/index-x3yn4ywm.js +22 -0
- package/dist/server/_chunks/index-x93hv0sc.js +271 -0
- package/dist/server/_chunks/index-xvj80c3a.js +30 -0
- package/dist/server/_chunks/index-xywjg2vc.js +100 -0
- package/dist/server/_chunks/index-y2jr2n72.js +152 -0
- package/dist/server/_chunks/index-y36a0ybw.js +57 -0
- package/dist/server/_chunks/index-ye9hmsvf.js +47 -0
- package/dist/server/_chunks/index-yhxkxghe.js +56 -0
- package/dist/server/_chunks/index-ym67zqxp.js +130 -0
- package/dist/server/_chunks/index-ytjvpbm2.js +736 -0
- package/dist/server/_chunks/index-yz54pxrh.js +960 -0
- package/dist/server/_chunks/index-z4z9zv3b.js +733 -0
- package/dist/server/_chunks/index-z84ab1w0.js +1270 -0
- package/dist/server/_chunks/index-z88qv16t.js +11 -0
- package/dist/server/_chunks/index-zqpqyg8p.js +666 -0
- package/dist/server/_chunks/loader-7yw0j98z.js +78 -0
- package/dist/server/_chunks/modules-jn8bmbn8.js +74 -0
- package/dist/server/_chunks/pipeline-yy9jhydf.js +832 -0
- package/dist/server/_chunks/production-jar9ztm3.js +44 -0
- package/dist/server/_chunks/proxy-config-j84dgksn.js +21 -0
- package/dist/server/_chunks/proxy-w1d0wmsn.js +33 -0
- package/dist/server/_chunks/router-k1reahfn.js +498 -0
- package/dist/server/_chunks/routes-2s277fc6.js +64 -0
- package/dist/server/_chunks/run-pvd8bs1t.js +696 -0
- package/dist/server/_chunks/server-mt4a994c.js +1835 -0
- package/dist/server/_chunks/tsconfig-defaults-1nb3308g.js +20 -0
- package/dist/server/_chunks/typegen-0qr0459b.js +35 -0
- package/dist/server/api/client-cache.js +14 -0
- package/dist/server/cli/index.js +378 -0
- package/dist/server/cli/start.js +137 -0
- package/dist/server/client/reference.js +16 -0
- package/dist/server/compat/next/cache.js +56 -0
- package/dist/server/compat/next/canonical-url.js +13 -0
- package/dist/server/compat/next/client-cache.js +57 -0
- package/dist/server/compat/next/client-navigation.js +232 -0
- package/dist/server/compat/next/client-only.js +1 -0
- package/dist/server/compat/next/client-script.js +178 -0
- package/dist/server/compat/next/client-server.js +34 -0
- package/dist/server/compat/next/config-headers.js +32 -0
- package/dist/server/compat/next/config-loader.js +25 -0
- package/dist/server/compat/next/config.js +10 -0
- package/dist/server/compat/next/constants.js +18 -0
- package/dist/server/compat/next/custom-server.js +10 -0
- package/dist/server/compat/next/dist/client/components/app-router-headers.js +48 -0
- package/dist/server/compat/next/dist/server/web/spec-extension/revalidate.js +27 -0
- package/dist/server/compat/next/dist/server/web/spec-extension/unstable-cache.js +25 -0
- package/dist/server/compat/next/dist/server/web/spec-extension/unstable-no-store.js +25 -0
- package/dist/server/compat/next/dynamic.js +32 -0
- package/dist/server/compat/next/error.js +112 -0
- package/dist/server/compat/next/font/cache.js +14 -0
- package/dist/server/compat/next/font/google.js +3 -0
- package/dist/server/compat/next/font/index.js +1 -0
- package/dist/server/compat/next/font/local.js +22 -0
- package/dist/server/compat/next/font/runtime-client.js +33 -0
- package/dist/server/compat/next/font/runtime.js +41 -0
- package/dist/server/compat/next/font/shared.js +22 -0
- package/dist/server/compat/next/form.js +129 -0
- package/dist/server/compat/next/head.js +10 -0
- package/dist/server/compat/next/headers.js +30 -0
- package/dist/server/compat/next/image/client.js +11 -0
- package/dist/server/compat/next/image/config.js +18 -0
- package/dist/server/compat/next/image/optimizer.js +25 -0
- package/dist/server/compat/next/image/patterns.js +12 -0
- package/dist/server/compat/next/image/props.js +16 -0
- package/dist/server/compat/next/image/shared.js +86 -0
- package/dist/server/compat/next/image/static-metadata.js +32 -0
- package/dist/server/compat/next/image/validate.js +8 -0
- package/dist/server/compat/next/image.js +59 -0
- package/dist/server/compat/next/index.js +1 -0
- package/dist/server/compat/next/legacy-image.js +78 -0
- package/dist/server/compat/next/legacy-request-apis.js +24 -0
- package/dist/server/compat/next/link-transform.js +14 -0
- package/dist/server/compat/next/link.js +14 -0
- package/dist/server/compat/next/navigation.js +190 -0
- package/dist/server/compat/next/offline.js +45 -0
- package/dist/server/compat/next/og.js +8 -0
- package/dist/server/compat/next/preferred-region.js +8 -0
- package/dist/server/compat/next/redirects.js +30 -0
- package/dist/server/compat/next/resource-hints.js +30 -0
- package/dist/server/compat/next/rewrites.js +41 -0
- package/dist/server/compat/next/root-params.js +121 -0
- package/dist/server/compat/next/route-state.js +23 -0
- package/dist/server/compat/next/router.js +103 -0
- package/dist/server/compat/next/script.js +37 -0
- package/dist/server/compat/next/server-only.js +1 -0
- package/dist/server/compat/next/server.js +131 -0
- package/dist/server/compat/next/svgr.js +14 -0
- package/dist/server/compat/next/telemetry.js +10 -0
- package/dist/server/compat/next/usage.js +13 -0
- package/dist/server/compat/next/user-agent.js +12 -0
- package/dist/server/compat/next/web-vitals.js +35 -0
- package/dist/server/compat/react/action-state.js +11 -0
- package/dist/server/compat/react/client-lite.js +83 -0
- package/dist/server/compat/react/client.js +131 -0
- package/dist/server/compat/react/compiler-runtime.js +42 -0
- package/dist/server/compat/react/dom-client.js +106 -0
- package/dist/server/compat/react/dom-react-server.js +37 -0
- package/dist/server/compat/react/dom-server.js +40 -0
- package/dist/server/compat/react/dom.js +52 -0
- package/dist/server/compat/react/hooks-extra.js +12 -0
- package/dist/server/compat/react/internals.js +14 -0
- package/dist/server/compat/react/parity.js +11 -0
- package/dist/server/compat/react/preact.js +113 -0
- package/dist/server/compat/react/react-server.js +133 -0
- package/dist/server/compat/react/router-shim.js +8 -0
- package/dist/server/compat/react/server-component-use.js +14 -0
- package/dist/server/compat/react/server-inserted-html.js +14 -0
- package/dist/server/compat/react/server.js +194 -0
- package/dist/server/compat/react/style-values.js +10 -0
- package/dist/server/compat/react/use.js +10 -0
- package/dist/server/compat/react/view-transition.js +12 -0
- package/dist/server/generation.json +1 -0
- package/package.json +4 -1
- package/src/api/dynamic.tsx +2 -0
- package/src/api/server.ts +24 -6
- package/src/cli/adapters/vercel-warm.ts +315 -61
- package/src/cli/adapters/vercel.ts +348 -71
- package/src/cli/build.ts +58 -33
- package/src/cli/index.ts +23 -10
- package/src/cli/serve/entry.ts +21 -159
- package/src/cli/serve/immutable.ts +31 -0
- package/src/cli/serve/pipeline.ts +82 -84
- package/src/cli/start.ts +3 -1
- package/src/client/chunk-fold.ts +19 -6
- package/src/client/react-tier.ts +3 -2
- package/src/client/reference-stub.ts +21 -2
- package/src/compat/actions/client-plugin.ts +4 -2
- package/src/compat/actions/config.ts +6 -5
- package/src/compat/actions/extensions.ts +2 -3
- package/src/compat/aliases.ts +8 -1
- package/src/compat/bundler/config.ts +88 -0
- package/src/compat/bundler/optimize-package-imports.ts +86 -26
- package/src/compat/bundler/relay-transform.ts +15 -3
- package/src/compat/cache-control.ts +16 -8
- package/src/compat/css/modules.ts +18 -5
- package/src/compat/lifecycle/error-funnel.ts +1 -1
- package/src/compat/lifecycle/instrumentation.ts +117 -24
- package/src/compat/lifecycle/testmode.ts +3 -2
- package/src/compat/next/config-loader.ts +137 -13
- package/src/compat/next/font/runtime.ts +22 -2
- package/src/compat/next/og.ts +3 -3
- package/src/compat/next/usage.ts +3 -2
- package/src/compat/pages/api.ts +83 -14
- package/src/compat/pages/router.ts +30 -14
- package/src/compat/register/bundler.ts +3 -1
- package/src/compat/register/middleware.ts +1 -1
- package/src/compat/register/otel.ts +5 -9
- package/src/compat/register/render.ts +3 -1
- package/src/compat/register/use-cache.ts +3 -1
- package/src/compat/release.ts +46 -0
- package/src/compat/segment/serve.ts +1 -1
- package/src/compat/validation/validate.ts +10 -7
- package/src/config.ts +51 -7
- package/src/css/assets.ts +213 -0
- package/src/css/build.ts +174 -238
- package/src/dev/server.ts +27 -8
- package/src/extensions.ts +4 -0
- package/src/render/hooks.ts +13 -0
- package/src/render/renderer.ts +52 -32
- package/src/request/context.ts +9 -0
- package/src/resolve/dynamic.ts +3 -1
- package/src/resolve/imports.ts +12 -52
- package/src/resolve/package-json.ts +56 -0
- package/src/resolve/scan-facts.ts +65 -0
- package/src/routing/href.ts +10 -3
- package/src/routing/match.ts +287 -0
- package/src/routing/metadata-files.ts +19 -5
- package/src/routing/proxy-config.ts +137 -0
- package/src/routing/proxy.ts +35 -134
- package/src/routing/routes.ts +22 -281
- package/src/runtime/fingerprint.ts +23 -8
- package/src/runtime/load.ts +170 -0
- package/src/runtime/loader.ts +215 -43
- package/src/runtime/module-cache.ts +13 -0
- package/src/runtime/modules.ts +370 -81
- package/src/runtime/prebundle.ts +81 -0
- package/src/runtime/production.ts +391 -0
- package/src/runtime/release-graph.ts +334 -0
- package/src/runtime/vendor-build.ts +724 -13
- package/src/runtime/vendor.ts +16 -3
- package/src/types.ts +2 -0
- package/src/utils/fs.ts +89 -3
package/src/runtime/vendor.ts
CHANGED
|
@@ -44,6 +44,7 @@ import { esbuildEntryExportNames, isIdentifier, uniqueIdentifier } from '../util
|
|
|
44
44
|
import { cachedExistsSync } from '../utils/fs-cache'
|
|
45
45
|
import { traceEnabled, traceValue } from '../utils/trace-flags'
|
|
46
46
|
import { writeFileAtomic } from '../utils/fs'
|
|
47
|
+
import { setPreplanDrain } from './load'
|
|
47
48
|
|
|
48
49
|
// --------------------------------------------------------------------------
|
|
49
50
|
// demand scheduling
|
|
@@ -61,6 +62,8 @@ export interface VendorGroupPlan {
|
|
|
61
62
|
key: string
|
|
62
63
|
/** The demanded subpath — the only thing a group is ever allowed to compile. */
|
|
63
64
|
member: VendorGroupMember
|
|
65
|
+
/** Unbuilt subpaths that must compile in the member's round: they reach a stateful file it reaches. */
|
|
66
|
+
companions?: () => Promise<VendorGroupMember[]>
|
|
64
67
|
/** `external` are siblings already on disk: referenced, never re-parsed. */
|
|
65
68
|
build: (
|
|
66
69
|
members: VendorGroupMember[],
|
|
@@ -455,10 +458,13 @@ function vendorGroupingEnabled() {
|
|
|
455
458
|
* may not even have installed), so compiling the published set fans one demand out into hundreds of
|
|
456
459
|
* foreign builds. A later sibling therefore grows the entry set and triggers another round;
|
|
457
460
|
* artifacts from earlier rounds stay valid and are referenced as externals, so a growth round costs
|
|
458
|
-
* what that sibling's own build would have cost.
|
|
461
|
+
* what that sibling's own build would have cost. The exception is `companions`: subpaths sharing a
|
|
462
|
+
* stateful file with the demand compile in its round, so that file is one chunk, one instance.
|
|
459
463
|
*/
|
|
460
464
|
async function joinVendorGroup(group: VendorGroupPlan, nested: boolean, ticket: VendorPromotable) {
|
|
461
465
|
if (!vendorGroupingEnabled()) return false
|
|
466
|
+
// Resolved before joining, so the companions land in the same round's snapshot.
|
|
467
|
+
const companions = (await group.companions?.()) ?? []
|
|
462
468
|
let state = vendorGroups.get(group.key)
|
|
463
469
|
if (!state) {
|
|
464
470
|
state = {
|
|
@@ -480,6 +486,12 @@ async function joinVendorGroup(group: VendorGroupPlan, nested: boolean, ticket:
|
|
|
480
486
|
return false
|
|
481
487
|
}
|
|
482
488
|
state.pending.set(specifier, group.member)
|
|
489
|
+
for (const companion of companions) {
|
|
490
|
+
const known = (members: Map<string, VendorGroupMember>) => members.has(companion.specifier)
|
|
491
|
+
if (!known(state.pending) && !known(state.produced) && !known(state.solo)) {
|
|
492
|
+
state.pending.set(companion.specifier, companion)
|
|
493
|
+
}
|
|
494
|
+
}
|
|
483
495
|
// While this demand waits on a shared round, promoting IT has to promote the
|
|
484
496
|
// round — that is the only work its result depends on.
|
|
485
497
|
const groupState = state
|
|
@@ -572,6 +584,7 @@ export async function drainPreplanBuilds() {
|
|
|
572
584
|
throw error
|
|
573
585
|
}
|
|
574
586
|
}
|
|
587
|
+
setPreplanDrain(drainPreplanBuilds)
|
|
575
588
|
|
|
576
589
|
/**
|
|
577
590
|
* Forget a bundle whose artifact turned out to be gone (a `pnext build` wiping
|
|
@@ -727,9 +740,9 @@ export function emittedExportNames(code: string): Set<string> | undefined {
|
|
|
727
740
|
* Republish a bundled CommonJS entry's named exports off its default export.
|
|
728
741
|
* Applied to the bundle itself (not a separate module) for the inlined case.
|
|
729
742
|
*/
|
|
730
|
-
export function addCommonJsNamedExports(code: string) {
|
|
743
|
+
export function addCommonJsNamedExports(code: string, body = code) {
|
|
731
744
|
if (hasNonDefaultExport(code)) return code
|
|
732
|
-
const names = [...new Set([...commonJsExportNames(
|
|
745
|
+
const names = [...new Set([...commonJsExportNames(body), ...esbuildEntryExportNames(body)])]
|
|
733
746
|
.filter(name => name !== 'default' && name !== '__esModule')
|
|
734
747
|
.sort()
|
|
735
748
|
if (names.length === 0) return code
|
package/src/types.ts
CHANGED
|
@@ -667,6 +667,8 @@ export interface BuildManifest {
|
|
|
667
667
|
staticFiles?: Record<string, StaticFileMetadata>
|
|
668
668
|
/** Logical build-asset name -> the content-hashed name emitted (`global.css` -> `global-<hash>.css`). */
|
|
669
669
|
assetNames?: Record<string, string>
|
|
670
|
+
/** App `public/` files under an immutable asset prefix; they stay revalidating. */
|
|
671
|
+
publicAssets?: string[]
|
|
670
672
|
staticMetadataFiles?: StaticMetadataFileEntry[]
|
|
671
673
|
staticModuleMetadata?: Record<string, StaticModuleMetadata>
|
|
672
674
|
staticRouteMetadata?: Record<string, StaticRouteMetadata>
|
package/src/utils/fs.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { existsSync, readdirSync, readFileSync } from 'node:fs'
|
|
1
|
+
import { type Dirent, existsSync, readdirSync, readFileSync } from 'node:fs'
|
|
2
2
|
import { mkdir, readdir, rename, rm, stat, readFile, writeFile } from 'node:fs/promises'
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { fileURLToPath } from 'node:url'
|
|
5
|
+
import { frozenDirListing } from '../runtime/production'
|
|
5
6
|
import type { BuildManifest } from '../types'
|
|
6
7
|
|
|
7
8
|
// Write-then-rename so a concurrent import never observes a truncated file; Bun caches a failed load for the
|
|
@@ -75,6 +76,8 @@ export function withDirCache<T>(run: () => T): T {
|
|
|
75
76
|
|
|
76
77
|
/** File and subdirectory names of `dir` (both empty when it does not exist). */
|
|
77
78
|
export function readDirListing(dir: string): DirListing {
|
|
79
|
+
const frozen = frozenDirListing(dir)
|
|
80
|
+
if (frozen) return frozen
|
|
78
81
|
const cached = dirListings?.get(dir)
|
|
79
82
|
if (cached) return cached
|
|
80
83
|
let listing: DirListing
|
|
@@ -94,6 +97,75 @@ export function readDirListing(dir: string): DirListing {
|
|
|
94
97
|
return listing
|
|
95
98
|
}
|
|
96
99
|
|
|
100
|
+
/** On-disk names per directory and recent wrong-case misses, kept by one server; undefined on a case-sensitive filesystem. */
|
|
101
|
+
export type ExactNames = { dirs: Map<string, Set<string>>; misses: Set<string> } | undefined
|
|
102
|
+
|
|
103
|
+
const maxExactNameMisses = 1024
|
|
104
|
+
|
|
105
|
+
/** Only a case-insensitive filesystem (macOS, Windows) needs `hasExactName`; one probe per server, on `dir`'s own mount. */
|
|
106
|
+
export function exactNameIndex(dir: string): ExactNames {
|
|
107
|
+
let entries: Dirent[] = []
|
|
108
|
+
try {
|
|
109
|
+
entries = readdirSync(dir, { withFileTypes: true })
|
|
110
|
+
} catch {
|
|
111
|
+
// Probe `dir` itself under its parent.
|
|
112
|
+
}
|
|
113
|
+
// A symlink's flipped name answers for its target, and a dangling one never exists.
|
|
114
|
+
const entry = entries.find(item => !item.isSymbolicLink() && hasCase(item.name))
|
|
115
|
+
const probe = entry ? path.join(dir, entry.name) : dir
|
|
116
|
+
const name = path.basename(probe)
|
|
117
|
+
if (!hasCase(name)) return undefined
|
|
118
|
+
return existsSync(path.join(path.dirname(probe), flipCase(name)))
|
|
119
|
+
? { dirs: new Map(), misses: new Set() }
|
|
120
|
+
: undefined
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function flipCase(name: string) {
|
|
124
|
+
return name === name.toUpperCase() ? name.toLowerCase() : name.toUpperCase()
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function hasCase(name: string) {
|
|
128
|
+
return flipCase(name) !== name
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Whether `relative` under `root` is spelled exactly as on disk (Next serves static files by exact name). */
|
|
132
|
+
export function hasExactName(names: NonNullable<ExactNames>, root: string, relative: string) {
|
|
133
|
+
let dir = root
|
|
134
|
+
for (const name of relative.split(path.sep)) {
|
|
135
|
+
const file = `${dir}${path.sep}${name}`
|
|
136
|
+
const listing = dirNames(names, dir)
|
|
137
|
+
// An unreadable directory fails this request only; nothing about it is remembered.
|
|
138
|
+
if (!listing) return false
|
|
139
|
+
if (!listing.has(name)) {
|
|
140
|
+
if (names.misses.has(file)) return false
|
|
141
|
+
// A miss re-reads the directory once: the server may have written the file since.
|
|
142
|
+
const fresh = dirNames(names, dir, true)
|
|
143
|
+
if (!fresh?.has(name)) {
|
|
144
|
+
if (fresh) {
|
|
145
|
+
if (names.misses.size >= maxExactNameMisses) names.misses.clear()
|
|
146
|
+
names.misses.add(file)
|
|
147
|
+
}
|
|
148
|
+
return false
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
dir = file
|
|
152
|
+
}
|
|
153
|
+
return true
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function dirNames(names: NonNullable<ExactNames>, dir: string, refresh = false) {
|
|
157
|
+
let entries = refresh ? undefined : names.dirs.get(dir)
|
|
158
|
+
if (!entries) {
|
|
159
|
+
try {
|
|
160
|
+
entries = new Set(readdirSync(dir))
|
|
161
|
+
} catch {
|
|
162
|
+
return undefined
|
|
163
|
+
}
|
|
164
|
+
names.dirs.set(dir, entries)
|
|
165
|
+
}
|
|
166
|
+
return entries
|
|
167
|
+
}
|
|
168
|
+
|
|
97
169
|
/** listFiles for callers already running synchronously (route fact scans). */
|
|
98
170
|
export function listFilesSync(root: string): string[] {
|
|
99
171
|
if (!existsSync(root)) return []
|
|
@@ -206,11 +278,22 @@ export function includeTypes(config: { include?: unknown }, files: string[], def
|
|
|
206
278
|
return added
|
|
207
279
|
}
|
|
208
280
|
|
|
281
|
+
// pnext's own files outside the app (a linked or store install) are named from the framework root,
|
|
282
|
+
// so a build moved to another machine finds them wherever pnext is installed there.
|
|
283
|
+
const frameworkRoot = path.resolve(import.meta.dirname, '..', '..')
|
|
284
|
+
const frameworkPrefix = 'pnext:'
|
|
285
|
+
|
|
209
286
|
/** Relativize only source-path fields while writing; build hooks keep absolute paths. */
|
|
210
287
|
export function serializeBuildManifest(data: BuildManifest): string {
|
|
211
288
|
const { root, appDir, outDir } = data
|
|
289
|
+
const relative = (file: string) => {
|
|
290
|
+
const inRoot = toPosixPath(path.relative(root, file))
|
|
291
|
+
if (!inRoot.startsWith('..')) return inRoot
|
|
292
|
+
const inFramework = toPosixPath(path.relative(frameworkRoot, file))
|
|
293
|
+
return inFramework.startsWith('..') ? inRoot : `${frameworkPrefix}${inFramework}`
|
|
294
|
+
}
|
|
212
295
|
const stored = {
|
|
213
|
-
...mapSourcePaths(data,
|
|
296
|
+
...mapSourcePaths(data, relative),
|
|
214
297
|
root: toPosixPath(path.relative(outDir, root)) || '.',
|
|
215
298
|
appDir: toPosixPath(path.relative(root, appDir)),
|
|
216
299
|
outDir: '.',
|
|
@@ -220,7 +303,10 @@ export function serializeBuildManifest(data: BuildManifest): string {
|
|
|
220
303
|
|
|
221
304
|
export function resolveManifest(data: BuildManifest, outPath: string, root: string): BuildManifest {
|
|
222
305
|
if (path.isAbsolute(data.root)) return data
|
|
223
|
-
const absolute = (file: string) =>
|
|
306
|
+
const absolute = (file: string) =>
|
|
307
|
+
file.startsWith(frameworkPrefix)
|
|
308
|
+
? path.join(frameworkRoot, file.slice(frameworkPrefix.length))
|
|
309
|
+
: path.join(root, file)
|
|
224
310
|
return {
|
|
225
311
|
...mapSourcePaths(data, absolute),
|
|
226
312
|
root,
|