@rangojs/router 0.0.0-experimental.2 → 0.0.0-experimental.204030a9
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/{src/__mocks__/version.ts → dist/__mocks__/version.js} +1 -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 +1779 -0
- 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 +6440 -809
- 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} +18 -17
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +140 -57
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +484 -0
- package/skills/caching/SKILL.md +276 -226
- package/skills/composability/SKILL.md +197 -0
- package/skills/debug-manifest/SKILL.md +112 -0
- package/skills/document-cache/SKILL.md +106 -53
- package/skills/fonts/SKILL.md +167 -0
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +621 -67
- package/skills/host-router/SKILL.md +243 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +265 -202
- package/skills/layout/SKILL.md +261 -146
- package/skills/links/SKILL.md +471 -0
- package/skills/loader/SKILL.md +701 -250
- package/skills/middleware/SKILL.md +254 -320
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +155 -0
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +399 -158
- package/skills/prerender/SKILL.md +666 -0
- package/skills/rango/SKILL.md +338 -0
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +468 -0
- package/skills/route/SKILL.md +417 -89
- package/skills/router-setup/SKILL.md +389 -268
- package/skills/server-actions/SKILL.md +751 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/testing/SKILL.md +549 -0
- package/skills/theme/SKILL.md +36 -11
- package/skills/typesafety/SKILL.md +747 -174
- package/skills/use-cache/SKILL.md +353 -0
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +117 -0
- package/src/__internal.ts +273 -0
- package/src/bin/rango.ts +321 -0
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +172 -128
- 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 +390 -557
- package/src/browser/navigation-client.ts +228 -70
- package/src/browser/navigation-store.ts +104 -63
- package/src/browser/navigation-transaction.ts +279 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +397 -303
- 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 +258 -74
- package/src/browser/react/NavigationProvider.tsx +237 -49
- 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 +269 -56
- package/src/browser/react/location-state.ts +90 -19
- package/src/browser/react/mount-context.ts +37 -0
- 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 -98
- package/src/browser/react/use-href.tsx +20 -188
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-mount.ts +31 -0
- package/src/browser/react/use-navigation.ts +49 -80
- package/src/browser/react/use-params.ts +77 -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 +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 +98 -0
- package/src/browser/rsc-router.tsx +273 -78
- package/src/browser/scroll-restoration.ts +132 -49
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +83 -0
- package/src/browser/server-action-bridge.ts +504 -589
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +184 -58
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +463 -0
- package/src/build/generate-route-types.ts +41 -0
- package/src/build/index.ts +37 -0
- package/src/build/route-trie.ts +292 -0
- 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 +131 -0
- package/src/build/route-types/router-processing.ts +659 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +220 -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 +150 -306
- package/src/cache/cf/cf-cache-store.ts +619 -24
- 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 +76 -121
- package/src/client.rsc.tsx +15 -15
- package/src/client.tsx +145 -309
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +6 -2
- package/src/context-var.ts +156 -0
- package/src/debug.ts +243 -0
- package/src/decode-loader-results.ts +36 -0
- package/src/errors.ts +138 -3
- package/src/handle.ts +90 -22
- package/src/handles/MetaTags.tsx +76 -23
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +32 -15
- package/src/host/cookie-handler.ts +165 -0
- package/src/host/errors.ts +97 -0
- package/src/host/index.ts +53 -0
- package/src/host/pattern-matcher.ts +214 -0
- package/src/host/router.ts +424 -0
- package/src/host/testing.ts +79 -0
- package/src/host/types.ts +175 -0
- package/src/host/utils.ts +25 -0
- package/src/href-client.ts +263 -49
- package/src/index.rsc.ts +190 -29
- package/src/index.ts +278 -38
- package/src/internal-debug.ts +11 -0
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +24 -142
- package/src/loader.ts +21 -11
- package/src/missing-id-error.ts +68 -0
- 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 +37 -0
- package/src/prerender/store.ts +186 -0
- package/src/prerender.ts +524 -0
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +380 -0
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +15 -39
- package/src/route-definition/dsl-helpers.ts +1109 -0
- package/src/route-definition/helper-factories.ts +90 -0
- package/src/route-definition/helpers-types.ts +506 -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/use-item-types.ts +32 -0
- package/src/route-definition.ts +1 -1371
- package/src/route-map-builder.ts +247 -112
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +99 -42
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +228 -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 +420 -88
- package/src/router/intercept-resolution.ts +388 -0
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +374 -128
- package/src/router/logging.ts +251 -0
- package/src/router/manifest.ts +187 -43
- package/src/router/match-api.ts +556 -0
- package/src/router/match-context.ts +6 -4
- package/src/router/match-handlers.ts +483 -0
- package/src/router/match-middleware/background-revalidation.ts +108 -93
- package/src/router/match-middleware/cache-lookup.ts +413 -10
- package/src/router/match-middleware/cache-store.ts +99 -26
- package/src/router/match-middleware/intercept-resolution.ts +57 -17
- package/src/router/match-middleware/segment-resolution.ts +80 -6
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +156 -36
- 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 +359 -346
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +416 -41
- package/src/router/prerender-match.ts +502 -0
- package/src/router/preview-match.ts +100 -0
- package/src/router/request-classification.ts +286 -0
- package/src/router/revalidation.ts +195 -40
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +45 -23
- package/src/router/router-interfaces.ts +501 -0
- package/src/router/router-options.ts +657 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +769 -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 +1420 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/segment-resolution.ts +21 -0
- 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 +399 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +244 -0
- package/src/router/types.ts +87 -4
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +768 -3574
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +894 -806
- package/src/rsc/helpers.ts +201 -19
- package/src/rsc/index.ts +5 -25
- 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 +159 -0
- package/src/rsc/progressive-enhancement.ts +395 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +340 -0
- package/src/rsc/rsc-rendering.ts +230 -0
- package/src/rsc/runtime-warnings.ts +41 -0
- package/src/rsc/server-action.ts +336 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/types.ts +54 -14
- 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 +265 -115
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +480 -90
- package/src/server/cookie-store.ts +214 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +117 -20
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +613 -109
- package/src/server.ts +36 -131
- package/src/ssr/index.tsx +164 -25
- package/src/static-handler.ts +126 -0
- package/src/testing/cache-status.ts +166 -0
- package/src/testing/collect-handle.ts +63 -0
- package/src/testing/dispatch.ts +440 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +154 -0
- package/src/testing/e2e/index.ts +149 -0
- package/src/testing/e2e/matchers.ts +51 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +306 -0
- package/src/testing/e2e/server.ts +183 -0
- package/src/testing/flight-matchers.ts +104 -0
- package/src/testing/flight-runtime.d.ts +21 -0
- package/src/testing/flight.entry.ts +22 -0
- package/src/testing/flight.ts +182 -0
- package/src/testing/generated-routes.ts +223 -0
- package/src/testing/index.ts +98 -0
- package/src/testing/internal/context.ts +151 -0
- package/src/testing/render-route.tsx +536 -0
- package/src/testing/run-loader.ts +296 -0
- package/src/testing/run-middleware.ts +170 -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 +112 -0
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +11 -4
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +5 -31
- package/src/theme/theme-script.ts +21 -18
- package/src/theme/types.ts +1 -1
- 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 +809 -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 +184 -0
- package/src/types.ts +1 -1561
- package/src/urls/include-helper.ts +164 -0
- package/src/urls/index.ts +50 -0
- package/src/urls/path-helper-types.ts +380 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +124 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +282 -0
- package/src/urls/urls-function.ts +94 -0
- package/src/urls.ts +1 -726
- package/src/use-loader.tsx +559 -108
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +398 -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 +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/state.ts +150 -0
- package/src/vite/discovery/virtual-module-codegen.ts +193 -0
- package/src/vite/index.ts +20 -785
- package/src/vite/plugin-types.ts +170 -0
- package/src/vite/plugins/cjs-to-esm.ts +94 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +128 -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 +376 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +156 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +72 -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 +796 -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 +338 -0
- package/src/vite/plugins/version-injector.ts +99 -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 +549 -0
- package/src/vite/router-discovery.ts +1568 -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/client-chunks.ts +190 -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 +251 -0
- package/CLAUDE.md +0 -7
- package/src/__tests__/component-utils.test.ts +0 -76
- package/src/__tests__/route-definition.test.ts +0 -63
- package/src/__tests__/urls.test.tsx +0 -436
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/__tests__/document-cache.test.ts +0 -522
- package/src/cache/__tests__/memory-segment-store.test.ts +0 -487
- package/src/cache/__tests__/memory-store.test.ts +0 -484
- package/src/cache/cf/__tests__/cf-cache-store.test.ts +0 -428
- package/src/cache/memory-store.ts +0 -253
- package/src/href.ts +0 -177
- package/src/route-utils.ts +0 -89
- package/src/router/__tests__/match-context.test.ts +0 -104
- package/src/router/__tests__/match-pipelines.test.ts +0 -537
- package/src/router/__tests__/match-result.test.ts +0 -566
- package/src/router/__tests__/on-error.test.ts +0 -935
- package/src/router/__tests__/pattern-matching.test.ts +0 -577
- package/src/router/middleware.test.ts +0 -1355
- package/src/rsc/__tests__/helpers.test.ts +0 -175
- package/src/server/__tests__/request-context.test.ts +0 -171
- package/src/ssr/__tests__/ssr-handler.test.tsx +0 -188
- package/src/theme/__tests__/theme.test.ts +0 -120
- package/src/vite/__tests__/expose-loader-id.test.ts +0 -117
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -357
- package/src/vite/expose-location-state-id.ts +0 -177
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -1,175 +1,375 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: typesafety
|
|
3
|
-
description: Set up type-safe routes, params, and environment types in
|
|
3
|
+
description: Set up type-safe routes, params, and environment types in @rangojs/router
|
|
4
4
|
argument-hint: [setup]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Type Safety Setup
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
@rangojs/router provides end-to-end type safety for routes, parameters, and environment.
|
|
10
10
|
|
|
11
|
-
##
|
|
12
|
-
|
|
13
|
-
Register route types globally for type-safe `href()` and params:
|
|
11
|
+
## Router Setup
|
|
14
12
|
|
|
15
13
|
```typescript
|
|
16
14
|
// router.tsx
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
|
|
15
|
+
import { createRouter } from "@rangojs/router";
|
|
16
|
+
import { urlpatterns } from "./urls";
|
|
17
|
+
|
|
18
|
+
const router = createRouter<AppBindings>({
|
|
19
|
+
document: Document,
|
|
20
|
+
}).routes(urlpatterns);
|
|
21
|
+
|
|
22
|
+
// Server-side named-route reverse (type-safe via routeMap)
|
|
23
|
+
export const reverse = router.reverse;
|
|
24
|
+
|
|
25
|
+
export default router;
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Which global type should I use?
|
|
29
|
+
|
|
30
|
+
Use the generated route map by default. Manual `RegisteredRoutes` augmentation
|
|
31
|
+
is only needed when you want the richer `typeof router.routeMap` shape
|
|
32
|
+
available globally.
|
|
20
33
|
|
|
21
|
-
|
|
22
|
-
.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
34
|
+
- `GeneratedRouteMap` — auto-registered by `router.named-routes.gen.ts`
|
|
35
|
+
Use for `Handler<"name">`, `Prerender<"name">`, server `ctx.reverse()`,
|
|
36
|
+
and named-route param/search inference.
|
|
37
|
+
- `typeof router.routeMap` — the real merged route map from your router
|
|
38
|
+
instance, including response-route metadata such as `{ path, response }`.
|
|
39
|
+
- `RegisteredRoutes` — manual global hook for exposing `typeof router.routeMap`
|
|
40
|
+
to global utilities that need the exact router-builder map, especially
|
|
41
|
+
`Rango.PathResponse`.
|
|
42
|
+
|
|
43
|
+
### Generated Route Type Surfaces
|
|
44
|
+
|
|
45
|
+
There are three distinct typing surfaces. They are **not** interchangeable —
|
|
46
|
+
pick the one that matches what you need to type:
|
|
47
|
+
|
|
48
|
+
| Surface | Source | Scope | Gives | Does not give |
|
|
49
|
+
| ------------------- | ---------------------------------------- | ------ | ---------------------------------------- | ------------------------------------------------------------------------------------------------ |
|
|
50
|
+
| `GeneratedRouteMap` | `router.named-routes.gen.ts` (auto) | global | route names, path params, search schemas | response/MIME payloads |
|
|
51
|
+
| `routes` | per-module `*.gen.ts` (`rango generate`) | local | local names, params, search | the global app map |
|
|
52
|
+
| `RegisteredRoutes` | manual `extends typeof router.routeMap` | global | paths, params, **response payloads** | the `Handler`/`Prerender` default (those read `GeneratedRouteMap` to avoid a `router.tsx` cycle) |
|
|
53
|
+
|
|
54
|
+
Key consequence: `href()` and the ambient `Rango.Path` type are typed from
|
|
55
|
+
whichever map is present — they prefer `RegisteredRoutes` when you wire it, otherwise fall back to
|
|
56
|
+
the auto-generated `GeneratedRouteMap`, so **`rango generate` alone gives you
|
|
57
|
+
path-checked `href()`** with no manual augmentation. Response and MIME payload
|
|
58
|
+
inference is the exception: it comes only from `typeof router.routeMap` (via
|
|
59
|
+
`RegisteredRoutes`), because `GeneratedRouteMap` carries paths + search but no
|
|
60
|
+
payloads — so `Rango.PathResponse` resolves to `ResponseEnvelope<never>` until you wire
|
|
61
|
+
`RegisteredRoutes`.
|
|
62
|
+
|
|
63
|
+
Recommended setup:
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
// router.tsx
|
|
67
|
+
import { createRouter } from "@rangojs/router";
|
|
68
|
+
import { urlpatterns } from "./urls";
|
|
69
|
+
import type { AppBindings, AppVars } from "./env";
|
|
26
70
|
|
|
27
|
-
|
|
28
|
-
type AppRoutes = typeof _router.routeMap;
|
|
71
|
+
export const router = createRouter<AppBindings>({}).routes(urlpatterns);
|
|
29
72
|
|
|
30
|
-
// Register globally via module augmentation
|
|
31
73
|
declare global {
|
|
32
|
-
namespace
|
|
33
|
-
interface
|
|
74
|
+
namespace Rango {
|
|
75
|
+
interface Env extends AppBindings {}
|
|
76
|
+
interface Vars extends AppVars {}
|
|
77
|
+
interface RegisteredRoutes extends typeof router.routeMap {}
|
|
34
78
|
}
|
|
35
79
|
}
|
|
80
|
+
```
|
|
36
81
|
|
|
37
|
-
|
|
38
|
-
|
|
82
|
+
### Single-App Setup Checklist
|
|
83
|
+
|
|
84
|
+
For one app, keep the ambient types, generated named-routes file, and router
|
|
85
|
+
instance in the same TypeScript program:
|
|
86
|
+
|
|
87
|
+
```jsonc
|
|
88
|
+
// tsconfig.json
|
|
89
|
+
{
|
|
90
|
+
"compilerOptions": {
|
|
91
|
+
"strict": true,
|
|
92
|
+
"moduleResolution": "bundler",
|
|
93
|
+
"jsx": "react-jsx",
|
|
94
|
+
"noEmit": true,
|
|
95
|
+
},
|
|
96
|
+
"include": ["src"],
|
|
97
|
+
"files": ["src/router.tsx"],
|
|
98
|
+
}
|
|
39
99
|
```
|
|
40
100
|
|
|
41
|
-
|
|
101
|
+
Then generate the route types from the router file:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
npx rango generate src/router.tsx
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
This creates `src/router.named-routes.gen.ts`, which augments
|
|
108
|
+
`Rango.GeneratedRouteMap`. Keep that generated file committed with the router
|
|
109
|
+
source. The `files` entry keeps `router.tsx` in the program even when nothing
|
|
110
|
+
imports it directly, so `Rango.Env`, `Rango.Vars`, and optional
|
|
111
|
+
`Rango.RegisteredRoutes` augmentation are visible to handlers, loaders, actions,
|
|
112
|
+
and client helpers.
|
|
113
|
+
|
|
114
|
+
### Named Routes, `$$routeNames`, And `router.routeMap`
|
|
115
|
+
|
|
116
|
+
There are two runtime/type surfaces with similar names:
|
|
117
|
+
|
|
118
|
+
- `router.named-routes.gen.ts` exports `NamedRoutes` and augments
|
|
119
|
+
`Rango.GeneratedRouteMap`. The Vite plugin imports that file internally and
|
|
120
|
+
injects it as `$$routeNames` so `router.reverse` has the static route-name map.
|
|
121
|
+
App code should not pass or import `$$routeNames` directly.
|
|
122
|
+
- `router.routeMap` is the public router instance property for type extraction.
|
|
123
|
+
Use `typeof router.routeMap` when augmenting `Rango.RegisteredRoutes` for
|
|
124
|
+
global response payload helpers such as `Rango.PathResponse`.
|
|
125
|
+
|
|
126
|
+
Do not document or use a public `router.routeNames` API unless one is
|
|
127
|
+
intentionally added. Today, the public extraction surface is `router.routeMap`;
|
|
128
|
+
the generated file and `$$routeNames` are build machinery.
|
|
129
|
+
|
|
130
|
+
## Route Definition with Type-Safe Names
|
|
42
131
|
|
|
43
132
|
```typescript
|
|
44
|
-
//
|
|
45
|
-
import {
|
|
46
|
-
|
|
47
|
-
export const
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
|
|
133
|
+
// urls.tsx
|
|
134
|
+
import { urls } from "@rangojs/router";
|
|
135
|
+
|
|
136
|
+
export const urlpatterns = urls(({ path, layout }) => [
|
|
137
|
+
path("/", HomePage, { name: "home" }),
|
|
138
|
+
path("/products", ProductsPage, { name: "products" }),
|
|
139
|
+
path("/product/:slug", ProductPage, { name: "product" }),
|
|
140
|
+
path("/cart", CartPage, { name: "cart" }),
|
|
141
|
+
path("/checkout/:step?", CheckoutPage, { name: "checkout" }),
|
|
142
|
+
]);
|
|
54
143
|
|
|
55
|
-
//
|
|
56
|
-
// {
|
|
57
|
-
// "shop.index": "/",
|
|
58
|
-
// "shop.products": "/products",
|
|
59
|
-
// "shop.product": "/products/:slug",
|
|
60
|
-
// ...
|
|
61
|
-
// }
|
|
144
|
+
// Route names are inferred from the { name } option
|
|
62
145
|
```
|
|
63
146
|
|
|
64
147
|
## Type-Safe href()
|
|
65
148
|
|
|
66
|
-
|
|
149
|
+
### Server: ctx.reverse with route names
|
|
150
|
+
|
|
151
|
+
In route handlers, `ctx.reverse()` uses two namespaces:
|
|
152
|
+
|
|
153
|
+
- **`.name`** — local route, resolved within the current `include()` scope
|
|
154
|
+
- **`name`** — global route, from the named-routes definition
|
|
67
155
|
|
|
68
156
|
```typescript
|
|
69
|
-
import {
|
|
157
|
+
import type { Handler } from "@rangojs/router";
|
|
158
|
+
|
|
159
|
+
export const ProductHandler: Handler<"shop.product"> = (ctx) => {
|
|
160
|
+
ctx.reverse(".cart"); // Local: /shop/cart
|
|
161
|
+
ctx.reverse(".product", { slug: "widget" }); // Local: /shop/product/widget
|
|
162
|
+
ctx.reverse("blog.post", { slug: "1" }); // Global: /blog/1
|
|
163
|
+
};
|
|
164
|
+
```
|
|
70
165
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
href("shop.products"); // "/shop/products"
|
|
74
|
-
href("shop.product", { slug: "widget" }); // "/shop/products/widget"
|
|
166
|
+
For type-safe local names, generate a route types file with `npx rango generate urls/shop.tsx`
|
|
167
|
+
and pass it as the second generic to `Handler` or `Prerender`:
|
|
75
168
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
169
|
+
```typescript
|
|
170
|
+
import type { Handler } from "@rangojs/router";
|
|
171
|
+
import type { routes } from "./shop.gen.js";
|
|
172
|
+
|
|
173
|
+
export const ProductHandler: Handler<"shop.product", routes> = (ctx) => {
|
|
174
|
+
ctx.reverse(".cart"); // Type-safe local name
|
|
175
|
+
ctx.reverse(".product", { slug: "widget" }); // Type-safe local with params
|
|
176
|
+
ctx.reverse("blog.post", { slug: "hi" }); // Type-safe global name
|
|
177
|
+
};
|
|
80
178
|
```
|
|
81
179
|
|
|
82
|
-
|
|
180
|
+
### Client: href + useHref
|
|
83
181
|
|
|
84
|
-
|
|
182
|
+
On the client, `href()` validates paths against registered route patterns at compile time:
|
|
85
183
|
|
|
86
184
|
```typescript
|
|
87
|
-
|
|
88
|
-
import {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
route("shop.checkout", (ctx) => {
|
|
100
|
-
const step = ctx.params.step ?? "shipping"; // Optional param
|
|
101
|
-
return <CheckoutPage step={step} />;
|
|
102
|
-
}),
|
|
103
|
-
]);
|
|
185
|
+
"use client";
|
|
186
|
+
import { href, useHref, Link } from "@rangojs/router/client";
|
|
187
|
+
|
|
188
|
+
// href() validates absolute paths via PatternToPath types
|
|
189
|
+
href("/about"); // Valid path
|
|
190
|
+
href("/blog/hello"); // Matches /blog/:slug
|
|
191
|
+
|
|
192
|
+
// useHref() auto-prefixes with include() mount
|
|
193
|
+
function ShopNav() {
|
|
194
|
+
const href = useHref();
|
|
195
|
+
return <Link to={href("/cart")}>Cart</Link>; // "/shop/cart"
|
|
196
|
+
}
|
|
104
197
|
```
|
|
105
198
|
|
|
199
|
+
`href()` and the `Rango.Path` type read from `RegisteredRoutes` when you augment
|
|
200
|
+
it, otherwise from the auto-generated `GeneratedRouteMap` — so `rango generate`
|
|
201
|
+
alone type-checks `href()` paths with no manual augmentation. The augmentation
|
|
202
|
+
below is only needed for **`Rango.PathResponse`** (response-payload inference), which
|
|
203
|
+
`GeneratedRouteMap` cannot provide:
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
declare global {
|
|
207
|
+
namespace Rango {
|
|
208
|
+
interface RegisteredRoutes extends typeof router.routeMap {}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
For wrapper helpers, type the path parameter as `Rango.Path`. It is ambient (no
|
|
214
|
+
import) and shares `href()`'s compile-time path checking, so a wrapper stays in
|
|
215
|
+
sync with your routes automatically:
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
import { href } from "@rangojs/router/client";
|
|
219
|
+
|
|
220
|
+
export const appHref = (path: Rango.Path): string => href(path);
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
For response-route payloads, `Rango.PathResponse<T>` is the ambient lookup. It
|
|
224
|
+
accepts a route _pattern_ **or** a concrete path, so it also serves as the return
|
|
225
|
+
type of a typed `fetch` wrapper. It only resolves once `RegisteredRoutes` carries
|
|
226
|
+
response metadata:
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
import { href } from "@rangojs/router/client";
|
|
230
|
+
|
|
231
|
+
type Product = Rango.PathResponse<"/api/products/:id">; // by pattern
|
|
232
|
+
type Same = Rango.PathResponse<"/api/products/42">; // by concrete path
|
|
233
|
+
|
|
234
|
+
// Response inferred from the concrete path passed in:
|
|
235
|
+
async function get<T extends Rango.Path>(
|
|
236
|
+
path: T,
|
|
237
|
+
): Promise<Rango.PathResponse<T>> {
|
|
238
|
+
return fetch(href(path)).then((r) => r.json());
|
|
239
|
+
}
|
|
240
|
+
const product = await get("/api/products/42"); // ResponseEnvelope<Product>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Pattern keys (`/:id`) match exactly; a concrete path under a _nested_ dynamic
|
|
244
|
+
route can match several patterns and union their responses.
|
|
245
|
+
|
|
246
|
+
`Rango.PathResponse` describes the JSON **wire** shape, not the handler's raw
|
|
247
|
+
return. A `path.json()` handler returning `{ createdAt: Date }` resolves here to
|
|
248
|
+
`ResponseEnvelope<{ createdAt: string }>`, matching what `r.json()` yields. This
|
|
249
|
+
is applied via the ambient `Rango.JsonSerialize<T>` transform (`Date -> string`,
|
|
250
|
+
honors `toJSON()`, drops functions/`undefined`, `bigint -> never`). A separate
|
|
251
|
+
`Rango.FlightSerialize<T>` models the higher-fidelity RSC Flight boundary
|
|
252
|
+
(loaders / RSC props, where `Date` is preserved) — do **not** use it for
|
|
253
|
+
`path.json()`.
|
|
254
|
+
|
|
255
|
+
### Overriding serialization globally
|
|
256
|
+
|
|
257
|
+
For your own types, the zero-config way to control the JSON wire shape is a
|
|
258
|
+
`toJSON()` method — `Rango.JsonSerialize` honors it, and it matches the runtime
|
|
259
|
+
exactly (`JSON.stringify` calls `toJSON()`):
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
class Money {
|
|
263
|
+
constructor(private cents: number) {}
|
|
264
|
+
toJSON(): number {
|
|
265
|
+
return this.cents;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// Rango.JsonSerialize<Money> is number; Rango.PathResponse reflects it.
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
To override a transform for types you **don't** own (or for the Flight boundary,
|
|
272
|
+
which has no `toJSON()`), augment its override slot. Because `Rango.JsonSerialize`
|
|
273
|
+
/ `Rango.FlightSerialize` are type _aliases_ (TS can't merge those), you provide a
|
|
274
|
+
single member that is your **complete** transform, delegating to the built-in for
|
|
275
|
+
the cases you don't change:
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
declare global {
|
|
279
|
+
namespace Rango {
|
|
280
|
+
interface JsonSerializeOverride<T> {
|
|
281
|
+
app: T extends Decimal ? string : Rango.JsonSerializeBuiltin<T>;
|
|
282
|
+
}
|
|
283
|
+
interface FlightSerializeOverride<T> {
|
|
284
|
+
app: T extends Money ? number : Rango.FlightSerializeBuiltin<T>;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// Rango.JsonSerialize<Decimal> -> string; Rango.FlightSerialize<Money> -> number;
|
|
289
|
+
// everything else stays on the built-in, recursively (nested fields too).
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Rules: provide **exactly one** member (the slot is read as
|
|
293
|
+
`Override<T>[keyof Override<T>]`, so multiple members union and conflict).
|
|
294
|
+
Overrides win over `toJSON()` and apply at every nesting level. Caveat for JSON:
|
|
295
|
+
the `path.json()` runtime is plain `JSON.stringify`, which only honors `toJSON()`,
|
|
296
|
+
so a `JsonSerializeOverride` that disagrees with what the runtime emits will lie —
|
|
297
|
+
prefer `toJSON()` for your own types and use the slot only for types you can't
|
|
298
|
+
modify.
|
|
299
|
+
|
|
300
|
+
See `/links` for full URL generation guide.
|
|
301
|
+
|
|
106
302
|
## Environment Type Setup
|
|
107
303
|
|
|
108
304
|
Define your app's environment for type-safe bindings and variables:
|
|
109
305
|
|
|
110
306
|
```typescript
|
|
111
307
|
// env.ts
|
|
112
|
-
import type { RouterEnv } from "rsc-router/server";
|
|
113
308
|
|
|
114
|
-
// Cloudflare bindings
|
|
115
|
-
interface AppBindings {
|
|
309
|
+
// Cloudflare bindings — passed as TEnv to createRouter<TEnv>()
|
|
310
|
+
export interface AppBindings {
|
|
116
311
|
DB: D1Database;
|
|
117
312
|
KV: KVNamespace;
|
|
118
313
|
CACHE: KVNamespace;
|
|
119
314
|
AI: Ai;
|
|
120
315
|
}
|
|
121
316
|
|
|
122
|
-
// Variables set by middleware
|
|
123
|
-
interface AppVariables {
|
|
317
|
+
// Variables set by middleware — declared via global namespace augmentation
|
|
318
|
+
export interface AppVariables {
|
|
124
319
|
user?: { id: string; email: string; role: string };
|
|
125
320
|
requestId?: string;
|
|
126
321
|
permissions?: string[];
|
|
127
322
|
}
|
|
128
|
-
|
|
129
|
-
// Combined environment type
|
|
130
|
-
export type AppEnv = RouterEnv<AppBindings, AppVariables>;
|
|
131
323
|
```
|
|
132
324
|
|
|
133
325
|
### Using Environment Types
|
|
134
326
|
|
|
135
327
|
```typescript
|
|
136
328
|
// router.tsx
|
|
137
|
-
import type {
|
|
329
|
+
import type { AppBindings, AppVariables } from "./env";
|
|
138
330
|
|
|
139
|
-
const router =
|
|
140
|
-
|
|
331
|
+
const router = createRouter<AppBindings>({
|
|
332
|
+
document: Document,
|
|
333
|
+
}).routes(urlpatterns);
|
|
334
|
+
|
|
335
|
+
// Register bindings and variables globally for implicit typing
|
|
336
|
+
declare global {
|
|
337
|
+
namespace Rango {
|
|
338
|
+
interface Env extends AppBindings {}
|
|
339
|
+
interface Vars extends AppVariables {}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
141
342
|
|
|
142
|
-
// middleware - typed ctx.set/ctx.get
|
|
143
|
-
|
|
144
|
-
|
|
343
|
+
// middleware - typed via ctx.set / ctx.get
|
|
344
|
+
import type { Middleware } from "@rangojs/router";
|
|
345
|
+
|
|
346
|
+
export const authMiddleware: Middleware = async (ctx, next) => {
|
|
347
|
+
ctx.set("user", {
|
|
348
|
+
id: "123",
|
|
349
|
+
email: "user@example.com",
|
|
350
|
+
role: "admin",
|
|
351
|
+
});
|
|
145
352
|
await next();
|
|
146
353
|
};
|
|
147
354
|
|
|
148
|
-
// handlers - typed access
|
|
149
|
-
route("dashboard", (ctx) => {
|
|
150
|
-
const user = ctx.get("user"); // { id: string; email: string; role: string } | undefined
|
|
151
|
-
const db = ctx.env.Bindings.DB; // D1Database
|
|
152
|
-
return <Dashboard user={user} />;
|
|
153
|
-
});
|
|
154
|
-
|
|
155
355
|
// loaders - typed context
|
|
156
|
-
export const UserLoader = createLoader
|
|
157
|
-
const db = ctx.env.
|
|
158
|
-
const userId = ctx.get("user")?.id;
|
|
356
|
+
export const UserLoader = createLoader(async (ctx) => {
|
|
357
|
+
const db = ctx.env.DB; // D1Database (plain bindings)
|
|
358
|
+
const userId = ctx.get("user")?.id; // from Rango.Vars
|
|
159
359
|
return db.prepare("SELECT * FROM users WHERE id = ?").bind(userId).first();
|
|
160
360
|
});
|
|
161
361
|
```
|
|
162
362
|
|
|
163
|
-
## Global
|
|
363
|
+
## Global Environment Registration
|
|
164
364
|
|
|
165
365
|
Register environment types globally for implicit typing:
|
|
166
366
|
|
|
167
367
|
```typescript
|
|
168
368
|
// router.tsx
|
|
169
369
|
declare global {
|
|
170
|
-
namespace
|
|
171
|
-
interface
|
|
172
|
-
interface
|
|
370
|
+
namespace Rango {
|
|
371
|
+
interface Env extends AppBindings {}
|
|
372
|
+
interface Vars extends AppVariables {}
|
|
173
373
|
}
|
|
174
374
|
}
|
|
175
375
|
```
|
|
@@ -177,52 +377,132 @@ declare global {
|
|
|
177
377
|
Now handlers have typed context without explicit imports:
|
|
178
378
|
|
|
179
379
|
```typescript
|
|
180
|
-
//
|
|
181
|
-
export
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
380
|
+
// In loaders
|
|
381
|
+
export const DashboardLoader = createLoader(async (ctx) => {
|
|
382
|
+
// ctx.env.DB is typed from global Rango.Env
|
|
383
|
+
// ctx.get("user") is typed from global Rango.Vars
|
|
384
|
+
const user = ctx.get("user");
|
|
385
|
+
return { user };
|
|
386
|
+
});
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
## Typed Search Params
|
|
390
|
+
|
|
391
|
+
Add a `search` schema to `path()` options for type-safe query parameters:
|
|
392
|
+
|
|
393
|
+
```typescript
|
|
394
|
+
// Route definition with search schema
|
|
395
|
+
path("/search", SearchPage, {
|
|
396
|
+
name: "search",
|
|
397
|
+
search: { q: "string", page: "number?", sort: "string?" },
|
|
398
|
+
});
|
|
189
399
|
```
|
|
190
400
|
|
|
191
|
-
|
|
401
|
+
### Handler with typed search params
|
|
192
402
|
|
|
193
|
-
|
|
403
|
+
`Handler<"name">` automatically resolves route params and search params from the
|
|
404
|
+
global `GeneratedRouteMap` (the gen file). No explicit route map import needed:
|
|
194
405
|
|
|
195
406
|
```typescript
|
|
196
|
-
//
|
|
197
|
-
|
|
198
|
-
.routes({ index: "/" })
|
|
199
|
-
.map(() => import("./home"))
|
|
200
|
-
.routes({ index: "/other" }) // Error! 'index' already exists with different pattern
|
|
201
|
-
.map(() => import("./other"));
|
|
407
|
+
// pages/search.tsx
|
|
408
|
+
import type { Handler } from "@rangojs/router";
|
|
202
409
|
|
|
203
|
-
|
|
204
|
-
//
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
410
|
+
export const SearchPage: Handler<"search"> = (ctx) => {
|
|
411
|
+
// ctx.search is typed: { q: string; page?: number; sort?: string }
|
|
412
|
+
const { q, page, sort } = ctx.search;
|
|
413
|
+
return <SearchResults q={q} page={page} sort={sort} />;
|
|
414
|
+
};
|
|
208
415
|
```
|
|
209
416
|
|
|
210
|
-
|
|
417
|
+
This avoids circular references because `Handler` defaults to `GeneratedRouteMap`
|
|
418
|
+
(from `router.named-routes.gen.ts`) instead of `RegisteredRoutes` (which depends on `router.tsx`).
|
|
211
419
|
|
|
212
|
-
|
|
420
|
+
You can also pass an explicit route map for per-module isolation (opt-in,
|
|
421
|
+
after running `npx rango generate`). With a local map, the route name is
|
|
422
|
+
**dot-prefixed** so params and search resolve from `routes`, not the global map:
|
|
213
423
|
|
|
214
424
|
```typescript
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
export const blogRoutes = route({ "blog.index": "/", "blog.post": "/:slug" });
|
|
425
|
+
import type { Handler } from "@rangojs/router";
|
|
426
|
+
import type { routes } from "./urls.gen.js";
|
|
218
427
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
428
|
+
export const SearchPage: Handler<".search", routes> = (ctx) => { ... };
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
Note the difference: `Handler<"search">` (no dot) resolves against the global
|
|
432
|
+
`GeneratedRouteMap`; `Handler<".search", routes>` resolves against the local
|
|
433
|
+
`routes` map. Mixing them — `Handler<"search", routes>` — silently ignores
|
|
434
|
+
`routes` for param/search inference and only uses it for local `ctx.reverse(".x")`.
|
|
435
|
+
|
|
436
|
+
Supported types: `"string"`, `"number"`, `"boolean"`, with `?` suffix for optional.
|
|
437
|
+
Values are automatically coerced from query string (e.g., `"2"` becomes `2` for numbers).
|
|
438
|
+
Routes without a `search` schema keep the standard `URLSearchParams` behavior.
|
|
439
|
+
|
|
440
|
+
### RouteSearchParams and RouteParams utility types
|
|
441
|
+
|
|
442
|
+
Extract typed params by route name for use in component props, return types, or anywhere:
|
|
443
|
+
|
|
444
|
+
```typescript
|
|
445
|
+
import type { RouteSearchParams, RouteParams } from "@rangojs/router";
|
|
446
|
+
|
|
447
|
+
// RouteSearchParams<"name"> resolves the search schema to a typed object
|
|
448
|
+
type SP = RouteSearchParams<"search">;
|
|
449
|
+
// { q: string | undefined; page?: number; sort?: string }
|
|
450
|
+
|
|
451
|
+
// RouteParams<"name"> resolves URL params from the route pattern
|
|
452
|
+
type P = RouteParams<"blogPost">;
|
|
453
|
+
// { slug: string }
|
|
454
|
+
|
|
455
|
+
// Optional URL params (`:slug?`) resolve to `string | undefined`
|
|
456
|
+
// because absent segments are omitted from `ctx.params` at runtime.
|
|
457
|
+
type C = RouteParams<"checkout">;
|
|
458
|
+
// { step?: string }
|
|
459
|
+
// → ctx.params.step is `string | undefined`; use `?? "default"` to coalesce.
|
|
460
|
+
|
|
461
|
+
// Use in component props
|
|
462
|
+
interface SearchResultsProps {
|
|
463
|
+
params: RouteSearchParams<"search">;
|
|
464
|
+
}
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
Both default to the global route map (`RegisteredRoutes` or `GeneratedRouteMap`).
|
|
468
|
+
Pass an explicit route map as the second type argument when needed:
|
|
469
|
+
|
|
470
|
+
```typescript
|
|
471
|
+
import type { routes } from "./urls.gen.js";
|
|
472
|
+
|
|
473
|
+
type SP = RouteSearchParams<"search", routes>;
|
|
474
|
+
type P = RouteParams<"blogPost", routes>;
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
### Generated route types
|
|
478
|
+
|
|
479
|
+
In the generated `router.named-routes.gen.ts`, routes with search schemas
|
|
480
|
+
use `{ path, search }` objects:
|
|
481
|
+
|
|
482
|
+
```typescript
|
|
483
|
+
// router.named-routes.gen.ts (auto-generated)
|
|
484
|
+
export const NamedRoutes = {
|
|
485
|
+
"search.index": {
|
|
486
|
+
path: "/search",
|
|
487
|
+
search: { q: "string", page: "number?", sort: "string?" },
|
|
488
|
+
},
|
|
489
|
+
"home.index": "/", // No search schema -> plain string
|
|
490
|
+
} as const;
|
|
224
491
|
```
|
|
225
492
|
|
|
493
|
+
You never open a `.gen.ts` by hand. Treat the generated types as call-site
|
|
494
|
+
honesty checks, not modules to read:
|
|
495
|
+
|
|
496
|
+
- **Do not import `router.named-routes.gen.ts` directly**, and don't reach for
|
|
497
|
+
`Rango.GeneratedRouteMap`. It is the whole-app manifest, auto-wired
|
|
498
|
+
globally — `Handler<"name">` and `ctx.reverse("name")` already see it.
|
|
499
|
+
- **Per-module `*.gen.ts` imports are fine** — they are the opt-in local-route
|
|
500
|
+
pattern for `useReverse(routes)` and explicit local handler typing
|
|
501
|
+
(`Handler<".name", routes>`). See `/links`.
|
|
502
|
+
|
|
503
|
+
If a type error points at a generated map instead of your call site, that's a
|
|
504
|
+
smell — fix the call site (or regenerate), never edit the generated file.
|
|
505
|
+
|
|
226
506
|
## Loader Type Safety
|
|
227
507
|
|
|
228
508
|
Loaders have typed return values:
|
|
@@ -237,52 +517,203 @@ export const ProductLoader = createLoader(async (ctx) => {
|
|
|
237
517
|
};
|
|
238
518
|
});
|
|
239
519
|
|
|
240
|
-
// In
|
|
241
|
-
|
|
242
|
-
|
|
520
|
+
// In server component - type is inferred
|
|
521
|
+
import { useLoader } from "@rangojs/router/client";
|
|
522
|
+
|
|
523
|
+
async function ProductPage() {
|
|
524
|
+
const product = await useLoader(ProductLoader);
|
|
243
525
|
// product: { id: string; name: string; price: number }
|
|
244
|
-
return <
|
|
245
|
-
}
|
|
526
|
+
return <h1>{product.name}</h1>;
|
|
527
|
+
}
|
|
246
528
|
|
|
247
529
|
// In client component - same type
|
|
530
|
+
"use client";
|
|
531
|
+
import { useLoader } from "@rangojs/router/client";
|
|
532
|
+
|
|
248
533
|
function ProductPrice() {
|
|
249
534
|
const { data } = useLoader(ProductLoader);
|
|
250
535
|
// data: { id: string; name: string; price: number }
|
|
251
|
-
|
|
536
|
+
const product = data;
|
|
537
|
+
return <span>${product.price}</span>;
|
|
252
538
|
}
|
|
253
539
|
```
|
|
254
540
|
|
|
255
|
-
##
|
|
541
|
+
## Typed Context Variables
|
|
256
542
|
|
|
257
|
-
|
|
543
|
+
`createVar<T>()` creates a typed token for `ctx.set()`/`ctx.get()`, making
|
|
544
|
+
handler-to-layout data contracts explicit and compile-time verified:
|
|
545
|
+
|
|
546
|
+
```typescript
|
|
547
|
+
import { createVar } from "@rangojs/router";
|
|
548
|
+
|
|
549
|
+
// Define a typed token (shared between producer and consumer)
|
|
550
|
+
interface PaginationData {
|
|
551
|
+
current: number;
|
|
552
|
+
total: number;
|
|
553
|
+
perPage: number;
|
|
554
|
+
}
|
|
555
|
+
export const Pagination = createVar<PaginationData>();
|
|
556
|
+
|
|
557
|
+
// Non-cacheable var — reading inside cache() or "use cache" throws at runtime
|
|
558
|
+
const Session = createVar<SessionData>({ cache: false });
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
`createVar` accepts an optional options object. The `cache` option (default
|
|
562
|
+
`true`) controls whether the var's values can be read inside cache scopes.
|
|
563
|
+
Write-level escalation is also supported: `ctx.set(Var, value, { cache: false })`
|
|
564
|
+
marks a specific write as non-cacheable even if the var itself is cacheable.
|
|
565
|
+
"Least cacheable wins" — if either says `cache: false`, the value throws on
|
|
566
|
+
read inside `cache()` or `"use cache"`.
|
|
567
|
+
|
|
568
|
+
### Producer (handler or middleware)
|
|
258
569
|
|
|
259
570
|
```typescript
|
|
260
|
-
|
|
261
|
-
|
|
571
|
+
import { Pagination } from "../vars/pagination.js";
|
|
572
|
+
|
|
573
|
+
const ArticleList: Handler<"articles.list"> = async (ctx) => {
|
|
574
|
+
ctx.set(Pagination, { // type-checked
|
|
575
|
+
current: 1,
|
|
576
|
+
total: 10,
|
|
577
|
+
perPage: 5,
|
|
578
|
+
});
|
|
579
|
+
return <Articles />;
|
|
580
|
+
};
|
|
581
|
+
```
|
|
262
582
|
|
|
263
|
-
|
|
583
|
+
### Consumer (layout, parallel, or any context with get)
|
|
264
584
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
585
|
+
```typescript
|
|
586
|
+
import { Pagination } from "../vars/pagination.js";
|
|
587
|
+
|
|
588
|
+
export function PaginationLayout(ctx: any) {
|
|
589
|
+
const pagination = ctx.get(Pagination); // typed as PaginationData | undefined
|
|
590
|
+
if (!pagination) return <Outlet />;
|
|
591
|
+
return <nav>Page {pagination.current} of {pagination.total}</nav>;
|
|
592
|
+
}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
### Why not just use Rango.Vars?
|
|
596
|
+
|
|
597
|
+
`Rango.Vars` (via global namespace augmentation) provides app-global typing for
|
|
598
|
+
`ctx.get("key")` / `ctx.set("key", value)`. It works for middleware state
|
|
599
|
+
shared app-wide. `createVar<T>()` is for route-local or feature-scoped
|
|
600
|
+
context -- the producer and consumer import the same token, creating a
|
|
601
|
+
scoped contract without polluting global types.
|
|
602
|
+
|
|
603
|
+
Both approaches coexist: `ctx.get("user")` (global via Vars) and
|
|
604
|
+
`ctx.get(Pagination)` (scoped via createVar) work side by side.
|
|
605
|
+
|
|
606
|
+
## Handle Type Safety
|
|
607
|
+
|
|
608
|
+
Handles have typed data:
|
|
609
|
+
|
|
610
|
+
```typescript
|
|
611
|
+
// Built-in Breadcrumbs handle — import from "@rangojs/router"
|
|
612
|
+
import { Breadcrumbs } from "@rangojs/router";
|
|
613
|
+
// Type: Handle<BreadcrumbItem, BreadcrumbItem[]>
|
|
614
|
+
// BreadcrumbItem: { label: string; href: string; content?: ReactNode | Promise<ReactNode> }
|
|
615
|
+
|
|
616
|
+
// In route handler — push is fully typed
|
|
617
|
+
path("/shop/product/:slug", (ctx) => {
|
|
618
|
+
const breadcrumb = ctx.use(Breadcrumbs);
|
|
619
|
+
breadcrumb({ label: "Products", href: "/shop/products" });
|
|
270
620
|
return <ProductPage />;
|
|
271
|
-
});
|
|
621
|
+
}, { name: "product" });
|
|
272
622
|
|
|
273
|
-
// In client
|
|
623
|
+
// In client — typed array
|
|
624
|
+
import { useHandle, Breadcrumbs } from "@rangojs/router/client";
|
|
274
625
|
function BreadcrumbNav() {
|
|
275
626
|
const crumbs = useHandle(Breadcrumbs);
|
|
276
|
-
// crumbs:
|
|
627
|
+
// crumbs: BreadcrumbItem[]
|
|
277
628
|
}
|
|
629
|
+
|
|
630
|
+
// Custom handles also work the same way
|
|
631
|
+
import { createHandle } from "@rangojs/router";
|
|
632
|
+
export const PageTitle = createHandle<string, string>(
|
|
633
|
+
(segments) => segments.flat().at(-1) ?? "Default Title"
|
|
634
|
+
);
|
|
278
635
|
```
|
|
279
636
|
|
|
637
|
+
## Ref Prop Type Safety (Loaders & Handles)
|
|
638
|
+
|
|
639
|
+
Loaders and handles can be passed as props from server to client components.
|
|
640
|
+
Use `typeof` to get the full typed definition without manually specifying generics:
|
|
641
|
+
|
|
642
|
+
```typescript
|
|
643
|
+
// loaders.ts
|
|
644
|
+
export const ProductLoader = createLoader(async (ctx) => {
|
|
645
|
+
return { product: await fetchProduct(ctx.params.slug) };
|
|
646
|
+
});
|
|
647
|
+
|
|
648
|
+
// Built-in Breadcrumbs — or any custom handle created with createHandle()
|
|
649
|
+
```
|
|
650
|
+
|
|
651
|
+
```tsx
|
|
652
|
+
// Client component — typeof infers all generics
|
|
653
|
+
"use client";
|
|
654
|
+
import { useLoader, useHandle, type Breadcrumbs } from "@rangojs/router/client";
|
|
655
|
+
import type { ProductLoader } from "../loaders";
|
|
656
|
+
|
|
657
|
+
function MyComponent({
|
|
658
|
+
loader,
|
|
659
|
+
handle,
|
|
660
|
+
}: {
|
|
661
|
+
loader: typeof ProductLoader; // LoaderDefinition<{ product: Product }>
|
|
662
|
+
handle: typeof Breadcrumbs; // Handle<{ label: string; href: string }>
|
|
663
|
+
}) {
|
|
664
|
+
const { data } = useLoader(loader); // data is typed
|
|
665
|
+
const crumbs = useHandle(handle); // crumbs is typed array
|
|
666
|
+
// ...
|
|
667
|
+
}
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
RSC Flight serialization calls `toJSON()` on both loaders and handles,
|
|
671
|
+
sending only `{ __brand, $$id }` to the client. The hooks recover the
|
|
672
|
+
full functionality from module-level registries.
|
|
673
|
+
|
|
674
|
+
## Stable identity: `path#export`
|
|
675
|
+
|
|
676
|
+
Loaders, handles, cached functions (`functionId`), and server actions
|
|
677
|
+
(`actionId`) all share one identity scheme: `{modulePath}#{exportName}`,
|
|
678
|
+
injected at build by the `exposeInternalIds` and `exposeActionId` Vite plugins.
|
|
679
|
+
This is also the identity React server actions carry across the Flight boundary,
|
|
680
|
+
which is why a `revalidate()` predicate sees an action as a `path#export` string:
|
|
681
|
+
|
|
682
|
+
```typescript
|
|
683
|
+
revalidate(
|
|
684
|
+
({ actionId }) => actionId === "src/actions/cart.ts#addToCart" || undefined,
|
|
685
|
+
);
|
|
686
|
+
```
|
|
687
|
+
|
|
688
|
+
`actionId` is the only stable reference React exposes across the Flight boundary,
|
|
689
|
+
so it stays as the floor and escape hatch. The hand-written-string surface
|
|
690
|
+
(`actionId?.includes("cart.ts#")`) is brittle: a renamed action or moved file
|
|
691
|
+
silently stops matching with no compile error. Prefer **`ctx.isAction()`** in a
|
|
692
|
+
revalidate predicate — it resolves the action's id from an imported reference, so
|
|
693
|
+
a rename is a type error in one place instead of silent drift:
|
|
694
|
+
|
|
695
|
+
```ts
|
|
696
|
+
import { addToCart, removeFromCart } from "./actions/cart";
|
|
697
|
+
import * as CartActions from "./actions/cart";
|
|
698
|
+
|
|
699
|
+
revalidate((ctx) => ctx.isAction(addToCart) || undefined); // one action
|
|
700
|
+
revalidate((ctx) => ctx.isAction(addToCart, removeFromCart) || undefined); // several
|
|
701
|
+
revalidate((ctx) => ctx.isAction(CartActions) || undefined); // any action in the module
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
`ctx.isAction()` (only available on the revalidate predicate's context) returns a
|
|
705
|
+
raw boolean — combine with `|| undefined` for the "revalidate on match, else
|
|
706
|
+
defer" intent. It resolves the reference the same way the router derives
|
|
707
|
+
`actionId` (`$id` in production, `$$id` in dev), so matching
|
|
708
|
+
works in both modes. `actionId` stays available for advanced cases.
|
|
709
|
+
|
|
280
710
|
## Location State Type Safety
|
|
281
711
|
|
|
282
712
|
```typescript
|
|
283
713
|
// location-states.ts
|
|
284
|
-
import { createLocationState } from "
|
|
714
|
+
import { createLocationState } from "@rangojs/router";
|
|
285
715
|
|
|
716
|
+
// All export patterns work: export const, const + export { X }, export { X as Y }
|
|
286
717
|
export const ProductPreview = createLocationState<{
|
|
287
718
|
name: string;
|
|
288
719
|
price: number;
|
|
@@ -291,7 +722,7 @@ export const ProductPreview = createLocationState<{
|
|
|
291
722
|
|
|
292
723
|
// Passing state through Link
|
|
293
724
|
<Link
|
|
294
|
-
to={href("
|
|
725
|
+
to={href("product", { slug: "widget" })}
|
|
295
726
|
state={[ProductPreview({ name: "Widget", price: 99, image: "/img.jpg" })]}
|
|
296
727
|
>
|
|
297
728
|
View Product
|
|
@@ -309,44 +740,186 @@ function ProductHeader() {
|
|
|
309
740
|
}
|
|
310
741
|
```
|
|
311
742
|
|
|
743
|
+
## Multi-Project tsconfig Setup
|
|
744
|
+
|
|
745
|
+
For monorepos or multi-app setups, each app should have its own TypeScript
|
|
746
|
+
program. Do not typecheck two Rango apps with different `Rango.Env`,
|
|
747
|
+
`Rango.Vars`, or `Rango.RegisteredRoutes` declarations in one tsconfig, because
|
|
748
|
+
ambient global interfaces merge across the whole program.
|
|
749
|
+
|
|
750
|
+
### Multiple routers in one program
|
|
751
|
+
|
|
752
|
+
`Rango.GeneratedRouteMap` is a **single global interface**. Each router's
|
|
753
|
+
generated `router.named-routes.gen.ts` augments it, so two routers in the **same
|
|
754
|
+
TS program** that define overlapping route names (e.g. both have a `home`) make
|
|
755
|
+
the augmentations collide:
|
|
756
|
+
|
|
757
|
+
```text
|
|
758
|
+
Interface 'GeneratedRouteMap' cannot simultaneously extend ...
|
|
759
|
+
Named property 'home' ... are not identical.
|
|
760
|
+
```
|
|
761
|
+
|
|
762
|
+
This is the multi-router / host-router case. Resolve it by:
|
|
763
|
+
|
|
764
|
+
- **Separate TS programs** — give each router its own tsconfig (as below) so only
|
|
765
|
+
one generated map is in scope per program. Recommended.
|
|
766
|
+
- **Unique route-name prefixes** — name routes per router (`appA.home`,
|
|
767
|
+
`appB.home`) so the merged global map has no duplicate keys.
|
|
768
|
+
|
|
769
|
+
A single global generated map is a single-router convenience; global named-route
|
|
770
|
+
typing across multiple routers in one program is not supported today (it would
|
|
771
|
+
need per-router scoping in the generated map).
|
|
772
|
+
|
|
773
|
+
Use a shared base tsconfig for common compiler options, then make every app
|
|
774
|
+
tsconfig include its own source tree, its own `router.tsx`, and the generated
|
|
775
|
+
`router.named-routes.gen.ts` that lives beside that router.
|
|
776
|
+
|
|
777
|
+
```jsonc
|
|
778
|
+
// tsconfig.base.json (root)
|
|
779
|
+
{
|
|
780
|
+
"compilerOptions": {
|
|
781
|
+
"target": "ES2022",
|
|
782
|
+
"module": "ESNext",
|
|
783
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
784
|
+
"jsx": "react-jsx",
|
|
785
|
+
"moduleResolution": "bundler",
|
|
786
|
+
"strict": true,
|
|
787
|
+
"noEmit": true,
|
|
788
|
+
"skipLibCheck": true,
|
|
789
|
+
"isolatedModules": true,
|
|
790
|
+
"esModuleInterop": true,
|
|
791
|
+
"resolveJsonModule": true,
|
|
792
|
+
},
|
|
793
|
+
}
|
|
794
|
+
```
|
|
795
|
+
|
|
796
|
+
```jsonc
|
|
797
|
+
// apps/shop/tsconfig.json
|
|
798
|
+
{
|
|
799
|
+
"extends": "../../tsconfig.base.json",
|
|
800
|
+
"include": ["src"],
|
|
801
|
+
"files": ["src/router.tsx"],
|
|
802
|
+
}
|
|
803
|
+
```
|
|
804
|
+
|
|
805
|
+
```jsonc
|
|
806
|
+
// apps/blog/tsconfig.json
|
|
807
|
+
{
|
|
808
|
+
"extends": "../../tsconfig.base.json",
|
|
809
|
+
"include": ["src"],
|
|
810
|
+
"files": ["src/router.tsx"],
|
|
811
|
+
}
|
|
812
|
+
```
|
|
813
|
+
|
|
814
|
+
Run generation per app:
|
|
815
|
+
|
|
816
|
+
```bash
|
|
817
|
+
npx rango generate apps/shop/src/router.tsx
|
|
818
|
+
npx rango generate apps/blog/src/router.tsx
|
|
819
|
+
```
|
|
820
|
+
|
|
821
|
+
If an app has multiple tsconfigs (`tsconfig.app.json`, `tsconfig.test.json`,
|
|
822
|
+
`tsconfig.worker.json`), every tsconfig that typechecks Rango handlers,
|
|
823
|
+
components, loaders, actions, or client navigation must see the same app-local
|
|
824
|
+
type surfaces:
|
|
825
|
+
|
|
826
|
+
```jsonc
|
|
827
|
+
// apps/shop/tsconfig.test.json
|
|
828
|
+
{
|
|
829
|
+
"extends": "./tsconfig.json",
|
|
830
|
+
"include": ["src", "tests"],
|
|
831
|
+
"files": ["src/router.tsx"],
|
|
832
|
+
}
|
|
833
|
+
```
|
|
834
|
+
|
|
835
|
+
The `files` array ensures `router.tsx` is always included even if nothing
|
|
836
|
+
directly imports it. The generated `router.named-routes.gen.ts` is normally
|
|
837
|
+
covered by `include: ["src"]`; if a tsconfig uses a narrow `include`, add the
|
|
838
|
+
generated file explicitly. Each app gets its own typed environment and named
|
|
839
|
+
route map without interfering with other apps.
|
|
840
|
+
|
|
841
|
+
For response and MIME payload lookup in each app, augment `RegisteredRoutes`
|
|
842
|
+
inside that app's router file:
|
|
843
|
+
|
|
844
|
+
```typescript
|
|
845
|
+
// apps/shop/src/router.tsx
|
|
846
|
+
export const router = createRouter<ShopEnv>({ document: Document }).routes(
|
|
847
|
+
urlpatterns,
|
|
848
|
+
);
|
|
849
|
+
|
|
850
|
+
declare global {
|
|
851
|
+
namespace Rango {
|
|
852
|
+
interface Env extends ShopEnv {}
|
|
853
|
+
interface RegisteredRoutes extends typeof router.routeMap {}
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
```
|
|
857
|
+
|
|
312
858
|
## Complete Type-Safe Setup
|
|
313
859
|
|
|
314
860
|
```typescript
|
|
315
861
|
// 1. env.ts - Environment types
|
|
316
|
-
export
|
|
862
|
+
export interface AppBindings {
|
|
863
|
+
DB: D1Database;
|
|
864
|
+
KV: KVNamespace;
|
|
865
|
+
}
|
|
317
866
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
867
|
+
export interface AppVariables {
|
|
868
|
+
user?: { id: string; email: string; role: string };
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
// 2. urls.tsx - Route definitions with names
|
|
872
|
+
import { urls } from "@rangojs/router";
|
|
323
873
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
.routes(shopRoutes)
|
|
327
|
-
.map(() => import("./handlers/shop"));
|
|
874
|
+
export const urlpatterns = urls(({ path, layout, loader }) => [
|
|
875
|
+
path("/", HomePage, { name: "home" }),
|
|
328
876
|
|
|
329
|
-
|
|
877
|
+
layout(<ShopLayout />, () => [
|
|
878
|
+
path("/shop", ShopIndex, { name: "shop" }),
|
|
879
|
+
path("/shop/product/:slug", ProductPage, { name: "product" }, () => [
|
|
880
|
+
loader(ProductLoader),
|
|
881
|
+
]),
|
|
882
|
+
]),
|
|
883
|
+
]);
|
|
330
884
|
|
|
885
|
+
// 3. router.tsx - Create router and export reverse
|
|
886
|
+
const router = createRouter<AppBindings>({
|
|
887
|
+
document: Document,
|
|
888
|
+
}).routes(urlpatterns);
|
|
889
|
+
|
|
890
|
+
// Register bindings and variables globally for implicit typing
|
|
331
891
|
declare global {
|
|
332
|
-
namespace
|
|
333
|
-
interface
|
|
334
|
-
interface
|
|
892
|
+
namespace Rango {
|
|
893
|
+
interface Env extends AppBindings {}
|
|
894
|
+
interface Vars extends AppVariables {}
|
|
335
895
|
}
|
|
336
896
|
}
|
|
337
897
|
|
|
338
|
-
export
|
|
339
|
-
export
|
|
898
|
+
export const reverse = router.reverse;
|
|
899
|
+
export default router;
|
|
340
900
|
|
|
341
|
-
// 4.
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
901
|
+
// 4. Run `npx rango generate src/router.tsx` to generate
|
|
902
|
+
// router.named-routes.gen.ts (auto-registers GeneratedRouteMap globally).
|
|
903
|
+
// No manual RegisteredRoutes declaration is needed for named-route handlers,
|
|
904
|
+
// ctx.reverse, prerender, href(), or Rango.Path. Add `RegisteredRoutes
|
|
905
|
+
// extends typeof router.routeMap` when global response payload helpers such
|
|
906
|
+
// as Rango.PathResponse need the richer router.routeMap metadata.
|
|
907
|
+
|
|
908
|
+
// 5. loaders/*.ts - Type-safe loaders
|
|
909
|
+
export const ProductLoader = createLoader(async (ctx) => {
|
|
910
|
+
// ctx.params: { slug: string }
|
|
911
|
+
// ctx.get("user"): User | undefined (from Rango.Vars)
|
|
912
|
+
// ctx.env.DB: D1Database (plain bindings from Rango.Env)
|
|
913
|
+
return { product: await fetchProduct(ctx.params.slug) };
|
|
914
|
+
});
|
|
915
|
+
|
|
916
|
+
// 6. Server: ctx.reverse for named routes
|
|
917
|
+
path("/product/:slug", (ctx) => {
|
|
918
|
+
return <Link to={ctx.reverse("shop")}>Back to Shop</Link>;
|
|
919
|
+
}, { name: "product" })
|
|
349
920
|
|
|
350
|
-
//
|
|
351
|
-
|
|
921
|
+
// 7. Client: useHref for mounted paths, href for absolute
|
|
922
|
+
"use client";
|
|
923
|
+
import { useHref, href, Link } from "@rangojs/router/client";
|
|
924
|
+
<Link to={href("/shop/product/widget")}>Widget</Link>
|
|
352
925
|
```
|