@rangojs/router 0.0.0-experimental.fb6e2f40 → 0.0.0-experimental.fce7fbd1
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 +120 -25
- 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 +147 -57
- 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 +2309 -833
- 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 +220 -30
- package/skills/caching/SKILL.md +116 -8
- 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 +247 -17
- package/skills/loader/SKILL.md +219 -9
- package/skills/middleware/SKILL.md +47 -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 +14 -33
- 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 +57 -4
- package/skills/router-setup/SKILL.md +3 -3
- package/skills/server-actions/SKILL.md +751 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/testing/SKILL.md +599 -0
- package/skills/typesafety/SKILL.md +319 -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/browser/action-coordinator.ts +53 -36
- package/src/browser/app-shell.ts +52 -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 +86 -11
- package/src/browser/navigation-client.ts +76 -28
- package/src/browser/navigation-store.ts +32 -9
- package/src/browser/navigation-transaction.ts +10 -28
- package/src/browser/partial-update.ts +64 -26
- package/src/browser/prefetch/cache.ts +129 -21
- package/src/browser/prefetch/fetch.ts +148 -16
- package/src/browser/prefetch/queue.ts +36 -5
- package/src/browser/rango-state.ts +53 -13
- package/src/browser/react/Link.tsx +30 -2
- package/src/browser/react/NavigationProvider.tsx +72 -31
- 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 +17 -9
- 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 +22 -2
- package/src/browser/react/use-segments.ts +11 -8
- package/src/browser/response-adapter.ts +25 -0
- package/src/browser/rsc-router.tsx +64 -22
- package/src/browser/scroll-restoration.ts +22 -14
- package/src/browser/segment-reconciler.ts +36 -14
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +23 -30
- package/src/browser/types.ts +21 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +60 -35
- package/src/build/generate-route-types.ts +2 -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 +1 -1
- package/src/build/route-types/per-module-writer.ts +7 -4
- package/src/build/route-types/router-processing.ts +55 -14
- package/src/build/route-types/scan-filter.ts +1 -1
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-scope.ts +28 -42
- package/src/cache/cf/cf-cache-store.ts +54 -13
- package/src/client.rsc.tsx +3 -0
- package/src/client.tsx +92 -182
- package/src/context-var.ts +5 -5
- package/src/decode-loader-results.ts +36 -0
- package/src/errors.ts +30 -1
- package/src/handle.ts +26 -13
- 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 +9 -4
- package/src/index.ts +57 -15
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +2 -5
- package/src/loader.ts +3 -10
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/prerender.ts +4 -4
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +65 -36
- package/src/route-content-wrapper.tsx +6 -28
- package/src/route-definition/dsl-helpers.ts +384 -257
- package/src/route-definition/helper-factories.ts +29 -139
- package/src/route-definition/helpers-types.ts +100 -28
- package/src/route-definition/resolve-handler-use.ts +6 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-types.ts +26 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +15 -2
- package/src/router/error-handling.ts +1 -1
- package/src/router/handler-context.ts +21 -38
- package/src/router/intercept-resolution.ts +4 -18
- package/src/router/lazy-includes.ts +8 -8
- package/src/router/loader-resolution.ts +89 -49
- package/src/router/manifest.ts +22 -13
- package/src/router/match-api.ts +4 -3
- package/src/router/match-handlers.ts +63 -20
- package/src/router/match-middleware/cache-lookup.ts +54 -96
- package/src/router/match-middleware/cache-store.ts +3 -2
- package/src/router/match-middleware/segment-resolution.ts +1 -1
- package/src/router/match-result.ts +103 -4
- package/src/router/metrics.ts +1 -1
- package/src/router/middleware-types.ts +15 -26
- package/src/router/middleware.ts +99 -84
- package/src/router/pattern-matching.ts +101 -17
- package/src/router/prerender-match.ts +1 -1
- package/src/router/preview-match.ts +3 -1
- package/src/router/request-classification.ts +4 -28
- package/src/router/revalidation.ts +58 -2
- package/src/router/router-interfaces.ts +45 -28
- package/src/router/router-options.ts +40 -1
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +32 -6
- package/src/router/segment-resolution/revalidation.ts +154 -107
- 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 +8 -0
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +38 -23
- package/src/rsc/handler-context.ts +2 -2
- package/src/rsc/handler.ts +41 -74
- 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/origin-guard.ts +28 -10
- package/src/rsc/progressive-enhancement.ts +14 -2
- package/src/rsc/response-route-handler.ts +46 -53
- package/src/rsc/rsc-rendering.ts +40 -52
- package/src/rsc/runtime-warnings.ts +9 -10
- package/src/rsc/server-action.ts +23 -37
- package/src/rsc/ssr-setup.ts +16 -0
- package/src/rsc/types.ts +9 -2
- 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 +143 -53
- package/src/server/cookie-store.ts +28 -4
- package/src/server/handle-store.ts +19 -0
- package/src/server/request-context.ts +50 -44
- package/src/ssr/index.tsx +5 -1
- package/src/static-handler.ts +1 -1
- 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 +21 -0
- package/src/testing/flight.entry.ts +22 -0
- package/src/testing/flight.ts +182 -0
- package/src/testing/generated-routes.ts +223 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +193 -0
- package/src/testing/render-route.tsx +536 -0
- package/src/testing/run-loader.ts +296 -0
- package/src/testing/run-middleware.ts +170 -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 +183 -0
- package/src/types/global-namespace.ts +39 -26
- package/src/types/handler-context.ts +68 -50
- package/src/types/index.ts +1 -0
- package/src/types/loader-types.ts +5 -6
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-entry.ts +11 -0
- 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 +41 -7
- package/src/urls/path-helper.ts +17 -52
- package/src/urls/pattern-types.ts +36 -19
- package/src/urls/response-types.ts +22 -29
- package/src/urls/type-extraction.ts +26 -116
- package/src/urls/urls-function.ts +1 -5
- package/src/use-loader.tsx +416 -42
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +6 -6
- package/src/vite/discovery/discover-routers.ts +101 -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 +185 -103
- 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 +33 -0
- package/src/vite/discovery/virtual-module-codegen.ts +13 -23
- package/src/vite/index.ts +2 -0
- package/src/vite/plugin-types.ts +67 -0
- 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 +29 -25
- 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 +116 -29
- package/src/vite/router-discovery.ts +774 -102
- 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 +21 -6
- package/src/vite/utils/shared-utils.ts +107 -26
- package/src/browser/action-response-classifier.ts +0 -99
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
// Dev/production parity helpers. `parityDescribe` registers a dev and a
|
|
2
|
+
// production describe from a single body, auto-generating the `(production)`
|
|
3
|
+
// title suffix so a suite can never drift into the wrong dev/prod bucket.
|
|
4
|
+
// `expectParity` runs one intent over the JS and no-JS paths and asserts the
|
|
5
|
+
// observable result is identical (progressive-enhancement parity).
|
|
6
|
+
|
|
7
|
+
import type { Expect, Page, TestType } from "@playwright/test";
|
|
8
|
+
import type { Fixture, FixtureOptions } from "./fixture.js";
|
|
9
|
+
|
|
10
|
+
export interface ParityDescribeOptions extends Partial<
|
|
11
|
+
Omit<FixtureOptions, "mode">
|
|
12
|
+
> {}
|
|
13
|
+
|
|
14
|
+
export type ParityIntent =
|
|
15
|
+
| { navigate: string }
|
|
16
|
+
| { submit: { testId: string; data?: Record<string, string> } };
|
|
17
|
+
|
|
18
|
+
export interface ExpectParityOptions {
|
|
19
|
+
/** data-testid values whose text content must match across JS and no-JS. */
|
|
20
|
+
observe: string[];
|
|
21
|
+
/** Base URL to resolve a relative `navigate` intent against. */
|
|
22
|
+
baseURL?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Escape hatch invoked after the intent is applied and before the snapshot is
|
|
25
|
+
* taken, on BOTH the JS and the no-JS transports. When provided for a `submit`
|
|
26
|
+
* intent it REPLACES the generic settle (the navigation/observed-change wait):
|
|
27
|
+
* you take responsibility for awaiting the post-submit effect — for example,
|
|
28
|
+
* awaiting a specific testid to reach a known value, or a network response the
|
|
29
|
+
* page does not reflect in the observed testids. Receives the page for the
|
|
30
|
+
* transport being snapshotted.
|
|
31
|
+
*/
|
|
32
|
+
waitFor?: (page: Page) => Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface Parity {
|
|
36
|
+
/**
|
|
37
|
+
* Register a dev describe (title `name`) and a production describe (title
|
|
38
|
+
* `` `${name} (production)` ``) from one body. The `(production)` suffix is
|
|
39
|
+
* generated here, so the production suite always lands in the production
|
|
40
|
+
* bucket regardless of how the consumer names things.
|
|
41
|
+
*
|
|
42
|
+
* `options.root` is required, either here or as `defaultRoot` passed to the
|
|
43
|
+
* factory.
|
|
44
|
+
*/
|
|
45
|
+
parityDescribe: (
|
|
46
|
+
name: string,
|
|
47
|
+
body: (f: Fixture) => void,
|
|
48
|
+
options?: ParityDescribeOptions,
|
|
49
|
+
) => void;
|
|
50
|
+
/**
|
|
51
|
+
* Run a single `intent` over both the JS path (the given `page`) and a
|
|
52
|
+
* fresh no-JS context, then assert the observed snapshots are equal.
|
|
53
|
+
*
|
|
54
|
+
* PE parity only holds if the consumer's submit target is a real `<form>`
|
|
55
|
+
* that progressively enhances: with JS disabled the browser performs a native
|
|
56
|
+
* form POST, and the server must produce the same observable result the
|
|
57
|
+
* enhanced client path produces. Navigation intents must be plain links/URLs
|
|
58
|
+
* that resolve server-side without JS.
|
|
59
|
+
*
|
|
60
|
+
* For a `submit` intent the helper waits for the action's observable effect
|
|
61
|
+
* before snapshotting: either a navigation away from the form, or a change to
|
|
62
|
+
* one of the `observe` testids from its pre-submit value (then a brief
|
|
63
|
+
* stability confirm). A submit that produces neither within ~5s throws —
|
|
64
|
+
* include the testid that changes in `observe`, or pass `waitFor` to express
|
|
65
|
+
* the precise wait. This prevents snapshotting the pre-submit DOM when the
|
|
66
|
+
* action is slow.
|
|
67
|
+
*
|
|
68
|
+
* The snapshot is intentionally strict: it compares the text of every
|
|
69
|
+
* observed `data-testid`, the resulting `page.url()`, and the cookies visible
|
|
70
|
+
* via `document.cookie`. No ephemeral-value normalization is applied in v1;
|
|
71
|
+
* if a consumer's page renders nondeterministic values, exclude that testid
|
|
72
|
+
* from `observe`.
|
|
73
|
+
*
|
|
74
|
+
* LIMITATION: cookie parity is read from `document.cookie`, which by design
|
|
75
|
+
* EXCLUDES HttpOnly cookies. Session/auth cookies (the typical HttpOnly case)
|
|
76
|
+
* are therefore NOT compared — a PE/JS divergence in an HttpOnly cookie will
|
|
77
|
+
* not be caught here. Assert on those via `read_network_requests` / response
|
|
78
|
+
* Set-Cookie headers in a dedicated test, not expectParity.
|
|
79
|
+
*/
|
|
80
|
+
expectParity: (
|
|
81
|
+
page: Page,
|
|
82
|
+
intent: ParityIntent,
|
|
83
|
+
opts: ExpectParityOptions,
|
|
84
|
+
) => Promise<void>;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
interface ParitySnapshot {
|
|
88
|
+
testIds: Record<string, string | null>;
|
|
89
|
+
url: string;
|
|
90
|
+
cookies: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async function applyIntent(
|
|
94
|
+
page: Page,
|
|
95
|
+
intent: ParityIntent,
|
|
96
|
+
baseURL?: string,
|
|
97
|
+
): Promise<void> {
|
|
98
|
+
if ("navigate" in intent) {
|
|
99
|
+
const target = baseURL
|
|
100
|
+
? new URL(intent.navigate, baseURL).href
|
|
101
|
+
: intent.navigate;
|
|
102
|
+
await page.goto(target, { waitUntil: "networkidle" });
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const form = page.locator(`[data-testid="${intent.submit.testId}"]`);
|
|
106
|
+
if (intent.submit.data) {
|
|
107
|
+
for (const [name, value] of Object.entries(intent.submit.data)) {
|
|
108
|
+
await form.locator(`[name="${name}"]`).fill(value);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// No post-click wait here: a native (no-JS) submit triggers a top-level
|
|
112
|
+
// navigation while an enhanced (JS) submit usually updates the DOM in place
|
|
113
|
+
// with no navigation, so a navigation-based wait races the click and can
|
|
114
|
+
// resolve before the effect lands. The post-action settle in expectParity is
|
|
115
|
+
// DOM-driven (settleSubmit) and works whether or not a navigation occurs.
|
|
116
|
+
await form
|
|
117
|
+
.locator('button[type="submit"], input[type="submit"]')
|
|
118
|
+
.first()
|
|
119
|
+
.click();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Concatenate the observed testids' text into a single comparable string used
|
|
123
|
+
// to detect post-submit change/stability. "\0" marks an absent testid and
|
|
124
|
+
// "\x01" joins parts so two distinct testid layouts can never concatenate to the
|
|
125
|
+
// same string. Written as escaped control chars (not literal bytes) for source
|
|
126
|
+
// readability.
|
|
127
|
+
async function readObserved(page: Page, observe: string[]): Promise<string> {
|
|
128
|
+
const parts: string[] = [];
|
|
129
|
+
for (const id of observe) {
|
|
130
|
+
const text = await page
|
|
131
|
+
.locator(`[data-testid="${id}"]`)
|
|
132
|
+
.first()
|
|
133
|
+
.textContent()
|
|
134
|
+
.catch(() => null);
|
|
135
|
+
parts.push(`${id}=${text ?? "\0"}`);
|
|
136
|
+
}
|
|
137
|
+
return parts.join("\x01");
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Settle a submit's observable effect. An enhanced (JS) submit mutates the DOM
|
|
141
|
+
// in place with no navigation, while a native (no-JS) submit navigates — so we
|
|
142
|
+
// wait for EITHER a navigation away from the form OR a change in the observed
|
|
143
|
+
// testids from their pre-submit `baseline`, then confirm the new state is stable
|
|
144
|
+
// across two reads. Requiring an observed change (not just stability) closes the
|
|
145
|
+
// gap where a slow action leaves the pre-submit DOM momentarily stable and gets
|
|
146
|
+
// snapshotted as the "result". A submit that produces neither a navigation nor
|
|
147
|
+
// an observed change within the ceiling throws, rather than silently capturing
|
|
148
|
+
// the pre-submit state — pass `waitFor` when the observed set cannot capture the
|
|
149
|
+
// effect.
|
|
150
|
+
async function settleSubmit(
|
|
151
|
+
page: Page,
|
|
152
|
+
observe: string[],
|
|
153
|
+
baseline: string,
|
|
154
|
+
originUrl: string,
|
|
155
|
+
): Promise<void> {
|
|
156
|
+
const pollIntervalMs = 50;
|
|
157
|
+
const maxAttempts = 100; // ~5s ceiling
|
|
158
|
+
let landed = false;
|
|
159
|
+
let last = baseline;
|
|
160
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
161
|
+
await page.waitForTimeout(pollIntervalMs);
|
|
162
|
+
const current = await readObserved(page, observe);
|
|
163
|
+
if (!landed) {
|
|
164
|
+
if (page.url() !== originUrl || current !== baseline) {
|
|
165
|
+
landed = true;
|
|
166
|
+
last = current;
|
|
167
|
+
}
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (current === last) return;
|
|
171
|
+
last = current;
|
|
172
|
+
}
|
|
173
|
+
if (!landed) {
|
|
174
|
+
throw new Error(
|
|
175
|
+
`expectParity: the submit intent produced no observable effect within 5s — ` +
|
|
176
|
+
`no navigation away from "${originUrl}" and no change to the observed ` +
|
|
177
|
+
`testids [${observe.join(", ")}]. Include the testid that changes in ` +
|
|
178
|
+
`\`observe\`, or pass \`waitFor\` to express the precise post-submit wait.`,
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
// Landed but never stabilized within the ceiling: fall through and snapshot
|
|
182
|
+
// the last-read state; the parity equality assertion surfaces any mismatch.
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
async function snapshot(
|
|
186
|
+
page: Page,
|
|
187
|
+
observe: string[],
|
|
188
|
+
): Promise<ParitySnapshot> {
|
|
189
|
+
const testIds: Record<string, string | null> = {};
|
|
190
|
+
for (const id of observe) {
|
|
191
|
+
testIds[id] = await page.locator(`[data-testid="${id}"]`).textContent();
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
testIds,
|
|
195
|
+
url: page.url(),
|
|
196
|
+
cookies: await page.evaluate(() => document.cookie),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function createParity({
|
|
201
|
+
test: _test,
|
|
202
|
+
expect,
|
|
203
|
+
useFixture,
|
|
204
|
+
defaultRoot,
|
|
205
|
+
}: {
|
|
206
|
+
test: TestType<any, any>;
|
|
207
|
+
expect: Expect;
|
|
208
|
+
useFixture: (options: FixtureOptions) => Fixture;
|
|
209
|
+
defaultRoot?: string;
|
|
210
|
+
}): Parity {
|
|
211
|
+
function parityDescribe(
|
|
212
|
+
name: string,
|
|
213
|
+
body: (f: Fixture) => void,
|
|
214
|
+
options?: ParityDescribeOptions,
|
|
215
|
+
): void {
|
|
216
|
+
const root = options?.root ?? defaultRoot;
|
|
217
|
+
if (!root) {
|
|
218
|
+
throw new Error(
|
|
219
|
+
`parityDescribe("${name}") requires a root: pass options.root or set defaultRoot in createRangoE2E.`,
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
_test.describe(name, () => {
|
|
223
|
+
const f = useFixture({ ...options, root, mode: "dev" });
|
|
224
|
+
body(f);
|
|
225
|
+
});
|
|
226
|
+
_test.describe(`${name} (production)`, () => {
|
|
227
|
+
const f = useFixture({ ...options, root, mode: "build" });
|
|
228
|
+
body(f);
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
async function expectParity(
|
|
233
|
+
page: Page,
|
|
234
|
+
intent: ParityIntent,
|
|
235
|
+
opts: ExpectParityOptions,
|
|
236
|
+
): Promise<void> {
|
|
237
|
+
// For a submit intent, the form lives on the page the caller already
|
|
238
|
+
// navigated to; capture that origin URL before the JS submit changes it so
|
|
239
|
+
// the no-JS path can load the same form, and so settleSubmit can detect a
|
|
240
|
+
// navigation away from it.
|
|
241
|
+
const originUrl = page.url();
|
|
242
|
+
|
|
243
|
+
// Settle the intent's observable effect before snapshotting. A `navigate`
|
|
244
|
+
// intent already awaited its navigation in applyIntent (page.goto), so only
|
|
245
|
+
// `submit` needs the DOM-driven settle, and only when no `waitFor` override
|
|
246
|
+
// is given. waitFor, when present, replaces the generic settle for submit
|
|
247
|
+
// and runs after the navigation for navigate — on whichever page is about to
|
|
248
|
+
// be snapshotted.
|
|
249
|
+
const settle = async (
|
|
250
|
+
target: Page,
|
|
251
|
+
baseline: string,
|
|
252
|
+
origin: string,
|
|
253
|
+
): Promise<void> => {
|
|
254
|
+
if ("submit" in intent) {
|
|
255
|
+
if (opts.waitFor) {
|
|
256
|
+
await opts.waitFor(target);
|
|
257
|
+
} else {
|
|
258
|
+
await settleSubmit(target, opts.observe, baseline, origin);
|
|
259
|
+
}
|
|
260
|
+
} else if (opts.waitFor) {
|
|
261
|
+
await opts.waitFor(target);
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
// JS path: the given page (JS enabled by default). Read the pre-submit
|
|
266
|
+
// baseline before applying the intent so the settle can require a change.
|
|
267
|
+
const jsBaseline =
|
|
268
|
+
"submit" in intent ? await readObserved(page, opts.observe) : "";
|
|
269
|
+
await applyIntent(page, intent, opts.baseURL);
|
|
270
|
+
await settle(page, jsBaseline, originUrl);
|
|
271
|
+
const jsSnapshot = await snapshot(page, opts.observe);
|
|
272
|
+
|
|
273
|
+
// No-JS path: a fresh context with scripting disabled.
|
|
274
|
+
const browser = page.context().browser()!;
|
|
275
|
+
const noJsContext = await browser.newContext({ javaScriptEnabled: false });
|
|
276
|
+
try {
|
|
277
|
+
const noJsPage = await noJsContext.newPage();
|
|
278
|
+
if (!("navigate" in intent)) {
|
|
279
|
+
// A submit intent needs the form rendered first; start from the same
|
|
280
|
+
// URL the JS path observed the form on.
|
|
281
|
+
await noJsPage.goto(originUrl, { waitUntil: "networkidle" });
|
|
282
|
+
}
|
|
283
|
+
const noJsOrigin = noJsPage.url();
|
|
284
|
+
const noJsBaseline =
|
|
285
|
+
"submit" in intent ? await readObserved(noJsPage, opts.observe) : "";
|
|
286
|
+
await applyIntent(noJsPage, intent, opts.baseURL);
|
|
287
|
+
await settle(noJsPage, noJsBaseline, noJsOrigin);
|
|
288
|
+
const noJsSnapshot = await snapshot(noJsPage, opts.observe);
|
|
289
|
+
|
|
290
|
+
expect(noJsSnapshot.testIds).toEqual(jsSnapshot.testIds);
|
|
291
|
+
// Compare pathname + search + hash, not pathname alone: a JS vs no-JS flow
|
|
292
|
+
// that diverges only in query/hash (e.g. /search?q=a vs /search?q=b) would
|
|
293
|
+
// otherwise pass.
|
|
294
|
+
const locationOf = (u: string): string => {
|
|
295
|
+
const url = new URL(u);
|
|
296
|
+
return url.pathname + url.search + url.hash;
|
|
297
|
+
};
|
|
298
|
+
expect(locationOf(noJsSnapshot.url)).toEqual(locationOf(jsSnapshot.url));
|
|
299
|
+
expect(noJsSnapshot.cookies).toEqual(jsSnapshot.cookies);
|
|
300
|
+
} finally {
|
|
301
|
+
await noJsContext.close();
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
return { parityDescribe, expectParity };
|
|
306
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// Node-only server-lifecycle machinery for the e2e harness. Contains no
|
|
2
|
+
// Playwright imports so it can be loaded in a plain-node process. Lifted from
|
|
3
|
+
// the internal e2e/fixture.ts and parameterized for consumer apps.
|
|
4
|
+
|
|
5
|
+
import { type SpawnOptions, spawn } from "node:child_process";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { stripVTControlCharacters, styleText } from "node:util";
|
|
8
|
+
import { x } from "tinyexec";
|
|
9
|
+
|
|
10
|
+
export type { SpawnOptions };
|
|
11
|
+
|
|
12
|
+
export interface RunCliHandle {
|
|
13
|
+
proc: ReturnType<typeof x>["process"];
|
|
14
|
+
done: Promise<void>;
|
|
15
|
+
findPort: (timeoutMs?: number) => Promise<number>;
|
|
16
|
+
kill: () => void;
|
|
17
|
+
stdout: () => string;
|
|
18
|
+
stderr: () => string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function runCli(
|
|
22
|
+
options: { command: string; label?: string } & SpawnOptions,
|
|
23
|
+
): RunCliHandle {
|
|
24
|
+
const [name, ...args] = options.command.split(" ");
|
|
25
|
+
// Vite registers `process.stdin.on("end", ...)` as parent-death detection and
|
|
26
|
+
// calls process.exit() when stdin reaches EOF, unless process.env.CI === "true"
|
|
27
|
+
// (see vite's setupSIGTERMListener). Servers spawned here receive an stdin that
|
|
28
|
+
// hits EOF immediately, so without CI=true the dev/preview server shuts itself
|
|
29
|
+
// down before it finishes starting. Real CI runners set CI=true; mirror that for
|
|
30
|
+
// locally-spawned servers so they stay alive for the duration of the tests.
|
|
31
|
+
const child = x(name!, args, {
|
|
32
|
+
nodeOptions: {
|
|
33
|
+
...options,
|
|
34
|
+
env: { ...process.env, CI: "true", ...options.env },
|
|
35
|
+
},
|
|
36
|
+
}).process!;
|
|
37
|
+
const label = `[${options.label ?? "cli"}]`;
|
|
38
|
+
let stdout = "";
|
|
39
|
+
let stderr = "";
|
|
40
|
+
child.stdout!.on("data", (data) => {
|
|
41
|
+
stdout += stripVTControlCharacters(String(data));
|
|
42
|
+
if (process.env.TEST_DEBUG) {
|
|
43
|
+
console.log(styleText("cyan", label), data.toString());
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
child.stderr!.on("data", (data) => {
|
|
47
|
+
stderr += stripVTControlCharacters(String(data));
|
|
48
|
+
if (process.env.TEST_DEBUG) {
|
|
49
|
+
console.log(styleText("magenta", label), data.toString());
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
const done = new Promise<void>((resolve) => {
|
|
53
|
+
child.on("exit", (code) => {
|
|
54
|
+
if (code !== 0 && code !== 143 && process.platform !== "win32") {
|
|
55
|
+
console.log(styleText("magenta", `${label}`), `exit code ${code}`);
|
|
56
|
+
}
|
|
57
|
+
resolve();
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
async function findPort(timeoutMs = 60000): Promise<number> {
|
|
62
|
+
let stdout = "";
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
const timeout = setTimeout(() => {
|
|
65
|
+
reject(
|
|
66
|
+
new Error(
|
|
67
|
+
`Timed out waiting for server to start after ${timeoutMs}ms. Stdout: ${stdout}`,
|
|
68
|
+
),
|
|
69
|
+
);
|
|
70
|
+
}, timeoutMs);
|
|
71
|
+
|
|
72
|
+
child.stdout!.on("data", (data) => {
|
|
73
|
+
stdout += stripVTControlCharacters(String(data));
|
|
74
|
+
const match = stdout.match(/http:\/\/localhost:(\d+)/);
|
|
75
|
+
if (match) {
|
|
76
|
+
clearTimeout(timeout);
|
|
77
|
+
resolve(Number(match[1]));
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
child.on("exit", (code) => {
|
|
82
|
+
clearTimeout(timeout);
|
|
83
|
+
if (code !== 0) {
|
|
84
|
+
reject(
|
|
85
|
+
new Error(`Server exited with code ${code}. Stdout: ${stdout}`),
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function kill() {
|
|
93
|
+
if (process.platform === "win32") {
|
|
94
|
+
spawn("taskkill", ["/pid", String(child.pid), "/t", "/f"]);
|
|
95
|
+
} else {
|
|
96
|
+
// Kill entire process group (Vite spawns child processes like workerd).
|
|
97
|
+
// Falls back to direct kill if process group kill fails.
|
|
98
|
+
try {
|
|
99
|
+
process.kill(-child.pid!, "SIGTERM");
|
|
100
|
+
} catch {
|
|
101
|
+
child.kill();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return {
|
|
107
|
+
proc: child,
|
|
108
|
+
done,
|
|
109
|
+
findPort,
|
|
110
|
+
kill,
|
|
111
|
+
stdout: () => stdout,
|
|
112
|
+
stderr: () => stderr,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function tailOutput(text: string, maxChars = 4000): string {
|
|
117
|
+
if (!text) return "(empty)";
|
|
118
|
+
if (text.length <= maxChars) return text;
|
|
119
|
+
return `...${text.slice(-maxChars)}`;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function createIsolatedViteCacheDir(
|
|
123
|
+
cwd: string,
|
|
124
|
+
projectName: string,
|
|
125
|
+
mode: "dev" | "build" | undefined,
|
|
126
|
+
): string {
|
|
127
|
+
const safeProjectName = projectName.replace(/[^a-zA-Z0-9_-]/g, "-");
|
|
128
|
+
return path.join(
|
|
129
|
+
cwd,
|
|
130
|
+
".vite-isolated",
|
|
131
|
+
`${safeProjectName}-${mode ?? "server"}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export async function waitForReady(
|
|
136
|
+
url: string,
|
|
137
|
+
getOutput?: () => { stdout: string; stderr: string },
|
|
138
|
+
timeoutMs: number = process.env.CI ? 60000 : 30000,
|
|
139
|
+
): Promise<void> {
|
|
140
|
+
const deadline = Date.now() + timeoutMs;
|
|
141
|
+
while (Date.now() < deadline) {
|
|
142
|
+
try {
|
|
143
|
+
const res = await fetch(url);
|
|
144
|
+
if (res.ok) return;
|
|
145
|
+
} catch {}
|
|
146
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
147
|
+
}
|
|
148
|
+
const output = getOutput?.();
|
|
149
|
+
const details = output
|
|
150
|
+
? `\nRecent stdout:\n${tailOutput(output.stdout)}\n\nRecent stderr:\n${tailOutput(output.stderr)}`
|
|
151
|
+
: "";
|
|
152
|
+
throw new Error(`Server not ready after ${timeoutMs}ms: ${url}${details}`);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Warm up an isolated dev server by making real SSR requests.
|
|
157
|
+
* The first SSR request triggers Vite's dep optimizer to discover SSR deps.
|
|
158
|
+
* After optimization, modules are re-evaluated and in-memory caches reset.
|
|
159
|
+
* We retry until the server returns a stable 200, absorbing the dep
|
|
160
|
+
* optimization cycle so subsequent test requests hit a settled server.
|
|
161
|
+
*/
|
|
162
|
+
export async function warmupDevServer(url: string): Promise<void> {
|
|
163
|
+
const deadline = Date.now() + 30_000;
|
|
164
|
+
let lastOk = 0;
|
|
165
|
+
// Need two consecutive OK responses to confirm the server is settled
|
|
166
|
+
// (first OK may precede dep optimization, second confirms stability).
|
|
167
|
+
while (Date.now() < deadline && lastOk < 2) {
|
|
168
|
+
try {
|
|
169
|
+
const res = await fetch(url, {
|
|
170
|
+
headers: { accept: "text/html" },
|
|
171
|
+
});
|
|
172
|
+
if (res.ok) {
|
|
173
|
+
await res.text(); // consume body to complete SSR pipeline
|
|
174
|
+
lastOk++;
|
|
175
|
+
} else {
|
|
176
|
+
lastOk = 0;
|
|
177
|
+
}
|
|
178
|
+
} catch {
|
|
179
|
+
lastOk = 0;
|
|
180
|
+
}
|
|
181
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vitest custom matchers for asserting on REAL Flight wire strings produced by
|
|
3
|
+
* {@link renderToFlightString}. Register with:
|
|
4
|
+
*
|
|
5
|
+
* import { expect } from "vitest";
|
|
6
|
+
* import { flightMatchers } from "@rangojs/router/testing/flight-matchers"; // or local path
|
|
7
|
+
* expect.extend(flightMatchers);
|
|
8
|
+
*
|
|
9
|
+
* Ergonomic shape (vitest `expect` is single-arg, so the matcher receives the
|
|
10
|
+
* ALREADY-RENDERED Flight string as `received`):
|
|
11
|
+
*
|
|
12
|
+
* const flight = await renderToFlightString(<Greeting name="Ada" />);
|
|
13
|
+
* expect(flight).toMatchFlight("Ada"); // substring containment
|
|
14
|
+
* expect(flight).toMatchFlightSnapshot(); // normalized snapshot
|
|
15
|
+
*
|
|
16
|
+
* `toMatchFlight(expected)` asserts the NORMALIZED Flight string CONTAINS
|
|
17
|
+
* `expected`. Containment (not equality) is the v1 contract because the Flight
|
|
18
|
+
* row prefixes/quoting are an internal serializer detail — tests should pin the
|
|
19
|
+
* rendered text/shape, not the exact framing. For an exact, drift-detecting
|
|
20
|
+
* assertion of the whole payload, use `toMatchFlightSnapshot()`.
|
|
21
|
+
*
|
|
22
|
+
* Both operate on normalized output (see normalizeFlight): the dev-only
|
|
23
|
+
* `:N<timestamp>` reference row and absolute `file://` paths are scrubbed so
|
|
24
|
+
* assertions are stable across runs/machines. Run snapshots under
|
|
25
|
+
* NODE_ENV=production for the cleanest, most stable payloads.
|
|
26
|
+
*
|
|
27
|
+
* Scope: server-only / leaf trees (a client component emits an unresolved
|
|
28
|
+
* `I[...]` import row against the empty client manifest — see flight.ts).
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { expect } from "vitest";
|
|
32
|
+
import { normalizeFlight } from "./flight.js";
|
|
33
|
+
|
|
34
|
+
interface MatcherResult {
|
|
35
|
+
pass: boolean;
|
|
36
|
+
message: () => string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Matcher object for `expect.extend(flightMatchers)`.
|
|
41
|
+
*
|
|
42
|
+
* - `toMatchFlight(received, expected)` — `received` is a rendered Flight
|
|
43
|
+
* string; passes if its normalized form contains `expected`.
|
|
44
|
+
* - `toMatchFlightSnapshot(received)` — delegates to vitest's snapshot on the
|
|
45
|
+
* normalized Flight string.
|
|
46
|
+
*/
|
|
47
|
+
export const flightMatchers: {
|
|
48
|
+
toMatchFlight(received: string, expected: string): MatcherResult;
|
|
49
|
+
toMatchFlightSnapshot(received: string): MatcherResult;
|
|
50
|
+
} = {
|
|
51
|
+
toMatchFlight(received: string, expected: string): MatcherResult {
|
|
52
|
+
if (typeof received !== "string") {
|
|
53
|
+
return {
|
|
54
|
+
pass: false,
|
|
55
|
+
message: () =>
|
|
56
|
+
"toMatchFlight expected a rendered Flight string (the result of " +
|
|
57
|
+
"`await renderToFlightString(...)`), but received " +
|
|
58
|
+
`${typeof received}. Render the element first: ` +
|
|
59
|
+
"`expect(await renderToFlightString(<C/>)).toMatchFlight(...)`.",
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const normalized = normalizeFlight(received);
|
|
63
|
+
const pass = normalized.includes(expected);
|
|
64
|
+
return {
|
|
65
|
+
pass,
|
|
66
|
+
message: () =>
|
|
67
|
+
pass
|
|
68
|
+
? `Expected Flight string not to contain ${JSON.stringify(expected)}.`
|
|
69
|
+
: `Expected Flight string to contain ${JSON.stringify(expected)}.\n` +
|
|
70
|
+
`Received (normalized):\n${normalized}`,
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
toMatchFlightSnapshot(received: string): MatcherResult {
|
|
75
|
+
// Delegate to vitest's snapshot engine on the normalized string. The
|
|
76
|
+
// snapshot is keyed by the current test file/title (vitest tracks this via
|
|
77
|
+
// the active test context), not by this call site, so delegating through a
|
|
78
|
+
// freshly imported `expect` is reliable.
|
|
79
|
+
expect(normalizeFlight(received)).toMatchSnapshot();
|
|
80
|
+
// toMatchSnapshot throws on mismatch; reaching here means it passed.
|
|
81
|
+
return {
|
|
82
|
+
pass: true,
|
|
83
|
+
message: () => "Flight snapshot matched.",
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Vitest Assertion augmentation so `toMatchFlight` / `toMatchFlightSnapshot`
|
|
90
|
+
* are typed on `expect(...)`. Imported for its side-effecting type
|
|
91
|
+
* augmentation; importing flight-matchers (which imports this) is enough.
|
|
92
|
+
*/
|
|
93
|
+
declare module "vitest" {
|
|
94
|
+
interface Assertion<T = any> {
|
|
95
|
+
/** Assert the normalized Flight string contains `expected`. */
|
|
96
|
+
toMatchFlight(expected: string): T;
|
|
97
|
+
/** Snapshot the normalized Flight string. */
|
|
98
|
+
toMatchFlightSnapshot(): T;
|
|
99
|
+
}
|
|
100
|
+
interface AsymmetricMatchersContaining {
|
|
101
|
+
toMatchFlight(expected: string): void;
|
|
102
|
+
toMatchFlightSnapshot(): void;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ambient declaration for the vendored react-server-dom serializer shipped
|
|
3
|
+
* inside @vitejs/plugin-rsc. The package ships no .d.ts for this private
|
|
4
|
+
* subpath, so we declare the minimal surface renderToFlightString uses.
|
|
5
|
+
*
|
|
6
|
+
* Only loadable under the `react-server` export condition (see flight.ts).
|
|
7
|
+
*/
|
|
8
|
+
declare module "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge" {
|
|
9
|
+
/**
|
|
10
|
+
* Serialize a server-component payload to a Flight wire stream.
|
|
11
|
+
*
|
|
12
|
+
* @param payload The value to serialize (Rango wraps a payload object).
|
|
13
|
+
* @param clientManifest Client-reference manifest; `{}` for server-only trees.
|
|
14
|
+
* @param options Render options; `onError` is invoked per render error.
|
|
15
|
+
*/
|
|
16
|
+
export function renderToReadableStream(
|
|
17
|
+
payload: unknown,
|
|
18
|
+
clientManifest: unknown,
|
|
19
|
+
options?: { onError?: (error: unknown) => string | void },
|
|
20
|
+
): ReadableStream<Uint8Array>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rangojs/router/testing/flight
|
|
3
|
+
*
|
|
4
|
+
* Real React Server Component (Flight) rendering for unit tests. This entry is
|
|
5
|
+
* SEPARATE from the main ./testing barrel because its serializer (the vendored
|
|
6
|
+
* react-server-dom build) can only be imported under the `react-server` node
|
|
7
|
+
* condition; importing it elsewhere throws. Use it only from a Vitest project
|
|
8
|
+
* configured with that condition (see vitest.rsc.config.ts) — name those test
|
|
9
|
+
* files `*.rsc-test.{ts,tsx}` and run `pnpm test:unit:rsc`.
|
|
10
|
+
*
|
|
11
|
+
* This entry deliberately does NOT pull in Vitest. The `toMatchFlight` /
|
|
12
|
+
* `toMatchFlightSnapshot` matchers (which import `vitest`) live at the separate
|
|
13
|
+
* `@rangojs/router/testing/flight-matchers` subpath, so a consumer can import
|
|
14
|
+
* `renderToFlightString` without taking a hard dependency on Vitest.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export {
|
|
18
|
+
renderToFlightString,
|
|
19
|
+
normalizeFlight,
|
|
20
|
+
assertFlightRuntimeAvailable,
|
|
21
|
+
} from "./flight.js";
|
|
22
|
+
export type { RenderToFlightStringOptions } from "./flight.js";
|