@rangojs/router 0.0.0-experimental.debug-cache-fix → 0.0.0-experimental.df410dd5
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 +196 -43
- 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 +269 -96
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +48 -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 +2659 -883
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +57 -11
- package/skills/breadcrumbs/SKILL.md +3 -1
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +243 -21
- package/skills/caching/SKILL.md +118 -2
- package/skills/composability/SKILL.md +27 -2
- package/skills/document-cache/SKILL.md +78 -55
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +229 -20
- package/skills/host-router/SKILL.md +45 -20
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +46 -4
- package/skills/layout/SKILL.md +28 -7
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +273 -53
- package/skills/middleware/SKILL.md +49 -12
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +27 -0
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +71 -6
- package/skills/prerender/SKILL.md +123 -100
- package/skills/rango/SKILL.md +242 -22
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +66 -9
- package/skills/route/SKILL.md +88 -4
- package/skills/router-setup/SKILL.md +90 -5
- package/skills/server-actions/SKILL.md +751 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/testing/SKILL.md +776 -0
- package/skills/typesafety/SKILL.md +329 -27
- package/skills/use-cache/SKILL.md +34 -5
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +117 -0
- package/src/__internal.ts +1 -1
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +86 -70
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/navigation-bridge.ts +101 -13
- package/src/browser/navigation-client.ts +125 -53
- package/src/browser/navigation-store.ts +75 -17
- package/src/browser/navigation-transaction.ts +10 -28
- package/src/browser/partial-update.ts +90 -30
- package/src/browser/prefetch/cache.ts +129 -21
- package/src/browser/prefetch/fetch.ts +156 -18
- package/src/browser/prefetch/queue.ts +92 -29
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +53 -13
- package/src/browser/react/Link.tsx +72 -8
- package/src/browser/react/NavigationProvider.tsx +83 -33
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +51 -7
- package/src/browser/react/index.ts +3 -0
- package/src/browser/react/location-state-shared.ts +175 -4
- package/src/browser/react/location-state.ts +39 -13
- package/src/browser/react/use-handle.ts +23 -64
- package/src/browser/react/use-navigation.ts +22 -2
- package/src/browser/react/use-params.ts +20 -8
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +43 -10
- package/src/browser/react/use-segments.ts +11 -8
- package/src/browser/response-adapter.ts +25 -0
- package/src/browser/rsc-router.tsx +87 -22
- package/src/browser/scroll-restoration.ts +29 -19
- package/src/browser/segment-reconciler.ts +36 -14
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +31 -36
- package/src/browser/types.ts +48 -5
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +65 -40
- package/src/build/generate-route-types.ts +5 -0
- package/src/build/index.ts +2 -0
- package/src/build/route-trie.ts +52 -25
- package/src/build/route-types/codegen.ts +4 -4
- package/src/build/route-types/include-resolution.ts +9 -2
- package/src/build/route-types/per-module-writer.ts +7 -4
- package/src/build/route-types/router-processing.ts +266 -86
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-scope.ts +40 -56
- package/src/cache/cf/cf-cache-store.ts +54 -13
- package/src/cache/taint.ts +55 -0
- package/src/client.rsc.tsx +3 -0
- package/src/client.tsx +94 -238
- package/src/context-var.ts +72 -2
- package/src/decode-loader-results.ts +36 -0
- package/src/errors.ts +30 -1
- package/src/handle.ts +65 -12
- package/src/host/index.ts +2 -2
- package/src/host/router.ts +129 -57
- package/src/host/types.ts +31 -2
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +140 -20
- package/src/index.rsc.ts +12 -5
- package/src/index.ts +61 -11
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +21 -6
- package/src/loader.ts +3 -10
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/prerender/store.ts +5 -4
- package/src/prerender.ts +141 -80
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +65 -15
- package/src/route-content-wrapper.tsx +6 -28
- package/src/route-definition/dsl-helpers.ts +411 -261
- package/src/route-definition/helper-factories.ts +29 -139
- package/src/route-definition/helpers-types.ts +110 -34
- package/src/route-definition/index.ts +3 -0
- package/src/route-definition/redirect.ts +9 -1
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-types.ts +37 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +113 -1
- package/src/router/error-handling.ts +1 -1
- package/src/router/handler-context.ts +77 -38
- package/src/router/intercept-resolution.ts +13 -22
- package/src/router/lazy-includes.ts +8 -8
- package/src/router/loader-resolution.ts +174 -22
- package/src/router/manifest.ts +22 -13
- package/src/router/match-api.ts +128 -192
- package/src/router/match-handlers.ts +63 -20
- package/src/router/match-middleware/cache-lookup.ts +70 -97
- package/src/router/match-middleware/cache-store.ts +3 -2
- package/src/router/match-middleware/segment-resolution.ts +53 -0
- package/src/router/match-result.ts +103 -4
- package/src/router/metrics.ts +1 -1
- package/src/router/middleware-types.ts +21 -34
- package/src/router/middleware.ts +101 -89
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +101 -17
- package/src/router/prerender-match.ts +110 -10
- package/src/router/preview-match.ts +32 -102
- package/src/router/request-classification.ts +286 -0
- package/src/router/revalidation.ts +58 -2
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-interfaces.ts +77 -28
- package/src/router/router-options.ts +76 -11
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +105 -13
- package/src/router/segment-resolution/helpers.ts +29 -24
- package/src/router/segment-resolution/revalidation.ts +236 -112
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry.ts +99 -0
- package/src/router/trie-matching.ts +18 -13
- package/src/router/types.ts +9 -0
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +86 -22
- package/src/rsc/handler-context.ts +2 -2
- package/src/rsc/handler.ts +440 -381
- package/src/rsc/helpers.ts +91 -43
- package/src/rsc/index.ts +1 -1
- package/src/rsc/loader-fetch.ts +23 -3
- package/src/rsc/manifest-init.ts +5 -1
- package/src/rsc/origin-guard.ts +28 -10
- package/src/rsc/progressive-enhancement.ts +18 -2
- package/src/rsc/response-route-handler.ts +46 -53
- package/src/rsc/rsc-rendering.ts +41 -48
- package/src/rsc/runtime-warnings.ts +9 -10
- package/src/rsc/server-action.ts +25 -37
- package/src/rsc/ssr-setup.ts +18 -2
- package/src/rsc/types.ts +17 -3
- package/src/search-params.ts +4 -4
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +132 -116
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +190 -51
- package/src/server/cookie-store.ts +28 -4
- package/src/server/handle-store.ts +19 -0
- package/src/server/loader-registry.ts +9 -8
- package/src/server/request-context.ts +195 -57
- package/src/ssr/index.tsx +8 -1
- package/src/static-handler.ts +19 -7
- package/src/testing/cache-status.ts +166 -0
- package/src/testing/collect-handle.ts +63 -0
- package/src/testing/dispatch.ts +440 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +154 -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 +306 -0
- package/src/testing/e2e/server.ts +183 -0
- package/src/testing/flight-matchers.ts +104 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +309 -0
- package/src/testing/flight.entry.ts +39 -0
- package/src/testing/flight.ts +197 -0
- package/src/testing/generated-routes.ts +223 -0
- package/src/testing/index.ts +106 -0
- package/src/testing/internal/context.ts +304 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/render-route.tsx +565 -0
- package/src/testing/run-loader.ts +341 -0
- package/src/testing/run-middleware.ts +179 -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 +185 -0
- package/src/types/cache-types.ts +4 -4
- package/src/types/global-namespace.ts +39 -26
- package/src/types/handler-context.ts +103 -67
- package/src/types/index.ts +1 -0
- package/src/types/loader-types.ts +41 -15
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-entry.ts +12 -1
- package/src/types/segments.ts +36 -2
- package/src/urls/include-helper.ts +34 -67
- package/src/urls/index.ts +0 -3
- package/src/urls/path-helper-types.ts +50 -9
- package/src/urls/path-helper.ts +63 -63
- package/src/urls/pattern-types.ts +48 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +26 -116
- package/src/urls/urls-function.ts +1 -5
- package/src/use-loader.tsx +487 -44
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +34 -37
- package/src/vite/discovery/discover-routers.ts +105 -51
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +188 -93
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +46 -4
- package/src/vite/discovery/virtual-module-codegen.ts +13 -23
- package/src/vite/index.ts +6 -0
- package/src/vite/plugin-types.ts +126 -4
- package/src/vite/plugins/cjs-to-esm.ts +8 -7
- package/src/vite/plugins/client-ref-dedup.ts +16 -0
- package/src/vite/plugins/client-ref-hashing.ts +28 -5
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/plugins/expose-action-id.ts +54 -30
- package/src/vite/plugins/expose-id-utils.ts +24 -8
- package/src/vite/plugins/expose-ids/export-analysis.ts +100 -20
- package/src/vite/plugins/expose-ids/handler-transform.ts +12 -35
- package/src/vite/plugins/expose-ids/loader-transform.ts +3 -5
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
- package/src/vite/plugins/expose-internal-ids.ts +544 -317
- package/src/vite/plugins/performance-tracks.ts +92 -0
- package/src/vite/plugins/refresh-cmd.ts +88 -26
- package/src/vite/plugins/use-cache-transform.ts +65 -50
- package/src/vite/plugins/version-injector.ts +39 -23
- package/src/vite/plugins/version-plugin.ts +59 -2
- package/src/vite/plugins/virtual-entries.ts +2 -2
- package/src/vite/rango.ts +130 -26
- package/src/vite/router-discovery.ts +920 -129
- package/src/vite/utils/ast-handler-extract.ts +15 -15
- package/src/vite/utils/banner.ts +1 -1
- package/src/vite/utils/bundle-analysis.ts +4 -2
- package/src/vite/utils/client-chunks.ts +190 -0
- package/src/vite/utils/forward-user-plugins.ts +193 -0
- package/src/vite/utils/manifest-utils.ts +21 -5
- package/src/vite/utils/package-resolution.ts +41 -1
- package/src/vite/utils/prerender-utils.ts +38 -5
- package/src/vite/utils/shared-utils.ts +109 -27
- package/src/browser/action-response-classifier.ts +0 -99
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* assertGeneratedRoutesMatch — pin the generated named-routes map against the
|
|
3
|
+
* router's runtime route map.
|
|
4
|
+
*
|
|
5
|
+
* The Vite plugin writes a `*.named-routes.gen.ts` file mapping route names to
|
|
6
|
+
* URL patterns; consumers import that map and pass it here. The check compares
|
|
7
|
+
* it to the router's runtime `routeMap`, catching drift when a route is added,
|
|
8
|
+
* removed, renamed, or its pattern changes without regenerating the file.
|
|
9
|
+
*
|
|
10
|
+
* Directionality (relative to the generated map):
|
|
11
|
+
* - missing: present in the generated map but NOT at runtime (stale entry).
|
|
12
|
+
* - extra: present at runtime but NOT in the generated map (ungenerated route).
|
|
13
|
+
* Auto-generated internal names (the "$path_" / "$prefix_" prefixes)
|
|
14
|
+
* are excluded — they live in the runtime map but are never written
|
|
15
|
+
* to the generated file, so they are not drift.
|
|
16
|
+
* - mismatch: present in both under the same name, but the patterns differ.
|
|
17
|
+
*
|
|
18
|
+
* When `generatedMap` is omitted, the global route map (getGlobalRouteMap()) is
|
|
19
|
+
* used as the generated side — useful when a single router has registered into
|
|
20
|
+
* the global map.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { getGlobalRouteMap } from "../route-map-builder.js";
|
|
24
|
+
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Router shape this check depends on: a runtime route map, plus the optional
|
|
28
|
+
* `findMatch` used to force-expand lazy `include()`d routes (see below).
|
|
29
|
+
*/
|
|
30
|
+
interface RouterWithRouteMap {
|
|
31
|
+
routeMap: Record<string, unknown>;
|
|
32
|
+
findMatch?: (pathname: string) => unknown;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Derive a best-effort concrete path from a route pattern so `findMatch` can be
|
|
37
|
+
* invoked to expand a lazy include. `:param`, `:param(constraint)`, optional
|
|
38
|
+
* `:param?`, and `*` are all replaced with a literal segment. A constrained
|
|
39
|
+
* param may not match its constraint (so that one route's match fails), but
|
|
40
|
+
* since matching ANY route in an include expands ALL of the include's routes,
|
|
41
|
+
* a sibling route in the same include will still trigger expansion.
|
|
42
|
+
*/
|
|
43
|
+
function concretePath(pattern: string): string {
|
|
44
|
+
return (
|
|
45
|
+
pattern
|
|
46
|
+
.replace(/:[A-Za-z0-9_]+\([^)]*\)\??/g, "x") // :p(constraint) / optional
|
|
47
|
+
.replace(/:[A-Za-z0-9_]+\??/g, "x") // :p or :p?
|
|
48
|
+
.replace(/\*/g, "x") // wildcard
|
|
49
|
+
.replace(/\/{2,}/g, "/") || "/"
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Force-expand the router's lazy `include()`d routes into `router.routeMap`.
|
|
55
|
+
*
|
|
56
|
+
* All Rango includes are lazy — their child routes only populate `routeMap` when
|
|
57
|
+
* the router first matches a path inside them (in production the build-time
|
|
58
|
+
* manifest virtual carries the full map; in a bare test that virtual is absent).
|
|
59
|
+
* To make the whole-app drift check work in a unit test, we trigger expansion by
|
|
60
|
+
* calling `findMatch` on a concrete path derived from each known pattern. This is
|
|
61
|
+
* idempotent and side-effect-free beyond populating the route map. Routers that
|
|
62
|
+
* don't expose `findMatch` (e.g. a plain `{ routeMap }` object) are left as-is.
|
|
63
|
+
*/
|
|
64
|
+
function expandLazyIncludes(
|
|
65
|
+
router: RouterWithRouteMap,
|
|
66
|
+
patterns: Iterable<string>,
|
|
67
|
+
): void {
|
|
68
|
+
const findMatch = router.findMatch;
|
|
69
|
+
if (typeof findMatch !== "function") return;
|
|
70
|
+
for (const pattern of patterns) {
|
|
71
|
+
try {
|
|
72
|
+
findMatch.call(router, concretePath(pattern));
|
|
73
|
+
} catch {
|
|
74
|
+
// A pattern that fails to match (constrained param, etc.) is fine — a
|
|
75
|
+
// sibling route in the same include still triggers expansion.
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* A single name/pattern mismatch: [routeName, generatedPattern, runtimePattern].
|
|
82
|
+
*/
|
|
83
|
+
export type GeneratedRouteMismatch = [
|
|
84
|
+
name: string,
|
|
85
|
+
generated: string,
|
|
86
|
+
runtime: string,
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Structured diff between the generated route map and the runtime route map.
|
|
91
|
+
*/
|
|
92
|
+
export interface GeneratedRoutesDiff {
|
|
93
|
+
/** Names in the generated map but absent at runtime. */
|
|
94
|
+
missing: string[];
|
|
95
|
+
/** Names at runtime but absent from the generated map. */
|
|
96
|
+
extra: string[];
|
|
97
|
+
/** Names in both with differing patterns. */
|
|
98
|
+
mismatch: GeneratedRouteMismatch[];
|
|
99
|
+
/** True when missing, extra, and mismatch are all empty. */
|
|
100
|
+
ok: boolean;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Normalize a route map value to its pattern string. Route maps may carry
|
|
105
|
+
* either a bare pattern string or a `{ path, ... }` object (for response/search
|
|
106
|
+
* routes); compare on the `path`.
|
|
107
|
+
*/
|
|
108
|
+
function patternOf(value: unknown): string {
|
|
109
|
+
if (typeof value === "string") return value;
|
|
110
|
+
if (
|
|
111
|
+
value &&
|
|
112
|
+
typeof value === "object" &&
|
|
113
|
+
"path" in value &&
|
|
114
|
+
typeof (value as { path: unknown }).path === "string"
|
|
115
|
+
) {
|
|
116
|
+
return (value as { path: string }).path;
|
|
117
|
+
}
|
|
118
|
+
return String(value);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Compute the diff between a router's runtime route map and a generated map.
|
|
123
|
+
*/
|
|
124
|
+
export function diffGeneratedRoutes(
|
|
125
|
+
router: RouterWithRouteMap,
|
|
126
|
+
generatedMap?: Record<string, unknown>,
|
|
127
|
+
): GeneratedRoutesDiff {
|
|
128
|
+
const generated = generatedMap ?? getGlobalRouteMap();
|
|
129
|
+
|
|
130
|
+
// Lazy `include()`d routes are absent from `routeMap` until first matched, so
|
|
131
|
+
// expand them first (using the generated patterns to drive the matches) —
|
|
132
|
+
// otherwise every included route is a false `missing`. No-op for plain
|
|
133
|
+
// `{ routeMap }` objects that don't expose `findMatch`.
|
|
134
|
+
expandLazyIncludes(
|
|
135
|
+
router,
|
|
136
|
+
Object.values(generated).map((v) => patternOf(v)),
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
const runtime = router.routeMap as Record<string, unknown>;
|
|
140
|
+
|
|
141
|
+
const missing: string[] = [];
|
|
142
|
+
const extra: string[] = [];
|
|
143
|
+
const mismatch: GeneratedRouteMismatch[] = [];
|
|
144
|
+
|
|
145
|
+
for (const name of Object.keys(generated)) {
|
|
146
|
+
if (!(name in runtime)) {
|
|
147
|
+
missing.push(name);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const gen = patternOf(generated[name]);
|
|
151
|
+
const run = patternOf(runtime[name]);
|
|
152
|
+
if (gen !== run) {
|
|
153
|
+
mismatch.push([name, gen, run]);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
for (const name of Object.keys(runtime)) {
|
|
158
|
+
// Auto-generated internal names ($path_*/$prefix_*) live in the runtime
|
|
159
|
+
// mergedRouteMap but are deliberately excluded from the generated
|
|
160
|
+
// *.named-routes.gen.ts file (route-types-writer / runtime-discovery skip
|
|
161
|
+
// them). Reporting them as `extra` would throw on a perfectly in-sync app
|
|
162
|
+
// that simply uses an unnamed path()/include() route, so skip them here to
|
|
163
|
+
// match exactly the surface the generator emits.
|
|
164
|
+
if (isAutoGeneratedRouteName(name)) continue;
|
|
165
|
+
if (!(name in generated)) {
|
|
166
|
+
extra.push(name);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return {
|
|
171
|
+
missing,
|
|
172
|
+
extra,
|
|
173
|
+
mismatch,
|
|
174
|
+
ok: missing.length === 0 && extra.length === 0 && mismatch.length === 0,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Assert the router's runtime route map matches the generated map. Throws a
|
|
180
|
+
* descriptive Error listing every missing, extra, and mismatched route when
|
|
181
|
+
* they diverge.
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```ts
|
|
185
|
+
* import generated from "./router.named-routes.gen";
|
|
186
|
+
* import { router } from "./router";
|
|
187
|
+
*
|
|
188
|
+
* assertGeneratedRoutesMatch(router, generated);
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
export function assertGeneratedRoutesMatch(
|
|
192
|
+
router: RouterWithRouteMap,
|
|
193
|
+
generatedMap?: Record<string, unknown>,
|
|
194
|
+
): void {
|
|
195
|
+
const diff = diffGeneratedRoutes(router, generatedMap);
|
|
196
|
+
if (diff.ok) return;
|
|
197
|
+
|
|
198
|
+
const lines: string[] = [
|
|
199
|
+
"Generated routes do not match the router's runtime route map.",
|
|
200
|
+
];
|
|
201
|
+
|
|
202
|
+
if (diff.missing.length > 0) {
|
|
203
|
+
lines.push(
|
|
204
|
+
` Missing (generated but not at runtime): ${diff.missing.join(", ")}`,
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
if (diff.extra.length > 0) {
|
|
208
|
+
lines.push(
|
|
209
|
+
` Extra (at runtime but not generated): ${diff.extra.join(", ")}`,
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
if (diff.mismatch.length > 0) {
|
|
213
|
+
lines.push(" Pattern mismatches (name: generated -> runtime):");
|
|
214
|
+
for (const [name, gen, run] of diff.mismatch) {
|
|
215
|
+
lines.push(` ${name}: ${gen} -> ${run}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
lines.push(
|
|
219
|
+
"Re-run the build / `rango` route generation to regenerate the *.named-routes.gen.ts file.",
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
throw new Error(lines.join("\n"));
|
|
223
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rangojs/router/testing
|
|
3
|
+
*
|
|
4
|
+
* Consumer-facing testing primitives for apps built on @rangojs/router.
|
|
5
|
+
*
|
|
6
|
+
* This is the entry for UNIT and INTEGRATION tests, meant to run under a
|
|
7
|
+
* Vite-driven Vitest project (the rango Vite plugin must be active so the
|
|
8
|
+
* `@rangojs/router:version` and related virtual modules the router internals
|
|
9
|
+
* import can resolve; alternatively alias `@rangojs/router:version`). Importing
|
|
10
|
+
* this module references neither React, @testing-library/react, @playwright/test,
|
|
11
|
+
* nor the RSC runtime — a unit suite testing only loaders/middleware/dispatch
|
|
12
|
+
* pulls in none of them.
|
|
13
|
+
*
|
|
14
|
+
* The other surfaces are SEPARATE entries because each pulls a dependency or
|
|
15
|
+
* runtime this barrel deliberately keeps out:
|
|
16
|
+
* - `@rangojs/router/testing/dom` — `renderRoute` (the RTL component stub). Kept
|
|
17
|
+
* separate so this barrel never references React, the browser runtime, or
|
|
18
|
+
* `@testing-library/react` types — a unit suite testing only loaders/middleware
|
|
19
|
+
* needs none of them.
|
|
20
|
+
* - `@rangojs/router/testing/e2e` — the Playwright harness (createRangoE2E,
|
|
21
|
+
* useFixture, parityDescribe, expectParity, matchers). Kept separate so it is
|
|
22
|
+
* loadable in a plain (non-Vite) Playwright runner, which cannot resolve the
|
|
23
|
+
* router-manifest virtual modules this barrel pulls in.
|
|
24
|
+
* - `@rangojs/router/testing/flight` — real Flight rendering. Its serializer
|
|
25
|
+
* (vendored react-server-dom) loads only under the `react-server` node
|
|
26
|
+
* condition and would throw if pulled into this barrel.
|
|
27
|
+
*
|
|
28
|
+
* Layers:
|
|
29
|
+
* - Unit: runMiddleware, runLoader
|
|
30
|
+
* - Integration: dispatch (request -> Response)
|
|
31
|
+
* - Cross-cut: assertCacheStatus, assertGeneratedRoutesMatch
|
|
32
|
+
* - Component: see @rangojs/router/testing/dom (renderRoute)
|
|
33
|
+
* - E2E: see @rangojs/router/testing/e2e
|
|
34
|
+
* - RSC: see @rangojs/router/testing/flight
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
// Unit
|
|
38
|
+
export { runMiddleware } from "./run-middleware.js";
|
|
39
|
+
export type {
|
|
40
|
+
RunMiddlewareOptions,
|
|
41
|
+
RunMiddlewareResult,
|
|
42
|
+
} from "./run-middleware.js";
|
|
43
|
+
export { runLoader } from "./run-loader.js";
|
|
44
|
+
export type {
|
|
45
|
+
RunLoaderOptions,
|
|
46
|
+
UseResolver,
|
|
47
|
+
TestLoaderContext,
|
|
48
|
+
} from "./run-loader.js";
|
|
49
|
+
|
|
50
|
+
// Integration
|
|
51
|
+
export { dispatch } from "./dispatch.js";
|
|
52
|
+
export type { DispatchOptions } from "./dispatch.js";
|
|
53
|
+
|
|
54
|
+
// renderRoute lives at `@rangojs/router/testing/dom` — it pulls React, the
|
|
55
|
+
// browser runtime, and @testing-library/react types, which this barrel keeps
|
|
56
|
+
// out so node-only unit suites depend on none of them.
|
|
57
|
+
|
|
58
|
+
// Cross-cutting: cache/prerender status
|
|
59
|
+
export {
|
|
60
|
+
assertCacheStatus,
|
|
61
|
+
parseCacheHeader,
|
|
62
|
+
createCacheSink,
|
|
63
|
+
filterCacheDecisions,
|
|
64
|
+
} from "./cache-status.js";
|
|
65
|
+
export type {
|
|
66
|
+
ExpectedCacheStatus,
|
|
67
|
+
CacheStatusTarget,
|
|
68
|
+
CacheSink,
|
|
69
|
+
} from "./cache-status.js";
|
|
70
|
+
|
|
71
|
+
// Cross-cutting: handle collect/accumulator
|
|
72
|
+
export { collectHandle } from "./collect-handle.js";
|
|
73
|
+
|
|
74
|
+
// Cross-cutting: generated-route drift
|
|
75
|
+
export {
|
|
76
|
+
diffGeneratedRoutes,
|
|
77
|
+
assertGeneratedRoutesMatch,
|
|
78
|
+
} from "./generated-routes.js";
|
|
79
|
+
export type {
|
|
80
|
+
GeneratedRoutesDiff,
|
|
81
|
+
GeneratedRouteMismatch,
|
|
82
|
+
} from "./generated-routes.js";
|
|
83
|
+
|
|
84
|
+
// Advanced: build a real RequestContext for bespoke loader/middleware setups
|
|
85
|
+
export {
|
|
86
|
+
createTestRequestContext,
|
|
87
|
+
runInRequestContext,
|
|
88
|
+
toRequest,
|
|
89
|
+
seedVariables,
|
|
90
|
+
} from "./internal/context.js";
|
|
91
|
+
export type {
|
|
92
|
+
CreateTestContextOptions,
|
|
93
|
+
TestRequestContext,
|
|
94
|
+
RunInRequestContextResult,
|
|
95
|
+
VarsInit,
|
|
96
|
+
} from "./internal/context.js";
|
|
97
|
+
|
|
98
|
+
// The low-level context runner that enters a RequestContext (the same one the
|
|
99
|
+
// RSC handler uses for server actions). Re-exported so a ctx built with
|
|
100
|
+
// createTestRequestContext can be entered directly; runInRequestContext is the
|
|
101
|
+
// one-call convenience over createTestRequestContext + runWithRequestContext.
|
|
102
|
+
export { runWithRequestContext } from "../server/request-context.js";
|
|
103
|
+
|
|
104
|
+
// The E2E harness is NOT re-exported here: it must be imported from
|
|
105
|
+
// `@rangojs/router/testing/e2e` so it stays loadable in a plain Playwright
|
|
106
|
+
// runner (this barrel pulls in router-manifest code that needs Vite virtuals).
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared internals for the consumer testing primitives.
|
|
3
|
+
*
|
|
4
|
+
* Builds a real RequestContext via the same createRequestContext the RSC
|
|
5
|
+
* handler uses, with test-friendly defaults, so loaders and middleware run
|
|
6
|
+
* with production-fidelity context (cookies, headers, get/set, use, reverse)
|
|
7
|
+
* instead of a hand-rolled mock.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
createRequestContext,
|
|
12
|
+
runWithRequestContext,
|
|
13
|
+
type RequestContext,
|
|
14
|
+
} from "../../server/request-context.js";
|
|
15
|
+
import { resolveLocationStateEntries } from "../../browser/react/location-state-shared.js";
|
|
16
|
+
import { createReverseFunction } from "../../router/handler-context.js";
|
|
17
|
+
import { normalizeBasename } from "../../router/basename.js";
|
|
18
|
+
import { contextSet, type ContextVar } from "../../context-var.js";
|
|
19
|
+
import type { ThemeConfig } from "../../theme/types.js";
|
|
20
|
+
import { resolveThemeConfig } from "../../theme/constants.js";
|
|
21
|
+
import type { SegmentCacheStore } from "../../cache/types.js";
|
|
22
|
+
import type { CacheProfile } from "../../cache/profile-registry.js";
|
|
23
|
+
|
|
24
|
+
const DEFAULT_ORIGIN = "http://localhost/";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Initializer for seeded context variables (as a prior middleware would have
|
|
28
|
+
* set). Either a plain object keyed by var name (the common, best-inferring
|
|
29
|
+
* form: `{ user: u }`) or a list of `[key, value]` tuples where the key may be a
|
|
30
|
+
* `createVar()` handle or a string (`[[userVar, u], ["flag", true]]`).
|
|
31
|
+
*/
|
|
32
|
+
export type VarsInit =
|
|
33
|
+
| Record<string, unknown>
|
|
34
|
+
| ReadonlyArray<readonly [ContextVar<unknown> | string, unknown]>;
|
|
35
|
+
|
|
36
|
+
/** Normalize a Request | string | undefined into a concrete Request. */
|
|
37
|
+
export function toRequest(
|
|
38
|
+
request: Request | string | undefined,
|
|
39
|
+
init?: RequestInit,
|
|
40
|
+
): Request {
|
|
41
|
+
if (request instanceof Request) return request;
|
|
42
|
+
if (typeof request === "string") {
|
|
43
|
+
return new Request(new URL(request, DEFAULT_ORIGIN), init);
|
|
44
|
+
}
|
|
45
|
+
return new Request(DEFAULT_ORIGIN, init);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Preload variables as if set by upstream middleware. Accepts entries keyed by
|
|
50
|
+
* either a ContextVar (from createVar) or a string, matching ctx.set().
|
|
51
|
+
*/
|
|
52
|
+
export function seedVariables(
|
|
53
|
+
variables: Record<string, unknown>,
|
|
54
|
+
vars?: VarsInit,
|
|
55
|
+
): Record<string, unknown> {
|
|
56
|
+
if (!vars) return variables;
|
|
57
|
+
// Array/iterable form -> use the tuples as-is; plain object -> its entries.
|
|
58
|
+
const entries: Iterable<readonly [ContextVar<unknown> | string, unknown]> =
|
|
59
|
+
Symbol.iterator in (vars as object)
|
|
60
|
+
? (vars as ReadonlyArray<
|
|
61
|
+
readonly [ContextVar<unknown> | string, unknown]
|
|
62
|
+
>)
|
|
63
|
+
: Object.entries(vars as Record<string, unknown>);
|
|
64
|
+
for (const [key, value] of entries) {
|
|
65
|
+
contextSet(variables, key as ContextVar<unknown>, value);
|
|
66
|
+
}
|
|
67
|
+
return variables;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface CreateTestContextOptions<TEnv> {
|
|
71
|
+
env?: TEnv;
|
|
72
|
+
request?: Request | string;
|
|
73
|
+
requestInit?: RequestInit;
|
|
74
|
+
/** Backing store for ctx.get()/ctx.set(); pre-seeded from `vars`. */
|
|
75
|
+
variables?: Record<string, unknown>;
|
|
76
|
+
/** Variables a prior middleware would have set (object or [key, value] list). */
|
|
77
|
+
vars?: VarsInit;
|
|
78
|
+
/** Route name -> pattern map enabling ctx.reverse() without global state. */
|
|
79
|
+
routeMap?: Record<string, string>;
|
|
80
|
+
routeName?: string;
|
|
81
|
+
params?: Record<string, string>;
|
|
82
|
+
/**
|
|
83
|
+
* Router basename for this request (what the RSC handler stores on the
|
|
84
|
+
* context). Drives redirect() prefixing. Normalized exactly like
|
|
85
|
+
* createRouter({ basename }) (leading slash forced, trailing stripped, bare
|
|
86
|
+
* "/" -> undefined) so passing the same value your router takes yields the
|
|
87
|
+
* same redirect Location. Defaults to undefined (no basename).
|
|
88
|
+
*/
|
|
89
|
+
basename?: string;
|
|
90
|
+
/**
|
|
91
|
+
* Cache store backing `use cache` functions invoked during the test, the
|
|
92
|
+
* same shape `createRouter({ cache })` resolves. Without it,
|
|
93
|
+
* registerCachedFunction bypasses (it checks for a store FIRST), so a cached
|
|
94
|
+
* function runs uncached and its taint/profile guards never fire. Wire one
|
|
95
|
+
* (e.g. `new MemorySegmentCacheStore()`) to exercise real cache behavior.
|
|
96
|
+
*/
|
|
97
|
+
cacheStore?: SegmentCacheStore;
|
|
98
|
+
/**
|
|
99
|
+
* Cache profiles in the `createRouter({ cacheProfiles })` shape. Required for
|
|
100
|
+
* a `use cache: "profileName"` function to resolve its profile (an unknown
|
|
101
|
+
* profile throws), once a `cacheStore` is wired.
|
|
102
|
+
*/
|
|
103
|
+
cacheProfiles?: Record<string, CacheProfile>;
|
|
104
|
+
/**
|
|
105
|
+
* Theme config in the same shape `createRouter({ theme })` takes (resolved
|
|
106
|
+
* internally). Without it `ctx.theme`/`ctx.setTheme` are inert (undefined),
|
|
107
|
+
* mirroring an app with no theme configured. Pass one (e.g. `true`, or
|
|
108
|
+
* `{ themes: [...] }`) to exercise a handler that reads them.
|
|
109
|
+
*/
|
|
110
|
+
theme?: ThemeConfig | true;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface TestRequestContext<TEnv> {
|
|
114
|
+
ctx: RequestContext<TEnv>;
|
|
115
|
+
request: Request;
|
|
116
|
+
url: URL;
|
|
117
|
+
variables: Record<string, unknown>;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Create a real RequestContext for unit-testing loaders/middleware.
|
|
122
|
+
*
|
|
123
|
+
* The returned `ctx` must be ENTERED before use — wrap your call in
|
|
124
|
+
* `runWithRequestContext(ctx, fn)` (re-exported from `@rangojs/router/testing`)
|
|
125
|
+
* so that cookie/header mutations and `getRequestContext()` resolve. For the
|
|
126
|
+
* common case prefer {@link runInRequestContext}, which builds AND enters the
|
|
127
|
+
* context in a single call.
|
|
128
|
+
*/
|
|
129
|
+
export function createTestRequestContext<TEnv>(
|
|
130
|
+
opts: CreateTestContextOptions<TEnv> = {},
|
|
131
|
+
): TestRequestContext<TEnv> {
|
|
132
|
+
const request = toRequest(opts.request, opts.requestInit);
|
|
133
|
+
const url = new URL(request.url);
|
|
134
|
+
const variables = seedVariables(opts.variables ?? {}, opts.vars);
|
|
135
|
+
const ctx = createRequestContext<TEnv>({
|
|
136
|
+
env: (opts.env ?? {}) as TEnv,
|
|
137
|
+
request,
|
|
138
|
+
url,
|
|
139
|
+
variables,
|
|
140
|
+
themeConfig:
|
|
141
|
+
opts.theme === undefined ? undefined : resolveThemeConfig(opts.theme),
|
|
142
|
+
cacheStore: opts.cacheStore,
|
|
143
|
+
cacheProfiles: opts.cacheProfiles,
|
|
144
|
+
});
|
|
145
|
+
if (opts.basename !== undefined)
|
|
146
|
+
ctx._basename = normalizeBasename(opts.basename);
|
|
147
|
+
if (opts.params) ctx.params = opts.params;
|
|
148
|
+
if (opts.routeMap) {
|
|
149
|
+
ctx._routeName = opts.routeName;
|
|
150
|
+
ctx.reverse = createReverseFunction(
|
|
151
|
+
opts.routeMap,
|
|
152
|
+
opts.routeName,
|
|
153
|
+
opts.params ?? {},
|
|
154
|
+
) as RequestContext<TEnv>["reverse"];
|
|
155
|
+
}
|
|
156
|
+
return { ctx, request, url, variables };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* What a run accumulated on the request context, surfaced as PUBLIC values so a
|
|
161
|
+
* test never has to cast through the `@internal` `ctx.res` / `ctx.cookies()` to
|
|
162
|
+
* assert what an action produced.
|
|
163
|
+
*/
|
|
164
|
+
export interface RunInRequestContextResult<T> {
|
|
165
|
+
/**
|
|
166
|
+
* The value `fn` returned (awaited), or `undefined` if `fn` threw — in which
|
|
167
|
+
* case the thrown value is on {@link thrown}. The snapshot below is captured
|
|
168
|
+
* either way.
|
|
169
|
+
*/
|
|
170
|
+
result: T | undefined;
|
|
171
|
+
/**
|
|
172
|
+
* The value `fn` threw, or `undefined` if it returned normally. Commonly a
|
|
173
|
+
* `Response` from `throw redirect(...)` / `throw notFound()` — the dominant
|
|
174
|
+
* cookie+flash case is an action that sets them then throws a redirect — so
|
|
175
|
+
* this (and the snapshot below) is observable WITHOUT wrapping the action in
|
|
176
|
+
* your own try/catch. NOTE: the value is captured, NOT re-thrown; assert on it
|
|
177
|
+
* for a throwing action.
|
|
178
|
+
*/
|
|
179
|
+
thrown: unknown;
|
|
180
|
+
/**
|
|
181
|
+
* A Response carrying the status, headers, and Set-Cookie the run set (via
|
|
182
|
+
* `cookies().set()`, `ctx.header()`, etc.). Assert Set-Cookie with
|
|
183
|
+
* `response.headers.getSetCookie()`. When `fn` threw a `Response` (a redirect),
|
|
184
|
+
* THIS is that Response with the accumulated Set-Cookie/headers merged in
|
|
185
|
+
* (mirroring how the framework merges them in production), so a redirect's
|
|
186
|
+
* Location AND the cookies it set are both observable here.
|
|
187
|
+
*/
|
|
188
|
+
response: Response;
|
|
189
|
+
/**
|
|
190
|
+
* The effective cookie view after the run: request cookies merged with
|
|
191
|
+
* anything the run set or deleted (last-write-wins), as `{ name: value }`.
|
|
192
|
+
*/
|
|
193
|
+
cookies: Record<string, string>;
|
|
194
|
+
/**
|
|
195
|
+
* Location state the run set via `ctx.setLocationState()` / `redirect({ state })`,
|
|
196
|
+
* resolved to the flat `{ key: value }` shape the client reads off
|
|
197
|
+
* `history.state` (empty object when none) — so a post-action flash ("Saved!")
|
|
198
|
+
* is assertable at the unit layer.
|
|
199
|
+
*/
|
|
200
|
+
locationState: Record<string, unknown>;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Snapshot the observable effects a run left on `ctx` (cookies + location
|
|
205
|
+
* state). Reads the fields directly off the ctx object, so it works both inside
|
|
206
|
+
* and outside the AsyncLocalStorage scope (no `getRequestContext()`).
|
|
207
|
+
*/
|
|
208
|
+
export function snapshotRunEffects<TEnv>(ctx: RequestContext<TEnv>): {
|
|
209
|
+
cookies: Record<string, string>;
|
|
210
|
+
locationState: Record<string, unknown>;
|
|
211
|
+
} {
|
|
212
|
+
return {
|
|
213
|
+
cookies: { ...ctx.cookies() },
|
|
214
|
+
locationState: resolveLocationStateEntries(ctx._locationState ?? []),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Build the observable response from what the run accumulated on `ctx.res`. When
|
|
220
|
+
* `fn` threw a `Response` (a `redirect()`/`notFound()`), that Response IS the
|
|
221
|
+
* response — merge the accumulated Set-Cookie/other headers into it (the
|
|
222
|
+
* framework does this when it catches the thrown Response in production), with
|
|
223
|
+
* its status/Location preserved. Otherwise snapshot the stub (status + headers).
|
|
224
|
+
* The `Response`/`Headers` constructors copy, so the result is immutable.
|
|
225
|
+
*/
|
|
226
|
+
function buildRunResponse<TEnv>(
|
|
227
|
+
ctx: RequestContext<TEnv>,
|
|
228
|
+
thrown: unknown,
|
|
229
|
+
): Response {
|
|
230
|
+
const stub = ctx.res;
|
|
231
|
+
if (thrown instanceof Response) {
|
|
232
|
+
const headers = new Headers(thrown.headers);
|
|
233
|
+
for (const cookie of stub.headers.getSetCookie()) {
|
|
234
|
+
headers.append("set-cookie", cookie);
|
|
235
|
+
}
|
|
236
|
+
stub.headers.forEach((value, name) => {
|
|
237
|
+
if (name.toLowerCase() === "set-cookie") return;
|
|
238
|
+
if (!headers.has(name)) headers.set(name, value);
|
|
239
|
+
});
|
|
240
|
+
return new Response(null, { status: thrown.status, headers });
|
|
241
|
+
}
|
|
242
|
+
return new Response(null, { status: stub.status, headers: stub.headers });
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Build a seeded RequestContext (via {@link createTestRequestContext}) and run
|
|
247
|
+
* `fn` inside it, so code under test that calls `getRequestContext()`,
|
|
248
|
+
* `cookies()`, or reads/mutates request headers resolves exactly as in
|
|
249
|
+
* production.
|
|
250
|
+
*
|
|
251
|
+
* This is the entry point for the advanced cases the unit wrappers
|
|
252
|
+
* (`runLoader` / `runMiddleware`) do not model — most notably a server ACTION
|
|
253
|
+
* that authenticates off the request cookie or sets a session cookie / flash:
|
|
254
|
+
* an action has no loader context, so `runLoader` is the wrong shape, yet it
|
|
255
|
+
* still needs a real request context to read the cookie and resolve
|
|
256
|
+
* `getRequestContext()`.
|
|
257
|
+
*
|
|
258
|
+
* Returns `{ result, thrown, response, cookies, locationState }` so the action's
|
|
259
|
+
* OUTPUT (Set-Cookie, headers, flash) is assertable without casting through the
|
|
260
|
+
* `@internal` `ctx.res` / `ctx.cookies()`. `fn` may be async — the context stays
|
|
261
|
+
* active across its awaits (AsyncLocalStorage), and the snapshot is captured
|
|
262
|
+
* whether `fn` returns OR throws. The throw path matters: the most common
|
|
263
|
+
* cookie+flash case is an auth action that sets a cookie + flash then
|
|
264
|
+
* `throw redirect(...)` on success — the thrown redirect is on `thrown` (NOT
|
|
265
|
+
* re-thrown) and its Location plus the cookies are on `response`/`cookies`.
|
|
266
|
+
*
|
|
267
|
+
* @example
|
|
268
|
+
* ```ts
|
|
269
|
+
* const { result, cookies, response, thrown } = await runInRequestContext(
|
|
270
|
+
* () => loginAction(input), // sets a session cookie, then `throw redirect("/app")`
|
|
271
|
+
* {
|
|
272
|
+
* env,
|
|
273
|
+
* request: new Request("https://app.test/", {
|
|
274
|
+
* headers: { Cookie: "sid=abc" },
|
|
275
|
+
* }),
|
|
276
|
+
* },
|
|
277
|
+
* );
|
|
278
|
+
* expect(cookies.session).toBe("new-token");
|
|
279
|
+
* expect((thrown as Response).headers.get("Location")).toBe("/app");
|
|
280
|
+
* expect(response.headers.getSetCookie()).toContainEqual(
|
|
281
|
+
* expect.stringContaining("session="),
|
|
282
|
+
* );
|
|
283
|
+
* ```
|
|
284
|
+
*/
|
|
285
|
+
export async function runInRequestContext<T, TEnv = unknown>(
|
|
286
|
+
fn: (ctx: RequestContext<TEnv>) => T | Promise<T>,
|
|
287
|
+
opts: CreateTestContextOptions<TEnv> = {},
|
|
288
|
+
): Promise<RunInRequestContextResult<T>> {
|
|
289
|
+
const { ctx } = createTestRequestContext<TEnv>(opts);
|
|
290
|
+
let result: T | undefined;
|
|
291
|
+
let thrown: unknown;
|
|
292
|
+
let didThrow = false;
|
|
293
|
+
try {
|
|
294
|
+
result = (await runWithRequestContext(ctx, () => fn(ctx))) as T;
|
|
295
|
+
} catch (error) {
|
|
296
|
+
// Capture (do NOT re-throw): a redirect/notFound action throws its Response
|
|
297
|
+
// on the SUCCESS path, and its cookie/flash output must stay observable.
|
|
298
|
+
didThrow = true;
|
|
299
|
+
thrown = error;
|
|
300
|
+
}
|
|
301
|
+
const { cookies, locationState } = snapshotRunEffects(ctx);
|
|
302
|
+
const response = buildRunResponse(ctx, didThrow ? thrown : undefined);
|
|
303
|
+
return { result, thrown, response, cookies, locationState };
|
|
304
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Side-effect module: define the webpack-style globals the vendored
|
|
3
|
+
* react-server-dom CLIENT deserializer reads at module-eval time.
|
|
4
|
+
*
|
|
5
|
+
* In a real app the plugin-rsc Vite plugin rewrites `__webpack_require__` ->
|
|
6
|
+
* `__vite_rsc_require__` and `__webpack_require__.u` -> `({}).u`
|
|
7
|
+
* (@vitejs/plugin-rsc `core/plugin.js`). That transform does NOT run in a bare
|
|
8
|
+
* Vitest process, so the vendored client's free `__webpack_require__` /
|
|
9
|
+
* `__webpack_chunk_load__` references would be undefined. We provide minimal
|
|
10
|
+
* shims: `__webpack_require__` routes to the loader installed via
|
|
11
|
+
* `setRequireModule`, and `__webpack_chunk_load__` is a no-op (renderServerTree
|
|
12
|
+
* serializes with empty `chunks`, so no chunk fetch ever happens).
|
|
13
|
+
*
|
|
14
|
+
* MUST be imported (for side effect) BEFORE `@vitejs/plugin-rsc/react/browser`,
|
|
15
|
+
* which is why flight-tree.ts lists it first.
|
|
16
|
+
*/
|
|
17
|
+
const g = globalThis as unknown as {
|
|
18
|
+
__webpack_require__?: ((id: string) => unknown) & { u?: unknown };
|
|
19
|
+
__webpack_chunk_load__?: (chunkId: string) => Promise<unknown>;
|
|
20
|
+
__vite_rsc_client_require__?: (id: string) => unknown;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
if (!g.__webpack_require__) {
|
|
24
|
+
g.__webpack_require__ = (id: string) => g.__vite_rsc_client_require__!(id);
|
|
25
|
+
}
|
|
26
|
+
if (!g.__webpack_chunk_load__) {
|
|
27
|
+
g.__webpack_chunk_load__ = async () => {};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export {};
|