@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
|
@@ -13,25 +13,25 @@
|
|
|
13
13
|
// export / top-level await / dynamic import() and CJS+ESM authoring styles.
|
|
14
14
|
// ---------------------------------------------------------------------------
|
|
15
15
|
|
|
16
|
-
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
|
|
17
|
-
import { createRequire } from 'node:module'
|
|
18
|
-
import path from 'node:path'
|
|
19
|
-
import { pathToFileURL } from 'node:url'
|
|
20
|
-
import { build } from '../../utils/esbuild'
|
|
21
|
-
import { setConfig } from './config'
|
|
22
|
-
import { setCacheComponents } from '../../ppr'
|
|
23
|
-
import { PHASE_DEVELOPMENT_SERVER, PHASE_PRODUCTION_BUILD } from './constants'
|
|
24
|
-
import { nextMdxConfigStubPlugin } from '../mdx/
|
|
25
|
-
import { collectImagesConfigErrors } from './image/validate'
|
|
26
|
-
import { setSvgAsComponentEnabled, webpackReferencesSvgr } from './svgr'
|
|
27
|
-
import { emitBuildFeatureUsageTelemetry, emitSessionStartedTelemetry } from './telemetry'
|
|
28
|
-
|
|
29
|
-
export type NextConfigObject = Record<string, unknown
|
|
16
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
|
|
17
|
+
import { createRequire } from 'node:module'
|
|
18
|
+
import path from 'node:path'
|
|
19
|
+
import { pathToFileURL } from 'node:url'
|
|
20
|
+
import { build } from '../../utils/esbuild'
|
|
21
|
+
import { setConfig } from './config'
|
|
22
|
+
import { setCacheComponents } from '../../render/ppr'
|
|
23
|
+
import { PHASE_DEVELOPMENT_SERVER, PHASE_PRODUCTION_BUILD } from './constants'
|
|
24
|
+
import { nextMdxConfigStubPlugin } from '../mdx/stub'
|
|
25
|
+
import { collectImagesConfigErrors } from './image/validate'
|
|
26
|
+
import { setSvgAsComponentEnabled, webpackReferencesSvgr } from './svgr'
|
|
27
|
+
import { emitBuildFeatureUsageTelemetry, emitSessionStartedTelemetry } from './telemetry'
|
|
28
|
+
|
|
29
|
+
export type NextConfigObject = Record<string, unknown>
|
|
30
30
|
type NextConfigFn = (
|
|
31
31
|
phase: string,
|
|
32
32
|
context: { defaultConfig: NextConfigObject },
|
|
33
|
-
) => NextConfigObject | Promise<NextConfigObject
|
|
34
|
-
type NextConfigExport = NextConfigObject | NextConfigFn | Promise<NextConfigObject
|
|
33
|
+
) => NextConfigObject | Promise<NextConfigObject>
|
|
34
|
+
type NextConfigExport = NextConfigObject | NextConfigFn | Promise<NextConfigObject>
|
|
35
35
|
|
|
36
36
|
const CONFIG_BASENAMES = [
|
|
37
37
|
'next.config.ts',
|
|
@@ -40,13 +40,13 @@ const CONFIG_BASENAMES = [
|
|
|
40
40
|
'next.config.js',
|
|
41
41
|
'next.config.mjs',
|
|
42
42
|
'next.config.cjs',
|
|
43
|
-
]
|
|
43
|
+
]
|
|
44
44
|
|
|
45
|
-
let store: NextConfigObject = {}
|
|
45
|
+
let store: NextConfigObject = {}
|
|
46
46
|
|
|
47
47
|
/** The full loaded next.config object; empty until loadNextConfig runs. */
|
|
48
48
|
export function getNextConfig(): NextConfigObject {
|
|
49
|
-
return store
|
|
49
|
+
return store
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
/**
|
|
@@ -60,70 +60,70 @@ export function getNextConfig(): NextConfigObject {
|
|
|
60
60
|
*/
|
|
61
61
|
function readCacheComponentsFlag(config: NextConfigObject): boolean {
|
|
62
62
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
63
|
-
if (process.env.__NEXT_CACHE_COMPONENTS === 'true') return true
|
|
64
|
-
if (config.cacheComponents === true) return true
|
|
65
|
-
const experimental = config.experimental as Record<string, unknown> | undefined
|
|
66
|
-
if (experimental?.cacheComponents === true) return true
|
|
67
|
-
if (experimental?.dynamicIO === true) return true
|
|
68
|
-
return false
|
|
63
|
+
if (process.env.__NEXT_CACHE_COMPONENTS === 'true') return true
|
|
64
|
+
if (config.cacheComponents === true) return true
|
|
65
|
+
const experimental = config.experimental as Record<string, unknown> | undefined
|
|
66
|
+
if (experimental?.cacheComponents === true) return true
|
|
67
|
+
if (experimental?.dynamicIO === true) return true
|
|
68
|
+
return false
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
export function setNextConfig(config: NextConfigObject): void {
|
|
72
|
-
store = config
|
|
72
|
+
store = config
|
|
73
73
|
// Derived per config load, never a process one-shot: a second build in the
|
|
74
74
|
// same process (dev server, programmatic API, test suite) must see its OWN
|
|
75
75
|
// app's flag, not the previous app's.
|
|
76
|
-
setCacheComponents(readCacheComponentsFlag(config))
|
|
77
|
-
setSvgAsComponentEnabled(webpackReferencesSvgr(config))
|
|
76
|
+
setCacheComponents(readCacheComponentsFlag(config))
|
|
77
|
+
setSvgAsComponentEnabled(webpackReferencesSvgr(config))
|
|
78
78
|
// Expose basePath to server-side render code through the isomorphic
|
|
79
79
|
// globalThis global (compat/client/base-path.ts reads it). The client reads
|
|
80
80
|
// the window global the render layer injects instead; keeping both in sync
|
|
81
81
|
// lets Link/redirect/nav prefix basePath identically on server and client.
|
|
82
|
-
(globalThis as { __PNEXT_BASE_PATH__?: string }).__PNEXT_BASE_PATH__ =
|
|
83
|
-
typeof config.basePath === 'string' ? config.basePath : ''
|
|
82
|
+
;(globalThis as { __PNEXT_BASE_PATH__?: string }).__PNEXT_BASE_PATH__ =
|
|
83
|
+
typeof config.basePath === 'string' ? config.basePath : ''
|
|
84
84
|
// Expose skipTrailingSlashRedirect the same way so server-rendered Links skip
|
|
85
85
|
// trailing-slash normalization (the client reads the injected window global).
|
|
86
|
-
(globalThis as { __PNEXT_SKIP_TRAILING_SLASH__?: boolean }).__PNEXT_SKIP_TRAILING_SLASH__ =
|
|
87
|
-
config.skipTrailingSlashRedirect === true
|
|
88
|
-
(globalThis as { __PNEXT_TRAILING_SLASH__?: boolean }).__PNEXT_TRAILING_SLASH__ =
|
|
89
|
-
config.trailingSlash === true
|
|
86
|
+
;(globalThis as { __PNEXT_SKIP_TRAILING_SLASH__?: boolean }).__PNEXT_SKIP_TRAILING_SLASH__ =
|
|
87
|
+
config.skipTrailingSlashRedirect === true
|
|
88
|
+
;(globalThis as { __PNEXT_TRAILING_SLASH__?: boolean }).__PNEXT_TRAILING_SLASH__ =
|
|
89
|
+
config.trailingSlash === true
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
/** Overrides mapped onto pnext's resolved core config. */
|
|
93
93
|
export interface NextConfigCoreOverrides {
|
|
94
|
-
basePath?: string
|
|
95
|
-
trailingSlash?: boolean
|
|
96
|
-
skipTrailingSlashRedirect?: boolean
|
|
97
|
-
outDir?: string
|
|
98
|
-
assetPrefix?: string
|
|
99
|
-
productionBrowserSourceMaps?: boolean
|
|
94
|
+
basePath?: string
|
|
95
|
+
trailingSlash?: boolean
|
|
96
|
+
skipTrailingSlashRedirect?: boolean
|
|
97
|
+
outDir?: string
|
|
98
|
+
assetPrefix?: string
|
|
99
|
+
productionBrowserSourceMaps?: boolean
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
export interface LoadNextConfigResult {
|
|
103
|
-
config: NextConfigObject
|
|
104
|
-
overrides: NextConfigCoreOverrides
|
|
103
|
+
config: NextConfigObject
|
|
104
|
+
overrides: NextConfigCoreOverrides
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
function findConfigPath(root: string): string | undefined {
|
|
108
108
|
for (const name of CONFIG_BASENAMES) {
|
|
109
|
-
const candidate = path.join(root, name)
|
|
110
|
-
if (existsSync(candidate)) return candidate
|
|
109
|
+
const candidate = path.join(root, name)
|
|
110
|
+
if (existsSync(candidate)) return candidate
|
|
111
111
|
}
|
|
112
|
-
return undefined
|
|
112
|
+
return undefined
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
/** Stable per config content, so the emitted bundle keeps one name per boot. */
|
|
116
116
|
function configSourceKey(configPath: string): string {
|
|
117
117
|
try {
|
|
118
|
-
return Bun.hash(readFileSync(configPath)).toString(36)
|
|
118
|
+
return Bun.hash(readFileSync(configPath)).toString(36)
|
|
119
119
|
} catch {
|
|
120
|
-
return 'config'
|
|
120
|
+
return 'config'
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
function findTsconfig(root: string): string | undefined {
|
|
125
|
-
const candidate = path.join(root, 'tsconfig.json')
|
|
126
|
-
return existsSync(candidate) ? candidate : undefined
|
|
125
|
+
const candidate = path.join(root, 'tsconfig.json')
|
|
126
|
+
return existsSync(candidate) ? candidate : undefined
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
/**
|
|
@@ -136,23 +136,26 @@ async function importConfigModule(
|
|
|
136
136
|
root: string,
|
|
137
137
|
dev: boolean,
|
|
138
138
|
): Promise<NextConfigExport> {
|
|
139
|
-
const cjs = cjsConfigFormat(configPath, root)
|
|
139
|
+
const cjs = cjsConfigFormat(configPath, root)
|
|
140
140
|
if (process.env.PNEXT_CONFIG_FAST !== '0' && selfContainedConfig(configPath)) {
|
|
141
141
|
// Nothing left for the bundle pass to do, and Bun loads every supported config format natively -
|
|
142
142
|
// so skip it. Worth a special case because this is the common shape and the pass is not cheap:
|
|
143
143
|
// it loads esbuild and spawns its service child on the dev/start boot critical path.
|
|
144
|
-
if (cjs) return createRequire(pathToFileURL(configPath))(configPath) as NextConfigExport
|
|
145
|
-
const module = (await import(pathToFileURL(configPath).href)) as { default?: NextConfigExport }
|
|
146
|
-
return module.default ?? {}
|
|
144
|
+
if (cjs) return createRequire(pathToFileURL(configPath))(configPath) as NextConfigExport
|
|
145
|
+
const module = (await import(pathToFileURL(configPath).href)) as { default?: NextConfigExport }
|
|
146
|
+
return module.default ?? {}
|
|
147
147
|
}
|
|
148
148
|
// Dev keeps its scratch bundle in its own subtree; a concurrent build wipes
|
|
149
149
|
// only the build-owned `config/`.
|
|
150
|
-
const outDir = path.join(root, '.pnext', ...(dev ? ['dev'] : []), 'config')
|
|
151
|
-
mkdirSync(outDir, { recursive: true })
|
|
150
|
+
const outDir = path.join(root, '.pnext', ...(dev ? ['dev'] : []), 'config')
|
|
151
|
+
mkdirSync(outDir, { recursive: true })
|
|
152
152
|
// Content-addressed, not timestamped: a per-boot name leaked one bundle per
|
|
153
153
|
// dev start and put a path that changes every boot into the module graph,
|
|
154
154
|
// which renamed every artifact that could reach it.
|
|
155
|
-
const outfile = path.join(
|
|
155
|
+
const outfile = path.join(
|
|
156
|
+
outDir,
|
|
157
|
+
`next.config.${configSourceKey(configPath)}.${cjs ? 'cjs' : 'mjs'}`,
|
|
158
|
+
)
|
|
156
159
|
try {
|
|
157
160
|
await build({
|
|
158
161
|
entryPoints: [configPath],
|
|
@@ -195,15 +198,15 @@ async function importConfigModule(
|
|
|
195
198
|
logLevel: 'silent',
|
|
196
199
|
sourcemap: false,
|
|
197
200
|
metafile: false,
|
|
198
|
-
})
|
|
201
|
+
})
|
|
199
202
|
if (cjs) {
|
|
200
|
-
const require = createRequire(pathToFileURL(outfile))
|
|
201
|
-
return require(outfile) as NextConfigExport
|
|
203
|
+
const require = createRequire(pathToFileURL(outfile))
|
|
204
|
+
return require(outfile) as NextConfigExport
|
|
202
205
|
}
|
|
203
|
-
const module = (await import(pathToFileURL(outfile).href)) as { default?: NextConfigExport }
|
|
204
|
-
return module.default ?? {}
|
|
206
|
+
const module = (await import(pathToFileURL(outfile).href)) as { default?: NextConfigExport }
|
|
207
|
+
return module.default ?? {}
|
|
205
208
|
} finally {
|
|
206
|
-
rmSync(outfile, { force: true })
|
|
209
|
+
rmSync(outfile, { force: true })
|
|
207
210
|
}
|
|
208
211
|
}
|
|
209
212
|
|
|
@@ -214,23 +217,23 @@ async function importConfigModule(
|
|
|
214
217
|
*/
|
|
215
218
|
function selfContainedConfig(configPath: string): boolean {
|
|
216
219
|
try {
|
|
217
|
-
const source = readFileSync(configPath, 'utf8').replaceAll('import.meta', '')
|
|
218
|
-
return !/\b(?:import|require|__dirname|__filename)\b/.test(source)
|
|
220
|
+
const source = readFileSync(configPath, 'utf8').replaceAll('import.meta', '')
|
|
221
|
+
return !/\b(?:import|require|__dirname|__filename)\b/.test(source)
|
|
219
222
|
} catch {
|
|
220
|
-
return false
|
|
223
|
+
return false
|
|
221
224
|
}
|
|
222
225
|
}
|
|
223
226
|
|
|
224
227
|
function cjsConfigFormat(configPath: string, root: string): boolean {
|
|
225
|
-
if (configPath.endsWith('.cjs') || configPath.endsWith('.cts')) return true
|
|
226
|
-
if (!configPath.endsWith('.js')) return false
|
|
228
|
+
if (configPath.endsWith('.cjs') || configPath.endsWith('.cts')) return true
|
|
229
|
+
if (!configPath.endsWith('.js')) return false
|
|
227
230
|
try {
|
|
228
231
|
const pkg = JSON.parse(readFileSync(path.join(root, 'package.json'), 'utf8')) as {
|
|
229
|
-
type?: unknown
|
|
230
|
-
}
|
|
231
|
-
return pkg.type !== 'module'
|
|
232
|
+
type?: unknown
|
|
233
|
+
}
|
|
234
|
+
return pkg.type !== 'module'
|
|
232
235
|
} catch {
|
|
233
|
-
return true
|
|
236
|
+
return true
|
|
234
237
|
}
|
|
235
238
|
}
|
|
236
239
|
|
|
@@ -242,7 +245,7 @@ function cjsConfigFormat(configPath: string, root: string): boolean {
|
|
|
242
245
|
// `next/*` config helpers stay external.
|
|
243
246
|
const NEXT_DIST_STUB_CONTENTS =
|
|
244
247
|
'class PNextConfigStub {}\n' +
|
|
245
|
-
'module.exports = new Proxy(PNextConfigStub, { get: (t, k) => (k === "default" ? PNextConfigStub : t[k] ?? PNextConfigStub) });\n'
|
|
248
|
+
'module.exports = new Proxy(PNextConfigStub, { get: (t, k) => (k === "default" ? PNextConfigStub : t[k] ?? PNextConfigStub) });\n'
|
|
246
249
|
|
|
247
250
|
function nextDistStubPlugin(outDir: string): import('esbuild').Plugin {
|
|
248
251
|
return {
|
|
@@ -252,41 +255,41 @@ function nextDistStubPlugin(outDir: string): import('esbuild').Plugin {
|
|
|
252
255
|
if (args.kind === 'require-resolve') {
|
|
253
256
|
// Preserve the requested module path under the stub root so loaders
|
|
254
257
|
// downstream can still recognize WHICH next internal was meant.
|
|
255
|
-
const stubPath = path.join(outDir, 'next-dist-stub', `${args.path}.cjs`)
|
|
256
|
-
mkdirSync(path.dirname(stubPath), { recursive: true })
|
|
257
|
-
writeFileSync(stubPath, NEXT_DIST_STUB_CONTENTS)
|
|
258
|
-
return { path: stubPath, external: true }
|
|
258
|
+
const stubPath = path.join(outDir, 'next-dist-stub', `${args.path}.cjs`)
|
|
259
|
+
mkdirSync(path.dirname(stubPath), { recursive: true })
|
|
260
|
+
writeFileSync(stubPath, NEXT_DIST_STUB_CONTENTS)
|
|
261
|
+
return { path: stubPath, external: true }
|
|
259
262
|
}
|
|
260
|
-
return { path: args.path, namespace: 'pnext-next-dist-stub' }
|
|
261
|
-
})
|
|
263
|
+
return { path: args.path, namespace: 'pnext-next-dist-stub' }
|
|
264
|
+
})
|
|
262
265
|
build.onLoad({ filter: /.*/, namespace: 'pnext-next-dist-stub' }, () => ({
|
|
263
266
|
contents: NEXT_DIST_STUB_CONTENTS,
|
|
264
267
|
loader: 'js',
|
|
265
|
-
}))
|
|
268
|
+
}))
|
|
266
269
|
},
|
|
267
|
-
}
|
|
270
|
+
}
|
|
268
271
|
}
|
|
269
272
|
|
|
270
273
|
function currentPhase(dev: boolean): string {
|
|
271
|
-
return dev ? PHASE_DEVELOPMENT_SERVER : PHASE_PRODUCTION_BUILD
|
|
274
|
+
return dev ? PHASE_DEVELOPMENT_SERVER : PHASE_PRODUCTION_BUILD
|
|
272
275
|
}
|
|
273
276
|
|
|
274
277
|
/** A missing-module resolution failure (vs a genuine config error to surface). */
|
|
275
278
|
function isModuleNotFoundError(error: unknown): boolean {
|
|
276
|
-
if (!error || typeof error !== 'object') return false
|
|
277
|
-
const code = (error as { code?: unknown }).code
|
|
278
|
-
if (code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND') return true
|
|
279
|
-
const message = (error as { message?: unknown }).message
|
|
280
|
-
return typeof message === 'string' && /Cannot find (?:module|package)/.test(message)
|
|
279
|
+
if (!error || typeof error !== 'object') return false
|
|
280
|
+
const code = (error as { code?: unknown }).code
|
|
281
|
+
if (code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND') return true
|
|
282
|
+
const message = (error as { message?: unknown }).message
|
|
283
|
+
return typeof message === 'string' && /Cannot find (?:module|package)/.test(message)
|
|
281
284
|
}
|
|
282
285
|
|
|
283
286
|
function describeMissingModule(error: unknown): string {
|
|
284
|
-
const message = (error as { message?: unknown }).message
|
|
287
|
+
const message = (error as { message?: unknown }).message
|
|
285
288
|
const match =
|
|
286
289
|
typeof message === 'string'
|
|
287
290
|
? /Cannot find (?:module|package) ['"]([^'"]+)['"]/.exec(message)
|
|
288
|
-
: null
|
|
289
|
-
return match ? `${match[1]} not installed` : 'a required module is not installed'
|
|
291
|
+
: null
|
|
292
|
+
return match ? `${match[1]} not installed` : 'a required module is not installed'
|
|
290
293
|
}
|
|
291
294
|
|
|
292
295
|
async function resolveConfigExport(
|
|
@@ -296,21 +299,21 @@ async function resolveConfigExport(
|
|
|
296
299
|
const value =
|
|
297
300
|
typeof exported === 'function'
|
|
298
301
|
? await exported(currentPhase(dev), { defaultConfig: {} })
|
|
299
|
-
: await exported
|
|
300
|
-
return value ?? {}
|
|
302
|
+
: await exported
|
|
303
|
+
return value ?? {}
|
|
301
304
|
}
|
|
302
305
|
|
|
303
306
|
function mapOverrides(config: NextConfigObject): NextConfigCoreOverrides {
|
|
304
|
-
const overrides: NextConfigCoreOverrides = {}
|
|
305
|
-
if (typeof config.basePath === 'string') overrides.basePath = config.basePath
|
|
307
|
+
const overrides: NextConfigCoreOverrides = {}
|
|
308
|
+
if (typeof config.basePath === 'string') overrides.basePath = config.basePath
|
|
306
309
|
if (typeof config.assetPrefix === 'string' && config.assetPrefix.length > 0) {
|
|
307
|
-
overrides.assetPrefix = config.assetPrefix
|
|
310
|
+
overrides.assetPrefix = config.assetPrefix
|
|
308
311
|
}
|
|
309
|
-
if (typeof config.trailingSlash === 'boolean') overrides.trailingSlash = config.trailingSlash
|
|
312
|
+
if (typeof config.trailingSlash === 'boolean') overrides.trailingSlash = config.trailingSlash
|
|
310
313
|
if (typeof config.skipTrailingSlashRedirect === 'boolean')
|
|
311
|
-
overrides.skipTrailingSlashRedirect = config.skipTrailingSlashRedirect
|
|
314
|
+
overrides.skipTrailingSlashRedirect = config.skipTrailingSlashRedirect
|
|
312
315
|
if (typeof config.productionBrowserSourceMaps === 'boolean')
|
|
313
|
-
overrides.productionBrowserSourceMaps = config.productionBrowserSourceMaps
|
|
316
|
+
overrides.productionBrowserSourceMaps = config.productionBrowserSourceMaps
|
|
314
317
|
// Next's distDir maps onto pnext's outDir. pnext's default output dir is .pnext; only override when
|
|
315
318
|
// the app explicitly sets distDir. Under `output: 'export'` a custom distDir is the EXPORT
|
|
316
319
|
// destination instead - the build keeps its default dir and the static export tree lands in distDir.
|
|
@@ -319,36 +322,36 @@ function mapOverrides(config: NextConfigObject): NextConfigCoreOverrides {
|
|
|
319
322
|
config.distDir.length > 0 &&
|
|
320
323
|
config.output !== 'export'
|
|
321
324
|
) {
|
|
322
|
-
overrides.outDir = config.distDir
|
|
325
|
+
overrides.outDir = config.distDir
|
|
323
326
|
}
|
|
324
|
-
return overrides
|
|
327
|
+
return overrides
|
|
325
328
|
}
|
|
326
329
|
|
|
327
330
|
function normalizeCacheHandlerPath(config: NextConfigObject, root: string): NextConfigObject {
|
|
328
|
-
const value = config.cacheHandler
|
|
329
|
-
const cacheHandlers = config.cacheHandlers
|
|
330
|
-
let next = config
|
|
331
|
+
const value = config.cacheHandler
|
|
332
|
+
const cacheHandlers = config.cacheHandlers
|
|
333
|
+
let next = config
|
|
331
334
|
if (typeof value === 'string' && isRelativePathSpecifier(value)) {
|
|
332
|
-
next = { ...next, cacheHandler: path.resolve(root, value) }
|
|
335
|
+
next = { ...next, cacheHandler: path.resolve(root, value) }
|
|
333
336
|
}
|
|
334
337
|
if (cacheHandlers && typeof cacheHandlers === 'object' && !Array.isArray(cacheHandlers)) {
|
|
335
|
-
const normalized: Record<string, unknown> = {}
|
|
336
|
-
let changed = false
|
|
338
|
+
const normalized: Record<string, unknown> = {}
|
|
339
|
+
let changed = false
|
|
337
340
|
for (const [key, handlerPath] of Object.entries(cacheHandlers as Record<string, unknown>)) {
|
|
338
341
|
if (typeof handlerPath === 'string' && isRelativePathSpecifier(handlerPath)) {
|
|
339
|
-
normalized[key] = path.resolve(root, handlerPath)
|
|
340
|
-
changed = true
|
|
342
|
+
normalized[key] = path.resolve(root, handlerPath)
|
|
343
|
+
changed = true
|
|
341
344
|
} else {
|
|
342
|
-
normalized[key] = handlerPath
|
|
345
|
+
normalized[key] = handlerPath
|
|
343
346
|
}
|
|
344
347
|
}
|
|
345
|
-
if (changed) next = { ...next, cacheHandlers: normalized }
|
|
348
|
+
if (changed) next = { ...next, cacheHandlers: normalized }
|
|
346
349
|
}
|
|
347
|
-
return next
|
|
350
|
+
return next
|
|
348
351
|
}
|
|
349
352
|
|
|
350
353
|
function isRelativePathSpecifier(value: string): boolean {
|
|
351
|
-
return value === '.' || value === '..' || value.startsWith('./') || value.startsWith('../')
|
|
354
|
+
return value === '.' || value === '..' || value.startsWith('./') || value.startsWith('../')
|
|
352
355
|
}
|
|
353
356
|
|
|
354
357
|
/**
|
|
@@ -357,20 +360,20 @@ function isRelativePathSpecifier(value: string): boolean {
|
|
|
357
360
|
* app). Values already present in the environment win.
|
|
358
361
|
*/
|
|
359
362
|
function applyEnv(config: NextConfigObject): void {
|
|
360
|
-
const env = config.env
|
|
361
|
-
if (!env || typeof env !== 'object') return
|
|
363
|
+
const env = config.env
|
|
364
|
+
if (!env || typeof env !== 'object') return
|
|
362
365
|
for (const [key, value] of Object.entries(env as Record<string, unknown>)) {
|
|
363
|
-
if (value === undefined || value === null) continue
|
|
364
|
-
if (process.env[key] !== undefined) continue
|
|
365
|
-
process.env[key] = typeof value === 'string' ? value : (JSON.stringify(value) ?? '')
|
|
366
|
+
if (value === undefined || value === null) continue
|
|
367
|
+
if (process.env[key] !== undefined) continue
|
|
368
|
+
process.env[key] = typeof value === 'string' ? value : (JSON.stringify(value) ?? '')
|
|
366
369
|
}
|
|
367
370
|
}
|
|
368
371
|
|
|
369
372
|
/** Feed next/config's getConfig() from the loaded config's runtime configs. */
|
|
370
373
|
function applyRuntimeConfig(config: NextConfigObject): void {
|
|
371
|
-
const serverRuntimeConfig = config.serverRuntimeConfig
|
|
372
|
-
const publicRuntimeConfig = config.publicRuntimeConfig
|
|
373
|
-
if (!serverRuntimeConfig && !publicRuntimeConfig) return
|
|
374
|
+
const serverRuntimeConfig = config.serverRuntimeConfig
|
|
375
|
+
const publicRuntimeConfig = config.publicRuntimeConfig
|
|
376
|
+
if (!serverRuntimeConfig && !publicRuntimeConfig) return
|
|
374
377
|
setConfig({
|
|
375
378
|
...(serverRuntimeConfig && typeof serverRuntimeConfig === 'object'
|
|
376
379
|
? { serverRuntimeConfig: serverRuntimeConfig as Record<string, unknown> }
|
|
@@ -378,7 +381,7 @@ function applyRuntimeConfig(config: NextConfigObject): void {
|
|
|
378
381
|
...(publicRuntimeConfig && typeof publicRuntimeConfig === 'object'
|
|
379
382
|
? { publicRuntimeConfig: publicRuntimeConfig as Record<string, unknown> }
|
|
380
383
|
: {}),
|
|
381
|
-
})
|
|
384
|
+
})
|
|
382
385
|
}
|
|
383
386
|
|
|
384
387
|
const VALID_DEV_INDICATOR_POSITIONS = new Set([
|
|
@@ -386,7 +389,7 @@ const VALID_DEV_INDICATOR_POSITIONS = new Set([
|
|
|
386
389
|
'top-right',
|
|
387
390
|
'bottom-left',
|
|
388
391
|
'bottom-right',
|
|
389
|
-
])
|
|
392
|
+
])
|
|
390
393
|
|
|
391
394
|
const KNOWN_TOP_LEVEL_CONFIG_KEYS = new Set([
|
|
392
395
|
'adapterPath',
|
|
@@ -428,7 +431,7 @@ const KNOWN_TOP_LEVEL_CONFIG_KEYS = new Set([
|
|
|
428
431
|
'typedRoutes',
|
|
429
432
|
'typescript',
|
|
430
433
|
'webpack',
|
|
431
|
-
])
|
|
434
|
+
])
|
|
432
435
|
|
|
433
436
|
// Deprecated next.config options and the exact warning Next emits for each. The
|
|
434
437
|
// deprecation-warnings e2e suite asserts these substrings appear on the CLI when
|
|
@@ -459,55 +462,55 @@ const DEPRECATED_CONFIG_OPTIONS: readonly { key: string; reason: (file: string)
|
|
|
459
462
|
reason: file =>
|
|
460
463
|
`\`experimental.instrumentationHook\` is no longer needed, because \`instrumentation.js\` is available by default. You can remove it from ${file}.`,
|
|
461
464
|
},
|
|
462
|
-
]
|
|
465
|
+
]
|
|
463
466
|
|
|
464
467
|
// Config-warning de-dup: loadNextConfig runs several times per process, but Next emits each
|
|
465
468
|
// next.config validation warning only ONCE per process. Track which config files have already been
|
|
466
469
|
// warned about so repeated loads within a single process stay silent. Fatal validation is intentionally
|
|
467
470
|
// re-run every call - it throws.
|
|
468
|
-
const warnedConfigPaths = new Set<string>()
|
|
471
|
+
const warnedConfigPaths = new Set<string>()
|
|
469
472
|
|
|
470
473
|
function validateConfig(config: NextConfigObject, configPath: string): void {
|
|
471
474
|
if (!warnedConfigPaths.has(configPath)) {
|
|
472
|
-
warnedConfigPaths.add(configPath)
|
|
473
|
-
const configFileName = path.basename(configPath)
|
|
474
|
-
warnUnknownConfigKeys(config)
|
|
475
|
-
warnEsmExternalsFalse(config)
|
|
476
|
-
warnDeprecatedConfigOptions(config, configFileName)
|
|
477
|
-
warnWebpackCompat(config, configFileName)
|
|
475
|
+
warnedConfigPaths.add(configPath)
|
|
476
|
+
const configFileName = path.basename(configPath)
|
|
477
|
+
warnUnknownConfigKeys(config)
|
|
478
|
+
warnEsmExternalsFalse(config)
|
|
479
|
+
warnDeprecatedConfigOptions(config, configFileName)
|
|
480
|
+
warnWebpackCompat(config, configFileName)
|
|
478
481
|
}
|
|
479
|
-
validateDevIndicatorPosition(config)
|
|
480
|
-
const imageErrors = collectImagesConfigErrors(config, path.dirname(configPath))
|
|
482
|
+
validateDevIndicatorPosition(config)
|
|
483
|
+
const imageErrors = collectImagesConfigErrors(config, path.dirname(configPath))
|
|
481
484
|
if (imageErrors.length > 0) {
|
|
482
485
|
throw new Error(
|
|
483
486
|
`Invalid next.config.js options detected: \n${imageErrors.map(e => ` ${e}`).join('\n')}\nSee more info here: https://nextjs.org/docs/messages/invalid-next-config`,
|
|
484
|
-
)
|
|
487
|
+
)
|
|
485
488
|
}
|
|
486
489
|
}
|
|
487
490
|
|
|
488
491
|
/** True when a dotted key path (e.g. `experimental.instrumentationHook`) is set. */
|
|
489
492
|
function hasNestedKey(config: NextConfigObject, dottedKey: string): boolean {
|
|
490
|
-
let current: unknown = config
|
|
493
|
+
let current: unknown = config
|
|
491
494
|
for (const key of dottedKey.split('.')) {
|
|
492
|
-
if (!current || typeof current !== 'object') return false
|
|
493
|
-
current = (current as Record<string, unknown>)[key]
|
|
494
|
-
if (current === undefined) return false
|
|
495
|
+
if (!current || typeof current !== 'object') return false
|
|
496
|
+
current = (current as Record<string, unknown>)[key]
|
|
497
|
+
if (current === undefined) return false
|
|
495
498
|
}
|
|
496
|
-
return true
|
|
499
|
+
return true
|
|
497
500
|
}
|
|
498
501
|
|
|
499
502
|
function warnDeprecatedConfigOptions(config: NextConfigObject, configFileName: string): void {
|
|
500
503
|
for (const { key, reason } of DEPRECATED_CONFIG_OPTIONS) {
|
|
501
|
-
if (hasNestedKey(config, key)) console.warn(reason(configFileName))
|
|
504
|
+
if (hasNestedKey(config, key)) console.warn(reason(configFileName))
|
|
502
505
|
}
|
|
503
506
|
}
|
|
504
507
|
|
|
505
508
|
function warnUnknownConfigKeys(config: NextConfigObject): void {
|
|
506
|
-
const invalid = Object.keys(config).filter(key => !KNOWN_TOP_LEVEL_CONFIG_KEYS.has(key))
|
|
507
|
-
if (invalid.length === 0) return
|
|
509
|
+
const invalid = Object.keys(config).filter(key => !KNOWN_TOP_LEVEL_CONFIG_KEYS.has(key))
|
|
510
|
+
if (invalid.length === 0) return
|
|
508
511
|
console.warn(
|
|
509
512
|
`Invalid next.config.js options detected: ${invalid.map(key => `"${key}"`).join(', ')}`,
|
|
510
|
-
)
|
|
513
|
+
)
|
|
511
514
|
}
|
|
512
515
|
|
|
513
516
|
/**
|
|
@@ -516,37 +519,37 @@ function warnUnknownConfigKeys(config: NextConfigObject): void {
|
|
|
516
519
|
* the common `@svgr/webpack` case, but the function itself is still never executed).
|
|
517
520
|
*/
|
|
518
521
|
function warnWebpackCompat(config: NextConfigObject, configFileName: string): void {
|
|
519
|
-
if (typeof config.webpack !== 'function') return
|
|
522
|
+
if (typeof config.webpack !== 'function') return
|
|
520
523
|
console.warn(
|
|
521
524
|
`\`webpack\` in ${configFileName} is not executed by pnext — esbuild is the only bundler. ` +
|
|
522
525
|
'`transpilePackages`, `experimental.optimizePackageImports`, and `turbopack.resolveAlias` are ' +
|
|
523
526
|
'supported natively; see reference/compat.md.',
|
|
524
|
-
)
|
|
527
|
+
)
|
|
525
528
|
if (webpackReferencesSvgr(config)) {
|
|
526
529
|
console.info(
|
|
527
530
|
'pnext detected @svgr/webpack in `webpack()` and will compile `.svg` imports to inline Preact ' +
|
|
528
531
|
'components instead (see reference/compat.md).',
|
|
529
|
-
)
|
|
532
|
+
)
|
|
530
533
|
}
|
|
531
534
|
}
|
|
532
535
|
|
|
533
536
|
function warnEsmExternalsFalse(config: NextConfigObject): void {
|
|
534
|
-
const experimental = config.experimental
|
|
535
|
-
if (!experimental || typeof experimental !== 'object') return
|
|
536
|
-
if ((experimental as { esmExternals?: unknown }).esmExternals !== false) return
|
|
537
|
+
const experimental = config.experimental
|
|
538
|
+
if (!experimental || typeof experimental !== 'object') return
|
|
539
|
+
if ((experimental as { esmExternals?: unknown }).esmExternals !== false) return
|
|
537
540
|
console.warn(
|
|
538
541
|
'The "experimental.esmExternals" option has been modified. experimental.esmExternals is not recommended to be modified as it may disrupt module resolution. It should be removed from your next.config.js',
|
|
539
|
-
)
|
|
542
|
+
)
|
|
540
543
|
}
|
|
541
544
|
|
|
542
545
|
function validateDevIndicatorPosition(config: NextConfigObject): void {
|
|
543
|
-
const devIndicators = config.devIndicators
|
|
544
|
-
if (!devIndicators || typeof devIndicators !== 'object') return
|
|
545
|
-
const position = (devIndicators as { position?: unknown }).position
|
|
546
|
-
if (typeof position !== 'string' || VALID_DEV_INDICATOR_POSITIONS.has(position)) return
|
|
546
|
+
const devIndicators = config.devIndicators
|
|
547
|
+
if (!devIndicators || typeof devIndicators !== 'object') return
|
|
548
|
+
const position = (devIndicators as { position?: unknown }).position
|
|
549
|
+
if (typeof position !== 'string' || VALID_DEV_INDICATOR_POSITIONS.has(position)) return
|
|
547
550
|
throw new Error(
|
|
548
551
|
`Invalid "devIndicator.position" provided, expected one of top-left, top-right, bottom-left, bottom-right, received ${position}`,
|
|
549
|
-
)
|
|
552
|
+
)
|
|
550
553
|
}
|
|
551
554
|
|
|
552
555
|
/**
|
|
@@ -558,15 +561,15 @@ export async function loadNextConfig(
|
|
|
558
561
|
root: string,
|
|
559
562
|
options: { dev?: boolean } = {},
|
|
560
563
|
): Promise<LoadNextConfigResult> {
|
|
561
|
-
const configPath = findConfigPath(root)
|
|
564
|
+
const configPath = findConfigPath(root)
|
|
562
565
|
if (!configPath) {
|
|
563
|
-
setNextConfig({})
|
|
564
|
-
emitSessionStartedTelemetry({})
|
|
565
|
-
return { config: {}, overrides: {} }
|
|
566
|
+
setNextConfig({})
|
|
567
|
+
emitSessionStartedTelemetry({})
|
|
568
|
+
return { config: {}, overrides: {} }
|
|
566
569
|
}
|
|
567
|
-
let exported: NextConfigExport
|
|
570
|
+
let exported: NextConfigExport
|
|
568
571
|
try {
|
|
569
|
-
exported = await importConfigModule(configPath, root, Boolean(options.dev))
|
|
572
|
+
exported = await importConfigModule(configPath, root, Boolean(options.dev))
|
|
570
573
|
} catch (error) {
|
|
571
574
|
// A next.config that pulls in an optional wrapper dependency not installed
|
|
572
575
|
// in this app (e.g. @next/mdx when deps are declared but not installed)
|
|
@@ -576,22 +579,22 @@ export async function loadNextConfig(
|
|
|
576
579
|
console.warn(
|
|
577
580
|
`pnext: could not load ${path.relative(root, configPath)} ` +
|
|
578
581
|
`(${describeMissingModule(error)}); continuing with default config`,
|
|
579
|
-
)
|
|
580
|
-
setNextConfig({})
|
|
581
|
-
emitSessionStartedTelemetry({})
|
|
582
|
-
return { config: {}, overrides: {} }
|
|
582
|
+
)
|
|
583
|
+
setNextConfig({})
|
|
584
|
+
emitSessionStartedTelemetry({})
|
|
585
|
+
return { config: {}, overrides: {} }
|
|
583
586
|
}
|
|
584
|
-
throw error
|
|
587
|
+
throw error
|
|
585
588
|
}
|
|
586
589
|
const config = normalizeCacheHandlerPath(
|
|
587
590
|
await resolveConfigExport(exported, Boolean(options.dev)),
|
|
588
591
|
root,
|
|
589
|
-
)
|
|
590
|
-
validateConfig(config, configPath)
|
|
591
|
-
setNextConfig(config)
|
|
592
|
-
applyEnv(config)
|
|
593
|
-
applyRuntimeConfig(config)
|
|
594
|
-
emitSessionStartedTelemetry(config)
|
|
595
|
-
emitBuildFeatureUsageTelemetry(config)
|
|
596
|
-
return { config, overrides: mapOverrides(config) }
|
|
592
|
+
)
|
|
593
|
+
validateConfig(config, configPath)
|
|
594
|
+
setNextConfig(config)
|
|
595
|
+
applyEnv(config)
|
|
596
|
+
applyRuntimeConfig(config)
|
|
597
|
+
emitSessionStartedTelemetry(config)
|
|
598
|
+
emitBuildFeatureUsageTelemetry(config)
|
|
599
|
+
return { config, overrides: mapOverrides(config) }
|
|
597
600
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
export interface RuntimeConfig {
|
|
2
|
-
serverRuntimeConfig: Record<string, unknown
|
|
3
|
-
publicRuntimeConfig: Record<string, unknown
|
|
2
|
+
serverRuntimeConfig: Record<string, unknown>
|
|
3
|
+
publicRuntimeConfig: Record<string, unknown>
|
|
4
4
|
}
|
|
5
5
|
|
|
6
6
|
// Client-graph bundler defines (see compat/register/bundler.ts). Mirrors the image-config
|
|
7
7
|
// pattern: the boolean twin gates the branch on a literal so the ?? never has to fold an
|
|
8
8
|
// object define, and the define is only emitted when publicRuntimeConfig is non-empty.
|
|
9
|
-
declare const __PNEXT_PUBLIC_RUNTIME_CONFIG_INLINE__: Record<string, unknown
|
|
10
|
-
declare const __PNEXT_PUBLIC_RUNTIME_CONFIG_INLINED__: boolean
|
|
9
|
+
declare const __PNEXT_PUBLIC_RUNTIME_CONFIG_INLINE__: Record<string, unknown>
|
|
10
|
+
declare const __PNEXT_PUBLIC_RUNTIME_CONFIG_INLINED__: boolean
|
|
11
11
|
|
|
12
12
|
// Server: populated by config-loader's setConfig() at config load time. Client: inlined at
|
|
13
13
|
// build time from next.config's publicRuntimeConfig; serverRuntimeConfig never reaches the
|
|
@@ -18,12 +18,12 @@ const runtimeConfig: RuntimeConfig = {
|
|
|
18
18
|
typeof __PNEXT_PUBLIC_RUNTIME_CONFIG_INLINED__ === 'boolean'
|
|
19
19
|
? __PNEXT_PUBLIC_RUNTIME_CONFIG_INLINE__
|
|
20
20
|
: {},
|
|
21
|
-
}
|
|
21
|
+
}
|
|
22
22
|
|
|
23
23
|
export default function getConfig(): RuntimeConfig {
|
|
24
|
-
return runtimeConfig
|
|
24
|
+
return runtimeConfig
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export function setConfig(config: Partial<RuntimeConfig>) {
|
|
28
|
-
Object.assign(runtimeConfig, config)
|
|
28
|
+
Object.assign(runtimeConfig, config)
|
|
29
29
|
}
|