@rangojs/router 0.0.0-experimental.13 → 0.0.0-experimental.130
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 +1040 -5
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +1712 -212
- 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/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
- 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/{src/handles/index.ts → dist/handles/index.js} +1 -1
- 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/testing/vitest.js +82 -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 +6263 -2733
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +123 -68
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +312 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +486 -0
- package/skills/caching/SKILL.md +349 -24
- package/skills/composability/SKILL.md +197 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +87 -62
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +557 -79
- package/skills/host-router/SKILL.md +278 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +175 -8
- package/skills/layout/SKILL.md +128 -5
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +604 -54
- package/skills/middleware/SKILL.md +213 -37
- package/skills/migrate-nextjs/SKILL.md +584 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +41 -10
- package/skills/observability/SKILL.md +172 -0
- package/skills/parallel/SKILL.md +276 -3
- package/skills/prerender/SKILL.md +432 -52
- package/skills/rango/SKILL.md +313 -21
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +248 -120
- package/skills/route/SKILL.md +287 -21
- package/skills/router-setup/SKILL.md +231 -33
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +129 -0
- package/skills/testing/bindings.md +89 -0
- package/skills/testing/cache-prerender.md +124 -0
- package/skills/testing/client-components.md +122 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +92 -0
- package/skills/testing/handles.md +129 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +121 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +84 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +120 -0
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +547 -107
- package/skills/use-cache/SKILL.md +355 -0
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +77 -44
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +162 -200
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +323 -563
- package/src/browser/navigation-client.ts +219 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +104 -112
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +328 -348
- package/src/browser/prefetch/cache.ts +324 -0
- package/src/browser/prefetch/fetch.ts +357 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +194 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +253 -71
- package/src/browser/react/NavigationProvider.tsx +155 -34
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +53 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +260 -60
- package/src/browser/react/location-state.ts +90 -20
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-link-status.ts +6 -9
- package/src/browser/react/use-navigation.ts +44 -68
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +124 -0
- package/src/browser/rsc-router.tsx +290 -72
- package/src/browser/scroll-restoration.ts +132 -49
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +621 -613
- package/src/browser/types.ts +175 -50
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +123 -56
- package/src/build/generate-route-types.ts +41 -1038
- package/src/build/index.ts +9 -6
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +165 -34
- 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 +113 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +131 -0
- package/src/build/route-types/router-processing.ts +651 -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-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +165 -0
- package/src/cache/cache-runtime.ts +444 -0
- package/src/cache/cache-scope.ts +231 -325
- package/src/cache/cache-tag.ts +98 -0
- package/src/cache/cf/cf-cache-store.ts +2644 -75
- package/src/cache/cf/index.ts +17 -17
- package/src/cache/document-cache.ts +172 -92
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +104 -0
- package/src/cache/index.ts +11 -35
- package/src/cache/memory-segment-store.ts +307 -30
- package/src/cache/profile-registry.ts +49 -0
- package/src/cache/read-through-swr.ts +164 -0
- package/src/cache/segment-codec.ts +240 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +94 -211
- package/src/client.rsc.tsx +8 -21
- package/src/client.tsx +123 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +36 -0
- package/src/defer.ts +196 -0
- package/src/deps/ssr.ts +0 -1
- package/src/errors.ts +106 -10
- package/src/handle.ts +76 -23
- package/src/handles/MetaTags.tsx +73 -34
- package/src/handles/breadcrumbs.ts +77 -0
- package/src/handles/meta.ts +30 -52
- package/src/host/cookie-handler.ts +21 -51
- package/src/host/errors.ts +8 -32
- package/src/host/index.ts +12 -9
- package/src/host/pattern-matcher.ts +34 -77
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +174 -34
- package/src/index.ts +241 -73
- package/src/internal-debug.ts +8 -4
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/network-error-thrower.tsx +4 -7
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/param-hash.ts +14 -13
- package/src/prerender/store.ts +121 -21
- package/src/prerender.ts +445 -24
- package/src/redirect-origin.ts +100 -0
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +10 -72
- package/src/route-definition/dsl-helpers.ts +1116 -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 +135 -0
- package/src/route-definition/resolve-handler-use.ts +161 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-definition.ts +1 -1450
- package/src/route-map-builder.ts +82 -144
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +72 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +215 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +22 -26
- package/src/router/find-match.ts +181 -0
- package/src/router/handler-context.ts +372 -125
- package/src/router/instrument.ts +308 -0
- package/src/router/intercept-resolution.ts +34 -27
- package/src/router/lazy-includes.ts +200 -0
- package/src/router/loader-resolution.ts +381 -147
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +88 -51
- package/src/router/match-api.ts +162 -245
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +90 -89
- package/src/router/match-middleware/cache-lookup.ts +297 -150
- package/src/router/match-middleware/cache-store.ts +75 -33
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +121 -50
- package/src/router/metrics.ts +219 -28
- package/src/router/middleware-types.ts +93 -0
- package/src/router/middleware.ts +421 -413
- package/src/router/navigation-snapshot.ts +131 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +263 -79
- package/src/router/prerender-match.ts +541 -0
- package/src/router/preview-match.ts +100 -0
- package/src/router/request-classification.ts +276 -0
- package/src/router/revalidation.ts +143 -44
- package/src/router/route-snapshot.ts +244 -0
- package/src/router/router-context.ts +41 -47
- package/src/router/router-interfaces.ts +525 -0
- package/src/router/router-options.ts +726 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +748 -0
- package/src/router/segment-resolution/helpers.ts +313 -0
- package/src/router/segment-resolution/loader-cache.ts +207 -0
- package/src/router/segment-resolution/revalidation.ts +1322 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/segment-resolution.ts +24 -1354
- package/src/router/segment-wrappers.ts +289 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +261 -0
- package/src/router/telemetry.ts +377 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +172 -60
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +44 -0
- package/src/router.ts +748 -2376
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +861 -1141
- package/src/rsc/helpers.ts +269 -19
- package/src/rsc/index.ts +1 -21
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +235 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +413 -0
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +374 -0
- package/src/rsc/rsc-rendering.ts +261 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +376 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/types.ts +58 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +70 -74
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +134 -0
- package/src/segment-system.tsx +292 -134
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +439 -85
- package/src/server/cookie-store.ts +265 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +112 -31
- package/src/server/loader-registry.ts +23 -82
- package/src/server/request-context.ts +724 -143
- package/src/server.ts +26 -164
- package/src/ssr/index.tsx +113 -36
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +618 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +232 -0
- package/src/testing/generated-routes.ts +183 -0
- package/src/testing/index.ts +99 -0
- package/src/testing/internal/context.ts +348 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +330 -0
- package/src/testing/render-route.tsx +566 -0
- package/src/testing/run-loader.ts +378 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +21 -67
- package/src/theme/ThemeScript.tsx +5 -11
- package/src/theme/constants.ts +5 -14
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +21 -32
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +839 -0
- package/src/types/index.ts +79 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +107 -0
- package/src/types/route-config.ts +126 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +171 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +160 -0
- package/src/urls/index.ts +43 -0
- package/src/urls/path-helper-types.ts +386 -0
- package/src/urls/path-helper.ts +275 -0
- package/src/urls/pattern-types.ts +124 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +291 -0
- package/src/urls/urls-function.ts +81 -0
- package/src/urls.ts +1 -1323
- package/src/use-loader.tsx +406 -141
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/discover-routers.ts +389 -0
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +467 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/state.ts +161 -0
- package/src/vite/discovery/virtual-module-codegen.ts +183 -0
- package/src/vite/index.ts +17 -2259
- package/src/vite/plugin-types.ts +221 -0
- package/src/vite/plugins/cjs-to-esm.ts +83 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +13 -87
- package/src/vite/plugins/expose-ids/export-analysis.ts +338 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +141 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +57 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +124 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +806 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/version-injector.ts +79 -0
- package/src/vite/plugins/version-plugin.ts +275 -0
- package/src/vite/plugins/virtual-entries.ts +108 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +444 -0
- package/src/vite/router-discovery.ts +1581 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +193 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +223 -0
- package/src/vite/utils/shared-utils.ts +219 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -15,10 +15,9 @@ argument-hint: [setup]
|
|
|
15
15
|
import { createRouter } from "@rangojs/router";
|
|
16
16
|
import { urlpatterns } from "./urls";
|
|
17
17
|
|
|
18
|
-
const router = createRouter<
|
|
18
|
+
const router = createRouter<AppBindings>({
|
|
19
19
|
document: Document,
|
|
20
|
-
|
|
21
|
-
});
|
|
20
|
+
}).routes(urlpatterns);
|
|
22
21
|
|
|
23
22
|
// Server-side named-route reverse (type-safe via routeMap)
|
|
24
23
|
export const reverse = router.reverse;
|
|
@@ -26,6 +25,108 @@ export const reverse = router.reverse;
|
|
|
26
25
|
export default router;
|
|
27
26
|
```
|
|
28
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.
|
|
33
|
+
|
|
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 `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";
|
|
70
|
+
|
|
71
|
+
export const router = createRouter<AppBindings>({}).routes(urlpatterns);
|
|
72
|
+
|
|
73
|
+
declare global {
|
|
74
|
+
namespace Rango {
|
|
75
|
+
interface Env extends AppBindings {}
|
|
76
|
+
interface Vars extends AppVars {}
|
|
77
|
+
interface RegisteredRoutes extends typeof router.routeMap {}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
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
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
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
|
+
|
|
29
130
|
## Route Definition with Type-Safe Names
|
|
30
131
|
|
|
31
132
|
```typescript
|
|
@@ -45,22 +146,35 @@ export const urlpatterns = urls(({ path, layout }) => [
|
|
|
45
146
|
|
|
46
147
|
## Type-Safe href()
|
|
47
148
|
|
|
48
|
-
### Server: ctx.reverse
|
|
149
|
+
### Server: ctx.reverse with route names
|
|
49
150
|
|
|
50
|
-
In route handlers,
|
|
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
|
|
51
155
|
|
|
52
156
|
```typescript
|
|
53
|
-
import {
|
|
157
|
+
import type { Handler } from "@rangojs/router";
|
|
54
158
|
|
|
55
|
-
|
|
56
|
-
|
|
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
|
+
```
|
|
57
165
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
reverse("blog.post"); // Absolute names always allowed
|
|
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`:
|
|
61
168
|
|
|
62
|
-
|
|
63
|
-
|
|
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
|
+
};
|
|
64
178
|
```
|
|
65
179
|
|
|
66
180
|
### Client: href + useHref
|
|
@@ -82,6 +196,107 @@ function ShopNav() {
|
|
|
82
196
|
}
|
|
83
197
|
```
|
|
84
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"); // Product (bare value)
|
|
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
|
+
`{ createdAt: string }` (bare value), 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
|
+
|
|
85
300
|
See `/links` for full URL generation guide.
|
|
86
301
|
|
|
87
302
|
## Environment Type Setup
|
|
@@ -90,50 +305,57 @@ Define your app's environment for type-safe bindings and variables:
|
|
|
90
305
|
|
|
91
306
|
```typescript
|
|
92
307
|
// env.ts
|
|
93
|
-
import type { RouterEnv } from "@rangojs/router";
|
|
94
308
|
|
|
95
|
-
// Cloudflare bindings
|
|
96
|
-
interface AppBindings {
|
|
309
|
+
// Cloudflare bindings — passed as TEnv to createRouter<TEnv>()
|
|
310
|
+
export interface AppBindings {
|
|
97
311
|
DB: D1Database;
|
|
98
312
|
KV: KVNamespace;
|
|
99
313
|
CACHE: KVNamespace;
|
|
100
314
|
AI: Ai;
|
|
101
315
|
}
|
|
102
316
|
|
|
103
|
-
// Variables set by middleware
|
|
104
|
-
interface AppVariables {
|
|
317
|
+
// Variables set by middleware — declared via global namespace augmentation
|
|
318
|
+
export interface AppVariables {
|
|
105
319
|
user?: { id: string; email: string; role: string };
|
|
106
320
|
requestId?: string;
|
|
107
321
|
permissions?: string[];
|
|
108
322
|
}
|
|
109
|
-
|
|
110
|
-
// Combined environment type
|
|
111
|
-
export type AppEnv = RouterEnv<AppBindings, AppVariables>;
|
|
112
323
|
```
|
|
113
324
|
|
|
114
325
|
### Using Environment Types
|
|
115
326
|
|
|
116
327
|
```typescript
|
|
117
328
|
// router.tsx
|
|
118
|
-
import type {
|
|
329
|
+
import type { AppBindings, AppVariables } from "./env";
|
|
119
330
|
|
|
120
|
-
const router = createRouter<
|
|
331
|
+
const router = createRouter<AppBindings>({
|
|
121
332
|
document: Document,
|
|
122
|
-
|
|
123
|
-
});
|
|
333
|
+
}).routes(urlpatterns);
|
|
124
334
|
|
|
125
|
-
//
|
|
126
|
-
|
|
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
|
+
}
|
|
342
|
+
|
|
343
|
+
// middleware - typed via ctx.set / ctx.get
|
|
344
|
+
import type { Middleware } from "@rangojs/router";
|
|
127
345
|
|
|
128
|
-
export const authMiddleware =
|
|
129
|
-
ctx.
|
|
346
|
+
export const authMiddleware: Middleware = async (ctx, next) => {
|
|
347
|
+
ctx.set("user", {
|
|
348
|
+
id: "123",
|
|
349
|
+
email: "user@example.com",
|
|
350
|
+
role: "admin",
|
|
351
|
+
});
|
|
130
352
|
await next();
|
|
131
|
-
}
|
|
353
|
+
};
|
|
132
354
|
|
|
133
355
|
// loaders - typed context
|
|
134
|
-
export const UserLoader = createLoader(
|
|
135
|
-
const db = ctx.env.
|
|
136
|
-
const userId = ctx.
|
|
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
|
|
137
359
|
return db.prepare("SELECT * FROM users WHERE id = ?").bind(userId).first();
|
|
138
360
|
});
|
|
139
361
|
```
|
|
@@ -145,8 +367,9 @@ Register environment types globally for implicit typing:
|
|
|
145
367
|
```typescript
|
|
146
368
|
// router.tsx
|
|
147
369
|
declare global {
|
|
148
|
-
namespace
|
|
149
|
-
interface Env extends
|
|
370
|
+
namespace Rango {
|
|
371
|
+
interface Env extends AppBindings {}
|
|
372
|
+
interface Vars extends AppVariables {}
|
|
150
373
|
}
|
|
151
374
|
}
|
|
152
375
|
```
|
|
@@ -155,10 +378,10 @@ Now handlers have typed context without explicit imports:
|
|
|
155
378
|
|
|
156
379
|
```typescript
|
|
157
380
|
// In loaders
|
|
158
|
-
export const DashboardLoader = createLoader(
|
|
159
|
-
// ctx.env.
|
|
160
|
-
// ctx.
|
|
161
|
-
const user = ctx.
|
|
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");
|
|
162
385
|
return { user };
|
|
163
386
|
});
|
|
164
387
|
```
|
|
@@ -172,7 +395,7 @@ Add a `search` schema to `path()` options for type-safe query parameters:
|
|
|
172
395
|
path("/search", SearchPage, {
|
|
173
396
|
name: "search",
|
|
174
397
|
search: { q: "string", page: "number?", sort: "string?" },
|
|
175
|
-
})
|
|
398
|
+
});
|
|
176
399
|
```
|
|
177
400
|
|
|
178
401
|
### Handler with typed search params
|
|
@@ -185,24 +408,31 @@ global `GeneratedRouteMap` (the gen file). No explicit route map import needed:
|
|
|
185
408
|
import type { Handler } from "@rangojs/router";
|
|
186
409
|
|
|
187
410
|
export const SearchPage: Handler<"search"> = (ctx) => {
|
|
188
|
-
// ctx.
|
|
189
|
-
const { q, page, sort } = ctx.
|
|
411
|
+
// ctx.search is typed: { q: string; page?: number; sort?: string }
|
|
412
|
+
const { q, page, sort } = ctx.search;
|
|
190
413
|
return <SearchResults q={q} page={page} sort={sort} />;
|
|
191
414
|
};
|
|
192
415
|
```
|
|
193
416
|
|
|
194
417
|
This avoids circular references because `Handler` defaults to `GeneratedRouteMap`
|
|
195
|
-
(
|
|
418
|
+
(from `router.named-routes.gen.ts`) instead of `RegisteredRoutes` (which depends on `router.tsx`).
|
|
196
419
|
|
|
197
|
-
You can also pass an explicit route map
|
|
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:
|
|
198
423
|
|
|
199
424
|
```typescript
|
|
200
425
|
import type { Handler } from "@rangojs/router";
|
|
201
|
-
import type { routes } from "
|
|
426
|
+
import type { routes } from "./urls.gen.js";
|
|
202
427
|
|
|
203
|
-
export const SearchPage: Handler<"search", routes> = (ctx) => { ... };
|
|
428
|
+
export const SearchPage: Handler<".search", routes> = (ctx) => { ... };
|
|
204
429
|
```
|
|
205
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
|
+
|
|
206
436
|
Supported types: `"string"`, `"number"`, `"boolean"`, with `?` suffix for optional.
|
|
207
437
|
Values are automatically coerced from query string (e.g., `"2"` becomes `2` for numbers).
|
|
208
438
|
Routes without a `search` schema keep the standard `URLSearchParams` behavior.
|
|
@@ -216,12 +446,18 @@ import type { RouteSearchParams, RouteParams } from "@rangojs/router";
|
|
|
216
446
|
|
|
217
447
|
// RouteSearchParams<"name"> resolves the search schema to a typed object
|
|
218
448
|
type SP = RouteSearchParams<"search">;
|
|
219
|
-
// { q: string; page?: number; sort?: string }
|
|
449
|
+
// { q: string | undefined; page?: number; sort?: string }
|
|
220
450
|
|
|
221
451
|
// RouteParams<"name"> resolves URL params from the route pattern
|
|
222
452
|
type P = RouteParams<"blogPost">;
|
|
223
453
|
// { slug: string }
|
|
224
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
|
+
|
|
225
461
|
// Use in component props
|
|
226
462
|
interface SearchResultsProps {
|
|
227
463
|
params: RouteSearchParams<"search">;
|
|
@@ -240,25 +476,40 @@ type P = RouteParams<"blogPost", routes>;
|
|
|
240
476
|
|
|
241
477
|
### Generated route types
|
|
242
478
|
|
|
243
|
-
In the generated
|
|
244
|
-
|
|
479
|
+
In the generated `router.named-routes.gen.ts`, routes with search schemas
|
|
480
|
+
use `{ path, search }` objects:
|
|
245
481
|
|
|
246
482
|
```typescript
|
|
247
|
-
//
|
|
248
|
-
export const
|
|
249
|
-
|
|
250
|
-
|
|
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
|
|
251
490
|
} as const;
|
|
252
|
-
export type routes = typeof routes;
|
|
253
491
|
```
|
|
254
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
|
+
|
|
255
506
|
## Loader Type Safety
|
|
256
507
|
|
|
257
508
|
Loaders have typed return values:
|
|
258
509
|
|
|
259
510
|
```typescript
|
|
260
511
|
// loaders/product.ts
|
|
261
|
-
export const ProductLoader = createLoader(
|
|
512
|
+
export const ProductLoader = createLoader(async (ctx) => {
|
|
262
513
|
return {
|
|
263
514
|
id: ctx.params.slug,
|
|
264
515
|
name: "Widget",
|
|
@@ -267,7 +518,7 @@ export const ProductLoader = createLoader("product", async (ctx) => {
|
|
|
267
518
|
});
|
|
268
519
|
|
|
269
520
|
// In server component - type is inferred
|
|
270
|
-
import { useLoader } from "@rangojs/router";
|
|
521
|
+
import { useLoader } from "@rangojs/router/client";
|
|
271
522
|
|
|
272
523
|
async function ProductPage() {
|
|
273
524
|
const product = await useLoader(ProductLoader);
|
|
@@ -277,40 +528,110 @@ async function ProductPage() {
|
|
|
277
528
|
|
|
278
529
|
// In client component - same type
|
|
279
530
|
"use client";
|
|
280
|
-
import {
|
|
531
|
+
import { useLoader } from "@rangojs/router/client";
|
|
281
532
|
|
|
282
533
|
function ProductPrice() {
|
|
283
|
-
const {
|
|
284
|
-
//
|
|
534
|
+
const { data } = useLoader(ProductLoader);
|
|
535
|
+
// data: { id: string; name: string; price: number }
|
|
536
|
+
const product = data;
|
|
285
537
|
return <span>${product.price}</span>;
|
|
286
538
|
}
|
|
287
539
|
```
|
|
288
540
|
|
|
289
|
-
##
|
|
541
|
+
## Typed Context Variables
|
|
290
542
|
|
|
291
|
-
|
|
543
|
+
`createVar<T>()` creates a typed token for `ctx.set()`/`ctx.get()`, making
|
|
544
|
+
handler-to-layout data contracts explicit and compile-time verified:
|
|
292
545
|
|
|
293
546
|
```typescript
|
|
294
|
-
|
|
295
|
-
import { createHandle } from "@rangojs/router";
|
|
547
|
+
import { createVar } from "@rangojs/router";
|
|
296
548
|
|
|
297
|
-
//
|
|
298
|
-
|
|
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>();
|
|
299
556
|
|
|
300
|
-
//
|
|
301
|
-
|
|
557
|
+
// Non-cacheable var — reading inside cache() or "use cache" throws at runtime
|
|
558
|
+
const Session = createVar<SessionData>({ cache: false });
|
|
559
|
+
```
|
|
302
560
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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)
|
|
308
569
|
|
|
309
|
-
|
|
570
|
+
```typescript
|
|
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
|
+
```
|
|
582
|
+
|
|
583
|
+
### Consumer (layout, parallel, or any context with get)
|
|
584
|
+
|
|
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" });
|
|
620
|
+
return <ProductPage />;
|
|
621
|
+
}, { name: "product" });
|
|
622
|
+
|
|
623
|
+
// In client — typed array
|
|
624
|
+
import { useHandle, Breadcrumbs } from "@rangojs/router/client";
|
|
310
625
|
function BreadcrumbNav() {
|
|
311
626
|
const crumbs = useHandle(Breadcrumbs);
|
|
312
|
-
// crumbs:
|
|
627
|
+
// crumbs: BreadcrumbItem[]
|
|
313
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
|
+
);
|
|
314
635
|
```
|
|
315
636
|
|
|
316
637
|
## Ref Prop Type Safety (Loaders & Handles)
|
|
@@ -324,24 +645,24 @@ export const ProductLoader = createLoader(async (ctx) => {
|
|
|
324
645
|
return { product: await fetchProduct(ctx.params.slug) };
|
|
325
646
|
});
|
|
326
647
|
|
|
327
|
-
//
|
|
328
|
-
|
|
648
|
+
// Built-in Breadcrumbs — or any custom handle created with createHandle()
|
|
649
|
+
```
|
|
329
650
|
|
|
651
|
+
```tsx
|
|
330
652
|
// Client component — typeof infers all generics
|
|
331
653
|
"use client";
|
|
332
|
-
import { useLoader, useHandle } from "@rangojs/router/client";
|
|
654
|
+
import { useLoader, useHandle, type Breadcrumbs } from "@rangojs/router/client";
|
|
333
655
|
import type { ProductLoader } from "../loaders";
|
|
334
|
-
import type { Breadcrumbs } from "../handles";
|
|
335
656
|
|
|
336
657
|
function MyComponent({
|
|
337
658
|
loader,
|
|
338
659
|
handle,
|
|
339
660
|
}: {
|
|
340
|
-
loader: typeof ProductLoader;
|
|
341
|
-
handle: typeof Breadcrumbs;
|
|
661
|
+
loader: typeof ProductLoader; // LoaderDefinition<{ product: Product }>
|
|
662
|
+
handle: typeof Breadcrumbs; // Handle<{ label: string; href: string }>
|
|
342
663
|
}) {
|
|
343
|
-
const { data } = useLoader(loader);
|
|
344
|
-
const crumbs = useHandle(handle);
|
|
664
|
+
const { data } = useLoader(loader); // data is typed
|
|
665
|
+
const crumbs = useHandle(handle); // crumbs is typed array
|
|
345
666
|
// ...
|
|
346
667
|
}
|
|
347
668
|
```
|
|
@@ -350,6 +671,42 @@ RSC Flight serialization calls `toJSON()` on both loaders and handles,
|
|
|
350
671
|
sending only `{ __brand, $$id }` to the client. The hooks recover the
|
|
351
672
|
full functionality from module-level registries.
|
|
352
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
|
+
|
|
353
710
|
## Location State Type Safety
|
|
354
711
|
|
|
355
712
|
```typescript
|
|
@@ -385,9 +742,37 @@ function ProductHeader() {
|
|
|
385
742
|
|
|
386
743
|
## Multi-Project tsconfig Setup
|
|
387
744
|
|
|
388
|
-
For monorepos or multi-app setups,
|
|
389
|
-
|
|
390
|
-
|
|
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.
|
|
391
776
|
|
|
392
777
|
```jsonc
|
|
393
778
|
// tsconfig.base.json (root)
|
|
@@ -403,8 +788,8 @@ global type declarations (like `RSCRouter.Env`).
|
|
|
403
788
|
"skipLibCheck": true,
|
|
404
789
|
"isolatedModules": true,
|
|
405
790
|
"esModuleInterop": true,
|
|
406
|
-
"resolveJsonModule": true
|
|
407
|
-
}
|
|
791
|
+
"resolveJsonModule": true,
|
|
792
|
+
},
|
|
408
793
|
}
|
|
409
794
|
```
|
|
410
795
|
|
|
@@ -413,7 +798,7 @@ global type declarations (like `RSCRouter.Env`).
|
|
|
413
798
|
{
|
|
414
799
|
"extends": "../../tsconfig.base.json",
|
|
415
800
|
"include": ["src"],
|
|
416
|
-
"files": ["src/router.tsx"]
|
|
801
|
+
"files": ["src/router.tsx"],
|
|
417
802
|
}
|
|
418
803
|
```
|
|
419
804
|
|
|
@@ -422,19 +807,66 @@ global type declarations (like `RSCRouter.Env`).
|
|
|
422
807
|
{
|
|
423
808
|
"extends": "../../tsconfig.base.json",
|
|
424
809
|
"include": ["src"],
|
|
425
|
-
"files": ["src/router.tsx"]
|
|
810
|
+
"files": ["src/router.tsx"],
|
|
426
811
|
}
|
|
427
812
|
```
|
|
428
813
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
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
|
+
```
|
|
432
857
|
|
|
433
858
|
## Complete Type-Safe Setup
|
|
434
859
|
|
|
435
860
|
```typescript
|
|
436
861
|
// 1. env.ts - Environment types
|
|
437
|
-
export
|
|
862
|
+
export interface AppBindings {
|
|
863
|
+
DB: D1Database;
|
|
864
|
+
KV: KVNamespace;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
export interface AppVariables {
|
|
868
|
+
user?: { id: string; email: string; role: string };
|
|
869
|
+
}
|
|
438
870
|
|
|
439
871
|
// 2. urls.tsx - Route definitions with names
|
|
440
872
|
import { urls } from "@rangojs/router";
|
|
@@ -450,35 +882,43 @@ export const urlpatterns = urls(({ path, layout, loader }) => [
|
|
|
450
882
|
]),
|
|
451
883
|
]);
|
|
452
884
|
|
|
453
|
-
// 3. router.tsx -
|
|
454
|
-
const router = createRouter<
|
|
885
|
+
// 3. router.tsx - Create router and export reverse
|
|
886
|
+
const router = createRouter<AppBindings>({
|
|
455
887
|
document: Document,
|
|
456
|
-
|
|
457
|
-
});
|
|
888
|
+
}).routes(urlpatterns);
|
|
458
889
|
|
|
890
|
+
// Register bindings and variables globally for implicit typing
|
|
459
891
|
declare global {
|
|
460
|
-
namespace
|
|
461
|
-
interface Env extends
|
|
892
|
+
namespace Rango {
|
|
893
|
+
interface Env extends AppBindings {}
|
|
894
|
+
interface Vars extends AppVariables {}
|
|
462
895
|
}
|
|
463
896
|
}
|
|
464
897
|
|
|
898
|
+
export const reverse = router.reverse;
|
|
465
899
|
export default router;
|
|
466
900
|
|
|
467
|
-
// 4.
|
|
468
|
-
|
|
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) => {
|
|
469
910
|
// ctx.params: { slug: string }
|
|
470
|
-
// ctx.
|
|
471
|
-
// ctx.env.
|
|
911
|
+
// ctx.get("user"): User | undefined (from Rango.Vars)
|
|
912
|
+
// ctx.env.DB: D1Database (plain bindings from Rango.Env)
|
|
472
913
|
return { product: await fetchProduct(ctx.params.slug) };
|
|
473
914
|
});
|
|
474
915
|
|
|
475
|
-
//
|
|
916
|
+
// 6. Server: ctx.reverse for named routes
|
|
476
917
|
path("/product/:slug", (ctx) => {
|
|
477
|
-
|
|
478
|
-
return <Link to={reverse("shop")}>Back to Shop</Link>;
|
|
918
|
+
return <Link to={ctx.reverse("shop")}>Back to Shop</Link>;
|
|
479
919
|
}, { name: "product" })
|
|
480
920
|
|
|
481
|
-
//
|
|
921
|
+
// 7. Client: useHref for mounted paths, href for absolute
|
|
482
922
|
"use client";
|
|
483
923
|
import { useHref, href, Link } from "@rangojs/router/client";
|
|
484
924
|
<Link to={href("/shop/product/widget")}>Widget</Link>
|