@rangojs/router 0.0.0-experimental.15 → 0.0.0-experimental.151
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 +13 -0
- package/README.md +308 -451
- 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 +1844 -237
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/{src/handles/index.ts → dist/handles/index.js} +1 -1
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -8
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +7554 -2070
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +142 -61
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +489 -0
- package/skills/caching/SKILL.md +413 -26
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +278 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +16 -18
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +96 -63
- package/skills/fonts/SKILL.md +7 -5
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +76 -436
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +215 -16
- package/skills/layout/SKILL.md +147 -7
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +629 -55
- package/skills/middleware/SKILL.md +251 -38
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +60 -21
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +296 -4
- package/skills/ppr/SKILL.md +658 -0
- package/skills/prerender/SKILL.md +487 -52
- package/skills/rango/SKILL.md +324 -29
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +264 -122
- package/skills/route/SKILL.md +359 -22
- package/skills/router-setup/SKILL.md +247 -34
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +126 -222
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +10 -9
- package/skills/typesafety/SKILL.md +45 -496
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +383 -0
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +77 -44
- package/src/bin/rango.ts +275 -29
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +348 -212
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +39 -0
- package/src/browser/merge-segment-loaders.ts +23 -13
- package/src/browser/navigation-bridge.ts +385 -576
- package/src/browser/navigation-client.ts +249 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +230 -124
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +88 -0
- package/src/browser/partial-update.ts +432 -365
- package/src/browser/prefetch/cache.ts +381 -0
- package/src/browser/prefetch/fetch.ts +462 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +209 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +284 -67
- package/src/browser/react/NavigationProvider.tsx +267 -109
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +70 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +272 -60
- package/src/browser/react/location-state.ts +90 -20
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +39 -13
- package/src/browser/react/use-navigation.ts +53 -69
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +164 -0
- package/src/browser/rsc-router.tsx +355 -73
- package/src/browser/scroll-restoration.ts +140 -50
- package/src/browser/segment-reconciler.ts +253 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +668 -613
- package/src/browser/types.ts +235 -51
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +243 -183
- package/src/build/generate-route-types.ts +41 -848
- package/src/build/index.ts +12 -7
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +218 -80
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +105 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +812 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +144 -0
- package/src/build/route-types/router-processing.ts +695 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +223 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +88 -0
- package/src/cache/cache-policy.ts +199 -0
- package/src/cache/cache-runtime.ts +695 -0
- package/src/cache/cache-scope.ts +324 -335
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2602 -156
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +17 -17
- package/src/cache/document-cache.ts +226 -102
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +132 -0
- package/src/cache/index.ts +24 -35
- package/src/cache/memory-segment-store.ts +446 -30
- package/src/cache/profile-registry.ts +88 -0
- package/src/cache/read-through-swr.ts +178 -0
- package/src/cache/segment-codec.ts +295 -0
- package/src/cache/shell-snapshot.ts +464 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +283 -211
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1201 -0
- package/src/client.rsc.tsx +43 -21
- package/src/client.tsx +131 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +13 -3
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +4 -2
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +106 -10
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +110 -35
- package/src/handles/MetaTags.tsx +83 -59
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +44 -53
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +20 -65
- package/src/host/errors.ts +21 -30
- package/src/host/index.ts +13 -9
- package/src/host/pattern-matcher.ts +50 -79
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +180 -35
- package/src/index.ts +245 -73
- package/src/internal-debug.ts +9 -2
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/build-shell-capture.ts +447 -0
- package/src/prerender/param-hash.ts +16 -14
- package/src/prerender/shell-manifest-key.ts +20 -0
- package/src/prerender/store.ts +131 -22
- package/src/prerender.ts +460 -26
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +22 -77
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +88 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +54 -0
- package/src/route-definition/redirect.ts +134 -0
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-definition.ts +1 -1481
- package/src/route-map-builder.ts +120 -145
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +71 -45
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +305 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +54 -27
- package/src/router/find-match.ts +259 -0
- package/src/router/handler-context.ts +385 -125
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +88 -28
- package/src/router/lazy-includes.ts +260 -0
- package/src/router/loader-resolution.ts +449 -157
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +144 -62
- package/src/router/match-api.ts +224 -256
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +499 -0
- package/src/router/match-middleware/background-revalidation.ts +117 -93
- package/src/router/match-middleware/cache-lookup.ts +308 -150
- package/src/router/match-middleware/cache-store.ts +123 -51
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +143 -52
- package/src/router/metrics.ts +235 -29
- package/src/router/middleware-types.ts +110 -0
- package/src/router/middleware.ts +526 -441
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +311 -142
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +575 -0
- package/src/router/preview-match.ts +102 -0
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +203 -62
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +45 -48
- package/src/router/router-interfaces.ts +564 -0
- package/src/router/router-options.ts +784 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +812 -0
- package/src/router/segment-resolution/helpers.ts +348 -0
- package/src/router/segment-resolution/loader-cache.ts +315 -0
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +99 -0
- package/src/router/segment-resolution/revalidation.ts +1340 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +25 -1354
- package/src/router/segment-wrappers.ts +292 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +259 -0
- package/src/router/telemetry.ts +385 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +240 -61
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +795 -2390
- package/src/rsc/capture-queue.ts +67 -0
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +956 -1164
- package/src/rsc/helpers.ts +736 -19
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +305 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +23 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +541 -0
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +257 -0
- package/src/rsc/rsc-rendering.ts +856 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +525 -0
- package/src/rsc/shell-build-manifest.ts +316 -0
- package/src/rsc/shell-capture-constants.ts +27 -0
- package/src/rsc/shell-capture.ts +1716 -0
- package/src/rsc/shell-serve.ts +226 -0
- package/src/rsc/ssr-setup.ts +176 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +95 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +99 -82
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-fragments.ts +124 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +464 -135
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +640 -85
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +337 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +123 -42
- package/src/server/loader-registry.ts +51 -100
- package/src/server/request-context.ts +1069 -152
- package/src/server.ts +15 -8
- package/src/ssr/index.tsx +661 -140
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/preinit-client-references.ts +106 -0
- package/src/ssr/ssr-root.tsx +261 -0
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +380 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +371 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +219 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +76 -98
- package/src/theme/ThemeScript.tsx +12 -14
- package/src/theme/constants.ts +57 -15
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +43 -39
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +850 -0
- package/src/types/index.ts +81 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +138 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +271 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +162 -0
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +44 -0
- package/src/urls/path-helper-types.ts +418 -0
- package/src/urls/path-helper.ts +280 -0
- package/src/urls/pattern-types.ts +189 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +316 -0
- package/src/urls/urls-function.ts +80 -0
- package/src/urls.ts +1 -1352
- package/src/use-loader.tsx +406 -141
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +408 -0
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +483 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/shell-prerender-phase.ts +397 -0
- package/src/vite/discovery/state.ts +205 -0
- package/src/vite/discovery/virtual-module-codegen.ts +293 -0
- package/src/vite/index.ts +31 -2255
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +336 -0
- package/src/vite/plugins/cjs-to-esm.ts +90 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
- package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +805 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +94 -0
- package/src/vite/plugins/version-plugin.ts +271 -0
- package/src/vite/plugins/virtual-entries.ts +267 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +600 -0
- package/src/vite/router-discovery.ts +2120 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +268 -0
- package/src/vite/utils/shared-utils.ts +271 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -1,45 +1,24 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Rango
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A code-first, type-safe React Server Components router. Django-inspired:
|
|
4
|
+
routes are expressed in one visible tree, URLs are built from names, and
|
|
5
|
+
everything past the core is opt-in.
|
|
4
6
|
|
|
5
|
-
> **Experimental:** This package is under active development. APIs may change
|
|
7
|
+
> **Experimental:** This package is under active development. APIs may change
|
|
8
|
+
> between releases. Install with `@experimental` tag.
|
|
6
9
|
|
|
7
|
-
|
|
10
|
+
This page is a tour: it builds one small shop and meets the entire core API
|
|
11
|
+
along the way — about six primitives. Everything else is opt-in and linked at
|
|
12
|
+
the end. For the design rationale behind these APIs, read
|
|
13
|
+
[Why Rango](https://github.com/ivogt/vite-rsc/blob/main/packages/rangojs-router/docs/why-rango.md); this page shows how it feels, that page
|
|
14
|
+
argues why it's right.
|
|
8
15
|
|
|
9
|
-
|
|
10
|
-
- **Named routes** — `reverse("blogPost", { slug })` for type-safe URL generation (Django-style)
|
|
11
|
-
- **Data loaders** — `createLoader()` with automatic streaming and Suspense integration
|
|
12
|
-
- **Layouts & nesting** — Nested layouts with `<Outlet />` and parallel routes
|
|
13
|
-
- **Segment-level caching** — `cache()` DSL with TTL/SWR and pluggable cache stores
|
|
14
|
-
- **Middleware** — Route-level middleware with cookie and header access
|
|
15
|
-
- **Pre-rendering** — `Prerender()` and `Static()` handlers for build-time rendering
|
|
16
|
-
- **Theme support** — Light/dark mode with FOUC prevention and system detection
|
|
17
|
-
- **Host routing** — Multi-app routing by domain/subdomain via `@rangojs/router/host`
|
|
18
|
-
- **Response routes** — `path.json()`, `path.text()`, `path.xml()` for API endpoints
|
|
19
|
-
- **CLI codegen** — `rango generate` for route type generation
|
|
20
|
-
|
|
21
|
-
## Installation
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
npm install @rangojs/router@experimental
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
Peer dependencies:
|
|
16
|
+
## Install
|
|
28
17
|
|
|
29
18
|
```bash
|
|
30
|
-
npm install react @vitejs/plugin-rsc
|
|
19
|
+
npm install @rangojs/router@experimental react @vitejs/plugin-rsc
|
|
31
20
|
```
|
|
32
21
|
|
|
33
|
-
For Cloudflare Workers:
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
npm install @cloudflare/vite-plugin
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## Quick Start
|
|
40
|
-
|
|
41
|
-
### Vite Config
|
|
42
|
-
|
|
43
22
|
```ts
|
|
44
23
|
// vite.config.ts
|
|
45
24
|
import react from "@vitejs/plugin-react";
|
|
@@ -47,557 +26,435 @@ import { defineConfig } from "vite";
|
|
|
47
26
|
import { rango } from "@rangojs/router/vite";
|
|
48
27
|
|
|
49
28
|
export default defineConfig({
|
|
50
|
-
plugins: [
|
|
51
|
-
react(),
|
|
52
|
-
rango({ preset: "cloudflare" }),
|
|
53
|
-
],
|
|
29
|
+
plugins: [react(), rango({ preset: "cloudflare" })],
|
|
54
30
|
});
|
|
55
31
|
```
|
|
56
32
|
|
|
57
|
-
|
|
33
|
+
The `cloudflare` preset targets Cloudflare Workers (add
|
|
34
|
+
`@cloudflare/vite-plugin`); the `vercel` preset emits a ready-to-deploy
|
|
35
|
+
`.vercel/output` (Build Output API) from a plain `vite build` — see the
|
|
36
|
+
[`/vercel` skill](./skills/vercel/SKILL.md); omit `preset` for the default
|
|
37
|
+
Node setup.
|
|
38
|
+
|
|
39
|
+
## Using the skills with your coding agent
|
|
40
|
+
|
|
41
|
+
This package ships 43 agent skills in `node_modules/@rangojs/router/skills/` —
|
|
42
|
+
task-focused guides written for LLM coding agents. Start at
|
|
43
|
+
`skills/rango/SKILL.md` (the mental model + catalog); a machine-readable index
|
|
44
|
+
is at `skills/catalog.json`.
|
|
45
|
+
|
|
46
|
+
- **Claude Code**: point it at the skills (e.g. "read
|
|
47
|
+
node_modules/@rangojs/router/skills/rango/SKILL.md before routing work"), or
|
|
48
|
+
copy/symlink the directories you use into your project's `.claude/skills/`.
|
|
49
|
+
- **Other agents (Cursor, Codex CLI, Gemini CLI, ...)**: these harnesses
|
|
50
|
+
auto-discover skills from `.agents/skills/` in your project (or
|
|
51
|
+
`~/.agents/skills/`) — copy or symlink the skill directories you use from
|
|
52
|
+
`node_modules/@rangojs/router/skills/<name>` into `.agents/skills/<name>`.
|
|
53
|
+
The files are plain markdown; cross-references like `/loader` name sibling
|
|
54
|
+
skill directories.
|
|
55
|
+
|
|
56
|
+
## 1. Pages
|
|
57
|
+
|
|
58
|
+
A router is a tree. `path()` places a page, `layout()` wraps children,
|
|
59
|
+
`{ name }` gives a route an identity:
|
|
58
60
|
|
|
59
61
|
```tsx
|
|
60
62
|
// src/router.tsx
|
|
61
63
|
import { createRouter, urls } from "@rangojs/router";
|
|
62
64
|
import { Document } from "./document";
|
|
65
|
+
import { ShopLayout } from "./layouts/shop";
|
|
66
|
+
import { HomePage } from "./routes/home";
|
|
67
|
+
import { ProductPage } from "./routes/product";
|
|
63
68
|
|
|
64
69
|
const urlpatterns = urls(({ path, layout }) => [
|
|
65
|
-
layout(<
|
|
70
|
+
layout(<ShopLayout />, () => [
|
|
66
71
|
path("/", HomePage, { name: "home" }),
|
|
67
|
-
path("/
|
|
68
|
-
path("/blog/:slug", BlogPostPage, { name: "blogPost" }),
|
|
72
|
+
path("/products/:slug", ProductPage, { name: "product" }),
|
|
69
73
|
]),
|
|
70
74
|
]);
|
|
71
75
|
|
|
72
|
-
export const router = createRouter({ document: Document })
|
|
73
|
-
.routes(urlpatterns);
|
|
74
|
-
|
|
75
|
-
// Export typed reverse function for URL generation by route name
|
|
76
|
-
export const reverse = router.reverse;
|
|
76
|
+
export const router = createRouter({ document: Document }).routes(urlpatterns);
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
```tsx
|
|
80
|
+
// src/layouts/shop.tsx
|
|
81
|
+
import { Outlet } from "@rangojs/router/client";
|
|
82
|
+
|
|
83
|
+
export function ShopLayout() {
|
|
84
|
+
return (
|
|
85
|
+
<div>
|
|
86
|
+
<nav>Shop</nav>
|
|
87
|
+
<main>
|
|
88
|
+
<Outlet /> {/* child routes render here */}
|
|
89
|
+
</main>
|
|
90
|
+
</div>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
```
|
|
80
94
|
|
|
81
95
|
```tsx
|
|
82
96
|
// src/document.tsx
|
|
83
97
|
"use client";
|
|
84
98
|
|
|
85
99
|
import type { ReactNode } from "react";
|
|
86
|
-
import { MetaTags } from "@rangojs/router/client";
|
|
100
|
+
import { MetaTags, Scripts } from "@rangojs/router/client";
|
|
87
101
|
|
|
88
102
|
export function Document({ children }: { children: ReactNode }) {
|
|
89
103
|
return (
|
|
90
104
|
<html lang="en">
|
|
91
105
|
<head>
|
|
92
106
|
<MetaTags />
|
|
107
|
+
<Scripts />
|
|
93
108
|
</head>
|
|
94
|
-
<body>
|
|
109
|
+
<body>
|
|
110
|
+
<Scripts position="body" />
|
|
111
|
+
{children}
|
|
112
|
+
</body>
|
|
95
113
|
</html>
|
|
96
114
|
);
|
|
97
115
|
}
|
|
98
116
|
```
|
|
99
117
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
### Path Patterns
|
|
103
|
-
|
|
104
|
-
```tsx
|
|
105
|
-
import { urls } from "@rangojs/router";
|
|
106
|
-
|
|
107
|
-
const urlpatterns = urls(({ path }) => [
|
|
108
|
-
path("/", HomePage, { name: "home" }),
|
|
109
|
-
path("/product/:slug", ProductPage, { name: "product" }),
|
|
110
|
-
path("/search/:query?", SearchPage, { name: "search" }),
|
|
111
|
-
path("/files/*", FilesPage, { name: "files" }),
|
|
112
|
-
]);
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
### Typed Handlers
|
|
118
|
+
(The built-in `DefaultDocument` already wires all of this — a custom document
|
|
119
|
+
is optional.)
|
|
116
120
|
|
|
117
|
-
|
|
121
|
+
A handler is a function of `ctx`. Typing it by route name gives typed params
|
|
122
|
+
— the Vite plugin generates the route map automatically, nothing to register:
|
|
118
123
|
|
|
119
124
|
```tsx
|
|
125
|
+
// src/routes/product.tsx
|
|
120
126
|
import type { Handler } from "@rangojs/router";
|
|
121
127
|
|
|
122
128
|
export const ProductPage: Handler<"product"> = (ctx) => {
|
|
123
|
-
|
|
124
|
-
const homeUrl = ctx.reverse("home"); // type-safe URL by route name
|
|
125
|
-
return <h1>Product: {slug}</h1>;
|
|
126
|
-
};
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### Search Params
|
|
130
|
-
|
|
131
|
-
Define a search schema on the route for type-safe search parameters:
|
|
132
|
-
|
|
133
|
-
```tsx
|
|
134
|
-
const urlpatterns = urls(({ path }) => [
|
|
135
|
-
path("/search", SearchPage, {
|
|
136
|
-
name: "search",
|
|
137
|
-
search: { q: "string", page: "number?", sort: "string?" },
|
|
138
|
-
}),
|
|
139
|
-
]);
|
|
140
|
-
|
|
141
|
-
// Handler receives typed searchParams
|
|
142
|
-
const SearchPage: Handler<"search"> = (ctx) => {
|
|
143
|
-
const { q, page, sort } = ctx.searchParams;
|
|
144
|
-
// q: string, page: number | undefined, sort: string | undefined
|
|
129
|
+
return <h1>{ctx.params.slug}</h1>; // slug: string, from the pattern
|
|
145
130
|
};
|
|
146
131
|
```
|
|
147
132
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
Define API endpoints that bypass the RSC pipeline:
|
|
133
|
+
And because routes have names, URLs are built, never hand-written:
|
|
151
134
|
|
|
152
135
|
```tsx
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
path.text("/robots.txt", () => "User-agent: *\nAllow: /", { name: "robots" }),
|
|
156
|
-
path.xml("/feed.xml", () => "<rss>...</rss>", { name: "feed" }),
|
|
157
|
-
]);
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
Response types available: `path.json()`, `path.text()`, `path.html()`, `path.xml()`, `path.image()`, `path.stream()`, `path.any()`.
|
|
161
|
-
|
|
162
|
-
## Layouts & Nesting
|
|
163
|
-
|
|
164
|
-
### Layouts with Outlet
|
|
165
|
-
|
|
166
|
-
```tsx
|
|
167
|
-
import { urls } from "@rangojs/router";
|
|
168
|
-
|
|
169
|
-
const urlpatterns = urls(({ path, layout }) => [
|
|
170
|
-
layout(<MainLayout />, () => [
|
|
171
|
-
path("/", HomePage, { name: "home" }),
|
|
172
|
-
path("/about", AboutPage, { name: "about" }),
|
|
173
|
-
]),
|
|
174
|
-
]);
|
|
136
|
+
const url = ctx.reverse("product", { slug: "espresso-cup" });
|
|
137
|
+
// "/products/espresso-cup" — name and params compile-time checked
|
|
175
138
|
```
|
|
176
139
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
140
|
+
Rename `/products/:slug` to `/shop/:slug` in the one place it's defined and
|
|
141
|
+
every link, redirect, and prefetch follows. In client components, `href()`
|
|
142
|
+
validates static paths against the registered patterns:
|
|
143
|
+
`<Link to={href("/")}>Home</Link>`.
|
|
180
144
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
145
|
+
The tree is also lazy-first, which is the shape serverless cold starts want.
|
|
146
|
+
`include()` mounts a whole route module under a prefix — and with the async
|
|
147
|
+
form, `include("/shop", () => import("./shop"))`, the group is code-split:
|
|
148
|
+
its module doesn't load or run until a request matches it, a group nobody
|
|
149
|
+
visits never evaluates at all, and warm requests run zero route handlers.
|
|
150
|
+
Boot cost stays flat as the app grows — one module body at startup, not one
|
|
151
|
+
per group — while matching stays an `O(path length)` prefix trie, identical
|
|
152
|
+
in dev and production. None of this is assumed: the trie is benchmarked
|
|
153
|
+
in-repo against multi-thousand-route manifests, and the lazy guarantees are
|
|
154
|
+
pinned by run-count tests (see
|
|
155
|
+
[matching & lazy discovery](https://github.com/ivogt/vite-rsc/blob/main/packages/rangojs-router/docs/internal/matching-and-lazy-discovery.md)).
|
|
156
|
+
Grow the tree without watching the boot time.
|
|
190
157
|
|
|
191
|
-
|
|
158
|
+
That's a working site. Everything below adds to this app.
|
|
192
159
|
|
|
193
|
-
|
|
194
|
-
const urlpatterns = urls(({ path, loading }) => [
|
|
195
|
-
path("/product/:slug", ProductPage, { name: "product" }, () => [
|
|
196
|
-
loading(<ProductSkeleton />),
|
|
197
|
-
]),
|
|
198
|
-
]);
|
|
199
|
-
```
|
|
160
|
+
## 2. Data
|
|
200
161
|
|
|
201
|
-
|
|
162
|
+
The product page needs data. A handler is an async server component — fetch
|
|
163
|
+
where you render:
|
|
202
164
|
|
|
203
165
|
```tsx
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
path("/blog", BlogIndexPage, { name: "blog" }),
|
|
211
|
-
path("/blog/:slug", BlogPostPage, { name: "blogPost" }),
|
|
212
|
-
]),
|
|
213
|
-
]);
|
|
166
|
+
// src/routes/product.tsx
|
|
167
|
+
export const ProductPage: Handler<"product"> = async (ctx) => {
|
|
168
|
+
const product = await db.products.find(ctx.params.slug);
|
|
169
|
+
ctx.use(Meta)({ title: product.name }); // metadata where the data is
|
|
170
|
+
return <ProductView product={product} />;
|
|
171
|
+
};
|
|
214
172
|
```
|
|
215
173
|
|
|
216
|
-
|
|
174
|
+
That's the default data path. React Router and Remix split data into a
|
|
175
|
+
loader beside the component because components couldn't fetch; RSC collapses
|
|
176
|
+
the split, and Rango doesn't reintroduce it. (That `ctx.use(Meta)` line is
|
|
177
|
+
also the whole metadata story: push tags where the data already is, layouts
|
|
178
|
+
set title templates, deeper segments override — no separate metadata export,
|
|
179
|
+
no second fetch.)
|
|
217
180
|
|
|
218
|
-
|
|
181
|
+
Loaders enter when data needs a life of its own. First case: a **client
|
|
182
|
+
component** needs server data — the stock badge is interactive, but the
|
|
183
|
+
stock lives in the database:
|
|
219
184
|
|
|
220
185
|
```tsx
|
|
186
|
+
// src/loaders/stock.ts
|
|
221
187
|
import { createLoader } from "@rangojs/router";
|
|
222
188
|
|
|
223
|
-
export const
|
|
224
|
-
|
|
225
|
-
return
|
|
189
|
+
export const StockLoader = createLoader(async (ctx) => {
|
|
190
|
+
"use server";
|
|
191
|
+
return db.stockFor(ctx.params.slug);
|
|
226
192
|
});
|
|
227
193
|
```
|
|
228
194
|
|
|
229
|
-
### Using in Server Components (Handlers)
|
|
230
|
-
|
|
231
195
|
```tsx
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
const { posts } = await ctx.use(BlogSidebarLoader);
|
|
237
|
-
return <ul>{posts.map(p => <li key={p.slug}>{p.title}</li>)}</ul>;
|
|
238
|
-
}
|
|
196
|
+
path("/products/:slug", ProductPage, { name: "product" }, () => [
|
|
197
|
+
loader(StockLoader),
|
|
198
|
+
loading(<ProductSkeleton />),
|
|
199
|
+
]),
|
|
239
200
|
```
|
|
240
201
|
|
|
241
|
-
### Using in Client Components
|
|
242
|
-
|
|
243
202
|
```tsx
|
|
203
|
+
// src/components/stock-badge.tsx
|
|
244
204
|
"use client";
|
|
245
205
|
import { useLoader } from "@rangojs/router/client";
|
|
246
|
-
import {
|
|
206
|
+
import { StockLoader } from "../loaders/stock";
|
|
247
207
|
|
|
248
|
-
function
|
|
249
|
-
const {
|
|
250
|
-
return <
|
|
208
|
+
export function StockBadge() {
|
|
209
|
+
const { data } = useLoader(StockLoader);
|
|
210
|
+
return <span>{data.inStock ? "In stock" : "Sold out"}</span>;
|
|
251
211
|
}
|
|
252
212
|
```
|
|
253
213
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
path("/blog", BlogIndexPage, { name: "blog" }, () => [
|
|
259
|
-
loader(BlogSidebarLoader),
|
|
260
|
-
]),
|
|
261
|
-
]);
|
|
262
|
-
```
|
|
214
|
+
Loaders run in parallel with the handler and stream; `loading()` opts the
|
|
215
|
+
segment into skeleton-then-stream. Without it, document requests arrive
|
|
216
|
+
**ready** — the HTML ships with data in place; the skeleton is a per-segment
|
|
217
|
+
choice, not the first impression.
|
|
263
218
|
|
|
264
|
-
|
|
219
|
+
The rule of thumb: fetch in the **handler** when the data belongs to the
|
|
220
|
+
rendered page — it will be frozen with the shell if you cache it (step 4).
|
|
221
|
+
Put data in a **loader** when it must outlive the shell: shared with client
|
|
222
|
+
components, fresh on every hit even when the segment is cached, refetchable
|
|
223
|
+
from the client, or revalidated on its own after actions.
|
|
265
224
|
|
|
266
|
-
|
|
225
|
+
## 3. Mutations
|
|
267
226
|
|
|
268
|
-
|
|
227
|
+
Users add to cart. A server action is a plain `"use server"` function; the
|
|
228
|
+
form posts to it with standard React 19 hooks — and it works without
|
|
229
|
+
JavaScript:
|
|
269
230
|
|
|
270
231
|
```tsx
|
|
271
|
-
|
|
272
|
-
|
|
232
|
+
// src/actions/cart.ts
|
|
233
|
+
"use server";
|
|
273
234
|
|
|
274
|
-
function
|
|
275
|
-
|
|
276
|
-
<nav>
|
|
277
|
-
<Link to={reverse("home")}>Home</Link>
|
|
278
|
-
<Link to={reverse("blogPost", { slug: "my-post" })}>My Post</Link>
|
|
279
|
-
<Link to={reverse("about")}>About</Link>
|
|
280
|
-
</nav>
|
|
281
|
-
);
|
|
235
|
+
export async function addToCart(productId: string) {
|
|
236
|
+
await db.cart.insert({ productId });
|
|
282
237
|
}
|
|
283
238
|
```
|
|
284
239
|
|
|
285
|
-
`reverse()` is type-safe — route names and required params are checked at compile time. Included routes use dotted names: `reverse("api.health")`.
|
|
286
|
-
|
|
287
|
-
Handlers also have `ctx.reverse()` directly on the context:
|
|
288
|
-
|
|
289
|
-
```tsx
|
|
290
|
-
const BlogPostPage: Handler<"blogPost"> = (ctx) => {
|
|
291
|
-
const backUrl = ctx.reverse("blog");
|
|
292
|
-
return <Link to={backUrl}>Back to blog</Link>;
|
|
293
|
-
};
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
### `href()` for Path Validation (Client Components)
|
|
297
|
-
|
|
298
|
-
In client components, use `href()` for compile-time path validation:
|
|
299
|
-
|
|
300
|
-
```tsx
|
|
301
|
-
"use client";
|
|
302
|
-
import { Link, href } from "@rangojs/router/client";
|
|
303
|
-
|
|
304
|
-
function Nav() {
|
|
305
|
-
return (
|
|
306
|
-
<nav>
|
|
307
|
-
<Link to={href("/")}>Home</Link>
|
|
308
|
-
<Link to={href("/blog")} prefetch="intent">Blog</Link>
|
|
309
|
-
<Link to={href("/about")}>About</Link>
|
|
310
|
-
</nav>
|
|
311
|
-
);
|
|
312
|
-
}
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
`href()` validates that the path matches a registered route pattern at compile time (e.g. `/blog/my-post` matches `/blog/:slug`).
|
|
316
|
-
|
|
317
|
-
### Navigation Hook
|
|
318
|
-
|
|
319
|
-
```tsx
|
|
320
|
-
"use client";
|
|
321
|
-
import { useNavigation } from "@rangojs/router/client";
|
|
322
|
-
|
|
323
|
-
function SearchForm() {
|
|
324
|
-
const { navigate, isPending } = useNavigation();
|
|
325
|
-
|
|
326
|
-
function handleSubmit(query: string) {
|
|
327
|
-
navigate(`/search?q=${encodeURIComponent(query)}`);
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
return <form onSubmit={...}>{isPending && <Spinner />}</form>;
|
|
331
|
-
}
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
### Scroll Restoration
|
|
335
|
-
|
|
336
240
|
```tsx
|
|
241
|
+
// src/components/add-to-cart.tsx
|
|
337
242
|
"use client";
|
|
338
|
-
import {
|
|
243
|
+
import { useActionState } from "react";
|
|
244
|
+
import { addToCart } from "../actions/cart";
|
|
339
245
|
|
|
340
|
-
function
|
|
246
|
+
export function AddToCart({ productId }: { productId: string }) {
|
|
247
|
+
const [, action, pending] = useActionState(() => addToCart(productId), null);
|
|
341
248
|
return (
|
|
342
|
-
<
|
|
343
|
-
<
|
|
344
|
-
|
|
345
|
-
<ScrollRestoration />
|
|
346
|
-
</body>
|
|
347
|
-
</html>
|
|
249
|
+
<form action={action}>
|
|
250
|
+
<button disabled={pending}>{pending ? "Adding…" : "Add to cart"}</button>
|
|
251
|
+
</form>
|
|
348
252
|
);
|
|
349
253
|
}
|
|
350
254
|
```
|
|
351
255
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
256
|
+
After an action, route segments and loaders re-render by default so the UI
|
|
257
|
+
reflects the new state. `revalidate()` narrows that to the segments that
|
|
258
|
+
actually own the data — matched by action **reference**, so renames are
|
|
259
|
+
compile errors, not stale predicates:
|
|
355
260
|
|
|
356
261
|
```tsx
|
|
357
|
-
|
|
358
|
-
import { urls } from "@rangojs/router";
|
|
359
|
-
|
|
360
|
-
export const apiPatterns = urls(({ path }) => [
|
|
361
|
-
path.json("/health", () => ({ status: "ok" }), { name: "health" }),
|
|
362
|
-
path.json("/products", getProducts, { name: "products" }),
|
|
363
|
-
]);
|
|
364
|
-
|
|
365
|
-
// src/urls.tsx
|
|
366
|
-
import { urls } from "@rangojs/router";
|
|
367
|
-
import { apiPatterns } from "./api/urls";
|
|
262
|
+
import * as CartActions from "./actions/cart";
|
|
368
263
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
// Mounts apiPatterns under /api: /api/health, /api/products
|
|
373
|
-
]);
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
Included route names are prefixed with the include name: `reverse("api.health")`, `reverse("api.products")`.
|
|
377
|
-
|
|
378
|
-
## Middleware
|
|
379
|
-
|
|
380
|
-
```tsx
|
|
381
|
-
const urlpatterns = urls(({ path, middleware }) => [
|
|
382
|
-
middleware(async (ctx, next) => {
|
|
383
|
-
const start = Date.now();
|
|
384
|
-
const response = await next();
|
|
385
|
-
console.log(`${ctx.request.method} ${ctx.url.pathname} ${Date.now() - start}ms`);
|
|
386
|
-
return response;
|
|
387
|
-
}, () => [
|
|
388
|
-
path("/dashboard", DashboardPage, { name: "dashboard" }),
|
|
264
|
+
path("/cart", CartPage, { name: "cart" }, () => [
|
|
265
|
+
loader(CartLoader, () => [
|
|
266
|
+
revalidate((ctx) => ctx.isAction(CartActions) || undefined),
|
|
389
267
|
]),
|
|
390
|
-
])
|
|
268
|
+
]),
|
|
391
269
|
```
|
|
392
270
|
|
|
393
|
-
|
|
271
|
+
Notice what you didn't write: no API endpoint, no fetch wrapper, and no
|
|
272
|
+
client-cache invalidation call. Actions invalidate the client-side caches
|
|
273
|
+
(history entries, prefetches, HTTP cache key) automatically — a no-op action
|
|
274
|
+
can opt out per invocation with `keepClientCache()`.
|
|
275
|
+
|
|
276
|
+
## 4. Speed
|
|
394
277
|
|
|
395
|
-
|
|
278
|
+
Production traffic. Wrap a segment in `cache()` and the rendered shell —
|
|
279
|
+
including everything the handler fetched — is stored, while every loader on
|
|
280
|
+
it keeps running fresh on each hit. This is where the handler-vs-loader
|
|
281
|
+
choice from step 2 pays off: handler data freezes with the shell, the
|
|
282
|
+
`StockLoader` stays live. Cached shell, live data, one line:
|
|
396
283
|
|
|
397
284
|
```tsx
|
|
398
|
-
const urlpatterns = urls(({ path, cache }) => [
|
|
399
|
-
|
|
400
|
-
path("/
|
|
401
|
-
|
|
285
|
+
const urlpatterns = urls(({ path, layout, loader, loading, cache }) => [
|
|
286
|
+
layout(<ShopLayout />, () => [
|
|
287
|
+
path("/", HomePage, { name: "home" }),
|
|
288
|
+
cache({ ttl: 600, swr: 3600, tags: ["products"] }, () => [
|
|
289
|
+
path("/products/:slug", ProductPage, { name: "product" }, () => [
|
|
290
|
+
loader(StockLoader), // never cached: re-runs on every hit
|
|
291
|
+
loading(<ProductSkeleton />),
|
|
292
|
+
]),
|
|
293
|
+
]),
|
|
402
294
|
]),
|
|
403
295
|
]);
|
|
404
296
|
```
|
|
405
297
|
|
|
406
|
-
|
|
298
|
+
Wire a store once on the router (`MemorySegmentCacheStore` for dev,
|
|
299
|
+
`CFCacheStore` for Cloudflare — see the [`/caching` skill](./skills/caching/SKILL.md)),
|
|
300
|
+
and bust by tag from the mutation that changes the data:
|
|
407
301
|
|
|
408
302
|
```tsx
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
export const router = createRouter({
|
|
413
|
-
document: Document,
|
|
414
|
-
cache: (env) => ({
|
|
415
|
-
store: new CFCacheStore({
|
|
416
|
-
defaults: { ttl: 60, swr: 300 },
|
|
417
|
-
ctx: env.ctx,
|
|
418
|
-
}),
|
|
419
|
-
}),
|
|
420
|
-
})
|
|
421
|
-
.use(createDocumentCacheMiddleware())
|
|
422
|
-
.routes(urlpatterns);
|
|
423
|
-
```
|
|
303
|
+
// src/actions/products.ts
|
|
304
|
+
"use server";
|
|
305
|
+
import { updateTag } from "@rangojs/router";
|
|
424
306
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
## Pre-rendering
|
|
430
|
-
|
|
431
|
-
Pre-rendering generates route segments at build time. The worker handles all requests — there are no static files served from assets.
|
|
432
|
-
|
|
433
|
-
### Static Segments
|
|
434
|
-
|
|
435
|
-
Use `Static()` for segments rendered once at build time (no params). Works on `path()`, `layout()`, and `parallel()`:
|
|
436
|
-
|
|
437
|
-
```tsx
|
|
438
|
-
import { Static } from "@rangojs/router";
|
|
439
|
-
|
|
440
|
-
export const AboutPage = Static(async () => {
|
|
441
|
-
return <article>...</article>;
|
|
442
|
-
});
|
|
443
|
-
|
|
444
|
-
export const DocsNav = Static(async () => {
|
|
445
|
-
const items = await readDocsNavItems();
|
|
446
|
-
return <nav>{items.map(i => <a key={i.slug} href={i.slug}>{i.title}</a>)}</nav>;
|
|
447
|
-
});
|
|
307
|
+
export async function renameProduct(id: string, name: string) {
|
|
308
|
+
await db.products.rename(id, name);
|
|
309
|
+
await updateTag("products"); // awaitable, read-your-own-writes
|
|
310
|
+
}
|
|
448
311
|
```
|
|
449
312
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
Use `Prerender()` for route-scoped pre-rendering. With params, provide `getParams` first, handler second:
|
|
313
|
+
Navigation speed is a `Link` prop away:
|
|
453
314
|
|
|
454
315
|
```tsx
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
async () => {
|
|
459
|
-
const slugs = await getAllBlogSlugs();
|
|
460
|
-
return slugs.map(slug => ({ slug }));
|
|
461
|
-
},
|
|
462
|
-
async (ctx) => {
|
|
463
|
-
const post = await getPost(ctx.params.slug);
|
|
464
|
-
return <article>{post.content}</article>;
|
|
465
|
-
},
|
|
466
|
-
);
|
|
316
|
+
<Link to={url} prefetch="viewport">
|
|
317
|
+
{product.name}
|
|
318
|
+
</Link>
|
|
467
319
|
```
|
|
468
320
|
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
export const ProductPage = Prerender(
|
|
475
|
-
async () => {
|
|
476
|
-
const featured = await db.getFeaturedProducts();
|
|
477
|
-
return featured.map(p => ({ id: p.id }));
|
|
478
|
-
},
|
|
479
|
-
async (ctx) => {
|
|
480
|
-
const product = await db.getProduct(ctx.params.id);
|
|
481
|
-
return <Product data={product} />;
|
|
482
|
-
},
|
|
483
|
-
{ passthrough: true },
|
|
484
|
-
);
|
|
485
|
-
```
|
|
321
|
+
A fully-prefetched navigation commits a **finished page** — no skeleton, no
|
|
322
|
+
loading flash — and staying correct is the router's job: every action
|
|
323
|
+
invalidates the prefetch caches by default, so a prefetched page can't show
|
|
324
|
+
pre-mutation data.
|
|
486
325
|
|
|
487
|
-
|
|
326
|
+
To move the shell's cost to build time entirely, `Prerender()` bakes it while
|
|
327
|
+
loaders stay live at runtime — same mental model, earlier cache write. See
|
|
328
|
+
the [`/prerender` skill](./skills/prerender/SKILL.md).
|
|
488
329
|
|
|
489
|
-
##
|
|
330
|
+
## 5. An API, when you need one
|
|
490
331
|
|
|
491
|
-
|
|
332
|
+
Response routes live in the same tree — `path.json()`, `path.text()`,
|
|
333
|
+
`path.xml()`, `path.image()`, `path.stream()`:
|
|
492
334
|
|
|
493
335
|
```tsx
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
themes: ["light", "dark", "system"],
|
|
499
|
-
attribute: "class",
|
|
500
|
-
enableSystem: true,
|
|
501
|
-
},
|
|
502
|
-
}).routes(urlpatterns);
|
|
336
|
+
path("/products/:slug", ProductPage, { name: "product" }),
|
|
337
|
+
path.json("/products/:slug", (ctx) => db.products.find(ctx.params.slug), {
|
|
338
|
+
name: "productJson",
|
|
339
|
+
}),
|
|
503
340
|
```
|
|
504
341
|
|
|
505
|
-
|
|
342
|
+
Same URL: browsers get the page, API clients get JSON, negotiated by
|
|
343
|
+
`Accept` header in the route trie. Handlers return bare values; errors
|
|
344
|
+
serialize as RFC 9457 `application/problem+json`. The payload type is
|
|
345
|
+
inferred from the handler — no codegen:
|
|
506
346
|
|
|
507
|
-
```
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
347
|
+
```ts
|
|
348
|
+
type Product = RouteResponse<typeof urlpatterns, "productJson">;
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
See the [`/api-client` skill](./skills/api-client/SKILL.md) for a small typed
|
|
352
|
+
client over these endpoints.
|
|
353
|
+
|
|
354
|
+
## Everything else, when you need it
|
|
355
|
+
|
|
356
|
+
That was the core: `path`/`layout`/`include`, names, loaders, actions +
|
|
357
|
+
`revalidate`, `cache`, response routes. The rest is opt-in — reach for it
|
|
358
|
+
when the requirement appears:
|
|
359
|
+
|
|
360
|
+
| I need to… | Skill |
|
|
361
|
+
| ----------------------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
362
|
+
| guard or shape requests (auth, headers) | [`/middleware`](./skills/middleware/SKILL.md) |
|
|
363
|
+
| multi-column layouts, independent slots | [`/parallel`](./skills/parallel/SKILL.md) |
|
|
364
|
+
| open a route as a modal on soft navigation | [`/intercept`](./skills/intercept/SKILL.md) |
|
|
365
|
+
| compose route modules / sub-apps | [`/route`](./skills/route/SKILL.md), [`/composability`](./skills/composability/SKILL.md) |
|
|
366
|
+
| cache a single function or component | [`/use-cache`](./skills/use-cache/SKILL.md), [`/cache-guide`](./skills/cache-guide/SKILL.md) |
|
|
367
|
+
| feed live loaders from a cached shell | [`/shell-manifest`](./skills/shell-manifest/SKILL.md) |
|
|
368
|
+
| edge caching with Cache-Control | [`/document-cache`](./skills/document-cache/SKILL.md) |
|
|
369
|
+
| light/dark mode without FOUC | [`/theme`](./skills/theme/SKILL.md) |
|
|
370
|
+
| analytics / third-party scripts with CSP nonce | [`/scripts`](./skills/scripts/SKILL.md) |
|
|
371
|
+
| locale routing | [`/i18n`](./skills/i18n/SKILL.md) |
|
|
372
|
+
| SSE and WebSockets | [`/streams-and-websockets`](./skills/streams-and-websockets/SKILL.md) |
|
|
373
|
+
| multi-app routing by domain | [`/host-router`](./skills/host-router/SKILL.md) |
|
|
374
|
+
| animate navigations | [`/view-transitions`](./skills/view-transitions/SKILL.md) |
|
|
375
|
+
| test loaders, middleware, handlers, Flight | [`/testing`](./skills/testing/SKILL.md) |
|
|
376
|
+
| see where request time goes | [`/observability`](./skills/observability/SKILL.md) |
|
|
377
|
+
| deploy to Vercel (cache store, tracing, output) | [`/vercel`](./skills/vercel/SKILL.md) |
|
|
378
|
+
| compare Rango with Next.js / TanStack / Waku | [`/comparison`](./skills/comparison/SKILL.md) |
|
|
379
|
+
|
|
380
|
+
The [`/rango` skill](./skills/rango/SKILL.md) is the full catalog and the
|
|
381
|
+
mental model that ties it together.
|
|
382
|
+
|
|
383
|
+
## Reference
|
|
384
|
+
|
|
385
|
+
### Imports and subpaths
|
|
386
|
+
|
|
387
|
+
| Export | Description |
|
|
388
|
+
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
|
|
389
|
+
| `@rangojs/router` | Server/RSC core and shared types: `createRouter`, `urls`, `createLoader`, `Handler`, `Prerender`, `Meta` |
|
|
390
|
+
| `@rangojs/router/client` | Client: `Link`, `Outlet`, `href`, `useNavigation`, `useLoader`, `MetaTags` |
|
|
391
|
+
| `@rangojs/router/cache` | Cache: `CFCacheStore`, `VercelCacheStore`, `MemorySegmentCacheStore`, `createDocumentCacheMiddleware` |
|
|
392
|
+
| `@rangojs/router/theme` | Theme: `useTheme`, `ThemeProvider`, `ThemeScript` |
|
|
393
|
+
| `@rangojs/router/host` | Host routing: `createHostRouter`, `defineHosts`, `isNoRouteMatchError` |
|
|
394
|
+
| `@rangojs/router/vercel` | Vercel: `createVercelTracing` (phase spans via `@vercel/otel`'s global tracer) |
|
|
395
|
+
| `@rangojs/router/vite` | Vite plugin: `rango()` |
|
|
396
|
+
| `@rangojs/router/testing` | Consumer testing primitives: `runLoader`, `runMiddleware`, `dispatch` (plus `/testing/dom`, `/testing/flight`, `/testing/e2e`) |
|
|
397
|
+
| `@rangojs/router/rsc` | Advanced server pipeline APIs: `createRSCHandler`, request-context access |
|
|
398
|
+
| `@rangojs/router/ssr` | Advanced SSR bridge APIs: `createSSRHandler` |
|
|
399
|
+
|
|
400
|
+
Use only subpaths that are explicitly exported; avoid deep imports.
|
|
401
|
+
|
|
402
|
+
The root entry is conditionally resolved: server-only APIs (`createRouter`,
|
|
403
|
+
`urls`, `redirect`, `Prerender`, `cookies`) run under the `react-server`
|
|
404
|
+
condition and throw guidance errors elsewhere. If you hit a root-entrypoint
|
|
405
|
+
stub error: hooks and components (`Link`, `Outlet`, `useLoader`, `MetaTags`)
|
|
406
|
+
live in `@rangojs/router/client`; cache APIs in `@rangojs/router/cache`;
|
|
407
|
+
host APIs in `@rangojs/router/host`.
|
|
408
|
+
|
|
409
|
+
### Type safety
|
|
410
|
+
|
|
411
|
+
The Vite plugin generates `router.named-routes.gen.ts` automatically (on dev
|
|
412
|
+
startup, HMR, and builds), registering route names, params, and search
|
|
413
|
+
schemas globally via `Rango.GeneratedRouteMap`. That powers `Handler<"name">`,
|
|
414
|
+
`ctx.reverse()`, and `RouteParams<"name">` with no manual registration.
|
|
415
|
+
|
|
416
|
+
For response-aware and path-based utilities (`href()`, `Rango.Path`,
|
|
417
|
+
`RouteResponse`), augment `Rango.RegisteredRoutes` once:
|
|
551
418
|
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
meta({ name: "description", content: "A great blog post" });
|
|
556
|
-
meta({ property: "og:title", content: "My Blog Post" });
|
|
419
|
+
```ts
|
|
420
|
+
// router.tsx
|
|
421
|
+
const router = createRouter<AppBindings>({}).routes(urlpatterns);
|
|
557
422
|
|
|
558
|
-
|
|
423
|
+
declare global {
|
|
424
|
+
namespace Rango {
|
|
425
|
+
interface Env extends AppEnv {}
|
|
426
|
+
interface RegisteredRoutes extends typeof router.routeMap {}
|
|
427
|
+
}
|
|
559
428
|
}
|
|
560
429
|
```
|
|
561
430
|
|
|
562
|
-
|
|
431
|
+
See the [`/typesafety` skill](./skills/typesafety/SKILL.md) for the full
|
|
432
|
+
surface breakdown.
|
|
563
433
|
|
|
564
|
-
|
|
434
|
+
### CLI
|
|
565
435
|
|
|
566
|
-
Route types are generated
|
|
436
|
+
Route types are generated by the Vite plugin; the CLI is the manual fallback
|
|
437
|
+
for CI or pre-first-run IDE support:
|
|
567
438
|
|
|
568
439
|
```bash
|
|
569
|
-
npx rango generate src/router.tsx
|
|
570
|
-
npx rango generate src/
|
|
571
|
-
npx rango generate src/urls.tsx src/api/ # mix files and directories
|
|
440
|
+
npx rango generate src/router.tsx # global named-route map
|
|
441
|
+
npx rango generate src/ # recursive scan
|
|
572
442
|
```
|
|
573
443
|
|
|
574
|
-
|
|
575
|
-
- Files with `createRouter` → `*.named-routes.gen.ts` with global route map
|
|
576
|
-
- Files with `urls()` → `*.gen.ts` with per-module route names, params, and search types
|
|
577
|
-
|
|
578
|
-
## Type Safety
|
|
579
|
-
|
|
580
|
-
The Vite plugin automatically generates a `router.named-routes.gen.ts` file that globally registers all route names, patterns, and search schemas. Type-safe `reverse()`, `Handler<"name">`, `href()`, and `RouteParams<"name">` work out of the box — no manual type registration needed. The gen file is updated on dev server startup, HMR, and production builds.
|
|
581
|
-
|
|
582
|
-
## Subpath Exports
|
|
583
|
-
|
|
584
|
-
| Export | Description |
|
|
585
|
-
|--------|-------------|
|
|
586
|
-
| `@rangojs/router` | Core: `createRouter`, `urls`, `createLoader`, `Handler`, `Prerender`, `Meta` |
|
|
587
|
-
| `@rangojs/router/client` | Client: `Link`, `Outlet`, `href`, `useNavigation`, `useLoader`, `MetaTags` |
|
|
588
|
-
| `@rangojs/router/cache` | Cache: `CFCacheStore`, `MemorySegmentCacheStore`, `createDocumentCacheMiddleware` |
|
|
589
|
-
| `@rangojs/router/theme` | Theme: `useTheme`, `ThemeProvider`, `ThemeScript` |
|
|
590
|
-
| `@rangojs/router/host` | Host routing: `createHostRouter`, `defineHosts` |
|
|
591
|
-
| `@rangojs/router/vite` | Vite plugin: `rango()` |
|
|
592
|
-
| `@rangojs/router/server` | Server utilities |
|
|
593
|
-
| `@rangojs/router/build` | Build utilities |
|
|
444
|
+
### Examples
|
|
594
445
|
|
|
595
|
-
|
|
446
|
+
- [`e2e/mini`](https://github.com/ivogt/vite-rsc/tree/main/packages/rangojs-router/e2e/mini) — single-file demo app
|
|
447
|
+
- [`cloudflare-basic`](https://github.com/ivogt/vite-rsc/tree/main/tests/cloudflare-basic) — Cloudflare Workers with caching, loaders, theme, and pre-rendering
|
|
448
|
+
- [`cloudflare-multi-router`](https://github.com/ivogt/vite-rsc/tree/main/examples/cloudflare-multi-router) — multi-app host routing
|
|
449
|
+
- [`vercel-basic`](https://github.com/ivogt/vite-rsc/tree/main/examples/vercel-basic) — Vercel deployment with `preset: "vercel"`, `VercelCacheStore`, and OTel tracing
|
|
450
|
+
- [`vercel-multi-router`](https://github.com/ivogt/vite-rsc/tree/main/examples/vercel-multi-router) — multi-app host routing on Vercel (single function, routed by Host header)
|
|
596
451
|
|
|
597
|
-
|
|
452
|
+
### Going deeper
|
|
598
453
|
|
|
599
|
-
- [
|
|
600
|
-
- [
|
|
454
|
+
- [Why Rango](https://github.com/ivogt/vite-rsc/blob/main/packages/rangojs-router/docs/why-rango.md) — the design rationale, claim by claim
|
|
455
|
+
- [Framework comparison](./skills/comparison/references/framework-comparison.md) — Rango vs Next.js App Router, TanStack Start, and Waku, capability by capability
|
|
456
|
+
- [Docs index](https://github.com/ivogt/vite-rsc/blob/main/packages/rangojs-router/docs/README.md) — architecture, caching, prerender, testing
|
|
457
|
+
- [Execution model](https://github.com/ivogt/vite-rsc/blob/main/packages/rangojs-router/docs/internal/execution-model.md) — the runtime contract
|
|
601
458
|
|
|
602
459
|
## License
|
|
603
460
|
|