@rangojs/router 0.0.0-experimental.9 → 0.0.0-experimental.90
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 +972 -4
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +1619 -155
- 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 +5565 -2291
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +64 -56
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/cache-guide/SKILL.md +294 -0
- package/skills/caching/SKILL.md +93 -23
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +18 -16
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +362 -0
- package/skills/hooks/SKILL.md +341 -71
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +151 -8
- package/skills/layout/SKILL.md +122 -3
- package/skills/links/SKILL.md +158 -25
- package/skills/loader/SKILL.md +439 -46
- package/skills/middleware/SKILL.md +205 -37
- package/skills/migrate-nextjs/SKILL.md +560 -0
- package/skills/migrate-react-router/SKILL.md +765 -0
- package/skills/mime-routes/SKILL.md +15 -11
- package/skills/parallel/SKILL.md +263 -1
- package/skills/prerender/SKILL.md +467 -65
- package/skills/rango/SKILL.md +87 -21
- package/skills/response-routes/SKILL.md +152 -91
- package/skills/route/SKILL.md +281 -14
- package/skills/router-setup/SKILL.md +210 -32
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +327 -86
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +92 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +367 -561
- package/src/browser/navigation-client.ts +228 -70
- package/src/browser/navigation-store.ts +97 -55
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +362 -316
- package/src/browser/prefetch/cache.ts +314 -0
- package/src/browser/prefetch/fetch.ts +282 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +191 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +152 -0
- package/src/browser/react/Link.tsx +255 -71
- package/src/browser/react/NavigationProvider.tsx +132 -17
- package/src/browser/react/context.ts +11 -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 +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +30 -120
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +44 -65
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +83 -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 +246 -64
- package/src/browser/scroll-restoration.ts +127 -52
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +16 -0
- package/src/browser/server-action-bridge.ts +510 -603
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +152 -48
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +84 -23
- package/src/build/generate-route-types.ts +39 -752
- package/src/build/index.ts +6 -5
- package/src/build/route-trie.ts +83 -31
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +618 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +342 -0
- package/src/cache/cache-scope.ts +167 -307
- package/src/cache/cf/cf-cache-store.ts +573 -21
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +191 -13
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +72 -122
- package/src/client.rsc.tsx +3 -1
- package/src/client.tsx +113 -301
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +156 -0
- package/src/debug.ts +19 -9
- package/src/errors.ts +77 -7
- package/src/handle.ts +55 -10
- package/src/handles/MetaTags.tsx +73 -20
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +30 -13
- package/src/host/cookie-handler.ts +21 -15
- package/src/host/errors.ts +8 -8
- package/src/host/index.ts +4 -7
- package/src/host/pattern-matcher.ts +27 -27
- package/src/host/router.ts +61 -39
- package/src/host/testing.ts +8 -8
- package/src/host/types.ts +15 -7
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +65 -45
- package/src/index.rsc.ts +138 -21
- package/src/index.ts +206 -51
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +25 -143
- package/src/loader.ts +27 -10
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +4 -2
- package/src/prerender/store.ts +159 -13
- package/src/prerender.ts +397 -29
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +209 -121
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +7 -4
- package/src/route-definition/dsl-helpers.ts +1134 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +478 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +101 -0
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-definition.ts +1 -1431
- package/src/route-map-builder.ts +162 -123
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +66 -9
- package/src/router/content-negotiation.ts +215 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +160 -0
- package/src/router/handler-context.ts +455 -86
- package/src/router/intercept-resolution.ts +35 -20
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +359 -128
- package/src/router/logging.ts +251 -0
- package/src/router/manifest.ts +98 -32
- package/src/router/match-api.ts +195 -261
- package/src/router/match-context.ts +4 -2
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +108 -93
- package/src/router/match-middleware/cache-lookup.ts +415 -86
- package/src/router/match-middleware/cache-store.ts +91 -29
- package/src/router/match-middleware/intercept-resolution.ts +48 -21
- package/src/router/match-middleware/segment-resolution.ts +73 -9
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +135 -35
- package/src/router/metrics.ts +240 -15
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +200 -0
- package/src/router/middleware.ts +373 -371
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +251 -44
- package/src/router/prerender-match.ts +502 -0
- package/src/router/preview-match.ts +98 -0
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +137 -38
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +41 -21
- package/src/router/router-interfaces.ts +484 -0
- package/src/router/router-options.ts +618 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +748 -0
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1379 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -1315
- package/src/router/segment-wrappers.ts +291 -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 +103 -30
- package/src/router/types.ts +17 -9
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +647 -1988
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +864 -1114
- package/src/rsc/helpers.ts +181 -19
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +229 -0
- package/src/rsc/manifest-init.ts +90 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +393 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +360 -0
- package/src/rsc/rsc-rendering.ts +253 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +358 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +46 -11
- package/src/search-params.ts +230 -0
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +134 -36
- package/src/server/context.ts +333 -59
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +113 -15
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +603 -109
- package/src/server.ts +35 -155
- package/src/ssr/index.tsx +103 -30
- package/src/static-handler.ts +126 -0
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +5 -2
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +4 -30
- package/src/theme/theme-script.ts +21 -18
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +100 -0
- package/src/types/handler-context.ts +759 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +209 -0
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +120 -0
- package/src/types/segments.ts +150 -0
- package/src/types.ts +1 -1757
- package/src/urls/include-helper.ts +207 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +372 -0
- package/src/urls/path-helper.ts +364 -0
- package/src/urls/pattern-types.ts +107 -0
- package/src/urls/response-types.ts +108 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -1282
- package/src/use-loader.tsx +161 -81
- package/src/vite/debug.ts +184 -0
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +376 -0
- package/src/vite/discovery/prerender-collection.ts +486 -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 +117 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +15 -1963
- package/src/vite/plugin-types.ts +103 -0
- package/src/vite/plugins/cjs-to-esm.ts +98 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +117 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +107 -64
- package/src/vite/plugins/expose-id-utils.ts +299 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +209 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +816 -0
- package/src/vite/plugins/performance-tracks.ts +96 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +336 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +266 -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 +497 -0
- package/src/vite/router-discovery.ts +1111 -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/utils/package-resolution.ts +161 -0
- package/src/vite/utils/prerender-utils.ts +221 -0
- package/src/vite/utils/shared-utils.ts +170 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -426
- package/src/vite/expose-location-state-id.ts +0 -177
- package/src/vite/expose-prerender-handler-id.ts +0 -429
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -1,8 +1,31 @@
|
|
|
1
1
|
# @rangojs/router
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Named-route RSC router with structural composability and type-safe partial rendering for Vite.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
> **Experimental:** This package is under active development. APIs may change between releases. Install with `@experimental` tag.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Named routes** — `reverse("blogPost", { slug })` for type-safe URL generation (Django-style)
|
|
10
|
+
- **Structural composability** — Attach routes, loaders, middleware, handles, caching, prerendering, and static generation without hiding the route tree
|
|
11
|
+
- **Composable URL patterns** — Django-style `urls()` DSL with `path`, `layout`, `include`
|
|
12
|
+
- **Data loaders** — `createLoader()` with automatic streaming and Suspense integration
|
|
13
|
+
- **Live data layer** — Pre-render or cache the UI shell while loaders stay live by default at request time
|
|
14
|
+
- **Layouts & nesting** — Nested layouts with `<Outlet />` and parallel routes
|
|
15
|
+
- **Segment-level caching** — `cache()` DSL with TTL/SWR and pluggable cache stores
|
|
16
|
+
- **Middleware** — Route-level middleware with cookie and header access
|
|
17
|
+
- **Pre-rendering** — `Prerender()` and `Static()` handlers for build-time rendering
|
|
18
|
+
- **Theme support** — Light/dark mode with FOUC prevention and system detection
|
|
19
|
+
- **Host routing** — Multi-app routing by domain/subdomain via `@rangojs/router/host`
|
|
20
|
+
- **Response routes** — `path.json()`, `path.text()`, `path.xml()` for API endpoints
|
|
21
|
+
- **Trailing slash control** — Per-route canonical URLs with `"never"`, `"always"`, or `"ignore"`
|
|
22
|
+
- **CLI codegen** — `rango generate` for route type generation
|
|
23
|
+
|
|
24
|
+
## Design Docs
|
|
25
|
+
|
|
26
|
+
- [Execution model](./docs/internal/execution-model.md)
|
|
27
|
+
- [Semantic change checklist](./docs/internal/semantic-change-checklist.md)
|
|
28
|
+
- [Stability roadmap](./docs/internal/stability-roadmap.md)
|
|
6
29
|
|
|
7
30
|
## Installation
|
|
8
31
|
|
|
@@ -10,9 +33,954 @@ Type-safe RSC router with partial rendering support for Vite.
|
|
|
10
33
|
npm install @rangojs/router@experimental
|
|
11
34
|
```
|
|
12
35
|
|
|
13
|
-
|
|
36
|
+
Peer dependencies:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm install react @vitejs/plugin-rsc
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
For Cloudflare Workers:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npm install @cloudflare/vite-plugin
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Import Paths
|
|
49
|
+
|
|
50
|
+
Use these import paths consistently:
|
|
51
|
+
|
|
52
|
+
- `@rangojs/router` — server/RSC router APIs, route DSL, `createRouter`, `urls`, `redirect`, `Prerender`, `Static`, shared types
|
|
53
|
+
- `@rangojs/router/client` — hooks and components such as `Link`, `Outlet`, `href`, `useNavigation`, `useLoader`, `useAction`, `useLocationState`
|
|
54
|
+
- `@rangojs/router/cache` — public cache APIs such as `CFCacheStore`, `MemorySegmentCacheStore`, `createDocumentCacheMiddleware`
|
|
55
|
+
- `@rangojs/router/host`, `@rangojs/router/theme`, `@rangojs/router/vite` — specialized public subpaths
|
|
56
|
+
- `@rangojs/router/rsc`, `@rangojs/router/ssr` — advanced server-only integration subpaths for custom request/HTML pipelines
|
|
57
|
+
|
|
58
|
+
Use only subpaths that are explicitly exported from the package. Avoid deep imports such as `@rangojs/router/cache/cf`.
|
|
59
|
+
|
|
60
|
+
`@rangojs/router` is conditionally resolved. Server-only root APIs such as
|
|
61
|
+
`createRouter()`, `urls()`, `redirect()`, `Prerender()`, and `cookies()` rely on
|
|
62
|
+
the `react-server` export condition and are meant to run in router definitions,
|
|
63
|
+
handlers, and other RSC/server modules. Outside that environment the root entry
|
|
64
|
+
falls back to stub implementations that throw guidance errors.
|
|
65
|
+
|
|
66
|
+
If you hit a root-entrypoint stub error:
|
|
67
|
+
|
|
68
|
+
- hooks and components like `Link`, `Outlet`, `useLoader`, `useNavigation`, and `MetaTags` belong in `@rangojs/router/client`
|
|
69
|
+
- cache APIs like `CFCacheStore` and `createDocumentCacheMiddleware` belong in `@rangojs/router/cache`
|
|
70
|
+
- host-router APIs belong in `@rangojs/router/host`
|
|
71
|
+
|
|
72
|
+
## Quick Start
|
|
73
|
+
|
|
74
|
+
### Vite Config
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
// vite.config.ts
|
|
78
|
+
import react from "@vitejs/plugin-react";
|
|
79
|
+
import { defineConfig } from "vite";
|
|
80
|
+
import { rango } from "@rangojs/router/vite";
|
|
81
|
+
|
|
82
|
+
export default defineConfig({
|
|
83
|
+
plugins: [react(), rango({ preset: "cloudflare" })],
|
|
84
|
+
});
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Router
|
|
88
|
+
|
|
89
|
+
This file is a server/RSC module and should import router construction APIs from
|
|
90
|
+
`@rangojs/router`.
|
|
91
|
+
|
|
92
|
+
```tsx
|
|
93
|
+
// src/router.tsx
|
|
94
|
+
import { createRouter } from "@rangojs/router";
|
|
95
|
+
|
|
96
|
+
export const router = createRouter().routes(({ path }) => [
|
|
97
|
+
path("/", HomePage, { name: "home" }),
|
|
98
|
+
path("/about", AboutPage, { name: "about" }),
|
|
99
|
+
]);
|
|
100
|
+
|
|
101
|
+
export const reverse = router.reverse;
|
|
102
|
+
// reverse("home") -> "/"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
For larger apps, extract route modules with `urls()` and compose with `include()`:
|
|
106
|
+
|
|
107
|
+
```tsx
|
|
108
|
+
import { createRouter, urls } from "@rangojs/router";
|
|
109
|
+
import { blogPatterns } from "./urls/blog";
|
|
110
|
+
|
|
111
|
+
const urlpatterns = urls(({ path, include }) => [
|
|
112
|
+
path("/", HomePage, { name: "home" }),
|
|
113
|
+
include("/blog", blogPatterns, { name: "blog" }),
|
|
114
|
+
]);
|
|
115
|
+
|
|
116
|
+
export const router = createRouter().routes(urlpatterns);
|
|
117
|
+
// reverse("blog.post", { slug: "hello-world" }) -> "/blog/hello-world"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Document
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
// src/document.tsx
|
|
124
|
+
"use client";
|
|
125
|
+
|
|
126
|
+
import type { ReactNode } from "react";
|
|
127
|
+
import { MetaTags } from "@rangojs/router/client";
|
|
128
|
+
|
|
129
|
+
export function Document({ children }: { children: ReactNode }) {
|
|
130
|
+
return (
|
|
131
|
+
<html lang="en">
|
|
132
|
+
<head>
|
|
133
|
+
<MetaTags />
|
|
134
|
+
</head>
|
|
135
|
+
<body>{children}</body>
|
|
136
|
+
</html>
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Defining Routes
|
|
142
|
+
|
|
143
|
+
Rango is a named-route router first.
|
|
144
|
+
|
|
145
|
+
Paths define where a route lives. Names define how the app refers to it.
|
|
146
|
+
|
|
147
|
+
It is also structurally composable.
|
|
148
|
+
|
|
149
|
+
As an app grows, routes can pull in external handlers, loaders, middleware, handles, cache policy, intercepts, prerendering, and static generation while keeping the route tree visible at the composition site.
|
|
150
|
+
|
|
151
|
+
### Named Routes
|
|
152
|
+
|
|
153
|
+
```tsx
|
|
154
|
+
import { urls } from "@rangojs/router";
|
|
155
|
+
|
|
156
|
+
const urlpatterns = urls(({ path }) => [
|
|
157
|
+
path("/", HomePage, { name: "home" }),
|
|
158
|
+
path("/product/:slug", ProductPage, { name: "product" }),
|
|
159
|
+
path("/search/:query?", SearchPage, { name: "search" }),
|
|
160
|
+
path("/files/*", FilesPage, { name: "files" }),
|
|
161
|
+
]);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Use `ctx.reverse()` from handler context as the default way to link to routes from server code:
|
|
165
|
+
|
|
166
|
+
```tsx
|
|
167
|
+
const ProductPage: Handler<"product"> = (ctx) => {
|
|
168
|
+
const url = ctx.reverse("product", { slug: "widget" }); // "/product/widget"
|
|
169
|
+
const searchUrl = ctx.reverse("search", undefined, { q: "rsc" }); // "/search?q=rsc"
|
|
170
|
+
return <Link to={url}>Widget</Link>;
|
|
171
|
+
};
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
`router.reverse()` (exported from the router module) is the same function without a handler context, useful in scripts or tests. In request code, prefer `ctx.reverse()` — it auto-fills mount params from the current match.
|
|
175
|
+
|
|
176
|
+
### Composable URL Modules
|
|
177
|
+
|
|
178
|
+
Local route names compose cleanly with `include(..., { name })`:
|
|
179
|
+
|
|
180
|
+
```tsx
|
|
181
|
+
import { urls } from "@rangojs/router";
|
|
182
|
+
|
|
183
|
+
export const blogPatterns = urls(({ path }) => [
|
|
184
|
+
path("/", BlogIndexPage, { name: "index" }),
|
|
185
|
+
path("/:slug", BlogPostPage, { name: "post" }),
|
|
186
|
+
]);
|
|
187
|
+
|
|
188
|
+
export const urlpatterns = urls(({ path, include }) => [
|
|
189
|
+
path("/", HomePage, { name: "home" }),
|
|
190
|
+
include("/blog", blogPatterns, { name: "blog" }),
|
|
191
|
+
]);
|
|
192
|
+
|
|
193
|
+
router.reverse("blog.index"); // "/blog"
|
|
194
|
+
router.reverse("blog.post", { slug: "hello-world" }); // "/blog/hello-world"
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
This is the core composition model:
|
|
198
|
+
|
|
199
|
+
- Paths stay local to the module that defines them
|
|
200
|
+
- Names become stable references across the app
|
|
201
|
+
- `include()` scales those names without forcing raw path-string coupling
|
|
202
|
+
|
|
203
|
+
### Structural Composability
|
|
204
|
+
|
|
205
|
+
Rango avoids the usual tradeoff between modularity and visibility.
|
|
206
|
+
|
|
207
|
+
You can extract route behavior into separate files or packages and still keep one readable route definition that shows the structure of the app.
|
|
208
|
+
|
|
209
|
+
```tsx
|
|
210
|
+
import { urls } from "@rangojs/router";
|
|
211
|
+
import { ProductPage } from "./routes/product";
|
|
212
|
+
import { ProductLoader } from "./loaders/product";
|
|
213
|
+
import { productMiddleware } from "./middleware/product";
|
|
214
|
+
import { productRevalidate } from "./revalidation/product";
|
|
215
|
+
|
|
216
|
+
const shopPatterns = urls(({ path, loader, middleware, revalidate, cache }) => [
|
|
217
|
+
path("/product/:slug", ProductPage, { name: "product" }, () => [
|
|
218
|
+
middleware(productMiddleware),
|
|
219
|
+
loader(ProductLoader),
|
|
220
|
+
revalidate(productRevalidate),
|
|
221
|
+
cache({ ttl: 300 }),
|
|
222
|
+
]),
|
|
223
|
+
]);
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
The route tree stays explicit even when behavior is modular.
|
|
227
|
+
|
|
228
|
+
This applies to:
|
|
229
|
+
|
|
230
|
+
- external route modules mounted with `include()`
|
|
231
|
+
- imported loaders, middleware, and handles attached at the route site
|
|
232
|
+
- prerendering and static generation attached without turning the route tree opaque
|
|
233
|
+
|
|
234
|
+
### Loaders As the Live Data Layer
|
|
235
|
+
|
|
236
|
+
Rango separates app structure from app data.
|
|
237
|
+
|
|
238
|
+
Routes, layouts, and pre-rendered segments can be static or cached, while
|
|
239
|
+
loaders stay live by default and re-resolve at request time.
|
|
240
|
+
|
|
241
|
+
This means you can pre-render or cache the shell of a page without freezing its
|
|
242
|
+
data.
|
|
243
|
+
|
|
244
|
+
- `cache()` caches route structure and rendered UI segments
|
|
245
|
+
- `Prerender()` skips loaders at build time
|
|
246
|
+
- `loader()` provides fresh request-time data
|
|
247
|
+
- individual loaders can opt into caching explicitly when needed
|
|
248
|
+
|
|
249
|
+
```tsx
|
|
250
|
+
import { urls, Prerender } from "@rangojs/router";
|
|
251
|
+
import { ArticleLoader } from "./loaders/article";
|
|
252
|
+
|
|
253
|
+
const docsPatterns = urls(({ path, loader }) => [
|
|
254
|
+
path("/docs/:slug", Prerender(DocsArticle), { name: "docs.article" }, () => [
|
|
255
|
+
loader(ArticleLoader), // fresh by default
|
|
256
|
+
]),
|
|
257
|
+
]);
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Pre-render the page, keep the data live.
|
|
261
|
+
|
|
262
|
+
### Typed Handlers
|
|
263
|
+
|
|
264
|
+
Route handlers receive a typed context with params, search params, and `reverse()`:
|
|
265
|
+
|
|
266
|
+
```tsx
|
|
267
|
+
import type { Handler } from "@rangojs/router";
|
|
268
|
+
|
|
269
|
+
export const ProductPage: Handler<"product"> = (ctx) => {
|
|
270
|
+
const { slug } = ctx.params; // typed from pattern
|
|
271
|
+
const homeUrl = ctx.reverse("home"); // type-safe URL by route name
|
|
272
|
+
return <h1>Product: {slug}</h1>;
|
|
273
|
+
};
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Choosing a Handler Style
|
|
277
|
+
|
|
278
|
+
All handler typing styles are supported, but they solve different problems:
|
|
279
|
+
|
|
280
|
+
- `Handler<"product">` — default for named app routes
|
|
281
|
+
- `Handler<".post", ScopedRouteMap<"blog">>` — best for reusable included modules
|
|
282
|
+
- `Handler<"/blog/:slug">` — good for unnamed or local-only extracted handlers
|
|
283
|
+
- `Handler<{ slug: string }>` — escape hatch for advanced or decoupled cases
|
|
284
|
+
|
|
285
|
+
Example of a scoped local name inside a mounted module:
|
|
286
|
+
|
|
287
|
+
```tsx
|
|
288
|
+
import type { Handler } from "@rangojs/router";
|
|
289
|
+
import type { ScopedRouteMap } from "@rangojs/router/__internal";
|
|
290
|
+
|
|
291
|
+
type BlogRoutes = ScopedRouteMap<"blog">;
|
|
292
|
+
|
|
293
|
+
export const BlogPostPage: Handler<".post", BlogRoutes> = (ctx) => {
|
|
294
|
+
return <a href={ctx.reverse(".index")}>Back to blog</a>;
|
|
295
|
+
};
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
See [`../../docs/named-routes.md`](../../docs/named-routes.md) for the recommended mental model.
|
|
299
|
+
|
|
300
|
+
### Search Params
|
|
301
|
+
|
|
302
|
+
Define a search schema on the route for type-safe search parameters:
|
|
303
|
+
|
|
304
|
+
```tsx
|
|
305
|
+
const urlpatterns = urls(({ path }) => [
|
|
306
|
+
path("/search", SearchPage, {
|
|
307
|
+
name: "search",
|
|
308
|
+
search: { q: "string", page: "number?", sort: "string?" },
|
|
309
|
+
}),
|
|
310
|
+
]);
|
|
311
|
+
|
|
312
|
+
// Handler receives typed search params via ctx.search
|
|
313
|
+
const SearchPage: Handler<"search"> = (ctx) => {
|
|
314
|
+
const { q, page, sort } = ctx.search;
|
|
315
|
+
// q: string, page: number | undefined, sort: string | undefined
|
|
316
|
+
};
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Trailing Slash Handling
|
|
320
|
+
|
|
321
|
+
Trailing slash behavior is a current `path()` feature.
|
|
322
|
+
|
|
323
|
+
Set it per route with `trailingSlash`:
|
|
324
|
+
|
|
325
|
+
```tsx
|
|
326
|
+
const urlpatterns = urls(({ path }) => [
|
|
327
|
+
path("/about", AboutPage, {
|
|
328
|
+
name: "about",
|
|
329
|
+
trailingSlash: "never",
|
|
330
|
+
}),
|
|
331
|
+
path("/docs/", DocsPage, {
|
|
332
|
+
name: "docs",
|
|
333
|
+
trailingSlash: "always",
|
|
334
|
+
}),
|
|
335
|
+
path("/webhook", WebhookHandler, {
|
|
336
|
+
name: "webhook",
|
|
337
|
+
trailingSlash: "ignore",
|
|
338
|
+
}),
|
|
339
|
+
]);
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Modes:
|
|
343
|
+
|
|
344
|
+
- `"never"` — canonical URL has no trailing slash, redirects `/about/` to `/about`
|
|
345
|
+
- `"always"` — canonical URL has a trailing slash, redirects `/docs` to `/docs/`
|
|
346
|
+
- `"ignore"` — matches both forms without redirect
|
|
347
|
+
|
|
348
|
+
Default behavior when `trailingSlash` is omitted:
|
|
349
|
+
|
|
350
|
+
- There is no separate global default mode
|
|
351
|
+
- If the pattern is defined without a trailing slash, the canonical URL is the no-slash form
|
|
352
|
+
- If the pattern is defined with a trailing slash, the canonical URL is the slash form
|
|
353
|
+
- The router redirects to the canonical form based on the pattern you defined
|
|
354
|
+
|
|
355
|
+
The recommended public API is the per-route `path(..., { trailingSlash })` option. Use `"ignore"` sparingly, especially on content pages, because `/x` and `/x/` are distinct URLs.
|
|
356
|
+
|
|
357
|
+
### Response Routes
|
|
358
|
+
|
|
359
|
+
Define API endpoints that bypass the RSC pipeline:
|
|
360
|
+
|
|
361
|
+
```tsx
|
|
362
|
+
const urlpatterns = urls(({ path }) => [
|
|
363
|
+
path.json("/api/health", () => ({ status: "ok" }), { name: "health" }),
|
|
364
|
+
path.text("/robots.txt", () => "User-agent: *\nAllow: /", { name: "robots" }),
|
|
365
|
+
path.xml("/feed.xml", () => "<rss>...</rss>", { name: "feed" }),
|
|
366
|
+
]);
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
Response types available: `path.json()`, `path.text()`, `path.html()`, `path.xml()`, `path.image()`, `path.stream()`, `path.any()`.
|
|
370
|
+
|
|
371
|
+
## Layouts & Nesting
|
|
372
|
+
|
|
373
|
+
### Layouts with Outlet
|
|
374
|
+
|
|
375
|
+
```tsx
|
|
376
|
+
import { urls } from "@rangojs/router";
|
|
377
|
+
|
|
378
|
+
const urlpatterns = urls(({ path, layout }) => [
|
|
379
|
+
layout(<MainLayout />, () => [
|
|
380
|
+
path("/", HomePage, { name: "home" }),
|
|
381
|
+
path("/about", AboutPage, { name: "about" }),
|
|
382
|
+
]),
|
|
383
|
+
]);
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
```tsx
|
|
387
|
+
"use client";
|
|
388
|
+
import { Outlet } from "@rangojs/router/client";
|
|
389
|
+
|
|
390
|
+
function MainLayout() {
|
|
391
|
+
return (
|
|
392
|
+
<div>
|
|
393
|
+
<nav>...</nav>
|
|
394
|
+
<Outlet />
|
|
395
|
+
</div>
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### Loading Skeletons
|
|
401
|
+
|
|
402
|
+
```tsx
|
|
403
|
+
const urlpatterns = urls(({ path, loading }) => [
|
|
404
|
+
path("/product/:slug", ProductPage, { name: "product" }, () => [
|
|
405
|
+
loading(<ProductSkeleton />),
|
|
406
|
+
]),
|
|
407
|
+
]);
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### Parallel Routes
|
|
411
|
+
|
|
412
|
+
```tsx
|
|
413
|
+
const urlpatterns = urls(({ path, layout, parallel, loader, loading }) => [
|
|
414
|
+
layout(BlogLayout, () => [
|
|
415
|
+
parallel({ "@sidebar": BlogSidebarHandler }, () => [
|
|
416
|
+
loader(BlogSidebarLoader),
|
|
417
|
+
loading(<SidebarSkeleton />),
|
|
418
|
+
]),
|
|
419
|
+
path("/blog", BlogIndexPage, { name: "blog" }),
|
|
420
|
+
path("/blog/:slug", BlogPostPage, { name: "blogPost" }),
|
|
421
|
+
]),
|
|
422
|
+
]);
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
## Data Loaders
|
|
426
|
+
|
|
427
|
+
### Creating a Loader
|
|
428
|
+
|
|
429
|
+
```tsx
|
|
430
|
+
import { createLoader } from "@rangojs/router";
|
|
431
|
+
|
|
432
|
+
export const BlogSidebarLoader = createLoader(async (ctx) => {
|
|
433
|
+
const posts = await db.getRecentPosts();
|
|
434
|
+
return { posts, loadedAt: new Date().toISOString() };
|
|
435
|
+
});
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### Using in Server Components (Handlers)
|
|
439
|
+
|
|
440
|
+
```tsx
|
|
441
|
+
import type { HandlerContext } from "@rangojs/router";
|
|
442
|
+
import { BlogSidebarLoader } from "./loaders/blog";
|
|
443
|
+
|
|
444
|
+
async function BlogSidebarHandler(ctx: HandlerContext) {
|
|
445
|
+
const { posts } = await ctx.use(BlogSidebarLoader);
|
|
446
|
+
return (
|
|
447
|
+
<ul>
|
|
448
|
+
{posts.map((p) => (
|
|
449
|
+
<li key={p.slug}>{p.title}</li>
|
|
450
|
+
))}
|
|
451
|
+
</ul>
|
|
452
|
+
);
|
|
453
|
+
}
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
### Using in Client Components
|
|
457
|
+
|
|
458
|
+
```tsx
|
|
459
|
+
"use client";
|
|
460
|
+
import { useLoader } from "@rangojs/router/client";
|
|
461
|
+
import { BlogSidebarLoader } from "./loaders/blog";
|
|
462
|
+
|
|
463
|
+
function BlogSidebar() {
|
|
464
|
+
const { data } = useLoader(BlogSidebarLoader);
|
|
465
|
+
return (
|
|
466
|
+
<ul>
|
|
467
|
+
{data.posts.map((p) => (
|
|
468
|
+
<li key={p.slug}>{p.title}</li>
|
|
469
|
+
))}
|
|
470
|
+
</ul>
|
|
471
|
+
);
|
|
472
|
+
}
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
### Attaching Loaders to Routes
|
|
476
|
+
|
|
477
|
+
```tsx
|
|
478
|
+
const urlpatterns = urls(({ path, loader }) => [
|
|
479
|
+
path("/blog", BlogIndexPage, { name: "blog" }, () => [
|
|
480
|
+
loader(BlogSidebarLoader),
|
|
481
|
+
]),
|
|
482
|
+
]);
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
## Navigation & Links
|
|
486
|
+
|
|
487
|
+
### Named Routes with `ctx.reverse()` (Server)
|
|
488
|
+
|
|
489
|
+
In server components and handlers, use `ctx.reverse()` to generate URLs by route name. This is the default — it is typed, auto-fills mount params from the current match, and resolves both local (`.name`) and absolute (`name.sub`) names:
|
|
490
|
+
|
|
491
|
+
```tsx
|
|
492
|
+
import { Link } from "@rangojs/router/client";
|
|
493
|
+
import type { Handler } from "@rangojs/router";
|
|
494
|
+
|
|
495
|
+
const BlogPostPage: Handler<"blogPost"> = (ctx) => {
|
|
496
|
+
const backUrl = ctx.reverse("blog");
|
|
497
|
+
return <Link to={backUrl}>Back to blog</Link>;
|
|
498
|
+
};
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
`reverse()` is type-safe — route names and required params are checked at compile time. Included routes use dotted names: `ctx.reverse("api.health")`.
|
|
502
|
+
|
|
503
|
+
For scripts, tests, or other code without a handler context, import the router-level `reverse`:
|
|
504
|
+
|
|
505
|
+
```tsx
|
|
506
|
+
import { reverse } from "./router";
|
|
507
|
+
reverse("blogPost", { slug: "my-post" });
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
### Client Components
|
|
511
|
+
|
|
512
|
+
**`reverse()` is server-only.** It depends on the route manifest and handler context — neither is available in the browser bundle. Client components receive URLs as props, loader data, or server-action return values:
|
|
513
|
+
|
|
514
|
+
```tsx
|
|
515
|
+
// server
|
|
516
|
+
function BlogIndex(ctx: HandlerContext) {
|
|
517
|
+
return (
|
|
518
|
+
<Nav
|
|
519
|
+
home={ctx.reverse("home")}
|
|
520
|
+
post={ctx.reverse("blogPost", { slug: "my-post" })}
|
|
521
|
+
/>
|
|
522
|
+
);
|
|
523
|
+
}
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
```tsx
|
|
527
|
+
"use client";
|
|
528
|
+
import { Link } from "@rangojs/router/client";
|
|
529
|
+
|
|
530
|
+
export function Nav({ home, post }: { home: string; post: string }) {
|
|
531
|
+
return (
|
|
532
|
+
<nav>
|
|
533
|
+
<Link to={home}>Home</Link>
|
|
534
|
+
<Link to={post}>My Post</Link>
|
|
535
|
+
</nav>
|
|
536
|
+
);
|
|
537
|
+
}
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
For client-side navigation to static paths (no named-route lookup), use `href()` — see below. For URLs tied to named routes, always generate on the server and pass the string in.
|
|
541
|
+
|
|
542
|
+
### `href()` for Path Validation (Client Components)
|
|
543
|
+
|
|
544
|
+
In client components, use `href()` for compile-time path validation on static path strings:
|
|
545
|
+
|
|
546
|
+
```tsx
|
|
547
|
+
"use client";
|
|
548
|
+
import { Link, href } from "@rangojs/router/client";
|
|
549
|
+
|
|
550
|
+
function Nav() {
|
|
551
|
+
return (
|
|
552
|
+
<nav>
|
|
553
|
+
<Link to={href("/")}>Home</Link>
|
|
554
|
+
<Link to={href("/blog")} prefetch="adaptive">
|
|
555
|
+
Blog
|
|
556
|
+
</Link>
|
|
557
|
+
<Link to={href("/about")}>About</Link>
|
|
558
|
+
</nav>
|
|
559
|
+
);
|
|
560
|
+
}
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
`href()` validates that the path matches a registered route pattern at compile time (e.g. `/blog/my-post` matches `/blog/:slug`).
|
|
564
|
+
|
|
565
|
+
### Navigation Hooks
|
|
566
|
+
|
|
567
|
+
```tsx
|
|
568
|
+
"use client";
|
|
569
|
+
import { useNavigation, useRouter } from "@rangojs/router/client";
|
|
570
|
+
|
|
571
|
+
function SearchForm() {
|
|
572
|
+
const router = useRouter();
|
|
573
|
+
const nav = useNavigation();
|
|
574
|
+
|
|
575
|
+
function handleSubmit(query: string) {
|
|
576
|
+
router.push(`/search?q=${encodeURIComponent(query)}`);
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
return <form onSubmit={...}>{nav.state !== "idle" && <Spinner />}</form>;
|
|
580
|
+
}
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
### Scroll Restoration
|
|
584
|
+
|
|
585
|
+
```tsx
|
|
586
|
+
"use client";
|
|
587
|
+
import { ScrollRestoration } from "@rangojs/router/client";
|
|
588
|
+
|
|
589
|
+
function Document({ children }) {
|
|
590
|
+
return (
|
|
591
|
+
<html>
|
|
592
|
+
<body>
|
|
593
|
+
{children}
|
|
594
|
+
<ScrollRestoration />
|
|
595
|
+
</body>
|
|
596
|
+
</html>
|
|
597
|
+
);
|
|
598
|
+
}
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
## Includes (Composable Modules)
|
|
602
|
+
|
|
603
|
+
Split URL patterns into composable modules with `include()`:
|
|
604
|
+
|
|
605
|
+
```tsx
|
|
606
|
+
// src/api/urls.tsx
|
|
607
|
+
import { urls } from "@rangojs/router";
|
|
608
|
+
|
|
609
|
+
export const apiPatterns = urls(({ path }) => [
|
|
610
|
+
path.json("/health", () => ({ status: "ok" }), { name: "health" }),
|
|
611
|
+
path.json("/products", getProducts, { name: "products" }),
|
|
612
|
+
]);
|
|
613
|
+
|
|
614
|
+
// src/urls.tsx
|
|
615
|
+
import { urls } from "@rangojs/router";
|
|
616
|
+
import { apiPatterns } from "./api/urls";
|
|
617
|
+
|
|
618
|
+
export const urlpatterns = urls(({ path, include }) => [
|
|
619
|
+
path("/", HomePage, { name: "home" }),
|
|
620
|
+
include("/api", apiPatterns, { name: "api" }),
|
|
621
|
+
// Mounts apiPatterns under /api: /api/health, /api/products
|
|
622
|
+
]);
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
Included route names are prefixed with the include name: `reverse("api.health")`, `reverse("api.products")`.
|
|
626
|
+
|
|
627
|
+
### Include name scoping
|
|
628
|
+
|
|
629
|
+
The `name` option controls how child route names appear globally:
|
|
630
|
+
|
|
631
|
+
| Form | Child names | Generated types | Reverse resolution |
|
|
632
|
+
| ---------------------------------- | ------------------- | ---------------------- | -------------------------------------------------------------------- |
|
|
633
|
+
| `include("/x", p, { name: "ns" })` | `ns.child` | Exported as `ns.child` | `reverse("ns.child")` globally, `reverse(".child")` inside |
|
|
634
|
+
| `include("/x", p, { name: "" })` | `child` (flattened) | Exported as-is | `reverse("child")` globally, `reverse(".child")` inside (root-scope) |
|
|
635
|
+
| `include("/x", p)` | Private scope | Not exported | `reverse(".child")` inside only |
|
|
636
|
+
|
|
637
|
+
Without a `name`, included routes are local to the mounted module. They still match requests and render normally, but their names are hidden from the generated route map and cannot be reversed globally. Use `{ name: "" }` to merge children into the parent namespace without adding a prefix.
|
|
638
|
+
|
|
639
|
+
**`{ name: "" }` is flattening, not isolation.** Flattened routes behave as if defined inline at the include site — dot-local reverse (`.name`) can reach any sibling route at root scope, including routes from other `{ name: "" }` mounts. If you need module-level isolation, omit the `name` option or use a namespace.
|
|
640
|
+
|
|
641
|
+
## Middleware
|
|
642
|
+
|
|
643
|
+
```tsx
|
|
644
|
+
const urlpatterns = urls(({ path, middleware }) => [
|
|
645
|
+
middleware(
|
|
646
|
+
async (ctx, next) => {
|
|
647
|
+
const start = Date.now();
|
|
648
|
+
const response = await next();
|
|
649
|
+
console.log(
|
|
650
|
+
`${ctx.request.method} ${ctx.url.pathname} ${Date.now() - start}ms`,
|
|
651
|
+
);
|
|
652
|
+
return response;
|
|
653
|
+
},
|
|
654
|
+
() => [path("/dashboard", DashboardPage, { name: "dashboard" })],
|
|
655
|
+
),
|
|
656
|
+
]);
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
## Caching
|
|
660
|
+
|
|
661
|
+
### Route-Level Caching
|
|
662
|
+
|
|
663
|
+
```tsx
|
|
664
|
+
const urlpatterns = urls(({ path, cache }) => [
|
|
665
|
+
cache({ ttl: 60, swr: 300 }, () => [
|
|
666
|
+
path("/blog", BlogIndexPage, { name: "blog" }),
|
|
667
|
+
path("/blog/:slug", BlogPostPage, { name: "blogPost" }),
|
|
668
|
+
]),
|
|
669
|
+
]);
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
### Cache Store Configuration
|
|
673
|
+
|
|
674
|
+
```tsx
|
|
675
|
+
import { createRouter } from "@rangojs/router";
|
|
676
|
+
import {
|
|
677
|
+
CFCacheStore,
|
|
678
|
+
createDocumentCacheMiddleware,
|
|
679
|
+
} from "@rangojs/router/cache";
|
|
680
|
+
|
|
681
|
+
export const router = createRouter({
|
|
682
|
+
document: Document,
|
|
683
|
+
cache: (env) => ({
|
|
684
|
+
store: new CFCacheStore({
|
|
685
|
+
defaults: { ttl: 60, swr: 300 },
|
|
686
|
+
ctx: env.ctx,
|
|
687
|
+
}),
|
|
688
|
+
}),
|
|
689
|
+
})
|
|
690
|
+
.use(createDocumentCacheMiddleware())
|
|
691
|
+
.routes(urlpatterns);
|
|
692
|
+
```
|
|
693
|
+
|
|
694
|
+
Available cache stores:
|
|
695
|
+
|
|
696
|
+
- `CFCacheStore` — Cloudflare edge cache (production)
|
|
697
|
+
- `MemorySegmentCacheStore` — In-memory cache (development/testing)
|
|
698
|
+
|
|
699
|
+
## Pre-rendering
|
|
700
|
+
|
|
701
|
+
Pre-rendering generates route segments at build time. The worker handles all requests — there are no static files served from assets.
|
|
702
|
+
|
|
703
|
+
### Static Segments
|
|
704
|
+
|
|
705
|
+
Use `Static()` for segments rendered once at build time (no params). Works on `path()`, `layout()`, and `parallel()`:
|
|
706
|
+
|
|
707
|
+
```tsx
|
|
708
|
+
import { Static } from "@rangojs/router";
|
|
709
|
+
|
|
710
|
+
export const AboutPage = Static(async () => {
|
|
711
|
+
return <article>...</article>;
|
|
712
|
+
});
|
|
713
|
+
|
|
714
|
+
export const DocsNav = Static(async () => {
|
|
715
|
+
const items = await readDocsNavItems();
|
|
716
|
+
return (
|
|
717
|
+
<nav>
|
|
718
|
+
{items.map((i) => (
|
|
719
|
+
<a key={i.slug} href={i.slug}>
|
|
720
|
+
{i.title}
|
|
721
|
+
</a>
|
|
722
|
+
))}
|
|
723
|
+
</nav>
|
|
724
|
+
);
|
|
725
|
+
});
|
|
726
|
+
```
|
|
727
|
+
|
|
728
|
+
### Dynamic Routes with Prerender
|
|
729
|
+
|
|
730
|
+
Use `Prerender()` for route-scoped pre-rendering. With params, provide `getParams` first, handler second:
|
|
731
|
+
|
|
732
|
+
```tsx
|
|
733
|
+
import { Prerender } from "@rangojs/router";
|
|
734
|
+
|
|
735
|
+
export const BlogPost = Prerender(
|
|
736
|
+
async () => {
|
|
737
|
+
const slugs = await getAllBlogSlugs();
|
|
738
|
+
return slugs.map((slug) => ({ slug }));
|
|
739
|
+
},
|
|
740
|
+
async (ctx) => {
|
|
741
|
+
const post = await getPost(ctx.params.slug);
|
|
742
|
+
return <article>{post.content}</article>;
|
|
743
|
+
},
|
|
744
|
+
);
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
### Passthrough for Unknown Params
|
|
748
|
+
|
|
749
|
+
Wrap a `Prerender` definition with `Passthrough()` to add a live handler for unknown params at runtime. The build handler runs at build time, the live handler runs at request time for params not in the prerender cache.
|
|
750
|
+
|
|
751
|
+
```tsx
|
|
752
|
+
import { Prerender, Passthrough } from "@rangojs/router";
|
|
753
|
+
|
|
754
|
+
export const ProductPageDef = Prerender(
|
|
755
|
+
async () => {
|
|
756
|
+
const featured = await db.getFeaturedProducts();
|
|
757
|
+
return featured.map((p) => ({ id: p.id }));
|
|
758
|
+
},
|
|
759
|
+
async (ctx) => {
|
|
760
|
+
const product = await db.getProduct(ctx.params.id);
|
|
761
|
+
return <Product data={product} />;
|
|
762
|
+
},
|
|
763
|
+
);
|
|
764
|
+
|
|
765
|
+
// In route definition:
|
|
766
|
+
path(
|
|
767
|
+
"/products/:id",
|
|
768
|
+
Passthrough(ProductPageDef, async (ctx) => {
|
|
769
|
+
const product = await ctx.env.DB.getProduct(ctx.params.id);
|
|
770
|
+
return <Product data={product} />;
|
|
771
|
+
}),
|
|
772
|
+
);
|
|
773
|
+
```
|
|
774
|
+
|
|
775
|
+
Build handlers can also skip individual param sets with `ctx.passthrough()`, deferring them to the live handler:
|
|
776
|
+
|
|
777
|
+
```tsx
|
|
778
|
+
export const ProductPageDef = Prerender(
|
|
779
|
+
async () => {
|
|
780
|
+
const all = await db.getAllProducts();
|
|
781
|
+
return all.map((p) => ({ id: p.id }));
|
|
782
|
+
},
|
|
783
|
+
async (ctx) => {
|
|
784
|
+
const product = await db.getProduct(ctx.params.id);
|
|
785
|
+
if (!product.published) return ctx.passthrough();
|
|
786
|
+
return <Product data={product} />;
|
|
787
|
+
},
|
|
788
|
+
);
|
|
789
|
+
```
|
|
790
|
+
|
|
791
|
+
### Build-Time Environment Bindings
|
|
792
|
+
|
|
793
|
+
Prerender handlers can access platform bindings (KV, D1, R2) at build time when `buildEnv` is configured in the Vite plugin:
|
|
794
|
+
|
|
795
|
+
```ts
|
|
796
|
+
// vite.config.ts
|
|
797
|
+
import { rango } from "@rangojs/router/vite";
|
|
798
|
+
|
|
799
|
+
rango({ preset: "cloudflare", buildEnv: "auto" });
|
|
800
|
+
```
|
|
801
|
+
|
|
802
|
+
With `buildEnv: "auto"`, the plugin calls `wrangler.getPlatformProxy()` to provide local bindings. Handlers then access `ctx.env` during build:
|
|
803
|
+
|
|
804
|
+
```tsx
|
|
805
|
+
export const BlogPosts = Prerender<{ slug: string }>(
|
|
806
|
+
async (ctx) => {
|
|
807
|
+
const rows = await ctx.env.DB.prepare("SELECT slug FROM posts").all();
|
|
808
|
+
return rows.map((r) => ({ slug: r.slug }));
|
|
809
|
+
},
|
|
810
|
+
async (ctx) => {
|
|
811
|
+
const post = await ctx.env.DB.prepare("SELECT * FROM posts WHERE slug = ?")
|
|
812
|
+
.bind(ctx.params.slug)
|
|
813
|
+
.first();
|
|
814
|
+
return <BlogPost post={post} />;
|
|
815
|
+
},
|
|
816
|
+
);
|
|
817
|
+
```
|
|
818
|
+
|
|
819
|
+
`buildEnv` also accepts a factory function or plain object:
|
|
820
|
+
|
|
821
|
+
```ts
|
|
822
|
+
// Custom factory
|
|
823
|
+
rango({
|
|
824
|
+
buildEnv: async (ctx) => {
|
|
825
|
+
const { getPlatformProxy } = await import("wrangler");
|
|
826
|
+
const proxy = await getPlatformProxy();
|
|
827
|
+
return { env: proxy.env, dispose: proxy.dispose };
|
|
828
|
+
},
|
|
829
|
+
});
|
|
830
|
+
|
|
831
|
+
// Plain object (Node.js)
|
|
832
|
+
rango({ buildEnv: { DATABASE_URL: process.env.DATABASE_URL } });
|
|
833
|
+
```
|
|
834
|
+
|
|
835
|
+
Build-time env applies to both production builds and dev on-demand prerender. Without `buildEnv`, accessing `ctx.env` in a Prerender handler throws with a clear error.
|
|
836
|
+
|
|
837
|
+
## Theme
|
|
838
|
+
|
|
839
|
+
### Router Configuration
|
|
840
|
+
|
|
841
|
+
```tsx
|
|
842
|
+
export const router = createRouter({
|
|
843
|
+
document: Document,
|
|
844
|
+
theme: {
|
|
845
|
+
defaultTheme: "light",
|
|
846
|
+
themes: ["light", "dark", "system"],
|
|
847
|
+
attribute: "class",
|
|
848
|
+
enableSystem: true,
|
|
849
|
+
},
|
|
850
|
+
}).routes(urlpatterns);
|
|
851
|
+
```
|
|
852
|
+
|
|
853
|
+
### Theme Toggle
|
|
854
|
+
|
|
855
|
+
```tsx
|
|
856
|
+
"use client";
|
|
857
|
+
import { useTheme } from "@rangojs/router/theme";
|
|
858
|
+
|
|
859
|
+
function ThemeToggle() {
|
|
860
|
+
const { theme, setTheme, themes } = useTheme();
|
|
861
|
+
return (
|
|
862
|
+
<select value={theme} onChange={(e) => setTheme(e.target.value)}>
|
|
863
|
+
{themes.map((t) => (
|
|
864
|
+
<option key={t}>{t}</option>
|
|
865
|
+
))}
|
|
866
|
+
</select>
|
|
867
|
+
);
|
|
868
|
+
}
|
|
869
|
+
```
|
|
870
|
+
|
|
871
|
+
## Host Routing
|
|
872
|
+
|
|
873
|
+
Route requests to different apps based on domain/subdomain patterns using `@rangojs/router/host`:
|
|
874
|
+
|
|
875
|
+
```tsx
|
|
876
|
+
// worker.rsc.tsx
|
|
877
|
+
import { createHostRouter } from "@rangojs/router/host";
|
|
878
|
+
|
|
879
|
+
const hostRouter = createHostRouter();
|
|
880
|
+
|
|
881
|
+
hostRouter.host(["*.localhost"]).map(() => import("./apps/admin/handler.js"));
|
|
882
|
+
hostRouter.host(["localhost"]).map(() => import("./apps/site/handler.js"));
|
|
883
|
+
hostRouter.fallback().map(() => import("./apps/site/handler.js"));
|
|
884
|
+
|
|
885
|
+
export default {
|
|
886
|
+
async fetch(request, env, ctx) {
|
|
887
|
+
return hostRouter.match(request, { env, ctx });
|
|
888
|
+
},
|
|
889
|
+
};
|
|
890
|
+
```
|
|
891
|
+
|
|
892
|
+
Each sub-app has its own `createRouter()` and `urls()`. The host router lazily imports the matched app's handler. Patterns are matched in registration order — register more specific patterns (subdomains) before catch-alls.
|
|
893
|
+
|
|
894
|
+
## Meta Tags
|
|
895
|
+
|
|
896
|
+
Accumulate meta tags across route segments using the built-in `Meta` handle:
|
|
897
|
+
|
|
898
|
+
```tsx
|
|
899
|
+
import { Meta } from "@rangojs/router";
|
|
900
|
+
import type { HandlerContext } from "@rangojs/router";
|
|
901
|
+
|
|
902
|
+
export function BlogPostPage(ctx: HandlerContext) {
|
|
903
|
+
const meta = ctx.use(Meta);
|
|
904
|
+
meta({ title: "My Blog Post" });
|
|
905
|
+
meta({ name: "description", content: "A great blog post" });
|
|
906
|
+
meta({ property: "og:title", content: "My Blog Post" });
|
|
907
|
+
|
|
908
|
+
return <article>...</article>;
|
|
909
|
+
}
|
|
910
|
+
```
|
|
911
|
+
|
|
912
|
+
Render collected tags in the document with `<MetaTags />` from `@rangojs/router/client`.
|
|
913
|
+
|
|
914
|
+
## CLI: `rango generate`
|
|
915
|
+
|
|
916
|
+
Route types are generated automatically by the Vite plugin. The CLI is a manual fallback for generating types outside the dev server (e.g. in CI or for IDE support before first `pnpm dev`):
|
|
917
|
+
|
|
918
|
+
```bash
|
|
919
|
+
npx rango generate src/router.tsx
|
|
920
|
+
npx rango generate src/ # recursive scan
|
|
921
|
+
npx rango generate src/urls.tsx src/api/ # mix files and directories
|
|
922
|
+
```
|
|
923
|
+
|
|
924
|
+
Auto-detects file type:
|
|
925
|
+
|
|
926
|
+
- Files with `createRouter` → `*.named-routes.gen.ts` with global route map
|
|
927
|
+
- Files with `urls()` → `*.gen.ts` with per-module route names, params, and search types
|
|
928
|
+
|
|
929
|
+
## Type Safety
|
|
930
|
+
|
|
931
|
+
The Vite plugin automatically generates a `router.named-routes.gen.ts` file that globally registers route names, patterns, and search schemas via `RSCRouter.GeneratedRouteMap`. This powers server-side named-route typing such as `Handler<"name">`, `ctx.reverse()`, `getRequestContext().reverse()`, and `RouteParams<"name">` without any manual route registration. The gen file is updated on dev server startup, HMR, and production builds.
|
|
932
|
+
|
|
933
|
+
Use the generated map by default. Augment `RSCRouter.RegisteredRoutes` only when you need the richer `typeof router.routeMap` shape globally, especially for response-aware and path-based utilities.
|
|
934
|
+
|
|
935
|
+
```typescript
|
|
936
|
+
// router.tsx
|
|
937
|
+
const router = createRouter<AppBindings>({}).routes(urlpatterns);
|
|
938
|
+
|
|
939
|
+
declare global {
|
|
940
|
+
namespace RSCRouter {
|
|
941
|
+
interface Env extends AppEnv {}
|
|
942
|
+
interface Vars extends AppVars {}
|
|
943
|
+
interface RegisteredRoutes extends typeof router.routeMap {}
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
```
|
|
947
|
+
|
|
948
|
+
Quick rule of thumb:
|
|
949
|
+
|
|
950
|
+
- `GeneratedRouteMap` (auto-generated) — use for server-side named-route typing: `Handler<"name">`, `ctx.reverse()`, `Prerender<"name">`
|
|
951
|
+
- `typeof router.routeMap` — use when you need route entries with response metadata
|
|
952
|
+
- `RegisteredRoutes` (manual augmentation) — use to expose `typeof router.routeMap` globally for `href()`, `PathResponse`, `ValidPaths`, and other path/response-aware utilities
|
|
953
|
+
|
|
954
|
+
For extracted reusable loaders or middleware, prefer global dotted names on
|
|
955
|
+
`ctx.reverse()` by default. If you want type-safe local names for a specific
|
|
956
|
+
module, use `scopedReverse<typeof localPatterns>(ctx.reverse)` or
|
|
957
|
+
`scopedReverse<routes>(ctx.reverse)` with a generated local route type.
|
|
958
|
+
|
|
959
|
+
## Subpath Exports
|
|
960
|
+
|
|
961
|
+
| Export | Description |
|
|
962
|
+
| ------------------------ | -------------------------------------------------------------------------------------------------------- |
|
|
963
|
+
| `@rangojs/router` | Server/RSC core and shared types: `createRouter`, `urls`, `createLoader`, `Handler`, `Prerender`, `Meta` |
|
|
964
|
+
| `@rangojs/router/client` | Client: `Link`, `Outlet`, `href`, `useNavigation`, `useLoader`, `MetaTags` |
|
|
965
|
+
| `@rangojs/router/cache` | Cache: `CFCacheStore`, `MemorySegmentCacheStore`, `createDocumentCacheMiddleware` |
|
|
966
|
+
| `@rangojs/router/theme` | Theme: `useTheme`, `ThemeProvider`, `ThemeScript` |
|
|
967
|
+
| `@rangojs/router/host` | Host routing: `createHostRouter`, `defineHosts` |
|
|
968
|
+
| `@rangojs/router/vite` | Vite plugin: `rango()` |
|
|
969
|
+
| `@rangojs/router/rsc` | Advanced server pipeline APIs: `createRSCHandler`, request-context access |
|
|
970
|
+
| `@rangojs/router/ssr` | Advanced SSR bridge APIs: `createSSRHandler` |
|
|
971
|
+
| `@rangojs/router/server` | Internal build/runtime utilities for advanced integrations |
|
|
972
|
+
| `@rangojs/router/build` | Build utilities |
|
|
973
|
+
|
|
974
|
+
The root entrypoint is not a generic client/runtime barrel. If you need hooks
|
|
975
|
+
or components, import from `@rangojs/router/client`; if you need cache or host
|
|
976
|
+
APIs, use their dedicated subpaths.
|
|
977
|
+
|
|
978
|
+
## Examples
|
|
979
|
+
|
|
980
|
+
See the `examples/` directory for full working applications:
|
|
14
981
|
|
|
15
|
-
|
|
982
|
+
- [`cloudflare-basic`](../../examples/cloudflare-basic) — Cloudflare Workers with caching, loaders, theme, and pre-rendering
|
|
983
|
+
- [`cloudflare-multi-router`](../../examples/cloudflare-multi-router) — Multi-app host routing
|
|
16
984
|
|
|
17
985
|
## License
|
|
18
986
|
|