@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/api/link.tsx
CHANGED
|
@@ -1,45 +1,42 @@
|
|
|
1
|
-
import { h, type ComponentChildren, type JSX } from 'preact'
|
|
2
|
-
import { useEffect, useRef } from 'preact/hooks'
|
|
3
|
-
import type {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
ReactNode,
|
|
7
|
-
} from 'react';
|
|
8
|
-
import { routeHref, type SearchInput } from '../routing/href';
|
|
9
|
-
import type { PrefetchMode, RouteParams, RoutePath } from '../types';
|
|
1
|
+
import { h, type ComponentChildren, type JSX } from 'preact'
|
|
2
|
+
import { useEffect, useRef } from 'preact/hooks'
|
|
3
|
+
import type { AnchorHTMLAttributes, MouseEvent, ReactNode } from 'react'
|
|
4
|
+
import { getDefaultPrefetchMode, routeHref, type SearchInput } from '../routing/href'
|
|
5
|
+
import type { PrefetchMode, RouteParams, RoutePath } from '../types'
|
|
10
6
|
|
|
11
7
|
export interface NavigateEvent {
|
|
12
|
-
preventDefault(): void
|
|
8
|
+
preventDefault(): void
|
|
13
9
|
}
|
|
14
10
|
|
|
15
|
-
type LinkMouseEvent = MouseEvent<HTMLAnchorElement
|
|
11
|
+
type LinkMouseEvent = MouseEvent<HTMLAnchorElement>
|
|
16
12
|
|
|
17
13
|
type BaseLinkProps = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href' | 'onClick'> & {
|
|
18
|
-
prefetch?: PrefetchMode
|
|
19
|
-
replace?: boolean
|
|
20
|
-
scroll?: boolean
|
|
21
|
-
search?: SearchInput
|
|
22
|
-
hash?: string
|
|
23
|
-
onClick?: (event: LinkMouseEvent) => void
|
|
24
|
-
onNavigate?: (event: NavigateEvent) => void
|
|
25
|
-
onPrefetchStart?: () => void
|
|
26
|
-
onPrefetchFinish?: () => void
|
|
27
|
-
children?: ReactNode
|
|
28
|
-
}
|
|
14
|
+
prefetch?: PrefetchMode
|
|
15
|
+
replace?: boolean
|
|
16
|
+
scroll?: boolean
|
|
17
|
+
search?: SearchInput
|
|
18
|
+
hash?: string
|
|
19
|
+
onClick?: (event: LinkMouseEvent) => void
|
|
20
|
+
onNavigate?: (event: NavigateEvent) => void
|
|
21
|
+
onPrefetchStart?: () => void
|
|
22
|
+
onPrefetchFinish?: () => void
|
|
23
|
+
children?: ReactNode
|
|
24
|
+
}
|
|
29
25
|
|
|
30
|
-
type ParamsProp<Route extends RoutePath> =
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
type ParamsProp<Route extends RoutePath> =
|
|
27
|
+
RouteParams<Route> extends Record<string, never>
|
|
28
|
+
? { params?: never }
|
|
29
|
+
: { params: RouteParams<Route> }
|
|
33
30
|
|
|
34
31
|
export type LinkProps<Route extends RoutePath = RoutePath> = BaseLinkProps &
|
|
35
32
|
ParamsProp<Route> & {
|
|
36
|
-
href: Route
|
|
37
|
-
}
|
|
33
|
+
href: Route
|
|
34
|
+
}
|
|
38
35
|
|
|
39
36
|
export function Link<Route extends RoutePath>({
|
|
40
37
|
href,
|
|
41
38
|
params,
|
|
42
|
-
prefetch
|
|
39
|
+
prefetch,
|
|
43
40
|
replace,
|
|
44
41
|
scroll,
|
|
45
42
|
search,
|
|
@@ -51,8 +48,10 @@ export function Link<Route extends RoutePath>({
|
|
|
51
48
|
children,
|
|
52
49
|
...anchorProps
|
|
53
50
|
}: LinkProps<Route>): ReactNode {
|
|
54
|
-
const resolvedHref = routeHref(href, { params: params ?? {}, search, hash })
|
|
55
|
-
|
|
51
|
+
const resolvedHref = routeHref(href, { params: params ?? {}, search, hash })
|
|
52
|
+
// A link's own prefetch prop wins; otherwise the app-wide config default.
|
|
53
|
+
const prefetchMode = prefetch ?? getDefaultPrefetchMode()
|
|
54
|
+
const anchorRef = usePrefetchLifecycle(onPrefetchStart, onPrefetchFinish)
|
|
56
55
|
return h(
|
|
57
56
|
'a',
|
|
58
57
|
{
|
|
@@ -60,50 +59,50 @@ export function Link<Route extends RoutePath>({
|
|
|
60
59
|
ref: anchorRef,
|
|
61
60
|
href: resolvedHref,
|
|
62
61
|
'data-pnext-link': true,
|
|
63
|
-
'data-prefetch':
|
|
62
|
+
'data-prefetch': prefetchMode === false ? 'false' : prefetchMode,
|
|
64
63
|
'data-pnext-replace': replace ? 'true' : undefined,
|
|
65
64
|
'data-pnext-scroll': scroll === false ? 'false' : undefined,
|
|
66
65
|
onClick: event => {
|
|
67
|
-
const clickEvent = event as unknown as LinkMouseEvent
|
|
68
|
-
onClick?.(clickEvent)
|
|
69
|
-
if (clickEvent.defaultPrevented || !onNavigate || !isPlainLeftClick(clickEvent)) return
|
|
70
|
-
const navEvent = navigationEvent()
|
|
71
|
-
onNavigate(navEvent)
|
|
72
|
-
if (navEvent.defaultPrevented) clickEvent.preventDefault()
|
|
66
|
+
const clickEvent = event as unknown as LinkMouseEvent
|
|
67
|
+
onClick?.(clickEvent)
|
|
68
|
+
if (clickEvent.defaultPrevented || !onNavigate || !isPlainLeftClick(clickEvent)) return
|
|
69
|
+
const navEvent = navigationEvent()
|
|
70
|
+
onNavigate(navEvent)
|
|
71
|
+
if (navEvent.defaultPrevented) clickEvent.preventDefault()
|
|
73
72
|
},
|
|
74
73
|
} as JSX.HTMLAttributes<HTMLAnchorElement>,
|
|
75
74
|
children as ComponentChildren,
|
|
76
|
-
) as unknown as ReactNode
|
|
75
|
+
) as unknown as ReactNode
|
|
77
76
|
}
|
|
78
77
|
|
|
79
78
|
// The prefetch runtime dispatches lifecycle events on the anchor that
|
|
80
79
|
// triggered a prefetch, for every mode (intent, visible, load).
|
|
81
80
|
export function usePrefetchLifecycle(onStart?: () => void, onFinish?: () => void) {
|
|
82
|
-
const anchorRef = useRef<HTMLAnchorElement | null>(null)
|
|
81
|
+
const anchorRef = useRef<HTMLAnchorElement | null>(null)
|
|
83
82
|
|
|
84
83
|
useEffect(() => {
|
|
85
|
-
const node = anchorRef.current
|
|
86
|
-
if (!node || (!onStart && !onFinish)) return
|
|
87
|
-
const handleStart = () => onStart?.()
|
|
88
|
-
const handleFinish = () => onFinish?.()
|
|
89
|
-
node.addEventListener('pnext:prefetchstart', handleStart)
|
|
90
|
-
node.addEventListener('pnext:prefetchfinish', handleFinish)
|
|
84
|
+
const node = anchorRef.current
|
|
85
|
+
if (!node || (!onStart && !onFinish)) return
|
|
86
|
+
const handleStart = () => onStart?.()
|
|
87
|
+
const handleFinish = () => onFinish?.()
|
|
88
|
+
node.addEventListener('pnext:prefetchstart', handleStart)
|
|
89
|
+
node.addEventListener('pnext:prefetchfinish', handleFinish)
|
|
91
90
|
return () => {
|
|
92
|
-
node.removeEventListener('pnext:prefetchstart', handleStart)
|
|
93
|
-
node.removeEventListener('pnext:prefetchfinish', handleFinish)
|
|
94
|
-
}
|
|
95
|
-
}, [onStart, onFinish])
|
|
91
|
+
node.removeEventListener('pnext:prefetchstart', handleStart)
|
|
92
|
+
node.removeEventListener('pnext:prefetchfinish', handleFinish)
|
|
93
|
+
}
|
|
94
|
+
}, [onStart, onFinish])
|
|
96
95
|
|
|
97
|
-
return anchorRef
|
|
96
|
+
return anchorRef
|
|
98
97
|
}
|
|
99
98
|
|
|
100
99
|
function navigationEvent() {
|
|
101
100
|
return {
|
|
102
101
|
defaultPrevented: false,
|
|
103
102
|
preventDefault() {
|
|
104
|
-
this.defaultPrevented = true
|
|
103
|
+
this.defaultPrevented = true
|
|
105
104
|
},
|
|
106
|
-
}
|
|
105
|
+
}
|
|
107
106
|
}
|
|
108
107
|
|
|
109
108
|
function isPlainLeftClick(event: LinkMouseEvent) {
|
|
@@ -115,5 +114,5 @@ function isPlainLeftClick(event: LinkMouseEvent) {
|
|
|
115
114
|
!event.shiftKey &&
|
|
116
115
|
!event.currentTarget.target &&
|
|
117
116
|
!event.currentTarget.download
|
|
118
|
-
)
|
|
117
|
+
)
|
|
119
118
|
}
|
package/src/api/navigation.ts
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { routeHref, type SearchInput } from '../routing/href'
|
|
2
|
-
import type { RouteParams, RoutePath } from '../types'
|
|
1
|
+
import { routeHref, type SearchInput } from '../routing/href'
|
|
2
|
+
import type { RouteParams, RoutePath } from '../types'
|
|
3
3
|
|
|
4
|
-
export type { SearchInput, SearchValue } from '../routing/href'
|
|
4
|
+
export type { SearchInput, SearchValue } from '../routing/href'
|
|
5
5
|
|
|
6
|
-
const notFoundDigest = 'PNEXT_NOT_FOUND'
|
|
7
|
-
const redirectDigest = 'PNEXT_REDIRECT'
|
|
8
|
-
const forbiddenDigest = 'PNEXT_FORBIDDEN'
|
|
9
|
-
const unauthorizedDigest = 'PNEXT_UNAUTHORIZED'
|
|
10
|
-
const nextNotFoundDigest = 'NEXT_HTTP_ERROR_FALLBACK;404'
|
|
11
|
-
const nextForbiddenDigest = 'NEXT_HTTP_ERROR_FALLBACK;403'
|
|
12
|
-
const nextUnauthorizedDigest = 'NEXT_HTTP_ERROR_FALLBACK;401'
|
|
6
|
+
const notFoundDigest = 'PNEXT_NOT_FOUND'
|
|
7
|
+
const redirectDigest = 'PNEXT_REDIRECT'
|
|
8
|
+
const forbiddenDigest = 'PNEXT_FORBIDDEN'
|
|
9
|
+
const unauthorizedDigest = 'PNEXT_UNAUTHORIZED'
|
|
10
|
+
const nextNotFoundDigest = 'NEXT_HTTP_ERROR_FALLBACK;404'
|
|
11
|
+
const nextForbiddenDigest = 'NEXT_HTTP_ERROR_FALLBACK;403'
|
|
12
|
+
const nextUnauthorizedDigest = 'NEXT_HTTP_ERROR_FALLBACK;401'
|
|
13
13
|
|
|
14
|
-
export type RedirectStatus = 303 | 307 | 308
|
|
14
|
+
export type RedirectStatus = 303 | 307 | 308
|
|
15
15
|
|
|
16
16
|
class ReadonlyURLSearchParamsError extends Error {
|
|
17
17
|
constructor() {
|
|
18
18
|
super(
|
|
19
19
|
'Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams',
|
|
20
|
-
)
|
|
20
|
+
)
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -29,34 +29,35 @@ class ReadonlyURLSearchParamsError extends Error {
|
|
|
29
29
|
export class ReadonlyURLSearchParams extends URLSearchParams {
|
|
30
30
|
/** @deprecated Method unavailable on `ReadonlyURLSearchParams`. */
|
|
31
31
|
append(): never {
|
|
32
|
-
throw new ReadonlyURLSearchParamsError()
|
|
32
|
+
throw new ReadonlyURLSearchParamsError()
|
|
33
33
|
}
|
|
34
34
|
/** @deprecated Method unavailable on `ReadonlyURLSearchParams`. */
|
|
35
35
|
delete(): never {
|
|
36
|
-
throw new ReadonlyURLSearchParamsError()
|
|
36
|
+
throw new ReadonlyURLSearchParamsError()
|
|
37
37
|
}
|
|
38
38
|
/** @deprecated Method unavailable on `ReadonlyURLSearchParams`. */
|
|
39
39
|
set(): never {
|
|
40
|
-
throw new ReadonlyURLSearchParamsError()
|
|
40
|
+
throw new ReadonlyURLSearchParamsError()
|
|
41
41
|
}
|
|
42
42
|
/** @deprecated Method unavailable on `ReadonlyURLSearchParams`. */
|
|
43
43
|
sort(): never {
|
|
44
|
-
throw new ReadonlyURLSearchParamsError()
|
|
44
|
+
throw new ReadonlyURLSearchParamsError()
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
type ParamsProp<Route extends RoutePath> =
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
type ParamsProp<Route extends RoutePath> =
|
|
49
|
+
RouteParams<Route> extends Record<string, never>
|
|
50
|
+
? { params?: never }
|
|
51
|
+
: { params: RouteParams<Route> }
|
|
51
52
|
|
|
52
53
|
export type HrefOptions<Route extends RoutePath> = ParamsProp<Route> & {
|
|
53
|
-
search?: SearchInput
|
|
54
|
-
hash?: string
|
|
55
|
-
}
|
|
54
|
+
search?: SearchInput
|
|
55
|
+
hash?: string
|
|
56
|
+
}
|
|
56
57
|
|
|
57
58
|
export type RedirectOptions<Route extends RoutePath> = HrefOptions<Route> & {
|
|
58
|
-
status?: RedirectStatus
|
|
59
|
-
}
|
|
59
|
+
status?: RedirectStatus
|
|
60
|
+
}
|
|
60
61
|
|
|
61
62
|
export function href<Route extends RoutePath>(
|
|
62
63
|
route: Route,
|
|
@@ -64,26 +65,26 @@ export function href<Route extends RoutePath>(
|
|
|
64
65
|
? [options?: HrefOptions<Route>]
|
|
65
66
|
: [options: HrefOptions<Route>]
|
|
66
67
|
) {
|
|
67
|
-
return routeHref(route, options)
|
|
68
|
+
return routeHref(route, options)
|
|
68
69
|
}
|
|
69
70
|
|
|
70
71
|
export class PNextNotFoundError extends Error {
|
|
71
|
-
digest = notFoundDigest
|
|
72
|
+
digest = notFoundDigest
|
|
72
73
|
|
|
73
74
|
constructor() {
|
|
74
|
-
super('not found')
|
|
75
|
+
super('not found')
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
export function notFound(): never {
|
|
79
|
-
throw new PNextNotFoundError()
|
|
80
|
+
throw new PNextNotFoundError()
|
|
80
81
|
}
|
|
81
82
|
|
|
82
83
|
export class PNextForbiddenError extends Error {
|
|
83
|
-
digest = forbiddenDigest
|
|
84
|
+
digest = forbiddenDigest
|
|
84
85
|
|
|
85
86
|
constructor() {
|
|
86
|
-
super('forbidden')
|
|
87
|
+
super('forbidden')
|
|
87
88
|
}
|
|
88
89
|
}
|
|
89
90
|
|
|
@@ -92,14 +93,14 @@ export class PNextForbiddenError extends Error {
|
|
|
92
93
|
* `forbidden.{tsx,...}` boundary with a 403. Only active when compat.next is on.
|
|
93
94
|
*/
|
|
94
95
|
export function forbidden(): never {
|
|
95
|
-
throw new PNextForbiddenError()
|
|
96
|
+
throw new PNextForbiddenError()
|
|
96
97
|
}
|
|
97
98
|
|
|
98
99
|
export class PNextUnauthorizedError extends Error {
|
|
99
|
-
digest = unauthorizedDigest
|
|
100
|
+
digest = unauthorizedDigest
|
|
100
101
|
|
|
101
102
|
constructor() {
|
|
102
|
-
super('unauthorized')
|
|
103
|
+
super('unauthorized')
|
|
103
104
|
}
|
|
104
105
|
}
|
|
105
106
|
|
|
@@ -108,50 +109,50 @@ export class PNextUnauthorizedError extends Error {
|
|
|
108
109
|
* `unauthorized.{tsx,...}` boundary with a 401. Only active when compat.next is on.
|
|
109
110
|
*/
|
|
110
111
|
export function unauthorized(): never {
|
|
111
|
-
throw new PNextUnauthorizedError()
|
|
112
|
+
throw new PNextUnauthorizedError()
|
|
112
113
|
}
|
|
113
114
|
|
|
114
115
|
export class PNextRedirectError extends Error {
|
|
115
|
-
digest = redirectDigest
|
|
116
|
+
digest = redirectDigest
|
|
116
117
|
|
|
117
118
|
constructor(
|
|
118
119
|
public location: string,
|
|
119
120
|
public status: RedirectStatus = 307,
|
|
120
121
|
) {
|
|
121
|
-
super(`redirect to ${location}`)
|
|
122
|
+
super(`redirect to ${location}`)
|
|
122
123
|
}
|
|
123
124
|
}
|
|
124
125
|
|
|
125
126
|
export function redirect<Route extends RoutePath>(
|
|
126
127
|
route: Route,
|
|
127
128
|
options: RedirectOptions<Route>,
|
|
128
|
-
): never
|
|
129
|
-
export function redirect(location: string, status?: RedirectStatus): never
|
|
129
|
+
): never
|
|
130
|
+
export function redirect(location: string, status?: RedirectStatus): never
|
|
130
131
|
export function redirect<Route extends RoutePath>(
|
|
131
132
|
location: Route | string,
|
|
132
133
|
optionsOrStatus: RedirectOptions<Route> | RedirectStatus = 307,
|
|
133
134
|
): never {
|
|
134
135
|
if (typeof optionsOrStatus === 'number') {
|
|
135
|
-
if (redirectInBrowser(location, 'replace')) return undefined as never
|
|
136
|
-
throw new PNextRedirectError(location, optionsOrStatus)
|
|
136
|
+
if (redirectInBrowser(location, 'replace')) return undefined as never
|
|
137
|
+
throw new PNextRedirectError(location, optionsOrStatus)
|
|
137
138
|
}
|
|
138
|
-
const href = routeHref(location, optionsOrStatus)
|
|
139
|
-
if (redirectInBrowser(href, 'replace')) return undefined as never
|
|
140
|
-
throw new PNextRedirectError(href, optionsOrStatus.status ?? 307)
|
|
139
|
+
const href = routeHref(location, optionsOrStatus)
|
|
140
|
+
if (redirectInBrowser(href, 'replace')) return undefined as never
|
|
141
|
+
throw new PNextRedirectError(href, optionsOrStatus.status ?? 307)
|
|
141
142
|
}
|
|
142
143
|
|
|
143
144
|
export function permanentRedirect<Route extends RoutePath>(
|
|
144
145
|
route: Route,
|
|
145
146
|
options: HrefOptions<Route>,
|
|
146
|
-
): never
|
|
147
|
-
export function permanentRedirect(location: string): never
|
|
147
|
+
): never
|
|
148
|
+
export function permanentRedirect(location: string): never
|
|
148
149
|
export function permanentRedirect<Route extends RoutePath>(
|
|
149
150
|
location: Route | string,
|
|
150
151
|
options?: HrefOptions<Route>,
|
|
151
152
|
): never {
|
|
152
|
-
const href = options ? routeHref(location, options) : location
|
|
153
|
-
if (redirectInBrowser(href, 'replace')) return undefined as never
|
|
154
|
-
throw new PNextRedirectError(href, 308)
|
|
153
|
+
const href = options ? routeHref(location, options) : location
|
|
154
|
+
if (redirectInBrowser(href, 'replace')) return undefined as never
|
|
155
|
+
throw new PNextRedirectError(href, 308)
|
|
155
156
|
}
|
|
156
157
|
|
|
157
158
|
export function isNotFoundError(error: unknown) {
|
|
@@ -159,11 +160,11 @@ export function isNotFoundError(error: unknown) {
|
|
|
159
160
|
error instanceof PNextNotFoundError ||
|
|
160
161
|
errorDigest(error) === notFoundDigest ||
|
|
161
162
|
errorDigest(error) === nextNotFoundDigest
|
|
162
|
-
)
|
|
163
|
+
)
|
|
163
164
|
}
|
|
164
165
|
|
|
165
166
|
export function isRedirectError(error: unknown): error is PNextRedirectError {
|
|
166
|
-
return error instanceof PNextRedirectError || errorDigest(error) === redirectDigest
|
|
167
|
+
return error instanceof PNextRedirectError || errorDigest(error) === redirectDigest
|
|
167
168
|
}
|
|
168
169
|
|
|
169
170
|
export function isForbiddenError(error: unknown): error is PNextForbiddenError {
|
|
@@ -171,7 +172,7 @@ export function isForbiddenError(error: unknown): error is PNextForbiddenError {
|
|
|
171
172
|
error instanceof PNextForbiddenError ||
|
|
172
173
|
errorDigest(error) === forbiddenDigest ||
|
|
173
174
|
errorDigest(error) === nextForbiddenDigest
|
|
174
|
-
)
|
|
175
|
+
)
|
|
175
176
|
}
|
|
176
177
|
|
|
177
178
|
export function isUnauthorizedError(error: unknown): error is PNextUnauthorizedError {
|
|
@@ -179,20 +180,20 @@ export function isUnauthorizedError(error: unknown): error is PNextUnauthorizedE
|
|
|
179
180
|
error instanceof PNextUnauthorizedError ||
|
|
180
181
|
errorDigest(error) === unauthorizedDigest ||
|
|
181
182
|
errorDigest(error) === nextUnauthorizedDigest
|
|
182
|
-
)
|
|
183
|
+
)
|
|
183
184
|
}
|
|
184
185
|
|
|
185
186
|
function errorDigest(error: unknown) {
|
|
186
187
|
return typeof error === 'object' && error !== null && 'digest' in error
|
|
187
188
|
? (error as { digest?: unknown }).digest
|
|
188
|
-
: undefined
|
|
189
|
+
: undefined
|
|
189
190
|
}
|
|
190
191
|
|
|
191
192
|
function redirectInBrowser(location: string, mode: 'push' | 'replace') {
|
|
192
|
-
if (!process.browser && typeof window === 'undefined') return false
|
|
193
|
+
if (!process.browser && typeof window === 'undefined') return false
|
|
193
194
|
|
|
194
|
-
const href = new URL(location, window.location.href).href
|
|
195
|
-
if (mode === 'push') window.location.assign(href)
|
|
196
|
-
else window.location.replace(href)
|
|
197
|
-
return true
|
|
195
|
+
const href = new URL(location, window.location.href).href
|
|
196
|
+
if (mode === 'push') window.location.assign(href)
|
|
197
|
+
else window.location.replace(href)
|
|
198
|
+
return true
|
|
198
199
|
}
|