@rangojs/router 0.0.0-experimental.2 → 0.0.0-experimental.20
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 +5 -0
- package/README.md +850 -4
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/{src/__mocks__/version.ts → dist/__mocks__/version.js} +1 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +1601 -0
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +4583 -749
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +18 -17
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +82 -46
- package/skills/cache-guide/SKILL.md +262 -0
- package/skills/caching/SKILL.md +139 -238
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +112 -0
- package/skills/document-cache/SKILL.md +87 -57
- package/skills/fonts/SKILL.md +167 -0
- package/skills/hooks/SKILL.md +403 -60
- package/skills/intercept/SKILL.md +224 -203
- package/skills/layout/SKILL.md +243 -149
- package/skills/links/SKILL.md +239 -0
- package/skills/loader/SKILL.md +444 -253
- package/skills/middleware/SKILL.md +222 -325
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +220 -170
- package/skills/prerender/SKILL.md +643 -0
- package/skills/rango/SKILL.md +119 -0
- package/skills/response-routes/SKILL.md +411 -0
- package/skills/route/SKILL.md +334 -89
- package/skills/router-setup/SKILL.md +305 -274
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/testing/SKILL.md +226 -0
- package/skills/theme/SKILL.md +36 -11
- package/skills/typesafety/SKILL.md +437 -168
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +181 -0
- package/src/bin/rango.ts +321 -0
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/event-controller.ts +87 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +20 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +217 -549
- package/src/browser/navigation-client.ts +74 -46
- package/src/browser/navigation-store.ts +33 -50
- package/src/browser/navigation-transaction.ts +295 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +288 -297
- package/src/browser/prefetch/cache.ts +67 -0
- package/src/browser/prefetch/fetch.ts +137 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +42 -0
- package/src/browser/prefetch/queue.ts +88 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +173 -73
- package/src/browser/react/NavigationProvider.tsx +138 -27
- package/src/browser/react/context.ts +6 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +12 -12
- package/src/browser/react/location-state-shared.ts +95 -53
- package/src/browser/react/location-state.ts +60 -15
- package/src/browser/react/mount-context.ts +37 -0
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +49 -65
- package/src/browser/react/use-href.tsx +20 -188
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-mount.ts +31 -0
- package/src/browser/react/use-navigation.ts +27 -78
- package/src/browser/react/use-params.ts +65 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +63 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +80 -97
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +104 -34
- package/src/browser/scroll-restoration.ts +92 -16
- package/src/browser/segment-reconciler.ts +216 -0
- package/src/browser/segment-structure-assert.ts +83 -0
- package/src/browser/server-action-bridge.ts +504 -584
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +107 -57
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +438 -0
- package/src/build/generate-route-types.ts +36 -0
- package/src/build/index.ts +35 -0
- package/src/build/route-trie.ts +249 -0
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +411 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +469 -0
- package/src/build/route-types/scan-filter.ts +78 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +338 -0
- package/src/cache/cache-scope.ts +120 -303
- package/src/cache/cf/cf-cache-store.ts +119 -7
- package/src/cache/cf/index.ts +8 -2
- package/src/cache/document-cache.ts +101 -72
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +0 -15
- package/src/cache/memory-segment-store.ts +191 -13
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +98 -0
- package/src/cache/types.ts +76 -121
- package/src/client.rsc.tsx +10 -14
- package/src/client.tsx +114 -89
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +6 -2
- package/src/context-var.ts +86 -0
- package/src/debug.ts +243 -0
- package/src/errors.ts +108 -2
- package/src/handle.ts +34 -19
- package/src/handles/MetaTags.tsx +76 -23
- package/src/handles/meta.ts +32 -15
- package/src/host/cookie-handler.ts +165 -0
- package/src/host/errors.ts +97 -0
- package/src/host/index.ts +56 -0
- package/src/host/pattern-matcher.ts +214 -0
- package/src/host/router.ts +352 -0
- package/src/host/testing.ts +79 -0
- package/src/host/types.ts +146 -0
- package/src/host/utils.ts +25 -0
- package/src/href-client.ts +141 -47
- package/src/index.rsc.ts +209 -23
- package/src/index.ts +256 -32
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +27 -142
- package/src/loader.ts +27 -10
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +144 -0
- package/src/prerender.ts +463 -0
- package/src/reverse.ts +330 -0
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +9 -11
- package/src/route-definition/dsl-helpers.ts +934 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +430 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +93 -0
- package/src/route-definition/route-function.ts +119 -0
- package/src/route-definition.ts +1 -1371
- package/src/route-map-builder.ts +241 -112
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +70 -9
- package/src/router/content-negotiation.ts +116 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +158 -0
- package/src/router/handler-context.ts +348 -82
- package/src/router/intercept-resolution.ts +395 -0
- package/src/router/lazy-includes.ts +234 -0
- package/src/router/loader-resolution.ts +215 -121
- package/src/router/logging.ts +248 -0
- package/src/router/manifest.ts +172 -43
- package/src/router/match-api.ts +620 -0
- package/src/router/match-context.ts +6 -4
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +80 -93
- package/src/router/match-middleware/cache-lookup.ts +382 -9
- package/src/router/match-middleware/cache-store.ts +51 -22
- package/src/router/match-middleware/intercept-resolution.ts +55 -17
- package/src/router/match-middleware/segment-resolution.ts +24 -6
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +34 -20
- package/src/router/metrics.ts +3 -3
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +179 -0
- package/src/router/middleware.ts +239 -328
- package/src/router/pattern-matching.ts +302 -26
- package/src/router/prerender-match.ts +398 -0
- package/src/router/preview-match.ts +170 -0
- package/src/router/revalidation.ts +112 -33
- package/src/router/router-context.ts +40 -23
- package/src/router/router-interfaces.ts +439 -0
- package/src/router/router-options.ts +587 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +552 -0
- package/src/router/segment-resolution/helpers.ts +263 -0
- package/src/router/segment-resolution/loader-cache.ts +198 -0
- package/src/router/segment-resolution/revalidation.ts +1226 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -0
- package/src/router/segment-wrappers.ts +289 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +221 -0
- package/src/router/types.ts +78 -4
- package/src/router.ts +672 -3566
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +691 -757
- package/src/rsc/helpers.ts +140 -6
- package/src/rsc/index.ts +5 -5
- package/src/rsc/loader-fetch.ts +209 -0
- package/src/rsc/manifest-init.ts +86 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +366 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +250 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +344 -0
- package/src/rsc/types.ts +38 -14
- package/src/search-params.ts +227 -0
- package/src/segment-system.tsx +59 -61
- package/src/server/context.ts +217 -49
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +98 -20
- package/src/server/loader-registry.ts +15 -56
- package/src/server/request-context.ts +406 -65
- package/src/server.ts +32 -133
- package/src/ssr/index.tsx +157 -26
- package/src/static-handler.ts +114 -0
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +11 -4
- package/src/theme/index.ts +6 -7
- package/src/theme/theme-context.ts +5 -31
- package/src/theme/theme-script.ts +21 -18
- package/src/theme/types.ts +1 -1
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +100 -0
- package/src/types/handler-context.ts +691 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +183 -0
- package/src/types/route-config.ts +161 -0
- package/src/types/route-entry.ts +102 -0
- package/src/types/segments.ts +153 -0
- package/src/types.ts +1 -1561
- package/src/urls/include-helper.ts +197 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +339 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +95 -0
- package/src/urls/response-types.ts +106 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -726
- package/src/use-loader.tsx +85 -77
- package/src/vite/discovery/bundle-postprocess.ts +209 -0
- package/src/vite/discovery/discover-routers.ts +345 -0
- package/src/vite/discovery/prerender-collection.ts +365 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +113 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +10 -782
- package/src/vite/plugin-types.ts +131 -0
- package/src/vite/plugins/cjs-to-esm.ts +93 -0
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +105 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -51
- package/src/vite/plugins/expose-id-utils.ts +287 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +569 -0
- package/src/vite/plugins/use-cache-transform.ts +323 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +254 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +510 -0
- package/src/vite/router-discovery.ts +781 -0
- package/src/vite/utils/ast-handler-extract.ts +517 -0
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
- package/src/vite/utils/prerender-utils.ts +129 -0
- package/src/vite/utils/shared-utils.ts +169 -0
- package/CLAUDE.md +0 -7
- package/src/__tests__/component-utils.test.ts +0 -76
- package/src/__tests__/route-definition.test.ts +0 -63
- package/src/__tests__/urls.test.tsx +0 -436
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/__tests__/document-cache.test.ts +0 -522
- package/src/cache/__tests__/memory-segment-store.test.ts +0 -487
- package/src/cache/__tests__/memory-store.test.ts +0 -484
- package/src/cache/cf/__tests__/cf-cache-store.test.ts +0 -428
- package/src/cache/memory-store.ts +0 -253
- package/src/href.ts +0 -177
- package/src/route-utils.ts +0 -89
- package/src/router/__tests__/match-context.test.ts +0 -104
- package/src/router/__tests__/match-pipelines.test.ts +0 -537
- package/src/router/__tests__/match-result.test.ts +0 -566
- package/src/router/__tests__/on-error.test.ts +0 -935
- package/src/router/__tests__/pattern-matching.test.ts +0 -577
- package/src/router/middleware.test.ts +0 -1355
- package/src/rsc/__tests__/helpers.test.ts +0 -175
- package/src/server/__tests__/request-context.test.ts +0 -171
- package/src/ssr/__tests__/ssr-handler.test.tsx +0 -188
- package/src/theme/__tests__/theme.test.ts +0 -120
- package/src/vite/__tests__/expose-loader-id.test.ts +0 -117
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -357
- package/src/vite/expose-location-state-id.ts +0 -177
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -1,166 +1,207 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: typesafety
|
|
3
|
-
description: Set up type-safe routes, params, and environment types in
|
|
3
|
+
description: Set up type-safe routes, params, and environment types in @rangojs/router
|
|
4
4
|
argument-hint: [setup]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Type Safety Setup
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
@rangojs/router provides end-to-end type safety for routes, parameters, and environment.
|
|
10
10
|
|
|
11
|
-
##
|
|
12
|
-
|
|
13
|
-
Register route types globally for type-safe `href()` and params:
|
|
11
|
+
## Router Setup
|
|
14
12
|
|
|
15
13
|
```typescript
|
|
16
14
|
// router.tsx
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
|
|
15
|
+
import { createRouter } from "@rangojs/router";
|
|
16
|
+
import { urlpatterns } from "./urls";
|
|
17
|
+
|
|
18
|
+
const router = createRouter<AppBindings>({
|
|
19
|
+
document: Document,
|
|
20
|
+
}).routes(urlpatterns);
|
|
21
|
+
|
|
22
|
+
// Server-side named-route reverse (type-safe via routeMap)
|
|
23
|
+
export const reverse = router.reverse;
|
|
24
|
+
|
|
25
|
+
export default router;
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Which global type should I use?
|
|
29
|
+
|
|
30
|
+
Use the generated route map by default. Manual `RegisteredRoutes` augmentation
|
|
31
|
+
is only needed when you want the richer `typeof router.routeMap` shape
|
|
32
|
+
available globally.
|
|
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 utilities like `href()`, `ValidPaths`, and `PathResponse`.
|
|
41
|
+
|
|
42
|
+
Recommended setup:
|
|
20
43
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
44
|
+
```typescript
|
|
45
|
+
// router.tsx
|
|
46
|
+
import { createRouter } from "@rangojs/router";
|
|
47
|
+
import { urlpatterns } from "./urls";
|
|
48
|
+
import type { AppBindings, AppVars } from "./env";
|
|
26
49
|
|
|
27
|
-
|
|
28
|
-
type AppRoutes = typeof _router.routeMap;
|
|
50
|
+
export const router = createRouter<AppBindings>({}).routes(urlpatterns);
|
|
29
51
|
|
|
30
|
-
// Register globally via module augmentation
|
|
31
52
|
declare global {
|
|
32
53
|
namespace RSCRouter {
|
|
33
|
-
interface
|
|
54
|
+
interface Env extends AppBindings {}
|
|
55
|
+
interface Vars extends AppVars {}
|
|
56
|
+
interface RegisteredRoutes extends typeof router.routeMap {}
|
|
34
57
|
}
|
|
35
58
|
}
|
|
36
|
-
|
|
37
|
-
export default _router;
|
|
38
|
-
export const href = _router.href;
|
|
39
59
|
```
|
|
40
60
|
|
|
41
|
-
## Route Definition with Type-Safe
|
|
61
|
+
## Route Definition with Type-Safe Names
|
|
42
62
|
|
|
43
63
|
```typescript
|
|
44
|
-
//
|
|
45
|
-
import {
|
|
46
|
-
|
|
47
|
-
export const
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
|
|
64
|
+
// urls.tsx
|
|
65
|
+
import { urls } from "@rangojs/router";
|
|
66
|
+
|
|
67
|
+
export const urlpatterns = urls(({ path, layout }) => [
|
|
68
|
+
path("/", HomePage, { name: "home" }),
|
|
69
|
+
path("/products", ProductsPage, { name: "products" }),
|
|
70
|
+
path("/product/:slug", ProductPage, { name: "product" }),
|
|
71
|
+
path("/cart", CartPage, { name: "cart" }),
|
|
72
|
+
path("/checkout/:step?", CheckoutPage, { name: "checkout" }),
|
|
73
|
+
]);
|
|
54
74
|
|
|
55
|
-
//
|
|
56
|
-
// {
|
|
57
|
-
// "shop.index": "/",
|
|
58
|
-
// "shop.products": "/products",
|
|
59
|
-
// "shop.product": "/products/:slug",
|
|
60
|
-
// ...
|
|
61
|
-
// }
|
|
75
|
+
// Route names are inferred from the { name } option
|
|
62
76
|
```
|
|
63
77
|
|
|
64
78
|
## Type-Safe href()
|
|
65
79
|
|
|
66
|
-
|
|
80
|
+
### Server: ctx.reverse with route names
|
|
81
|
+
|
|
82
|
+
In route handlers, `ctx.reverse()` uses two namespaces:
|
|
83
|
+
|
|
84
|
+
- **`.name`** — local route, resolved within the current `include()` scope
|
|
85
|
+
- **`name`** — global route, from the named-routes definition
|
|
67
86
|
|
|
68
87
|
```typescript
|
|
69
|
-
import {
|
|
88
|
+
import type { Handler } from "@rangojs/router";
|
|
89
|
+
|
|
90
|
+
export const ProductHandler: Handler<"shop.product"> = (ctx) => {
|
|
91
|
+
ctx.reverse(".cart"); // Local: /shop/cart
|
|
92
|
+
ctx.reverse(".product", { slug: "widget" }); // Local: /shop/product/widget
|
|
93
|
+
ctx.reverse("blog.post", { slug: "1" }); // Global: /blog/1
|
|
94
|
+
};
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
For type-safe local names, generate a route types file with `npx rango generate urls/shop.tsx`
|
|
98
|
+
and pass it as the second generic to `Handler` or `Prerender`:
|
|
70
99
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
href("shop.product", { slug: "widget" }); // "/shop/products/widget"
|
|
100
|
+
```typescript
|
|
101
|
+
import type { Handler } from "@rangojs/router";
|
|
102
|
+
import type { routes } from "./shop.gen.js";
|
|
75
103
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
104
|
+
export const ProductHandler: Handler<"shop.product", routes> = (ctx) => {
|
|
105
|
+
ctx.reverse(".cart"); // Type-safe local name
|
|
106
|
+
ctx.reverse(".product", { slug: "widget" }); // Type-safe local with params
|
|
107
|
+
ctx.reverse("blog.post", { slug: "hi" }); // Type-safe global name
|
|
108
|
+
};
|
|
80
109
|
```
|
|
81
110
|
|
|
82
|
-
|
|
111
|
+
### Client: href + useHref
|
|
83
112
|
|
|
84
|
-
|
|
113
|
+
On the client, `href()` validates paths against registered route patterns at compile time:
|
|
85
114
|
|
|
86
115
|
```typescript
|
|
87
|
-
|
|
88
|
-
import {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
116
|
+
"use client";
|
|
117
|
+
import { href, useHref, Link } from "@rangojs/router/client";
|
|
118
|
+
|
|
119
|
+
// href() validates absolute paths via PatternToPath types
|
|
120
|
+
href("/about"); // Valid path
|
|
121
|
+
href("/blog/hello"); // Matches /blog/:slug
|
|
122
|
+
|
|
123
|
+
// useHref() auto-prefixes with include() mount
|
|
124
|
+
function ShopNav() {
|
|
125
|
+
const href = useHref();
|
|
126
|
+
return <Link to={href("/cart")}>Cart</Link>; // "/shop/cart"
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`href()` and path-based response utilities read from `RegisteredRoutes`, so if
|
|
131
|
+
you want them typed globally you should augment:
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
declare global {
|
|
135
|
+
namespace RSCRouter {
|
|
136
|
+
interface RegisteredRoutes extends typeof router.routeMap {}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
104
139
|
```
|
|
105
140
|
|
|
141
|
+
See `/links` for full URL generation guide.
|
|
142
|
+
|
|
106
143
|
## Environment Type Setup
|
|
107
144
|
|
|
108
145
|
Define your app's environment for type-safe bindings and variables:
|
|
109
146
|
|
|
110
147
|
```typescript
|
|
111
148
|
// env.ts
|
|
112
|
-
import type { RouterEnv } from "rsc-router/server";
|
|
113
149
|
|
|
114
|
-
// Cloudflare bindings
|
|
115
|
-
interface AppBindings {
|
|
150
|
+
// Cloudflare bindings — passed as TEnv to createRouter<TEnv>()
|
|
151
|
+
export interface AppBindings {
|
|
116
152
|
DB: D1Database;
|
|
117
153
|
KV: KVNamespace;
|
|
118
154
|
CACHE: KVNamespace;
|
|
119
155
|
AI: Ai;
|
|
120
156
|
}
|
|
121
157
|
|
|
122
|
-
// Variables set by middleware
|
|
123
|
-
interface AppVariables {
|
|
158
|
+
// Variables set by middleware — declared via module augmentation
|
|
159
|
+
export interface AppVariables {
|
|
124
160
|
user?: { id: string; email: string; role: string };
|
|
125
161
|
requestId?: string;
|
|
126
162
|
permissions?: string[];
|
|
127
163
|
}
|
|
128
|
-
|
|
129
|
-
// Combined environment type
|
|
130
|
-
export type AppEnv = RouterEnv<AppBindings, AppVariables>;
|
|
131
164
|
```
|
|
132
165
|
|
|
133
166
|
### Using Environment Types
|
|
134
167
|
|
|
135
168
|
```typescript
|
|
136
169
|
// router.tsx
|
|
137
|
-
import type {
|
|
170
|
+
import type { AppBindings, AppVariables } from "./env";
|
|
138
171
|
|
|
139
|
-
const router =
|
|
140
|
-
|
|
172
|
+
const router = createRouter<AppBindings>({
|
|
173
|
+
document: Document,
|
|
174
|
+
}).routes(urlpatterns);
|
|
141
175
|
|
|
142
|
-
//
|
|
143
|
-
|
|
144
|
-
|
|
176
|
+
// Register bindings and variables globally for implicit typing
|
|
177
|
+
declare global {
|
|
178
|
+
namespace RSCRouter {
|
|
179
|
+
interface Env extends AppBindings {}
|
|
180
|
+
interface Vars extends AppVariables {}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// middleware - typed via ctx.set / ctx.get
|
|
185
|
+
import type { Middleware } from "@rangojs/router";
|
|
186
|
+
|
|
187
|
+
export const authMiddleware: Middleware = async (ctx, next) => {
|
|
188
|
+
ctx.set("user", {
|
|
189
|
+
id: "123",
|
|
190
|
+
email: "user@example.com",
|
|
191
|
+
role: "admin",
|
|
192
|
+
});
|
|
145
193
|
await next();
|
|
146
194
|
};
|
|
147
195
|
|
|
148
|
-
// handlers - typed access
|
|
149
|
-
route("dashboard", (ctx) => {
|
|
150
|
-
const user = ctx.get("user"); // { id: string; email: string; role: string } | undefined
|
|
151
|
-
const db = ctx.env.Bindings.DB; // D1Database
|
|
152
|
-
return <Dashboard user={user} />;
|
|
153
|
-
});
|
|
154
|
-
|
|
155
196
|
// loaders - typed context
|
|
156
|
-
export const UserLoader = createLoader
|
|
157
|
-
const db = ctx.env.
|
|
158
|
-
const userId = ctx.get("user")?.id;
|
|
197
|
+
export const UserLoader = createLoader(async (ctx) => {
|
|
198
|
+
const db = ctx.env.DB; // D1Database (plain bindings)
|
|
199
|
+
const userId = ctx.get("user")?.id; // from RSCRouter.Vars
|
|
159
200
|
return db.prepare("SELECT * FROM users WHERE id = ?").bind(userId).first();
|
|
160
201
|
});
|
|
161
202
|
```
|
|
162
203
|
|
|
163
|
-
## Global
|
|
204
|
+
## Global Environment Registration
|
|
164
205
|
|
|
165
206
|
Register environment types globally for implicit typing:
|
|
166
207
|
|
|
@@ -168,8 +209,8 @@ Register environment types globally for implicit typing:
|
|
|
168
209
|
// router.tsx
|
|
169
210
|
declare global {
|
|
170
211
|
namespace RSCRouter {
|
|
171
|
-
interface
|
|
172
|
-
interface
|
|
212
|
+
interface Env extends AppBindings {}
|
|
213
|
+
interface Vars extends AppVariables {}
|
|
173
214
|
}
|
|
174
215
|
}
|
|
175
216
|
```
|
|
@@ -177,50 +218,105 @@ declare global {
|
|
|
177
218
|
Now handlers have typed context without explicit imports:
|
|
178
219
|
|
|
179
220
|
```typescript
|
|
180
|
-
//
|
|
181
|
-
export
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}),
|
|
188
|
-
]);
|
|
221
|
+
// In loaders
|
|
222
|
+
export const DashboardLoader = createLoader(async (ctx) => {
|
|
223
|
+
// ctx.env.DB is typed from global RSCRouter.Env
|
|
224
|
+
// ctx.get("user") is typed from global RSCRouter.Vars
|
|
225
|
+
const user = ctx.get("user");
|
|
226
|
+
return { user };
|
|
227
|
+
});
|
|
189
228
|
```
|
|
190
229
|
|
|
191
|
-
##
|
|
230
|
+
## Typed Search Params
|
|
192
231
|
|
|
193
|
-
|
|
232
|
+
Add a `search` schema to `path()` options for type-safe query parameters:
|
|
194
233
|
|
|
195
234
|
```typescript
|
|
196
|
-
//
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
.map(() => import("./other"));
|
|
202
|
-
|
|
203
|
-
// Error message:
|
|
204
|
-
// Property 'map' does not exist on type '{
|
|
205
|
-
// __error: "Route key conflict! Keys [index] already exist with different URL patterns.";
|
|
206
|
-
// hint: "Use unique key names for each route definition.";
|
|
207
|
-
// }'
|
|
235
|
+
// Route definition with search schema
|
|
236
|
+
path("/search", SearchPage, {
|
|
237
|
+
name: "search",
|
|
238
|
+
search: { q: "string", page: "number?", sort: "string?" },
|
|
239
|
+
});
|
|
208
240
|
```
|
|
209
241
|
|
|
210
|
-
###
|
|
242
|
+
### Handler with typed search params
|
|
211
243
|
|
|
212
|
-
|
|
244
|
+
`Handler<"name">` automatically resolves route params and search params from the
|
|
245
|
+
global `GeneratedRouteMap` (the gen file). No explicit route map import needed:
|
|
213
246
|
|
|
214
247
|
```typescript
|
|
215
|
-
//
|
|
216
|
-
|
|
217
|
-
export const blogRoutes = route({ "blog.index": "/", "blog.post": "/:slug" });
|
|
248
|
+
// pages/search.tsx
|
|
249
|
+
import type { Handler } from "@rangojs/router";
|
|
218
250
|
|
|
219
|
-
|
|
220
|
-
.
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
251
|
+
export const SearchPage: Handler<"search"> = (ctx) => {
|
|
252
|
+
// ctx.search is typed: { q: string; page?: number; sort?: string }
|
|
253
|
+
const { q, page, sort } = ctx.search;
|
|
254
|
+
return <SearchResults q={q} page={page} sort={sort} />;
|
|
255
|
+
};
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
This avoids circular references because `Handler` defaults to `GeneratedRouteMap`
|
|
259
|
+
(from `router.named-routes.gen.ts`) instead of `RegisteredRoutes` (which depends on `router.tsx`).
|
|
260
|
+
|
|
261
|
+
You can also pass an explicit route map for per-module isolation (opt-in,
|
|
262
|
+
after running `npx rango generate`):
|
|
263
|
+
|
|
264
|
+
```typescript
|
|
265
|
+
import type { Handler } from "@rangojs/router";
|
|
266
|
+
import type { routes } from "./urls.gen.js";
|
|
267
|
+
|
|
268
|
+
export const SearchPage: Handler<"search", routes> = (ctx) => { ... };
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Supported types: `"string"`, `"number"`, `"boolean"`, with `?` suffix for optional.
|
|
272
|
+
Values are automatically coerced from query string (e.g., `"2"` becomes `2` for numbers).
|
|
273
|
+
Routes without a `search` schema keep the standard `URLSearchParams` behavior.
|
|
274
|
+
|
|
275
|
+
### RouteSearchParams and RouteParams utility types
|
|
276
|
+
|
|
277
|
+
Extract typed params by route name for use in component props, return types, or anywhere:
|
|
278
|
+
|
|
279
|
+
```typescript
|
|
280
|
+
import type { RouteSearchParams, RouteParams } from "@rangojs/router";
|
|
281
|
+
|
|
282
|
+
// RouteSearchParams<"name"> resolves the search schema to a typed object
|
|
283
|
+
type SP = RouteSearchParams<"search">;
|
|
284
|
+
// { q: string; page?: number; sort?: string }
|
|
285
|
+
|
|
286
|
+
// RouteParams<"name"> resolves URL params from the route pattern
|
|
287
|
+
type P = RouteParams<"blogPost">;
|
|
288
|
+
// { slug: string }
|
|
289
|
+
|
|
290
|
+
// Use in component props
|
|
291
|
+
interface SearchResultsProps {
|
|
292
|
+
params: RouteSearchParams<"search">;
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
Both default to the global route map (`RegisteredRoutes` or `GeneratedRouteMap`).
|
|
297
|
+
Pass an explicit route map as the second type argument when needed:
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
import type { routes } from "./urls.gen.js";
|
|
301
|
+
|
|
302
|
+
type SP = RouteSearchParams<"search", routes>;
|
|
303
|
+
type P = RouteParams<"blogPost", routes>;
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Generated route types
|
|
307
|
+
|
|
308
|
+
In the generated `router.named-routes.gen.ts`, routes with search schemas
|
|
309
|
+
use `{ path, search }` objects:
|
|
310
|
+
|
|
311
|
+
```typescript
|
|
312
|
+
// router.named-routes.gen.ts (auto-generated)
|
|
313
|
+
export const NamedRoutes = {
|
|
314
|
+
"search.index": {
|
|
315
|
+
path: "/search",
|
|
316
|
+
search: { q: "string", page: "number?", sort: "string?" },
|
|
317
|
+
},
|
|
318
|
+
"home.index": "/", // No search schema -> plain string
|
|
319
|
+
} as const;
|
|
224
320
|
```
|
|
225
321
|
|
|
226
322
|
## Loader Type Safety
|
|
@@ -237,38 +333,101 @@ export const ProductLoader = createLoader(async (ctx) => {
|
|
|
237
333
|
};
|
|
238
334
|
});
|
|
239
335
|
|
|
240
|
-
// In
|
|
241
|
-
|
|
242
|
-
|
|
336
|
+
// In server component - type is inferred
|
|
337
|
+
import { useLoader } from "@rangojs/router";
|
|
338
|
+
|
|
339
|
+
async function ProductPage() {
|
|
340
|
+
const product = await useLoader(ProductLoader);
|
|
243
341
|
// product: { id: string; name: string; price: number }
|
|
244
|
-
return <
|
|
245
|
-
}
|
|
342
|
+
return <h1>{product.name}</h1>;
|
|
343
|
+
}
|
|
246
344
|
|
|
247
345
|
// In client component - same type
|
|
346
|
+
"use client";
|
|
347
|
+
import { useLoader } from "@rangojs/router/client";
|
|
348
|
+
|
|
248
349
|
function ProductPrice() {
|
|
249
350
|
const { data } = useLoader(ProductLoader);
|
|
250
351
|
// data: { id: string; name: string; price: number }
|
|
251
|
-
|
|
352
|
+
const product = data;
|
|
353
|
+
return <span>${product.price}</span>;
|
|
252
354
|
}
|
|
253
355
|
```
|
|
254
356
|
|
|
357
|
+
## Typed Context Variables
|
|
358
|
+
|
|
359
|
+
`createVar<T>()` creates a typed token for `ctx.set()`/`ctx.get()`, making
|
|
360
|
+
handler-to-layout data contracts explicit and compile-time verified:
|
|
361
|
+
|
|
362
|
+
```typescript
|
|
363
|
+
import { createVar } from "@rangojs/router";
|
|
364
|
+
|
|
365
|
+
// Define a typed token (shared between producer and consumer)
|
|
366
|
+
interface PaginationData {
|
|
367
|
+
current: number;
|
|
368
|
+
total: number;
|
|
369
|
+
perPage: number;
|
|
370
|
+
}
|
|
371
|
+
export const Pagination = createVar<PaginationData>();
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### Producer (handler or middleware)
|
|
375
|
+
|
|
376
|
+
```typescript
|
|
377
|
+
import { Pagination } from "../vars/pagination.js";
|
|
378
|
+
|
|
379
|
+
const ArticleList: Handler<"articles.list"> = async (ctx) => {
|
|
380
|
+
ctx.set(Pagination, { // type-checked
|
|
381
|
+
current: 1,
|
|
382
|
+
total: 10,
|
|
383
|
+
perPage: 5,
|
|
384
|
+
});
|
|
385
|
+
return <Articles />;
|
|
386
|
+
};
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### Consumer (layout, parallel, or any context with get)
|
|
390
|
+
|
|
391
|
+
```typescript
|
|
392
|
+
import { Pagination } from "../vars/pagination.js";
|
|
393
|
+
|
|
394
|
+
export function PaginationLayout(ctx: any) {
|
|
395
|
+
const pagination = ctx.get(Pagination); // typed as PaginationData | undefined
|
|
396
|
+
if (!pagination) return <Outlet />;
|
|
397
|
+
return <nav>Page {pagination.current} of {pagination.total}</nav>;
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### Why not just use RSCRouter.Vars?
|
|
402
|
+
|
|
403
|
+
`RSCRouter.Vars` (via module augmentation) provides app-global typing for
|
|
404
|
+
`ctx.get("key")` / `ctx.set("key", value)`. It works for middleware state
|
|
405
|
+
shared app-wide. `createVar<T>()` is for route-local or feature-scoped
|
|
406
|
+
context -- the producer and consumer import the same token, creating a
|
|
407
|
+
scoped contract without polluting global types.
|
|
408
|
+
|
|
409
|
+
Both approaches coexist: `ctx.get("user")` (global via Vars) and
|
|
410
|
+
`ctx.get(Pagination)` (scoped via createVar) work side by side.
|
|
411
|
+
|
|
255
412
|
## Handle Type Safety
|
|
256
413
|
|
|
257
414
|
Handles have typed data:
|
|
258
415
|
|
|
259
416
|
```typescript
|
|
260
417
|
// handles/breadcrumbs.ts
|
|
261
|
-
import { createHandle } from "
|
|
418
|
+
import { createHandle } from "@rangojs/router";
|
|
262
419
|
|
|
420
|
+
// All export patterns work: export const, const + export { X }, export { X as Y }
|
|
263
421
|
export const Breadcrumbs = createHandle<{ label: string; href: string }>();
|
|
264
422
|
|
|
265
|
-
// In
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
423
|
+
// In route definition - use handle() DSL
|
|
424
|
+
import { urls } from "@rangojs/router";
|
|
425
|
+
|
|
426
|
+
export const urlpatterns = urls(({ path, handle }) => [
|
|
427
|
+
path("/shop/product/:slug", ProductPage, { name: "product" }, () => [
|
|
428
|
+
handle(Breadcrumbs, { label: "Products", href: "/shop/products" }),
|
|
429
|
+
]),
|
|
430
|
+
]);
|
|
272
431
|
|
|
273
432
|
// In client - typed array
|
|
274
433
|
function BreadcrumbNav() {
|
|
@@ -277,12 +436,50 @@ function BreadcrumbNav() {
|
|
|
277
436
|
}
|
|
278
437
|
```
|
|
279
438
|
|
|
439
|
+
## Ref Prop Type Safety (Loaders & Handles)
|
|
440
|
+
|
|
441
|
+
Loaders and handles can be passed as props from server to client components.
|
|
442
|
+
Use `typeof` to get the full typed definition without manually specifying generics:
|
|
443
|
+
|
|
444
|
+
```typescript
|
|
445
|
+
// loaders.ts
|
|
446
|
+
export const ProductLoader = createLoader(async (ctx) => {
|
|
447
|
+
return { product: await fetchProduct(ctx.params.slug) };
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
// handles.ts
|
|
451
|
+
export const Breadcrumbs = createHandle<{ label: string; href: string }>();
|
|
452
|
+
|
|
453
|
+
// Client component — typeof infers all generics
|
|
454
|
+
("use client");
|
|
455
|
+
import { useLoader, useHandle } from "@rangojs/router/client";
|
|
456
|
+
import type { ProductLoader } from "../loaders";
|
|
457
|
+
import type { Breadcrumbs } from "../handles";
|
|
458
|
+
|
|
459
|
+
function MyComponent({
|
|
460
|
+
loader,
|
|
461
|
+
handle,
|
|
462
|
+
}: {
|
|
463
|
+
loader: typeof ProductLoader; // LoaderDefinition<{ product: Product }>
|
|
464
|
+
handle: typeof Breadcrumbs; // Handle<{ label: string; href: string }>
|
|
465
|
+
}) {
|
|
466
|
+
const { data } = useLoader(loader); // data is typed
|
|
467
|
+
const crumbs = useHandle(handle); // crumbs is typed array
|
|
468
|
+
// ...
|
|
469
|
+
}
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
RSC Flight serialization calls `toJSON()` on both loaders and handles,
|
|
473
|
+
sending only `{ __brand, $$id }` to the client. The hooks recover the
|
|
474
|
+
full functionality from module-level registries.
|
|
475
|
+
|
|
280
476
|
## Location State Type Safety
|
|
281
477
|
|
|
282
478
|
```typescript
|
|
283
479
|
// location-states.ts
|
|
284
|
-
import { createLocationState } from "
|
|
480
|
+
import { createLocationState } from "@rangojs/router";
|
|
285
481
|
|
|
482
|
+
// All export patterns work: export const, const + export { X }, export { X as Y }
|
|
286
483
|
export const ProductPreview = createLocationState<{
|
|
287
484
|
name: string;
|
|
288
485
|
price: number;
|
|
@@ -291,7 +488,7 @@ export const ProductPreview = createLocationState<{
|
|
|
291
488
|
|
|
292
489
|
// Passing state through Link
|
|
293
490
|
<Link
|
|
294
|
-
to={href("
|
|
491
|
+
to={href("product", { slug: "widget" })}
|
|
295
492
|
state={[ProductPreview({ name: "Widget", price: 99, image: "/img.jpg" })]}
|
|
296
493
|
>
|
|
297
494
|
View Product
|
|
@@ -309,44 +506,116 @@ function ProductHeader() {
|
|
|
309
506
|
}
|
|
310
507
|
```
|
|
311
508
|
|
|
509
|
+
## Multi-Project tsconfig Setup
|
|
510
|
+
|
|
511
|
+
For monorepos or multi-app setups, use a shared base tsconfig. Each app only needs
|
|
512
|
+
to extend the base and add its `router.tsx` to `files` so TypeScript picks up the
|
|
513
|
+
global type declarations (like `RSCRouter.Env`).
|
|
514
|
+
|
|
515
|
+
```jsonc
|
|
516
|
+
// tsconfig.base.json (root)
|
|
517
|
+
{
|
|
518
|
+
"compilerOptions": {
|
|
519
|
+
"target": "ES2022",
|
|
520
|
+
"module": "ESNext",
|
|
521
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
522
|
+
"jsx": "react-jsx",
|
|
523
|
+
"moduleResolution": "bundler",
|
|
524
|
+
"strict": true,
|
|
525
|
+
"noEmit": true,
|
|
526
|
+
"skipLibCheck": true,
|
|
527
|
+
"isolatedModules": true,
|
|
528
|
+
"esModuleInterop": true,
|
|
529
|
+
"resolveJsonModule": true,
|
|
530
|
+
},
|
|
531
|
+
}
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
```jsonc
|
|
535
|
+
// apps/shop/tsconfig.json
|
|
536
|
+
{
|
|
537
|
+
"extends": "../../tsconfig.base.json",
|
|
538
|
+
"include": ["src"],
|
|
539
|
+
"files": ["src/router.tsx"],
|
|
540
|
+
}
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
```jsonc
|
|
544
|
+
// apps/blog/tsconfig.json
|
|
545
|
+
{
|
|
546
|
+
"extends": "../../tsconfig.base.json",
|
|
547
|
+
"include": ["src"],
|
|
548
|
+
"files": ["src/router.tsx"],
|
|
549
|
+
}
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
The `files` array ensures `router.tsx` (which contains `declare global { namespace RSCRouter { interface Env; interface Vars } }`)
|
|
553
|
+
is always included in the compilation even if nothing directly imports it. Route types come from the
|
|
554
|
+
auto-generated `*.named-routes.gen.ts` file (via `rango generate`), not from manual declaration.
|
|
555
|
+
Each app gets its own typed environment without interfering with other apps.
|
|
556
|
+
|
|
312
557
|
## Complete Type-Safe Setup
|
|
313
558
|
|
|
314
559
|
```typescript
|
|
315
560
|
// 1. env.ts - Environment types
|
|
316
|
-
export
|
|
561
|
+
export interface AppBindings {
|
|
562
|
+
DB: D1Database;
|
|
563
|
+
KV: KVNamespace;
|
|
564
|
+
}
|
|
317
565
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
"shop.product": "/products/:slug",
|
|
322
|
-
});
|
|
566
|
+
export interface AppVariables {
|
|
567
|
+
user?: { id: string; email: string; role: string };
|
|
568
|
+
}
|
|
323
569
|
|
|
324
|
-
//
|
|
325
|
-
|
|
326
|
-
.routes(shopRoutes)
|
|
327
|
-
.map(() => import("./handlers/shop"));
|
|
570
|
+
// 2. urls.tsx - Route definitions with names
|
|
571
|
+
import { urls } from "@rangojs/router";
|
|
328
572
|
|
|
329
|
-
|
|
573
|
+
export const urlpatterns = urls(({ path, layout, loader }) => [
|
|
574
|
+
path("/", HomePage, { name: "home" }),
|
|
330
575
|
|
|
576
|
+
layout(<ShopLayout />, () => [
|
|
577
|
+
path("/shop", ShopIndex, { name: "shop" }),
|
|
578
|
+
path("/shop/product/:slug", ProductPage, { name: "product" }, () => [
|
|
579
|
+
loader(ProductLoader),
|
|
580
|
+
]),
|
|
581
|
+
]),
|
|
582
|
+
]);
|
|
583
|
+
|
|
584
|
+
// 3. router.tsx - Create router and export reverse
|
|
585
|
+
const router = createRouter<AppBindings>({
|
|
586
|
+
document: Document,
|
|
587
|
+
}).routes(urlpatterns);
|
|
588
|
+
|
|
589
|
+
// Register bindings and variables globally for implicit typing
|
|
331
590
|
declare global {
|
|
332
591
|
namespace RSCRouter {
|
|
333
|
-
interface
|
|
334
|
-
interface
|
|
592
|
+
interface Env extends AppBindings {}
|
|
593
|
+
interface Vars extends AppVariables {}
|
|
335
594
|
}
|
|
336
595
|
}
|
|
337
596
|
|
|
338
|
-
export
|
|
339
|
-
export
|
|
597
|
+
export const reverse = router.reverse;
|
|
598
|
+
export default router;
|
|
340
599
|
|
|
341
|
-
// 4.
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
}
|
|
348
|
-
|
|
600
|
+
// 4. Run `npx rango generate src/router.tsx` to generate
|
|
601
|
+
// router.named-routes.gen.ts (auto-registers GeneratedRouteMap globally).
|
|
602
|
+
// No manual RegisteredRoutes declaration needed.
|
|
603
|
+
|
|
604
|
+
// 5. loaders/*.ts - Type-safe loaders
|
|
605
|
+
export const ProductLoader = createLoader(async (ctx) => {
|
|
606
|
+
// ctx.params: { slug: string }
|
|
607
|
+
// ctx.get("user"): User | undefined (from RSCRouter.Vars)
|
|
608
|
+
// ctx.env.DB: D1Database (plain bindings from RSCRouter.Env)
|
|
609
|
+
return { product: await fetchProduct(ctx.params.slug) };
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
// 6. Server: ctx.reverse for named routes
|
|
613
|
+
path("/product/:slug", (ctx) => {
|
|
614
|
+
return <Link to={ctx.reverse("shop")}>Back to Shop</Link>;
|
|
615
|
+
}, { name: "product" })
|
|
349
616
|
|
|
350
|
-
//
|
|
351
|
-
|
|
617
|
+
// 7. Client: useHref for mounted paths, href for absolute
|
|
618
|
+
"use client";
|
|
619
|
+
import { useHref, href, Link } from "@rangojs/router/client";
|
|
620
|
+
<Link to={href("/shop/product/widget")}>Widget</Link>
|
|
352
621
|
```
|