@rangojs/router 0.0.0-experimental.15 → 0.0.0-experimental.151
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/AGENTS.md +13 -0
- package/README.md +308 -451
- 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 +1844 -237
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
- 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/{src/handles/index.ts → dist/handles/index.js} +1 -1
- 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/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- 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/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -8
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +7554 -2070
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- 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/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +142 -61
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +489 -0
- package/skills/caching/SKILL.md +413 -26
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +278 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +16 -18
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +96 -63
- package/skills/fonts/SKILL.md +7 -5
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +76 -436
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +215 -16
- package/skills/layout/SKILL.md +147 -7
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +629 -55
- package/skills/middleware/SKILL.md +251 -38
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +60 -21
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +296 -4
- package/skills/ppr/SKILL.md +658 -0
- package/skills/prerender/SKILL.md +487 -52
- package/skills/rango/SKILL.md +324 -29
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +264 -122
- package/skills/route/SKILL.md +359 -22
- package/skills/router-setup/SKILL.md +247 -34
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +126 -222
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +10 -9
- package/skills/typesafety/SKILL.md +45 -496
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +383 -0
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +77 -44
- package/src/bin/rango.ts +275 -29
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +348 -212
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +39 -0
- package/src/browser/merge-segment-loaders.ts +23 -13
- package/src/browser/navigation-bridge.ts +385 -576
- package/src/browser/navigation-client.ts +249 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +230 -124
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +88 -0
- package/src/browser/partial-update.ts +432 -365
- package/src/browser/prefetch/cache.ts +381 -0
- package/src/browser/prefetch/fetch.ts +462 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +209 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +284 -67
- package/src/browser/react/NavigationProvider.tsx +267 -109
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +70 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +272 -60
- package/src/browser/react/location-state.ts +90 -20
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +39 -13
- package/src/browser/react/use-navigation.ts +53 -69
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +164 -0
- package/src/browser/rsc-router.tsx +355 -73
- package/src/browser/scroll-restoration.ts +140 -50
- package/src/browser/segment-reconciler.ts +253 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +668 -613
- package/src/browser/types.ts +235 -51
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +243 -183
- package/src/build/generate-route-types.ts +41 -848
- package/src/build/index.ts +12 -7
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +218 -80
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +105 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +812 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +144 -0
- package/src/build/route-types/router-processing.ts +695 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +223 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +88 -0
- package/src/cache/cache-policy.ts +199 -0
- package/src/cache/cache-runtime.ts +695 -0
- package/src/cache/cache-scope.ts +324 -335
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2602 -156
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +17 -17
- package/src/cache/document-cache.ts +226 -102
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +132 -0
- package/src/cache/index.ts +24 -35
- package/src/cache/memory-segment-store.ts +446 -30
- package/src/cache/profile-registry.ts +88 -0
- package/src/cache/read-through-swr.ts +178 -0
- package/src/cache/segment-codec.ts +295 -0
- package/src/cache/shell-snapshot.ts +464 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +283 -211
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1201 -0
- package/src/client.rsc.tsx +43 -21
- package/src/client.tsx +131 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +13 -3
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +4 -2
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +106 -10
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +110 -35
- package/src/handles/MetaTags.tsx +83 -59
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +44 -53
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +20 -65
- package/src/host/errors.ts +21 -30
- package/src/host/index.ts +13 -9
- package/src/host/pattern-matcher.ts +50 -79
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +180 -35
- package/src/index.ts +245 -73
- package/src/internal-debug.ts +9 -2
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/build-shell-capture.ts +447 -0
- package/src/prerender/param-hash.ts +16 -14
- package/src/prerender/shell-manifest-key.ts +20 -0
- package/src/prerender/store.ts +131 -22
- package/src/prerender.ts +460 -26
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +22 -77
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +88 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +54 -0
- package/src/route-definition/redirect.ts +134 -0
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-definition.ts +1 -1481
- package/src/route-map-builder.ts +120 -145
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +71 -45
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +305 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +54 -27
- package/src/router/find-match.ts +259 -0
- package/src/router/handler-context.ts +385 -125
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +88 -28
- package/src/router/lazy-includes.ts +260 -0
- package/src/router/loader-resolution.ts +449 -157
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +144 -62
- package/src/router/match-api.ts +224 -256
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +499 -0
- package/src/router/match-middleware/background-revalidation.ts +117 -93
- package/src/router/match-middleware/cache-lookup.ts +308 -150
- package/src/router/match-middleware/cache-store.ts +123 -51
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +143 -52
- package/src/router/metrics.ts +235 -29
- package/src/router/middleware-types.ts +110 -0
- package/src/router/middleware.ts +526 -441
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +311 -142
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +575 -0
- package/src/router/preview-match.ts +102 -0
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +203 -62
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +45 -48
- package/src/router/router-interfaces.ts +564 -0
- package/src/router/router-options.ts +784 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +812 -0
- package/src/router/segment-resolution/helpers.ts +348 -0
- package/src/router/segment-resolution/loader-cache.ts +315 -0
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +99 -0
- package/src/router/segment-resolution/revalidation.ts +1340 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +25 -1354
- package/src/router/segment-wrappers.ts +292 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +259 -0
- package/src/router/telemetry.ts +385 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +240 -61
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +795 -2390
- package/src/rsc/capture-queue.ts +67 -0
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +956 -1164
- package/src/rsc/helpers.ts +736 -19
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +305 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +23 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +541 -0
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +257 -0
- package/src/rsc/rsc-rendering.ts +856 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +525 -0
- package/src/rsc/shell-build-manifest.ts +316 -0
- package/src/rsc/shell-capture-constants.ts +27 -0
- package/src/rsc/shell-capture.ts +1716 -0
- package/src/rsc/shell-serve.ts +226 -0
- package/src/rsc/ssr-setup.ts +176 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +95 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +99 -82
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-fragments.ts +124 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +464 -135
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +640 -85
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +337 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +123 -42
- package/src/server/loader-registry.ts +51 -100
- package/src/server/request-context.ts +1069 -152
- package/src/server.ts +15 -8
- package/src/ssr/index.tsx +661 -140
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/preinit-client-references.ts +106 -0
- package/src/ssr/ssr-root.tsx +261 -0
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +380 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +371 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +219 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +76 -98
- package/src/theme/ThemeScript.tsx +12 -14
- package/src/theme/constants.ts +57 -15
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +43 -39
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +850 -0
- package/src/types/index.ts +81 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +138 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +271 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +162 -0
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +44 -0
- package/src/urls/path-helper-types.ts +418 -0
- package/src/urls/path-helper.ts +280 -0
- package/src/urls/pattern-types.ts +189 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +316 -0
- package/src/urls/urls-function.ts +80 -0
- package/src/urls.ts +1 -1352
- package/src/use-loader.tsx +406 -141
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +408 -0
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +483 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/shell-prerender-phase.ts +397 -0
- package/src/vite/discovery/state.ts +205 -0
- package/src/vite/discovery/virtual-module-codegen.ts +293 -0
- package/src/vite/index.ts +31 -2255
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +336 -0
- package/src/vite/plugins/cjs-to-esm.ts +90 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- 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 +194 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
- package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +805 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +94 -0
- package/src/vite/plugins/version-plugin.ts +271 -0
- package/src/vite/plugins/virtual-entries.ts +267 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +600 -0
- package/src/vite/router-discovery.ts +2120 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +268 -0
- package/src/vite/utils/shared-utils.ts +271 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -8,7 +8,12 @@ import type {
|
|
|
8
8
|
ResolvedSegment,
|
|
9
9
|
RscMetadata,
|
|
10
10
|
HandleData,
|
|
11
|
+
StreamingToken,
|
|
11
12
|
} from "./types.js";
|
|
13
|
+
import {
|
|
14
|
+
filterSegmentOrder,
|
|
15
|
+
filterRouteSegmentIds,
|
|
16
|
+
} from "./react/filter-segment-order.js";
|
|
12
17
|
|
|
13
18
|
// Polyfill Symbol.dispose for Safari and older browsers
|
|
14
19
|
if (typeof Symbol.dispose === "undefined") {
|
|
@@ -40,7 +45,7 @@ export interface NavigationEntry {
|
|
|
40
45
|
abort: AbortController;
|
|
41
46
|
phase: NavigationPhase;
|
|
42
47
|
startedAt: number;
|
|
43
|
-
options?: NavigateOptions;
|
|
48
|
+
options?: NavigateOptions & { skipLoadingState?: boolean };
|
|
44
49
|
}
|
|
45
50
|
|
|
46
51
|
/**
|
|
@@ -77,6 +82,8 @@ export interface DerivedNavigationState {
|
|
|
77
82
|
state: "idle" | "loading";
|
|
78
83
|
/** Whether any operation is streaming */
|
|
79
84
|
isStreaming: boolean;
|
|
85
|
+
/** Whether a navigation is active (fetching or streaming, before commit) */
|
|
86
|
+
isNavigating: boolean;
|
|
80
87
|
/** Current committed location */
|
|
81
88
|
location: NavigationLocation;
|
|
82
89
|
/** URL being navigated to (null if idle) */
|
|
@@ -109,20 +116,24 @@ export type ActionStateListener = (state: TrackedActionState) => void;
|
|
|
109
116
|
export type HandleListener = () => void;
|
|
110
117
|
|
|
111
118
|
/**
|
|
112
|
-
* Internal handle state stored in controller
|
|
119
|
+
* Internal handle state stored in controller.
|
|
120
|
+
*
|
|
121
|
+
* Two segment lists are exposed because they serve different consumers:
|
|
122
|
+
*
|
|
123
|
+
* - `segmentOrder` drives handle collection (collectHandleData). Includes
|
|
124
|
+
* parallel slot ids and reorders them after their parent so later-wins
|
|
125
|
+
* collect functions (e.g. Meta) get the right precedence.
|
|
126
|
+
* - `routeSegmentIds` is the layouts-and-routes-only list documented by
|
|
127
|
+
* `useSegments().segmentIds`. Parallels and loader sub-ids are stripped;
|
|
128
|
+
* raw matched order is preserved.
|
|
129
|
+
*
|
|
130
|
+
* Both are derived from the same `matched` input on each setHandleData call
|
|
131
|
+
* so they stay in sync.
|
|
113
132
|
*/
|
|
114
133
|
export interface HandleState {
|
|
115
134
|
data: HandleData;
|
|
116
135
|
segmentOrder: string[];
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Token for tracking an active stream
|
|
121
|
-
* Call end() when the stream completes
|
|
122
|
-
*/
|
|
123
|
-
export interface StreamingToken {
|
|
124
|
-
/** End this streaming operation */
|
|
125
|
-
end(): void;
|
|
136
|
+
routeSegmentIds: string[];
|
|
126
137
|
}
|
|
127
138
|
|
|
128
139
|
/**
|
|
@@ -157,6 +168,22 @@ export interface ActionHandle extends Disposable {
|
|
|
157
168
|
startStreaming(): StreamingToken;
|
|
158
169
|
/** Record segments that were revalidated */
|
|
159
170
|
recordRevalidatedSegments(segmentIds: string[]): void;
|
|
171
|
+
/**
|
|
172
|
+
* Claim the subset of a location-state payload this action may write. A key
|
|
173
|
+
* is claimed only if no later-initiated action in the SAME cohort has already
|
|
174
|
+
* claimed it, so same-key concurrent writes resolve to the last-initiated
|
|
175
|
+
* action while distinct keys from every action survive. Recording the claim
|
|
176
|
+
* stops a later-settling earlier action from overwriting it. Arbitration is
|
|
177
|
+
* scoped to the action's cohort (its originating history entry, captured at
|
|
178
|
+
* startAction), so an action on one entry cannot suppress an action on
|
|
179
|
+
* another that happens to write the same slot.
|
|
180
|
+
*
|
|
181
|
+
* Contract: this guarantees the FINAL value is the last-initiated action's,
|
|
182
|
+
* not that the loser is never momentarily visible. When an earlier-initiated
|
|
183
|
+
* action settles first, its value is merged and observable until the
|
|
184
|
+
* later-initiated winner's response lands and overwrites it.
|
|
185
|
+
*/
|
|
186
|
+
claimLocationState(state: Record<string, unknown>): Record<string, unknown>;
|
|
160
187
|
/** Complete the action with result */
|
|
161
188
|
complete(result?: unknown): void;
|
|
162
189
|
/** Fail the action with error */
|
|
@@ -165,8 +192,8 @@ export interface ActionHandle extends Disposable {
|
|
|
165
192
|
readonly settled: boolean;
|
|
166
193
|
/** Check if any concurrent actions were started */
|
|
167
194
|
hadConcurrentActions: boolean;
|
|
168
|
-
/** Get
|
|
169
|
-
|
|
195
|
+
/** Get raw set of segments revalidated by concurrent actions */
|
|
196
|
+
getRevalidatedSegments(): Set<string>;
|
|
170
197
|
/** Clear consolidation tracking */
|
|
171
198
|
clearConsolidation(): void;
|
|
172
199
|
}
|
|
@@ -176,16 +203,25 @@ export interface ActionHandle extends Disposable {
|
|
|
176
203
|
*/
|
|
177
204
|
export interface EventController {
|
|
178
205
|
// Navigation operations
|
|
179
|
-
startNavigation(
|
|
206
|
+
startNavigation(
|
|
207
|
+
url: string,
|
|
208
|
+
options?: NavigateOptions & { skipLoadingState?: boolean },
|
|
209
|
+
): NavigationHandle;
|
|
180
210
|
abortNavigation(): void;
|
|
181
211
|
|
|
182
212
|
// Action operations
|
|
183
|
-
startAction(
|
|
213
|
+
startAction(
|
|
214
|
+
actionId: string,
|
|
215
|
+
args: unknown[],
|
|
216
|
+
/** Originating history entry key; scopes location-state arbitration. */
|
|
217
|
+
cohort?: string,
|
|
218
|
+
): ActionHandle;
|
|
184
219
|
abortAllActions(): void;
|
|
185
220
|
|
|
186
221
|
// State access
|
|
187
222
|
getState(): DerivedNavigationState;
|
|
188
223
|
getActionState(actionId: string): TrackedActionState;
|
|
224
|
+
getLocation(): NavigationLocation;
|
|
189
225
|
|
|
190
226
|
// Location updates (for popstate where navigation doesn't go through startNavigation)
|
|
191
227
|
setLocation(location: NavigationLocation): void;
|
|
@@ -194,7 +230,7 @@ export interface EventController {
|
|
|
194
230
|
subscribe(listener: StateListener): () => void;
|
|
195
231
|
subscribeToAction(
|
|
196
232
|
actionId: string,
|
|
197
|
-
listener: ActionStateListener
|
|
233
|
+
listener: ActionStateListener,
|
|
198
234
|
): () => void;
|
|
199
235
|
subscribeToHandles(listener: HandleListener): () => void;
|
|
200
236
|
|
|
@@ -202,19 +238,37 @@ export interface EventController {
|
|
|
202
238
|
setHandleData(
|
|
203
239
|
data: HandleData,
|
|
204
240
|
matched?: string[],
|
|
205
|
-
isPartial?: boolean
|
|
241
|
+
isPartial?: boolean,
|
|
242
|
+
/**
|
|
243
|
+
* Segment ids that were re-resolved on the server this request (the
|
|
244
|
+
* partial response's `diff`). On a partial update, any existing bucket
|
|
245
|
+
* keyed under one of these ids that has no incoming entry is treated as
|
|
246
|
+
* stale and cleared. Without this, a parallel slot that revalidates but
|
|
247
|
+
* pushes nothing leaves its previous bucket in place forever.
|
|
248
|
+
*/
|
|
249
|
+
resolvedIds?: string[],
|
|
206
250
|
): void;
|
|
207
251
|
getHandleState(): HandleState;
|
|
252
|
+
/**
|
|
253
|
+
* Update ONLY `routeSegmentIds` (what `useSegments` reads) from `matched`,
|
|
254
|
+
* leaving `data` and `segmentOrder` (what `useHandle` collects over) untouched.
|
|
255
|
+
* Used while a deferred handle is resolving: the route has changed (so
|
|
256
|
+
* `useSegments` must reflect the new segment ids) but `useHandle` still holds
|
|
257
|
+
* its previous value until the deferred snapshot is applied.
|
|
258
|
+
*/
|
|
259
|
+
setRouteSegmentIds(matched: string[]): void;
|
|
260
|
+
|
|
261
|
+
// Params operations
|
|
262
|
+
setParams(params: Record<string, string>): void;
|
|
263
|
+
getParams(): Record<string, string>;
|
|
208
264
|
|
|
209
265
|
// Direct state access for advanced use
|
|
210
266
|
getCurrentNavigation(): NavigationEntry | null;
|
|
211
267
|
getInflightActions(): Map<string, ActionEntry>;
|
|
268
|
+
/** Whether any concurrent actions have occurred (shared across all handles) */
|
|
269
|
+
hadAnyConcurrentActions(): boolean;
|
|
212
270
|
}
|
|
213
271
|
|
|
214
|
-
// ============================================================================
|
|
215
|
-
// Default States
|
|
216
|
-
// ============================================================================
|
|
217
|
-
|
|
218
272
|
const DEFAULT_ACTION_STATE: TrackedActionState = {
|
|
219
273
|
state: "idle",
|
|
220
274
|
actionId: null,
|
|
@@ -223,6 +277,13 @@ const DEFAULT_ACTION_STATE: TrackedActionState = {
|
|
|
223
277
|
result: null,
|
|
224
278
|
};
|
|
225
279
|
|
|
280
|
+
// Shared empty inflight-actions list. getState() hands back this exact reference
|
|
281
|
+
// whenever no action is inflight (the overwhelmingly common case), so the derived
|
|
282
|
+
// snapshot's `inflightActions` is referentially stable across notifies instead of
|
|
283
|
+
// a fresh [] each call. Read-only by contract (consumers only read length/spread),
|
|
284
|
+
// same as the shared DEFAULT_ACTION_STATE.
|
|
285
|
+
const EMPTY_INFLIGHT_ACTIONS: InflightAction[] = [];
|
|
286
|
+
|
|
226
287
|
/**
|
|
227
288
|
* Check if a subscription ID matches an action's full ID.
|
|
228
289
|
*
|
|
@@ -230,22 +291,28 @@ const DEFAULT_ACTION_STATE: TrackedActionState = {
|
|
|
230
291
|
* When subscriptionId has no '#', it's just an action name and matches by suffix.
|
|
231
292
|
* This allows useAction("addToCart") to match "hash#addToCart" or "src/file.ts#addToCart".
|
|
232
293
|
*/
|
|
233
|
-
function matchesActionId(
|
|
294
|
+
function matchesActionId(
|
|
295
|
+
subscriptionId: string,
|
|
296
|
+
entryActionId: string,
|
|
297
|
+
): boolean {
|
|
234
298
|
if (subscriptionId.includes("#")) {
|
|
235
|
-
// Full ID: exact match
|
|
236
299
|
return subscriptionId === entryActionId;
|
|
237
300
|
}
|
|
238
|
-
// Action name only: suffix match (matches "anything#actionName")
|
|
239
301
|
return entryActionId.endsWith(`#${subscriptionId}`);
|
|
240
302
|
}
|
|
241
303
|
|
|
242
|
-
//
|
|
243
|
-
|
|
244
|
-
|
|
304
|
+
// Batch rapid notifications into one microtask to prevent render storms
|
|
305
|
+
function makeDebouncedNotifier(listeners: Set<() => void>): () => void {
|
|
306
|
+
let timeout: ReturnType<typeof setTimeout> | null = null;
|
|
307
|
+
return () => {
|
|
308
|
+
if (timeout !== null) clearTimeout(timeout);
|
|
309
|
+
timeout = setTimeout(() => {
|
|
310
|
+
timeout = null;
|
|
311
|
+
listeners.forEach((listener) => listener());
|
|
312
|
+
}, 0);
|
|
313
|
+
};
|
|
314
|
+
}
|
|
245
315
|
|
|
246
|
-
/**
|
|
247
|
-
* Configuration for creating an event controller
|
|
248
|
-
*/
|
|
249
316
|
export interface EventControllerConfig {
|
|
250
317
|
initialLocation?: NavigationLocation;
|
|
251
318
|
}
|
|
@@ -261,60 +328,70 @@ export interface EventControllerConfig {
|
|
|
261
328
|
* Actions use mergeMap semantics (all run concurrently, consolidate at end).
|
|
262
329
|
*/
|
|
263
330
|
export function createEventController(
|
|
264
|
-
config?: EventControllerConfig
|
|
331
|
+
config?: EventControllerConfig,
|
|
265
332
|
): EventController {
|
|
266
|
-
// ========================================================================
|
|
267
|
-
// Source of Truth
|
|
268
|
-
// ========================================================================
|
|
269
|
-
|
|
270
|
-
// Current navigation in progress (null = idle)
|
|
271
333
|
let currentNavigation: NavigationEntry | null = null;
|
|
272
334
|
|
|
273
|
-
// All in-flight actions (keyed by unique instance ID)
|
|
274
335
|
const inflightActions = new Map<string, ActionEntry>();
|
|
275
336
|
|
|
276
|
-
// Committed location (updated when navigation completes)
|
|
277
337
|
let location: NavigationLocation =
|
|
278
338
|
config?.initialLocation ??
|
|
279
339
|
(typeof window !== "undefined"
|
|
280
340
|
? new URL(window.location.href)
|
|
281
341
|
: new URL("/", "http://localhost"));
|
|
282
342
|
|
|
283
|
-
// Track if any concurrent actions occurred (for consolidation)
|
|
284
343
|
let hadAnyConcurrentActions = false;
|
|
285
344
|
|
|
286
|
-
// Track segments revalidated by concurrent actions
|
|
287
345
|
const concurrentRevalidatedSegments = new Set<string>();
|
|
288
346
|
|
|
289
|
-
//
|
|
347
|
+
// Monotonic dispatch counter: every startAction() takes the next value
|
|
348
|
+
// (private), so a larger sequence means the action was initiated later.
|
|
349
|
+
let actionDispatchSeq = 0;
|
|
350
|
+
|
|
351
|
+
// Concurrent location-state arbitration, scoped PER COHORT (history entry).
|
|
352
|
+
// Each cohort owns a slotKey->winningDispatchSeq map plus a refcount of its
|
|
353
|
+
// inflight actions; claimLocationState() consults its own cohort's map so
|
|
354
|
+
// same-key writes within one entry resolve to the last-initiated action
|
|
355
|
+
// regardless of settle order, while actions on different entries never
|
|
356
|
+
// compete. A cohort's map is freed once its LAST action's cleanup runs — the
|
|
357
|
+
// same brief post-settle grace (doSettle's 100ms timer) as other action
|
|
358
|
+
// teardown, not when every action everywhere settles — so a long-running
|
|
359
|
+
// action in one cohort can never retain arbitration keys from other cohorts
|
|
360
|
+
// that have since drained. It is never cleared in clearConsolidation, which
|
|
361
|
+
// fires
|
|
362
|
+
// per-action on divert/error and would let a later-settling earlier action
|
|
363
|
+
// wrongly reclaim a key a sibling already won.
|
|
364
|
+
const cohortArbitration = new Map<
|
|
365
|
+
string,
|
|
366
|
+
{ keySeq: Map<string, number>; inflight: number }
|
|
367
|
+
>();
|
|
368
|
+
|
|
290
369
|
let activeStreamCount = 0;
|
|
291
370
|
|
|
292
|
-
// Handle data from RSC payload
|
|
293
371
|
let handleData: HandleData = {};
|
|
294
372
|
let handleSegmentOrder: string[] = [];
|
|
373
|
+
let routeSegmentIds: string[] = [];
|
|
295
374
|
|
|
296
|
-
|
|
297
|
-
// Listeners
|
|
298
|
-
// ========================================================================
|
|
375
|
+
let routeParams: Record<string, string> = {};
|
|
299
376
|
|
|
300
377
|
const stateListeners = new Set<StateListener>();
|
|
301
378
|
const actionListeners = new Map<string, Set<ActionStateListener>>();
|
|
302
379
|
const handleListeners = new Set<HandleListener>();
|
|
303
380
|
|
|
304
|
-
|
|
305
|
-
let notifyTimeout: ReturnType<typeof setTimeout> | null = null;
|
|
381
|
+
const notifyStateListeners = makeDebouncedNotifier(stateListeners);
|
|
306
382
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
383
|
+
// Memoized derived snapshot. Every state mutation already funnels through
|
|
384
|
+
// notify(), so invalidating here (synchronously, before the debounced fire)
|
|
385
|
+
// means a getState() call between two mutations reuses the same object — an
|
|
386
|
+
// unchanged state returns the SAME reference — while any real change recomputes
|
|
387
|
+
// on the next read. Kept null when dirty.
|
|
388
|
+
let cachedDerivedState: DerivedNavigationState | null = null;
|
|
389
|
+
|
|
390
|
+
function notify(): void {
|
|
391
|
+
cachedDerivedState = null;
|
|
392
|
+
notifyStateListeners();
|
|
315
393
|
}
|
|
316
394
|
|
|
317
|
-
// Debounce per-action notifications
|
|
318
395
|
const actionNotifyTimeouts = new Map<string, ReturnType<typeof setTimeout>>();
|
|
319
396
|
|
|
320
397
|
function notifyAction(actionId: string) {
|
|
@@ -326,83 +403,81 @@ export function createEventController(
|
|
|
326
403
|
actionId,
|
|
327
404
|
setTimeout(() => {
|
|
328
405
|
actionNotifyTimeouts.delete(actionId);
|
|
329
|
-
// Notify all listeners whose subscription ID matches this action
|
|
330
|
-
// This includes exact matches and suffix matches (e.g., "addToCart" matches "hash#addToCart")
|
|
331
406
|
for (const [subscriptionId, listeners] of actionListeners) {
|
|
332
407
|
if (matchesActionId(subscriptionId, actionId)) {
|
|
333
408
|
const state = getActionState(subscriptionId);
|
|
334
409
|
listeners.forEach((listener) => listener(state));
|
|
335
410
|
}
|
|
336
411
|
}
|
|
337
|
-
}, 0)
|
|
412
|
+
}, 0),
|
|
338
413
|
);
|
|
339
414
|
}
|
|
340
415
|
|
|
341
|
-
|
|
342
|
-
let handleNotifyTimeout: ReturnType<typeof setTimeout> | null = null;
|
|
343
|
-
|
|
344
|
-
function notifyHandles() {
|
|
345
|
-
if (handleNotifyTimeout !== null) {
|
|
346
|
-
clearTimeout(handleNotifyTimeout);
|
|
347
|
-
}
|
|
348
|
-
handleNotifyTimeout = setTimeout(() => {
|
|
349
|
-
handleNotifyTimeout = null;
|
|
350
|
-
handleListeners.forEach((listener) => listener());
|
|
351
|
-
}, 0);
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
// ========================================================================
|
|
355
|
-
// Derived State
|
|
356
|
-
// ========================================================================
|
|
416
|
+
const notifyHandles = makeDebouncedNotifier(handleListeners);
|
|
357
417
|
|
|
358
418
|
function getState(): DerivedNavigationState {
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
419
|
+
if (cachedDerivedState) return cachedDerivedState;
|
|
420
|
+
|
|
421
|
+
// Skip the spread/filter/map entirely when idle — the common case — and hand
|
|
422
|
+
// back the shared frozen empty list for referential stability.
|
|
423
|
+
const inflightActionsList: InflightAction[] =
|
|
424
|
+
inflightActions.size === 0
|
|
425
|
+
? EMPTY_INFLIGHT_ACTIONS
|
|
426
|
+
: [...inflightActions.values()]
|
|
427
|
+
.filter((a) => a.phase !== "settling")
|
|
428
|
+
.map((a) => ({
|
|
429
|
+
id: a.id,
|
|
430
|
+
actionId: a.actionId,
|
|
431
|
+
payload: a.payload,
|
|
432
|
+
startedAt: a.startedAt,
|
|
433
|
+
}));
|
|
434
|
+
|
|
370
435
|
const hasActiveActions = inflightActionsList.length > 0;
|
|
371
|
-
const
|
|
372
|
-
currentNavigation !== null
|
|
436
|
+
const isVisibleNavigation =
|
|
437
|
+
currentNavigation !== null &&
|
|
438
|
+
!currentNavigation.options?.skipLoadingState;
|
|
439
|
+
const state = isVisibleNavigation || hasActiveActions ? "loading" : "idle";
|
|
373
440
|
|
|
374
|
-
// Streaming: true if any active streams (navigation or action) or loading
|
|
375
441
|
const isStreaming = activeStreamCount > 0 || state === "loading";
|
|
376
442
|
|
|
377
|
-
|
|
443
|
+
cachedDerivedState = {
|
|
378
444
|
state,
|
|
379
445
|
isStreaming,
|
|
446
|
+
// True when a navigation is active (fetching or streaming, before
|
|
447
|
+
// commit). Broader than pendingUrl which clears during streaming.
|
|
448
|
+
isNavigating: currentNavigation !== null,
|
|
380
449
|
location,
|
|
381
|
-
// pendingUrl only during fetching phase - once streaming starts (URL changed), not pending
|
|
382
|
-
|
|
450
|
+
// pendingUrl only during fetching phase - once streaming starts (URL changed), not pending.
|
|
451
|
+
// Background revalidations (skipLoadingState) don't expose a pending URL.
|
|
452
|
+
pendingUrl:
|
|
453
|
+
currentNavigation?.phase === "fetching" &&
|
|
454
|
+
!currentNavigation.options?.skipLoadingState
|
|
455
|
+
? currentNavigation.url
|
|
456
|
+
: null,
|
|
383
457
|
inflightActions: inflightActionsList,
|
|
384
458
|
};
|
|
459
|
+
return cachedDerivedState;
|
|
385
460
|
}
|
|
386
461
|
|
|
387
462
|
function getActionState(actionId: string): TrackedActionState {
|
|
388
|
-
//
|
|
389
|
-
//
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
463
|
+
// Nothing inflight — skip building/scanning the list and return the shared
|
|
464
|
+
// idle snapshot (the same reference use-action falls back to).
|
|
465
|
+
if (inflightActions.size === 0) return DEFAULT_ACTION_STATE;
|
|
466
|
+
|
|
467
|
+
const entry = [...inflightActions.values()]
|
|
468
|
+
.filter((a) => matchesActionId(actionId, a.actionId))
|
|
469
|
+
.reduce<ActionEntry | undefined>((best, a) => {
|
|
470
|
+
if (!best) return a;
|
|
471
|
+
const aActive = a.phase !== "settling";
|
|
472
|
+
const bActive = best.phase !== "settling";
|
|
473
|
+
if (aActive !== bActive) return aActive ? a : best;
|
|
474
|
+
return a.startedAt > best.startedAt ? a : best;
|
|
475
|
+
}, undefined);
|
|
400
476
|
|
|
401
477
|
if (!entry) {
|
|
402
478
|
return { ...DEFAULT_ACTION_STATE };
|
|
403
479
|
}
|
|
404
480
|
|
|
405
|
-
// Derive state from phase
|
|
406
481
|
let state: ActionLifecycleState;
|
|
407
482
|
switch (entry.phase) {
|
|
408
483
|
case "fetching":
|
|
@@ -431,7 +506,7 @@ export function createEventController(
|
|
|
431
506
|
|
|
432
507
|
function startNavigation(
|
|
433
508
|
url: string,
|
|
434
|
-
options?: NavigateOptions
|
|
509
|
+
options?: NavigateOptions & { skipLoadingState?: boolean },
|
|
435
510
|
): NavigationHandle {
|
|
436
511
|
// Cancel existing navigation (switchMap semantics)
|
|
437
512
|
if (currentNavigation) {
|
|
@@ -463,6 +538,7 @@ export function createEventController(
|
|
|
463
538
|
|
|
464
539
|
startStreaming(): StreamingToken {
|
|
465
540
|
let ended = false;
|
|
541
|
+
entry.phase = "streaming";
|
|
466
542
|
activeStreamCount++;
|
|
467
543
|
notify();
|
|
468
544
|
|
|
@@ -516,12 +592,45 @@ export function createEventController(
|
|
|
516
592
|
// Action Operations
|
|
517
593
|
// ========================================================================
|
|
518
594
|
|
|
519
|
-
function startAction(
|
|
595
|
+
function startAction(
|
|
596
|
+
actionId: string,
|
|
597
|
+
args: unknown[],
|
|
598
|
+
cohort?: string,
|
|
599
|
+
): ActionHandle {
|
|
520
600
|
const id = `${actionId}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
601
|
+
// Private to this handle: never exposed on the returned ActionHandle.
|
|
602
|
+
const dispatchSeq = actionDispatchSeq++;
|
|
521
603
|
const abort = new AbortController();
|
|
522
604
|
|
|
523
|
-
//
|
|
524
|
-
|
|
605
|
+
// Register this action under its cohort (originating history entry). The
|
|
606
|
+
// cohort's arbitration is created on first use and freed when its last
|
|
607
|
+
// action settles (see doSettle). Keyless entries share the "" cohort.
|
|
608
|
+
const cohortId = cohort ?? "";
|
|
609
|
+
let arb = cohortArbitration.get(cohortId);
|
|
610
|
+
if (!arb) {
|
|
611
|
+
arb = { keySeq: new Map<string, number>(), inflight: 0 };
|
|
612
|
+
cohortArbitration.set(cohortId, arb);
|
|
613
|
+
}
|
|
614
|
+
// const so the captured reference stays non-undefined inside doSettle.
|
|
615
|
+
const arbitration = arb;
|
|
616
|
+
arbitration.inflight++;
|
|
617
|
+
|
|
618
|
+
// Track if this action started while another was genuinely in-flight.
|
|
619
|
+
// Completed entries don't count: complete()/fail() ran, so the prior
|
|
620
|
+
// action's response was fully processed and applied — a request dispatched
|
|
621
|
+
// after that point is strictly ordered behind the prior action's server
|
|
622
|
+
// execution, and there is no skipped render or order uncertainty for
|
|
623
|
+
// consolidation to repair. Completed entries still linger in the map for
|
|
624
|
+
// the 100ms doSettle window (useAction reads) and, on a slow connection,
|
|
625
|
+
// while the Flight stream drains its EOF after complete(). Counting them
|
|
626
|
+
// latched hadAnyConcurrentActions for back-to-back sequential actions,
|
|
627
|
+
// which made the LAST action classify as consolidation-needed; the
|
|
628
|
+
// consolidation refetch omits every concurrently-revalidated segment id
|
|
629
|
+
// from _rsc_segments, so the server re-ran gated loaders as "new-segment"
|
|
630
|
+
// — bypassing revalidate(({ isAction }) => ...) on a plain GET (#675).
|
|
631
|
+
const hadConcurrent = [...inflightActions.values()].some(
|
|
632
|
+
(a) => !a.completed,
|
|
633
|
+
);
|
|
525
634
|
if (hadConcurrent) {
|
|
526
635
|
hadAnyConcurrentActions = true;
|
|
527
636
|
}
|
|
@@ -543,11 +652,28 @@ export function createEventController(
|
|
|
543
652
|
let settled = false;
|
|
544
653
|
let streamingEnded = false;
|
|
545
654
|
let actionCompleted = false;
|
|
655
|
+
let cohortReleased = false;
|
|
546
656
|
let pendingResult:
|
|
547
657
|
| { type: "success"; value?: unknown }
|
|
548
658
|
| { type: "error"; value: unknown }
|
|
549
659
|
| null = null;
|
|
550
660
|
|
|
661
|
+
// Release this action's hold on its cohort arbitration exactly once: drop
|
|
662
|
+
// the refcount and, only if the map still points at THIS arbitration object,
|
|
663
|
+
// delete it. A newer generation may have replaced it (e.g. abortAllActions
|
|
664
|
+
// cleared the map and a fresh action recreated the same cohort id), so a
|
|
665
|
+
// stale settlement must never delete the newer one by id.
|
|
666
|
+
function releaseCohort() {
|
|
667
|
+
if (cohortReleased) return;
|
|
668
|
+
cohortReleased = true;
|
|
669
|
+
if (
|
|
670
|
+
--arbitration.inflight <= 0 &&
|
|
671
|
+
cohortArbitration.get(cohortId) === arbitration
|
|
672
|
+
) {
|
|
673
|
+
cohortArbitration.delete(cohortId);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
|
|
551
677
|
function doSettle() {
|
|
552
678
|
if (settled) return;
|
|
553
679
|
settled = true;
|
|
@@ -555,6 +681,9 @@ export function createEventController(
|
|
|
555
681
|
// Cleanup after brief delay (allow useAction to read result)
|
|
556
682
|
setTimeout(() => {
|
|
557
683
|
inflightActions.delete(id);
|
|
684
|
+
// Free this cohort's arbitration once its last action has settled, so
|
|
685
|
+
// a long-running action elsewhere cannot pin keys from a drained entry.
|
|
686
|
+
releaseCohort();
|
|
558
687
|
// Check for consolidation
|
|
559
688
|
if (inflightActions.size === 0) {
|
|
560
689
|
// All actions done - reset tracking
|
|
@@ -583,6 +712,19 @@ export function createEventController(
|
|
|
583
712
|
doSettle();
|
|
584
713
|
}
|
|
585
714
|
|
|
715
|
+
// streamingEnded is forced here for the "streaming never started" case so
|
|
716
|
+
// tryFinalize can run; otherwise the streaming token's end() finalizes.
|
|
717
|
+
function settleWith(result: NonNullable<typeof pendingResult>) {
|
|
718
|
+
if (!inflightActions.has(id) || settled) return;
|
|
719
|
+
actionCompleted = true;
|
|
720
|
+
entry.completed = true;
|
|
721
|
+
pendingResult = result;
|
|
722
|
+
if (entry.phase === "fetching" || streamingEnded) {
|
|
723
|
+
streamingEnded = true;
|
|
724
|
+
tryFinalize();
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
|
|
586
728
|
return {
|
|
587
729
|
id,
|
|
588
730
|
abort,
|
|
@@ -618,56 +760,36 @@ export function createEventController(
|
|
|
618
760
|
segmentIds.forEach((id) => concurrentRevalidatedSegments.add(id));
|
|
619
761
|
},
|
|
620
762
|
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
763
|
+
claimLocationState(state: Record<string, unknown>) {
|
|
764
|
+
const winning: Record<string, unknown> = {};
|
|
765
|
+
// Arbitrate against this action's OWN captured arbitration object, not a
|
|
766
|
+
// live map lookup: a concurrent map clear/replace (abortAllActions, a
|
|
767
|
+
// stale settlement) must not make this action silently stop recording
|
|
768
|
+
// and accept every key.
|
|
769
|
+
const keySeq = arbitration.keySeq;
|
|
770
|
+
for (const key of Object.keys(state)) {
|
|
771
|
+
const prevSeq = keySeq.get(key);
|
|
772
|
+
// Strictly-greater: a later-initiated action wins a key over an
|
|
773
|
+
// earlier one in the same cohort regardless of arrival order. Equal
|
|
774
|
+
// cannot happen (dispatchSeq is unique per action).
|
|
775
|
+
if (prevSeq === undefined || dispatchSeq > prevSeq) {
|
|
776
|
+
keySeq.set(key, dispatchSeq);
|
|
777
|
+
winning[key] = state[key];
|
|
778
|
+
}
|
|
633
779
|
}
|
|
634
|
-
|
|
780
|
+
return winning;
|
|
635
781
|
},
|
|
636
782
|
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
actionCompleted = true;
|
|
641
|
-
entry.completed = true;
|
|
642
|
-
pendingResult = { type: "error", value: error };
|
|
643
|
-
|
|
644
|
-
// If streaming never started or already ended, finalize immediately
|
|
645
|
-
// Otherwise wait for streaming to end
|
|
646
|
-
if (entry.phase === "fetching" || streamingEnded) {
|
|
647
|
-
streamingEnded = true; // Mark as ended if never started
|
|
648
|
-
tryFinalize();
|
|
649
|
-
}
|
|
650
|
-
// If streaming is in progress, tryFinalize() will be called when streaming ends
|
|
783
|
+
complete(result?: unknown) {
|
|
784
|
+
settleWith({ type: "success", value: result });
|
|
651
785
|
},
|
|
652
786
|
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
// Count actions that are still fetching (waiting for server response)
|
|
657
|
-
const stillFetchingCount = [...inflightActions.values()].filter(
|
|
658
|
-
(a) => a.phase === "fetching"
|
|
659
|
-
).length;
|
|
787
|
+
fail(error: unknown) {
|
|
788
|
+
settleWith({ type: "error", value: error });
|
|
789
|
+
},
|
|
660
790
|
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
}
|
|
664
|
-
if (!hadAnyConcurrentActions) {
|
|
665
|
-
return null; // No concurrent actions occurred
|
|
666
|
-
}
|
|
667
|
-
if (concurrentRevalidatedSegments.size === 0) {
|
|
668
|
-
return null; // No segments to consolidate
|
|
669
|
-
}
|
|
670
|
-
return Array.from(concurrentRevalidatedSegments);
|
|
791
|
+
getRevalidatedSegments(): Set<string> {
|
|
792
|
+
return concurrentRevalidatedSegments;
|
|
671
793
|
},
|
|
672
794
|
|
|
673
795
|
clearConsolidation() {
|
|
@@ -679,6 +801,10 @@ export function createEventController(
|
|
|
679
801
|
[Symbol.dispose]() {
|
|
680
802
|
// If aborted, another navigation/error took over - don't touch state
|
|
681
803
|
if (abort.signal.aborted) {
|
|
804
|
+
// Aborted actions skip doSettle, so release the cohort hold here to
|
|
805
|
+
// keep the per-cohort refcount balanced (no leak when an action is
|
|
806
|
+
// aborted individually rather than via abortAllActions).
|
|
807
|
+
releaseCohort();
|
|
682
808
|
inflightActions.delete(id);
|
|
683
809
|
notify();
|
|
684
810
|
notifyAction(actionId);
|
|
@@ -702,16 +828,27 @@ export function createEventController(
|
|
|
702
828
|
}
|
|
703
829
|
|
|
704
830
|
function abortAllActions() {
|
|
705
|
-
for (const entry of inflightActions
|
|
831
|
+
for (const [id, entry] of inflightActions) {
|
|
832
|
+
// Preserve settling entries — they have already been handled by
|
|
833
|
+
// fail()/complete() and will self-cleanup via the settlement timeout.
|
|
834
|
+
// Clearing them here would prevent debounced notifications from
|
|
835
|
+
// delivering the error/result state to subscribers.
|
|
836
|
+
if (entry.phase === "settling") continue;
|
|
706
837
|
entry.abort.abort();
|
|
838
|
+
inflightActions.delete(id);
|
|
707
839
|
}
|
|
708
|
-
inflightActions.clear();
|
|
709
840
|
hadAnyConcurrentActions = false;
|
|
710
841
|
concurrentRevalidatedSegments.clear();
|
|
842
|
+
cohortArbitration.clear();
|
|
711
843
|
notify();
|
|
712
|
-
// Notify all action listeners
|
|
713
|
-
|
|
714
|
-
|
|
844
|
+
// Notify all action listeners directly by subscription ID.
|
|
845
|
+
// actionListeners keys are subscription IDs (possibly short names like
|
|
846
|
+
// "addToCart"), not full entry actionIds. Passing them to notifyAction
|
|
847
|
+
// would fail the suffix matcher — instead, notify each subscriber with
|
|
848
|
+
// its own state.
|
|
849
|
+
for (const [subscriptionId, listeners] of actionListeners) {
|
|
850
|
+
const state = getActionState(subscriptionId);
|
|
851
|
+
listeners.forEach((listener) => listener(state));
|
|
715
852
|
}
|
|
716
853
|
}
|
|
717
854
|
|
|
@@ -719,24 +856,17 @@ export function createEventController(
|
|
|
719
856
|
// Handle Operations
|
|
720
857
|
// ========================================================================
|
|
721
858
|
|
|
722
|
-
/**
|
|
723
|
-
* Filter segment IDs to only include routes and layouts.
|
|
724
|
-
* Excludes parallels (contain .@) and loaders (contain D followed by digit).
|
|
725
|
-
*/
|
|
726
|
-
function filterSegmentOrder(matched: string[]): string[] {
|
|
727
|
-
return matched.filter((id) => {
|
|
728
|
-
if (id.includes(".@")) return false;
|
|
729
|
-
if (/D\d+\./.test(id)) return false;
|
|
730
|
-
return true;
|
|
731
|
-
});
|
|
732
|
-
}
|
|
733
|
-
|
|
734
859
|
function setHandleData(
|
|
735
860
|
data: HandleData,
|
|
736
861
|
matched?: string[],
|
|
737
|
-
isPartial?: boolean
|
|
862
|
+
isPartial?: boolean,
|
|
863
|
+
resolvedIds?: string[],
|
|
738
864
|
): void {
|
|
739
|
-
const
|
|
865
|
+
const rawMatched = matched ?? [];
|
|
866
|
+
const newSegmentOrder = filterSegmentOrder(rawMatched);
|
|
867
|
+
// Separate list for useSegments(): "layouts and routes only" — strip
|
|
868
|
+
// parallels (".@") and loader sub-ids (D digit) without reordering.
|
|
869
|
+
const newRouteSegmentIds = filterRouteSegmentIds(rawMatched);
|
|
740
870
|
|
|
741
871
|
if (isPartial && newSegmentOrder.length > 0) {
|
|
742
872
|
// Partial update: merge new data with existing
|
|
@@ -748,10 +878,19 @@ export function createEventController(
|
|
|
748
878
|
handleData[handleName][segmentId] = data[handleName][segmentId];
|
|
749
879
|
}
|
|
750
880
|
}
|
|
751
|
-
|
|
881
|
+
const resolvedIdSet =
|
|
882
|
+
resolvedIds && resolvedIds.length > 0 ? new Set(resolvedIds) : null;
|
|
883
|
+
// Cleanup pass:
|
|
884
|
+
// a) segment dropped from the match list — delete its bucket.
|
|
885
|
+
// b) segment was re-resolved this request but pushed nothing for
|
|
886
|
+
// this handle — its previous bucket is stale.
|
|
887
|
+
// (a) is the existing behavior; (b) requires resolvedIds.
|
|
752
888
|
for (const handleName of Object.keys(handleData)) {
|
|
753
889
|
for (const segmentId of Object.keys(handleData[handleName])) {
|
|
754
|
-
|
|
890
|
+
const droppedFromMatch = !newSegmentOrder.includes(segmentId);
|
|
891
|
+
const reresolvedWithoutPush =
|
|
892
|
+
resolvedIdSet?.has(segmentId) && !data[handleName]?.[segmentId];
|
|
893
|
+
if (droppedFromMatch || reresolvedWithoutPush) {
|
|
755
894
|
delete handleData[handleName][segmentId];
|
|
756
895
|
}
|
|
757
896
|
}
|
|
@@ -761,6 +900,7 @@ export function createEventController(
|
|
|
761
900
|
handleData = data;
|
|
762
901
|
}
|
|
763
902
|
handleSegmentOrder = newSegmentOrder;
|
|
903
|
+
routeSegmentIds = newRouteSegmentIds;
|
|
764
904
|
|
|
765
905
|
notifyHandles();
|
|
766
906
|
}
|
|
@@ -769,9 +909,22 @@ export function createEventController(
|
|
|
769
909
|
return {
|
|
770
910
|
data: handleData,
|
|
771
911
|
segmentOrder: handleSegmentOrder,
|
|
912
|
+
routeSegmentIds,
|
|
772
913
|
};
|
|
773
914
|
}
|
|
774
915
|
|
|
916
|
+
function setRouteSegmentIds(matched: string[]): void {
|
|
917
|
+
const next = filterRouteSegmentIds(matched);
|
|
918
|
+
if (
|
|
919
|
+
next.length === routeSegmentIds.length &&
|
|
920
|
+
next.every((id, i) => id === routeSegmentIds[i])
|
|
921
|
+
) {
|
|
922
|
+
return;
|
|
923
|
+
}
|
|
924
|
+
routeSegmentIds = next;
|
|
925
|
+
notifyHandles();
|
|
926
|
+
}
|
|
927
|
+
|
|
775
928
|
// ========================================================================
|
|
776
929
|
// Subscriptions
|
|
777
930
|
// ========================================================================
|
|
@@ -783,7 +936,7 @@ export function createEventController(
|
|
|
783
936
|
|
|
784
937
|
function subscribeToAction(
|
|
785
938
|
actionId: string,
|
|
786
|
-
listener: ActionStateListener
|
|
939
|
+
listener: ActionStateListener,
|
|
787
940
|
): () => void {
|
|
788
941
|
let listeners = actionListeners.get(actionId);
|
|
789
942
|
if (!listeners) {
|
|
@@ -805,6 +958,19 @@ export function createEventController(
|
|
|
805
958
|
return () => handleListeners.delete(listener);
|
|
806
959
|
}
|
|
807
960
|
|
|
961
|
+
// ========================================================================
|
|
962
|
+
// Params Operations
|
|
963
|
+
// ========================================================================
|
|
964
|
+
|
|
965
|
+
function setParams(params: Record<string, string>): void {
|
|
966
|
+
routeParams = params;
|
|
967
|
+
notify();
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
function getParams(): Record<string, string> {
|
|
971
|
+
return routeParams;
|
|
972
|
+
}
|
|
973
|
+
|
|
808
974
|
// ========================================================================
|
|
809
975
|
// Return Controller
|
|
810
976
|
// ========================================================================
|
|
@@ -821,11 +987,17 @@ export function createEventController(
|
|
|
821
987
|
// State
|
|
822
988
|
getState,
|
|
823
989
|
getActionState,
|
|
990
|
+
getLocation: () => location,
|
|
824
991
|
setLocation,
|
|
825
992
|
|
|
826
993
|
// Handles
|
|
827
994
|
setHandleData,
|
|
828
995
|
getHandleState,
|
|
996
|
+
setRouteSegmentIds,
|
|
997
|
+
|
|
998
|
+
// Params
|
|
999
|
+
setParams,
|
|
1000
|
+
getParams,
|
|
829
1001
|
|
|
830
1002
|
// Subscriptions
|
|
831
1003
|
subscribe,
|
|
@@ -835,42 +1007,6 @@ export function createEventController(
|
|
|
835
1007
|
// Direct access
|
|
836
1008
|
getCurrentNavigation: () => currentNavigation,
|
|
837
1009
|
getInflightActions: () => inflightActions,
|
|
1010
|
+
hadAnyConcurrentActions: () => hadAnyConcurrentActions,
|
|
838
1011
|
};
|
|
839
1012
|
}
|
|
840
|
-
|
|
841
|
-
// ============================================================================
|
|
842
|
-
// Singleton
|
|
843
|
-
// ============================================================================
|
|
844
|
-
|
|
845
|
-
let controllerInstance: EventController | null = null;
|
|
846
|
-
|
|
847
|
-
/**
|
|
848
|
-
* Initialize the global event controller
|
|
849
|
-
*/
|
|
850
|
-
export function initEventController(
|
|
851
|
-
config?: EventControllerConfig
|
|
852
|
-
): EventController {
|
|
853
|
-
if (!controllerInstance) {
|
|
854
|
-
controllerInstance = createEventController(config);
|
|
855
|
-
}
|
|
856
|
-
return controllerInstance;
|
|
857
|
-
}
|
|
858
|
-
|
|
859
|
-
/**
|
|
860
|
-
* Get the global event controller
|
|
861
|
-
*/
|
|
862
|
-
export function getEventController(): EventController {
|
|
863
|
-
if (!controllerInstance) {
|
|
864
|
-
throw new Error(
|
|
865
|
-
"Event controller not initialized. Call initEventController first."
|
|
866
|
-
);
|
|
867
|
-
}
|
|
868
|
-
return controllerInstance;
|
|
869
|
-
}
|
|
870
|
-
|
|
871
|
-
/**
|
|
872
|
-
* Reset the controller instance (for testing)
|
|
873
|
-
*/
|
|
874
|
-
export function resetEventController(): void {
|
|
875
|
-
controllerInstance = null;
|
|
876
|
-
}
|