@rangojs/router 0.0.0-experimental.b9cb8739 → 0.0.0-experimental.bdaf10aa
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/AGENTS.md +8 -4
- package/README.md +303 -741
- package/dist/bin/rango.js +730 -184
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +4344 -1335
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +86 -15
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +85 -6
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +251 -24
- package/skills/caching/SKILL.md +375 -17
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +110 -4
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +5 -3
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +87 -56
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +73 -691
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +129 -27
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +94 -18
- package/skills/layout/SKILL.md +62 -19
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +302 -54
- package/skills/middleware/SKILL.md +59 -16
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +29 -2
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +225 -10
- package/skills/ppr/SKILL.md +622 -0
- package/skills/prerender/SKILL.md +178 -124
- package/skills/rango/SKILL.md +318 -24
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +138 -49
- package/skills/route/SKILL.md +172 -9
- package/skills/router-setup/SKILL.md +131 -11
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +130 -0
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +45 -616
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +74 -15
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +1 -66
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +257 -158
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/logging.ts +28 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-bridge.ts +132 -33
- package/src/browser/navigation-client.ts +218 -68
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +203 -80
- package/src/browser/navigation-transaction.ts +18 -66
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +241 -127
- package/src/browser/prefetch/cache.ts +271 -44
- package/src/browser/prefetch/fetch.ts +367 -40
- package/src/browser/prefetch/queue.ts +144 -23
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +121 -16
- package/src/browser/react/NavigationProvider.tsx +240 -122
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +66 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +178 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +23 -69
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +32 -7
- package/src/browser/react/use-params.ts +20 -10
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +46 -11
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +99 -8
- package/src/browser/rsc-router.tsx +272 -80
- package/src/browser/scroll-restoration.ts +56 -22
- package/src/browser/segment-reconciler.ts +44 -7
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +244 -71
- package/src/browser/types.ts +136 -12
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +207 -158
- package/src/build/generate-route-types.ts +6 -1
- package/src/build/index.ts +11 -3
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +198 -41
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +16 -5
- package/src/build/route-types/include-resolution.ts +464 -63
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +22 -6
- package/src/build/route-types/router-processing.ts +336 -110
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +13 -21
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +58 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +454 -97
- package/src/cache/cache-scope.ts +235 -103
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2446 -170
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +11 -17
- package/src/cache/document-cache.ts +144 -49
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +24 -20
- package/src/cache/memory-segment-store.ts +243 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +13 -21
- package/src/cache/shell-snapshot.ts +417 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +55 -0
- package/src/cache/types.ts +194 -99
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1132 -0
- package/src/client.rsc.tsx +41 -21
- package/src/client.tsx +116 -290
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +84 -2
- package/src/debug.ts +2 -2
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +30 -4
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +104 -34
- package/src/handles/MetaTags.tsx +24 -53
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +35 -8
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +14 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +13 -22
- package/src/host/index.ts +9 -2
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +100 -13
- package/src/index.ts +143 -19
- package/src/internal-debug.ts +11 -10
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +37 -41
- package/src/prerender.ts +215 -86
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +65 -15
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +19 -77
- package/src/route-definition/dsl-helpers.ts +485 -303
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +153 -77
- package/src/route-definition/index.ts +4 -2
- package/src/route-definition/redirect.ts +53 -12
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +48 -21
- package/src/route-types.ts +37 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +164 -17
- package/src/router/error-handling.ts +45 -18
- package/src/router/find-match.ts +130 -29
- package/src/router/handler-context.ts +83 -39
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +50 -24
- package/src/router/lazy-includes.ts +89 -63
- package/src/router/loader-resolution.ts +286 -56
- package/src/router/logging.ts +5 -8
- package/src/router/manifest.ts +105 -56
- package/src/router/match-api.ts +178 -218
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +211 -165
- package/src/router/match-middleware/background-revalidation.ts +66 -22
- package/src/router/match-middleware/cache-lookup.ts +214 -263
- package/src/router/match-middleware/cache-store.ts +105 -50
- package/src/router/match-middleware/intercept-resolution.ts +8 -28
- package/src/router/match-middleware/segment-resolution.ts +52 -18
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +128 -44
- package/src/router/metrics.ts +5 -34
- package/src/router/middleware-types.ts +13 -142
- package/src/router/middleware.ts +301 -177
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +181 -150
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +203 -58
- package/src/router/preview-match.ts +35 -103
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +123 -73
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +11 -29
- package/src/router/router-interfaces.ts +146 -35
- package/src/router/router-options.ts +202 -15
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +301 -78
- package/src/router/segment-resolution/helpers.ts +115 -30
- package/src/router/segment-resolution/loader-cache.ts +156 -39
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +83 -0
- package/src/router/segment-resolution/revalidation.ts +477 -385
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +5 -1
- package/src/router/segment-wrappers.ts +8 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +160 -200
- package/src/router/telemetry.ts +105 -20
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +171 -59
- package/src/router/types.ts +10 -63
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +210 -71
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +682 -508
- package/src/rsc/helpers.ts +168 -46
- package/src/rsc/index.ts +2 -5
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +127 -31
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +138 -15
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +99 -189
- package/src/rsc/rsc-rendering.ts +509 -73
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +287 -113
- package/src/rsc/shell-capture.ts +1190 -0
- package/src/rsc/shell-serve.ts +181 -0
- package/src/rsc/ssr-setup.ts +18 -2
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +62 -6
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +35 -30
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +449 -132
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +367 -61
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +152 -5
- package/src/server/handle-store.ts +40 -38
- package/src/server/loader-registry.ts +38 -46
- package/src/server/request-context.ts +558 -173
- package/src/ssr/index.tsx +491 -174
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +27 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +371 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +357 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +56 -84
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +17 -8
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +234 -82
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +44 -15
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +20 -52
- package/src/types/route-entry.ts +19 -7
- package/src/types/segments.ts +137 -14
- package/src/urls/include-helper.ts +40 -75
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +2 -11
- package/src/urls/path-helper-types.ts +102 -23
- package/src/urls/path-helper.ts +62 -111
- package/src/urls/pattern-types.ts +84 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +98 -154
- package/src/urls/urls-function.ts +1 -19
- package/src/use-loader.tsx +346 -89
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +36 -38
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +130 -85
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +214 -132
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +57 -6
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +15 -0
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +234 -62
- package/src/vite/plugins/cjs-to-esm.ts +16 -19
- package/src/vite/plugins/client-ref-dedup.ts +16 -11
- package/src/vite/plugins/client-ref-hashing.ts +28 -15
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/plugins/expose-action-id.ts +49 -98
- package/src/vite/plugins/expose-id-utils.ts +96 -51
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
- package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
- package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
- package/src/vite/plugins/expose-internal-ids.ts +553 -317
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +89 -27
- package/src/vite/plugins/use-cache-transform.ts +73 -83
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +40 -29
- package/src/vite/plugins/version-plugin.ts +46 -37
- package/src/vite/plugins/virtual-entries.ts +138 -27
- package/src/vite/rango.ts +353 -303
- package/src/vite/router-discovery.ts +1090 -166
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +4 -59
- package/src/vite/utils/package-resolution.ts +20 -52
- package/src/vite/utils/prerender-utils.ts +98 -38
- package/src/vite/utils/shared-utils.ts +144 -44
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/react/use-client-cache.ts +0 -58
- package/src/browser/shallow.ts +0 -40
- package/src/handles/index.ts +0 -7
- package/src/network-error-thrower.tsx +0 -23
- package/src/router/middleware-cookies.ts +0 -55
|
@@ -8,125 +8,41 @@ import {
|
|
|
8
8
|
revalidate,
|
|
9
9
|
parallel,
|
|
10
10
|
intercept,
|
|
11
|
-
when,
|
|
12
11
|
errorBoundary,
|
|
13
12
|
notFoundBoundary,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
route,
|
|
14
|
+
loader,
|
|
15
|
+
loading,
|
|
16
|
+
transition,
|
|
18
17
|
} from "./dsl-helpers.js";
|
|
19
18
|
import RootLayout from "../server/root-layout";
|
|
20
19
|
import { invariant } from "../errors";
|
|
21
20
|
|
|
22
|
-
/*
|
|
23
|
-
* Create revalidate helper
|
|
24
|
-
*/
|
|
25
|
-
const createRevalidateHelper = <TEnv>(): RouteHelpers<
|
|
26
|
-
any,
|
|
27
|
-
TEnv
|
|
28
|
-
>["revalidate"] => {
|
|
29
|
-
return revalidate as RouteHelpers<any, TEnv>["revalidate"];
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Create errorBoundary helper
|
|
34
|
-
*/
|
|
35
|
-
const createErrorBoundaryHelper = <TEnv>(): RouteHelpers<
|
|
36
|
-
any,
|
|
37
|
-
TEnv
|
|
38
|
-
>["errorBoundary"] => {
|
|
39
|
-
return errorBoundary as RouteHelpers<any, TEnv>["errorBoundary"];
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Create notFoundBoundary helper
|
|
44
|
-
*/
|
|
45
|
-
const createNotFoundBoundaryHelper = <TEnv>(): RouteHelpers<
|
|
46
|
-
any,
|
|
47
|
-
TEnv
|
|
48
|
-
>["notFoundBoundary"] => {
|
|
49
|
-
return notFoundBoundary as RouteHelpers<any, TEnv>["notFoundBoundary"];
|
|
50
|
-
};
|
|
51
|
-
|
|
52
21
|
/**
|
|
53
|
-
*
|
|
22
|
+
* Assemble the RouteHelpers object. The helpers are the DSL functions
|
|
23
|
+
* themselves; the single cast erases the phantom generics (and the extra
|
|
24
|
+
* `route` key) that the per-router RouteHelpers<T, TEnv> type carries but the
|
|
25
|
+
* runtime functions do not.
|
|
54
26
|
*/
|
|
55
|
-
|
|
56
|
-
|
|
27
|
+
function buildRouteHelpers<T extends RouteDefinition, TEnv>(): RouteHelpers<
|
|
28
|
+
T,
|
|
57
29
|
TEnv
|
|
58
|
-
>
|
|
59
|
-
return
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
TEnv,
|
|
75
|
-
>(): RouteHelpers<T, TEnv>["intercept"] => {
|
|
76
|
-
return intercept as RouteHelpers<T, TEnv>["intercept"];
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Create loader helper
|
|
81
|
-
*/
|
|
82
|
-
const createLoaderHelper = <TEnv>(): RouteHelpers<any, TEnv>["loader"] => {
|
|
83
|
-
return loaderFn as RouteHelpers<any, TEnv>["loader"];
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Create loading helper
|
|
88
|
-
*/
|
|
89
|
-
const createLoadingHelper = (): RouteHelpers<any, any>["loading"] => {
|
|
90
|
-
return loadingFn;
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Create route helper
|
|
95
|
-
*/
|
|
96
|
-
const createRouteHelper = <
|
|
97
|
-
const T extends RouteDefinition,
|
|
98
|
-
TEnv,
|
|
99
|
-
>(): RouteHelpers<T, TEnv>["route"] => {
|
|
100
|
-
return routeFn as unknown as RouteHelpers<T, TEnv>["route"];
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Create layout helper
|
|
105
|
-
*/
|
|
106
|
-
const createLayoutHelper = <TEnv>(): RouteHelpers<any, TEnv>["layout"] => {
|
|
107
|
-
return layout as RouteHelpers<any, TEnv>["layout"];
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Create when helper for intercept conditions
|
|
112
|
-
*/
|
|
113
|
-
const createWhenHelper = (): RouteHelpers<any, any>["when"] => {
|
|
114
|
-
return when;
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Create cache helper for cache configuration
|
|
119
|
-
*/
|
|
120
|
-
const createCacheHelper = (): RouteHelpers<any, any>["cache"] => {
|
|
121
|
-
return cache;
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Create transition helper
|
|
126
|
-
*/
|
|
127
|
-
const createTransitionHelper = (): RouteHelpers<any, any>["transition"] => {
|
|
128
|
-
return transitionFn as RouteHelpers<any, any>["transition"];
|
|
129
|
-
};
|
|
30
|
+
> {
|
|
31
|
+
return {
|
|
32
|
+
route,
|
|
33
|
+
layout,
|
|
34
|
+
parallel,
|
|
35
|
+
intercept,
|
|
36
|
+
middleware,
|
|
37
|
+
revalidate,
|
|
38
|
+
loader,
|
|
39
|
+
loading,
|
|
40
|
+
errorBoundary,
|
|
41
|
+
notFoundBoundary,
|
|
42
|
+
cache,
|
|
43
|
+
transition,
|
|
44
|
+
} as unknown as RouteHelpers<T, TEnv>;
|
|
45
|
+
}
|
|
130
46
|
|
|
131
47
|
/**
|
|
132
48
|
* Branded type for route handlers that carries the route type info.
|
|
@@ -152,21 +68,7 @@ export function map<const T extends RouteDefinition, TEnv = DefaultEnv>(
|
|
|
152
68
|
"map() expects a builder function as its argument",
|
|
153
69
|
);
|
|
154
70
|
// Create helpers
|
|
155
|
-
const helpers
|
|
156
|
-
route: createRouteHelper<T, TEnv>(),
|
|
157
|
-
layout: createLayoutHelper<TEnv>(),
|
|
158
|
-
parallel: createParallelHelper<TEnv>(),
|
|
159
|
-
intercept: createInterceptHelper<T, TEnv>(),
|
|
160
|
-
middleware: createMiddlewareHelper<TEnv>(),
|
|
161
|
-
revalidate: createRevalidateHelper<TEnv>(),
|
|
162
|
-
loader: createLoaderHelper<TEnv>(),
|
|
163
|
-
loading: createLoadingHelper(),
|
|
164
|
-
errorBoundary: createErrorBoundaryHelper<TEnv>(),
|
|
165
|
-
notFoundBoundary: createNotFoundBoundaryHelper<TEnv>(),
|
|
166
|
-
when: createWhenHelper(),
|
|
167
|
-
cache: createCacheHelper(),
|
|
168
|
-
transition: createTransitionHelper(),
|
|
169
|
-
};
|
|
71
|
+
const helpers = buildRouteHelpers<T, TEnv>();
|
|
170
72
|
|
|
171
73
|
return [layout(RootLayout, () => builder(helpers))].flat(3);
|
|
172
74
|
};
|
|
@@ -182,19 +84,5 @@ export function createRouteHelpers<
|
|
|
182
84
|
T extends RouteDefinition,
|
|
183
85
|
TEnv,
|
|
184
86
|
>(): RouteHelpers<T, TEnv> {
|
|
185
|
-
return
|
|
186
|
-
route: createRouteHelper<T, TEnv>(),
|
|
187
|
-
layout: createLayoutHelper<TEnv>(),
|
|
188
|
-
parallel: createParallelHelper<TEnv>(),
|
|
189
|
-
intercept: createInterceptHelper<T, TEnv>(),
|
|
190
|
-
middleware: createMiddlewareHelper<TEnv>(),
|
|
191
|
-
revalidate: createRevalidateHelper<TEnv>(),
|
|
192
|
-
loader: createLoaderHelper<TEnv>(),
|
|
193
|
-
loading: createLoadingHelper(),
|
|
194
|
-
errorBoundary: createErrorBoundaryHelper<TEnv>(),
|
|
195
|
-
notFoundBoundary: createNotFoundBoundaryHelper<TEnv>(),
|
|
196
|
-
when: createWhenHelper(),
|
|
197
|
-
cache: createCacheHelper(),
|
|
198
|
-
transition: createTransitionHelper(),
|
|
199
|
-
};
|
|
87
|
+
return buildRouteHelpers<T, TEnv>();
|
|
200
88
|
}
|
|
@@ -29,12 +29,10 @@ import type {
|
|
|
29
29
|
ParallelUseItem,
|
|
30
30
|
InterceptUseItem,
|
|
31
31
|
LoaderUseItem,
|
|
32
|
-
WhenItem,
|
|
33
32
|
CacheItem,
|
|
34
33
|
TransitionItem,
|
|
35
34
|
UseItems,
|
|
36
35
|
} from "../route-types.js";
|
|
37
|
-
import type { InterceptWhenFn } from "../server/context";
|
|
38
36
|
|
|
39
37
|
// Re-export route item types for backward compatibility
|
|
40
38
|
export type {
|
|
@@ -52,12 +50,12 @@ export type {
|
|
|
52
50
|
RouteUseItem,
|
|
53
51
|
ParallelUseItem,
|
|
54
52
|
InterceptUseItem,
|
|
55
|
-
WhenItem,
|
|
56
53
|
CacheItem,
|
|
57
54
|
} from "../route-types.js";
|
|
58
55
|
|
|
59
56
|
// Re-export intercept selector types for use in handlers
|
|
60
57
|
export type {
|
|
58
|
+
InterceptConfig,
|
|
61
59
|
InterceptSelectorContext,
|
|
62
60
|
InterceptSegmentsState,
|
|
63
61
|
InterceptWhenFn,
|
|
@@ -123,7 +121,7 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
|
|
|
123
121
|
* "@main": async (ctx) => <MainContent data={ctx.use(DataLoader)} />,
|
|
124
122
|
* })
|
|
125
123
|
*
|
|
126
|
-
* // With loaders and loading states
|
|
124
|
+
* // With loaders and loading states (broadcast to every slot)
|
|
127
125
|
* parallel({
|
|
128
126
|
* "@analytics": AnalyticsPanel,
|
|
129
127
|
* "@metrics": MetricsPanel,
|
|
@@ -131,14 +129,39 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
|
|
|
131
129
|
* loader(DashboardLoader),
|
|
132
130
|
* loading(<DashboardSkeleton />),
|
|
133
131
|
* ])
|
|
132
|
+
*
|
|
133
|
+
* // Per-slot scoped use via slot descriptor — for single-assignment items
|
|
134
|
+
* // like loading() that should not broadcast to siblings.
|
|
135
|
+
* parallel({
|
|
136
|
+
* "@meta": MetaSlot,
|
|
137
|
+
* "@sidebar": {
|
|
138
|
+
* handler: SidebarSlot,
|
|
139
|
+
* use: () => [loading(<SidebarSkeleton />)],
|
|
140
|
+
* },
|
|
141
|
+
* })
|
|
134
142
|
* ```
|
|
135
143
|
* @param slots - Object with slot names (prefixed with @) mapped to handlers
|
|
144
|
+
* or `{ handler, use? }` slot descriptors.
|
|
136
145
|
* @param use - Optional callback for loaders, loading, revalidate, etc.
|
|
146
|
+
* Items here apply to every slot in the call (broadcast).
|
|
147
|
+
* For per-slot single-assignment items, use the slot descriptor's
|
|
148
|
+
* own `use` callback — slot-local items run after the broadcast,
|
|
149
|
+
* so they take precedence on `loading()` and other last-write-wins
|
|
150
|
+
* fields.
|
|
137
151
|
*/
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
152
|
+
// Not generic over the slots record: an inferred type parameter makes the
|
|
153
|
+
// object literal an inference site, which suppresses contextual typing of
|
|
154
|
+
// arrow slot handlers (`(ctx) => ...` was implicit any).
|
|
155
|
+
parallel: (
|
|
156
|
+
slots: Record<
|
|
157
|
+
`@${string}`,
|
|
158
|
+
| Handler<any, any, TEnv>
|
|
159
|
+
| ReactNode
|
|
160
|
+
| {
|
|
161
|
+
handler: Handler<any, any, TEnv> | ReactNode;
|
|
162
|
+
use?: () => UseItems<ParallelUseItem>;
|
|
163
|
+
}
|
|
164
|
+
>,
|
|
142
165
|
use?: () => UseItems<ParallelUseItem>,
|
|
143
166
|
) => ParallelItem;
|
|
144
167
|
/**
|
|
@@ -159,10 +182,26 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
|
|
|
159
182
|
* loader(CardModalLoader),
|
|
160
183
|
* revalidate(() => false),
|
|
161
184
|
* ])
|
|
185
|
+
*
|
|
186
|
+
* // Conditional activation via the config object's `when` selector
|
|
187
|
+
* intercept("@modal", "card", <CardModal />, {
|
|
188
|
+
* when: ({ from }) => from.pathname.startsWith("/board"),
|
|
189
|
+
* })
|
|
190
|
+
*
|
|
191
|
+
* // Config + other use-items: config is arg 4, use is arg 5
|
|
192
|
+
* intercept(
|
|
193
|
+
* "@modal",
|
|
194
|
+
* "card",
|
|
195
|
+
* <CardModal />,
|
|
196
|
+
* { when: ({ from }) => from.pathname.startsWith("/board") },
|
|
197
|
+
* () => [loader(CardDetailLoader)],
|
|
198
|
+
* )
|
|
162
199
|
* ```
|
|
163
200
|
* @param slotName - Named slot (prefixed with @) where intercept renders
|
|
164
201
|
* @param routeName - Route name to intercept
|
|
165
202
|
* @param handler - Component or handler for intercepted render
|
|
203
|
+
* @param config - Optional InterceptConfig (e.g. `{ when }`), or the use
|
|
204
|
+
* callback directly when there is no config
|
|
166
205
|
* @param use - Optional callback for loaders, middleware, revalidate, etc.
|
|
167
206
|
*/
|
|
168
207
|
intercept: {
|
|
@@ -171,32 +210,58 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
|
|
|
171
210
|
slotName: `@${string}`,
|
|
172
211
|
routeName: `.${K}`,
|
|
173
212
|
handler: ReactNode | Handler<ExtractRouteParams<T, K>, {}, TEnv>,
|
|
213
|
+
config?:
|
|
214
|
+
| import("../server/context.js").InterceptConfig<TEnv>
|
|
215
|
+
| (() => UseItems<InterceptUseItem>),
|
|
174
216
|
use?: () => UseItems<InterceptUseItem>,
|
|
175
217
|
): InterceptItem;
|
|
176
218
|
// Global: unprefixed, params inferred from global route map
|
|
177
|
-
<K extends keyof
|
|
219
|
+
<K extends keyof Rango.GeneratedRouteMap & string>(
|
|
178
220
|
slotName: `@${string}`,
|
|
179
221
|
routeName: K,
|
|
180
|
-
handler: ReactNode | Handler<K,
|
|
222
|
+
handler: ReactNode | Handler<K, Rango.GeneratedRouteMap, TEnv>,
|
|
223
|
+
config?:
|
|
224
|
+
| import("../server/context.js").InterceptConfig<TEnv>
|
|
225
|
+
| (() => UseItems<InterceptUseItem>),
|
|
181
226
|
use?: () => UseItems<InterceptUseItem>,
|
|
182
227
|
): InterceptItem;
|
|
183
228
|
};
|
|
184
229
|
/**
|
|
185
|
-
* Attach middleware to the current route/layout
|
|
230
|
+
* Attach middleware to the current route/layout, or wrap child segments
|
|
231
|
+
*
|
|
232
|
+
* **Sibling mode** — attaches middleware to the parent entry:
|
|
186
233
|
* ```typescript
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
*
|
|
234
|
+
* layout(<DashboardShell />, () => [
|
|
235
|
+
* middleware(authMiddleware),
|
|
236
|
+
* middleware([authMiddleware, loggingMiddleware]),
|
|
237
|
+
* path("/", DashboardPage),
|
|
238
|
+
* ])
|
|
239
|
+
* ```
|
|
240
|
+
*
|
|
241
|
+
* **Wrapping mode** — scopes middleware to the children only:
|
|
242
|
+
* ```typescript
|
|
243
|
+
* middleware(authMiddleware, () => [
|
|
244
|
+
* path("/dashboard", DashboardPage),
|
|
245
|
+
* path("/settings", SettingsPage),
|
|
246
|
+
* ])
|
|
193
247
|
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
248
|
+
* middleware([authMiddleware, loggingMiddleware], () => [
|
|
249
|
+
* path("/admin", AdminPage),
|
|
250
|
+
* ])
|
|
196
251
|
* ```
|
|
197
|
-
* @param fns - One or more middleware functions to execute in order
|
|
198
252
|
*/
|
|
199
|
-
middleware:
|
|
253
|
+
middleware: {
|
|
254
|
+
(fn: MiddlewareFn<TEnv>): MiddlewareItem;
|
|
255
|
+
(
|
|
256
|
+
fn: MiddlewareFn<TEnv>,
|
|
257
|
+
children: () => UseItems<LayoutUseItem>,
|
|
258
|
+
): MiddlewareItem;
|
|
259
|
+
(fns: MiddlewareFn<TEnv>[]): MiddlewareItem;
|
|
260
|
+
(
|
|
261
|
+
fns: MiddlewareFn<TEnv>[],
|
|
262
|
+
children: () => UseItems<LayoutUseItem>,
|
|
263
|
+
): MiddlewareItem;
|
|
264
|
+
};
|
|
200
265
|
/**
|
|
201
266
|
* Control when a segment should revalidate during navigation
|
|
202
267
|
* ```typescript
|
|
@@ -206,8 +271,10 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
|
|
|
206
271
|
* )
|
|
207
272
|
*
|
|
208
273
|
* // Revalidate after specific actions (actionId format: "path/to/file.ts#exportName")
|
|
274
|
+
* // Use `|| undefined` (defer), not `?? false` (hard short-circuit), so the
|
|
275
|
+
* // chain and the segment default still apply when there is no match.
|
|
209
276
|
* revalidate(({ actionId }) =>
|
|
210
|
-
* actionId?.includes("Cart")
|
|
277
|
+
* actionId?.includes("Cart") || undefined
|
|
211
278
|
* )
|
|
212
279
|
*
|
|
213
280
|
* // Soft decision (suggest but allow override)
|
|
@@ -215,7 +282,12 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
|
|
|
215
282
|
* ({ defaultShouldRevalidate: true })
|
|
216
283
|
* )
|
|
217
284
|
* ```
|
|
218
|
-
* @param fn - Function
|
|
285
|
+
* @param fn - Function returning either:
|
|
286
|
+
* - `boolean` (hard decision — short-circuits the chain),
|
|
287
|
+
* - `{ defaultShouldRevalidate: boolean }` (soft — updates the suggestion
|
|
288
|
+
* for downstream revalidators),
|
|
289
|
+
* - or nothing / `null` / `undefined` (defer — leaves the suggestion
|
|
290
|
+
* unchanged and continues to the next revalidator).
|
|
219
291
|
*/
|
|
220
292
|
revalidate: (fn: ShouldRevalidateFn<any, TEnv>) => RevalidateItem;
|
|
221
293
|
/**
|
|
@@ -225,14 +297,15 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
|
|
|
225
297
|
*
|
|
226
298
|
* // With loader-specific revalidation (match by file or export name)
|
|
227
299
|
* loader(CartLoader, () => [
|
|
228
|
-
* revalidate(({ actionId }) => actionId?.includes("Cart")
|
|
300
|
+
* revalidate(({ actionId }) => actionId?.includes("Cart") || undefined),
|
|
229
301
|
* ])
|
|
230
302
|
*
|
|
231
|
-
* //
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
* }
|
|
303
|
+
* // Consume in client components with useLoader()
|
|
304
|
+
* // (preferred — cache-safe, always fresh)
|
|
305
|
+
* function ProductDetails() {
|
|
306
|
+
* const { data } = useLoader(ProductLoader);
|
|
307
|
+
* return <div>{data.name}</div>;
|
|
308
|
+
* }
|
|
236
309
|
* ```
|
|
237
310
|
* @param loaderDef - Loader created with createLoader()
|
|
238
311
|
* @param use - Optional callback for loader-specific revalidation rules
|
|
@@ -254,7 +327,10 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
|
|
|
254
327
|
* @param options - Configuration options
|
|
255
328
|
* @param options.ssr - If false, skip showing loading on document requests (SSR)
|
|
256
329
|
*/
|
|
257
|
-
loading: (
|
|
330
|
+
loading: (
|
|
331
|
+
component: ReactNode | (() => ReactNode),
|
|
332
|
+
options?: { ssr?: boolean },
|
|
333
|
+
) => LoadingItem;
|
|
258
334
|
/**
|
|
259
335
|
* Attach an error boundary to catch errors in this segment and children
|
|
260
336
|
* ```typescript
|
|
@@ -292,40 +368,6 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
|
|
|
292
368
|
notFoundBoundary: (
|
|
293
369
|
fallback: ReactNode | NotFoundBoundaryHandler,
|
|
294
370
|
) => NotFoundBoundaryItem;
|
|
295
|
-
/**
|
|
296
|
-
* Define a condition for when an intercept should activate
|
|
297
|
-
*
|
|
298
|
-
* Only valid inside intercept() use() callback. When multiple when() calls
|
|
299
|
-
* are present, ALL must return true for the intercept to activate.
|
|
300
|
-
* If no when() is defined, the intercept always activates on soft navigation.
|
|
301
|
-
*
|
|
302
|
-
* Context properties:
|
|
303
|
-
* - `from` - Source URL (where user is navigating from)
|
|
304
|
-
* - `to` - Destination URL (where user is navigating to)
|
|
305
|
-
* - `params` - Matched route params
|
|
306
|
-
* - `segments` - Client's current segments with `path` and `ids`
|
|
307
|
-
*
|
|
308
|
-
* ```typescript
|
|
309
|
-
* // Only intercept when coming from the board page
|
|
310
|
-
* intercept("@modal", "card", <CardModal />, () => [
|
|
311
|
-
* when(({ from }) => from.pathname.startsWith("/board")),
|
|
312
|
-
* loader(CardDetailLoader),
|
|
313
|
-
* ])
|
|
314
|
-
*
|
|
315
|
-
* // Use segments to check current route context
|
|
316
|
-
* intercept("@modal", "card", <CardModal />, () => [
|
|
317
|
-
* when(({ segments }) => segments.path[0] === "kanban"),
|
|
318
|
-
* ])
|
|
319
|
-
*
|
|
320
|
-
* // Multiple conditions (AND logic)
|
|
321
|
-
* intercept("@modal", "card", <CardModal />, () => [
|
|
322
|
-
* when(({ from }) => from.pathname.startsWith("/board")),
|
|
323
|
-
* when(({ segments }) => segments.ids.includes("kanban-layout")),
|
|
324
|
-
* ])
|
|
325
|
-
* ```
|
|
326
|
-
* @param fn - Selector function receiving navigation context, returns boolean
|
|
327
|
-
*/
|
|
328
|
-
when: (fn: InterceptWhenFn) => WhenItem;
|
|
329
371
|
/**
|
|
330
372
|
* Define cache configuration for segments
|
|
331
373
|
*
|
|
@@ -386,18 +428,43 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
|
|
|
386
428
|
cache: {
|
|
387
429
|
(): CacheItem;
|
|
388
430
|
(children: () => UseItems<AllUseItems>): CacheItem;
|
|
389
|
-
(profileName: string): CacheItem;
|
|
390
|
-
(profileName: string, use: () => UseItems<AllUseItems>): CacheItem;
|
|
391
431
|
(
|
|
392
|
-
options: PartialCacheOptions | false,
|
|
432
|
+
options: PartialCacheOptions<TEnv> | false,
|
|
393
433
|
use?: () => UseItems<AllUseItems>,
|
|
394
434
|
): CacheItem;
|
|
395
435
|
};
|
|
396
436
|
/**
|
|
397
|
-
*
|
|
398
|
-
*
|
|
399
|
-
*
|
|
400
|
-
*
|
|
437
|
+
* Opt a route (or group of routes) into transition-driven navigation.
|
|
438
|
+
*
|
|
439
|
+
* `transition()` does two independent things, and you choose how far to go:
|
|
440
|
+
* 1. startTransition (ALL React versions): the navigation commit is driven
|
|
441
|
+
* through React's startTransition, so a same-route nav (same route,
|
|
442
|
+
* different params, e.g. /product/1 -> /product/2) holds the previous
|
|
443
|
+
* content while the new loader resolves instead of flashing the route's
|
|
444
|
+
* loading() skeleton (see segment-system.tsx inTransitionScope). This is
|
|
445
|
+
* also the precondition for any view-transition animation.
|
|
446
|
+
* 2. <ViewTransition> (experimental React only): the segment content is also
|
|
447
|
+
* wrapped in React's <ViewTransition>, so the held swap cross-fades/morphs.
|
|
448
|
+
* Layered on by default; pass { viewTransition: false } to keep #1 without
|
|
449
|
+
* the router boundary (and place your own <ViewTransition> instead).
|
|
450
|
+
*
|
|
451
|
+
* A view transition cannot fire without a startTransition, so the meaningful
|
|
452
|
+
* choices are (see skills/view-transitions for the full matrix):
|
|
453
|
+
* - no transition() -> neither (remount + skeleton)
|
|
454
|
+
* - transition({ viewTransition: false }) -> startTransition only (hold)
|
|
455
|
+
* - transition({}) / transition({ enter… }) -> startTransition + ViewTransition
|
|
456
|
+
*
|
|
457
|
+
* Precedence: a bare transition({}) inherits createRouter({ viewTransition })
|
|
458
|
+
* (default "auto"); an explicit per-route `viewTransition` always wins. So
|
|
459
|
+
* transition({}) is startTransition + ViewTransition under the default and
|
|
460
|
+
* startTransition only when the router sets viewTransition: false.
|
|
461
|
+
*
|
|
462
|
+
* Conditional hold: pass `when: (ctx) => boolean` to gate the transition per
|
|
463
|
+
* request. It runs server-side AFTER the route handler (so it can read state
|
|
464
|
+
* the handler set via `ctx.get(...)`); returning false drops this transition
|
|
465
|
+
* for the request, so the navigation streams its loading() skeleton instead of
|
|
466
|
+
* holding. This is a post-handler predicate — distinct from intercept()'s
|
|
467
|
+
* match-time `when` config selector (`intercept(slot, route, Comp, { when })`).
|
|
401
468
|
*
|
|
402
469
|
* ```typescript
|
|
403
470
|
* // Attach to a single route
|
|
@@ -411,16 +478,25 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
|
|
|
411
478
|
* path("/about", AboutPage),
|
|
412
479
|
* ])
|
|
413
480
|
*
|
|
414
|
-
* //
|
|
415
|
-
*
|
|
416
|
-
*
|
|
417
|
-
*
|
|
418
|
-
*
|
|
481
|
+
* // Hold content + drive view transitions, but place no router boundary:
|
|
482
|
+
* path("/product/:id", ProductPage, { name: "product" }, () => [
|
|
483
|
+
* transition({ viewTransition: false }),
|
|
484
|
+
* ])
|
|
485
|
+
*
|
|
486
|
+
* // Hold only when the handler decided to (post-handler predicate):
|
|
487
|
+
* path("/product/:id", ProductPage, { name: "product" }, () => [
|
|
488
|
+
* transition({ when: (ctx) => ctx.get(KeepScroll) === true }),
|
|
489
|
+
* ])
|
|
419
490
|
* ```
|
|
420
|
-
* @param config - ViewTransition configuration (enter, exit, update, share,
|
|
491
|
+
* @param config - ViewTransition configuration (enter, exit, update, share,
|
|
492
|
+
* default, name), `viewTransition: "auto" | false` to toggle the router
|
|
493
|
+
* boundary (createRouter({ viewTransition }) sets the app-wide default), and
|
|
494
|
+
* `when: (ctx) => boolean` to gate the transition per request post-handler
|
|
421
495
|
* @param children - Optional callback returning child routes to wrap
|
|
422
496
|
*/
|
|
423
497
|
transition: {
|
|
498
|
+
(): TransitionItem;
|
|
499
|
+
(children: () => UseItems<AllUseItems>): TransitionItem;
|
|
424
500
|
(config: TransitionConfig): TransitionItem;
|
|
425
501
|
(
|
|
426
502
|
config: TransitionConfig,
|
|
@@ -15,8 +15,8 @@ export type {
|
|
|
15
15
|
RouteUseItem,
|
|
16
16
|
ParallelUseItem,
|
|
17
17
|
InterceptUseItem,
|
|
18
|
-
WhenItem,
|
|
19
18
|
CacheItem,
|
|
19
|
+
InterceptConfig,
|
|
20
20
|
InterceptSelectorContext,
|
|
21
21
|
InterceptSegmentsState,
|
|
22
22
|
InterceptWhenFn,
|
|
@@ -30,7 +30,6 @@ export {
|
|
|
30
30
|
revalidate,
|
|
31
31
|
parallel,
|
|
32
32
|
intercept,
|
|
33
|
-
when,
|
|
34
33
|
errorBoundary,
|
|
35
34
|
notFoundBoundary,
|
|
36
35
|
loader,
|
|
@@ -45,6 +44,9 @@ export {
|
|
|
45
44
|
type RouteHandlers,
|
|
46
45
|
} from "./helper-factories.js";
|
|
47
46
|
|
|
47
|
+
// Handler use resolver
|
|
48
|
+
export { resolveHandlerUse } from "./resolve-handler-use.js";
|
|
49
|
+
|
|
48
50
|
// Redirect
|
|
49
51
|
export { redirect } from "./redirect.js";
|
|
50
52
|
|