@wular/pnext 0.0.3 → 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 -1961
- 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 -1887
- 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} +152 -143
- package/src/resolve/engine.ts +90 -77
- package/src/resolve/imports.ts +475 -463
- package/src/resolve/scan-facts.ts +442 -186
- 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 +833 -848
- 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
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
import { currentParams, currentRequest, getWorkUnit } from '../../request/context'
|
|
1
|
+
import { currentParams, currentRequest, getWorkUnit } from '../../request/context'
|
|
2
2
|
import {
|
|
3
3
|
cacheComponents,
|
|
4
4
|
hangingPromise,
|
|
5
5
|
isPrerendering,
|
|
6
6
|
isRuntimePrefetchPrerender,
|
|
7
|
-
} from '../../ppr'
|
|
8
|
-
import { currentRenderCacheMeta, insideUnstableCacheProducer } from '../cache/revalidate'
|
|
9
|
-
import { insideUseCacheProducer, recordUseCacheRootParamRead } from '../cache/use-cache'
|
|
10
|
-
import { generateStaticParamsScope } from '../static-params'
|
|
11
|
-
import { accumulateRootVaryParam } from '../segment/vary-params'
|
|
7
|
+
} from '../../render/ppr'
|
|
8
|
+
import { currentRenderCacheMeta, insideUnstableCacheProducer } from '../cache/revalidate'
|
|
9
|
+
import { insideUseCacheProducer, recordUseCacheRootParamRead } from '../cache/use-cache'
|
|
10
|
+
import { generateStaticParamsScope } from '../static-params'
|
|
11
|
+
import { accumulateRootVaryParam } from '../segment/vary-params'
|
|
12
12
|
|
|
13
13
|
function currentRoutePattern(): string {
|
|
14
|
-
let pathname: string
|
|
14
|
+
let pathname: string
|
|
15
15
|
try {
|
|
16
|
-
pathname = new URL(currentRequest()?.url ?? '').pathname
|
|
16
|
+
pathname = new URL(currentRequest()?.url ?? '').pathname
|
|
17
17
|
} catch {
|
|
18
|
-
return ''
|
|
18
|
+
return ''
|
|
19
19
|
}
|
|
20
|
-
const paramNamesByValue = new Map<string, string>()
|
|
20
|
+
const paramNamesByValue = new Map<string, string>()
|
|
21
21
|
for (const [name, value] of Object.entries(currentParams())) {
|
|
22
|
-
if (typeof value === 'string') paramNamesByValue.set(value, name)
|
|
22
|
+
if (typeof value === 'string') paramNamesByValue.set(value, name)
|
|
23
23
|
}
|
|
24
24
|
return pathname
|
|
25
25
|
.split('/')
|
|
26
26
|
.map(segment => {
|
|
27
27
|
try {
|
|
28
|
-
const name = paramNamesByValue.get(decodeURIComponent(segment))
|
|
29
|
-
return name ? `[${name}]` : segment
|
|
28
|
+
const name = paramNamesByValue.get(decodeURIComponent(segment))
|
|
29
|
+
return name ? `[${name}]` : segment
|
|
30
30
|
} catch {
|
|
31
|
-
return segment
|
|
31
|
+
return segment
|
|
32
32
|
}
|
|
33
33
|
})
|
|
34
|
-
.join('/')
|
|
34
|
+
.join('/')
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
function rootParamContextError(name: string): Error | undefined {
|
|
38
|
-
const unit = getWorkUnit()
|
|
38
|
+
const unit = getWorkUnit()
|
|
39
39
|
// Keep the module specifier out of a literal source string: the static
|
|
40
40
|
// compat-import rewrite must not rewrite this user-facing diagnostic.
|
|
41
|
-
const specifier = ['next', 'root-params'].join('/')
|
|
42
|
-
const call = `\`import('${specifier}').${name}()
|
|
43
|
-
const route = currentRoutePattern()
|
|
41
|
+
const specifier = ['next', 'root-params'].join('/')
|
|
42
|
+
const call = `\`import('${specifier}').${name}()\``
|
|
43
|
+
const route = currentRoutePattern()
|
|
44
44
|
|
|
45
|
-
const inUseCache = insideUseCacheProducer()
|
|
46
|
-
const inUnstableCache = insideUnstableCacheProducer()
|
|
45
|
+
const inUseCache = insideUseCacheProducer()
|
|
46
|
+
const inUnstableCache = insideUnstableCacheProducer()
|
|
47
47
|
|
|
48
48
|
if (inUseCache && inUnstableCache) {
|
|
49
49
|
return Object.assign(
|
|
@@ -51,12 +51,12 @@ function rootParamContextError(name: string): Error | undefined {
|
|
|
51
51
|
`Route ${route} used ${call} inside \`"use cache"\` nested within \`unstable_cache\`. Root params are not available in this context.`,
|
|
52
52
|
),
|
|
53
53
|
{ digest: 'E1140' },
|
|
54
|
-
)
|
|
54
|
+
)
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
if (inUseCache) {
|
|
58
|
-
recordUseCacheRootParamRead(name)
|
|
59
|
-
return undefined
|
|
58
|
+
recordUseCacheRootParamRead(name)
|
|
59
|
+
return undefined
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
if (inUnstableCache) {
|
|
@@ -65,52 +65,52 @@ function rootParamContextError(name: string): Error | undefined {
|
|
|
65
65
|
`Route ${route} used ${call} inside \`unstable_cache\`. This is not supported. Use \`"use cache"\` instead.`,
|
|
66
66
|
),
|
|
67
67
|
{ digest: 'E1141' },
|
|
68
|
-
)
|
|
68
|
+
)
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
if (!unit) return undefined
|
|
71
|
+
if (!unit) return undefined
|
|
72
72
|
|
|
73
73
|
if (unit.phase === 'action') {
|
|
74
74
|
return new Error(
|
|
75
75
|
`${call} was used inside a Server Action. This is not supported. ` +
|
|
76
76
|
`Functions from '${specifier}' can only be called in the context of a route.`,
|
|
77
|
-
)
|
|
77
|
+
)
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
if (unit.phase !== 'after' && unit.routeKind === 'route-handler') {
|
|
81
81
|
return new Error(
|
|
82
82
|
`Route ${route} used ${call} inside a Route Handler. ` +
|
|
83
83
|
`Support for this API in Route Handlers is planned for a future version of Next.js.`,
|
|
84
|
-
)
|
|
84
|
+
)
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
return undefined
|
|
87
|
+
return undefined
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
export function rootParam<T = string | string[] | undefined>(name: string): Promise<T> {
|
|
91
91
|
// Inside generateStaticParams, a root param resolves only when a PARENT
|
|
92
92
|
// generateStaticParams already provided it; reading the param in the very
|
|
93
93
|
// call that defines it is a build error (Next E394).
|
|
94
|
-
const gsp = generateStaticParamsScope()
|
|
94
|
+
const gsp = generateStaticParamsScope()
|
|
95
95
|
if (gsp) {
|
|
96
|
-
if (name in gsp.provided) return Promise.resolve(gsp.provided[name] as T)
|
|
96
|
+
if (name in gsp.provided) return Promise.resolve(gsp.provided[name] as T)
|
|
97
97
|
const route = (currentRenderCacheMeta()?.route ?? '')
|
|
98
98
|
.replace(/:\.\.\.([^/*]+)\*?/g, '[...$1]')
|
|
99
99
|
.replace(/:([^/*]+)\*/g, '[...$1]')
|
|
100
|
-
.replace(/:([^/*]+)/g, '[$1]')
|
|
100
|
+
.replace(/:([^/*]+)/g, '[$1]')
|
|
101
101
|
return Promise.reject(
|
|
102
102
|
new Error(
|
|
103
103
|
`Route ${route} used \`import('${['next', 'root-params'].join('/')}').${name}()\` inside \`generateStaticParams\`, ` +
|
|
104
104
|
`but the \`${name}\` parameter was not provided by a parent \`generateStaticParams\`. ` +
|
|
105
105
|
`In \`generateStaticParams\`, root params are only available for segments nested below the segment that provides them.`,
|
|
106
106
|
),
|
|
107
|
-
)
|
|
107
|
+
)
|
|
108
108
|
}
|
|
109
109
|
// Segment-M2: a root param read varies EVERY segment of the response (Next
|
|
110
110
|
// merges the rootParams set into each segment accumulator).
|
|
111
|
-
accumulateRootVaryParam(name)
|
|
112
|
-
const error = rootParamContextError(name)
|
|
113
|
-
if (error) return Promise.reject(error)
|
|
111
|
+
accumulateRootVaryParam(name)
|
|
112
|
+
const error = rootParamContextError(name)
|
|
113
|
+
if (error) return Promise.reject(error)
|
|
114
114
|
// A runtime-prefetch prerender renders against the REAL sampled request, so root params are concrete
|
|
115
115
|
// there (root params are always available in a static prerender, so a runtime prefetch has them too).
|
|
116
116
|
// Hanging them would postpone the ROOT LAYOUT itself - the whole document, not a boundary - so the
|
|
@@ -121,22 +121,22 @@ export function rootParam<T = string | string[] | undefined>(name: string): Prom
|
|
|
121
121
|
isPrerendering() &&
|
|
122
122
|
!isRuntimePrefetchPrerender()
|
|
123
123
|
) {
|
|
124
|
-
return hangingPromise<T>(`rootParam(${name})`)
|
|
124
|
+
return hangingPromise<T>(`rootParam(${name})`)
|
|
125
125
|
}
|
|
126
|
-
const value = currentParams()[name]
|
|
127
|
-
return Promise.resolve((Array.isArray(value) && value.length === 0 ? undefined : value) as T)
|
|
126
|
+
const value = currentParams()[name]
|
|
127
|
+
return Promise.resolve((Array.isArray(value) && value.length === 0 ? undefined : value) as T)
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
const rootParamsModule = new Proxy(
|
|
131
131
|
{},
|
|
132
132
|
{
|
|
133
133
|
get(_target, prop: string | symbol): unknown {
|
|
134
|
-
if (typeof prop !== 'string') return undefined
|
|
135
|
-
if (prop === '__esModule') return true
|
|
136
|
-
if (prop === 'default') return undefined
|
|
137
|
-
return () => rootParam(prop)
|
|
134
|
+
if (typeof prop !== 'string') return undefined
|
|
135
|
+
if (prop === '__esModule') return true
|
|
136
|
+
if (prop === 'default') return undefined
|
|
137
|
+
return () => rootParam(prop)
|
|
138
138
|
},
|
|
139
139
|
},
|
|
140
|
-
) as Record<string, () => Promise<unknown
|
|
140
|
+
) as Record<string, () => Promise<unknown>>
|
|
141
141
|
|
|
142
|
-
export default rootParamsModule
|
|
142
|
+
export default rootParamsModule
|
|
@@ -10,30 +10,30 @@
|
|
|
10
10
|
// URLs, and page-less intermediate directories still surface as static children without leaking their
|
|
11
11
|
// nested names.
|
|
12
12
|
|
|
13
|
-
import type { RouteManifestEntry, RouteParamValue } from '../../types'
|
|
14
|
-
import { getRequestRuntime } from '../../routing/request-
|
|
15
|
-
import { getNextConfig } from './config-loader'
|
|
13
|
+
import type { RouteManifestEntry, RouteParamValue } from '../../types'
|
|
14
|
+
import { getRequestRuntime } from '../../routing/request-environment'
|
|
15
|
+
import { getNextConfig } from './config-loader'
|
|
16
16
|
|
|
17
17
|
interface RouteState {
|
|
18
|
-
route: string
|
|
19
|
-
params: Record<string, RouteParamValue
|
|
20
|
-
catchAllOptional?: boolean
|
|
21
|
-
staticChildren?: string[]
|
|
22
|
-
staticChildrenBySegment?: Record<string, string[]
|
|
23
|
-
prefetchKind?: 'shell' | 'eager'
|
|
18
|
+
route: string
|
|
19
|
+
params: Record<string, RouteParamValue>
|
|
20
|
+
catchAllOptional?: boolean
|
|
21
|
+
staticChildren?: string[]
|
|
22
|
+
staticChildrenBySegment?: Record<string, string[]>
|
|
23
|
+
prefetchKind?: 'shell' | 'eager'
|
|
24
24
|
/**
|
|
25
25
|
* `prefetch = 'allow-runtime'`: the route's shell is RUNTIME-prefetched (request-sampled,
|
|
26
26
|
* param-derived), so unlike a static `partial` shell it is NOT shared across params - every URL of the
|
|
27
27
|
* route needs its own prefetch.
|
|
28
28
|
*/
|
|
29
|
-
runtimePrefetch?: boolean
|
|
29
|
+
runtimePrefetch?: boolean
|
|
30
30
|
/**
|
|
31
31
|
* The vary set of the BAKED SHELL these bytes came from (renderer's
|
|
32
32
|
* `bakedShellPageVary`). Passed straight through by the spread below: the
|
|
33
33
|
* client segment cache reads it off a hard-loaded document to key that
|
|
34
34
|
* document's static stage across the route's params.
|
|
35
35
|
*/
|
|
36
|
-
pageVary?: string[]
|
|
36
|
+
pageVary?: string[]
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
/**
|
|
@@ -42,12 +42,12 @@ interface RouteState {
|
|
|
42
42
|
* align with the pattern the client trie matches against - and no `[x]` placeholder ever reaches a body.
|
|
43
43
|
*/
|
|
44
44
|
function publicSegments(route: string): string[] {
|
|
45
|
-
if (route === 'index' || route === '/') return []
|
|
46
|
-
return route.split('/').filter(Boolean)
|
|
45
|
+
if (route === 'index' || route === '/') return []
|
|
46
|
+
return route.split('/').filter(Boolean)
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
function isDynamicSegment(segment: string): boolean {
|
|
50
|
-
return segment.startsWith(':')
|
|
50
|
+
return segment.startsWith(':')
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
/**
|
|
@@ -62,9 +62,9 @@ export function staticSiblingNames(
|
|
|
62
62
|
pattern: readonly string[],
|
|
63
63
|
): string[] {
|
|
64
64
|
for (let index = pattern.length - 1; index >= 0; index--) {
|
|
65
|
-
if (isDynamicSegment(pattern[index]!)) return staticSiblingNamesAt(routes, pattern, index)
|
|
65
|
+
if (isDynamicSegment(pattern[index]!)) return staticSiblingNamesAt(routes, pattern, index)
|
|
66
66
|
}
|
|
67
|
-
return []
|
|
67
|
+
return []
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
/** Literal static siblings for every dynamic level in a route prediction. */
|
|
@@ -72,15 +72,15 @@ export function staticSiblingNamesBySegment(
|
|
|
72
72
|
routes: readonly Pick<RouteManifestEntry, 'route' | 'kind' | 'interception'>[],
|
|
73
73
|
pattern: readonly string[],
|
|
74
74
|
): Record<string, string[]> {
|
|
75
|
-
const result: Record<string, string[]> = {}
|
|
75
|
+
const result: Record<string, string[]> = {}
|
|
76
76
|
for (let index = 0; index < pattern.length; index++) {
|
|
77
|
-
if (!isDynamicSegment(pattern[index]!)) continue
|
|
78
|
-
const siblings = staticSiblingNamesAt(routes, pattern, index)
|
|
77
|
+
if (!isDynamicSegment(pattern[index]!)) continue
|
|
78
|
+
const siblings = staticSiblingNamesAt(routes, pattern, index)
|
|
79
79
|
// An empty array is meaningful: unlike an absent entry, it says this
|
|
80
80
|
// production route table knows there are no literal siblings here.
|
|
81
|
-
result[String(index)] = siblings
|
|
81
|
+
result[String(index)] = siblings
|
|
82
82
|
}
|
|
83
|
-
return result
|
|
83
|
+
return result
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
function staticSiblingNamesAt(
|
|
@@ -88,27 +88,27 @@ function staticSiblingNamesAt(
|
|
|
88
88
|
pattern: readonly string[],
|
|
89
89
|
level: number,
|
|
90
90
|
): string[] {
|
|
91
|
-
if (!isDynamicSegment(pattern[level]!)) return []
|
|
92
|
-
const names = new Set<string>()
|
|
91
|
+
if (!isDynamicSegment(pattern[level]!)) return []
|
|
92
|
+
const names = new Set<string>()
|
|
93
93
|
for (const route of routes) {
|
|
94
|
-
if (route.kind !== 'page' || route.interception) continue
|
|
95
|
-
const segments = publicSegments(route.route)
|
|
96
|
-
if (segments.length <= level) continue
|
|
97
|
-
let compatible = true
|
|
94
|
+
if (route.kind !== 'page' || route.interception) continue
|
|
95
|
+
const segments = publicSegments(route.route)
|
|
96
|
+
if (segments.length <= level) continue
|
|
97
|
+
let compatible = true
|
|
98
98
|
for (let index = 0; index < level; index++) {
|
|
99
|
-
const own = pattern[index]
|
|
100
|
-
const other = segments[index]
|
|
101
|
-
if (isDynamicSegment(own) || isDynamicSegment(other)) continue
|
|
99
|
+
const own = pattern[index]!
|
|
100
|
+
const other = segments[index]!
|
|
101
|
+
if (isDynamicSegment(own) || isDynamicSegment(other)) continue
|
|
102
102
|
if (own !== other) {
|
|
103
|
-
compatible = false
|
|
104
|
-
break
|
|
103
|
+
compatible = false
|
|
104
|
+
break
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
|
-
if (!compatible) continue
|
|
108
|
-
const name = segments[level]
|
|
109
|
-
if (!isDynamicSegment(name)) names.add(name)
|
|
107
|
+
if (!compatible) continue
|
|
108
|
+
const name = segments[level]!
|
|
109
|
+
if (!isDynamicSegment(name)) names.add(name)
|
|
110
110
|
}
|
|
111
|
-
return [...names].sort()
|
|
111
|
+
return [...names].sort()
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
/** True when the build enumerated exactly this param set for the route. */
|
|
@@ -116,18 +116,18 @@ function paramsPrerendered(
|
|
|
116
116
|
route: Pick<RouteManifestEntry, 'prerenderedParams' | 'params'>,
|
|
117
117
|
params: Record<string, RouteParamValue>,
|
|
118
118
|
): boolean {
|
|
119
|
-
const sets = route.prerenderedParams
|
|
120
|
-
if (!sets?.length) return false
|
|
119
|
+
const sets = route.prerenderedParams
|
|
120
|
+
if (!sets?.length) return false
|
|
121
121
|
// A PPR SUB-shell carries only the params the build made concrete (the rest
|
|
122
122
|
// are still holes), so its state is not the full URL's — never "prerendered".
|
|
123
|
-
if (Object.keys(params).length !== (route.params ?? []).length) return false
|
|
123
|
+
if (Object.keys(params).length !== (route.params ?? []).length) return false
|
|
124
124
|
return sets.some(set => {
|
|
125
|
-
const names = Object.keys(set)
|
|
125
|
+
const names = Object.keys(set)
|
|
126
126
|
return (
|
|
127
127
|
names.length === Object.keys(params).length &&
|
|
128
128
|
names.every(name => String(set[name]) === String(params[name]))
|
|
129
|
-
)
|
|
130
|
-
})
|
|
129
|
+
)
|
|
130
|
+
})
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
/**
|
|
@@ -151,23 +151,23 @@ export function nextClientRouteState(
|
|
|
151
151
|
>,
|
|
152
152
|
state: RouteState,
|
|
153
153
|
): RouteState {
|
|
154
|
-
const pattern = state.route.split('/').filter(Boolean)
|
|
155
|
-
const routes = getRequestRuntime()?.routes
|
|
156
|
-
if (!routes) return state
|
|
157
|
-
const staticChildrenBySegment = staticSiblingNamesBySegment(routes, pattern)
|
|
158
|
-
const staticChildren = staticSiblingNames(routes, pattern)
|
|
154
|
+
const pattern = state.route.split('/').filter(Boolean)
|
|
155
|
+
const routes = getRequestRuntime()?.routes
|
|
156
|
+
if (!routes) return state
|
|
157
|
+
const staticChildrenBySegment = staticSiblingNamesBySegment(routes, pattern)
|
|
158
|
+
const staticChildren = staticSiblingNames(routes, pattern)
|
|
159
159
|
// Global `partialPrefetching: 'unstable_eager'` makes every route without a
|
|
160
160
|
// per-segment `prefetch` export eager (the App Shells Speculative-skip does
|
|
161
161
|
// not apply anywhere); a per-segment export still wins.
|
|
162
162
|
const globalEager =
|
|
163
|
-
(getNextConfig() as { partialPrefetching?: unknown }).partialPrefetching === 'unstable_eager'
|
|
164
|
-
const declared = route.segmentConfig?.prefetch
|
|
163
|
+
(getNextConfig() as { partialPrefetching?: unknown }).partialPrefetching === 'unstable_eager'
|
|
164
|
+
const declared = route.segmentConfig?.prefetch
|
|
165
165
|
// `generateStaticParams` only makes a route eager for the param sets it actually enumerated. When
|
|
166
166
|
// THIS URL's params were not among them and the route has a `loading` boundary, its page is dynamic
|
|
167
167
|
// here - the server answers the default prefetch with the loading shell, and calling it eager would
|
|
168
168
|
// escalate the reveal to a FULL prefetch that fetches the dynamic body and erases the loading state.
|
|
169
169
|
const partiallyEnumerated =
|
|
170
|
-
route.stream?.hasLoadingBoundary === true && !paramsPrerendered(route, state.params)
|
|
170
|
+
route.stream?.hasLoadingBoundary === true && !paramsPrerendered(route, state.params)
|
|
171
171
|
const prefetchKind =
|
|
172
172
|
declared === 'unstable_eager' ||
|
|
173
173
|
(declared === undefined &&
|
|
@@ -175,7 +175,7 @@ export function nextClientRouteState(
|
|
|
175
175
|
? 'eager'
|
|
176
176
|
: declared === 'allow-runtime' || declared === 'partial'
|
|
177
177
|
? 'shell'
|
|
178
|
-
: undefined
|
|
178
|
+
: undefined
|
|
179
179
|
return {
|
|
180
180
|
...state,
|
|
181
181
|
...(staticChildren.length > 0 ? { staticChildren } : {}),
|
|
@@ -184,5 +184,5 @@ export function nextClientRouteState(
|
|
|
184
184
|
// Only `allow-runtime` shells are request-sampled per URL; a `partial` shell
|
|
185
185
|
// is a static prerender the whole route shares.
|
|
186
186
|
...(declared === 'allow-runtime' ? { runtimePrefetch: true } : {}),
|
|
187
|
-
}
|
|
187
|
+
}
|
|
188
188
|
}
|
|
@@ -44,6 +44,8 @@ exports.Router = { events }
|
|
|
44
44
|
exports.default = exports.Router
|
|
45
45
|
exports.useRouter = () => currentRouter()
|
|
46
46
|
/** @param {(props: object) => unknown} Component */
|
|
47
|
-
exports.withRouter =
|
|
47
|
+
exports.withRouter =
|
|
48
|
+
Component =>
|
|
48
49
|
/** @param {object} props */
|
|
49
|
-
props =>
|
|
50
|
+
props =>
|
|
51
|
+
Component({ ...props, router: currentRouter() })
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { useEffect, useState } from 'preact/hooks'
|
|
2
|
-
import { blockJavascriptUrl } from '../../
|
|
1
|
+
import { useEffect, useState } from 'preact/hooks'
|
|
2
|
+
import { blockJavascriptUrl } from '../../client/router'
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Pages-router surface, present so shared components importing next/router
|
|
@@ -7,38 +7,38 @@ import { blockJavascriptUrl } from '../../api/router';
|
|
|
7
7
|
* where it can and no-ops where pages-router concepts don't exist.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
type RouterEventHandler = (...args: unknown[]) => void
|
|
10
|
+
type RouterEventHandler = (...args: unknown[]) => void
|
|
11
11
|
|
|
12
|
-
const noop = () => undefined
|
|
12
|
+
const noop = () => undefined
|
|
13
13
|
|
|
14
14
|
const routerEvents = {
|
|
15
15
|
on: noop as (event: string, handler: RouterEventHandler) => void,
|
|
16
16
|
off: noop as (event: string, handler: RouterEventHandler) => void,
|
|
17
17
|
emit: noop as (event: string, ...args: unknown[]) => void,
|
|
18
|
-
}
|
|
18
|
+
}
|
|
19
19
|
|
|
20
20
|
export interface PagesRouter {
|
|
21
|
-
pathname: string
|
|
22
|
-
route: string
|
|
23
|
-
query: Record<string, string | string[]
|
|
24
|
-
asPath: string
|
|
25
|
-
basePath: string
|
|
26
|
-
isReady: boolean
|
|
27
|
-
isFallback: boolean
|
|
28
|
-
isPreview: boolean
|
|
29
|
-
events: typeof routerEvents
|
|
30
|
-
push(url: string): Promise<boolean
|
|
31
|
-
replace(url: string): Promise<boolean
|
|
32
|
-
prefetch(url: string): Promise<void
|
|
33
|
-
back(): void
|
|
34
|
-
forward(): void
|
|
35
|
-
reload(): void
|
|
21
|
+
pathname: string
|
|
22
|
+
route: string
|
|
23
|
+
query: Record<string, string | string[]>
|
|
24
|
+
asPath: string
|
|
25
|
+
basePath: string
|
|
26
|
+
isReady: boolean
|
|
27
|
+
isFallback: boolean
|
|
28
|
+
isPreview: boolean
|
|
29
|
+
events: typeof routerEvents
|
|
30
|
+
push(url: string): Promise<boolean>
|
|
31
|
+
replace(url: string): Promise<boolean>
|
|
32
|
+
prefetch(url: string): Promise<void>
|
|
33
|
+
back(): void
|
|
34
|
+
forward(): void
|
|
35
|
+
reload(): void
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
interface PagesRouterState {
|
|
39
|
-
pathname?: string
|
|
40
|
-
asPath?: string
|
|
41
|
-
query?: Record<string, string | string[]
|
|
39
|
+
pathname?: string
|
|
40
|
+
asPath?: string
|
|
41
|
+
query?: Record<string, string | string[]>
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
// The pages-router state the materialized page wrapper emits: SSR reads the
|
|
@@ -49,33 +49,32 @@ function pagesRouterState(browser: boolean): PagesRouterState | undefined {
|
|
|
49
49
|
if (!browser) {
|
|
50
50
|
const storage = (globalThis as Record<PropertyKey, unknown>)[
|
|
51
51
|
Symbol.for('pnext.requestStorage')
|
|
52
|
-
] as { getStore(): Record<PropertyKey, unknown> | undefined } | undefined
|
|
52
|
+
] as { getStore(): Record<PropertyKey, unknown> | undefined } | undefined
|
|
53
53
|
return storage?.getStore?.()?.[Symbol.for('pnext.pagesRouterState')] as
|
|
54
|
-
|
|
|
55
|
-
| undefined;
|
|
54
|
+
PagesRouterState | undefined
|
|
56
55
|
}
|
|
57
|
-
const node = document.getElementById('__PNEXT_PAGES_DATA__')
|
|
58
|
-
if (!node?.textContent) return undefined
|
|
56
|
+
const node = document.getElementById('__PNEXT_PAGES_DATA__')
|
|
57
|
+
if (!node?.textContent) return undefined
|
|
59
58
|
try {
|
|
60
|
-
return JSON.parse(node.textContent) as PagesRouterState
|
|
59
|
+
return JSON.parse(node.textContent) as PagesRouterState
|
|
61
60
|
} catch {
|
|
62
|
-
return undefined
|
|
61
|
+
return undefined
|
|
63
62
|
}
|
|
64
63
|
}
|
|
65
64
|
|
|
66
65
|
function browserQuery(url: URL): Record<string, string> {
|
|
67
|
-
const query: Record<string, string> = {}
|
|
66
|
+
const query: Record<string, string> = {}
|
|
68
67
|
for (const [key, value] of url.searchParams) {
|
|
69
|
-
if (key !== '_rsc') query[key] = value
|
|
68
|
+
if (key !== '_rsc') query[key] = value
|
|
70
69
|
}
|
|
71
|
-
return query
|
|
70
|
+
return query
|
|
72
71
|
}
|
|
73
72
|
|
|
74
73
|
function currentRouter(ready: boolean): PagesRouter {
|
|
75
|
-
const browser = process.browser || typeof window !== 'undefined'
|
|
76
|
-
const url = browser ? new URL(window.location.href) : undefined
|
|
77
|
-
const state = pagesRouterState(browser)
|
|
78
|
-
const pathname = state?.pathname ?? url?.pathname ?? '/'
|
|
74
|
+
const browser = process.browser || typeof window !== 'undefined'
|
|
75
|
+
const url = browser ? new URL(window.location.href) : undefined
|
|
76
|
+
const state = pagesRouterState(browser)
|
|
77
|
+
const pathname = state?.pathname ?? url?.pathname ?? '/'
|
|
79
78
|
return {
|
|
80
79
|
pathname,
|
|
81
80
|
route: pathname,
|
|
@@ -83,9 +82,7 @@ function currentRouter(ready: boolean): PagesRouter {
|
|
|
83
82
|
// server-computed query (they are the live values after shallow/query-only
|
|
84
83
|
// history updates); on the server the state already merged them. The
|
|
85
84
|
// router-fetch cache key (`_rsc`) is never part of the page's query.
|
|
86
|
-
query: url
|
|
87
|
-
? { ...(state?.query ?? {}), ...browserQuery(url) }
|
|
88
|
-
: (state?.query ?? {}),
|
|
85
|
+
query: url ? { ...(state?.query ?? {}), ...browserQuery(url) } : (state?.query ?? {}),
|
|
89
86
|
asPath: url ? `${url.pathname}${url.search}` : (state?.asPath ?? '/'),
|
|
90
87
|
basePath: '',
|
|
91
88
|
isReady: browser && ready,
|
|
@@ -93,51 +90,51 @@ function currentRouter(ready: boolean): PagesRouter {
|
|
|
93
90
|
isPreview: false,
|
|
94
91
|
events: routerEvents,
|
|
95
92
|
push(target: string) {
|
|
96
|
-
if (blockJavascriptUrl(target)) return Promise.resolve(false)
|
|
97
|
-
if (browser) window.location.href = target
|
|
98
|
-
return Promise.resolve(true)
|
|
93
|
+
if (blockJavascriptUrl(target)) return Promise.resolve(false)
|
|
94
|
+
if (browser) window.location.href = target
|
|
95
|
+
return Promise.resolve(true)
|
|
99
96
|
},
|
|
100
97
|
replace(target: string) {
|
|
101
|
-
if (blockJavascriptUrl(target)) return Promise.resolve(false)
|
|
102
|
-
if (browser) window.location.replace(target)
|
|
103
|
-
return Promise.resolve(true)
|
|
98
|
+
if (blockJavascriptUrl(target)) return Promise.resolve(false)
|
|
99
|
+
if (browser) window.location.replace(target)
|
|
100
|
+
return Promise.resolve(true)
|
|
104
101
|
},
|
|
105
102
|
prefetch(target: string) {
|
|
106
|
-
blockJavascriptUrl(target)
|
|
107
|
-
return Promise.resolve()
|
|
103
|
+
blockJavascriptUrl(target)
|
|
104
|
+
return Promise.resolve()
|
|
108
105
|
},
|
|
109
106
|
back() {
|
|
110
|
-
if (browser) window.history.back()
|
|
107
|
+
if (browser) window.history.back()
|
|
111
108
|
},
|
|
112
109
|
forward() {
|
|
113
|
-
if (browser) window.history.forward()
|
|
110
|
+
if (browser) window.history.forward()
|
|
114
111
|
},
|
|
115
112
|
reload() {
|
|
116
|
-
if (browser) window.location.reload()
|
|
113
|
+
if (browser) window.location.reload()
|
|
117
114
|
},
|
|
118
|
-
}
|
|
115
|
+
}
|
|
119
116
|
}
|
|
120
117
|
|
|
121
118
|
// Next semantics: isReady is FALSE during the hydration render (matching the SSR markup - preact
|
|
122
119
|
// hydrate adopts DOM without patching mismatches, so a true-at-hydration value would never reach
|
|
123
120
|
// attributes) and flips via a post-hydration re-render. Once flipped, later mounts see true immediately.
|
|
124
|
-
let pagesRouterReady = false
|
|
121
|
+
let pagesRouterReady = false
|
|
125
122
|
|
|
126
123
|
export function useRouter(): PagesRouter {
|
|
127
|
-
const [ready, setReady] = useState(pagesRouterReady)
|
|
124
|
+
const [ready, setReady] = useState(pagesRouterReady)
|
|
128
125
|
useEffect(() => {
|
|
129
|
-
pagesRouterReady = true
|
|
130
|
-
setReady(true)
|
|
131
|
-
}, [])
|
|
132
|
-
return currentRouter(ready)
|
|
126
|
+
pagesRouterReady = true
|
|
127
|
+
setReady(true)
|
|
128
|
+
}, [])
|
|
129
|
+
return currentRouter(ready)
|
|
133
130
|
}
|
|
134
131
|
|
|
135
|
-
export const Router = { events: routerEvents }
|
|
136
|
-
export default Router
|
|
132
|
+
export const Router = { events: routerEvents }
|
|
133
|
+
export default Router
|
|
137
134
|
|
|
138
135
|
export function withRouter<Props extends { router?: PagesRouter }>(
|
|
139
136
|
Component: (props: Props) => unknown,
|
|
140
137
|
) {
|
|
141
138
|
return (props: Omit<Props, 'router'>) =>
|
|
142
|
-
Component({ ...props, router: currentRouter(pagesRouterReady) } as Props)
|
|
139
|
+
Component({ ...props, router: currentRouter(pagesRouterReady) } as Props)
|
|
143
140
|
}
|