@rangojs/router 0.0.0-experimental.debug-cache-fix → 0.0.0-experimental.df7974ff
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/README.md +188 -35
- 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 +130 -47
- 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/dist/href-context.d.ts +29 -0
- 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 +1884 -537
- 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/dist/vite/package-resolution.js +112 -0
- 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/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +7 -5
- package/skills/breadcrumbs/SKILL.md +3 -1
- package/skills/cache-guide/SKILL.md +32 -0
- package/skills/caching/SKILL.md +8 -0
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +54 -20
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +45 -0
- package/skills/layout/SKILL.md +24 -0
- package/skills/links/SKILL.md +237 -17
- package/skills/loader/SKILL.md +123 -46
- package/skills/middleware/SKILL.md +36 -3
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/parallel/SKILL.md +68 -0
- package/skills/prerender/SKILL.md +110 -68
- package/skills/rango/SKILL.md +26 -22
- package/skills/response-routes/SKILL.md +8 -0
- package/skills/route/SKILL.md +79 -0
- package/skills/router-setup/SKILL.md +87 -2
- package/skills/server-actions/SKILL.md +739 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/typesafety/SKILL.md +19 -1
- package/skills/view-transitions/SKILL.md +212 -0
- package/src/__internal.ts +1 -1
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +44 -4
- package/src/browser/navigation-bridge.ts +156 -10
- package/src/browser/navigation-client.ts +128 -53
- package/src/browser/navigation-store.ts +68 -9
- package/src/browser/partial-update.ts +84 -16
- package/src/browser/prefetch/cache.ts +129 -21
- package/src/browser/prefetch/fetch.ts +156 -18
- package/src/browser/prefetch/queue.ts +92 -29
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +53 -13
- package/src/browser/react/Link.tsx +72 -8
- package/src/browser/react/NavigationProvider.tsx +82 -21
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +51 -7
- package/src/browser/react/index.ts +3 -0
- package/src/browser/react/use-handle.ts +9 -58
- package/src/browser/react/use-navigation.ts +22 -2
- package/src/browser/react/use-params.ts +17 -4
- package/src/browser/react/use-reverse.ts +99 -0
- package/src/browser/react/use-router.ts +29 -9
- package/src/browser/react/use-segments.ts +11 -8
- package/src/browser/rsc-router.tsx +60 -9
- package/src/browser/scroll-restoration.ts +38 -33
- package/src/browser/segment-reconciler.ts +36 -14
- package/src/browser/server-action-bridge.ts +8 -6
- package/src/browser/types.ts +46 -5
- package/src/build/generate-manifest.ts +6 -6
- package/src/build/generate-route-types.ts +3 -0
- package/src/build/route-trie.ts +52 -25
- package/src/build/route-types/include-resolution.ts +8 -1
- package/src/build/route-types/router-processing.ts +211 -72
- package/src/build/route-types/scan-filter.ts +8 -1
- package/src/cache/cache-scope.ts +12 -14
- package/src/cache/cf/cf-cache-store.ts +5 -7
- package/src/cache/taint.ts +55 -0
- package/src/client.rsc.tsx +3 -0
- package/src/client.tsx +89 -231
- package/src/context-var.ts +72 -2
- package/src/handle.ts +40 -0
- package/src/href-client.ts +4 -1
- package/src/index.rsc.ts +6 -1
- package/src/index.ts +49 -6
- package/src/outlet-context.ts +1 -1
- package/src/prerender/store.ts +5 -4
- package/src/prerender.ts +138 -77
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +62 -15
- package/src/route-definition/dsl-helpers.ts +210 -35
- package/src/route-definition/helpers-types.ts +73 -20
- package/src/route-definition/index.ts +3 -0
- package/src/route-definition/redirect.ts +9 -1
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-types.ts +18 -0
- package/src/router/content-negotiation.ts +100 -1
- package/src/router/handler-context.ts +77 -38
- package/src/router/intercept-resolution.ts +9 -4
- package/src/router/lazy-includes.ts +6 -6
- package/src/router/loader-resolution.ts +159 -21
- package/src/router/manifest.ts +22 -13
- package/src/router/match-api.ts +128 -192
- package/src/router/match-handlers.ts +1 -0
- package/src/router/match-middleware/cache-lookup.ts +28 -8
- package/src/router/match-middleware/segment-resolution.ts +53 -0
- package/src/router/match-result.ts +101 -4
- package/src/router/middleware-types.ts +20 -33
- package/src/router/middleware.ts +56 -12
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +101 -17
- package/src/router/prerender-match.ts +110 -10
- package/src/router/preview-match.ts +30 -102
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +15 -1
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-interfaces.ts +36 -4
- package/src/router/router-options.ts +37 -11
- package/src/router/segment-resolution/fresh.ts +88 -9
- package/src/router/segment-resolution/helpers.ts +29 -24
- package/src/router/segment-resolution/revalidation.ts +219 -108
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/trie-matching.ts +18 -13
- package/src/router/types.ts +1 -0
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +55 -7
- package/src/rsc/handler.ts +478 -374
- package/src/rsc/helpers.ts +69 -41
- package/src/rsc/loader-fetch.ts +23 -3
- package/src/rsc/manifest-init.ts +5 -1
- package/src/rsc/progressive-enhancement.ts +18 -2
- package/src/rsc/response-route-handler.ts +14 -1
- package/src/rsc/rsc-rendering.ts +20 -1
- package/src/rsc/server-action.ts +12 -0
- package/src/rsc/ssr-setup.ts +2 -2
- package/src/rsc/types.ts +15 -1
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +71 -70
- package/src/server/context.ts +76 -4
- package/src/server/handle-store.ts +19 -0
- package/src/server/loader-registry.ts +9 -8
- package/src/server/request-context.ts +185 -57
- package/src/ssr/index.tsx +8 -1
- package/src/static-handler.ts +18 -6
- package/src/types/cache-types.ts +4 -4
- package/src/types/handler-context.ts +47 -56
- package/src/types/loader-types.ts +41 -15
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-entry.ts +12 -1
- package/src/types/segments.ts +18 -1
- package/src/urls/include-helper.ts +24 -14
- package/src/urls/path-helper-types.ts +39 -6
- package/src/urls/path-helper.ts +47 -12
- package/src/urls/pattern-types.ts +12 -0
- package/src/urls/response-types.ts +18 -16
- package/src/use-loader.tsx +77 -5
- package/src/vite/debug.ts +184 -0
- package/src/vite/discovery/bundle-postprocess.ts +30 -33
- package/src/vite/discovery/discover-routers.ts +36 -4
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +175 -74
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +13 -4
- package/src/vite/index.ts +4 -0
- package/src/vite/plugin-types.ts +60 -5
- package/src/vite/plugins/cjs-to-esm.ts +5 -0
- package/src/vite/plugins/client-ref-dedup.ts +16 -0
- package/src/vite/plugins/client-ref-hashing.ts +16 -4
- 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/plugins/expose-action-id.ts +52 -28
- package/src/vite/plugins/expose-id-utils.ts +12 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +30 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
- package/src/vite/plugins/expose-internal-ids.ts +563 -316
- package/src/vite/plugins/performance-tracks.ts +96 -0
- package/src/vite/plugins/refresh-cmd.ts +88 -26
- package/src/vite/plugins/use-cache-transform.ts +56 -43
- package/src/vite/plugins/version-injector.ts +37 -11
- package/src/vite/rango.ts +63 -11
- package/src/vite/router-discovery.ts +732 -86
- package/src/vite/utils/banner.ts +1 -1
- package/src/vite/utils/package-resolution.ts +41 -1
- package/src/vite/utils/prerender-utils.ts +38 -5
- package/src/vite/utils/shared-utils.ts +3 -2
|
@@ -0,0 +1,769 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: migrate-react-router
|
|
3
|
+
description: Migrate a React Router v7/v6 project to @rangojs/router. Use when the user asks to "migrate from React Router", "convert React Router to Rango", "replace React Router", "move from Remix to Rango", or has a React Router / Remix app they want to port.
|
|
4
|
+
argument-hint: path-to-react-router-app
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Migrate from React Router to @rangojs/router
|
|
8
|
+
|
|
9
|
+
Covers React Router v7 (framework mode and library mode), v6, and Remix v2.
|
|
10
|
+
|
|
11
|
+
## Why Rango
|
|
12
|
+
|
|
13
|
+
Common reasons to migrate:
|
|
14
|
+
|
|
15
|
+
- **Server components by default** — move from client-first route rendering to
|
|
16
|
+
server-first UI and data fetching.
|
|
17
|
+
See: `/router-setup`, `/route`
|
|
18
|
+
- **Django-style route definition** — `urls()`, `path()`, and `layout()` make
|
|
19
|
+
the route tree explicit instead of splitting behavior across route modules or
|
|
20
|
+
router config objects.
|
|
21
|
+
See: `/route`, `/layout`
|
|
22
|
+
- **Named routes** — reverse URLs by route name instead of repeating path
|
|
23
|
+
strings in links, redirects, and navigation logic.
|
|
24
|
+
See: `/links`, `/typesafety`
|
|
25
|
+
- **Clear execution model** — request scope, render scope, segment boundaries,
|
|
26
|
+
and shared `ctx` behavior are explicit instead of being inferred from route
|
|
27
|
+
module conventions.
|
|
28
|
+
See: `/middleware`, `/loader`
|
|
29
|
+
- **Live data layer** — `createLoader()` and `loader()` keep data fresh
|
|
30
|
+
independently of cached UI. A route can serve cached segments while loaders
|
|
31
|
+
still resolve live on every request.
|
|
32
|
+
See: `/loader`, `/caching`, `/cache-guide`
|
|
33
|
+
- **Explicit caching model** — `cache()` DSL, `revalidate()`, `use cache`, and
|
|
34
|
+
custom cache stores make data and render caching a first-class part of the router.
|
|
35
|
+
See: `/caching`, `/cache-guide`, `/use-cache`
|
|
36
|
+
- **Build-time rendering** — `Static()` and `Prerender()` provide explicit
|
|
37
|
+
build-time rendering for routes that benefit from it.
|
|
38
|
+
See: `/prerender`
|
|
39
|
+
- **Composable route tree** — layouts, includes, middleware, parallels, and
|
|
40
|
+
intercepts compose directly in the route definition.
|
|
41
|
+
See: `/composability`, `/parallel`, `/intercept`
|
|
42
|
+
- **Multi-router flexibility** — support multiple routers, domain routing, and
|
|
43
|
+
more advanced host-routing setups than a single client router tree.
|
|
44
|
+
See: `/host-router`
|
|
45
|
+
|
|
46
|
+
## Identify the mode first
|
|
47
|
+
|
|
48
|
+
React Router v7 has two modes that require different migration paths:
|
|
49
|
+
|
|
50
|
+
- **Framework mode** (`@react-router/dev` plugin, file-based routing, route module
|
|
51
|
+
API with `loader`/`action`/`meta`/`headers`/`shouldRevalidate` exports) — this is
|
|
52
|
+
the Remix successor. Migration involves replacing the route module convention with
|
|
53
|
+
Rango's `urls()` DSL and server component handlers.
|
|
54
|
+
|
|
55
|
+
- **Library mode** (`createBrowserRouter` or `<BrowserRouter>`, client-side only) —
|
|
56
|
+
migration involves moving from client-side routing to server-rendered RSC with the
|
|
57
|
+
`urls()` DSL.
|
|
58
|
+
|
|
59
|
+
React Router v6 and Remix v2 follow the same patterns as v7 library mode and
|
|
60
|
+
framework mode respectively.
|
|
61
|
+
|
|
62
|
+
## Migration Strategy
|
|
63
|
+
|
|
64
|
+
Work route-by-route, bottom-up. Start with leaf routes, then layouts, then
|
|
65
|
+
loaders/actions. Verify each route works before moving to the next.
|
|
66
|
+
|
|
67
|
+
## 1. Project Setup
|
|
68
|
+
|
|
69
|
+
Replace React Router tooling with Vite + Rango:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# Framework mode:
|
|
73
|
+
npm remove react-router @react-router/dev @react-router/node @react-router/serve
|
|
74
|
+
# Library mode:
|
|
75
|
+
npm remove react-router react-router-dom
|
|
76
|
+
|
|
77
|
+
npm install @rangojs/router
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Replace the `@react-router/dev` Vite plugin with `rango()`:
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
// vite.config.ts
|
|
84
|
+
// Before: import { reactRouter } from "@react-router/dev/vite";
|
|
85
|
+
import { defineConfig } from "vite";
|
|
86
|
+
import { rango } from "@rangojs/router/vite";
|
|
87
|
+
|
|
88
|
+
export default defineConfig({
|
|
89
|
+
plugins: [rango()],
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Delete `react-router.config.ts` — route configuration moves to the `urls()` DSL.
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
// src/router.tsx
|
|
97
|
+
import { createRouter } from "@rangojs/router";
|
|
98
|
+
import { Document } from "./document";
|
|
99
|
+
import { urlpatterns } from "./urls";
|
|
100
|
+
|
|
101
|
+
export default createRouter({
|
|
102
|
+
document: Document,
|
|
103
|
+
}).routes(urlpatterns);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 2. Route Mapping
|
|
107
|
+
|
|
108
|
+
### RR7 framework mode: route modules → urls() DSL
|
|
109
|
+
|
|
110
|
+
In framework mode, each route is a file with conventional exports (`loader`,
|
|
111
|
+
`action`, `default`, `meta`, `headers`, `shouldRevalidate`, `handle`,
|
|
112
|
+
`ErrorBoundary`, `HydrateFallback`). In Rango, all of these become part of the
|
|
113
|
+
`urls()` DSL or move into the server component handler:
|
|
114
|
+
|
|
115
|
+
```text
|
|
116
|
+
RR7 route module export → Rango equivalent
|
|
117
|
+
─────────────────────────────────────────────────────
|
|
118
|
+
default (Component) → handler in path()
|
|
119
|
+
loader → fetch in handler, or createLoader()
|
|
120
|
+
action → "use server" function
|
|
121
|
+
meta → ctx.use(Meta) in handler
|
|
122
|
+
headers → ctx.header() in handler or middleware
|
|
123
|
+
shouldRevalidate → revalidate() DSL
|
|
124
|
+
ErrorBoundary → errorBoundary() DSL
|
|
125
|
+
HydrateFallback → loading() DSL
|
|
126
|
+
handle → createHandle() for cross-segment data (breadcrumbs, etc.)
|
|
127
|
+
clientLoader / clientAction → "use client" component with React hooks
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### Example: full route module migration
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
// RR7 framework mode: app/routes/product.$slug.tsx
|
|
134
|
+
import type { Route } from "./+types/product.$slug";
|
|
135
|
+
|
|
136
|
+
export async function loader({ params }: Route.LoaderArgs) {
|
|
137
|
+
const product = await getProduct(params.slug);
|
|
138
|
+
if (!product) throw new Response("Not Found", { status: 404 });
|
|
139
|
+
return { product };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export async function action({ request }: Route.ActionArgs) {
|
|
143
|
+
const formData = await request.formData();
|
|
144
|
+
await addToCart(formData.get("productId") as string);
|
|
145
|
+
return { ok: true };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function meta({ data }: Route.MetaArgs) {
|
|
149
|
+
return [{ title: data.product.name }];
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function headers() {
|
|
153
|
+
return { "Cache-Control": "max-age=300" };
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function shouldRevalidate({ actionResult }) {
|
|
157
|
+
return !!actionResult;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export default function ProductPage({ loaderData }: Route.ComponentProps) {
|
|
161
|
+
return <div>{loaderData.product.name}</div>;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function ErrorBoundary() {
|
|
165
|
+
return <div>Product error</div>;
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
// Rango: urls.tsx + handler
|
|
171
|
+
import { notFound } from "@rangojs/router";
|
|
172
|
+
|
|
173
|
+
const ProductPage: Handler<"product"> = async (ctx) => {
|
|
174
|
+
const product = await getProduct(ctx.params.slug);
|
|
175
|
+
if (!product) notFound("Product not found");
|
|
176
|
+
|
|
177
|
+
const meta = ctx.use(Meta);
|
|
178
|
+
meta({ title: product.name });
|
|
179
|
+
ctx.header("Cache-Control", "max-age=300");
|
|
180
|
+
|
|
181
|
+
return <div>{product.name}</div>;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
// In urls.tsx:
|
|
185
|
+
path("/product/:slug", ProductPage, { name: "product" }, () => [
|
|
186
|
+
revalidate(({ actionId }) => !!actionId),
|
|
187
|
+
errorBoundary(() => <div>Product error</div>),
|
|
188
|
+
loading(<ProductSkeleton />),
|
|
189
|
+
])
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Key shift: the route module's scattered exports consolidate into the handler
|
|
193
|
+
(data fetching, meta, headers) and the DSL (revalidation, error boundary, loading).
|
|
194
|
+
|
|
195
|
+
### RR7 file routing → urls() DSL
|
|
196
|
+
|
|
197
|
+
| RR7 file path | Rango |
|
|
198
|
+
| ---------------------------------------- | ------------------------------------------------------------- |
|
|
199
|
+
| `app/routes/_index.tsx` | `path("/", HomePage, { name: "home" })` |
|
|
200
|
+
| `app/routes/about.tsx` | `path("/about", AboutPage, { name: "about" })` |
|
|
201
|
+
| `app/routes/blog.$slug.tsx` | `path("/blog/:slug", BlogPost, { name: "blogPost" })` |
|
|
202
|
+
| `app/routes/files.$.tsx` (splat) | `path("/files/:path+", FileBrowser, { name: "files" })` |
|
|
203
|
+
| `app/routes/dashboard.tsx` (layout) | `layout(<DashboardLayout />, () => [...])` |
|
|
204
|
+
| `app/routes/dashboard._index.tsx` | `path("/dashboard", DashboardIndex, { name: "dashboard" })` |
|
|
205
|
+
| `app/routes/dashboard.settings.tsx` | `path("/dashboard/settings", Settings, { name: "settings" })` |
|
|
206
|
+
| `app/routes/_auth.tsx` (pathless layout) | `layout(<AuthLayout />, () => [...])` |
|
|
207
|
+
| `app/routes/_auth.login.tsx` | `path("/login", LoginPage, { name: "login" })` |
|
|
208
|
+
|
|
209
|
+
### Library mode: config routes → urls() DSL
|
|
210
|
+
|
|
211
|
+
| React Router | Rango |
|
|
212
|
+
| -------------------------------------- | ------------------------------------------------------- |
|
|
213
|
+
| `path: "/"` | `path("/", HomePage, { name: "home" })` |
|
|
214
|
+
| `path: "about"` | `path("/about", AboutPage, { name: "about" })` |
|
|
215
|
+
| `path: "blog/:slug"` | `path("/blog/:slug", BlogPost, { name: "blogPost" })` |
|
|
216
|
+
| `path: "files/*"` (splat) | `path("/files/:path+", FileBrowser, { name: "files" })` |
|
|
217
|
+
| `path: "docs/:lang?"` (optional param) | `path("/docs/:lang?", Docs, { name: "docs" })` |
|
|
218
|
+
|
|
219
|
+
### Layouts
|
|
220
|
+
|
|
221
|
+
React Router layouts use `<Outlet />` — same concept in Rango:
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
// React Router:
|
|
225
|
+
function DashboardLayout() {
|
|
226
|
+
return (
|
|
227
|
+
<div className="dashboard">
|
|
228
|
+
<Outlet />
|
|
229
|
+
</div>
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// route config:
|
|
234
|
+
{ path: "dashboard", element: <DashboardLayout />, children: [...] }
|
|
235
|
+
|
|
236
|
+
// Rango: same <Outlet />, from @rangojs/router/client
|
|
237
|
+
import { Outlet } from "@rangojs/router/client";
|
|
238
|
+
|
|
239
|
+
layout(<DashboardLayout />, () => [
|
|
240
|
+
path("/dashboard", DashboardIndex, { name: "dashboard" }),
|
|
241
|
+
path("/dashboard/settings", Settings, { name: "settings" }),
|
|
242
|
+
])
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Dynamic layouts (with data)
|
|
246
|
+
|
|
247
|
+
```typescript
|
|
248
|
+
// React Router: useLoaderData() in layout component
|
|
249
|
+
function DashboardLayout() {
|
|
250
|
+
const { user } = useLoaderData();
|
|
251
|
+
return <Shell user={user}><Outlet /></Shell>;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Rango: handler function layout (server component)
|
|
255
|
+
layout(async (ctx) => {
|
|
256
|
+
const user = ctx.get("user");
|
|
257
|
+
return (
|
|
258
|
+
<Shell user={user}>
|
|
259
|
+
<Outlet />
|
|
260
|
+
</Shell>
|
|
261
|
+
);
|
|
262
|
+
}, () => [
|
|
263
|
+
path("/dashboard", DashboardIndex, { name: "dashboard" }),
|
|
264
|
+
])
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Nested routes
|
|
268
|
+
|
|
269
|
+
React Router's nested route tree maps directly to Rango's `layout()` nesting:
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
// React Router:
|
|
273
|
+
createBrowserRouter([{
|
|
274
|
+
path: "/",
|
|
275
|
+
element: <RootLayout />,
|
|
276
|
+
children: [
|
|
277
|
+
{ path: "dashboard",
|
|
278
|
+
element: <DashboardLayout />,
|
|
279
|
+
children: [
|
|
280
|
+
{ index: true, element: <DashboardIndex /> },
|
|
281
|
+
{ path: "settings", element: <Settings /> },
|
|
282
|
+
]
|
|
283
|
+
},
|
|
284
|
+
]
|
|
285
|
+
}])
|
|
286
|
+
|
|
287
|
+
// Rango:
|
|
288
|
+
urls(({ path, layout }) => [
|
|
289
|
+
layout(<RootLayout />, () => [
|
|
290
|
+
layout(<DashboardLayout />, () => [
|
|
291
|
+
path("/dashboard", DashboardIndex, { name: "dashboard" }),
|
|
292
|
+
path("/dashboard/settings", Settings, { name: "settings" }),
|
|
293
|
+
]),
|
|
294
|
+
]),
|
|
295
|
+
])
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Route groups / pathless layouts
|
|
299
|
+
|
|
300
|
+
React Router's pathless routes (layout routes without a path) are Rango's
|
|
301
|
+
layouts without a URL prefix:
|
|
302
|
+
|
|
303
|
+
```typescript
|
|
304
|
+
// React Router: { element: <AuthLayout />, children: [...] }
|
|
305
|
+
|
|
306
|
+
// Rango: layout with no URL segment
|
|
307
|
+
layout(<AuthLayout />, () => [
|
|
308
|
+
path("/login", LoginPage, { name: "login" }),
|
|
309
|
+
path("/register", RegisterPage, { name: "register" }),
|
|
310
|
+
])
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Index routes
|
|
314
|
+
|
|
315
|
+
```typescript
|
|
316
|
+
// React Router: { index: true, element: <Home /> }
|
|
317
|
+
|
|
318
|
+
// Rango: path with "/" inside a layout
|
|
319
|
+
layout(<RootLayout />, () => [
|
|
320
|
+
path("/", HomePage, { name: "home" }),
|
|
321
|
+
])
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## 3. Data Fetching
|
|
325
|
+
|
|
326
|
+
### Loaders → handler (the default migration)
|
|
327
|
+
|
|
328
|
+
In React Router, loaders and components are separate: the loader fetches data,
|
|
329
|
+
the component renders it via `useLoaderData()`. In Rango, server component
|
|
330
|
+
handlers do both — combine the loader and component into a single handler:
|
|
331
|
+
|
|
332
|
+
```typescript
|
|
333
|
+
// React Router: separate loader + component
|
|
334
|
+
export async function loader({ params }) {
|
|
335
|
+
const product = await getProduct(params.slug);
|
|
336
|
+
return { product };
|
|
337
|
+
}
|
|
338
|
+
function ProductPage() {
|
|
339
|
+
const { product } = useLoaderData();
|
|
340
|
+
return <div>{product.name}</div>;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Rango: handler fetches and renders directly
|
|
344
|
+
const ProductPage: Handler<"product"> = async (ctx) => {
|
|
345
|
+
const product = await getProduct(ctx.params.slug);
|
|
346
|
+
return <div>{product.name}</div>;
|
|
347
|
+
};
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
This is the standard migration path. The handler IS the loader — it fetches
|
|
351
|
+
data, then returns JSX. No separate data-fetching layer needed.
|
|
352
|
+
|
|
353
|
+
### When to use createLoader()
|
|
354
|
+
|
|
355
|
+
Rango's `createLoader()` is a live data layer, not a loader migration target.
|
|
356
|
+
Use it only when you need capabilities beyond what the handler provides:
|
|
357
|
+
|
|
358
|
+
- **Client-side reactive data** — `useLoader()` in client components for data
|
|
359
|
+
that updates without a full page navigation
|
|
360
|
+
- **Shared data across segments** — a loader registered on a layout is available
|
|
361
|
+
to all child routes via `ctx.use(Loader)` or `useLoader(Loader)`
|
|
362
|
+
- **Independent revalidation** — `revalidate()` on a specific loader after actions
|
|
363
|
+
- **Per-loader caching** — `loader(L, () => [cache({ ttl: 60 })])`
|
|
364
|
+
|
|
365
|
+
If the React Router loader just fetches data for its page component, merge it
|
|
366
|
+
into the handler. See `/loader` for when the live data layer is useful.
|
|
367
|
+
|
|
368
|
+
### Actions
|
|
369
|
+
|
|
370
|
+
React Router form actions map to Rango server actions:
|
|
371
|
+
|
|
372
|
+
```typescript
|
|
373
|
+
// React Router:
|
|
374
|
+
export async function action({ request }) {
|
|
375
|
+
const formData = await request.formData();
|
|
376
|
+
await updateUser(formData.get("name"));
|
|
377
|
+
return redirect("/profile");
|
|
378
|
+
}
|
|
379
|
+
function EditProfile() {
|
|
380
|
+
return (
|
|
381
|
+
<Form method="post">
|
|
382
|
+
<input name="name" />
|
|
383
|
+
<button type="submit">Save</button>
|
|
384
|
+
</Form>
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// Rango: "use server" action + native form or useActionState
|
|
389
|
+
"use server";
|
|
390
|
+
import { redirect } from "@rangojs/router";
|
|
391
|
+
|
|
392
|
+
export async function updateProfile(formData: FormData): Promise<void> {
|
|
393
|
+
await updateUser(formData.get("name") as string);
|
|
394
|
+
throw redirect("/profile");
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// Client component:
|
|
398
|
+
function EditProfile() {
|
|
399
|
+
return (
|
|
400
|
+
<form action={updateProfile}>
|
|
401
|
+
<input name="name" />
|
|
402
|
+
<button type="submit">Save</button>
|
|
403
|
+
</form>
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
Key difference: React Router actions are route-scoped (declared per route).
|
|
409
|
+
Rango actions are function-scoped (`"use server"` on any exported async function).
|
|
410
|
+
|
|
411
|
+
### useLoaderData
|
|
412
|
+
|
|
413
|
+
There is no `useLoaderData()` in Rango. For most cases, the handler fetches
|
|
414
|
+
and renders directly (see above). When a client component needs live reactive
|
|
415
|
+
data, use `createLoader()` + `useLoader()`:
|
|
416
|
+
|
|
417
|
+
```typescript
|
|
418
|
+
// React Router: useLoaderData() in client component
|
|
419
|
+
function ProductPrice() {
|
|
420
|
+
const { price } = useLoaderData();
|
|
421
|
+
return <span>{price}</span>;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Rango: useLoader() reads from a registered loader (live data layer)
|
|
425
|
+
"use client";
|
|
426
|
+
import { useLoader } from "@rangojs/router/client";
|
|
427
|
+
import { PriceLoader } from "../loaders";
|
|
428
|
+
|
|
429
|
+
function ProductPrice() {
|
|
430
|
+
const { data } = useLoader(PriceLoader);
|
|
431
|
+
return <span>{data.price}</span>;
|
|
432
|
+
}
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
`useLoader()` provides live data that stays fresh — it re-fetches on navigation
|
|
436
|
+
and after actions (controlled by `revalidate()`). This is different from
|
|
437
|
+
`useLoaderData()` which just reads a snapshot.
|
|
438
|
+
|
|
439
|
+
### useActionData
|
|
440
|
+
|
|
441
|
+
React Router's `useActionData()` reads the return value of a route-scoped
|
|
442
|
+
`action()`. In Rango, actions are standard React server actions (`"use server"`),
|
|
443
|
+
so all React patterns apply directly:
|
|
444
|
+
|
|
445
|
+
```typescript
|
|
446
|
+
// React Router:
|
|
447
|
+
export async function action({ request }) {
|
|
448
|
+
const form = await request.formData();
|
|
449
|
+
const errors = validate(form);
|
|
450
|
+
if (errors) return { errors };
|
|
451
|
+
await save(form);
|
|
452
|
+
return { ok: true };
|
|
453
|
+
}
|
|
454
|
+
function EditForm() {
|
|
455
|
+
const data = useActionData();
|
|
456
|
+
return (
|
|
457
|
+
<Form method="post">
|
|
458
|
+
{data?.errors && <p>{data.errors}</p>}
|
|
459
|
+
<input name="title" />
|
|
460
|
+
<button>Save</button>
|
|
461
|
+
</Form>
|
|
462
|
+
);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// Rango: useActionState (standard React hook)
|
|
466
|
+
"use client";
|
|
467
|
+
import { useActionState } from "react";
|
|
468
|
+
import { saveForm } from "../actions"; // "use server" function
|
|
469
|
+
|
|
470
|
+
function EditForm() {
|
|
471
|
+
const [state, action, pending] = useActionState(saveForm, null);
|
|
472
|
+
return (
|
|
473
|
+
<form action={action}>
|
|
474
|
+
{state?.errors && <p>{state.errors}</p>}
|
|
475
|
+
<input name="title" />
|
|
476
|
+
<button disabled={pending}>Save</button>
|
|
477
|
+
</form>
|
|
478
|
+
);
|
|
479
|
+
}
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
Since Rango uses RSC server actions, all React action patterns work:
|
|
483
|
+
`useActionState`, `useOptimistic`, `useTransition`, `startTransition`,
|
|
484
|
+
and plain `<form action={serverAction}>`. No framework-specific hook needed.
|
|
485
|
+
|
|
486
|
+
For the full guide — defining actions, validation with Zod, error handling,
|
|
487
|
+
revalidation rules, file uploads, and progressive enhancement — see
|
|
488
|
+
`/server-actions`.
|
|
489
|
+
|
|
490
|
+
### clientLoader / clientAction (framework mode)
|
|
491
|
+
|
|
492
|
+
RR7 framework mode's `clientLoader` and `clientAction` run in the browser.
|
|
493
|
+
Rango does not have a framework-level client loader/action concept — these
|
|
494
|
+
migrate to standard React client-side code:
|
|
495
|
+
|
|
496
|
+
```typescript
|
|
497
|
+
// RR7: clientLoader fetching from a third-party API
|
|
498
|
+
export async function clientLoader() {
|
|
499
|
+
const res = await fetch("https://api.weather.com/current?city=london");
|
|
500
|
+
return res.json();
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// Rango: "use client" component with hooks
|
|
504
|
+
"use client";
|
|
505
|
+
import { useState, useEffect } from "react";
|
|
506
|
+
|
|
507
|
+
function WeatherWidget() {
|
|
508
|
+
const [weather, setWeather] = useState(null);
|
|
509
|
+
useEffect(() => {
|
|
510
|
+
fetch("https://api.weather.com/current?city=london")
|
|
511
|
+
.then((r) => r.json())
|
|
512
|
+
.then(setWeather);
|
|
513
|
+
}, []);
|
|
514
|
+
if (!weather) return <span>Loading...</span>;
|
|
515
|
+
return <span>{weather.temp}°C</span>;
|
|
516
|
+
}
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
The general rule: anything that ran in `clientLoader`/`clientAction` moves into
|
|
520
|
+
React hooks (`useState`, `useEffect`, `useActionState`, `useOptimistic`) inside
|
|
521
|
+
a `"use client"` component. There is no framework wrapper — it's just React.
|
|
522
|
+
|
|
523
|
+
### shouldRevalidate (framework mode)
|
|
524
|
+
|
|
525
|
+
RR7's `shouldRevalidate` export maps directly to Rango's `revalidate()` DSL:
|
|
526
|
+
|
|
527
|
+
```typescript
|
|
528
|
+
// RR7:
|
|
529
|
+
export function shouldRevalidate({ actionResult, currentParams, nextParams }) {
|
|
530
|
+
if (actionResult) return true;
|
|
531
|
+
return currentParams.slug !== nextParams.slug;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// Rango:
|
|
535
|
+
path("/product/:slug", ProductPage, { name: "product" }, () => [
|
|
536
|
+
revalidate(({ actionId, currentParams, nextParams }) => {
|
|
537
|
+
if (actionId) return true;
|
|
538
|
+
return currentParams.slug !== nextParams.slug;
|
|
539
|
+
}),
|
|
540
|
+
]);
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
Note: RR7's `shouldRevalidate` controls client-side loader re-fetching. Rango's
|
|
544
|
+
`revalidate()` controls which segments re-run during partial rendering after
|
|
545
|
+
navigation or actions. The intent is the same — skip unnecessary work — but
|
|
546
|
+
the mechanism is segment-level rather than loader-level.
|
|
547
|
+
|
|
548
|
+
## 4. Middleware / Route Protection
|
|
549
|
+
|
|
550
|
+
React Router doesn't have built-in middleware. Protection is typically done in loaders:
|
|
551
|
+
|
|
552
|
+
```typescript
|
|
553
|
+
// React Router: auth check in loader
|
|
554
|
+
export async function loader({ request }) {
|
|
555
|
+
const user = await getUser(request);
|
|
556
|
+
if (!user) throw redirect("/login");
|
|
557
|
+
return { user };
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
// Rango: router.use() for request-level auth
|
|
561
|
+
const router = createRouter({})
|
|
562
|
+
.use(authInit) // all routes — resolves session
|
|
563
|
+
.use("/dashboard/*", requireAuth) // scoped guard
|
|
564
|
+
.routes(urlpatterns);
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
Use `router.use()` for auth guards (wraps entire request including actions).
|
|
568
|
+
Use DSL `middleware()` for render-level concerns (context shaping, headers).
|
|
569
|
+
See `/middleware`.
|
|
570
|
+
|
|
571
|
+
## 5. Loading & Error States
|
|
572
|
+
|
|
573
|
+
### Loading / Suspense
|
|
574
|
+
|
|
575
|
+
```typescript
|
|
576
|
+
// React Router: defer() + Suspense, or HydrateFallback
|
|
577
|
+
export async function loader() {
|
|
578
|
+
return defer({ data: fetchData() });
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
// Rango: loading() DSL for automatic Suspense boundaries
|
|
582
|
+
path("/dashboard", DashboardPage, { name: "dashboard" }, () => [
|
|
583
|
+
loading(<DashboardSkeleton />),
|
|
584
|
+
])
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
### Error boundaries
|
|
588
|
+
|
|
589
|
+
```typescript
|
|
590
|
+
// React Router:
|
|
591
|
+
{ path: "dashboard", element: <Dashboard />, errorElement: <ErrorPage /> }
|
|
592
|
+
|
|
593
|
+
// or with ErrorBoundary component:
|
|
594
|
+
function ErrorBoundary() {
|
|
595
|
+
const error = useRouteError();
|
|
596
|
+
return <div>Error: {error.message}</div>;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
// Rango: errorBoundary() wrapping a group of routes
|
|
600
|
+
layout(<DashboardLayout />, () => [
|
|
601
|
+
errorBoundary(({ error, reset }) => (
|
|
602
|
+
<div>
|
|
603
|
+
<h2>Something went wrong</h2>
|
|
604
|
+
<button onClick={reset}>Try again</button>
|
|
605
|
+
</div>
|
|
606
|
+
)),
|
|
607
|
+
path("/dashboard", DashboardIndex, { name: "dashboard" }),
|
|
608
|
+
path("/dashboard/settings", Settings, { name: "settings" }),
|
|
609
|
+
])
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
### Not found
|
|
613
|
+
|
|
614
|
+
```typescript
|
|
615
|
+
// React Router: { path: "*", element: <NotFound /> }
|
|
616
|
+
|
|
617
|
+
// Rango (app-level):
|
|
618
|
+
createRouter({
|
|
619
|
+
notFound: ({ pathname }) => <NotFoundPage pathname={pathname} />,
|
|
620
|
+
})
|
|
621
|
+
|
|
622
|
+
// Rango (route-level — catches notFound() thrown in handlers/loaders):
|
|
623
|
+
layout(<ShopLayout />, () => [
|
|
624
|
+
notFoundBoundary(<ProductNotFound />),
|
|
625
|
+
path("/product/:slug", ProductPage, { name: "product" }),
|
|
626
|
+
])
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
## 6. Navigation
|
|
630
|
+
|
|
631
|
+
| React Router | Rango |
|
|
632
|
+
| ----------------------------------------- | -------------------------------------------------------------------------------- |
|
|
633
|
+
| `import { Link } from "react-router-dom"` | `import { Link } from "@rangojs/router/client"` |
|
|
634
|
+
| `<Link to="/about">` | `<Link to="/about">` |
|
|
635
|
+
| `useNavigate()` | `useRouter()` from `@rangojs/router/client` |
|
|
636
|
+
| `navigate("/about")` | `useRouter().push("/about")` |
|
|
637
|
+
| `navigate("/about", { replace: true })` | `useRouter().replace("/about")` |
|
|
638
|
+
| `navigate(-1)` | `useRouter().back()` |
|
|
639
|
+
| `useLocation().pathname` | `usePathname()` from `@rangojs/router/client` |
|
|
640
|
+
| `useSearchParams()` | `useSearchParams()` from `@rangojs/router/client` |
|
|
641
|
+
| `useParams()` | `useParams()` from `@rangojs/router/client` (or `ctx.params` in server handlers) |
|
|
642
|
+
| `useParams<T>()` | `useParams<T>()` — same generic annotation pattern |
|
|
643
|
+
| `<NavLink>` | `<Link>` with `usePathname()` for active state |
|
|
644
|
+
|
|
645
|
+
### useNavigate → useRouter
|
|
646
|
+
|
|
647
|
+
```typescript
|
|
648
|
+
// React Router:
|
|
649
|
+
const navigate = useNavigate();
|
|
650
|
+
navigate("/dashboard");
|
|
651
|
+
navigate(-1);
|
|
652
|
+
|
|
653
|
+
// Rango:
|
|
654
|
+
const router = useRouter();
|
|
655
|
+
router.push("/dashboard");
|
|
656
|
+
router.back();
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
## 7. Metadata / Head
|
|
660
|
+
|
|
661
|
+
```typescript
|
|
662
|
+
// React Router: meta function export (framework mode)
|
|
663
|
+
export function meta() {
|
|
664
|
+
return [{ title: "Home" }, { name: "description", content: "Welcome" }];
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
// Rango: Meta handle in server handlers
|
|
668
|
+
import { Meta } from "@rangojs/router";
|
|
669
|
+
|
|
670
|
+
const HomePage: Handler<"home"> = (ctx) => {
|
|
671
|
+
const meta = ctx.use(Meta);
|
|
672
|
+
meta({ title: "Home" });
|
|
673
|
+
meta({ name: "description", content: "Welcome" });
|
|
674
|
+
return <div>Home page</div>;
|
|
675
|
+
};
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
Add `<MetaTags />` in the Document component's `<head>`:
|
|
679
|
+
|
|
680
|
+
```typescript
|
|
681
|
+
import { MetaTags } from "@rangojs/router/client";
|
|
682
|
+
|
|
683
|
+
function Document({ children }: { children: ReactNode }) {
|
|
684
|
+
return (
|
|
685
|
+
<html>
|
|
686
|
+
<head>
|
|
687
|
+
<MetaTags />
|
|
688
|
+
</head>
|
|
689
|
+
<body>{children}</body>
|
|
690
|
+
</html>
|
|
691
|
+
);
|
|
692
|
+
}
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
## 8. API / Resource Routes
|
|
696
|
+
|
|
697
|
+
```typescript
|
|
698
|
+
// React Router (framework mode):
|
|
699
|
+
// app/routes/api.users.ts
|
|
700
|
+
export async function loader() {
|
|
701
|
+
return Response.json(await getUsers());
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
// Rango: response routes
|
|
705
|
+
path.json(
|
|
706
|
+
"/api/users",
|
|
707
|
+
async () => {
|
|
708
|
+
return await getUsers();
|
|
709
|
+
},
|
|
710
|
+
{ name: "apiUsers" },
|
|
711
|
+
);
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
See `/response-routes` for `path.json()`, `path.text()`, `path.html()`, etc.
|
|
715
|
+
|
|
716
|
+
## 9. Theme / Dark Mode
|
|
717
|
+
|
|
718
|
+
Rango has a built-in theme system with FOUC prevention. If the React Router app
|
|
719
|
+
uses a custom theme provider or `next-themes`, replace it with Rango's theme API:
|
|
720
|
+
|
|
721
|
+
```typescript
|
|
722
|
+
const router = createRouter({
|
|
723
|
+
theme: true, // or { defaultTheme: "system", attribute: "class" }
|
|
724
|
+
});
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
Client components use `useTheme()` to read and toggle:
|
|
728
|
+
|
|
729
|
+
```typescript
|
|
730
|
+
"use client";
|
|
731
|
+
import { useTheme } from "@rangojs/router/theme";
|
|
732
|
+
|
|
733
|
+
function ThemeToggle() {
|
|
734
|
+
const { theme, setTheme } = useTheme();
|
|
735
|
+
return <button onClick={() => setTheme(theme === "dark" ? "light" : "dark")}>{theme}</button>;
|
|
736
|
+
}
|
|
737
|
+
```
|
|
738
|
+
|
|
739
|
+
See `/theme` for full API including system detection and cookie persistence.
|
|
740
|
+
|
|
741
|
+
## 10. Key Conceptual Differences
|
|
742
|
+
|
|
743
|
+
| Concept | React Router | Rango |
|
|
744
|
+
| ------------------- | ----------------------------------- | -------------------------------------- |
|
|
745
|
+
| Rendering | Client-side by default, SSR opt-in | Server components by default (RSC) |
|
|
746
|
+
| Data loading | `loader()` + `useLoaderData()` | Direct fetch in server components |
|
|
747
|
+
| Form actions | Route-scoped `action()` | Function-scoped `"use server"` |
|
|
748
|
+
| Route definition | File-based or `createBrowserRouter` | `urls()` DSL with `path()`, `layout()` |
|
|
749
|
+
| Middleware | Not built-in (use loaders) | `router.use()` + DSL `middleware()` |
|
|
750
|
+
| Parallel routes | Not built-in | `parallel()` DSL |
|
|
751
|
+
| Intercepting routes | Not built-in | `intercept()` DSL |
|
|
752
|
+
| Caching | Not built-in | `cache()` DSL, `"use cache"` |
|
|
753
|
+
| Type-safe routes | Partial (v7 framework mode) | Full: params, names, href, reverse |
|
|
754
|
+
|
|
755
|
+
## Migration Checklist
|
|
756
|
+
|
|
757
|
+
1. [ ] Set up Vite config with `rango()` plugin
|
|
758
|
+
2. [ ] Create Document component with `<MetaTags />` in head
|
|
759
|
+
3. [ ] Create `router.tsx` with `createRouter()`
|
|
760
|
+
4. [ ] Convert route config / file routes to `urls()` DSL
|
|
761
|
+
5. [ ] Migrate layouts — keep `<Outlet />` (import from `@rangojs/router/client`)
|
|
762
|
+
6. [ ] Merge loaders + components into handler functions (fetch + render in one place)
|
|
763
|
+
7. [ ] Convert React Router actions to `"use server"` functions
|
|
764
|
+
8. [ ] Migrate auth guards from loaders to `router.use()`
|
|
765
|
+
9. [ ] Replace `react-router-dom` Link/navigation with `@rangojs/router/client`
|
|
766
|
+
10. [ ] Convert error boundaries to `errorBoundary()` DSL
|
|
767
|
+
11. [ ] Update metadata to use `Meta` handle + `<MetaTags />`
|
|
768
|
+
12. [ ] Replace custom theme provider with `theme: true` in createRouter (see `/theme`)
|
|
769
|
+
13. [ ] Run `npx rango generate src/` to generate route types
|