@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
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import path from 'node:path'
|
|
2
|
-
import { type ResolvedConfig } from '../../config'
|
|
3
|
-
import { setProxyExtensions, setProxyResponseProtocol } from '../../extensions'
|
|
4
|
-
import { findProxyFiles, setProxyRewriteObserver } from '../../proxy'
|
|
5
|
-
import { moduleExportNames } from '../../resolve/scan-facts'
|
|
6
|
-
import { readText, toPosixPath } from '../../utils/fs'
|
|
7
|
-
import { recordRewrite } from '../protocol'
|
|
8
|
-
import { recordCanonicalUrl } from '../next/canonical-url'
|
|
9
|
-
import { getNextConfig } from '../next/config-loader'
|
|
10
|
-
import { activateTestProxy } from '../lifecycle/testmode'
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { type ResolvedConfig } from '../../config'
|
|
3
|
+
import { setProxyExtensions, setProxyResponseProtocol } from '../../extensions'
|
|
4
|
+
import { findProxyFiles, setProxyRewriteObserver } from '../../routing/proxy'
|
|
5
|
+
import { moduleExportNames } from '../../resolve/scan-facts'
|
|
6
|
+
import { readText, toPosixPath } from '../../utils/fs'
|
|
7
|
+
import { recordRewrite } from '../protocol'
|
|
8
|
+
import { recordCanonicalUrl } from '../next/canonical-url'
|
|
9
|
+
import { getNextConfig } from '../next/config-loader'
|
|
10
|
+
import { activateTestProxy } from '../lifecycle/testmode'
|
|
11
11
|
|
|
12
12
|
export function registerProxyExtensions(_config: ResolvedConfig): void {
|
|
13
13
|
setProxyResponseProtocol({
|
|
14
14
|
nextHeader: 'x-middleware-next',
|
|
15
15
|
rewriteHeader: 'x-middleware-rewrite',
|
|
16
|
-
})
|
|
16
|
+
})
|
|
17
17
|
setProxyExtensions({
|
|
18
18
|
names: ['proxy', 'middleware'],
|
|
19
19
|
validateFiles: validateNextProxyFiles,
|
|
@@ -22,88 +22,86 @@ export function registerProxyExtensions(_config: ResolvedConfig): void {
|
|
|
22
22
|
locale: proxyLocale,
|
|
23
23
|
onExternalRewrite: request => activateTestProxy(request.headers),
|
|
24
24
|
clientMaxBodySize: proxyClientMaxBodySize,
|
|
25
|
-
})
|
|
25
|
+
})
|
|
26
26
|
// A same-origin middleware rewrite feeds the Next rewrite-tracking channel so
|
|
27
27
|
// RSC responses carry x-nextjs-rewritten-path/query (identical to next.config
|
|
28
28
|
// rewrites; the RSC-only emission gate lives in compat/protocol.ts). The
|
|
29
29
|
// ORIGINAL url is stashed too so usePathname/useSearchParams stay canonical.
|
|
30
30
|
setProxyRewriteObserver((from, to) => {
|
|
31
|
-
recordCanonicalUrl(from)
|
|
32
|
-
recordRewrite(from, to)
|
|
33
|
-
})
|
|
31
|
+
recordCanonicalUrl(from)
|
|
32
|
+
recordRewrite(from, to)
|
|
33
|
+
})
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
const DEFAULT_PROXY_CLIENT_MAX_BODY_SIZE = 10 * 1024 * 1024
|
|
36
|
+
const DEFAULT_PROXY_CLIENT_MAX_BODY_SIZE = 10 * 1024 * 1024
|
|
37
37
|
|
|
38
38
|
// experimental.proxyClientMaxBodySize accepts bytes (2097152) or a size string
|
|
39
39
|
// ('5mb'); experimental.middlewareClientMaxBodySize is the deprecated alias.
|
|
40
40
|
function proxyClientMaxBodySize(): number {
|
|
41
|
-
const experimental = (getNextConfig().experimental ?? {}) as Record<string, unknown
|
|
42
|
-
const raw = experimental.proxyClientMaxBodySize ?? experimental.middlewareClientMaxBodySize
|
|
43
|
-
if (typeof raw === 'number' && raw > 0) return raw
|
|
41
|
+
const experimental = (getNextConfig().experimental ?? {}) as Record<string, unknown>
|
|
42
|
+
const raw = experimental.proxyClientMaxBodySize ?? experimental.middlewareClientMaxBodySize
|
|
43
|
+
if (typeof raw === 'number' && raw > 0) return raw
|
|
44
44
|
if (typeof raw === 'string') {
|
|
45
|
-
const match = /^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/i.exec(raw.trim())
|
|
45
|
+
const match = /^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/i.exec(raw.trim())
|
|
46
46
|
if (match?.[1]) {
|
|
47
|
-
const unit = (match[2] ?? 'b').toLowerCase()
|
|
47
|
+
const unit = (match[2] ?? 'b').toLowerCase()
|
|
48
48
|
const multiplier =
|
|
49
|
-
unit === 'gb' ? 1024 ** 3 : unit === 'mb' ? 1024 ** 2 : unit === 'kb' ? 1024 : 1
|
|
50
|
-
const bytes = Math.floor(Number(match[1]) * multiplier)
|
|
51
|
-
if (bytes > 0) return bytes
|
|
49
|
+
unit === 'gb' ? 1024 ** 3 : unit === 'mb' ? 1024 ** 2 : unit === 'kb' ? 1024 : 1
|
|
50
|
+
const bytes = Math.floor(Number(match[1]) * multiplier)
|
|
51
|
+
if (bytes > 0) return bytes
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
-
return DEFAULT_PROXY_CLIENT_MAX_BODY_SIZE
|
|
54
|
+
return DEFAULT_PROXY_CLIENT_MAX_BODY_SIZE
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
function proxyLocale(url: URL): string {
|
|
58
|
-
const i18n = getNextConfig().i18n as { locales?: unknown } | undefined
|
|
59
|
-
if (!Array.isArray(i18n?.locales)) return ''
|
|
60
|
-
const locales = i18n.locales.filter((locale): locale is string => typeof locale === 'string')
|
|
61
|
-
const dataLocale = /^\/_next\/data\/[^/]+\/([^/]+)(?:\/|$)/.exec(url.pathname)?.[1]
|
|
62
|
-
const candidate = dataLocale ?? url.pathname.split('/')[1]
|
|
63
|
-
return locales.find(locale => locale.toLowerCase() === candidate?.toLowerCase()) ?? ''
|
|
58
|
+
const i18n = getNextConfig().i18n as { locales?: unknown } | undefined
|
|
59
|
+
if (!Array.isArray(i18n?.locales)) return ''
|
|
60
|
+
const locales = i18n.locales.filter((locale): locale is string => typeof locale === 'string')
|
|
61
|
+
const dataLocale = /^\/_next\/data\/[^/]+\/([^/]+)(?:\/|$)/.exec(url.pathname)?.[1]
|
|
62
|
+
const candidate = dataLocale ?? url.pathname.split('/')[1]
|
|
63
|
+
return locales.find(locale => locale.toLowerCase() === candidate?.toLowerCase()) ?? ''
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
async function validateNextProxyFiles(config: ResolvedConfig) {
|
|
67
|
-
const files = findProxyFiles(config, ['proxy', 'middleware'])
|
|
68
|
-
const middleware = files.find(file => path.basename(file).startsWith('middleware.'))
|
|
69
|
-
const proxy = files.find(file => path.basename(file).startsWith('proxy.'))
|
|
67
|
+
const files = findProxyFiles(config, ['proxy', 'middleware'])
|
|
68
|
+
const middleware = files.find(file => path.basename(file).startsWith('middleware.'))
|
|
69
|
+
const proxy = files.find(file => path.basename(file).startsWith('proxy.'))
|
|
70
70
|
if (middleware && proxy) {
|
|
71
71
|
throw new Error(
|
|
72
72
|
`Both middleware file "${relativeProxyPath(config, middleware)}" and proxy file "${relativeProxyPath(config, proxy)}" are detected. Please use "${relativeProxyPath(config, proxy)}" only.`,
|
|
73
|
-
)
|
|
73
|
+
)
|
|
74
74
|
}
|
|
75
75
|
if (middleware && !proxy) {
|
|
76
|
-
console.warn(
|
|
77
|
-
'The "middleware" file convention is deprecated. Please use "proxy" instead.',
|
|
78
|
-
);
|
|
76
|
+
console.warn('The "middleware" file convention is deprecated. Please use "proxy" instead.')
|
|
79
77
|
}
|
|
80
|
-
await Promise.all(files.map(file => validateNextProxyFile(config, file)))
|
|
78
|
+
await Promise.all(files.map(file => validateNextProxyFile(config, file)))
|
|
81
79
|
}
|
|
82
80
|
|
|
83
81
|
async function validateNextProxyFile(config: ResolvedConfig, file: string) {
|
|
84
|
-
const source = await readText(file)
|
|
85
|
-
const name = path.basename(file).split('.')[0]
|
|
86
|
-
const exports = moduleExportNames(source, file)
|
|
82
|
+
const source = await readText(file)
|
|
83
|
+
const name = path.basename(file).split('.')[0]
|
|
84
|
+
const exports = moduleExportNames(source, file)
|
|
87
85
|
const validExport =
|
|
88
86
|
exports.includes('default') ||
|
|
89
|
-
(name === 'proxy' ? exports.includes('proxy') : exports.includes('middleware'))
|
|
87
|
+
(name === 'proxy' ? exports.includes('proxy') : exports.includes('middleware'))
|
|
90
88
|
if (!validExport) {
|
|
91
|
-
throw new Error(proxyMissingExportError(config, file))
|
|
89
|
+
throw new Error(proxyMissingExportError(config, file))
|
|
92
90
|
}
|
|
93
91
|
if (name === 'proxy' && hasRuntimeConfig(source)) {
|
|
94
92
|
throw new Error(
|
|
95
93
|
`Route segment config is not allowed in Proxy file at "${relativeProxyPath(config, file)}". Proxy always runs on Node.js runtime. Learn more: https://nextjs.org/docs/messages/middleware-to-proxy`,
|
|
96
|
-
)
|
|
94
|
+
)
|
|
97
95
|
}
|
|
98
96
|
}
|
|
99
97
|
|
|
100
98
|
function proxyMissingExportError(config: ResolvedConfig, file: string) {
|
|
101
|
-
const name = path.basename(file).split('.')[0] === 'middleware' ? 'middleware' : 'proxy'
|
|
99
|
+
const name = path.basename(file).split('.')[0] === 'middleware' ? 'middleware' : 'proxy'
|
|
102
100
|
const migrationReason =
|
|
103
101
|
name === 'proxy'
|
|
104
102
|
? "- You are migrating from `middleware` to `proxy`, but haven't updated the exported function.\n"
|
|
105
|
-
: ''
|
|
106
|
-
const target = name === 'proxy' ? 'proxy (previously called middleware)' : 'middleware'
|
|
103
|
+
: ''
|
|
104
|
+
const target = name === 'proxy' ? 'proxy (previously called middleware)' : 'middleware'
|
|
107
105
|
return `The file "${relativeProxyPath(config, file)}" must export a function, either as a default export or as a named "${name}" export.
|
|
108
106
|
This function is what Next.js runs for every request handled by this ${target}.
|
|
109
107
|
|
|
@@ -115,13 +113,13 @@ ${migrationReason}- The file exists but doesn't export a function.
|
|
|
115
113
|
To fix it:
|
|
116
114
|
- Ensure this file has either a default or "${name}" function export.
|
|
117
115
|
|
|
118
|
-
Learn more: https://nextjs.org/docs/messages/middleware-to-proxy
|
|
116
|
+
Learn more: https://nextjs.org/docs/messages/middleware-to-proxy`
|
|
119
117
|
}
|
|
120
118
|
|
|
121
119
|
function hasRuntimeConfig(source: string) {
|
|
122
|
-
return /\bexport\s+const\s+config\s*=/.test(source) && /\bruntime\s*:/.test(source)
|
|
120
|
+
return /\bexport\s+const\s+config\s*=/.test(source) && /\bruntime\s*:/.test(source)
|
|
123
121
|
}
|
|
124
122
|
|
|
125
123
|
function relativeProxyPath(config: ResolvedConfig, file: string) {
|
|
126
|
-
return `./${toPosixPath(path.relative(config.root, file))}
|
|
124
|
+
return `./${toPosixPath(path.relative(config.root, file))}`
|
|
127
125
|
}
|
|
@@ -16,12 +16,12 @@
|
|
|
16
16
|
// serializeServerActionProp, collectRenderMeta and the server-action module tagging hooks are populated
|
|
17
17
|
// by the actions and cache sub-registrars; this file owns the react and font/suspense hooks.
|
|
18
18
|
|
|
19
|
-
import type { ResolvedConfig } from '../../config'
|
|
20
|
-
import { onExtensionHostReset, setRenderExtensions } from '../../extensions'
|
|
21
|
-
import { setReactCompatActive } from '../react/preact'
|
|
19
|
+
import type { ResolvedConfig } from '../../config'
|
|
20
|
+
import { onExtensionHostReset, setRenderExtensions } from '../../extensions'
|
|
21
|
+
import { setReactCompatActive } from '../react/preact'
|
|
22
22
|
|
|
23
23
|
// preact's global vnode hook cannot be uninstalled, so it follows the host.
|
|
24
|
-
onExtensionHostReset(() => setReactCompatActive(false))
|
|
24
|
+
onExtensionHostReset(() => setReactCompatActive(false))
|
|
25
25
|
import {
|
|
26
26
|
nextCompatEnabled,
|
|
27
27
|
reactCompatEnabled,
|
|
@@ -31,72 +31,74 @@ import {
|
|
|
31
31
|
setStaticParamsExtensions,
|
|
32
32
|
setStreamRouteExtensions,
|
|
33
33
|
setSuspenseExtensions,
|
|
34
|
-
} from '../../render/hooks'
|
|
35
|
-
import { withAssetPrefix } from '../../css'
|
|
36
|
-
import { polyfillsChunkPath } from '../bundler/polyfill'
|
|
37
|
-
import { nextRouterShimScript } from '../react/router-shim'
|
|
38
|
-
import { renderPartytownHeadScripts } from '../next/script'
|
|
39
|
-
import { ensureCompatSuspense, compatSuspenseType } from '../../compat'
|
|
40
|
-
import { invokeServerComponentWithUse } from '../react/server-component-use'
|
|
41
|
-
import {
|
|
34
|
+
} from '../../render/hooks'
|
|
35
|
+
import { withAssetPrefix } from '../../css/build'
|
|
36
|
+
import { polyfillsChunkPath } from '../bundler/polyfill'
|
|
37
|
+
import { nextRouterShimScript } from '../react/router-shim'
|
|
38
|
+
import { renderPartytownHeadScripts } from '../next/script'
|
|
39
|
+
import { ensureCompatSuspense, compatSuspenseType } from '../../compat/aliases'
|
|
40
|
+
import { invokeServerComponentWithUse } from '../react/server-component-use'
|
|
41
|
+
import {
|
|
42
|
+
fontAssets,
|
|
43
|
+
fontPreloadDomScript,
|
|
44
|
+
prewarmFonts,
|
|
45
|
+
runWithFontScope,
|
|
46
|
+
} from '../next/font/runtime'
|
|
42
47
|
import {
|
|
43
48
|
hasRuntimeMetadata,
|
|
44
49
|
readNextModuleMetadata,
|
|
45
50
|
readNextModuleViewport,
|
|
46
51
|
shouldRenderMetadataInBody,
|
|
47
|
-
} from '../metadata'
|
|
48
|
-
import { aliasGenerateStaticParams } from '../static-params'
|
|
49
|
-
import { getNextConfig } from '../next/config-loader'
|
|
50
|
-
import {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
} from '
|
|
54
|
-
import { nextClientRouteState } from '../next/optimistic-route-state';
|
|
55
|
-
import { earlySubmitCaptureScript } from '../actions/early-submit';
|
|
56
|
-
import { getWorkUnit } from '../../request/context';
|
|
52
|
+
} from '../metadata'
|
|
53
|
+
import { aliasGenerateStaticParams } from '../static-params'
|
|
54
|
+
import { getNextConfig } from '../next/config-loader'
|
|
55
|
+
import { renderServerInsertedHTML, setServerInsertedHTMLScope } from '../react/server-inserted-html'
|
|
56
|
+
import { nextClientRouteState } from '../next/route-state'
|
|
57
|
+
import { earlySubmitCaptureScript } from '../actions/early-submit'
|
|
58
|
+
import { getWorkUnit } from '../../request/context'
|
|
57
59
|
import {
|
|
58
60
|
createVaryParamsAccumulator,
|
|
59
61
|
createVaryingParams,
|
|
60
62
|
createVaryingSearchParams,
|
|
61
63
|
normalizeOptionalCatchAllParams,
|
|
62
|
-
} from '../segment/vary-params'
|
|
63
|
-
import type { VaryParamsTrackingContext } from '../../extensions'
|
|
64
|
+
} from '../segment/vary-params'
|
|
65
|
+
import type { VaryParamsTrackingContext } from '../../extensions'
|
|
64
66
|
|
|
65
67
|
export function registerRenderExtensions(config: ResolvedConfig): void {
|
|
66
68
|
// The react layer only matters when react/next compat is on. A next-only
|
|
67
69
|
// predicate would miss react-compat-only apps (which still render server
|
|
68
70
|
// components with use() and need the compat Suspense identity for streaming).
|
|
69
|
-
if (!reactCompatEnabled(config)) return
|
|
71
|
+
if (!reactCompatEnabled(config)) return
|
|
70
72
|
|
|
71
|
-
setReactCompatActive(true)
|
|
73
|
+
setReactCompatActive(true)
|
|
72
74
|
|
|
73
75
|
setServerInsertedHTMLScope(() => {
|
|
74
|
-
const workUnit = getWorkUnit()
|
|
75
|
-
if (!workUnit) return undefined
|
|
76
|
-
return (workUnit.compat ??= {})
|
|
77
|
-
})
|
|
76
|
+
const workUnit = getWorkUnit()
|
|
77
|
+
if (!workUnit) return undefined
|
|
78
|
+
return (workUnit.compat ??= {})
|
|
79
|
+
})
|
|
78
80
|
|
|
79
81
|
setRenderExtensions({
|
|
80
82
|
wrapServerComponentInvoke: invokeServerComponentWithUse,
|
|
81
83
|
genericErrorTitle: ({ dev }) => (dev ? undefined : 'This page couldn\u2019t load'),
|
|
82
|
-
})
|
|
84
|
+
})
|
|
83
85
|
|
|
84
|
-
setSuspenseExtensions({ ensureCompatSuspense, compatSuspenseType })
|
|
86
|
+
setSuspenseExtensions({ ensureCompatSuspense, compatSuspenseType })
|
|
85
87
|
|
|
86
88
|
// next/font is a next-compat feature; a react-only app renders no fonts.
|
|
87
89
|
if (nextCompatEnabled(config)) {
|
|
88
90
|
setStreamRouteExtensions({
|
|
89
91
|
canStreamRoute: canStreamNextRoute,
|
|
90
92
|
inlineSuspenseStream: needsInlineSuspenseStream,
|
|
91
|
-
})
|
|
93
|
+
})
|
|
92
94
|
setMetadataExtensions({
|
|
93
95
|
enabled: nextCompatEnabled,
|
|
94
96
|
hasRuntimeMetadata,
|
|
95
97
|
readModuleMetadata: readNextModuleMetadata,
|
|
96
98
|
readModuleViewport: readNextModuleViewport,
|
|
97
99
|
shouldRenderMetadataInBody,
|
|
98
|
-
})
|
|
99
|
-
setStaticParamsExtensions({ normalizeModule: aliasGenerateStaticParams })
|
|
100
|
+
})
|
|
101
|
+
setStaticParamsExtensions({ normalizeModule: aliasGenerateStaticParams })
|
|
100
102
|
setRenderExtensions({
|
|
101
103
|
clientRouteState: nextClientRouteState,
|
|
102
104
|
trackVaryParams: trackRenderVaryParams,
|
|
@@ -104,17 +106,21 @@ export function registerRenderExtensions(config: ResolvedConfig): void {
|
|
|
104
106
|
// island hosts and the page slot travel as comment pairs and the inline
|
|
105
107
|
// bootstrap materializes them. Core ships the elements as final.
|
|
106
108
|
islandCommentWireFormat: () => true,
|
|
107
|
-
})
|
|
109
|
+
})
|
|
108
110
|
setDocumentScriptExtensions({
|
|
109
111
|
stylesheetPrecedence: cfg => (nextCompatEnabled(cfg) ? 'next' : undefined),
|
|
110
|
-
})
|
|
111
|
-
setFontExtensions({
|
|
112
|
+
})
|
|
113
|
+
setFontExtensions({
|
|
114
|
+
runWithFontScope,
|
|
115
|
+
collectFontAssets: fontAssets,
|
|
116
|
+
prewarmFontAssets: prewarmFonts,
|
|
117
|
+
})
|
|
112
118
|
setDocumentScriptExtensions({
|
|
113
119
|
documentBodyScripts: cfg =>
|
|
114
120
|
`${flightDataBootstrapScript()}${renderPartytownHeadScripts()}${basePathScript(cfg.basePath)}${trailingSlashScript(cfg.trailingSlash)}${skipTrailingSlashScript(cfg.skipTrailingSlashRedirect)}${staleTimesScript()}${segmentSchedulerScript()}${appShellsScript()}${optimisticRoutingScript()}${nextRouterShimScript()}<script>${earlySubmitCaptureScript()}</script>${fontPreloadDomScript()}`,
|
|
115
121
|
documentHeadTags: () => `${polyfillsScript(config)}${renderServerInsertedHTML()}`,
|
|
116
122
|
streamInsertedHTML: renderServerInsertedHTML,
|
|
117
|
-
})
|
|
123
|
+
})
|
|
118
124
|
}
|
|
119
125
|
}
|
|
120
126
|
|
|
@@ -129,17 +135,17 @@ function trackRenderVaryParams<T extends Record<string, unknown>>(
|
|
|
129
135
|
value: T,
|
|
130
136
|
context: VaryParamsTrackingContext,
|
|
131
137
|
): T {
|
|
132
|
-
const accumulator = createVaryParamsAccumulator(context.segment ?? 'page')
|
|
138
|
+
const accumulator = createVaryParamsAccumulator(context.segment ?? 'page')
|
|
133
139
|
if (!accumulator) {
|
|
134
140
|
// Segment-M2 deliverable 5: Next's params shape (an EMPTY optional catch-all
|
|
135
141
|
// carries no key) applies to every render, not just tracked ones.
|
|
136
142
|
return context.kind === 'searchParams'
|
|
137
143
|
? value
|
|
138
|
-
: normalizeOptionalCatchAllParams(value, context.optionalCatchAllParam ?? null)
|
|
144
|
+
: normalizeOptionalCatchAllParams(value, context.optionalCatchAllParam ?? null)
|
|
139
145
|
}
|
|
140
146
|
return context.kind === 'searchParams'
|
|
141
147
|
? createVaryingSearchParams(accumulator, value)
|
|
142
|
-
: createVaryingParams(accumulator, value, context.optionalCatchAllParam ?? null)
|
|
148
|
+
: createVaryingParams(accumulator, value, context.optionalCatchAllParam ?? null)
|
|
143
149
|
}
|
|
144
150
|
|
|
145
151
|
/**
|
|
@@ -150,7 +156,7 @@ function trackRenderVaryParams<T extends Record<string, unknown>>(
|
|
|
150
156
|
* by construction.
|
|
151
157
|
*/
|
|
152
158
|
function flightDataBootstrapScript(): string {
|
|
153
|
-
return `<script>(self.__next_f=self.__next_f||[]).push([0])</script
|
|
159
|
+
return `<script>(self.__next_f=self.__next_f||[]).push([0])</script>`
|
|
154
160
|
}
|
|
155
161
|
|
|
156
162
|
// Next emits a `<script noModule>` tag referencing the polyfills chunk in the
|
|
@@ -159,28 +165,27 @@ function flightDataBootstrapScript(): string {
|
|
|
159
165
|
// written by the client build's static-chunk seam). assetPrefix is applied so a
|
|
160
166
|
// CDN-hosted asset base still resolves.
|
|
161
167
|
function polyfillsScript(config: ResolvedConfig): string {
|
|
162
|
-
return `<script src="${withAssetPrefix(config, polyfillsChunkPath())}" noModule=""></script
|
|
168
|
+
return `<script src="${withAssetPrefix(config, polyfillsChunkPath())}" noModule=""></script>`
|
|
163
169
|
}
|
|
164
170
|
|
|
165
171
|
function canStreamNextRoute(input: {
|
|
166
|
-
config: ResolvedConfig
|
|
167
|
-
route: { client?: boolean; stream?: unknown }
|
|
172
|
+
config: ResolvedConfig
|
|
173
|
+
route: { client?: boolean; stream?: unknown }
|
|
168
174
|
}) {
|
|
169
|
-
if (!nextCompatEnabled(input.config)) return true
|
|
175
|
+
if (!nextCompatEnabled(input.config)) return true
|
|
170
176
|
// Whole-page client routes stream through a single Preact render, preserving
|
|
171
177
|
// ancestor provider context across their Suspense boundaries.
|
|
172
|
-
if (input.route.client) return true
|
|
178
|
+
if (input.route.client) return true
|
|
173
179
|
const stream = input.route.stream as
|
|
174
|
-
|
|
175
|
-
| undefined;
|
|
180
|
+
{ hasLoadingBoundary?: boolean; ancestorClientReferences?: string[] } | undefined
|
|
176
181
|
// No stream metadata means a non-page route (handlers never reach the page
|
|
177
182
|
// renderer) — nothing to stream.
|
|
178
|
-
if (!stream) return false
|
|
183
|
+
if (!stream) return false
|
|
179
184
|
// Out-of-order streaming isolates each Suspense boundary and drops client-provider context inherited
|
|
180
185
|
// from ancestor layouts/templates. When no ancestor ships a client reference there is nothing to lose;
|
|
181
186
|
// when one does, the route still streams through the single-render inline-suspense path, which keeps the
|
|
182
187
|
// whole tree in one preact render so ancestor providers stay in scope.
|
|
183
|
-
return true
|
|
188
|
+
return true
|
|
184
189
|
}
|
|
185
190
|
|
|
186
191
|
// A route whose ancestor layouts/templates ship client references streams in
|
|
@@ -188,34 +193,34 @@ function canStreamNextRoute(input: {
|
|
|
188
193
|
// replacement chunks rendered from a fresh root, which would drop the ancestor
|
|
189
194
|
// islands' provider context around the boundary's content.
|
|
190
195
|
function needsInlineSuspenseStream(input: {
|
|
191
|
-
config: ResolvedConfig
|
|
192
|
-
route: { client?: boolean; stream?: unknown }
|
|
196
|
+
config: ResolvedConfig
|
|
197
|
+
route: { client?: boolean; stream?: unknown }
|
|
193
198
|
}) {
|
|
194
|
-
if (!nextCompatEnabled(input.config) || input.route.client) return false
|
|
195
|
-
const stream = input.route.stream as { ancestorClientReferences?: string[] } | undefined
|
|
196
|
-
return (stream?.ancestorClientReferences?.length ?? 0) > 0
|
|
199
|
+
if (!nextCompatEnabled(input.config) || input.route.client) return false
|
|
200
|
+
const stream = input.route.stream as { ancestorClientReferences?: string[] } | undefined
|
|
201
|
+
return (stream?.ancestorClientReferences?.length ?? 0) > 0
|
|
197
202
|
}
|
|
198
203
|
|
|
199
204
|
// Inline script exposing experimental.staleTimes so the client prefetch cache
|
|
200
205
|
// honors config overrides (defaults 30s dynamic / 300s static apply otherwise).
|
|
201
206
|
function staleTimesScript(): string {
|
|
202
207
|
const experimental = getNextConfig().experimental as
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
return `<script>window.__PNEXT_STALE_TIMES__=${JSON.stringify(staleTimes)};</script>`;
|
|
208
|
+
{ staleTimes?: { dynamic?: number; static?: number } } | undefined
|
|
209
|
+
const staleTimes = experimental?.staleTimes
|
|
210
|
+
if (!staleTimes) return ''
|
|
211
|
+
return `<script>window.__PNEXT_STALE_TIMES__=${JSON.stringify(staleTimes)};</script>`
|
|
208
212
|
}
|
|
209
213
|
|
|
210
214
|
// The client prefetch bandwidth scheduler (concurrency limits + hover-reserved lanes) reproduces Next's
|
|
211
215
|
// SEGMENT-CACHE scheduler, which only exists under cacheComponents. A classic prefetch app must fire all
|
|
212
216
|
// visible prefetches without throttling - the app-client-cache full-prefetch tests clear their request
|
|
213
217
|
// listener between two staggered prefetches and would see the delayed one land as an unexpected request.
|
|
218
|
+
// Core defaults to scheduling, so plain compat stamps an explicit `false` to opt out.
|
|
214
219
|
function segmentSchedulerScript(): string {
|
|
215
|
-
const config = getNextConfig() as { cacheComponents?: unknown }
|
|
220
|
+
const config = getNextConfig() as { cacheComponents?: unknown }
|
|
216
221
|
return config.cacheComponents === true
|
|
217
222
|
? `<script>window.__PNEXT_SEGMENT_SCHEDULER__=true;</script>`
|
|
218
|
-
:
|
|
223
|
+
: `<script>window.__PNEXT_SEGMENT_SCHEDULER__=false;</script>`
|
|
219
224
|
}
|
|
220
225
|
|
|
221
226
|
// `experimental.appShells`: the client fires a SECOND, param-stripped prefetch
|
|
@@ -223,10 +228,10 @@ function segmentSchedulerScript(): string {
|
|
|
223
228
|
// client/segment-prefetch.ts). Strictly opt-in — without the flag the extra
|
|
224
229
|
// request would break the request-count contracts of every other suite.
|
|
225
230
|
function appShellsScript(): string {
|
|
226
|
-
const experimental = getNextConfig().experimental as { appShells?: unknown } | undefined
|
|
231
|
+
const experimental = getNextConfig().experimental as { appShells?: unknown } | undefined
|
|
227
232
|
return experimental?.appShells === true
|
|
228
233
|
? `<script>window.__PNEXT_APP_SHELLS__=true;</script>`
|
|
229
|
-
: ''
|
|
234
|
+
: ''
|
|
230
235
|
}
|
|
231
236
|
|
|
232
237
|
// `experimental.optimisticRouting` defaults ON, so this is an OPT-OUT marker:
|
|
@@ -234,12 +239,10 @@ function appShellsScript(): string {
|
|
|
234
239
|
// segment cache then stops letting one URL's entry satisfy another URL's
|
|
235
240
|
// PREFETCH (compat/client/segment-cache.ts). Navigation reuse is unaffected.
|
|
236
241
|
function optimisticRoutingScript(): string {
|
|
237
|
-
const experimental = getNextConfig().experimental as
|
|
238
|
-
| { optimisticRouting?: unknown }
|
|
239
|
-
| undefined;
|
|
242
|
+
const experimental = getNextConfig().experimental as { optimisticRouting?: unknown } | undefined
|
|
240
243
|
return experimental?.optimisticRouting === false
|
|
241
244
|
? `<script>window.__PNEXT_NO_OPTIMISTIC_ROUTING__=true;</script>`
|
|
242
|
-
: ''
|
|
245
|
+
: ''
|
|
243
246
|
}
|
|
244
247
|
|
|
245
248
|
/**
|
|
@@ -248,8 +251,8 @@ function optimisticRoutingScript(): string {
|
|
|
248
251
|
* bare app keeps the global undefined, treated as ''.
|
|
249
252
|
*/
|
|
250
253
|
function basePathScript(basePath: string): string {
|
|
251
|
-
if (!basePath) return ''
|
|
252
|
-
return `<script>window.__PNEXT_BASE_PATH__=${JSON.stringify(basePath)};</script
|
|
254
|
+
if (!basePath) return ''
|
|
255
|
+
return `<script>window.__PNEXT_BASE_PATH__=${JSON.stringify(basePath)};</script>`
|
|
253
256
|
}
|
|
254
257
|
|
|
255
258
|
/**
|
|
@@ -258,11 +261,11 @@ function basePathScript(basePath: string): string {
|
|
|
258
261
|
* global undefined, treated as false.
|
|
259
262
|
*/
|
|
260
263
|
function skipTrailingSlashScript(skip: boolean | undefined): string {
|
|
261
|
-
if (!skip) return ''
|
|
262
|
-
return `<script>window.__PNEXT_SKIP_TRAILING_SLASH__=true;</script
|
|
264
|
+
if (!skip) return ''
|
|
265
|
+
return `<script>window.__PNEXT_SKIP_TRAILING_SLASH__=true;</script>`
|
|
263
266
|
}
|
|
264
267
|
|
|
265
268
|
function trailingSlashScript(trailingSlash: boolean | undefined): string {
|
|
266
|
-
if (trailingSlash !== true) return ''
|
|
267
|
-
return `<script>window.__PNEXT_TRAILING_SLASH__=true;</script
|
|
269
|
+
if (trailingSlash !== true) return ''
|
|
270
|
+
return `<script>window.__PNEXT_TRAILING_SLASH__=true;</script>`
|
|
268
271
|
}
|