@wular/pnext 0.0.4 → 0.0.6
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/README.md +11 -11
- package/bin/pnext +1 -1
- package/config/lint/base.js +7 -7
- package/config/ts/base.json +2 -4
- package/config/ts/react.json +2 -6
- package/package.json +23 -2
- package/reference/compat.md +1 -1
- package/reference/config.md +2 -2
- package/reference/css.md +13 -9
- package/reference/dev.md +1 -1
- package/reference/metadata.md +7 -7
- package/reference/navigation.md +35 -28
- package/reference/performance.md +70 -70
- package/reference/rendering.md +17 -17
- package/reference/routing.md +17 -17
- package/reference/typegen.md +12 -8
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +113 -109
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +49 -52
- package/src/api/navigation.ts +59 -58
- package/src/api/server.ts +152 -144
- package/src/api/suspense.ts +4 -4
- package/src/cli/adapters/vercel-warm.ts +126 -121
- package/src/cli/adapters/vercel.ts +437 -443
- package/src/cli/analyze.ts +333 -144
- package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
- package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
- package/src/cli/build.ts +976 -978
- package/src/cli/create.ts +71 -63
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +88 -85
- package/src/cli/migrate/package-json.ts +73 -71
- package/src/cli/migrate/report.ts +32 -33
- package/src/cli/migrate/{index.ts → run.ts} +48 -49
- package/src/cli/migrate/scan.ts +46 -46
- package/src/cli/migrate/spinner.ts +9 -9
- package/src/cli/migrate/tsconfig.ts +35 -35
- package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
- package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
- package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
- package/src/cli/start.ts +65 -66
- package/src/{typegen.ts → cli/typegen.ts} +59 -59
- package/src/client/build.ts +794 -768
- package/src/client/chunk-fold.ts +245 -240
- package/src/client/{paths.ts → chunk-name.ts} +6 -6
- package/src/client/entry.ts +162 -147
- package/src/client/prebuilt.ts +231 -223
- package/src/client/profile.ts +29 -29
- package/src/client/react-compiler.ts +20 -15
- package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
- package/src/client/reference-stub.ts +51 -51
- package/src/client/reference.ts +19 -19
- package/src/{api → client}/router/events.ts +17 -17
- package/src/{api → client}/router/history.ts +16 -16
- package/src/{api → client}/router/hub.ts +52 -53
- package/src/{api/router.ts → client/router/index.ts} +61 -60
- package/src/{api → client}/router/policies.ts +24 -24
- package/src/{api → client}/router/runtime.ts +1988 -1992
- package/src/{api → client}/router/types.ts +93 -98
- package/src/compat/actions/client-plugin.ts +42 -43
- package/src/compat/actions/client-stub.ts +14 -14
- package/src/compat/actions/{action-client.ts → client.ts} +194 -193
- package/src/compat/actions/config.ts +63 -64
- package/src/compat/actions/detect.ts +68 -68
- package/src/compat/actions/discovery.ts +105 -105
- package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
- package/src/compat/actions/early-submit.ts +1 -1
- package/src/compat/actions/endpoint.ts +198 -198
- package/src/compat/actions/extensions.ts +811 -0
- package/src/compat/actions/flight.ts +23 -23
- package/src/compat/actions/form-state.ts +34 -34
- package/src/compat/actions/hoist.ts +382 -236
- package/src/compat/actions/ids.ts +7 -12
- package/src/compat/actions/index.ts +8 -8
- package/src/compat/actions/instances.ts +46 -46
- package/src/compat/actions/origin.ts +47 -48
- package/src/compat/actions/protocol.ts +22 -22
- package/src/compat/actions/registry.ts +19 -19
- package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
- package/src/compat/actions/rewrite.ts +125 -125
- package/src/compat/actions/{action-router.ts → router.ts} +10 -10
- package/src/compat/actions/serve.ts +132 -136
- package/src/compat/actions/server-tag.ts +4 -4
- package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
- package/src/compat/actions/unrecognized-error.ts +4 -4
- package/src/compat/{index.ts → aliases.ts} +112 -109
- package/src/compat/bundler/bun-externals.ts +18 -18
- package/src/compat/bundler/cjs-exports.ts +271 -223
- package/src/compat/bundler/config.ts +116 -111
- package/src/compat/bundler/externals.ts +12 -12
- package/src/compat/bundler/import-meta-url.ts +19 -19
- package/src/compat/bundler/modularize-imports.ts +36 -33
- package/src/compat/bundler/new-url-asset.ts +22 -24
- package/src/compat/bundler/optimize-package-imports.ts +111 -107
- package/src/compat/bundler/polyfill.ts +28 -28
- package/src/compat/bundler/react-compiler.ts +35 -29
- package/src/compat/bundler/react-profiler.tsx +11 -11
- package/src/compat/bundler/relay-transform.ts +48 -47
- package/src/compat/bundler/require-context.ts +119 -113
- package/src/compat/bundler/resolve-extensions.ts +19 -19
- package/src/compat/bundler/source-cache.ts +25 -25
- package/src/compat/bundler/static-imports.ts +7 -7
- package/src/compat/bundler/symlink-imports.ts +46 -46
- package/src/compat/bundler/tsconfig-paths.ts +13 -15
- package/src/compat/bundler/wasm.ts +58 -60
- package/src/compat/bundler/webpack-loaders.ts +254 -241
- package/src/compat/bundler/worker.ts +101 -104
- package/src/compat/cache/build-flags.ts +29 -29
- package/src/compat/cache/build-prerender-errors.ts +40 -44
- package/src/compat/cache/custom-handler.ts +60 -53
- package/src/compat/cache/fetch-patch.ts +240 -240
- package/src/compat/cache/handler.ts +27 -31
- package/src/compat/cache/modern-handler.ts +148 -126
- package/src/compat/cache/resume-data-cache.ts +47 -45
- package/src/compat/cache/revalidate.ts +233 -232
- package/src/compat/cache/runtime-error.ts +35 -35
- package/src/compat/cache/use-cache-transform.ts +442 -417
- package/src/compat/cache/use-cache.ts +650 -614
- package/src/compat/cache-control.ts +140 -142
- package/src/compat/client/base-path.ts +21 -20
- package/src/compat/client/css-order.ts +18 -18
- package/src/compat/client/errors/bare-boundary.ts +11 -11
- package/src/compat/client/errors/control-flow.ts +23 -23
- package/src/compat/client/errors/error-boundary.ts +61 -61
- package/src/compat/client/errors/global-error.ts +101 -91
- package/src/compat/client/errors/install.ts +71 -72
- package/src/compat/client/errors/lazy.ts +23 -23
- package/src/compat/client/errors/primitive-throw.ts +47 -45
- package/src/compat/client/errors/soft-refresh.ts +4 -4
- package/src/compat/client/link-status.ts +33 -33
- package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
- package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
- package/src/compat/client/navigation-scroll.ts +63 -63
- package/src/compat/client/optimistic-routing.ts +93 -88
- package/src/compat/client/prefetch-cache.ts +23 -24
- package/src/compat/client/route-announcer.ts +35 -35
- package/src/compat/client/segment-cache-policy.ts +20 -20
- package/src/compat/client/segment-cache.ts +309 -315
- package/src/compat/client/segment-prefetch.ts +127 -132
- package/src/compat/client/trailing-slash.ts +5 -4
- package/src/compat/css/chunking.ts +113 -116
- package/src/compat/css/inline-css.ts +21 -21
- package/src/compat/css/lightningcss.ts +37 -38
- package/src/compat/css/modules.ts +161 -175
- package/src/compat/css/nonce.ts +7 -7
- package/src/compat/css/sass-plugin.ts +18 -21
- package/src/compat/css/sass.ts +150 -152
- package/src/compat/css/styled-jsx-runtime.ts +27 -27
- package/src/compat/css/styled-jsx.ts +21 -21
- package/src/compat/edge-runtime.ts +27 -27
- package/src/compat/{adapter → export}/build-complete.ts +72 -75
- package/src/compat/export/client.ts +29 -31
- package/src/compat/export/{index.ts → emit.ts} +111 -110
- package/src/compat/export/standalone.ts +62 -54
- package/src/compat/image-optimizer/cache.ts +51 -49
- package/src/compat/image-optimizer/detect.ts +52 -52
- package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
- package/src/compat/image-optimizer/source.ts +77 -80
- package/src/compat/lifecycle/after-scope.ts +26 -26
- package/src/compat/lifecycle/after.ts +48 -45
- package/src/compat/lifecycle/error-funnel.ts +98 -102
- package/src/compat/lifecycle/error-serialize.ts +30 -26
- package/src/compat/lifecycle/error-ui.ts +67 -32
- package/src/compat/lifecycle/instrumentation-client.ts +36 -38
- package/src/compat/lifecycle/instrumentation.ts +85 -85
- package/src/compat/lifecycle/node-console.ts +11 -11
- package/src/compat/lifecycle/testmode.ts +160 -132
- package/src/compat/mdx/compile.ts +60 -57
- package/src/compat/mdx/plugin.ts +11 -11
- package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
- package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
- package/src/compat/metadata.ts +75 -81
- package/src/compat/next/cache.ts +68 -69
- package/src/compat/next/canonical-url.ts +9 -9
- package/src/compat/next/client-cache.ts +19 -19
- package/src/compat/next/client-navigation.ts +112 -116
- package/src/compat/next/client-only.ts +1 -1
- package/src/compat/next/client-script.tsx +99 -93
- package/src/compat/next/client-server.ts +10 -10
- package/src/compat/next/config-loader.ts +176 -173
- package/src/compat/next/config.ts +7 -7
- package/src/compat/next/constants.cjs +6 -6
- package/src/compat/next/constants.ts +6 -6
- package/src/compat/next/custom-server.ts +26 -24
- package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
- package/src/compat/next/dynamic.tsx +21 -18
- package/src/compat/next/error.tsx +52 -52
- package/src/compat/next/font/cache.ts +74 -74
- package/src/compat/next/font/google.ts +2 -2
- package/src/compat/next/font/index.ts +1 -1
- package/src/compat/next/font/local.ts +3 -3
- package/src/compat/next/font/runtime-client.ts +17 -15
- package/src/compat/next/font/runtime.ts +443 -408
- package/src/compat/next/font/shared.ts +120 -108
- package/src/compat/next/form.tsx +63 -63
- package/src/compat/next/head.tsx +2 -2
- package/src/compat/next/headers.ts +103 -95
- package/src/compat/next/image/client.tsx +220 -0
- package/src/compat/next/image/config.ts +56 -58
- package/src/compat/next/image/optimizer.ts +40 -36
- package/src/compat/next/image/patterns.ts +37 -40
- package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
- package/src/compat/next/image/shared.ts +65 -57
- package/src/compat/next/image/static-metadata.ts +98 -107
- package/src/compat/next/image/validate.ts +79 -88
- package/src/compat/next/image.tsx +19 -23
- package/src/compat/next/index.ts +1 -1
- package/src/compat/next/legacy-image.tsx +59 -60
- package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
- package/src/compat/next/link.tsx +158 -158
- package/src/compat/next/navigation.cjs +12 -3
- package/src/compat/next/navigation.ts +48 -50
- package/src/compat/next/offline.ts +27 -27
- package/src/compat/next/og.ts +121 -124
- package/src/compat/next/preferred-region.ts +13 -14
- package/src/compat/next/redirects.ts +58 -56
- package/src/compat/next/resource-hints.ts +73 -76
- package/src/compat/next/rewrites.ts +130 -133
- package/src/compat/next/root-params.ts +45 -45
- package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
- package/src/compat/next/router.cjs +4 -2
- package/src/compat/next/router.ts +58 -61
- package/src/compat/next/script.tsx +108 -108
- package/src/compat/next/server-only.ts +1 -1
- package/src/compat/next/server.ts +19 -19
- package/src/compat/next/svgr.ts +18 -17
- package/src/compat/next/telemetry.ts +24 -24
- package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
- package/src/compat/next/user-agent.ts +53 -49
- package/src/compat/next/web-vitals.ts +22 -24
- package/src/compat/otel/api.ts +41 -41
- package/src/compat/otel/client-trace-metadata.ts +25 -27
- package/src/compat/otel/fetch-span.ts +29 -29
- package/src/compat/otel/tracer.ts +331 -331
- package/src/compat/pages/api.ts +456 -0
- package/src/compat/pages/client-plugin.ts +36 -36
- package/src/compat/pages/router-state.ts +34 -34
- package/src/compat/pages/{index.ts → router.ts} +130 -135
- package/src/compat/ppr/io.ts +12 -12
- package/src/compat/ppr/missing-root-params.ts +34 -38
- package/src/compat/ppr/root-params-scan.ts +66 -66
- package/src/compat/ppr/root-params-transform.ts +24 -26
- package/src/compat/ppr/root-params.ts +30 -30
- package/src/compat/ppr/segment-config-incompat.ts +6 -7
- package/src/compat/protocol.ts +71 -70
- package/src/compat/react/action-state.ts +47 -48
- package/src/compat/react/client-lite.ts +15 -15
- package/src/compat/react/client.ts +4 -4
- package/src/compat/react/compiler-runtime.ts +11 -11
- package/src/compat/react/dom-client.ts +44 -44
- package/src/compat/react/dom-react-server.ts +10 -16
- package/src/compat/react/dom-server.ts +10 -10
- package/src/compat/react/dom.ts +52 -52
- package/src/compat/react/hooks-extra.ts +34 -35
- package/src/compat/react/parity.ts +64 -61
- package/src/compat/react/preact.ts +81 -82
- package/src/compat/react/react-server.ts +28 -28
- package/src/compat/react/router-shim.ts +1 -1
- package/src/compat/react/server-component-use.ts +8 -8
- package/src/compat/react/server-inserted-html.ts +30 -31
- package/src/compat/react/server.ts +53 -55
- package/src/compat/react/use.ts +32 -32
- package/src/compat/react/view-transition.ts +20 -20
- package/src/compat/register/actions.ts +35 -824
- package/src/compat/register/boot.ts +41 -41
- package/src/compat/register/build-tier.ts +5 -5
- package/src/compat/register/build.ts +74 -70
- package/src/compat/register/bundler.ts +161 -156
- package/src/compat/register/cache.ts +20 -20
- package/src/compat/register/client-errors.ts +3 -3
- package/src/compat/register/config.ts +6 -6
- package/src/compat/register/css-extras.ts +30 -34
- package/src/compat/register/edge-runtime.ts +3 -3
- package/src/compat/register/errors.ts +10 -12
- package/src/compat/register/export.ts +16 -16
- package/src/compat/register/font.ts +11 -11
- package/src/compat/register/hooks.ts +2 -2
- package/src/compat/register/image.ts +40 -40
- package/src/compat/register/index.ts +59 -62
- package/src/compat/register/instrumentation-client.ts +10 -10
- package/src/compat/register/lifecycle.ts +25 -28
- package/src/compat/register/mdx.ts +10 -10
- package/src/compat/register/middleware.ts +226 -16
- package/src/compat/register/otel.ts +80 -88
- package/src/compat/register/pages-api.ts +10 -463
- package/src/compat/register/ppr.ts +16 -16
- package/src/compat/register/protocol.ts +17 -18
- package/src/compat/register/proxy.ts +49 -51
- package/src/compat/register/render.ts +79 -76
- package/src/compat/register/routing.ts +162 -159
- package/src/compat/register/segment.ts +24 -1897
- package/src/compat/register/static-image.ts +3 -3
- package/src/compat/register/{misc.ts → taint.ts} +9 -9
- package/src/compat/register/typed-routes.ts +14 -14
- package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
- package/src/compat/register/validation.ts +18 -18
- package/src/compat/segment/loading-boundary.ts +43 -45
- package/src/compat/segment/page-slot.ts +69 -69
- package/src/compat/segment/serve.ts +1884 -0
- package/src/compat/segment/tree.ts +113 -112
- package/src/compat/segment/vary-key.ts +38 -38
- package/src/compat/segment/vary-params.ts +138 -142
- package/src/compat/static-params.ts +14 -12
- package/src/compat/tsconfig-defaults.ts +87 -91
- package/src/compat/typecheck/{index.ts → check.ts} +234 -212
- package/src/compat/typecheck/worker.ts +15 -12
- package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
- package/src/compat/typed-routes/manifest.ts +174 -170
- package/src/compat/typed-routes/typegen.ts +127 -110
- package/src/compat/validation/errors.ts +16 -19
- package/src/compat/validation/prerender-diagnostics.ts +521 -504
- package/src/compat/validation/{index.ts → validate.ts} +647 -648
- package/src/compat-bootstrap.ts +16 -16
- package/src/config.ts +69 -69
- package/src/css/build.ts +230 -227
- package/src/css/postcss.ts +79 -80
- package/src/css/worker.ts +14 -15
- package/src/dev/client-actions.ts +10 -10
- package/src/dev/client-chunk-store.ts +27 -27
- package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
- package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
- package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
- package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
- package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
- package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
- package/src/dev/server.ts +804 -820
- package/src/env.ts +46 -43
- package/src/extensions.ts +491 -478
- package/src/index.ts +8 -8
- package/src/internal.ts +20 -23
- package/src/{islands → render}/boundary-error.ts +3 -3
- package/src/render/hooks.ts +71 -71
- package/src/render/island-context.ts +14 -14
- package/src/render/metadata.ts +310 -310
- package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
- package/src/{ppr.ts → render/ppr.ts} +244 -245
- package/src/render/renderer.ts +2076 -2082
- package/src/render/resource-hints.ts +16 -17
- package/src/render/slots.tsx +224 -235
- package/src/{islands → render}/static-children.ts +9 -12
- package/src/{islands → render}/static-slots.ts +37 -37
- package/src/{cache/context.ts → request/cache.ts} +20 -20
- package/src/request/context.ts +107 -107
- package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
- package/src/resolve/engine.ts +90 -77
- package/src/resolve/imports.ts +475 -463
- package/src/resolve/scan-facts.ts +318 -296
- package/src/resolve/source-text.ts +37 -37
- package/src/{dynamic → resolve}/tree-shake.ts +132 -128
- package/src/routing/forwarded.ts +19 -19
- package/src/routing/handler.ts +84 -91
- package/src/routing/href.ts +69 -70
- package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
- package/src/{proxy.ts → routing/proxy.ts} +306 -312
- package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
- package/src/routing/routes.ts +827 -815
- package/src/routing/slots.ts +164 -160
- package/src/runtime/loader.ts +952 -0
- package/src/{dev → runtime}/module-cache.ts +309 -287
- package/src/{dev → runtime}/module-generations.ts +9 -9
- package/src/{dev → runtime}/module-transform.ts +81 -72
- package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
- package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
- package/src/runtime/vendor.ts +425 -404
- package/src/styles.d.ts +9 -0
- package/src/types.ts +320 -335
- package/src/utils/ansi.ts +5 -5
- package/src/utils/{source.ts → code.ts} +15 -12
- package/src/utils/content-type.ts +3 -3
- package/src/utils/decode.ts +2 -2
- package/src/utils/dev-profile.ts +13 -13
- package/src/utils/error-log.ts +6 -6
- package/src/utils/esbuild.ts +18 -18
- package/src/utils/fs-cache.ts +13 -13
- package/src/utils/fs.ts +57 -49
- package/src/utils/html.ts +20 -24
- package/src/utils/native-require.ts +8 -8
- package/src/utils/serialize.ts +139 -146
- package/src/utils/verbose.ts +18 -18
- package/src/cli/analyze-print.ts +0 -181
- package/src/compat/middleware/manifest.ts +0 -210
- package/src/compat/next/image-client.tsx +0 -215
- package/src/compat/next/link-usage.ts +0 -29
- package/src/css/index.ts +0 -2
- package/src/render/index.ts +0 -1
- package/src/style-modules.d.ts +0 -9
|
@@ -10,26 +10,26 @@
|
|
|
10
10
|
// Wired as a server source transform (covering both the Bun runtime's per-file SSR loading and the
|
|
11
11
|
// esbuild server passes) and as a client source transform.
|
|
12
12
|
|
|
13
|
-
import { existsSync, readdirSync, statSync } from 'node:fs'
|
|
14
|
-
import path from 'node:path'
|
|
13
|
+
import { existsSync, readdirSync, statSync } from 'node:fs'
|
|
14
|
+
import path from 'node:path'
|
|
15
15
|
|
|
16
16
|
/** Extensions whose files also get an extension-less request key (webpack resolves both). */
|
|
17
|
-
const RESOLVABLE_EXTENSIONS = ['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs', '.json']
|
|
17
|
+
const RESOLVABLE_EXTENSIONS = ['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs', '.json']
|
|
18
18
|
|
|
19
19
|
// `require.context(` — also matches the TS-cast form the Next fixtures use,
|
|
20
20
|
// `(require as any).context(`, since the transform runs on pre-compiled source.
|
|
21
|
-
const CONTEXT_CALL = /(?:\(\s*require\s+as\s+[^)]*\)|\brequire)\s*\.\s*context\s*\(/g
|
|
21
|
+
const CONTEXT_CALL = /(?:\(\s*require\s+as\s+[^)]*\)|\brequire)\s*\.\s*context\s*\(/g
|
|
22
22
|
|
|
23
23
|
/** Cheap gate: does this source contain any candidate `require.context(` call? */
|
|
24
24
|
export function sourceHasRequireContext(source: string): boolean {
|
|
25
|
-
return source.includes('.context(') && source.includes('require')
|
|
25
|
+
return source.includes('.context(') && source.includes('require')
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
interface ContextEntry {
|
|
29
29
|
/** Request key, e.g. `./parent/file1.js`. */
|
|
30
|
-
key: string
|
|
30
|
+
key: string
|
|
31
31
|
/** Absolute path of the file the key resolves to. */
|
|
32
|
-
file: string
|
|
32
|
+
file: string
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
/**
|
|
@@ -37,98 +37,101 @@ interface ContextEntry {
|
|
|
37
37
|
* commas, ignoring commas nested in parens/brackets/braces, strings, regex
|
|
38
38
|
* literals and comments. Returns `undefined` when the parens never balance.
|
|
39
39
|
*/
|
|
40
|
-
function splitCallArguments(
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
let
|
|
46
|
-
let
|
|
40
|
+
function splitCallArguments(
|
|
41
|
+
source: string,
|
|
42
|
+
openIndex: number,
|
|
43
|
+
): { args: string[]; end: number } | undefined {
|
|
44
|
+
const args: string[] = []
|
|
45
|
+
let depth = 0
|
|
46
|
+
let start = openIndex + 1
|
|
47
|
+
let index = openIndex
|
|
48
|
+
let quote: string | undefined
|
|
49
|
+
let inRegex = false
|
|
47
50
|
while (index < source.length) {
|
|
48
|
-
const char = source[index]
|
|
49
|
-
const prev = source[index - 1]
|
|
51
|
+
const char = source[index]!
|
|
52
|
+
const prev = source[index - 1]
|
|
50
53
|
if (quote) {
|
|
51
|
-
if (char === quote && prev !== '\\') quote = undefined
|
|
54
|
+
if (char === quote && prev !== '\\') quote = undefined
|
|
52
55
|
} else if (inRegex) {
|
|
53
|
-
if (char === '/' && prev !== '\\') inRegex = false
|
|
56
|
+
if (char === '/' && prev !== '\\') inRegex = false
|
|
54
57
|
} else if (char === '"' || char === "'" || char === '`') {
|
|
55
|
-
quote = char
|
|
58
|
+
quote = char
|
|
56
59
|
} else if (char === '/' && source[index + 1] === '/') {
|
|
57
|
-
index = source.indexOf('\n', index)
|
|
58
|
-
if (index === -1) return undefined
|
|
60
|
+
index = source.indexOf('\n', index)
|
|
61
|
+
if (index === -1) return undefined
|
|
59
62
|
} else if (char === '/' && source[index + 1] === '*') {
|
|
60
|
-
const close = source.indexOf('*/', index + 2)
|
|
61
|
-
if (close === -1) return undefined
|
|
62
|
-
index = close + 1
|
|
63
|
+
const close = source.indexOf('*/', index + 2)
|
|
64
|
+
if (close === -1) return undefined
|
|
65
|
+
index = close + 1
|
|
63
66
|
} else if (char === '/' && depth > 0) {
|
|
64
67
|
// Inside the argument list a `/` can only start a regex literal (the
|
|
65
68
|
// division case would need a preceding operand, which no argument
|
|
66
69
|
// position of `require.context` produces).
|
|
67
|
-
inRegex = true
|
|
70
|
+
inRegex = true
|
|
68
71
|
} else if (char === '(' || char === '[' || char === '{') {
|
|
69
|
-
depth
|
|
72
|
+
depth++
|
|
70
73
|
} else if (char === ')' || char === ']' || char === '}') {
|
|
71
|
-
depth
|
|
74
|
+
depth--
|
|
72
75
|
if (depth === 0) {
|
|
73
|
-
args.push(source.slice(start, index))
|
|
74
|
-
const trimmed = args.map(arg => arg.trim())
|
|
75
|
-
return { args: trimmed.length === 1 && trimmed[0] === '' ? [] : trimmed, end: index }
|
|
76
|
+
args.push(source.slice(start, index))
|
|
77
|
+
const trimmed = args.map(arg => arg.trim())
|
|
78
|
+
return { args: trimmed.length === 1 && trimmed[0] === '' ? [] : trimmed, end: index }
|
|
76
79
|
}
|
|
77
80
|
} else if (char === ',' && depth === 1) {
|
|
78
|
-
args.push(source.slice(start, index))
|
|
79
|
-
start = index + 1
|
|
81
|
+
args.push(source.slice(start, index))
|
|
82
|
+
start = index + 1
|
|
80
83
|
}
|
|
81
|
-
index
|
|
84
|
+
index++
|
|
82
85
|
}
|
|
83
|
-
return undefined
|
|
86
|
+
return undefined
|
|
84
87
|
}
|
|
85
88
|
|
|
86
89
|
/** Parse a `/pattern/flags` literal; returns `undefined` for anything else. */
|
|
87
90
|
function parseRegExpLiteral(text: string): RegExp | undefined {
|
|
88
|
-
const match = /^\/((?:\\.|\[(?:\\.|[^\]])*\]|[^/])+)\/([a-z]*)$/.exec(text)
|
|
89
|
-
if (!match) return undefined
|
|
91
|
+
const match = /^\/((?:\\.|\[(?:\\.|[^\]])*\]|[^/])+)\/([a-z]*)$/.exec(text)
|
|
92
|
+
if (!match) return undefined
|
|
90
93
|
try {
|
|
91
|
-
return new RegExp(match[1]!, match[2]!.replace(/[gy]/g, ''))
|
|
94
|
+
return new RegExp(match[1]!, match[2]!.replace(/[gy]/g, ''))
|
|
92
95
|
} catch {
|
|
93
|
-
return undefined
|
|
96
|
+
return undefined
|
|
94
97
|
}
|
|
95
98
|
}
|
|
96
99
|
|
|
97
100
|
/** Parse a plain string literal argument; returns `undefined` for anything else. */
|
|
98
101
|
function parseStringLiteral(text: string): string | undefined {
|
|
99
|
-
const match = /^(['"`])((?:\\.|[^\\])*)\1$/.exec(text)
|
|
100
|
-
if (!match) return undefined
|
|
102
|
+
const match = /^(['"`])((?:\\.|[^\\])*)\1$/.exec(text)
|
|
103
|
+
if (!match) return undefined
|
|
101
104
|
try {
|
|
102
|
-
return JSON.parse(`"${match[2]!.replace(/"/g, '\\"').replace(/\\'/g, "'")}"`) as string
|
|
105
|
+
return JSON.parse(`"${match[2]!.replace(/"/g, '\\"').replace(/\\'/g, "'")}"`) as string
|
|
103
106
|
} catch {
|
|
104
|
-
return match[2]
|
|
107
|
+
return match[2]
|
|
105
108
|
}
|
|
106
109
|
}
|
|
107
110
|
|
|
108
111
|
function walkFiles(dir: string, recursive: boolean, prefix = ''): string[] {
|
|
109
|
-
let names: string[]
|
|
112
|
+
let names: string[]
|
|
110
113
|
try {
|
|
111
|
-
names = readdirSync(dir).sort()
|
|
114
|
+
names = readdirSync(dir).sort()
|
|
112
115
|
} catch {
|
|
113
|
-
return []
|
|
116
|
+
return []
|
|
114
117
|
}
|
|
115
|
-
const files: string[] = []
|
|
118
|
+
const files: string[] = []
|
|
116
119
|
for (const name of names) {
|
|
117
|
-
if (name.startsWith('.') || name === 'node_modules') continue
|
|
118
|
-
const full = path.join(dir, name)
|
|
119
|
-
let isDirectory = false
|
|
120
|
+
if (name.startsWith('.') || name === 'node_modules') continue
|
|
121
|
+
const full = path.join(dir, name)
|
|
122
|
+
let isDirectory = false
|
|
120
123
|
try {
|
|
121
|
-
isDirectory = statSync(full).isDirectory()
|
|
124
|
+
isDirectory = statSync(full).isDirectory()
|
|
122
125
|
} catch {
|
|
123
|
-
continue
|
|
126
|
+
continue
|
|
124
127
|
}
|
|
125
128
|
if (isDirectory) {
|
|
126
|
-
if (recursive) files.push(...walkFiles(full, recursive, `${prefix}${name}/`))
|
|
129
|
+
if (recursive) files.push(...walkFiles(full, recursive, `${prefix}${name}/`))
|
|
127
130
|
} else {
|
|
128
|
-
files.push(`${prefix}${name}`)
|
|
131
|
+
files.push(`${prefix}${name}`)
|
|
129
132
|
}
|
|
130
133
|
}
|
|
131
|
-
return files
|
|
134
|
+
return files
|
|
132
135
|
}
|
|
133
136
|
|
|
134
137
|
/**
|
|
@@ -138,23 +141,27 @@ function walkFiles(dir: string, recursive: boolean, prefix = ''): string[] {
|
|
|
138
141
|
* accepts everything AND the extension-less form of each resolvable file also
|
|
139
142
|
* becomes a key, since `require('./parent/file1')` resolves there too.
|
|
140
143
|
*/
|
|
141
|
-
export function requireContextEntries(
|
|
142
|
-
|
|
143
|
-
|
|
144
|
+
export function requireContextEntries(
|
|
145
|
+
dir: string,
|
|
146
|
+
recursive: boolean,
|
|
147
|
+
regExp?: RegExp,
|
|
148
|
+
): ContextEntry[] {
|
|
149
|
+
const entries: ContextEntry[] = []
|
|
150
|
+
const seen = new Set<string>()
|
|
144
151
|
for (const relative of walkFiles(dir, recursive)) {
|
|
145
|
-
const file = path.join(dir, ...relative.split('/'))
|
|
146
|
-
const keys = [`./${relative}`]
|
|
152
|
+
const file = path.join(dir, ...relative.split('/'))
|
|
153
|
+
const keys = [`./${relative}`]
|
|
147
154
|
if (!regExp && RESOLVABLE_EXTENSIONS.includes(path.extname(relative))) {
|
|
148
|
-
keys.push(`./${relative.slice(0, -path.extname(relative).length)}`)
|
|
155
|
+
keys.push(`./${relative.slice(0, -path.extname(relative).length)}`)
|
|
149
156
|
}
|
|
150
157
|
for (const key of keys) {
|
|
151
|
-
if (regExp && !regExp.test(key)) continue
|
|
152
|
-
if (seen.has(key)) continue
|
|
153
|
-
seen.add(key)
|
|
154
|
-
entries.push({ key, file })
|
|
158
|
+
if (regExp && !regExp.test(key)) continue
|
|
159
|
+
if (seen.has(key)) continue
|
|
160
|
+
seen.add(key)
|
|
161
|
+
entries.push({ key, file })
|
|
155
162
|
}
|
|
156
163
|
}
|
|
157
|
-
return entries.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0))
|
|
164
|
+
return entries.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0))
|
|
158
165
|
}
|
|
159
166
|
|
|
160
167
|
// Runtime helper injected alongside the expanded contexts. `ctx(key)` mirrors
|
|
@@ -186,7 +193,7 @@ const CONTEXT_RUNTIME = `function __pnext_require_context(entries, id) {
|
|
|
186
193
|
};
|
|
187
194
|
context.id = id;
|
|
188
195
|
return context;
|
|
189
|
-
}
|
|
196
|
+
}`
|
|
190
197
|
|
|
191
198
|
/**
|
|
192
199
|
* Resolve the context directory argument against the importing file. Server
|
|
@@ -200,22 +207,22 @@ function resolveContextDir(
|
|
|
200
207
|
file: string,
|
|
201
208
|
paths: { outPath?: string; workspaceRoot?: string } | undefined,
|
|
202
209
|
): string {
|
|
203
|
-
const direct = path.resolve(path.dirname(file), specifier)
|
|
204
|
-
if (existsSync(direct)) return direct
|
|
210
|
+
const direct = path.resolve(path.dirname(file), specifier)
|
|
211
|
+
if (existsSync(direct)) return direct
|
|
205
212
|
if (paths?.outPath && paths.workspaceRoot) {
|
|
206
|
-
const cacheRoot = path.join(paths.outPath, 'cache', 'server')
|
|
207
|
-
const relative = path.relative(cacheRoot, file)
|
|
213
|
+
const cacheRoot = path.join(paths.outPath, 'cache', 'server')
|
|
214
|
+
const relative = path.relative(cacheRoot, file)
|
|
208
215
|
if (relative && !relative.startsWith('..') && !path.isAbsolute(relative)) {
|
|
209
|
-
const segments = relative.split(path.sep)
|
|
210
|
-
segments.shift()
|
|
216
|
+
const segments = relative.split(path.sep)
|
|
217
|
+
segments.shift() // drop <profileDir>
|
|
211
218
|
const original = path.resolve(
|
|
212
219
|
path.dirname(path.join(paths.workspaceRoot, ...segments)),
|
|
213
220
|
specifier,
|
|
214
|
-
)
|
|
215
|
-
if (existsSync(original)) return original
|
|
221
|
+
)
|
|
222
|
+
if (existsSync(original)) return original
|
|
216
223
|
}
|
|
217
224
|
}
|
|
218
|
-
return direct
|
|
225
|
+
return direct
|
|
219
226
|
}
|
|
220
227
|
|
|
221
228
|
/**
|
|
@@ -229,53 +236,52 @@ export function rewriteRequireContextSource(
|
|
|
229
236
|
file: string,
|
|
230
237
|
paths?: { outPath?: string; workspaceRoot?: string },
|
|
231
238
|
): string {
|
|
232
|
-
if (!sourceHasRequireContext(source)) return source
|
|
233
|
-
const imports: string[] = []
|
|
234
|
-
const contexts: string[] = []
|
|
235
|
-
let output = ''
|
|
236
|
-
let cursor = 0
|
|
237
|
-
CONTEXT_CALL.lastIndex = 0
|
|
238
|
-
let match: RegExpExecArray | null
|
|
239
|
+
if (!sourceHasRequireContext(source)) return source
|
|
240
|
+
const imports: string[] = []
|
|
241
|
+
const contexts: string[] = []
|
|
242
|
+
let output = ''
|
|
243
|
+
let cursor = 0
|
|
244
|
+
CONTEXT_CALL.lastIndex = 0
|
|
245
|
+
let match: RegExpExecArray | null
|
|
239
246
|
while ((match = CONTEXT_CALL.exec(source))) {
|
|
240
|
-
const openIndex = match.index + match[0].length - 1
|
|
241
|
-
const parsed = splitCallArguments(source, openIndex)
|
|
242
|
-
if (!parsed) continue
|
|
243
|
-
const [dirArg, recursiveArg, regExpArg] = parsed.args
|
|
244
|
-
const specifier = dirArg === undefined ? undefined : parseStringLiteral(dirArg)
|
|
245
|
-
if (specifier === undefined) continue
|
|
246
|
-
const recursive = recursiveArg === undefined ? true : recursiveArg.trim() !== 'false'
|
|
247
|
-
const regExp = regExpArg === undefined ? undefined : parseRegExpLiteral(regExpArg.trim())
|
|
248
|
-
if (regExpArg !== undefined && !regExp) continue
|
|
247
|
+
const openIndex = match.index + match[0].length - 1
|
|
248
|
+
const parsed = splitCallArguments(source, openIndex)
|
|
249
|
+
if (!parsed) continue
|
|
250
|
+
const [dirArg, recursiveArg, regExpArg] = parsed.args
|
|
251
|
+
const specifier = dirArg === undefined ? undefined : parseStringLiteral(dirArg)
|
|
252
|
+
if (specifier === undefined) continue
|
|
253
|
+
const recursive = recursiveArg === undefined ? true : recursiveArg.trim() !== 'false'
|
|
254
|
+
const regExp = regExpArg === undefined ? undefined : parseRegExpLiteral(regExpArg.trim())
|
|
255
|
+
if (regExpArg !== undefined && !regExp) continue
|
|
249
256
|
|
|
250
|
-
const dir = resolveContextDir(specifier, file, paths)
|
|
251
|
-
const entries = requireContextEntries(dir, recursive, regExp)
|
|
252
|
-
const id = contexts.length
|
|
253
|
-
const binding = `__pnext_context_${id}
|
|
257
|
+
const dir = resolveContextDir(specifier, file, paths)
|
|
258
|
+
const entries = requireContextEntries(dir, recursive, regExp)
|
|
259
|
+
const id = contexts.length
|
|
260
|
+
const binding = `__pnext_context_${id}`
|
|
254
261
|
const rows = entries.map((entry, index) => {
|
|
255
|
-
const namespace = `${binding}_${index}
|
|
256
|
-
imports.push(`import * as ${namespace} from ${JSON.stringify(entry.file)};`)
|
|
257
|
-
return `[${JSON.stringify(entry.key)}, ${JSON.stringify(entry.file)}, ${namespace}]
|
|
258
|
-
})
|
|
259
|
-
const contextId = `${specifier} ${recursive ? 'recursive ' : ''}${regExp ? regExp.source : '^\\.\\/.*$'}
|
|
262
|
+
const namespace = `${binding}_${index}`
|
|
263
|
+
imports.push(`import * as ${namespace} from ${JSON.stringify(entry.file)};`)
|
|
264
|
+
return `[${JSON.stringify(entry.key)}, ${JSON.stringify(entry.file)}, ${namespace}]`
|
|
265
|
+
})
|
|
266
|
+
const contextId = `${specifier} ${recursive ? 'recursive ' : ''}${regExp ? regExp.source : '^\\.\\/.*$'}`
|
|
260
267
|
contexts.push(
|
|
261
268
|
`const ${binding} = __pnext_require_context([${rows.join(', ')}], ${JSON.stringify(contextId)});`,
|
|
262
|
-
)
|
|
263
|
-
output += source.slice(cursor, match.index) + binding
|
|
264
|
-
cursor = parsed.end + 1
|
|
265
|
-
CONTEXT_CALL.lastIndex = cursor
|
|
269
|
+
)
|
|
270
|
+
output += source.slice(cursor, match.index) + binding
|
|
271
|
+
cursor = parsed.end + 1
|
|
272
|
+
CONTEXT_CALL.lastIndex = cursor
|
|
266
273
|
}
|
|
267
|
-
if (contexts.length === 0) return source
|
|
268
|
-
output += source.slice(cursor)
|
|
269
|
-
const injection = [...imports, CONTEXT_RUNTIME, ...contexts].join('\n')
|
|
270
|
-
return injectAfterDirectives(output, injection)
|
|
274
|
+
if (contexts.length === 0) return source
|
|
275
|
+
output += source.slice(cursor)
|
|
276
|
+
const injection = [...imports, CONTEXT_RUNTIME, ...contexts].join('\n')
|
|
277
|
+
return injectAfterDirectives(output, injection)
|
|
271
278
|
}
|
|
272
279
|
|
|
273
280
|
// Injected declarations go after any leading directive prologue ('use client' /
|
|
274
281
|
// 'use server') and optional shebang so the directive stays the first statement.
|
|
275
282
|
function injectAfterDirectives(source: string, injection: string): string {
|
|
276
|
-
const prologue =
|
|
277
|
-
source
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
return `${source.slice(0, index)}${injection}\n${source.slice(index)}`;
|
|
283
|
+
const prologue =
|
|
284
|
+
/^(\uFEFF?(?:#![^\n]*\n)?(?:[ \t]*(['"])use [\w-]+\2[ \t]*;?[ \t]*(?:\r?\n|$))*)/.exec(source)
|
|
285
|
+
const index = prologue ? prologue[0].length : 0
|
|
286
|
+
return `${source.slice(0, index)}${injection}\n${source.slice(index)}`
|
|
281
287
|
}
|
|
@@ -9,17 +9,17 @@
|
|
|
9
9
|
// downstream plugin sees the same path it would for an explicit extension. Only registered when the app
|
|
10
10
|
// configures resolveExtensions.
|
|
11
11
|
|
|
12
|
-
import { existsSync, statSync } from 'node:fs'
|
|
13
|
-
import path from 'node:path'
|
|
14
|
-
import type { Plugin } from 'esbuild'
|
|
12
|
+
import { existsSync, statSync } from 'node:fs'
|
|
13
|
+
import path from 'node:path'
|
|
14
|
+
import type { Plugin } from 'esbuild'
|
|
15
15
|
|
|
16
|
-
const resolvedMarker = Symbol('pnext-resolve-extensions')
|
|
16
|
+
const resolvedMarker = Symbol('pnext-resolve-extensions')
|
|
17
17
|
|
|
18
18
|
function isFile(file: string): boolean {
|
|
19
19
|
try {
|
|
20
|
-
return statSync(file).isFile()
|
|
20
|
+
return statSync(file).isFile()
|
|
21
21
|
} catch {
|
|
22
|
-
return false
|
|
22
|
+
return false
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -34,15 +34,15 @@ export function clientResolveExtensionsPlugin(extensions: readonly string[]): Pl
|
|
|
34
34
|
setup(build) {
|
|
35
35
|
build.onResolve({ filter: /^\.\.?\// }, async args => {
|
|
36
36
|
if ((args.pluginData as Record<PropertyKey, unknown> | undefined)?.[resolvedMarker]) {
|
|
37
|
-
return undefined
|
|
37
|
+
return undefined
|
|
38
38
|
}
|
|
39
|
-
if (!args.resolveDir) return undefined
|
|
40
|
-
const base = path.resolve(args.resolveDir, args.path)
|
|
39
|
+
if (!args.resolveDir) return undefined
|
|
40
|
+
const base = path.resolve(args.resolveDir, args.path)
|
|
41
41
|
// An import that already names an existing file resolves as-is.
|
|
42
|
-
if (isFile(base)) return undefined
|
|
42
|
+
if (isFile(base)) return undefined
|
|
43
43
|
for (const extension of extensions) {
|
|
44
|
-
const candidate = `${base}${extension}
|
|
45
|
-
if (!isFile(candidate)) continue
|
|
44
|
+
const candidate = `${base}${extension}`
|
|
45
|
+
if (!isFile(candidate)) continue
|
|
46
46
|
// Re-dispatch with the extension made explicit so downstream
|
|
47
47
|
// onResolve plugins (static assets, css) match on it.
|
|
48
48
|
return build.resolve(`${args.path}${extension}`, {
|
|
@@ -51,25 +51,25 @@ export function clientResolveExtensionsPlugin(extensions: readonly string[]): Pl
|
|
|
51
51
|
namespace: args.namespace,
|
|
52
52
|
resolveDir: args.resolveDir,
|
|
53
53
|
pluginData: { ...(args.pluginData as object | undefined), [resolvedMarker]: true },
|
|
54
|
-
})
|
|
54
|
+
})
|
|
55
55
|
}
|
|
56
56
|
// Directory (index probe) or genuinely missing: preserve the probe
|
|
57
57
|
// order for index files too, then fall back to esbuild's resolution.
|
|
58
58
|
if (existsSync(base)) {
|
|
59
59
|
for (const extension of extensions) {
|
|
60
|
-
if (extension === '') continue
|
|
61
|
-
if (!isFile(path.join(base, `index${extension}`))) continue
|
|
60
|
+
if (extension === '') continue
|
|
61
|
+
if (!isFile(path.join(base, `index${extension}`))) continue
|
|
62
62
|
return build.resolve(`${args.path.replace(/\/$/, '')}/index${extension}`, {
|
|
63
63
|
kind: args.kind,
|
|
64
64
|
importer: args.importer,
|
|
65
65
|
namespace: args.namespace,
|
|
66
66
|
resolveDir: args.resolveDir,
|
|
67
67
|
pluginData: { ...(args.pluginData as object | undefined), [resolvedMarker]: true },
|
|
68
|
-
})
|
|
68
|
+
})
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
-
return undefined
|
|
72
|
-
})
|
|
71
|
+
return undefined
|
|
72
|
+
})
|
|
73
73
|
},
|
|
74
|
-
}
|
|
74
|
+
}
|
|
75
75
|
}
|
|
@@ -7,40 +7,40 @@
|
|
|
7
7
|
* for the life of the process (the same assumption the vendor artifact cache makes), and anything
|
|
8
8
|
* else is keyed on mtime + size so an edit is never served from the memo.
|
|
9
9
|
*/
|
|
10
|
-
import { statSync } from 'node:fs'
|
|
11
|
-
import path from 'node:path'
|
|
10
|
+
import { statSync } from 'node:fs'
|
|
11
|
+
import path from 'node:path'
|
|
12
12
|
|
|
13
|
-
const NODE_MODULES = `${path.sep}node_modules${path.sep}
|
|
13
|
+
const NODE_MODULES = `${path.sep}node_modules${path.sep}`
|
|
14
14
|
|
|
15
15
|
interface Entry<T> {
|
|
16
|
-
stamp: string
|
|
17
|
-
value: T
|
|
16
|
+
stamp: string
|
|
17
|
+
value: T
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
/** mtime+size stamp, or '' for a file whose contents cannot change here. */
|
|
21
21
|
function stamp(file: string) {
|
|
22
|
-
if (file.includes(NODE_MODULES)) return ''
|
|
22
|
+
if (file.includes(NODE_MODULES)) return ''
|
|
23
23
|
try {
|
|
24
|
-
const info = statSync(file)
|
|
25
|
-
return `${info.mtimeMs}\0${info.size}
|
|
24
|
+
const info = statSync(file)
|
|
25
|
+
return `${info.mtimeMs}\0${info.size}`
|
|
26
26
|
} catch {
|
|
27
27
|
// A missing file is a real answer for the callers here (they all catch), so
|
|
28
28
|
// it is cached like any other — under a stamp no live file can produce.
|
|
29
|
-
return 'missing'
|
|
29
|
+
return 'missing'
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/** A memo whose entries are recomputed when their file changes on disk. */
|
|
34
34
|
export function fileMemo<T>(compute: (file: string) => T) {
|
|
35
|
-
const entries = new Map<string, Entry<T>>()
|
|
35
|
+
const entries = new Map<string, Entry<T>>()
|
|
36
36
|
return (file: string): T => {
|
|
37
|
-
const current = stamp(file)
|
|
38
|
-
const cached = entries.get(file)
|
|
39
|
-
if (cached?.stamp === current) return cached.value
|
|
40
|
-
const value = compute(file)
|
|
41
|
-
entries.set(file, { stamp: current, value })
|
|
42
|
-
return value
|
|
43
|
-
}
|
|
37
|
+
const current = stamp(file)
|
|
38
|
+
const cached = entries.get(file)
|
|
39
|
+
if (cached?.stamp === current) return cached.value
|
|
40
|
+
const value = compute(file)
|
|
41
|
+
entries.set(file, { stamp: current, value })
|
|
42
|
+
return value
|
|
43
|
+
}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
/**
|
|
@@ -49,13 +49,13 @@ export function fileMemo<T>(compute: (file: string) => T) {
|
|
|
49
49
|
* use - awaiting one lets the other builds' callbacks interleave with it.
|
|
50
50
|
*/
|
|
51
51
|
export function fileMemoAsync<T>(compute: (file: string) => Promise<T>) {
|
|
52
|
-
const entries = new Map<string, Entry<Promise<T>>>()
|
|
52
|
+
const entries = new Map<string, Entry<Promise<T>>>()
|
|
53
53
|
return (file: string): Promise<T> => {
|
|
54
|
-
const current = stamp(file)
|
|
55
|
-
const cached = entries.get(file)
|
|
56
|
-
if (cached?.stamp === current) return cached.value
|
|
57
|
-
const value = compute(file)
|
|
58
|
-
entries.set(file, { stamp: current, value })
|
|
59
|
-
return value
|
|
60
|
-
}
|
|
54
|
+
const current = stamp(file)
|
|
55
|
+
const cached = entries.get(file)
|
|
56
|
+
if (cached?.stamp === current) return cached.value
|
|
57
|
+
const value = compute(file)
|
|
58
|
+
entries.set(file, { stamp: current, value })
|
|
59
|
+
return value
|
|
60
|
+
}
|
|
61
61
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { pathToFileHref } from '../../config'
|
|
2
|
-
import { rewriteSpecifierLiterals } from '../../resolve/scan-facts'
|
|
1
|
+
import { pathToFileHref } from '../../config'
|
|
2
|
+
import { rewriteSpecifierLiterals } from '../../resolve/scan-facts'
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Resolve registered compat aliases before Bun reaches installed package entries. Folded onto the
|
|
@@ -16,10 +16,10 @@ export function rewriteStaticCompatImports(
|
|
|
16
16
|
return rewriteSpecifierLiterals(source, file, (specifier, kind) => {
|
|
17
17
|
// A side-effect `import 'x'` keeps resolving through the host resolver, as
|
|
18
18
|
// it did under the `from`-anchored regex this replaced.
|
|
19
|
-
const target = kind === 'side-effect' ? undefined : aliases[specifier]
|
|
20
|
-
if (!target) return undefined
|
|
19
|
+
const target = kind === 'side-effect' ? undefined : aliases[specifier]
|
|
20
|
+
if (!target) return undefined
|
|
21
21
|
const resolved =
|
|
22
|
-
kind === 'require' ? (requireAliases[specifier] ?? target) : pathToFileHref(target)
|
|
23
|
-
return JSON.stringify(resolved)
|
|
24
|
-
})
|
|
22
|
+
kind === 'require' ? (requireAliases[specifier] ?? target) : pathToFileHref(target)
|
|
23
|
+
return JSON.stringify(resolved)
|
|
24
|
+
})
|
|
25
25
|
}
|