@wular/pnext 0.0.4 → 0.0.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/README.md +22 -16
- package/bin/pnext +6 -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 +87 -22
- package/reference/config.md +40 -93
- package/reference/css.md +42 -33
- package/reference/dev.md +26 -33
- package/reference/env.md +18 -20
- package/reference/getting-started.md +132 -0
- package/reference/metadata.md +31 -46
- package/reference/navigation.md +65 -105
- package/reference/performance.md +21 -142
- package/reference/rendering.md +78 -75
- package/reference/routing.md +97 -107
- package/reference/typegen.md +27 -29
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +121 -114
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +52 -53
- 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 +72 -64
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +94 -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 +802 -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 +32 -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 +2022 -1995
- package/src/{api → client}/router/types.ts +98 -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 +86 -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 +2087 -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 +87 -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 +954 -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 +428 -406
- package/src/styles.d.ts +9 -0
- package/src/types.ts +324 -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/reference/overview.md +0 -35
- 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
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export class UnrecognizedActionError extends Error {
|
|
11
11
|
constructor(...args: ConstructorParameters<typeof Error>) {
|
|
12
|
-
super(...args)
|
|
13
|
-
this.name = 'UnrecognizedActionError'
|
|
12
|
+
super(...args)
|
|
13
|
+
this.name = 'UnrecognizedActionError'
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
@@ -21,10 +21,10 @@ export class UnrecognizedActionError extends Error {
|
|
|
21
21
|
* prototype) by the name/message the endpoint sends.
|
|
22
22
|
*/
|
|
23
23
|
export function isUnrecognizedActionError(error: unknown): boolean {
|
|
24
|
-
if (error instanceof UnrecognizedActionError) return true
|
|
24
|
+
if (error instanceof UnrecognizedActionError) return true
|
|
25
25
|
return (
|
|
26
26
|
error instanceof Error &&
|
|
27
27
|
(error.name === 'UnrecognizedActionError' ||
|
|
28
28
|
/ was not found on the server\.?$/.test(error.message))
|
|
29
|
-
)
|
|
29
|
+
)
|
|
30
30
|
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import path from 'node:path'
|
|
2
|
-
import { createRequire } from 'node:module'
|
|
3
|
-
import type { Plugin } from 'esbuild'
|
|
4
|
-
import { frameworkRuntimeAliasEntries, pnextAliases, type CompatAliasTarget } from '../config'
|
|
5
|
-
import type { PNextConfig } from '../types'
|
|
6
|
-
import { escapeRegex, isIdentifier, uniqueIdentifier } from '../utils/
|
|
7
|
-
import { actionClientStubPlugin, hasClientActionModules } from './actions/client-plugin'
|
|
8
|
-
import { rewriteRootParamsSource } from './ppr/root-params-transform'
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { createRequire } from 'node:module'
|
|
3
|
+
import type { Plugin } from 'esbuild'
|
|
4
|
+
import { frameworkRuntimeAliasEntries, pnextAliases, type CompatAliasTarget } from '../config'
|
|
5
|
+
import type { PNextConfig } from '../types'
|
|
6
|
+
import { escapeRegex, isIdentifier, uniqueIdentifier } from '../utils/code'
|
|
7
|
+
import { actionClientStubPlugin, hasClientActionModules } from './actions/client-plugin'
|
|
8
|
+
import { rewriteRootParamsSource } from './ppr/root-params-transform'
|
|
9
9
|
|
|
10
|
-
export type CompatConfig = Pick<PNextConfig, 'compat'
|
|
10
|
+
export type CompatConfig = Pick<PNextConfig, 'compat'>
|
|
11
11
|
|
|
12
12
|
export function reactCompatEnabled(config: CompatConfig) {
|
|
13
|
-
return Boolean(config.compat?.next || config.compat?.react || reactCompilerOptions(config))
|
|
13
|
+
return Boolean(config.compat?.next || config.compat?.react || reactCompilerOptions(config))
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export function reactCompilerOptions(config: CompatConfig) {
|
|
17
|
-
if (!config.compat?.reactCompiler) return undefined
|
|
18
|
-
return { target: '18' }
|
|
17
|
+
if (!config.compat?.reactCompiler) return undefined
|
|
18
|
+
return { target: '18' }
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
export function nextCompatEnabled(config: CompatConfig) {
|
|
22
|
-
return Boolean(config.compat?.next)
|
|
22
|
+
return Boolean(config.compat?.next)
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
/** The only `next/dist/*` deep imports pnext shims (see reference/compat.md "Smaller surfaces"). */
|
|
@@ -29,7 +29,7 @@ export const SHIMMED_NEXT_DIST_PATHS = [
|
|
|
29
29
|
'next/dist/server/web/spec-extension/unstable-no-store',
|
|
30
30
|
'next/dist/server/web/spec-extension/revalidate',
|
|
31
31
|
'next/dist/server/app-render/work-unit-async-storage.external',
|
|
32
|
-
]
|
|
32
|
+
]
|
|
33
33
|
|
|
34
34
|
/**
|
|
35
35
|
* Clear failure for compat-only imports in apps that never enabled the
|
|
@@ -41,25 +41,25 @@ export function missingCompatImportError(
|
|
|
41
41
|
): string | undefined {
|
|
42
42
|
if (/^next(\/|$)/.test(specifier)) {
|
|
43
43
|
if (!nextCompatEnabled(config)) {
|
|
44
|
-
return `'${specifier}' requires Next compatibility. Enable compat.next in pnext.config.ts
|
|
44
|
+
return `'${specifier}' requires Next compatibility. Enable compat.next in pnext.config.ts.`
|
|
45
45
|
}
|
|
46
46
|
if (specifier.startsWith('next/dist/')) {
|
|
47
|
-
const bare = specifier.replace(/\.js$/, '')
|
|
47
|
+
const bare = specifier.replace(/\.js$/, '')
|
|
48
48
|
if (!SHIMMED_NEXT_DIST_PATHS.includes(bare)) {
|
|
49
49
|
return (
|
|
50
50
|
`'${specifier}' is not a supported import: next/dist internals are not part of the ` +
|
|
51
51
|
`public surface pnext shims. Only these next/dist/* paths are shimmed:\n` +
|
|
52
52
|
SHIMMED_NEXT_DIST_PATHS.map(path => ` - ${path}`).join('\n') +
|
|
53
53
|
`\nSee reference/compat.md ("Smaller surfaces") and report the library that needs a new shim.`
|
|
54
|
-
)
|
|
54
|
+
)
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
return undefined
|
|
57
|
+
return undefined
|
|
58
58
|
}
|
|
59
59
|
if (/^react(-dom)?(\/|$)/.test(specifier) && !reactCompatEnabled(config)) {
|
|
60
|
-
return `'${specifier}' requires React compatibility. Enable compat.react (or compat.next) in pnext.config.ts
|
|
60
|
+
return `'${specifier}' requires React compatibility. Enable compat.react (or compat.next) in pnext.config.ts.`
|
|
61
61
|
}
|
|
62
|
-
return undefined
|
|
62
|
+
return undefined
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
export function compatAliases(
|
|
@@ -71,7 +71,7 @@ export function compatAliases(
|
|
|
71
71
|
...pnextAliases(target),
|
|
72
72
|
...reactCompatAliases(config, target),
|
|
73
73
|
...nextCompatAliases(config, target),
|
|
74
|
-
}
|
|
74
|
+
}
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
/**
|
|
@@ -80,21 +80,21 @@ export function compatAliases(
|
|
|
80
80
|
* instrumentation compatibility.
|
|
81
81
|
*/
|
|
82
82
|
export function reactServerLayerAliases(config: CompatConfig): Record<string, string> {
|
|
83
|
-
if (!reactCompatEnabled(config)) return {}
|
|
84
|
-
const reactRoot = path.resolve(import.meta.dirname, 'react')
|
|
83
|
+
if (!reactCompatEnabled(config)) return {}
|
|
84
|
+
const reactRoot = path.resolve(import.meta.dirname, 'react')
|
|
85
85
|
return {
|
|
86
86
|
react: path.join(reactRoot, 'react-server.ts'),
|
|
87
87
|
'react-dom': path.join(reactRoot, 'dom-react-server.ts'),
|
|
88
|
-
}
|
|
88
|
+
}
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
export function reactCompatAliases(
|
|
92
92
|
config: CompatConfig,
|
|
93
93
|
target: CompatAliasTarget,
|
|
94
94
|
): Record<string, string> {
|
|
95
|
-
if (!reactCompatEnabled(config)) return {}
|
|
96
|
-
const reactRoot = path.resolve(import.meta.dirname, 'react')
|
|
97
|
-
const runtime = frameworkRuntimeAliasEntries()
|
|
95
|
+
if (!reactCompatEnabled(config)) return {}
|
|
96
|
+
const reactRoot = path.resolve(import.meta.dirname, 'react')
|
|
97
|
+
const runtime = frameworkRuntimeAliasEntries()
|
|
98
98
|
return {
|
|
99
99
|
react: path.join(reactRoot, target === 'client' ? 'client.ts' : 'server.ts'),
|
|
100
100
|
// dom.ts wraps preact/compat with the form-action hooks react-dom ships
|
|
@@ -115,19 +115,19 @@ export function reactCompatAliases(
|
|
|
115
115
|
// package's own `require('react').useMemo` throws under preact SSR.
|
|
116
116
|
'react/compiler-runtime': path.join(reactRoot, 'compiler-runtime.ts'),
|
|
117
117
|
'react-compiler-runtime': path.join(reactRoot, 'compiler-runtime.ts'),
|
|
118
|
-
}
|
|
118
|
+
}
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
export function nextCompatAliases(
|
|
122
122
|
config: CompatConfig,
|
|
123
123
|
target: CompatAliasTarget,
|
|
124
124
|
): Record<string, string> {
|
|
125
|
-
if (!nextCompatEnabled(config)) return {}
|
|
126
|
-
return nextCompatAliasEntries(target)
|
|
125
|
+
if (!nextCompatEnabled(config)) return {}
|
|
126
|
+
return nextCompatAliasEntries(target)
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
export function nextCompatAliasEntries(target: CompatAliasTarget): Record<string, string> {
|
|
130
|
-
const nextRoot = path.resolve(import.meta.dirname, 'next')
|
|
130
|
+
const nextRoot = path.resolve(import.meta.dirname, 'next')
|
|
131
131
|
return withJsExtensionAliases({
|
|
132
132
|
next: path.join(nextRoot, 'index.ts'),
|
|
133
133
|
// Client variant avoids node:async_hooks (render cache-meta collector) in
|
|
@@ -225,15 +225,15 @@ export function nextCompatAliasEntries(target: CompatAliasTarget): Record<string
|
|
|
225
225
|
),
|
|
226
226
|
}
|
|
227
227
|
: {}),
|
|
228
|
-
})
|
|
228
|
+
})
|
|
229
229
|
}
|
|
230
230
|
|
|
231
231
|
function withJsExtensionAliases(aliases: Record<string, string>) {
|
|
232
|
-
const entries = { ...aliases }
|
|
232
|
+
const entries = { ...aliases }
|
|
233
233
|
for (const [specifier, target] of Object.entries(aliases)) {
|
|
234
|
-
if (specifier !== 'next') entries[`${specifier}.js`] = target
|
|
234
|
+
if (specifier !== 'next') entries[`${specifier}.js`] = target
|
|
235
235
|
}
|
|
236
|
-
return entries
|
|
236
|
+
return entries
|
|
237
237
|
}
|
|
238
238
|
|
|
239
239
|
/**
|
|
@@ -242,8 +242,8 @@ function withJsExtensionAliases(aliases: Record<string, string>) {
|
|
|
242
242
|
* happens to be installed.
|
|
243
243
|
*/
|
|
244
244
|
export function compatAliasPlugin(config: CompatConfig): Plugin {
|
|
245
|
-
const aliases = compatAliases(config, 'client')
|
|
246
|
-
const specifiers = Object.keys(aliases)
|
|
245
|
+
const aliases = compatAliases(config, 'client')
|
|
246
|
+
const specifiers = Object.keys(aliases)
|
|
247
247
|
return {
|
|
248
248
|
name: 'pnext-compat-alias',
|
|
249
249
|
setup(build) {
|
|
@@ -252,46 +252,46 @@ export function compatAliasPlugin(config: CompatConfig): Plugin {
|
|
|
252
252
|
// stub participates in every client build without editing the client
|
|
253
253
|
// build pipeline. No-op when no action modules were discovered.
|
|
254
254
|
if (nextCompatEnabled(config) && hasClientActionModules()) {
|
|
255
|
-
void actionClientStubPlugin().setup(build)
|
|
255
|
+
void actionClientStubPlugin().setup(build)
|
|
256
256
|
}
|
|
257
257
|
|
|
258
258
|
build.onResolve({ filter: /^(?:react(?:-dom)?|next)(?:\/|$)/ }, args => {
|
|
259
|
-
if (aliases[args.path]) return undefined
|
|
260
|
-
const message = missingCompatImportError(config, args.path)
|
|
261
|
-
return message ? { errors: [{ text: message }] } : undefined
|
|
262
|
-
})
|
|
263
|
-
if (specifiers.length === 0) return
|
|
259
|
+
if (aliases[args.path]) return undefined
|
|
260
|
+
const message = missingCompatImportError(config, args.path)
|
|
261
|
+
return message ? { errors: [{ text: message }] } : undefined
|
|
262
|
+
})
|
|
263
|
+
if (specifiers.length === 0) return
|
|
264
264
|
build.onResolve(
|
|
265
265
|
{ filter: new RegExp(`^(${specifiers.map(escapeRegex).join('|')})$`) },
|
|
266
266
|
async args => {
|
|
267
|
-
const target = aliases[args.path]
|
|
268
|
-
if (!target) return undefined
|
|
269
|
-
if (path.isAbsolute(target)) return { path: target }
|
|
267
|
+
const target = aliases[args.path]
|
|
268
|
+
if (!target) return undefined
|
|
269
|
+
if (path.isAbsolute(target)) return { path: target }
|
|
270
270
|
return build.resolve(target, {
|
|
271
271
|
kind: args.kind,
|
|
272
272
|
importer: args.importer,
|
|
273
273
|
namespace: args.namespace,
|
|
274
274
|
resolveDir: args.resolveDir,
|
|
275
|
-
})
|
|
275
|
+
})
|
|
276
276
|
},
|
|
277
|
-
)
|
|
277
|
+
)
|
|
278
278
|
},
|
|
279
|
-
}
|
|
279
|
+
}
|
|
280
280
|
}
|
|
281
281
|
|
|
282
282
|
// Compat apps render React's Suspense (the preact/compat class, via the react
|
|
283
283
|
// aliases or a direct import). That identity is loaded lazily and only when
|
|
284
284
|
// compat is enabled, so core apps never pull preact/compat into the server
|
|
285
285
|
// process — core streaming uses PNext's own Suspense marker instead.
|
|
286
|
-
let compatSuspense: unknown
|
|
286
|
+
let compatSuspense: unknown
|
|
287
287
|
|
|
288
288
|
export async function ensureCompatSuspense(config: CompatConfig) {
|
|
289
|
-
if (compatSuspense !== undefined || !reactCompatEnabled(config)) return
|
|
290
|
-
compatSuspense = ((await import('preact/compat')) as { Suspense: unknown }).Suspense
|
|
289
|
+
if (compatSuspense !== undefined || !reactCompatEnabled(config)) return
|
|
290
|
+
compatSuspense = ((await import('preact/compat')) as { Suspense: unknown }).Suspense
|
|
291
291
|
}
|
|
292
292
|
|
|
293
293
|
export function compatSuspenseType() {
|
|
294
|
-
return compatSuspense
|
|
294
|
+
return compatSuspense
|
|
295
295
|
}
|
|
296
296
|
|
|
297
297
|
/**
|
|
@@ -305,7 +305,7 @@ export function compatSuspenseType() {
|
|
|
305
305
|
const fontRuntimePaths: Record<CompatAliasTarget, string> = {
|
|
306
306
|
server: path.join(import.meta.dirname, 'next', 'font', 'runtime.ts'),
|
|
307
307
|
client: path.join(import.meta.dirname, 'next', 'font', 'runtime-client.ts'),
|
|
308
|
-
}
|
|
308
|
+
}
|
|
309
309
|
|
|
310
310
|
/**
|
|
311
311
|
* Next-compat source rewrites for `next/font/google` and `next/font/local` imports. Only invoked when
|
|
@@ -321,15 +321,15 @@ export function rewriteNextFontSource(
|
|
|
321
321
|
target: CompatAliasTarget = 'server',
|
|
322
322
|
root?: string,
|
|
323
323
|
) {
|
|
324
|
-
if (!source.includes('next/font') && !source.includes('next/root-params')) return source
|
|
324
|
+
if (!source.includes('next/font') && !source.includes('next/root-params')) return source
|
|
325
325
|
// The single next/root-params rewrite in the tree; every other call site
|
|
326
326
|
// reaches it through this pass rather than re-running its own copy.
|
|
327
|
-
source = rewriteRootParamsSource(source)
|
|
328
|
-
const runtimePath = fontRuntimePaths[target]
|
|
329
|
-
let next = rewriteNextGoogleFontImports(source, runtimePath)
|
|
330
|
-
const localFontNames = nextLocalFontImportNames(next)
|
|
331
|
-
if (localFontNames.size === 0) return next
|
|
332
|
-
const callerFile = localFontCallerFile(file, root)
|
|
327
|
+
source = rewriteRootParamsSource(source)
|
|
328
|
+
const runtimePath = fontRuntimePaths[target]
|
|
329
|
+
let next = rewriteNextGoogleFontImports(source, runtimePath)
|
|
330
|
+
const localFontNames = nextLocalFontImportNames(next)
|
|
331
|
+
if (localFontNames.size === 0) return next
|
|
332
|
+
const callerFile = localFontCallerFile(file, root)
|
|
333
333
|
// Rewrite each `NAME(...)` call to `NAME.withFile(<file>)(...)` so the runtime
|
|
334
334
|
// gets the caller path (for `src` resolution + a stable per-caller hash). The
|
|
335
335
|
// client runtime only uses `callerFile` for the hash (which must match the
|
|
@@ -338,16 +338,19 @@ export function rewriteNextFontSource(
|
|
|
338
338
|
next = next.replace(
|
|
339
339
|
new RegExp(`(?<![.$\\w])${escapeRegex(name)}\\s*\\(`, 'g'),
|
|
340
340
|
`${name}.withFile(${JSON.stringify(callerFile)})(`,
|
|
341
|
-
)
|
|
341
|
+
)
|
|
342
342
|
}
|
|
343
343
|
// Next names local-font families after the binding (`const myFont = …`),
|
|
344
344
|
// including when the loader lives in a package under node_modules.
|
|
345
345
|
for (const name of localFontNames) {
|
|
346
346
|
next = next.replace(
|
|
347
|
-
new RegExp(
|
|
347
|
+
new RegExp(
|
|
348
|
+
`((?:export\\s+)?(?:const|let|var)\\s+)([A-Za-z_$][\\w$]*)(\\s*=\\s*)${escapeRegex(name)}\\.withFile\\(([^)]*)\\)\\(`,
|
|
349
|
+
'g',
|
|
350
|
+
),
|
|
348
351
|
(_statement, declaration: string, binding: string, equals: string, caller: string) =>
|
|
349
352
|
`${declaration}${binding}${equals}${name}.withFile(${caller}, ${JSON.stringify(binding)})(`,
|
|
350
|
-
)
|
|
353
|
+
)
|
|
351
354
|
}
|
|
352
355
|
// Replace the bare `import NAME from 'next/font/local'` with an import bound
|
|
353
356
|
// directly to the runtime's absolute path. This avoids relying on server-side
|
|
@@ -356,65 +359,65 @@ export function rewriteNextFontSource(
|
|
|
356
359
|
next = next.replace(
|
|
357
360
|
/^[ \t]*import\s+([A-Za-z_$][\w$]*)\s+from\s+(['"])([^'"]+)\2\s*;?[ \t]*$/gm,
|
|
358
361
|
(statement, name: string, _quote: string, specifier: string) => {
|
|
359
|
-
if (!isNextLocalFontSpecifier(specifier)) return statement
|
|
360
|
-
return `import { localFont as ${name} } from ${JSON.stringify(runtimePath)}
|
|
362
|
+
if (!isNextLocalFontSpecifier(specifier)) return statement
|
|
363
|
+
return `import { localFont as ${name} } from ${JSON.stringify(runtimePath)};`
|
|
361
364
|
},
|
|
362
|
-
)
|
|
363
|
-
return next
|
|
365
|
+
)
|
|
366
|
+
return next
|
|
364
367
|
}
|
|
365
368
|
|
|
366
369
|
function rewriteNextGoogleFontImports(source: string, runtimePath: string) {
|
|
367
|
-
const statements: string[] = []
|
|
368
|
-
const helperName = uniqueIdentifier(source, '__pnextGoogleFont')
|
|
369
|
-
const namespaceHelperName = uniqueIdentifier(source, '__pnextGoogleFonts', helperName)
|
|
370
|
+
const statements: string[] = []
|
|
371
|
+
const helperName = uniqueIdentifier(source, '__pnextGoogleFont')
|
|
372
|
+
const namespaceHelperName = uniqueIdentifier(source, '__pnextGoogleFonts', helperName)
|
|
370
373
|
const rewritten = source.replace(
|
|
371
374
|
/^[ \t]*import\s+(?!type\b)((?:[^\n;]|\n(?![ \t]*(?:import|export)\b))*?)\s+from\s+['"]next\/font\/google['"]\s*;?[ \t]*(?:\r?\n)?/gm,
|
|
372
375
|
(_statement: string, clause: string) => {
|
|
373
|
-
const bindings = nextGoogleFontBindings(clause)
|
|
374
|
-
if (bindings.length === 0) return ''
|
|
376
|
+
const bindings = nextGoogleFontBindings(clause)
|
|
377
|
+
if (bindings.length === 0) return ''
|
|
375
378
|
statements.push(
|
|
376
379
|
...bindings.map(binding =>
|
|
377
380
|
googleFontBindingSource(binding, helperName, namespaceHelperName),
|
|
378
381
|
),
|
|
379
|
-
)
|
|
380
|
-
return ''
|
|
382
|
+
)
|
|
383
|
+
return ''
|
|
381
384
|
},
|
|
382
|
-
)
|
|
385
|
+
)
|
|
383
386
|
|
|
384
|
-
if (statements.length === 0) return source
|
|
387
|
+
if (statements.length === 0) return source
|
|
385
388
|
return [
|
|
386
389
|
`import { googleFont as ${helperName} } from ${JSON.stringify(runtimePath)};`,
|
|
387
390
|
`const ${namespaceHelperName} = new Proxy({}, { get: (_target, key) => typeof key === 'string' ? ${helperName}(key.replace(/_/g, ' ')) : undefined });`,
|
|
388
391
|
...statements,
|
|
389
392
|
rewritten,
|
|
390
|
-
].join('\n')
|
|
393
|
+
].join('\n')
|
|
391
394
|
}
|
|
392
395
|
|
|
393
396
|
interface GoogleFontBinding {
|
|
394
|
-
imported: string
|
|
395
|
-
local: string
|
|
396
|
-
namespace?: boolean
|
|
397
|
+
imported: string
|
|
398
|
+
local: string
|
|
399
|
+
namespace?: boolean
|
|
397
400
|
}
|
|
398
401
|
|
|
399
402
|
function nextGoogleFontBindings(clause: string): GoogleFontBinding[] {
|
|
400
|
-
const trimmed = clause.trim()
|
|
401
|
-
const namespace = /^\*\s+as\s+([A-Za-z_$][\w$]*)$/.exec(trimmed)?.[1]
|
|
402
|
-
if (namespace) return [{ imported: namespace, local: namespace, namespace: true }]
|
|
403
|
+
const trimmed = clause.trim()
|
|
404
|
+
const namespace = /^\*\s+as\s+([A-Za-z_$][\w$]*)$/.exec(trimmed)?.[1]
|
|
405
|
+
if (namespace) return [{ imported: namespace, local: namespace, namespace: true }]
|
|
403
406
|
|
|
404
|
-
const named = /\{([\s\S]*)\}/.exec(trimmed)?.[1]
|
|
405
|
-
if (!named) return []
|
|
407
|
+
const named = /\{([\s\S]*)\}/.exec(trimmed)?.[1]
|
|
408
|
+
if (!named) return []
|
|
406
409
|
return named
|
|
407
410
|
.split(',')
|
|
408
411
|
.map(part => part.trim())
|
|
409
412
|
.filter(Boolean)
|
|
410
413
|
.flatMap(part => {
|
|
411
|
-
if (part.startsWith('type ')) return []
|
|
412
|
-
const [importedRaw, localRaw] = part.split(/\s+as\s+/)
|
|
413
|
-
const imported = importedRaw?.trim()
|
|
414
|
-
const local = (localRaw ?? importedRaw)?.trim()
|
|
415
|
-
if (!imported || !local || !isIdentifier(imported) || !isIdentifier(local)) return []
|
|
416
|
-
return [{ imported, local }]
|
|
417
|
-
})
|
|
414
|
+
if (part.startsWith('type ')) return []
|
|
415
|
+
const [importedRaw, localRaw] = part.split(/\s+as\s+/)
|
|
416
|
+
const imported = importedRaw?.trim()
|
|
417
|
+
const local = (localRaw ?? importedRaw)?.trim()
|
|
418
|
+
if (!imported || !local || !isIdentifier(imported) || !isIdentifier(local)) return []
|
|
419
|
+
return [{ imported, local }]
|
|
420
|
+
})
|
|
418
421
|
}
|
|
419
422
|
|
|
420
423
|
function googleFontBindingSource(
|
|
@@ -422,37 +425,37 @@ function googleFontBindingSource(
|
|
|
422
425
|
helperName: string,
|
|
423
426
|
namespaceHelperName: string,
|
|
424
427
|
) {
|
|
425
|
-
if (binding.namespace) return `const ${binding.local} = ${namespaceHelperName}
|
|
426
|
-
return `const ${binding.local} = ${helperName}(${JSON.stringify(googleFontFamily(binding.imported))})
|
|
428
|
+
if (binding.namespace) return `const ${binding.local} = ${namespaceHelperName};`
|
|
429
|
+
return `const ${binding.local} = ${helperName}(${JSON.stringify(googleFontFamily(binding.imported))});`
|
|
427
430
|
}
|
|
428
431
|
|
|
429
432
|
function googleFontFamily(exportName: string) {
|
|
430
|
-
return exportName.replace(/_/g, ' ')
|
|
433
|
+
return exportName.replace(/_/g, ' ')
|
|
431
434
|
}
|
|
432
435
|
|
|
433
436
|
function nextLocalFontImportNames(source: string) {
|
|
434
|
-
const names = new Set<string>()
|
|
435
|
-
const pattern = /\bimport\s+([A-Za-z_$][\w$]*)\s+from\s+(['"])([^'"]+)\2/g
|
|
436
|
-
let match: RegExpExecArray | null
|
|
437
|
+
const names = new Set<string>()
|
|
438
|
+
const pattern = /\bimport\s+([A-Za-z_$][\w$]*)\s+from\s+(['"])([^'"]+)\2/g
|
|
439
|
+
let match: RegExpExecArray | null
|
|
437
440
|
while ((match = pattern.exec(source))) {
|
|
438
|
-
if (match[1] && match[3] && isNextLocalFontSpecifier(match[3])) names.add(match[1])
|
|
441
|
+
if (match[1] && match[3] && isNextLocalFontSpecifier(match[3])) names.add(match[1])
|
|
439
442
|
}
|
|
440
|
-
return names
|
|
443
|
+
return names
|
|
441
444
|
}
|
|
442
445
|
|
|
443
446
|
function isNextLocalFontSpecifier(specifier: string) {
|
|
444
|
-
if (specifier === 'next/font/local' || specifier === 'next/font/local.js') return true
|
|
445
|
-
const normalized = specifier.replace(/^file:\/\//, '').replace(/\\/g, '/')
|
|
446
|
-
return /\/compat\/next\/font\/local\.[jt]s$/.test(normalized)
|
|
447
|
+
if (specifier === 'next/font/local' || specifier === 'next/font/local.js') return true
|
|
448
|
+
const normalized = specifier.replace(/^file:\/\//, '').replace(/\\/g, '/')
|
|
449
|
+
return /\/compat\/next\/font\/local\.[jt]s$/.test(normalized)
|
|
447
450
|
}
|
|
448
451
|
|
|
449
452
|
function localFontCallerFile(file: string, root: string | undefined) {
|
|
450
|
-
if (path.isAbsolute(file)) return file
|
|
451
|
-
if (file.startsWith('.')) return path.resolve(root ?? process.cwd(), file)
|
|
452
|
-
if (!root) return file
|
|
453
|
+
if (path.isAbsolute(file)) return file
|
|
454
|
+
if (file.startsWith('.')) return path.resolve(root ?? process.cwd(), file)
|
|
455
|
+
if (!root) return file
|
|
453
456
|
try {
|
|
454
|
-
return createRequire(path.join(root, 'pnext-resolve.cjs')).resolve(file)
|
|
457
|
+
return createRequire(path.join(root, 'pnext-resolve.cjs')).resolve(file)
|
|
455
458
|
} catch {
|
|
456
|
-
return file
|
|
459
|
+
return file
|
|
457
460
|
}
|
|
458
461
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { uniqueIdentifier } from '../../utils/
|
|
1
|
+
import { uniqueIdentifier } from '../../utils/code'
|
|
2
2
|
|
|
3
3
|
// A quoted `'bun'`/`'bun:x'` specifier anywhere in the source. Deliberately not
|
|
4
4
|
// the module record's edges: a route handler looping
|
|
5
5
|
// `require(name)` over a table of module names has NO static edge, and Next
|
|
6
6
|
// still externalizes those. Matching the quoted specifier keeps that reach while
|
|
7
7
|
// staying far tighter than the old bare-word `bun` regex.
|
|
8
|
-
const QUOTED_BUN_SPECIFIER = /(['"])bun(?::[^'"]+)?\1
|
|
8
|
+
const QUOTED_BUN_SPECIFIER = /(['"])bun(?::[^'"]+)?\1/
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Guard `bun`/`bun:*` builtins behind a runtime throw so a module importing one can still be compiled
|
|
@@ -13,27 +13,27 @@ const QUOTED_BUN_SPECIFIER = /(['"])bun(?::[^'"]+)?\1/;
|
|
|
13
13
|
* require/import calls too, which no record can name.
|
|
14
14
|
*/
|
|
15
15
|
export function rewriteBunBuiltinExternals(source: string, _file = 'module.tsx'): string {
|
|
16
|
-
if (!source.includes('bun')) return source
|
|
17
|
-
if (!QUOTED_BUN_SPECIFIER.test(source)) return source
|
|
16
|
+
if (!source.includes('bun')) return source
|
|
17
|
+
if (!QUOTED_BUN_SPECIFIER.test(source)) return source
|
|
18
18
|
|
|
19
|
-
const requireName = uniqueIdentifier(source, '__pnext_require_external')
|
|
20
|
-
const importName = uniqueIdentifier(source, '__pnext_import_external', requireName)
|
|
21
|
-
const literalRequires: string[] = []
|
|
19
|
+
const requireName = uniqueIdentifier(source, '__pnext_require_external')
|
|
20
|
+
const importName = uniqueIdentifier(source, '__pnext_import_external', requireName)
|
|
21
|
+
const literalRequires: string[] = []
|
|
22
22
|
let next = source.replace(
|
|
23
23
|
/\brequire\s*\(\s*(['"])(bun(?::[^'"]+)?)\1\s*\)/g,
|
|
24
24
|
(_match, _quote: string, specifier: string) => {
|
|
25
|
-
literalRequires.push(specifier)
|
|
26
|
-
return `__pnext_bun_external_${literalRequires.length - 1}__
|
|
25
|
+
literalRequires.push(specifier)
|
|
26
|
+
return `__pnext_bun_external_${literalRequires.length - 1}__`
|
|
27
27
|
},
|
|
28
|
-
)
|
|
29
|
-
next = next.replace(/\brequire\s*\(/g, `${requireName}(`)
|
|
28
|
+
)
|
|
29
|
+
next = next.replace(/\brequire\s*\(/g, `${requireName}(`)
|
|
30
30
|
next = next.replace(/__pnext_bun_external_(\d+)__/g, (_match, index: string) => {
|
|
31
|
-
const specifier = literalRequires[Number(index)]
|
|
32
|
-
return `${requireName}(${JSON.stringify(specifier)}, () => require(${JSON.stringify(specifier)}))
|
|
33
|
-
})
|
|
34
|
-
next = next.replace(/\bimport\s*\(/g, `${importName}(`)
|
|
31
|
+
const specifier = literalRequires[Number(index)]
|
|
32
|
+
return `${requireName}(${JSON.stringify(specifier)}, () => require(${JSON.stringify(specifier)}))`
|
|
33
|
+
})
|
|
34
|
+
next = next.replace(/\bimport\s*\(/g, `${importName}(`)
|
|
35
35
|
|
|
36
|
-
const directive = /^(?:\s*['"][^'"]+['"];?\s*)*/.exec(next)?.[0] ?? ''
|
|
36
|
+
const directive = /^(?:\s*['"][^'"]+['"];?\s*)*/.exec(next)?.[0] ?? ''
|
|
37
37
|
const helpers = [
|
|
38
38
|
`const ${requireName} = (specifier, load) => {`,
|
|
39
39
|
` if (specifier === 'bun' || specifier.startsWith('bun:')) {`,
|
|
@@ -48,6 +48,6 @@ export function rewriteBunBuiltinExternals(source: string, _file = 'module.tsx')
|
|
|
48
48
|
' return import(specifier);',
|
|
49
49
|
'};',
|
|
50
50
|
'',
|
|
51
|
-
].join('\n')
|
|
52
|
-
return `${directive}${helpers}${next.slice(directive.length)}
|
|
51
|
+
].join('\n')
|
|
52
|
+
return `${directive}${helpers}${next.slice(directive.length)}`
|
|
53
53
|
}
|