@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,26 +1,26 @@
|
|
|
1
1
|
// Shared shapes of the client router: fetched pages, navigation options, the
|
|
2
2
|
// parallel-route nav state, and the entry-module handles the router imports.
|
|
3
3
|
export interface PrefetchedPage {
|
|
4
|
-
html: string
|
|
5
|
-
finalUrl: string
|
|
6
|
-
ok: boolean
|
|
4
|
+
html: string
|
|
5
|
+
finalUrl: string
|
|
6
|
+
ok: boolean
|
|
7
7
|
/** `x-nextjs-stale-time` from the response (seconds), when the server sent it. */
|
|
8
|
-
staleTimeSeconds?: number
|
|
8
|
+
staleTimeSeconds?: number
|
|
9
9
|
/** Complete body segment was emitted from a prerendered route artifact. */
|
|
10
|
-
segmentPrerendered?: boolean
|
|
10
|
+
segmentPrerendered?: boolean
|
|
11
11
|
/**
|
|
12
12
|
* A partial-prefetch response: only the static shell, dynamic continuation
|
|
13
13
|
* cut server-side (`x-nextjs-postponed` on a prefetch fetch). Contributes its
|
|
14
14
|
* loading shell to the shell cache but must never commit as a document.
|
|
15
15
|
*/
|
|
16
|
-
shellOnly?: boolean
|
|
16
|
+
shellOnly?: boolean
|
|
17
17
|
/**
|
|
18
18
|
* This response arrived as a FRAMED segment payload and has already been filed with the per-segment
|
|
19
19
|
* policy. A prefetch that came back as a whole document instead - a route the server does not serve
|
|
20
20
|
* segments for, or a segment-unaware server - is recorded from its markup once it settles, so the
|
|
21
21
|
* per-segment cache is fed by ordinary link prefetches either way.
|
|
22
22
|
*/
|
|
23
|
-
segmentRecorded?: boolean
|
|
23
|
+
segmentRecorded?: boolean
|
|
24
24
|
/**
|
|
25
25
|
* This SHELL response published no vary set, so how much of this URL it covers is UNKNOWN - the
|
|
26
26
|
* route's baked fallback shell, rendered with every param hanging. It paints like any other shell,
|
|
@@ -28,272 +28,272 @@ export interface PrefetchedPage {
|
|
|
28
28
|
* has never been fetched, so the URL's prefetch stays only as fresh as the dynamic window. A shell
|
|
29
29
|
* that DOES publish its vary set is exact about its coverage and keeps the static window.
|
|
30
30
|
*/
|
|
31
|
-
varyCoverageUnknown?: boolean
|
|
31
|
+
varyCoverageUnknown?: boolean
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export interface LoadingShellPrediction {
|
|
35
|
-
html: string
|
|
35
|
+
html: string
|
|
36
36
|
route: {
|
|
37
37
|
// Bracket-free colon form (`/:slug*`); `catchAllOptional` distinguishes an
|
|
38
38
|
// optional catch-all so it survives being written back to __PNEXT_ROUTE__.
|
|
39
|
-
route: string
|
|
40
|
-
params: Record<string, string | string[]
|
|
41
|
-
catchAllOptional?: boolean
|
|
42
|
-
}
|
|
43
|
-
prefetch?: 'shell' | 'eager'
|
|
39
|
+
route: string
|
|
40
|
+
params: Record<string, string | string[]>
|
|
41
|
+
catchAllOptional?: boolean
|
|
42
|
+
}
|
|
43
|
+
prefetch?: 'shell' | 'eager'
|
|
44
44
|
/**
|
|
45
45
|
* The predicted 'shell' route is RUNTIME-prefetched (request-sampled): its
|
|
46
46
|
* shell content is derived from the sampled URL's params, so it is NOT shared
|
|
47
47
|
* across the route's other URLs the way a static partial shell is.
|
|
48
48
|
*/
|
|
49
|
-
runtimePrefetch?: boolean
|
|
49
|
+
runtimePrefetch?: boolean
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
export interface NavigationScrollOptions {
|
|
53
|
-
pop?: boolean
|
|
54
|
-
scroll?: boolean
|
|
53
|
+
pop?: boolean
|
|
54
|
+
scroll?: boolean
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
export type NavigationScrollAction = (url: URL, options: NavigationScrollOptions) => void
|
|
58
|
-
export type StylesheetReconciler = (incoming: Document) => void
|
|
57
|
+
export type NavigationScrollAction = (url: URL, options: NavigationScrollOptions) => void
|
|
58
|
+
export type StylesheetReconciler = (incoming: Document) => void
|
|
59
59
|
|
|
60
60
|
export type LoadingShellPredictionPolicy = (
|
|
61
61
|
url: URL,
|
|
62
62
|
shells: ReadonlyMap<string, string>,
|
|
63
|
-
) => LoadingShellPrediction | undefined
|
|
63
|
+
) => LoadingShellPrediction | undefined
|
|
64
64
|
|
|
65
65
|
export interface PrefetchOptions {
|
|
66
66
|
/** Link element that triggered the prefetch; receives lifecycle events. */
|
|
67
|
-
element?: Element
|
|
67
|
+
element?: Element
|
|
68
68
|
/** Public router.prefetch should match Next and throw for unparseable URLs. */
|
|
69
|
-
strict?: boolean
|
|
69
|
+
strict?: boolean
|
|
70
70
|
/** `prefetch={true}` full-page prefetch — reuses for the static window. */
|
|
71
|
-
full?: boolean
|
|
71
|
+
full?: boolean
|
|
72
72
|
/**
|
|
73
73
|
* Hover/touch/focus intent: the prefetch rides the scheduler's reserved
|
|
74
74
|
* Intent lane (most-recently-hovered link starts immediately, ahead of
|
|
75
75
|
* queued viewport prefetches).
|
|
76
76
|
*/
|
|
77
|
-
intent?: boolean
|
|
77
|
+
intent?: boolean
|
|
78
78
|
/**
|
|
79
79
|
* unstable_dynamicOnHover upgrade: when the route's static shell is already
|
|
80
80
|
* cached, ask the server for the dynamic continuation only (the response
|
|
81
81
|
* must not re-send static content the client already holds) and merge it
|
|
82
82
|
* into the cached shell.
|
|
83
83
|
*/
|
|
84
|
-
hoverResume?: boolean
|
|
84
|
+
hoverResume?: boolean
|
|
85
85
|
/** Called once when this prefetch is invalidated. */
|
|
86
|
-
onInvalidate?: () => void
|
|
86
|
+
onInvalidate?: () => void
|
|
87
87
|
/**
|
|
88
88
|
* Seed the prefetch for the URL the browser is ALREADY on. Next embeds a runtime-prefetch stream in
|
|
89
89
|
* the initial HTML of an allow-runtime route; pnext asks the server for the same payload instead,
|
|
90
90
|
* which means prefetching the current URL - the one case the same-URL guards must not elide.
|
|
91
91
|
*/
|
|
92
|
-
currentUrl?: boolean
|
|
92
|
+
currentUrl?: boolean
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
export interface SoftNavigateOptions extends NavigationScrollOptions {
|
|
96
|
-
replace?: boolean
|
|
96
|
+
replace?: boolean
|
|
97
97
|
/** Parallel-route state to send instead of the current document's (popstate). */
|
|
98
|
-
navState?: DocumentNavState
|
|
98
|
+
navState?: DocumentNavState
|
|
99
99
|
/** Restore this document without fetching (popstate to a cached entry). */
|
|
100
|
-
cachedPage?: PrefetchedPage
|
|
100
|
+
cachedPage?: PrefetchedPage
|
|
101
101
|
/** router.refresh()/revalidation surface: bypass caches, fetch fresh (internal). */
|
|
102
|
-
refreshLike?: boolean
|
|
102
|
+
refreshLike?: boolean
|
|
103
103
|
/**
|
|
104
104
|
* A same-URL LINK click: refresh the PAGE segments only. It takes the refresh-like path (no loading
|
|
105
105
|
* flash, caches evicted, no new history entry) but KEEPS the live layout segments, so the request
|
|
106
106
|
* may skip shared layouts exactly like any other navigation.
|
|
107
107
|
*/
|
|
108
|
-
pageRefresh?: boolean
|
|
108
|
+
pageRefresh?: boolean
|
|
109
109
|
/**
|
|
110
110
|
* Remount everything the incoming document renders - no client-page preservation. An error
|
|
111
111
|
* boundary's reset() refreshes precisely to throw the failed tree away, so keeping it alive would
|
|
112
112
|
* replay the error.
|
|
113
113
|
*/
|
|
114
|
-
remount?: boolean
|
|
114
|
+
remount?: boolean
|
|
115
115
|
/**
|
|
116
116
|
* The incoming document is freshly rendered server data that supersedes the live tree (the response
|
|
117
117
|
* to a revalidating action, or the document a post-action redirect landed on): take ALL of its
|
|
118
118
|
* server segments instead of grafting the live layouts over them, or the write would be invisible.
|
|
119
119
|
* Island preservation is unaffected - useActionState must survive.
|
|
120
120
|
*/
|
|
121
|
-
freshSegments?: boolean
|
|
121
|
+
freshSegments?: boolean
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
/** Mirrors NavState in src/types.ts (kept local: this file ships to browsers). */
|
|
125
125
|
export interface DocumentNavState {
|
|
126
|
-
children?: string
|
|
126
|
+
children?: string
|
|
127
127
|
/** Search string the children tree rendered with (refetch-URL semantics). */
|
|
128
|
-
childrenSearch?: string
|
|
128
|
+
childrenSearch?: string
|
|
129
129
|
/** Slot dir -> source URL (`path` or `path?query`) its content rendered from. */
|
|
130
|
-
slots?: Record<string, string
|
|
130
|
+
slots?: Record<string, string>
|
|
131
131
|
/**
|
|
132
132
|
* The document is an interception HOST render (server-stamped): the URL is the intercepted target
|
|
133
133
|
* but the children tree kept rendering the host page. Such a render is host-bound - never
|
|
134
134
|
* origin-agnostic, never a direct target render.
|
|
135
135
|
*/
|
|
136
|
-
hostRender?: boolean
|
|
136
|
+
hostRender?: boolean
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
export interface ActiveEntry {
|
|
140
140
|
/** `keepRoots`: live island roots the next document reuses — do not unmount. */
|
|
141
|
-
unmount?: (keepRoots?: Set<Element>) => void
|
|
141
|
+
unmount?: (keepRoots?: Set<Element>) => void
|
|
142
142
|
}
|
|
143
143
|
|
|
144
144
|
/** Mount container of a whole-page client route (element or marker-range proxy). */
|
|
145
145
|
export interface ClientPageRoot {
|
|
146
|
-
isConnected?: boolean
|
|
146
|
+
isConnected?: boolean
|
|
147
147
|
/** Page-slot comment anchors when the entry dissolved `div#pnext-page`. */
|
|
148
|
-
__pnextAnchors?: [Comment, Comment]
|
|
148
|
+
__pnextAnchors?: [Comment, Comment]
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
export interface EntryModule {
|
|
152
|
-
mountRoute?: () => Promise<unknown> | void
|
|
152
|
+
mountRoute?: () => Promise<unknown> | void
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
+
/** Mirror of core's PrefetchMode; the router keeps no imports outside its chunk. */
|
|
156
|
+
export type LinkPrefetchMode = false | 'intent' | 'visible' | 'load'
|
|
157
|
+
|
|
155
158
|
declare global {
|
|
156
159
|
interface Window {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
+
/** App-wide default prefetch mode (config `prefetch`), injected by the server. */
|
|
161
|
+
__PNEXT_PREFETCH__?: LinkPrefetchMode
|
|
162
|
+
__PNEXT_ROUTER_INSTALLED__?: boolean
|
|
163
|
+
__PNEXT_ROUTER_IMPORTS__?: number
|
|
164
|
+
__PNEXT_ACTIVE_ENTRY__?: ActiveEntry
|
|
160
165
|
/** The entry's guarded remount hook — mounts only what a prior pass missed. */
|
|
161
|
-
__PNEXT_MOUNT_ISLANDS__?: () => unknown
|
|
166
|
+
__PNEXT_MOUNT_ISLANDS__?: () => unknown
|
|
162
167
|
/**
|
|
163
168
|
* The container a whole-page `'use client'` route is mounted on. A real
|
|
164
169
|
* `#pnext-page` element in a nested/segment context; otherwise the virtual
|
|
165
170
|
* container the entry builds over the dissolved page's comment anchors
|
|
166
171
|
* (carried on `__pnextAnchors`). See matchPreservedClientPage.
|
|
167
172
|
*/
|
|
168
|
-
__PNEXT_CLIENT_PAGE_ROOT__?: ClientPageRoot
|
|
169
|
-
__PNEXT_LOCATION_LISTENERS__?: Set<() => void
|
|
173
|
+
__PNEXT_CLIENT_PAGE_ROOT__?: ClientPageRoot
|
|
174
|
+
__PNEXT_LOCATION_LISTENERS__?: Set<() => void>
|
|
170
175
|
next?: {
|
|
171
176
|
router?: {
|
|
172
|
-
push?: (href: string) => Promise<void
|
|
173
|
-
replace?: (href: string) => Promise<void
|
|
174
|
-
prefetch?: (href: string) => Promise<PrefetchedPage | null
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
+
push?: (href: string) => Promise<void>
|
|
178
|
+
replace?: (href: string) => Promise<void>
|
|
179
|
+
prefetch?: (href: string) => Promise<PrefetchedPage | null>
|
|
180
|
+
}
|
|
181
|
+
}
|
|
177
182
|
}
|
|
178
183
|
}
|
|
179
184
|
|
|
180
|
-
|
|
181
185
|
export interface SegmentCacheRecord {
|
|
182
186
|
/** Requested pathname (percent-encoding preserved). */
|
|
183
|
-
pathname: string
|
|
187
|
+
pathname: string
|
|
184
188
|
/** Requested query string (leading `?` included, `_rsc` still present). */
|
|
185
|
-
search: string
|
|
189
|
+
search: string
|
|
186
190
|
/** Segment request key the response answered (`/_index`, `/_head`, …). */
|
|
187
|
-
segmentPath: string
|
|
191
|
+
segmentPath: string
|
|
188
192
|
/**
|
|
189
193
|
* Wire shape of `body`: a framed segment payload (a prefetch response) or a
|
|
190
194
|
* whole HTML document (a navigation response / the hard-loaded page). The
|
|
191
195
|
* policy decodes its vary metadata differently for each.
|
|
192
196
|
*/
|
|
193
|
-
kind?: 'segment' | 'document'
|
|
197
|
+
kind?: 'segment' | 'document'
|
|
194
198
|
/** The raw segment payload text, for the policy's own decoding. */
|
|
195
|
-
body: string
|
|
199
|
+
body: string
|
|
196
200
|
/** The payload the router committed for this segment. */
|
|
197
|
-
html: string
|
|
201
|
+
html: string
|
|
198
202
|
/** Reuse window in milliseconds. */
|
|
199
|
-
staleTimeMs: number
|
|
203
|
+
staleTimeMs: number
|
|
200
204
|
/** True when the payload is a whole document, not a truncated shell. */
|
|
201
|
-
complete: boolean
|
|
205
|
+
complete: boolean
|
|
202
206
|
/** True when the bytes are a pure function of the URL (a prerender). */
|
|
203
|
-
static: boolean
|
|
207
|
+
static: boolean
|
|
204
208
|
/** True when the payload came from a runtime (request-sampled) prefetch. */
|
|
205
|
-
runtime: boolean
|
|
209
|
+
runtime: boolean
|
|
206
210
|
}
|
|
207
211
|
|
|
208
212
|
export interface SegmentCacheLookup {
|
|
209
|
-
pathname: string
|
|
210
|
-
search: string
|
|
211
|
-
segmentPath: string
|
|
213
|
+
pathname: string
|
|
214
|
+
search: string
|
|
215
|
+
segmentPath: string
|
|
212
216
|
}
|
|
213
217
|
|
|
214
218
|
export interface SegmentCacheHit {
|
|
215
|
-
html: string
|
|
219
|
+
html: string
|
|
216
220
|
/** True when this hit may commit a navigation with no network request. */
|
|
217
|
-
networkFree: boolean
|
|
221
|
+
networkFree: boolean
|
|
218
222
|
/**
|
|
219
223
|
* True when a PREFETCH of this URL has nothing left to fetch. Weaker than
|
|
220
224
|
* `networkFree`: a shell shared across params satisfies the prefetch (its
|
|
221
225
|
* static half is already cached) while the NAVIGATION still fetches the
|
|
222
226
|
* dynamic remainder. Absent (older policies) reads as `networkFree`.
|
|
223
227
|
*/
|
|
224
|
-
prefetchSatisfied?: boolean
|
|
228
|
+
prefetchSatisfied?: boolean
|
|
225
229
|
}
|
|
226
230
|
|
|
227
231
|
export interface SegmentCachePolicy {
|
|
228
|
-
record: (input: SegmentCacheRecord) => void
|
|
229
|
-
take: (input: SegmentCacheLookup) => SegmentCacheHit | null
|
|
232
|
+
record: (input: SegmentCacheRecord) => void
|
|
233
|
+
take: (input: SegmentCacheLookup) => SegmentCacheHit | null
|
|
230
234
|
/**
|
|
231
235
|
* The route pattern (colon form) the server resolved `pathname` to, or null
|
|
232
236
|
* when this exact pathname was never answered. The route-tree cache uses it
|
|
233
237
|
* as its static-sibling guard.
|
|
234
238
|
*/
|
|
235
|
-
routeFor?: (pathname: string) => string | null
|
|
239
|
+
routeFor?: (pathname: string) => string | null
|
|
236
240
|
/** True when the colon-form `route` pattern covers `pathname`. */
|
|
237
|
-
matchesRoute?: (route: string, pathname: string) => boolean
|
|
241
|
+
matchesRoute?: (route: string, pathname: string) => boolean
|
|
238
242
|
/**
|
|
239
243
|
* The cached bytes a PREFETCH of this segment would re-fetch verbatim: a DIFFERENT URL's entry whose
|
|
240
244
|
* published vary set covers this one. Weaker than `take` - the entry may be a postponed shell, so it
|
|
241
245
|
* never commits - but it is byte-identical by the server's own assertion, so the request is skipped.
|
|
242
246
|
*/
|
|
243
|
-
prefetchCovered?: (input: SegmentCacheLookup) => { html: string } | null
|
|
247
|
+
prefetchCovered?: (input: SegmentCacheLookup) => { html: string } | null
|
|
244
248
|
/**
|
|
245
249
|
* w9-segment-split: the PAGE frame is cached but the LAYOUT frame is not,
|
|
246
250
|
* so only `/_layout` has to come off the network.
|
|
247
251
|
*/
|
|
248
|
-
needsLayoutFrameOnly?: (input: { pathname: string; search: string }) => boolean
|
|
252
|
+
needsLayoutFrameOnly?: (input: { pathname: string; search: string }) => boolean
|
|
249
253
|
/**
|
|
250
254
|
* Join a `/_layout` response with this URL's cached PAGE frame into the whole
|
|
251
255
|
* document. Null when the two cannot be proven to line up.
|
|
252
256
|
*/
|
|
253
257
|
composeLayoutFrame?: (input: {
|
|
254
|
-
pathname: string
|
|
255
|
-
search: string
|
|
256
|
-
layoutHtml: string
|
|
257
|
-
}) => string | null
|
|
258
|
+
pathname: string
|
|
259
|
+
search: string
|
|
260
|
+
layoutHtml: string
|
|
261
|
+
}) => string | null
|
|
258
262
|
/**
|
|
259
263
|
* True when a RUNTIME-prefetched page frame already covers this URL. Such a route's layout is not
|
|
260
264
|
* statically prefetchable (only the page opted into allow-runtime), so a page-frame hit leaves the
|
|
261
265
|
* prefetch with nothing to fetch - the layout arrives with the navigation's dynamic stage.
|
|
262
266
|
*/
|
|
263
|
-
runtimePageFrameSatisfied?: (input: { pathname: string; search: string }) => boolean
|
|
267
|
+
runtimePageFrameSatisfied?: (input: { pathname: string; search: string }) => boolean
|
|
264
268
|
/**
|
|
265
269
|
* w9-segment-split (G2): this URL's LAYOUT chain is already cached (or, for a
|
|
266
270
|
* same-URL navigation, already on screen), so the navigation may fetch the
|
|
267
271
|
* `/_page` frame alone. `sameUrl` is what authorises the live document's own
|
|
268
272
|
* layout as the frame.
|
|
269
273
|
*/
|
|
270
|
-
needsPageFrameOnly?: (input: {
|
|
271
|
-
pathname: string;
|
|
272
|
-
search: string;
|
|
273
|
-
sameUrl: boolean;
|
|
274
|
-
}) => boolean;
|
|
274
|
+
needsPageFrameOnly?: (input: { pathname: string; search: string; sameUrl: boolean }) => boolean
|
|
275
275
|
/**
|
|
276
276
|
* Splice a `/_page` response into that cached layout frame. Null means the
|
|
277
277
|
* two could not be proven to line up — the caller fetches the whole document.
|
|
278
278
|
*/
|
|
279
279
|
composePageFrame?: (input: {
|
|
280
|
-
pathname: string
|
|
281
|
-
search: string
|
|
282
|
-
sameUrl: boolean
|
|
283
|
-
pageHtml: string
|
|
284
|
-
}) => string | null
|
|
280
|
+
pathname: string
|
|
281
|
+
search: string
|
|
282
|
+
sameUrl: boolean
|
|
283
|
+
pageHtml: string
|
|
284
|
+
}) => string | null
|
|
285
285
|
/**
|
|
286
286
|
* File the LAYOUT frame of a committed whole document, so a later same-URL
|
|
287
287
|
* navigation can refresh the page segments without re-fetching the layouts.
|
|
288
288
|
*/
|
|
289
289
|
recordDocumentLayout?: (input: {
|
|
290
|
-
pathname: string
|
|
291
|
-
search: string
|
|
292
|
-
html: string
|
|
293
|
-
staleTimeMs: number
|
|
294
|
-
}) => void
|
|
290
|
+
pathname: string
|
|
291
|
+
search: string
|
|
292
|
+
html: string
|
|
293
|
+
staleTimeMs: number
|
|
294
|
+
}) => void
|
|
295
295
|
/** A same-URL navigation refreshes page segments only. */
|
|
296
|
-
evictPageSegments: () => void
|
|
296
|
+
evictPageSegments: () => void
|
|
297
297
|
/** A revalidation invalidates every segment entry. */
|
|
298
|
-
clear: () => void
|
|
298
|
+
clear: () => void
|
|
299
299
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import path from 'node:path'
|
|
2
|
-
import { realpathSync } from 'node:fs'
|
|
3
|
-
import type { Plugin } from 'esbuild'
|
|
4
|
-
import { readText } from '../../utils/fs'
|
|
5
|
-
import { escapeRegex } from '../../utils/
|
|
6
|
-
import { actionId } from './ids'
|
|
7
|
-
import { moduleActionExports, moduleLevelUseCache, moduleLevelUseServer } from './detect'
|
|
8
|
-
import { clientStubSource } from './client-stub'
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { realpathSync } from 'node:fs'
|
|
3
|
+
import type { Plugin } from 'esbuild'
|
|
4
|
+
import { readText } from '../../utils/fs'
|
|
5
|
+
import { escapeRegex } from '../../utils/code'
|
|
6
|
+
import { actionId } from './ids'
|
|
7
|
+
import { moduleActionExports, moduleLevelUseCache, moduleLevelUseServer } from './detect'
|
|
8
|
+
import { clientStubSource } from './client-stub'
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Process-level set of `'use server'` module source paths (absolute) that the
|
|
@@ -18,24 +18,23 @@ import { clientStubSource } from './client-stub';
|
|
|
18
18
|
* emits ids that match the server registry.
|
|
19
19
|
*/
|
|
20
20
|
interface ClientActionState {
|
|
21
|
-
root: string
|
|
21
|
+
root: string
|
|
22
22
|
/** Original (as-discovered) absolute paths — used for import identity. */
|
|
23
|
-
files: Set<string
|
|
23
|
+
files: Set<string>
|
|
24
24
|
/** Realpath-canonical paths — used to match esbuild's resolved paths. */
|
|
25
|
-
canonicalFiles: Set<string
|
|
25
|
+
canonicalFiles: Set<string>
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
let clientActionState: ClientActionState | undefined
|
|
28
|
+
let clientActionState: ClientActionState | undefined
|
|
29
29
|
|
|
30
30
|
export function setClientActionModules(root: string, files: Iterable<string>) {
|
|
31
|
-
const originals = new Set<string>()
|
|
32
|
-
const canonicalFiles = new Set<string>()
|
|
31
|
+
const originals = new Set<string>()
|
|
32
|
+
const canonicalFiles = new Set<string>()
|
|
33
33
|
for (const file of files) {
|
|
34
|
-
originals.add(path.resolve(file))
|
|
35
|
-
canonicalFiles.add(canonical(file))
|
|
34
|
+
originals.add(path.resolve(file))
|
|
35
|
+
canonicalFiles.add(canonical(file))
|
|
36
36
|
}
|
|
37
|
-
clientActionState =
|
|
38
|
-
originals.size > 0 ? { root, files: originals, canonicalFiles } : undefined;
|
|
37
|
+
clientActionState = originals.size > 0 ? { root, files: originals, canonicalFiles } : undefined
|
|
39
38
|
}
|
|
40
39
|
|
|
41
40
|
// esbuild reports resolved paths through the OS realpath (e.g. /private on
|
|
@@ -43,50 +42,50 @@ export function setClientActionModules(root: string, files: Iterable<string>) {
|
|
|
43
42
|
// used for id computation so the build, the client stub, and the render-side
|
|
44
43
|
// form tagging all derive the same wire id from the same (realpath) basis.
|
|
45
44
|
export function canonical(file: string) {
|
|
46
|
-
const abs = path.resolve(file)
|
|
45
|
+
const abs = path.resolve(file)
|
|
47
46
|
try {
|
|
48
|
-
return realpathSync.native(abs)
|
|
47
|
+
return realpathSync.native(abs)
|
|
49
48
|
} catch {
|
|
50
|
-
return abs
|
|
49
|
+
return abs
|
|
51
50
|
}
|
|
52
51
|
}
|
|
53
52
|
|
|
54
53
|
export function clearClientActionModules() {
|
|
55
|
-
clientActionState = undefined
|
|
54
|
+
clientActionState = undefined
|
|
56
55
|
}
|
|
57
56
|
|
|
58
57
|
export function hasClientActionModules() {
|
|
59
|
-
return clientActionState !== undefined && clientActionState.files.size > 0
|
|
58
|
+
return clientActionState !== undefined && clientActionState.files.size > 0
|
|
60
59
|
}
|
|
61
60
|
|
|
62
61
|
function isActionModule(file: string) {
|
|
63
|
-
if (!clientActionState) return false
|
|
62
|
+
if (!clientActionState) return false
|
|
64
63
|
// Match both the original and the realpath-canonical form: render passes the
|
|
65
64
|
// original path; esbuild passes the realpath.
|
|
66
65
|
return (
|
|
67
66
|
clientActionState.files.has(path.resolve(file)) ||
|
|
68
67
|
clientActionState.canonicalFiles.has(canonical(file))
|
|
69
|
-
)
|
|
68
|
+
)
|
|
70
69
|
}
|
|
71
70
|
|
|
72
71
|
/** True when `file` is a discovered client-replaced action module. */
|
|
73
72
|
export function isClientActionModule(file: string) {
|
|
74
|
-
return isActionModule(file)
|
|
73
|
+
return isActionModule(file)
|
|
75
74
|
}
|
|
76
75
|
|
|
77
76
|
/** Root the client action ids were computed against (for stub id parity). */
|
|
78
77
|
export function clientActionModulesRoot() {
|
|
79
|
-
return clientActionState?.root
|
|
78
|
+
return clientActionState?.root
|
|
80
79
|
}
|
|
81
80
|
|
|
82
81
|
/** All discovered action module source paths (absolute). */
|
|
83
82
|
export function clientActionModuleFiles(): string[] {
|
|
84
|
-
return clientActionState ? [...clientActionState.files] : []
|
|
83
|
+
return clientActionState ? [...clientActionState.files] : []
|
|
85
84
|
}
|
|
86
85
|
|
|
87
86
|
/** Generate the client fetch-stub source for an action module file. */
|
|
88
87
|
export function actionStubSourceFor(file: string, root?: string) {
|
|
89
|
-
return stubSourceFor(file, root ?? clientActionState?.root)
|
|
88
|
+
return stubSourceFor(file, root ?? clientActionState?.root)
|
|
90
89
|
}
|
|
91
90
|
|
|
92
91
|
/**
|
|
@@ -99,30 +98,30 @@ export function actionStubSourceFor(file: string, root?: string) {
|
|
|
99
98
|
export function actionClientStubPlugin(): Plugin {
|
|
100
99
|
const paths = clientActionState
|
|
101
100
|
? [...clientActionState.files, ...clientActionState.canonicalFiles]
|
|
102
|
-
: []
|
|
103
|
-
const filter = new RegExp(`^(?:${[...new Set(paths)].map(escapeRegex).join('|')})$`)
|
|
101
|
+
: []
|
|
102
|
+
const filter = new RegExp(`^(?:${[...new Set(paths)].map(escapeRegex).join('|')})$`)
|
|
104
103
|
return {
|
|
105
104
|
name: 'pnext-action-client-stub',
|
|
106
105
|
setup(build) {
|
|
107
|
-
if (paths.length === 0) return
|
|
106
|
+
if (paths.length === 0) return
|
|
108
107
|
build.onLoad({ filter, namespace: 'file' }, async args => {
|
|
109
|
-
if (!isActionModule(args.path)) return undefined
|
|
108
|
+
if (!isActionModule(args.path)) return undefined
|
|
110
109
|
return {
|
|
111
110
|
contents: await stubSourceFor(args.path, clientActionState?.root),
|
|
112
111
|
loader: 'js',
|
|
113
|
-
}
|
|
114
|
-
})
|
|
112
|
+
}
|
|
113
|
+
})
|
|
115
114
|
},
|
|
116
|
-
}
|
|
115
|
+
}
|
|
117
116
|
}
|
|
118
117
|
|
|
119
118
|
async function stubSourceFor(file: string, root?: string) {
|
|
120
|
-
const source = await readText(file)
|
|
121
|
-
if (!moduleLevelUseServer(source) && !moduleLevelUseCache(source)) return 'export {};'
|
|
122
|
-
const exports = moduleActionExports(source)
|
|
123
|
-
const actionIds: Record<string, string> = {}
|
|
124
|
-
for (const name of exports) actionIds[name] = canonicalActionId(file, name, root)
|
|
125
|
-
return clientStubSource({ modulePath: file, exports, actionIds })
|
|
119
|
+
const source = await readText(file)
|
|
120
|
+
if (!moduleLevelUseServer(source) && !moduleLevelUseCache(source)) return 'export {};'
|
|
121
|
+
const exports = moduleActionExports(source)
|
|
122
|
+
const actionIds: Record<string, string> = {}
|
|
123
|
+
for (const name of exports) actionIds[name] = canonicalActionId(file, name, root)
|
|
124
|
+
return clientStubSource({ modulePath: file, exports, actionIds })
|
|
126
125
|
}
|
|
127
126
|
|
|
128
127
|
/**
|
|
@@ -131,5 +130,5 @@ async function stubSourceFor(file: string, root?: string) {
|
|
|
131
130
|
* symlink/realpath differences (e.g. /private on macOS temp dirs).
|
|
132
131
|
*/
|
|
133
132
|
export function canonicalActionId(file: string, exportName: string, root?: string): string {
|
|
134
|
-
return actionId(canonical(file), exportName, root ? canonical(root) : undefined)
|
|
133
|
+
return actionId(canonical(file), exportName, root ? canonical(root) : undefined)
|
|
135
134
|
}
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* and the precomputed wire id for each.
|
|
5
5
|
*/
|
|
6
6
|
export interface ClientStubModule {
|
|
7
|
-
modulePath: string
|
|
8
|
-
exports: readonly string[]
|
|
9
|
-
actionIds: Record<string, string
|
|
7
|
+
modulePath: string
|
|
8
|
+
exports: readonly string[]
|
|
9
|
+
actionIds: Record<string, string>
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
/**
|
|
@@ -20,20 +20,20 @@ export interface ClientStubModule {
|
|
|
20
20
|
* self-contained ES module with no imports, so it can be emitted to disk and bundled as-is.
|
|
21
21
|
*/
|
|
22
22
|
export function clientStubSource(module: ClientStubModule): string {
|
|
23
|
-
const lines: string[] = []
|
|
23
|
+
const lines: string[] = []
|
|
24
24
|
|
|
25
|
-
lines.push(`// Generated pnext server-action client stub.`)
|
|
26
|
-
lines.push(`// Module: ${sanitizeComment(module.modulePath)}`)
|
|
27
|
-
lines.push(RUNTIME)
|
|
25
|
+
lines.push(`// Generated pnext server-action client stub.`)
|
|
26
|
+
lines.push(`// Module: ${sanitizeComment(module.modulePath)}`)
|
|
27
|
+
lines.push(RUNTIME)
|
|
28
28
|
|
|
29
29
|
for (const name of module.exports) {
|
|
30
|
-
const id = module.actionIds[name]
|
|
31
|
-
if (!id) continue
|
|
32
|
-
const decl = name === 'default' ? 'export default' : `export const ${name}
|
|
33
|
-
lines.push(`${decl} __pnextAction(${JSON.stringify(id)});`)
|
|
30
|
+
const id = module.actionIds[name]
|
|
31
|
+
if (!id) continue
|
|
32
|
+
const decl = name === 'default' ? 'export default' : `export const ${name} =`
|
|
33
|
+
lines.push(`${decl} __pnextAction(${JSON.stringify(id)});`)
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
return lines.join('\n') + '\n'
|
|
36
|
+
return lines.join('\n') + '\n'
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
const RUNTIME = `
|
|
@@ -58,8 +58,8 @@ function __pnextAction(id) {
|
|
|
58
58
|
action.$$pnextActionId = id;
|
|
59
59
|
return action;
|
|
60
60
|
}
|
|
61
|
-
|
|
61
|
+
`
|
|
62
62
|
|
|
63
63
|
function sanitizeComment(value: string): string {
|
|
64
|
-
return value.replace(/\*\//g, '*\\/').replace(/[\r\n]/g, ' ')
|
|
64
|
+
return value.replace(/\*\//g, '*\\/').replace(/[\r\n]/g, ' ')
|
|
65
65
|
}
|