@wular/pnext 0.0.4 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -16
- package/bin/pnext +6 -1
- package/config/lint/base.js +7 -7
- package/config/ts/base.json +2 -4
- package/config/ts/react.json +2 -6
- package/package.json +23 -2
- package/reference/compat.md +87 -22
- package/reference/config.md +40 -93
- package/reference/css.md +42 -33
- package/reference/dev.md +26 -33
- package/reference/env.md +18 -20
- package/reference/getting-started.md +132 -0
- package/reference/metadata.md +31 -46
- package/reference/navigation.md +65 -105
- package/reference/performance.md +21 -142
- package/reference/rendering.md +78 -75
- package/reference/routing.md +97 -107
- package/reference/typegen.md +27 -29
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +121 -114
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +52 -53
- package/src/api/navigation.ts +59 -58
- package/src/api/server.ts +152 -144
- package/src/api/suspense.ts +4 -4
- package/src/cli/adapters/vercel-warm.ts +126 -121
- package/src/cli/adapters/vercel.ts +437 -443
- package/src/cli/analyze.ts +333 -144
- package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
- package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
- package/src/cli/build.ts +976 -978
- package/src/cli/create.ts +72 -64
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +94 -85
- package/src/cli/migrate/package-json.ts +73 -71
- package/src/cli/migrate/report.ts +32 -33
- package/src/cli/migrate/{index.ts → run.ts} +48 -49
- package/src/cli/migrate/scan.ts +46 -46
- package/src/cli/migrate/spinner.ts +9 -9
- package/src/cli/migrate/tsconfig.ts +35 -35
- package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
- package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
- package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
- package/src/cli/start.ts +65 -66
- package/src/{typegen.ts → cli/typegen.ts} +59 -59
- package/src/client/build.ts +802 -768
- package/src/client/chunk-fold.ts +245 -240
- package/src/client/{paths.ts → chunk-name.ts} +6 -6
- package/src/client/entry.ts +162 -147
- package/src/client/prebuilt.ts +231 -223
- package/src/client/profile.ts +29 -29
- package/src/client/react-compiler.ts +20 -15
- package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
- package/src/client/reference-stub.ts +51 -51
- package/src/client/reference.ts +19 -19
- package/src/{api → client}/router/events.ts +32 -17
- package/src/{api → client}/router/history.ts +16 -16
- package/src/{api → client}/router/hub.ts +52 -53
- package/src/{api/router.ts → client/router/index.ts} +61 -60
- package/src/{api → client}/router/policies.ts +24 -24
- package/src/{api → client}/router/runtime.ts +2022 -1995
- package/src/{api → client}/router/types.ts +98 -98
- package/src/compat/actions/client-plugin.ts +42 -43
- package/src/compat/actions/client-stub.ts +14 -14
- package/src/compat/actions/{action-client.ts → client.ts} +194 -193
- package/src/compat/actions/config.ts +63 -64
- package/src/compat/actions/detect.ts +68 -68
- package/src/compat/actions/discovery.ts +105 -105
- package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
- package/src/compat/actions/early-submit.ts +1 -1
- package/src/compat/actions/endpoint.ts +198 -198
- package/src/compat/actions/extensions.ts +811 -0
- package/src/compat/actions/flight.ts +23 -23
- package/src/compat/actions/form-state.ts +34 -34
- package/src/compat/actions/hoist.ts +382 -236
- package/src/compat/actions/ids.ts +7 -12
- package/src/compat/actions/index.ts +8 -8
- package/src/compat/actions/instances.ts +46 -46
- package/src/compat/actions/origin.ts +47 -48
- package/src/compat/actions/protocol.ts +22 -22
- package/src/compat/actions/registry.ts +19 -19
- package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
- package/src/compat/actions/rewrite.ts +125 -125
- package/src/compat/actions/{action-router.ts → router.ts} +10 -10
- package/src/compat/actions/serve.ts +132 -136
- package/src/compat/actions/server-tag.ts +4 -4
- package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
- package/src/compat/actions/unrecognized-error.ts +4 -4
- package/src/compat/{index.ts → aliases.ts} +112 -109
- package/src/compat/bundler/bun-externals.ts +18 -18
- package/src/compat/bundler/cjs-exports.ts +271 -223
- package/src/compat/bundler/config.ts +116 -111
- package/src/compat/bundler/externals.ts +12 -12
- package/src/compat/bundler/import-meta-url.ts +19 -19
- package/src/compat/bundler/modularize-imports.ts +36 -33
- package/src/compat/bundler/new-url-asset.ts +22 -24
- package/src/compat/bundler/optimize-package-imports.ts +111 -107
- package/src/compat/bundler/polyfill.ts +28 -28
- package/src/compat/bundler/react-compiler.ts +35 -29
- package/src/compat/bundler/react-profiler.tsx +11 -11
- package/src/compat/bundler/relay-transform.ts +48 -47
- package/src/compat/bundler/require-context.ts +119 -113
- package/src/compat/bundler/resolve-extensions.ts +19 -19
- package/src/compat/bundler/source-cache.ts +25 -25
- package/src/compat/bundler/static-imports.ts +7 -7
- package/src/compat/bundler/symlink-imports.ts +46 -46
- package/src/compat/bundler/tsconfig-paths.ts +13 -15
- package/src/compat/bundler/wasm.ts +58 -60
- package/src/compat/bundler/webpack-loaders.ts +254 -241
- package/src/compat/bundler/worker.ts +101 -104
- package/src/compat/cache/build-flags.ts +29 -29
- package/src/compat/cache/build-prerender-errors.ts +40 -44
- package/src/compat/cache/custom-handler.ts +60 -53
- package/src/compat/cache/fetch-patch.ts +240 -240
- package/src/compat/cache/handler.ts +27 -31
- package/src/compat/cache/modern-handler.ts +148 -126
- package/src/compat/cache/resume-data-cache.ts +47 -45
- package/src/compat/cache/revalidate.ts +233 -232
- package/src/compat/cache/runtime-error.ts +35 -35
- package/src/compat/cache/use-cache-transform.ts +442 -417
- package/src/compat/cache/use-cache.ts +650 -614
- package/src/compat/cache-control.ts +140 -142
- package/src/compat/client/base-path.ts +21 -20
- package/src/compat/client/css-order.ts +18 -18
- package/src/compat/client/errors/bare-boundary.ts +11 -11
- package/src/compat/client/errors/control-flow.ts +23 -23
- package/src/compat/client/errors/error-boundary.ts +61 -61
- package/src/compat/client/errors/global-error.ts +101 -91
- package/src/compat/client/errors/install.ts +71 -72
- package/src/compat/client/errors/lazy.ts +23 -23
- package/src/compat/client/errors/primitive-throw.ts +47 -45
- package/src/compat/client/errors/soft-refresh.ts +4 -4
- package/src/compat/client/link-status.ts +33 -33
- package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
- package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
- package/src/compat/client/navigation-scroll.ts +63 -63
- package/src/compat/client/optimistic-routing.ts +93 -88
- package/src/compat/client/prefetch-cache.ts +23 -24
- package/src/compat/client/route-announcer.ts +35 -35
- package/src/compat/client/segment-cache-policy.ts +20 -20
- package/src/compat/client/segment-cache.ts +309 -315
- package/src/compat/client/segment-prefetch.ts +127 -132
- package/src/compat/client/trailing-slash.ts +5 -4
- package/src/compat/css/chunking.ts +113 -116
- package/src/compat/css/inline-css.ts +21 -21
- package/src/compat/css/lightningcss.ts +37 -38
- package/src/compat/css/modules.ts +161 -175
- package/src/compat/css/nonce.ts +7 -7
- package/src/compat/css/sass-plugin.ts +18 -21
- package/src/compat/css/sass.ts +150 -152
- package/src/compat/css/styled-jsx-runtime.ts +27 -27
- package/src/compat/css/styled-jsx.ts +21 -21
- package/src/compat/edge-runtime.ts +27 -27
- package/src/compat/{adapter → export}/build-complete.ts +72 -75
- package/src/compat/export/client.ts +29 -31
- package/src/compat/export/{index.ts → emit.ts} +111 -110
- package/src/compat/export/standalone.ts +62 -54
- package/src/compat/image-optimizer/cache.ts +51 -49
- package/src/compat/image-optimizer/detect.ts +52 -52
- package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
- package/src/compat/image-optimizer/source.ts +77 -80
- package/src/compat/lifecycle/after-scope.ts +26 -26
- package/src/compat/lifecycle/after.ts +48 -45
- package/src/compat/lifecycle/error-funnel.ts +98 -102
- package/src/compat/lifecycle/error-serialize.ts +30 -26
- package/src/compat/lifecycle/error-ui.ts +67 -32
- package/src/compat/lifecycle/instrumentation-client.ts +36 -38
- package/src/compat/lifecycle/instrumentation.ts +85 -85
- package/src/compat/lifecycle/node-console.ts +11 -11
- package/src/compat/lifecycle/testmode.ts +160 -132
- package/src/compat/mdx/compile.ts +60 -57
- package/src/compat/mdx/plugin.ts +11 -11
- package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
- package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
- package/src/compat/metadata.ts +75 -81
- package/src/compat/next/cache.ts +68 -69
- package/src/compat/next/canonical-url.ts +9 -9
- package/src/compat/next/client-cache.ts +19 -19
- package/src/compat/next/client-navigation.ts +112 -116
- package/src/compat/next/client-only.ts +1 -1
- package/src/compat/next/client-script.tsx +99 -93
- package/src/compat/next/client-server.ts +10 -10
- package/src/compat/next/config-loader.ts +176 -173
- package/src/compat/next/config.ts +7 -7
- package/src/compat/next/constants.cjs +6 -6
- package/src/compat/next/constants.ts +6 -6
- package/src/compat/next/custom-server.ts +26 -24
- package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
- package/src/compat/next/dynamic.tsx +21 -18
- package/src/compat/next/error.tsx +52 -52
- package/src/compat/next/font/cache.ts +74 -74
- package/src/compat/next/font/google.ts +2 -2
- package/src/compat/next/font/index.ts +1 -1
- package/src/compat/next/font/local.ts +3 -3
- package/src/compat/next/font/runtime-client.ts +17 -15
- package/src/compat/next/font/runtime.ts +443 -408
- package/src/compat/next/font/shared.ts +120 -108
- package/src/compat/next/form.tsx +63 -63
- package/src/compat/next/head.tsx +2 -2
- package/src/compat/next/headers.ts +103 -95
- package/src/compat/next/image/client.tsx +220 -0
- package/src/compat/next/image/config.ts +56 -58
- package/src/compat/next/image/optimizer.ts +40 -36
- package/src/compat/next/image/patterns.ts +37 -40
- package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
- package/src/compat/next/image/shared.ts +65 -57
- package/src/compat/next/image/static-metadata.ts +98 -107
- package/src/compat/next/image/validate.ts +79 -88
- package/src/compat/next/image.tsx +19 -23
- package/src/compat/next/index.ts +1 -1
- package/src/compat/next/legacy-image.tsx +59 -60
- package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
- package/src/compat/next/link.tsx +158 -158
- package/src/compat/next/navigation.cjs +12 -3
- package/src/compat/next/navigation.ts +48 -50
- package/src/compat/next/offline.ts +27 -27
- package/src/compat/next/og.ts +121 -124
- package/src/compat/next/preferred-region.ts +13 -14
- package/src/compat/next/redirects.ts +58 -56
- package/src/compat/next/resource-hints.ts +73 -76
- package/src/compat/next/rewrites.ts +130 -133
- package/src/compat/next/root-params.ts +45 -45
- package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
- package/src/compat/next/router.cjs +4 -2
- package/src/compat/next/router.ts +58 -61
- package/src/compat/next/script.tsx +108 -108
- package/src/compat/next/server-only.ts +1 -1
- package/src/compat/next/server.ts +19 -19
- package/src/compat/next/svgr.ts +18 -17
- package/src/compat/next/telemetry.ts +24 -24
- package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
- package/src/compat/next/user-agent.ts +53 -49
- package/src/compat/next/web-vitals.ts +22 -24
- package/src/compat/otel/api.ts +41 -41
- package/src/compat/otel/client-trace-metadata.ts +25 -27
- package/src/compat/otel/fetch-span.ts +29 -29
- package/src/compat/otel/tracer.ts +331 -331
- package/src/compat/pages/api.ts +456 -0
- package/src/compat/pages/client-plugin.ts +36 -36
- package/src/compat/pages/router-state.ts +34 -34
- package/src/compat/pages/{index.ts → router.ts} +130 -135
- package/src/compat/ppr/io.ts +12 -12
- package/src/compat/ppr/missing-root-params.ts +34 -38
- package/src/compat/ppr/root-params-scan.ts +66 -66
- package/src/compat/ppr/root-params-transform.ts +24 -26
- package/src/compat/ppr/root-params.ts +30 -30
- package/src/compat/ppr/segment-config-incompat.ts +6 -7
- package/src/compat/protocol.ts +71 -70
- package/src/compat/react/action-state.ts +47 -48
- package/src/compat/react/client-lite.ts +15 -15
- package/src/compat/react/client.ts +4 -4
- package/src/compat/react/compiler-runtime.ts +11 -11
- package/src/compat/react/dom-client.ts +44 -44
- package/src/compat/react/dom-react-server.ts +10 -16
- package/src/compat/react/dom-server.ts +10 -10
- package/src/compat/react/dom.ts +52 -52
- package/src/compat/react/hooks-extra.ts +34 -35
- package/src/compat/react/parity.ts +64 -61
- package/src/compat/react/preact.ts +81 -82
- package/src/compat/react/react-server.ts +28 -28
- package/src/compat/react/router-shim.ts +1 -1
- package/src/compat/react/server-component-use.ts +8 -8
- package/src/compat/react/server-inserted-html.ts +30 -31
- package/src/compat/react/server.ts +53 -55
- package/src/compat/react/use.ts +32 -32
- package/src/compat/react/view-transition.ts +20 -20
- package/src/compat/register/actions.ts +35 -824
- package/src/compat/register/boot.ts +41 -41
- package/src/compat/register/build-tier.ts +5 -5
- package/src/compat/register/build.ts +74 -70
- package/src/compat/register/bundler.ts +161 -156
- package/src/compat/register/cache.ts +20 -20
- package/src/compat/register/client-errors.ts +3 -3
- package/src/compat/register/config.ts +6 -6
- package/src/compat/register/css-extras.ts +30 -34
- package/src/compat/register/edge-runtime.ts +3 -3
- package/src/compat/register/errors.ts +10 -12
- package/src/compat/register/export.ts +16 -16
- package/src/compat/register/font.ts +11 -11
- package/src/compat/register/hooks.ts +2 -2
- package/src/compat/register/image.ts +40 -40
- package/src/compat/register/index.ts +59 -62
- package/src/compat/register/instrumentation-client.ts +10 -10
- package/src/compat/register/lifecycle.ts +25 -28
- package/src/compat/register/mdx.ts +10 -10
- package/src/compat/register/middleware.ts +226 -16
- package/src/compat/register/otel.ts +80 -88
- package/src/compat/register/pages-api.ts +10 -463
- package/src/compat/register/ppr.ts +16 -16
- package/src/compat/register/protocol.ts +17 -18
- package/src/compat/register/proxy.ts +49 -51
- package/src/compat/register/render.ts +79 -76
- package/src/compat/register/routing.ts +162 -159
- package/src/compat/register/segment.ts +24 -1897
- package/src/compat/register/static-image.ts +3 -3
- package/src/compat/register/{misc.ts → taint.ts} +9 -9
- package/src/compat/register/typed-routes.ts +14 -14
- package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
- package/src/compat/register/validation.ts +18 -18
- package/src/compat/segment/loading-boundary.ts +43 -45
- package/src/compat/segment/page-slot.ts +69 -69
- package/src/compat/segment/serve.ts +1884 -0
- package/src/compat/segment/tree.ts +113 -112
- package/src/compat/segment/vary-key.ts +38 -38
- package/src/compat/segment/vary-params.ts +138 -142
- package/src/compat/static-params.ts +14 -12
- package/src/compat/tsconfig-defaults.ts +87 -91
- package/src/compat/typecheck/{index.ts → check.ts} +234 -212
- package/src/compat/typecheck/worker.ts +15 -12
- package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
- package/src/compat/typed-routes/manifest.ts +174 -170
- package/src/compat/typed-routes/typegen.ts +127 -110
- package/src/compat/validation/errors.ts +16 -19
- package/src/compat/validation/prerender-diagnostics.ts +521 -504
- package/src/compat/validation/{index.ts → validate.ts} +647 -648
- package/src/compat-bootstrap.ts +16 -16
- package/src/config.ts +86 -69
- package/src/css/build.ts +230 -227
- package/src/css/postcss.ts +79 -80
- package/src/css/worker.ts +14 -15
- package/src/dev/client-actions.ts +10 -10
- package/src/dev/client-chunk-store.ts +27 -27
- package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
- package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
- package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
- package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
- package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
- package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
- package/src/dev/server.ts +804 -820
- package/src/env.ts +46 -43
- package/src/extensions.ts +491 -478
- package/src/index.ts +8 -8
- package/src/internal.ts +20 -23
- package/src/{islands → render}/boundary-error.ts +3 -3
- package/src/render/hooks.ts +71 -71
- package/src/render/island-context.ts +14 -14
- package/src/render/metadata.ts +310 -310
- package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
- package/src/{ppr.ts → render/ppr.ts} +244 -245
- package/src/render/renderer.ts +2087 -2082
- package/src/render/resource-hints.ts +16 -17
- package/src/render/slots.tsx +224 -235
- package/src/{islands → render}/static-children.ts +9 -12
- package/src/{islands → render}/static-slots.ts +37 -37
- package/src/{cache/context.ts → request/cache.ts} +20 -20
- package/src/request/context.ts +107 -107
- package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
- package/src/resolve/engine.ts +90 -77
- package/src/resolve/imports.ts +475 -463
- package/src/resolve/scan-facts.ts +318 -296
- package/src/resolve/source-text.ts +37 -37
- package/src/{dynamic → resolve}/tree-shake.ts +132 -128
- package/src/routing/forwarded.ts +19 -19
- package/src/routing/handler.ts +84 -91
- package/src/routing/href.ts +87 -70
- package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
- package/src/{proxy.ts → routing/proxy.ts} +306 -312
- package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
- package/src/routing/routes.ts +827 -815
- package/src/routing/slots.ts +164 -160
- package/src/runtime/loader.ts +954 -0
- package/src/{dev → runtime}/module-cache.ts +309 -287
- package/src/{dev → runtime}/module-generations.ts +9 -9
- package/src/{dev → runtime}/module-transform.ts +81 -72
- package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
- package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
- package/src/runtime/vendor.ts +428 -406
- package/src/styles.d.ts +9 -0
- package/src/types.ts +324 -335
- package/src/utils/ansi.ts +5 -5
- package/src/utils/{source.ts → code.ts} +15 -12
- package/src/utils/content-type.ts +3 -3
- package/src/utils/decode.ts +2 -2
- package/src/utils/dev-profile.ts +13 -13
- package/src/utils/error-log.ts +6 -6
- package/src/utils/esbuild.ts +18 -18
- package/src/utils/fs-cache.ts +13 -13
- package/src/utils/fs.ts +57 -49
- package/src/utils/html.ts +20 -24
- package/src/utils/native-require.ts +8 -8
- package/src/utils/serialize.ts +139 -146
- package/src/utils/verbose.ts +18 -18
- package/reference/overview.md +0 -35
- package/src/cli/analyze-print.ts +0 -181
- package/src/compat/middleware/manifest.ts +0 -210
- package/src/compat/next/image-client.tsx +0 -215
- package/src/compat/next/link-usage.ts +0 -29
- package/src/css/index.ts +0 -2
- package/src/render/index.ts +0 -1
- package/src/style-modules.d.ts +0 -9
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { useEffect, useState } from 'preact/hooks'
|
|
2
|
-
import { ReadonlyURLSearchParams, type HrefOptions } from './navigation'
|
|
3
|
-
import { blockJavascriptUrl, prefetchRoute, softNavigate } from '
|
|
4
|
-
import { seedHistoryEntry } from '
|
|
1
|
+
import { useEffect, useState } from 'preact/hooks'
|
|
2
|
+
import { ReadonlyURLSearchParams, type HrefOptions } from './navigation'
|
|
3
|
+
import { blockJavascriptUrl, prefetchRoute, softNavigate } from '../client/router'
|
|
4
|
+
import { seedHistoryEntry } from '../client/router/history'
|
|
5
5
|
import {
|
|
6
6
|
emitLocationChange,
|
|
7
7
|
locationListeners,
|
|
8
8
|
scheduleNavigationScroll,
|
|
9
|
-
} from '
|
|
10
|
-
import { routeHref } from '../routing/href'
|
|
11
|
-
import type { RouteParams, RouteParamValue, RoutePath } from '../types'
|
|
9
|
+
} from '../client/router/events'
|
|
10
|
+
import { routeHref } from '../routing/href'
|
|
11
|
+
import type { RouteParams, RouteParamValue, RoutePath } from '../types'
|
|
12
12
|
|
|
13
13
|
export type NavigateOptions<Route extends RoutePath> = HrefOptions<Route> & {
|
|
14
|
-
scroll?: boolean
|
|
15
|
-
}
|
|
14
|
+
scroll?: boolean
|
|
15
|
+
}
|
|
16
16
|
|
|
17
17
|
export type PrefetchOptions<Route extends RoutePath> = HrefOptions<Route> & {
|
|
18
|
-
kind?: 'auto' | 'full'
|
|
19
|
-
onInvalidate?: () => void
|
|
20
|
-
}
|
|
18
|
+
kind?: 'auto' | 'full'
|
|
19
|
+
onInvalidate?: () => void
|
|
20
|
+
}
|
|
21
21
|
|
|
22
22
|
export interface PNextRouter {
|
|
23
23
|
push<Route extends RoutePath>(
|
|
@@ -25,42 +25,42 @@ export interface PNextRouter {
|
|
|
25
25
|
...options: RouteParams<Route> extends Record<string, never>
|
|
26
26
|
? [options?: NavigateOptions<Route>]
|
|
27
27
|
: [options: NavigateOptions<Route>]
|
|
28
|
-
): void
|
|
28
|
+
): void
|
|
29
29
|
replace<Route extends RoutePath>(
|
|
30
30
|
route: Route,
|
|
31
31
|
...options: RouteParams<Route> extends Record<string, never>
|
|
32
32
|
? [options?: NavigateOptions<Route>]
|
|
33
33
|
: [options: NavigateOptions<Route>]
|
|
34
|
-
): void
|
|
34
|
+
): void
|
|
35
35
|
prefetch<Route extends RoutePath>(
|
|
36
36
|
route: Route,
|
|
37
37
|
...options: RouteParams<Route> extends Record<string, never>
|
|
38
38
|
? [options?: PrefetchOptions<Route>]
|
|
39
39
|
: [options: PrefetchOptions<Route>]
|
|
40
|
-
): void
|
|
41
|
-
refresh(): void
|
|
42
|
-
back(): void
|
|
43
|
-
forward(): void
|
|
44
|
-
bfcacheId: string
|
|
40
|
+
): void
|
|
41
|
+
refresh(): void
|
|
42
|
+
back(): void
|
|
43
|
+
forward(): void
|
|
44
|
+
bfcacheId: string
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
export { ReadonlyURLSearchParams }
|
|
47
|
+
export { ReadonlyURLSearchParams }
|
|
48
48
|
|
|
49
49
|
export interface CurrentRoute<Route extends RoutePath = RoutePath> {
|
|
50
|
-
route: Route | null
|
|
51
|
-
pathname: string
|
|
52
|
-
params: RouteParams<Route
|
|
53
|
-
searchParams: ReadonlyURLSearchParams
|
|
50
|
+
route: Route | null
|
|
51
|
+
pathname: string
|
|
52
|
+
params: RouteParams<Route>
|
|
53
|
+
searchParams: ReadonlyURLSearchParams
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
interface RouteState {
|
|
57
|
-
route?: string
|
|
58
|
-
params?: Record<string, RouteParamValue
|
|
59
|
-
catchAllOptional?: boolean
|
|
60
|
-
staticChildren?: string[]
|
|
61
|
-
bfcacheId?: string
|
|
57
|
+
route?: string
|
|
58
|
+
params?: Record<string, RouteParamValue>
|
|
59
|
+
catchAllOptional?: boolean
|
|
60
|
+
staticChildren?: string[]
|
|
61
|
+
bfcacheId?: string
|
|
62
62
|
/** `prefetch = 'allow-runtime'`: this route's shell is request-sampled. */
|
|
63
|
-
runtimePrefetch?: boolean
|
|
63
|
+
runtimePrefetch?: boolean
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
/**
|
|
@@ -70,17 +70,17 @@ interface RouteState {
|
|
|
70
70
|
* pattern (`/[teamSlug]/[...slug]`), so convert back at the API boundary.
|
|
71
71
|
*/
|
|
72
72
|
function bracketRoutePattern(state: RouteState): string | null {
|
|
73
|
-
const route = state.route
|
|
74
|
-
if (route == null) return null
|
|
73
|
+
const route = state.route
|
|
74
|
+
if (route == null) return null
|
|
75
75
|
return route
|
|
76
76
|
.replace(/:([\w$]+)\*/g, state.catchAllOptional ? '[[...$1]]' : '[...$1]')
|
|
77
|
-
.replace(/:([\w$]+)/g, '[$1]')
|
|
77
|
+
.replace(/:([\w$]+)/g, '[$1]')
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
declare global {
|
|
81
81
|
interface Window {
|
|
82
|
-
__PNEXT_ROUTE__?: RouteState
|
|
83
|
-
__PNEXT_HISTORY_PATCHED__?: boolean
|
|
82
|
+
__PNEXT_ROUTE__?: RouteState
|
|
83
|
+
__PNEXT_HISTORY_PATCHED__?: boolean
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
@@ -88,104 +88,110 @@ declare global {
|
|
|
88
88
|
// `bfcacheId` below reads them, and `patchHistory` carries them onto an app-level pushState. Seeding
|
|
89
89
|
// here rather than in the hub's installRouter keeps a page whose client graph never touches router
|
|
90
90
|
// state from paying for them.
|
|
91
|
-
seedHistoryEntry()
|
|
91
|
+
seedHistoryEntry()
|
|
92
92
|
|
|
93
93
|
export function useRouter(): PNextRouter {
|
|
94
|
-
return router
|
|
94
|
+
return router
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
const router: PNextRouter = {
|
|
98
98
|
push(route, ...[options]) {
|
|
99
|
-
navigate(routerHref(route, options), 'push', options?.scroll)
|
|
99
|
+
navigate(routerHref(route, options), 'push', options?.scroll)
|
|
100
100
|
},
|
|
101
101
|
replace(route, ...[options]) {
|
|
102
|
-
navigate(routerHref(route, options), 'replace', options?.scroll)
|
|
102
|
+
navigate(routerHref(route, options), 'replace', options?.scroll)
|
|
103
103
|
},
|
|
104
104
|
prefetch(route, ...[options]) {
|
|
105
105
|
void prefetchRoute(routerHref(route, options), {
|
|
106
106
|
strict: true,
|
|
107
107
|
full: options?.kind === 'full',
|
|
108
108
|
onInvalidate: options?.onInvalidate,
|
|
109
|
-
})
|
|
109
|
+
})
|
|
110
110
|
},
|
|
111
111
|
refresh() {
|
|
112
|
-
void softNavigate(window.location.href, { replace: true, scroll: false })
|
|
112
|
+
void softNavigate(window.location.href, { replace: true, scroll: false })
|
|
113
113
|
},
|
|
114
114
|
back() {
|
|
115
|
-
window.history.back()
|
|
115
|
+
window.history.back()
|
|
116
116
|
},
|
|
117
117
|
forward() {
|
|
118
|
-
window.history.forward()
|
|
118
|
+
window.history.forward()
|
|
119
119
|
},
|
|
120
120
|
get bfcacheId() {
|
|
121
|
-
return routeState().bfcacheId ?? ''
|
|
121
|
+
return routeState().bfcacheId ?? ''
|
|
122
122
|
},
|
|
123
|
-
}
|
|
123
|
+
}
|
|
124
124
|
|
|
125
|
-
function routerHref<Route extends RoutePath>(
|
|
126
|
-
|
|
125
|
+
function routerHref<Route extends RoutePath>(
|
|
126
|
+
route: Route,
|
|
127
|
+
options: HrefOptions<Route> | undefined,
|
|
128
|
+
) {
|
|
129
|
+
return hasHrefParts(options) ? routeHref(route, options) : String(route)
|
|
127
130
|
}
|
|
128
131
|
|
|
129
132
|
function hasHrefParts<Route extends RoutePath>(
|
|
130
133
|
options: HrefOptions<Route> | undefined,
|
|
131
134
|
): options is HrefOptions<Route> {
|
|
132
|
-
return Boolean(options && ('params' in options || 'search' in options || 'hash' in options))
|
|
135
|
+
return Boolean(options && ('params' in options || 'search' in options || 'hash' in options))
|
|
133
136
|
}
|
|
134
137
|
|
|
135
138
|
export function usePathname() {
|
|
136
|
-
return useLocation().pathname
|
|
139
|
+
return useLocation().pathname
|
|
137
140
|
}
|
|
138
141
|
|
|
139
142
|
export function useSearchParams(): ReadonlyURLSearchParams {
|
|
140
|
-
return new ReadonlyURLSearchParams(useLocation().search)
|
|
143
|
+
return new ReadonlyURLSearchParams(useLocation().search)
|
|
141
144
|
}
|
|
142
145
|
|
|
143
146
|
export function useParams<Route extends RoutePath = RoutePath>() {
|
|
144
|
-
useLocation()
|
|
145
|
-
return (routeState().params ?? {}) as RouteParams<Route
|
|
147
|
+
useLocation()
|
|
148
|
+
return (routeState().params ?? {}) as RouteParams<Route>
|
|
146
149
|
}
|
|
147
150
|
|
|
148
151
|
export function useRoute<Route extends RoutePath = RoutePath>(): CurrentRoute<Route> {
|
|
149
|
-
const location = useLocation()
|
|
152
|
+
const location = useLocation()
|
|
150
153
|
return {
|
|
151
154
|
route: bracketRoutePattern(routeState()) as Route | null,
|
|
152
155
|
pathname: location.pathname,
|
|
153
156
|
params: (routeState().params ?? {}) as RouteParams<Route>,
|
|
154
157
|
searchParams: new ReadonlyURLSearchParams(location.search),
|
|
155
|
-
}
|
|
158
|
+
}
|
|
156
159
|
}
|
|
157
160
|
|
|
158
161
|
export function useLinkStatus() {
|
|
159
|
-
return { pending: false }
|
|
162
|
+
return { pending: false }
|
|
160
163
|
}
|
|
161
164
|
|
|
162
165
|
function useLocation() {
|
|
163
|
-
|
|
166
|
+
// Read the URL live each render so any render pairs the address bar with its params;
|
|
167
|
+
// state is only the re-render trigger (unchanged-URL broadcasts bail out).
|
|
168
|
+
const location = currentLocation()
|
|
169
|
+
const [, setLocationKey] = useState(() => locationSignature(location))
|
|
164
170
|
|
|
165
171
|
useEffect(() => {
|
|
166
|
-
patchHistory()
|
|
172
|
+
patchHistory()
|
|
167
173
|
const listener = () =>
|
|
168
|
-
|
|
169
|
-
const next = currentLocation()
|
|
170
|
-
return previous
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
: next;
|
|
175
|
-
});
|
|
176
|
-
locationListeners().add(listener);
|
|
177
|
-
window.addEventListener('popstate', listener);
|
|
174
|
+
setLocationKey(previous => {
|
|
175
|
+
const next = locationSignature(currentLocation())
|
|
176
|
+
return previous === next ? previous : next
|
|
177
|
+
})
|
|
178
|
+
locationListeners().add(listener)
|
|
179
|
+
window.addEventListener('popstate', listener)
|
|
178
180
|
// Re-read once the listener is attached: the URL can move between the
|
|
179
181
|
// render that captured it and this effect (a history traversal landing
|
|
180
182
|
// while a swapped-in tree mounts), and nothing was listening for that one.
|
|
181
|
-
listener()
|
|
183
|
+
listener()
|
|
182
184
|
return () => {
|
|
183
|
-
locationListeners().delete(listener)
|
|
184
|
-
window.removeEventListener('popstate', listener)
|
|
185
|
-
}
|
|
186
|
-
}, [])
|
|
185
|
+
locationListeners().delete(listener)
|
|
186
|
+
window.removeEventListener('popstate', listener)
|
|
187
|
+
}
|
|
188
|
+
}, [])
|
|
187
189
|
|
|
188
|
-
return location
|
|
190
|
+
return location
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function locationSignature(location: { pathname: string; search: string; hash: string }) {
|
|
194
|
+
return `${location.pathname}${location.search}${location.hash}`
|
|
189
195
|
}
|
|
190
196
|
|
|
191
197
|
function currentLocation() {
|
|
@@ -194,56 +200,57 @@ function currentLocation() {
|
|
|
194
200
|
pathname: '/',
|
|
195
201
|
search: '',
|
|
196
202
|
hash: '',
|
|
197
|
-
}
|
|
203
|
+
}
|
|
198
204
|
}
|
|
199
205
|
return {
|
|
200
206
|
pathname: window.location.pathname,
|
|
201
207
|
search: window.location.search,
|
|
202
208
|
hash: window.location.hash,
|
|
203
|
-
}
|
|
209
|
+
}
|
|
204
210
|
}
|
|
205
211
|
|
|
206
212
|
function routeState() {
|
|
207
|
-
if (!process.browser && typeof window === 'undefined') return {}
|
|
208
|
-
const state = (history.state as Record<string, unknown> | null) ?? {}
|
|
209
|
-
const routeState = window.__PNEXT_ROUTE__ ?? {}
|
|
210
|
-
const bfcacheId = typeof state.__pnextBfcacheId === 'string' ? state.__pnextBfcacheId : undefined
|
|
211
|
-
return bfcacheId ? ({ ...routeState, bfcacheId } as RouteState) : routeState
|
|
213
|
+
if (!process.browser && typeof window === 'undefined') return {}
|
|
214
|
+
const state = (history.state as Record<string, unknown> | null) ?? {}
|
|
215
|
+
const routeState = window.__PNEXT_ROUTE__ ?? {}
|
|
216
|
+
const bfcacheId = typeof state.__pnextBfcacheId === 'string' ? state.__pnextBfcacheId : undefined
|
|
217
|
+
return bfcacheId ? ({ ...routeState, bfcacheId } as RouteState) : routeState
|
|
212
218
|
}
|
|
213
219
|
|
|
214
220
|
function navigate(url: string, mode: 'push' | 'replace', scroll = true) {
|
|
215
|
-
if (blockJavascriptUrl(url)) return
|
|
216
|
-
const next = new URL(url, window.location.href)
|
|
221
|
+
if (blockJavascriptUrl(url)) return
|
|
222
|
+
const next = new URL(url, window.location.href)
|
|
217
223
|
if (next.origin !== window.location.origin) {
|
|
218
|
-
const holder = globalThis as { __pnextMpaNavigation?: number }
|
|
219
|
-
holder.__pnextMpaNavigation = (holder.__pnextMpaNavigation ?? 0) + 1
|
|
224
|
+
const holder = globalThis as { __pnextMpaNavigation?: number }
|
|
225
|
+
holder.__pnextMpaNavigation = (holder.__pnextMpaNavigation ?? 0) + 1
|
|
220
226
|
requestAnimationFrame(() =>
|
|
221
227
|
requestAnimationFrame(() => {
|
|
222
|
-
if (mode === 'replace') window.location.replace(next.href)
|
|
223
|
-
else window.location.assign(next.href)
|
|
228
|
+
if (mode === 'replace') window.location.replace(next.href)
|
|
229
|
+
else window.location.assign(next.href)
|
|
224
230
|
}),
|
|
225
|
-
)
|
|
226
|
-
return
|
|
231
|
+
)
|
|
232
|
+
return
|
|
227
233
|
}
|
|
228
234
|
|
|
229
235
|
if (next.pathname !== window.location.pathname || next.search !== window.location.search) {
|
|
230
|
-
void softNavigate(next.href, { replace: mode === 'replace', scroll })
|
|
231
|
-
return
|
|
236
|
+
void softNavigate(next.href, { replace: mode === 'replace', scroll })
|
|
237
|
+
return
|
|
232
238
|
}
|
|
233
239
|
|
|
234
|
-
if (mode === 'replace') window.history.replaceState(history.state, '', next)
|
|
235
|
-
else window.history.pushState(history.state, '', next)
|
|
236
|
-
scheduleNavigationScroll(next, { scroll })
|
|
240
|
+
if (mode === 'replace') window.history.replaceState(history.state, '', next)
|
|
241
|
+
else window.history.pushState(history.state, '', next)
|
|
242
|
+
scheduleNavigationScroll(next, { scroll })
|
|
237
243
|
}
|
|
238
244
|
|
|
239
245
|
// Exported so compat's link-status can guarantee raw history.pushState /
|
|
240
246
|
// replaceState calls broadcast a location change (ending a link's pending
|
|
241
247
|
// state) even when no useLocation-based hook has mounted yet.
|
|
242
248
|
export function patchHistory() {
|
|
243
|
-
if ((!process.browser && typeof window === 'undefined') || window.__PNEXT_HISTORY_PATCHED__)
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
const
|
|
249
|
+
if ((!process.browser && typeof window === 'undefined') || window.__PNEXT_HISTORY_PATCHED__)
|
|
250
|
+
return
|
|
251
|
+
window.__PNEXT_HISTORY_PATCHED__ = true
|
|
252
|
+
const pushState = window.history.pushState.bind(window.history)
|
|
253
|
+
const replaceState = window.history.replaceState.bind(window.history)
|
|
247
254
|
|
|
248
255
|
// Broadcast only when the URL actually changes. The router itself calls replaceState with the
|
|
249
256
|
// CURRENT href for bookkeeping - including at the start of every soft navigation - and emitting for
|
|
@@ -254,26 +261,26 @@ export function patchHistory() {
|
|
|
254
261
|
// document, so a later traversal is a location broadcast rather than a fetch-and-swap of a URL that
|
|
255
262
|
// may not even exist on the server. Router-initiated calls already carry the keys.
|
|
256
263
|
function copyInternalState(data: unknown): unknown {
|
|
257
|
-
const current = (window.history.state as Record<string, unknown> | null) ?? {}
|
|
258
|
-
const carried: Record<string, unknown> = {}
|
|
264
|
+
const current = (window.history.state as Record<string, unknown> | null) ?? {}
|
|
265
|
+
const carried: Record<string, unknown> = {}
|
|
259
266
|
for (const key of Object.keys(current)) {
|
|
260
|
-
if (key.startsWith('__pnext')) carried[key] = current[key]
|
|
267
|
+
if (key.startsWith('__pnext')) carried[key] = current[key]
|
|
261
268
|
}
|
|
262
|
-
if (Object.keys(carried).length === 0) return data
|
|
263
|
-
const own = (data as Record<string, unknown> | null) ?? {}
|
|
264
|
-
if (Object.keys(own).some(key => key.startsWith('__pnext'))) return data
|
|
265
|
-
return { ...own, ...carried }
|
|
269
|
+
if (Object.keys(carried).length === 0) return data
|
|
270
|
+
const own = (data as Record<string, unknown> | null) ?? {}
|
|
271
|
+
if (Object.keys(own).some(key => key.startsWith('__pnext'))) return data
|
|
272
|
+
return { ...own, ...carried }
|
|
266
273
|
}
|
|
267
274
|
window.history.pushState = function patchedPushState(data, unused, url) {
|
|
268
|
-
const before = window.location.href
|
|
269
|
-
const result = pushState(copyInternalState(data), unused, url)
|
|
270
|
-
if (window.location.href !== before) emitLocationChange()
|
|
271
|
-
return result
|
|
272
|
-
}
|
|
275
|
+
const before = window.location.href
|
|
276
|
+
const result = pushState(copyInternalState(data), unused, url)
|
|
277
|
+
if (window.location.href !== before) emitLocationChange()
|
|
278
|
+
return result
|
|
279
|
+
}
|
|
273
280
|
window.history.replaceState = function patchedReplaceState(data, unused, url) {
|
|
274
|
-
const before = window.location.href
|
|
275
|
-
const result = replaceState(copyInternalState(data), unused, url)
|
|
276
|
-
if (window.location.href !== before) emitLocationChange()
|
|
277
|
-
return result
|
|
278
|
-
}
|
|
281
|
+
const before = window.location.href
|
|
282
|
+
const result = replaceState(copyInternalState(data), unused, url)
|
|
283
|
+
if (window.location.href !== before) emitLocationChange()
|
|
284
|
+
return result
|
|
285
|
+
}
|
|
279
286
|
}
|
package/src/api/dynamic.tsx
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { h, type ComponentType } from 'preact'
|
|
2
|
-
import { useEffect, useRef, useState } from 'preact/hooks'
|
|
1
|
+
import { h, type ComponentType } from 'preact'
|
|
2
|
+
import { useEffect, useRef, useState } from 'preact/hooks'
|
|
3
3
|
|
|
4
|
-
export type DynamicModule<Props> = ComponentType<Props> | { default: ComponentType<Props> }
|
|
5
|
-
export type DynamicLoader<Props> = string | (() => Promise<DynamicModule<Props>>)
|
|
6
|
-
export const dynamicReferenceSymbol = Symbol.for('pnext.dynamic')
|
|
4
|
+
export type DynamicModule<Props> = ComponentType<Props> | { default: ComponentType<Props> }
|
|
5
|
+
export type DynamicLoader<Props> = string | (() => Promise<DynamicModule<Props>>)
|
|
6
|
+
export const dynamicReferenceSymbol = Symbol.for('pnext.dynamic')
|
|
7
7
|
|
|
8
8
|
export interface DynamicTarget {
|
|
9
|
-
file: string
|
|
10
|
-
exportName: string
|
|
9
|
+
file: string
|
|
10
|
+
exportName: string
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export interface DynamicReference<Props extends object = object> {
|
|
14
|
-
load: () => Promise<ComponentType<Props
|
|
15
|
-
target?: DynamicTarget
|
|
14
|
+
load: () => Promise<ComponentType<Props>>
|
|
15
|
+
target?: DynamicTarget
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export interface DynamicOptions<Props> {
|
|
19
|
-
loading?: ComponentType<Props
|
|
20
|
-
load?: 'render' | 'visible'
|
|
21
|
-
rootMargin?: string
|
|
22
|
-
ssr?: boolean
|
|
23
|
-
threshold?: number | number[]
|
|
19
|
+
loading?: ComponentType<Props>
|
|
20
|
+
load?: 'render' | 'visible'
|
|
21
|
+
rootMargin?: string
|
|
22
|
+
ssr?: boolean
|
|
23
|
+
threshold?: number | number[]
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
export function dynamic<Props extends object = object>(
|
|
@@ -30,73 +30,76 @@ export function dynamic<Props extends object = object>(
|
|
|
30
30
|
// never passes this.
|
|
31
31
|
target?: DynamicTarget,
|
|
32
32
|
) {
|
|
33
|
-
let loaded: ComponentType<Props> | null = null
|
|
34
|
-
let pending: Promise<ComponentType<Props>> | null = null
|
|
35
|
-
const loadModule =
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
let loaded: ComponentType<Props> | null = null
|
|
34
|
+
let pending: Promise<ComponentType<Props>> | null = null
|
|
35
|
+
const loadModule =
|
|
36
|
+
typeof loader === 'string'
|
|
37
|
+
? () => {
|
|
38
|
+
throw new Error(`dynamic(${JSON.stringify(loader)}) was not compiled by PNext.`)
|
|
39
|
+
}
|
|
40
|
+
: loader
|
|
40
41
|
|
|
41
42
|
const load = () => {
|
|
42
43
|
pending ??= Promise.resolve(loadModule()).then(module => {
|
|
43
|
-
loaded = typeof module === 'function' ? module : module.default
|
|
44
|
-
return loaded
|
|
45
|
-
})
|
|
46
|
-
return pending
|
|
47
|
-
}
|
|
44
|
+
loaded = typeof module === 'function' ? module : module.default
|
|
45
|
+
return loaded
|
|
46
|
+
})
|
|
47
|
+
return pending
|
|
48
|
+
}
|
|
48
49
|
|
|
49
50
|
function DynamicComponent(props: Props) {
|
|
50
|
-
const [Component, setComponent] = useState<ComponentType<Props> | null>(() => loaded)
|
|
51
|
-
const [shouldLoad, setShouldLoad] = useState(() => options.load !== 'visible')
|
|
52
|
-
const visibleRef = useRef<HTMLDivElement>(null)
|
|
51
|
+
const [Component, setComponent] = useState<ComponentType<Props> | null>(() => loaded)
|
|
52
|
+
const [shouldLoad, setShouldLoad] = useState(() => options.load !== 'visible')
|
|
53
|
+
const visibleRef = useRef<HTMLDivElement>(null)
|
|
53
54
|
|
|
54
55
|
useEffect(() => {
|
|
55
|
-
if (Component || shouldLoad) return
|
|
56
|
-
const node = visibleRef.current
|
|
56
|
+
if (Component || shouldLoad) return
|
|
57
|
+
const node = visibleRef.current
|
|
57
58
|
if (!node || typeof IntersectionObserver === 'undefined') {
|
|
58
|
-
setShouldLoad(true)
|
|
59
|
-
return
|
|
59
|
+
setShouldLoad(true)
|
|
60
|
+
return
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
const observer = new IntersectionObserver(
|
|
63
64
|
entries => {
|
|
64
|
-
if (!entries.some(entry => entry.isIntersecting)) return
|
|
65
|
-
observer.disconnect()
|
|
66
|
-
setShouldLoad(true)
|
|
65
|
+
if (!entries.some(entry => entry.isIntersecting)) return
|
|
66
|
+
observer.disconnect()
|
|
67
|
+
setShouldLoad(true)
|
|
67
68
|
},
|
|
68
69
|
{
|
|
69
70
|
rootMargin: options.rootMargin,
|
|
70
71
|
threshold: options.threshold,
|
|
71
72
|
},
|
|
72
|
-
)
|
|
73
|
+
)
|
|
73
74
|
|
|
74
|
-
observer.observe(node)
|
|
75
|
-
return () => observer.disconnect()
|
|
76
|
-
}, [Component, shouldLoad])
|
|
75
|
+
observer.observe(node)
|
|
76
|
+
return () => observer.disconnect()
|
|
77
|
+
}, [Component, shouldLoad])
|
|
77
78
|
|
|
78
79
|
useEffect(() => {
|
|
79
|
-
if (Component || !shouldLoad) return
|
|
80
|
-
let cancelled = false
|
|
80
|
+
if (Component || !shouldLoad) return
|
|
81
|
+
let cancelled = false
|
|
81
82
|
void load().then(next => {
|
|
82
|
-
if (!cancelled) setComponent(() => next)
|
|
83
|
-
})
|
|
83
|
+
if (!cancelled) setComponent(() => next)
|
|
84
|
+
})
|
|
84
85
|
return () => {
|
|
85
|
-
cancelled = true
|
|
86
|
-
}
|
|
87
|
-
}, [Component, shouldLoad])
|
|
86
|
+
cancelled = true
|
|
87
|
+
}
|
|
88
|
+
}, [Component, shouldLoad])
|
|
88
89
|
|
|
89
|
-
if (Component) return h(Component, props)
|
|
90
|
-
const Loading = options.loading
|
|
90
|
+
if (Component) return h(Component, props)
|
|
91
|
+
const Loading = options.loading
|
|
91
92
|
if (options.load === 'visible') {
|
|
92
|
-
return h('div', { ref: visibleRef }, Loading ? h(Loading, props) : null)
|
|
93
|
+
return h('div', { ref: visibleRef }, Loading ? h(Loading, props) : null)
|
|
93
94
|
}
|
|
94
|
-
return Loading ? h(Loading, props) : null
|
|
95
|
+
return Loading ? h(Loading, props) : null
|
|
95
96
|
}
|
|
96
97
|
|
|
97
|
-
(
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
;(
|
|
99
|
+
DynamicComponent as typeof DynamicComponent & {
|
|
100
|
+
[dynamicReferenceSymbol]: DynamicReference<Props>
|
|
101
|
+
}
|
|
102
|
+
)[dynamicReferenceSymbol] = { load, target }
|
|
100
103
|
|
|
101
|
-
return DynamicComponent
|
|
104
|
+
return DynamicComponent
|
|
102
105
|
}
|