@wular/pnext 0.0.4 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -16
- package/bin/pnext +6 -1
- package/config/lint/base.js +7 -7
- package/config/ts/base.json +2 -4
- package/config/ts/react.json +2 -6
- package/package.json +23 -2
- package/reference/compat.md +87 -22
- package/reference/config.md +40 -93
- package/reference/css.md +42 -33
- package/reference/dev.md +26 -33
- package/reference/env.md +18 -20
- package/reference/getting-started.md +132 -0
- package/reference/metadata.md +31 -46
- package/reference/navigation.md +65 -105
- package/reference/performance.md +21 -142
- package/reference/rendering.md +78 -75
- package/reference/routing.md +97 -107
- package/reference/typegen.md +27 -29
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +121 -114
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +52 -53
- package/src/api/navigation.ts +59 -58
- package/src/api/server.ts +152 -144
- package/src/api/suspense.ts +4 -4
- package/src/cli/adapters/vercel-warm.ts +126 -121
- package/src/cli/adapters/vercel.ts +437 -443
- package/src/cli/analyze.ts +333 -144
- package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
- package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
- package/src/cli/build.ts +976 -978
- package/src/cli/create.ts +72 -64
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +94 -85
- package/src/cli/migrate/package-json.ts +73 -71
- package/src/cli/migrate/report.ts +32 -33
- package/src/cli/migrate/{index.ts → run.ts} +48 -49
- package/src/cli/migrate/scan.ts +46 -46
- package/src/cli/migrate/spinner.ts +9 -9
- package/src/cli/migrate/tsconfig.ts +35 -35
- package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
- package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
- package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
- package/src/cli/start.ts +65 -66
- package/src/{typegen.ts → cli/typegen.ts} +59 -59
- package/src/client/build.ts +802 -768
- package/src/client/chunk-fold.ts +245 -240
- package/src/client/{paths.ts → chunk-name.ts} +6 -6
- package/src/client/entry.ts +162 -147
- package/src/client/prebuilt.ts +231 -223
- package/src/client/profile.ts +29 -29
- package/src/client/react-compiler.ts +20 -15
- package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
- package/src/client/reference-stub.ts +51 -51
- package/src/client/reference.ts +19 -19
- package/src/{api → client}/router/events.ts +32 -17
- package/src/{api → client}/router/history.ts +16 -16
- package/src/{api → client}/router/hub.ts +52 -53
- package/src/{api/router.ts → client/router/index.ts} +61 -60
- package/src/{api → client}/router/policies.ts +24 -24
- package/src/{api → client}/router/runtime.ts +2022 -1995
- package/src/{api → client}/router/types.ts +98 -98
- package/src/compat/actions/client-plugin.ts +42 -43
- package/src/compat/actions/client-stub.ts +14 -14
- package/src/compat/actions/{action-client.ts → client.ts} +194 -193
- package/src/compat/actions/config.ts +63 -64
- package/src/compat/actions/detect.ts +68 -68
- package/src/compat/actions/discovery.ts +105 -105
- package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
- package/src/compat/actions/early-submit.ts +1 -1
- package/src/compat/actions/endpoint.ts +198 -198
- package/src/compat/actions/extensions.ts +811 -0
- package/src/compat/actions/flight.ts +23 -23
- package/src/compat/actions/form-state.ts +34 -34
- package/src/compat/actions/hoist.ts +382 -236
- package/src/compat/actions/ids.ts +7 -12
- package/src/compat/actions/index.ts +8 -8
- package/src/compat/actions/instances.ts +46 -46
- package/src/compat/actions/origin.ts +47 -48
- package/src/compat/actions/protocol.ts +22 -22
- package/src/compat/actions/registry.ts +19 -19
- package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
- package/src/compat/actions/rewrite.ts +125 -125
- package/src/compat/actions/{action-router.ts → router.ts} +10 -10
- package/src/compat/actions/serve.ts +132 -136
- package/src/compat/actions/server-tag.ts +4 -4
- package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
- package/src/compat/actions/unrecognized-error.ts +4 -4
- package/src/compat/{index.ts → aliases.ts} +112 -109
- package/src/compat/bundler/bun-externals.ts +18 -18
- package/src/compat/bundler/cjs-exports.ts +271 -223
- package/src/compat/bundler/config.ts +116 -111
- package/src/compat/bundler/externals.ts +12 -12
- package/src/compat/bundler/import-meta-url.ts +19 -19
- package/src/compat/bundler/modularize-imports.ts +36 -33
- package/src/compat/bundler/new-url-asset.ts +22 -24
- package/src/compat/bundler/optimize-package-imports.ts +111 -107
- package/src/compat/bundler/polyfill.ts +28 -28
- package/src/compat/bundler/react-compiler.ts +35 -29
- package/src/compat/bundler/react-profiler.tsx +11 -11
- package/src/compat/bundler/relay-transform.ts +48 -47
- package/src/compat/bundler/require-context.ts +119 -113
- package/src/compat/bundler/resolve-extensions.ts +19 -19
- package/src/compat/bundler/source-cache.ts +25 -25
- package/src/compat/bundler/static-imports.ts +7 -7
- package/src/compat/bundler/symlink-imports.ts +46 -46
- package/src/compat/bundler/tsconfig-paths.ts +13 -15
- package/src/compat/bundler/wasm.ts +58 -60
- package/src/compat/bundler/webpack-loaders.ts +254 -241
- package/src/compat/bundler/worker.ts +101 -104
- package/src/compat/cache/build-flags.ts +29 -29
- package/src/compat/cache/build-prerender-errors.ts +40 -44
- package/src/compat/cache/custom-handler.ts +60 -53
- package/src/compat/cache/fetch-patch.ts +240 -240
- package/src/compat/cache/handler.ts +27 -31
- package/src/compat/cache/modern-handler.ts +148 -126
- package/src/compat/cache/resume-data-cache.ts +47 -45
- package/src/compat/cache/revalidate.ts +233 -232
- package/src/compat/cache/runtime-error.ts +35 -35
- package/src/compat/cache/use-cache-transform.ts +442 -417
- package/src/compat/cache/use-cache.ts +650 -614
- package/src/compat/cache-control.ts +140 -142
- package/src/compat/client/base-path.ts +21 -20
- package/src/compat/client/css-order.ts +18 -18
- package/src/compat/client/errors/bare-boundary.ts +11 -11
- package/src/compat/client/errors/control-flow.ts +23 -23
- package/src/compat/client/errors/error-boundary.ts +61 -61
- package/src/compat/client/errors/global-error.ts +101 -91
- package/src/compat/client/errors/install.ts +71 -72
- package/src/compat/client/errors/lazy.ts +23 -23
- package/src/compat/client/errors/primitive-throw.ts +47 -45
- package/src/compat/client/errors/soft-refresh.ts +4 -4
- package/src/compat/client/link-status.ts +33 -33
- package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
- package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
- package/src/compat/client/navigation-scroll.ts +63 -63
- package/src/compat/client/optimistic-routing.ts +93 -88
- package/src/compat/client/prefetch-cache.ts +23 -24
- package/src/compat/client/route-announcer.ts +35 -35
- package/src/compat/client/segment-cache-policy.ts +20 -20
- package/src/compat/client/segment-cache.ts +309 -315
- package/src/compat/client/segment-prefetch.ts +127 -132
- package/src/compat/client/trailing-slash.ts +5 -4
- package/src/compat/css/chunking.ts +113 -116
- package/src/compat/css/inline-css.ts +21 -21
- package/src/compat/css/lightningcss.ts +37 -38
- package/src/compat/css/modules.ts +161 -175
- package/src/compat/css/nonce.ts +7 -7
- package/src/compat/css/sass-plugin.ts +18 -21
- package/src/compat/css/sass.ts +150 -152
- package/src/compat/css/styled-jsx-runtime.ts +27 -27
- package/src/compat/css/styled-jsx.ts +21 -21
- package/src/compat/edge-runtime.ts +27 -27
- package/src/compat/{adapter → export}/build-complete.ts +72 -75
- package/src/compat/export/client.ts +29 -31
- package/src/compat/export/{index.ts → emit.ts} +111 -110
- package/src/compat/export/standalone.ts +62 -54
- package/src/compat/image-optimizer/cache.ts +51 -49
- package/src/compat/image-optimizer/detect.ts +52 -52
- package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
- package/src/compat/image-optimizer/source.ts +77 -80
- package/src/compat/lifecycle/after-scope.ts +26 -26
- package/src/compat/lifecycle/after.ts +48 -45
- package/src/compat/lifecycle/error-funnel.ts +98 -102
- package/src/compat/lifecycle/error-serialize.ts +30 -26
- package/src/compat/lifecycle/error-ui.ts +67 -32
- package/src/compat/lifecycle/instrumentation-client.ts +36 -38
- package/src/compat/lifecycle/instrumentation.ts +85 -85
- package/src/compat/lifecycle/node-console.ts +11 -11
- package/src/compat/lifecycle/testmode.ts +160 -132
- package/src/compat/mdx/compile.ts +60 -57
- package/src/compat/mdx/plugin.ts +11 -11
- package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
- package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
- package/src/compat/metadata.ts +75 -81
- package/src/compat/next/cache.ts +68 -69
- package/src/compat/next/canonical-url.ts +9 -9
- package/src/compat/next/client-cache.ts +19 -19
- package/src/compat/next/client-navigation.ts +112 -116
- package/src/compat/next/client-only.ts +1 -1
- package/src/compat/next/client-script.tsx +99 -93
- package/src/compat/next/client-server.ts +10 -10
- package/src/compat/next/config-loader.ts +176 -173
- package/src/compat/next/config.ts +7 -7
- package/src/compat/next/constants.cjs +6 -6
- package/src/compat/next/constants.ts +6 -6
- package/src/compat/next/custom-server.ts +26 -24
- package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
- package/src/compat/next/dynamic.tsx +21 -18
- package/src/compat/next/error.tsx +52 -52
- package/src/compat/next/font/cache.ts +74 -74
- package/src/compat/next/font/google.ts +2 -2
- package/src/compat/next/font/index.ts +1 -1
- package/src/compat/next/font/local.ts +3 -3
- package/src/compat/next/font/runtime-client.ts +17 -15
- package/src/compat/next/font/runtime.ts +443 -408
- package/src/compat/next/font/shared.ts +120 -108
- package/src/compat/next/form.tsx +63 -63
- package/src/compat/next/head.tsx +2 -2
- package/src/compat/next/headers.ts +103 -95
- package/src/compat/next/image/client.tsx +220 -0
- package/src/compat/next/image/config.ts +56 -58
- package/src/compat/next/image/optimizer.ts +40 -36
- package/src/compat/next/image/patterns.ts +37 -40
- package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
- package/src/compat/next/image/shared.ts +65 -57
- package/src/compat/next/image/static-metadata.ts +98 -107
- package/src/compat/next/image/validate.ts +79 -88
- package/src/compat/next/image.tsx +19 -23
- package/src/compat/next/index.ts +1 -1
- package/src/compat/next/legacy-image.tsx +59 -60
- package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
- package/src/compat/next/link.tsx +158 -158
- package/src/compat/next/navigation.cjs +12 -3
- package/src/compat/next/navigation.ts +48 -50
- package/src/compat/next/offline.ts +27 -27
- package/src/compat/next/og.ts +121 -124
- package/src/compat/next/preferred-region.ts +13 -14
- package/src/compat/next/redirects.ts +58 -56
- package/src/compat/next/resource-hints.ts +73 -76
- package/src/compat/next/rewrites.ts +130 -133
- package/src/compat/next/root-params.ts +45 -45
- package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
- package/src/compat/next/router.cjs +4 -2
- package/src/compat/next/router.ts +58 -61
- package/src/compat/next/script.tsx +108 -108
- package/src/compat/next/server-only.ts +1 -1
- package/src/compat/next/server.ts +19 -19
- package/src/compat/next/svgr.ts +18 -17
- package/src/compat/next/telemetry.ts +24 -24
- package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
- package/src/compat/next/user-agent.ts +53 -49
- package/src/compat/next/web-vitals.ts +22 -24
- package/src/compat/otel/api.ts +41 -41
- package/src/compat/otel/client-trace-metadata.ts +25 -27
- package/src/compat/otel/fetch-span.ts +29 -29
- package/src/compat/otel/tracer.ts +331 -331
- package/src/compat/pages/api.ts +456 -0
- package/src/compat/pages/client-plugin.ts +36 -36
- package/src/compat/pages/router-state.ts +34 -34
- package/src/compat/pages/{index.ts → router.ts} +130 -135
- package/src/compat/ppr/io.ts +12 -12
- package/src/compat/ppr/missing-root-params.ts +34 -38
- package/src/compat/ppr/root-params-scan.ts +66 -66
- package/src/compat/ppr/root-params-transform.ts +24 -26
- package/src/compat/ppr/root-params.ts +30 -30
- package/src/compat/ppr/segment-config-incompat.ts +6 -7
- package/src/compat/protocol.ts +71 -70
- package/src/compat/react/action-state.ts +47 -48
- package/src/compat/react/client-lite.ts +15 -15
- package/src/compat/react/client.ts +4 -4
- package/src/compat/react/compiler-runtime.ts +11 -11
- package/src/compat/react/dom-client.ts +44 -44
- package/src/compat/react/dom-react-server.ts +10 -16
- package/src/compat/react/dom-server.ts +10 -10
- package/src/compat/react/dom.ts +52 -52
- package/src/compat/react/hooks-extra.ts +34 -35
- package/src/compat/react/parity.ts +64 -61
- package/src/compat/react/preact.ts +81 -82
- package/src/compat/react/react-server.ts +28 -28
- package/src/compat/react/router-shim.ts +1 -1
- package/src/compat/react/server-component-use.ts +8 -8
- package/src/compat/react/server-inserted-html.ts +30 -31
- package/src/compat/react/server.ts +53 -55
- package/src/compat/react/use.ts +32 -32
- package/src/compat/react/view-transition.ts +20 -20
- package/src/compat/register/actions.ts +35 -824
- package/src/compat/register/boot.ts +41 -41
- package/src/compat/register/build-tier.ts +5 -5
- package/src/compat/register/build.ts +74 -70
- package/src/compat/register/bundler.ts +161 -156
- package/src/compat/register/cache.ts +20 -20
- package/src/compat/register/client-errors.ts +3 -3
- package/src/compat/register/config.ts +6 -6
- package/src/compat/register/css-extras.ts +30 -34
- package/src/compat/register/edge-runtime.ts +3 -3
- package/src/compat/register/errors.ts +10 -12
- package/src/compat/register/export.ts +16 -16
- package/src/compat/register/font.ts +11 -11
- package/src/compat/register/hooks.ts +2 -2
- package/src/compat/register/image.ts +40 -40
- package/src/compat/register/index.ts +59 -62
- package/src/compat/register/instrumentation-client.ts +10 -10
- package/src/compat/register/lifecycle.ts +25 -28
- package/src/compat/register/mdx.ts +10 -10
- package/src/compat/register/middleware.ts +226 -16
- package/src/compat/register/otel.ts +80 -88
- package/src/compat/register/pages-api.ts +10 -463
- package/src/compat/register/ppr.ts +16 -16
- package/src/compat/register/protocol.ts +17 -18
- package/src/compat/register/proxy.ts +49 -51
- package/src/compat/register/render.ts +79 -76
- package/src/compat/register/routing.ts +162 -159
- package/src/compat/register/segment.ts +24 -1897
- package/src/compat/register/static-image.ts +3 -3
- package/src/compat/register/{misc.ts → taint.ts} +9 -9
- package/src/compat/register/typed-routes.ts +14 -14
- package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
- package/src/compat/register/validation.ts +18 -18
- package/src/compat/segment/loading-boundary.ts +43 -45
- package/src/compat/segment/page-slot.ts +69 -69
- package/src/compat/segment/serve.ts +1884 -0
- package/src/compat/segment/tree.ts +113 -112
- package/src/compat/segment/vary-key.ts +38 -38
- package/src/compat/segment/vary-params.ts +138 -142
- package/src/compat/static-params.ts +14 -12
- package/src/compat/tsconfig-defaults.ts +87 -91
- package/src/compat/typecheck/{index.ts → check.ts} +234 -212
- package/src/compat/typecheck/worker.ts +15 -12
- package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
- package/src/compat/typed-routes/manifest.ts +174 -170
- package/src/compat/typed-routes/typegen.ts +127 -110
- package/src/compat/validation/errors.ts +16 -19
- package/src/compat/validation/prerender-diagnostics.ts +521 -504
- package/src/compat/validation/{index.ts → validate.ts} +647 -648
- package/src/compat-bootstrap.ts +16 -16
- package/src/config.ts +86 -69
- package/src/css/build.ts +230 -227
- package/src/css/postcss.ts +79 -80
- package/src/css/worker.ts +14 -15
- package/src/dev/client-actions.ts +10 -10
- package/src/dev/client-chunk-store.ts +27 -27
- package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
- package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
- package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
- package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
- package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
- package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
- package/src/dev/server.ts +804 -820
- package/src/env.ts +46 -43
- package/src/extensions.ts +491 -478
- package/src/index.ts +8 -8
- package/src/internal.ts +20 -23
- package/src/{islands → render}/boundary-error.ts +3 -3
- package/src/render/hooks.ts +71 -71
- package/src/render/island-context.ts +14 -14
- package/src/render/metadata.ts +310 -310
- package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
- package/src/{ppr.ts → render/ppr.ts} +244 -245
- package/src/render/renderer.ts +2087 -2082
- package/src/render/resource-hints.ts +16 -17
- package/src/render/slots.tsx +224 -235
- package/src/{islands → render}/static-children.ts +9 -12
- package/src/{islands → render}/static-slots.ts +37 -37
- package/src/{cache/context.ts → request/cache.ts} +20 -20
- package/src/request/context.ts +107 -107
- package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
- package/src/resolve/engine.ts +90 -77
- package/src/resolve/imports.ts +475 -463
- package/src/resolve/scan-facts.ts +318 -296
- package/src/resolve/source-text.ts +37 -37
- package/src/{dynamic → resolve}/tree-shake.ts +132 -128
- package/src/routing/forwarded.ts +19 -19
- package/src/routing/handler.ts +84 -91
- package/src/routing/href.ts +87 -70
- package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
- package/src/{proxy.ts → routing/proxy.ts} +306 -312
- package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
- package/src/routing/routes.ts +827 -815
- package/src/routing/slots.ts +164 -160
- package/src/runtime/loader.ts +954 -0
- package/src/{dev → runtime}/module-cache.ts +309 -287
- package/src/{dev → runtime}/module-generations.ts +9 -9
- package/src/{dev → runtime}/module-transform.ts +81 -72
- package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
- package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
- package/src/runtime/vendor.ts +428 -406
- package/src/styles.d.ts +9 -0
- package/src/types.ts +324 -335
- package/src/utils/ansi.ts +5 -5
- package/src/utils/{source.ts → code.ts} +15 -12
- package/src/utils/content-type.ts +3 -3
- package/src/utils/decode.ts +2 -2
- package/src/utils/dev-profile.ts +13 -13
- package/src/utils/error-log.ts +6 -6
- package/src/utils/esbuild.ts +18 -18
- package/src/utils/fs-cache.ts +13 -13
- package/src/utils/fs.ts +57 -49
- package/src/utils/html.ts +20 -24
- package/src/utils/native-require.ts +8 -8
- package/src/utils/serialize.ts +139 -146
- package/src/utils/verbose.ts +18 -18
- package/reference/overview.md +0 -35
- package/src/cli/analyze-print.ts +0 -181
- package/src/compat/middleware/manifest.ts +0 -210
- package/src/compat/next/image-client.tsx +0 -215
- package/src/compat/next/link-usage.ts +0 -29
- package/src/css/index.ts +0 -2
- package/src/render/index.ts +0 -1
- package/src/style-modules.d.ts +0 -9
|
@@ -1,21 +1,18 @@
|
|
|
1
|
-
import { h, type ComponentChildren } from 'preact'
|
|
1
|
+
import { h, type ComponentChildren } from 'preact'
|
|
2
2
|
|
|
3
|
-
export const ISLAND_STATIC_CHILDREN_ATTRIBUTE = 'data-pnext-static-children'
|
|
3
|
+
export const ISLAND_STATIC_CHILDREN_ATTRIBUTE = 'data-pnext-static-children'
|
|
4
4
|
|
|
5
|
-
export function islandStaticChildren(
|
|
6
|
-
|
|
7
|
-
children: ComponentChildren,
|
|
8
|
-
) {
|
|
9
|
-
if (!hasIslandStaticChildren(children)) return undefined;
|
|
5
|
+
export function islandStaticChildren(id: string, children: ComponentChildren) {
|
|
6
|
+
if (!hasIslandStaticChildren(children)) return undefined
|
|
10
7
|
return h(
|
|
11
8
|
'pnext-static-children',
|
|
12
9
|
{ [ISLAND_STATIC_CHILDREN_ATTRIBUTE]: id, style: { display: 'contents' } },
|
|
13
10
|
children,
|
|
14
|
-
)
|
|
11
|
+
)
|
|
15
12
|
}
|
|
16
13
|
|
|
17
14
|
function hasIslandStaticChildren(children: ComponentChildren) {
|
|
18
|
-
return Array.isArray(children) ? children.length > 0 : children != null && children !== false
|
|
15
|
+
return Array.isArray(children) ? children.length > 0 : children != null && children !== false
|
|
19
16
|
}
|
|
20
17
|
|
|
21
18
|
/**
|
|
@@ -25,13 +22,13 @@ function hasIslandStaticChildren(children: ComponentChildren) {
|
|
|
25
22
|
export function plainIslandChildren(
|
|
26
23
|
children: ComponentChildren,
|
|
27
24
|
): string | number | (string | number)[] | undefined {
|
|
28
|
-
if (typeof children === 'string' || typeof children === 'number') return children
|
|
25
|
+
if (typeof children === 'string' || typeof children === 'number') return children
|
|
29
26
|
if (
|
|
30
27
|
Array.isArray(children) &&
|
|
31
28
|
children.length > 0 &&
|
|
32
29
|
children.every(child => typeof child === 'string' || typeof child === 'number')
|
|
33
30
|
) {
|
|
34
|
-
return children as (string | number)[]
|
|
31
|
+
return children as (string | number)[]
|
|
35
32
|
}
|
|
36
|
-
return undefined
|
|
33
|
+
return undefined
|
|
37
34
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { h, type VNode } from 'preact'
|
|
2
|
-
import { isElementLike } from '../utils/serialize'
|
|
1
|
+
import { h, type VNode } from 'preact'
|
|
2
|
+
import { isElementLike } from '../utils/serialize'
|
|
3
3
|
|
|
4
|
-
export const ISLAND_STATIC_SLOT_ATTRIBUTE = 'data-pnext-static-slot'
|
|
5
|
-
export const ISLAND_STATIC_SLOT_MARKER = '$$pnext_slot'
|
|
4
|
+
export const ISLAND_STATIC_SLOT_ATTRIBUTE = 'data-pnext-static-slot'
|
|
5
|
+
export const ISLAND_STATIC_SLOT_MARKER = '$$pnext_slot'
|
|
6
6
|
|
|
7
|
-
type Props = Record<string, unknown
|
|
7
|
+
type Props = Record<string, unknown>
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Element-valued island props travel exactly like element children: the SSR pass wraps each one in a
|
|
@@ -13,7 +13,7 @@ type Props = Record<string, unknown>;
|
|
|
13
13
|
* plain objects are covered; anything else (Map/Set values, class instances) is left alone.
|
|
14
14
|
*/
|
|
15
15
|
export function islandStaticSlotProps(id: string, props: Props, mode: 'ssr' | 'wire'): Props {
|
|
16
|
-
return mapSlots(props, id, mode, [], new Set()) as Props
|
|
16
|
+
return mapSlots(props, id, mode, [], new Set()) as Props
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
function mapSlots(
|
|
@@ -24,38 +24,38 @@ function mapSlots(
|
|
|
24
24
|
seen: Set<object>,
|
|
25
25
|
): unknown {
|
|
26
26
|
if (isElementLike(value)) {
|
|
27
|
-
const slot = `${id}:${path.join('.')}
|
|
28
|
-
if (mode === 'wire') return { [ISLAND_STATIC_SLOT_MARKER]: slot }
|
|
27
|
+
const slot = `${id}:${path.join('.')}`
|
|
28
|
+
if (mode === 'wire') return { [ISLAND_STATIC_SLOT_MARKER]: slot }
|
|
29
29
|
return h(
|
|
30
30
|
'pnext-static-slot',
|
|
31
31
|
{ [ISLAND_STATIC_SLOT_ATTRIBUTE]: slot, style: { display: 'contents' } },
|
|
32
32
|
value as VNode,
|
|
33
|
-
)
|
|
33
|
+
)
|
|
34
34
|
}
|
|
35
|
-
if (value === null || typeof value !== 'object') return value
|
|
35
|
+
if (value === null || typeof value !== 'object') return value
|
|
36
36
|
// Cyclic props are supported by the serializer; never walk a container twice.
|
|
37
|
-
if (seen.has(value)) return value
|
|
38
|
-
if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype) return value
|
|
39
|
-
seen.add(value)
|
|
40
|
-
let changed = false
|
|
37
|
+
if (seen.has(value)) return value
|
|
38
|
+
if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype) return value
|
|
39
|
+
seen.add(value)
|
|
40
|
+
let changed = false
|
|
41
41
|
const entries = Array.isArray(value)
|
|
42
42
|
? value.map((item, index) => [String(index), item] as const)
|
|
43
|
-
: Object.entries(value)
|
|
43
|
+
: Object.entries(value)
|
|
44
44
|
const mapped = entries.map(([key, item]) => {
|
|
45
|
-
const next = mapSlots(item, id, mode, [...path, key], seen)
|
|
46
|
-
if (next !== item) changed = true
|
|
47
|
-
return [key, next] as const
|
|
48
|
-
})
|
|
49
|
-
seen.delete(value)
|
|
45
|
+
const next = mapSlots(item, id, mode, [...path, key], seen)
|
|
46
|
+
if (next !== item) changed = true
|
|
47
|
+
return [key, next] as const
|
|
48
|
+
})
|
|
49
|
+
seen.delete(value)
|
|
50
50
|
// Untouched branches keep their identity (the taint check compares by identity).
|
|
51
|
-
if (!changed) return value
|
|
52
|
-
if (Array.isArray(value)) return mapped.map(([, item]) => item)
|
|
53
|
-
return Object.fromEntries(mapped)
|
|
51
|
+
if (!changed) return value
|
|
52
|
+
if (Array.isArray(value)) return mapped.map(([, item]) => item)
|
|
53
|
+
return Object.fromEntries(mapped)
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
/** Cheap gate on the raw props attribute so islands with no element props skip the revive walk. */
|
|
57
57
|
export function hasIslandStaticSlots(raw: string) {
|
|
58
|
-
return raw.includes(ISLAND_STATIC_SLOT_MARKER)
|
|
58
|
+
return raw.includes(ISLAND_STATIC_SLOT_MARKER)
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
/**
|
|
@@ -69,7 +69,7 @@ export async function reviveIslandStaticSlots(
|
|
|
69
69
|
root: ParentNode,
|
|
70
70
|
toChildren: (node: ParentNode) => unknown,
|
|
71
71
|
): Promise<Props> {
|
|
72
|
-
return (await reviveSlots(props, root, toChildren, new Set())) as Props
|
|
72
|
+
return (await reviveSlots(props, root, toChildren, new Set())) as Props
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
async function reviveSlots(
|
|
@@ -78,29 +78,29 @@ async function reviveSlots(
|
|
|
78
78
|
toChildren: (node: ParentNode) => unknown,
|
|
79
79
|
seen: Set<object>,
|
|
80
80
|
): Promise<unknown> {
|
|
81
|
-
if (value === null || typeof value !== 'object' || seen.has(value)) return value
|
|
82
|
-
const marker = (value as Props)[ISLAND_STATIC_SLOT_MARKER]
|
|
81
|
+
if (value === null || typeof value !== 'object' || seen.has(value)) return value
|
|
82
|
+
const marker = (value as Props)[ISLAND_STATIC_SLOT_MARKER]
|
|
83
83
|
if (typeof marker === 'string') {
|
|
84
|
-
const node = root.querySelector(`[${ISLAND_STATIC_SLOT_ATTRIBUTE}="${cssEscape(marker)}"]`)
|
|
84
|
+
const node = root.querySelector(`[${ISLAND_STATIC_SLOT_ATTRIBUTE}="${cssEscape(marker)}"]`)
|
|
85
85
|
// No server markup for this slot (the island never rendered the prop, or it was skipped for
|
|
86
86
|
// SSR): nothing to adopt, so the prop arrives null rather than as an empty host.
|
|
87
|
-
if (!node) return null
|
|
87
|
+
if (!node) return null
|
|
88
88
|
return h(
|
|
89
89
|
'pnext-static-slot',
|
|
90
90
|
{ [ISLAND_STATIC_SLOT_ATTRIBUTE]: marker, style: { display: 'contents' } },
|
|
91
91
|
(await toChildren(node)) as VNode,
|
|
92
|
-
)
|
|
92
|
+
)
|
|
93
93
|
}
|
|
94
|
-
const proto = Object.getPrototypeOf(value) as object | null
|
|
95
|
-
if (!Array.isArray(value) && proto !== Object.prototype && proto !== null) return value
|
|
96
|
-
seen.add(value)
|
|
97
|
-
const target = value as Props
|
|
94
|
+
const proto = Object.getPrototypeOf(value) as object | null
|
|
95
|
+
if (!Array.isArray(value) && proto !== Object.prototype && proto !== null) return value
|
|
96
|
+
seen.add(value)
|
|
97
|
+
const target = value as Props
|
|
98
98
|
for (const key of Object.keys(target)) {
|
|
99
|
-
target[key] = await reviveSlots(target[key], root, toChildren, seen)
|
|
99
|
+
target[key] = await reviveSlots(target[key], root, toChildren, seen)
|
|
100
100
|
}
|
|
101
|
-
return value
|
|
101
|
+
return value
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
function cssEscape(value: string) {
|
|
105
|
-
return value.replace(/["\\]/g, '\\$&')
|
|
105
|
+
return value.replace(/["\\]/g, '\\$&')
|
|
106
106
|
}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import { AsyncLocalStorage } from 'node:async_hooks'
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks'
|
|
2
2
|
|
|
3
3
|
export interface CacheNode {
|
|
4
|
-
children: Map<unknown, CacheNode
|
|
5
|
-
record?: CacheRecord
|
|
4
|
+
children: Map<unknown, CacheNode>
|
|
5
|
+
record?: CacheRecord
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export type CacheRecord =
|
|
9
9
|
| { status: 'pending'; value: Promise<unknown> }
|
|
10
10
|
| { status: 'resolved'; value: unknown; async: boolean }
|
|
11
|
-
| { status: 'rejected'; error: unknown; async: boolean }
|
|
11
|
+
| { status: 'rejected'; error: unknown; async: boolean }
|
|
12
12
|
|
|
13
13
|
export interface CacheScope {
|
|
14
|
-
functions: WeakMap<object, CacheNode
|
|
15
|
-
fetches?: Map<string, Promise<unknown
|
|
14
|
+
functions: WeakMap<object, CacheNode>
|
|
15
|
+
fetches?: Map<string, Promise<unknown>>
|
|
16
16
|
/**
|
|
17
17
|
* Lazily-created controller backing React.cacheSignal() in a request render. The signal stays live
|
|
18
18
|
* for the whole render - including deferred/streamed Suspense boundaries that resolve after the
|
|
19
19
|
* shell has flushed - so a slow cache component's bounded polling is never cut short. A build
|
|
20
20
|
* prerender uses the prerender scope's signal instead, which aborts at completePrerender().
|
|
21
21
|
*/
|
|
22
|
-
controller?: AbortController
|
|
22
|
+
controller?: AbortController
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
// globalThis-anchored: the prebundled server entry inlines its own copy of this module.
|
|
26
|
-
const CACHE_SCOPE_STORAGE = Symbol.for('pnext.cacheScopeStorage')
|
|
26
|
+
const CACHE_SCOPE_STORAGE = Symbol.for('pnext.cacheScopeStorage')
|
|
27
27
|
const storage = ((globalThis as Record<PropertyKey, unknown>)[CACHE_SCOPE_STORAGE] ??=
|
|
28
|
-
new AsyncLocalStorage<CacheScope>()) as AsyncLocalStorage<CacheScope
|
|
28
|
+
new AsyncLocalStorage<CacheScope>()) as AsyncLocalStorage<CacheScope>
|
|
29
29
|
|
|
30
30
|
export function currentCacheScope() {
|
|
31
|
-
return storage.getStore()
|
|
31
|
+
return storage.getStore()
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
/**
|
|
@@ -38,16 +38,16 @@ export function currentCacheScope() {
|
|
|
38
38
|
* boundary's polling. Build prerenders get a deterministically-aborting signal from the prerender scope.
|
|
39
39
|
*/
|
|
40
40
|
export function currentCacheSignal(): AbortSignal | null {
|
|
41
|
-
const scope = storage.getStore()
|
|
42
|
-
if (!scope) return null
|
|
43
|
-
if (!scope.controller) scope.controller = new AbortController()
|
|
44
|
-
return scope.controller.signal
|
|
41
|
+
const scope = storage.getStore()
|
|
42
|
+
if (!scope) return null
|
|
43
|
+
if (!scope.controller) scope.controller = new AbortController()
|
|
44
|
+
return scope.controller.signal
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
export function runWithCacheScope<T>(callback: () => T): T {
|
|
48
|
-
const existing = storage.getStore()
|
|
49
|
-
if (existing) return callback()
|
|
50
|
-
return storage.run({ functions: new WeakMap() }, callback)
|
|
48
|
+
const existing = storage.getStore()
|
|
49
|
+
if (existing) return callback()
|
|
50
|
+
return storage.run({ functions: new WeakMap() }, callback)
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
/**
|
|
@@ -58,7 +58,7 @@ export function runWithCacheScope<T>(callback: () => T): T {
|
|
|
58
58
|
* Returns an identity wrapper when no scope is active.
|
|
59
59
|
*/
|
|
60
60
|
export function captureCacheScope(): <T>(fn: () => T) => T {
|
|
61
|
-
const scope = storage.getStore()
|
|
62
|
-
if (!scope) return fn => fn()
|
|
63
|
-
return fn => storage.run(scope, fn)
|
|
61
|
+
const scope = storage.getStore()
|
|
62
|
+
if (!scope) return fn => fn()
|
|
63
|
+
return fn => storage.run(scope, fn)
|
|
64
64
|
}
|