@rangojs/router 0.0.0-experimental.134 → 0.0.0-experimental.135
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/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 +7 -2
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/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 +20 -19
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +23 -24
- package/skills/loader/SKILL.md +10 -0
- package/skills/migrate-react-router/SKILL.md +144 -1
- package/skills/testing/render-handler.md +15 -14
- package/skills/use-cache/SKILL.md +11 -0
- package/src/browser/navigation-client.ts +12 -0
- package/src/browser/partial-update.ts +16 -1
- package/src/cache/cache-runtime.ts +26 -5
- package/src/cache/document-cache.ts +17 -1
- package/src/cache/profile-registry.ts +15 -0
- package/src/cache/read-through-swr.ts +15 -1
- package/src/router/match-middleware/background-revalidation.ts +40 -23
- package/src/router/match-middleware/cache-store.ts +39 -24
- package/src/router/segment-resolution/loader-cache.ts +14 -2
- package/src/rsc/progressive-enhancement.ts +25 -0
- package/src/rsc/server-action.ts +6 -0
- package/src/segment-system.tsx +33 -0
- package/src/server/loader-registry.ts +13 -1
- package/src/server/request-context.ts +11 -0
- package/src/testing/render-handler.ts +14 -0
- package/src/vite/plugins/version-injector.ts +22 -7
- package/src/vite/plugins/virtual-entries.ts +28 -9
package/skills/loader/SKILL.md
CHANGED
|
@@ -671,6 +671,16 @@ export const SearchLoader = createLoader(async (ctx) => {
|
|
|
671
671
|
}, true); // true = fetchable
|
|
672
672
|
```
|
|
673
673
|
|
|
674
|
+
> **No registration needed — and no worker-entry import.** A fetchable loader
|
|
675
|
+
> does not have to be registered with `loader()` in the route DSL, and it does
|
|
676
|
+
> not have to be imported by any server module. Importing it into the client
|
|
677
|
+
> component that calls `useFetchLoader()` / `load()` is enough. Rango discovers
|
|
678
|
+
> every `createLoader(fn, true)` at build time and registers it for the
|
|
679
|
+
> `_rsc_loader` endpoint, so a loader reachable only through a client component
|
|
680
|
+
> still resolves in production — on both the generated entry and a hand-written
|
|
681
|
+
> worker entry (e.g. a Cloudflare `worker.rsc.tsx`). You do **not** need to
|
|
682
|
+
> force-import the loader in your worker entry to make it resolve.
|
|
683
|
+
|
|
674
684
|
### Fetchable Loader with Middleware
|
|
675
685
|
|
|
676
686
|
Pass an options object instead of `true` to attach per-loader middleware.
|
|
@@ -740,7 +740,135 @@ function ThemeToggle() {
|
|
|
740
740
|
|
|
741
741
|
See `/theme` for full API including system detection and cookie persistence.
|
|
742
742
|
|
|
743
|
-
## 10.
|
|
743
|
+
## 10. Cloudflare Workers: streaming, dev tooling, and deploy
|
|
744
|
+
|
|
745
|
+
This is the part of an RR7-on-Cloudflare migration that the API tables above do
|
|
746
|
+
**not** cover, and it produces symptoms that look like router bugs but aren't.
|
|
747
|
+
RR7 serves a fully-rendered HTML/Turbo-Stream response; Rango serves a **streamed**
|
|
748
|
+
RSC/SSR response. Anything in the request path that was harmless for RR7 but
|
|
749
|
+
**buffers the response** silently kills that stream — the `loading()` /
|
|
750
|
+
`<Suspense>` fallback never shows and the page appears "awaited" (old content
|
|
751
|
+
held until everything resolves).
|
|
752
|
+
|
|
753
|
+
### 10a. Never buffer the Rango response in a custom worker entry
|
|
754
|
+
|
|
755
|
+
RR7 Cloudflare entries commonly **rewrite the response body** — `await
|
|
756
|
+
response.text()` / `await response.arrayBuffer()`, `HTMLRewriter`, cookie/URL
|
|
757
|
+
rewriting, hybrid-proxy bridging. That is fine for RR7's complete HTML, but if it
|
|
758
|
+
runs on the **Rango** path it consumes the stream and you lose streaming
|
|
759
|
+
entirely.
|
|
760
|
+
|
|
761
|
+
Rule: in the worker entry, the Rango response must pass through as a **stream**.
|
|
762
|
+
Buffer only on non-Rango branches (a legacy/SFRA proxy, an error page).
|
|
763
|
+
|
|
764
|
+
```typescript
|
|
765
|
+
// BAD — buffers the whole RSC stream before returning (no streaming, no fallback)
|
|
766
|
+
const response = await router.fetch(request, { env, ctx });
|
|
767
|
+
const body = await response.text(); // <- drains the stream
|
|
768
|
+
return new Response(rewrite(body), response);
|
|
769
|
+
|
|
770
|
+
// GOOD — pass the body through as a stream (re-wrap headers only)
|
|
771
|
+
const response = await router.fetch(request, { env, ctx });
|
|
772
|
+
return new Response(response.body, response); // <- streams; safe to add headers
|
|
773
|
+
```
|
|
774
|
+
|
|
775
|
+
If you keep a legacy proxy (e.g. an SFRA/host fallback) that legitimately buffers
|
|
776
|
+
to rewrite HTML, gate it so it only runs for proxied paths — never for the
|
|
777
|
+
`router.fetch()` result.
|
|
778
|
+
|
|
779
|
+
Keep the custom entry itself (host/site resolution, sessions, proxy fallback) —
|
|
780
|
+
that's real product logic, not a deviation. Just don't let it touch the stream.
|
|
781
|
+
|
|
782
|
+
### 10b. Use `vite dev` / `vite preview`, not `wrangler dev`, for local work
|
|
783
|
+
|
|
784
|
+
The `@cloudflare/vite-plugin` runs **your worker entry** inside miniflare for both
|
|
785
|
+
`vite dev` and `vite preview`, with bindings + `.dev.vars`, and it **streams**.
|
|
786
|
+
`wrangler dev` does **not** stream RSC locally: it gzip-compresses the response by
|
|
787
|
+
buffering the entire body before sending. Measured on a bare streaming Worker
|
|
788
|
+
under `wrangler dev`: `Accept-Encoding: gzip` → first byte at the full delay
|
|
789
|
+
(buffered); `Accept-Encoding: identity` → first byte at ~3ms (streams). The
|
|
790
|
+
deployed Cloudflare edge does **streaming** compression, so this is a
|
|
791
|
+
**local-`wrangler dev`-only artifact** — do not mistake it for a production
|
|
792
|
+
streaming bug (verify the deployed edge with `curl` and watch chunk timing /
|
|
793
|
+
`transfer-encoding: chunked`).
|
|
794
|
+
|
|
795
|
+
```jsonc
|
|
796
|
+
// package.json — the standard rango-on-Workers shape
|
|
797
|
+
"dev": "vite", // streams, bindings, .dev.vars live
|
|
798
|
+
"build": "vite build",
|
|
799
|
+
"preview": "vite preview", // runs the built worker in workerd; also streams
|
|
800
|
+
// wrangler is only for: wrangler deploy / wrangler secret
|
|
801
|
+
```
|
|
802
|
+
|
|
803
|
+
If a workflow truly requires `wrangler dev`, declare `Content-Encoding: identity`
|
|
804
|
+
on streamed responses, gated to local hostnames (so the edge still compresses):
|
|
805
|
+
|
|
806
|
+
```typescript
|
|
807
|
+
if (
|
|
808
|
+
isLocalHostname(url.hostname) &&
|
|
809
|
+
response.body &&
|
|
810
|
+
!response.headers.has("content-encoding")
|
|
811
|
+
) {
|
|
812
|
+
const ct = (response.headers.get("content-type") ?? "").toLowerCase();
|
|
813
|
+
if (ct.includes("text/html") || ct.includes("text/x-component")) {
|
|
814
|
+
const headers = new Headers(response.headers);
|
|
815
|
+
headers.set("content-encoding", "identity"); // wrangler skips gzip -> streams
|
|
816
|
+
return new Response(response.body, {
|
|
817
|
+
status: response.status,
|
|
818
|
+
statusText: response.statusText,
|
|
819
|
+
headers,
|
|
820
|
+
});
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
### 10c. `.dev.vars` loads differently per tool
|
|
826
|
+
|
|
827
|
+
A frequent "my env vars vanished after migration" symptom — it's the tool, not
|
|
828
|
+
the file:
|
|
829
|
+
|
|
830
|
+
| Command | How `.dev.vars` is loaded |
|
|
831
|
+
| -------------- | ------------------------------------------------------------------------------------ |
|
|
832
|
+
| `wrangler dev` | Loaded natively at runtime (RR7's path — why it "worked before") |
|
|
833
|
+
| `vite dev` | Loaded **live** by the plugin (+ `.dev.vars.<CLOUDFLARE_ENV>` if a named env is set) |
|
|
834
|
+
| `vite preview` | Read from the **build output** `dist/<env>/.dev.vars`, written at `vite build` time |
|
|
835
|
+
|
|
836
|
+
So `vite preview` only sees vars that were present when you built — re-run
|
|
837
|
+
`vite build` after editing `.dev.vars`. (`vite dev` is the simplest: live vars +
|
|
838
|
+
streaming, no rebuild.)
|
|
839
|
+
|
|
840
|
+
### 10d. Build output moves from `build/` to `dist/`
|
|
841
|
+
|
|
842
|
+
RR7's `react-router build` writes to `build/`; Rango's `vite build` writes to
|
|
843
|
+
`dist/` (`dist/client`, `dist/rsc`, …). The leftover `build/` paths in
|
|
844
|
+
`wrangler.toml` and cleanup scripts must move, or you deploy stale/empty assets:
|
|
845
|
+
|
|
846
|
+
```toml
|
|
847
|
+
# wrangler.toml — was RR7's react-router build output
|
|
848
|
+
- assets = { directory = "./build/client/", binding = "ASSETS" }
|
|
849
|
+
+ assets = { directory = "./dist/client/", binding = "ASSETS" }
|
|
850
|
+
```
|
|
851
|
+
|
|
852
|
+
```jsonc
|
|
853
|
+
// package.json — clean the real output dir
|
|
854
|
+
- "cleanup": "rimraf ./build ./public/build"
|
|
855
|
+
+ "cleanup": "rimraf ./dist ./build ./public/build"
|
|
856
|
+
```
|
|
857
|
+
|
|
858
|
+
### 10e. Deploy the built worker, not the source entry
|
|
859
|
+
|
|
860
|
+
`vite build` emits the **deployable** Worker config at `dist/<env>/wrangler.json`
|
|
861
|
+
with `main: "index.js"` (the bundled worker), `no_bundle: true`, and
|
|
862
|
+
`assets: "../client"`. A plain `wrangler deploy` run from the repo root uses the
|
|
863
|
+
**root** `wrangler.toml`, where `main` points at your **source** entry
|
|
864
|
+
(`app/.../worker.ts`) — and wrangler's bundler cannot resolve Rango's
|
|
865
|
+
`virtual:rsc-router/*` modules, so deploying the source entry fails or ships a
|
|
866
|
+
broken worker. Deploy the build output instead (e.g.
|
|
867
|
+
`wrangler deploy -c dist/<env>/wrangler.json`) or use the plugin's deploy flow.
|
|
868
|
+
RR7's `wrangler deploy` from root worked only because its worker was already
|
|
869
|
+
fully bundled by `react-router build`.
|
|
870
|
+
|
|
871
|
+
## 11. Key Conceptual Differences
|
|
744
872
|
|
|
745
873
|
| Concept | React Router | Rango |
|
|
746
874
|
| ------------------- | ----------------------------------- | -------------------------------------- |
|
|
@@ -769,3 +897,18 @@ See `/theme` for full API including system detection and cookie persistence.
|
|
|
769
897
|
11. [ ] Update metadata to use `Meta` handle + `<MetaTags />`
|
|
770
898
|
12. [ ] Replace custom theme provider with `theme: true` in createRouter (see `/theme`)
|
|
771
899
|
13. [ ] Run `npx rango generate src/` to generate route types
|
|
900
|
+
|
|
901
|
+
**Cloudflare Workers (if migrating an RR7-on-Workers app):**
|
|
902
|
+
|
|
903
|
+
14. [ ] Audit the custom worker entry — the `router.fetch()` response must pass
|
|
904
|
+
through as a **stream** (`new Response(response.body, response)`); remove
|
|
905
|
+
any `.text()`/`.arrayBuffer()`/`HTMLRewriter` buffering from the Rango
|
|
906
|
+
path (keep it only on legacy/proxy branches). See §10a.
|
|
907
|
+
15. [ ] Switch local dev to `vite dev` / `vite preview` (they stream + load
|
|
908
|
+
`.dev.vars` + provide bindings); stop using `wrangler dev` for local
|
|
909
|
+
verification — it gzip-buffers and kills streaming. See §10b.
|
|
910
|
+
16. [ ] Move build output paths from RR7's `build/` to vite's `dist/` in
|
|
911
|
+
`wrangler.toml` (`assets` → `./dist/client/`) and cleanup scripts. See §10d.
|
|
912
|
+
17. [ ] Fix deploy to use the built config `dist/<env>/wrangler.json`
|
|
913
|
+
(`no_bundle: true`), not a root `wrangler deploy` against the source
|
|
914
|
+
worker entry (which can't bundle Rango's virtual modules). See §10e.
|
|
@@ -8,20 +8,21 @@ A Rango route handler is a pure function `(ctx) => rsc` — the function you pas
|
|
|
8
8
|
|
|
9
9
|
### Options — `RenderHandlerOptions`
|
|
10
10
|
|
|
11
|
-
| Field
|
|
12
|
-
|
|
|
13
|
-
| `params`
|
|
14
|
-
| `env`
|
|
15
|
-
| `request`
|
|
16
|
-
| `headers`
|
|
17
|
-
| `vars`
|
|
18
|
-
| `routeName`
|
|
19
|
-
| `routeMap`
|
|
20
|
-
| `loaders`
|
|
21
|
-
| `clientComponents`
|
|
22
|
-
| `stateCookie`
|
|
23
|
-
| `cacheStore`
|
|
24
|
-
| `cacheProfiles`
|
|
11
|
+
| Field | Type | Meaning |
|
|
12
|
+
| ---------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
13
|
+
| `params` | `Record<string, string>` | Route params surfaced as `ctx.params`. |
|
|
14
|
+
| `env` | `TEnv` | Environment bindings surfaced as `ctx.env`. |
|
|
15
|
+
| `request` | `Request \| string` | Backing Request (string or `Request`); defaults to a localhost GET. |
|
|
16
|
+
| `headers` | `HeadersInit` | Request headers (e.g. `Cookie`) the handler reads via `cookies()`. |
|
|
17
|
+
| `vars` | `VarsInit` (object or `[[Var, value]]` tuples) | Variables a prior middleware set, read via `ctx.get(...)`. |
|
|
18
|
+
| `routeName` | `string` | Matched route name (drives `ctx.routeName` and scoped reverse). |
|
|
19
|
+
| `routeMap` | `Record<string, string>` | Route name -> pattern map enabling `ctx.reverse()`. |
|
|
20
|
+
| `loaders` | `ReadonlyArray<readonly [LoaderDefinition, unknown]>` | Seed the data `ctx.use(SomeLoader)` returns. Matched by loader reference; NO real loader runs. |
|
|
21
|
+
| `clientComponents` | `Record<string, unknown>` | `"use client"` components in the handler's RSC, so they serialize as real boundaries when `rangoUseClientTransform()` is not wired. Keyed by name. |
|
|
22
|
+
| `stateCookie` | `StateCookieSeed` (`{ prefix?, routerId?, version? }`) | Customize the rango state cookie a handler calling `invalidateClientCache()` rotates. The name is ALWAYS seeded (default `rango-state_router_0`) so the rotation `Set-Cookie` fires like production rather than no-opping; override `prefix`/`routerId` to match your `createRouter({ stateCookiePrefix, id })`, or `version` (the value is `{version}:{timestamp}`, default `"0"`). |
|
|
23
|
+
| `cacheStore` | `SegmentCacheStore` | Segment cache store backing a `"use cache"` function the handler invokes (e.g. `new MemorySegmentCacheStore()`). WITHOUT it, `registerCachedFunction` takes the uncached bypass and the cached path is NOT exercised (the runtime emits a one-time warning under the test runner). Pair with `cacheProfiles`. |
|
|
24
|
+
| `cacheProfiles` | `Record<string, CacheProfile>` | Cache profiles in the `createRouter({ cacheProfiles })` shape, required for `"use cache: profileName"` resolution once a `cacheStore` is wired. |
|
|
25
|
+
| `inActionRevalidation` | `boolean` | Render as if inside a server action's revalidation render (production sets this in `revalidateAfterAction`). A stale `"use cache"` entry whose profile sets `foregroundOnAction: true` then re-executes in the FOREGROUND (fresh result in this render) instead of SWR. Pair with `cacheStore` + `cacheProfiles` to exercise the opt-in. |
|
|
25
26
|
|
|
26
27
|
### Context — `HandlerContext` (what your handler receives)
|
|
27
28
|
|
|
@@ -63,12 +63,23 @@ createRouter({
|
|
|
63
63
|
short: { ttl: 60, swr: 120 },
|
|
64
64
|
long: { ttl: 3600, swr: 7200 },
|
|
65
65
|
products: { ttl: 300, swr: 600, tags: ["products"] },
|
|
66
|
+
// Opt-in: a stale entry re-executes in the foreground during a server
|
|
67
|
+
// action's revalidation render (fresh action response), instead of SWR.
|
|
68
|
+
cms: { ttl: 300, swr: 600, foregroundOnAction: true },
|
|
66
69
|
},
|
|
67
70
|
});
|
|
68
71
|
```
|
|
69
72
|
|
|
70
73
|
- `"use cache"` (no name) resolves to `default`.
|
|
71
74
|
- `"use cache: short"` resolves to the `short` profile.
|
|
75
|
+
- `foregroundOnAction: true` (default false): a stale entry serves stale +
|
|
76
|
+
revalidates in the background on a plain navigation (SWR), but re-executes in
|
|
77
|
+
the FOREGROUND during a server action's revalidation render so the action
|
|
78
|
+
response reflects a fresh value (only the store write is deferred). Use it for
|
|
79
|
+
mutation-related cached data; incidental TTL staleness on an ordinary action
|
|
80
|
+
stays SWR so the action is not turned into a synchronous cache-refresh barrier.
|
|
81
|
+
For strong read-your-own-writes after a mutation, prefer `updateTag()` (a hard
|
|
82
|
+
purge, so the action's own re-render is a fresh foreground miss).
|
|
72
83
|
- Unknown profile names throw at runtime, on the first invocation of the cached
|
|
73
84
|
function (the Vite transform does not validate names at build/boot). The error
|
|
74
85
|
is actionable -- it names the missing profile and shows the `createRouter({
|
|
@@ -8,6 +8,7 @@ import type {
|
|
|
8
8
|
import { NetworkError, ServerRedirect, isNetworkError } from "../errors.js";
|
|
9
9
|
import {
|
|
10
10
|
browserDebugLog,
|
|
11
|
+
debugLog,
|
|
11
12
|
isBrowserDebugEnabled,
|
|
12
13
|
startBrowserTransaction,
|
|
13
14
|
} from "./logging.js";
|
|
@@ -316,7 +317,18 @@ export function createNavigationClient(
|
|
|
316
317
|
}
|
|
317
318
|
|
|
318
319
|
try {
|
|
320
|
+
// [VT-DIAG] Gated behind INTERNAL_RANGO_DEBUG. Times how long the RSC
|
|
321
|
+
// payload ROOT takes to resolve: ~full-stream duration means the root
|
|
322
|
+
// model is not flushed early (server/runtime buffering, e.g. wrangler
|
|
323
|
+
// dev gzip); fast means the block, if any, is downstream in render.
|
|
324
|
+
const vtDebugStart = isBrowserDebugEnabled() ? performance.now() : 0;
|
|
319
325
|
const payload = await payloadPromise;
|
|
326
|
+
if (isBrowserDebugEnabled()) {
|
|
327
|
+
debugLog("[VT-DIAG] payloadResolved", {
|
|
328
|
+
ms: Math.round(performance.now() - vtDebugStart),
|
|
329
|
+
isPartial: payload.metadata?.isPartial,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
320
332
|
|
|
321
333
|
if (tx) {
|
|
322
334
|
browserDebugLog(tx, "response received", {
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
} from "./intercept-utils.js";
|
|
21
21
|
import type { BoundTransaction } from "./navigation-transaction.js";
|
|
22
22
|
import { ServerRedirect } from "../errors.js";
|
|
23
|
-
import { debugLog } from "./logging.js";
|
|
23
|
+
import { debugLog, isBrowserDebugEnabled } from "./logging.js";
|
|
24
24
|
import {
|
|
25
25
|
validateRedirectOrigin,
|
|
26
26
|
validateExternalRedirect,
|
|
@@ -491,6 +491,21 @@ export function createPartialUpdater(
|
|
|
491
491
|
debugLog("[partial-update] updating document");
|
|
492
492
|
|
|
493
493
|
const hasTransition = shouldStartViewTransition(reconciled.segments);
|
|
494
|
+
// [VT-DIAG] Gated behind INTERNAL_RANGO_DEBUG. Reports which reconciled
|
|
495
|
+
// segment still carries a transition after the server-side when-gate, and
|
|
496
|
+
// whether the commit will be held in a startTransition. If `withTransition`
|
|
497
|
+
// lists an ancestor (layout/root) id rather than the gated leaf, an ungated
|
|
498
|
+
// ancestor transition is holding the subtree (missing loading() fallback).
|
|
499
|
+
if (isBrowserDebugEnabled()) {
|
|
500
|
+
debugLog("[VT-DIAG] commit", {
|
|
501
|
+
mode: mode.type,
|
|
502
|
+
hasTransition,
|
|
503
|
+
withTransition: reconciled.segments
|
|
504
|
+
.filter((s) => s.transition)
|
|
505
|
+
.map((s) => s.id),
|
|
506
|
+
all: reconciled.segments.map((s) => s.id),
|
|
507
|
+
});
|
|
508
|
+
}
|
|
494
509
|
const scrollPayload = toScrollPayload(navScroll);
|
|
495
510
|
|
|
496
511
|
if (mode.type === "action" || mode.type === "stale-revalidation") {
|
|
@@ -20,7 +20,10 @@ import {
|
|
|
20
20
|
encodeReply,
|
|
21
21
|
createClientTemporaryReferenceSet,
|
|
22
22
|
} from "@vitejs/plugin-rsc/rsc";
|
|
23
|
-
import {
|
|
23
|
+
import {
|
|
24
|
+
getRequestContext,
|
|
25
|
+
runWithRequestContext,
|
|
26
|
+
} from "../server/request-context.js";
|
|
24
27
|
import { isUnderTestRunner } from "../runtime-env.js";
|
|
25
28
|
import {
|
|
26
29
|
isTainted,
|
|
@@ -307,7 +310,13 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
307
310
|
}
|
|
308
311
|
}
|
|
309
312
|
|
|
310
|
-
|
|
313
|
+
// foregroundOnAction (opt-in; see CacheProfile.foregroundOnAction): during an
|
|
314
|
+
// action's revalidation render, a stale entry falls through to the foreground
|
|
315
|
+
// miss path below instead of SWR. The flag is set by revalidateAfterAction.
|
|
316
|
+
const foregroundOnActionRevalidation =
|
|
317
|
+
requestCtx?._inActionRevalidation === true &&
|
|
318
|
+
profile.foregroundOnAction === true;
|
|
319
|
+
if (cached?.shouldRevalidate && !foregroundOnActionRevalidation) {
|
|
311
320
|
// Stale hit: return stale value, revalidate in background
|
|
312
321
|
try {
|
|
313
322
|
const result = await serveCached(cached);
|
|
@@ -316,8 +325,12 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
316
325
|
// live response or throw LateHandlePushError on the completed store.
|
|
317
326
|
// Same isolation pattern as route-level background-revalidation.ts.
|
|
318
327
|
runBackground(requestCtx, async () => {
|
|
319
|
-
//
|
|
320
|
-
//
|
|
328
|
+
// The closure-captured requestCtx is reused for the framework's own
|
|
329
|
+
// reads (handle store swap, error reporting) AND, below, to
|
|
330
|
+
// re-establish the request-context ALS around the user fn. ALS context
|
|
331
|
+
// may be gone inside waitUntil: on workerd a waitUntil task runs
|
|
332
|
+
// detached from the request's I/O context, so getRequestContext()
|
|
333
|
+
// inside the cached body would otherwise throw.
|
|
321
334
|
let originalHandleStore:
|
|
322
335
|
| ReturnType<typeof createHandleStore>
|
|
323
336
|
| undefined;
|
|
@@ -360,7 +373,15 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
360
373
|
}
|
|
361
374
|
|
|
362
375
|
try {
|
|
363
|
-
|
|
376
|
+
// Re-establish the request-context ALS so a "use cache" body that
|
|
377
|
+
// reads the ambient getRequestContext() (e.g.
|
|
378
|
+
// getRequestContext().env.ApiKey) resolves during the background
|
|
379
|
+
// revalidation instead of throwing "called outside of a request
|
|
380
|
+
// context". runWithRequestContext sets the store for fn's
|
|
381
|
+
// synchronous kickoff; its async continuations inherit it.
|
|
382
|
+
const scoped = runWithRequestContext(requestCtx, () =>
|
|
383
|
+
runWithCacheTagScope(() => fn.apply(this, args)),
|
|
384
|
+
);
|
|
364
385
|
const freshResult = await scoped.result;
|
|
365
386
|
bgStopCapture?.();
|
|
366
387
|
// Merge profile/DSL tags with runtime cacheTag() tags, read after
|
|
@@ -15,6 +15,7 @@ import type { MiddlewareFn, MiddlewareContext } from "../router/middleware.js";
|
|
|
15
15
|
import { hasPerClientSignal } from "../browser/cookie-name.js";
|
|
16
16
|
import {
|
|
17
17
|
getRequestContext,
|
|
18
|
+
runWithRequestContext,
|
|
18
19
|
type RequestContext,
|
|
19
20
|
} from "../server/request-context.js";
|
|
20
21
|
import { mayNeedSSR } from "../rsc/ssr-setup.js";
|
|
@@ -330,7 +331,13 @@ export function createDocumentCacheMiddleware<TEnv = any>(
|
|
|
330
331
|
|
|
331
332
|
runBackground(requestCtx, async () => {
|
|
332
333
|
try {
|
|
333
|
-
|
|
334
|
+
// Re-establish the request-context ALS around the background
|
|
335
|
+
// re-render: next() re-runs the full handler pipeline, and on
|
|
336
|
+
// workerd a waitUntil task runs detached from the request's I/O
|
|
337
|
+
// context, so a handler/component reading getRequestContext() would
|
|
338
|
+
// otherwise throw. Same fix as the route-level/use-cache background
|
|
339
|
+
// revalidation paths.
|
|
340
|
+
const fresh = await runWithRequestContext(requestCtx, () => next());
|
|
334
341
|
const directives = shouldCacheResponse(fresh);
|
|
335
342
|
|
|
336
343
|
if (directives && fresh.body) {
|
|
@@ -348,10 +355,15 @@ export function createDocumentCacheMiddleware<TEnv = any>(
|
|
|
348
355
|
log(`[DocumentCache] REVALIDATED ${typeLabel}: ${url.pathname}`);
|
|
349
356
|
}
|
|
350
357
|
} catch (error) {
|
|
358
|
+
// Pass requestCtx explicitly: this runs in a detached waitUntil task
|
|
359
|
+
// where the ALS context is gone, so onError only fires if we hand it
|
|
360
|
+
// the captured context (reportCacheError falls back to _getRequestContext
|
|
361
|
+
// otherwise, which is null here).
|
|
351
362
|
reportCacheError(
|
|
352
363
|
error,
|
|
353
364
|
"cache-write",
|
|
354
365
|
"[DocumentCache] revalidation",
|
|
366
|
+
requestCtx,
|
|
355
367
|
);
|
|
356
368
|
}
|
|
357
369
|
});
|
|
@@ -401,10 +413,14 @@ export function createDocumentCacheMiddleware<TEnv = any>(
|
|
|
401
413
|
collectRequestTags(requestCtx),
|
|
402
414
|
);
|
|
403
415
|
} catch (error) {
|
|
416
|
+
// Detached waitUntil task — pass the captured requestCtx so onError
|
|
417
|
+
// fires even though the ALS context is gone (see the revalidation
|
|
418
|
+
// catch above).
|
|
404
419
|
reportCacheError(
|
|
405
420
|
error,
|
|
406
421
|
"cache-write",
|
|
407
422
|
"[DocumentCache] cache write",
|
|
423
|
+
requestCtx,
|
|
408
424
|
);
|
|
409
425
|
}
|
|
410
426
|
});
|
|
@@ -15,6 +15,21 @@ export interface CacheProfile {
|
|
|
15
15
|
swr?: number;
|
|
16
16
|
/** Default cache tags for invalidation */
|
|
17
17
|
tags?: string[];
|
|
18
|
+
/**
|
|
19
|
+
* When true, a stale entry encountered during a server action's revalidation
|
|
20
|
+
* render is re-executed in the FOREGROUND (the action response reflects the
|
|
21
|
+
* refreshed value) instead of being served stale + revalidated in the
|
|
22
|
+
* background. Only the store write is deferred. Use this for mutation-related
|
|
23
|
+
* cached data that an action should refresh immediately; ordinary navigations
|
|
24
|
+
* always keep SWR. Default false: incidental TTL staleness must not turn an
|
|
25
|
+
* unrelated action into a synchronous cache-refresh barrier — for strong
|
|
26
|
+
* read-your-own-writes after a mutation, prefer updateTag() (a hard purge, so
|
|
27
|
+
* the action's own re-render is a fresh foreground miss).
|
|
28
|
+
*
|
|
29
|
+
* Honored only by `"use cache"` functions; route-level `cache()` and cached
|
|
30
|
+
* loaders ignore it (use updateTag() there).
|
|
31
|
+
*/
|
|
32
|
+
foregroundOnAction?: boolean;
|
|
18
33
|
}
|
|
19
34
|
|
|
20
35
|
const DEFAULT_PROFILE: CacheProfile = { ttl: 900, swr: 1800 };
|
|
@@ -36,6 +36,14 @@ export interface ReadThroughItemConfig<T> {
|
|
|
36
36
|
key: string;
|
|
37
37
|
/** Execute the underlying function/loader on miss or revalidation */
|
|
38
38
|
execute: () => Promise<T>;
|
|
39
|
+
/**
|
|
40
|
+
* Optional wrapper applied to execute() ONLY on the background
|
|
41
|
+
* stale-revalidation path (not the foreground miss, where the caller's context
|
|
42
|
+
* is already established). Used to re-establish the request-context ALS, which
|
|
43
|
+
* a detached waitUntil task loses on workerd. Defaults to calling execute()
|
|
44
|
+
* directly.
|
|
45
|
+
*/
|
|
46
|
+
wrapBackground?: (run: () => Promise<T>) => Promise<T>;
|
|
39
47
|
/** Serialize result for storage. Return null to skip caching. */
|
|
40
48
|
serialize: (data: T) => Promise<string | null>;
|
|
41
49
|
/** Deserialize cached value back to the original type */
|
|
@@ -77,6 +85,7 @@ export async function readThroughItem<T>(
|
|
|
77
85
|
onMiss,
|
|
78
86
|
onCached,
|
|
79
87
|
host,
|
|
88
|
+
wrapBackground,
|
|
80
89
|
} = config;
|
|
81
90
|
|
|
82
91
|
// Cache lookup. An infra read failure (getItem) is reported by the store
|
|
@@ -106,7 +115,12 @@ export async function readThroughItem<T>(
|
|
|
106
115
|
host,
|
|
107
116
|
async () => {
|
|
108
117
|
try {
|
|
109
|
-
|
|
118
|
+
// Re-establish the caller's context (request-context ALS) for the
|
|
119
|
+
// detached background execution; the foreground miss below calls
|
|
120
|
+
// execute() directly since its context is already established.
|
|
121
|
+
const fresh = await (wrapBackground
|
|
122
|
+
? wrapBackground(execute)
|
|
123
|
+
: execute());
|
|
110
124
|
const serialized = await serialize(fresh);
|
|
111
125
|
if (serialized !== null) {
|
|
112
126
|
await setItem(key, serialized, storeOptions);
|
|
@@ -105,6 +105,10 @@ import { getRouterContext } from "../router-context.js";
|
|
|
105
105
|
import type { GeneratorMiddleware } from "./cache-lookup.js";
|
|
106
106
|
import { debugLog, debugWarn, getOrCreateRequestId } from "../logging.js";
|
|
107
107
|
import { INTERNAL_RANGO_DEBUG } from "../../internal-debug.js";
|
|
108
|
+
import {
|
|
109
|
+
runWithRequestContext,
|
|
110
|
+
type RequestContext,
|
|
111
|
+
} from "../../server/request-context.js";
|
|
108
112
|
|
|
109
113
|
/**
|
|
110
114
|
* Creates background revalidation middleware
|
|
@@ -183,33 +187,46 @@ export function withBackgroundRevalidation<TEnv>(
|
|
|
183
187
|
const freshLoaderPromises = new Map<string, Promise<any>>();
|
|
184
188
|
setupLoaderAccess(freshHandlerContext, freshLoaderPromises);
|
|
185
189
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
190
|
+
// Re-establish the request-context ALS around the re-render. ctx.Store
|
|
191
|
+
// is a different ALS (DSL build context); on workerd a waitUntil task
|
|
192
|
+
// runs detached from the request's I/O context, so a handler/component
|
|
193
|
+
// that reads the ambient getRequestContext() during this background
|
|
194
|
+
// re-render would otherwise throw "called outside of a request context".
|
|
195
|
+
const freshSegments = await runWithRequestContext(
|
|
196
|
+
requestCtx as RequestContext<TEnv>,
|
|
197
|
+
() =>
|
|
198
|
+
ctx.Store.run(() =>
|
|
199
|
+
resolveAllSegments(
|
|
200
|
+
ctx.entries,
|
|
201
|
+
ctx.routeKey,
|
|
202
|
+
ctx.matched.params,
|
|
203
|
+
freshHandlerContext,
|
|
204
|
+
freshLoaderPromises,
|
|
205
|
+
{ skipLoaders: true },
|
|
206
|
+
),
|
|
207
|
+
),
|
|
195
208
|
);
|
|
196
209
|
|
|
197
210
|
let freshInterceptSegments: ResolvedSegment[] = [];
|
|
198
211
|
if (ctx.interceptResult) {
|
|
199
|
-
freshInterceptSegments = await
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
ctx.
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
212
|
+
freshInterceptSegments = await runWithRequestContext(
|
|
213
|
+
requestCtx as RequestContext<TEnv>,
|
|
214
|
+
() =>
|
|
215
|
+
ctx.Store.run(() =>
|
|
216
|
+
resolveInterceptEntry(
|
|
217
|
+
ctx.interceptResult!.intercept,
|
|
218
|
+
ctx.interceptResult!.entry,
|
|
219
|
+
ctx.matched.params,
|
|
220
|
+
freshHandlerContext,
|
|
221
|
+
true,
|
|
222
|
+
undefined,
|
|
223
|
+
// Skip intercept middleware: this is a post-response background
|
|
224
|
+
// re-render to refresh a stale cached route. The foreground
|
|
225
|
+
// already ran the middleware; re-running it would double its
|
|
226
|
+
// side effects and a short-circuit Response would abort the write.
|
|
227
|
+
{ skipMiddleware: true },
|
|
228
|
+
),
|
|
229
|
+
),
|
|
213
230
|
);
|
|
214
231
|
}
|
|
215
232
|
|