@rangojs/router 0.0.0-experimental.125 → 0.0.0-experimental.127
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +5 -1
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/{src/handles/index.ts → dist/handles/index.d.ts} +1 -2
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +361 -65
- 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 +6 -1
- package/skills/breadcrumbs/SKILL.md +60 -0
- package/skills/observability/SKILL.md +12 -3
- package/skills/prerender/SKILL.md +30 -11
- package/skills/router-setup/SKILL.md +11 -3
- package/skills/server-actions/SKILL.md +25 -1
- package/skills/testing/SKILL.md +17 -17
- package/skills/testing/cache-prerender.md +29 -3
- package/skills/testing/flight.md +13 -10
- package/skills/testing/render-handler.md +3 -0
- package/skills/testing/server-tree.md +1 -1
- package/skills/testing/setup.md +1 -1
- package/src/browser/partial-update.ts +22 -1
- package/src/browser/react/use-router.ts +2 -1
- package/src/browser/rsc-router.tsx +8 -1
- package/src/browser/server-action-bridge.ts +51 -3
- package/src/browser/types.ts +23 -4
- package/src/browser/validate-redirect-origin.ts +43 -15
- package/src/build/index.ts +8 -9
- package/src/build/route-trie.ts +43 -11
- package/src/build/route-types/codegen.ts +12 -1
- package/src/cache/cache-runtime.ts +21 -0
- package/src/cache/cache-scope.ts +20 -0
- package/src/cache/document-cache.ts +10 -0
- package/src/cache/profile-registry.ts +6 -34
- package/src/client.rsc.tsx +3 -0
- package/src/client.tsx +5 -0
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/context-var.ts +12 -0
- package/src/defer.ts +196 -0
- package/src/handles/breadcrumbs.ts +16 -5
- package/src/index.rsc.ts +26 -2
- package/src/index.ts +23 -1
- package/src/redirect-origin.ts +100 -0
- package/src/route-definition/dsl-helpers.ts +19 -0
- package/src/route-definition/redirect.ts +32 -8
- package/src/route-definition/resolve-handler-use.ts +6 -0
- package/src/router/find-match.ts +0 -1
- package/src/router/instrument.ts +230 -0
- package/src/router/loader-resolution.ts +37 -31
- package/src/router/match-middleware/cache-lookup.ts +104 -139
- package/src/router/match-middleware/cache-store.ts +12 -0
- package/src/router/match-middleware/segment-resolution.ts +0 -1
- package/src/router/middleware-types.ts +0 -1
- package/src/router/middleware.ts +94 -33
- package/src/router/pattern-matching.ts +4 -23
- package/src/router/prerender-match.ts +32 -8
- package/src/router/revalidation.ts +9 -4
- package/src/router/route-snapshot.ts +0 -1
- package/src/router/router-context.ts +2 -2
- package/src/router/router-interfaces.ts +18 -0
- package/src/router/router-options.ts +58 -4
- package/src/router/segment-resolution/fresh.ts +15 -18
- package/src/router/segment-resolution/helpers.ts +6 -0
- package/src/router/segment-resolution/loader-cache.ts +30 -10
- package/src/router/segment-resolution/revalidation.ts +194 -261
- package/src/router/segment-wrappers.ts +3 -5
- package/src/router/telemetry-otel.ts +161 -179
- package/src/router/tracing.ts +198 -0
- package/src/router/trie-matching.ts +3 -5
- package/src/router.ts +13 -9
- package/src/rsc/handler-context.ts +1 -0
- package/src/rsc/handler.ts +135 -130
- package/src/rsc/helpers.ts +56 -3
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +7 -1
- package/src/rsc/origin-guard.ts +10 -4
- package/src/rsc/progressive-enhancement.ts +17 -2
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-route-handler.ts +23 -18
- package/src/rsc/rsc-rendering.ts +38 -14
- package/src/rsc/server-action.ts +32 -8
- package/src/rsc/types.ts +6 -2
- package/src/segment-system.tsx +4 -1
- package/src/server/request-context.ts +35 -18
- package/src/testing/cache-status.ts +44 -1
- package/src/testing/dispatch.ts +43 -6
- package/src/testing/e2e/index.ts +1 -0
- package/src/testing/flight.ts +48 -2
- package/src/testing/index.ts +1 -0
- package/src/testing/render-handler.ts +31 -12
- package/src/testing/render-route.tsx +75 -13
- package/src/types/handler-context.ts +28 -1
- package/src/vite/discovery/discover-routers.ts +22 -11
- package/src/vite/discovery/prerender-collection.ts +28 -41
- package/src/vite/discovery/state.ts +11 -0
- package/src/vite/plugin-types.ts +56 -7
- package/src/vite/plugins/expose-ids/router-transform.ts +10 -0
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/use-cache-transform.ts +21 -10
- package/src/vite/rango.ts +2 -0
- package/src/vite/router-discovery.ts +16 -3
- package/src/vite/utils/prerender-utils.ts +36 -0
- package/src/router/middleware-cookies.ts +0 -42
package/src/testing/dispatch.ts
CHANGED
|
@@ -37,6 +37,10 @@
|
|
|
37
37
|
* (?_rsc_partial / ?_rsc_action): converted to a 204 + X-RSC-Redirect via the
|
|
38
38
|
* real interceptRedirectForPartial, so fetch() does not auto-follow the 3xx —
|
|
39
39
|
* identical to production's no-location-state path.
|
|
40
|
+
* - The open-redirect guard (rsc/redirect-guard.ts) on full (browser-followed)
|
|
41
|
+
* redirects: a cross-origin Location is rewritten to the basename root unless
|
|
42
|
+
* redirect(url, { external: true }) opted out, mirroring production's single
|
|
43
|
+
* handler chokepoint. Soft partial/action redirects are 204 and pass through.
|
|
40
44
|
*
|
|
41
45
|
* What dispatch DOES NOT support (and why):
|
|
42
46
|
* - RSC component routes — rendering requires the Flight serializer + React
|
|
@@ -91,6 +95,13 @@ import {
|
|
|
91
95
|
interceptRedirectForPartial,
|
|
92
96
|
mergeStubHeadersAndFinalize,
|
|
93
97
|
} from "../rsc/helpers.js";
|
|
98
|
+
import { guardOutgoingRedirect } from "../rsc/redirect-guard.js";
|
|
99
|
+
import { stringifyJsonRouteResult } from "../rsc/json-route-result.js";
|
|
100
|
+
import {
|
|
101
|
+
EXTERNAL_REDIRECT_MARKER,
|
|
102
|
+
isExternalRedirect,
|
|
103
|
+
markExternalRedirect,
|
|
104
|
+
} from "../redirect-origin.js";
|
|
94
105
|
import { isWebSocketUpgradeResponse } from "../response-utils.js";
|
|
95
106
|
import type { Rango } from "../router/router-interfaces.js";
|
|
96
107
|
|
|
@@ -154,7 +165,8 @@ function toRequest(request: Request | string): Request {
|
|
|
154
165
|
/**
|
|
155
166
|
* Serialize a NON-Response response-route handler result, mirroring the
|
|
156
167
|
* router's handleResponseRoute() contract:
|
|
157
|
-
* - "json" serializes the value
|
|
168
|
+
* - "json" serializes the value (bare) with application/json, rejecting a nested
|
|
169
|
+
* unresolved Promise via the shared stringifyJsonRouteResult guard,
|
|
158
170
|
* - text/html/xml/md stringify with the mapped MIME type.
|
|
159
171
|
*
|
|
160
172
|
* A handler-returned Response is NOT routed here — callHandler re-wraps it via
|
|
@@ -167,7 +179,12 @@ function serializeResponseRouteResult(
|
|
|
167
179
|
responseType: string,
|
|
168
180
|
): Response {
|
|
169
181
|
if (responseType === "json") {
|
|
170
|
-
|
|
182
|
+
// Serialize through the SAME guard production uses: a nested unresolved
|
|
183
|
+
// Promise (forgotten await) throws RESPONSE_NOT_SERIALIZABLE here, caught by
|
|
184
|
+
// callHandler's catch and mapped to the identical typed 500 production
|
|
185
|
+
// returns -- so a dispatch json test fails exactly where production would,
|
|
186
|
+
// instead of silently emitting {} and passing.
|
|
187
|
+
return new Response(stringifyJsonRouteResult(result), {
|
|
171
188
|
status: 200,
|
|
172
189
|
headers: { "content-type": "application/json;charset=utf-8" },
|
|
173
190
|
});
|
|
@@ -252,16 +269,27 @@ function rewrapHandlerResponse(result: Response): Response {
|
|
|
252
269
|
}
|
|
253
270
|
const headers = new Headers();
|
|
254
271
|
result.headers.forEach((value, key) => {
|
|
272
|
+
// Mirror production: never copy the reserved external-redirect marker off a
|
|
273
|
+
// handler result (it is not a trust signal; the opt-in is the out-of-band
|
|
274
|
+
// brand transferred below).
|
|
275
|
+
if (key.toLowerCase() === EXTERNAL_REDIRECT_MARKER) return;
|
|
255
276
|
if (key.toLowerCase() === "set-cookie") {
|
|
256
277
|
headers.append(key, value);
|
|
257
278
|
} else {
|
|
258
279
|
headers.set(key, value);
|
|
259
280
|
}
|
|
260
281
|
});
|
|
261
|
-
|
|
282
|
+
const rewrapped = createResponseWithMergedHeaders(result.body, {
|
|
262
283
|
status: result.status,
|
|
263
284
|
headers,
|
|
264
285
|
});
|
|
286
|
+
// Mirror production's rewrapResponse: transfer the out-of-band external brand
|
|
287
|
+
// only from a genuinely branded result (a real redirect(url, { external:
|
|
288
|
+
// true })), never from a proxied upstream's forged header.
|
|
289
|
+
if (isExternalRedirect(result)) {
|
|
290
|
+
markExternalRedirect(rewrapped);
|
|
291
|
+
}
|
|
292
|
+
return rewrapped;
|
|
265
293
|
}
|
|
266
294
|
|
|
267
295
|
/**
|
|
@@ -506,7 +534,6 @@ export async function dispatch<TEnv = any>(
|
|
|
506
534
|
regex: null,
|
|
507
535
|
paramNames: [],
|
|
508
536
|
handler: mw.handler,
|
|
509
|
-
mountPrefix: null,
|
|
510
537
|
} as MiddlewareEntry<TEnv>,
|
|
511
538
|
params: mw.params,
|
|
512
539
|
}),
|
|
@@ -569,13 +596,23 @@ export async function dispatch<TEnv = any>(
|
|
|
569
596
|
// callbacks via finalizeResponse. dispatch is RSC-free, so the
|
|
570
597
|
// createRedirectFlightResponse stand-in falls back to the no-state
|
|
571
598
|
// 204 + X-RSC-Redirect (see the location-state divergence in the header).
|
|
599
|
+
let finalResponse: Response;
|
|
572
600
|
if (isPartial || isAction) {
|
|
573
601
|
const intercepted = interceptRedirectForPartial(
|
|
574
602
|
mwResponse,
|
|
575
603
|
(redirectUrl) => createSimpleRedirectResponse(redirectUrl),
|
|
576
604
|
);
|
|
577
|
-
|
|
605
|
+
finalResponse = finalizeResponse(intercepted ?? mwResponse);
|
|
606
|
+
} else {
|
|
607
|
+
finalResponse = finalizeResponse(mwResponse);
|
|
578
608
|
}
|
|
579
|
-
|
|
609
|
+
|
|
610
|
+
// Mirror production's single open-redirect chokepoint (handler.ts): every
|
|
611
|
+
// browser-followed (3xx + Location) redirect is same-origin guarded before
|
|
612
|
+
// it leaves -- a cross-origin Location is rewritten to the basename root
|
|
613
|
+
// unless redirect(url, { external: true }) opted out. Soft partial/action
|
|
614
|
+
// redirects are 204 + X-RSC-Redirect and pass through untouched (the client
|
|
615
|
+
// validates them), so this is a no-op for them.
|
|
616
|
+
return guardOutgoingRedirect(finalResponse, url.origin, router.basename);
|
|
580
617
|
});
|
|
581
618
|
}
|
package/src/testing/e2e/index.ts
CHANGED
package/src/testing/flight.ts
CHANGED
|
@@ -70,6 +70,14 @@ export interface RenderToFlightStringOptions {
|
|
|
70
70
|
params?: Record<string, string>;
|
|
71
71
|
/** Matched route name (drives `ctx.routeName` and scoped reverse). */
|
|
72
72
|
routeName?: string;
|
|
73
|
+
/**
|
|
74
|
+
* Route name -> pattern map enabling a SCOPED `ctx.reverse()` (like
|
|
75
|
+
* `renderHandler`). Without it, a server component that reverses resolves
|
|
76
|
+
* against the GLOBAL route map and is order-dependent on whatever router
|
|
77
|
+
* registered last. Pass the router-under-test's map to make reversing
|
|
78
|
+
* deterministic.
|
|
79
|
+
*/
|
|
80
|
+
routeMap?: Record<string, string>;
|
|
73
81
|
/**
|
|
74
82
|
* Context variables visible to the rendered tree via `ctx.get(...)` — as a
|
|
75
83
|
* prior middleware would have set them. Seeds the SAME way the handler-test
|
|
@@ -82,6 +90,44 @@ export interface RenderToFlightStringOptions {
|
|
|
82
90
|
|
|
83
91
|
const DEFAULT_URL = "http://localhost/";
|
|
84
92
|
|
|
93
|
+
/**
|
|
94
|
+
* True when `error` is the out-of-react-server stub thrown by index.ts's
|
|
95
|
+
* server-only exports (getRequestContext/cookies/headers/...) — i.e. the bare
|
|
96
|
+
* `@rangojs/router` specifier resolved to index.ts, not index.rsc.ts, because
|
|
97
|
+
* the rsc Vitest project is missing the `rangoTestAliases` alias. Matches both
|
|
98
|
+
* substrings of `serverOnlyStubError` (index.ts) so a normal app error cannot
|
|
99
|
+
* over-match. Shared with render-handler.ts so the two Flight primitives report
|
|
100
|
+
* the same misconfiguration identically.
|
|
101
|
+
*/
|
|
102
|
+
export function isServerOnlyStubError(error: unknown): boolean {
|
|
103
|
+
return (
|
|
104
|
+
error instanceof Error &&
|
|
105
|
+
error.message.includes("is only available from") &&
|
|
106
|
+
error.message.includes("react-server")
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Rethrow a server tree render error. When it is the missing-rsc-alias stub
|
|
112
|
+
* (above), rethrow an actionable message naming `rangoTestAliases` instead of
|
|
113
|
+
* the opaque stub text; otherwise rethrow the original unchanged. Classify the
|
|
114
|
+
* ORIGINAL error before constructing the wrapper so the wrapper's `Original: ...`
|
|
115
|
+
* echo (which re-embeds the matched substrings) never re-triggers the predicate.
|
|
116
|
+
*/
|
|
117
|
+
function rethrowFlightRenderError(error: unknown): never {
|
|
118
|
+
if (isServerOnlyStubError(error)) {
|
|
119
|
+
throw new Error(
|
|
120
|
+
`The server component called a server-only API ` +
|
|
121
|
+
`(getRequestContext/cookies/headers/...) but "@rangojs/router" resolved to ` +
|
|
122
|
+
`the out-of-react-server stub. Add rangoTestAliases({ preset }) to your ` +
|
|
123
|
+
`vitest.rsc.config.ts \`resolve.alias\` so the bare specifier maps to ` +
|
|
124
|
+
`index.rsc.ts (the real react-server implementations). ` +
|
|
125
|
+
`Original: ${(error as Error).message}`,
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
|
|
85
131
|
export function assertNoLegacyUrlOption(opts: object, fnName: string): void {
|
|
86
132
|
if ("url" in opts) {
|
|
87
133
|
throw new Error(
|
|
@@ -148,7 +194,7 @@ export async function serializeToFlightString(
|
|
|
148
194
|
});
|
|
149
195
|
|
|
150
196
|
return runWithRequestContext(ctx, () => {
|
|
151
|
-
setRequestContextParams(opts.params ?? {}, opts.routeName);
|
|
197
|
+
setRequestContextParams(opts.params ?? {}, opts.routeName, opts.routeMap);
|
|
152
198
|
return serializeNodeToFlight(element, clientManifest, url.pathname);
|
|
153
199
|
});
|
|
154
200
|
}
|
|
@@ -170,7 +216,7 @@ export async function serializeNodeToFlight(
|
|
|
170
216
|
},
|
|
171
217
|
});
|
|
172
218
|
const text = await new Response(stream).text();
|
|
173
|
-
if (didError)
|
|
219
|
+
if (didError) rethrowFlightRenderError(renderError);
|
|
174
220
|
return text;
|
|
175
221
|
}
|
|
176
222
|
|
package/src/testing/index.ts
CHANGED
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
import { createHandlerContext } from "../router/handler-context.js";
|
|
32
32
|
import { resolveLocationStateEntries } from "../browser/react/location-state-shared.js";
|
|
33
33
|
import { isHandle, type Handle } from "../handle.js";
|
|
34
|
+
import { withDefer } from "../defer.js";
|
|
34
35
|
import type { HandlerContext } from "../types/handler-context.js";
|
|
35
36
|
import type { LoaderDefinition } from "../types.js";
|
|
36
37
|
import {
|
|
@@ -41,7 +42,13 @@ import {
|
|
|
41
42
|
} from "./internal/seed-vars.js";
|
|
42
43
|
|
|
43
44
|
export type { StateCookieSeed } from "./internal/seed-vars.js";
|
|
44
|
-
import {
|
|
45
|
+
import {
|
|
46
|
+
assertNoLegacyUrlOption,
|
|
47
|
+
serializeNodeToFlight,
|
|
48
|
+
isServerOnlyStubError,
|
|
49
|
+
} from "./flight.js";
|
|
50
|
+
import type { SegmentCacheStore } from "../cache/types.js";
|
|
51
|
+
import type { CacheProfile } from "../cache/profile-registry.js";
|
|
45
52
|
import {
|
|
46
53
|
deserializeFlight,
|
|
47
54
|
makeClientManifest,
|
|
@@ -94,6 +101,19 @@ export interface RenderHandlerOptions<TEnv = any> {
|
|
|
94
101
|
* `result.stateCookieName`.
|
|
95
102
|
*/
|
|
96
103
|
stateCookie?: StateCookieSeed;
|
|
104
|
+
/**
|
|
105
|
+
* Segment cache store backing a `"use cache"` function the handler invokes
|
|
106
|
+
* (e.g. `new MemorySegmentCacheStore()`). Without it, `registerCachedFunction`
|
|
107
|
+
* takes the uncached bypass and the cached path is NOT exercised (the runtime
|
|
108
|
+
* emits a one-time warning under the test runner). Pair with `cacheProfiles`
|
|
109
|
+
* so the profile the directive names resolves.
|
|
110
|
+
*/
|
|
111
|
+
cacheStore?: SegmentCacheStore;
|
|
112
|
+
/**
|
|
113
|
+
* Cache profiles in the `createRouter({ cacheProfiles })` shape, required for
|
|
114
|
+
* `"use cache: profileName"` resolution once a `cacheStore` is wired.
|
|
115
|
+
*/
|
|
116
|
+
cacheProfiles?: Record<string, CacheProfile>;
|
|
97
117
|
}
|
|
98
118
|
|
|
99
119
|
/** Result of {@link renderHandler}. */
|
|
@@ -142,14 +162,6 @@ function headersToObject(headers: Headers): Record<string, string> {
|
|
|
142
162
|
return out;
|
|
143
163
|
}
|
|
144
164
|
|
|
145
|
-
function isServerOnlyStubError(error: unknown): boolean {
|
|
146
|
-
return (
|
|
147
|
-
error instanceof Error &&
|
|
148
|
-
error.message.includes("is only available from") &&
|
|
149
|
-
error.message.includes("react-server")
|
|
150
|
-
);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
165
|
function toRequest(
|
|
154
166
|
request: Request | string | undefined,
|
|
155
167
|
headers?: HeadersInit,
|
|
@@ -211,6 +223,8 @@ export async function renderHandler<TEnv = any>(
|
|
|
211
223
|
variables: seedVariables({}, opts.vars),
|
|
212
224
|
stateCookieName,
|
|
213
225
|
version: opts.stateCookie?.version,
|
|
226
|
+
cacheStore: opts.cacheStore,
|
|
227
|
+
cacheProfiles: opts.cacheProfiles,
|
|
214
228
|
});
|
|
215
229
|
|
|
216
230
|
const loaderSeeds = new Map<unknown, unknown>(opts.loaders ?? []);
|
|
@@ -222,7 +236,11 @@ export async function renderHandler<TEnv = any>(
|
|
|
222
236
|
let didThrow = false;
|
|
223
237
|
|
|
224
238
|
await runWithRequestContext(reqCtx as RequestContext<TEnv>, async () => {
|
|
225
|
-
|
|
239
|
+
// Scope the request-context reverse to opts.routeMap too (not just the
|
|
240
|
+
// handler context built below), so a nested server component reading
|
|
241
|
+
// getRequestContext().reverse() resolves against the same map as the
|
|
242
|
+
// handler's ctx.reverse -- matching renderToFlightString/renderServerTree.
|
|
243
|
+
setRequestContextParams(opts.params ?? {}, opts.routeName, opts.routeMap);
|
|
226
244
|
const hctx = createHandlerContext<TEnv>(
|
|
227
245
|
opts.params ?? {},
|
|
228
246
|
reqCtx.request,
|
|
@@ -236,7 +254,8 @@ export async function renderHandler<TEnv = any>(
|
|
|
236
254
|
(hctx as { use: unknown }).use = (item: unknown) => {
|
|
237
255
|
if (isHandle(item)) {
|
|
238
256
|
const handle = item as Handle<any, any>;
|
|
239
|
-
|
|
257
|
+
// withDefer attaches .defer() so the harness mirrors production's push.
|
|
258
|
+
return withDefer((dataOrFn: unknown) => {
|
|
240
259
|
const value =
|
|
241
260
|
typeof dataOrFn === "function"
|
|
242
261
|
? (dataOrFn as () => unknown)()
|
|
@@ -244,7 +263,7 @@ export async function renderHandler<TEnv = any>(
|
|
|
244
263
|
const pushed = handlePushes.get(handle) ?? [];
|
|
245
264
|
pushed.push(value);
|
|
246
265
|
handlePushes.set(handle, pushed);
|
|
247
|
-
};
|
|
266
|
+
});
|
|
248
267
|
}
|
|
249
268
|
if (loaderSeeds.has(item)) return loaderSeeds.get(item);
|
|
250
269
|
throw new RenderHandlerSetupError(
|
|
@@ -23,6 +23,10 @@
|
|
|
23
23
|
* client context (see the `loaders` / `locationState` / `handles` options) —
|
|
24
24
|
* nothing is executed on the server. This exercises the read path
|
|
25
25
|
* (useLoader / useLocationState / useHandle from context), not the run path.
|
|
26
|
+
* - navigate() commits synchronously, so it does NOT drive the navigation
|
|
27
|
+
* lifecycle: useNavigation().state, useLinkStatus().pending, and
|
|
28
|
+
* useAction().state stay "idle". Assert pending/loading/submitting transition
|
|
29
|
+
* states with renderServerTree / e2e instead (navigate() warns once if used).
|
|
26
30
|
* What it DOES cover: client hooks that read NavigationProvider /
|
|
27
31
|
* OutletContext — useParams, useReverse, useHref, useMount, useNavigation,
|
|
28
32
|
* useRouter, usePathname, useSearchParams, Outlet nesting, useLoader /
|
|
@@ -53,6 +57,7 @@ import type { LocationStateDefinition } from "../browser/react/location-state-sh
|
|
|
53
57
|
import type { Handle } from "../handle.js";
|
|
54
58
|
import type { ThemeConfig } from "../theme/types.js";
|
|
55
59
|
import { resolveThemeConfig } from "../theme/constants.js";
|
|
60
|
+
import { isUnderTestRunner } from "../runtime-env.js";
|
|
56
61
|
|
|
57
62
|
const TEST_ORIGIN = "http://localhost";
|
|
58
63
|
|
|
@@ -160,7 +165,10 @@ export interface RenderRouteOptions {
|
|
|
160
165
|
/**
|
|
161
166
|
* Explicit params. Merged over (and overriding) params extracted from the
|
|
162
167
|
* `request` URL. Use this when the URL alone cannot express the params, or to
|
|
163
|
-
* avoid relying on URL parsing.
|
|
168
|
+
* avoid relying on URL parsing. Supplying params also OPTS OUT of the
|
|
169
|
+
* request/leaf match check: a `request` whose pathname does not resolve the
|
|
170
|
+
* leaf is normally rejected under the test runner, but passing params here
|
|
171
|
+
* tells renderRoute the request is intentionally not the param source.
|
|
164
172
|
*/
|
|
165
173
|
params?: Record<string, string>;
|
|
166
174
|
/**
|
|
@@ -224,6 +232,10 @@ export interface RenderRouteOptions {
|
|
|
224
232
|
* exactly as `renderSegments` does in production (a segment whose `mountPath`
|
|
225
233
|
* is set is wrapped in a MountContextProvider). Normalized like a path prefix
|
|
226
234
|
* (leading slash forced, trailing stripped, bare "/" -> root). Defaults to "/".
|
|
235
|
+
* An explicitly-passed `request` must match the leaf `path` directly (paths are
|
|
236
|
+
* include-RELATIVE; the mount does NOT rewrite the request) — pass the relative
|
|
237
|
+
* path, not the mount-prefixed one, or renderRoute throws rather than silently
|
|
238
|
+
* rendering empty params.
|
|
227
239
|
*
|
|
228
240
|
* @example
|
|
229
241
|
* renderRoute([{ path: "/c/wine", Component: ProductPage }], { mount: "/shop" });
|
|
@@ -404,6 +416,32 @@ export async function renderRoute(
|
|
|
404
416
|
|
|
405
417
|
const historyKey = generateHistoryKey(url.href);
|
|
406
418
|
const mount = normalizeBasename(options.mount);
|
|
419
|
+
// Fail loud on a request that cannot resolve the leaf route (a typo, or the
|
|
420
|
+
// mount-prefixed-vs-relative confusion) instead of silently rendering empty
|
|
421
|
+
// params (matchLeaf -> null -> {}). renderRoute paths are include-RELATIVE and
|
|
422
|
+
// resolve() matches the request against the leaf as-is, so the request must be
|
|
423
|
+
// the relative form — a mount does NOT rewrite it. Only checked when `request`
|
|
424
|
+
// was passed explicitly (a defaulted request is staticPrefix of the leaf and
|
|
425
|
+
// always matches). Skipped when explicit `params` are supplied: those are
|
|
426
|
+
// merged over the URL-extracted params in resolve(), so the request is
|
|
427
|
+
// intentionally not the param source and an empty matchLeaf is not the trap.
|
|
428
|
+
// Gated on the test runner so it can never affect production.
|
|
429
|
+
if (
|
|
430
|
+
options.request !== undefined &&
|
|
431
|
+
Object.keys(options.params ?? {}).length === 0 &&
|
|
432
|
+
isUnderTestRunner() &&
|
|
433
|
+
matchLeaf(leaf.path, url.pathname) === null
|
|
434
|
+
) {
|
|
435
|
+
throw new Error(
|
|
436
|
+
`renderRoute: request "${url.pathname}" does not match the leaf route ` +
|
|
437
|
+
`"${leaf.path}"${mount ? ` (mount "${mount}")` : ""}. renderRoute paths ` +
|
|
438
|
+
`are include-RELATIVE: pass a request that matches "${leaf.path}" ` +
|
|
439
|
+
`(e.g. "${staticPrefix(leaf.path)}"). A mount does NOT auto-rewrite the ` +
|
|
440
|
+
`request — pass the relative path, not the mount-prefixed one. If the ` +
|
|
441
|
+
`request URL intentionally does not carry the params, pass them ` +
|
|
442
|
+
`explicitly via the \`params\` option to bypass this check.`,
|
|
443
|
+
);
|
|
444
|
+
}
|
|
407
445
|
const initialSegments = buildSegments(
|
|
408
446
|
routes,
|
|
409
447
|
initialMatch.params,
|
|
@@ -434,7 +472,23 @@ export async function renderRoute(
|
|
|
434
472
|
initialSegments.map((s) => s.id),
|
|
435
473
|
);
|
|
436
474
|
|
|
475
|
+
let warnedNavLifecycle = false;
|
|
437
476
|
const navigate = async (target: string): Promise<void> => {
|
|
477
|
+
// renderRoute commits navigations synchronously (no server fetch, no Flight
|
|
478
|
+
// stream), so it never drives the navigation lifecycle. The transition state
|
|
479
|
+
// useNavigation()/useLinkStatus()/useAction() read stays "idle" — asserting a
|
|
480
|
+
// pending/loading/submitting state here proves nothing. Warn once (per render)
|
|
481
|
+
// under the test runner so that false-confidence trap is loud, not silent.
|
|
482
|
+
if (isUnderTestRunner() && !warnedNavLifecycle) {
|
|
483
|
+
warnedNavLifecycle = true;
|
|
484
|
+
console.warn(
|
|
485
|
+
"renderRoute: navigate()/useRouter().push commit synchronously and do " +
|
|
486
|
+
"NOT drive the navigation lifecycle. useNavigation().state, " +
|
|
487
|
+
'useLinkStatus().pending, and useAction().state stay "idle" here. ' +
|
|
488
|
+
"Assert params/pathname/content after navigate(); use renderServerTree " +
|
|
489
|
+
"or e2e to assert pending/loading/submitting transition states.",
|
|
490
|
+
);
|
|
491
|
+
}
|
|
438
492
|
const nextUrl = new URL(target, TEST_ORIGIN);
|
|
439
493
|
const match = resolve(nextUrl.pathname);
|
|
440
494
|
const segments = buildSegments(routes, match.params, loaderData, mount);
|
|
@@ -465,18 +519,26 @@ export async function renderRoute(
|
|
|
465
519
|
);
|
|
466
520
|
const initialTree = await renderSegments(initialSegments);
|
|
467
521
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
522
|
+
// Wrap render in an awaited async act so a tree that suspends (async loaders,
|
|
523
|
+
// loading states, deferred handle entries that arrive as a Promise) settles its
|
|
524
|
+
// Suspense within act — otherwise React orphans the resolution ("a component
|
|
525
|
+
// suspended inside an act scope, but the act call was not awaited") and the
|
|
526
|
+
// resolved content never reaches the asserted DOM.
|
|
527
|
+
let result!: Awaited<ReturnType<typeof render>>;
|
|
528
|
+
await act(async () => {
|
|
529
|
+
result = render(
|
|
530
|
+
<NavigationProvider
|
|
531
|
+
store={store}
|
|
532
|
+
eventController={eventController}
|
|
533
|
+
initialPayload={{ root: initialTree, metadata: initialMetadata }}
|
|
534
|
+
bridge={bridge}
|
|
535
|
+
basename={normalizeBasename(options.basename)}
|
|
536
|
+
themeConfig={
|
|
537
|
+
options.theme === undefined ? null : resolveThemeConfig(options.theme)
|
|
538
|
+
}
|
|
539
|
+
/>,
|
|
540
|
+
);
|
|
541
|
+
});
|
|
480
542
|
|
|
481
543
|
const router: TestRouterHandle = {
|
|
482
544
|
navigate,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
import type { Handle } from "../handle.js";
|
|
3
|
+
import type { HandlePush } from "../defer.js";
|
|
3
4
|
import type { ContextVar } from "../context-var.js";
|
|
4
5
|
import type { MiddlewareFn } from "../router/middleware.js";
|
|
5
6
|
import type { Theme } from "../theme/types.js";
|
|
@@ -274,6 +275,8 @@ export type HandlerContext<
|
|
|
274
275
|
* For handles: Returns a push function to add data for this segment.
|
|
275
276
|
* Handle data accumulates across all matched route segments.
|
|
276
277
|
* Push accepts: direct value, Promise, or async callback (executed immediately).
|
|
278
|
+
* Or call `.defer()` to reserve the slot now and resolve it later (e.g. from a
|
|
279
|
+
* deep async component), with a timeout safety net — see {@link HandlePush}.
|
|
277
280
|
*
|
|
278
281
|
* @example
|
|
279
282
|
* ```typescript
|
|
@@ -307,6 +310,13 @@ export type HandlerContext<
|
|
|
307
310
|
* });
|
|
308
311
|
* return <ProductPage />;
|
|
309
312
|
* });
|
|
313
|
+
*
|
|
314
|
+
* // Handle usage - deferred (reserve the slot now, resolve from a deep component)
|
|
315
|
+
* route("product", (ctx) => {
|
|
316
|
+
* const resolve = ctx.use(Breadcrumbs).defer({ timeoutMs: 5000, else: null });
|
|
317
|
+
* loadCrumb(ctx.params.id).then(resolve); // resolver is push-equal
|
|
318
|
+
* return <ProductPage />; // auto-resolves to `else` on timeout
|
|
319
|
+
* });
|
|
310
320
|
* ```
|
|
311
321
|
*/
|
|
312
322
|
use: {
|
|
@@ -315,7 +325,7 @@ export type HandlerContext<
|
|
|
315
325
|
): Promise<T>;
|
|
316
326
|
<TData, TAccumulated = TData[]>(
|
|
317
327
|
handle: Handle<TData, TAccumulated>,
|
|
318
|
-
):
|
|
328
|
+
): HandlePush<TData>;
|
|
319
329
|
};
|
|
320
330
|
/**
|
|
321
331
|
* Current theme (from cookie or default).
|
|
@@ -422,6 +432,18 @@ export type InternalHandlerContext<
|
|
|
422
432
|
_responseType?: string;
|
|
423
433
|
/** Route name for cache key scoping (prevents cross-route collisions). */
|
|
424
434
|
_routeName?: string;
|
|
435
|
+
/**
|
|
436
|
+
* @internal Loader-cache override table: loaderId -> memoized data promise.
|
|
437
|
+
* A single stable ctx.use interceptor consults this instead of chaining one
|
|
438
|
+
* wrapper per cached loader (avoids O(N) dispatch). See loader-cache.ts.
|
|
439
|
+
*/
|
|
440
|
+
_loaderCacheOverrides?: Map<string, Promise<any>>;
|
|
441
|
+
/**
|
|
442
|
+
* @internal ctx.use captured before the loader-cache interceptor was installed.
|
|
443
|
+
* The cache-miss execute runs the loader through this, bypassing the override
|
|
444
|
+
* table (so a loader cannot await its own in-flight memoized promise).
|
|
445
|
+
*/
|
|
446
|
+
_loaderCacheOriginalUse?: (item: any) => any;
|
|
425
447
|
};
|
|
426
448
|
|
|
427
449
|
/**
|
|
@@ -613,6 +635,10 @@ export type ShouldRevalidateFn<TParams = GenericParams, TEnv = any> = (args: {
|
|
|
613
635
|
* namespace import (`import * as CartActions`), any export of that module —
|
|
614
636
|
* and `false` otherwise (including plain navigation with no action).
|
|
615
637
|
*
|
|
638
|
+
* Called with NO arguments it answers "is this request an action at all?":
|
|
639
|
+
* `true` for any action, `false` on plain navigation. Use the bare form when
|
|
640
|
+
* you want to revalidate on every action regardless of which one fired.
|
|
641
|
+
*
|
|
616
642
|
* Prefer this over hand-written `actionId` substring matches: it resolves the
|
|
617
643
|
* action's stable `path#export` id from the imported reference, so a rename is
|
|
618
644
|
* a type error in one place instead of silent drift across consumers. It
|
|
@@ -627,6 +653,7 @@ export type ShouldRevalidateFn<TParams = GenericParams, TEnv = any> = (args: {
|
|
|
627
653
|
* import { addToCart, removeFromCart } from "./actions/cart";
|
|
628
654
|
* import * as CartActions from "./actions/cart";
|
|
629
655
|
*
|
|
656
|
+
* revalidate((ctx) => ctx.isAction() || undefined); // any action
|
|
630
657
|
* revalidate((ctx) => ctx.isAction(addToCart) || undefined); // one action
|
|
631
658
|
* revalidate((ctx) => ctx.isAction(addToCart, removeFromCart) || undefined); // several
|
|
632
659
|
* revalidate((ctx) => ctx.isAction(CartActions) || undefined); // any in the module
|
|
@@ -11,6 +11,16 @@ import {
|
|
|
11
11
|
formatNestedRouterConflictError,
|
|
12
12
|
findNestedRouterConflict,
|
|
13
13
|
} from "../../build/generate-route-types.js";
|
|
14
|
+
// Pure data transforms over generateManifestFull's output. Imported directly
|
|
15
|
+
// from source (not the public ./build barrel, and not the runner) because they
|
|
16
|
+
// are realm-independent: buildRouteTrie/buildPerRouterTrie operate on plain
|
|
17
|
+
// manifest data, and collectFallbackClientRefs keys on the global-registry
|
|
18
|
+
// Symbol.for("react.client.reference"), so it detects client references in a
|
|
19
|
+
// boundary tree regardless of which realm imported the walker. Only
|
|
20
|
+
// generateManifestFull must stay on the runner (it invokes user handlers via
|
|
21
|
+
// RangoContext from the runner realm) — see the runner.import below.
|
|
22
|
+
import { buildRouteTrie, buildPerRouterTrie } from "../../build/route-trie.js";
|
|
23
|
+
import { collectFallbackClientRefs } from "../../build/collect-fallback-refs.js";
|
|
14
24
|
import {
|
|
15
25
|
flattenLeafEntries,
|
|
16
26
|
buildRouteToStaticPrefix,
|
|
@@ -107,7 +117,10 @@ export async function discoverRouters(
|
|
|
107
117
|
}
|
|
108
118
|
}
|
|
109
119
|
|
|
110
|
-
//
|
|
120
|
+
// generateManifestFull must run in the RSC runner realm: it invokes the
|
|
121
|
+
// user's urlpatterns.handler() via RangoContext, consuming router instances
|
|
122
|
+
// from the runner. The trie/fallback-ref builders are pure transforms over
|
|
123
|
+
// its output and are imported directly from source above.
|
|
111
124
|
const buildMod = await timed(
|
|
112
125
|
debug,
|
|
113
126
|
"inner: import @rangojs/router/build",
|
|
@@ -158,11 +171,12 @@ export async function discoverRouters(
|
|
|
158
171
|
// are NOT in EntryData, so generateManifestFull's walk misses them. Collect any
|
|
159
172
|
// "use client" default boundary directly off the router instance. The value is
|
|
160
173
|
// commonly a handler function wrapping the client boundary in server providers,
|
|
161
|
-
// so collectFallbackClientRefs invokes + walks the tree.
|
|
162
|
-
// so it
|
|
174
|
+
// so collectFallbackClientRefs invokes + walks the tree. The walker keys on the
|
|
175
|
+
// global-registry Symbol.for("react.client.reference"), so it detects client
|
|
176
|
+
// references in a runner-realm boundary tree even when imported here directly.
|
|
163
177
|
const collectFromBoundaryNode = (node: unknown): void => {
|
|
164
|
-
if (collectClientFallbackRef
|
|
165
|
-
|
|
178
|
+
if (collectClientFallbackRef) {
|
|
179
|
+
collectFallbackClientRefs(node, collectClientFallbackRef);
|
|
166
180
|
}
|
|
167
181
|
};
|
|
168
182
|
|
|
@@ -293,8 +307,7 @@ export async function discoverRouters(
|
|
|
293
307
|
let newMergedRouteTrie: any = null;
|
|
294
308
|
const trieStart = debug ? performance.now() : 0;
|
|
295
309
|
if (Object.keys(newMergedRouteManifest).length > 0) {
|
|
296
|
-
|
|
297
|
-
if (buildRouteTrie && mergedRouteAncestry) {
|
|
310
|
+
if (mergedRouteAncestry) {
|
|
298
311
|
// Build routeToStaticPrefix from saved manifests
|
|
299
312
|
const routeToStaticPrefix: Record<string, string> = {};
|
|
300
313
|
for (const { manifest } of allManifests) {
|
|
@@ -342,11 +355,9 @@ export async function discoverRouters(
|
|
|
342
355
|
// Build per-router tries for multi-router isolation. Uses the single
|
|
343
356
|
// shared buildPerRouterTrie so the production serialized trie is built by
|
|
344
357
|
// exactly the same code as the dev/HMR runtime rebuild (manifest-init.ts).
|
|
345
|
-
|
|
358
|
+
// Returns null for route-less manifests (route-trie.ts).
|
|
346
359
|
for (const { id, manifest } of allManifests) {
|
|
347
|
-
const perRouterTrie = buildPerRouterTrie
|
|
348
|
-
? buildPerRouterTrie(manifest)
|
|
349
|
-
: null;
|
|
360
|
+
const perRouterTrie = buildPerRouterTrie(manifest);
|
|
350
361
|
if (perRouterTrie) {
|
|
351
362
|
newPerRouterTrieMap.set(id, perRouterTrie);
|
|
352
363
|
}
|