@rangojs/router 0.0.0-experimental.122 → 0.0.0-experimental.124
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/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 +7 -2
- 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 -28
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/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 +47 -6
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +61 -21
- package/skills/caching/SKILL.md +2 -1
- package/skills/hooks/SKILL.md +38 -27
- package/skills/host-router/SKILL.md +16 -2
- package/skills/intercept/SKILL.md +4 -2
- package/skills/layout/SKILL.md +11 -6
- package/skills/loader/SKILL.md +6 -2
- package/skills/middleware/SKILL.md +4 -2
- package/skills/migrate-nextjs/SKILL.md +3 -1
- package/skills/parallel/SKILL.md +9 -4
- package/skills/rango/SKILL.md +12 -0
- package/skills/route/SKILL.md +4 -2
- package/skills/testing/SKILL.md +129 -0
- package/skills/testing/bindings.md +89 -0
- package/skills/testing/cache-prerender.md +98 -0
- package/skills/testing/client-components.md +122 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +89 -0
- package/skills/testing/handles.md +129 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +118 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +84 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +120 -0
- package/src/browser/action-fence.ts +37 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/navigation-bridge.ts +14 -1
- package/src/browser/navigation-client.ts +14 -1
- package/src/browser/navigation-store-handle.ts +39 -0
- package/src/browser/navigation-store.ts +26 -12
- package/src/browser/prefetch/fetch.ts +7 -0
- package/src/browser/rango-state.ts +176 -97
- package/src/browser/react/index.ts +0 -6
- package/src/browser/rsc-router.tsx +12 -4
- package/src/browser/server-action-bridge.ts +77 -15
- package/src/browser/types.ts +7 -1
- package/src/cache/cf/cf-cache-store.ts +22 -1
- package/src/cache/document-cache.ts +11 -0
- package/src/cache/memory-segment-store.ts +6 -0
- package/src/client.rsc.tsx +1 -1
- package/src/client.tsx +0 -6
- package/src/component-utils.ts +19 -0
- package/src/handle.ts +29 -9
- package/src/host/testing.ts +43 -14
- package/src/index.rsc.ts +22 -1
- package/src/index.ts +31 -1
- package/src/loader.rsc.ts +24 -3
- package/src/loader.ts +16 -2
- package/src/prerender.ts +24 -3
- package/src/router/basename.ts +14 -0
- package/src/router/match-handlers.ts +62 -20
- package/src/router/prerender-match.ts +4 -0
- package/src/router/router-interfaces.ts +7 -0
- package/src/router/router-options.ts +30 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/telemetry.ts +99 -0
- package/src/router.ts +36 -7
- package/src/rsc/handler.ts +3 -0
- package/src/rsc/helpers.ts +19 -0
- package/src/rsc/progressive-enhancement.ts +2 -0
- package/src/rsc/rsc-rendering.ts +2 -0
- package/src/rsc/types.ts +2 -0
- package/src/runtime-env.ts +18 -0
- package/src/server/cookie-store.ts +52 -1
- package/src/server/request-context.ts +69 -0
- package/src/static-handler.ts +25 -3
- package/src/testing/cache-status.ts +166 -0
- package/src/testing/collect-handle.ts +63 -0
- package/src/testing/dispatch.ts +581 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +149 -0
- package/src/testing/e2e/matchers.ts +51 -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 +110 -0
- package/src/testing/flight-normalize.ts +38 -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 +234 -0
- package/src/testing/generated-routes.ts +223 -0
- package/src/testing/index.ts +119 -0
- package/src/testing/internal/context.ts +390 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +80 -0
- package/src/testing/render-handler.ts +360 -0
- package/src/testing/render-route.tsx +594 -0
- package/src/testing/run-loader.ts +474 -0
- package/src/testing/run-middleware.ts +231 -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/types/global-namespace.ts +11 -1
- package/src/types/handler-context.ts +16 -5
|
@@ -4,6 +4,8 @@ import type {
|
|
|
4
4
|
RscPayload,
|
|
5
5
|
} from "./types.js";
|
|
6
6
|
import { createPartialUpdater } from "./partial-update.js";
|
|
7
|
+
import { enterActionFence, exitActionFence } from "./action-fence.js";
|
|
8
|
+
import { KEEP_CACHE_HEADER } from "./cookie-name.js";
|
|
7
9
|
import { createNavigationTransaction } from "./navigation-transaction.js";
|
|
8
10
|
import {
|
|
9
11
|
reconcileSegments,
|
|
@@ -156,12 +158,40 @@ export function createServerActionBridge(
|
|
|
156
158
|
|
|
157
159
|
// Start action in event controller - handles lifecycle tracking
|
|
158
160
|
const handle = eventController.startAction(id, args);
|
|
161
|
+
// Whether the action's response carried the keepClientCache() directive.
|
|
162
|
+
// Set when the response arrives; gates the deferred invalidation below.
|
|
163
|
+
let keepCache = false;
|
|
164
|
+
// Single deferred invalidation + fence release, run exactly ONCE however the
|
|
165
|
+
// action terminates (normal, redirect, error, abort, intercept, concurrent).
|
|
166
|
+
// This replaces main's eager clear at action start: every directive-free
|
|
167
|
+
// action invalidates once; keepClientCache() suppresses only the automatic
|
|
168
|
+
// invalidation, so a concurrent directive-free action still invalidates via
|
|
169
|
+
// its own latch. Latched so the finally AND the early SPA-redirect returns
|
|
170
|
+
// (whose Flight stream never settles) can both call it safely.
|
|
171
|
+
let actionFinalized = false;
|
|
172
|
+
// skipInvalidation: the version-mismatch reload terminal released nothing
|
|
173
|
+
// server-side, so it releases the fence without invalidating.
|
|
174
|
+
const finalizeAction = (skipInvalidation = false): void => {
|
|
175
|
+
if (actionFinalized) return;
|
|
176
|
+
actionFinalized = true;
|
|
177
|
+
// finally so a throw in invalidation cannot leak the fence (latch is set).
|
|
178
|
+
try {
|
|
179
|
+
if (!keepCache && !skipInvalidation) {
|
|
180
|
+
store.markCacheAsStaleAndBroadcast();
|
|
181
|
+
}
|
|
182
|
+
} finally {
|
|
183
|
+
exitActionFence();
|
|
184
|
+
}
|
|
185
|
+
};
|
|
159
186
|
try {
|
|
160
187
|
const segmentState = store.getSegmentState();
|
|
161
188
|
|
|
162
|
-
//
|
|
163
|
-
//
|
|
164
|
-
store
|
|
189
|
+
// Raise the action fence (replaces the old eager clear). Nothing is wiped,
|
|
190
|
+
// rotated, or broadcast yet: navigations during the flight fetch fresh
|
|
191
|
+
// (no-store) and popstate is treated as SWR, but the decision to
|
|
192
|
+
// invalidate is deferred to the response so a no-op action (keepClientCache)
|
|
193
|
+
// can leave the caches and the jar untouched.
|
|
194
|
+
enterActionFence();
|
|
165
195
|
|
|
166
196
|
// Create temporary references for serialization
|
|
167
197
|
const temporaryReferences = deps.createTemporaryReferenceSet();
|
|
@@ -237,11 +267,22 @@ export function createServerActionBridge(
|
|
|
237
267
|
// abortAllActions() doesn't disrupt the in-progress Flight stream.
|
|
238
268
|
handle.signal.removeEventListener("abort", onHandleAbort);
|
|
239
269
|
|
|
270
|
+
// Did the action call keepClientCache()? If so the deferred invalidation
|
|
271
|
+
// below is suppressed for THIS action (a concurrent directive-free
|
|
272
|
+
// action still invalidates via its own response).
|
|
273
|
+
keepCache = response.headers.get(KEEP_CACHE_HEADER) === "1";
|
|
274
|
+
|
|
240
275
|
// Check for version mismatch - server wants us to reload
|
|
241
276
|
const reloadResult = handleReloadHeader(response, {
|
|
242
277
|
onBlocked: resolveStreamComplete,
|
|
243
|
-
onReload: (url) =>
|
|
244
|
-
log("version mismatch on action, reloading", { reloadUrl: url })
|
|
278
|
+
onReload: (url) => {
|
|
279
|
+
log("version mismatch on action, reloading", { reloadUrl: url });
|
|
280
|
+
// Never-settling terminal (navigates away), so the finally never
|
|
281
|
+
// runs: release the fence here. skipInvalidation — the mismatch
|
|
282
|
+
// short-circuits the action server-side, so nothing mutated and a
|
|
283
|
+
// broadcast would only risk hard-reloading a sibling mid-task.
|
|
284
|
+
finalizeAction(true);
|
|
285
|
+
},
|
|
245
286
|
});
|
|
246
287
|
if (reloadResult) return reloadResult;
|
|
247
288
|
|
|
@@ -253,6 +294,10 @@ export function createServerActionBridge(
|
|
|
253
294
|
if (redirect && redirect !== "blocked" && !handle.signal.aborted) {
|
|
254
295
|
log("action simple redirect", { url: redirect.url });
|
|
255
296
|
handle.complete(undefined);
|
|
297
|
+
// This path returns a never-settling promise, so the finally never
|
|
298
|
+
// runs: invalidate + release the fence here (the mutation committed
|
|
299
|
+
// and we're navigating away). Latched, so the finally is a no-op.
|
|
300
|
+
finalizeAction();
|
|
256
301
|
await dispatchRedirect(redirect.url);
|
|
257
302
|
return new Promise<Response>(() => {});
|
|
258
303
|
}
|
|
@@ -277,6 +322,9 @@ export function createServerActionBridge(
|
|
|
277
322
|
log("action router id mismatch, reloading to re-sync");
|
|
278
323
|
handle.complete(undefined);
|
|
279
324
|
resolveStreamComplete();
|
|
325
|
+
// Never-settling return: release the fence before the reload (the
|
|
326
|
+
// reload resets module state anyway, but stay balanced). Latched.
|
|
327
|
+
finalizeAction();
|
|
280
328
|
window.location.reload();
|
|
281
329
|
return new Promise<Response>(() => {});
|
|
282
330
|
}
|
|
@@ -542,8 +590,9 @@ export function createServerActionBridge(
|
|
|
542
590
|
handle.clearConsolidation();
|
|
543
591
|
|
|
544
592
|
if (scenario.historyKeyChanged) {
|
|
545
|
-
|
|
546
|
-
|
|
593
|
+
// Invalidation is deferred to finalizeAction(); here we only trigger
|
|
594
|
+
// the revalidation refetch of the new route (suppressed on keep).
|
|
595
|
+
if (!scenario.onInterceptRoute && !keepCache) {
|
|
547
596
|
refetchRoute().catch((error) => {
|
|
548
597
|
if (isBackgroundSuppressible(error)) return;
|
|
549
598
|
console.error(
|
|
@@ -555,11 +604,14 @@ export function createServerActionBridge(
|
|
|
555
604
|
break;
|
|
556
605
|
}
|
|
557
606
|
|
|
558
|
-
// Same history key but different pathname - safe to refetch current
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
607
|
+
// Same history key but different pathname - safe to refetch current
|
|
608
|
+
// route. Invalidation is deferred to finalizeAction(); here we only
|
|
609
|
+
// trigger the revalidation refetch (suppressed on keep).
|
|
610
|
+
if (!keepCache) {
|
|
611
|
+
await refetchRoute({
|
|
612
|
+
interceptSourceUrl: store.getInterceptSourceUrl(),
|
|
613
|
+
});
|
|
614
|
+
}
|
|
563
615
|
break;
|
|
564
616
|
}
|
|
565
617
|
|
|
@@ -567,8 +619,11 @@ export function createServerActionBridge(
|
|
|
567
619
|
console.warn(
|
|
568
620
|
`[Browser] Missing segments after action (HMR detected), refetching...`,
|
|
569
621
|
);
|
|
622
|
+
// Repair (not revalidation), so ungated on keepCache: a keep action
|
|
623
|
+
// resolving last must discharge a directive-free sibling's repair.
|
|
624
|
+
// See the keep row in docs/design/rango-state-cookie.md (the all-keep
|
|
625
|
+
// edge, and the benign re-mark-stale-after-refetch end-state delta).
|
|
570
626
|
await refetchRoute({ interceptSourceUrl });
|
|
571
|
-
store.broadcastCacheInvalidation();
|
|
572
627
|
break;
|
|
573
628
|
}
|
|
574
629
|
|
|
@@ -585,11 +640,11 @@ export function createServerActionBridge(
|
|
|
585
640
|
// Clear consolidation tracking before fetch
|
|
586
641
|
handle.clearConsolidation();
|
|
587
642
|
|
|
643
|
+
// Ungated on keepCache, same as hmr-missing above (see the keep row).
|
|
588
644
|
await refetchRoute({
|
|
589
645
|
segments: segmentsToSend,
|
|
590
646
|
interceptSourceUrl,
|
|
591
647
|
});
|
|
592
|
-
store.broadcastCacheInvalidation();
|
|
593
648
|
break;
|
|
594
649
|
}
|
|
595
650
|
|
|
@@ -653,7 +708,9 @@ export function createServerActionBridge(
|
|
|
653
708
|
fullSegments,
|
|
654
709
|
currentHandleData,
|
|
655
710
|
);
|
|
656
|
-
|
|
711
|
+
// Invalidation deferred to finalizeAction() (runs after this caches
|
|
712
|
+
// the fresh segments), suppressed when the action called
|
|
713
|
+
// keepClientCache().
|
|
657
714
|
break;
|
|
658
715
|
}
|
|
659
716
|
}
|
|
@@ -661,6 +718,11 @@ export function createServerActionBridge(
|
|
|
661
718
|
handle.complete(returnData);
|
|
662
719
|
return returnData;
|
|
663
720
|
} finally {
|
|
721
|
+
// The single deferred invalidation + fence release for this action. Runs
|
|
722
|
+
// for every terminal that settles (normal, navigated-away, error, abort,
|
|
723
|
+
// intercept, concurrent); the SPA-redirect paths above already ran it.
|
|
724
|
+
// Latched, so it fires exactly once.
|
|
725
|
+
finalizeAction();
|
|
664
726
|
handle[Symbol.dispose]();
|
|
665
727
|
}
|
|
666
728
|
}
|
package/src/browser/types.ts
CHANGED
|
@@ -71,6 +71,12 @@ export interface RscMetadata {
|
|
|
71
71
|
* Sent on initial render so the browser can configure its cache duration.
|
|
72
72
|
*/
|
|
73
73
|
prefetchCacheTTL?: number;
|
|
74
|
+
/**
|
|
75
|
+
* Server-resolved rango state cookie name (`{prefix}_{routerId}`). The client
|
|
76
|
+
* reads it verbatim and binds the rango state cookie to it; composition
|
|
77
|
+
* happens only server-side.
|
|
78
|
+
*/
|
|
79
|
+
stateCookieName?: string;
|
|
74
80
|
/**
|
|
75
81
|
* Theme configuration from router.
|
|
76
82
|
* Included when theme is enabled in router config.
|
|
@@ -433,9 +439,9 @@ export interface NavigationStore {
|
|
|
433
439
|
hasHistoryCache(historyKey: string): boolean;
|
|
434
440
|
updateCacheHandleData(historyKey: string, handleData: HandleData): void;
|
|
435
441
|
markCacheAsStale(): void;
|
|
442
|
+
markHistoryCacheStale(): void;
|
|
436
443
|
markCacheAsStaleAndBroadcast(): void;
|
|
437
444
|
clearHistoryCache(): void;
|
|
438
|
-
broadcastCacheInvalidation(): void;
|
|
439
445
|
|
|
440
446
|
// Cross-tab refresh callback (set by navigation bridge)
|
|
441
447
|
setCrossTabRefreshCallback(callback: () => void): void;
|
|
@@ -40,6 +40,10 @@ import {
|
|
|
40
40
|
type RequestContext,
|
|
41
41
|
} from "../../server/request-context.js";
|
|
42
42
|
import { VERSION } from "@rangojs/router:version";
|
|
43
|
+
import {
|
|
44
|
+
isPerClientSignalHeader,
|
|
45
|
+
stripPerClientSignals,
|
|
46
|
+
} from "../../browser/cookie-name.js";
|
|
43
47
|
import {
|
|
44
48
|
resolveTtl,
|
|
45
49
|
resolveSwrWindow,
|
|
@@ -1611,6 +1615,9 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1611
1615
|
headers.delete(CACHE_STATUS_HEADER);
|
|
1612
1616
|
headers.delete(CACHE_TAGS_HEADER);
|
|
1613
1617
|
headers.delete(CACHE_TAGGED_AT_HEADER);
|
|
1618
|
+
// Finding #3 (read side): strip per-client signals a pre-fix or
|
|
1619
|
+
// pinned-version L1 entry may carry. See the read-side note in the design doc.
|
|
1620
|
+
stripPerClientSignals(headers);
|
|
1614
1621
|
return new Response(response.body, {
|
|
1615
1622
|
status: response.status,
|
|
1616
1623
|
statusText: response.statusText,
|
|
@@ -1651,6 +1658,10 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1651
1658
|
// replaced with a long max-age so the CF Cache API holds the entry across
|
|
1652
1659
|
// the SWR window; getResponse restores the original before serving.
|
|
1653
1660
|
const headers = new Headers(response.headers);
|
|
1661
|
+
// Finding #3: never persist a per-client signal in the shared L1 entry
|
|
1662
|
+
// (the platform's Set-Cookie rejection is unverified and ignores the
|
|
1663
|
+
// directive anyway). See stripPerClientSignals.
|
|
1664
|
+
stripPerClientSignals(headers);
|
|
1654
1665
|
const originalCacheControl = response.headers.get("Cache-Control");
|
|
1655
1666
|
if (originalCacheControl !== null) {
|
|
1656
1667
|
headers.set(CACHE_ORIG_CC_HEADER, originalCacheControl);
|
|
@@ -1688,8 +1699,12 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1688
1699
|
// L2: persist to KV (KV requires expirationTtl >= 60s)
|
|
1689
1700
|
if (this.kv && this.waitUntil && totalTtl >= 60) {
|
|
1690
1701
|
const kvKey = this.toKVKey(`doc:${key}`);
|
|
1702
|
+
// Finding #3: never persist a per-client signal in the KV envelope.
|
|
1691
1703
|
const headersArray: [string, string][] = [];
|
|
1692
|
-
response.headers.forEach((v, k) =>
|
|
1704
|
+
response.headers.forEach((v, k) => {
|
|
1705
|
+
if (isPerClientSignalHeader(k)) return;
|
|
1706
|
+
headersArray.push([k, v]);
|
|
1707
|
+
});
|
|
1693
1708
|
// Read body as ArrayBuffer and encode to base64 to preserve binary payloads
|
|
1694
1709
|
const bodyBuf = kvBody
|
|
1695
1710
|
? await new Response(kvBody).arrayBuffer()
|
|
@@ -2848,6 +2863,12 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2848
2863
|
// so evict it and miss rather than re-failing every read until TTL.
|
|
2849
2864
|
let response: Response;
|
|
2850
2865
|
try {
|
|
2866
|
+
// Finding #3 (read side): strip per-client signals a stale envelope may
|
|
2867
|
+
// carry. Inside the try so a malformed `hd` evicts (not throws through);
|
|
2868
|
+
// mutates `hd` in place so promoteResponseToL1 re-seeds from it too.
|
|
2869
|
+
envelope.hd = envelope.hd.filter(
|
|
2870
|
+
([name]) => !isPerClientSignalHeader(name),
|
|
2871
|
+
);
|
|
2851
2872
|
const bodyBuffer = base64ToBuffer(envelope.b);
|
|
2852
2873
|
const headers = new Headers(envelope.hd);
|
|
2853
2874
|
response = new Response(bodyBuffer, {
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import type { MiddlewareFn, MiddlewareContext } from "../router/middleware.js";
|
|
15
|
+
import { hasPerClientSignal } from "../browser/cookie-name.js";
|
|
15
16
|
import {
|
|
16
17
|
getRequestContext,
|
|
17
18
|
type RequestContext,
|
|
@@ -121,6 +122,16 @@ function shouldCacheResponse(response: Response): CacheDirectives | null {
|
|
|
121
122
|
return null;
|
|
122
123
|
}
|
|
123
124
|
|
|
125
|
+
// Never cache a per-client signal into a SHARED response store. A Set-Cookie
|
|
126
|
+
// (e.g. a rango state rotation from invalidateClientCache(), or any cookie a
|
|
127
|
+
// loader set) would be replayed to every client on a hit — pinning them to
|
|
128
|
+
// one value and even rolling a rotated client back to a prior one. The
|
|
129
|
+
// x-rango-keep-cache directive header is the mirror image: a replayed "keep"
|
|
130
|
+
// would suppress invalidation for every replayed client. Refuse both.
|
|
131
|
+
if (hasPerClientSignal(response.headers)) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
|
|
124
135
|
const cacheControl = response.headers.get("Cache-Control");
|
|
125
136
|
return parseCacheControl(cacheControl);
|
|
126
137
|
}
|
|
@@ -14,6 +14,7 @@ import type {
|
|
|
14
14
|
CacheItemOptions,
|
|
15
15
|
} from "./types.js";
|
|
16
16
|
import type { RequestContext } from "../server/request-context.js";
|
|
17
|
+
import { isPerClientSignalHeader } from "../browser/cookie-name.js";
|
|
17
18
|
import {
|
|
18
19
|
resolveTtl,
|
|
19
20
|
resolveSwrWindow,
|
|
@@ -292,8 +293,13 @@ export class MemorySegmentCacheStore<
|
|
|
292
293
|
// failure must degrade to a no-op (entry simply not cached), never throw
|
|
293
294
|
// up and fail the request.
|
|
294
295
|
const body = await response.clone().arrayBuffer();
|
|
296
|
+
// Defense-in-depth (Finding #3): never persist a per-client signal into a
|
|
297
|
+
// shared store. The document-cache chokepoint already refuses these, but
|
|
298
|
+
// putResponse is public and reachable directly (e.g. tag-revalidation
|
|
299
|
+
// re-puts), so strip them here too.
|
|
295
300
|
const headers: [string, string][] = [];
|
|
296
301
|
response.headers.forEach((value, name) => {
|
|
302
|
+
if (isPerClientSignalHeader(name)) return;
|
|
297
303
|
headers.push([name, value]);
|
|
298
304
|
});
|
|
299
305
|
|
package/src/client.rsc.tsx
CHANGED
|
@@ -50,7 +50,7 @@ export { href } from "./href-client.js";
|
|
|
50
50
|
// Mount context re-exports (useMount is client-only, but MountContext can be referenced)
|
|
51
51
|
export { MountContext } from "./browser/react/mount-context.js";
|
|
52
52
|
|
|
53
|
-
// Note: useNavigation
|
|
53
|
+
// Note: useNavigation and useAction are NOT re-exported here
|
|
54
54
|
// because they use client-side state and should only be used in client components
|
|
55
55
|
|
|
56
56
|
// Handle API - for accumulating data across route segments
|
package/src/client.tsx
CHANGED
|
@@ -358,12 +358,6 @@ export {
|
|
|
358
358
|
type SegmentsState,
|
|
359
359
|
} from "./browser/react/use-segments.js";
|
|
360
360
|
|
|
361
|
-
// Client cache controls hook
|
|
362
|
-
export {
|
|
363
|
-
useClientCache,
|
|
364
|
-
type ClientCacheControls,
|
|
365
|
-
} from "./browser/react/use-client-cache.js";
|
|
366
|
-
|
|
367
361
|
// Provider
|
|
368
362
|
export {
|
|
369
363
|
NavigationProvider,
|
package/src/component-utils.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { ComponentType } from "react";
|
|
8
|
+
import { isUnderTestRunner } from "./runtime-env.js";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Symbol used by React to mark client component references.
|
|
@@ -48,11 +49,21 @@ export function isClientComponent(
|
|
|
48
49
|
*
|
|
49
50
|
* @param component - The component to check
|
|
50
51
|
* @param name - Name to use in error message (e.g., "document")
|
|
52
|
+
* @param opts.allowServerInTest - When true AND running under a test runner
|
|
53
|
+
* (`isUnderTestRunner()`), relax ONLY the "use client" requirement: a server
|
|
54
|
+
* component is accepted. The plugin's "use client" transform does not run in a
|
|
55
|
+
* bare unit test, so a real exported `document` (almost every app sets one) has
|
|
56
|
+
* no client marker and would otherwise throw at `createRouter`, blocking
|
|
57
|
+
* `dispatch`/`assertGeneratedRoutesMatch` against the real router. The document
|
|
58
|
+
* reference is irrelevant to those (no Flight render). The "not a JSX element"
|
|
59
|
+
* guard still fires, and a real dev/build still throws (mirrors the runtime
|
|
60
|
+
* fallback-id gating in handle.ts/loader.ts).
|
|
51
61
|
* @throws Error if the component is not a client component
|
|
52
62
|
*/
|
|
53
63
|
export function assertClientComponent(
|
|
54
64
|
component: ComponentType<unknown> | unknown,
|
|
55
65
|
name: string,
|
|
66
|
+
opts?: { allowServerInTest?: boolean },
|
|
56
67
|
): asserts component is ComponentType<unknown> {
|
|
57
68
|
if (typeof component !== "function") {
|
|
58
69
|
throw new Error(
|
|
@@ -62,6 +73,14 @@ export function assertClientComponent(
|
|
|
62
73
|
);
|
|
63
74
|
}
|
|
64
75
|
|
|
76
|
+
// Under a test runner the "use client" transform did not run, so a real
|
|
77
|
+
// server-rendered `document` has no client marker; accept it (the reference is
|
|
78
|
+
// never serialized in dispatch/route-map checks). Outside a test runner this
|
|
79
|
+
// still throws — the build-time safety net is preserved.
|
|
80
|
+
if (opts?.allowServerInTest && isUnderTestRunner()) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
65
84
|
if (!isClientComponent(component)) {
|
|
66
85
|
throw new Error(
|
|
67
86
|
`${name} must be a client component with "use client" directive at the top of the file. ` +
|
package/src/handle.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { missingInjectedIdError } from "./missing-id-error.js";
|
|
2
|
+
import { isUnderTestRunner } from "./runtime-env.js";
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Handle definition for accumulating data across route segments.
|
|
@@ -45,6 +46,11 @@ function defaultCollect<T>(segments: T[][]): T[] {
|
|
|
45
46
|
// Used by useHandle() to recover collect when handle is deserialized from RSC prop.
|
|
46
47
|
const collectRegistry = new Map<string, (segments: unknown[][]) => unknown>();
|
|
47
48
|
|
|
49
|
+
// Monotonic counter for runtime fallback ids (see createHandle). Module-scoped
|
|
50
|
+
// and deterministic, so each createHandle() call gets a stable, unique id within
|
|
51
|
+
// the process. Only used when no build id was injected (a bare unit test).
|
|
52
|
+
let runtimeHandleIdCounter = 0;
|
|
53
|
+
|
|
48
54
|
/**
|
|
49
55
|
* Look up a collect function from the registry by handle $$id.
|
|
50
56
|
* Returns undefined if not registered (falls back to defaultCollect in useHandle).
|
|
@@ -95,10 +101,26 @@ export function createHandle<TData, TAccumulated = TData[]>(
|
|
|
95
101
|
collect?: (segments: TData[][]) => TAccumulated,
|
|
96
102
|
__injectedId?: string,
|
|
97
103
|
): Handle<TData, TAccumulated> {
|
|
98
|
-
|
|
104
|
+
let handleId = __injectedId ?? "";
|
|
99
105
|
|
|
100
|
-
|
|
101
|
-
|
|
106
|
+
// No build-injected id. Under a test runner: fall back to a synthetic id so the
|
|
107
|
+
// collect registers below and the handle is exercisable in tests (useHandle,
|
|
108
|
+
// collectHandle, renderRoute's `handles` run the REAL collect). Otherwise (dev
|
|
109
|
+
// or a real build) it means an UNSUPPORTED handler shape the plugin skipped —
|
|
110
|
+
// fail loud. The rich, stack-parsing diagnostic stays behind the NODE_ENV check
|
|
111
|
+
// so a production build folds it away and tree-shakes missing-id-error.ts out,
|
|
112
|
+
// shipping the small throw instead. isUnderTestRunner() is runtime-safe.
|
|
113
|
+
if (!handleId) {
|
|
114
|
+
if (isUnderTestRunner()) {
|
|
115
|
+
handleId = `__rango_runtime_handle_${runtimeHandleIdCounter++}`;
|
|
116
|
+
} else if (process.env.NODE_ENV !== "production") {
|
|
117
|
+
throw missingInjectedIdError("Handle", "createHandle");
|
|
118
|
+
} else {
|
|
119
|
+
throw new Error(
|
|
120
|
+
"[rango] Handle is missing $$id — the build plugin did not inject one. " +
|
|
121
|
+
"Export it as `export const X = createHandle(...)`.",
|
|
122
|
+
);
|
|
123
|
+
}
|
|
102
124
|
}
|
|
103
125
|
|
|
104
126
|
const collectFn =
|
|
@@ -107,12 +129,10 @@ export function createHandle<TData, TAccumulated = TData[]>(
|
|
|
107
129
|
|
|
108
130
|
// Register collect in module-level registry so useHandle() can recover it
|
|
109
131
|
// when the handle is deserialized from RSC props (toJSON strips collect).
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
);
|
|
115
|
-
}
|
|
132
|
+
collectRegistry.set(
|
|
133
|
+
handleId,
|
|
134
|
+
collectFn as (segments: unknown[][]) => unknown,
|
|
135
|
+
);
|
|
116
136
|
|
|
117
137
|
return {
|
|
118
138
|
__brand: "handle" as const,
|
package/src/host/testing.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Helper functions for testing host routing.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { matchPattern } from "./pattern-matcher.js";
|
|
7
|
+
import { matchPattern, parseRequest } from "./pattern-matcher.js";
|
|
8
8
|
|
|
9
9
|
export interface CreateTestRequestOptions {
|
|
10
10
|
host: string;
|
|
@@ -52,28 +52,57 @@ export function createTestRequest(options: CreateTestRequestOptions): Request {
|
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
+
// Try each pattern (a single pattern or any in an array) against the already
|
|
56
|
+
// parsed host + path. Shared by testPattern and matchesHost so the
|
|
57
|
+
// normalize-and-loop lives once.
|
|
58
|
+
function matchPatterns(
|
|
59
|
+
pattern: string | string[],
|
|
60
|
+
hostname: string,
|
|
61
|
+
pathname: string,
|
|
62
|
+
parts: string[],
|
|
63
|
+
): boolean {
|
|
64
|
+
const patterns = Array.isArray(pattern) ? pattern : [pattern];
|
|
65
|
+
return patterns.some((p) => matchPattern(p, hostname, pathname, parts));
|
|
66
|
+
}
|
|
67
|
+
|
|
55
68
|
/**
|
|
56
|
-
* Test if a pattern matches a hostname
|
|
69
|
+
* Test if a pattern matches a hostname (and, for path-based patterns, a pathname).
|
|
70
|
+
*
|
|
71
|
+
* `pathname` defaults to `"/"`, so a host-only pattern works with two args. Pass
|
|
72
|
+
* the third arg to test a path-based pattern (`**.workers.dev/admin`,
|
|
73
|
+
* `localhost/shop`) — without it those patterns can never match.
|
|
57
74
|
*
|
|
58
75
|
* @example
|
|
59
76
|
* ```ts
|
|
60
|
-
* expect(testPattern(
|
|
61
|
-
* expect(testPattern([
|
|
77
|
+
* expect(testPattern("admin.*", "admin.example.com")).toBe(true);
|
|
78
|
+
* expect(testPattern(["*", "www.*"], "example.com")).toBe(true);
|
|
79
|
+
* expect(testPattern("**.workers.dev/admin", "foo.workers.dev", "/admin")).toBe(true);
|
|
62
80
|
* ```
|
|
63
81
|
*/
|
|
64
82
|
export function testPattern(
|
|
65
83
|
pattern: string | string[],
|
|
66
84
|
hostname: string,
|
|
85
|
+
pathname: string = "/",
|
|
67
86
|
): boolean {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const pathname = "/";
|
|
71
|
-
|
|
72
|
-
for (const p of patterns) {
|
|
73
|
-
if (matchPattern(p, hostname, pathname, parts)) {
|
|
74
|
-
return true;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
87
|
+
return matchPatterns(pattern, hostname, pathname, hostname.split("."));
|
|
88
|
+
}
|
|
77
89
|
|
|
78
|
-
|
|
90
|
+
/**
|
|
91
|
+
* Test if a pattern matches a `Request` — the hostname AND pathname are taken
|
|
92
|
+
* from the request URL (via the same `parseRequest` the host router uses), so a
|
|
93
|
+
* path-based pattern is tested against a real request without splitting the URL
|
|
94
|
+
* by hand.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```ts
|
|
98
|
+
* const req = new Request("https://foo.workers.dev/admin");
|
|
99
|
+
* expect(matchesHost("**.workers.dev/admin", req)).toBe(true);
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export function matchesHost(
|
|
103
|
+
pattern: string | string[],
|
|
104
|
+
request: Request,
|
|
105
|
+
): boolean {
|
|
106
|
+
const { hostname, pathname, parts } = parseRequest(request);
|
|
107
|
+
return matchPatterns(pattern, hostname, pathname, parts);
|
|
79
108
|
}
|
package/src/index.rsc.ts
CHANGED
|
@@ -184,6 +184,8 @@ export const getRequestContext: <
|
|
|
184
184
|
export {
|
|
185
185
|
cookies,
|
|
186
186
|
headers,
|
|
187
|
+
invalidateClientCache,
|
|
188
|
+
keepClientCache,
|
|
187
189
|
type CookieStore,
|
|
188
190
|
type Cookie,
|
|
189
191
|
type ReadonlyHeaders,
|
|
@@ -235,7 +237,26 @@ export {
|
|
|
235
237
|
export { createConsoleSink } from "./router/telemetry.js";
|
|
236
238
|
export { createOTelSink } from "./router/telemetry-otel.js";
|
|
237
239
|
export type { OTelTracer, OTelSpan } from "./router/telemetry-otel.js";
|
|
238
|
-
|
|
240
|
+
// The full TelemetryEvent union PLUS its member types, so a consumer writing a
|
|
241
|
+
// TelemetrySink can annotate a per-`type` handler (or construct an event literal
|
|
242
|
+
// in a test) instead of only narrowing the opaque union.
|
|
243
|
+
export type {
|
|
244
|
+
TelemetrySink,
|
|
245
|
+
TelemetryEvent,
|
|
246
|
+
RequestStartEvent,
|
|
247
|
+
RequestEndEvent,
|
|
248
|
+
RequestErrorEvent,
|
|
249
|
+
LoaderStartEvent,
|
|
250
|
+
LoaderEndEvent,
|
|
251
|
+
LoaderErrorEvent,
|
|
252
|
+
HandlerErrorEvent,
|
|
253
|
+
CacheSegmentStatus,
|
|
254
|
+
CacheSegmentSignal,
|
|
255
|
+
CacheDecisionEvent,
|
|
256
|
+
RevalidationDecisionEvent,
|
|
257
|
+
RequestTimeoutEvent,
|
|
258
|
+
OriginCheckRejectedEvent,
|
|
259
|
+
} from "./router/telemetry.js";
|
|
239
260
|
|
|
240
261
|
// Timeout types and error class
|
|
241
262
|
export { RouterTimeoutError } from "./router/timeout.js";
|
package/src/index.ts
CHANGED
|
@@ -217,6 +217,17 @@ export function headers(): never {
|
|
|
217
217
|
throw serverOnlyStubError("headers");
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
+
/**
|
|
221
|
+
* Client implementation of `invalidateClientCache()`. Unlike the server-only
|
|
222
|
+
* stubs above this is a REAL function under the `default` condition (it marks
|
|
223
|
+
* the client's caches stale); the `react-server` condition (index.rsc.ts)
|
|
224
|
+
* selects the server implementation that writes a rotated `Set-Cookie`.
|
|
225
|
+
*/
|
|
226
|
+
export {
|
|
227
|
+
invalidateClientCache,
|
|
228
|
+
keepClientCache,
|
|
229
|
+
} from "./browser/invalidate-client-cache.js";
|
|
230
|
+
|
|
220
231
|
/**
|
|
221
232
|
* Error-throwing stub for server-only `createReverse` function.
|
|
222
233
|
*/
|
|
@@ -327,7 +338,26 @@ export {
|
|
|
327
338
|
// who need the values in non-RSC contexts can import from
|
|
328
339
|
// `@rangojs/router/server`.
|
|
329
340
|
export type { OTelTracer, OTelSpan } from "./router/telemetry-otel.js";
|
|
330
|
-
|
|
341
|
+
// The full TelemetryEvent union PLUS its member types, so a consumer writing a
|
|
342
|
+
// TelemetrySink can annotate a per-`type` handler (or construct an event literal
|
|
343
|
+
// in a test) instead of only narrowing the opaque union.
|
|
344
|
+
export type {
|
|
345
|
+
TelemetrySink,
|
|
346
|
+
TelemetryEvent,
|
|
347
|
+
RequestStartEvent,
|
|
348
|
+
RequestEndEvent,
|
|
349
|
+
RequestErrorEvent,
|
|
350
|
+
LoaderStartEvent,
|
|
351
|
+
LoaderEndEvent,
|
|
352
|
+
LoaderErrorEvent,
|
|
353
|
+
HandlerErrorEvent,
|
|
354
|
+
CacheSegmentStatus,
|
|
355
|
+
CacheSegmentSignal,
|
|
356
|
+
CacheDecisionEvent,
|
|
357
|
+
RevalidationDecisionEvent,
|
|
358
|
+
RequestTimeoutEvent,
|
|
359
|
+
OriginCheckRejectedEvent,
|
|
360
|
+
} from "./router/telemetry.js";
|
|
331
361
|
|
|
332
362
|
// Timeout types and error class
|
|
333
363
|
export { RouterTimeoutError } from "./router/timeout.js";
|
package/src/loader.rsc.ts
CHANGED
|
@@ -22,9 +22,14 @@ import {
|
|
|
22
22
|
getFetchableLoader,
|
|
23
23
|
} from "./server/fetchable-loader-store.js";
|
|
24
24
|
import { missingInjectedIdError } from "./missing-id-error.js";
|
|
25
|
+
import { isUnderTestRunner } from "./runtime-env.js";
|
|
25
26
|
|
|
26
27
|
export { getFetchableLoader };
|
|
27
28
|
|
|
29
|
+
// Counter for runtime-fallback loader ids assigned only in a bare unit test
|
|
30
|
+
// (no Vite plugin to inject one). Process-stable; never reached in a real build.
|
|
31
|
+
let runtimeLoaderIdCounter = 0;
|
|
32
|
+
|
|
28
33
|
// Overload 1: With function only (not fetchable)
|
|
29
34
|
export function createLoader<T>(
|
|
30
35
|
fn: LoaderFn<T, Record<string, string | undefined>, any>,
|
|
@@ -51,10 +56,26 @@ export function createLoader<T>(
|
|
|
51
56
|
): LoaderDefinition<Awaited<T>, Record<string, string | undefined>> {
|
|
52
57
|
// The $$id will be set on the returned object by Vite plugin
|
|
53
58
|
// For fetchable loaders, __injectedId is also passed as a parameter
|
|
54
|
-
|
|
59
|
+
let loaderId = __injectedId || "";
|
|
55
60
|
|
|
56
|
-
|
|
57
|
-
|
|
61
|
+
// No build-injected id. Under a test runner: fall back to a synthetic id so the
|
|
62
|
+
// fn registers below and the loader is exercisable via runLoader(loaderHandle)
|
|
63
|
+
// (it recovers the fn from the registry by $$id). Otherwise (dev or a real
|
|
64
|
+
// build) it means an UNSUPPORTED shape (e.g. a namespace import
|
|
65
|
+
// `rango.createLoader(...)`) the plugin skipped — fail loud. The rich
|
|
66
|
+
// diagnostic stays behind the NODE_ENV check so production folds it away and
|
|
67
|
+
// ships the small throw. isUnderTestRunner() is runtime-safe. Mirrors createHandle.
|
|
68
|
+
if (!loaderId) {
|
|
69
|
+
if (isUnderTestRunner()) {
|
|
70
|
+
loaderId = `__rango_runtime_loader_${runtimeLoaderIdCounter++}`;
|
|
71
|
+
} else if (process.env.NODE_ENV !== "production") {
|
|
72
|
+
throw missingInjectedIdError("Loader", "createLoader");
|
|
73
|
+
} else {
|
|
74
|
+
throw new Error(
|
|
75
|
+
"[rango] Loader is missing $$id — the build plugin did not inject one. " +
|
|
76
|
+
"Export it as `export const X = createLoader(...)`.",
|
|
77
|
+
);
|
|
78
|
+
}
|
|
58
79
|
}
|
|
59
80
|
|
|
60
81
|
// If not fetchable, store fn in registry (for SSR ctx.use() resolution)
|