@rangojs/router 0.0.0-experimental.23 → 0.0.0-experimental.24535dcb
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 +11 -3
- package/README.md +303 -740
- 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 +730 -184
- 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 -28
- 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/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -10
- 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 +4373 -1328
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +96 -24
- 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 +251 -24
- package/skills/caching/SKILL.md +375 -17
- 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 +110 -4
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +5 -3
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +87 -56
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +73 -690
- 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 +129 -27
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +94 -18
- package/skills/layout/SKILL.md +62 -19
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +319 -31
- package/skills/middleware/SKILL.md +59 -16
- 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 +29 -2
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +225 -10
- package/skills/ppr/SKILL.md +616 -0
- package/skills/prerender/SKILL.md +178 -124
- package/skills/rango/SKILL.md +318 -24
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +138 -49
- package/skills/route/SKILL.md +175 -13
- package/skills/router-setup/SKILL.md +137 -12
- 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 +130 -0
- 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 +1 -1
- package/skills/typesafety/SKILL.md +45 -614
- 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 +74 -15
- 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 +67 -40
- package/src/browser/action-coordinator.ts +53 -36
- 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 +257 -158
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +4 -0
- package/src/browser/logging.ts +28 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-bridge.ts +212 -34
- package/src/browser/navigation-client.ts +233 -58
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +203 -80
- package/src/browser/navigation-transaction.ts +18 -66
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +242 -126
- package/src/browser/prefetch/cache.ts +344 -30
- package/src/browser/prefetch/fetch.ts +373 -48
- package/src/browser/prefetch/policy.ts +6 -0
- package/src/browser/prefetch/queue.ts +144 -23
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +135 -18
- package/src/browser/react/NavigationProvider.tsx +240 -122
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +66 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +178 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +23 -69
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +32 -7
- package/src/browser/react/use-params.ts +20 -10
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +46 -11
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +99 -8
- package/src/browser/rsc-router.tsx +276 -76
- package/src/browser/scroll-restoration.ts +61 -47
- package/src/browser/segment-reconciler.ts +44 -7
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +244 -71
- package/src/browser/types.ts +160 -12
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +207 -158
- package/src/build/generate-route-types.ts +6 -1
- package/src/build/index.ts +11 -3
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +215 -42
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +16 -5
- package/src/build/route-types/include-resolution.ts +464 -63
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +22 -6
- package/src/build/route-types/router-processing.ts +336 -110
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +13 -21
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +58 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +436 -69
- package/src/cache/cache-scope.ts +235 -103
- 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 +2442 -170
- 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 +11 -17
- package/src/cache/document-cache.ts +144 -49
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +24 -20
- package/src/cache/memory-segment-store.ts +243 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +13 -21
- package/src/cache/shell-snapshot.ts +417 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +55 -0
- package/src/cache/types.ts +180 -99
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1127 -0
- package/src/client.rsc.tsx +42 -21
- package/src/client.tsx +117 -336
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +84 -2
- package/src/debug.ts +2 -2
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +30 -4
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +104 -34
- package/src/handles/MetaTags.tsx +24 -53
- 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 +14 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +13 -22
- package/src/host/index.ts +9 -2
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +84 -29
- package/src/index.ts +134 -43
- package/src/internal-debug.ts +11 -10
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +37 -41
- package/src/prerender.ts +215 -86
- 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 +65 -15
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +19 -77
- package/src/route-definition/dsl-helpers.ts +485 -303
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +153 -77
- package/src/route-definition/index.ts +4 -2
- package/src/route-definition/redirect.ts +53 -12
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +48 -21
- package/src/route-types.ts +37 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +164 -17
- package/src/router/error-handling.ts +45 -18
- package/src/router/find-match.ts +130 -29
- package/src/router/handler-context.ts +110 -39
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +50 -24
- package/src/router/lazy-includes.ts +89 -63
- package/src/router/loader-resolution.ts +286 -56
- package/src/router/logging.ts +5 -8
- package/src/router/manifest.ts +105 -56
- package/src/router/match-api.ts +179 -219
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +211 -165
- package/src/router/match-middleware/background-revalidation.ts +66 -22
- package/src/router/match-middleware/cache-lookup.ts +214 -263
- package/src/router/match-middleware/cache-store.ts +105 -50
- package/src/router/match-middleware/intercept-resolution.ts +8 -28
- package/src/router/match-middleware/segment-resolution.ts +52 -18
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +127 -52
- package/src/router/metrics.ts +158 -47
- package/src/router/middleware-types.ts +22 -120
- package/src/router/middleware.ts +398 -231
- 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 +183 -137
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +207 -58
- package/src/router/preview-match.ts +35 -103
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +144 -74
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +11 -29
- package/src/router/router-interfaces.ts +160 -36
- package/src/router/router-options.ts +214 -22
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +301 -78
- package/src/router/segment-resolution/helpers.ts +116 -31
- package/src/router/segment-resolution/loader-cache.ts +140 -39
- package/src/router/segment-resolution/loader-mask.ts +67 -0
- package/src/router/segment-resolution/loader-snapshot.ts +251 -0
- package/src/router/segment-resolution/revalidation.ts +478 -388
- package/src/router/segment-resolution/static-store.ts +19 -5
- 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 +5 -1
- package/src/router/segment-wrappers.ts +8 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +160 -200
- package/src/router/telemetry.ts +105 -20
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +188 -58
- package/src/router/types.ts +10 -63
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +222 -67
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +726 -457
- package/src/rsc/helpers.ts +168 -46
- package/src/rsc/index.ts +2 -5
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +127 -31
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +159 -23
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +99 -189
- package/src/rsc/rsc-rendering.ts +479 -104
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +293 -115
- package/src/rsc/shell-capture.ts +1158 -0
- package/src/rsc/shell-serve.ts +150 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +64 -6
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +49 -41
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +418 -131
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +367 -61
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +152 -5
- package/src/server/handle-store.ts +40 -38
- package/src/server/loader-registry.ts +38 -46
- package/src/server/request-context.ts +576 -176
- package/src/ssr/index.tsx +467 -174
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +27 -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 +371 -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 +357 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -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 +56 -84
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +17 -8
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +237 -89
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +44 -15
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +23 -46
- package/src/types/route-entry.ts +19 -7
- package/src/types/segments.ts +137 -19
- package/src/urls/include-helper.ts +40 -75
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +2 -11
- package/src/urls/path-helper-types.ts +102 -23
- package/src/urls/path-helper.ts +62 -111
- package/src/urls/pattern-types.ts +84 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +98 -154
- package/src/urls/urls-function.ts +1 -19
- package/src/use-loader.tsx +346 -89
- 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 +36 -38
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +130 -85
- 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 +214 -132
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +57 -6
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +19 -3
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +234 -62
- package/src/vite/plugins/cjs-to-esm.ts +16 -19
- package/src/vite/plugins/client-ref-dedup.ts +16 -11
- package/src/vite/plugins/client-ref-hashing.ts +28 -15
- 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/plugins/expose-action-id.ts +49 -98
- package/src/vite/plugins/expose-id-utils.ts +96 -51
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
- package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
- package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
- package/src/vite/plugins/expose-internal-ids.ts +553 -317
- 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 +73 -83
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +40 -29
- package/src/vite/plugins/version-plugin.ts +46 -37
- package/src/vite/plugins/virtual-entries.ts +138 -27
- package/src/vite/rango.ts +353 -303
- package/src/vite/router-discovery.ts +1090 -166
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/bundle-analysis.ts +10 -15
- 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 +4 -59
- package/src/vite/utils/package-resolution.ts +20 -52
- package/src/vite/utils/prerender-utils.ts +98 -38
- package/src/vite/utils/shared-utils.ts +144 -44
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/shallow.ts +0 -40
- package/src/router/middleware-cookies.ts +0 -55
|
@@ -20,7 +20,11 @@ import {
|
|
|
20
20
|
encodeReply,
|
|
21
21
|
createClientTemporaryReferenceSet,
|
|
22
22
|
} from "@vitejs/plugin-rsc/rsc";
|
|
23
|
-
import {
|
|
23
|
+
import {
|
|
24
|
+
getRequestContext,
|
|
25
|
+
runWithRequestContext,
|
|
26
|
+
} from "../server/request-context.js";
|
|
27
|
+
import { isUnderTestRunner } from "../runtime-env.js";
|
|
24
28
|
import {
|
|
25
29
|
isTainted,
|
|
26
30
|
CACHED_FN_SYMBOL,
|
|
@@ -32,22 +36,177 @@ import {
|
|
|
32
36
|
export { isCachedFunction };
|
|
33
37
|
import { serializeResult, deserializeResult } from "./segment-codec.js";
|
|
34
38
|
import { createHandleStore } from "../server/handle-store.js";
|
|
35
|
-
import {
|
|
39
|
+
import {
|
|
40
|
+
restoreHandles,
|
|
41
|
+
encodeHandles,
|
|
42
|
+
decodeHandles,
|
|
43
|
+
} from "./handle-snapshot.js";
|
|
36
44
|
import { startHandleCapture, type HandleCapture } from "./handle-capture.js";
|
|
37
45
|
import { sortedSearchString } from "./cache-key-utils.js";
|
|
46
|
+
import { encodeKV } from "../encode-kv.js";
|
|
38
47
|
import { runBackground } from "./background-task.js";
|
|
48
|
+
import {
|
|
49
|
+
normalizeTags,
|
|
50
|
+
recordRequestTags,
|
|
51
|
+
runWithCacheTagScope,
|
|
52
|
+
} from "./cache-tag.js";
|
|
53
|
+
import { reportCacheError } from "./cache-error.js";
|
|
54
|
+
import type { CacheItemResult } from "./types.js";
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* DJB2 hash returning an 8-char hex string. Deterministic across runtimes
|
|
58
|
+
* (no crypto import — cache-runtime runs on the edge). Mirrors prerender's
|
|
59
|
+
* param-hash djb2Hex so binary key parts hash consistently.
|
|
60
|
+
*/
|
|
61
|
+
function djb2HexBytes(bytes: Uint8Array): string {
|
|
62
|
+
let hash = 5381;
|
|
63
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
64
|
+
hash = ((hash << 5) + hash + bytes[i]!) >>> 0;
|
|
65
|
+
}
|
|
66
|
+
return hash.toString(16).padStart(8, "0");
|
|
67
|
+
}
|
|
39
68
|
|
|
40
69
|
/**
|
|
41
70
|
* Convert encodeReply result to a stable string key.
|
|
42
|
-
*
|
|
71
|
+
*
|
|
72
|
+
* encodeReply may return a string or FormData. A plain string is already
|
|
73
|
+
* deterministic for a given arg set, so return it verbatim. FormData (emitted
|
|
74
|
+
* whenever a key arg is a typed array / Blob / File / a large object React
|
|
75
|
+
* lazily chunks) carries a per-call RANDOM multipart boundary
|
|
76
|
+
* (`formdata-undici-<random>`); stringifying the whole body via
|
|
77
|
+
* `new Response(formData).text()` would therefore produce a DIFFERENT key on
|
|
78
|
+
* every call, so the cached function would always miss and the store would
|
|
79
|
+
* accumulate one duplicate entry per call (unbounded growth).
|
|
80
|
+
*
|
|
81
|
+
* Instead derive the key from the entries themselves, independent of the
|
|
82
|
+
* boundary: iterate in sorted-key order and, for each value, emit a
|
|
83
|
+
* boundary-free token — `s:<value>` for strings, `b:<size>:<type>:<name>:<hash>`
|
|
84
|
+
* for Blob/File (bytes folded via djb2 so distinct payloads of equal
|
|
85
|
+
* size/type/name still differ). Strings carry an `s:` type tag so a string whose
|
|
86
|
+
* value happens to equal a blob token (e.g. the literal `b:4::a:b:<hash>`) cannot
|
|
87
|
+
* collide with an actual Blob/File entry under the same FormData key. The
|
|
88
|
+
* user-controlled `type`/`name` are percent-encoded before joining so an embedded
|
|
89
|
+
* `:` cannot shift the field boundaries and collide two distinct files (e.g.
|
|
90
|
+
* {name:"a:b",type:""} vs {name:"b",type:":a"}). The result is stable across
|
|
91
|
+
* identical arg sets.
|
|
43
92
|
*/
|
|
44
|
-
async function replyToCacheKey(
|
|
93
|
+
export async function replyToCacheKey(
|
|
94
|
+
encoded: string | FormData,
|
|
95
|
+
): Promise<string> {
|
|
45
96
|
if (typeof encoded === "string") return encoded;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
97
|
+
|
|
98
|
+
// Snapshot entries synchronously (forEach avoids relying on FormData's
|
|
99
|
+
// iterator typings), then fold any Blob/File bytes asynchronously.
|
|
100
|
+
const raw: [string, FormDataEntryValue][] = [];
|
|
101
|
+
encoded.forEach((value, key) => {
|
|
102
|
+
raw.push([key, value]);
|
|
103
|
+
});
|
|
104
|
+
const pairs: [string, string][] = [];
|
|
105
|
+
for (const [key, value] of raw) {
|
|
106
|
+
if (typeof value === "string") {
|
|
107
|
+
// Type-tag strings with `s:` so a string equal to a blob token (e.g.
|
|
108
|
+
// `b:4::a:b:<hash>`) cannot collide with a Blob/File entry under the same
|
|
109
|
+
// key (which carries the `b:` tag below).
|
|
110
|
+
pairs.push([key, "s:" + value]);
|
|
111
|
+
} else {
|
|
112
|
+
// Blob/File: fold the bytes into a deterministic, boundary-free token.
|
|
113
|
+
// Percent-encode the user-controlled type/name so an embedded `:` cannot
|
|
114
|
+
// shift the `:`-delimited field boundaries and collide distinct files.
|
|
115
|
+
const buf = await value.arrayBuffer();
|
|
116
|
+
const hash = djb2HexBytes(new Uint8Array(buf));
|
|
117
|
+
const name = "name" in value ? value.name : "";
|
|
118
|
+
const encType = encodeURIComponent(value.type);
|
|
119
|
+
const encName = encodeURIComponent(name);
|
|
120
|
+
pairs.push([key, `b:${value.size}:${encType}:${encName}:${hash}`]);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return encodeKV(pairs, { sort: true });
|
|
49
124
|
}
|
|
50
125
|
|
|
126
|
+
// Cached-fn ids already warned about running uncached under a test runner, so
|
|
127
|
+
// the test-ergonomics warning fires once per fn rather than once per call.
|
|
128
|
+
const warnedUncachedUnderTest = new Set<string>();
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Fast-path cache-key builder for JSON-safe key args. Returns a deterministic
|
|
132
|
+
* string (object keys recursively sorted so insertion order can't change the
|
|
133
|
+
* key) when EVERY part is a primitive or a plain object/array of the same, and
|
|
134
|
+
* `undefined` otherwise so the caller falls back to the Flight reply encoder.
|
|
135
|
+
*
|
|
136
|
+
* Strings are always quoted via JSON.stringify, so they can never collide with
|
|
137
|
+
* the bareword encodings of null/true/false/undefined/numbers. Anything the
|
|
138
|
+
* reply encoder must handle instead — functions, symbols, bigint, non-finite
|
|
139
|
+
* numbers, Dates, Maps, class instances, promises, and React elements (whose
|
|
140
|
+
* `$$typeof` symbol value trips the symbol reject) — yields `undefined`.
|
|
141
|
+
*/
|
|
142
|
+
function jsonSafeKeyPart(value: unknown): string | undefined {
|
|
143
|
+
if (value === null) return "null";
|
|
144
|
+
switch (typeof value) {
|
|
145
|
+
case "string":
|
|
146
|
+
return JSON.stringify(value);
|
|
147
|
+
case "boolean":
|
|
148
|
+
return value ? "true" : "false";
|
|
149
|
+
case "number":
|
|
150
|
+
return Number.isFinite(value) ? String(value) : undefined;
|
|
151
|
+
case "undefined":
|
|
152
|
+
return "undefined";
|
|
153
|
+
case "object": {
|
|
154
|
+
if (Array.isArray(value)) {
|
|
155
|
+
const parts: string[] = [];
|
|
156
|
+
for (const item of value) {
|
|
157
|
+
const encoded = jsonSafeKeyPart(item);
|
|
158
|
+
if (encoded === undefined) return undefined;
|
|
159
|
+
parts.push(encoded);
|
|
160
|
+
}
|
|
161
|
+
return `[${parts.join(",")}]`;
|
|
162
|
+
}
|
|
163
|
+
// Only plain objects (Object.prototype or null proto) are fast-path safe.
|
|
164
|
+
// Dates, Maps, class instances, promises, etc. carry a different prototype
|
|
165
|
+
// and fall back to the encoder.
|
|
166
|
+
const proto = Object.getPrototypeOf(value);
|
|
167
|
+
if (proto !== Object.prototype && proto !== null) return undefined;
|
|
168
|
+
const obj = value as Record<string, unknown>;
|
|
169
|
+
const parts: string[] = [];
|
|
170
|
+
for (const key of Object.keys(obj).sort()) {
|
|
171
|
+
const encoded = jsonSafeKeyPart(obj[key]);
|
|
172
|
+
if (encoded === undefined) return undefined;
|
|
173
|
+
parts.push(`${JSON.stringify(key)}:${encoded}`);
|
|
174
|
+
}
|
|
175
|
+
return `{${parts.join(",")}}`;
|
|
176
|
+
}
|
|
177
|
+
default:
|
|
178
|
+
// bigint, symbol, function
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* The serialized product of one "use cache" execution: exactly what the store
|
|
185
|
+
* write persists. Followers that dedup onto an in-flight execution (see
|
|
186
|
+
* inFlightExecutions) await this and serve it as a synthetic cache hit — each
|
|
187
|
+
* deserializing its OWN copy of `serialized` and replaying `handles`/`tags`
|
|
188
|
+
* against its OWN request. A deserialized result object is never shared.
|
|
189
|
+
*/
|
|
190
|
+
interface CacheEnvelope {
|
|
191
|
+
/** RSC-serialized return value (never null — a null serialize rejects). */
|
|
192
|
+
serialized: string;
|
|
193
|
+
/** Merged profile/DSL + runtime cacheTag() tags. */
|
|
194
|
+
tags: string[];
|
|
195
|
+
/** RSC-encoded handle blob captured during execution, if any. */
|
|
196
|
+
handles?: string;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* In-flight "use cache" executions keyed by cache key. When N concurrent calls
|
|
201
|
+
* miss on the same key, only the first (the leader) runs the function; the rest
|
|
202
|
+
* await its {@link CacheEnvelope} and serve it as a synthetic hit rather than
|
|
203
|
+
* re-running the function and re-writing the store. Isolate-scoped (module
|
|
204
|
+
* singleton), and cleared for a key as soon as the leader settles: a rejected
|
|
205
|
+
* leader (function threw, or the result was not serializable) propagates to
|
|
206
|
+
* current waiters, which then retry fresh.
|
|
207
|
+
*/
|
|
208
|
+
const inFlightExecutions = new Map<string, Promise<CacheEnvelope>>();
|
|
209
|
+
|
|
51
210
|
// ============================================================================
|
|
52
211
|
// Core: registerCachedFunction
|
|
53
212
|
// ============================================================================
|
|
@@ -70,9 +229,38 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
70
229
|
const store = requestCtx?._cacheStore;
|
|
71
230
|
const resolvedProfileName = profileName || "default";
|
|
72
231
|
|
|
73
|
-
// Bypass: no store or no getItem support
|
|
232
|
+
// Bypass: no store or no getItem support. Still run inside a tag scope so a
|
|
233
|
+
// cacheTag() call inside the function degrades to a no-op rather than
|
|
234
|
+
// throwing "must be called inside a use cache function" - adopting cacheTag()
|
|
235
|
+
// must not hard-fail in apps/tests without an item-capable cache configured.
|
|
236
|
+
// Note: the INSIDE_CACHE_EXEC guard (cookies()/headers()/ctx.set() rejection)
|
|
237
|
+
// is intentionally NOT stamped here. It is a cached-path-only check; in the
|
|
238
|
+
// bypass the body actually executes, so the guarded side effects take effect
|
|
239
|
+
// and nothing is lost on a (non-existent) hit. Same applies to the
|
|
240
|
+
// non-serializable-args bypass below.
|
|
74
241
|
if (!store?.getItem) {
|
|
75
|
-
|
|
242
|
+
// Test-ergonomics guard: under a test runner, a "use cache" function that
|
|
243
|
+
// executes with no item-capable store seeded is exercising the UNCACHED
|
|
244
|
+
// path — a green test that proves nothing about caching. Warn once per fn
|
|
245
|
+
// id so the author knows to seed a cacheStore. Advisory (never throws), so
|
|
246
|
+
// a test that DELIBERATELY runs uncached is unaffected. Gated on the test
|
|
247
|
+
// runner (process.env.VITEST, not folded) so production never evaluates it.
|
|
248
|
+
if (isUnderTestRunner() && !warnedUncachedUnderTest.has(id)) {
|
|
249
|
+
warnedUncachedUnderTest.add(id);
|
|
250
|
+
console.warn(
|
|
251
|
+
`[rango] "use cache" function "${id}" executed but no cacheStore was ` +
|
|
252
|
+
`seeded; the cached path is NOT under test (it ran uncached). Pass ` +
|
|
253
|
+
`{ cacheStore, cacheProfiles } to runLoader/runMiddleware/renderHandler/` +
|
|
254
|
+
`runInRequestContext (or configure createRouter({ cache }) for dispatch) ` +
|
|
255
|
+
`to exercise it.`,
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
const scoped = runWithCacheTagScope(() => fn.apply(this, args));
|
|
259
|
+
const result = await scoped.result;
|
|
260
|
+
// Still record the runtime tags into the request set so a cacheTag() in an
|
|
261
|
+
// uncached function tags the document, even with no item-capable store.
|
|
262
|
+
recordRequestTags(scoped.tags, requestCtx);
|
|
263
|
+
return result;
|
|
76
264
|
}
|
|
77
265
|
|
|
78
266
|
// Resolve profile strictly from request-scoped config (set by the
|
|
@@ -145,57 +333,95 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
145
333
|
let cacheKey: string;
|
|
146
334
|
try {
|
|
147
335
|
if (keyArgs.length > 0) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
336
|
+
// Fast path: when every key arg is JSON-safe, build the key with a
|
|
337
|
+
// deterministic stable-stringify and skip encodeReply (the Flight reply
|
|
338
|
+
// encoder runs on EVERY call, including hits). The `:j:` namespace keeps
|
|
339
|
+
// these keys disjoint from the encoder path so the two can never collide
|
|
340
|
+
// for one fn id. Entries cached under the old encoder key for JSON-safe
|
|
341
|
+
// args cold-start once after this upgrade.
|
|
342
|
+
const fastKey = jsonSafeKeyPart(keyArgs);
|
|
343
|
+
if (fastKey !== undefined) {
|
|
344
|
+
cacheKey = `use-cache:${id}:j:${fastKey}`;
|
|
345
|
+
} else {
|
|
346
|
+
const tempRefs = createClientTemporaryReferenceSet();
|
|
347
|
+
const encoded = await encodeReply(keyArgs as unknown[], {
|
|
348
|
+
temporaryReferences: tempRefs,
|
|
349
|
+
});
|
|
350
|
+
const argsKey = await replyToCacheKey(encoded);
|
|
351
|
+
cacheKey = `use-cache:${id}:${argsKey}`;
|
|
352
|
+
}
|
|
154
353
|
} else {
|
|
155
354
|
cacheKey = `use-cache:${id}`;
|
|
156
355
|
}
|
|
157
356
|
} catch {
|
|
158
|
-
// Non-serializable args: run uncached
|
|
159
|
-
|
|
357
|
+
// Non-serializable args: run uncached (within a tag scope so cacheTag()
|
|
358
|
+
// still does not throw). Record runtime tags so the document union still
|
|
359
|
+
// sees them even though this call is not itself cached.
|
|
360
|
+
const scoped = runWithCacheTagScope(() => fn.apply(this, args));
|
|
361
|
+
const result = await scoped.result;
|
|
362
|
+
recordRequestTags(scoped.tags, requestCtx);
|
|
363
|
+
return result;
|
|
160
364
|
}
|
|
161
365
|
|
|
162
366
|
// Cache lookup
|
|
163
367
|
const cached = await store.getItem(cacheKey);
|
|
164
368
|
|
|
369
|
+
// Serve a cached entry on the hit path: deserialize the stored value,
|
|
370
|
+
// replay handle data (gated on tainted args), and surface the entry's tags
|
|
371
|
+
// to the request set (the function did not re-run, so its runtime cacheTag()
|
|
372
|
+
// tags are only available from the stored entry). Shared by the fresh-hit
|
|
373
|
+
// and stale-hit branches; the only divergence is the stale branch scheduling
|
|
374
|
+
// background revalidation, which it does after this returns.
|
|
375
|
+
const serveCached = async (entry: CacheItemResult): Promise<any> => {
|
|
376
|
+
const result = await deserializeResult(entry.value);
|
|
377
|
+
if (entry.handles && hasTaintedArgs) {
|
|
378
|
+
const handleStore = requestCtx?._handleStore;
|
|
379
|
+
if (handleStore) {
|
|
380
|
+
const r = await decodeHandles(entry.handles);
|
|
381
|
+
if (r) restoreHandles(r, handleStore);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
recordRequestTags(entry.tags, requestCtx);
|
|
385
|
+
return result;
|
|
386
|
+
};
|
|
387
|
+
|
|
165
388
|
if (cached && !cached.shouldRevalidate) {
|
|
166
389
|
// Fresh hit: deserialize and return
|
|
167
390
|
try {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
// Deserialization failed, fall through to fresh execution
|
|
391
|
+
return await serveCached(cached);
|
|
392
|
+
} catch (error) {
|
|
393
|
+
// The stored value is corrupt/partial (failed RSC deserialize). Report
|
|
394
|
+
// it, then fall through to fresh execution - the miss path below re-runs
|
|
395
|
+
// and setItem() overwrites the faulty entry under the same key (self-heal).
|
|
396
|
+
reportCacheError(
|
|
397
|
+
error,
|
|
398
|
+
"cache-corrupt",
|
|
399
|
+
`[use cache] "${id}" fresh-hit`,
|
|
400
|
+
);
|
|
179
401
|
}
|
|
180
402
|
}
|
|
181
403
|
|
|
182
|
-
|
|
404
|
+
// foregroundOnAction (opt-in; see CacheProfile.foregroundOnAction): during an
|
|
405
|
+
// action's revalidation render, a stale entry falls through to the foreground
|
|
406
|
+
// miss path below instead of SWR. The flag is set by revalidateAfterAction.
|
|
407
|
+
const foregroundOnActionRevalidation =
|
|
408
|
+
requestCtx?._inActionRevalidation === true &&
|
|
409
|
+
profile.foregroundOnAction === true;
|
|
410
|
+
if (cached?.shouldRevalidate && !foregroundOnActionRevalidation) {
|
|
183
411
|
// Stale hit: return stale value, revalidate in background
|
|
184
412
|
try {
|
|
185
|
-
const result = await
|
|
186
|
-
if (cached.handles && hasTaintedArgs) {
|
|
187
|
-
const handleStore = requestCtx?._handleStore;
|
|
188
|
-
if (handleStore) {
|
|
189
|
-
restoreHandles(cached.handles, handleStore);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
413
|
+
const result = await serveCached(cached);
|
|
192
414
|
// Background revalidation — must capture handles if tainted args present.
|
|
193
415
|
// Use an isolated handle store so background pushes don't pollute the
|
|
194
416
|
// live response or throw LateHandlePushError on the completed store.
|
|
195
417
|
// Same isolation pattern as route-level background-revalidation.ts.
|
|
196
418
|
runBackground(requestCtx, async () => {
|
|
197
|
-
//
|
|
198
|
-
//
|
|
419
|
+
// The closure-captured requestCtx is reused for the framework's own
|
|
420
|
+
// reads (handle store swap, error reporting) AND, below, to
|
|
421
|
+
// re-establish the request-context ALS around the user fn. ALS context
|
|
422
|
+
// may be gone inside waitUntil: on workerd a waitUntil task runs
|
|
423
|
+
// detached from the request's I/O context, so getRequestContext()
|
|
424
|
+
// inside the cached body would otherwise throw.
|
|
199
425
|
let originalHandleStore:
|
|
200
426
|
| ReturnType<typeof createHandleStore>
|
|
201
427
|
| undefined;
|
|
@@ -214,11 +440,21 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
214
440
|
bgStopCapture = c.stop;
|
|
215
441
|
}
|
|
216
442
|
|
|
217
|
-
// Stamp tainted
|
|
218
|
-
//
|
|
219
|
-
//
|
|
220
|
-
//
|
|
221
|
-
//
|
|
443
|
+
// Stamp tainted ARGS only — not requestCtx. The args stamp guards
|
|
444
|
+
// direct ctx method calls (ctx.set, ctx.header, ctx.onResponse, etc.)
|
|
445
|
+
// which is sufficient for correctness.
|
|
446
|
+
//
|
|
447
|
+
// We intentionally skip stamping requestCtx here because:
|
|
448
|
+
// 1. runBackground starts the async task synchronously (before the
|
|
449
|
+
// first await), so stampCacheExec would pollute the shared
|
|
450
|
+
// requestCtx while the foreground pipeline is still running.
|
|
451
|
+
// This causes assertNotInsideCacheExec to fire when cache-store
|
|
452
|
+
// later calls requestCtx.onResponse().
|
|
453
|
+
// 2. requestCtx methods are closure-bound to the original ctx, so
|
|
454
|
+
// neither Object.create() nor a proxy can isolate the stamp.
|
|
455
|
+
// 3. The foreground miss path already stamps requestCtx and catches
|
|
456
|
+
// cookies()/headers() misuse on first execution. The background
|
|
457
|
+
// re-runs the same function with the same request.
|
|
222
458
|
const bgTaintedArgs: unknown[] = [];
|
|
223
459
|
for (const arg of args) {
|
|
224
460
|
if (isTainted(arg)) {
|
|
@@ -226,32 +462,55 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
226
462
|
bgTaintedArgs.push(arg);
|
|
227
463
|
}
|
|
228
464
|
}
|
|
229
|
-
if (requestCtx) {
|
|
230
|
-
stampCacheExec(requestCtx as object);
|
|
231
|
-
}
|
|
232
465
|
|
|
233
466
|
try {
|
|
234
|
-
|
|
467
|
+
// Re-establish the request-context ALS so a "use cache" body that
|
|
468
|
+
// reads the ambient getRequestContext() (e.g.
|
|
469
|
+
// getRequestContext().env.ApiKey) resolves during the background
|
|
470
|
+
// revalidation instead of throwing "called outside of a request
|
|
471
|
+
// context". runWithRequestContext sets the store for fn's
|
|
472
|
+
// synchronous kickoff; its async continuations inherit it.
|
|
473
|
+
const scoped = runWithRequestContext(requestCtx, () =>
|
|
474
|
+
runWithCacheTagScope(() => fn.apply(this, args)),
|
|
475
|
+
);
|
|
476
|
+
const freshResult = await scoped.result;
|
|
235
477
|
bgStopCapture?.();
|
|
478
|
+
// Merge profile/DSL tags with runtime cacheTag() tags, read after
|
|
479
|
+
// awaiting so post-await cacheTag() calls are included. Normalize
|
|
480
|
+
// (drops empty profile tags, matching the invalidate path) + dedupe.
|
|
481
|
+
const freshTags = [
|
|
482
|
+
...new Set(
|
|
483
|
+
normalizeTags([...(profile.tags ?? []), ...scoped.tags]),
|
|
484
|
+
),
|
|
485
|
+
];
|
|
486
|
+
recordRequestTags(freshTags, requestCtx);
|
|
236
487
|
const serialized = await serializeResult(freshResult);
|
|
237
488
|
if (serialized !== null) {
|
|
489
|
+
const encodedHandles = bgCapture?.data
|
|
490
|
+
? await encodeHandles(bgCapture.data)
|
|
491
|
+
: undefined;
|
|
238
492
|
await store.setItem!(cacheKey, serialized, {
|
|
239
|
-
handles:
|
|
493
|
+
handles: encodedHandles,
|
|
240
494
|
ttl: profile.ttl,
|
|
241
495
|
swr: profile.swr,
|
|
242
|
-
tags:
|
|
496
|
+
tags: freshTags.length > 0 ? freshTags : undefined,
|
|
243
497
|
});
|
|
244
498
|
}
|
|
245
499
|
} catch (bgError) {
|
|
246
500
|
bgStopCapture?.();
|
|
247
|
-
requestCtx
|
|
501
|
+
// Pass requestCtx explicitly: this runs in a detached background
|
|
502
|
+
// task where the ALS context is gone, so onError can only fire if
|
|
503
|
+
// we hand it the context captured up front.
|
|
504
|
+
reportCacheError(
|
|
505
|
+
bgError,
|
|
506
|
+
"stale-revalidation",
|
|
507
|
+
"[use cache] background revalidation failed",
|
|
508
|
+
requestCtx,
|
|
509
|
+
);
|
|
248
510
|
} finally {
|
|
249
511
|
for (const arg of bgTaintedArgs) {
|
|
250
512
|
unstampCacheExec(arg as object);
|
|
251
513
|
}
|
|
252
|
-
if (requestCtx) {
|
|
253
|
-
unstampCacheExec(requestCtx as object);
|
|
254
|
-
}
|
|
255
514
|
// Restore original handle store
|
|
256
515
|
if (originalHandleStore && requestCtx) {
|
|
257
516
|
requestCtx._handleStore = originalHandleStore;
|
|
@@ -259,12 +518,76 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
259
518
|
}
|
|
260
519
|
});
|
|
261
520
|
return result;
|
|
521
|
+
} catch (error) {
|
|
522
|
+
// Stale value is corrupt/partial; report and fall through to a fresh
|
|
523
|
+
// execution, which overwrites the faulty entry under the same key.
|
|
524
|
+
reportCacheError(
|
|
525
|
+
error,
|
|
526
|
+
"cache-corrupt",
|
|
527
|
+
`[use cache] "${id}" stale-hit`,
|
|
528
|
+
);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// Cache miss.
|
|
533
|
+
//
|
|
534
|
+
// In-flight dedup: if a concurrent call for this key is already executing,
|
|
535
|
+
// await its envelope and serve it as a synthetic hit rather than re-running
|
|
536
|
+
// the function. Each follower deserializes its OWN copy, replays handles
|
|
537
|
+
// against its OWN handle store (gated on ITS hasTaintedArgs), and records
|
|
538
|
+
// tags into its OWN request — no deserialized result is shared across
|
|
539
|
+
// requests. The store write stays exactly once (the leader's).
|
|
540
|
+
const existing = inFlightExecutions.get(cacheKey);
|
|
541
|
+
if (existing) {
|
|
542
|
+
let envelope: CacheEnvelope | undefined;
|
|
543
|
+
try {
|
|
544
|
+
envelope = await existing;
|
|
262
545
|
} catch {
|
|
263
|
-
//
|
|
546
|
+
// Leader rejected (function threw or its result was not serializable);
|
|
547
|
+
// its map entry is already cleared, so fall through to a fresh run.
|
|
548
|
+
envelope = undefined;
|
|
549
|
+
}
|
|
550
|
+
if (envelope) {
|
|
551
|
+
try {
|
|
552
|
+
return await serveCached({
|
|
553
|
+
value: envelope.serialized,
|
|
554
|
+
handles: envelope.handles,
|
|
555
|
+
tags: envelope.tags,
|
|
556
|
+
shouldRevalidate: false,
|
|
557
|
+
});
|
|
558
|
+
} catch (error) {
|
|
559
|
+
reportCacheError(
|
|
560
|
+
error,
|
|
561
|
+
"cache-corrupt",
|
|
562
|
+
`[use cache] "${id}" inflight-hit`,
|
|
563
|
+
);
|
|
564
|
+
// Fall through to a fresh execution below.
|
|
565
|
+
}
|
|
264
566
|
}
|
|
265
567
|
}
|
|
266
568
|
|
|
267
|
-
//
|
|
569
|
+
// This call becomes the leader. Register a deferred envelope so concurrent
|
|
570
|
+
// callers dedup onto it; it is resolved/rejected exactly once below (or on a
|
|
571
|
+
// function throw). clearSelf only deletes the map slot if it still holds
|
|
572
|
+
// THIS promise, so a fall-through retry (rare rejected-leader path) can't
|
|
573
|
+
// evict a newer leader's entry.
|
|
574
|
+
let resolveEnvelope!: (env: CacheEnvelope) => void;
|
|
575
|
+
let rejectEnvelope!: (err: unknown) => void;
|
|
576
|
+
const envelopePromise = new Promise<CacheEnvelope>((res, rej) => {
|
|
577
|
+
resolveEnvelope = res;
|
|
578
|
+
rejectEnvelope = rej;
|
|
579
|
+
});
|
|
580
|
+
// Followers attach their own catch; guard the map's own reference so a
|
|
581
|
+
// rejected envelope with no waiter is not an unhandled rejection.
|
|
582
|
+
envelopePromise.catch(() => {});
|
|
583
|
+
inFlightExecutions.set(cacheKey, envelopePromise);
|
|
584
|
+
const clearSelf = (): void => {
|
|
585
|
+
if (inFlightExecutions.get(cacheKey) === envelopePromise) {
|
|
586
|
+
inFlightExecutions.delete(cacheKey);
|
|
587
|
+
}
|
|
588
|
+
};
|
|
589
|
+
|
|
590
|
+
// execute, serialize, store
|
|
268
591
|
const handleStore = hasTaintedArgs ? requestCtx?._handleStore : undefined;
|
|
269
592
|
let capture: HandleCapture | undefined;
|
|
270
593
|
let stopCapture: (() => void) | undefined;
|
|
@@ -293,8 +616,16 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
293
616
|
}
|
|
294
617
|
|
|
295
618
|
let result: any;
|
|
619
|
+
let scoped: ReturnType<typeof runWithCacheTagScope>;
|
|
296
620
|
try {
|
|
297
|
-
|
|
621
|
+
scoped = runWithCacheTagScope(() => fn.apply(this, args));
|
|
622
|
+
result = await scoped.result;
|
|
623
|
+
} catch (execError) {
|
|
624
|
+
// The function threw: drop the in-flight entry and reject any waiters so
|
|
625
|
+
// they retry fresh, then propagate to this caller.
|
|
626
|
+
clearSelf();
|
|
627
|
+
rejectEnvelope(execError);
|
|
628
|
+
throw execError;
|
|
298
629
|
} finally {
|
|
299
630
|
// Decrement ref count; symbol is deleted when it reaches zero
|
|
300
631
|
for (const arg of taintedArgs) {
|
|
@@ -307,25 +638,61 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
307
638
|
stopCapture?.();
|
|
308
639
|
}
|
|
309
640
|
|
|
310
|
-
//
|
|
311
|
-
//
|
|
312
|
-
|
|
641
|
+
// Merge profile/DSL tags with runtime cacheTag() tags. Read scoped.tags
|
|
642
|
+
// after awaiting result so post-await cacheTag() calls are included.
|
|
643
|
+
// Normalize (drops empty profile tags, matching the invalidate path) + dedupe.
|
|
644
|
+
const allTags = [
|
|
645
|
+
...new Set(normalizeTags([...(profile.tags ?? []), ...scoped!.tags])),
|
|
646
|
+
];
|
|
647
|
+
recordRequestTags(allTags, requestCtx);
|
|
648
|
+
|
|
649
|
+
// Serialize + encode handles ONCE, resolve the in-flight envelope so any
|
|
650
|
+
// concurrent followers can serve a synthetic hit, then persist to the store.
|
|
651
|
+
// Fully non-blocking when waitUntil is available — the leader's response
|
|
652
|
+
// waits on neither serialization nor the store write.
|
|
653
|
+
const finalizeAndWrite = async (): Promise<void> => {
|
|
654
|
+
let serialized: string | null;
|
|
655
|
+
let encodedHandles: string | undefined;
|
|
313
656
|
try {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
await
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
657
|
+
serialized = await serializeResult(result);
|
|
658
|
+
encodedHandles = capture?.data
|
|
659
|
+
? await encodeHandles(capture.data)
|
|
660
|
+
: undefined;
|
|
661
|
+
} catch (buildError) {
|
|
662
|
+
// Serialize/handle-encode failed: no envelope for followers (they run
|
|
663
|
+
// fresh) and nothing to write.
|
|
664
|
+
clearSelf();
|
|
665
|
+
rejectEnvelope(buildError);
|
|
666
|
+
requestCtx?._reportBackgroundError?.(buildError, "cache-write");
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
clearSelf();
|
|
670
|
+
if (serialized === null) {
|
|
671
|
+
// Non-serializable result: no store write (matches the prior silent
|
|
672
|
+
// skip); reject so any waiter falls through to a fresh execution.
|
|
673
|
+
rejectEnvelope(
|
|
674
|
+
new Error(
|
|
675
|
+
`[use cache] "${id}" result is not serializable; not cached`,
|
|
676
|
+
),
|
|
677
|
+
);
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
// Hand followers the envelope before the store write so a slow/failed
|
|
681
|
+
// write never stalls them.
|
|
682
|
+
resolveEnvelope({ serialized, tags: allTags, handles: encodedHandles });
|
|
683
|
+
try {
|
|
684
|
+
await store.setItem!(cacheKey, serialized, {
|
|
685
|
+
handles: encodedHandles,
|
|
686
|
+
ttl: profile.ttl,
|
|
687
|
+
swr: profile.swr,
|
|
688
|
+
tags: allTags.length > 0 ? allTags : undefined,
|
|
689
|
+
});
|
|
323
690
|
} catch (writeError) {
|
|
324
691
|
requestCtx?._reportBackgroundError?.(writeError, "cache-write");
|
|
325
692
|
}
|
|
326
693
|
};
|
|
327
694
|
|
|
328
|
-
await runBackground(requestCtx,
|
|
695
|
+
await runBackground(requestCtx, finalizeAndWrite, true);
|
|
329
696
|
|
|
330
697
|
return result;
|
|
331
698
|
};
|