@wular/pnext 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- package/bin/pnext +1 -1
- package/config/lint/base.js +7 -7
- package/config/ts/base.json +2 -4
- package/config/ts/react.json +2 -6
- package/package.json +23 -2
- package/reference/compat.md +1 -1
- package/reference/config.md +2 -2
- package/reference/css.md +13 -9
- package/reference/dev.md +1 -1
- package/reference/metadata.md +7 -7
- package/reference/navigation.md +35 -28
- package/reference/performance.md +70 -70
- package/reference/rendering.md +17 -17
- package/reference/routing.md +17 -17
- package/reference/typegen.md +12 -8
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +113 -109
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +49 -52
- package/src/api/navigation.ts +59 -58
- package/src/api/server.ts +152 -144
- package/src/api/suspense.ts +4 -4
- package/src/cli/adapters/vercel-warm.ts +126 -121
- package/src/cli/adapters/vercel.ts +437 -443
- package/src/cli/analyze.ts +333 -144
- package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
- package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
- package/src/cli/build.ts +976 -978
- package/src/cli/create.ts +71 -63
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +88 -85
- package/src/cli/migrate/package-json.ts +73 -71
- package/src/cli/migrate/report.ts +32 -33
- package/src/cli/migrate/{index.ts → run.ts} +48 -49
- package/src/cli/migrate/scan.ts +46 -46
- package/src/cli/migrate/spinner.ts +9 -9
- package/src/cli/migrate/tsconfig.ts +35 -35
- package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
- package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
- package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
- package/src/cli/start.ts +65 -66
- package/src/{typegen.ts → cli/typegen.ts} +59 -59
- package/src/client/build.ts +794 -768
- package/src/client/chunk-fold.ts +245 -240
- package/src/client/{paths.ts → chunk-name.ts} +6 -6
- package/src/client/entry.ts +162 -147
- package/src/client/prebuilt.ts +231 -223
- package/src/client/profile.ts +29 -29
- package/src/client/react-compiler.ts +20 -15
- package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
- package/src/client/reference-stub.ts +51 -51
- package/src/client/reference.ts +19 -19
- package/src/{api → client}/router/events.ts +17 -17
- package/src/{api → client}/router/history.ts +16 -16
- package/src/{api → client}/router/hub.ts +52 -53
- package/src/{api/router.ts → client/router/index.ts} +61 -60
- package/src/{api → client}/router/policies.ts +24 -24
- package/src/{api → client}/router/runtime.ts +1988 -1992
- package/src/{api → client}/router/types.ts +93 -98
- package/src/compat/actions/client-plugin.ts +42 -43
- package/src/compat/actions/client-stub.ts +14 -14
- package/src/compat/actions/{action-client.ts → client.ts} +194 -193
- package/src/compat/actions/config.ts +63 -64
- package/src/compat/actions/detect.ts +68 -68
- package/src/compat/actions/discovery.ts +105 -105
- package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
- package/src/compat/actions/early-submit.ts +1 -1
- package/src/compat/actions/endpoint.ts +198 -198
- package/src/compat/actions/extensions.ts +811 -0
- package/src/compat/actions/flight.ts +23 -23
- package/src/compat/actions/form-state.ts +34 -34
- package/src/compat/actions/hoist.ts +382 -236
- package/src/compat/actions/ids.ts +7 -12
- package/src/compat/actions/index.ts +8 -8
- package/src/compat/actions/instances.ts +46 -46
- package/src/compat/actions/origin.ts +47 -48
- package/src/compat/actions/protocol.ts +22 -22
- package/src/compat/actions/registry.ts +19 -19
- package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
- package/src/compat/actions/rewrite.ts +125 -125
- package/src/compat/actions/{action-router.ts → router.ts} +10 -10
- package/src/compat/actions/serve.ts +132 -136
- package/src/compat/actions/server-tag.ts +4 -4
- package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
- package/src/compat/actions/unrecognized-error.ts +4 -4
- package/src/compat/{index.ts → aliases.ts} +112 -109
- package/src/compat/bundler/bun-externals.ts +18 -18
- package/src/compat/bundler/cjs-exports.ts +271 -223
- package/src/compat/bundler/config.ts +116 -111
- package/src/compat/bundler/externals.ts +12 -12
- package/src/compat/bundler/import-meta-url.ts +19 -19
- package/src/compat/bundler/modularize-imports.ts +36 -33
- package/src/compat/bundler/new-url-asset.ts +22 -24
- package/src/compat/bundler/optimize-package-imports.ts +111 -107
- package/src/compat/bundler/polyfill.ts +28 -28
- package/src/compat/bundler/react-compiler.ts +35 -29
- package/src/compat/bundler/react-profiler.tsx +11 -11
- package/src/compat/bundler/relay-transform.ts +48 -47
- package/src/compat/bundler/require-context.ts +119 -113
- package/src/compat/bundler/resolve-extensions.ts +19 -19
- package/src/compat/bundler/source-cache.ts +25 -25
- package/src/compat/bundler/static-imports.ts +7 -7
- package/src/compat/bundler/symlink-imports.ts +46 -46
- package/src/compat/bundler/tsconfig-paths.ts +13 -15
- package/src/compat/bundler/wasm.ts +58 -60
- package/src/compat/bundler/webpack-loaders.ts +254 -241
- package/src/compat/bundler/worker.ts +101 -104
- package/src/compat/cache/build-flags.ts +29 -29
- package/src/compat/cache/build-prerender-errors.ts +40 -44
- package/src/compat/cache/custom-handler.ts +60 -53
- package/src/compat/cache/fetch-patch.ts +240 -240
- package/src/compat/cache/handler.ts +27 -31
- package/src/compat/cache/modern-handler.ts +148 -126
- package/src/compat/cache/resume-data-cache.ts +47 -45
- package/src/compat/cache/revalidate.ts +233 -232
- package/src/compat/cache/runtime-error.ts +35 -35
- package/src/compat/cache/use-cache-transform.ts +442 -417
- package/src/compat/cache/use-cache.ts +650 -614
- package/src/compat/cache-control.ts +140 -142
- package/src/compat/client/base-path.ts +21 -20
- package/src/compat/client/css-order.ts +18 -18
- package/src/compat/client/errors/bare-boundary.ts +11 -11
- package/src/compat/client/errors/control-flow.ts +23 -23
- package/src/compat/client/errors/error-boundary.ts +61 -61
- package/src/compat/client/errors/global-error.ts +101 -91
- package/src/compat/client/errors/install.ts +71 -72
- package/src/compat/client/errors/lazy.ts +23 -23
- package/src/compat/client/errors/primitive-throw.ts +47 -45
- package/src/compat/client/errors/soft-refresh.ts +4 -4
- package/src/compat/client/link-status.ts +33 -33
- package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
- package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
- package/src/compat/client/navigation-scroll.ts +63 -63
- package/src/compat/client/optimistic-routing.ts +93 -88
- package/src/compat/client/prefetch-cache.ts +23 -24
- package/src/compat/client/route-announcer.ts +35 -35
- package/src/compat/client/segment-cache-policy.ts +20 -20
- package/src/compat/client/segment-cache.ts +309 -315
- package/src/compat/client/segment-prefetch.ts +127 -132
- package/src/compat/client/trailing-slash.ts +5 -4
- package/src/compat/css/chunking.ts +113 -116
- package/src/compat/css/inline-css.ts +21 -21
- package/src/compat/css/lightningcss.ts +37 -38
- package/src/compat/css/modules.ts +161 -175
- package/src/compat/css/nonce.ts +7 -7
- package/src/compat/css/sass-plugin.ts +18 -21
- package/src/compat/css/sass.ts +150 -152
- package/src/compat/css/styled-jsx-runtime.ts +27 -27
- package/src/compat/css/styled-jsx.ts +21 -21
- package/src/compat/edge-runtime.ts +27 -27
- package/src/compat/{adapter → export}/build-complete.ts +72 -75
- package/src/compat/export/client.ts +29 -31
- package/src/compat/export/{index.ts → emit.ts} +111 -110
- package/src/compat/export/standalone.ts +62 -54
- package/src/compat/image-optimizer/cache.ts +51 -49
- package/src/compat/image-optimizer/detect.ts +52 -52
- package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
- package/src/compat/image-optimizer/source.ts +77 -80
- package/src/compat/lifecycle/after-scope.ts +26 -26
- package/src/compat/lifecycle/after.ts +48 -45
- package/src/compat/lifecycle/error-funnel.ts +98 -102
- package/src/compat/lifecycle/error-serialize.ts +30 -26
- package/src/compat/lifecycle/error-ui.ts +67 -32
- package/src/compat/lifecycle/instrumentation-client.ts +36 -38
- package/src/compat/lifecycle/instrumentation.ts +85 -85
- package/src/compat/lifecycle/node-console.ts +11 -11
- package/src/compat/lifecycle/testmode.ts +160 -132
- package/src/compat/mdx/compile.ts +60 -57
- package/src/compat/mdx/plugin.ts +11 -11
- package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
- package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
- package/src/compat/metadata.ts +75 -81
- package/src/compat/next/cache.ts +68 -69
- package/src/compat/next/canonical-url.ts +9 -9
- package/src/compat/next/client-cache.ts +19 -19
- package/src/compat/next/client-navigation.ts +112 -116
- package/src/compat/next/client-only.ts +1 -1
- package/src/compat/next/client-script.tsx +99 -93
- package/src/compat/next/client-server.ts +10 -10
- package/src/compat/next/config-loader.ts +176 -173
- package/src/compat/next/config.ts +7 -7
- package/src/compat/next/constants.cjs +6 -6
- package/src/compat/next/constants.ts +6 -6
- package/src/compat/next/custom-server.ts +26 -24
- package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
- package/src/compat/next/dynamic.tsx +21 -18
- package/src/compat/next/error.tsx +52 -52
- package/src/compat/next/font/cache.ts +74 -74
- package/src/compat/next/font/google.ts +2 -2
- package/src/compat/next/font/index.ts +1 -1
- package/src/compat/next/font/local.ts +3 -3
- package/src/compat/next/font/runtime-client.ts +17 -15
- package/src/compat/next/font/runtime.ts +443 -408
- package/src/compat/next/font/shared.ts +120 -108
- package/src/compat/next/form.tsx +63 -63
- package/src/compat/next/head.tsx +2 -2
- package/src/compat/next/headers.ts +103 -95
- package/src/compat/next/image/client.tsx +220 -0
- package/src/compat/next/image/config.ts +56 -58
- package/src/compat/next/image/optimizer.ts +40 -36
- package/src/compat/next/image/patterns.ts +37 -40
- package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
- package/src/compat/next/image/shared.ts +65 -57
- package/src/compat/next/image/static-metadata.ts +98 -107
- package/src/compat/next/image/validate.ts +79 -88
- package/src/compat/next/image.tsx +19 -23
- package/src/compat/next/index.ts +1 -1
- package/src/compat/next/legacy-image.tsx +59 -60
- package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
- package/src/compat/next/link.tsx +158 -158
- package/src/compat/next/navigation.cjs +12 -3
- package/src/compat/next/navigation.ts +48 -50
- package/src/compat/next/offline.ts +27 -27
- package/src/compat/next/og.ts +121 -124
- package/src/compat/next/preferred-region.ts +13 -14
- package/src/compat/next/redirects.ts +58 -56
- package/src/compat/next/resource-hints.ts +73 -76
- package/src/compat/next/rewrites.ts +130 -133
- package/src/compat/next/root-params.ts +45 -45
- package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
- package/src/compat/next/router.cjs +4 -2
- package/src/compat/next/router.ts +58 -61
- package/src/compat/next/script.tsx +108 -108
- package/src/compat/next/server-only.ts +1 -1
- package/src/compat/next/server.ts +19 -19
- package/src/compat/next/svgr.ts +18 -17
- package/src/compat/next/telemetry.ts +24 -24
- package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
- package/src/compat/next/user-agent.ts +53 -49
- package/src/compat/next/web-vitals.ts +22 -24
- package/src/compat/otel/api.ts +41 -41
- package/src/compat/otel/client-trace-metadata.ts +25 -27
- package/src/compat/otel/fetch-span.ts +29 -29
- package/src/compat/otel/tracer.ts +331 -331
- package/src/compat/pages/api.ts +456 -0
- package/src/compat/pages/client-plugin.ts +36 -36
- package/src/compat/pages/router-state.ts +34 -34
- package/src/compat/pages/{index.ts → router.ts} +130 -135
- package/src/compat/ppr/io.ts +12 -12
- package/src/compat/ppr/missing-root-params.ts +34 -38
- package/src/compat/ppr/root-params-scan.ts +66 -66
- package/src/compat/ppr/root-params-transform.ts +24 -26
- package/src/compat/ppr/root-params.ts +30 -30
- package/src/compat/ppr/segment-config-incompat.ts +6 -7
- package/src/compat/protocol.ts +71 -70
- package/src/compat/react/action-state.ts +47 -48
- package/src/compat/react/client-lite.ts +15 -15
- package/src/compat/react/client.ts +4 -4
- package/src/compat/react/compiler-runtime.ts +11 -11
- package/src/compat/react/dom-client.ts +44 -44
- package/src/compat/react/dom-react-server.ts +10 -16
- package/src/compat/react/dom-server.ts +10 -10
- package/src/compat/react/dom.ts +52 -52
- package/src/compat/react/hooks-extra.ts +34 -35
- package/src/compat/react/parity.ts +64 -61
- package/src/compat/react/preact.ts +81 -82
- package/src/compat/react/react-server.ts +28 -28
- package/src/compat/react/router-shim.ts +1 -1
- package/src/compat/react/server-component-use.ts +8 -8
- package/src/compat/react/server-inserted-html.ts +30 -31
- package/src/compat/react/server.ts +53 -55
- package/src/compat/react/use.ts +32 -32
- package/src/compat/react/view-transition.ts +20 -20
- package/src/compat/register/actions.ts +35 -824
- package/src/compat/register/boot.ts +41 -41
- package/src/compat/register/build-tier.ts +5 -5
- package/src/compat/register/build.ts +74 -70
- package/src/compat/register/bundler.ts +161 -156
- package/src/compat/register/cache.ts +20 -20
- package/src/compat/register/client-errors.ts +3 -3
- package/src/compat/register/config.ts +6 -6
- package/src/compat/register/css-extras.ts +30 -34
- package/src/compat/register/edge-runtime.ts +3 -3
- package/src/compat/register/errors.ts +10 -12
- package/src/compat/register/export.ts +16 -16
- package/src/compat/register/font.ts +11 -11
- package/src/compat/register/hooks.ts +2 -2
- package/src/compat/register/image.ts +40 -40
- package/src/compat/register/index.ts +59 -62
- package/src/compat/register/instrumentation-client.ts +10 -10
- package/src/compat/register/lifecycle.ts +25 -28
- package/src/compat/register/mdx.ts +10 -10
- package/src/compat/register/middleware.ts +226 -16
- package/src/compat/register/otel.ts +80 -88
- package/src/compat/register/pages-api.ts +10 -463
- package/src/compat/register/ppr.ts +16 -16
- package/src/compat/register/protocol.ts +17 -18
- package/src/compat/register/proxy.ts +49 -51
- package/src/compat/register/render.ts +79 -76
- package/src/compat/register/routing.ts +162 -159
- package/src/compat/register/segment.ts +24 -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 +69 -69
- package/src/css/build.ts +230 -227
- package/src/css/postcss.ts +79 -80
- package/src/css/worker.ts +14 -15
- package/src/dev/client-actions.ts +10 -10
- package/src/dev/client-chunk-store.ts +27 -27
- package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
- package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
- package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
- package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
- package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
- package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
- package/src/dev/server.ts +804 -820
- package/src/env.ts +46 -43
- package/src/extensions.ts +491 -478
- package/src/index.ts +8 -8
- package/src/internal.ts +20 -23
- package/src/{islands → render}/boundary-error.ts +3 -3
- package/src/render/hooks.ts +71 -71
- package/src/render/island-context.ts +14 -14
- package/src/render/metadata.ts +310 -310
- package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
- package/src/{ppr.ts → render/ppr.ts} +244 -245
- package/src/render/renderer.ts +2076 -2082
- package/src/render/resource-hints.ts +16 -17
- package/src/render/slots.tsx +224 -235
- package/src/{islands → render}/static-children.ts +9 -12
- package/src/{islands → render}/static-slots.ts +37 -37
- package/src/{cache/context.ts → request/cache.ts} +20 -20
- package/src/request/context.ts +107 -107
- package/src/{dynamic/source.ts → resolve/dynamic.ts} +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 +69 -70
- package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
- package/src/{proxy.ts → routing/proxy.ts} +306 -312
- package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
- package/src/routing/routes.ts +827 -815
- package/src/routing/slots.ts +164 -160
- package/src/runtime/loader.ts +952 -0
- package/src/{dev → runtime}/module-cache.ts +309 -287
- package/src/{dev → runtime}/module-generations.ts +9 -9
- package/src/{dev → runtime}/module-transform.ts +81 -72
- package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
- package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
- package/src/runtime/vendor.ts +425 -404
- package/src/styles.d.ts +9 -0
- package/src/types.ts +320 -335
- package/src/utils/ansi.ts +5 -5
- package/src/utils/{source.ts → code.ts} +15 -12
- package/src/utils/content-type.ts +3 -3
- package/src/utils/decode.ts +2 -2
- package/src/utils/dev-profile.ts +13 -13
- package/src/utils/error-log.ts +6 -6
- package/src/utils/esbuild.ts +18 -18
- package/src/utils/fs-cache.ts +13 -13
- package/src/utils/fs.ts +57 -49
- package/src/utils/html.ts +20 -24
- package/src/utils/native-require.ts +8 -8
- package/src/utils/serialize.ts +139 -146
- package/src/utils/verbose.ts +18 -18
- package/src/cli/analyze-print.ts +0 -181
- package/src/compat/middleware/manifest.ts +0 -210
- package/src/compat/next/image-client.tsx +0 -215
- package/src/compat/next/link-usage.ts +0 -29
- package/src/css/index.ts +0 -2
- package/src/render/index.ts +0 -1
- package/src/style-modules.d.ts +0 -9
|
@@ -5,111 +5,111 @@
|
|
|
5
5
|
* browser bundles. Resource hints are no-ops here; they are only meaningful in the
|
|
6
6
|
* server response-finalization pipeline.
|
|
7
7
|
*/
|
|
8
|
-
import ReactCompat from 'preact/compat'
|
|
9
|
-
import { useActionState } from './preact'
|
|
8
|
+
import ReactCompat from 'preact/compat'
|
|
9
|
+
import { useActionState } from './preact'
|
|
10
10
|
|
|
11
11
|
const ReactDomCompat = Object.assign(ReactCompat, {
|
|
12
12
|
preload,
|
|
13
13
|
preconnect,
|
|
14
14
|
prefetchDNS,
|
|
15
15
|
preinit,
|
|
16
|
-
})
|
|
16
|
+
})
|
|
17
17
|
|
|
18
|
-
export default ReactDomCompat
|
|
18
|
+
export default ReactDomCompat
|
|
19
19
|
|
|
20
20
|
// The react-dom surface preact/compat provides (named, because preact/compat's
|
|
21
21
|
// types use `export =` which blocks `export *`).
|
|
22
|
-
export const render = ReactCompat.render
|
|
23
|
-
export const hydrate = ReactCompat.hydrate
|
|
24
|
-
export const createPortal = ReactCompat.createPortal
|
|
25
|
-
export const findDOMNode = ReactCompat.findDOMNode
|
|
26
|
-
export const flushSync = ReactCompat.flushSync
|
|
27
|
-
export const unmountComponentAtNode = ReactCompat.unmountComponentAtNode
|
|
28
|
-
export const unstable_batchedUpdates = ReactCompat.unstable_batchedUpdates
|
|
29
|
-
export const version = ReactCompat.version
|
|
22
|
+
export const render = ReactCompat.render
|
|
23
|
+
export const hydrate = ReactCompat.hydrate
|
|
24
|
+
export const createPortal = ReactCompat.createPortal
|
|
25
|
+
export const findDOMNode = ReactCompat.findDOMNode
|
|
26
|
+
export const flushSync = ReactCompat.flushSync
|
|
27
|
+
export const unmountComponentAtNode = ReactCompat.unmountComponentAtNode
|
|
28
|
+
export const unstable_batchedUpdates = ReactCompat.unstable_batchedUpdates
|
|
29
|
+
export const version = ReactCompat.version
|
|
30
30
|
|
|
31
31
|
function noOpRecordResourceHint() {
|
|
32
32
|
// intentionally empty: client bundles do not build response headers.
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
export function preload(_href: string, _options?: { as?: string; crossOrigin?: string }) {
|
|
36
|
-
noOpRecordResourceHint()
|
|
36
|
+
noOpRecordResourceHint()
|
|
37
37
|
// no-op on client; header collection happens in server response finalizers.
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
export function preconnect(_href: string, _options?: { crossOrigin?: string }) {
|
|
41
|
-
noOpRecordResourceHint()
|
|
41
|
+
noOpRecordResourceHint()
|
|
42
42
|
// no-op on client; header collection happens in server response finalizers.
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
export function prefetchDNS(_href: string) {
|
|
46
|
-
noOpRecordResourceHint()
|
|
46
|
+
noOpRecordResourceHint()
|
|
47
47
|
// no-op on client; header collection happens in server response finalizers.
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
export function preinit(_href: string, _options?: { as?: string; crossOrigin?: string }) {
|
|
51
|
-
noOpRecordResourceHint()
|
|
51
|
+
noOpRecordResourceHint()
|
|
52
52
|
// no-op on client; header collection happens in server response finalizers.
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
export const useFormState = useActionState
|
|
55
|
+
export const useFormState = useActionState
|
|
56
56
|
|
|
57
57
|
export interface FormStatusNotPending {
|
|
58
|
-
pending: false
|
|
59
|
-
data: null
|
|
60
|
-
method: null
|
|
61
|
-
action: null
|
|
58
|
+
pending: false
|
|
59
|
+
data: null
|
|
60
|
+
method: null
|
|
61
|
+
action: null
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
export interface FormStatusPending {
|
|
65
|
-
pending: true
|
|
66
|
-
data: FormData
|
|
67
|
-
method: string
|
|
68
|
-
action: string | ((formData: FormData) => void | Promise<void>)
|
|
65
|
+
pending: true
|
|
66
|
+
data: FormData
|
|
67
|
+
method: string
|
|
68
|
+
action: string | ((formData: FormData) => void | Promise<void>)
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
export type FormStatus = FormStatusPending | FormStatusNotPending
|
|
71
|
+
export type FormStatus = FormStatusPending | FormStatusNotPending
|
|
72
72
|
|
|
73
73
|
const NOT_PENDING: FormStatusNotPending = {
|
|
74
74
|
pending: false,
|
|
75
75
|
data: null,
|
|
76
76
|
method: null,
|
|
77
77
|
action: null,
|
|
78
|
-
}
|
|
78
|
+
}
|
|
79
79
|
|
|
80
80
|
// Form-status store, fed by the client entry's function-form-action runtime.
|
|
81
|
-
const pendingStack: FormStatusPending[] = []
|
|
82
|
-
const listeners = new Set<() => void>()
|
|
83
|
-
let storeVersion = 0
|
|
81
|
+
const pendingStack: FormStatusPending[] = []
|
|
82
|
+
const listeners = new Set<() => void>()
|
|
83
|
+
let storeVersion = 0
|
|
84
84
|
|
|
85
85
|
/** Called by the client runtime when a function form action starts/finishes. */
|
|
86
86
|
export function __pnextPushFormStatus(status: FormStatusPending): () => void {
|
|
87
|
-
pendingStack.push(status)
|
|
88
|
-
notify()
|
|
87
|
+
pendingStack.push(status)
|
|
88
|
+
notify()
|
|
89
89
|
return () => {
|
|
90
|
-
const index = pendingStack.indexOf(status)
|
|
91
|
-
if (index !== -1) pendingStack.splice(index, 1)
|
|
92
|
-
notify()
|
|
93
|
-
}
|
|
90
|
+
const index = pendingStack.indexOf(status)
|
|
91
|
+
if (index !== -1) pendingStack.splice(index, 1)
|
|
92
|
+
notify()
|
|
93
|
+
}
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
function notify() {
|
|
97
|
-
storeVersion += 1
|
|
98
|
-
for (const listener of [...listeners]) listener()
|
|
97
|
+
storeVersion += 1
|
|
98
|
+
for (const listener of [...listeners]) listener()
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
function subscribe(listener: () => void) {
|
|
102
|
-
listeners.add(listener)
|
|
102
|
+
listeners.add(listener)
|
|
103
103
|
return () => {
|
|
104
|
-
listeners.delete(listener)
|
|
105
|
-
}
|
|
104
|
+
listeners.delete(listener)
|
|
105
|
+
}
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
export function useFormStatus(): FormStatus {
|
|
109
|
-
ReactCompat.useSyncExternalStore(subscribe, () => storeVersion)
|
|
110
|
-
return pendingStack.length > 0 ? pendingStack[pendingStack.length - 1]! : NOT_PENDING
|
|
109
|
+
ReactCompat.useSyncExternalStore(subscribe, () => storeVersion)
|
|
110
|
+
return pendingStack.length > 0 ? pendingStack[pendingStack.length - 1]! : NOT_PENDING
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
export function requestFormReset(form: HTMLFormElement) {
|
|
114
|
-
if (form && typeof form.reset === 'function') form.reset()
|
|
114
|
+
if (form && typeof form.reset === 'function') form.reset()
|
|
115
115
|
}
|
|
@@ -1,20 +1,14 @@
|
|
|
1
|
-
import ReactDomCompat, {
|
|
2
|
-
preconnect,
|
|
3
|
-
prefetchDNS,
|
|
4
|
-
preinit,
|
|
5
|
-
preload,
|
|
6
|
-
version,
|
|
7
|
-
} from './dom';
|
|
1
|
+
import ReactDomCompat, { preconnect, prefetchDNS, preinit, preload, version } from './dom'
|
|
8
2
|
|
|
9
3
|
const ReactDomServer = { ...ReactDomCompat } as typeof ReactDomCompat & {
|
|
10
|
-
useFormState?: unknown
|
|
11
|
-
useFormStatus?: unknown
|
|
12
|
-
requestFormReset?: unknown
|
|
13
|
-
}
|
|
4
|
+
useFormState?: unknown
|
|
5
|
+
useFormStatus?: unknown
|
|
6
|
+
requestFormReset?: unknown
|
|
7
|
+
}
|
|
14
8
|
|
|
15
|
-
delete ReactDomServer.useFormState
|
|
16
|
-
delete ReactDomServer.useFormStatus
|
|
17
|
-
delete ReactDomServer.requestFormReset
|
|
9
|
+
delete ReactDomServer.useFormState
|
|
10
|
+
delete ReactDomServer.useFormStatus
|
|
11
|
+
delete ReactDomServer.requestFormReset
|
|
18
12
|
|
|
19
|
-
export { preconnect, prefetchDNS, preinit, preload, version }
|
|
20
|
-
export default ReactDomServer
|
|
13
|
+
export { preconnect, prefetchDNS, preinit, preload, version }
|
|
14
|
+
export default ReactDomServer
|
|
@@ -6,28 +6,28 @@
|
|
|
6
6
|
* server APIs (renderToReadableStream / renderToPipeableStream) have no direct
|
|
7
7
|
* preact equivalent that fits a browser bundle, so they throw if invoked.
|
|
8
8
|
*/
|
|
9
|
-
import ReactCompat from 'preact/compat'
|
|
9
|
+
import ReactCompat from 'preact/compat'
|
|
10
10
|
import {
|
|
11
11
|
renderToStaticMarkup as preactRenderToStaticMarkup,
|
|
12
12
|
renderToString as preactRenderToString,
|
|
13
13
|
renderToStringAsync as preactRenderToStringAsync,
|
|
14
|
-
} from 'preact-render-to-string'
|
|
14
|
+
} from 'preact-render-to-string'
|
|
15
15
|
|
|
16
|
-
export const version = ReactCompat.version
|
|
17
|
-
export const renderToString = preactRenderToString
|
|
18
|
-
export const renderToStaticMarkup = preactRenderToStaticMarkup
|
|
19
|
-
export const renderToStringAsync = preactRenderToStringAsync
|
|
16
|
+
export const version = ReactCompat.version
|
|
17
|
+
export const renderToString = preactRenderToString
|
|
18
|
+
export const renderToStaticMarkup = preactRenderToStaticMarkup
|
|
19
|
+
export const renderToStringAsync = preactRenderToStringAsync
|
|
20
20
|
|
|
21
21
|
function unsupportedStream(name: string): never {
|
|
22
|
-
throw new Error(`react-dom/server ${name} is not supported under pnext's preact runtime`)
|
|
22
|
+
throw new Error(`react-dom/server ${name} is not supported under pnext's preact runtime`)
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export function renderToReadableStream(): never {
|
|
26
|
-
return unsupportedStream('renderToReadableStream')
|
|
26
|
+
return unsupportedStream('renderToReadableStream')
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
export function renderToPipeableStream(): never {
|
|
30
|
-
return unsupportedStream('renderToPipeableStream')
|
|
30
|
+
return unsupportedStream('renderToPipeableStream')
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export default {
|
|
@@ -37,4 +37,4 @@ export default {
|
|
|
37
37
|
renderToStringAsync,
|
|
38
38
|
renderToReadableStream,
|
|
39
39
|
renderToPipeableStream,
|
|
40
|
-
}
|
|
40
|
+
}
|
package/src/compat/react/dom.ts
CHANGED
|
@@ -13,39 +13,39 @@
|
|
|
13
13
|
* - requestFormReset: passthrough to form.reset(); the client runtime resets
|
|
14
14
|
* uncontrolled forms after a successful action itself.
|
|
15
15
|
*/
|
|
16
|
-
import ReactCompat from 'preact/compat'
|
|
17
|
-
import { useActionState } from './preact'
|
|
18
|
-
import { registerResourceHint } from '../../render/resource-hints'
|
|
16
|
+
import ReactCompat from 'preact/compat'
|
|
17
|
+
import { useActionState } from './preact'
|
|
18
|
+
import { registerResourceHint } from '../../render/resource-hints'
|
|
19
19
|
|
|
20
20
|
const ReactDomCompat = Object.assign(ReactCompat, {
|
|
21
21
|
preload,
|
|
22
22
|
preconnect,
|
|
23
23
|
prefetchDNS,
|
|
24
24
|
preinit,
|
|
25
|
-
})
|
|
25
|
+
})
|
|
26
26
|
|
|
27
|
-
export default ReactDomCompat
|
|
27
|
+
export default ReactDomCompat
|
|
28
28
|
|
|
29
29
|
// The react-dom surface preact/compat provides (named, because preact/compat's
|
|
30
30
|
// types use `export =` which blocks `export *`).
|
|
31
|
-
export const render = ReactCompat.render
|
|
32
|
-
export const hydrate = ReactCompat.hydrate
|
|
33
|
-
export const createPortal = ReactCompat.createPortal
|
|
34
|
-
export const findDOMNode = ReactCompat.findDOMNode
|
|
35
|
-
export const flushSync = ReactCompat.flushSync
|
|
36
|
-
export const unmountComponentAtNode = ReactCompat.unmountComponentAtNode
|
|
37
|
-
export const unstable_batchedUpdates = ReactCompat.unstable_batchedUpdates
|
|
38
|
-
export const version = ReactCompat.version
|
|
31
|
+
export const render = ReactCompat.render
|
|
32
|
+
export const hydrate = ReactCompat.hydrate
|
|
33
|
+
export const createPortal = ReactCompat.createPortal
|
|
34
|
+
export const findDOMNode = ReactCompat.findDOMNode
|
|
35
|
+
export const flushSync = ReactCompat.flushSync
|
|
36
|
+
export const unmountComponentAtNode = ReactCompat.unmountComponentAtNode
|
|
37
|
+
export const unstable_batchedUpdates = ReactCompat.unstable_batchedUpdates
|
|
38
|
+
export const version = ReactCompat.version
|
|
39
39
|
|
|
40
40
|
export function preload(
|
|
41
41
|
href: string,
|
|
42
42
|
options?: {
|
|
43
|
-
as?: string
|
|
44
|
-
crossOrigin?: string
|
|
45
|
-
type?: string
|
|
46
|
-
fetchPriority?: string
|
|
47
|
-
media?: string
|
|
48
|
-
nonce?: string
|
|
43
|
+
as?: string
|
|
44
|
+
crossOrigin?: string
|
|
45
|
+
type?: string
|
|
46
|
+
fetchPriority?: string
|
|
47
|
+
media?: string
|
|
48
|
+
nonce?: string
|
|
49
49
|
},
|
|
50
50
|
) {
|
|
51
51
|
registerResourceHint({
|
|
@@ -61,7 +61,7 @@ export function preload(
|
|
|
61
61
|
...(options?.crossOrigin
|
|
62
62
|
? { crossOrigin: options.crossOrigin as 'anonymous' | 'use-credentials' | '' }
|
|
63
63
|
: {}),
|
|
64
|
-
})
|
|
64
|
+
})
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
export function preconnect(href: string, options?: { crossOrigin?: string }) {
|
|
@@ -71,11 +71,11 @@ export function preconnect(href: string, options?: { crossOrigin?: string }) {
|
|
|
71
71
|
...(options?.crossOrigin
|
|
72
72
|
? { crossOrigin: options.crossOrigin as 'anonymous' | 'use-credentials' | '' }
|
|
73
73
|
: {}),
|
|
74
|
-
})
|
|
74
|
+
})
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
export function prefetchDNS(href: string) {
|
|
78
|
-
registerResourceHint({ rel: 'dns-prefetch', url: href })
|
|
78
|
+
registerResourceHint({ rel: 'dns-prefetch', url: href })
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
export function preinit(href: string, options?: { as?: string; crossOrigin?: string }) {
|
|
@@ -86,69 +86,69 @@ export function preinit(href: string, options?: { as?: string; crossOrigin?: str
|
|
|
86
86
|
...(options?.crossOrigin
|
|
87
87
|
? { crossOrigin: options.crossOrigin as 'anonymous' | 'use-credentials' | '' }
|
|
88
88
|
: {}),
|
|
89
|
-
})
|
|
89
|
+
})
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
export const useFormState = useActionState
|
|
92
|
+
export const useFormState = useActionState
|
|
93
93
|
|
|
94
94
|
export interface FormStatusNotPending {
|
|
95
|
-
pending: false
|
|
96
|
-
data: null
|
|
97
|
-
method: null
|
|
98
|
-
action: null
|
|
95
|
+
pending: false
|
|
96
|
+
data: null
|
|
97
|
+
method: null
|
|
98
|
+
action: null
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
export interface FormStatusPending {
|
|
102
|
-
pending: true
|
|
103
|
-
data: FormData
|
|
104
|
-
method: string
|
|
105
|
-
action: string | ((formData: FormData) => void | Promise<void>)
|
|
102
|
+
pending: true
|
|
103
|
+
data: FormData
|
|
104
|
+
method: string
|
|
105
|
+
action: string | ((formData: FormData) => void | Promise<void>)
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
export type FormStatus = FormStatusPending | FormStatusNotPending
|
|
108
|
+
export type FormStatus = FormStatusPending | FormStatusNotPending
|
|
109
109
|
|
|
110
110
|
const NOT_PENDING: FormStatusNotPending = {
|
|
111
111
|
pending: false,
|
|
112
112
|
data: null,
|
|
113
113
|
method: null,
|
|
114
114
|
action: null,
|
|
115
|
-
}
|
|
115
|
+
}
|
|
116
116
|
|
|
117
117
|
// Form-status store, fed by the client entry's function-form-action runtime.
|
|
118
|
-
const pendingStack: FormStatusPending[] = []
|
|
119
|
-
const listeners = new Set<() => void>()
|
|
120
|
-
let storeVersion = 0
|
|
118
|
+
const pendingStack: FormStatusPending[] = []
|
|
119
|
+
const listeners = new Set<() => void>()
|
|
120
|
+
let storeVersion = 0
|
|
121
121
|
|
|
122
122
|
/** Called by the client runtime when a function form action starts/finishes. */
|
|
123
123
|
export function __pnextPushFormStatus(status: FormStatusPending): () => void {
|
|
124
|
-
pendingStack.push(status)
|
|
125
|
-
notify()
|
|
124
|
+
pendingStack.push(status)
|
|
125
|
+
notify()
|
|
126
126
|
return () => {
|
|
127
|
-
const index = pendingStack.indexOf(status)
|
|
128
|
-
if (index !== -1) pendingStack.splice(index, 1)
|
|
129
|
-
notify()
|
|
130
|
-
}
|
|
127
|
+
const index = pendingStack.indexOf(status)
|
|
128
|
+
if (index !== -1) pendingStack.splice(index, 1)
|
|
129
|
+
notify()
|
|
130
|
+
}
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
function notify() {
|
|
134
|
-
storeVersion += 1
|
|
135
|
-
for (const listener of [...listeners]) listener()
|
|
134
|
+
storeVersion += 1
|
|
135
|
+
for (const listener of [...listeners]) listener()
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
function subscribe(listener: () => void) {
|
|
139
|
-
listeners.add(listener)
|
|
139
|
+
listeners.add(listener)
|
|
140
140
|
return () => {
|
|
141
|
-
listeners.delete(listener)
|
|
142
|
-
}
|
|
141
|
+
listeners.delete(listener)
|
|
142
|
+
}
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
export function useFormStatus(): FormStatus {
|
|
146
|
-
ReactCompat.useSyncExternalStore(subscribe, () => storeVersion)
|
|
147
|
-
return pendingStack.length > 0 ? pendingStack[pendingStack.length - 1]! : NOT_PENDING
|
|
146
|
+
ReactCompat.useSyncExternalStore(subscribe, () => storeVersion)
|
|
147
|
+
return pendingStack.length > 0 ? pendingStack[pendingStack.length - 1]! : NOT_PENDING
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
export function requestFormReset(form: HTMLFormElement) {
|
|
151
|
-
if (form && typeof form.reset === 'function') form.reset()
|
|
151
|
+
if (form && typeof form.reset === 'function') form.reset()
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
-
Object.assign(ReactDomCompat, { useFormState, useFormStatus, requestFormReset })
|
|
154
|
+
Object.assign(ReactDomCompat, { useFormState, useFormStatus, requestFormReset })
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { options, type VNode } from 'preact'
|
|
2
|
-
import { useCallback, useRef, useState } from 'preact/hooks'
|
|
1
|
+
import { options, type VNode } from 'preact'
|
|
2
|
+
import { useCallback, useRef, useState } from 'preact/hooks'
|
|
3
3
|
|
|
4
4
|
// React 19 hooks (use, useActionState, useOptimistic, useTransition) implemented directly on
|
|
5
5
|
// preact/hooks so a suspense-free client bundle can ship them without preact/compat. The full shim
|
|
@@ -10,24 +10,24 @@ import { useCallback, useRef, useState } from 'preact/hooks';
|
|
|
10
10
|
// hooks have a current component. Server-side tree resolution invokes some client components as plain
|
|
11
11
|
// functions, outside any preact render, where hooks would throw - useActionState/useOptimistic fall back
|
|
12
12
|
// to SSR-equivalent static values there instead.
|
|
13
|
-
let renderInFlight = false
|
|
13
|
+
let renderInFlight = false
|
|
14
14
|
|
|
15
15
|
export function hooksUsable(): boolean {
|
|
16
|
-
return renderInFlight
|
|
16
|
+
return renderInFlight
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
{
|
|
20
|
-
const anyOptions = options as unknown as Record<string, unknown
|
|
21
|
-
const previousRender = anyOptions.__r as ((vnode: VNode) => void) | undefined
|
|
20
|
+
const anyOptions = options as unknown as Record<string, unknown>
|
|
21
|
+
const previousRender = anyOptions.__r as ((vnode: VNode) => void) | undefined
|
|
22
22
|
anyOptions.__r = (vnode: VNode) => {
|
|
23
|
-
renderInFlight = true
|
|
24
|
-
previousRender?.(vnode)
|
|
25
|
-
}
|
|
26
|
-
const previousDiffed = options.diffed?.bind(options)
|
|
23
|
+
renderInFlight = true
|
|
24
|
+
previousRender?.(vnode)
|
|
25
|
+
}
|
|
26
|
+
const previousDiffed = options.diffed?.bind(options)
|
|
27
27
|
options.diffed = vnode => {
|
|
28
|
-
renderInFlight = false
|
|
29
|
-
previousDiffed?.(vnode)
|
|
30
|
-
}
|
|
28
|
+
renderInFlight = false
|
|
29
|
+
previousDiffed?.(vnode)
|
|
30
|
+
}
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/**
|
|
@@ -38,27 +38,27 @@ export function hooksUsable(): boolean {
|
|
|
38
38
|
* while ANY is in flight - matching React.
|
|
39
39
|
*/
|
|
40
40
|
export function useTransition(): [boolean, (callback: () => void | Promise<void>) => void] {
|
|
41
|
-
if (!hooksUsable()) return [false, callback => void callback()]
|
|
42
|
-
const [pending, setPending] = useState(0)
|
|
41
|
+
if (!hooksUsable()) return [false, callback => void callback()]
|
|
42
|
+
const [pending, setPending] = useState(0)
|
|
43
43
|
const startTransition = useCallback((callback: () => void | Promise<void>) => {
|
|
44
|
-
const mpaBefore = (globalThis as { __pnextMpaNavigation?: number }).__pnextMpaNavigation ?? 0
|
|
45
|
-
let result: void | Promise<void
|
|
44
|
+
const mpaBefore = (globalThis as { __pnextMpaNavigation?: number }).__pnextMpaNavigation ?? 0
|
|
45
|
+
let result: void | Promise<void>
|
|
46
46
|
try {
|
|
47
|
-
result = callback()
|
|
47
|
+
result = callback()
|
|
48
48
|
} catch {
|
|
49
|
-
return
|
|
49
|
+
return
|
|
50
50
|
}
|
|
51
|
-
const mpaAfter = (globalThis as { __pnextMpaNavigation?: number }).__pnextMpaNavigation ?? 0
|
|
51
|
+
const mpaAfter = (globalThis as { __pnextMpaNavigation?: number }).__pnextMpaNavigation ?? 0
|
|
52
52
|
if (mpaAfter !== mpaBefore) {
|
|
53
|
-
setPending(count => count + 1)
|
|
54
|
-
return
|
|
53
|
+
setPending(count => count + 1)
|
|
54
|
+
return
|
|
55
55
|
}
|
|
56
56
|
if (result && typeof (result as PromiseLike<unknown>).then === 'function') {
|
|
57
|
-
setPending(count => count + 1)
|
|
58
|
-
void Promise.resolve(result).finally(() => setPending(count => count - 1))
|
|
57
|
+
setPending(count => count + 1)
|
|
58
|
+
void Promise.resolve(result).finally(() => setPending(count => count - 1))
|
|
59
59
|
}
|
|
60
|
-
}, [])
|
|
61
|
-
return [pending > 0, startTransition]
|
|
60
|
+
}, [])
|
|
61
|
+
return [pending > 0, startTransition]
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
/**
|
|
@@ -70,12 +70,12 @@ export function useOptimistic<State, Payload = State>(
|
|
|
70
70
|
passthrough: State,
|
|
71
71
|
reducer?: (state: State, payload: Payload) => State,
|
|
72
72
|
): [State, (payload: Payload) => void] {
|
|
73
|
-
if (!hooksUsable()) return [passthrough, () => undefined]
|
|
74
|
-
const [optimistic, setOptimistic] = useState<{ value: State } | null>(null)
|
|
75
|
-
const lastBase = useRef(passthrough)
|
|
73
|
+
if (!hooksUsable()) return [passthrough, () => undefined]
|
|
74
|
+
const [optimistic, setOptimistic] = useState<{ value: State } | null>(null)
|
|
75
|
+
const lastBase = useRef(passthrough)
|
|
76
76
|
if (lastBase.current !== passthrough) {
|
|
77
|
-
lastBase.current = passthrough
|
|
78
|
-
if (optimistic) setOptimistic(null)
|
|
77
|
+
lastBase.current = passthrough
|
|
78
|
+
if (optimistic) setOptimistic(null)
|
|
79
79
|
}
|
|
80
80
|
const dispatch = useCallback(
|
|
81
81
|
(payload: Payload) => {
|
|
@@ -83,10 +83,9 @@ export function useOptimistic<State, Payload = State>(
|
|
|
83
83
|
value: reducer
|
|
84
84
|
? reducer(current ? current.value : lastBase.current, payload)
|
|
85
85
|
: (payload as unknown as State),
|
|
86
|
-
}))
|
|
86
|
+
}))
|
|
87
87
|
},
|
|
88
88
|
[reducer],
|
|
89
|
-
)
|
|
90
|
-
return [optimistic ? optimistic.value : passthrough, dispatch]
|
|
89
|
+
)
|
|
90
|
+
return [optimistic ? optimistic.value : passthrough, dispatch]
|
|
91
91
|
}
|
|
92
|
-
|