@rangojs/router 0.0.0-experimental.14 → 0.0.0-experimental.140
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 +17 -0
- package/README.md +432 -7
- package/dist/bin/rango.js +2073 -213
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +7258 -2714
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +140 -67
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +487 -0
- package/skills/caching/SKILL.md +357 -25
- 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 +246 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +16 -10
- package/skills/document-cache/SKILL.md +87 -62
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +557 -79
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +207 -15
- package/skills/layout/SKILL.md +146 -6
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +616 -54
- package/skills/middleware/SKILL.md +217 -37
- package/skills/migrate-nextjs/SKILL.md +611 -0
- package/skills/migrate-react-router/SKILL.md +927 -0
- package/skills/mime-routes/SKILL.md +42 -11
- package/skills/observability/SKILL.md +194 -0
- package/skills/parallel/SKILL.md +284 -3
- package/skills/ppr/SKILL.md +426 -0
- package/skills/prerender/SKILL.md +437 -52
- package/skills/rango/SKILL.md +369 -22
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +263 -121
- package/skills/route/SKILL.md +350 -21
- package/skills/router-setup/SKILL.md +246 -33
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +126 -222
- 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 +9 -8
- package/skills/typesafety/SKILL.md +532 -103
- package/skills/use-cache/SKILL.md +367 -0
- 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 +77 -44
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +114 -0
- 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 +293 -202
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +385 -576
- package/src/browser/navigation-client.ts +245 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +184 -118
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +88 -0
- package/src/browser/partial-update.ts +412 -364
- package/src/browser/prefetch/cache.ts +359 -0
- package/src/browser/prefetch/fetch.ts +452 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +209 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +275 -68
- package/src/browser/react/NavigationProvider.tsx +265 -109
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +70 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +272 -60
- package/src/browser/react/location-state.ts +90 -20
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +39 -13
- package/src/browser/react/use-navigation.ts +53 -69
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +164 -0
- package/src/browser/rsc-router.tsx +300 -72
- package/src/browser/scroll-restoration.ts +138 -50
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +668 -613
- package/src/browser/types.ts +223 -51
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +252 -161
- package/src/build/generate-route-types.ts +41 -1038
- package/src/build/index.ts +12 -7
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +225 -42
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +105 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +812 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +144 -0
- package/src/build/route-types/router-processing.ts +695 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +223 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +60 -0
- package/src/cache/cache-policy.ts +199 -0
- package/src/cache/cache-runtime.ts +525 -0
- package/src/cache/cache-scope.ts +298 -332
- package/src/cache/cache-tag.ts +103 -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 +2500 -158
- 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 +17 -17
- package/src/cache/document-cache.ts +199 -92
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +111 -0
- package/src/cache/index.ts +29 -35
- package/src/cache/memory-segment-store.ts +363 -30
- package/src/cache/profile-registry.ts +88 -0
- package/src/cache/read-through-swr.ts +178 -0
- package/src/cache/segment-codec.ts +248 -0
- package/src/cache/shell-cache.ts +386 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +156 -211
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1102 -0
- package/src/client.rsc.tsx +43 -21
- package/src/client.tsx +131 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +13 -3
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- 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 +106 -10
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +110 -35
- package/src/handles/MetaTags.tsx +83 -59
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +44 -53
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +20 -65
- package/src/host/errors.ts +21 -30
- package/src/host/index.ts +13 -9
- package/src/host/pattern-matcher.ts +50 -79
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +177 -35
- package/src/index.ts +255 -71
- package/src/internal-debug.ts +9 -2
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/param-hash.ts +16 -14
- package/src/prerender/store.ts +121 -21
- package/src/prerender.ts +460 -26
- package/src/redirect-origin.ts +100 -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 +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +22 -77
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +88 -0
- package/src/route-definition/helpers-types.ts +505 -0
- package/src/route-definition/index.ts +54 -0
- package/src/route-definition/redirect.ts +134 -0
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-definition.ts +1 -1481
- package/src/route-map-builder.ts +82 -144
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +71 -45
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +263 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +54 -27
- package/src/router/find-match.ts +245 -0
- package/src/router/handler-context.ts +377 -125
- package/src/router/instrument.ts +350 -0
- package/src/router/intercept-resolution.ts +59 -28
- package/src/router/lazy-includes.ts +254 -0
- package/src/router/loader-resolution.ts +421 -157
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +131 -57
- package/src/router/match-api.ts +167 -246
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +117 -93
- package/src/router/match-middleware/cache-lookup.ts +297 -150
- package/src/router/match-middleware/cache-store.ts +123 -51
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +121 -50
- package/src/router/metrics.ts +219 -28
- package/src/router/middleware-types.ts +93 -0
- package/src/router/middleware.ts +505 -441
- 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 +311 -142
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +547 -0
- package/src/router/preview-match.ts +102 -0
- package/src/router/request-classification.ts +278 -0
- package/src/router/revalidation.ts +203 -62
- package/src/router/route-snapshot.ts +246 -0
- package/src/router/router-context.ts +45 -48
- package/src/router/router-interfaces.ts +554 -0
- package/src/router/router-options.ts +779 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +772 -0
- package/src/router/segment-resolution/helpers.ts +348 -0
- package/src/router/segment-resolution/loader-cache.ts +250 -0
- package/src/router/segment-resolution/loader-mask.ts +44 -0
- package/src/router/segment-resolution/revalidation.ts +1331 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- 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 +25 -1354
- package/src/router/segment-wrappers.ts +292 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +261 -0
- package/src/router/telemetry.ts +377 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +240 -61
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +781 -2378
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +905 -1142
- package/src/rsc/helpers.ts +275 -19
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +305 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +502 -0
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +257 -0
- package/src/rsc/rsc-rendering.ts +337 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +522 -0
- package/src/rsc/shell-capture.ts +439 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +95 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +99 -82
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +149 -0
- package/src/segment-system.tsx +349 -134
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +452 -85
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +310 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +123 -42
- package/src/server/live.ts +130 -0
- package/src/server/loader-registry.ts +51 -100
- package/src/server/request-context.ts +842 -157
- package/src/server.ts +15 -8
- package/src/ssr/index.tsx +412 -136
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +701 -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 +40 -72
- package/src/theme/ThemeScript.tsx +12 -14
- package/src/theme/constants.ts +57 -15
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +43 -39
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +839 -0
- package/src/types/index.ts +81 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +138 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +271 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +162 -0
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +43 -0
- package/src/urls/path-helper-types.ts +413 -0
- package/src/urls/path-helper.ts +275 -0
- package/src/urls/pattern-types.ts +124 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +316 -0
- package/src/urls/urls-function.ts +80 -0
- package/src/urls.ts +1 -1341
- package/src/use-loader.tsx +406 -141
- 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 +182 -0
- package/src/vite/discovery/discover-routers.ts +389 -0
- 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 +467 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/state.ts +161 -0
- package/src/vite/discovery/virtual-module-codegen.ts +183 -0
- package/src/vite/index.ts +23 -2255
- package/src/vite/inject-client-debug.ts +36 -0
- package/src/vite/plugin-types.ts +303 -0
- package/src/vite/plugins/cjs-to-esm.ts +90 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- 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/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
- package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +805 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +94 -0
- package/src/vite/plugins/version-plugin.ts +263 -0
- package/src/vite/plugins/virtual-entries.ts +234 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +560 -0
- package/src/vite/router-discovery.ts +1638 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- 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 +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +249 -0
- package/src/vite/utils/shared-utils.ts +269 -0
- package/CLAUDE.md +0 -43
- package/dist/vite/index.named-routes.gen.ts +0 -103
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/react/use-client-cache.ts +0 -56
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/handles/index.ts +0 -6
- package/src/href-context.ts +0 -33
- package/src/network-error-thrower.tsx +0 -21
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- package/src/vite/package-resolution.ts +0 -125
- package/src/vite/virtual-entries.ts +0 -114
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/src/client.tsx
CHANGED
|
@@ -13,13 +13,91 @@ import {
|
|
|
13
13
|
type ClientErrorBoundaryFallbackProps,
|
|
14
14
|
type ErrorInfo,
|
|
15
15
|
type LoaderDefinition,
|
|
16
|
-
type LoaderFn,
|
|
17
16
|
type ResolvedSegment,
|
|
18
17
|
} from "./types";
|
|
19
18
|
import {
|
|
20
19
|
RouteContentWrapper,
|
|
21
20
|
LoaderBoundary,
|
|
22
21
|
} from "./route-content-wrapper.js";
|
|
22
|
+
import { OutletProvider } from "./outlet-provider.js";
|
|
23
|
+
import { MountContextProvider } from "./browser/react/mount-context.js";
|
|
24
|
+
import { getMemoizedContentPromise } from "./segment-content-promise.js";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Render the content for a named parallel/intercept slot segment.
|
|
28
|
+
*
|
|
29
|
+
* Shared by Outlet (with `name` prop) and ParallelOutlet — both resolve a
|
|
30
|
+
* segment from context.parallel by slot name and then render it through the
|
|
31
|
+
* same layout/loader/mountPath wrapping pipeline.
|
|
32
|
+
*/
|
|
33
|
+
function renderSlotContent(segment: ResolvedSegment | null): ReactNode {
|
|
34
|
+
if (!segment) return null;
|
|
35
|
+
|
|
36
|
+
const content: ReactNode =
|
|
37
|
+
segment.loading || segment.component instanceof Promise ? (
|
|
38
|
+
<RouteContentWrapper
|
|
39
|
+
content={getMemoizedContentPromise(segment.component)}
|
|
40
|
+
fallback={segment.loading}
|
|
41
|
+
segmentId={segment.id}
|
|
42
|
+
/>
|
|
43
|
+
) : (
|
|
44
|
+
(segment.component ?? null)
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
const hasOwnLoaders = !!(segment.loaderDataPromise && segment.loaderIds);
|
|
48
|
+
const loaderWrapped = hasOwnLoaders ? (
|
|
49
|
+
<LoaderBoundary
|
|
50
|
+
loaderDataPromise={segment.loaderDataPromise!}
|
|
51
|
+
loaderIds={segment.loaderIds!}
|
|
52
|
+
fallback={segment.loading}
|
|
53
|
+
outletKey={segment.id + "-loader"}
|
|
54
|
+
outletContent={null}
|
|
55
|
+
segment={segment}
|
|
56
|
+
>
|
|
57
|
+
{content}
|
|
58
|
+
</LoaderBoundary>
|
|
59
|
+
) : null;
|
|
60
|
+
|
|
61
|
+
let result: ReactNode;
|
|
62
|
+
if (segment.layout) {
|
|
63
|
+
// Layout renders immediately; if loaders exist, the LoaderBoundary becomes
|
|
64
|
+
// the outlet content so layout's <Outlet /> suspends until loaders resolve.
|
|
65
|
+
result = (
|
|
66
|
+
<OutletProvider
|
|
67
|
+
content={hasOwnLoaders ? loaderWrapped : content}
|
|
68
|
+
segment={segment}
|
|
69
|
+
>
|
|
70
|
+
{segment.layout}
|
|
71
|
+
</OutletProvider>
|
|
72
|
+
);
|
|
73
|
+
} else if (hasOwnLoaders) {
|
|
74
|
+
// No layout but has loaders — wrap content with LoaderBoundary for useLoader context.
|
|
75
|
+
// Common for intercept routes that use useLoader without a custom layout.
|
|
76
|
+
result = loaderWrapped;
|
|
77
|
+
} else {
|
|
78
|
+
result = content;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (segment.mountPath) {
|
|
82
|
+
return (
|
|
83
|
+
<MountContextProvider value={segment.mountPath}>
|
|
84
|
+
{result}
|
|
85
|
+
</MountContextProvider>
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function useSlotSegment(
|
|
93
|
+
context: OutletContextValue | null,
|
|
94
|
+
name: `@${string}` | undefined,
|
|
95
|
+
): ResolvedSegment | null {
|
|
96
|
+
return useMemo(() => {
|
|
97
|
+
if (!name || !context?.parallel) return null;
|
|
98
|
+
return context.parallel.find((seg) => seg.slot === name) ?? null;
|
|
99
|
+
}, [context, name]);
|
|
100
|
+
}
|
|
23
101
|
|
|
24
102
|
/**
|
|
25
103
|
* Outlet component - renders child content in layouts
|
|
@@ -33,6 +111,11 @@ import {
|
|
|
33
111
|
* the parallel segment with that slot name instead of the default content.
|
|
34
112
|
* This is used for parallel routes and intercepting routes.
|
|
35
113
|
*
|
|
114
|
+
* For a named slot, `<Outlet name="@x" />` is equivalent to
|
|
115
|
+
* `<ParallelOutlet name="@x" />` — both run the same resolution + wrapping
|
|
116
|
+
* pipeline. Convention: use bare `<Outlet />` for default content and
|
|
117
|
+
* `<ParallelOutlet name="@x" />` for named slots.
|
|
118
|
+
*
|
|
36
119
|
* @param name - Optional slot name for parallel/intercept content (must start with @)
|
|
37
120
|
*
|
|
38
121
|
* @example
|
|
@@ -60,84 +143,10 @@ import {
|
|
|
60
143
|
*/
|
|
61
144
|
export function Outlet({ name }: { name?: `@${string}` } = {}): ReactNode {
|
|
62
145
|
const context = useContext(OutletContext);
|
|
146
|
+
const namedSegment = useSlotSegment(context, name);
|
|
63
147
|
|
|
64
|
-
// If name provided, render parallel/intercept content for that slot
|
|
65
148
|
if (name) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if (!segment) return null;
|
|
69
|
-
|
|
70
|
-
// Determine the content to render
|
|
71
|
-
let content: ReactNode;
|
|
72
|
-
if (segment.loading || segment.component instanceof Promise) {
|
|
73
|
-
// Use RouteContentWrapper to handle Suspense wrapping properly
|
|
74
|
-
content = (
|
|
75
|
-
<RouteContentWrapper
|
|
76
|
-
content={
|
|
77
|
-
segment.component instanceof Promise
|
|
78
|
-
? segment.component
|
|
79
|
-
: Promise.resolve(segment.component)
|
|
80
|
-
}
|
|
81
|
-
fallback={segment.loading}
|
|
82
|
-
segmentId={segment.id}
|
|
83
|
-
/>
|
|
84
|
-
);
|
|
85
|
-
} else {
|
|
86
|
-
content = segment.component ?? null;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// If segment has a layout, wrap appropriately
|
|
90
|
-
if (segment.layout) {
|
|
91
|
-
// Check if this segment has loaders that need streaming
|
|
92
|
-
// The layout renders immediately, LoaderBoundary becomes the outlet content
|
|
93
|
-
// When layout renders <Outlet />, it gets the LoaderBoundary which suspends
|
|
94
|
-
if (segment.loaderDataPromise && segment.loaderIds) {
|
|
95
|
-
const loaderAwareContent = (
|
|
96
|
-
<LoaderBoundary
|
|
97
|
-
loaderDataPromise={segment.loaderDataPromise}
|
|
98
|
-
loaderIds={segment.loaderIds}
|
|
99
|
-
fallback={segment.loading}
|
|
100
|
-
outletKey={segment.id + "-loader"}
|
|
101
|
-
outletContent={null}
|
|
102
|
-
segment={segment}
|
|
103
|
-
>
|
|
104
|
-
{content}
|
|
105
|
-
</LoaderBoundary>
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
return (
|
|
109
|
-
<OutletProvider content={loaderAwareContent} segment={segment}>
|
|
110
|
-
{segment.layout}
|
|
111
|
-
</OutletProvider>
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// No loaders - wrap in OutletProvider so layout can use <Outlet />
|
|
116
|
-
return (
|
|
117
|
-
<OutletProvider content={content} segment={segment}>
|
|
118
|
-
{segment.layout}
|
|
119
|
-
</OutletProvider>
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// No layout but has loaders - wrap content with LoaderBoundary for useLoader context
|
|
124
|
-
// This is common for intercept routes that use useLoader without a custom layout
|
|
125
|
-
if (segment.loaderDataPromise && segment.loaderIds) {
|
|
126
|
-
return (
|
|
127
|
-
<LoaderBoundary
|
|
128
|
-
loaderDataPromise={segment.loaderDataPromise}
|
|
129
|
-
loaderIds={segment.loaderIds}
|
|
130
|
-
fallback={segment.loading}
|
|
131
|
-
outletKey={segment.id + "-loader"}
|
|
132
|
-
outletContent={null}
|
|
133
|
-
segment={segment}
|
|
134
|
-
>
|
|
135
|
-
{content}
|
|
136
|
-
</LoaderBoundary>
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return content;
|
|
149
|
+
return renderSlotContent(namedSegment);
|
|
141
150
|
}
|
|
142
151
|
|
|
143
152
|
// Default: render child content
|
|
@@ -151,6 +160,7 @@ export function Outlet({ name }: { name?: `@${string}` } = {}): ReactNode {
|
|
|
151
160
|
|
|
152
161
|
return content;
|
|
153
162
|
}
|
|
163
|
+
|
|
154
164
|
/**
|
|
155
165
|
* ParallelOutlet component - renders content for a named parallel slot
|
|
156
166
|
*
|
|
@@ -158,6 +168,9 @@ export function Outlet({ name }: { name?: `@${string}` } = {}): ReactNode {
|
|
|
158
168
|
* is wrapped in Suspense with the loading component as fallback.
|
|
159
169
|
* This enables streaming and navigation loading states for parallels.
|
|
160
170
|
*
|
|
171
|
+
* Equivalent to `<Outlet name="@x" />` for a named slot; ParallelOutlet
|
|
172
|
+
* requires `name` and is named-slot-only, which reads clearer at the call site.
|
|
173
|
+
*
|
|
161
174
|
* @param name - The slot name (must start with @, e.g., "@modal", "@sidebar")
|
|
162
175
|
*
|
|
163
176
|
* @example
|
|
@@ -175,124 +188,15 @@ export function Outlet({ name }: { name?: `@${string}` } = {}): ReactNode {
|
|
|
175
188
|
*/
|
|
176
189
|
export function ParallelOutlet({ name }: { name: `@${string}` }): ReactNode {
|
|
177
190
|
const context = useContext(OutletContext);
|
|
178
|
-
const segment =
|
|
179
|
-
if (!context?.parallel) return null;
|
|
180
|
-
return context.parallel.find((seg) => seg.slot === name) ?? null;
|
|
181
|
-
}, [context, name]);
|
|
182
|
-
|
|
183
|
-
if (!segment) return null;
|
|
184
|
-
|
|
185
|
-
// Determine the content to render
|
|
186
|
-
let content: ReactNode;
|
|
187
|
-
if (segment.loading || segment.component instanceof Promise) {
|
|
188
|
-
// Use RouteContentWrapper to handle Suspense wrapping properly
|
|
189
|
-
content = (
|
|
190
|
-
<RouteContentWrapper
|
|
191
|
-
content={
|
|
192
|
-
segment.component instanceof Promise
|
|
193
|
-
? segment.component
|
|
194
|
-
: Promise.resolve(segment.component)
|
|
195
|
-
}
|
|
196
|
-
fallback={segment.loading}
|
|
197
|
-
segmentId={segment.id}
|
|
198
|
-
/>
|
|
199
|
-
);
|
|
200
|
-
} else {
|
|
201
|
-
content = segment.component ?? null;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// If segment has a layout, wrap appropriately
|
|
205
|
-
if (segment.layout) {
|
|
206
|
-
// Check if this segment has loaders that need streaming
|
|
207
|
-
// The layout renders immediately, LoaderBoundary becomes the outlet content
|
|
208
|
-
if (segment.loaderDataPromise && segment.loaderIds) {
|
|
209
|
-
const loaderAwareContent = (
|
|
210
|
-
<LoaderBoundary
|
|
211
|
-
loaderDataPromise={segment.loaderDataPromise}
|
|
212
|
-
loaderIds={segment.loaderIds}
|
|
213
|
-
fallback={segment.loading}
|
|
214
|
-
outletKey={segment.id + "-loader"}
|
|
215
|
-
outletContent={null}
|
|
216
|
-
segment={segment}
|
|
217
|
-
>
|
|
218
|
-
{content}
|
|
219
|
-
</LoaderBoundary>
|
|
220
|
-
);
|
|
221
|
-
|
|
222
|
-
return (
|
|
223
|
-
<OutletProvider content={loaderAwareContent} segment={segment}>
|
|
224
|
-
{segment.layout}
|
|
225
|
-
</OutletProvider>
|
|
226
|
-
);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// No loaders - wrap in OutletProvider so layout can use <Outlet />
|
|
230
|
-
return (
|
|
231
|
-
<OutletProvider content={content} segment={segment}>
|
|
232
|
-
{segment.layout}
|
|
233
|
-
</OutletProvider>
|
|
234
|
-
);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// No layout but has loaders - wrap content with LoaderBoundary for useLoader context
|
|
238
|
-
// This is common for intercept routes that use useLoader without a custom layout
|
|
239
|
-
if (segment.loaderDataPromise && segment.loaderIds) {
|
|
240
|
-
return (
|
|
241
|
-
<LoaderBoundary
|
|
242
|
-
loaderDataPromise={segment.loaderDataPromise}
|
|
243
|
-
loaderIds={segment.loaderIds}
|
|
244
|
-
fallback={segment.loading}
|
|
245
|
-
outletKey={segment.id + "-loader"}
|
|
246
|
-
outletContent={null}
|
|
247
|
-
segment={segment}
|
|
248
|
-
>
|
|
249
|
-
{content}
|
|
250
|
-
</LoaderBoundary>
|
|
251
|
-
);
|
|
252
|
-
}
|
|
191
|
+
const segment = useSlotSegment(context, name);
|
|
253
192
|
|
|
254
|
-
return
|
|
193
|
+
return renderSlotContent(segment);
|
|
255
194
|
}
|
|
256
195
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
* to find loader data from parent layouts. If this segment defines a loading
|
|
262
|
-
* component, Outlet will wrap content with Suspense using that as fallback.
|
|
263
|
-
*/
|
|
264
|
-
export function OutletProvider({
|
|
265
|
-
content,
|
|
266
|
-
parallel,
|
|
267
|
-
segment,
|
|
268
|
-
loaderData,
|
|
269
|
-
children,
|
|
270
|
-
}: {
|
|
271
|
-
content: ReactNode;
|
|
272
|
-
parallel?: ResolvedSegment[];
|
|
273
|
-
segment?: ResolvedSegment;
|
|
274
|
-
loaderData?: Record<string, any>;
|
|
275
|
-
children: ReactNode;
|
|
276
|
-
}): ReactNode {
|
|
277
|
-
// Get parent context to enable walking up the chain for loader lookups
|
|
278
|
-
const parentContext = useContext(OutletContext);
|
|
279
|
-
|
|
280
|
-
const value = useMemo(
|
|
281
|
-
() => ({
|
|
282
|
-
content,
|
|
283
|
-
parallel,
|
|
284
|
-
segment,
|
|
285
|
-
loaderData,
|
|
286
|
-
parent: parentContext,
|
|
287
|
-
loading: segment?.loading,
|
|
288
|
-
}),
|
|
289
|
-
[content, parallel, segment, loaderData, parentContext]
|
|
290
|
-
);
|
|
291
|
-
|
|
292
|
-
return (
|
|
293
|
-
<OutletContext.Provider value={value}>{children}</OutletContext.Provider>
|
|
294
|
-
);
|
|
295
|
-
}
|
|
196
|
+
// OutletProvider is defined in outlet-provider.tsx to break a circular
|
|
197
|
+
// dependency between client.tsx and route-content-wrapper.tsx. It is imported
|
|
198
|
+
// at the top of this file for local use in Outlet/ParallelOutlet only; it is an
|
|
199
|
+
// internal component and is intentionally not part of the public ./client API.
|
|
296
200
|
|
|
297
201
|
/**
|
|
298
202
|
* Hook to access outlet content programmatically
|
|
@@ -313,113 +217,16 @@ export function useOutlet(): ReactNode {
|
|
|
313
217
|
return context?.content ?? null;
|
|
314
218
|
}
|
|
315
219
|
|
|
316
|
-
// Loader hooks - re-exported from dedicated file
|
|
317
220
|
export {
|
|
318
221
|
useLoader,
|
|
319
222
|
useFetchLoader,
|
|
223
|
+
useRefreshLoaders,
|
|
320
224
|
type LoadFunction,
|
|
321
225
|
type UseLoaderResult,
|
|
322
226
|
type UseFetchLoaderResult,
|
|
323
227
|
type UseLoaderOptions,
|
|
324
228
|
} from "./use-loader.js";
|
|
325
229
|
|
|
326
|
-
/**
|
|
327
|
-
* Hook to access all loader data in the current context
|
|
328
|
-
*
|
|
329
|
-
* Returns a record of all loader data available in the current outlet context
|
|
330
|
-
* and all parent contexts. Useful for debugging or when you need access to
|
|
331
|
-
* multiple loaders.
|
|
332
|
-
*
|
|
333
|
-
* @returns Record of loader name to data, or empty object if no loaders
|
|
334
|
-
*
|
|
335
|
-
* @example
|
|
336
|
-
* ```tsx
|
|
337
|
-
* "use client";
|
|
338
|
-
* import { useLoaderData } from "rsc-router/client";
|
|
339
|
-
*
|
|
340
|
-
* export function DebugPanel() {
|
|
341
|
-
* const loaderData = useLoaderData();
|
|
342
|
-
* return <pre>{JSON.stringify(loaderData, null, 2)}</pre>;
|
|
343
|
-
* }
|
|
344
|
-
* ```
|
|
345
|
-
*/
|
|
346
|
-
export function useLoaderData(): Record<string, any> {
|
|
347
|
-
const context = useContext(OutletContext);
|
|
348
|
-
|
|
349
|
-
// Collect all loader data from the context chain
|
|
350
|
-
// Child loaders override parent loaders with the same name
|
|
351
|
-
const result: Record<string, any> = {};
|
|
352
|
-
const stack: OutletContextValue[] = [];
|
|
353
|
-
|
|
354
|
-
// Build stack from current to root
|
|
355
|
-
let current: OutletContextValue | null | undefined = context;
|
|
356
|
-
while (current) {
|
|
357
|
-
stack.push(current);
|
|
358
|
-
current = current.parent;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
// Apply from root to current (so children override parents)
|
|
362
|
-
for (let i = stack.length - 1; i >= 0; i--) {
|
|
363
|
-
const ctx = stack[i];
|
|
364
|
-
if (ctx.loaderData) {
|
|
365
|
-
Object.assign(result, ctx.loaderData);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
return result;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* Client-safe createLoader factory
|
|
374
|
-
*
|
|
375
|
-
* Creates a loader definition that can be used with useLoader().
|
|
376
|
-
* This is the client-side version that only stores the $$id - the function
|
|
377
|
-
* is ignored since loaders only execute on the server.
|
|
378
|
-
*
|
|
379
|
-
* The $$id is injected by the exposeLoaderId Vite plugin. In most cases,
|
|
380
|
-
* you should import the loader directly from the server file rather than
|
|
381
|
-
* creating a reference manually.
|
|
382
|
-
*
|
|
383
|
-
* @param fn - Loader function (ignored on client, kept for API compatibility)
|
|
384
|
-
* @param _fetchable - Optional fetchable flag (ignored on client)
|
|
385
|
-
* @param __injectedId - $$id injected by Vite plugin
|
|
386
|
-
*
|
|
387
|
-
* @example
|
|
388
|
-
* ```tsx
|
|
389
|
-
* "use client";
|
|
390
|
-
* import { useLoader } from "rsc-router/client";
|
|
391
|
-
* import { CartLoader } from "../loaders/cart"; // Import from server file
|
|
392
|
-
*
|
|
393
|
-
* export function CartIcon() {
|
|
394
|
-
* const cart = useLoader(CartLoader);
|
|
395
|
-
* return <span>Cart ({cart?.items.length ?? 0})</span>;
|
|
396
|
-
* }
|
|
397
|
-
* ```
|
|
398
|
-
*/
|
|
399
|
-
// Overload 1: With function only (not fetchable)
|
|
400
|
-
export function createLoader<T>(
|
|
401
|
-
fn: LoaderFn<T, Record<string, string | undefined>, any>
|
|
402
|
-
): LoaderDefinition<Awaited<T>, Record<string, string | undefined>>;
|
|
403
|
-
|
|
404
|
-
// Overload 2: With function and fetchable flag
|
|
405
|
-
export function createLoader<T>(
|
|
406
|
-
fn: LoaderFn<T, Record<string, string | undefined>, any>,
|
|
407
|
-
fetchable: true
|
|
408
|
-
): LoaderDefinition<Awaited<T>, Record<string, string | undefined>>;
|
|
409
|
-
|
|
410
|
-
// Implementation - function is ignored at runtime on client
|
|
411
|
-
// The $$id is injected by Vite plugin as hidden third parameter
|
|
412
|
-
export function createLoader(
|
|
413
|
-
_fn: LoaderFn<any, Record<string, string | undefined>, any>,
|
|
414
|
-
_fetchable?: true,
|
|
415
|
-
__injectedId?: string
|
|
416
|
-
): LoaderDefinition<any, Record<string, string | undefined>> {
|
|
417
|
-
return {
|
|
418
|
-
__brand: "loader",
|
|
419
|
-
$$id: __injectedId || "",
|
|
420
|
-
};
|
|
421
|
-
}
|
|
422
|
-
|
|
423
230
|
/**
|
|
424
231
|
* Props for the ErrorBoundary component
|
|
425
232
|
*/
|
|
@@ -528,116 +335,93 @@ export class ErrorBoundary extends Component<
|
|
|
528
335
|
}
|
|
529
336
|
}
|
|
530
337
|
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
//
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
338
|
+
export { useNavigation } from "./browser/react/use-navigation.js";
|
|
339
|
+
export { useRouter } from "./browser/react/use-router.js";
|
|
340
|
+
export { usePathname } from "./browser/react/use-pathname.js";
|
|
341
|
+
export { useSearchParams } from "./browser/react/use-search-params.js";
|
|
342
|
+
export { useParams } from "./browser/react/use-params.js";
|
|
343
|
+
// CSP nonce for the active request, for userland components that inject their
|
|
344
|
+
// own <script>/<style> into the document head (analytics, GTM, inline init).
|
|
345
|
+
// Returns the nonce during SSR and undefined in the browser; render the tag
|
|
346
|
+
// server-side so the nonce lands in the SSR HTML and hydration stays clean.
|
|
347
|
+
export { useNonce } from "./browser/react/nonce-context.js";
|
|
348
|
+
export type {
|
|
349
|
+
RouterInstance,
|
|
350
|
+
RouterNavigateOptions,
|
|
351
|
+
ReadonlyURLSearchParams,
|
|
352
|
+
ActionState,
|
|
353
|
+
ActionLifecycleState,
|
|
354
|
+
} from "./browser/types.js";
|
|
542
355
|
|
|
543
|
-
// Action state tracking hook
|
|
544
356
|
export {
|
|
545
357
|
useAction,
|
|
546
358
|
type ServerActionFunction,
|
|
547
359
|
} from "./browser/react/use-action.js";
|
|
548
360
|
|
|
549
|
-
// Segments state hook
|
|
550
361
|
export {
|
|
551
362
|
useSegments,
|
|
552
363
|
type SegmentsState,
|
|
553
364
|
} from "./browser/react/use-segments.js";
|
|
554
365
|
|
|
555
|
-
// Client cache controls hook
|
|
556
|
-
export {
|
|
557
|
-
useClientCache,
|
|
558
|
-
type ClientCacheControls,
|
|
559
|
-
} from "./browser/react/use-client-cache.js";
|
|
560
|
-
|
|
561
|
-
// Provider
|
|
562
366
|
export {
|
|
563
367
|
NavigationProvider,
|
|
564
368
|
type NavigationProviderProps,
|
|
565
369
|
} from "./browser/react/NavigationProvider.js";
|
|
566
370
|
|
|
567
|
-
// Link component
|
|
568
371
|
export {
|
|
569
372
|
Link,
|
|
570
373
|
type LinkProps,
|
|
571
374
|
type PrefetchStrategy,
|
|
572
375
|
type StateOrGetter,
|
|
376
|
+
type LinkState,
|
|
573
377
|
} from "./browser/react/Link.js";
|
|
574
378
|
|
|
575
|
-
// Link status hook
|
|
576
379
|
export {
|
|
577
380
|
useLinkStatus,
|
|
578
381
|
type LinkStatus,
|
|
579
382
|
} from "./browser/react/use-link-status.js";
|
|
580
383
|
|
|
581
|
-
// Scroll restoration
|
|
582
384
|
export {
|
|
583
385
|
ScrollRestoration,
|
|
584
386
|
useScrollRestoration,
|
|
585
387
|
type ScrollRestorationProps,
|
|
586
388
|
} from "./browser/react/ScrollRestoration.js";
|
|
587
389
|
|
|
588
|
-
|
|
589
|
-
export { createHandle, isHandle, type Handle } from "./handle.js";
|
|
590
|
-
|
|
591
|
-
// Handle data hook
|
|
390
|
+
export { type Handle } from "./handle.js";
|
|
592
391
|
export { useHandle } from "./browser/react/use-handle.js";
|
|
593
392
|
|
|
594
|
-
// Built-in handles
|
|
595
393
|
export { Meta } from "./handles/meta.js";
|
|
596
394
|
export { MetaTags } from "./handles/MetaTags.js";
|
|
597
395
|
export type { MetaDescriptor, MetaDescriptorBase } from "./router/types.js";
|
|
396
|
+
export {
|
|
397
|
+
Script,
|
|
398
|
+
type ScriptConfig,
|
|
399
|
+
type ScriptAttributes,
|
|
400
|
+
} from "./handles/script.js";
|
|
401
|
+
export { Scripts } from "./handles/Scripts.js";
|
|
402
|
+
export { Breadcrumbs, type BreadcrumbItem } from "./handles/breadcrumbs.js";
|
|
598
403
|
|
|
599
|
-
// Location state - type-safe navigation state
|
|
600
404
|
export {
|
|
601
405
|
createLocationState,
|
|
602
406
|
useLocationState,
|
|
603
407
|
type LocationStateDefinition,
|
|
604
408
|
type LocationStateEntry,
|
|
409
|
+
type LocationStateOptions,
|
|
605
410
|
} from "./browser/react/location-state.js";
|
|
606
411
|
|
|
607
|
-
//
|
|
608
|
-
export { href, type
|
|
609
|
-
|
|
610
|
-
// Response envelope types for consuming JSON response routes
|
|
611
|
-
export type { ResponseEnvelope, ResponseError } from "./urls.js";
|
|
412
|
+
// Ambient Rango.Path / Rango.PathResponse types (declared in href-client.ts)
|
|
413
|
+
export { href, type PatternToPath } from "./href-client.js";
|
|
612
414
|
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
*
|
|
616
|
-
* @example
|
|
617
|
-
* ```typescript
|
|
618
|
-
* const result: ResponseEnvelope<Product> = await fetch(url).then(r => r.json());
|
|
619
|
-
* if (isResponseError(result)) {
|
|
620
|
-
* console.log(result.error.message, result.error.code);
|
|
621
|
-
* return;
|
|
622
|
-
* }
|
|
623
|
-
* result.data // fully typed as Product
|
|
624
|
-
* ```
|
|
625
|
-
*/
|
|
626
|
-
export function isResponseError<T>(
|
|
627
|
-
result: import("./urls.js").ResponseEnvelope<T>
|
|
628
|
-
): result is import("./urls.js").ResponseEnvelope<T> & { error: import("./urls.js").ResponseError } {
|
|
629
|
-
return result.error !== undefined;
|
|
630
|
-
}
|
|
415
|
+
// RFC 9457 error type for JSON response routes
|
|
416
|
+
export type { ProblemDetails } from "./urls.js";
|
|
631
417
|
|
|
632
|
-
// Mount context for include() scoped components
|
|
633
418
|
export { useMount } from "./browser/react/use-mount.js";
|
|
634
419
|
export { MountContext } from "./browser/react/mount-context.js";
|
|
635
420
|
|
|
636
|
-
// Mount-aware href hook - auto-prefixes paths with include() mount
|
|
637
421
|
export { useHref } from "./browser/react/use-href.js";
|
|
638
422
|
|
|
639
|
-
|
|
640
|
-
|
|
423
|
+
export { useReverse } from "./browser/react/use-reverse.js";
|
|
424
|
+
|
|
425
|
+
export type { ScopedReverseFunction, LocalReverseFunction } from "./reverse.js";
|
|
641
426
|
|
|
642
|
-
// Loader definition type - for typing loader props in client components
|
|
643
427
|
export type { LoaderDefinition } from "./types.js";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare preset integration surface for @rangojs/router.
|
|
3
|
+
*
|
|
4
|
+
* Imported via `@rangojs/router/cloudflare`. Cloudflare-only helpers live here
|
|
5
|
+
* so Node/other-platform consumers never pull them in.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export {
|
|
9
|
+
createCloudflareTracing,
|
|
10
|
+
type CloudflareTracingOptions,
|
|
11
|
+
} from "./tracing.js";
|