@rangojs/router 0.0.0-experimental.11 → 0.0.0-experimental.110
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 +9 -0
- package/README.md +1037 -4
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +1635 -158
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +6148 -2425
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +73 -66
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +473 -0
- package/skills/caching/SKILL.md +94 -24
- package/skills/composability/SKILL.md +197 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +18 -16
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +524 -71
- package/skills/host-router/SKILL.md +243 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +173 -8
- package/skills/layout/SKILL.md +123 -5
- package/skills/links/SKILL.md +316 -25
- package/skills/loader/SKILL.md +620 -50
- package/skills/middleware/SKILL.md +211 -37
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +42 -11
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +271 -3
- package/skills/prerender/SKILL.md +448 -63
- package/skills/rango/SKILL.md +273 -21
- package/skills/response-routes/SKILL.md +210 -100
- package/skills/route/SKILL.md +310 -14
- package/skills/router-setup/SKILL.md +211 -33
- package/skills/server-actions/SKILL.md +751 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +622 -91
- package/skills/use-cache/SKILL.md +324 -0
- package/skills/view-transitions/SKILL.md +212 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +117 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +136 -68
- 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/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +370 -561
- package/src/browser/navigation-client.ts +228 -70
- package/src/browser/navigation-store.ts +97 -55
- package/src/browser/navigation-transaction.ts +293 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +376 -315
- package/src/browser/prefetch/cache.ts +314 -0
- package/src/browser/prefetch/fetch.ts +282 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +191 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +152 -0
- package/src/browser/react/Link.tsx +255 -71
- package/src/browser/react/NavigationProvider.tsx +152 -24
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +55 -0
- package/src/browser/react/index.ts +15 -12
- package/src/browser/react/location-state-shared.ts +176 -53
- package/src/browser/react/location-state.ts +90 -19
- 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 +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +41 -123
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +44 -65
- package/src/browser/react/use-params.ts +78 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +99 -0
- package/src/browser/react/use-router.ts +96 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +85 -99
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +254 -72
- package/src/browser/scroll-restoration.ts +132 -49
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +510 -603
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +158 -48
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +87 -26
- package/src/build/generate-route-types.ts +39 -828
- package/src/build/index.ts +2 -5
- package/src/build/route-trie.ts +84 -31
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +618 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +342 -0
- package/src/cache/cache-scope.ts +167 -307
- package/src/cache/cf/cf-cache-store.ts +573 -21
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +191 -13
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +72 -122
- package/src/client.rsc.tsx +6 -1
- package/src/client.tsx +117 -303
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +156 -0
- package/src/debug.ts +19 -9
- package/src/errors.ts +78 -8
- package/src/handle.ts +56 -11
- package/src/handles/MetaTags.tsx +73 -20
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +30 -13
- package/src/host/cookie-handler.ts +21 -15
- package/src/host/errors.ts +8 -8
- package/src/host/index.ts +6 -9
- package/src/host/pattern-matcher.ts +27 -27
- package/src/host/router.ts +176 -82
- package/src/host/testing.ts +8 -8
- package/src/host/types.ts +46 -9
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +196 -56
- package/src/index.rsc.ts +140 -22
- package/src/index.ts +214 -53
- package/src/internal-debug.ts +11 -0
- package/src/loader-store.ts +463 -0
- package/src/loader.rsc.ts +25 -143
- package/src/loader.ts +27 -10
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +4 -2
- package/src/prerender/store.ts +122 -17
- package/src/prerender.ts +397 -29
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +231 -121
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +7 -4
- package/src/route-definition/dsl-helpers.ts +1134 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +485 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +101 -0
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-definition.ts +1 -1431
- package/src/route-map-builder.ts +162 -123
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +64 -9
- package/src/router/content-negotiation.ts +215 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +10 -10
- package/src/router/find-match.ts +160 -0
- package/src/router/handler-context.ts +376 -109
- package/src/router/intercept-resolution.ts +35 -20
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +330 -145
- package/src/router/logging.ts +251 -0
- package/src/router/manifest.ts +70 -22
- package/src/router/match-api.ts +196 -261
- package/src/router/match-context.ts +4 -2
- package/src/router/match-handlers.ts +441 -0
- package/src/router/match-middleware/background-revalidation.ts +108 -93
- package/src/router/match-middleware/cache-lookup.ts +414 -91
- package/src/router/match-middleware/cache-store.ts +91 -29
- package/src/router/match-middleware/intercept-resolution.ts +48 -21
- package/src/router/match-middleware/segment-resolution.ts +73 -9
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +154 -35
- package/src/router/metrics.ts +241 -16
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +209 -0
- package/src/router/middleware.ts +373 -371
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +291 -54
- package/src/router/prerender-match.ts +502 -0
- package/src/router/preview-match.ts +98 -0
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +195 -40
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +41 -21
- package/src/router/router-interfaces.ts +490 -0
- package/src/router/router-options.ts +618 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +756 -0
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1407 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -1336
- package/src/router/segment-wrappers.ts +291 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +111 -39
- package/src/router/types.ts +17 -9
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +707 -2291
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +864 -1117
- package/src/rsc/helpers.ts +181 -19
- package/src/rsc/index.ts +1 -21
- package/src/rsc/loader-fetch.ts +229 -0
- package/src/rsc/manifest-init.ts +90 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +395 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +360 -0
- package/src/rsc/rsc-rendering.ts +256 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +360 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +52 -11
- package/src/search-params.ts +230 -0
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +187 -38
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +344 -70
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +113 -15
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +603 -109
- package/src/server.ts +35 -155
- package/src/ssr/index.tsx +107 -30
- package/src/static-handler.ts +126 -0
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +5 -2
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +4 -30
- package/src/theme/theme-script.ts +21 -18
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +806 -0
- package/src/types/index.ts +89 -0
- package/src/types/loader-types.ts +209 -0
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +120 -0
- package/src/types/segments.ts +167 -0
- package/src/types.ts +1 -1763
- package/src/urls/include-helper.ts +207 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +372 -0
- package/src/urls/path-helper.ts +364 -0
- package/src/urls/pattern-types.ts +141 -0
- package/src/urls/response-types.ts +108 -0
- package/src/urls/type-extraction.ts +377 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -1288
- package/src/use-loader.tsx +511 -107
- package/src/vite/debug.ts +184 -0
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +374 -0
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +480 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/state.ts +143 -0
- package/src/vite/discovery/virtual-module-codegen.ts +193 -0
- package/src/vite/index.ts +15 -2012
- package/src/vite/plugin-types.ts +103 -0
- package/src/vite/plugins/cjs-to-esm.ts +98 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +117 -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 +214 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +109 -66
- package/src/vite/plugins/expose-id-utils.ts +303 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +320 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +209 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +816 -0
- package/src/vite/plugins/performance-tracks.ts +92 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +336 -0
- package/src/vite/plugins/version-injector.ts +109 -0
- package/src/vite/plugins/version-plugin.ts +323 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +509 -0
- package/src/vite/router-discovery.ts +1511 -0
- package/src/vite/utils/ast-handler-extract.ts +517 -0
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +139 -0
- package/src/vite/utils/forward-user-plugins.ts +193 -0
- package/src/vite/utils/manifest-utils.ts +86 -0
- package/src/vite/utils/package-resolution.ts +161 -0
- package/src/vite/utils/prerender-utils.ts +222 -0
- package/src/vite/utils/shared-utils.ts +174 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -426
- package/src/vite/expose-location-state-id.ts +0 -177
- package/src/vite/expose-prerender-handler-id.ts +0 -429
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/skills/hooks/SKILL.md
CHANGED
|
@@ -6,49 +6,85 @@ argument-hint: [hook-name]
|
|
|
6
6
|
|
|
7
7
|
# Client-Side React Hooks
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Import the hooks and components in this skill from `@rangojs/router/client`.
|
|
10
|
+
The root `@rangojs/router` entrypoint is for server/RSC APIs and shared types.
|
|
10
11
|
|
|
11
12
|
## Navigation Hooks
|
|
12
13
|
|
|
13
14
|
### useNavigation()
|
|
14
15
|
|
|
15
|
-
Track navigation state
|
|
16
|
+
Track reactive navigation state (state-only, no actions):
|
|
16
17
|
|
|
17
18
|
```tsx
|
|
18
19
|
"use client";
|
|
19
|
-
import { useNavigation } from "@rangojs/router";
|
|
20
|
+
import { useNavigation } from "@rangojs/router/client";
|
|
20
21
|
|
|
21
22
|
function NavIndicator() {
|
|
22
23
|
const nav = useNavigation();
|
|
23
24
|
|
|
24
|
-
//
|
|
25
|
-
nav.state;
|
|
26
|
-
nav.isStreaming;
|
|
27
|
-
nav.location;
|
|
28
|
-
nav.pendingUrl;
|
|
25
|
+
// State properties
|
|
26
|
+
nav.state; // 'idle' | 'loading'
|
|
27
|
+
nav.isStreaming; // boolean
|
|
28
|
+
nav.location; // Current URL
|
|
29
|
+
nav.pendingUrl; // Target URL during navigation (or null)
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
nav.navigate("/products"); // Navigate programmatically
|
|
32
|
-
nav.navigate("/products", { replace: true }); // Replace history
|
|
33
|
-
nav.refresh(); // Refresh current route
|
|
34
|
-
|
|
35
|
-
return nav.state === 'loading' ? <Spinner /> : null;
|
|
31
|
+
return nav.state === "loading" ? <Spinner /> : null;
|
|
36
32
|
}
|
|
37
33
|
|
|
38
|
-
// With selector for performance
|
|
34
|
+
// With selector for performance (re-renders only when selected value changes)
|
|
39
35
|
function IsLoading() {
|
|
40
|
-
const isLoading = useNavigation(nav => nav.state ===
|
|
36
|
+
const isLoading = useNavigation((nav) => nav.state === "loading");
|
|
41
37
|
return isLoading ? <Spinner /> : null;
|
|
42
38
|
}
|
|
43
39
|
```
|
|
44
40
|
|
|
41
|
+
### useRouter()
|
|
42
|
+
|
|
43
|
+
Access stable router actions (never causes re-renders):
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
"use client";
|
|
47
|
+
import { useRouter } from "@rangojs/router/client";
|
|
48
|
+
|
|
49
|
+
function NavigationControls() {
|
|
50
|
+
const router = useRouter();
|
|
51
|
+
|
|
52
|
+
router.push("/products"); // Navigate (adds history entry)
|
|
53
|
+
router.replace("/login"); // Navigate (replaces history entry)
|
|
54
|
+
router.refresh(); // Re-fetch current route data
|
|
55
|
+
router.prefetch("/dashboard"); // Prefetch for faster navigation
|
|
56
|
+
router.back(); // Go back in history
|
|
57
|
+
router.forward(); // Go forward in history
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
#### Skipping revalidation
|
|
62
|
+
|
|
63
|
+
Pass `revalidate: false` to skip the RSC server fetch for same-pathname navigations (search param or hash changes). The URL updates and all hooks re-render, but server components stay as-is.
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
// Update search params without server round-trip
|
|
67
|
+
router.push("/products?color=blue", { revalidate: false });
|
|
68
|
+
router.replace("/products?page=3", { revalidate: false });
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
If the pathname changes, `revalidate: false` is silently ignored and a full navigation occurs. This also works on `<Link>`:
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
<Link to="/products?color=blue" revalidate={false}>
|
|
75
|
+
Blue
|
|
76
|
+
</Link>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Plain `<a>` tags can opt in via `data-revalidate="false"`.
|
|
80
|
+
|
|
45
81
|
### useSegments()
|
|
46
82
|
|
|
47
83
|
Access current URL path and matched route segments:
|
|
48
84
|
|
|
49
85
|
```tsx
|
|
50
86
|
"use client";
|
|
51
|
-
import { useSegments } from "@rangojs/router";
|
|
87
|
+
import { useSegments } from "@rangojs/router/client";
|
|
52
88
|
|
|
53
89
|
function Breadcrumbs() {
|
|
54
90
|
const { path, segmentIds, location } = useSegments();
|
|
@@ -61,7 +97,7 @@ function Breadcrumbs() {
|
|
|
61
97
|
}
|
|
62
98
|
|
|
63
99
|
// With selector
|
|
64
|
-
const isShopRoute = useSegments(s => s.path[0] === "shop");
|
|
100
|
+
const isShopRoute = useSegments((s) => s.path[0] === "shop");
|
|
65
101
|
```
|
|
66
102
|
|
|
67
103
|
### useLinkStatus()
|
|
@@ -81,7 +117,7 @@ function LoadingIndicator() {
|
|
|
81
117
|
<Link to="/dashboard">
|
|
82
118
|
Dashboard
|
|
83
119
|
<LoadingIndicator />
|
|
84
|
-
</Link
|
|
120
|
+
</Link>;
|
|
85
121
|
```
|
|
86
122
|
|
|
87
123
|
## Data Hooks
|
|
@@ -92,7 +128,7 @@ Access loader data (strict - data guaranteed):
|
|
|
92
128
|
|
|
93
129
|
```tsx
|
|
94
130
|
"use client";
|
|
95
|
-
import { useLoader } from "@rangojs/router";
|
|
131
|
+
import { useLoader } from "@rangojs/router/client";
|
|
96
132
|
import { ProductLoader } from "../loaders/product";
|
|
97
133
|
|
|
98
134
|
function ProductPrice() {
|
|
@@ -128,7 +164,7 @@ Access loader with on-demand fetching (flexible):
|
|
|
128
164
|
|
|
129
165
|
```tsx
|
|
130
166
|
"use client";
|
|
131
|
-
import { useFetchLoader } from "@rangojs/router";
|
|
167
|
+
import { useFetchLoader } from "@rangojs/router/client";
|
|
132
168
|
import { SearchLoader } from "../loaders/search";
|
|
133
169
|
|
|
134
170
|
function SearchResults() {
|
|
@@ -146,37 +182,200 @@ function SearchResults() {
|
|
|
146
182
|
<div>
|
|
147
183
|
<input onChange={(e) => handleSearch(e.target.value)} />
|
|
148
184
|
{isLoading && <Spinner />}
|
|
149
|
-
{data?.results.map(r =>
|
|
185
|
+
{data?.results.map((r) => (
|
|
186
|
+
<Result key={r.id} {...r} />
|
|
187
|
+
))}
|
|
150
188
|
</div>
|
|
151
189
|
);
|
|
152
190
|
}
|
|
153
191
|
```
|
|
154
192
|
|
|
193
|
+
**Shared refetch behavior**:
|
|
194
|
+
|
|
195
|
+
When the loader is registered on the route via `loader()`, a plain
|
|
196
|
+
`load()` call (no options, or a trivially-defaulted GET with no
|
|
197
|
+
`params` and no `body`) broadcasts its result to every component
|
|
198
|
+
reading the same loader id. Layout, page, and parallel-slot reads
|
|
199
|
+
all converge on the new value:
|
|
200
|
+
|
|
201
|
+
```tsx
|
|
202
|
+
// Layout button calls load() — the page read below sees the update too.
|
|
203
|
+
function Layout() {
|
|
204
|
+
const { data, load } = useLoader(CartLoader);
|
|
205
|
+
return <button onClick={() => load()}>Refresh ({data.count})</button>;
|
|
206
|
+
}
|
|
207
|
+
function Page() {
|
|
208
|
+
const { data } = useLoader(CartLoader); // updates with the layout's load()
|
|
209
|
+
return <span>{data.count} items</span>;
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
`isLoading` and `error` follow the same scope. `throwOnError: true`
|
|
214
|
+
render-throws are scoped to the **originating** hook — sibling readers
|
|
215
|
+
see the error in their `error` state but their boundaries are not
|
|
216
|
+
triggered by someone else's failure. A successful follow-up `load()`
|
|
217
|
+
clears the shared error.
|
|
218
|
+
|
|
219
|
+
**`load()` calls that stay local** (no broadcast, per-hook state, same
|
|
220
|
+
semantics as the old per-component `useState`):
|
|
221
|
+
|
|
222
|
+
- `load({ params: { ... } })` — explicit params.
|
|
223
|
+
- `load({ method: "POST", body })` — mutations.
|
|
224
|
+
- Any `load()` on a `useFetchLoader(loader)` whose loader is **not**
|
|
225
|
+
registered on the current route. Two unrelated components calling
|
|
226
|
+
`load()` on the same fetchable-but-unregistered loader keep
|
|
227
|
+
independent results.
|
|
228
|
+
|
|
229
|
+
So the search/list pattern still works — two components calling
|
|
230
|
+
`load({ params: { q } })` with different `q` values each keep their
|
|
231
|
+
own result; they do not collapse to last-write-wins through a shared
|
|
232
|
+
store.
|
|
233
|
+
|
|
234
|
+
**Scoping refetch with a `key`**:
|
|
235
|
+
|
|
236
|
+
Pass a `key` to partition the shared refresh store. Only hooks using the
|
|
237
|
+
**same** `key` refresh together when one of them calls `load()`. This is a
|
|
238
|
+
client-side refresh identity only — it never changes the request sent to the
|
|
239
|
+
server, and is unrelated to the server `cache({ key })` option and to
|
|
240
|
+
`revalidate()`.
|
|
241
|
+
|
|
242
|
+
```tsx
|
|
243
|
+
// Two independent dashboards using the same loader. Without a key, one
|
|
244
|
+
// dashboard's load() would flip the other's spinner and value. With a key,
|
|
245
|
+
// they refresh independently.
|
|
246
|
+
function Dashboard({ id }: { id: string }) {
|
|
247
|
+
const { data, load } = useLoader(StatsLoader, { key: `dashboard:${id}` });
|
|
248
|
+
return <button onClick={() => load()}>Refresh {data.total}</button>;
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
The `key` widens sharing in two ways the default cannot:
|
|
253
|
+
|
|
254
|
+
- **Parameterized GETs share.** `useFetchLoader(SearchLoader, { key: q })`
|
|
255
|
+
with the same `q` in two components share one result and refresh together —
|
|
256
|
+
a keyed `load({ params: { q } })` broadcasts to the group instead of staying
|
|
257
|
+
local. (Mutations — non-GET or `body` — stay local even with a key.)
|
|
258
|
+
- **Unregistered loaders share.** A `key` makes `useFetchLoader` of a loader
|
|
259
|
+
that is **not** registered on the route share too, letting unrelated
|
|
260
|
+
components opt into a common refresh group.
|
|
261
|
+
|
|
262
|
+
Lifecycle: a keyed read of an unregistered loader is reference-counted — its
|
|
263
|
+
shared value lives as long as at least one component using that key is mounted.
|
|
264
|
+
A persistent component (e.g. a header) keeps the value across navigations; a
|
|
265
|
+
route-scoped component's value is reclaimed when it unmounts. Registered-loader
|
|
266
|
+
reads (keyed or not) reset on navigation from fresh route data, as before.
|
|
267
|
+
|
|
268
|
+
**Refreshing multiple loaders together (`refreshGroup` + `useRefreshLoaders`)**:
|
|
269
|
+
|
|
270
|
+
`key` groups readers of one loader. To refresh **different** loaders together,
|
|
271
|
+
tag them with the same `refreshGroup` and trigger them with `useRefreshLoaders`:
|
|
272
|
+
|
|
273
|
+
```tsx
|
|
274
|
+
function Profile() {
|
|
275
|
+
const { data } = useLoader(ProfileLoader, {
|
|
276
|
+
key: userId,
|
|
277
|
+
refreshGroup: "account",
|
|
278
|
+
});
|
|
279
|
+
return <span>{data.name}</span>;
|
|
280
|
+
}
|
|
281
|
+
function Orders() {
|
|
282
|
+
const { data } = useLoader(OrdersLoader, {
|
|
283
|
+
key: userId,
|
|
284
|
+
refreshGroup: "account",
|
|
285
|
+
});
|
|
286
|
+
return <span>{data.count} orders</span>;
|
|
287
|
+
}
|
|
288
|
+
function RefreshButton() {
|
|
289
|
+
const refreshAccount = useRefreshLoaders("account");
|
|
290
|
+
return <button onClick={() => refreshAccount()}>Refresh</button>;
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
`refreshAccount()` re-runs every currently-mounted member with a **plain GET**
|
|
295
|
+
against the current route URL — no params, no body, no mutation methods, because
|
|
296
|
+
a group spans loaders with different shapes. It returns a promise that resolves
|
|
297
|
+
when all members settle and **rejects with an `AggregateError`** if any fail;
|
|
298
|
+
group refresh never render-throws, so handle failures at the await site
|
|
299
|
+
(`await refreshAccount().catch(...)`). Each failing member also exposes its error
|
|
300
|
+
via its own read's `error`.
|
|
301
|
+
|
|
302
|
+
Sharing within a group is opt-in via `key`: members that share a `key` share one
|
|
303
|
+
value (and one fetch); a grouped reader **without** a `key` gets its own private
|
|
304
|
+
bucket, so a group refresh updates only that read and never leaks into unrelated
|
|
305
|
+
unkeyed reads of the same loader. A bucket may belong to several groups at once
|
|
306
|
+
(different reads can tag the same keyed bucket with different group names).
|
|
307
|
+
Keep parameterized loaders on the single-loader `key` — a plain-GET group refresh
|
|
308
|
+
sends no params.
|
|
309
|
+
|
|
155
310
|
**Load options**:
|
|
311
|
+
|
|
156
312
|
```tsx
|
|
313
|
+
// JSON body — sent as application/json, available as ctx.body on the server
|
|
157
314
|
await load({
|
|
158
|
-
method:
|
|
159
|
-
params: { query:
|
|
160
|
-
body: { data:
|
|
315
|
+
method: "POST",
|
|
316
|
+
params: { query: "test" },
|
|
317
|
+
body: { data: "value" },
|
|
161
318
|
});
|
|
319
|
+
|
|
320
|
+
// FormData body — sent as multipart/form-data, available as ctx.formData on the server.
|
|
321
|
+
// Automatically detected: when body is a FormData instance, the request switches
|
|
322
|
+
// to multipart/form-data to preserve File objects and binary data.
|
|
323
|
+
const formData = new FormData();
|
|
324
|
+
formData.append("file", fileInput.files[0]);
|
|
325
|
+
await load({ method: "POST", body: formData });
|
|
162
326
|
```
|
|
163
327
|
|
|
164
|
-
|
|
328
|
+
**Body type auto-switching**: The `load()` function inspects the `body` value to
|
|
329
|
+
choose the encoding. If `body instanceof FormData`, the request is sent as
|
|
330
|
+
`multipart/form-data` (browser sets the boundary header automatically). Otherwise
|
|
331
|
+
the body is JSON-serialized and sent with `Content-Type: application/json`. On the
|
|
332
|
+
server, JSON bodies are available via `ctx.body` and FormData bodies via `ctx.formData`.
|
|
165
333
|
|
|
166
|
-
|
|
334
|
+
**File upload example**:
|
|
167
335
|
|
|
168
336
|
```tsx
|
|
169
337
|
"use client";
|
|
170
|
-
import {
|
|
338
|
+
import { useFetchLoader } from "@rangojs/router/client";
|
|
339
|
+
import { FileUploadLoader } from "../loaders/upload";
|
|
340
|
+
|
|
341
|
+
function FileUploader() {
|
|
342
|
+
const { data, load, isLoading } = useFetchLoader(FileUploadLoader);
|
|
343
|
+
const formRef = useRef<HTMLFormElement>(null);
|
|
171
344
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
345
|
+
const handleSubmit = async (formData: FormData) => {
|
|
346
|
+
await load({ method: "POST", body: formData });
|
|
347
|
+
formRef.current?.reset();
|
|
348
|
+
};
|
|
175
349
|
|
|
176
|
-
return
|
|
350
|
+
return (
|
|
351
|
+
<form ref={formRef} action={handleSubmit}>
|
|
352
|
+
<input type="file" name="file" />
|
|
353
|
+
<button type="submit" disabled={isLoading}>
|
|
354
|
+
{isLoading ? "Uploading..." : "Upload"}
|
|
355
|
+
</button>
|
|
356
|
+
{data?.uploadedFile && <p>Uploaded: {data.uploadedFile.name}</p>}
|
|
357
|
+
</form>
|
|
358
|
+
);
|
|
177
359
|
}
|
|
178
360
|
```
|
|
179
361
|
|
|
362
|
+
Server-side loader for the upload:
|
|
363
|
+
|
|
364
|
+
```typescript
|
|
365
|
+
import { createLoader } from "@rangojs/router";
|
|
366
|
+
|
|
367
|
+
export const FileUploadLoader = createLoader(async (ctx) => {
|
|
368
|
+
"use server";
|
|
369
|
+
|
|
370
|
+
const file = ctx.formData?.get("file") as File | null;
|
|
371
|
+
if (file && file.size > 0) {
|
|
372
|
+
// Process file (save to R2, D1, etc.)
|
|
373
|
+
return { uploadedFile: { name: file.name, size: file.size } };
|
|
374
|
+
}
|
|
375
|
+
return { uploadedFile: null };
|
|
376
|
+
}, true); // true = fetchable (can be called from the client via load())
|
|
377
|
+
```
|
|
378
|
+
|
|
180
379
|
## Handle Hooks
|
|
181
380
|
|
|
182
381
|
### useHandle()
|
|
@@ -185,8 +384,7 @@ Access accumulated handle data from route segments:
|
|
|
185
384
|
|
|
186
385
|
```tsx
|
|
187
386
|
"use client";
|
|
188
|
-
import { useHandle } from "@rangojs/router";
|
|
189
|
-
import { Breadcrumbs } from "../handles/breadcrumbs";
|
|
387
|
+
import { useHandle, Breadcrumbs } from "@rangojs/router/client";
|
|
190
388
|
|
|
191
389
|
function BreadcrumbNav() {
|
|
192
390
|
const crumbs = useHandle(Breadcrumbs);
|
|
@@ -205,7 +403,7 @@ function BreadcrumbNav() {
|
|
|
205
403
|
}
|
|
206
404
|
|
|
207
405
|
// With selector
|
|
208
|
-
const lastCrumb = useHandle(Breadcrumbs, data => data.at(-1));
|
|
406
|
+
const lastCrumb = useHandle(Breadcrumbs, (data) => data.at(-1));
|
|
209
407
|
```
|
|
210
408
|
|
|
211
409
|
Handles can be passed as props from server to client components:
|
|
@@ -216,16 +414,23 @@ path("/dashboard", (ctx) => {
|
|
|
216
414
|
const push = ctx.use(Breadcrumbs);
|
|
217
415
|
push({ label: "Dashboard", href: "/dashboard" });
|
|
218
416
|
return <DashboardNav handle={Breadcrumbs} />;
|
|
219
|
-
})
|
|
417
|
+
});
|
|
418
|
+
```
|
|
220
419
|
|
|
420
|
+
```tsx
|
|
221
421
|
// Client component — typeof infers the full Handle<T> type
|
|
222
422
|
"use client";
|
|
223
|
-
import { useHandle } from "@rangojs/router/client";
|
|
224
|
-
import type { Breadcrumbs } from "../handles";
|
|
423
|
+
import { useHandle, type Breadcrumbs } from "@rangojs/router/client";
|
|
225
424
|
|
|
226
425
|
function DashboardNav({ handle }: { handle: typeof Breadcrumbs }) {
|
|
227
426
|
const crumbs = useHandle(handle);
|
|
228
|
-
return
|
|
427
|
+
return (
|
|
428
|
+
<nav>
|
|
429
|
+
{crumbs.map((c) => (
|
|
430
|
+
<a href={c.href}>{c.label}</a>
|
|
431
|
+
))}
|
|
432
|
+
</nav>
|
|
433
|
+
);
|
|
229
434
|
}
|
|
230
435
|
```
|
|
231
436
|
|
|
@@ -235,13 +440,18 @@ RSC serialization strips the `collect` function via `toJSON()`. On the client,
|
|
|
235
440
|
|
|
236
441
|
## Action Hooks
|
|
237
442
|
|
|
443
|
+
For the full server-action guide (defining actions, `useActionState`,
|
|
444
|
+
`useOptimistic`, validation, revalidation, error handling, file uploads),
|
|
445
|
+
see `/server-actions`. `useAction()` below is a Rango-specific hook for
|
|
446
|
+
tracking actions called outside a `<form action={...}>` flow.
|
|
447
|
+
|
|
238
448
|
### useAction()
|
|
239
449
|
|
|
240
450
|
Track state of server action invocations:
|
|
241
451
|
|
|
242
452
|
```tsx
|
|
243
453
|
"use client";
|
|
244
|
-
import { useAction } from "@rangojs/router";
|
|
454
|
+
import { useAction } from "@rangojs/router/client";
|
|
245
455
|
import { addToCart } from "../actions/cart";
|
|
246
456
|
|
|
247
457
|
function AddToCartButton({ productId }: { productId: string }) {
|
|
@@ -256,8 +466,8 @@ function AddToCartButton({ productId }: { productId: string }) {
|
|
|
256
466
|
return (
|
|
257
467
|
<form action={addToCart}>
|
|
258
468
|
<input type="hidden" name="productId" value={productId} />
|
|
259
|
-
<button disabled={state ===
|
|
260
|
-
{state ===
|
|
469
|
+
<button disabled={state === "loading"}>
|
|
470
|
+
{state === "loading" ? "Adding..." : "Add to Cart"}
|
|
261
471
|
</button>
|
|
262
472
|
{error && <p className="error">{error.message}</p>}
|
|
263
473
|
</form>
|
|
@@ -265,7 +475,7 @@ function AddToCartButton({ productId }: { productId: string }) {
|
|
|
265
475
|
}
|
|
266
476
|
|
|
267
477
|
// Match by string suffix (convenient but may be ambiguous)
|
|
268
|
-
const isLoading = useAction(
|
|
478
|
+
const isLoading = useAction("addToCart", (s) => s.state === "loading");
|
|
269
479
|
```
|
|
270
480
|
|
|
271
481
|
## State Hooks
|
|
@@ -276,20 +486,29 @@ Read type-safe state from history:
|
|
|
276
486
|
|
|
277
487
|
```tsx
|
|
278
488
|
"use client";
|
|
279
|
-
import { useLocationState, createLocationState } from "@rangojs/router";
|
|
489
|
+
import { useLocationState, createLocationState } from "@rangojs/router/client";
|
|
280
490
|
|
|
281
|
-
// Define typed state
|
|
491
|
+
// Define typed state (all export patterns supported)
|
|
492
|
+
// Keys are auto-injected by the Vite plugin -- no manual key needed.
|
|
282
493
|
export const ProductState = createLocationState<{
|
|
283
494
|
name: string;
|
|
284
495
|
price: number;
|
|
285
496
|
}>();
|
|
286
497
|
|
|
498
|
+
// Also valid: const ProductState = createLocationState<...>();
|
|
499
|
+
// export { ProductState };
|
|
500
|
+
// Also valid: export { ProductState as MyState };
|
|
501
|
+
|
|
287
502
|
function ProductHeader() {
|
|
288
503
|
const state = useLocationState(ProductState);
|
|
289
504
|
// { name: string; price: number } | undefined
|
|
290
505
|
|
|
291
506
|
if (state) {
|
|
292
|
-
return
|
|
507
|
+
return (
|
|
508
|
+
<h1>
|
|
509
|
+
{state.name} - ${state.price}
|
|
510
|
+
</h1>
|
|
511
|
+
);
|
|
293
512
|
}
|
|
294
513
|
return <h1>Loading...</h1>;
|
|
295
514
|
}
|
|
@@ -301,14 +520,151 @@ Pass state through Link:
|
|
|
301
520
|
import { Link } from "@rangojs/router/client";
|
|
302
521
|
import { ProductState } from "./state";
|
|
303
522
|
|
|
523
|
+
<Link to="/product/123" state={[ProductState({ name: "Widget", price: 99 })]}>
|
|
524
|
+
View Product
|
|
525
|
+
</Link>;
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
Pass typed state just in time (getter evaluated at click time, not render time):
|
|
529
|
+
|
|
530
|
+
```tsx
|
|
531
|
+
"use client"; // JIT state requires a client component (getter can't cross RSC boundary)
|
|
532
|
+
|
|
533
|
+
import { Link } from "@rangojs/router/client";
|
|
534
|
+
import { ProductState } from "./state";
|
|
535
|
+
|
|
536
|
+
// The getter is stored lazily and only called when the user clicks the link.
|
|
537
|
+
// This is useful for capturing values that change after render (e.g., scroll
|
|
538
|
+
// position, form state, ref values).
|
|
304
539
|
<Link
|
|
305
540
|
to="/product/123"
|
|
306
|
-
state={[ProductState({ name:
|
|
541
|
+
state={[ProductState(() => ({ name: product.name, price: product.price }))]}
|
|
307
542
|
>
|
|
308
543
|
View Product
|
|
544
|
+
</Link>;
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
Plain state can also be evaluated just in time (also requires a client component):
|
|
548
|
+
|
|
549
|
+
```tsx
|
|
550
|
+
<Link to="/product/123" state={() => ({ from: window.location.pathname })}>
|
|
551
|
+
View Product
|
|
309
552
|
</Link>
|
|
310
553
|
```
|
|
311
554
|
|
|
555
|
+
### Flash State (read-once)
|
|
556
|
+
|
|
557
|
+
Create a location state with `{ flash: true }` for read-once state that
|
|
558
|
+
auto-clears after first render. Ideal for flash messages (success/error
|
|
559
|
+
notifications after redirect):
|
|
560
|
+
|
|
561
|
+
```tsx
|
|
562
|
+
// location-states.ts
|
|
563
|
+
import { createLocationState } from "@rangojs/router";
|
|
564
|
+
|
|
565
|
+
export const FlashMessage = createLocationState<{ text: string }>({
|
|
566
|
+
flash: true,
|
|
567
|
+
});
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
Read flash state with `useLocationState` (same hook as persistent state):
|
|
571
|
+
|
|
572
|
+
```tsx
|
|
573
|
+
"use client";
|
|
574
|
+
import { useLocationState } from "@rangojs/router/client";
|
|
575
|
+
import { FlashMessage } from "../location-states";
|
|
576
|
+
|
|
577
|
+
function FlashBanner() {
|
|
578
|
+
const flash = useLocationState(FlashMessage);
|
|
579
|
+
// { text: string } | undefined
|
|
580
|
+
|
|
581
|
+
if (!flash) return null;
|
|
582
|
+
return <div className="flash">{flash.text}</div>;
|
|
583
|
+
}
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
Flash behavior is determined by the definition (`{ flash: true }`), not by which
|
|
587
|
+
hook reads it. `useLocationState` reads the value synchronously during render,
|
|
588
|
+
then clears it from `history.state` via `replaceState` in a `useEffect`.
|
|
589
|
+
Multiple components reading the same flash definition all see the value.
|
|
590
|
+
Pressing back/forward will not re-show the flash since it was cleared.
|
|
591
|
+
|
|
592
|
+
Set flash state from the server via `redirect()` with state:
|
|
593
|
+
|
|
594
|
+
```tsx
|
|
595
|
+
// In a route handler
|
|
596
|
+
import { redirect, createLocationState } from "@rangojs/router";
|
|
597
|
+
|
|
598
|
+
export const FlashMessage = createLocationState<{ text: string }>({
|
|
599
|
+
flash: true,
|
|
600
|
+
});
|
|
601
|
+
|
|
602
|
+
// Handler
|
|
603
|
+
(ctx) => {
|
|
604
|
+
return redirect("/dashboard", {
|
|
605
|
+
state: [FlashMessage({ text: "Item saved!" })],
|
|
606
|
+
});
|
|
607
|
+
};
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
Or via `ctx.setLocationState()` on any response:
|
|
611
|
+
|
|
612
|
+
```tsx
|
|
613
|
+
(ctx) => {
|
|
614
|
+
ctx.setLocationState(FlashMessage({ text: "Welcome back!" }));
|
|
615
|
+
return <Dashboard />;
|
|
616
|
+
};
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
### .read() (non-hook access)
|
|
620
|
+
|
|
621
|
+
Read current location state outside React components (client-side only):
|
|
622
|
+
|
|
623
|
+
```tsx
|
|
624
|
+
import { FlashMessage, ProductState } from "../location-states";
|
|
625
|
+
|
|
626
|
+
// Returns TState | undefined. Returns undefined during SSR.
|
|
627
|
+
const flash = FlashMessage.read();
|
|
628
|
+
const product = ProductState.read();
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
> **Hydration:** `.read()` returns `undefined` on the server but may return
|
|
632
|
+
> a real value on the first client render (history state survives reload).
|
|
633
|
+
> Do not call `.read()` directly during the initial render of a component;
|
|
634
|
+
> call it from an event handler or inside a `useEffect` post-mount. For
|
|
635
|
+
> reactive hydration-safe access, use `useLocationState()` instead.
|
|
636
|
+
|
|
637
|
+
### .write() / .delete() (static, non-reactive)
|
|
638
|
+
|
|
639
|
+
Static counterparts to `.read()`. Both mutate the current history entry's
|
|
640
|
+
`history.state` via `replaceState`, preserving any other keys (router
|
|
641
|
+
bookkeeping, other location state slots). Both are client-only; they throw
|
|
642
|
+
when called on the server.
|
|
643
|
+
|
|
644
|
+
Neither dispatches an event, so components reading via `useLocationState`
|
|
645
|
+
will NOT re-render until the next navigation/popstate. Pair with `.read()`
|
|
646
|
+
(or a fresh mount via back/forward/reload) instead.
|
|
647
|
+
|
|
648
|
+
```tsx
|
|
649
|
+
"use client";
|
|
650
|
+
import { ProductState } from "./state";
|
|
651
|
+
|
|
652
|
+
// Persisted across hard refresh and back/forward of this entry.
|
|
653
|
+
ProductState.write({ name: "Widget", price: 9.99 });
|
|
654
|
+
|
|
655
|
+
// Read later (or on next mount).
|
|
656
|
+
const current = ProductState.read();
|
|
657
|
+
|
|
658
|
+
// Manually clear the slot. Idempotent if it isn't set.
|
|
659
|
+
ProductState.delete();
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
| Method | Updates `history.state` | Fires `useLocationState` rerender | SSR behavior |
|
|
663
|
+
| ----------- | ----------------------- | --------------------------------- | ------------------- |
|
|
664
|
+
| `.read()` | no | n/a (returns snapshot) | returns `undefined` |
|
|
665
|
+
| `.write()` | yes (replace this slot) | no | throws |
|
|
666
|
+
| `.delete()` | yes (remove this slot) | no | throws |
|
|
667
|
+
|
|
312
668
|
## Cache Hooks
|
|
313
669
|
|
|
314
670
|
### useClientCache()
|
|
@@ -317,15 +673,15 @@ Manually control client-side navigation cache:
|
|
|
317
673
|
|
|
318
674
|
```tsx
|
|
319
675
|
"use client";
|
|
320
|
-
import { useClientCache } from "@rangojs/router";
|
|
676
|
+
import { useClientCache } from "@rangojs/router/client";
|
|
321
677
|
|
|
322
678
|
function SaveButton() {
|
|
323
679
|
const { clear } = useClientCache();
|
|
324
680
|
|
|
325
681
|
const handleSave = async () => {
|
|
326
|
-
await fetch(
|
|
327
|
-
method:
|
|
328
|
-
body: JSON.stringify(data)
|
|
682
|
+
await fetch("/api/data", {
|
|
683
|
+
method: "POST",
|
|
684
|
+
body: JSON.stringify(data),
|
|
329
685
|
});
|
|
330
686
|
|
|
331
687
|
// Invalidate cache after mutation
|
|
@@ -345,7 +701,7 @@ function SaveButton() {
|
|
|
345
701
|
Render child content in layouts:
|
|
346
702
|
|
|
347
703
|
```tsx
|
|
348
|
-
import { Outlet, ParallelOutlet } from "@rangojs/router";
|
|
704
|
+
import { Outlet, ParallelOutlet } from "@rangojs/router/client";
|
|
349
705
|
|
|
350
706
|
function DashboardLayout({ children }: { children?: React.ReactNode }) {
|
|
351
707
|
return (
|
|
@@ -353,9 +709,7 @@ function DashboardLayout({ children }: { children?: React.ReactNode }) {
|
|
|
353
709
|
<aside>
|
|
354
710
|
<ParallelOutlet name="@sidebar" />
|
|
355
711
|
</aside>
|
|
356
|
-
<main>
|
|
357
|
-
{children ?? <Outlet />}
|
|
358
|
-
</main>
|
|
712
|
+
<main>{children ?? <Outlet />}</main>
|
|
359
713
|
<ParallelOutlet name="@notifications" />
|
|
360
714
|
</div>
|
|
361
715
|
);
|
|
@@ -368,7 +722,7 @@ Access outlet content programmatically:
|
|
|
368
722
|
|
|
369
723
|
```tsx
|
|
370
724
|
"use client";
|
|
371
|
-
import { useOutlet } from "@rangojs/router";
|
|
725
|
+
import { useOutlet } from "@rangojs/router/client";
|
|
372
726
|
|
|
373
727
|
function ConditionalLayout() {
|
|
374
728
|
const outlet = useOutlet();
|
|
@@ -384,6 +738,78 @@ function ConditionalLayout() {
|
|
|
384
738
|
|
|
385
739
|
## URL Hooks
|
|
386
740
|
|
|
741
|
+
### useParams()
|
|
742
|
+
|
|
743
|
+
Access route params from the current URL:
|
|
744
|
+
|
|
745
|
+
```tsx
|
|
746
|
+
"use client";
|
|
747
|
+
import { useParams } from "@rangojs/router/client";
|
|
748
|
+
|
|
749
|
+
// Route: /product/:productId
|
|
750
|
+
function ProductPage() {
|
|
751
|
+
const params = useParams();
|
|
752
|
+
// { productId: "123" }
|
|
753
|
+
|
|
754
|
+
return <h1>Product {params.productId}</h1>;
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
// Annotate the expected shape via a generic
|
|
758
|
+
function ProductPageTyped() {
|
|
759
|
+
const { productId } = useParams<{ productId: string }>();
|
|
760
|
+
return <h1>Product {productId}</h1>;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
// With selector for performance (re-renders only when selected value changes)
|
|
764
|
+
function ProductId() {
|
|
765
|
+
const productId = useParams((p) => p.productId);
|
|
766
|
+
return <span>ID: {productId}</span>;
|
|
767
|
+
}
|
|
768
|
+
```
|
|
769
|
+
|
|
770
|
+
Returns merged params from all matched route segments as a `Readonly<T>` map. Updates on navigation commit (not during pending navigation).
|
|
771
|
+
|
|
772
|
+
### usePathname()
|
|
773
|
+
|
|
774
|
+
Access the current URL pathname:
|
|
775
|
+
|
|
776
|
+
```tsx
|
|
777
|
+
"use client";
|
|
778
|
+
import { usePathname } from "@rangojs/router/client";
|
|
779
|
+
|
|
780
|
+
function CurrentPage() {
|
|
781
|
+
const pathname = usePathname();
|
|
782
|
+
// "/product/123" (no search params)
|
|
783
|
+
|
|
784
|
+
return <span>Current path: {pathname}</span>;
|
|
785
|
+
}
|
|
786
|
+
```
|
|
787
|
+
|
|
788
|
+
Returns the pathname string without search params or hash. Updates on navigation commit.
|
|
789
|
+
|
|
790
|
+
### useSearchParams()
|
|
791
|
+
|
|
792
|
+
Access the current URL search params:
|
|
793
|
+
|
|
794
|
+
```tsx
|
|
795
|
+
"use client";
|
|
796
|
+
import { useSearchParams } from "@rangojs/router/client";
|
|
797
|
+
|
|
798
|
+
function SearchResults() {
|
|
799
|
+
const searchParams = useSearchParams();
|
|
800
|
+
const query = searchParams.get("q"); // "react"
|
|
801
|
+
const page = searchParams.get("page"); // "2"
|
|
802
|
+
|
|
803
|
+
return (
|
|
804
|
+
<div>
|
|
805
|
+
Searching for: {query}, page {page}
|
|
806
|
+
</div>
|
|
807
|
+
);
|
|
808
|
+
}
|
|
809
|
+
```
|
|
810
|
+
|
|
811
|
+
Returns a `ReadonlyURLSearchParams` (URLSearchParams without mutation methods). During SSR, returns empty params and syncs from the browser URL on mount.
|
|
812
|
+
|
|
387
813
|
### useHref()
|
|
388
814
|
|
|
389
815
|
Mount-aware href for client components inside `include()` scopes:
|
|
@@ -422,21 +848,48 @@ function MountInfo() {
|
|
|
422
848
|
}
|
|
423
849
|
```
|
|
424
850
|
|
|
425
|
-
|
|
851
|
+
### useReverse(routes)
|
|
852
|
+
|
|
853
|
+
Mount-aware local reverse for client components. Import the generated `routes` map from a `urls()` module's `.gen.ts` and call `reverse(".name", params?)`. Auto-fills params from `useParams()`; explicit params override.
|
|
854
|
+
|
|
855
|
+
> Per-module `*.gen.ts` files are **CLI opt-in and not Vite-watched** — run `rango generate <urls-file>` (or wire it into `predev`) and re-run it whenever the module's routes change. See `/links` for the full generated-file setup and exposure-boundary rules.
|
|
856
|
+
|
|
857
|
+
```tsx
|
|
858
|
+
"use client";
|
|
859
|
+
import { Link, useReverse } from "@rangojs/router/client";
|
|
860
|
+
import { routes as blogRoutes } from "../urls/blog.gen.js";
|
|
861
|
+
|
|
862
|
+
function BlogNav() {
|
|
863
|
+
const reverse = useReverse(blogRoutes);
|
|
864
|
+
return (
|
|
865
|
+
<nav>
|
|
866
|
+
<Link to={reverse(".index")}>Blog</Link>
|
|
867
|
+
<Link to={reverse(".post", { postId: "hello" })}>Post</Link>
|
|
868
|
+
</nav>
|
|
869
|
+
);
|
|
870
|
+
}
|
|
871
|
+
```
|
|
872
|
+
|
|
873
|
+
See `/links` for the full URL generation guide. `ctx.reverse()` is server-only; on the client, prefer `useReverse(routes)` for in-module names and pass URLs as props for cross-module ones.
|
|
426
874
|
|
|
427
875
|
## Hook Summary
|
|
428
876
|
|
|
429
|
-
| Hook
|
|
430
|
-
|
|
431
|
-
| `
|
|
432
|
-
| `
|
|
433
|
-
| `
|
|
434
|
-
| `
|
|
435
|
-
| `
|
|
436
|
-
| `
|
|
437
|
-
| `
|
|
438
|
-
| `
|
|
439
|
-
| `
|
|
440
|
-
| `
|
|
441
|
-
| `
|
|
442
|
-
| `
|
|
877
|
+
| Hook | Purpose | Returns |
|
|
878
|
+
| --------------------- | --------------------------------- | ------------------------------------------------------------------ |
|
|
879
|
+
| `useParams()` | Route params | `Readonly<T>` (default `Record<string, string>`) or selected value |
|
|
880
|
+
| `usePathname()` | Current pathname | `string` |
|
|
881
|
+
| `useSearchParams()` | URL search params | `ReadonlyURLSearchParams` |
|
|
882
|
+
| `useHref()` | Mount-aware href | `(path) => string` |
|
|
883
|
+
| `useMount()` | Current include() mount path | `string` |
|
|
884
|
+
| `useReverse()` | Local reverse for imported routes | `(name, params?, search?) => string` |
|
|
885
|
+
| `useNavigation()` | Reactive navigation state | state, location, isStreaming |
|
|
886
|
+
| `useRouter()` | Stable router actions | push, replace, refresh, prefetch, back, forward |
|
|
887
|
+
| `useSegments()` | URL path & segment IDs | path, segmentIds, location |
|
|
888
|
+
| `useLinkStatus()` | Link pending state | { pending } |
|
|
889
|
+
| `useLoader()` | Loader data (strict) | data, isLoading, error |
|
|
890
|
+
| `useFetchLoader()` | Loader with on-demand fetch | data, load, isLoading |
|
|
891
|
+
| `useRefreshLoaders()` | Refresh a cross-loader group | `(group) => () => Promise<void>` |
|
|
892
|
+
| `useHandle()` | Accumulated handle data | T (handle type) |
|
|
893
|
+
| `useAction()` | Server action state | state, error, result |
|
|
894
|
+
| `useLocationState()` | History state (persists or flash) | T \| undefined |
|
|
895
|
+
| `useClientCache()` | Cache control | { clear } |
|