@wular/pnext 0.0.4 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -16
- package/bin/pnext +6 -1
- package/config/lint/base.js +7 -7
- package/config/ts/base.json +2 -4
- package/config/ts/react.json +2 -6
- package/package.json +23 -2
- package/reference/compat.md +87 -22
- package/reference/config.md +40 -93
- package/reference/css.md +42 -33
- package/reference/dev.md +26 -33
- package/reference/env.md +18 -20
- package/reference/getting-started.md +132 -0
- package/reference/metadata.md +31 -46
- package/reference/navigation.md +65 -105
- package/reference/performance.md +21 -142
- package/reference/rendering.md +78 -75
- package/reference/routing.md +97 -107
- package/reference/typegen.md +27 -29
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +121 -114
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +52 -53
- package/src/api/navigation.ts +59 -58
- package/src/api/server.ts +152 -144
- package/src/api/suspense.ts +4 -4
- package/src/cli/adapters/vercel-warm.ts +126 -121
- package/src/cli/adapters/vercel.ts +437 -443
- package/src/cli/analyze.ts +333 -144
- package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
- package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
- package/src/cli/build.ts +976 -978
- package/src/cli/create.ts +72 -64
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +94 -85
- package/src/cli/migrate/package-json.ts +73 -71
- package/src/cli/migrate/report.ts +32 -33
- package/src/cli/migrate/{index.ts → run.ts} +48 -49
- package/src/cli/migrate/scan.ts +46 -46
- package/src/cli/migrate/spinner.ts +9 -9
- package/src/cli/migrate/tsconfig.ts +35 -35
- package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
- package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
- package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
- package/src/cli/start.ts +65 -66
- package/src/{typegen.ts → cli/typegen.ts} +59 -59
- package/src/client/build.ts +802 -768
- package/src/client/chunk-fold.ts +245 -240
- package/src/client/{paths.ts → chunk-name.ts} +6 -6
- package/src/client/entry.ts +162 -147
- package/src/client/prebuilt.ts +231 -223
- package/src/client/profile.ts +29 -29
- package/src/client/react-compiler.ts +20 -15
- package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
- package/src/client/reference-stub.ts +51 -51
- package/src/client/reference.ts +19 -19
- package/src/{api → client}/router/events.ts +32 -17
- package/src/{api → client}/router/history.ts +16 -16
- package/src/{api → client}/router/hub.ts +52 -53
- package/src/{api/router.ts → client/router/index.ts} +61 -60
- package/src/{api → client}/router/policies.ts +24 -24
- package/src/{api → client}/router/runtime.ts +2022 -1995
- package/src/{api → client}/router/types.ts +98 -98
- package/src/compat/actions/client-plugin.ts +42 -43
- package/src/compat/actions/client-stub.ts +14 -14
- package/src/compat/actions/{action-client.ts → client.ts} +194 -193
- package/src/compat/actions/config.ts +63 -64
- package/src/compat/actions/detect.ts +68 -68
- package/src/compat/actions/discovery.ts +105 -105
- package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
- package/src/compat/actions/early-submit.ts +1 -1
- package/src/compat/actions/endpoint.ts +198 -198
- package/src/compat/actions/extensions.ts +811 -0
- package/src/compat/actions/flight.ts +23 -23
- package/src/compat/actions/form-state.ts +34 -34
- package/src/compat/actions/hoist.ts +382 -236
- package/src/compat/actions/ids.ts +7 -12
- package/src/compat/actions/index.ts +8 -8
- package/src/compat/actions/instances.ts +46 -46
- package/src/compat/actions/origin.ts +47 -48
- package/src/compat/actions/protocol.ts +22 -22
- package/src/compat/actions/registry.ts +19 -19
- package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
- package/src/compat/actions/rewrite.ts +125 -125
- package/src/compat/actions/{action-router.ts → router.ts} +10 -10
- package/src/compat/actions/serve.ts +132 -136
- package/src/compat/actions/server-tag.ts +4 -4
- package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
- package/src/compat/actions/unrecognized-error.ts +4 -4
- package/src/compat/{index.ts → aliases.ts} +112 -109
- package/src/compat/bundler/bun-externals.ts +18 -18
- package/src/compat/bundler/cjs-exports.ts +271 -223
- package/src/compat/bundler/config.ts +116 -111
- package/src/compat/bundler/externals.ts +12 -12
- package/src/compat/bundler/import-meta-url.ts +19 -19
- package/src/compat/bundler/modularize-imports.ts +36 -33
- package/src/compat/bundler/new-url-asset.ts +22 -24
- package/src/compat/bundler/optimize-package-imports.ts +111 -107
- package/src/compat/bundler/polyfill.ts +28 -28
- package/src/compat/bundler/react-compiler.ts +35 -29
- package/src/compat/bundler/react-profiler.tsx +11 -11
- package/src/compat/bundler/relay-transform.ts +48 -47
- package/src/compat/bundler/require-context.ts +119 -113
- package/src/compat/bundler/resolve-extensions.ts +19 -19
- package/src/compat/bundler/source-cache.ts +25 -25
- package/src/compat/bundler/static-imports.ts +7 -7
- package/src/compat/bundler/symlink-imports.ts +46 -46
- package/src/compat/bundler/tsconfig-paths.ts +13 -15
- package/src/compat/bundler/wasm.ts +58 -60
- package/src/compat/bundler/webpack-loaders.ts +254 -241
- package/src/compat/bundler/worker.ts +101 -104
- package/src/compat/cache/build-flags.ts +29 -29
- package/src/compat/cache/build-prerender-errors.ts +40 -44
- package/src/compat/cache/custom-handler.ts +60 -53
- package/src/compat/cache/fetch-patch.ts +240 -240
- package/src/compat/cache/handler.ts +27 -31
- package/src/compat/cache/modern-handler.ts +148 -126
- package/src/compat/cache/resume-data-cache.ts +47 -45
- package/src/compat/cache/revalidate.ts +233 -232
- package/src/compat/cache/runtime-error.ts +35 -35
- package/src/compat/cache/use-cache-transform.ts +442 -417
- package/src/compat/cache/use-cache.ts +650 -614
- package/src/compat/cache-control.ts +140 -142
- package/src/compat/client/base-path.ts +21 -20
- package/src/compat/client/css-order.ts +18 -18
- package/src/compat/client/errors/bare-boundary.ts +11 -11
- package/src/compat/client/errors/control-flow.ts +23 -23
- package/src/compat/client/errors/error-boundary.ts +61 -61
- package/src/compat/client/errors/global-error.ts +101 -91
- package/src/compat/client/errors/install.ts +71 -72
- package/src/compat/client/errors/lazy.ts +23 -23
- package/src/compat/client/errors/primitive-throw.ts +47 -45
- package/src/compat/client/errors/soft-refresh.ts +4 -4
- package/src/compat/client/link-status.ts +33 -33
- package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
- package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
- package/src/compat/client/navigation-scroll.ts +63 -63
- package/src/compat/client/optimistic-routing.ts +93 -88
- package/src/compat/client/prefetch-cache.ts +23 -24
- package/src/compat/client/route-announcer.ts +35 -35
- package/src/compat/client/segment-cache-policy.ts +20 -20
- package/src/compat/client/segment-cache.ts +309 -315
- package/src/compat/client/segment-prefetch.ts +127 -132
- package/src/compat/client/trailing-slash.ts +5 -4
- package/src/compat/css/chunking.ts +113 -116
- package/src/compat/css/inline-css.ts +21 -21
- package/src/compat/css/lightningcss.ts +37 -38
- package/src/compat/css/modules.ts +161 -175
- package/src/compat/css/nonce.ts +7 -7
- package/src/compat/css/sass-plugin.ts +18 -21
- package/src/compat/css/sass.ts +150 -152
- package/src/compat/css/styled-jsx-runtime.ts +27 -27
- package/src/compat/css/styled-jsx.ts +21 -21
- package/src/compat/edge-runtime.ts +27 -27
- package/src/compat/{adapter → export}/build-complete.ts +72 -75
- package/src/compat/export/client.ts +29 -31
- package/src/compat/export/{index.ts → emit.ts} +111 -110
- package/src/compat/export/standalone.ts +62 -54
- package/src/compat/image-optimizer/cache.ts +51 -49
- package/src/compat/image-optimizer/detect.ts +52 -52
- package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
- package/src/compat/image-optimizer/source.ts +77 -80
- package/src/compat/lifecycle/after-scope.ts +26 -26
- package/src/compat/lifecycle/after.ts +48 -45
- package/src/compat/lifecycle/error-funnel.ts +98 -102
- package/src/compat/lifecycle/error-serialize.ts +30 -26
- package/src/compat/lifecycle/error-ui.ts +67 -32
- package/src/compat/lifecycle/instrumentation-client.ts +36 -38
- package/src/compat/lifecycle/instrumentation.ts +85 -85
- package/src/compat/lifecycle/node-console.ts +11 -11
- package/src/compat/lifecycle/testmode.ts +160 -132
- package/src/compat/mdx/compile.ts +60 -57
- package/src/compat/mdx/plugin.ts +11 -11
- package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
- package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
- package/src/compat/metadata.ts +75 -81
- package/src/compat/next/cache.ts +68 -69
- package/src/compat/next/canonical-url.ts +9 -9
- package/src/compat/next/client-cache.ts +19 -19
- package/src/compat/next/client-navigation.ts +112 -116
- package/src/compat/next/client-only.ts +1 -1
- package/src/compat/next/client-script.tsx +99 -93
- package/src/compat/next/client-server.ts +10 -10
- package/src/compat/next/config-loader.ts +176 -173
- package/src/compat/next/config.ts +7 -7
- package/src/compat/next/constants.cjs +6 -6
- package/src/compat/next/constants.ts +6 -6
- package/src/compat/next/custom-server.ts +26 -24
- package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
- package/src/compat/next/dynamic.tsx +21 -18
- package/src/compat/next/error.tsx +52 -52
- package/src/compat/next/font/cache.ts +74 -74
- package/src/compat/next/font/google.ts +2 -2
- package/src/compat/next/font/index.ts +1 -1
- package/src/compat/next/font/local.ts +3 -3
- package/src/compat/next/font/runtime-client.ts +17 -15
- package/src/compat/next/font/runtime.ts +443 -408
- package/src/compat/next/font/shared.ts +120 -108
- package/src/compat/next/form.tsx +63 -63
- package/src/compat/next/head.tsx +2 -2
- package/src/compat/next/headers.ts +103 -95
- package/src/compat/next/image/client.tsx +220 -0
- package/src/compat/next/image/config.ts +56 -58
- package/src/compat/next/image/optimizer.ts +40 -36
- package/src/compat/next/image/patterns.ts +37 -40
- package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
- package/src/compat/next/image/shared.ts +65 -57
- package/src/compat/next/image/static-metadata.ts +98 -107
- package/src/compat/next/image/validate.ts +79 -88
- package/src/compat/next/image.tsx +19 -23
- package/src/compat/next/index.ts +1 -1
- package/src/compat/next/legacy-image.tsx +59 -60
- package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
- package/src/compat/next/link.tsx +158 -158
- package/src/compat/next/navigation.cjs +12 -3
- package/src/compat/next/navigation.ts +48 -50
- package/src/compat/next/offline.ts +27 -27
- package/src/compat/next/og.ts +121 -124
- package/src/compat/next/preferred-region.ts +13 -14
- package/src/compat/next/redirects.ts +58 -56
- package/src/compat/next/resource-hints.ts +73 -76
- package/src/compat/next/rewrites.ts +130 -133
- package/src/compat/next/root-params.ts +45 -45
- package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
- package/src/compat/next/router.cjs +4 -2
- package/src/compat/next/router.ts +58 -61
- package/src/compat/next/script.tsx +108 -108
- package/src/compat/next/server-only.ts +1 -1
- package/src/compat/next/server.ts +19 -19
- package/src/compat/next/svgr.ts +18 -17
- package/src/compat/next/telemetry.ts +24 -24
- package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
- package/src/compat/next/user-agent.ts +53 -49
- package/src/compat/next/web-vitals.ts +22 -24
- package/src/compat/otel/api.ts +41 -41
- package/src/compat/otel/client-trace-metadata.ts +25 -27
- package/src/compat/otel/fetch-span.ts +29 -29
- package/src/compat/otel/tracer.ts +331 -331
- package/src/compat/pages/api.ts +456 -0
- package/src/compat/pages/client-plugin.ts +36 -36
- package/src/compat/pages/router-state.ts +34 -34
- package/src/compat/pages/{index.ts → router.ts} +130 -135
- package/src/compat/ppr/io.ts +12 -12
- package/src/compat/ppr/missing-root-params.ts +34 -38
- package/src/compat/ppr/root-params-scan.ts +66 -66
- package/src/compat/ppr/root-params-transform.ts +24 -26
- package/src/compat/ppr/root-params.ts +30 -30
- package/src/compat/ppr/segment-config-incompat.ts +6 -7
- package/src/compat/protocol.ts +71 -70
- package/src/compat/react/action-state.ts +47 -48
- package/src/compat/react/client-lite.ts +15 -15
- package/src/compat/react/client.ts +4 -4
- package/src/compat/react/compiler-runtime.ts +11 -11
- package/src/compat/react/dom-client.ts +44 -44
- package/src/compat/react/dom-react-server.ts +10 -16
- package/src/compat/react/dom-server.ts +10 -10
- package/src/compat/react/dom.ts +52 -52
- package/src/compat/react/hooks-extra.ts +34 -35
- package/src/compat/react/parity.ts +64 -61
- package/src/compat/react/preact.ts +81 -82
- package/src/compat/react/react-server.ts +28 -28
- package/src/compat/react/router-shim.ts +1 -1
- package/src/compat/react/server-component-use.ts +8 -8
- package/src/compat/react/server-inserted-html.ts +30 -31
- package/src/compat/react/server.ts +53 -55
- package/src/compat/react/use.ts +32 -32
- package/src/compat/react/view-transition.ts +20 -20
- package/src/compat/register/actions.ts +35 -824
- package/src/compat/register/boot.ts +41 -41
- package/src/compat/register/build-tier.ts +5 -5
- package/src/compat/register/build.ts +74 -70
- package/src/compat/register/bundler.ts +161 -156
- package/src/compat/register/cache.ts +20 -20
- package/src/compat/register/client-errors.ts +3 -3
- package/src/compat/register/config.ts +6 -6
- package/src/compat/register/css-extras.ts +30 -34
- package/src/compat/register/edge-runtime.ts +3 -3
- package/src/compat/register/errors.ts +10 -12
- package/src/compat/register/export.ts +16 -16
- package/src/compat/register/font.ts +11 -11
- package/src/compat/register/hooks.ts +2 -2
- package/src/compat/register/image.ts +40 -40
- package/src/compat/register/index.ts +59 -62
- package/src/compat/register/instrumentation-client.ts +10 -10
- package/src/compat/register/lifecycle.ts +25 -28
- package/src/compat/register/mdx.ts +10 -10
- package/src/compat/register/middleware.ts +226 -16
- package/src/compat/register/otel.ts +80 -88
- package/src/compat/register/pages-api.ts +10 -463
- package/src/compat/register/ppr.ts +16 -16
- package/src/compat/register/protocol.ts +17 -18
- package/src/compat/register/proxy.ts +49 -51
- package/src/compat/register/render.ts +79 -76
- package/src/compat/register/routing.ts +162 -159
- package/src/compat/register/segment.ts +24 -1897
- package/src/compat/register/static-image.ts +3 -3
- package/src/compat/register/{misc.ts → taint.ts} +9 -9
- package/src/compat/register/typed-routes.ts +14 -14
- package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
- package/src/compat/register/validation.ts +18 -18
- package/src/compat/segment/loading-boundary.ts +43 -45
- package/src/compat/segment/page-slot.ts +69 -69
- package/src/compat/segment/serve.ts +1884 -0
- package/src/compat/segment/tree.ts +113 -112
- package/src/compat/segment/vary-key.ts +38 -38
- package/src/compat/segment/vary-params.ts +138 -142
- package/src/compat/static-params.ts +14 -12
- package/src/compat/tsconfig-defaults.ts +87 -91
- package/src/compat/typecheck/{index.ts → check.ts} +234 -212
- package/src/compat/typecheck/worker.ts +15 -12
- package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
- package/src/compat/typed-routes/manifest.ts +174 -170
- package/src/compat/typed-routes/typegen.ts +127 -110
- package/src/compat/validation/errors.ts +16 -19
- package/src/compat/validation/prerender-diagnostics.ts +521 -504
- package/src/compat/validation/{index.ts → validate.ts} +647 -648
- package/src/compat-bootstrap.ts +16 -16
- package/src/config.ts +86 -69
- package/src/css/build.ts +230 -227
- package/src/css/postcss.ts +79 -80
- package/src/css/worker.ts +14 -15
- package/src/dev/client-actions.ts +10 -10
- package/src/dev/client-chunk-store.ts +27 -27
- package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
- package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
- package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
- package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
- package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
- package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
- package/src/dev/server.ts +804 -820
- package/src/env.ts +46 -43
- package/src/extensions.ts +491 -478
- package/src/index.ts +8 -8
- package/src/internal.ts +20 -23
- package/src/{islands → render}/boundary-error.ts +3 -3
- package/src/render/hooks.ts +71 -71
- package/src/render/island-context.ts +14 -14
- package/src/render/metadata.ts +310 -310
- package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
- package/src/{ppr.ts → render/ppr.ts} +244 -245
- package/src/render/renderer.ts +2087 -2082
- package/src/render/resource-hints.ts +16 -17
- package/src/render/slots.tsx +224 -235
- package/src/{islands → render}/static-children.ts +9 -12
- package/src/{islands → render}/static-slots.ts +37 -37
- package/src/{cache/context.ts → request/cache.ts} +20 -20
- package/src/request/context.ts +107 -107
- package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
- package/src/resolve/engine.ts +90 -77
- package/src/resolve/imports.ts +475 -463
- package/src/resolve/scan-facts.ts +318 -296
- package/src/resolve/source-text.ts +37 -37
- package/src/{dynamic → resolve}/tree-shake.ts +132 -128
- package/src/routing/forwarded.ts +19 -19
- package/src/routing/handler.ts +84 -91
- package/src/routing/href.ts +87 -70
- package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
- package/src/{proxy.ts → routing/proxy.ts} +306 -312
- package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
- package/src/routing/routes.ts +827 -815
- package/src/routing/slots.ts +164 -160
- package/src/runtime/loader.ts +954 -0
- package/src/{dev → runtime}/module-cache.ts +309 -287
- package/src/{dev → runtime}/module-generations.ts +9 -9
- package/src/{dev → runtime}/module-transform.ts +81 -72
- package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
- package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
- package/src/runtime/vendor.ts +428 -406
- package/src/styles.d.ts +9 -0
- package/src/types.ts +324 -335
- package/src/utils/ansi.ts +5 -5
- package/src/utils/{source.ts → code.ts} +15 -12
- package/src/utils/content-type.ts +3 -3
- package/src/utils/decode.ts +2 -2
- package/src/utils/dev-profile.ts +13 -13
- package/src/utils/error-log.ts +6 -6
- package/src/utils/esbuild.ts +18 -18
- package/src/utils/fs-cache.ts +13 -13
- package/src/utils/fs.ts +57 -49
- package/src/utils/html.ts +20 -24
- package/src/utils/native-require.ts +8 -8
- package/src/utils/serialize.ts +139 -146
- package/src/utils/verbose.ts +18 -18
- package/reference/overview.md +0 -35
- package/src/cli/analyze-print.ts +0 -181
- package/src/compat/middleware/manifest.ts +0 -210
- package/src/compat/next/image-client.tsx +0 -215
- package/src/compat/next/link-usage.ts +0 -29
- package/src/css/index.ts +0 -2
- package/src/render/index.ts +0 -1
- package/src/style-modules.d.ts +0 -9
package/src/compat/protocol.ts
CHANGED
|
@@ -11,14 +11,10 @@
|
|
|
11
11
|
// Core owns the generic "merge, do not overwrite" discipline; compat owns the exact Next header
|
|
12
12
|
// names and values. A pure-core app registers none of this.
|
|
13
13
|
|
|
14
|
-
import type { ResolvedConfig } from '../config'
|
|
15
|
-
import { getWorkUnit, type WorkUnit } from '../request/context'
|
|
16
|
-
import type {
|
|
17
|
-
|
|
18
|
-
ResponseFinalizer,
|
|
19
|
-
ResponseFinalizerContext,
|
|
20
|
-
} from '../extensions';
|
|
21
|
-
import { nextCompatEnabled } from '../compat';
|
|
14
|
+
import type { ResolvedConfig } from '../config'
|
|
15
|
+
import { getWorkUnit, type WorkUnit } from '../request/context'
|
|
16
|
+
import type { RequestInterceptor, ResponseFinalizer, ResponseFinalizerContext } from '../extensions'
|
|
17
|
+
import { nextCompatEnabled } from '../compat/aliases'
|
|
22
18
|
|
|
23
19
|
// Next's router vary tokens appended to every app-router response so a CDN
|
|
24
20
|
// keys its cache on the RSC negotiation headers. Order + spelling match Next.
|
|
@@ -27,20 +23,20 @@ const ROUTER_VARY = [
|
|
|
27
23
|
'next-router-state-tree',
|
|
28
24
|
'next-router-prefetch',
|
|
29
25
|
'next-router-segment-prefetch',
|
|
30
|
-
]
|
|
26
|
+
]
|
|
31
27
|
|
|
32
28
|
/** Rewrite tracking recorded per request by the compat rewrite interceptor. */
|
|
33
29
|
interface RewriteInfo {
|
|
34
30
|
/** Destination pathname, only when it differs from the requested one. */
|
|
35
|
-
path?: string
|
|
31
|
+
path?: string
|
|
36
32
|
/** Destination query (without leading `?`), only when non-empty. */
|
|
37
|
-
query?: string
|
|
33
|
+
query?: string
|
|
38
34
|
}
|
|
39
35
|
|
|
40
36
|
// Keyed on the request's work unit (stable for the whole response lifecycle);
|
|
41
37
|
// the interceptor writes it, the finalizer reads it. A WeakMap so completed
|
|
42
38
|
// requests are collected without any explicit teardown.
|
|
43
|
-
const rewrites = new WeakMap<WorkUnit, RewriteInfo>()
|
|
39
|
+
const rewrites = new WeakMap<WorkUnit, RewriteInfo>()
|
|
44
40
|
|
|
45
41
|
/**
|
|
46
42
|
* Record that a compat rewrite changed the request URL from `from` to `to`.
|
|
@@ -48,66 +44,71 @@ const rewrites = new WeakMap<WorkUnit, RewriteInfo>();
|
|
|
48
44
|
* no-op outside a request work unit or when the URL did not actually change.
|
|
49
45
|
*/
|
|
50
46
|
export function recordRewrite(from: URL, to: URL): void {
|
|
51
|
-
const unit = getWorkUnit()
|
|
52
|
-
if (!unit) return
|
|
53
|
-
if (from.pathname === to.pathname && from.search === to.search) return
|
|
54
|
-
const query = to.search.replace(/^\?/, '')
|
|
47
|
+
const unit = getWorkUnit()
|
|
48
|
+
if (!unit) return
|
|
49
|
+
if (from.pathname === to.pathname && from.search === to.search) return
|
|
50
|
+
const query = to.search.replace(/^\?/, '')
|
|
55
51
|
// Next reports the path header only when the pathname actually changed, and
|
|
56
52
|
// the query header only when the destination carries a query (a query-only
|
|
57
53
|
// rewrite reports query alone; a path-only rewrite reports path alone).
|
|
58
54
|
rewrites.set(unit, {
|
|
59
55
|
...(to.pathname !== from.pathname ? { path: to.pathname } : {}),
|
|
60
56
|
...(query ? { query } : {}),
|
|
61
|
-
})
|
|
57
|
+
})
|
|
62
58
|
}
|
|
63
59
|
|
|
64
60
|
/**
|
|
65
61
|
* Internal marker set by the segment responder's `_rsc` cache-busting 307 so
|
|
66
62
|
* this module's redirect normalization leaves it alone. Never reaches a client.
|
|
67
63
|
*/
|
|
68
|
-
export const CACHE_BUSTING_REDIRECT_HEADER = 'x-pnext-cache-bust'
|
|
64
|
+
export const CACHE_BUSTING_REDIRECT_HEADER = 'x-pnext-cache-bust'
|
|
69
65
|
|
|
70
66
|
const APP_ROUTE_KINDS = new Set<ResponseFinalizerContext['routeKind']>([
|
|
71
67
|
'html',
|
|
72
68
|
'data',
|
|
73
69
|
'route-handler',
|
|
74
|
-
])
|
|
70
|
+
])
|
|
75
71
|
|
|
76
72
|
const protocolFinalizer: ResponseFinalizer = ctx => {
|
|
77
|
-
if (!APP_ROUTE_KINDS.has(ctx.routeKind)) return
|
|
78
|
-
mergeVary(ctx.headers, ROUTER_VARY)
|
|
79
|
-
normalizeRscRedirectStatus(ctx)
|
|
80
|
-
applyRewrittenHeaders(ctx)
|
|
81
|
-
applyEdgeRuntimeHeader(ctx)
|
|
82
|
-
}
|
|
73
|
+
if (!APP_ROUTE_KINDS.has(ctx.routeKind)) return
|
|
74
|
+
mergeVary(ctx.headers, ROUTER_VARY)
|
|
75
|
+
normalizeRscRedirectStatus(ctx)
|
|
76
|
+
applyRewrittenHeaders(ctx)
|
|
77
|
+
applyEdgeRuntimeHeader(ctx)
|
|
78
|
+
}
|
|
83
79
|
|
|
84
80
|
// Next's edge SSR/route wrappers stamp `x-edge-runtime: 1` on every response
|
|
85
81
|
// from a route whose segment config selects the edge runtime (edge-ssr-app.ts).
|
|
86
82
|
// The matched route's runtime rides on the work-unit response hints.
|
|
87
83
|
function applyEdgeRuntimeHeader(ctx: ResponseFinalizerContext): void {
|
|
88
|
-
const runtime = ctx.hints?.runtime
|
|
84
|
+
const runtime = ctx.hints?.runtime
|
|
89
85
|
if (runtime === 'edge' || runtime === 'experimental-edge') {
|
|
90
|
-
ctx.headers.set('x-edge-runtime', '1')
|
|
86
|
+
ctx.headers.set('x-edge-runtime', '1')
|
|
91
87
|
}
|
|
92
88
|
}
|
|
93
89
|
|
|
94
90
|
// Append `values` to the response's Vary header, preserving any existing tokens
|
|
95
91
|
// (user- or middleware-set) and never duplicating (case-insensitive).
|
|
96
92
|
function mergeVary(headers: Headers, values: readonly string[]): void {
|
|
97
|
-
const existing = headers.get('vary')
|
|
93
|
+
const existing = headers.get('vary')
|
|
98
94
|
const present = new Set(
|
|
99
95
|
(existing ?? '')
|
|
100
96
|
.split(',')
|
|
101
97
|
.map(token => token.trim().toLowerCase())
|
|
102
98
|
.filter(Boolean),
|
|
103
|
-
)
|
|
104
|
-
const merged = existing
|
|
99
|
+
)
|
|
100
|
+
const merged = existing
|
|
101
|
+
? existing
|
|
102
|
+
.split(',')
|
|
103
|
+
.map(token => token.trim())
|
|
104
|
+
.filter(Boolean)
|
|
105
|
+
: []
|
|
105
106
|
for (const value of values) {
|
|
106
|
-
if (present.has(value.toLowerCase())) continue
|
|
107
|
-
present.add(value.toLowerCase())
|
|
108
|
-
merged.push(value)
|
|
107
|
+
if (present.has(value.toLowerCase())) continue
|
|
108
|
+
present.add(value.toLowerCase())
|
|
109
|
+
merged.push(value)
|
|
109
110
|
}
|
|
110
|
-
if (merged.length > 0) headers.set('vary', merged.join(', '))
|
|
111
|
+
if (merged.length > 0) headers.set('vary', merged.join(', '))
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
// Emit x-nextjs-rewritten-path/query when a compat rewrite changed this
|
|
@@ -116,13 +117,13 @@ function mergeVary(headers: Headers, values: readonly string[]): void {
|
|
|
116
117
|
// them. Each header is set only when the rewrite recorded that part. Absent on
|
|
117
118
|
// non-rewritten responses (the WeakMap has no entry).
|
|
118
119
|
function applyRewrittenHeaders(ctx: ResponseFinalizerContext): void {
|
|
119
|
-
if (ctx.request.headers.get('rsc') !== '1') return
|
|
120
|
-
const unit = getWorkUnit()
|
|
121
|
-
if (!unit) return
|
|
122
|
-
const info = rewrites.get(unit)
|
|
123
|
-
if (!info) return
|
|
124
|
-
if (info.path !== undefined) ctx.headers.set('x-nextjs-rewritten-path', info.path)
|
|
125
|
-
if (info.query !== undefined) ctx.headers.set('x-nextjs-rewritten-query', info.query)
|
|
120
|
+
if (ctx.request.headers.get('rsc') !== '1') return
|
|
121
|
+
const unit = getWorkUnit()
|
|
122
|
+
if (!unit) return
|
|
123
|
+
const info = rewrites.get(unit)
|
|
124
|
+
if (!info) return
|
|
125
|
+
if (info.path !== undefined) ctx.headers.set('x-nextjs-rewritten-path', info.path)
|
|
126
|
+
if (info.query !== undefined) ctx.headers.set('x-nextjs-rewritten-query', info.query)
|
|
126
127
|
}
|
|
127
128
|
|
|
128
129
|
function normalizeRscRedirectStatus(ctx: ResponseFinalizerContext): void {
|
|
@@ -130,19 +131,19 @@ function normalizeRscRedirectStatus(ctx: ResponseFinalizerContext): void {
|
|
|
130
131
|
// an app redirect(): Next sends it as a real 307 that every client follows,
|
|
131
132
|
// so it must survive this normalization. The marker is internal — strip it.
|
|
132
133
|
if (ctx.headers.has(CACHE_BUSTING_REDIRECT_HEADER)) {
|
|
133
|
-
ctx.headers.delete(CACHE_BUSTING_REDIRECT_HEADER)
|
|
134
|
-
return
|
|
134
|
+
ctx.headers.delete(CACHE_BUSTING_REDIRECT_HEADER)
|
|
135
|
+
return
|
|
135
136
|
}
|
|
136
|
-
if (ctx.routeKind !== 'html') return
|
|
137
|
-
if (ctx.request.headers.get('rsc') !== '1') return
|
|
137
|
+
if (ctx.routeKind !== 'html') return
|
|
138
|
+
if (ctx.request.headers.get('rsc') !== '1') return
|
|
138
139
|
// pnext's own soft-nav client sends rsc:1 but follows real redirects via
|
|
139
140
|
// fetch (it reads response.url as the final URL); rewriting 307/308 to 200
|
|
140
141
|
// would strand it on the source URL. The 200+Location wire form is only
|
|
141
142
|
// meaningful to Next's client, which never sends x-pnext-soft-nav.
|
|
142
|
-
if (ctx.request.headers.has('x-pnext-soft-nav')) return
|
|
143
|
-
if (!ctx.headers.has('location')) return
|
|
144
|
-
if (ctx.status !== 307 && ctx.status !== 308) return
|
|
145
|
-
ctx.status = 200
|
|
143
|
+
if (ctx.request.headers.has('x-pnext-soft-nav')) return
|
|
144
|
+
if (!ctx.headers.has('location')) return
|
|
145
|
+
if (ctx.status !== 307 && ctx.status !== 308) return
|
|
146
|
+
ctx.status = 200
|
|
146
147
|
}
|
|
147
148
|
|
|
148
149
|
// next-router-state-tree validation (Next's parseAndValidateFlightRouterState).
|
|
@@ -154,49 +155,49 @@ function normalizeRscRedirectStatus(ctx: ResponseFinalizerContext): void {
|
|
|
154
155
|
// rejected. Anything Next's own client can send passes untouched.
|
|
155
156
|
|
|
156
157
|
function isValidFlightRouterState(value: unknown): boolean {
|
|
157
|
-
if (!Array.isArray(value)) return false
|
|
158
|
-
const [segment, parallelRoutes] = value as unknown[]
|
|
159
|
-
if (typeof segment !== 'string' && !Array.isArray(segment)) return false
|
|
160
|
-
if (typeof parallelRoutes !== 'object' || parallelRoutes === null) return false
|
|
161
|
-
if (Array.isArray(parallelRoutes)) return false
|
|
162
|
-
return Object.values(parallelRoutes as Record<string, unknown>).every(isValidFlightRouterState)
|
|
158
|
+
if (!Array.isArray(value)) return false
|
|
159
|
+
const [segment, parallelRoutes] = value as unknown[]
|
|
160
|
+
if (typeof segment !== 'string' && !Array.isArray(segment)) return false
|
|
161
|
+
if (typeof parallelRoutes !== 'object' || parallelRoutes === null) return false
|
|
162
|
+
if (Array.isArray(parallelRoutes)) return false
|
|
163
|
+
return Object.values(parallelRoutes as Record<string, unknown>).every(isValidFlightRouterState)
|
|
163
164
|
}
|
|
164
165
|
|
|
165
166
|
const routerStateTreeInterceptor: RequestInterceptor = request =>
|
|
166
|
-
Promise.resolve(validateRouterStateTree(request))
|
|
167
|
+
Promise.resolve(validateRouterStateTree(request))
|
|
167
168
|
|
|
168
169
|
function validateRouterStateTree(request: Request): Response | undefined {
|
|
169
|
-
if (request.headers.get('rsc') !== '1') return undefined
|
|
170
|
+
if (request.headers.get('rsc') !== '1') return undefined
|
|
170
171
|
// pnext's own client mirrors its richer nav-state object into this header for
|
|
171
|
-
// wire compat (
|
|
172
|
+
// wire compat (client/router/index.ts); that object is not a FlightRouterState and is
|
|
172
173
|
// never what this check is about.
|
|
173
|
-
if (request.headers.has('x-pnext-soft-nav')) return undefined
|
|
174
|
-
const header = request.headers.get('next-router-state-tree')
|
|
175
|
-
if (header === null) return undefined
|
|
174
|
+
if (request.headers.has('x-pnext-soft-nav')) return undefined
|
|
175
|
+
const header = request.headers.get('next-router-state-tree')
|
|
176
|
+
if (header === null) return undefined
|
|
176
177
|
|
|
177
|
-
let tree: unknown
|
|
178
|
+
let tree: unknown
|
|
178
179
|
try {
|
|
179
|
-
tree = JSON.parse(decodeURIComponent(header))
|
|
180
|
+
tree = JSON.parse(decodeURIComponent(header))
|
|
180
181
|
} catch {
|
|
181
182
|
try {
|
|
182
|
-
tree = JSON.parse(header)
|
|
183
|
+
tree = JSON.parse(header)
|
|
183
184
|
} catch {
|
|
184
|
-
return new Response('Internal Server Error', { status: 500 })
|
|
185
|
+
return new Response('Internal Server Error', { status: 500 })
|
|
185
186
|
}
|
|
186
187
|
}
|
|
187
188
|
return isValidFlightRouterState(tree)
|
|
188
189
|
? undefined
|
|
189
|
-
: new Response('Internal Server Error', { status: 500 })
|
|
190
|
+
: new Response('Internal Server Error', { status: 500 })
|
|
190
191
|
}
|
|
191
192
|
|
|
192
193
|
/** The compat request interceptors this module owns, gated on compat.next. */
|
|
193
194
|
export function protocolInterceptors(config: ResolvedConfig): RequestInterceptor[] {
|
|
194
|
-
if (!nextCompatEnabled(config)) return []
|
|
195
|
-
return [routerStateTreeInterceptor]
|
|
195
|
+
if (!nextCompatEnabled(config)) return []
|
|
196
|
+
return [routerStateTreeInterceptor]
|
|
196
197
|
}
|
|
197
198
|
|
|
198
199
|
/** The compat protocol finalizers, gated on compat.next. */
|
|
199
200
|
export function protocolFinalizers(config: ResolvedConfig): ResponseFinalizer[] {
|
|
200
|
-
if (!nextCompatEnabled(config)) return []
|
|
201
|
-
return [protocolFinalizer]
|
|
201
|
+
if (!nextCompatEnabled(config)) return []
|
|
202
|
+
return [protocolFinalizer]
|
|
202
203
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { useCallback, useRef, useState } from 'preact/hooks'
|
|
2
|
-
import { hooksUsable } from './hooks-extra'
|
|
1
|
+
import { useCallback, useRef, useState } from 'preact/hooks'
|
|
2
|
+
import { hooksUsable } from './hooks-extra'
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* React 19's useActionState, on preact hooks. Returns [state, dispatch, isPending]; dispatch(payload)
|
|
@@ -21,25 +21,25 @@ export function useActionState<State, Payload = FormData>(
|
|
|
21
21
|
// <form action={dispatch}>.
|
|
22
22
|
if (!hooksUsable()) {
|
|
23
23
|
const staticInitial = (consumeActionStateOverride() ?? { value: initialState })
|
|
24
|
-
.value as Awaited<State
|
|
24
|
+
.value as Awaited<State>
|
|
25
25
|
const staticDispatch = (payload: Payload) =>
|
|
26
|
-
void Promise.resolve(action(staticInitial, payload))
|
|
27
|
-
tagFormStateDispatch(staticDispatch, action, staticInitial, _permalink)
|
|
28
|
-
return [staticInitial, staticDispatch, false]
|
|
26
|
+
void Promise.resolve(action(staticInitial, payload))
|
|
27
|
+
tagFormStateDispatch(staticDispatch, action, staticInitial, _permalink)
|
|
28
|
+
return [staticInitial, staticDispatch, false]
|
|
29
29
|
}
|
|
30
|
-
const initialRef = useRef<{ value: Awaited<State> } | null>(null)
|
|
30
|
+
const initialRef = useRef<{ value: Awaited<State> } | null>(null)
|
|
31
31
|
if (!initialRef.current) {
|
|
32
32
|
// A progressive (no-JS) submission re-renders the page with the action's
|
|
33
33
|
// result as the form state; the server (and the inline hydration script)
|
|
34
34
|
// publish it via a consumed-once global override.
|
|
35
35
|
initialRef.current = {
|
|
36
36
|
value: (consumeActionStateOverride() ?? { value: initialState }).value as Awaited<State>,
|
|
37
|
-
}
|
|
37
|
+
}
|
|
38
38
|
}
|
|
39
|
-
const [state, setState] = useState<Awaited<State>>(initialRef.current.value)
|
|
40
|
-
const [pending, setPending] = useState(0)
|
|
41
|
-
const lastSettled = useRef<Awaited<State>>(initialRef.current.value)
|
|
42
|
-
const chain = useRef<Promise<unknown>>(Promise.resolve())
|
|
39
|
+
const [state, setState] = useState<Awaited<State>>(initialRef.current.value)
|
|
40
|
+
const [pending, setPending] = useState(0)
|
|
41
|
+
const lastSettled = useRef<Awaited<State>>(initialRef.current.value)
|
|
42
|
+
const chain = useRef<Promise<unknown>>(Promise.resolve())
|
|
43
43
|
// A rejected action must surface to the nearest error boundary during an actual preact render (only
|
|
44
44
|
// diff() wraps component calls in the getDerivedStateFromError/componentDidCatch try/catch).
|
|
45
45
|
// preact/hooks' setState invokes a functional updater EAGERLY at call time, to bail out on an unchanged
|
|
@@ -47,55 +47,55 @@ export function useActionState<State, Payload = FormData>(
|
|
|
47
47
|
// async .catch handler throws immediately in that microtask, outside any render call stack and outside
|
|
48
48
|
// any try/catch, producing an unhandled rejection instead of reaching the boundary. Stash the error in
|
|
49
49
|
// a ref and force a re-render instead; the throw then happens inside this hook's own render call.
|
|
50
|
-
const pendingError = useRef<{ error: unknown } | null>(null)
|
|
51
|
-
const [, forceRender] = useState(0)
|
|
50
|
+
const pendingError = useRef<{ error: unknown } | null>(null)
|
|
51
|
+
const [, forceRender] = useState(0)
|
|
52
52
|
|
|
53
53
|
const dispatch = useCallback(
|
|
54
54
|
(payload: Payload) => {
|
|
55
|
-
setPending(count => count + 1)
|
|
55
|
+
setPending(count => count + 1)
|
|
56
56
|
// Chain in dispatch order against the latest settled state. A rejected
|
|
57
57
|
// action leaves the previous state in place (matching React, where the
|
|
58
58
|
// error propagates to the nearest error boundary via the transition) and
|
|
59
59
|
// must not poison the queue for later dispatches.
|
|
60
60
|
chain.current = chain.current.then(async () => {
|
|
61
61
|
try {
|
|
62
|
-
const redirectsBefore = actionRedirectCount()
|
|
63
|
-
const next =
|
|
62
|
+
const redirectsBefore = actionRedirectCount()
|
|
63
|
+
const next = await action(lastSettled.current, payload)
|
|
64
64
|
// A redirect renders the destination's initial form state even when
|
|
65
65
|
// the shared layout island itself survives the navigation.
|
|
66
66
|
if (next === undefined && actionRedirectCount() !== redirectsBefore) {
|
|
67
|
-
lastSettled.current = initialRef.current!.value
|
|
68
|
-
setState(() => initialRef.current!.value)
|
|
69
|
-
return
|
|
67
|
+
lastSettled.current = initialRef.current!.value
|
|
68
|
+
setState(() => initialRef.current!.value)
|
|
69
|
+
return
|
|
70
70
|
}
|
|
71
|
-
lastSettled.current = next
|
|
72
|
-
setState(() => next)
|
|
71
|
+
lastSettled.current = next
|
|
72
|
+
setState(() => next)
|
|
73
73
|
} finally {
|
|
74
|
-
setPending(count => count - 1)
|
|
74
|
+
setPending(count => count - 1)
|
|
75
75
|
}
|
|
76
|
-
})
|
|
76
|
+
})
|
|
77
77
|
// React propagates action errors to the nearest error boundary (they
|
|
78
78
|
// are not catchable at the dispatch site). Stash it and force a render:
|
|
79
79
|
// a class error boundary in the tree catches the throw below; without
|
|
80
80
|
// one the uncaught render error reaches the window 'error' event, where
|
|
81
81
|
// the compat entry's error.js overlay picks it up.
|
|
82
82
|
chain.current = chain.current.catch(error => {
|
|
83
|
-
if (!process.browser && typeof window === 'undefined') return
|
|
84
|
-
pendingError.current = { error }
|
|
85
|
-
forceRender(count => count + 1)
|
|
86
|
-
})
|
|
83
|
+
if (!process.browser && typeof window === 'undefined') return
|
|
84
|
+
pendingError.current = { error }
|
|
85
|
+
forceRender(count => count + 1)
|
|
86
|
+
})
|
|
87
87
|
},
|
|
88
88
|
[action],
|
|
89
|
-
)
|
|
89
|
+
)
|
|
90
90
|
|
|
91
91
|
if (pendingError.current) {
|
|
92
|
-
const { error } = pendingError.current
|
|
93
|
-
pendingError.current = null
|
|
94
|
-
throw error
|
|
92
|
+
const { error } = pendingError.current
|
|
93
|
+
pendingError.current = null
|
|
94
|
+
throw error
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
tagFormStateDispatch(dispatch, action, state, _permalink)
|
|
98
|
-
return [state, dispatch, pending > 0]
|
|
97
|
+
tagFormStateDispatch(dispatch, action, state, _permalink)
|
|
98
|
+
return [state, dispatch, pending > 0]
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
/**
|
|
@@ -106,9 +106,9 @@ export function useActionState<State, Payload = FormData>(
|
|
|
106
106
|
* optional permalink target.
|
|
107
107
|
*/
|
|
108
108
|
export interface FormStateDispatchMeta {
|
|
109
|
-
action: (state: never, payload: never) => unknown
|
|
110
|
-
state: unknown
|
|
111
|
-
permalink?: string
|
|
109
|
+
action: (state: never, payload: never) => unknown
|
|
110
|
+
state: unknown
|
|
111
|
+
permalink?: string
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
function tagFormStateDispatch(
|
|
@@ -117,11 +117,11 @@ function tagFormStateDispatch(
|
|
|
117
117
|
state: unknown,
|
|
118
118
|
permalink?: string,
|
|
119
119
|
) {
|
|
120
|
-
(dispatch as unknown as { $$pnextFormState?: FormStateDispatchMeta }).$$pnextFormState = {
|
|
120
|
+
;(dispatch as unknown as { $$pnextFormState?: FormStateDispatchMeta }).$$pnextFormState = {
|
|
121
121
|
action: action,
|
|
122
122
|
state,
|
|
123
123
|
...(permalink !== undefined ? { permalink } : {}),
|
|
124
|
-
}
|
|
124
|
+
}
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
/**
|
|
@@ -131,13 +131,13 @@ function tagFormStateDispatch(
|
|
|
131
131
|
*/
|
|
132
132
|
/** Redirect counter the action-client runtime bumps (see markActionRedirected). */
|
|
133
133
|
function actionRedirectCount(): number {
|
|
134
|
-
return (globalThis as { __pnextActionRedirects?: number }).__pnextActionRedirects ?? 0
|
|
134
|
+
return (globalThis as { __pnextActionRedirects?: number }).__pnextActionRedirects ?? 0
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
export function consumeActionStateOverride(): { value: unknown } | undefined {
|
|
138
|
-
const holder = globalThis as { __PNEXT_ACTION_STATE__?: unknown }
|
|
139
|
-
if (!('__PNEXT_ACTION_STATE__' in holder)) return undefined
|
|
140
|
-
const override = holder.__PNEXT_ACTION_STATE__
|
|
138
|
+
const holder = globalThis as { __PNEXT_ACTION_STATE__?: unknown }
|
|
139
|
+
if (!('__PNEXT_ACTION_STATE__' in holder)) return undefined
|
|
140
|
+
const override = holder.__PNEXT_ACTION_STATE__
|
|
141
141
|
if (
|
|
142
142
|
override !== null &&
|
|
143
143
|
typeof override === 'object' &&
|
|
@@ -145,15 +145,14 @@ export function consumeActionStateOverride(): { value: unknown } | undefined {
|
|
|
145
145
|
typeof override.skip === 'number' &&
|
|
146
146
|
override.skip > 0
|
|
147
147
|
) {
|
|
148
|
-
override.skip
|
|
149
|
-
return undefined
|
|
148
|
+
override.skip--
|
|
149
|
+
return undefined
|
|
150
150
|
}
|
|
151
|
-
delete holder.__PNEXT_ACTION_STATE__
|
|
151
|
+
delete holder.__PNEXT_ACTION_STATE__
|
|
152
152
|
return {
|
|
153
153
|
value:
|
|
154
154
|
override !== null && typeof override === 'object' && 'value' in override
|
|
155
155
|
? override.value
|
|
156
156
|
: override,
|
|
157
|
-
}
|
|
157
|
+
}
|
|
158
158
|
}
|
|
159
|
-
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Lite client `react` alias for compat apps whose client graph provably never suspends and only uses
|
|
2
|
-
// the core-preact-equivalent React surface (see clientCompatSurface in src/client/
|
|
2
|
+
// the core-preact-equivalent React surface (see clientCompatSurface in src/client/react-tier.ts).
|
|
3
3
|
// Everything here is backed by preact core + preact/hooks, so the bundle ships no preact/compat. The
|
|
4
4
|
// parity import wires the same vnode pass (React 19 ref prop, primitive-throw safety) as the full shim.
|
|
5
|
-
import './parity'
|
|
5
|
+
import './parity'
|
|
6
6
|
import {
|
|
7
7
|
Component,
|
|
8
8
|
Fragment,
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
createElement,
|
|
12
12
|
createRef,
|
|
13
13
|
isValidElement,
|
|
14
|
-
} from 'preact'
|
|
14
|
+
} from 'preact'
|
|
15
15
|
import {
|
|
16
16
|
useCallback,
|
|
17
17
|
useContext,
|
|
@@ -24,9 +24,9 @@ import {
|
|
|
24
24
|
useReducer,
|
|
25
25
|
useRef,
|
|
26
26
|
useState,
|
|
27
|
-
} from 'preact/hooks'
|
|
28
|
-
import { useOptimistic, useTransition } from './hooks-extra'
|
|
29
|
-
import { useActionState } from './action-state'
|
|
27
|
+
} from 'preact/hooks'
|
|
28
|
+
import { useOptimistic, useTransition } from './hooks-extra'
|
|
29
|
+
import { useActionState } from './action-state'
|
|
30
30
|
|
|
31
31
|
export {
|
|
32
32
|
Component,
|
|
@@ -50,24 +50,24 @@ export {
|
|
|
50
50
|
useActionState,
|
|
51
51
|
useOptimistic,
|
|
52
52
|
useTransition,
|
|
53
|
-
}
|
|
54
|
-
export { ViewTransition, addTransitionType } from './view-transition'
|
|
53
|
+
}
|
|
54
|
+
export { ViewTransition, addTransitionType } from './view-transition'
|
|
55
55
|
|
|
56
56
|
// Same passthrough semantics preact/compat gives these.
|
|
57
|
-
export const StrictMode = Fragment
|
|
58
|
-
export const startTransition = (callback: () => void) => callback()
|
|
59
|
-
export const useDeferredValue = <T>(value: T): T => value
|
|
60
|
-
export const useInsertionEffect = useLayoutEffect
|
|
61
|
-
export const version = '19.0.0'
|
|
57
|
+
export const StrictMode = Fragment
|
|
58
|
+
export const startTransition = (callback: () => void) => callback()
|
|
59
|
+
export const useDeferredValue = <T>(value: T): T => value
|
|
60
|
+
export const useInsertionEffect = useLayoutEffect
|
|
61
|
+
export const version = '19.0.0'
|
|
62
62
|
|
|
63
63
|
export function cache<Args extends unknown[], Result>(
|
|
64
64
|
fn: (...args: Args) => Result,
|
|
65
65
|
): (...args: Args) => Result {
|
|
66
|
-
return (...args: Args) => fn(...args)
|
|
66
|
+
return (...args: Args) => fn(...args)
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
export function cacheSignal() {
|
|
70
|
-
return null
|
|
70
|
+
return null
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
// No default export: the surface scan already forces the full tier for any app doing
|
|
@@ -45,15 +45,15 @@ export {
|
|
|
45
45
|
useSyncExternalStore,
|
|
46
46
|
useTransition,
|
|
47
47
|
version,
|
|
48
|
-
} from './preact'
|
|
49
|
-
export { ViewTransition, addTransitionType } from './view-transition'
|
|
48
|
+
} from './preact'
|
|
49
|
+
export { ViewTransition, addTransitionType } from './view-transition'
|
|
50
50
|
|
|
51
51
|
export function cache<Args extends unknown[], Result>(
|
|
52
52
|
fn: (...args: Args) => Result,
|
|
53
53
|
): (...args: Args) => Result {
|
|
54
|
-
return (...args: Args) => fn(...args)
|
|
54
|
+
return (...args: Args) => fn(...args)
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
export function cacheSignal() {
|
|
58
|
-
return null
|
|
58
|
+
return null
|
|
59
59
|
}
|
|
@@ -14,27 +14,27 @@
|
|
|
14
14
|
// runtime. The remaining exports are only emitted in development/validation builds; pnext ships the
|
|
15
15
|
// production runtime, so they are minimal stubs to keep any stray import resolvable.
|
|
16
16
|
|
|
17
|
-
import { useMemo } from 'preact/compat'
|
|
17
|
+
import { useMemo } from 'preact/compat'
|
|
18
18
|
|
|
19
|
-
const $empty = Symbol.for('react.memo_cache_sentinel')
|
|
19
|
+
const $empty = Symbol.for('react.memo_cache_sentinel')
|
|
20
20
|
|
|
21
21
|
/** React Compiler memo-cache allocator (production fallback over preact useMemo). */
|
|
22
22
|
export function c(size: number): unknown[] {
|
|
23
23
|
return useMemo<unknown[]>(() => {
|
|
24
|
-
const cache: unknown[] = new Array<unknown>(size)
|
|
25
|
-
for (let index = 0; index < size; index++) cache[index] = $empty
|
|
26
|
-
(cache as unknown as Record<symbol, boolean>)[$empty] = true
|
|
27
|
-
return cache
|
|
28
|
-
}, [])
|
|
24
|
+
const cache: unknown[] = new Array<unknown>(size)
|
|
25
|
+
for (let index = 0; index < size; index++) cache[index] = $empty
|
|
26
|
+
;(cache as unknown as Record<symbol, boolean>)[$empty] = true
|
|
27
|
+
return cache
|
|
28
|
+
}, [])
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
/** Reset a memo-cache array back to sentinels (dev-only in upstream). */
|
|
32
32
|
export function $reset(cache: unknown[]): void {
|
|
33
|
-
for (let index = 0; index < cache.length; index++) cache[index] = $empty
|
|
33
|
+
for (let index = 0; index < cache.length; index++) cache[index] = $empty
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
export function $makeReadOnly<T>(value: T): T {
|
|
37
|
-
return value
|
|
37
|
+
return value
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
// Dispatcher guards / structural check are dev-only validation hooks; ship as
|
|
@@ -47,11 +47,11 @@ export function $structuralCheck(): void {
|
|
|
47
47
|
/* no-op: dev-only structural equality check */
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
export const renderCounterRegistry = new Map<string, Set<{ count: number }>>()
|
|
50
|
+
export const renderCounterRegistry = new Map<string, Set<{ count: number }>>()
|
|
51
51
|
|
|
52
52
|
export function clearRenderCounterRegistry(): void {
|
|
53
53
|
for (const counters of renderCounterRegistry.values()) {
|
|
54
|
-
for (const counter of counters) counter.count = 0
|
|
54
|
+
for (const counter of counters) counter.count = 0
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
|