@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,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* collectHandle — unit-test a handle's `collect`/accumulator function directly.
|
|
3
|
+
*
|
|
4
|
+
* A handle's collect function (the `createHandle(collect)` argument that maps the
|
|
5
|
+
* per-segment pushed values into the accumulated result) is otherwise not
|
|
6
|
+
* directly reachable: createHandle keeps it in a private registry keyed by the
|
|
7
|
+
* handle's `$$id` and returns only `{ __brand, $$id }`. This primitive runs that
|
|
8
|
+
* REAL registered collect on per-segment values you provide and returns the
|
|
9
|
+
* accumulated result — so the mapper/accumulator is unit-testable without a full
|
|
10
|
+
* route match.
|
|
11
|
+
*
|
|
12
|
+
* It relies on createHandle registering the collect even in a bare test (it
|
|
13
|
+
* assigns a runtime fallback id when the Vite plugin did not inject one). If a
|
|
14
|
+
* handle's module was never imported (so createHandle never ran), the collect is
|
|
15
|
+
* unregistered and this falls back to a flat array with a warning.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { getCollectFn, type Handle } from "../handle.js";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Run a handle's collect function on per-segment pushed values.
|
|
22
|
+
*
|
|
23
|
+
* @param handle - The handle whose collect to run.
|
|
24
|
+
* @param segments - Per-segment pushed values: each entry is the array of values
|
|
25
|
+
* one route segment pushed for this handle, in parent -> child order. Empty
|
|
26
|
+
* per-segment arrays are dropped before the collect runs, matching production
|
|
27
|
+
* collectHandleData (a segment that pushed nothing is not passed through).
|
|
28
|
+
* @returns The accumulated value the handle's collect produces.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* // Default flatten
|
|
33
|
+
* collectHandle(Breadcrumbs, [[{ label: "Home", href: "/" }], [{ label: "P", href: "/p" }]]);
|
|
34
|
+
* // -> [{ label: "Home", href: "/" }, { label: "P", href: "/p" }]
|
|
35
|
+
*
|
|
36
|
+
* // Custom "last wins"
|
|
37
|
+
* const PageTitle = createHandle<string, string>((s) => s.flat().at(-1) ?? "");
|
|
38
|
+
* collectHandle(PageTitle, [["Home"], ["Product"]]); // -> "Product"
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function collectHandle<TData, TAccumulated>(
|
|
42
|
+
handle: Handle<TData, TAccumulated>,
|
|
43
|
+
segments: ReadonlyArray<ReadonlyArray<TData>>,
|
|
44
|
+
): TAccumulated {
|
|
45
|
+
const collectFn = getCollectFn(handle.$$id) as
|
|
46
|
+
| ((segments: TData[][]) => TAccumulated)
|
|
47
|
+
| undefined;
|
|
48
|
+
|
|
49
|
+
if (!collectFn) {
|
|
50
|
+
console.warn(
|
|
51
|
+
`[rango] collectHandle: handle "${handle.$$id}" has no registered collect ` +
|
|
52
|
+
`function. Import the handle's module so createHandle() runs. Falling ` +
|
|
53
|
+
`back to a flat array.`,
|
|
54
|
+
);
|
|
55
|
+
return segments.flat() as unknown as TAccumulated;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Match production collectHandleData (handle.ts): segments that pushed
|
|
59
|
+
// nothing (empty arrays) are dropped before the collect runs, so a collect
|
|
60
|
+
// that inspects segment count or indices sees the same input as at runtime.
|
|
61
|
+
const nonEmpty = segments.filter((seg) => seg.length > 0) as TData[][];
|
|
62
|
+
return collectFn(nonEmpty);
|
|
63
|
+
}
|
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dispatch — in-process request -> Response for unit/integration tests,
|
|
3
|
+
* WITHOUT the Flight RSC runtime.
|
|
4
|
+
*
|
|
5
|
+
* dispatch runs the router's real matching and middleware execution so that
|
|
6
|
+
* redirects, 404s, response routes (path.json / path.text / path.html / ...),
|
|
7
|
+
* and middleware short-circuits behave exactly as in production. It deliberately
|
|
8
|
+
* does NOT render React Server Components: there is no Flight stream, no SSR,
|
|
9
|
+
* and no DOM. Hit an RSC (component) route and dispatch throws a clear error
|
|
10
|
+
* directing you to renderServer()/renderToFlightString or an e2e test.
|
|
11
|
+
*
|
|
12
|
+
* What dispatch DOES support:
|
|
13
|
+
* - Trailing-slash and other findMatch() redirects -> 308 with Location
|
|
14
|
+
* - Unmatched paths -> 404 Response
|
|
15
|
+
* - Response routes (non-RSC) -> serialized Response
|
|
16
|
+
* - json: JSON.stringify({ data }) with application/json
|
|
17
|
+
* - text/html/xml/md: String(result) with the mapped MIME type
|
|
18
|
+
* - handler returning a Response: passed through
|
|
19
|
+
* - handler throwing an error: typed 500 / RouterError
|
|
20
|
+
* status, matching handleResponseRoute (JSON error envelope for json
|
|
21
|
+
* routes, text/plain message otherwise)
|
|
22
|
+
* - content-negotiated route: Vary: Accept appended
|
|
23
|
+
* - Global middleware (router.use(...)) AND route-level middleware, with full
|
|
24
|
+
* next()/short-circuit/throw-Response/header+cookie-merge fidelity.
|
|
25
|
+
* - Partial (client-navigation) requests to a RESPONSE route (?_rsc_partial):
|
|
26
|
+
* global middleware runs first (so an auth gate can still 401/redirect),
|
|
27
|
+
* then — if it passes through — an X-RSC-Reload is returned. Route-level
|
|
28
|
+
* middleware is skipped on a partial, exactly as production skips it.
|
|
29
|
+
*
|
|
30
|
+
* What dispatch DOES NOT support (and why):
|
|
31
|
+
* - RSC component routes — rendering requires the Flight serializer + React
|
|
32
|
+
* server runtime, which is the boundary this primitive is defined to avoid.
|
|
33
|
+
* This includes partial requests that resolve to a component route.
|
|
34
|
+
* - Server actions (?_rsc_action) — RSC protocol concerns handled by
|
|
35
|
+
* router.fetch().
|
|
36
|
+
* - ctx.onError() callbacks on a thrown response-route handler error: the
|
|
37
|
+
* error is serialized into the same typed 500 / RouterError Response as
|
|
38
|
+
* production, but registered onError handlers are NOT invoked here. Cover
|
|
39
|
+
* onError side effects with an e2e test.
|
|
40
|
+
*
|
|
41
|
+
* dispatch reuses router.previewMatch(), which itself runs content negotiation
|
|
42
|
+
* and resolves route middleware from the matched entry tree, so dispatch's
|
|
43
|
+
* route-middleware collection is exactly the router's, not a re-implementation.
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
import {
|
|
47
|
+
createRequestContext,
|
|
48
|
+
runWithRequestContext,
|
|
49
|
+
setRequestContextParams,
|
|
50
|
+
} from "../server/request-context.js";
|
|
51
|
+
import { executeMiddleware, matchMiddleware } from "../router/middleware.js";
|
|
52
|
+
import type {
|
|
53
|
+
MiddlewareEntry,
|
|
54
|
+
MiddlewareFn,
|
|
55
|
+
} from "../router/middleware-types.js";
|
|
56
|
+
import {
|
|
57
|
+
createReverseFunction,
|
|
58
|
+
stripInternalParams,
|
|
59
|
+
} from "../router/handler-context.js";
|
|
60
|
+
import { NOCACHE_SYMBOL } from "../cache/taint.js";
|
|
61
|
+
import type { SegmentCacheStore } from "../cache/types.js";
|
|
62
|
+
import type { CacheProfile } from "../cache/profile-registry.js";
|
|
63
|
+
import { setRouterManifest } from "../route-map-builder.js";
|
|
64
|
+
import { RESPONSE_TYPE_MIME } from "../router/content-negotiation.js";
|
|
65
|
+
import { RouterError } from "../errors.js";
|
|
66
|
+
import { createResponseErrorPayload } from "../rsc/response-error.js";
|
|
67
|
+
import { createResponseWithMergedHeaders } from "../rsc/helpers.js";
|
|
68
|
+
import { isWebSocketUpgradeResponse } from "../response-utils.js";
|
|
69
|
+
import type { Rango } from "../router/router-interfaces.js";
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* The internal subset of the router surface dispatch depends on. The public
|
|
73
|
+
* `Rango` router carries these members at runtime (they are declared on the
|
|
74
|
+
* internal interface), so dispatch accepts a public `Rango` and reads them
|
|
75
|
+
* through this shape — the consumer never needs a cast.
|
|
76
|
+
*/
|
|
77
|
+
interface DispatchableRouter<TEnv> {
|
|
78
|
+
id?: string;
|
|
79
|
+
routerId?: string;
|
|
80
|
+
routeMap: Record<string, unknown>;
|
|
81
|
+
middleware: MiddlewareEntry<TEnv>[];
|
|
82
|
+
findMatch(pathname: string): {
|
|
83
|
+
redirectTo?: string;
|
|
84
|
+
routeKey?: string;
|
|
85
|
+
params?: Record<string, string>;
|
|
86
|
+
} | null;
|
|
87
|
+
previewMatch(
|
|
88
|
+
request: Request,
|
|
89
|
+
input?: { env?: TEnv },
|
|
90
|
+
): Promise<{
|
|
91
|
+
routeMiddleware?: Array<{
|
|
92
|
+
handler: MiddlewareFn<TEnv>;
|
|
93
|
+
params: Record<string, string>;
|
|
94
|
+
}>;
|
|
95
|
+
responseType?: string;
|
|
96
|
+
handler?: Function;
|
|
97
|
+
params?: Record<string, string>;
|
|
98
|
+
routeKey?: string;
|
|
99
|
+
negotiated?: boolean;
|
|
100
|
+
} | null>;
|
|
101
|
+
basename?: string;
|
|
102
|
+
cache?:
|
|
103
|
+
| { enabled?: boolean; store?: SegmentCacheStore }
|
|
104
|
+
| ((
|
|
105
|
+
env: TEnv,
|
|
106
|
+
executionContext: unknown,
|
|
107
|
+
) => { enabled?: boolean; store?: SegmentCacheStore });
|
|
108
|
+
cacheProfiles?: Record<string, CacheProfile>;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Options for dispatch.
|
|
113
|
+
*/
|
|
114
|
+
export interface DispatchOptions<TEnv = any> {
|
|
115
|
+
/** Environment bindings forwarded to matching and middleware. */
|
|
116
|
+
env?: TEnv;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const DEFAULT_ORIGIN = "http://localhost/";
|
|
120
|
+
|
|
121
|
+
function toRequest(request: Request | string): Request {
|
|
122
|
+
if (request instanceof Request) return request;
|
|
123
|
+
return new Request(new URL(request, DEFAULT_ORIGIN));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Serialize a response-route handler result, mirroring the router's
|
|
128
|
+
* handleResponseRoute() contract:
|
|
129
|
+
* - a returned Response is passed through unchanged,
|
|
130
|
+
* - "json" wraps the value as JSON.stringify({ data }) with application/json,
|
|
131
|
+
* - text/html/xml/md stringify with the mapped MIME type.
|
|
132
|
+
*/
|
|
133
|
+
function serializeResponseRouteResult(
|
|
134
|
+
result: unknown,
|
|
135
|
+
responseType: string,
|
|
136
|
+
): Response {
|
|
137
|
+
if (result instanceof Response) return result;
|
|
138
|
+
|
|
139
|
+
if (responseType === "json") {
|
|
140
|
+
return new Response(JSON.stringify({ data: result }), {
|
|
141
|
+
status: 200,
|
|
142
|
+
headers: { "content-type": "application/json;charset=utf-8" },
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (Object.hasOwn(RESPONSE_TYPE_MIME, responseType)) {
|
|
147
|
+
return new Response(String(result), {
|
|
148
|
+
status: 200,
|
|
149
|
+
headers: {
|
|
150
|
+
"content-type": `${RESPONSE_TYPE_MIME[responseType]};charset=utf-8`,
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
throw new Error(
|
|
156
|
+
`dispatch(): response route handler for "${responseType}" must return a ` +
|
|
157
|
+
`Response object, got ${typeof result}. Binary/streaming response types ` +
|
|
158
|
+
`(image, stream, any) must return a Response explicitly.`,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Serialize a thrown handler error into the same typed Response the router's
|
|
164
|
+
* handleResponseRoute() catch block produces:
|
|
165
|
+
* - status is the RouterError.status, else 500,
|
|
166
|
+
* - "json" routes return { error: <createResponseErrorPayload> } as JSON,
|
|
167
|
+
* - all other types return a text/plain body (the RouterError message verbatim,
|
|
168
|
+
* the Error message in dev, else "Internal Server Error").
|
|
169
|
+
*
|
|
170
|
+
* Reuses the production createResponseErrorPayload so the JSON error envelope
|
|
171
|
+
* is byte-identical rather than re-derived.
|
|
172
|
+
*/
|
|
173
|
+
function serializeResponseRouteError(
|
|
174
|
+
error: unknown,
|
|
175
|
+
responseType: string,
|
|
176
|
+
): Response {
|
|
177
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
178
|
+
const status = error instanceof RouterError ? error.status : 500;
|
|
179
|
+
|
|
180
|
+
if (responseType === "json") {
|
|
181
|
+
return new Response(
|
|
182
|
+
JSON.stringify({ error: createResponseErrorPayload(error, isDev) }),
|
|
183
|
+
{
|
|
184
|
+
status,
|
|
185
|
+
headers: { "content-type": "application/json;charset=utf-8" },
|
|
186
|
+
},
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const message =
|
|
191
|
+
error instanceof RouterError
|
|
192
|
+
? error.message
|
|
193
|
+
: isDev && error instanceof Error
|
|
194
|
+
? error.message
|
|
195
|
+
: "Internal Server Error";
|
|
196
|
+
return new Response(message, {
|
|
197
|
+
status,
|
|
198
|
+
headers: { "content-type": "text/plain;charset=utf-8" },
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Run a request through the router in-process and return the Response.
|
|
204
|
+
*
|
|
205
|
+
* @example
|
|
206
|
+
* ```ts
|
|
207
|
+
* const router = createRouter<Env>({}).routes(urls(({ path }) => [
|
|
208
|
+
* path.json("/api/health", () => ({ ok: true }), { name: "health" }),
|
|
209
|
+
* ]));
|
|
210
|
+
*
|
|
211
|
+
* const res = await dispatch(router, "/api/health");
|
|
212
|
+
* expect(res.status).toBe(200);
|
|
213
|
+
* expect(await res.json()).toEqual({ data: { ok: true } });
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
216
|
+
export async function dispatch<TEnv = any>(
|
|
217
|
+
publicRouter: Rango<TEnv, any>,
|
|
218
|
+
request: Request | string,
|
|
219
|
+
opts: DispatchOptions<TEnv> = {},
|
|
220
|
+
): Promise<Response> {
|
|
221
|
+
// The public Rango type intentionally hides the matching internals; read them
|
|
222
|
+
// through the dispatchable shape (present at runtime). Consumers pass their
|
|
223
|
+
// real router with no cast.
|
|
224
|
+
const router = publicRouter as unknown as DispatchableRouter<TEnv>;
|
|
225
|
+
const req = toRequest(request);
|
|
226
|
+
const url = new URL(req.url);
|
|
227
|
+
const env = (opts.env ?? {}) as TEnv;
|
|
228
|
+
|
|
229
|
+
// Seed the per-router manifest so reverse() resolves during handler execution.
|
|
230
|
+
const routerId = router.id ?? router.routerId;
|
|
231
|
+
if (routerId) {
|
|
232
|
+
setRouterManifest(routerId, router.routeMap as Record<string, string>);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// findMatch carries trailing-slash/redirect targets and null on no match.
|
|
236
|
+
// previewMatch swallows redirects, so detect them here first.
|
|
237
|
+
const match = router.findMatch(url.pathname);
|
|
238
|
+
|
|
239
|
+
if (match?.redirectTo) {
|
|
240
|
+
return new Response(null, {
|
|
241
|
+
status: 308,
|
|
242
|
+
headers: { Location: match.redirectTo + url.search },
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (!match) {
|
|
247
|
+
return new Response("Not Found", {
|
|
248
|
+
status: 404,
|
|
249
|
+
headers: { "content-type": "text/plain;charset=utf-8" },
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// previewMatch resolves responseType, the response-route handler, and the
|
|
254
|
+
// route middleware from the matched entry tree (with content negotiation).
|
|
255
|
+
const preview = await router.previewMatch(req, { env });
|
|
256
|
+
|
|
257
|
+
// No preview (e.g. resolved to a redirect inside previewMatch) — fall back to
|
|
258
|
+
// the findMatch result. A bare match with no responseType is an RSC route.
|
|
259
|
+
const responseType = preview?.responseType;
|
|
260
|
+
const handler = preview?.handler;
|
|
261
|
+
const params = preview?.params ?? match.params ?? {};
|
|
262
|
+
const routeKey = preview?.routeKey ?? match.routeKey;
|
|
263
|
+
|
|
264
|
+
if (!responseType || typeof handler !== "function") {
|
|
265
|
+
throw new Error(
|
|
266
|
+
`dispatch() does not render RSC routes — the route matched at ` +
|
|
267
|
+
`"${url.pathname}" is a React Server Component route, not a response ` +
|
|
268
|
+
`route. Use renderServer()/renderToFlightString or an e2e test to ` +
|
|
269
|
+
`exercise component rendering.`,
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const variables: Record<string, unknown> = {};
|
|
274
|
+
|
|
275
|
+
// Resolve the router's cache store the way the production handler does, so a
|
|
276
|
+
// "use cache" inside a response-route handler reaches the request-scope
|
|
277
|
+
// (NOCACHE) detection below instead of bypassing on a missing store.
|
|
278
|
+
let cacheStore: SegmentCacheStore | undefined;
|
|
279
|
+
const cacheOption = router.cache;
|
|
280
|
+
if (cacheOption && !url.searchParams.has("__no_cache")) {
|
|
281
|
+
const cacheConfig =
|
|
282
|
+
typeof cacheOption === "function"
|
|
283
|
+
? cacheOption(env, undefined)
|
|
284
|
+
: cacheOption;
|
|
285
|
+
if (cacheConfig.enabled !== false) cacheStore = cacheConfig.store;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
const requestContext = createRequestContext<TEnv>({
|
|
289
|
+
env,
|
|
290
|
+
request: req,
|
|
291
|
+
url,
|
|
292
|
+
variables,
|
|
293
|
+
cacheStore,
|
|
294
|
+
cacheProfiles: router.cacheProfiles,
|
|
295
|
+
});
|
|
296
|
+
// Match production: the RSC handler stores the router's basename on the
|
|
297
|
+
// request context (handler.ts), and redirect() prefixes root-relative URLs
|
|
298
|
+
// with it. Mirror it so basename-redirect tests behave as they do in a real
|
|
299
|
+
// mounted app instead of always seeing no prefix.
|
|
300
|
+
requestContext._basename = router.basename;
|
|
301
|
+
|
|
302
|
+
// Match production's response-route reverse EXACTLY: the real handler builds
|
|
303
|
+
// it from the route map alone (response-route-handler.ts), with NO matched
|
|
304
|
+
// routeKey or params. Passing routeKey/params here would auto-fill params from
|
|
305
|
+
// the matched route, so ctx.reverse("name") could pass in a test while the
|
|
306
|
+
// real handler throws for the missing param.
|
|
307
|
+
const reverse = createReverseFunction(
|
|
308
|
+
router.routeMap as Record<string, string>,
|
|
309
|
+
) as (
|
|
310
|
+
name: string,
|
|
311
|
+
p?: Record<string, string>,
|
|
312
|
+
search?: Record<string, unknown>,
|
|
313
|
+
) => string;
|
|
314
|
+
|
|
315
|
+
return runWithRequestContext(requestContext, async () => {
|
|
316
|
+
// Set params before middleware/handler run, so global middleware sees
|
|
317
|
+
// ctx.params (production sets them during matching, before middleware).
|
|
318
|
+
if (routeKey !== undefined) {
|
|
319
|
+
setRequestContextParams(params, routeKey);
|
|
320
|
+
} else {
|
|
321
|
+
requestContext.params = params;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Match production: a partial (client-navigation) request to a response
|
|
325
|
+
// route is short-circuited to X-RSC-Reload, but ONLY after GLOBAL
|
|
326
|
+
// (app-level) middleware has run. In production the partial check lives
|
|
327
|
+
// inside coreHandler (handler.ts wraps it with executeMiddleware) and,
|
|
328
|
+
// within handleResponseRoute, precedes the route-level middleware
|
|
329
|
+
// (response-route-handler.ts). So global middleware (e.g. an auth gate)
|
|
330
|
+
// can still 401/redirect a partial request; only when it calls next()
|
|
331
|
+
// through does the reload get emitted. Route-level middleware is skipped
|
|
332
|
+
// on a partial, exactly as production skips it.
|
|
333
|
+
const isPartial = url.searchParams.has("_rsc_partial");
|
|
334
|
+
const partialFinalHandler = async (): Promise<Response> =>
|
|
335
|
+
createResponseWithMergedHeaders(null, {
|
|
336
|
+
status: 200,
|
|
337
|
+
headers: {
|
|
338
|
+
"X-RSC-Reload": stripInternalParams(url).toString(),
|
|
339
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
340
|
+
},
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
const cleanUrl = new URL(req.url);
|
|
344
|
+
for (const key of [...cleanUrl.searchParams.keys()]) {
|
|
345
|
+
if (key.startsWith("_rsc")) cleanUrl.searchParams.delete(key);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// Lightweight response-handler context mirroring handleResponseRoute.
|
|
349
|
+
const responseHandlerCtx = {
|
|
350
|
+
request: req,
|
|
351
|
+
params,
|
|
352
|
+
env,
|
|
353
|
+
searchParams: cleanUrl.searchParams,
|
|
354
|
+
url: cleanUrl,
|
|
355
|
+
originalUrl: requestContext.originalUrl,
|
|
356
|
+
pathname: url.pathname,
|
|
357
|
+
reverse,
|
|
358
|
+
get: requestContext.get,
|
|
359
|
+
header: (name: string, value: string) =>
|
|
360
|
+
requestContext.header(name, value),
|
|
361
|
+
waitUntil: requestContext.waitUntil.bind(requestContext),
|
|
362
|
+
executionContext: requestContext.executionContext,
|
|
363
|
+
_responseType: responseType,
|
|
364
|
+
};
|
|
365
|
+
// Brand as request-scoped so a "use cache" inside a response-route handler
|
|
366
|
+
// is detected as a request-scope violation here exactly as in production
|
|
367
|
+
// (response-route-handler.ts brands the same shape).
|
|
368
|
+
(responseHandlerCtx as Record<symbol, unknown>)[NOCACHE_SYMBOL] = true;
|
|
369
|
+
|
|
370
|
+
const callHandler = async (): Promise<Response> => {
|
|
371
|
+
let serialized: Response;
|
|
372
|
+
try {
|
|
373
|
+
const result = await (handler as Function)(responseHandlerCtx);
|
|
374
|
+
serialized = serializeResponseRouteResult(result, responseType);
|
|
375
|
+
} catch (error) {
|
|
376
|
+
// Mirror handleResponseRoute's catch: a genuine handler error becomes
|
|
377
|
+
// the router's typed 500 / RouterError-status Response (NOT a rejected
|
|
378
|
+
// promise). Middleware short-circuit via thrown Response is handled by
|
|
379
|
+
// executeMiddleware and never reaches here.
|
|
380
|
+
serialized = serializeResponseRouteError(error, responseType);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Route through the SAME production finalizer the RSC handler uses, so
|
|
384
|
+
// ctx.onResponse() callbacks fire and stub headers/cookies + ctx.setStatus
|
|
385
|
+
// merge identically to production (handleResponseRoute also goes through
|
|
386
|
+
// createResponseWithMergedHeaders). Runs inside runWithRequestContext, so
|
|
387
|
+
// _getRequestContext() resolves to this request's context.
|
|
388
|
+
const merged = createResponseWithMergedHeaders(serialized.body, {
|
|
389
|
+
status: serialized.status,
|
|
390
|
+
statusText: serialized.statusText,
|
|
391
|
+
headers: serialized.headers,
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
// Append Vary: Accept on content-negotiated responses, matching
|
|
395
|
+
// handleResponseRoute's callHandlerWithVary. Skipped on WebSocket upgrade
|
|
396
|
+
// responses (immutable headers, Vary meaningless for a 101).
|
|
397
|
+
if (preview?.negotiated && !isWebSocketUpgradeResponse(merged)) {
|
|
398
|
+
merged.headers.append("Vary", "Accept");
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return merged;
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
// On a partial request the reload IS the terminal handler; otherwise the
|
|
405
|
+
// response-route handler is. Either way global middleware wraps it.
|
|
406
|
+
const finalHandler = isPartial ? partialFinalHandler : callHandler;
|
|
407
|
+
|
|
408
|
+
// Combine global (pattern-matched) middleware with route middleware,
|
|
409
|
+
// preserving the router's order: global runs before route-level. Route
|
|
410
|
+
// middleware is skipped on a partial request (production returns the
|
|
411
|
+
// reload before handleResponseRoute reaches its route middleware).
|
|
412
|
+
const globalMatches = matchMiddleware(url.pathname, router.middleware);
|
|
413
|
+
const routeMiddlewareEntries = isPartial
|
|
414
|
+
? []
|
|
415
|
+
: (preview?.routeMiddleware ?? []).map((mw) => ({
|
|
416
|
+
entry: {
|
|
417
|
+
pattern: null,
|
|
418
|
+
regex: null,
|
|
419
|
+
paramNames: [],
|
|
420
|
+
handler: mw.handler,
|
|
421
|
+
mountPrefix: null,
|
|
422
|
+
} as MiddlewareEntry<TEnv>,
|
|
423
|
+
params: mw.params,
|
|
424
|
+
}));
|
|
425
|
+
const allMiddleware = [...globalMatches, ...routeMiddlewareEntries];
|
|
426
|
+
|
|
427
|
+
if (allMiddleware.length === 0) {
|
|
428
|
+
return finalHandler();
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
return executeMiddleware<TEnv>(
|
|
432
|
+
allMiddleware,
|
|
433
|
+
req,
|
|
434
|
+
env,
|
|
435
|
+
variables,
|
|
436
|
+
finalHandler,
|
|
437
|
+
reverse,
|
|
438
|
+
);
|
|
439
|
+
});
|
|
440
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rangojs/router/testing/dom
|
|
3
|
+
*
|
|
4
|
+
* Component-render testing: `renderRoute`, the React-Testing-Library-style stub
|
|
5
|
+
* for client components that read router context (useParams / useReverse /
|
|
6
|
+
* Outlet / useNavigation / useLoader).
|
|
7
|
+
*
|
|
8
|
+
* Separate from the main `@rangojs/router/testing` barrel so unit suites that
|
|
9
|
+
* only test loaders, middleware, or `dispatch` never reference React, the
|
|
10
|
+
* browser runtime, or `@testing-library/react` (an optional peer that
|
|
11
|
+
* `renderRoute` lazy-loads at call time). Run these tests in a DOM environment
|
|
12
|
+
* (`happy-dom` or `jsdom`).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export { renderRoute } from "./render-route.js";
|
|
16
|
+
export type {
|
|
17
|
+
RenderRouteSpec,
|
|
18
|
+
RenderRouteOptions,
|
|
19
|
+
TestRouterHandle,
|
|
20
|
+
RenderRouteResult,
|
|
21
|
+
HandleDataSeed,
|
|
22
|
+
} from "./render-route.js";
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// Consumer-facing server-lifecycle fixture. Parameterized lift of the internal
|
|
2
|
+
// e2e/fixture.ts: the test-app-specific shared-server reuse and default-root
|
|
3
|
+
// build skipping are removed; a consumer points `root` at their own app.
|
|
4
|
+
|
|
5
|
+
import { rm } from "node:fs/promises";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import type { TestType } from "@playwright/test";
|
|
8
|
+
import {
|
|
9
|
+
createIsolatedViteCacheDir,
|
|
10
|
+
runCli,
|
|
11
|
+
type RunCliHandle,
|
|
12
|
+
type SpawnOptions,
|
|
13
|
+
waitForReady,
|
|
14
|
+
warmupDevServer,
|
|
15
|
+
} from "./server.js";
|
|
16
|
+
|
|
17
|
+
export interface FixtureOptions {
|
|
18
|
+
/** Absolute or cwd-relative path to the consumer app under test. */
|
|
19
|
+
root: string;
|
|
20
|
+
mode?: "dev" | "build";
|
|
21
|
+
/** Override the server command (default: `pnpm dev` for dev, `pnpm preview` for build). */
|
|
22
|
+
command?: string;
|
|
23
|
+
/** Override the build command (default: `pnpm build`). */
|
|
24
|
+
buildCommand?: string;
|
|
25
|
+
cliOptions?: SpawnOptions;
|
|
26
|
+
/** Spawn a per-suite server with an isolated Vite cache dir (dev only warmup). */
|
|
27
|
+
isolatedServer?: boolean;
|
|
28
|
+
/** Path to poll for readiness (default: "/"). Use when a basename moves routes off "/". */
|
|
29
|
+
readyPath?: string;
|
|
30
|
+
/** Skip the production build step (assumes an existing build). */
|
|
31
|
+
skipBuild?: boolean;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface Fixture {
|
|
35
|
+
mode: "dev" | "build" | undefined;
|
|
36
|
+
root: string;
|
|
37
|
+
/** Resolve a path against the running server's base URL. */
|
|
38
|
+
url: (url?: string) => string;
|
|
39
|
+
/** The underlying spawned process handle (undefined before beforeAll). */
|
|
40
|
+
proc: () => RunCliHandle | undefined;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Build a `useFixture` bound to a consumer-provided Playwright `test` object.
|
|
45
|
+
* The returned function registers `beforeAll`/`afterAll` hooks that spawn and
|
|
46
|
+
* tear down a dev or preview server for the app at `options.root`.
|
|
47
|
+
*/
|
|
48
|
+
export function createUseFixture(
|
|
49
|
+
test: TestType<any, any>,
|
|
50
|
+
): (options: FixtureOptions) => Fixture {
|
|
51
|
+
return function useFixture(options: FixtureOptions): Fixture {
|
|
52
|
+
let cleanup: (() => Promise<void>) | undefined;
|
|
53
|
+
let baseURL!: string;
|
|
54
|
+
|
|
55
|
+
const cwd = path.resolve(options.root);
|
|
56
|
+
let proc: RunCliHandle | undefined;
|
|
57
|
+
let isolatedViteCacheDir: string | undefined;
|
|
58
|
+
|
|
59
|
+
test.beforeAll(async ({}, testInfo) => {
|
|
60
|
+
if (options.isolatedServer) {
|
|
61
|
+
isolatedViteCacheDir = createIsolatedViteCacheDir(
|
|
62
|
+
cwd,
|
|
63
|
+
testInfo.project.name,
|
|
64
|
+
options.mode,
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
const cliEnv = {
|
|
68
|
+
...options.cliOptions?.env,
|
|
69
|
+
...(isolatedViteCacheDir
|
|
70
|
+
? { RANGO_E2E_VITE_CACHE_DIR: isolatedViteCacheDir }
|
|
71
|
+
: {}),
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
if (options.mode === "dev") {
|
|
75
|
+
proc = runCli({
|
|
76
|
+
command: options.command ?? `pnpm dev`,
|
|
77
|
+
label: `${options.root}:dev`,
|
|
78
|
+
cwd,
|
|
79
|
+
...options.cliOptions,
|
|
80
|
+
env: cliEnv,
|
|
81
|
+
});
|
|
82
|
+
const port = await proc.findPort();
|
|
83
|
+
baseURL = `http://localhost:${port}`;
|
|
84
|
+
const readyUrl = options.readyPath
|
|
85
|
+
? `${baseURL}${options.readyPath}`
|
|
86
|
+
: baseURL;
|
|
87
|
+
await waitForReady(readyUrl, () => ({
|
|
88
|
+
stdout: proc!.stdout(),
|
|
89
|
+
stderr: proc!.stderr(),
|
|
90
|
+
}));
|
|
91
|
+
// Isolated dev servers need a warmup SSR request to trigger Vite's
|
|
92
|
+
// dep optimizer before real tests run. The first full SSR request
|
|
93
|
+
// discovers deps -> `ERR_OUTDATED_OPTIMIZED_DEP` -> module
|
|
94
|
+
// re-evaluation -> loss of in-memory cache. Without this, cache
|
|
95
|
+
// tests see different values on the second request.
|
|
96
|
+
if (options.isolatedServer) {
|
|
97
|
+
await warmupDevServer(readyUrl);
|
|
98
|
+
}
|
|
99
|
+
cleanup = async () => {
|
|
100
|
+
proc!.kill();
|
|
101
|
+
await proc!.done;
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (options.mode === "build") {
|
|
106
|
+
const skipBuild = options.skipBuild || !!process.env.TEST_SKIP_BUILD;
|
|
107
|
+
if (!skipBuild) {
|
|
108
|
+
const buildProc = runCli({
|
|
109
|
+
command: options.buildCommand ?? `pnpm build`,
|
|
110
|
+
label: `${options.root}:build`,
|
|
111
|
+
cwd,
|
|
112
|
+
...options.cliOptions,
|
|
113
|
+
env: cliEnv,
|
|
114
|
+
});
|
|
115
|
+
await buildProc.done;
|
|
116
|
+
}
|
|
117
|
+
proc = runCli({
|
|
118
|
+
command: options.command ?? `pnpm preview`,
|
|
119
|
+
label: `${options.root}:preview`,
|
|
120
|
+
cwd,
|
|
121
|
+
...options.cliOptions,
|
|
122
|
+
env: cliEnv,
|
|
123
|
+
});
|
|
124
|
+
const port = await proc.findPort();
|
|
125
|
+
baseURL = `http://localhost:${port}`;
|
|
126
|
+
const buildReadyUrl = options.readyPath
|
|
127
|
+
? `${baseURL}${options.readyPath}`
|
|
128
|
+
: baseURL;
|
|
129
|
+
await waitForReady(buildReadyUrl, () => ({
|
|
130
|
+
stdout: proc!.stdout(),
|
|
131
|
+
stderr: proc!.stderr(),
|
|
132
|
+
}));
|
|
133
|
+
cleanup = async () => {
|
|
134
|
+
proc!.kill();
|
|
135
|
+
await proc!.done;
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test.afterAll(async () => {
|
|
141
|
+
await cleanup?.();
|
|
142
|
+
if (isolatedViteCacheDir) {
|
|
143
|
+
await rm(isolatedViteCacheDir, { recursive: true, force: true });
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
mode: options.mode,
|
|
149
|
+
root: cwd,
|
|
150
|
+
url: (url: string = "./") => new URL(url, baseURL).href,
|
|
151
|
+
proc: () => proc,
|
|
152
|
+
};
|
|
153
|
+
};
|
|
154
|
+
}
|