@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
package/src/compat/next/link.tsx
CHANGED
|
@@ -2,73 +2,69 @@
|
|
|
2
2
|
// bundle, and the lite client tier must not pull compat through it. Children.only/count are replaced
|
|
3
3
|
// with toChildArray below; the ref arrives React-19-style as a prop (the parity vnode pass moves
|
|
4
4
|
// vnode.ref into props for function components).
|
|
5
|
-
import { cloneElement, h as createElement, toChildArray, type JSX } from 'preact'
|
|
6
|
-
import { useContext, useEffect, useRef, useState } from 'preact/hooks'
|
|
7
|
-
import type { MutableRefObject, ReactElement, ReactNode, Ref } from 'react'
|
|
8
|
-
import { usePrefetchLifecycle } from '../../api/link'
|
|
9
|
-
import { blockJavascriptUrl, isJavascriptUrl } from '../../
|
|
10
|
-
import { applyTrailingSlash, routeHref, type SearchInput } from '../../routing/href'
|
|
11
|
-
import { skipTrailingSlashRedirect } from '../client/trailing-slash'
|
|
12
|
-
import type { PrefetchMode } from '../../types'
|
|
5
|
+
import { cloneElement, h as createElement, toChildArray, type JSX } from 'preact'
|
|
6
|
+
import { useContext, useEffect, useRef, useState } from 'preact/hooks'
|
|
7
|
+
import type { MutableRefObject, ReactElement, ReactNode, Ref } from 'react'
|
|
8
|
+
import { usePrefetchLifecycle } from '../../api/link'
|
|
9
|
+
import { blockJavascriptUrl, isJavascriptUrl } from '../../client/router'
|
|
10
|
+
import { applyTrailingSlash, routeHref, type SearchInput } from '../../routing/href'
|
|
11
|
+
import { skipTrailingSlashRedirect } from '../client/trailing-slash'
|
|
12
|
+
import type { PrefetchMode } from '../../types'
|
|
13
13
|
import {
|
|
14
14
|
LinkStatusContext,
|
|
15
15
|
linkPending,
|
|
16
16
|
navigateWithStatus,
|
|
17
17
|
subscribeLinkStatus,
|
|
18
|
-
} from '../client/link-status'
|
|
19
|
-
import { addBasePath } from '../client/base-path'
|
|
20
|
-
import { addTransitionType } from '../react/view-transition'
|
|
18
|
+
} from '../client/link-status'
|
|
19
|
+
import { addBasePath } from '../client/base-path'
|
|
20
|
+
import { addTransitionType } from '../react/view-transition'
|
|
21
21
|
|
|
22
|
-
const reactClientReferenceSymbol = Symbol.for('react.client.reference')
|
|
22
|
+
const reactClientReferenceSymbol = Symbol.for('react.client.reference')
|
|
23
23
|
|
|
24
24
|
// Client-graph bundler define (compat/register/bundler.ts): false drops the
|
|
25
25
|
// whole legacy child path from a bundle whose app provably never renders
|
|
26
26
|
// `<Link legacyBehavior>`. Undefined (server render, unbundled consumer) keeps
|
|
27
27
|
// it, so the gate can only ever remove bytes an app proved it cannot use.
|
|
28
|
-
declare const __PNEXT_LINK_LEGACY__: boolean
|
|
28
|
+
declare const __PNEXT_LINK_LEGACY__: boolean
|
|
29
29
|
type LegacyChildKind =
|
|
30
|
-
| 'server-
|
|
31
|
-
| 'server-async'
|
|
32
|
-
| 'server-async-through-client'
|
|
33
|
-
| 'lazy'
|
|
34
|
-
| 'client-lazy';
|
|
30
|
+
'server-sync' | 'server-async' | 'server-async-through-client' | 'lazy' | 'client-lazy'
|
|
35
31
|
|
|
36
32
|
export interface UrlObject {
|
|
37
|
-
pathname?: string
|
|
38
|
-
query?: SearchInput
|
|
39
|
-
hash?: string
|
|
33
|
+
pathname?: string
|
|
34
|
+
query?: SearchInput
|
|
35
|
+
hash?: string
|
|
40
36
|
}
|
|
41
37
|
|
|
42
38
|
export interface NavigateEvent {
|
|
43
|
-
preventDefault(): void
|
|
39
|
+
preventDefault(): void
|
|
44
40
|
}
|
|
45
41
|
|
|
46
42
|
export type LinkProps = Omit<JSX.HTMLAttributes<HTMLAnchorElement>, 'href' | 'onClick' | 'ref'> & {
|
|
47
|
-
href: string | URL | UrlObject
|
|
48
|
-
as?: string | URL | UrlObject
|
|
49
|
-
replace?: boolean
|
|
50
|
-
scroll?: boolean
|
|
51
|
-
prefetch?: boolean | 'auto' | 'unstable_forceStale' | null
|
|
43
|
+
href: string | URL | UrlObject
|
|
44
|
+
as?: string | URL | UrlObject
|
|
45
|
+
replace?: boolean
|
|
46
|
+
scroll?: boolean
|
|
47
|
+
prefetch?: boolean | 'auto' | 'unstable_forceStale' | null
|
|
52
48
|
/** Hovering the link upgrades its prefetch to include the dynamic data. */
|
|
53
|
-
unstable_dynamicOnHover?: boolean
|
|
54
|
-
locale?: string | false
|
|
55
|
-
legacyBehavior?: boolean
|
|
56
|
-
passHref?: boolean
|
|
57
|
-
onClick?: JSX.MouseEventHandler<HTMLAnchorElement
|
|
58
|
-
onNavigate?: (event: NavigateEvent) => void
|
|
49
|
+
unstable_dynamicOnHover?: boolean
|
|
50
|
+
locale?: string | false
|
|
51
|
+
legacyBehavior?: boolean
|
|
52
|
+
passHref?: boolean
|
|
53
|
+
onClick?: JSX.MouseEventHandler<HTMLAnchorElement>
|
|
54
|
+
onNavigate?: (event: NavigateEvent) => void
|
|
59
55
|
/**
|
|
60
56
|
* View-transition types declared for the navigation this Link starts, so
|
|
61
57
|
* `:active-view-transition-type(...)` rules match while it runs. Consumed
|
|
62
58
|
* here (never forwarded to the anchor as an attribute).
|
|
63
59
|
*/
|
|
64
|
-
transitionTypes?: string[]
|
|
65
|
-
onPrefetchStart?: () => void
|
|
66
|
-
onPrefetchFinish?: () => void
|
|
60
|
+
transitionTypes?: string[]
|
|
61
|
+
onPrefetchStart?: () => void
|
|
62
|
+
onPrefetchFinish?: () => void
|
|
67
63
|
/** @internal Preserves legacy child classification across server resolution. */
|
|
68
|
-
__pnextLegacyChildKind?: LegacyChildKind
|
|
69
|
-
ref?: Ref<HTMLAnchorElement
|
|
70
|
-
children?: ReactNode
|
|
71
|
-
}
|
|
64
|
+
__pnextLegacyChildKind?: LegacyChildKind
|
|
65
|
+
ref?: Ref<HTMLAnchorElement>
|
|
66
|
+
children?: ReactNode
|
|
67
|
+
}
|
|
72
68
|
|
|
73
69
|
// Ref arrives as a prop (React 19 style): the parity vnode pass moves vnode.ref into props for plain
|
|
74
70
|
// function components, on both server and client, so forwardRef is unnecessary.
|
|
@@ -93,7 +89,7 @@ function Link({
|
|
|
93
89
|
...anchorProps
|
|
94
90
|
}: LinkProps) {
|
|
95
91
|
// `as` supersedes `href` for what the anchor actually points at (app router).
|
|
96
|
-
const target = as == null ? href : as
|
|
92
|
+
const target = as == null ? href : as
|
|
97
93
|
// basePath: prefix in-app hrefs so the rendered anchor (and the soft-nav it
|
|
98
94
|
// drives) points under the configured basePath, matching Next. addBasePath
|
|
99
95
|
// leaves external/absolute/already-prefixed hrefs untouched, and is a no-op
|
|
@@ -101,64 +97,64 @@ function Link({
|
|
|
101
97
|
// skipTrailingSlashRedirect preserves the author's exact trailing slash (both
|
|
102
98
|
// the rendered anchor and the soft-nav it drives); otherwise normalize per
|
|
103
99
|
// the trailingSlash config so the anchor matches the canonical URL.
|
|
104
|
-
const hrefBase = hrefString(target)
|
|
100
|
+
const hrefBase = hrefString(target)
|
|
105
101
|
const resolvedHref = addBasePath(
|
|
106
102
|
skipTrailingSlashRedirect() ? hrefBase : applyTrailingSlash(hrefBase),
|
|
107
|
-
)
|
|
108
|
-
const blocked = isJavascriptUrl(resolvedHref)
|
|
109
|
-
const prefetchMode = nextPrefetchMode(prefetch)
|
|
110
|
-
const lifecycleRef = usePrefetchLifecycle(onPrefetchStart, onPrefetchFinish)
|
|
111
|
-
const anchorRef = useComposedRef(lifecycleRef, forwardedRef)
|
|
112
|
-
const statusToken = useLinkToken()
|
|
103
|
+
)
|
|
104
|
+
const blocked = isJavascriptUrl(resolvedHref)
|
|
105
|
+
const prefetchMode = nextPrefetchMode(prefetch)
|
|
106
|
+
const lifecycleRef = usePrefetchLifecycle(onPrefetchStart, onPrefetchFinish)
|
|
107
|
+
const anchorRef = useComposedRef(lifecycleRef, forwardedRef)
|
|
108
|
+
const statusToken = useLinkToken()
|
|
113
109
|
|
|
114
110
|
const handleClick = (event: JSX.TargetedMouseEvent<HTMLAnchorElement>) => {
|
|
115
|
-
onClick?.(event)
|
|
116
|
-
if (event.defaultPrevented) return
|
|
111
|
+
onClick?.(event)
|
|
112
|
+
if (event.defaultPrevented) return
|
|
117
113
|
|
|
118
114
|
if (blocked) {
|
|
119
115
|
// Same guard the runtime applies to static links; a hydrated Link cancels
|
|
120
116
|
// its own default so the javascript: URL never runs.
|
|
121
|
-
if (blockJavascriptUrl(resolvedHref)) event.preventDefault()
|
|
122
|
-
return
|
|
117
|
+
if (blockJavascriptUrl(resolvedHref)) event.preventDefault()
|
|
118
|
+
return
|
|
123
119
|
}
|
|
124
120
|
|
|
125
121
|
// Modifier/middle clicks, target, download: let the browser handle it;
|
|
126
122
|
// onNavigate does not fire (matches Next).
|
|
127
|
-
if (!isPlainLeftClick(event)) return
|
|
123
|
+
if (!isPlainLeftClick(event)) return
|
|
128
124
|
|
|
129
125
|
if (isExternalHref(resolvedHref)) {
|
|
130
126
|
// External hrefs never soft-navigate and never fire onNavigate. `replace`
|
|
131
127
|
// still swaps history rather than pushing.
|
|
132
128
|
if (replace) {
|
|
133
|
-
event.preventDefault()
|
|
134
|
-
window.location.replace(resolvedHref)
|
|
129
|
+
event.preventDefault()
|
|
130
|
+
window.location.replace(resolvedHref)
|
|
135
131
|
}
|
|
136
|
-
return
|
|
132
|
+
return
|
|
137
133
|
}
|
|
138
134
|
|
|
139
135
|
// Internal soft navigation: onNavigate can cancel, and this Link drives the
|
|
140
136
|
// navigation itself so useLinkStatus tracks it. preventDefault keeps the
|
|
141
137
|
// router's document-level handler from navigating a second time.
|
|
142
138
|
if (onNavigate) {
|
|
143
|
-
const navEvent = navigationEvent()
|
|
144
|
-
onNavigate(navEvent)
|
|
139
|
+
const navEvent = navigationEvent()
|
|
140
|
+
onNavigate(navEvent)
|
|
145
141
|
if (navEvent.defaultPrevented) {
|
|
146
|
-
event.preventDefault()
|
|
147
|
-
return
|
|
142
|
+
event.preventDefault()
|
|
143
|
+
return
|
|
148
144
|
}
|
|
149
145
|
}
|
|
150
146
|
|
|
151
|
-
event.preventDefault()
|
|
152
|
-
for (const type of transitionTypes ?? []) addTransitionType(type)
|
|
153
|
-
const url = new URL(resolvedHref, window.location.href)
|
|
147
|
+
event.preventDefault()
|
|
148
|
+
for (const type of transitionTypes ?? []) addTransitionType(type)
|
|
149
|
+
const url = new URL(resolvedHref, window.location.href)
|
|
154
150
|
const samePage =
|
|
155
|
-
url.pathname === window.location.pathname && url.search === window.location.search
|
|
151
|
+
url.pathname === window.location.pathname && url.search === window.location.search
|
|
156
152
|
if (samePage && url.hash) {
|
|
157
|
-
window.location.hash = url.hash
|
|
158
|
-
return
|
|
153
|
+
window.location.hash = url.hash
|
|
154
|
+
return
|
|
159
155
|
}
|
|
160
|
-
navigateWithStatus(statusToken, url.href, { replace, scroll })
|
|
161
|
-
}
|
|
156
|
+
navigateWithStatus(statusToken, url.href, { replace, scroll })
|
|
157
|
+
}
|
|
162
158
|
|
|
163
159
|
const anchorAttributes: Record<string, unknown> = {
|
|
164
160
|
...anchorProps,
|
|
@@ -169,15 +165,16 @@ function Link({
|
|
|
169
165
|
// prefetch={true} requests a FULL prefetch (5-min static window) vs the
|
|
170
166
|
// default partial/dynamic 30s window; the router reads this attribute.
|
|
171
167
|
// 'unstable_forceStale' is Next 16's alias for the full prefetch mode.
|
|
172
|
-
'data-prefetch-full':
|
|
168
|
+
'data-prefetch-full':
|
|
169
|
+
prefetch === true || prefetch === 'unstable_forceStale' ? 'true' : undefined,
|
|
173
170
|
// unstable_dynamicOnHover: hover intent upgrades the (viewport, partial)
|
|
174
171
|
// prefetch to a full one that includes the dynamic data.
|
|
175
172
|
'data-prefetch-hover-full': unstable_dynamicOnHover ? 'true' : undefined,
|
|
176
173
|
'data-pnext-replace': replace ? 'true' : undefined,
|
|
177
174
|
'data-pnext-scroll': scroll === false ? 'false' : undefined,
|
|
178
175
|
onClick: handleClick,
|
|
179
|
-
}
|
|
180
|
-
if (blocked) anchorAttributes['data-pnext-blocked-href'] = resolvedHref
|
|
176
|
+
}
|
|
177
|
+
if (blocked) anchorAttributes['data-pnext-blocked-href'] = resolvedHref
|
|
181
178
|
|
|
182
179
|
if (
|
|
183
180
|
(typeof __PNEXT_LINK_LEGACY__ === 'boolean' ? __PNEXT_LINK_LEGACY__ : true) &&
|
|
@@ -190,32 +187,36 @@ function Link({
|
|
|
190
187
|
handleClick,
|
|
191
188
|
anchorAttributes,
|
|
192
189
|
__pnextLegacyChildKind,
|
|
193
|
-
)
|
|
190
|
+
)
|
|
194
191
|
}
|
|
195
192
|
|
|
196
193
|
return createElement(
|
|
197
194
|
'a',
|
|
198
195
|
anchorAttributes,
|
|
199
|
-
createElement(
|
|
200
|
-
|
|
196
|
+
createElement(
|
|
197
|
+
LinkStatusContext.Provider,
|
|
198
|
+
{ value: { pending: linkPending(statusToken) } },
|
|
199
|
+
children,
|
|
200
|
+
),
|
|
201
|
+
) as ReactElement
|
|
201
202
|
}
|
|
202
203
|
|
|
203
|
-
export default Link
|
|
204
|
-
export { Link }
|
|
204
|
+
export default Link
|
|
205
|
+
export { Link }
|
|
205
206
|
|
|
206
207
|
export function useLinkStatus() {
|
|
207
|
-
return useContext(LinkStatusContext)
|
|
208
|
+
return useContext(LinkStatusContext)
|
|
208
209
|
}
|
|
209
210
|
|
|
210
211
|
// A stable per-Link identity used to key the pending navigation, plus a
|
|
211
212
|
// re-render on pending change so useLinkStatus consumers update.
|
|
212
213
|
function useLinkToken() {
|
|
213
|
-
const tokenRef = useRef<symbol | null>(null)
|
|
214
|
-
tokenRef.current ??= Symbol('pnext-link')
|
|
215
|
-
const token = tokenRef.current
|
|
216
|
-
const [, force] = useState(0)
|
|
217
|
-
useEffect(() => subscribeLinkStatus(token, () => force(n => n + 1)), [token])
|
|
218
|
-
return token
|
|
214
|
+
const tokenRef = useRef<symbol | null>(null)
|
|
215
|
+
tokenRef.current ??= Symbol('pnext-link')
|
|
216
|
+
const token = tokenRef.current
|
|
217
|
+
const [, force] = useState(0)
|
|
218
|
+
useEffect(() => subscribeLinkStatus(token, () => force(n => n + 1)), [token])
|
|
219
|
+
return token
|
|
219
220
|
}
|
|
220
221
|
|
|
221
222
|
// `legacyBehavior`: the single child element becomes the interactive element;
|
|
@@ -228,106 +229,110 @@ function renderLegacyChild(
|
|
|
228
229
|
anchorAttributes: Record<string, unknown>,
|
|
229
230
|
annotatedKind?: LegacyChildKind,
|
|
230
231
|
): ReactElement {
|
|
231
|
-
reportLegacyDeprecation()
|
|
232
|
+
reportLegacyDeprecation()
|
|
232
233
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
233
|
-
const isDev = process.env.NODE_ENV !== 'production'
|
|
234
|
-
const isServer = !process.browser && typeof window === 'undefined'
|
|
234
|
+
const isDev = process.env.NODE_ENV !== 'production'
|
|
235
|
+
const isServer = !process.browser && typeof window === 'undefined'
|
|
235
236
|
|
|
236
237
|
// A React.lazy payload passed directly (not wrapped in JSX) never resolves to
|
|
237
238
|
// a single element child; Next reports it specifically instead of Children.only.
|
|
238
|
-
if (isLazyComponent(children)) throw unsupportedLegacyChildError()
|
|
239
|
+
if (isLazyComponent(children)) throw unsupportedLegacyChildError()
|
|
239
240
|
|
|
240
241
|
if (children == null || children === false) {
|
|
241
242
|
if (isDev) {
|
|
242
243
|
throw validationError(
|
|
243
244
|
`No children were passed to <Link> with \`href\` of \`${resolvedHref}\` but one child is required https://nextjs.org/docs/messages/link-no-children`,
|
|
244
245
|
'E320',
|
|
245
|
-
)
|
|
246
|
+
)
|
|
246
247
|
}
|
|
247
|
-
return childrenOnlyOrThrow(children)
|
|
248
|
+
return childrenOnlyOrThrow(children)
|
|
248
249
|
}
|
|
249
250
|
|
|
250
251
|
// A bare string/number child renders its own <a> (Next's legacy behavior).
|
|
251
252
|
if (typeof children === 'string' || typeof children === 'number') {
|
|
252
|
-
return createElement(
|
|
253
|
+
return createElement(
|
|
254
|
+
'a',
|
|
255
|
+
{ ...anchorAttributes, href: resolvedHref },
|
|
256
|
+
children,
|
|
257
|
+
) as unknown as ReactElement
|
|
253
258
|
}
|
|
254
259
|
|
|
255
|
-
const count = toChildArray(children as JSX.Element).length
|
|
260
|
+
const count = toChildArray(children as JSX.Element).length
|
|
256
261
|
if (count > 1) {
|
|
257
262
|
if (isDev) {
|
|
258
263
|
throw validationError(
|
|
259
264
|
`Multiple children were passed to <Link> with \`href\` of \`${resolvedHref}\` but only one child is supported https://nextjs.org/docs/messages/link-multiple-children`,
|
|
260
265
|
'E266',
|
|
261
|
-
)
|
|
266
|
+
)
|
|
262
267
|
}
|
|
263
|
-
return childrenOnlyOrThrow(children)
|
|
268
|
+
return childrenOnlyOrThrow(children)
|
|
264
269
|
}
|
|
265
270
|
|
|
266
|
-
const child = childrenOnlyOrThrow(children) as ReactElement<Record<string, unknown
|
|
271
|
+
const child = childrenOnlyOrThrow(children) as ReactElement<Record<string, unknown>>
|
|
267
272
|
const kind =
|
|
268
273
|
annotatedKind ??
|
|
269
274
|
(isAsyncFunctionComponent(child.type)
|
|
270
275
|
? 'server-async'
|
|
271
276
|
: isLazyComponent(child.type)
|
|
272
277
|
? 'lazy'
|
|
273
|
-
: undefined)
|
|
278
|
+
: undefined)
|
|
274
279
|
if (isServer && (kind === 'server-sync' || kind === 'server-async' || kind === 'lazy')) {
|
|
275
|
-
reportUnsupportedServerChild(kind, isDev)
|
|
280
|
+
reportUnsupportedServerChild(kind, isDev)
|
|
276
281
|
}
|
|
277
282
|
if (kind && kind !== 'server-sync') {
|
|
278
|
-
const error = unsupportedLegacyChildError()
|
|
283
|
+
const error = unsupportedLegacyChildError()
|
|
279
284
|
if (isServer && kind === 'server-async-through-client') {
|
|
280
285
|
// Print the full trace, not just the message: the thrown error is
|
|
281
286
|
// swallowed downstream in this path, so without the ` at` frame lines
|
|
282
287
|
// the server log for this case would end at the message and the console
|
|
283
288
|
// snapshot (which slices up to the first ` at` line) would pick up the
|
|
284
289
|
// trailing blank line instead of terminating at the stack.
|
|
285
|
-
console.error(`⨯ ${error.stack ?? `Error: ${error.message}`}`)
|
|
290
|
+
console.error(`⨯ ${error.stack ?? `Error: ${error.message}`}`)
|
|
286
291
|
}
|
|
287
|
-
throw error
|
|
292
|
+
throw error
|
|
288
293
|
}
|
|
289
294
|
|
|
290
295
|
if (isServer && isDev && isServerComponent(child.type)) {
|
|
291
|
-
reportUnsupportedServerChild('server-sync', isDev)
|
|
296
|
+
reportUnsupportedServerChild('server-sync', isDev)
|
|
292
297
|
}
|
|
293
298
|
|
|
294
299
|
const childProps: Record<string, unknown> = {
|
|
295
300
|
onClick: (event: JSX.TargetedMouseEvent<HTMLAnchorElement>) => {
|
|
296
|
-
(child.props as { onClick?: (event: unknown) => void }).onClick?.(event)
|
|
297
|
-
onClick(event)
|
|
301
|
+
;(child.props as { onClick?: (event: unknown) => void }).onClick?.(event)
|
|
302
|
+
onClick(event)
|
|
298
303
|
},
|
|
299
|
-
}
|
|
304
|
+
}
|
|
300
305
|
if (passHref || (child.type as unknown) === 'a') {
|
|
301
306
|
// The child becomes the anchor: give it the href plus the runtime's
|
|
302
307
|
// soft-nav markers, so navigation/prefetch work even when the child is a
|
|
303
308
|
// static (unhydrated) element and the onClick prop never runs.
|
|
304
|
-
childProps.href = resolvedHref
|
|
305
|
-
childProps['data-pnext-link'] = anchorAttributes['data-pnext-link']
|
|
306
|
-
childProps['data-prefetch'] = anchorAttributes['data-prefetch']
|
|
307
|
-
childProps['data-prefetch-full'] = anchorAttributes['data-prefetch-full']
|
|
308
|
-
childProps['data-prefetch-hover-full'] = anchorAttributes['data-prefetch-hover-full']
|
|
309
|
-
childProps['data-pnext-replace'] = anchorAttributes['data-pnext-replace']
|
|
310
|
-
childProps['data-pnext-scroll'] = anchorAttributes['data-pnext-scroll']
|
|
309
|
+
childProps.href = resolvedHref
|
|
310
|
+
childProps['data-pnext-link'] = anchorAttributes['data-pnext-link']
|
|
311
|
+
childProps['data-prefetch'] = anchorAttributes['data-prefetch']
|
|
312
|
+
childProps['data-prefetch-full'] = anchorAttributes['data-prefetch-full']
|
|
313
|
+
childProps['data-prefetch-hover-full'] = anchorAttributes['data-prefetch-hover-full']
|
|
314
|
+
childProps['data-pnext-replace'] = anchorAttributes['data-pnext-replace']
|
|
315
|
+
childProps['data-pnext-scroll'] = anchorAttributes['data-pnext-scroll']
|
|
311
316
|
}
|
|
312
|
-
return cloneElement(child as never, childProps) as ReactElement
|
|
317
|
+
return cloneElement(child as never, childProps) as ReactElement
|
|
313
318
|
}
|
|
314
319
|
|
|
315
320
|
function reportUnsupportedServerChild(kind: LegacyChildKind, isDev: boolean) {
|
|
316
321
|
const message =
|
|
317
322
|
kind === 'lazy'
|
|
318
|
-
?
|
|
319
|
-
:
|
|
320
|
-
console.error(isDev ? validationError(message, 'E394') : message)
|
|
323
|
+
? "Using a Lazy Component as a direct child of `<Link legacyBehavior>` from a Server Component is not supported. If you need legacyBehavior, wrap your Lazy Component in a Client Component that renders the Link's `<a>` tag."
|
|
324
|
+
: "Using a Server Component as a direct child of `<Link legacyBehavior>` is not supported. If you need legacyBehavior, wrap your Server Component in a Client Component that renders the Link's `<a>` tag."
|
|
325
|
+
console.error(isDev ? validationError(message, 'E394') : message)
|
|
321
326
|
}
|
|
322
327
|
|
|
323
328
|
function unsupportedLegacyChildError() {
|
|
324
329
|
return validationError(
|
|
325
|
-
|
|
330
|
+
"`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag.",
|
|
326
331
|
'E863',
|
|
327
|
-
)
|
|
332
|
+
)
|
|
328
333
|
}
|
|
329
334
|
|
|
330
|
-
let deprecationWarned = false
|
|
335
|
+
let deprecationWarned = false
|
|
331
336
|
function reportLegacyDeprecation() {
|
|
332
337
|
if (
|
|
333
338
|
deprecationWarned ||
|
|
@@ -335,57 +340,54 @@ function reportLegacyDeprecation() {
|
|
|
335
340
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
336
341
|
process.env.NODE_ENV === 'production'
|
|
337
342
|
) {
|
|
338
|
-
return
|
|
343
|
+
return
|
|
339
344
|
}
|
|
340
|
-
deprecationWarned = true
|
|
345
|
+
deprecationWarned = true
|
|
341
346
|
console.error(
|
|
342
347
|
'`legacyBehavior` is deprecated and will be removed in a future release. A codemod is available to upgrade your components:\n\n' +
|
|
343
348
|
'npx @next/codemod@latest new-link .\n\n' +
|
|
344
349
|
'Learn more: https://nextjs.org/docs/app/building-your-application/upgrading/codemods#remove-a-tags-from-link-components',
|
|
345
|
-
)
|
|
350
|
+
)
|
|
346
351
|
}
|
|
347
352
|
|
|
348
353
|
function validationError(message: string, digest: string) {
|
|
349
|
-
return Object.assign(new Error(message), { digest })
|
|
354
|
+
return Object.assign(new Error(message), { digest })
|
|
350
355
|
}
|
|
351
356
|
|
|
352
357
|
// React.Children.only semantics on preact core: exactly one element child, with
|
|
353
358
|
// React's exact error wording for the no-children/multiple-children cases.
|
|
354
359
|
function childrenOnlyOrThrow(children: ReactNode): ReactElement {
|
|
355
|
-
const array = toChildArray(children as JSX.Element)
|
|
356
|
-
if (array.length === 1 && isValidElementLike(array[0])) return array[0] as ReactElement
|
|
357
|
-
throw new Error('React.Children.only expected to receive a single React element child.')
|
|
360
|
+
const array = toChildArray(children as JSX.Element)
|
|
361
|
+
if (array.length === 1 && isValidElementLike(array[0])) return array[0] as ReactElement
|
|
362
|
+
throw new Error('React.Children.only expected to receive a single React element child.')
|
|
358
363
|
}
|
|
359
364
|
|
|
360
365
|
function isValidElementLike(value: unknown) {
|
|
361
|
-
return value !== null && typeof value === 'object' && 'type' in value
|
|
366
|
+
return value !== null && typeof value === 'object' && 'type' in value
|
|
362
367
|
}
|
|
363
368
|
|
|
364
369
|
function isAsyncFunctionComponent(type: unknown) {
|
|
365
|
-
if (typeof type !== 'function') return false
|
|
366
|
-
const asyncFunctionName = Object.prototype.toString.call(type)
|
|
367
|
-
return asyncFunctionName === '[object AsyncFunction]'
|
|
370
|
+
if (typeof type !== 'function') return false
|
|
371
|
+
const asyncFunctionName = Object.prototype.toString.call(type)
|
|
372
|
+
return asyncFunctionName === '[object AsyncFunction]'
|
|
368
373
|
}
|
|
369
374
|
|
|
370
375
|
function isLazyComponent(type: unknown) {
|
|
371
|
-
if (type === null || (typeof type !== 'object' && typeof type !== 'function')) return false
|
|
372
|
-
const marked = type as { $$typeof?: unknown } & Record<symbol, unknown
|
|
373
|
-
return marked.$$typeof === Symbol.for('react.lazy') || marked[Symbol.for('pnext.lazy')] === true
|
|
376
|
+
if (type === null || (typeof type !== 'object' && typeof type !== 'function')) return false
|
|
377
|
+
const marked = type as { $$typeof?: unknown } & Record<symbol, unknown>
|
|
378
|
+
return marked.$$typeof === Symbol.for('react.lazy') || marked[Symbol.for('pnext.lazy')] === true
|
|
374
379
|
}
|
|
375
380
|
|
|
376
381
|
function isServerComponent(type: unknown) {
|
|
377
|
-
if (isClientComponent(type)) return false
|
|
378
|
-
return (
|
|
379
|
-
typeof type === 'function' &&
|
|
380
|
-
(type as { $$typeof?: unknown }).$$typeof === undefined
|
|
381
|
-
);
|
|
382
|
+
if (isClientComponent(type)) return false
|
|
383
|
+
return typeof type === 'function' && (type as { $$typeof?: unknown }).$$typeof === undefined
|
|
382
384
|
}
|
|
383
385
|
|
|
384
386
|
function isClientComponent(type: unknown) {
|
|
385
387
|
return (
|
|
386
388
|
(typeof type === 'object' || typeof type === 'function') &&
|
|
387
389
|
(type as { $$typeof?: unknown }).$$typeof === reactClientReferenceSymbol
|
|
388
|
-
)
|
|
390
|
+
)
|
|
389
391
|
}
|
|
390
392
|
|
|
391
393
|
function useComposedRef(
|
|
@@ -393,43 +395,41 @@ function useComposedRef(
|
|
|
393
395
|
userRef: Ref<HTMLAnchorElement> | undefined,
|
|
394
396
|
) {
|
|
395
397
|
return (node: HTMLAnchorElement | null) => {
|
|
396
|
-
internalRef.current = node
|
|
397
|
-
assignRef(userRef, node)
|
|
398
|
-
}
|
|
398
|
+
internalRef.current = node
|
|
399
|
+
assignRef(userRef, node)
|
|
400
|
+
}
|
|
399
401
|
}
|
|
400
402
|
|
|
401
403
|
function assignRef(ref: Ref<HTMLAnchorElement> | undefined, node: HTMLAnchorElement | null) {
|
|
402
|
-
if (!ref) return
|
|
404
|
+
if (!ref) return
|
|
403
405
|
if (typeof ref === 'function') {
|
|
404
406
|
// Callback refs may return a cleanup; Preact ignores it, which is fine —
|
|
405
407
|
// the ref is re-run with null on unmount, matching the manual-cleanup path.
|
|
406
|
-
ref(node)
|
|
407
|
-
return
|
|
408
|
+
ref(node)
|
|
409
|
+
return
|
|
408
410
|
}
|
|
409
|
-
ref.current = node
|
|
411
|
+
ref.current = node
|
|
410
412
|
}
|
|
411
413
|
|
|
412
414
|
function hrefString(href: string | URL | UrlObject) {
|
|
413
|
-
if (typeof href === 'string') return href
|
|
414
|
-
if (href instanceof URL) return href.toString()
|
|
415
|
-
return routeHref(href.pathname ?? '', { search: href.query, hash: href.hash })
|
|
415
|
+
if (typeof href === 'string') return href
|
|
416
|
+
if (href instanceof URL) return href.toString()
|
|
417
|
+
return routeHref(href.pathname ?? '', { search: href.query, hash: href.hash })
|
|
416
418
|
}
|
|
417
419
|
|
|
418
|
-
function nextPrefetchMode(
|
|
419
|
-
prefetch: boolean | 'auto' | 'unstable_forceStale' | null,
|
|
420
|
-
): PrefetchMode {
|
|
420
|
+
function nextPrefetchMode(prefetch: boolean | 'auto' | 'unstable_forceStale' | null): PrefetchMode {
|
|
421
421
|
// Next's default prefetches when the link enters the viewport; `false` opts
|
|
422
422
|
// out entirely. (`true`/'auto'/'unstable_forceStale' also map to viewport
|
|
423
423
|
// prefetch here — 'auto' is an explicit alias for the default.)
|
|
424
|
-
return prefetch === false ? false : 'visible'
|
|
424
|
+
return prefetch === false ? false : 'visible'
|
|
425
425
|
}
|
|
426
426
|
|
|
427
427
|
function isExternalHref(href: string) {
|
|
428
|
-
if (!process.browser && typeof window === 'undefined') return false
|
|
428
|
+
if (!process.browser && typeof window === 'undefined') return false
|
|
429
429
|
try {
|
|
430
|
-
return new URL(href, window.location.href).origin !== window.location.origin
|
|
430
|
+
return new URL(href, window.location.href).origin !== window.location.origin
|
|
431
431
|
} catch {
|
|
432
|
-
return true
|
|
432
|
+
return true
|
|
433
433
|
}
|
|
434
434
|
}
|
|
435
435
|
|
|
@@ -437,9 +437,9 @@ function navigationEvent() {
|
|
|
437
437
|
return {
|
|
438
438
|
defaultPrevented: false,
|
|
439
439
|
preventDefault() {
|
|
440
|
-
this.defaultPrevented = true
|
|
440
|
+
this.defaultPrevented = true
|
|
441
441
|
},
|
|
442
|
-
}
|
|
442
|
+
}
|
|
443
443
|
}
|
|
444
444
|
|
|
445
445
|
function isPlainLeftClick(event: JSX.TargetedMouseEvent<HTMLAnchorElement>) {
|
|
@@ -451,9 +451,9 @@ function isPlainLeftClick(event: JSX.TargetedMouseEvent<HTMLAnchorElement>) {
|
|
|
451
451
|
!event.shiftKey &&
|
|
452
452
|
isSelfTarget(event.currentTarget.target) &&
|
|
453
453
|
!event.currentTarget.hasAttribute('download')
|
|
454
|
-
)
|
|
454
|
+
)
|
|
455
455
|
}
|
|
456
456
|
|
|
457
457
|
function isSelfTarget(target: string) {
|
|
458
|
-
return target === '' || target === '_self'
|
|
458
|
+
return target === '' || target === '_self'
|
|
459
459
|
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
const router = {
|
|
2
|
-
push: () => undefined,
|
|
3
|
-
|
|
2
|
+
push: () => undefined,
|
|
3
|
+
replace: () => undefined,
|
|
4
|
+
prefetch: () => undefined,
|
|
5
|
+
refresh: () => undefined,
|
|
6
|
+
back: () => undefined,
|
|
7
|
+
forward: () => undefined,
|
|
4
8
|
bfcacheId: '',
|
|
5
9
|
}
|
|
6
10
|
const noop = () => undefined
|
|
@@ -15,7 +19,12 @@ exports.useRouter = () => router
|
|
|
15
19
|
exports.usePathname = () => null
|
|
16
20
|
exports.useSearchParams = () => new URLSearchParams()
|
|
17
21
|
exports.useParams = () => ({})
|
|
18
|
-
exports.useRoute = () => ({
|
|
22
|
+
exports.useRoute = () => ({
|
|
23
|
+
route: null,
|
|
24
|
+
pathname: '',
|
|
25
|
+
params: {},
|
|
26
|
+
searchParams: new URLSearchParams(),
|
|
27
|
+
})
|
|
19
28
|
exports.useSelectedLayoutSegment = () => null
|
|
20
29
|
exports.useSelectedLayoutSegments = () => []
|
|
21
30
|
exports.useLinkStatus = () => ({ pending: false })
|