@rangojs/router 0.0.0-experimental.15 → 0.0.0-experimental.151
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +13 -0
- package/README.md +308 -451
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +1844 -237
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/{src/handles/index.ts → dist/handles/index.js} +1 -1
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -8
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +7554 -2070
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +142 -61
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +489 -0
- package/skills/caching/SKILL.md +413 -26
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +278 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +16 -18
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +96 -63
- package/skills/fonts/SKILL.md +7 -5
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +76 -436
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +215 -16
- package/skills/layout/SKILL.md +147 -7
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +629 -55
- package/skills/middleware/SKILL.md +251 -38
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +60 -21
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +296 -4
- package/skills/ppr/SKILL.md +658 -0
- package/skills/prerender/SKILL.md +487 -52
- package/skills/rango/SKILL.md +324 -29
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +264 -122
- package/skills/route/SKILL.md +359 -22
- package/skills/router-setup/SKILL.md +247 -34
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +126 -222
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +10 -9
- package/skills/typesafety/SKILL.md +45 -496
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +383 -0
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +77 -44
- package/src/bin/rango.ts +275 -29
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +348 -212
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +39 -0
- package/src/browser/merge-segment-loaders.ts +23 -13
- package/src/browser/navigation-bridge.ts +385 -576
- package/src/browser/navigation-client.ts +249 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +230 -124
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +88 -0
- package/src/browser/partial-update.ts +432 -365
- package/src/browser/prefetch/cache.ts +381 -0
- package/src/browser/prefetch/fetch.ts +462 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +209 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +284 -67
- package/src/browser/react/NavigationProvider.tsx +267 -109
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +70 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +272 -60
- package/src/browser/react/location-state.ts +90 -20
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +39 -13
- package/src/browser/react/use-navigation.ts +53 -69
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +164 -0
- package/src/browser/rsc-router.tsx +355 -73
- package/src/browser/scroll-restoration.ts +140 -50
- package/src/browser/segment-reconciler.ts +253 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +668 -613
- package/src/browser/types.ts +235 -51
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +243 -183
- package/src/build/generate-route-types.ts +41 -848
- package/src/build/index.ts +12 -7
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +218 -80
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +105 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +812 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +144 -0
- package/src/build/route-types/router-processing.ts +695 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +223 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +88 -0
- package/src/cache/cache-policy.ts +199 -0
- package/src/cache/cache-runtime.ts +695 -0
- package/src/cache/cache-scope.ts +324 -335
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2602 -156
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +17 -17
- package/src/cache/document-cache.ts +226 -102
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +132 -0
- package/src/cache/index.ts +24 -35
- package/src/cache/memory-segment-store.ts +446 -30
- package/src/cache/profile-registry.ts +88 -0
- package/src/cache/read-through-swr.ts +178 -0
- package/src/cache/segment-codec.ts +295 -0
- package/src/cache/shell-snapshot.ts +464 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +283 -211
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1201 -0
- package/src/client.rsc.tsx +43 -21
- package/src/client.tsx +131 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +13 -3
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +4 -2
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +106 -10
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +110 -35
- package/src/handles/MetaTags.tsx +83 -59
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +44 -53
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +20 -65
- package/src/host/errors.ts +21 -30
- package/src/host/index.ts +13 -9
- package/src/host/pattern-matcher.ts +50 -79
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +180 -35
- package/src/index.ts +245 -73
- package/src/internal-debug.ts +9 -2
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/build-shell-capture.ts +447 -0
- package/src/prerender/param-hash.ts +16 -14
- package/src/prerender/shell-manifest-key.ts +20 -0
- package/src/prerender/store.ts +131 -22
- package/src/prerender.ts +460 -26
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +22 -77
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +88 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +54 -0
- package/src/route-definition/redirect.ts +134 -0
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-definition.ts +1 -1481
- package/src/route-map-builder.ts +120 -145
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +71 -45
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +305 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +54 -27
- package/src/router/find-match.ts +259 -0
- package/src/router/handler-context.ts +385 -125
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +88 -28
- package/src/router/lazy-includes.ts +260 -0
- package/src/router/loader-resolution.ts +449 -157
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +144 -62
- package/src/router/match-api.ts +224 -256
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +499 -0
- package/src/router/match-middleware/background-revalidation.ts +117 -93
- package/src/router/match-middleware/cache-lookup.ts +308 -150
- package/src/router/match-middleware/cache-store.ts +123 -51
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +143 -52
- package/src/router/metrics.ts +235 -29
- package/src/router/middleware-types.ts +110 -0
- package/src/router/middleware.ts +526 -441
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +311 -142
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +575 -0
- package/src/router/preview-match.ts +102 -0
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +203 -62
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +45 -48
- package/src/router/router-interfaces.ts +564 -0
- package/src/router/router-options.ts +784 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +812 -0
- package/src/router/segment-resolution/helpers.ts +348 -0
- package/src/router/segment-resolution/loader-cache.ts +315 -0
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +99 -0
- package/src/router/segment-resolution/revalidation.ts +1340 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +25 -1354
- package/src/router/segment-wrappers.ts +292 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +259 -0
- package/src/router/telemetry.ts +385 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +240 -61
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +795 -2390
- package/src/rsc/capture-queue.ts +67 -0
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +956 -1164
- package/src/rsc/helpers.ts +736 -19
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +305 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +23 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +541 -0
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +257 -0
- package/src/rsc/rsc-rendering.ts +856 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +525 -0
- package/src/rsc/shell-build-manifest.ts +316 -0
- package/src/rsc/shell-capture-constants.ts +27 -0
- package/src/rsc/shell-capture.ts +1716 -0
- package/src/rsc/shell-serve.ts +226 -0
- package/src/rsc/ssr-setup.ts +176 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +95 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +99 -82
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-fragments.ts +124 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +464 -135
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +640 -85
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +337 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +123 -42
- package/src/server/loader-registry.ts +51 -100
- package/src/server/request-context.ts +1069 -152
- package/src/server.ts +15 -8
- package/src/ssr/index.tsx +661 -140
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/preinit-client-references.ts +106 -0
- package/src/ssr/ssr-root.tsx +261 -0
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +380 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +371 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +219 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +76 -98
- package/src/theme/ThemeScript.tsx +12 -14
- package/src/theme/constants.ts +57 -15
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +43 -39
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +850 -0
- package/src/types/index.ts +81 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +138 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +271 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +162 -0
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +44 -0
- package/src/urls/path-helper-types.ts +418 -0
- package/src/urls/path-helper.ts +280 -0
- package/src/urls/pattern-types.ts +189 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +316 -0
- package/src/urls/urls-function.ts +80 -0
- package/src/urls.ts +1 -1352
- package/src/use-loader.tsx +406 -141
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +408 -0
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +483 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/shell-prerender-phase.ts +397 -0
- package/src/vite/discovery/state.ts +205 -0
- package/src/vite/discovery/virtual-module-codegen.ts +293 -0
- package/src/vite/index.ts +31 -2255
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +336 -0
- package/src/vite/plugins/cjs-to-esm.ts +90 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
- package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +805 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +94 -0
- package/src/vite/plugins/version-plugin.ts +271 -0
- package/src/vite/plugins/virtual-entries.ts +267 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +600 -0
- package/src/vite/router-discovery.ts +2120 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +268 -0
- package/src/vite/utils/shared-utils.ts +271 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capture data snapshot: recording + seeding stores for PPR shell parity.
|
|
3
|
+
*
|
|
4
|
+
* The scar tissue this fixes: a PPR HIT serves frozen prelude bytes, then a
|
|
5
|
+
* FULL FRESH Flight render for hydration. Any shell-baked (non-hole) content
|
|
6
|
+
* that drifts between capture time and hit time — a cache() segment with a
|
|
7
|
+
* shorter ttl than the shell, a tag-invalidated item — makes the fresh payload
|
|
8
|
+
* disagree with the prelude, so React throws a hydration text mismatch and
|
|
9
|
+
* regenerates the tree client-side (wiping the FOUC theme class, flashing
|
|
10
|
+
* content). See docs/design/ppr-shell-resume.md.
|
|
11
|
+
*
|
|
12
|
+
* The fix (Next.js resume-data-cache analog, adapted to Rango's cache rings):
|
|
13
|
+
* the CAPTURE render records every cache-store read-hit and write it performed
|
|
14
|
+
* (the {@link RecordingShellStore}); the record rides inside the ShellCacheEntry
|
|
15
|
+
* as its `snapshot`; on a HIT the tail render reads through a
|
|
16
|
+
* {@link SeededShellStore} overlay that serves those recorded values AS FRESH,
|
|
17
|
+
* so the shell region reproduces byte-identically while everything NOT recorded
|
|
18
|
+
* (the holes — masked loaders were never executed at capture, so their reads
|
|
19
|
+
* were never recorded) stays live.
|
|
20
|
+
*
|
|
21
|
+
* The invariant, verbatim: the snapshot is exactly the set of cache-store reads
|
|
22
|
+
* the capture render performed; replaying them on a HIT reproduces the shell
|
|
23
|
+
* content byte-identically; everything not recorded stays live.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import type {
|
|
27
|
+
SegmentCacheStore,
|
|
28
|
+
CacheGetResult,
|
|
29
|
+
CacheItemResult,
|
|
30
|
+
CacheItemOptions,
|
|
31
|
+
CachedEntryData,
|
|
32
|
+
ShellCacheEntry,
|
|
33
|
+
ShellSnapshotRecord,
|
|
34
|
+
ShellSnapshotItemValue,
|
|
35
|
+
ShellSnapshotResponseValue,
|
|
36
|
+
ShellSnapshotLoaderValue,
|
|
37
|
+
} from "./types.js";
|
|
38
|
+
import { bufferToBase64, base64ToBuffer } from "./cf/cf-base64.js";
|
|
39
|
+
import { isPerClientSignalHeader } from "../browser/cookie-name.js";
|
|
40
|
+
|
|
41
|
+
/** Compose the last-write-wins map key. NUL (`\u0000`) cannot appear in a cache key. */
|
|
42
|
+
function recordKey(family: ShellSnapshotRecord["family"], key: string): string {
|
|
43
|
+
return `${family}\u0000${key}`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Serialize a Response to the snapshot's stored shape (base64 body). */
|
|
47
|
+
async function serializeResponse(
|
|
48
|
+
response: Response,
|
|
49
|
+
): Promise<ShellSnapshotResponseValue> {
|
|
50
|
+
const body = await response.clone().arrayBuffer();
|
|
51
|
+
const headers: [string, string][] = [];
|
|
52
|
+
response.headers.forEach((value, name) => {
|
|
53
|
+
// Mirror putResponse: per-client signal headers never enter a shared entry.
|
|
54
|
+
if (isPerClientSignalHeader(name)) return;
|
|
55
|
+
headers.push([name, value]);
|
|
56
|
+
});
|
|
57
|
+
return { status: response.status, headers, body: bufferToBase64(body) };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Rebuild a live Response from a snapshot's stored response shape. */
|
|
61
|
+
function deserializeResponse(value: ShellSnapshotResponseValue): Response {
|
|
62
|
+
return new Response(base64ToBuffer(value.body), {
|
|
63
|
+
status: value.status,
|
|
64
|
+
headers: new Headers(value.headers),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* A store wrapper the CAPTURE render reads through. Every call passes through to
|
|
70
|
+
* the underlying store unchanged; for the item/segment/response families it also
|
|
71
|
+
* RECORDS, last-write-wins per (family, key):
|
|
72
|
+
* - read-hits (get/getItem/getResponse returning non-null) — the value that
|
|
73
|
+
* fed the shell,
|
|
74
|
+
* - writes (set/setItem/putResponse) — the value a MISS computed and baked.
|
|
75
|
+
* The shell family (getShell/putShell) is never recorded (the snapshot rides
|
|
76
|
+
* inside a shell entry). Reads that MISS are not recorded (a miss produced no
|
|
77
|
+
* shell content; if the render then computed and wrote, that write is recorded).
|
|
78
|
+
*
|
|
79
|
+
* Deferred writes: cache writes run under waitUntil (fire-and-forget on Node,
|
|
80
|
+
* executionContext on workerd), so their setItem/set calls — hence their records
|
|
81
|
+
* — may land after the shell has quiesced. The capture collects those write
|
|
82
|
+
* promises via {@link trackWrite} and awaits them ({@link settleWrites}) before
|
|
83
|
+
* draining, so a MISS-at-capture value is still pinned.
|
|
84
|
+
*/
|
|
85
|
+
export class RecordingShellStore<
|
|
86
|
+
TEnv = unknown,
|
|
87
|
+
> implements SegmentCacheStore<TEnv> {
|
|
88
|
+
private readonly records = new Map<string, ShellSnapshotRecord>();
|
|
89
|
+
private readonly writes: Promise<unknown>[] = [];
|
|
90
|
+
|
|
91
|
+
constructor(private readonly inner: SegmentCacheStore<TEnv>) {}
|
|
92
|
+
|
|
93
|
+
get defaults(): SegmentCacheStore<TEnv>["defaults"] {
|
|
94
|
+
return this.inner.defaults;
|
|
95
|
+
}
|
|
96
|
+
get keyGenerator(): SegmentCacheStore<TEnv>["keyGenerator"] {
|
|
97
|
+
return this.inner.keyGenerator;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private record(
|
|
101
|
+
family: ShellSnapshotRecord["family"],
|
|
102
|
+
key: string,
|
|
103
|
+
value: ShellSnapshotRecord["value"],
|
|
104
|
+
): void {
|
|
105
|
+
this.records.set(recordKey(family, key), { family, key, value });
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Track a deferred cache-write promise so the capture can await it pre-drain. */
|
|
109
|
+
trackWrite(p: Promise<unknown>): void {
|
|
110
|
+
this.writes.push(p);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Record a segment-family write into the snapshot WITHOUT touching the inner
|
|
115
|
+
* store. The shell fast path's implicit doc-cache scope writes through this
|
|
116
|
+
* (via {@link SnapshotOnlySegmentStore}): the recorded doc entry must ride
|
|
117
|
+
* ONLY inside the shell entry — a passthrough write would leave a doc-keyed
|
|
118
|
+
* entry in the real store that the NEXT capture's lookup would hit, replaying
|
|
119
|
+
* the previous generation's segments instead of re-running handlers (breaking
|
|
120
|
+
* SWR recapture freshness).
|
|
121
|
+
*/
|
|
122
|
+
recordSegmentWrite(key: string, data: CachedEntryData): void {
|
|
123
|
+
this.record("segment", key, data);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Await the tracked deferred writes so their records are present before drain.
|
|
128
|
+
* Drains ITERATIVELY: a write task can schedule a NESTED write (the ring-3
|
|
129
|
+
* cacheRoute path schedules its actual store.set in a second waitUntil while the
|
|
130
|
+
* first is running), so each awaited batch may enqueue more. Loop until the
|
|
131
|
+
* queue empties or the deadline passes. Bounded: a pathologically slow write
|
|
132
|
+
* must never stall the capture task, so a key that does not settle in time is
|
|
133
|
+
* left unpinned (it drifts, the pre-snapshot behavior) rather than hanging.
|
|
134
|
+
*/
|
|
135
|
+
async settleWrites(timeoutMs: number): Promise<void> {
|
|
136
|
+
const deadline = Date.now() + timeoutMs;
|
|
137
|
+
while (this.writes.length > 0) {
|
|
138
|
+
const remaining = deadline - Date.now();
|
|
139
|
+
if (remaining <= 0) return;
|
|
140
|
+
// Take the current batch; new writes scheduled while awaiting accumulate in
|
|
141
|
+
// this.writes and are drained on the next iteration.
|
|
142
|
+
const batch = this.writes.splice(0);
|
|
143
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
144
|
+
const guard = new Promise<void>((resolve) => {
|
|
145
|
+
timer = setTimeout(resolve, remaining);
|
|
146
|
+
(timer as { unref?: () => void }).unref?.();
|
|
147
|
+
});
|
|
148
|
+
await Promise.race([Promise.allSettled(batch).then(() => {}), guard]);
|
|
149
|
+
if (timer) clearTimeout(timer);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** The recorded snapshot (last-write-wins per family+key), or undefined if empty. */
|
|
154
|
+
drainSnapshot(): ShellSnapshotRecord[] | undefined {
|
|
155
|
+
return this.records.size > 0 ? [...this.records.values()] : undefined;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async get(key: string): Promise<CacheGetResult | null> {
|
|
159
|
+
const result = await this.inner.get(key);
|
|
160
|
+
if (result) this.record("segment", key, result.data);
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async set(
|
|
165
|
+
key: string,
|
|
166
|
+
data: CachedEntryData,
|
|
167
|
+
ttl: number,
|
|
168
|
+
swr?: number,
|
|
169
|
+
): Promise<void> {
|
|
170
|
+
this.record("segment", key, data);
|
|
171
|
+
return this.inner.set(key, data, ttl, swr);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async delete(key: string): Promise<boolean> {
|
|
175
|
+
return this.inner.delete(key);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
async clear(): Promise<void> {
|
|
179
|
+
return this.inner.clear?.();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async getResponse(
|
|
183
|
+
key: string,
|
|
184
|
+
): Promise<{ response: Response; shouldRevalidate: boolean } | null> {
|
|
185
|
+
if (!this.inner.getResponse) return null;
|
|
186
|
+
const result = await this.inner.getResponse(key);
|
|
187
|
+
if (result)
|
|
188
|
+
this.record("response", key, await serializeResponse(result.response));
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async putResponse(
|
|
193
|
+
key: string,
|
|
194
|
+
response: Response,
|
|
195
|
+
ttl: number,
|
|
196
|
+
swr?: number,
|
|
197
|
+
tags?: string[],
|
|
198
|
+
): Promise<void> {
|
|
199
|
+
if (!this.inner.putResponse) return;
|
|
200
|
+
this.record("response", key, await serializeResponse(response));
|
|
201
|
+
return this.inner.putResponse(key, response, ttl, swr, tags);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async getItem(key: string): Promise<CacheItemResult | null> {
|
|
205
|
+
if (!this.inner.getItem) return null;
|
|
206
|
+
const result = await this.inner.getItem(key);
|
|
207
|
+
if (result) {
|
|
208
|
+
const value: ShellSnapshotItemValue = {
|
|
209
|
+
value: result.value,
|
|
210
|
+
handles: result.handles,
|
|
211
|
+
tags: result.tags,
|
|
212
|
+
};
|
|
213
|
+
this.record("item", key, value);
|
|
214
|
+
}
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
async setItem(
|
|
219
|
+
key: string,
|
|
220
|
+
value: string,
|
|
221
|
+
options?: CacheItemOptions,
|
|
222
|
+
): Promise<void> {
|
|
223
|
+
if (!this.inner.setItem) return;
|
|
224
|
+
const stored: ShellSnapshotItemValue = {
|
|
225
|
+
value,
|
|
226
|
+
handles: options?.handles,
|
|
227
|
+
tags: options?.tags,
|
|
228
|
+
};
|
|
229
|
+
this.record("item", key, stored);
|
|
230
|
+
return this.inner.setItem(key, value, options);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
async getShell(
|
|
234
|
+
key: string,
|
|
235
|
+
): Promise<{ entry: ShellCacheEntry; shouldRevalidate?: boolean } | null> {
|
|
236
|
+
return this.inner.getShell ? this.inner.getShell(key) : null;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
async putShell(
|
|
240
|
+
key: string,
|
|
241
|
+
entry: ShellCacheEntry,
|
|
242
|
+
ttlSeconds?: number,
|
|
243
|
+
swrSeconds?: number,
|
|
244
|
+
tags?: string[],
|
|
245
|
+
): Promise<void> {
|
|
246
|
+
return this.inner.putShell?.(key, entry, ttlSeconds, swrSeconds, tags);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
async invalidateTags(tags: string[]): Promise<void> {
|
|
250
|
+
return this.inner.invalidateTags?.(tags);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** True iff `store` is a RecordingShellStore (duck-typed across module copies). */
|
|
255
|
+
export function getRecordingStore<TEnv>(
|
|
256
|
+
store: SegmentCacheStore<TEnv> | undefined,
|
|
257
|
+
): RecordingShellStore<TEnv> | undefined {
|
|
258
|
+
return store instanceof RecordingShellStore ? store : undefined;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* The store the shell fast path's IMPLICIT doc-cache scope resolves during a
|
|
263
|
+
* capture: reads pass through the recording store (a real-store hit is
|
|
264
|
+
* recorded, exactly like any capture read), but segment WRITES are recorded
|
|
265
|
+
* into the snapshot only — see {@link RecordingShellStore.recordSegmentWrite}
|
|
266
|
+
* for why passthrough would break SWR recapture. Routes with their OWN
|
|
267
|
+
* cache() config never see this store (their scope resolves the app-level
|
|
268
|
+
* recording store and keeps today's record-and-write behavior).
|
|
269
|
+
*/
|
|
270
|
+
export class SnapshotOnlySegmentStore<
|
|
271
|
+
TEnv = unknown,
|
|
272
|
+
> implements SegmentCacheStore<TEnv> {
|
|
273
|
+
constructor(private readonly recording: RecordingShellStore<TEnv>) {}
|
|
274
|
+
|
|
275
|
+
get defaults(): SegmentCacheStore<TEnv>["defaults"] {
|
|
276
|
+
return this.recording.defaults;
|
|
277
|
+
}
|
|
278
|
+
get keyGenerator(): SegmentCacheStore<TEnv>["keyGenerator"] {
|
|
279
|
+
return this.recording.keyGenerator;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
async get(key: string): Promise<CacheGetResult | null> {
|
|
283
|
+
return this.recording.get(key);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
async set(key: string, data: CachedEntryData): Promise<void> {
|
|
287
|
+
this.recording.recordSegmentWrite(key, data);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
async delete(key: string): Promise<boolean> {
|
|
291
|
+
return this.recording.delete(key);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Materialize the loader-family seed from a shell snapshot for a HIT's tail
|
|
297
|
+
* render: Flight-deserialize each recorded (promise-elided) bake-lane
|
|
298
|
+
* container into a segment-key -> container Map, which serveShellHit assigns
|
|
299
|
+
* to the tail context's `_shellLoaderSeed` for the resolveLoaderData overlay.
|
|
300
|
+
* Lives here so every snapshot family is decoded in this module (the
|
|
301
|
+
* item/segment/response families via {@link SeededShellStore}); the loader
|
|
302
|
+
* family is not a store read, so it seeds the context instead of a store.
|
|
303
|
+
*
|
|
304
|
+
* Deserializations run in parallel; a record that fails to decode is skipped
|
|
305
|
+
* (that loader drifts — the pre-snapshot behavior — instead of failing the
|
|
306
|
+
* HIT). Returns undefined when the snapshot carries no loader records, without
|
|
307
|
+
* touching the Flight codec (kept lazy for cold paths and non-RSC configs).
|
|
308
|
+
*/
|
|
309
|
+
export async function buildShellLoaderSeed(
|
|
310
|
+
snapshot: ShellSnapshotRecord[],
|
|
311
|
+
): Promise<Map<string, unknown> | undefined> {
|
|
312
|
+
const loaderRecords: ShellSnapshotRecord[] = [];
|
|
313
|
+
for (const rec of snapshot) {
|
|
314
|
+
if (rec.family === "loader") loaderRecords.push(rec);
|
|
315
|
+
}
|
|
316
|
+
if (loaderRecords.length === 0) return undefined;
|
|
317
|
+
|
|
318
|
+
const { deserializeResult } = await import("./segment-codec.js");
|
|
319
|
+
const entries = await Promise.all(
|
|
320
|
+
loaderRecords.map(async (rec): Promise<[string, unknown] | null> => {
|
|
321
|
+
try {
|
|
322
|
+
return [
|
|
323
|
+
rec.key,
|
|
324
|
+
await deserializeResult(
|
|
325
|
+
(rec.value as ShellSnapshotLoaderValue).value,
|
|
326
|
+
),
|
|
327
|
+
];
|
|
328
|
+
} catch {
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
331
|
+
}),
|
|
332
|
+
);
|
|
333
|
+
const seed = new Map<string, unknown>();
|
|
334
|
+
for (const entry of entries) {
|
|
335
|
+
if (entry) seed.set(entry[0], entry[1]);
|
|
336
|
+
}
|
|
337
|
+
return seed.size > 0 ? seed : undefined;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* A read-through overlay the HIT tail render reads through. For a key present in
|
|
342
|
+
* the snapshot it serves the recorded value AS FRESH (shouldRevalidate: false —
|
|
343
|
+
* a pinned key must NOT kick SWR background revalidation) so the tail's payload
|
|
344
|
+
* matches the frozen prelude. Every other read falls through to the real store
|
|
345
|
+
* (the holes — masked loaders were never recorded — stay live). ALL writes pass
|
|
346
|
+
* through unchanged: a live hole's loader may legitimately write. The shell
|
|
347
|
+
* family always passes through.
|
|
348
|
+
*/
|
|
349
|
+
export class SeededShellStore<
|
|
350
|
+
TEnv = unknown,
|
|
351
|
+
> implements SegmentCacheStore<TEnv> {
|
|
352
|
+
private readonly items = new Map<string, ShellSnapshotItemValue>();
|
|
353
|
+
private readonly segments = new Map<string, CachedEntryData>();
|
|
354
|
+
private readonly responses = new Map<string, ShellSnapshotResponseValue>();
|
|
355
|
+
|
|
356
|
+
constructor(
|
|
357
|
+
private readonly inner: SegmentCacheStore<TEnv>,
|
|
358
|
+
snapshot: ShellSnapshotRecord[],
|
|
359
|
+
) {
|
|
360
|
+
for (const rec of snapshot) {
|
|
361
|
+
if (rec.family === "item") {
|
|
362
|
+
this.items.set(rec.key, rec.value as ShellSnapshotItemValue);
|
|
363
|
+
} else if (rec.family === "segment") {
|
|
364
|
+
this.segments.set(rec.key, rec.value as CachedEntryData);
|
|
365
|
+
} else if (rec.family === "response") {
|
|
366
|
+
this.responses.set(rec.key, rec.value as ShellSnapshotResponseValue);
|
|
367
|
+
}
|
|
368
|
+
// "loader" family records are not store reads — serveShellHit seeds them
|
|
369
|
+
// onto the tail context (_shellLoaderSeed) for the resolveLoaderData
|
|
370
|
+
// overlay instead.
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
get defaults(): SegmentCacheStore<TEnv>["defaults"] {
|
|
375
|
+
return this.inner.defaults;
|
|
376
|
+
}
|
|
377
|
+
get keyGenerator(): SegmentCacheStore<TEnv>["keyGenerator"] {
|
|
378
|
+
return this.inner.keyGenerator;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
async get(key: string): Promise<CacheGetResult | null> {
|
|
382
|
+
const seeded = this.segments.get(key);
|
|
383
|
+
if (seeded) return { data: seeded, shouldRevalidate: false };
|
|
384
|
+
return this.inner.get(key);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
async set(
|
|
388
|
+
key: string,
|
|
389
|
+
data: CachedEntryData,
|
|
390
|
+
ttl: number,
|
|
391
|
+
swr?: number,
|
|
392
|
+
): Promise<void> {
|
|
393
|
+
return this.inner.set(key, data, ttl, swr);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
async delete(key: string): Promise<boolean> {
|
|
397
|
+
return this.inner.delete(key);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
async clear(): Promise<void> {
|
|
401
|
+
return this.inner.clear?.();
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
async getResponse(
|
|
405
|
+
key: string,
|
|
406
|
+
): Promise<{ response: Response; shouldRevalidate: boolean } | null> {
|
|
407
|
+
const seeded = this.responses.get(key);
|
|
408
|
+
if (seeded) {
|
|
409
|
+
return { response: deserializeResponse(seeded), shouldRevalidate: false };
|
|
410
|
+
}
|
|
411
|
+
return this.inner.getResponse ? this.inner.getResponse(key) : null;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
async putResponse(
|
|
415
|
+
key: string,
|
|
416
|
+
response: Response,
|
|
417
|
+
ttl: number,
|
|
418
|
+
swr?: number,
|
|
419
|
+
tags?: string[],
|
|
420
|
+
): Promise<void> {
|
|
421
|
+
return this.inner.putResponse?.(key, response, ttl, swr, tags);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
async getItem(key: string): Promise<CacheItemResult | null> {
|
|
425
|
+
const seeded = this.items.get(key);
|
|
426
|
+
if (seeded) {
|
|
427
|
+
return {
|
|
428
|
+
value: seeded.value,
|
|
429
|
+
handles: seeded.handles,
|
|
430
|
+
tags: seeded.tags,
|
|
431
|
+
shouldRevalidate: false,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
return this.inner.getItem ? this.inner.getItem(key) : null;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
async setItem(
|
|
438
|
+
key: string,
|
|
439
|
+
value: string,
|
|
440
|
+
options?: CacheItemOptions,
|
|
441
|
+
): Promise<void> {
|
|
442
|
+
return this.inner.setItem?.(key, value, options);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
async getShell(
|
|
446
|
+
key: string,
|
|
447
|
+
): Promise<{ entry: ShellCacheEntry; shouldRevalidate?: boolean } | null> {
|
|
448
|
+
return this.inner.getShell ? this.inner.getShell(key) : null;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
async putShell(
|
|
452
|
+
key: string,
|
|
453
|
+
entry: ShellCacheEntry,
|
|
454
|
+
ttlSeconds?: number,
|
|
455
|
+
swrSeconds?: number,
|
|
456
|
+
tags?: string[],
|
|
457
|
+
): Promise<void> {
|
|
458
|
+
return this.inner.putShell?.(key, entry, ttlSeconds, swrSeconds, tags);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
async invalidateTags(tags: string[]): Promise<void> {
|
|
462
|
+
return this.inner.invalidateTags?.(tags);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache Tag Invalidation API
|
|
3
|
+
*
|
|
4
|
+
* Two on-demand invalidation verbs, mirroring the distinction popularized by
|
|
5
|
+
* Next.js so consumers can pick the right consistency model:
|
|
6
|
+
*
|
|
7
|
+
* - updateTag(...tags): read-your-own-writes. Awaitable - resolves only after
|
|
8
|
+
* in-process invalidation across every configured store completes. Use in a
|
|
9
|
+
* Server Action and `await` it before the action re-renders, so the action's
|
|
10
|
+
* own response reflects the mutation.
|
|
11
|
+
*
|
|
12
|
+
* - revalidateTag(...tags): fire-and-forget via waitUntil - the response is not
|
|
13
|
+
* blocked. Use in Route Handlers / webhooks. NOTE: both verbs hard-purge; the
|
|
14
|
+
* only difference is awaitability. revalidateTag does NOT serve stale content -
|
|
15
|
+
* the next read after the invalidation lands is a hard miss that re-renders.
|
|
16
|
+
* (The name mirrors Next.js, where it is SWR; here it is background-purge.)
|
|
17
|
+
*
|
|
18
|
+
* Both fan out across the app-level store (ctx._cacheStore) and every explicit
|
|
19
|
+
* per-scope store from cache({ store }) registered for this handler
|
|
20
|
+
* (ctx._explicitTaggedStores), calling the store-level invalidateTags()
|
|
21
|
+
* primitive for each tag. A single configured store (the common case) owns its
|
|
22
|
+
* own tag index and distributed invalidation - there is no separate
|
|
23
|
+
* tag-invalidation store.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { _getRequestContext } from "../server/request-context.js";
|
|
27
|
+
import { reportingAsync } from "./cache-error.js";
|
|
28
|
+
import { normalizeTags } from "./cache-tag.js";
|
|
29
|
+
import type { SegmentCacheStore } from "./types.js";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Collect every store that may hold entries tagged for this request's handler:
|
|
33
|
+
* the app-level store plus all explicit per-scope stores (deduplicated). Splits
|
|
34
|
+
* them into tag-capable (implement invalidateTags()) and not, so callers can
|
|
35
|
+
* warn about configured stores whose tagged entries will NOT be invalidated.
|
|
36
|
+
*
|
|
37
|
+
* `hasContext` reports whether an ALS request context existed at all. Without one
|
|
38
|
+
* (e.g. a queue consumer or cron job calling updateTag/revalidateTag) no stores
|
|
39
|
+
* are reachable, and the empty-capable case is a missing-context problem, not a
|
|
40
|
+
* store-config problem - callers branch on this to warn about the right cause.
|
|
41
|
+
*/
|
|
42
|
+
function collectStores(): {
|
|
43
|
+
capable: SegmentCacheStore[];
|
|
44
|
+
incapable: number;
|
|
45
|
+
hasContext: boolean;
|
|
46
|
+
} {
|
|
47
|
+
const ctx = _getRequestContext();
|
|
48
|
+
const stores = new Set<SegmentCacheStore>();
|
|
49
|
+
if (ctx?._cacheStore) stores.add(ctx._cacheStore);
|
|
50
|
+
if (ctx?._explicitTaggedStores) {
|
|
51
|
+
for (const store of ctx._explicitTaggedStores) stores.add(store);
|
|
52
|
+
}
|
|
53
|
+
const capable: SegmentCacheStore[] = [];
|
|
54
|
+
let incapable = 0;
|
|
55
|
+
for (const store of stores) {
|
|
56
|
+
if (typeof store.invalidateTags === "function") capable.push(store);
|
|
57
|
+
else incapable++;
|
|
58
|
+
}
|
|
59
|
+
return { capable, incapable, hasContext: ctx != null };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Production-visible warning. A misconfigured store silently dropping
|
|
64
|
+
* invalidations is a data-correctness footgun, so this surfaces in every
|
|
65
|
+
* environment (not dev-only).
|
|
66
|
+
*/
|
|
67
|
+
function warnNoTagStore(fn: string, tags: string[]): void {
|
|
68
|
+
console.warn(
|
|
69
|
+
`[${fn}] No tag-capable cache store is configured; tags ` +
|
|
70
|
+
`[${tags.join(", ")}] were not invalidated. The configured store must ` +
|
|
71
|
+
`implement invalidateTags() (the built-in MemorySegmentCacheStore and ` +
|
|
72
|
+
`CFCacheStore do).`,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Production-visible warning for the no-request-context case. Distinct from
|
|
78
|
+
* warnNoTagStore: the stores are not unreachable because they are misconfigured,
|
|
79
|
+
* but because there is no ALS request context to reach them through (e.g. a queue
|
|
80
|
+
* consumer or scheduled job). Naming the real cause keeps consumers from chasing
|
|
81
|
+
* a store-config red herring.
|
|
82
|
+
*/
|
|
83
|
+
function warnNoRequestContext(fn: string, tags: string[]): void {
|
|
84
|
+
console.warn(
|
|
85
|
+
`[${fn}] Called outside a request context (e.g. from a queue consumer or ` +
|
|
86
|
+
`scheduled job); no cache stores are reachable and tags ` +
|
|
87
|
+
`[${tags.join(", ")}] were not invalidated. Invoke it within a request ` +
|
|
88
|
+
`(Server Action or route handler).`,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Production-visible warning for mixed-store configs: at least one configured
|
|
94
|
+
* store does not support tag invalidation, so its tagged entries (if any) are
|
|
95
|
+
* left stale even though other stores were invalidated.
|
|
96
|
+
*/
|
|
97
|
+
function warnPartialTagStore(fn: string, incapable: number): void {
|
|
98
|
+
console.warn(
|
|
99
|
+
`[${fn}] ${incapable} configured cache store(s) do not implement ` +
|
|
100
|
+
`invalidateTags(); their tagged entries were NOT invalidated. Use a ` +
|
|
101
|
+
`tag-capable store (e.g. MemorySegmentCacheStore / CFCacheStore) for any ` +
|
|
102
|
+
`cache({ store }) boundary whose entries you invalidate by tag.`,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function invalidateAcross(
|
|
107
|
+
stores: SegmentCacheStore[],
|
|
108
|
+
tags: string[],
|
|
109
|
+
): Promise<void> {
|
|
110
|
+
// One invalidateTags(tags) call per store: the store receives the whole tag
|
|
111
|
+
// batch so it can do a single CDN purge request rather than one per tag.
|
|
112
|
+
//
|
|
113
|
+
// allSettled, not all: a store's invalidateTags() can reject (e.g. CFCacheStore
|
|
114
|
+
// surfaces a failed durable KV marker write). With Promise.all, the first
|
|
115
|
+
// rejection would short-circuit and the other stores' outcomes would go
|
|
116
|
+
// unobserved. Attempt every store, then surface a combined error so an awaited
|
|
117
|
+
// updateTag() still rejects (read-your-own-writes honesty) without masking the
|
|
118
|
+
// stores that did succeed.
|
|
119
|
+
const results = await Promise.allSettled(
|
|
120
|
+
stores.map((store) => store.invalidateTags!(tags)),
|
|
121
|
+
);
|
|
122
|
+
const errors = results
|
|
123
|
+
.filter((r): r is PromiseRejectedResult => r.status === "rejected")
|
|
124
|
+
.map((r) => r.reason);
|
|
125
|
+
if (errors.length > 0) {
|
|
126
|
+
const err = new Error(
|
|
127
|
+
`[tag invalidation] ${errors.length}/${stores.length} store(s) failed to ` +
|
|
128
|
+
`invalidate tags [${tags.join(", ")}]; their entries may still serve ` +
|
|
129
|
+
`stale data. Retry the invalidation.`,
|
|
130
|
+
);
|
|
131
|
+
(err as Error & { cause?: unknown }).cause = errors[0];
|
|
132
|
+
throw err;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Immediately expire every cache entry tagged with any of `tags`, resolving
|
|
138
|
+
* once in-process invalidation across all configured stores completes.
|
|
139
|
+
*
|
|
140
|
+
* Read-your-own-writes: because the returned promise resolves before you return
|
|
141
|
+
* from a Server Action, awaiting it guarantees the action's own re-render (and
|
|
142
|
+
* any subsequent read) sees fresh data.
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* ```typescript
|
|
146
|
+
* async function updateProduct(formData: FormData) {
|
|
147
|
+
* "use server";
|
|
148
|
+
* await db.updateProduct(formData);
|
|
149
|
+
* await updateTag("products"); // next render is fresh
|
|
150
|
+
* }
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
export async function updateTag(...tags: string[]): Promise<void> {
|
|
154
|
+
const valid = normalizeTags(tags);
|
|
155
|
+
if (valid.length === 0) return;
|
|
156
|
+
|
|
157
|
+
const { capable, incapable, hasContext } = collectStores();
|
|
158
|
+
if (capable.length === 0) {
|
|
159
|
+
if (hasContext) warnNoTagStore("updateTag", valid);
|
|
160
|
+
else warnNoRequestContext("updateTag", valid);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (incapable > 0) warnPartialTagStore("updateTag", incapable);
|
|
164
|
+
|
|
165
|
+
await invalidateAcross(capable, valid);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Invalidate every cache entry tagged with any of `tags` in the background,
|
|
170
|
+
* without blocking the current response (fire-and-forget via waitUntil).
|
|
171
|
+
*
|
|
172
|
+
* This is NOT stale-while-revalidate: like updateTag() it hard-purges, so the
|
|
173
|
+
* next read after the invalidation lands is a miss that re-renders fresh. The
|
|
174
|
+
* only difference from updateTag() is awaitability - revalidateTag() defers the
|
|
175
|
+
* purge off the response path and is not awaited.
|
|
176
|
+
*
|
|
177
|
+
* Use in Route Handlers / webhooks. For read-your-own-writes inside a Server
|
|
178
|
+
* Action, use updateTag() instead so the action's own response is fresh.
|
|
179
|
+
*
|
|
180
|
+
* Fire-and-forget: because this returns void and runs in the background, a
|
|
181
|
+
* failed durable marker write (e.g. a transient KV outage) is NOT surfaced to
|
|
182
|
+
* the caller. It IS reported - logged loudly and routed through the router's
|
|
183
|
+
* `onError` callback (phase `cache`, `metadata.category === "cache-invalidate"`)
|
|
184
|
+
* via reportingAsync - so the failure is observable in telemetry even though it
|
|
185
|
+
* cannot be awaited. If you need the invalidation to be CONFIRMED (and to retry
|
|
186
|
+
* on failure), use `await updateTag()` instead, which rejects when a store's
|
|
187
|
+
* durable write fails.
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```typescript
|
|
191
|
+
* // route handler invoked by an external webhook
|
|
192
|
+
* export async function POST() {
|
|
193
|
+
* "use server";
|
|
194
|
+
* revalidateTag("products");
|
|
195
|
+
* return new Response("ok");
|
|
196
|
+
* }
|
|
197
|
+
* ```
|
|
198
|
+
*/
|
|
199
|
+
export function revalidateTag(...tags: string[]): void {
|
|
200
|
+
const valid = normalizeTags(tags);
|
|
201
|
+
if (valid.length === 0) return;
|
|
202
|
+
|
|
203
|
+
const { capable, incapable, hasContext } = collectStores();
|
|
204
|
+
if (capable.length === 0) {
|
|
205
|
+
if (hasContext) warnNoTagStore("revalidateTag", valid);
|
|
206
|
+
else warnNoRequestContext("revalidateTag", valid);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if (incapable > 0) warnPartialTagStore("revalidateTag", incapable);
|
|
210
|
+
|
|
211
|
+
const ctx = _getRequestContext();
|
|
212
|
+
// reportingAsync never rejects: it catches a failed durable write and routes
|
|
213
|
+
// it through reportCacheError (loud log + onError). This is the only place a
|
|
214
|
+
// revalidateTag failure can be observed, since it is not awaitable. Pass ctx
|
|
215
|
+
// explicitly - the run executes in a detached waitUntil where the ALS context
|
|
216
|
+
// is gone, so onError fires only if we hand it the captured context.
|
|
217
|
+
const run = () =>
|
|
218
|
+
reportingAsync(
|
|
219
|
+
() => invalidateAcross(capable, valid),
|
|
220
|
+
"cache-invalidate",
|
|
221
|
+
"[revalidateTag] background invalidation",
|
|
222
|
+
ctx,
|
|
223
|
+
);
|
|
224
|
+
if (ctx?.waitUntil) {
|
|
225
|
+
ctx.waitUntil(run);
|
|
226
|
+
} else {
|
|
227
|
+
// No request context (e.g. called outside ALS): best-effort background run.
|
|
228
|
+
void run();
|
|
229
|
+
}
|
|
230
|
+
}
|