@wular/pnext 0.0.1
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 +153 -0
- package/bin/pnext +67 -0
- package/config/lint/base.js +48 -0
- package/config/ts/base.json +26 -0
- package/config/ts/react.json +13 -0
- package/package.json +70 -0
- package/reference/compat.md +63 -0
- package/reference/config.md +120 -0
- package/reference/css.md +58 -0
- package/reference/dev.md +69 -0
- package/reference/env.md +40 -0
- package/reference/metadata.md +86 -0
- package/reference/navigation.md +149 -0
- package/reference/overview.md +35 -0
- package/reference/performance.md +97 -0
- package/reference/rendering.md +127 -0
- package/reference/routing.md +167 -0
- package/reference/typegen.md +64 -0
- package/src/api/cache.ts +80 -0
- package/src/api/client-cache.ts +9 -0
- package/src/api/client-navigation.ts +279 -0
- package/src/api/dynamic.tsx +102 -0
- package/src/api/link.tsx +119 -0
- package/src/api/navigation.ts +198 -0
- package/src/api/router/events.ts +53 -0
- package/src/api/router/history.ts +70 -0
- package/src/api/router/hub.ts +194 -0
- package/src/api/router/policies.ts +107 -0
- package/src/api/router/runtime.ts +5238 -0
- package/src/api/router/types.ts +299 -0
- package/src/api/router.ts +167 -0
- package/src/api/server.ts +323 -0
- package/src/api/suspense.ts +16 -0
- package/src/cache/context.ts +61 -0
- package/src/cli/adapters/vercel-warm.ts +375 -0
- package/src/cli/adapters/vercel.ts +1310 -0
- package/src/cli/analyze-print.ts +181 -0
- package/src/cli/analyze.ts +328 -0
- package/src/cli/boot-trace.ts +29 -0
- package/src/cli/build.ts +3114 -0
- package/src/cli/dev.ts +276 -0
- package/src/cli/index.ts +196 -0
- package/src/cli/named-bin.ts +119 -0
- package/src/cli/serve-ui.ts +160 -0
- package/src/cli/start.ts +1425 -0
- package/src/client/build.ts +2136 -0
- package/src/client/chunk-fold.ts +526 -0
- package/src/client/entry.ts +1525 -0
- package/src/client/paths.ts +22 -0
- package/src/client/prebuilt.ts +621 -0
- package/src/client/profile.ts +75 -0
- package/src/client/react-compiler.ts +94 -0
- package/src/client/reference-stub.ts +145 -0
- package/src/client/reference.ts +47 -0
- package/src/compat/actions/action-client.ts +531 -0
- package/src/compat/actions/action-dispatch.ts +676 -0
- package/src/compat/actions/action-router.ts +40 -0
- package/src/compat/actions/action-shared.ts +95 -0
- package/src/compat/actions/client-plugin.ts +135 -0
- package/src/compat/actions/client-stub.ts +65 -0
- package/src/compat/actions/config.ts +164 -0
- package/src/compat/actions/detect.ts +208 -0
- package/src/compat/actions/discovery.ts +244 -0
- package/src/compat/actions/early-submit.ts +40 -0
- package/src/compat/actions/endpoint.ts +602 -0
- package/src/compat/actions/flight.ts +52 -0
- package/src/compat/actions/form-state.ts +73 -0
- package/src/compat/actions/hoist.ts +485 -0
- package/src/compat/actions/ids.ts +39 -0
- package/src/compat/actions/index.ts +41 -0
- package/src/compat/actions/instances.ts +144 -0
- package/src/compat/actions/origin.ts +109 -0
- package/src/compat/actions/protocol.ts +125 -0
- package/src/compat/actions/registry.ts +74 -0
- package/src/compat/actions/rewrite.ts +282 -0
- package/src/compat/actions/serve.ts +414 -0
- package/src/compat/actions/server-tag.ts +21 -0
- package/src/compat/actions/unrecognized-error.ts +30 -0
- package/src/compat/adapter/build-complete.ts +257 -0
- package/src/compat/bundler/bun-externals.ts +53 -0
- package/src/compat/bundler/cjs-exports.ts +542 -0
- package/src/compat/bundler/config.ts +363 -0
- package/src/compat/bundler/externals.ts +34 -0
- package/src/compat/bundler/import-meta-url.ts +60 -0
- package/src/compat/bundler/modularize-imports.ts +119 -0
- package/src/compat/bundler/new-url-asset.ts +87 -0
- package/src/compat/bundler/optimize-package-imports.ts +273 -0
- package/src/compat/bundler/polyfill.ts +88 -0
- package/src/compat/bundler/react-compiler.ts +61 -0
- package/src/compat/bundler/react-profiler.tsx +25 -0
- package/src/compat/bundler/relay-transform.ts +116 -0
- package/src/compat/bundler/require-context.ts +281 -0
- package/src/compat/bundler/resolve-extensions.ts +75 -0
- package/src/compat/bundler/source-cache.ts +61 -0
- package/src/compat/bundler/static-imports.ts +25 -0
- package/src/compat/bundler/symlink-imports.ts +119 -0
- package/src/compat/bundler/tsconfig-paths.ts +50 -0
- package/src/compat/bundler/wasm.ts +153 -0
- package/src/compat/bundler/webpack-loaders.ts +685 -0
- package/src/compat/bundler/worker.ts +278 -0
- package/src/compat/cache/build-flags.ts +81 -0
- package/src/compat/cache/build-prerender-errors.ts +163 -0
- package/src/compat/cache/custom-handler.ts +159 -0
- package/src/compat/cache/fetch-patch.ts +745 -0
- package/src/compat/cache/handler.ts +100 -0
- package/src/compat/cache/modern-handler.ts +275 -0
- package/src/compat/cache/resume-data-cache.ts +143 -0
- package/src/compat/cache/revalidate.ts +759 -0
- package/src/compat/cache/runtime-error.ts +124 -0
- package/src/compat/cache/use-cache-transform.ts +961 -0
- package/src/compat/cache/use-cache.ts +1695 -0
- package/src/compat/cache-control.ts +269 -0
- package/src/compat/client/base-path.ts +64 -0
- package/src/compat/client/css-order.ts +36 -0
- package/src/compat/client/errors/control-flow.ts +92 -0
- package/src/compat/client/errors/error-boundary.ts +222 -0
- package/src/compat/client/errors/global-error.ts +238 -0
- package/src/compat/client/errors/install.ts +217 -0
- package/src/compat/client/errors/lazy.ts +53 -0
- package/src/compat/client/errors/primitive-throw.ts +126 -0
- package/src/compat/client/errors/soft-refresh.ts +14 -0
- package/src/compat/client/link-status.ts +86 -0
- package/src/compat/client/nav-compat-runtime.ts +57 -0
- package/src/compat/client/nav-compat.ts +42 -0
- package/src/compat/client/navigation-scroll.ts +154 -0
- package/src/compat/client/optimistic-routing.ts +206 -0
- package/src/compat/client/prefetch-cache.ts +111 -0
- package/src/compat/client/route-announcer.ts +72 -0
- package/src/compat/client/segment-cache-policy.ts +159 -0
- package/src/compat/client/segment-cache.ts +1077 -0
- package/src/compat/client/segment-prefetch.ts +375 -0
- package/src/compat/client/trailing-slash.ts +24 -0
- package/src/compat/css/chunking.ts +254 -0
- package/src/compat/css/inline-css.ts +73 -0
- package/src/compat/css/lightningcss.ts +90 -0
- package/src/compat/css/modules.ts +373 -0
- package/src/compat/css/nonce.ts +30 -0
- package/src/compat/css/sass-plugin.ts +65 -0
- package/src/compat/css/sass.ts +392 -0
- package/src/compat/css/styled-jsx-runtime.ts +80 -0
- package/src/compat/css/styled-jsx.ts +49 -0
- package/src/compat/edge-runtime.ts +71 -0
- package/src/compat/export/client.ts +112 -0
- package/src/compat/export/index.ts +272 -0
- package/src/compat/export/standalone.ts +207 -0
- package/src/compat/image-optimizer/cache.ts +119 -0
- package/src/compat/image-optimizer/detect.ts +143 -0
- package/src/compat/image-optimizer/index.ts +601 -0
- package/src/compat/image-optimizer/source.ts +243 -0
- package/src/compat/index.ts +458 -0
- package/src/compat/lifecycle/after-scope.ts +86 -0
- package/src/compat/lifecycle/after.ts +173 -0
- package/src/compat/lifecycle/error-funnel.ts +306 -0
- package/src/compat/lifecycle/error-serialize.ts +87 -0
- package/src/compat/lifecycle/error-ui.ts +167 -0
- package/src/compat/lifecycle/instrumentation-client.ts +138 -0
- package/src/compat/lifecycle/instrumentation.ts +277 -0
- package/src/compat/lifecycle/node-console.ts +19 -0
- package/src/compat/lifecycle/testmode.ts +263 -0
- package/src/compat/mdx/compile.ts +219 -0
- package/src/compat/mdx/next-mdx-stub.ts +46 -0
- package/src/compat/mdx/plugin.ts +37 -0
- package/src/compat/metadata-route-artifacts.ts +458 -0
- package/src/compat/metadata.ts +295 -0
- package/src/compat/middleware/manifest.ts +210 -0
- package/src/compat/misc/action-return.ts +173 -0
- package/src/compat/next/cache.ts +211 -0
- package/src/compat/next/canonical-url.ts +35 -0
- package/src/compat/next/client-cache.ts +57 -0
- package/src/compat/next/client-navigation.ts +313 -0
- package/src/compat/next/client-only.ts +3 -0
- package/src/compat/next/client-script.tsx +215 -0
- package/src/compat/next/client-server.ts +39 -0
- package/src/compat/next/config-loader.ts +569 -0
- package/src/compat/next/config.ts +29 -0
- package/src/compat/next/constants.cjs +6 -0
- package/src/compat/next/constants.ts +6 -0
- package/src/compat/next/custom-server.ts +236 -0
- package/src/compat/next/dist/client/components/app-router-headers.ts +32 -0
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +38 -0
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -0
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -0
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -0
- package/src/compat/next/dynamic.tsx +46 -0
- package/src/compat/next/error.tsx +148 -0
- package/src/compat/next/font/cache.ts +171 -0
- package/src/compat/next/font/google.ts +2 -0
- package/src/compat/next/font/index.ts +8 -0
- package/src/compat/next/font/local.ts +5 -0
- package/src/compat/next/font/runtime-client.ts +71 -0
- package/src/compat/next/font/runtime.ts +974 -0
- package/src/compat/next/font/shared.ts +281 -0
- package/src/compat/next/form.tsx +156 -0
- package/src/compat/next/head.tsx +10 -0
- package/src/compat/next/headers.ts +247 -0
- package/src/compat/next/image/config.ts +196 -0
- package/src/compat/next/image/optimizer.ts +96 -0
- package/src/compat/next/image/patterns.ts +103 -0
- package/src/compat/next/image/shared.ts +141 -0
- package/src/compat/next/image/static-metadata.ts +283 -0
- package/src/compat/next/image/validate.ts +269 -0
- package/src/compat/next/image-client.tsx +215 -0
- package/src/compat/next/image-props.ts +575 -0
- package/src/compat/next/image-usage.ts +102 -0
- package/src/compat/next/image.tsx +56 -0
- package/src/compat/next/index.ts +1 -0
- package/src/compat/next/legacy-image.tsx +97 -0
- package/src/compat/next/link-usage.ts +29 -0
- package/src/compat/next/link-validation-transform.ts +200 -0
- package/src/compat/next/link.tsx +466 -0
- package/src/compat/next/navigation.cjs +21 -0
- package/src/compat/next/navigation.ts +188 -0
- package/src/compat/next/offline.ts +51 -0
- package/src/compat/next/og.ts +324 -0
- package/src/compat/next/optimistic-route-state.ts +188 -0
- package/src/compat/next/preferred-region.ts +39 -0
- package/src/compat/next/redirects.ts +131 -0
- package/src/compat/next/resource-hints.ts +136 -0
- package/src/compat/next/rewrites.ts +350 -0
- package/src/compat/next/root-params.ts +142 -0
- package/src/compat/next/router.cjs +49 -0
- package/src/compat/next/router.ts +143 -0
- package/src/compat/next/script.tsx +355 -0
- package/src/compat/next/server-only.ts +3 -0
- package/src/compat/next/server.ts +28 -0
- package/src/compat/next/svgr.ts +58 -0
- package/src/compat/next/telemetry.ts +77 -0
- package/src/compat/next/user-agent.ts +100 -0
- package/src/compat/next/web-vitals.ts +56 -0
- package/src/compat/otel/api.ts +95 -0
- package/src/compat/otel/client-trace-metadata.ts +71 -0
- package/src/compat/otel/fetch-span.ts +77 -0
- package/src/compat/otel/tracer.ts +944 -0
- package/src/compat/pages/client-plugin.ts +108 -0
- package/src/compat/pages/index.ts +527 -0
- package/src/compat/pages/router-state.ts +94 -0
- package/src/compat/ppr/io.ts +38 -0
- package/src/compat/ppr/missing-root-params.ts +105 -0
- package/src/compat/ppr/root-params-scan.ts +164 -0
- package/src/compat/ppr/root-params-transform.ts +75 -0
- package/src/compat/ppr/root-params.ts +129 -0
- package/src/compat/ppr/segment-config-incompat.ts +34 -0
- package/src/compat/protocol.ts +202 -0
- package/src/compat/react/client.ts +59 -0
- package/src/compat/react/compiler-runtime.ts +60 -0
- package/src/compat/react/dom-client.ts +115 -0
- package/src/compat/react/dom-react-server.ts +20 -0
- package/src/compat/react/dom-server.ts +40 -0
- package/src/compat/react/dom.ts +154 -0
- package/src/compat/react/preact.ts +522 -0
- package/src/compat/react/react-server.ts +84 -0
- package/src/compat/react/router-shim.ts +26 -0
- package/src/compat/react/server-component-use.ts +48 -0
- package/src/compat/react/server-inserted-html.ts +87 -0
- package/src/compat/react/server.ts +156 -0
- package/src/compat/react/view-transition.ts +60 -0
- package/src/compat/register/actions.ts +875 -0
- package/src/compat/register/boot.ts +141 -0
- package/src/compat/register/build-tier.ts +11 -0
- package/src/compat/register/build.ts +182 -0
- package/src/compat/register/bundler.ts +587 -0
- package/src/compat/register/cache.ts +85 -0
- package/src/compat/register/client-errors.ts +18 -0
- package/src/compat/register/config.ts +17 -0
- package/src/compat/register/css-extras.ts +120 -0
- package/src/compat/register/edge-runtime.ts +6 -0
- package/src/compat/register/errors.ts +46 -0
- package/src/compat/register/export.ts +23 -0
- package/src/compat/register/font.ts +36 -0
- package/src/compat/register/hooks.ts +34 -0
- package/src/compat/register/image.ts +133 -0
- package/src/compat/register/index.ts +111 -0
- package/src/compat/register/instrumentation-client.ts +35 -0
- package/src/compat/register/lifecycle.ts +86 -0
- package/src/compat/register/mdx.ts +48 -0
- package/src/compat/register/middleware.ts +36 -0
- package/src/compat/register/misc.ts +44 -0
- package/src/compat/register/otel.ts +288 -0
- package/src/compat/register/pages-api.ts +473 -0
- package/src/compat/register/ppr.ts +56 -0
- package/src/compat/register/protocol.ts +57 -0
- package/src/compat/register/proxy.ts +127 -0
- package/src/compat/register/render.ts +268 -0
- package/src/compat/register/routing.ts +410 -0
- package/src/compat/register/segment.ts +1903 -0
- package/src/compat/register/static-image.ts +21 -0
- package/src/compat/register/typed-routes.ts +35 -0
- package/src/compat/register/usecache.ts +131 -0
- package/src/compat/register/validation.ts +56 -0
- package/src/compat/segment/loading-boundary.ts +113 -0
- package/src/compat/segment/page-slot.ts +200 -0
- package/src/compat/segment/tree.ts +481 -0
- package/src/compat/segment/vary-key.ts +102 -0
- package/src/compat/segment/vary-params.ts +551 -0
- package/src/compat/static-params.ts +33 -0
- package/src/compat/tsconfig-defaults.ts +301 -0
- package/src/compat/typecheck/index.ts +1481 -0
- package/src/compat/typecheck/worker.ts +26 -0
- package/src/compat/typed-routes/index.ts +92 -0
- package/src/compat/typed-routes/manifest.ts +356 -0
- package/src/compat/typed-routes/typegen.ts +566 -0
- package/src/compat/validation/errors.ts +159 -0
- package/src/compat/validation/index.ts +1770 -0
- package/src/compat/validation/prerender-diagnostics.ts +1508 -0
- package/src/compat-bootstrap.ts +67 -0
- package/src/config.ts +218 -0
- package/src/css/build.ts +697 -0
- package/src/css/index.ts +2 -0
- package/src/css/postcss.ts +236 -0
- package/src/css/worker.ts +34 -0
- package/src/dev/client-actions.ts +35 -0
- package/src/dev/client-chunk-store.ts +92 -0
- package/src/dev/client-key-cache.ts +178 -0
- package/src/dev/global-css-cache.ts +212 -0
- package/src/dev/imports.ts +2430 -0
- package/src/dev/module-cache.ts +721 -0
- package/src/dev/module-generations.ts +38 -0
- package/src/dev/module-transform.ts +188 -0
- package/src/dev/node-module-bundle-cache.ts +63 -0
- package/src/dev/restart-cache.ts +10 -0
- package/src/dev/route-bundle-key-cache.ts +154 -0
- package/src/dev/route-facts-cache.ts +223 -0
- package/src/dev/server.ts +1710 -0
- package/src/dynamic/source.ts +307 -0
- package/src/dynamic/tree-shake.ts +262 -0
- package/src/env.ts +92 -0
- package/src/extensions.ts +1898 -0
- package/src/index.ts +34 -0
- package/src/internal.ts +43 -0
- package/src/islands/boundary-error.ts +8 -0
- package/src/islands/static-children.ts +37 -0
- package/src/islands/static-slots.ts +106 -0
- package/src/ppr-postpone.ts +24 -0
- package/src/ppr.ts +784 -0
- package/src/proxy.ts +752 -0
- package/src/render/hooks.ts +384 -0
- package/src/render/index.ts +1 -0
- package/src/render/island-context.ts +47 -0
- package/src/render/metadata.ts +857 -0
- package/src/render/renderer.ts +7391 -0
- package/src/render/resource-hints.ts +44 -0
- package/src/render/slots.tsx +679 -0
- package/src/request/context.ts +396 -0
- package/src/resolve/engine.ts +219 -0
- package/src/resolve/imports.ts +1104 -0
- package/src/resolve/scan-facts.ts +474 -0
- package/src/resolve/source-text.ts +86 -0
- package/src/routing/forwarded.ts +41 -0
- package/src/routing/handler.ts +271 -0
- package/src/routing/href.ts +203 -0
- package/src/routing/metadata.ts +1018 -0
- package/src/routing/request-runtime.ts +43 -0
- package/src/routing/routes.ts +2560 -0
- package/src/routing/slots.ts +432 -0
- package/src/runtime/server.ts +3453 -0
- package/src/runtime/vendor.ts +1160 -0
- package/src/style-modules.d.ts +9 -0
- package/src/typegen.ts +151 -0
- package/src/types.ts +725 -0
- package/src/utils/ansi.ts +9 -0
- package/src/utils/content-type.ts +31 -0
- package/src/utils/decode.ts +7 -0
- package/src/utils/dev-profile.ts +31 -0
- package/src/utils/error-log.ts +29 -0
- package/src/utils/fs-cache.ts +31 -0
- package/src/utils/fs.ts +119 -0
- package/src/utils/html.ts +46 -0
- package/src/utils/serialize.ts +378 -0
- package/src/utils/source.ts +35 -0
- package/src/utils/verbose.ts +39 -0
- package/tsconfig.json +10 -0
package/src/index.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type {
|
|
2
|
+
LayoutProps,
|
|
3
|
+
Metadata,
|
|
4
|
+
MetadataLink,
|
|
5
|
+
NextRequest,
|
|
6
|
+
PageProps,
|
|
7
|
+
PageSearchParams,
|
|
8
|
+
PNextConfig,
|
|
9
|
+
PNextRoutes,
|
|
10
|
+
PrefetchMode,
|
|
11
|
+
RouteContext,
|
|
12
|
+
RouteHandler,
|
|
13
|
+
RouteMode,
|
|
14
|
+
RouteParams,
|
|
15
|
+
RoutePath,
|
|
16
|
+
ServerComponent,
|
|
17
|
+
StaticParams,
|
|
18
|
+
Viewport,
|
|
19
|
+
} from './types';
|
|
20
|
+
export type { PNextMetadataExport, PNextViewportExport } from './internal';
|
|
21
|
+
|
|
22
|
+
export { Link } from './api/link';
|
|
23
|
+
export { dynamic } from './api/dynamic';
|
|
24
|
+
export { Suspense, type SuspenseProps } from './api/suspense';
|
|
25
|
+
export {
|
|
26
|
+
href,
|
|
27
|
+
notFound,
|
|
28
|
+
permanentRedirect,
|
|
29
|
+
PNextNotFoundError,
|
|
30
|
+
PNextRedirectError,
|
|
31
|
+
redirect,
|
|
32
|
+
} from './api/navigation';
|
|
33
|
+
export type { HrefOptions, RedirectOptions, RedirectStatus } from './api/navigation';
|
|
34
|
+
export { NextResponse } from './api/server';
|
package/src/internal.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
LayoutProps,
|
|
3
|
+
Metadata,
|
|
4
|
+
PageProps,
|
|
5
|
+
RoutePath,
|
|
6
|
+
ServerComponent,
|
|
7
|
+
StaticParams,
|
|
8
|
+
Viewport,
|
|
9
|
+
} from './types';
|
|
10
|
+
|
|
11
|
+
export type PNextMetadataExport = Metadata | (() => Metadata | Promise<Metadata>);
|
|
12
|
+
export type PNextViewportExport = Viewport | (() => Viewport | Promise<Viewport>);
|
|
13
|
+
|
|
14
|
+
export interface PNextPageModule<Route extends RoutePath> {
|
|
15
|
+
default: ServerComponent<PageProps<Route>>;
|
|
16
|
+
params?: () => StaticParams<Route>;
|
|
17
|
+
metadata?: PNextMetadataExport;
|
|
18
|
+
viewport?: PNextViewportExport;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface PNextLayoutModule {
|
|
22
|
+
default?: ServerComponent<LayoutProps>;
|
|
23
|
+
metadata?: PNextMetadataExport;
|
|
24
|
+
viewport?: PNextViewportExport;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
type NextHandler = {
|
|
28
|
+
bivarianceHack(
|
|
29
|
+
request: never,
|
|
30
|
+
context: never,
|
|
31
|
+
): Response | Promise<Response>;
|
|
32
|
+
}['bivarianceHack'];
|
|
33
|
+
|
|
34
|
+
export interface PNextRouteHandlerModule<Route extends RoutePath> {
|
|
35
|
+
GET?: NextHandler;
|
|
36
|
+
POST?: NextHandler;
|
|
37
|
+
PUT?: NextHandler;
|
|
38
|
+
PATCH?: NextHandler;
|
|
39
|
+
DELETE?: NextHandler;
|
|
40
|
+
OPTIONS?: NextHandler;
|
|
41
|
+
HEAD?: NextHandler;
|
|
42
|
+
params?: () => StaticParams<Route>;
|
|
43
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marker element carrying a server-subtree error across a client island's
|
|
3
|
+
* boundary: the client entry turns it back into a throw at hydration, so the
|
|
4
|
+
* island's own error boundary catches it.
|
|
5
|
+
*/
|
|
6
|
+
export const ISLAND_BOUNDARY_ERROR_ELEMENT = 'pnext-boundary-error';
|
|
7
|
+
export const ISLAND_BOUNDARY_ERROR_MESSAGE_ATTRIBUTE = 'data-pnext-error-message';
|
|
8
|
+
export const ISLAND_BOUNDARY_ERROR_DIGEST_ATTRIBUTE = 'data-pnext-error-digest';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { h, type ComponentChildren } from 'preact';
|
|
2
|
+
|
|
3
|
+
export const ISLAND_STATIC_CHILDREN_ATTRIBUTE = 'data-pnext-static-children';
|
|
4
|
+
|
|
5
|
+
export function islandStaticChildren(
|
|
6
|
+
id: string,
|
|
7
|
+
children: ComponentChildren,
|
|
8
|
+
) {
|
|
9
|
+
if (!hasIslandStaticChildren(children)) return undefined;
|
|
10
|
+
return h(
|
|
11
|
+
'pnext-static-children',
|
|
12
|
+
{ [ISLAND_STATIC_CHILDREN_ATTRIBUTE]: id, style: { display: 'contents' } },
|
|
13
|
+
children,
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function hasIslandStaticChildren(children: ComponentChildren) {
|
|
18
|
+
return Array.isArray(children) ? children.length > 0 : children != null && children !== false;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Children that can cross the server-to-client island boundary INSIDE the serialized props (strings and
|
|
23
|
+
* numbers, or arrays of them). Element children return undefined and travel via DOM adoption instead.
|
|
24
|
+
*/
|
|
25
|
+
export function plainIslandChildren(
|
|
26
|
+
children: ComponentChildren,
|
|
27
|
+
): string | number | (string | number)[] | undefined {
|
|
28
|
+
if (typeof children === 'string' || typeof children === 'number') return children;
|
|
29
|
+
if (
|
|
30
|
+
Array.isArray(children) &&
|
|
31
|
+
children.length > 0 &&
|
|
32
|
+
children.every(child => typeof child === 'string' || typeof child === 'number')
|
|
33
|
+
) {
|
|
34
|
+
return children as (string | number)[];
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { h, type VNode } from 'preact';
|
|
2
|
+
import { isElementLike } from '../utils/serialize';
|
|
3
|
+
|
|
4
|
+
export const ISLAND_STATIC_SLOT_ATTRIBUTE = 'data-pnext-static-slot';
|
|
5
|
+
export const ISLAND_STATIC_SLOT_MARKER = '$$pnext_slot';
|
|
6
|
+
|
|
7
|
+
type Props = Record<string, unknown>;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Element-valued island props travel exactly like element children: the SSR pass wraps each one in a
|
|
11
|
+
* `pnext-static-slot` host ('ssr') and the serialized props carry a `$$pnext_slot` id in its place
|
|
12
|
+
* ('wire'). Both walks see the same prop shape, so the ids line up. Elements nested in arrays and
|
|
13
|
+
* plain objects are covered; anything else (Map/Set values, class instances) is left alone.
|
|
14
|
+
*/
|
|
15
|
+
export function islandStaticSlotProps(id: string, props: Props, mode: 'ssr' | 'wire'): Props {
|
|
16
|
+
return mapSlots(props, id, mode, [], new Set()) as Props;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function mapSlots(
|
|
20
|
+
value: unknown,
|
|
21
|
+
id: string,
|
|
22
|
+
mode: 'ssr' | 'wire',
|
|
23
|
+
path: string[],
|
|
24
|
+
seen: Set<object>,
|
|
25
|
+
): unknown {
|
|
26
|
+
if (isElementLike(value)) {
|
|
27
|
+
const slot = `${id}:${path.join('.')}`;
|
|
28
|
+
if (mode === 'wire') return { [ISLAND_STATIC_SLOT_MARKER]: slot };
|
|
29
|
+
return h(
|
|
30
|
+
'pnext-static-slot',
|
|
31
|
+
{ [ISLAND_STATIC_SLOT_ATTRIBUTE]: slot, style: { display: 'contents' } },
|
|
32
|
+
value as VNode,
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
if (value === null || typeof value !== 'object') return value;
|
|
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;
|
|
41
|
+
const entries = Array.isArray(value)
|
|
42
|
+
? value.map((item, index) => [String(index), item] as const)
|
|
43
|
+
: Object.entries(value);
|
|
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);
|
|
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);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Cheap gate on the raw props attribute so islands with no element props skip the revive walk. */
|
|
57
|
+
export function hasIslandStaticSlots(raw: string) {
|
|
58
|
+
return raw.includes(ISLAND_STATIC_SLOT_MARKER);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Client mount: swap each `$$pnext_slot` marker for a `pnext-static-slot` host holding the matching
|
|
63
|
+
* server-rendered DOM, converted to vnodes by the entry's DOM walker (so nested islands inside the
|
|
64
|
+
* adopted subtree become real island vnodes and hydrate on their own). The content is static server
|
|
65
|
+
* markup - it never re-renders, same as element children.
|
|
66
|
+
*/
|
|
67
|
+
export async function reviveIslandStaticSlots(
|
|
68
|
+
props: Props,
|
|
69
|
+
root: ParentNode,
|
|
70
|
+
toChildren: (node: ParentNode) => unknown,
|
|
71
|
+
): Promise<Props> {
|
|
72
|
+
return (await reviveSlots(props, root, toChildren, new Set())) as Props;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function reviveSlots(
|
|
76
|
+
value: unknown,
|
|
77
|
+
root: ParentNode,
|
|
78
|
+
toChildren: (node: ParentNode) => unknown,
|
|
79
|
+
seen: Set<object>,
|
|
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];
|
|
83
|
+
if (typeof marker === 'string') {
|
|
84
|
+
const node = root.querySelector(`[${ISLAND_STATIC_SLOT_ATTRIBUTE}="${cssEscape(marker)}"]`);
|
|
85
|
+
// No server markup for this slot (the island never rendered the prop, or it was skipped for
|
|
86
|
+
// SSR): nothing to adopt, so the prop arrives null rather than as an empty host.
|
|
87
|
+
if (!node) return null;
|
|
88
|
+
return h(
|
|
89
|
+
'pnext-static-slot',
|
|
90
|
+
{ [ISLAND_STATIC_SLOT_ATTRIBUTE]: marker, style: { display: 'contents' } },
|
|
91
|
+
(await toChildren(node)) as VNode,
|
|
92
|
+
);
|
|
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;
|
|
98
|
+
for (const key of Object.keys(target)) {
|
|
99
|
+
target[key] = await reviveSlots(target[key], root, toChildren, seen);
|
|
100
|
+
}
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function cssEscape(value: string) {
|
|
105
|
+
return value.replace(/["\\]/g, '\\$&');
|
|
106
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Client-safe postpone primitives (CORE).
|
|
2
|
+
//
|
|
3
|
+
// PostponeError + isPostpone are pure, browser-safe values: a client control-
|
|
4
|
+
// flow module (compat/client/errors/control-flow.ts) needs isPostpone to skip
|
|
5
|
+
// postpone errors during hydration. They used to live in ppr.ts, but ppr.ts
|
|
6
|
+
// imports `node:async_hooks` at module scope (AsyncLocalStorage prerender
|
|
7
|
+
// storage), so importing isPostpone from there dragged node:async_hooks into
|
|
8
|
+
// the browser client bundle and broke `Could not resolve "node:async_hooks"`.
|
|
9
|
+
// Splitting them out keeps ppr.ts as the single source (it re-exports these) so
|
|
10
|
+
// server callers are unaffected, while client callers import only this file.
|
|
11
|
+
|
|
12
|
+
const postponeSymbol = Symbol.for('pnext.postpone');
|
|
13
|
+
|
|
14
|
+
export class PostponeError extends Error {
|
|
15
|
+
readonly [postponeSymbol] = true;
|
|
16
|
+
constructor(readonly api: string) {
|
|
17
|
+
super(`${api} postponed for partial prerendering`);
|
|
18
|
+
this.name = 'PostponeError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function isPostpone(error: unknown): error is PostponeError {
|
|
23
|
+
return typeof error === 'object' && error !== null && postponeSymbol in error;
|
|
24
|
+
}
|