@rangojs/router 0.0.0-experimental.e16b7c00 → 0.0.0-experimental.e9c0b2f2
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 +8 -0
- package/README.md +64 -6
- 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 +195 -52
- 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/{src/handles/index.ts → dist/handles/index.d.ts} +1 -2
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +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 +1165 -310
- 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/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 +71 -7
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +61 -1
- package/skills/bundle-analysis/SKILL.md +2 -2
- package/skills/cache-guide/SKILL.md +2 -2
- package/skills/caching/SKILL.md +92 -10
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +4 -2
- package/skills/document-cache/SKILL.md +2 -2
- package/skills/handler-use/SKILL.md +1 -1
- package/skills/hooks/SKILL.md +40 -29
- package/skills/host-router/SKILL.md +80 -3
- package/skills/intercept/SKILL.md +5 -3
- package/skills/layout/SKILL.md +11 -6
- package/skills/loader/SKILL.md +25 -19
- package/skills/middleware/SKILL.md +4 -2
- package/skills/migrate-nextjs/SKILL.md +3 -1
- package/skills/migrate-react-router/SKILL.md +4 -2
- package/skills/mime-routes/SKILL.md +2 -2
- package/skills/observability/SKILL.md +61 -4
- package/skills/parallel/SKILL.md +9 -4
- package/skills/prerender/SKILL.md +31 -10
- package/skills/rango/SKILL.md +31 -10
- package/skills/response-routes/SKILL.md +63 -45
- package/skills/route/SKILL.md +14 -2
- package/skills/router-setup/SKILL.md +27 -3
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +25 -1
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +129 -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 +129 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +121 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +84 -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/typesafety/SKILL.md +6 -5
- package/skills/use-cache/SKILL.md +10 -9
- package/skills/vercel/SKILL.md +128 -0
- package/src/__augment-tests__/augmented.check.ts +2 -3
- package/src/__internal.ts +0 -65
- package/src/browser/action-coordinator.ts +1 -1
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +14 -27
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +115 -89
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/navigation-bridge.ts +16 -52
- package/src/browser/navigation-client.ts +84 -69
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +25 -74
- package/src/browser/navigation-transaction.ts +0 -32
- package/src/browser/partial-update.ts +81 -127
- package/src/browser/prefetch/cache.ts +99 -72
- package/src/browser/prefetch/fetch.ts +176 -34
- package/src/browser/prefetch/queue.ts +6 -3
- package/src/browser/rango-state.ts +157 -115
- package/src/browser/react/Link.tsx +30 -7
- package/src/browser/react/NavigationProvider.tsx +32 -95
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/filter-segment-order.ts +17 -2
- package/src/browser/react/index.ts +0 -51
- package/src/browser/react/location-state-shared.ts +14 -15
- package/src/browser/react/location-state.ts +0 -1
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +0 -5
- 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 +10 -5
- package/src/browser/react/use-params.ts +0 -2
- package/src/browser/react/use-router.ts +6 -4
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +0 -13
- package/src/browser/response-adapter.ts +41 -4
- package/src/browser/rsc-router.tsx +43 -18
- package/src/browser/scroll-restoration.ts +8 -3
- package/src/browser/server-action-bridge.ts +194 -28
- package/src/browser/types.ts +40 -21
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/generate-route-types.ts +1 -1
- package/src/build/index.ts +8 -4
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +117 -15
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +12 -1
- package/src/build/route-types/include-resolution.ts +116 -22
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +15 -2
- package/src/build/route-types/router-processing.ts +77 -41
- package/src/build/route-types/source-scan.ts +105 -7
- package/src/cache/cache-key-utils.ts +29 -13
- package/src/cache/cache-policy.ts +42 -62
- package/src/cache/cache-runtime.ts +126 -30
- package/src/cache/cache-scope.ts +118 -43
- package/src/cache/cache-tag.ts +7 -39
- 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 +1257 -537
- 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 +6 -19
- package/src/cache/document-cache.ts +32 -32
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +20 -24
- package/src/cache/memory-segment-store.ts +3 -48
- package/src/cache/profile-registry.ts +31 -31
- package/src/cache/read-through-swr.ts +41 -11
- package/src/cache/segment-codec.ts +9 -17
- package/src/cache/tag-invalidation.ts +29 -5
- package/src/cache/types.ts +14 -104
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +855 -0
- package/src/client.rsc.tsx +42 -22
- package/src/client.tsx +31 -58
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +13 -1
- package/src/decode-loader-results.ts +18 -2
- package/src/defer.ts +196 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +0 -3
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +28 -18
- package/src/handles/MetaTags.tsx +56 -19
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +37 -8
- package/src/handles/is-thenable.ts +19 -0
- package/src/handles/meta.ts +51 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +0 -24
- package/src/host/index.ts +6 -0
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +1 -65
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +6 -2
- package/src/href-client.ts +7 -12
- package/src/index.rsc.ts +75 -8
- package/src/index.ts +60 -4
- package/src/internal-debug.ts +2 -4
- package/src/loader.rsc.ts +19 -9
- package/src/loader.ts +12 -4
- package/src/network-error-thrower.tsx +1 -6
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +32 -37
- package/src/prerender.ts +58 -3
- package/src/redirect-origin.ts +100 -0
- package/src/regex-escape.ts +8 -0
- package/src/response-utils.ts +25 -0
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +1 -44
- package/src/route-definition/dsl-helpers.ts +39 -21
- package/src/route-definition/helpers-types.ts +3 -3
- package/src/route-definition/redirect.ts +44 -11
- package/src/route-definition/resolve-handler-use.ts +6 -0
- package/src/route-map-builder.ts +0 -16
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +58 -23
- package/src/router/error-handling.ts +44 -17
- package/src/router/find-match.ts +44 -23
- package/src/router/handler-context.ts +6 -1
- package/src/router/instrument.ts +350 -0
- package/src/router/intercept-resolution.ts +35 -2
- package/src/router/lazy-includes.ts +7 -44
- package/src/router/loader-resolution.ts +139 -73
- package/src/router/logging.ts +0 -6
- package/src/router/manifest.ts +18 -29
- package/src/router/match-api.ts +0 -20
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +57 -58
- package/src/router/match-middleware/background-revalidation.ts +6 -7
- package/src/router/match-middleware/cache-lookup.ts +115 -194
- package/src/router/match-middleware/cache-store.ts +28 -32
- package/src/router/match-middleware/intercept-resolution.ts +0 -22
- package/src/router/match-middleware/segment-resolution.ts +0 -22
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +1 -52
- package/src/router/metrics.ts +0 -34
- package/src/router/middleware-types.ts +0 -116
- package/src/router/middleware.ts +175 -90
- package/src/router/navigation-snapshot.ts +0 -51
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +47 -89
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prerender-match.ts +101 -64
- package/src/router/request-classification.ts +25 -35
- package/src/router/revalidation.ts +75 -81
- package/src/router/route-snapshot.ts +0 -1
- package/src/router/router-context.ts +3 -28
- package/src/router/router-interfaces.ts +38 -7
- package/src/router/router-options.ts +111 -4
- package/src/router/segment-resolution/fresh.ts +66 -78
- package/src/router/segment-resolution/helpers.ts +86 -6
- package/src/router/segment-resolution/loader-cache.ts +57 -23
- package/src/router/segment-resolution/revalidation.ts +212 -304
- 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.ts +5 -1
- package/src/router/segment-wrappers.ts +6 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/telemetry-otel.ts +161 -199
- package/src/router/telemetry.ts +96 -19
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +163 -64
- package/src/router/types.ts +1 -63
- package/src/router/url-params.ts +0 -5
- package/src/router.ts +87 -37
- package/src/rsc/handler-context.ts +1 -0
- package/src/rsc/handler.ts +232 -153
- package/src/rsc/helpers.ts +97 -4
- package/src/rsc/index.ts +1 -4
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +114 -38
- package/src/rsc/manifest-init.ts +28 -41
- package/src/rsc/origin-guard.ts +11 -15
- package/src/rsc/progressive-enhancement.ts +59 -9
- package/src/rsc/redirect-guard.ts +99 -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 +57 -147
- package/src/rsc/rsc-rendering.ts +64 -24
- package/src/rsc/runtime-warnings.ts +14 -0
- package/src/rsc/server-action.ts +244 -81
- package/src/rsc/types.ts +15 -3
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +31 -26
- package/src/segment-loader-promise.ts +31 -4
- package/src/segment-system.tsx +89 -89
- package/src/server/context.ts +32 -0
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +52 -1
- package/src/server/handle-store.ts +21 -38
- package/src/server/loader-registry.ts +21 -42
- package/src/server/request-context.ts +189 -131
- package/src/ssr/index.tsx +19 -18
- package/src/static-handler.ts +10 -13
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +701 -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 +183 -0
- package/src/testing/index.ts +99 -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 +343 -0
- package/src/testing/render-route.tsx +581 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -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 +20 -58
- 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 +3 -3
- package/src/types/error-types.ts +25 -89
- package/src/types/global-namespace.ts +15 -15
- package/src/types/handler-context.ts +44 -14
- package/src/types/index.ts +0 -10
- package/src/types/loader-types.ts +6 -3
- package/src/types/request-scope.ts +8 -22
- package/src/types/route-config.ts +6 -50
- package/src/types/route-entry.ts +0 -6
- package/src/types/segments.ts +0 -13
- package/src/urls/include-helper.ts +0 -4
- package/src/urls/index.ts +1 -8
- package/src/urls/path-helper-types.ts +8 -2
- package/src/urls/path-helper.ts +0 -54
- package/src/urls/type-extraction.ts +33 -24
- package/src/urls/urls-function.ts +0 -13
- package/src/use-loader.tsx +0 -186
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/discovery/bundle-postprocess.ts +2 -1
- package/src/vite/discovery/discover-routers.ts +33 -42
- package/src/vite/discovery/prerender-collection.ts +33 -46
- package/src/vite/discovery/state.ts +12 -1
- package/src/vite/discovery/virtual-module-codegen.ts +1 -11
- package/src/vite/index.ts +2 -0
- package/src/vite/plugin-types.ts +143 -10
- package/src/vite/plugins/cjs-to-esm.ts +8 -12
- package/src/vite/plugins/client-ref-dedup.ts +0 -11
- package/src/vite/plugins/client-ref-hashing.ts +0 -10
- package/src/vite/plugins/cloudflare-protocol-stub.ts +0 -20
- package/src/vite/plugins/expose-action-id.ts +2 -73
- package/src/vite/plugins/expose-id-utils.ts +85 -56
- package/src/vite/plugins/expose-ids/export-analysis.ts +30 -43
- package/src/vite/plugins/expose-ids/handler-transform.ts +5 -31
- package/src/vite/plugins/expose-ids/loader-transform.ts +12 -20
- package/src/vite/plugins/expose-ids/router-transform.ts +98 -26
- package/src/vite/plugins/expose-internal-ids.ts +10 -1
- package/src/vite/plugins/performance-tracks.ts +0 -3
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/use-cache-transform.ts +21 -46
- package/src/vite/plugins/vercel-output.ts +295 -0
- package/src/vite/plugins/version-injector.ts +0 -20
- package/src/vite/plugins/version-plugin.ts +6 -66
- package/src/vite/plugins/virtual-entries.ts +70 -17
- package/src/vite/rango.ts +135 -134
- package/src/vite/router-discovery.ts +21 -8
- package/src/vite/utils/ast-handler-extract.ts +11 -20
- package/src/vite/utils/bundle-analysis.ts +6 -13
- package/src/vite/utils/client-chunks.ts +0 -6
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +0 -22
- package/src/vite/utils/manifest-utils.ts +4 -75
- package/src/vite/utils/package-resolution.ts +1 -73
- package/src/vite/utils/prerender-utils.ts +54 -40
- package/src/vite/utils/shared-utils.ts +8 -37
- package/src/browser/shallow.ts +0 -40
- package/src/router/middleware-cookies.ts +0 -55
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
createClientTemporaryReferenceSet,
|
|
22
22
|
} from "@vitejs/plugin-rsc/rsc";
|
|
23
23
|
import { getRequestContext } from "../server/request-context.js";
|
|
24
|
+
import { isUnderTestRunner } from "../runtime-env.js";
|
|
24
25
|
import {
|
|
25
26
|
isTainted,
|
|
26
27
|
CACHED_FN_SYMBOL,
|
|
@@ -32,9 +33,14 @@ import {
|
|
|
32
33
|
export { isCachedFunction };
|
|
33
34
|
import { serializeResult, deserializeResult } from "./segment-codec.js";
|
|
34
35
|
import { createHandleStore } from "../server/handle-store.js";
|
|
35
|
-
import {
|
|
36
|
+
import {
|
|
37
|
+
restoreHandles,
|
|
38
|
+
encodeHandles,
|
|
39
|
+
decodeHandles,
|
|
40
|
+
} from "./handle-snapshot.js";
|
|
36
41
|
import { startHandleCapture, type HandleCapture } from "./handle-capture.js";
|
|
37
42
|
import { sortedSearchString } from "./cache-key-utils.js";
|
|
43
|
+
import { encodeKV } from "../encode-kv.js";
|
|
38
44
|
import { runBackground } from "./background-task.js";
|
|
39
45
|
import {
|
|
40
46
|
normalizeTags,
|
|
@@ -42,18 +48,82 @@ import {
|
|
|
42
48
|
runWithCacheTagScope,
|
|
43
49
|
} from "./cache-tag.js";
|
|
44
50
|
import { reportCacheError } from "./cache-error.js";
|
|
51
|
+
import type { CacheItemResult } from "./types.js";
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* DJB2 hash returning an 8-char hex string. Deterministic across runtimes
|
|
55
|
+
* (no crypto import — cache-runtime runs on the edge). Mirrors prerender's
|
|
56
|
+
* param-hash djb2Hex so binary key parts hash consistently.
|
|
57
|
+
*/
|
|
58
|
+
function djb2HexBytes(bytes: Uint8Array): string {
|
|
59
|
+
let hash = 5381;
|
|
60
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
61
|
+
hash = ((hash << 5) + hash + bytes[i]!) >>> 0;
|
|
62
|
+
}
|
|
63
|
+
return hash.toString(16).padStart(8, "0");
|
|
64
|
+
}
|
|
45
65
|
|
|
46
66
|
/**
|
|
47
67
|
* Convert encodeReply result to a stable string key.
|
|
48
|
-
*
|
|
68
|
+
*
|
|
69
|
+
* encodeReply may return a string or FormData. A plain string is already
|
|
70
|
+
* deterministic for a given arg set, so return it verbatim. FormData (emitted
|
|
71
|
+
* whenever a key arg is a typed array / Blob / File / a large object React
|
|
72
|
+
* lazily chunks) carries a per-call RANDOM multipart boundary
|
|
73
|
+
* (`formdata-undici-<random>`); stringifying the whole body via
|
|
74
|
+
* `new Response(formData).text()` would therefore produce a DIFFERENT key on
|
|
75
|
+
* every call, so the cached function would always miss and the store would
|
|
76
|
+
* accumulate one duplicate entry per call (unbounded growth).
|
|
77
|
+
*
|
|
78
|
+
* Instead derive the key from the entries themselves, independent of the
|
|
79
|
+
* boundary: iterate in sorted-key order and, for each value, emit a
|
|
80
|
+
* boundary-free token — `s:<value>` for strings, `b:<size>:<type>:<name>:<hash>`
|
|
81
|
+
* for Blob/File (bytes folded via djb2 so distinct payloads of equal
|
|
82
|
+
* size/type/name still differ). Strings carry an `s:` type tag so a string whose
|
|
83
|
+
* value happens to equal a blob token (e.g. the literal `b:4::a:b:<hash>`) cannot
|
|
84
|
+
* collide with an actual Blob/File entry under the same FormData key. The
|
|
85
|
+
* user-controlled `type`/`name` are percent-encoded before joining so an embedded
|
|
86
|
+
* `:` cannot shift the field boundaries and collide two distinct files (e.g.
|
|
87
|
+
* {name:"a:b",type:""} vs {name:"b",type:":a"}). The result is stable across
|
|
88
|
+
* identical arg sets.
|
|
49
89
|
*/
|
|
50
|
-
async function replyToCacheKey(
|
|
90
|
+
export async function replyToCacheKey(
|
|
91
|
+
encoded: string | FormData,
|
|
92
|
+
): Promise<string> {
|
|
51
93
|
if (typeof encoded === "string") return encoded;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
94
|
+
|
|
95
|
+
// Snapshot entries synchronously (forEach avoids relying on FormData's
|
|
96
|
+
// iterator typings), then fold any Blob/File bytes asynchronously.
|
|
97
|
+
const raw: [string, FormDataEntryValue][] = [];
|
|
98
|
+
encoded.forEach((value, key) => {
|
|
99
|
+
raw.push([key, value]);
|
|
100
|
+
});
|
|
101
|
+
const pairs: [string, string][] = [];
|
|
102
|
+
for (const [key, value] of raw) {
|
|
103
|
+
if (typeof value === "string") {
|
|
104
|
+
// Type-tag strings with `s:` so a string equal to a blob token (e.g.
|
|
105
|
+
// `b:4::a:b:<hash>`) cannot collide with a Blob/File entry under the same
|
|
106
|
+
// key (which carries the `b:` tag below).
|
|
107
|
+
pairs.push([key, "s:" + value]);
|
|
108
|
+
} else {
|
|
109
|
+
// Blob/File: fold the bytes into a deterministic, boundary-free token.
|
|
110
|
+
// Percent-encode the user-controlled type/name so an embedded `:` cannot
|
|
111
|
+
// shift the `:`-delimited field boundaries and collide distinct files.
|
|
112
|
+
const buf = await value.arrayBuffer();
|
|
113
|
+
const hash = djb2HexBytes(new Uint8Array(buf));
|
|
114
|
+
const name = "name" in value ? value.name : "";
|
|
115
|
+
const encType = encodeURIComponent(value.type);
|
|
116
|
+
const encName = encodeURIComponent(name);
|
|
117
|
+
pairs.push([key, `b:${value.size}:${encType}:${encName}:${hash}`]);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return encodeKV(pairs, { sort: true });
|
|
55
121
|
}
|
|
56
122
|
|
|
123
|
+
// Cached-fn ids already warned about running uncached under a test runner, so
|
|
124
|
+
// the test-ergonomics warning fires once per fn rather than once per call.
|
|
125
|
+
const warnedUncachedUnderTest = new Set<string>();
|
|
126
|
+
|
|
57
127
|
// ============================================================================
|
|
58
128
|
// Core: registerCachedFunction
|
|
59
129
|
// ============================================================================
|
|
@@ -80,7 +150,28 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
80
150
|
// cacheTag() call inside the function degrades to a no-op rather than
|
|
81
151
|
// throwing "must be called inside a use cache function" - adopting cacheTag()
|
|
82
152
|
// must not hard-fail in apps/tests without an item-capable cache configured.
|
|
153
|
+
// Note: the INSIDE_CACHE_EXEC guard (cookies()/headers()/ctx.set() rejection)
|
|
154
|
+
// is intentionally NOT stamped here. It is a cached-path-only check; in the
|
|
155
|
+
// bypass the body actually executes, so the guarded side effects take effect
|
|
156
|
+
// and nothing is lost on a (non-existent) hit. Same applies to the
|
|
157
|
+
// non-serializable-args bypass below.
|
|
83
158
|
if (!store?.getItem) {
|
|
159
|
+
// Test-ergonomics guard: under a test runner, a "use cache" function that
|
|
160
|
+
// executes with no item-capable store seeded is exercising the UNCACHED
|
|
161
|
+
// path — a green test that proves nothing about caching. Warn once per fn
|
|
162
|
+
// id so the author knows to seed a cacheStore. Advisory (never throws), so
|
|
163
|
+
// a test that DELIBERATELY runs uncached is unaffected. Gated on the test
|
|
164
|
+
// runner (process.env.VITEST, not folded) so production never evaluates it.
|
|
165
|
+
if (isUnderTestRunner() && !warnedUncachedUnderTest.has(id)) {
|
|
166
|
+
warnedUncachedUnderTest.add(id);
|
|
167
|
+
console.warn(
|
|
168
|
+
`[rango] "use cache" function "${id}" executed but no cacheStore was ` +
|
|
169
|
+
`seeded; the cached path is NOT under test (it ran uncached). Pass ` +
|
|
170
|
+
`{ cacheStore, cacheProfiles } to runLoader/runMiddleware/renderHandler/` +
|
|
171
|
+
`runInRequestContext (or configure createRouter({ cache }) for dispatch) ` +
|
|
172
|
+
`to exercise it.`,
|
|
173
|
+
);
|
|
174
|
+
}
|
|
84
175
|
const scoped = runWithCacheTagScope(() => fn.apply(this, args));
|
|
85
176
|
const result = await scoped.result;
|
|
86
177
|
// Still record the runtime tags into the request set so a cacheTag() in an
|
|
@@ -181,22 +272,29 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
181
272
|
// Cache lookup
|
|
182
273
|
const cached = await store.getItem(cacheKey);
|
|
183
274
|
|
|
275
|
+
// Serve a cached entry on the hit path: deserialize the stored value,
|
|
276
|
+
// replay handle data (gated on tainted args), and surface the entry's tags
|
|
277
|
+
// to the request set (the function did not re-run, so its runtime cacheTag()
|
|
278
|
+
// tags are only available from the stored entry). Shared by the fresh-hit
|
|
279
|
+
// and stale-hit branches; the only divergence is the stale branch scheduling
|
|
280
|
+
// background revalidation, which it does after this returns.
|
|
281
|
+
const serveCached = async (entry: CacheItemResult): Promise<any> => {
|
|
282
|
+
const result = await deserializeResult(entry.value);
|
|
283
|
+
if (entry.handles && hasTaintedArgs) {
|
|
284
|
+
const handleStore = requestCtx?._handleStore;
|
|
285
|
+
if (handleStore) {
|
|
286
|
+
const r = await decodeHandles(entry.handles);
|
|
287
|
+
if (r) restoreHandles(r, handleStore);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
recordRequestTags(entry.tags, requestCtx);
|
|
291
|
+
return result;
|
|
292
|
+
};
|
|
293
|
+
|
|
184
294
|
if (cached && !cached.shouldRevalidate) {
|
|
185
295
|
// Fresh hit: deserialize and return
|
|
186
296
|
try {
|
|
187
|
-
|
|
188
|
-
// Restore handle data if present
|
|
189
|
-
if (cached.handles && hasTaintedArgs) {
|
|
190
|
-
const handleStore = requestCtx?._handleStore;
|
|
191
|
-
if (handleStore) {
|
|
192
|
-
restoreHandles(cached.handles, handleStore);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
// Surface the hit's tags to the request set so a document built from a
|
|
196
|
-
// cached item is still tagged (the function did not re-run, so its
|
|
197
|
-
// runtime cacheTag() tags are only available from the stored entry).
|
|
198
|
-
recordRequestTags(cached.tags, requestCtx);
|
|
199
|
-
return result;
|
|
297
|
+
return await serveCached(cached);
|
|
200
298
|
} catch (error) {
|
|
201
299
|
// The stored value is corrupt/partial (failed RSC deserialize). Report
|
|
202
300
|
// it, then fall through to fresh execution - the miss path below re-runs
|
|
@@ -212,15 +310,7 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
212
310
|
if (cached?.shouldRevalidate) {
|
|
213
311
|
// Stale hit: return stale value, revalidate in background
|
|
214
312
|
try {
|
|
215
|
-
const result = await
|
|
216
|
-
if (cached.handles && hasTaintedArgs) {
|
|
217
|
-
const handleStore = requestCtx?._handleStore;
|
|
218
|
-
if (handleStore) {
|
|
219
|
-
restoreHandles(cached.handles, handleStore);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
// Tag the request with the stale entry's tags (see fresh-hit note).
|
|
223
|
-
recordRequestTags(cached.tags, requestCtx);
|
|
313
|
+
const result = await serveCached(cached);
|
|
224
314
|
// Background revalidation — must capture handles if tainted args present.
|
|
225
315
|
// Use an isolated handle store so background pushes don't pollute the
|
|
226
316
|
// live response or throw LateHandlePushError on the completed store.
|
|
@@ -284,8 +374,11 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
284
374
|
recordRequestTags(freshTags, requestCtx);
|
|
285
375
|
const serialized = await serializeResult(freshResult);
|
|
286
376
|
if (serialized !== null) {
|
|
377
|
+
const encodedHandles = bgCapture?.data
|
|
378
|
+
? await encodeHandles(bgCapture.data)
|
|
379
|
+
: undefined;
|
|
287
380
|
await store.setItem!(cacheKey, serialized, {
|
|
288
|
-
handles:
|
|
381
|
+
handles: encodedHandles,
|
|
289
382
|
ttl: profile.ttl,
|
|
290
383
|
swr: profile.swr,
|
|
291
384
|
tags: freshTags.length > 0 ? freshTags : undefined,
|
|
@@ -383,8 +476,11 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
383
476
|
try {
|
|
384
477
|
const serialized = await serializeResult(result);
|
|
385
478
|
if (serialized !== null) {
|
|
479
|
+
const encodedHandles = capture?.data
|
|
480
|
+
? await encodeHandles(capture.data)
|
|
481
|
+
: undefined;
|
|
386
482
|
await store.setItem!(cacheKey, serialized, {
|
|
387
|
-
handles:
|
|
483
|
+
handles: encodedHandles,
|
|
388
484
|
ttl: profile.ttl,
|
|
389
485
|
swr: profile.swr,
|
|
390
486
|
tags: allTags.length > 0 ? allTags : undefined,
|
package/src/cache/cache-scope.ts
CHANGED
|
@@ -18,23 +18,29 @@ import {
|
|
|
18
18
|
} from "../server/request-context.js";
|
|
19
19
|
import { recordRequestTags } from "./cache-tag.js";
|
|
20
20
|
import { reportCacheError } from "./cache-error.js";
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
// segment-codec is the only module on cache-scope's import graph that eagerly
|
|
22
|
+
// pulls @vitejs/plugin-rsc (a virtual: module the plain node/vitest runner cannot
|
|
23
|
+
// resolve). It is imported LAZILY at the two call sites below (deserializeSegments
|
|
24
|
+
// in lookupRoute, serializeSegments in cacheRoute) so that requiring cache-scope —
|
|
25
|
+
// e.g. dispatch's lazy `import("../cache/cache-scope.js")` for the response-route
|
|
26
|
+
// cache path — does not crash a consumer test that never mocks plugin-rsc. Behavior
|
|
27
|
+
// is unchanged: both methods are async and already awaited the codec.
|
|
28
|
+
import {
|
|
29
|
+
captureHandles,
|
|
30
|
+
restoreHandles,
|
|
31
|
+
encodeHandles,
|
|
32
|
+
decodeHandles,
|
|
33
|
+
} from "./handle-snapshot.js";
|
|
23
34
|
import { sortedSearchString, sortedRouteParams } from "./cache-key-utils.js";
|
|
24
35
|
import {
|
|
25
36
|
DEFAULT_ROUTE_TTL,
|
|
37
|
+
isFiniteNonNegativeSeconds,
|
|
26
38
|
resolveCacheKey,
|
|
27
39
|
resolveCacheStore,
|
|
28
40
|
resolveTagsOption,
|
|
29
41
|
} from "./cache-policy.js";
|
|
30
42
|
import type { RequestContext } from "../server/request-context.js";
|
|
31
43
|
|
|
32
|
-
/**
|
|
33
|
-
* Resolve tags for a cache() boundary from its config (static array or
|
|
34
|
-
* function of ctx). Thin wrapper over the shared resolveTagsOption so the
|
|
35
|
-
* cache() DSL and loader caching resolve tags identically.
|
|
36
|
-
* @internal
|
|
37
|
-
*/
|
|
38
44
|
export function resolveCacheTags(
|
|
39
45
|
config: PartialCacheOptions | false,
|
|
40
46
|
ctx: RequestContext | undefined,
|
|
@@ -49,17 +55,36 @@ function debugCacheLog(message: string): void {
|
|
|
49
55
|
}
|
|
50
56
|
}
|
|
51
57
|
|
|
52
|
-
// ============================================================================
|
|
53
|
-
// Key Generation (internal)
|
|
54
|
-
// ============================================================================
|
|
55
|
-
|
|
56
58
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
59
|
+
* A finite, non-negative seconds value? A NaN/Infinity ttl/swr (from a bad
|
|
60
|
+
* cache() option or store defaults) flows into computeExpiration ->
|
|
61
|
+
* staleAt/expiresAt = NaN, where every `now > NaN` is false so the entry never
|
|
62
|
+
* evicts and is served fresh forever; a negative value makes every read a miss.
|
|
63
|
+
* Mirror profile-registry.ts's Number.isFinite + >= 0 check, but the callers
|
|
64
|
+
* degrade to a default (warning in dev) rather than throw — this runs on the
|
|
65
|
+
* foreground render.
|
|
62
66
|
*/
|
|
67
|
+
function isValidCacheSeconds(value: number, label: string): boolean {
|
|
68
|
+
if (isFiniteNonNegativeSeconds(value)) return true;
|
|
69
|
+
if (process.env.NODE_ENV !== "production") {
|
|
70
|
+
console.warn(
|
|
71
|
+
`[CacheScope] Invalid ${label} ${value}; falling back to default`,
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Coerce a resolved ttl to a finite, non-negative number (default on invalid). */
|
|
78
|
+
function validatedTtl(value: number): number {
|
|
79
|
+
return isValidCacheSeconds(value, "ttl") ? value : DEFAULT_ROUTE_TTL;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Coerce a resolved swr to a finite, non-negative number, or undefined (no SWR window). */
|
|
83
|
+
function validatedSwr(value: number | undefined): number | undefined {
|
|
84
|
+
if (value === undefined) return undefined;
|
|
85
|
+
return isValidCacheSeconds(value, "swr") ? value : undefined;
|
|
86
|
+
}
|
|
87
|
+
|
|
63
88
|
function getCacheKeyBase(
|
|
64
89
|
host: string,
|
|
65
90
|
pathname: string,
|
|
@@ -75,16 +100,6 @@ function getCacheKeyBase(
|
|
|
75
100
|
return key;
|
|
76
101
|
}
|
|
77
102
|
|
|
78
|
-
/**
|
|
79
|
-
* Generate default cache key for a route request.
|
|
80
|
-
* Includes pathname, route params, and user-facing search params for
|
|
81
|
-
* correct scoping. Internal _rsc* params are excluded.
|
|
82
|
-
* Includes request type prefix since they produce different segment sets:
|
|
83
|
-
* - doc: document requests (full page load)
|
|
84
|
-
* - partial: navigation requests (client-side navigation)
|
|
85
|
-
* - intercept: intercept navigation (modal/overlay routes)
|
|
86
|
-
* @internal
|
|
87
|
-
*/
|
|
88
103
|
function getDefaultRouteCacheKey(
|
|
89
104
|
pathname: string,
|
|
90
105
|
params?: Record<string, string>,
|
|
@@ -146,20 +161,26 @@ export class CacheScope {
|
|
|
146
161
|
}
|
|
147
162
|
|
|
148
163
|
/**
|
|
149
|
-
* Get effective TTL from config or store defaults
|
|
164
|
+
* Get effective TTL from config or store defaults.
|
|
165
|
+
*
|
|
166
|
+
* Unlike profile-registry.ts (which fails fast at config time), the render
|
|
167
|
+
* path must DEGRADE: a non-finite/negative ttl (NaN/Infinity from a bad
|
|
168
|
+
* defaults config) would make computeExpiration produce NaN deadlines so the
|
|
169
|
+
* entry never evicts, or a guaranteed miss for a negative value. Fall back to
|
|
170
|
+
* DEFAULT_ROUTE_TTL instead of throwing in the foreground render.
|
|
150
171
|
*/
|
|
151
172
|
get ttl(): number {
|
|
152
173
|
if (this.config === false) return 0;
|
|
153
174
|
|
|
154
175
|
// Explicit TTL in cache() options
|
|
155
176
|
if (this.config.ttl !== undefined) {
|
|
156
|
-
return this.config.ttl;
|
|
177
|
+
return validatedTtl(this.config.ttl);
|
|
157
178
|
}
|
|
158
179
|
|
|
159
180
|
// Fall back to store defaults (explicit store first, then app-level)
|
|
160
181
|
const store = this.getStore();
|
|
161
182
|
if (store?.defaults?.ttl !== undefined) {
|
|
162
|
-
return store.defaults.ttl;
|
|
183
|
+
return validatedTtl(store.defaults.ttl);
|
|
163
184
|
}
|
|
164
185
|
|
|
165
186
|
// Hardcoded fallback
|
|
@@ -167,19 +188,22 @@ export class CacheScope {
|
|
|
167
188
|
}
|
|
168
189
|
|
|
169
190
|
/**
|
|
170
|
-
* Get SWR window from config or store defaults
|
|
191
|
+
* Get SWR window from config or store defaults.
|
|
192
|
+
*
|
|
193
|
+
* A non-finite/negative swr is degraded to undefined (no SWR window) rather
|
|
194
|
+
* than fed into expiry math; see the ttl getter for the rationale.
|
|
171
195
|
*/
|
|
172
196
|
get swr(): number | undefined {
|
|
173
197
|
if (this.config === false) return undefined;
|
|
174
198
|
|
|
175
199
|
// Explicit SWR in cache() options
|
|
176
200
|
if (this.config.swr !== undefined) {
|
|
177
|
-
return this.config.swr;
|
|
201
|
+
return validatedSwr(this.config.swr);
|
|
178
202
|
}
|
|
179
203
|
|
|
180
204
|
// Fall back to store defaults
|
|
181
205
|
const store = this.getStore();
|
|
182
|
-
return store?.defaults?.swr;
|
|
206
|
+
return validatedSwr(store?.defaults?.swr);
|
|
183
207
|
}
|
|
184
208
|
|
|
185
209
|
/**
|
|
@@ -253,10 +277,16 @@ export class CacheScope {
|
|
|
253
277
|
const store = this.getStore();
|
|
254
278
|
if (!store) return null;
|
|
255
279
|
|
|
256
|
-
// Resolve cache key
|
|
257
|
-
|
|
258
|
-
|
|
280
|
+
// Resolve cache key INSIDE the try so a throwing consumer key() (or a
|
|
281
|
+
// store.keyGenerator) degrades to a cache miss (return null -> render
|
|
282
|
+
// uncached) instead of crashing the foreground render. resolveCacheKey
|
|
283
|
+
// itself keeps its hard-fail/no-fallback-to-default contract (a throw must
|
|
284
|
+
// not silently collide onto the default slot); the graceful degradation
|
|
285
|
+
// happens here, where a miss is a safe outcome.
|
|
286
|
+
let key: string | undefined;
|
|
259
287
|
try {
|
|
288
|
+
key = await this.resolveKey(pathname, params, isIntercept);
|
|
289
|
+
|
|
260
290
|
const result = await store.get(key);
|
|
261
291
|
|
|
262
292
|
if (!result) {
|
|
@@ -272,6 +302,7 @@ export class CacheScope {
|
|
|
272
302
|
// error (handled by the outer catch).
|
|
273
303
|
let segments: ResolvedSegment[];
|
|
274
304
|
try {
|
|
305
|
+
const { deserializeSegments } = await import("./segment-codec.js");
|
|
275
306
|
segments = await deserializeSegments(cached.segments);
|
|
276
307
|
} catch (error) {
|
|
277
308
|
reportCacheError(
|
|
@@ -287,10 +318,22 @@ export class CacheScope {
|
|
|
287
318
|
return null;
|
|
288
319
|
}
|
|
289
320
|
|
|
290
|
-
//
|
|
321
|
+
// A hit serves content that was tagged at write time, so the document
|
|
322
|
+
// tag union must include this entry's tags for updateTag()/revalidateTag()
|
|
323
|
+
// to invalidate any full-page entry built on top of it. The write path
|
|
324
|
+
// records via cacheRoute (resolveCacheTags); the hit path records here.
|
|
325
|
+
recordRequestTags(cached.tags);
|
|
326
|
+
|
|
327
|
+
// Replay handle data. An empty string means the route pushed no handles —
|
|
328
|
+
// skip the decode entirely (the common case). Otherwise decode the
|
|
329
|
+
// Flight-encoded blob; a decode failure skips handle restore but keeps the
|
|
330
|
+
// valid cached segments.
|
|
291
331
|
const handleStore = _getRequestContext()?._handleStore;
|
|
292
|
-
if (handleStore) {
|
|
293
|
-
|
|
332
|
+
if (handleStore && cached.handles) {
|
|
333
|
+
const handlesRecord = await decodeHandles(cached.handles);
|
|
334
|
+
if (handlesRecord) {
|
|
335
|
+
restoreHandles(handlesRecord, handleStore);
|
|
336
|
+
}
|
|
294
337
|
}
|
|
295
338
|
|
|
296
339
|
if (INTERNAL_RANGO_DEBUG) {
|
|
@@ -304,11 +347,37 @@ export class CacheScope {
|
|
|
304
347
|
|
|
305
348
|
return { segments, shouldRevalidate };
|
|
306
349
|
} catch (error) {
|
|
307
|
-
|
|
350
|
+
// Covers a store.get() failure AND a throwing consumer key()/keyGenerator
|
|
351
|
+
// (resolveKey). Either way degrade to a cache miss so the render proceeds.
|
|
352
|
+
reportCacheError(
|
|
353
|
+
error,
|
|
354
|
+
"cache-read",
|
|
355
|
+
`[CacheScope] lookup ${key ?? "(key resolution failed)"}`,
|
|
356
|
+
);
|
|
308
357
|
return null;
|
|
309
358
|
}
|
|
310
359
|
}
|
|
311
360
|
|
|
361
|
+
/**
|
|
362
|
+
* Record this scope's segment-DSL cache({ tags }) into the request tag union
|
|
363
|
+
* synchronously, under the same gate cacheRoute() uses for a write.
|
|
364
|
+
*
|
|
365
|
+
* cacheRoute() already records these tags, but it is invoked inside
|
|
366
|
+
* requestCtx.waitUntil() by the cache-store middleware (and the proactive path
|
|
367
|
+
* re-resolves the whole tree before calling it), so its recording is deferred
|
|
368
|
+
* and RACES the document cache's post-body-drain snapshot of _requestTags. On a
|
|
369
|
+
* first-write (segment-cache miss) the document tag union could miss these
|
|
370
|
+
* tags, and updateTag()/revalidateTag() would then fail to invalidate the
|
|
371
|
+
* cached document until a later write reseeded it. Calling this synchronously
|
|
372
|
+
* in the request pipeline (before the snapshot) closes that window. Idempotent
|
|
373
|
+
* (the tag union is a Set), so the duplicate record in cacheRoute is harmless.
|
|
374
|
+
*/
|
|
375
|
+
recordTags(requestCtx: RequestContext | undefined): void {
|
|
376
|
+
if (!this.enabled) return;
|
|
377
|
+
if (!this.conditionAllows("write")) return;
|
|
378
|
+
recordRequestTags(resolveCacheTags(this.config, requestCtx), requestCtx);
|
|
379
|
+
}
|
|
380
|
+
|
|
312
381
|
/**
|
|
313
382
|
* Cache all segments for a route (non-blocking via waitUntil)
|
|
314
383
|
* Single cache entry per route request.
|
|
@@ -407,12 +476,18 @@ export class CacheScope {
|
|
|
407
476
|
);
|
|
408
477
|
}
|
|
409
478
|
|
|
410
|
-
// Serialize
|
|
411
|
-
|
|
479
|
+
// Serialize segments and Flight-encode handles in parallel. Handles go
|
|
480
|
+
// through the codec (not raw into the entry) so Promise/ReactNode handle
|
|
481
|
+
// values survive a JSON-serializing store — see encodeHandles.
|
|
482
|
+
const { serializeSegments } = await import("./segment-codec.js");
|
|
483
|
+
const [serializedSegments, encodedHandles] = await Promise.all([
|
|
484
|
+
serializeSegments(nonLoaderSegments),
|
|
485
|
+
encodeHandles(handles),
|
|
486
|
+
]);
|
|
412
487
|
|
|
413
488
|
const data: CachedEntryData = {
|
|
414
489
|
segments: serializedSegments,
|
|
415
|
-
handles,
|
|
490
|
+
handles: encodedHandles,
|
|
416
491
|
expiresAt: Date.now() + ttl * 1000,
|
|
417
492
|
tags,
|
|
418
493
|
};
|
package/src/cache/cache-tag.ts
CHANGED
|
@@ -18,35 +18,16 @@ import {
|
|
|
18
18
|
|
|
19
19
|
const cacheTagStorage = new AsyncLocalStorage<Set<string>>();
|
|
20
20
|
|
|
21
|
-
/**
|
|
22
|
-
* Normalize a tag for storage.
|
|
23
|
-
*
|
|
24
|
-
* Returns the tag unchanged if usable, or null if it is empty/whitespace-only
|
|
25
|
-
* (dropped consistently in every environment - an empty tag matches nothing).
|
|
26
|
-
*
|
|
27
|
-
* Backend-specific constraints are intentionally NOT enforced here so the tag
|
|
28
|
-
* primitive stays backend-agnostic. In particular, the CFCacheStore
|
|
29
|
-
* encodeURIComponent's tags at serialization time so commas/spaces/non-Latin1
|
|
30
|
-
* characters cannot corrupt the comma-delimited Cloudflare Cache-Tag header or
|
|
31
|
-
* the HTTP marker header (it does not reject them). Keep tags short and
|
|
32
|
-
* low-cardinality: a tag's KV marker key must stay under Cloudflare's 512-byte
|
|
33
|
-
* limit, and a Cache-Tag value under 1024 bytes. The in-memory store has no
|
|
34
|
-
* such limitations.
|
|
35
|
-
*
|
|
36
|
-
* @internal
|
|
37
|
-
*/
|
|
38
21
|
export function normalizeTag(tag: string): string | null {
|
|
39
|
-
|
|
40
|
-
|
|
22
|
+
// Trim and return the canonical (trimmed) form, not the raw tag. Both the
|
|
23
|
+
// write path (cacheTag) and the invalidate path (updateTag/revalidateTag)
|
|
24
|
+
// route through here, and matching is exact-string: returning the untrimmed
|
|
25
|
+
// tag made cacheTag(" products ") and updateTag("products") two different
|
|
26
|
+
// logical tags, a silent failure-to-invalidate (stale data served forever).
|
|
27
|
+
const trimmed = tag?.trim();
|
|
28
|
+
return trimmed ? trimmed : null;
|
|
41
29
|
}
|
|
42
30
|
|
|
43
|
-
/**
|
|
44
|
-
* Normalize a tag collection: drop empty/whitespace-only tags so the WRITE path
|
|
45
|
-
* matches the invalidate path (updateTag/revalidateTag/cacheTag all normalize).
|
|
46
|
-
* Does not deduplicate - callers that need that wrap with a Set.
|
|
47
|
-
*
|
|
48
|
-
* @internal
|
|
49
|
-
*/
|
|
50
31
|
export function normalizeTags(tags: Iterable<string>): string[] {
|
|
51
32
|
const out: string[] = [];
|
|
52
33
|
for (const tag of tags) {
|
|
@@ -89,19 +70,6 @@ export function cacheTag(...tags: string[]): void {
|
|
|
89
70
|
}
|
|
90
71
|
}
|
|
91
72
|
|
|
92
|
-
/**
|
|
93
|
-
* Record `tags` into the request-scoped tag set (ctx._requestTags), the union of
|
|
94
|
-
* every cache tag resolved while producing the response. The document cache reads
|
|
95
|
-
* this after the render settles so a full-page entry is tagged with everything its
|
|
96
|
-
* content used, making it invalidatable by updateTag()/revalidateTag().
|
|
97
|
-
*
|
|
98
|
-
* Called at the tag-resolution sites: "use cache" stores (cache-runtime, both the
|
|
99
|
-
* miss and read/hit paths), loader cache (cache-policy/loader-cache), and segment
|
|
100
|
-
* cache() (cache-scope). Writes the field directly (not via ctx.set()) so it does
|
|
101
|
-
* not trip the cache-scope side-effect guard, mirroring cacheTag() itself.
|
|
102
|
-
*
|
|
103
|
-
* @internal
|
|
104
|
-
*/
|
|
105
73
|
export function recordRequestTags(
|
|
106
74
|
tags: Iterable<string> | undefined,
|
|
107
75
|
ctx: RequestContext | undefined = _getRequestContext(),
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Base64 Helpers (binary-safe response body encoding for KV)
|
|
3
|
+
// ============================================================================
|
|
4
|
+
|
|
5
|
+
// Chunk size for String.fromCharCode.apply: large enough to amortize the call
|
|
6
|
+
// overhead, small enough to stay well under the JS engine argument-count limit
|
|
7
|
+
// (~65k). 8192 turns a per-byte concat loop into O(n/8192) apply calls.
|
|
8
|
+
const FROM_CHARCODE_CHUNK = 8192;
|
|
9
|
+
|
|
10
|
+
/** Encode ArrayBuffer to base64 string. */
|
|
11
|
+
export function bufferToBase64(buffer: ArrayBuffer): string {
|
|
12
|
+
const bytes = new Uint8Array(buffer);
|
|
13
|
+
// Build the binary (latin1) string in fixed-size chunks instead of one
|
|
14
|
+
// String.fromCharCode per byte. Identical output to the per-byte loop (each
|
|
15
|
+
// byte maps to the same code unit); just far fewer string concatenations for
|
|
16
|
+
// large document payloads.
|
|
17
|
+
let binary = "";
|
|
18
|
+
for (let i = 0; i < bytes.length; i += FROM_CHARCODE_CHUNK) {
|
|
19
|
+
const chunk = bytes.subarray(i, i + FROM_CHARCODE_CHUNK);
|
|
20
|
+
binary += String.fromCharCode.apply(null, chunk as unknown as number[]);
|
|
21
|
+
}
|
|
22
|
+
return btoa(binary);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Decode base64 string to ArrayBuffer. */
|
|
26
|
+
export function base64ToBuffer(base64: string): ArrayBuffer {
|
|
27
|
+
const binary = atob(base64);
|
|
28
|
+
const bytes = new Uint8Array(binary.length);
|
|
29
|
+
for (let i = 0; i < binary.length; i++) {
|
|
30
|
+
bytes[i] = binary.charCodeAt(i);
|
|
31
|
+
}
|
|
32
|
+
return bytes.buffer;
|
|
33
|
+
}
|