@wular/pnext 0.0.3 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- package/bin/pnext +1 -1
- package/config/lint/base.js +7 -7
- package/config/ts/base.json +2 -4
- package/config/ts/react.json +2 -6
- package/package.json +23 -2
- package/reference/compat.md +1 -1
- package/reference/config.md +2 -2
- package/reference/css.md +13 -9
- package/reference/dev.md +1 -1
- package/reference/metadata.md +7 -7
- package/reference/navigation.md +35 -28
- package/reference/performance.md +70 -70
- package/reference/rendering.md +17 -17
- package/reference/routing.md +17 -17
- package/reference/typegen.md +12 -8
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +113 -109
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +49 -52
- package/src/api/navigation.ts +59 -58
- package/src/api/server.ts +152 -144
- package/src/api/suspense.ts +4 -4
- package/src/cli/adapters/vercel-warm.ts +126 -121
- package/src/cli/adapters/vercel.ts +437 -443
- package/src/cli/analyze.ts +333 -144
- package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
- package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
- package/src/cli/build.ts +976 -978
- package/src/cli/create.ts +71 -63
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +88 -85
- package/src/cli/migrate/package-json.ts +73 -71
- package/src/cli/migrate/report.ts +32 -33
- package/src/cli/migrate/{index.ts → run.ts} +48 -49
- package/src/cli/migrate/scan.ts +46 -46
- package/src/cli/migrate/spinner.ts +9 -9
- package/src/cli/migrate/tsconfig.ts +35 -35
- package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
- package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
- package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
- package/src/cli/start.ts +65 -66
- package/src/{typegen.ts → cli/typegen.ts} +59 -59
- package/src/client/build.ts +794 -768
- package/src/client/chunk-fold.ts +245 -240
- package/src/client/{paths.ts → chunk-name.ts} +6 -6
- package/src/client/entry.ts +162 -147
- package/src/client/prebuilt.ts +231 -223
- package/src/client/profile.ts +29 -29
- package/src/client/react-compiler.ts +20 -15
- package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
- package/src/client/reference-stub.ts +51 -51
- package/src/client/reference.ts +19 -19
- package/src/{api → client}/router/events.ts +17 -17
- package/src/{api → client}/router/history.ts +16 -16
- package/src/{api → client}/router/hub.ts +52 -53
- package/src/{api/router.ts → client/router/index.ts} +61 -60
- package/src/{api → client}/router/policies.ts +24 -24
- package/src/{api → client}/router/runtime.ts +1988 -1961
- package/src/{api → client}/router/types.ts +93 -98
- package/src/compat/actions/client-plugin.ts +42 -43
- package/src/compat/actions/client-stub.ts +14 -14
- package/src/compat/actions/{action-client.ts → client.ts} +194 -193
- package/src/compat/actions/config.ts +63 -64
- package/src/compat/actions/detect.ts +68 -68
- package/src/compat/actions/discovery.ts +105 -105
- package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
- package/src/compat/actions/early-submit.ts +1 -1
- package/src/compat/actions/endpoint.ts +198 -198
- package/src/compat/actions/extensions.ts +811 -0
- package/src/compat/actions/flight.ts +23 -23
- package/src/compat/actions/form-state.ts +34 -34
- package/src/compat/actions/hoist.ts +382 -236
- package/src/compat/actions/ids.ts +7 -12
- package/src/compat/actions/index.ts +8 -8
- package/src/compat/actions/instances.ts +46 -46
- package/src/compat/actions/origin.ts +47 -48
- package/src/compat/actions/protocol.ts +22 -22
- package/src/compat/actions/registry.ts +19 -19
- package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
- package/src/compat/actions/rewrite.ts +125 -125
- package/src/compat/actions/{action-router.ts → router.ts} +10 -10
- package/src/compat/actions/serve.ts +132 -136
- package/src/compat/actions/server-tag.ts +4 -4
- package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
- package/src/compat/actions/unrecognized-error.ts +4 -4
- package/src/compat/{index.ts → aliases.ts} +112 -109
- package/src/compat/bundler/bun-externals.ts +18 -18
- package/src/compat/bundler/cjs-exports.ts +271 -223
- package/src/compat/bundler/config.ts +116 -111
- package/src/compat/bundler/externals.ts +12 -12
- package/src/compat/bundler/import-meta-url.ts +19 -19
- package/src/compat/bundler/modularize-imports.ts +36 -33
- package/src/compat/bundler/new-url-asset.ts +22 -24
- package/src/compat/bundler/optimize-package-imports.ts +111 -107
- package/src/compat/bundler/polyfill.ts +28 -28
- package/src/compat/bundler/react-compiler.ts +35 -29
- package/src/compat/bundler/react-profiler.tsx +11 -11
- package/src/compat/bundler/relay-transform.ts +48 -47
- package/src/compat/bundler/require-context.ts +119 -113
- package/src/compat/bundler/resolve-extensions.ts +19 -19
- package/src/compat/bundler/source-cache.ts +25 -25
- package/src/compat/bundler/static-imports.ts +7 -7
- package/src/compat/bundler/symlink-imports.ts +46 -46
- package/src/compat/bundler/tsconfig-paths.ts +13 -15
- package/src/compat/bundler/wasm.ts +58 -60
- package/src/compat/bundler/webpack-loaders.ts +254 -241
- package/src/compat/bundler/worker.ts +101 -104
- package/src/compat/cache/build-flags.ts +29 -29
- package/src/compat/cache/build-prerender-errors.ts +40 -44
- package/src/compat/cache/custom-handler.ts +60 -53
- package/src/compat/cache/fetch-patch.ts +240 -240
- package/src/compat/cache/handler.ts +27 -31
- package/src/compat/cache/modern-handler.ts +148 -126
- package/src/compat/cache/resume-data-cache.ts +47 -45
- package/src/compat/cache/revalidate.ts +233 -232
- package/src/compat/cache/runtime-error.ts +35 -35
- package/src/compat/cache/use-cache-transform.ts +442 -417
- package/src/compat/cache/use-cache.ts +650 -614
- package/src/compat/cache-control.ts +140 -142
- package/src/compat/client/base-path.ts +21 -20
- package/src/compat/client/css-order.ts +18 -18
- package/src/compat/client/errors/bare-boundary.ts +11 -11
- package/src/compat/client/errors/control-flow.ts +23 -23
- package/src/compat/client/errors/error-boundary.ts +61 -61
- package/src/compat/client/errors/global-error.ts +101 -91
- package/src/compat/client/errors/install.ts +71 -72
- package/src/compat/client/errors/lazy.ts +23 -23
- package/src/compat/client/errors/primitive-throw.ts +47 -45
- package/src/compat/client/errors/soft-refresh.ts +4 -4
- package/src/compat/client/link-status.ts +33 -33
- package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
- package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
- package/src/compat/client/navigation-scroll.ts +63 -63
- package/src/compat/client/optimistic-routing.ts +93 -88
- package/src/compat/client/prefetch-cache.ts +23 -24
- package/src/compat/client/route-announcer.ts +35 -35
- package/src/compat/client/segment-cache-policy.ts +20 -20
- package/src/compat/client/segment-cache.ts +309 -315
- package/src/compat/client/segment-prefetch.ts +127 -132
- package/src/compat/client/trailing-slash.ts +5 -4
- package/src/compat/css/chunking.ts +113 -116
- package/src/compat/css/inline-css.ts +21 -21
- package/src/compat/css/lightningcss.ts +37 -38
- package/src/compat/css/modules.ts +161 -175
- package/src/compat/css/nonce.ts +7 -7
- package/src/compat/css/sass-plugin.ts +18 -21
- package/src/compat/css/sass.ts +150 -152
- package/src/compat/css/styled-jsx-runtime.ts +27 -27
- package/src/compat/css/styled-jsx.ts +21 -21
- package/src/compat/edge-runtime.ts +27 -27
- package/src/compat/{adapter → export}/build-complete.ts +72 -75
- package/src/compat/export/client.ts +29 -31
- package/src/compat/export/{index.ts → emit.ts} +111 -110
- package/src/compat/export/standalone.ts +62 -54
- package/src/compat/image-optimizer/cache.ts +51 -49
- package/src/compat/image-optimizer/detect.ts +52 -52
- package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
- package/src/compat/image-optimizer/source.ts +77 -80
- package/src/compat/lifecycle/after-scope.ts +26 -26
- package/src/compat/lifecycle/after.ts +48 -45
- package/src/compat/lifecycle/error-funnel.ts +98 -102
- package/src/compat/lifecycle/error-serialize.ts +30 -26
- package/src/compat/lifecycle/error-ui.ts +67 -32
- package/src/compat/lifecycle/instrumentation-client.ts +36 -38
- package/src/compat/lifecycle/instrumentation.ts +85 -85
- package/src/compat/lifecycle/node-console.ts +11 -11
- package/src/compat/lifecycle/testmode.ts +160 -132
- package/src/compat/mdx/compile.ts +60 -57
- package/src/compat/mdx/plugin.ts +11 -11
- package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
- package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
- package/src/compat/metadata.ts +75 -81
- package/src/compat/next/cache.ts +68 -69
- package/src/compat/next/canonical-url.ts +9 -9
- package/src/compat/next/client-cache.ts +19 -19
- package/src/compat/next/client-navigation.ts +112 -116
- package/src/compat/next/client-only.ts +1 -1
- package/src/compat/next/client-script.tsx +99 -93
- package/src/compat/next/client-server.ts +10 -10
- package/src/compat/next/config-loader.ts +176 -173
- package/src/compat/next/config.ts +7 -7
- package/src/compat/next/constants.cjs +6 -6
- package/src/compat/next/constants.ts +6 -6
- package/src/compat/next/custom-server.ts +26 -24
- package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
- package/src/compat/next/dynamic.tsx +21 -18
- package/src/compat/next/error.tsx +52 -52
- package/src/compat/next/font/cache.ts +74 -74
- package/src/compat/next/font/google.ts +2 -2
- package/src/compat/next/font/index.ts +1 -1
- package/src/compat/next/font/local.ts +3 -3
- package/src/compat/next/font/runtime-client.ts +17 -15
- package/src/compat/next/font/runtime.ts +443 -408
- package/src/compat/next/font/shared.ts +120 -108
- package/src/compat/next/form.tsx +63 -63
- package/src/compat/next/head.tsx +2 -2
- package/src/compat/next/headers.ts +103 -95
- package/src/compat/next/image/client.tsx +220 -0
- package/src/compat/next/image/config.ts +56 -58
- package/src/compat/next/image/optimizer.ts +40 -36
- package/src/compat/next/image/patterns.ts +37 -40
- package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
- package/src/compat/next/image/shared.ts +65 -57
- package/src/compat/next/image/static-metadata.ts +98 -107
- package/src/compat/next/image/validate.ts +79 -88
- package/src/compat/next/image.tsx +19 -23
- package/src/compat/next/index.ts +1 -1
- package/src/compat/next/legacy-image.tsx +59 -60
- package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
- package/src/compat/next/link.tsx +158 -158
- package/src/compat/next/navigation.cjs +12 -3
- package/src/compat/next/navigation.ts +48 -50
- package/src/compat/next/offline.ts +27 -27
- package/src/compat/next/og.ts +121 -124
- package/src/compat/next/preferred-region.ts +13 -14
- package/src/compat/next/redirects.ts +58 -56
- package/src/compat/next/resource-hints.ts +73 -76
- package/src/compat/next/rewrites.ts +130 -133
- package/src/compat/next/root-params.ts +45 -45
- package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
- package/src/compat/next/router.cjs +4 -2
- package/src/compat/next/router.ts +58 -61
- package/src/compat/next/script.tsx +108 -108
- package/src/compat/next/server-only.ts +1 -1
- package/src/compat/next/server.ts +19 -19
- package/src/compat/next/svgr.ts +18 -17
- package/src/compat/next/telemetry.ts +24 -24
- package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
- package/src/compat/next/user-agent.ts +53 -49
- package/src/compat/next/web-vitals.ts +22 -24
- package/src/compat/otel/api.ts +41 -41
- package/src/compat/otel/client-trace-metadata.ts +25 -27
- package/src/compat/otel/fetch-span.ts +29 -29
- package/src/compat/otel/tracer.ts +331 -331
- package/src/compat/pages/api.ts +456 -0
- package/src/compat/pages/client-plugin.ts +36 -36
- package/src/compat/pages/router-state.ts +34 -34
- package/src/compat/pages/{index.ts → router.ts} +130 -135
- package/src/compat/ppr/io.ts +12 -12
- package/src/compat/ppr/missing-root-params.ts +34 -38
- package/src/compat/ppr/root-params-scan.ts +66 -66
- package/src/compat/ppr/root-params-transform.ts +24 -26
- package/src/compat/ppr/root-params.ts +30 -30
- package/src/compat/ppr/segment-config-incompat.ts +6 -7
- package/src/compat/protocol.ts +71 -70
- package/src/compat/react/action-state.ts +47 -48
- package/src/compat/react/client-lite.ts +15 -15
- package/src/compat/react/client.ts +4 -4
- package/src/compat/react/compiler-runtime.ts +11 -11
- package/src/compat/react/dom-client.ts +44 -44
- package/src/compat/react/dom-react-server.ts +10 -16
- package/src/compat/react/dom-server.ts +10 -10
- package/src/compat/react/dom.ts +52 -52
- package/src/compat/react/hooks-extra.ts +34 -35
- package/src/compat/react/parity.ts +64 -61
- package/src/compat/react/preact.ts +81 -82
- package/src/compat/react/react-server.ts +28 -28
- package/src/compat/react/router-shim.ts +1 -1
- package/src/compat/react/server-component-use.ts +8 -8
- package/src/compat/react/server-inserted-html.ts +30 -31
- package/src/compat/react/server.ts +53 -55
- package/src/compat/react/use.ts +32 -32
- package/src/compat/react/view-transition.ts +20 -20
- package/src/compat/register/actions.ts +35 -824
- package/src/compat/register/boot.ts +41 -41
- package/src/compat/register/build-tier.ts +5 -5
- package/src/compat/register/build.ts +74 -70
- package/src/compat/register/bundler.ts +161 -156
- package/src/compat/register/cache.ts +20 -20
- package/src/compat/register/client-errors.ts +3 -3
- package/src/compat/register/config.ts +6 -6
- package/src/compat/register/css-extras.ts +30 -34
- package/src/compat/register/edge-runtime.ts +3 -3
- package/src/compat/register/errors.ts +10 -12
- package/src/compat/register/export.ts +16 -16
- package/src/compat/register/font.ts +11 -11
- package/src/compat/register/hooks.ts +2 -2
- package/src/compat/register/image.ts +40 -40
- package/src/compat/register/index.ts +59 -62
- package/src/compat/register/instrumentation-client.ts +10 -10
- package/src/compat/register/lifecycle.ts +25 -28
- package/src/compat/register/mdx.ts +10 -10
- package/src/compat/register/middleware.ts +226 -16
- package/src/compat/register/otel.ts +80 -88
- package/src/compat/register/pages-api.ts +10 -463
- package/src/compat/register/ppr.ts +16 -16
- package/src/compat/register/protocol.ts +17 -18
- package/src/compat/register/proxy.ts +49 -51
- package/src/compat/register/render.ts +79 -76
- package/src/compat/register/routing.ts +162 -159
- package/src/compat/register/segment.ts +24 -1887
- package/src/compat/register/static-image.ts +3 -3
- package/src/compat/register/{misc.ts → taint.ts} +9 -9
- package/src/compat/register/typed-routes.ts +14 -14
- package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
- package/src/compat/register/validation.ts +18 -18
- package/src/compat/segment/loading-boundary.ts +43 -45
- package/src/compat/segment/page-slot.ts +69 -69
- package/src/compat/segment/serve.ts +1884 -0
- package/src/compat/segment/tree.ts +113 -112
- package/src/compat/segment/vary-key.ts +38 -38
- package/src/compat/segment/vary-params.ts +138 -142
- package/src/compat/static-params.ts +14 -12
- package/src/compat/tsconfig-defaults.ts +87 -91
- package/src/compat/typecheck/{index.ts → check.ts} +234 -212
- package/src/compat/typecheck/worker.ts +15 -12
- package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
- package/src/compat/typed-routes/manifest.ts +174 -170
- package/src/compat/typed-routes/typegen.ts +127 -110
- package/src/compat/validation/errors.ts +16 -19
- package/src/compat/validation/prerender-diagnostics.ts +521 -504
- package/src/compat/validation/{index.ts → validate.ts} +647 -648
- package/src/compat-bootstrap.ts +16 -16
- package/src/config.ts +69 -69
- package/src/css/build.ts +230 -227
- package/src/css/postcss.ts +79 -80
- package/src/css/worker.ts +14 -15
- package/src/dev/client-actions.ts +10 -10
- package/src/dev/client-chunk-store.ts +27 -27
- package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
- package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
- package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
- package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
- package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
- package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
- package/src/dev/server.ts +804 -820
- package/src/env.ts +46 -43
- package/src/extensions.ts +491 -478
- package/src/index.ts +8 -8
- package/src/internal.ts +20 -23
- package/src/{islands → render}/boundary-error.ts +3 -3
- package/src/render/hooks.ts +71 -71
- package/src/render/island-context.ts +14 -14
- package/src/render/metadata.ts +310 -310
- package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
- package/src/{ppr.ts → render/ppr.ts} +244 -245
- package/src/render/renderer.ts +2076 -2082
- package/src/render/resource-hints.ts +16 -17
- package/src/render/slots.tsx +224 -235
- package/src/{islands → render}/static-children.ts +9 -12
- package/src/{islands → render}/static-slots.ts +37 -37
- package/src/{cache/context.ts → request/cache.ts} +20 -20
- package/src/request/context.ts +107 -107
- package/src/{dynamic/source.ts → resolve/dynamic.ts} +152 -143
- package/src/resolve/engine.ts +90 -77
- package/src/resolve/imports.ts +475 -463
- package/src/resolve/scan-facts.ts +442 -186
- package/src/resolve/source-text.ts +37 -37
- package/src/{dynamic → resolve}/tree-shake.ts +132 -128
- package/src/routing/forwarded.ts +19 -19
- package/src/routing/handler.ts +84 -91
- package/src/routing/href.ts +69 -70
- package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
- package/src/{proxy.ts → routing/proxy.ts} +306 -312
- package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
- package/src/routing/routes.ts +833 -848
- package/src/routing/slots.ts +164 -160
- package/src/runtime/loader.ts +952 -0
- package/src/{dev → runtime}/module-cache.ts +309 -287
- package/src/{dev → runtime}/module-generations.ts +9 -9
- package/src/{dev → runtime}/module-transform.ts +81 -72
- package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
- package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
- package/src/runtime/vendor.ts +425 -404
- package/src/styles.d.ts +9 -0
- package/src/types.ts +320 -335
- package/src/utils/ansi.ts +5 -5
- package/src/utils/{source.ts → code.ts} +15 -12
- package/src/utils/content-type.ts +3 -3
- package/src/utils/decode.ts +2 -2
- package/src/utils/dev-profile.ts +13 -13
- package/src/utils/error-log.ts +6 -6
- package/src/utils/esbuild.ts +18 -18
- package/src/utils/fs-cache.ts +13 -13
- package/src/utils/fs.ts +57 -49
- package/src/utils/html.ts +20 -24
- package/src/utils/native-require.ts +8 -8
- package/src/utils/serialize.ts +139 -146
- package/src/utils/verbose.ts +18 -18
- package/src/cli/analyze-print.ts +0 -181
- package/src/compat/middleware/manifest.ts +0 -210
- package/src/compat/next/image-client.tsx +0 -215
- package/src/compat/next/link-usage.ts +0 -29
- package/src/css/index.ts +0 -2
- package/src/render/index.ts +0 -1
- package/src/style-modules.d.ts +0 -9
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import { options, type ComponentType, type VNode } from 'preact'
|
|
2
|
-
import { wrapComponentForPrimitiveThrows } from '../client/errors/primitive-throw'
|
|
1
|
+
import { options, type ComponentType, type VNode } from 'preact'
|
|
2
|
+
import { wrapComponentForPrimitiveThrows } from '../client/errors/primitive-throw'
|
|
3
3
|
|
|
4
|
-
const reactForwardRefSymbol = Symbol.for('react.forward_ref')
|
|
5
|
-
const react19RefCompatInstalled = Symbol.for('pnext.react19-ref-compat-installed')
|
|
6
|
-
const reactTextSeparatorSymbol = Symbol.for('pnext.react-text-separator')
|
|
4
|
+
const reactForwardRefSymbol = Symbol.for('react.forward_ref')
|
|
5
|
+
const react19RefCompatInstalled = Symbol.for('pnext.react19-ref-compat-installed')
|
|
6
|
+
const reactTextSeparatorSymbol = Symbol.for('pnext.react-text-separator')
|
|
7
7
|
|
|
8
8
|
type PNextPreactOptions = typeof options & {
|
|
9
|
-
[react19RefCompatInstalled]?: true
|
|
10
|
-
}
|
|
9
|
+
[react19RefCompatInstalled]?: true
|
|
10
|
+
}
|
|
11
11
|
|
|
12
12
|
type RefCompatibleComponent = ComponentType<Record<string, unknown>> & {
|
|
13
|
-
$$typeof?: symbol
|
|
14
|
-
prototype?: { render?: unknown }
|
|
15
|
-
}
|
|
13
|
+
$$typeof?: symbol
|
|
14
|
+
prototype?: { render?: unknown }
|
|
15
|
+
}
|
|
16
16
|
|
|
17
17
|
// preact's `options.vnode` is process-global and cannot be uninstalled, so its BEHAVIOR follows the
|
|
18
18
|
// active extension host instead: one server process can serve a compat app and then a pure-core one, and
|
|
19
19
|
// the core app must not inherit React parity it never asked for. Defaults to on - importing this module
|
|
20
20
|
// IS compat being wired, and the client never resets.
|
|
21
|
-
let reactCompatActive = true
|
|
21
|
+
let reactCompatActive = true
|
|
22
22
|
|
|
23
23
|
/** Enable/disable the react-compat vnode parity pass (see reactCompatActive). */
|
|
24
24
|
export function setReactCompatActive(active: boolean): void {
|
|
25
|
-
reactCompatActive = active
|
|
25
|
+
reactCompatActive = active
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
// Suspense-dependent parity (thenable children, async client components) needs preact/compat, which a
|
|
@@ -30,29 +30,29 @@ export function setReactCompatActive(active: boolean): void {
|
|
|
30
30
|
// the slot empty and its bundle drops preact/compat entirely. Two phases: async-component wrapping must
|
|
31
31
|
// see the raw component (before primitive-throw wraps it); thenable children run after.
|
|
32
32
|
interface SuspenseParity {
|
|
33
|
-
beforeThrowSafety(vnode: VNode): void
|
|
34
|
-
afterThrowSafety(vnode: VNode): void
|
|
33
|
+
beforeThrowSafety(vnode: VNode): void
|
|
34
|
+
afterThrowSafety(vnode: VNode): void
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
let suspenseParity: SuspenseParity | undefined
|
|
37
|
+
let suspenseParity: SuspenseParity | undefined
|
|
38
38
|
|
|
39
39
|
export function setSuspenseParity(pass: SuspenseParity): void {
|
|
40
|
-
suspenseParity = pass
|
|
40
|
+
suspenseParity = pass
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
const pnextOptions = options as PNextPreactOptions
|
|
43
|
+
const pnextOptions = options as PNextPreactOptions
|
|
44
44
|
if (!pnextOptions[react19RefCompatInstalled]) {
|
|
45
|
-
const previousVNode = options.vnode?.bind(options)
|
|
45
|
+
const previousVNode = options.vnode?.bind(options)
|
|
46
46
|
options.vnode = vnode => {
|
|
47
|
-
previousVNode?.(vnode)
|
|
48
|
-
if (!reactCompatActive) return
|
|
49
|
-
applyReact19RefProp(vnode)
|
|
50
|
-
suspenseParity?.beforeThrowSafety(vnode)
|
|
51
|
-
applyPrimitiveThrowSafety(vnode)
|
|
52
|
-
suspenseParity?.afterThrowSafety(vnode)
|
|
53
|
-
applyReactTextSeparators(vnode)
|
|
54
|
-
}
|
|
55
|
-
pnextOptions[react19RefCompatInstalled] = true
|
|
47
|
+
previousVNode?.(vnode)
|
|
48
|
+
if (!reactCompatActive) return
|
|
49
|
+
applyReact19RefProp(vnode)
|
|
50
|
+
suspenseParity?.beforeThrowSafety(vnode)
|
|
51
|
+
applyPrimitiveThrowSafety(vnode)
|
|
52
|
+
suspenseParity?.afterThrowSafety(vnode)
|
|
53
|
+
applyReactTextSeparators(vnode)
|
|
54
|
+
}
|
|
55
|
+
pnextOptions[react19RefCompatInstalled] = true
|
|
56
56
|
|
|
57
57
|
// Effect scheduling parity with React: preact/hooks flushes passive effects
|
|
58
58
|
// via requestAnimationFrame + setTimeout(35) (afterNextFrame), both governed
|
|
@@ -64,16 +64,16 @@ if (!pnextOptions[react19RefCompatInstalled]) {
|
|
|
64
64
|
// Route the flush through a MessageChannel task so effect timing is
|
|
65
65
|
// clock-independent, like React's.
|
|
66
66
|
if ((process.browser || typeof window !== 'undefined') && typeof MessageChannel !== 'undefined') {
|
|
67
|
-
const queue: (() => void)[] = []
|
|
68
|
-
const channel = new MessageChannel()
|
|
67
|
+
const queue: (() => void)[] = []
|
|
68
|
+
const channel = new MessageChannel()
|
|
69
69
|
channel.port1.onmessage = () => {
|
|
70
|
-
for (const callback of queue.splice(0)) callback()
|
|
71
|
-
}
|
|
72
|
-
(options as { requestAnimationFrame?: (cb: () => void) => void }).requestAnimationFrame =
|
|
70
|
+
for (const callback of queue.splice(0)) callback()
|
|
71
|
+
}
|
|
72
|
+
;(options as { requestAnimationFrame?: (cb: () => void) => void }).requestAnimationFrame =
|
|
73
73
|
callback => {
|
|
74
|
-
queue.push(callback)
|
|
75
|
-
channel.port2.postMessage(null)
|
|
76
|
-
}
|
|
74
|
+
queue.push(callback)
|
|
75
|
+
channel.port2.postMessage(null)
|
|
76
|
+
}
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
|
|
@@ -81,31 +81,31 @@ function applyReactTextSeparators(vnode: VNode) {
|
|
|
81
81
|
// Server-only. `process.browser` is a client-bundle define (true) and
|
|
82
82
|
// undefined on the server, so this body folds out of browser builds; the
|
|
83
83
|
// `typeof window` twin keeps the runtime check for unbundled consumers.
|
|
84
|
-
if (process.browser || typeof window !== 'undefined') return
|
|
85
|
-
const props = vnode.props as Record<string, unknown
|
|
86
|
-
const children = props.children
|
|
87
|
-
if (!Array.isArray(children) || children.length < 2) return
|
|
88
|
-
const values = children as unknown[]
|
|
89
|
-
|
|
90
|
-
const separated: unknown[] = []
|
|
91
|
-
let changed = false
|
|
84
|
+
if (process.browser || typeof window !== 'undefined') return
|
|
85
|
+
const props = vnode.props as Record<string, unknown>
|
|
86
|
+
const children = props.children
|
|
87
|
+
if (!Array.isArray(children) || children.length < 2) return
|
|
88
|
+
const values = children as unknown[]
|
|
89
|
+
|
|
90
|
+
const separated: unknown[] = []
|
|
91
|
+
let changed = false
|
|
92
92
|
for (let index = 0; index < values.length; index += 1) {
|
|
93
|
-
const child = values[index]
|
|
94
|
-
separated.push(child)
|
|
95
|
-
if (!mayRenderText(child) || !mayRenderText(values[index + 1])) continue
|
|
93
|
+
const child = values[index]
|
|
94
|
+
separated.push(child)
|
|
95
|
+
if (!mayRenderText(child) || !mayRenderText(values[index + 1])) continue
|
|
96
96
|
separated.push({
|
|
97
97
|
type: reactTextSeparatorSymbol,
|
|
98
98
|
props: { UNSTABLE_comment: ' ' },
|
|
99
|
-
})
|
|
100
|
-
changed = true
|
|
99
|
+
})
|
|
100
|
+
changed = true
|
|
101
101
|
}
|
|
102
|
-
if (changed) props.children = separated
|
|
102
|
+
if (changed) props.children = separated
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
function mayRenderText(value: unknown) {
|
|
106
|
-
if (typeof value === 'string' || typeof value === 'number') return true
|
|
107
|
-
if (!value || typeof value !== 'object' || !('type' in value)) return false
|
|
108
|
-
return typeof (value as VNode).type !== 'string'
|
|
106
|
+
if (typeof value === 'string' || typeof value === 'number') return true
|
|
107
|
+
if (!value || typeof value !== 'object' || !('type' in value)) return false
|
|
108
|
+
return typeof (value as VNode).type !== 'string'
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
function applyPrimitiveThrowSafety(vnode: VNode) {
|
|
@@ -113,16 +113,19 @@ function applyPrimitiveThrowSafety(vnode: VNode) {
|
|
|
113
113
|
// suspense check during real preact diffing. The server's resolveServerTree is a custom RSC-style tree
|
|
114
114
|
// walker, not preact's diff - it never hits that crash, and wrapping component references there risks
|
|
115
115
|
// losing the symbol-keyed metadata resolveServerTree branches on.
|
|
116
|
-
if (!process.browser && typeof window === 'undefined') return
|
|
117
|
-
if (typeof vnode.type !== 'function') return
|
|
118
|
-
vnode.type = wrapComponentForPrimitiveThrows(vnode.type)
|
|
116
|
+
if (!process.browser && typeof window === 'undefined') return
|
|
117
|
+
if (typeof vnode.type !== 'function') return
|
|
118
|
+
vnode.type = wrapComponentForPrimitiveThrows(vnode.type)
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
function applyReact19RefProp(vnode: VNode) {
|
|
122
|
-
if (!vnode.ref || typeof vnode.type !== 'function') return
|
|
123
|
-
const component = vnode.type as RefCompatibleComponent
|
|
124
|
-
if (component.prototype?.render || component.$$typeof === reactForwardRefSymbol) return
|
|
125
|
-
|
|
126
|
-
vnode.props = {
|
|
127
|
-
|
|
122
|
+
if (!vnode.ref || typeof vnode.type !== 'function') return
|
|
123
|
+
const component = vnode.type as RefCompatibleComponent
|
|
124
|
+
if (component.prototype?.render || component.$$typeof === reactForwardRefSymbol) return
|
|
125
|
+
|
|
126
|
+
vnode.props = {
|
|
127
|
+
...(vnode.props as Record<string, unknown>),
|
|
128
|
+
ref: vnode.ref,
|
|
129
|
+
} as unknown as typeof vnode.props
|
|
130
|
+
vnode.ref = null
|
|
128
131
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import ReactCompat from 'preact/compat'
|
|
2
|
-
import { type ComponentChildren, type ComponentType, type VNode } from 'preact'
|
|
3
|
-
import { setSuspenseParity } from './parity'
|
|
4
|
-
import { use } from './use'
|
|
5
|
-
import { useActionState } from './action-state'
|
|
6
|
-
import { useOptimistic, useTransition } from './hooks-extra'
|
|
1
|
+
import ReactCompat from 'preact/compat'
|
|
2
|
+
import { type ComponentChildren, type ComponentType, type VNode } from 'preact'
|
|
3
|
+
import { setSuspenseParity } from './parity'
|
|
4
|
+
import { use } from './use'
|
|
5
|
+
import { useActionState } from './action-state'
|
|
6
|
+
import { useOptimistic, useTransition } from './hooks-extra'
|
|
7
7
|
|
|
8
8
|
// Full react shim: preact/compat plus the React 19 surface. The vnode parity pass lives in ./parity
|
|
9
9
|
// (compat-free, shared with the lite client shim); the suspense-dependent parity below registers into
|
|
@@ -12,22 +12,22 @@ import { useOptimistic, useTransition } from './hooks-extra';
|
|
|
12
12
|
setSuspenseParity({
|
|
13
13
|
beforeThrowSafety: applyAsyncClientComponent,
|
|
14
14
|
afterThrowSafety: applyThenableChildren,
|
|
15
|
-
})
|
|
15
|
+
})
|
|
16
16
|
|
|
17
|
-
export { setReactCompatActive } from './parity'
|
|
18
|
-
export { use, withUseThenableState, type UseThenableState } from './use'
|
|
17
|
+
export { setReactCompatActive } from './parity'
|
|
18
|
+
export { use, withUseThenableState, type UseThenableState } from './use'
|
|
19
19
|
export {
|
|
20
20
|
useActionState,
|
|
21
21
|
consumeActionStateOverride,
|
|
22
22
|
type FormStateDispatchMeta,
|
|
23
|
-
} from './action-state'
|
|
24
|
-
export { useOptimistic, useTransition } from './hooks-extra'
|
|
23
|
+
} from './action-state'
|
|
24
|
+
export { useOptimistic, useTransition } from './hooks-extra'
|
|
25
25
|
|
|
26
26
|
function applyThenableChildren(vnode: VNode) {
|
|
27
|
-
const props = vnode.props as Record<string, unknown
|
|
28
|
-
const children = props.children
|
|
29
|
-
const resolved = thenableChildren(children)
|
|
30
|
-
if (resolved !== children) props.children = resolved
|
|
27
|
+
const props = vnode.props as Record<string, unknown>
|
|
28
|
+
const children = props.children
|
|
29
|
+
const resolved = thenableChildren(children)
|
|
30
|
+
if (resolved !== children) props.children = resolved
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
function thenableChildren(value: unknown): unknown {
|
|
@@ -38,98 +38,97 @@ function thenableChildren(value: unknown): unknown {
|
|
|
38
38
|
ReactCompat.createElement(ThenableChild, {
|
|
39
39
|
value: value as PromiseLike<ComponentChildren>,
|
|
40
40
|
}),
|
|
41
|
-
)
|
|
41
|
+
)
|
|
42
42
|
}
|
|
43
|
-
if (!Array.isArray(value)) return value
|
|
44
|
-
let changed = false
|
|
43
|
+
if (!Array.isArray(value)) return value
|
|
44
|
+
let changed = false
|
|
45
45
|
const children = value.map(child => {
|
|
46
|
-
const resolved = thenableChildren(child)
|
|
47
|
-
if (resolved !== child) changed = true
|
|
48
|
-
return resolved
|
|
49
|
-
})
|
|
50
|
-
return changed ? children : value
|
|
46
|
+
const resolved = thenableChildren(child)
|
|
47
|
+
if (resolved !== child) changed = true
|
|
48
|
+
return resolved
|
|
49
|
+
})
|
|
50
|
+
return changed ? children : value
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
function ThenableChild({ value }: { value: PromiseLike<ComponentChildren> }) {
|
|
54
|
-
return use(value)
|
|
54
|
+
return use(value)
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
const asyncClientComponents = new WeakMap<
|
|
58
58
|
ComponentType<Record<string, unknown>>,
|
|
59
59
|
ComponentType<Record<string, unknown>>
|
|
60
|
-
>()
|
|
60
|
+
>()
|
|
61
61
|
|
|
62
62
|
function applyAsyncClientComponent(vnode: VNode) {
|
|
63
|
-
if ((!process.browser && typeof window === 'undefined') || typeof vnode.type !== 'function')
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
63
|
+
if ((!process.browser && typeof window === 'undefined') || typeof vnode.type !== 'function')
|
|
64
|
+
return
|
|
65
|
+
const component = vnode.type as ComponentType<Record<string, unknown>>
|
|
66
|
+
if (component.constructor.name !== 'AsyncFunction') return
|
|
67
|
+
const renderComponent = component as (props: Record<string, unknown>) => ComponentChildren
|
|
68
|
+
let wrapper = asyncClientComponents.get(component)
|
|
68
69
|
if (!wrapper) {
|
|
69
70
|
wrapper = props => {
|
|
70
|
-
const [result] = ReactCompat.useState(() =>
|
|
71
|
-
Promise.resolve(renderComponent(props)),
|
|
72
|
-
);
|
|
71
|
+
const [result] = ReactCompat.useState(() => Promise.resolve(renderComponent(props)))
|
|
73
72
|
return ReactCompat.createElement(
|
|
74
73
|
ReactCompat.Suspense,
|
|
75
74
|
{ fallback: null },
|
|
76
75
|
ReactCompat.createElement(ThenableChild, { value: result }),
|
|
77
|
-
)
|
|
78
|
-
}
|
|
79
|
-
asyncClientComponents.set(component, wrapper)
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
asyncClientComponents.set(component, wrapper)
|
|
80
79
|
}
|
|
81
|
-
vnode.type = wrapper
|
|
80
|
+
vnode.type = wrapper
|
|
82
81
|
}
|
|
83
82
|
|
|
84
83
|
// React 19 APIs preact/compat lacks - use(), useActionState, useOptimistic (imported above) - must ALSO
|
|
85
84
|
// live on the default export: app code does `import React from 'react'; React.use(...)`, not only named
|
|
86
85
|
// imports. server.ts spreads this default into ReactServer, so the augmentation covers both layers.
|
|
87
|
-
export default Object.assign(ReactCompat, { use, useActionState, useOptimistic, useTransition })
|
|
86
|
+
export default Object.assign(ReactCompat, { use, useActionState, useOptimistic, useTransition })
|
|
88
87
|
|
|
89
|
-
export const Children = ReactCompat.Children
|
|
90
|
-
export const Component = ReactCompat.Component
|
|
91
|
-
export const Fragment = ReactCompat.Fragment
|
|
92
|
-
export const PureComponent = ReactCompat.PureComponent
|
|
93
|
-
export const StrictMode = ReactCompat.StrictMode
|
|
94
|
-
export const Suspense = ReactCompat.Suspense
|
|
95
|
-
export const SuspenseList = ReactCompat.SuspenseList
|
|
96
|
-
export const cloneElement = ReactCompat.cloneElement
|
|
97
|
-
export const createContext = ReactCompat.createContext
|
|
98
|
-
export const createElement = ReactCompat.createElement
|
|
99
|
-
export const createFactory = ReactCompat.createFactory
|
|
100
|
-
export const createPortal = ReactCompat.createPortal
|
|
101
|
-
export const createRef = ReactCompat.createRef
|
|
102
|
-
export const findDOMNode = ReactCompat.findDOMNode
|
|
103
|
-
export const flushSync = ReactCompat.flushSync
|
|
104
|
-
export const forwardRef = ReactCompat.forwardRef
|
|
105
|
-
export const hydrate = ReactCompat.hydrate
|
|
106
|
-
export const isFragment = ReactCompat.isFragment
|
|
107
|
-
export const isMemo = ReactCompat.isMemo
|
|
108
|
-
export const isValidElement = ReactCompat.isValidElement
|
|
88
|
+
export const Children = ReactCompat.Children
|
|
89
|
+
export const Component = ReactCompat.Component
|
|
90
|
+
export const Fragment = ReactCompat.Fragment
|
|
91
|
+
export const PureComponent = ReactCompat.PureComponent
|
|
92
|
+
export const StrictMode = ReactCompat.StrictMode
|
|
93
|
+
export const Suspense = ReactCompat.Suspense
|
|
94
|
+
export const SuspenseList = ReactCompat.SuspenseList
|
|
95
|
+
export const cloneElement = ReactCompat.cloneElement
|
|
96
|
+
export const createContext = ReactCompat.createContext
|
|
97
|
+
export const createElement = ReactCompat.createElement
|
|
98
|
+
export const createFactory = ReactCompat.createFactory
|
|
99
|
+
export const createPortal = ReactCompat.createPortal
|
|
100
|
+
export const createRef = ReactCompat.createRef
|
|
101
|
+
export const findDOMNode = ReactCompat.findDOMNode
|
|
102
|
+
export const flushSync = ReactCompat.flushSync
|
|
103
|
+
export const forwardRef = ReactCompat.forwardRef
|
|
104
|
+
export const hydrate = ReactCompat.hydrate
|
|
105
|
+
export const isFragment = ReactCompat.isFragment
|
|
106
|
+
export const isMemo = ReactCompat.isMemo
|
|
107
|
+
export const isValidElement = ReactCompat.isValidElement
|
|
109
108
|
// preact's lazy returns a bare function with no react.lazy $$typeof; tag it so
|
|
110
109
|
// validation (e.g. <Link legacyBehavior>) can recognize lazy components.
|
|
111
110
|
export const lazy: typeof ReactCompat.lazy = loader => {
|
|
112
|
-
const component = ReactCompat.lazy(loader)
|
|
113
|
-
(component as unknown as Record<symbol, boolean>)[Symbol.for('pnext.lazy')] = true
|
|
114
|
-
return component
|
|
115
|
-
}
|
|
116
|
-
export const memo = ReactCompat.memo
|
|
117
|
-
export const render = ReactCompat.render
|
|
118
|
-
export const startTransition = ReactCompat.startTransition
|
|
119
|
-
export const unmountComponentAtNode = ReactCompat.unmountComponentAtNode
|
|
120
|
-
export const unstable_batchedUpdates = ReactCompat.unstable_batchedUpdates
|
|
121
|
-
export const useCallback = ReactCompat.useCallback
|
|
122
|
-
export const useContext = ReactCompat.useContext
|
|
123
|
-
export const useDebugValue = ReactCompat.useDebugValue
|
|
124
|
-
export const useDeferredValue = ReactCompat.useDeferredValue
|
|
125
|
-
export const useEffect = ReactCompat.useEffect
|
|
126
|
-
export const useId = ReactCompat.useId
|
|
127
|
-
export const useImperativeHandle = ReactCompat.useImperativeHandle
|
|
128
|
-
export const useInsertionEffect = ReactCompat.useInsertionEffect
|
|
129
|
-
export const useLayoutEffect = ReactCompat.useLayoutEffect
|
|
130
|
-
export const useMemo = ReactCompat.useMemo
|
|
131
|
-
export const useReducer = ReactCompat.useReducer
|
|
132
|
-
export const useRef = ReactCompat.useRef
|
|
133
|
-
export const useState = ReactCompat.useState
|
|
134
|
-
export const useSyncExternalStore = ReactCompat.useSyncExternalStore
|
|
135
|
-
export const version = ReactCompat.version
|
|
111
|
+
const component = ReactCompat.lazy(loader)
|
|
112
|
+
;(component as unknown as Record<symbol, boolean>)[Symbol.for('pnext.lazy')] = true
|
|
113
|
+
return component
|
|
114
|
+
}
|
|
115
|
+
export const memo = ReactCompat.memo
|
|
116
|
+
export const render = ReactCompat.render
|
|
117
|
+
export const startTransition = ReactCompat.startTransition
|
|
118
|
+
export const unmountComponentAtNode = ReactCompat.unmountComponentAtNode
|
|
119
|
+
export const unstable_batchedUpdates = ReactCompat.unstable_batchedUpdates
|
|
120
|
+
export const useCallback = ReactCompat.useCallback
|
|
121
|
+
export const useContext = ReactCompat.useContext
|
|
122
|
+
export const useDebugValue = ReactCompat.useDebugValue
|
|
123
|
+
export const useDeferredValue = ReactCompat.useDeferredValue
|
|
124
|
+
export const useEffect = ReactCompat.useEffect
|
|
125
|
+
export const useId = ReactCompat.useId
|
|
126
|
+
export const useImperativeHandle = ReactCompat.useImperativeHandle
|
|
127
|
+
export const useInsertionEffect = ReactCompat.useInsertionEffect
|
|
128
|
+
export const useLayoutEffect = ReactCompat.useLayoutEffect
|
|
129
|
+
export const useMemo = ReactCompat.useMemo
|
|
130
|
+
export const useReducer = ReactCompat.useReducer
|
|
131
|
+
export const useRef = ReactCompat.useRef
|
|
132
|
+
export const useState = ReactCompat.useState
|
|
133
|
+
export const useSyncExternalStore = ReactCompat.useSyncExternalStore
|
|
134
|
+
export const version = ReactCompat.version
|
|
@@ -41,44 +41,44 @@ export {
|
|
|
41
41
|
useActionState,
|
|
42
42
|
useOptimistic,
|
|
43
43
|
version,
|
|
44
|
-
} from './preact'
|
|
45
|
-
export { cache } from '../../api/cache'
|
|
44
|
+
} from './preact'
|
|
45
|
+
export { cache } from '../../api/cache'
|
|
46
46
|
|
|
47
|
-
import { ViewTransition, addTransitionType } from './view-transition'
|
|
48
|
-
export { ViewTransition, addTransitionType }
|
|
47
|
+
import { ViewTransition, addTransitionType } from './view-transition'
|
|
48
|
+
export { ViewTransition, addTransitionType }
|
|
49
49
|
|
|
50
|
-
import { currentPrerenderScope } from '../../ppr'
|
|
51
|
-
import { currentCacheSignal } from '../../cache
|
|
50
|
+
import { currentPrerenderScope } from '../../render/ppr'
|
|
51
|
+
import { currentCacheSignal } from '../../request/cache'
|
|
52
52
|
|
|
53
53
|
// React.cacheSignal(): the AbortSignal for the current render. During a build
|
|
54
54
|
// prerender it is the prerender scope's signal; during a request/dynamic render
|
|
55
55
|
// it is the cache scope's. Null outside any render. Slow cache components bound
|
|
56
56
|
// their polling on it (see cache-components ppr-partial-hydration).
|
|
57
57
|
export function cacheSignal(): AbortSignal | null {
|
|
58
|
-
const prerender = currentPrerenderScope()
|
|
59
|
-
if (prerender) return prerender.signal
|
|
60
|
-
return currentCacheSignal()
|
|
58
|
+
const prerender = currentPrerenderScope()
|
|
59
|
+
if (prerender) return prerender.signal
|
|
60
|
+
return currentCacheSignal()
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
import ReactCompat from './preact'
|
|
64
|
-
import { cache as serverCache } from '../../api/cache'
|
|
63
|
+
import ReactCompat from './preact'
|
|
64
|
+
import { cache as serverCache } from '../../api/cache'
|
|
65
65
|
|
|
66
66
|
const ReactServer = { ...ReactCompat } as typeof ReactCompat & {
|
|
67
|
-
cache: typeof serverCache
|
|
68
|
-
cacheSignal: typeof cacheSignal
|
|
69
|
-
}
|
|
70
|
-
delete (ReactServer as { useState?: unknown }).useState
|
|
71
|
-
delete (ReactServer as { useEffect?: unknown }).useEffect
|
|
72
|
-
delete (ReactServer as { useLayoutEffect?: unknown }).useLayoutEffect
|
|
73
|
-
delete (ReactServer as { useInsertionEffect?: unknown }).useInsertionEffect
|
|
74
|
-
delete (ReactServer as { useImperativeHandle?: unknown }).useImperativeHandle
|
|
75
|
-
delete (ReactServer as { useReducer?: unknown }).useReducer
|
|
76
|
-
delete (ReactServer as { useRef?: unknown }).useRef
|
|
77
|
-
delete (ReactServer as { useDeferredValue?: unknown }).useDeferredValue
|
|
78
|
-
delete (ReactServer as { useTransition?: unknown }).useTransition
|
|
79
|
-
delete (ReactServer as { useSyncExternalStore?: unknown }).useSyncExternalStore
|
|
80
|
-
ReactServer.cache = serverCache
|
|
81
|
-
ReactServer.cacheSignal = cacheSignal
|
|
82
|
-
Object.assign(ReactServer, { ViewTransition, addTransitionType })
|
|
67
|
+
cache: typeof serverCache
|
|
68
|
+
cacheSignal: typeof cacheSignal
|
|
69
|
+
}
|
|
70
|
+
delete (ReactServer as { useState?: unknown }).useState
|
|
71
|
+
delete (ReactServer as { useEffect?: unknown }).useEffect
|
|
72
|
+
delete (ReactServer as { useLayoutEffect?: unknown }).useLayoutEffect
|
|
73
|
+
delete (ReactServer as { useInsertionEffect?: unknown }).useInsertionEffect
|
|
74
|
+
delete (ReactServer as { useImperativeHandle?: unknown }).useImperativeHandle
|
|
75
|
+
delete (ReactServer as { useReducer?: unknown }).useReducer
|
|
76
|
+
delete (ReactServer as { useRef?: unknown }).useRef
|
|
77
|
+
delete (ReactServer as { useDeferredValue?: unknown }).useDeferredValue
|
|
78
|
+
delete (ReactServer as { useTransition?: unknown }).useTransition
|
|
79
|
+
delete (ReactServer as { useSyncExternalStore?: unknown }).useSyncExternalStore
|
|
80
|
+
ReactServer.cache = serverCache
|
|
81
|
+
ReactServer.cacheSignal = cacheSignal
|
|
82
|
+
Object.assign(ReactServer, { ViewTransition, addTransitionType })
|
|
83
83
|
|
|
84
|
-
export default ReactServer
|
|
84
|
+
export default ReactServer
|
|
@@ -15,14 +15,14 @@
|
|
|
15
15
|
// Registered onto renderExtensions.wrapServerComponentInvoke; a pure-core app keeps the pass-through
|
|
16
16
|
// default and never loads this module.
|
|
17
17
|
|
|
18
|
-
import { withUseThenableState, type UseThenableState } from './preact'
|
|
18
|
+
import { withUseThenableState, type UseThenableState } from './preact'
|
|
19
19
|
|
|
20
20
|
function isThenable(value: unknown): value is PromiseLike<unknown> {
|
|
21
21
|
return (
|
|
22
22
|
value != null &&
|
|
23
23
|
(typeof value === 'object' || typeof value === 'function') &&
|
|
24
24
|
typeof (value as PromiseLike<unknown>).then === 'function'
|
|
25
|
-
)
|
|
25
|
+
)
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
/**
|
|
@@ -31,18 +31,18 @@ function isThenable(value: unknown): value is PromiseLike<unknown> {
|
|
|
31
31
|
* thenable state; async components (and plain returns) pass through.
|
|
32
32
|
*/
|
|
33
33
|
export function invokeServerComponentWithUse<T>(invoke: () => T): T {
|
|
34
|
-
const state: UseThenableState = { thenables: [] }
|
|
34
|
+
const state: UseThenableState = { thenables: [] }
|
|
35
35
|
|
|
36
36
|
const attempt = (): T => {
|
|
37
37
|
try {
|
|
38
|
-
return withUseThenableState(state, invoke)
|
|
38
|
+
return withUseThenableState(state, invoke)
|
|
39
39
|
} catch (error) {
|
|
40
40
|
// A pending use() thenable suspends the component: await it, then replay
|
|
41
41
|
// with the same state so the settled thenable resolves in place.
|
|
42
|
-
if (isThenable(error)) return Promise.resolve(error).then(attempt, attempt) as T
|
|
43
|
-
throw error
|
|
42
|
+
if (isThenable(error)) return Promise.resolve(error).then(attempt, attempt) as T
|
|
43
|
+
throw error
|
|
44
44
|
}
|
|
45
|
-
}
|
|
45
|
+
}
|
|
46
46
|
|
|
47
|
-
return attempt()
|
|
47
|
+
return attempt()
|
|
48
48
|
}
|
|
@@ -13,46 +13,45 @@
|
|
|
13
13
|
// renderServerInsertedHTML() renders each callback's vnode to a string and concatenates it. CSS-in-JS
|
|
14
14
|
// registries clear their emitted rules per call.
|
|
15
15
|
|
|
16
|
-
import { h, Fragment } from 'preact'
|
|
17
|
-
import type { ComponentChildren, VNode } from 'preact'
|
|
18
|
-
import renderToString from 'preact-render-to-string'
|
|
16
|
+
import { h, Fragment } from 'preact'
|
|
17
|
+
import type { ComponentChildren, VNode } from 'preact'
|
|
18
|
+
import renderToString from 'preact-render-to-string'
|
|
19
19
|
|
|
20
|
-
type InsertCallback = () => ComponentChildren
|
|
20
|
+
type InsertCallback = () => ComponentChildren
|
|
21
21
|
|
|
22
22
|
interface Holder {
|
|
23
|
-
__PNEXT_SERVER_INSERTED_HTML__?: InsertCallback[]
|
|
23
|
+
__PNEXT_SERVER_INSERTED_HTML__?: InsertCallback[]
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
const collectorKey = Symbol.for('pnext.serverInsertedHTML')
|
|
27
|
-
type RequestScopeGetter = () => Record<PropertyKey, unknown> | undefined
|
|
26
|
+
const collectorKey = Symbol.for('pnext.serverInsertedHTML')
|
|
27
|
+
type RequestScopeGetter = () => Record<PropertyKey, unknown> | undefined
|
|
28
28
|
// globalThis-anchored: the prebundled server entry inlines its own copy of this module.
|
|
29
|
-
const SCOPE_GETTER_KEY = Symbol.for('pnext.serverInsertedHTMLScope')
|
|
29
|
+
const SCOPE_GETTER_KEY = Symbol.for('pnext.serverInsertedHTMLScope')
|
|
30
30
|
|
|
31
31
|
export function setServerInsertedHTMLScope(getter: RequestScopeGetter): void {
|
|
32
|
-
(globalThis as Record<PropertyKey, unknown>)[SCOPE_GETTER_KEY] = getter
|
|
32
|
+
;(globalThis as Record<PropertyKey, unknown>)[SCOPE_GETTER_KEY] = getter
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
function requestScope(): Record<PropertyKey, unknown> | undefined {
|
|
36
36
|
const getter = (globalThis as Record<PropertyKey, unknown>)[SCOPE_GETTER_KEY] as
|
|
37
|
-
|
|
|
38
|
-
|
|
39
|
-
return getter?.();
|
|
37
|
+
RequestScopeGetter | undefined
|
|
38
|
+
return getter?.()
|
|
40
39
|
}
|
|
41
40
|
|
|
42
41
|
function collector(): { callbacks: InsertCallback[]; scoped: boolean } {
|
|
43
|
-
const scope = requestScope()
|
|
42
|
+
const scope = requestScope()
|
|
44
43
|
if (scope) {
|
|
45
44
|
return {
|
|
46
45
|
callbacks: (scope[collectorKey] ??= []) as InsertCallback[],
|
|
47
46
|
scoped: true,
|
|
48
|
-
}
|
|
47
|
+
}
|
|
49
48
|
}
|
|
50
|
-
const holder = globalThis as Holder
|
|
51
|
-
holder.__PNEXT_SERVER_INSERTED_HTML__ ??= []
|
|
52
|
-
return { callbacks: holder.__PNEXT_SERVER_INSERTED_HTML__, scoped: false }
|
|
49
|
+
const holder = globalThis as Holder
|
|
50
|
+
holder.__PNEXT_SERVER_INSERTED_HTML__ ??= []
|
|
51
|
+
return { callbacks: holder.__PNEXT_SERVER_INSERTED_HTML__, scoped: false }
|
|
53
52
|
}
|
|
54
53
|
|
|
55
|
-
const isServer = typeof document === 'undefined'
|
|
54
|
+
const isServer = typeof document === 'undefined'
|
|
56
55
|
|
|
57
56
|
/**
|
|
58
57
|
* Register HTML to be inserted into the server-rendered document. The callback returns JSX (typically
|
|
@@ -60,8 +59,8 @@ const isServer = typeof document === 'undefined';
|
|
|
60
59
|
* already carries the styles and the CSS-in-JS runtime rehydrates them itself.
|
|
61
60
|
*/
|
|
62
61
|
export function useServerInsertedHTML(callback: InsertCallback): void {
|
|
63
|
-
if (!isServer) return
|
|
64
|
-
collector().callbacks.push(callback)
|
|
62
|
+
if (!isServer) return
|
|
63
|
+
collector().callbacks.push(callback)
|
|
65
64
|
}
|
|
66
65
|
|
|
67
66
|
/**
|
|
@@ -69,26 +68,26 @@ export function useServerInsertedHTML(callback: InsertCallback): void {
|
|
|
69
68
|
* for later stream flushes; the non-request fallback is cleared after one use.
|
|
70
69
|
*/
|
|
71
70
|
export function renderServerInsertedHTML(): string {
|
|
72
|
-
const { callbacks, scoped } = collector()
|
|
73
|
-
if (!scoped) (globalThis as Holder).__PNEXT_SERVER_INSERTED_HTML__ = []
|
|
74
|
-
if (callbacks.length === 0) return ''
|
|
71
|
+
const { callbacks, scoped } = collector()
|
|
72
|
+
if (!scoped) (globalThis as Holder).__PNEXT_SERVER_INSERTED_HTML__ = []
|
|
73
|
+
if (callbacks.length === 0) return ''
|
|
75
74
|
|
|
76
|
-
const parts: string[] = []
|
|
75
|
+
const parts: string[] = []
|
|
77
76
|
for (const callback of callbacks) {
|
|
78
77
|
try {
|
|
79
|
-
const node = callback()
|
|
80
|
-
if (node == null || node === false) continue
|
|
81
|
-
parts.push(renderToString(h(Fragment, null, node as VNode)))
|
|
78
|
+
const node = callback()
|
|
79
|
+
if (node == null || node === false) continue
|
|
80
|
+
parts.push(renderToString(h(Fragment, null, node as VNode)))
|
|
82
81
|
} catch {
|
|
83
82
|
// A registry that throws during flush is skipped, not fatal.
|
|
84
83
|
}
|
|
85
84
|
}
|
|
86
|
-
return parts.join('')
|
|
85
|
+
return parts.join('')
|
|
87
86
|
}
|
|
88
87
|
|
|
89
88
|
/** Discard any registered callbacks without rendering (error / reset paths). */
|
|
90
89
|
export function clearServerInsertedHTML(): void {
|
|
91
|
-
const scope = requestScope()
|
|
92
|
-
if (scope) scope[collectorKey] = []
|
|
93
|
-
else (globalThis as Holder).__PNEXT_SERVER_INSERTED_HTML__ = []
|
|
90
|
+
const scope = requestScope()
|
|
91
|
+
if (scope) scope[collectorKey] = []
|
|
92
|
+
else (globalThis as Holder).__PNEXT_SERVER_INSERTED_HTML__ = []
|
|
94
93
|
}
|