@rangojs/router 0.0.0-experimental.9eb4192e → 0.0.0-experimental.a014d2b7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +8 -0
- package/README.md +123 -15
- 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 +319 -95
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -28
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/{src/handles/index.ts → dist/handles/index.d.ts} +1 -2
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -10
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +2011 -783
- 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 +67 -15
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +61 -1
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +224 -32
- package/skills/caching/SKILL.md +279 -17
- package/skills/composability/SKILL.md +27 -3
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +4 -2
- package/skills/document-cache/SKILL.md +78 -55
- package/skills/handler-use/SKILL.md +11 -9
- package/skills/hooks/SKILL.md +240 -28
- package/skills/host-router/SKILL.md +83 -23
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +68 -19
- package/skills/layout/SKILL.md +13 -9
- package/skills/links/SKILL.md +175 -17
- package/skills/loader/SKILL.md +217 -24
- package/skills/middleware/SKILL.md +18 -10
- package/skills/migrate-nextjs/SKILL.md +43 -19
- package/skills/migrate-react-router/SKILL.md +8 -2
- package/skills/mime-routes/SKILL.md +28 -1
- package/skills/observability/SKILL.md +172 -0
- package/skills/parallel/SKILL.md +18 -7
- package/skills/prerender/SKILL.md +65 -60
- package/skills/rango/SKILL.md +251 -24
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +115 -48
- package/skills/route/SKILL.md +46 -5
- package/skills/router-setup/SKILL.md +30 -8
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +130 -0
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +129 -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 +84 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/typesafety/SKILL.md +319 -28
- package/skills/use-cache/SKILL.md +57 -14
- 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 +0 -65
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +14 -27
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +192 -150
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/navigation-bridge.ts +95 -75
- package/src/browser/navigation-client.ts +110 -84
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +114 -90
- package/src/browser/navigation-transaction.ts +9 -59
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +147 -147
- package/src/browser/prefetch/cache.ts +107 -72
- package/src/browser/prefetch/fetch.ts +204 -34
- package/src/browser/prefetch/queue.ts +6 -3
- package/src/browser/rango-state.ts +157 -115
- package/src/browser/react/Link.tsx +30 -7
- package/src/browser/react/NavigationProvider.tsx +272 -142
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/deferred-handle-resolution.ts +75 -0
- package/src/browser/react/filter-segment-order.ts +66 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +178 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +17 -14
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +10 -5
- package/src/browser/react/use-params.ts +11 -11
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +20 -5
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +99 -8
- package/src/browser/rsc-router.tsx +73 -34
- package/src/browser/scroll-restoration.ts +30 -17
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +214 -55
- package/src/browser/types.ts +80 -22
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +60 -35
- package/src/build/generate-route-types.ts +2 -1
- package/src/build/index.ts +8 -2
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +117 -14
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +16 -5
- package/src/build/route-types/include-resolution.ts +117 -23
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +22 -6
- package/src/build/route-types/router-processing.ts +55 -28
- package/src/build/route-types/scan-filter.ts +1 -1
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +29 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +224 -41
- package/src/cache/cache-scope.ts +188 -82
- package/src/cache/cache-tag.ts +103 -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 +1990 -377
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +6 -16
- package/src/cache/document-cache.ts +89 -21
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +10 -20
- package/src/cache/memory-segment-store.ts +136 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +9 -17
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/types.ts +37 -100
- package/src/client.rsc.tsx +44 -21
- package/src/client.tsx +36 -61
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +18 -6
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +196 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +30 -4
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +31 -23
- package/src/handles/MetaTags.tsx +62 -19
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +37 -8
- package/src/handles/is-thenable.ts +19 -0
- package/src/handles/meta.ts +51 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +0 -24
- package/src/host/index.ts +8 -2
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +93 -12
- package/src/index.ts +91 -14
- package/src/internal-debug.ts +11 -10
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +32 -37
- package/src/prerender.ts +61 -6
- package/src/redirect-origin.ts +100 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +34 -0
- package/src/reverse.ts +65 -40
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +19 -77
- package/src/route-definition/dsl-helpers.ts +293 -311
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +82 -55
- package/src/route-definition/index.ts +1 -2
- package/src/route-definition/redirect.ts +44 -11
- package/src/route-definition/resolve-handler-use.ts +6 -1
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +0 -16
- package/src/route-types.ts +19 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +73 -25
- package/src/router/error-handling.ts +45 -18
- package/src/router/find-match.ts +44 -23
- package/src/router/handler-context.ts +10 -42
- package/src/router/instrument.ts +350 -0
- package/src/router/intercept-resolution.ts +39 -20
- package/src/router/lazy-includes.ts +9 -46
- package/src/router/loader-resolution.ts +152 -72
- package/src/router/logging.ts +0 -6
- package/src/router/manifest.ts +18 -29
- package/src/router/match-api.ts +6 -21
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +58 -58
- package/src/router/match-middleware/background-revalidation.ts +40 -24
- package/src/router/match-middleware/cache-lookup.ts +159 -285
- package/src/router/match-middleware/cache-store.ts +64 -52
- package/src/router/match-middleware/intercept-resolution.ts +0 -22
- package/src/router/match-middleware/segment-resolution.ts +0 -22
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +44 -74
- package/src/router/metrics.ts +0 -34
- package/src/router/middleware-types.ts +5 -112
- package/src/router/middleware.ts +237 -165
- package/src/router/navigation-snapshot.ts +0 -51
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +85 -94
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prerender-match.ts +104 -65
- package/src/router/preview-match.ts +3 -1
- package/src/router/request-classification.ts +28 -62
- package/src/router/revalidation.ts +123 -73
- package/src/router/route-snapshot.ts +0 -1
- package/src/router/router-context.ts +3 -28
- package/src/router/router-interfaces.ts +83 -35
- package/src/router/router-options.ts +136 -5
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +97 -84
- package/src/router/segment-resolution/helpers.ts +86 -6
- package/src/router/segment-resolution/loader-cache.ts +76 -39
- package/src/router/segment-resolution/revalidation.ts +272 -320
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +5 -1
- package/src/router/segment-wrappers.ts +6 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +161 -199
- package/src/router/telemetry.ts +96 -19
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +162 -64
- package/src/router/types.ts +9 -63
- package/src/router/url-params.ts +0 -5
- package/src/router.ts +109 -53
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +262 -219
- package/src/rsc/helpers.ts +100 -6
- package/src/rsc/index.ts +2 -5
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +114 -38
- package/src/rsc/manifest-init.ts +28 -41
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +117 -11
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +85 -188
- package/src/rsc/rsc-rendering.ts +98 -76
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +281 -117
- package/src/rsc/ssr-setup.ts +16 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +23 -5
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +35 -30
- package/src/segment-loader-promise.ts +31 -4
- package/src/segment-system.tsx +227 -143
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +163 -51
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +80 -5
- package/src/server/handle-store.ts +21 -38
- package/src/server/loader-registry.ts +33 -42
- package/src/server/request-context.ts +277 -136
- package/src/ssr/index.tsx +21 -16
- package/src/static-handler.ts +10 -13
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +701 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +183 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +371 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +357 -0
- package/src/testing/render-route.tsx +581 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +20 -58
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +13 -4
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +108 -28
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +6 -3
- package/src/types/request-scope.ts +8 -22
- package/src/types/route-config.ts +6 -50
- package/src/types/route-entry.ts +0 -6
- package/src/types/segments.ts +135 -14
- package/src/urls/include-helper.ts +9 -56
- package/src/urls/index.ts +1 -11
- package/src/urls/path-helper-types.ts +29 -12
- package/src/urls/path-helper.ts +17 -106
- package/src/urls/pattern-types.ts +36 -19
- package/src/urls/response-types.ts +20 -19
- package/src/urls/type-extraction.ts +58 -139
- package/src/urls/urls-function.ts +1 -19
- package/src/use-loader.tsx +292 -107
- package/src/vite/debug.ts +58 -13
- package/src/vite/discovery/bundle-postprocess.ts +8 -7
- package/src/vite/discovery/discover-routers.ts +97 -84
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +50 -69
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +44 -0
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +2 -0
- package/src/vite/inject-client-debug.ts +36 -0
- package/src/vite/plugin-types.ts +126 -8
- package/src/vite/plugins/cjs-to-esm.ts +14 -28
- package/src/vite/plugins/client-ref-dedup.ts +5 -21
- package/src/vite/plugins/client-ref-hashing.ts +14 -13
- package/src/vite/plugins/cloudflare-protocol-stub.ts +1 -21
- package/src/vite/plugins/expose-action-id.ts +6 -77
- package/src/vite/plugins/expose-id-utils.ts +88 -55
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +11 -90
- package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
- package/src/vite/plugins/expose-ids/router-transform.ts +100 -28
- package/src/vite/plugins/expose-internal-ids.ts +59 -70
- package/src/vite/plugins/performance-tracks.ts +11 -18
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/use-cache-transform.ts +28 -52
- package/src/vite/plugins/version-injector.ts +40 -29
- package/src/vite/plugins/version-plugin.ts +37 -40
- package/src/vite/plugins/virtual-entries.ts +39 -25
- package/src/vite/rango.ts +62 -106
- package/src/vite/router-discovery.ts +591 -122
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +4 -59
- package/src/vite/utils/package-resolution.ts +1 -73
- package/src/vite/utils/prerender-utils.ts +54 -39
- package/src/vite/utils/shared-utils.ts +90 -41
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/shallow.ts +0 -40
- package/src/router/middleware-cookies.ts +0 -55
|
@@ -11,7 +11,15 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
14
|
+
import { parseCookiesFromHeader } from "./cookie-parse.js";
|
|
15
|
+
import type { CacheErrorCategory } from "../cache/cache-error.js";
|
|
14
16
|
import type { CookieOptions } from "../router/middleware.js";
|
|
17
|
+
import {
|
|
18
|
+
KEEP_CACHE_HEADER,
|
|
19
|
+
getRawCookieValue,
|
|
20
|
+
mintStateValue,
|
|
21
|
+
serializeStateCookie,
|
|
22
|
+
} from "../browser/cookie-name.js";
|
|
15
23
|
import type { LoaderDefinition, LoaderContext } from "../types.js";
|
|
16
24
|
import type { ScopedReverseFunction } from "../reverse.js";
|
|
17
25
|
import type {
|
|
@@ -33,13 +41,21 @@ import {
|
|
|
33
41
|
type HandleData,
|
|
34
42
|
} from "./handle-store.js";
|
|
35
43
|
import { isHandle } from "../handle.js";
|
|
36
|
-
import {
|
|
44
|
+
import { withDefer } from "../defer.js";
|
|
45
|
+
import { type MetricsStore } from "./context.js";
|
|
46
|
+
import { observePhase, PHASES } from "../router/instrument.js";
|
|
37
47
|
import { getFetchableLoader } from "./fetchable-loader-store.js";
|
|
38
48
|
import type { SegmentCacheStore } from "../cache/types.js";
|
|
39
49
|
import type { Theme, ResolvedThemeConfig } from "../theme/types.js";
|
|
40
50
|
import type { ExecutionContext, RequestScope } from "../types/request-scope.js";
|
|
51
|
+
import type { TransitionWhenFn } from "../types/segments.js";
|
|
52
|
+
import type { ResolvedTracing } from "../router/tracing.js";
|
|
41
53
|
import { fireAndForgetWaitUntil } from "../types/request-scope.js";
|
|
42
|
-
import {
|
|
54
|
+
import {
|
|
55
|
+
THEME_COOKIE,
|
|
56
|
+
isValidTheme,
|
|
57
|
+
warnInvalidTheme,
|
|
58
|
+
} from "../theme/constants.js";
|
|
43
59
|
import type { LocationStateEntry } from "../browser/react/location-state-shared.js";
|
|
44
60
|
import { NOCACHE_SYMBOL, assertNotInsideCacheExec } from "../cache/taint.js";
|
|
45
61
|
import { isInsideCacheScope } from "./context.js";
|
|
@@ -47,7 +63,12 @@ import {
|
|
|
47
63
|
createReverseFunction,
|
|
48
64
|
stripInternalParams,
|
|
49
65
|
} from "../router/handler-context.js";
|
|
50
|
-
import {
|
|
66
|
+
import {
|
|
67
|
+
getGlobalRouteMap,
|
|
68
|
+
isRouteRootScoped,
|
|
69
|
+
getSearchSchema,
|
|
70
|
+
} from "../route-map-builder.js";
|
|
71
|
+
import { parseSearchParams } from "../search-params.js";
|
|
51
72
|
import { invariant } from "../errors.js";
|
|
52
73
|
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
53
74
|
|
|
@@ -102,6 +123,10 @@ export interface RequestContext<
|
|
|
102
123
|
setStatus(status: number): void;
|
|
103
124
|
/** @internal Set status bypassing cache-exec guard (for framework error handling) */
|
|
104
125
|
_setStatus(status: number): void;
|
|
126
|
+
/** @internal Rotate the rango state cookie (server seat of invalidateClientCache). */
|
|
127
|
+
_rotateStateCookie(): void;
|
|
128
|
+
/** @internal Set the keepClientCache() directive header on the response. */
|
|
129
|
+
_setKeepCacheDirective(): void;
|
|
105
130
|
|
|
106
131
|
/**
|
|
107
132
|
* Access loader data or push handle data.
|
|
@@ -137,9 +162,37 @@ export interface RequestContext<
|
|
|
137
162
|
/** @internal Handle store for tracking handle data across segments */
|
|
138
163
|
_handleStore: HandleStore;
|
|
139
164
|
|
|
165
|
+
/**
|
|
166
|
+
* @internal transition({ when }) predicates for segments matched this request,
|
|
167
|
+
* keyed by segment id. Collected during resolution (the function is stripped
|
|
168
|
+
* from the serialized segment config), then evaluated post-handler in
|
|
169
|
+
* rsc-rendering — outside any cache scope — to drop the transition of any
|
|
170
|
+
* segment whose predicate returns false.
|
|
171
|
+
*/
|
|
172
|
+
_transitionWhen?: Array<{ id: string; when: TransitionWhenFn }>;
|
|
173
|
+
|
|
140
174
|
/** @internal Cache store for segment caching (optional, used by CacheScope) */
|
|
141
175
|
_cacheStore?: SegmentCacheStore;
|
|
142
176
|
|
|
177
|
+
/**
|
|
178
|
+
* @internal Handler-owned registry of explicit per-scope stores from
|
|
179
|
+
* cache({ store }). Created once per createRSCHandler() and threaded into
|
|
180
|
+
* every request context, so it accumulates every explicit store the handler
|
|
181
|
+
* resolves. updateTag()/revalidateTag() iterate this set plus _cacheStore to
|
|
182
|
+
* reach every store that may hold tagged entries. The app-level store is not
|
|
183
|
+
* added here (it is always reachable via _cacheStore).
|
|
184
|
+
*/
|
|
185
|
+
_explicitTaggedStores?: Set<SegmentCacheStore>;
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* @internal Union of every cache tag resolved while producing this request's
|
|
189
|
+
* response (from cache({ tags }), runtime cacheTag(), and loader cache tags).
|
|
190
|
+
* Populated at the tag-resolution sites via recordRequestTags(). Read by the
|
|
191
|
+
* document cache middleware so a full-page entry is tagged with everything its
|
|
192
|
+
* content used and can therefore be invalidated by updateTag()/revalidateTag().
|
|
193
|
+
*/
|
|
194
|
+
_requestTags: Set<string>;
|
|
195
|
+
|
|
143
196
|
/** @internal Cache profiles for "use cache" profile resolution (per-router) */
|
|
144
197
|
_cacheProfiles?: Record<
|
|
145
198
|
string,
|
|
@@ -249,6 +302,30 @@ export interface RequestContext<
|
|
|
249
302
|
/** @internal Previous route key (from the navigation source), used for revalidation */
|
|
250
303
|
_prevRouteKey?: string;
|
|
251
304
|
|
|
305
|
+
/**
|
|
306
|
+
* @internal Navigation/action source data the transition({ when }) gate reads
|
|
307
|
+
* to build its ShouldRevalidateFn-shaped predicate context. currentUrl/Params
|
|
308
|
+
* come from the navigation snapshot (set at match time); action* are stashed
|
|
309
|
+
* at the action-bearing gate call sites. All undefined when there is no source
|
|
310
|
+
* (initial full load) or no action (plain navigation).
|
|
311
|
+
*/
|
|
312
|
+
_gateCurrentUrl?: URL;
|
|
313
|
+
_gateCurrentParams?: Record<string, string>;
|
|
314
|
+
_gateActionId?: string;
|
|
315
|
+
_gateActionUrl?: URL;
|
|
316
|
+
_gateActionResult?: unknown;
|
|
317
|
+
_gateFormData?: FormData;
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* @internal True while the post-action revalidation render is running (set by
|
|
321
|
+
* revalidateAfterAction). The "use cache" runtime reads this to prefer
|
|
322
|
+
* freshness over a fast stale response during an action: a stale entry
|
|
323
|
+
* re-executes in the foreground (so the action response reflects the refreshed
|
|
324
|
+
* value) with only the store write deferred, instead of serving stale and
|
|
325
|
+
* revalidating in the background. A plain navigation (flag unset) keeps SWR.
|
|
326
|
+
*/
|
|
327
|
+
_inActionRevalidation?: boolean;
|
|
328
|
+
|
|
252
329
|
/**
|
|
253
330
|
* @internal Render barrier for experimental `rendered()` API.
|
|
254
331
|
* Resolves when all non-loader segments have settled and handle data
|
|
@@ -273,7 +350,9 @@ export interface RequestContext<
|
|
|
273
350
|
|
|
274
351
|
/**
|
|
275
352
|
* @internal Set to true when the matched entry tree contains any `loading()`
|
|
276
|
-
* entries (streaming).
|
|
353
|
+
* entries (streaming). On a streaming tree rendered() waits for the streaming
|
|
354
|
+
* handlers to settle (via handleStore.settled) before resolving, and the
|
|
355
|
+
* deadlock guard state is kept live until that wait completes.
|
|
277
356
|
*/
|
|
278
357
|
_treeHasStreaming?: boolean;
|
|
279
358
|
|
|
@@ -297,6 +376,18 @@ export interface RequestContext<
|
|
|
297
376
|
*/
|
|
298
377
|
_renderBarrierHandleSnapshot?: HandleData;
|
|
299
378
|
|
|
379
|
+
/**
|
|
380
|
+
* @internal The deadlock guard window is closed (no further handler-awaits-
|
|
381
|
+
* loader cycle is possible). For non-streaming trees this is set when the
|
|
382
|
+
* barrier resolves. For streaming trees the window stays open until
|
|
383
|
+
* handleStore.settled — rendered() keeps waiting past the barrier and a
|
|
384
|
+
* loading() handler can still resume and await a still-waiting loader — so it
|
|
385
|
+
* is set only after settled. The guard (loader-resolution `setupLoaderAccess`)
|
|
386
|
+
* reads this instead of `_renderBarrierSegmentOrder` so it does not go blind
|
|
387
|
+
* during the streaming settle wait.
|
|
388
|
+
*/
|
|
389
|
+
_renderBarrierGuardClosed?: boolean;
|
|
390
|
+
|
|
300
391
|
/** @internal Per-request error dedup set for onError reporting */
|
|
301
392
|
_reportedErrors: WeakSet<object>;
|
|
302
393
|
|
|
@@ -304,9 +395,13 @@ export interface RequestContext<
|
|
|
304
395
|
* @internal Report a non-fatal background error through the router's
|
|
305
396
|
* onError callback. Wired by the RSC handler / router during request
|
|
306
397
|
* creation. Cache-runtime and other subsystems call this to surface
|
|
307
|
-
* errors without failing the response.
|
|
398
|
+
* errors without failing the response. `category` is surfaced to consumers as
|
|
399
|
+
* `metadata.category` on the onError context (phase `cache`).
|
|
308
400
|
*/
|
|
309
|
-
_reportBackgroundError?: (
|
|
401
|
+
_reportBackgroundError?: (
|
|
402
|
+
error: unknown,
|
|
403
|
+
category: CacheErrorCategory,
|
|
404
|
+
) => void;
|
|
310
405
|
|
|
311
406
|
/** @internal Per-request debug performance override (set via ctx.debugPerformance()) */
|
|
312
407
|
_debugPerformance?: boolean;
|
|
@@ -314,6 +409,9 @@ export interface RequestContext<
|
|
|
314
409
|
/** @internal Request-scoped performance metrics store */
|
|
315
410
|
_metricsStore?: MetricsStore;
|
|
316
411
|
|
|
412
|
+
/** @internal Resolved platform phase-span tracing for this request (Cloudflare or OTel) */
|
|
413
|
+
_tracing?: ResolvedTracing;
|
|
414
|
+
|
|
317
415
|
/** @internal Router basename for this request (used by redirect()) */
|
|
318
416
|
_basename?: string;
|
|
319
417
|
|
|
@@ -322,6 +420,15 @@ export interface RequestContext<
|
|
|
322
420
|
* to avoid a second resolveRoute call. Cleared on HMR invalidation.
|
|
323
421
|
*/
|
|
324
422
|
_classifiedRoute?: import("../router/route-snapshot.js").RouteSnapshot;
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* @internal Coarse route-level cache signal for the X-Rango-Cache debug
|
|
426
|
+
* header. Populated by match/matchPartial only when the debug cache signal
|
|
427
|
+
* gate is enabled (debugCacheSignal option or RANGO_TEST_SIGNALS=1). Read by
|
|
428
|
+
* the response-finalization path (createResponseWithMergedHeaders). Undefined
|
|
429
|
+
* when the gate is off, so no header is emitted.
|
|
430
|
+
*/
|
|
431
|
+
_cacheSignal?: import("../router/telemetry.js").CacheSegmentSignal[];
|
|
325
432
|
}
|
|
326
433
|
|
|
327
434
|
/**
|
|
@@ -340,13 +447,23 @@ export type PublicRequestContext<
|
|
|
340
447
|
| "setCookie"
|
|
341
448
|
| "deleteCookie"
|
|
342
449
|
| "_handleStore"
|
|
450
|
+
| "_transitionWhen"
|
|
343
451
|
| "_cacheStore"
|
|
452
|
+
| "_explicitTaggedStores"
|
|
453
|
+
| "_requestTags"
|
|
344
454
|
| "_cacheProfiles"
|
|
345
455
|
| "_onResponseCallbacks"
|
|
346
456
|
| "_themeConfig"
|
|
347
457
|
| "_locationState"
|
|
348
458
|
| "_routeName"
|
|
349
459
|
| "_prevRouteKey"
|
|
460
|
+
| "_gateCurrentUrl"
|
|
461
|
+
| "_gateCurrentParams"
|
|
462
|
+
| "_gateActionId"
|
|
463
|
+
| "_gateActionUrl"
|
|
464
|
+
| "_gateActionResult"
|
|
465
|
+
| "_gateFormData"
|
|
466
|
+
| "_inActionRevalidation"
|
|
350
467
|
| "_reportedErrors"
|
|
351
468
|
| "_renderBarrier"
|
|
352
469
|
| "_resolveRenderBarrier"
|
|
@@ -355,13 +472,17 @@ export type PublicRequestContext<
|
|
|
355
472
|
| "_renderBarrierWaiters"
|
|
356
473
|
| "_handlerLoaderDeps"
|
|
357
474
|
| "_renderBarrierHandleSnapshot"
|
|
475
|
+
| "_renderBarrierGuardClosed"
|
|
358
476
|
| "_reportBackgroundError"
|
|
359
477
|
| "_debugPerformance"
|
|
360
478
|
| "_metricsStore"
|
|
361
479
|
| "_basename"
|
|
362
480
|
| "_setStatus"
|
|
481
|
+
| "_rotateStateCookie"
|
|
482
|
+
| "_setKeepCacheDirective"
|
|
363
483
|
| "_variables"
|
|
364
484
|
| "_classifiedRoute"
|
|
485
|
+
| "_cacheSignal"
|
|
365
486
|
| "res"
|
|
366
487
|
>;
|
|
367
488
|
|
|
@@ -413,6 +534,7 @@ export function _getRequestContext<TEnv = DefaultEnv>():
|
|
|
413
534
|
export function setRequestContextParams(
|
|
414
535
|
params: Record<string, string>,
|
|
415
536
|
routeName?: string,
|
|
537
|
+
routeMap?: Record<string, string>,
|
|
416
538
|
): void {
|
|
417
539
|
const ctx = requestContextStorage.getStore();
|
|
418
540
|
if (ctx) {
|
|
@@ -425,9 +547,13 @@ export function setRequestContextParams(
|
|
|
425
547
|
: undefined
|
|
426
548
|
) as DefaultRouteName | undefined;
|
|
427
549
|
}
|
|
428
|
-
// Update reverse with scoped resolution now that route is known
|
|
550
|
+
// Update reverse with scoped resolution now that route is known. Production
|
|
551
|
+
// omits routeMap and uses the global map (routes are registered globally);
|
|
552
|
+
// the testing primitives (renderToFlightString/renderServerTree) pass a
|
|
553
|
+
// scoped routeMap so `ctx.reverse` is not order-dependent on whatever router
|
|
554
|
+
// registered last.
|
|
429
555
|
ctx.reverse = createReverseFunction(
|
|
430
|
-
getGlobalRouteMap(),
|
|
556
|
+
routeMap ?? getGlobalRouteMap(),
|
|
431
557
|
routeName,
|
|
432
558
|
params,
|
|
433
559
|
routeName ? isRouteRootScoped(routeName) : undefined,
|
|
@@ -443,11 +569,17 @@ export function setRequestContextParams(
|
|
|
443
569
|
*/
|
|
444
570
|
export function setRequestContextPrevRouteKey(
|
|
445
571
|
prevRouteKey: string | undefined,
|
|
572
|
+
currentUrl?: URL,
|
|
573
|
+
currentParams?: Record<string, string>,
|
|
446
574
|
): void {
|
|
447
575
|
const ctx = requestContextStorage.getStore();
|
|
448
|
-
if (ctx
|
|
449
|
-
|
|
450
|
-
}
|
|
576
|
+
if (!ctx) return;
|
|
577
|
+
if (prevRouteKey !== undefined) ctx._prevRouteKey = prevRouteKey;
|
|
578
|
+
// Source URL/params for the transition({ when }) gate (effectiveFromUrl /
|
|
579
|
+
// effectiveFromMatch.params from the navigation snapshot). Same write point as
|
|
580
|
+
// _prevRouteKey, which doubles as fromRouteName.
|
|
581
|
+
if (currentUrl !== undefined) ctx._gateCurrentUrl = currentUrl;
|
|
582
|
+
if (currentParams !== undefined) ctx._gateCurrentParams = currentParams;
|
|
451
583
|
}
|
|
452
584
|
|
|
453
585
|
/**
|
|
@@ -461,16 +593,6 @@ export function getLocationState(): LocationStateEntry[] | undefined {
|
|
|
461
593
|
return ctx?._locationState;
|
|
462
594
|
}
|
|
463
595
|
|
|
464
|
-
/**
|
|
465
|
-
* Get the current request context, throwing if not available
|
|
466
|
-
* @deprecated Use getRequestContext() directly — it now throws if outside context
|
|
467
|
-
*/
|
|
468
|
-
export function requireRequestContext<
|
|
469
|
-
TEnv = DefaultEnv,
|
|
470
|
-
>(): RequestContext<TEnv> {
|
|
471
|
-
return getRequestContext<TEnv>();
|
|
472
|
-
}
|
|
473
|
-
|
|
474
596
|
export type { ExecutionContext };
|
|
475
597
|
|
|
476
598
|
/**
|
|
@@ -485,6 +607,11 @@ export interface CreateRequestContextOptions<TEnv> {
|
|
|
485
607
|
initialResponse?: Response;
|
|
486
608
|
/** Optional cache store for segment caching (used by CacheScope) */
|
|
487
609
|
cacheStore?: SegmentCacheStore;
|
|
610
|
+
/**
|
|
611
|
+
* Handler-owned registry of explicit per-scope stores for cross-store tag
|
|
612
|
+
* invalidation. Created once per handler, reused across requests.
|
|
613
|
+
*/
|
|
614
|
+
explicitTaggedStores?: Set<SegmentCacheStore>;
|
|
488
615
|
/** Optional cache profiles for "use cache" resolution (per-router) */
|
|
489
616
|
cacheProfiles?: Record<
|
|
490
617
|
string,
|
|
@@ -494,6 +621,10 @@ export interface CreateRequestContextOptions<TEnv> {
|
|
|
494
621
|
executionContext?: ExecutionContext;
|
|
495
622
|
/** Optional theme configuration (enables ctx.theme and ctx.setTheme) */
|
|
496
623
|
themeConfig?: ResolvedThemeConfig | null;
|
|
624
|
+
/** Resolved rango state cookie name, for the server seat of invalidateClientCache(). */
|
|
625
|
+
stateCookieName?: string;
|
|
626
|
+
/** Build version, used as the prefix of a server-rotated rango state value. */
|
|
627
|
+
version?: string;
|
|
497
628
|
}
|
|
498
629
|
|
|
499
630
|
/**
|
|
@@ -514,15 +645,17 @@ export function createRequestContext<TEnv>(
|
|
|
514
645
|
variables,
|
|
515
646
|
initialResponse,
|
|
516
647
|
cacheStore,
|
|
648
|
+
explicitTaggedStores,
|
|
517
649
|
cacheProfiles,
|
|
518
650
|
executionContext,
|
|
519
651
|
themeConfig,
|
|
652
|
+
stateCookieName,
|
|
653
|
+
version: stateVersion,
|
|
520
654
|
} = options;
|
|
521
655
|
const cookieHeader = request.headers.get("Cookie");
|
|
656
|
+
let rangoStateRotated = false;
|
|
522
657
|
let parsedCookies: Record<string, string> | null = null;
|
|
523
658
|
|
|
524
|
-
// Create stub response for collecting headers/cookies.
|
|
525
|
-
// All cookie/header mutations go here; cookie reads derive from it.
|
|
526
659
|
let stubResponse = initialResponse
|
|
527
660
|
? new Response(null, {
|
|
528
661
|
status: initialResponse.status,
|
|
@@ -531,11 +664,9 @@ export function createRequestContext<TEnv>(
|
|
|
531
664
|
})
|
|
532
665
|
: new Response(null, { status: 200 });
|
|
533
666
|
|
|
534
|
-
// Create handle store and loader memoization for this request
|
|
535
667
|
const handleStore = createHandleStore();
|
|
536
668
|
const loaderPromises = new Map<string, Promise<any>>();
|
|
537
669
|
|
|
538
|
-
// Lazy parse cookies from the original Cookie header
|
|
539
670
|
const getParsedCookies = (): Record<string, string> => {
|
|
540
671
|
if (!parsedCookies) {
|
|
541
672
|
parsedCookies = parseCookiesFromHeader(cookieHeader);
|
|
@@ -543,7 +674,6 @@ export function createRequestContext<TEnv>(
|
|
|
543
674
|
return parsedCookies;
|
|
544
675
|
};
|
|
545
676
|
|
|
546
|
-
// Cached response cookie mutations — invalidated on setCookie/deleteCookie/setTheme
|
|
547
677
|
let responseCookieCache: Map<string, string | null> | null = null;
|
|
548
678
|
const getResponseCookies = (): Map<string, string | null> => {
|
|
549
679
|
if (!responseCookieCache) {
|
|
@@ -555,8 +685,6 @@ export function createRequestContext<TEnv>(
|
|
|
555
685
|
responseCookieCache = null;
|
|
556
686
|
};
|
|
557
687
|
|
|
558
|
-
// Guard: throw if a response-level side effect is called inside a cache() scope.
|
|
559
|
-
// Uses ALS to detect the scope (set during segment resolution).
|
|
560
688
|
function assertNotInsideCacheScopeALS(methodName: string): void {
|
|
561
689
|
if (isInsideCacheScope()) {
|
|
562
690
|
throw new Error(
|
|
@@ -567,8 +695,7 @@ export function createRequestContext<TEnv>(
|
|
|
567
695
|
}
|
|
568
696
|
}
|
|
569
697
|
|
|
570
|
-
//
|
|
571
|
-
// The stub IS the source of truth for same-request mutations.
|
|
698
|
+
// Response stub Set-Cookie wins, then original header (source of truth for mutations).
|
|
572
699
|
const effectiveCookie = (name: string): string | undefined => {
|
|
573
700
|
const mutations = getResponseCookies();
|
|
574
701
|
if (mutations.has(name)) {
|
|
@@ -578,14 +705,11 @@ export function createRequestContext<TEnv>(
|
|
|
578
705
|
return getParsedCookies()[name];
|
|
579
706
|
};
|
|
580
707
|
|
|
581
|
-
// Theme helpers (only used when themeConfig is provided)
|
|
582
708
|
const getTheme = (): Theme | undefined => {
|
|
583
709
|
if (!themeConfig) return undefined;
|
|
584
710
|
|
|
585
|
-
// Use overlay-aware read so setTheme() in the same request is reflected
|
|
586
711
|
const stored = effectiveCookie(themeConfig.storageKey);
|
|
587
712
|
if (stored) {
|
|
588
|
-
// Validate stored value
|
|
589
713
|
if (stored === "system" && themeConfig.enableSystem) {
|
|
590
714
|
return "system";
|
|
591
715
|
}
|
|
@@ -599,15 +723,15 @@ export function createRequestContext<TEnv>(
|
|
|
599
723
|
const setTheme = (theme: Theme): void => {
|
|
600
724
|
if (!themeConfig) return;
|
|
601
725
|
|
|
602
|
-
//
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
726
|
+
// Shared guard (isValidTheme): reject any value not in the configured theme
|
|
727
|
+
// set, AND reject "system" when system detection is off — a cookie of
|
|
728
|
+
// theme=system with enableSystem:false would re-apply a bogus class="system"
|
|
729
|
+
// on the next SSR.
|
|
730
|
+
if (!isValidTheme(theme, themeConfig)) {
|
|
731
|
+
warnInvalidTheme(theme, themeConfig);
|
|
607
732
|
return;
|
|
608
733
|
}
|
|
609
734
|
|
|
610
|
-
// Write to stub — effectiveCookie() will pick it up on next read
|
|
611
735
|
stubResponse.headers.append(
|
|
612
736
|
"Set-Cookie",
|
|
613
737
|
serializeCookieValue(themeConfig.storageKey, theme, {
|
|
@@ -619,10 +743,8 @@ export function createRequestContext<TEnv>(
|
|
|
619
743
|
invalidateResponseCookieCache();
|
|
620
744
|
};
|
|
621
745
|
|
|
622
|
-
// Strip internal _rsc* params so userland sees a clean URL.
|
|
623
746
|
const cleanUrl = stripInternalParams(url);
|
|
624
747
|
|
|
625
|
-
// Build the context object first (without use), then add use
|
|
626
748
|
const ctx: RequestContext<TEnv> = {
|
|
627
749
|
env,
|
|
628
750
|
request,
|
|
@@ -708,6 +830,45 @@ export function createRequestContext<TEnv>(
|
|
|
708
830
|
stubResponse.headers.set(name, value);
|
|
709
831
|
},
|
|
710
832
|
|
|
833
|
+
// Rotate the rango state cookie for the responding client (the server seat
|
|
834
|
+
// of invalidateClientCache). Writes ONE Set-Cookie per request with the
|
|
835
|
+
// value {version}:{timestamp}; the `:` stays raw (the cookie-name.ts
|
|
836
|
+
// serializer), not the URL-encoded form serializeCookieValue would produce.
|
|
837
|
+
// The timestamp is strictly greater than the client's current one (inbound
|
|
838
|
+
// X-Rango-State), so a same-millisecond server rotation still differs from
|
|
839
|
+
// the client value and the divergence observer fires.
|
|
840
|
+
_rotateStateCookie(): void {
|
|
841
|
+
if (rangoStateRotated) return;
|
|
842
|
+
rangoStateRotated = true;
|
|
843
|
+
if (!stateCookieName) return;
|
|
844
|
+
// The client's current value, for the monotonic guard: prefer the
|
|
845
|
+
// X-Rango-State header (router navigation/prefetch fetches send it), but
|
|
846
|
+
// fall back to the request's rango state cookie — action POSTs / plain
|
|
847
|
+
// app fetch()s carry no router header yet DO send the cookie. Without the
|
|
848
|
+
// fallback, prevTs stays 0 and a same-ms mint can equal the client value,
|
|
849
|
+
// leaving the divergence observer silent. `|| null` so an empty header
|
|
850
|
+
// ('' from proxy normalization) falls through instead of short-circuiting.
|
|
851
|
+
// getRawCookieValue reads the cookie undecoded (the wire value
|
|
852
|
+
// decodeStateValue decodes exactly once) AND is the same parser the client
|
|
853
|
+
// mirror uses, so both seats read the same jar entry.
|
|
854
|
+
const prevRaw =
|
|
855
|
+
(request.headers.get("x-rango-state") || null) ??
|
|
856
|
+
getRawCookieValue(cookieHeader, stateCookieName);
|
|
857
|
+
const value = mintStateValue(stateVersion ?? "0", prevRaw);
|
|
858
|
+
stubResponse.headers.append(
|
|
859
|
+
"Set-Cookie",
|
|
860
|
+
serializeStateCookie(stateCookieName, value, url.protocol === "https:"),
|
|
861
|
+
);
|
|
862
|
+
invalidateResponseCookieCache();
|
|
863
|
+
},
|
|
864
|
+
|
|
865
|
+
// Set the keepClientCache() directive header. The action bridge reads it on
|
|
866
|
+
// the response and suppresses its automatic invalidation. `.set` makes this
|
|
867
|
+
// idempotent (one header regardless of call count).
|
|
868
|
+
_setKeepCacheDirective(): void {
|
|
869
|
+
stubResponse.headers.set(KEEP_CACHE_HEADER, "1");
|
|
870
|
+
},
|
|
871
|
+
|
|
711
872
|
setStatus(status: number): void {
|
|
712
873
|
assertNotInsideCacheExec(ctx, "setStatus");
|
|
713
874
|
assertNotInsideCacheScopeALS("setStatus");
|
|
@@ -724,18 +885,24 @@ export function createRequestContext<TEnv>(
|
|
|
724
885
|
});
|
|
725
886
|
},
|
|
726
887
|
|
|
727
|
-
// Placeholder - will be replaced below
|
|
728
888
|
use: null as any,
|
|
729
889
|
|
|
730
890
|
method: request.method,
|
|
731
891
|
|
|
732
892
|
_handleStore: handleStore,
|
|
893
|
+
_transitionWhen: [],
|
|
733
894
|
_cacheStore: cacheStore,
|
|
895
|
+
_explicitTaggedStores: explicitTaggedStores,
|
|
896
|
+
_requestTags: new Set<string>(),
|
|
734
897
|
_cacheProfiles: cacheProfiles,
|
|
735
898
|
|
|
736
899
|
waitUntil(fn: () => Promise<void>): void {
|
|
737
900
|
if (executionContext?.waitUntil) {
|
|
738
|
-
|
|
901
|
+
// Wrap in Promise.resolve().then(fn) so a SYNCHRONOUS throw in a
|
|
902
|
+
// non-async callback becomes a rejected promise handed to the host's
|
|
903
|
+
// waitUntil (logged as a background failure), instead of escaping into
|
|
904
|
+
// the request flow. Mirrors fireAndForgetWaitUntil's deferral.
|
|
905
|
+
executionContext.waitUntil(Promise.resolve().then(fn));
|
|
739
906
|
} else {
|
|
740
907
|
fireAndForgetWaitUntil(fn);
|
|
741
908
|
}
|
|
@@ -751,7 +918,6 @@ export function createRequestContext<TEnv>(
|
|
|
751
918
|
this._onResponseCallbacks.push(callback);
|
|
752
919
|
},
|
|
753
920
|
|
|
754
|
-
// Theme properties (only set when themeConfig is provided)
|
|
755
921
|
get theme() {
|
|
756
922
|
return themeConfig ? getTheme() : undefined;
|
|
757
923
|
},
|
|
@@ -775,19 +941,17 @@ export function createRequestContext<TEnv>(
|
|
|
775
941
|
_reportedErrors: new WeakSet<object>(),
|
|
776
942
|
_metricsStore: undefined,
|
|
777
943
|
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
_resolveRenderBarrier: null as any, // set below
|
|
944
|
+
_renderBarrier: null as any,
|
|
945
|
+
_resolveRenderBarrier: null as any,
|
|
781
946
|
_renderBarrierSegmentOrder: undefined,
|
|
782
947
|
|
|
783
948
|
reverse: createReverseFunction(getGlobalRouteMap(), undefined, {}),
|
|
784
949
|
};
|
|
785
950
|
|
|
786
|
-
// Lazy
|
|
787
|
-
// calls rendered(). Requests that don't use rendered() pay zero cost.
|
|
951
|
+
// Lazy allocation: only create Promise when a loader calls rendered().
|
|
788
952
|
let barrierResolved = false;
|
|
789
953
|
let resolveBarrier: (() => void) | undefined;
|
|
790
|
-
ctx._renderBarrier = null as any;
|
|
954
|
+
ctx._renderBarrier = null as any;
|
|
791
955
|
ctx._resolveRenderBarrier = (
|
|
792
956
|
segments: Array<{ type: string; id: string }>,
|
|
793
957
|
) => {
|
|
@@ -797,21 +961,26 @@ export function createRequestContext<TEnv>(
|
|
|
797
961
|
.filter((s) => s.type !== "loader")
|
|
798
962
|
.map((s) => s.id);
|
|
799
963
|
ctx._renderBarrierSegmentOrder = segOrder;
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
ctx.
|
|
964
|
+
|
|
965
|
+
const closeGuard = () => {
|
|
966
|
+
ctx._renderBarrierWaiters = undefined;
|
|
967
|
+
ctx._handlerLoaderDeps = undefined;
|
|
968
|
+
ctx._renderBarrierGuardClosed = true;
|
|
969
|
+
};
|
|
970
|
+
|
|
971
|
+
if (ctx._treeHasStreaming) {
|
|
972
|
+
handleStore.settled.then(closeGuard);
|
|
973
|
+
} else {
|
|
974
|
+
ctx._renderBarrierHandleSnapshot = buildHandleSnapshot(
|
|
975
|
+
handleStore,
|
|
976
|
+
segOrder,
|
|
977
|
+
);
|
|
978
|
+
closeGuard();
|
|
979
|
+
}
|
|
808
980
|
if (resolveBarrier) resolveBarrier();
|
|
809
981
|
};
|
|
810
982
|
Object.defineProperty(ctx, "_renderBarrier", {
|
|
811
983
|
get() {
|
|
812
|
-
// Barrier already resolved (cache/prerender hit) or first lazy access.
|
|
813
|
-
// Either way, replace the getter with a concrete value to avoid
|
|
814
|
-
// repeated Promise.resolve() allocations on subsequent reads.
|
|
815
984
|
const p = barrierResolved
|
|
816
985
|
? Promise.resolve()
|
|
817
986
|
: new Promise<void>((resolve) => {
|
|
@@ -827,32 +996,33 @@ export function createRequestContext<TEnv>(
|
|
|
827
996
|
configurable: true,
|
|
828
997
|
});
|
|
829
998
|
|
|
830
|
-
// Now create use() with access to ctx
|
|
831
999
|
ctx.use = createUseFunction({
|
|
832
1000
|
handleStore,
|
|
833
1001
|
loaderPromises,
|
|
834
1002
|
getContext: () => ctx,
|
|
835
1003
|
});
|
|
836
1004
|
|
|
837
|
-
// Brand with taint symbol so "use cache" excludes ctx from cache keys
|
|
838
1005
|
(ctx as any)[NOCACHE_SYMBOL] = true;
|
|
839
1006
|
return ctx;
|
|
840
1007
|
}
|
|
841
1008
|
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
*
|
|
847
|
-
|
|
848
|
-
|
|
1009
|
+
// Capture the Max-Age value so it can be parsed numerically. A leading zero
|
|
1010
|
+
// (Max-Age=05) is a non-zero lifetime, not a deletion; only a value that parses
|
|
1011
|
+
// to <= 0 marks a cookie for deletion. Pattern-matching a leading "0" misread
|
|
1012
|
+
// zero-prefixed values like 05 / 010 as deletions.
|
|
1013
|
+
const MAX_AGE_RE = /;\s*Max-Age\s*=\s*(-?\d+)/i;
|
|
1014
|
+
|
|
1015
|
+
function isCookieDeletion(header: string): boolean {
|
|
1016
|
+
const m = MAX_AGE_RE.exec(header);
|
|
1017
|
+
if (!m) return false;
|
|
1018
|
+
return Number(m[1]) <= 0;
|
|
1019
|
+
}
|
|
849
1020
|
|
|
850
1021
|
function parseResponseCookies(response: Response): Map<string, string | null> {
|
|
851
1022
|
const result = new Map<string, string | null>();
|
|
852
1023
|
const setCookies = response.headers.getSetCookie();
|
|
853
1024
|
|
|
854
1025
|
for (const header of setCookies) {
|
|
855
|
-
// First segment before ';' is the name=value pair
|
|
856
1026
|
const semiIdx = header.indexOf(";");
|
|
857
1027
|
const pair = semiIdx === -1 ? header : header.substring(0, semiIdx);
|
|
858
1028
|
const eqIdx = pair.indexOf("=");
|
|
@@ -864,49 +1034,22 @@ function parseResponseCookies(response: Response): Map<string, string | null> {
|
|
|
864
1034
|
name = decodeURIComponent(pair.substring(0, eqIdx).trim());
|
|
865
1035
|
value = decodeURIComponent(pair.substring(eqIdx + 1).trim());
|
|
866
1036
|
} catch {
|
|
867
|
-
// Malformed encoding — skip this entry
|
|
868
1037
|
continue;
|
|
869
1038
|
}
|
|
870
1039
|
|
|
871
|
-
|
|
872
|
-
const isDeleted = MAX_AGE_ZERO_RE.test(header);
|
|
1040
|
+
const isDeleted = isCookieDeletion(header);
|
|
873
1041
|
result.set(name, isDeleted ? null : value);
|
|
874
1042
|
}
|
|
875
1043
|
|
|
876
1044
|
return result;
|
|
877
1045
|
}
|
|
878
1046
|
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
cookieHeader: string | null,
|
|
884
|
-
): Record<string, string> {
|
|
885
|
-
if (!cookieHeader) return {};
|
|
886
|
-
|
|
887
|
-
const cookies: Record<string, string> = {};
|
|
888
|
-
const pairs = cookieHeader.split(";");
|
|
889
|
-
|
|
890
|
-
for (const pair of pairs) {
|
|
891
|
-
const [name, ...rest] = pair.trim().split("=");
|
|
892
|
-
if (name) {
|
|
893
|
-
const raw = rest.join("=");
|
|
894
|
-
try {
|
|
895
|
-
cookies[name] = decodeURIComponent(raw);
|
|
896
|
-
} catch {
|
|
897
|
-
// Malformed percent-encoded value (e.g. %zz, %2) - fall back to raw value
|
|
898
|
-
cookies[name] = raw;
|
|
899
|
-
}
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
|
-
|
|
903
|
-
return cookies;
|
|
904
|
-
}
|
|
1047
|
+
// Re-exported for unit tests and the existing import path. The implementation
|
|
1048
|
+
// lives in the dependency-free ./cookie-parse leaf so consumers (e.g. the host
|
|
1049
|
+
// dispatcher) can share it without pulling this module's request-context graph.
|
|
1050
|
+
export { parseCookiesFromHeader };
|
|
905
1051
|
|
|
906
|
-
|
|
907
|
-
* Serialize a cookie for Set-Cookie header
|
|
908
|
-
*/
|
|
909
|
-
function serializeCookieValue(
|
|
1052
|
+
export function serializeCookieValue(
|
|
910
1053
|
name: string,
|
|
911
1054
|
value: string,
|
|
912
1055
|
options: CookieOptions = {},
|
|
@@ -933,20 +1076,12 @@ export interface CreateUseFunctionOptions<TEnv> {
|
|
|
933
1076
|
getContext: () => RequestContext<TEnv>;
|
|
934
1077
|
}
|
|
935
1078
|
|
|
936
|
-
/**
|
|
937
|
-
* Create the use() function for loader and handle composition.
|
|
938
|
-
*
|
|
939
|
-
* This is the unified implementation used by both RequestContext and HandlerContext.
|
|
940
|
-
* - For loaders: executes and memoizes loader functions
|
|
941
|
-
* - For handles: returns a push function to add handle data
|
|
942
|
-
*/
|
|
943
1079
|
export function createUseFunction<TEnv>(
|
|
944
1080
|
options: CreateUseFunctionOptions<TEnv>,
|
|
945
1081
|
): RequestContext["use"] {
|
|
946
1082
|
const { handleStore, loaderPromises, getContext } = options;
|
|
947
1083
|
|
|
948
1084
|
return ((item: LoaderDefinition<any, any> | Handle<any, any>) => {
|
|
949
|
-
// Handle case: return a push function
|
|
950
1085
|
if (isHandle(item)) {
|
|
951
1086
|
const handle = item;
|
|
952
1087
|
const ctx = getContext();
|
|
@@ -959,30 +1094,24 @@ export function createUseFunction<TEnv>(
|
|
|
959
1094
|
);
|
|
960
1095
|
}
|
|
961
1096
|
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
// Push directly - promises will be serialized by RSC and streamed
|
|
973
|
-
handleStore.push(handle.$$id, segmentId, valueOrPromise);
|
|
974
|
-
};
|
|
1097
|
+
return withDefer(
|
|
1098
|
+
(dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>)) => {
|
|
1099
|
+
const valueOrPromise =
|
|
1100
|
+
typeof dataOrFn === "function"
|
|
1101
|
+
? (dataOrFn as () => Promise<unknown>)()
|
|
1102
|
+
: dataOrFn;
|
|
1103
|
+
|
|
1104
|
+
handleStore.push(handle.$$id, segmentId, valueOrPromise);
|
|
1105
|
+
},
|
|
1106
|
+
);
|
|
975
1107
|
}
|
|
976
1108
|
|
|
977
|
-
// Loader case
|
|
978
1109
|
const loader = item as LoaderDefinition<any, any>;
|
|
979
1110
|
|
|
980
|
-
// Return cached promise if already started
|
|
981
1111
|
if (loaderPromises.has(loader.$$id)) {
|
|
982
1112
|
return loaderPromises.get(loader.$$id);
|
|
983
1113
|
}
|
|
984
1114
|
|
|
985
|
-
// Get loader function - either from loader object or fetchable registry
|
|
986
1115
|
let loaderFn = loader.fn;
|
|
987
1116
|
if (!loaderFn) {
|
|
988
1117
|
const fetchable = getFetchableLoader(loader.$$id);
|
|
@@ -999,13 +1128,24 @@ export function createUseFunction<TEnv>(
|
|
|
999
1128
|
|
|
1000
1129
|
const ctx = getContext();
|
|
1001
1130
|
|
|
1002
|
-
//
|
|
1131
|
+
// Build the typed ctx.search the same way the render path
|
|
1132
|
+
// (createHandlerContext) and the fetchable-loader path (loader-fetch.ts) do:
|
|
1133
|
+
// parse the route's search schema over the cleaned searchParams. The base
|
|
1134
|
+
// RequestContext carries no `search` field, so reading `(ctx as any).search`
|
|
1135
|
+
// here always yielded {} — dropping typed search for action/dispatch loaders.
|
|
1136
|
+
const searchSchema = ctx._routeName
|
|
1137
|
+
? getSearchSchema(ctx._routeName)
|
|
1138
|
+
: undefined;
|
|
1139
|
+
const loaderSearch = searchSchema
|
|
1140
|
+
? parseSearchParams(ctx.searchParams, searchSchema)
|
|
1141
|
+
: {};
|
|
1142
|
+
|
|
1003
1143
|
const loaderCtx: LoaderContext<Record<string, string | undefined>, TEnv> = {
|
|
1004
1144
|
params: ctx.params,
|
|
1005
1145
|
routeParams: (ctx.params ?? {}) as Record<string, string>,
|
|
1006
1146
|
request: ctx.request,
|
|
1007
1147
|
searchParams: ctx.searchParams,
|
|
1008
|
-
search:
|
|
1148
|
+
search: loaderSearch,
|
|
1009
1149
|
pathname: ctx.pathname,
|
|
1010
1150
|
url: ctx.url,
|
|
1011
1151
|
originalUrl: ctx.originalUrl,
|
|
@@ -1016,7 +1156,6 @@ export function createUseFunction<TEnv>(
|
|
|
1016
1156
|
use: (<TDep, TDepParams = any>(
|
|
1017
1157
|
dep: LoaderDefinition<TDep, TDepParams>,
|
|
1018
1158
|
): Promise<TDep> => {
|
|
1019
|
-
// Recursive call - will start dep loader if not already started
|
|
1020
1159
|
return ctx.use(dep);
|
|
1021
1160
|
}) as LoaderContext["use"],
|
|
1022
1161
|
method: "GET",
|
|
@@ -1035,12 +1174,14 @@ export function createUseFunction<TEnv>(
|
|
|
1035
1174
|
},
|
|
1036
1175
|
};
|
|
1037
1176
|
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1177
|
+
// Meter through the same unified phase API as the loader-resolution funnel
|
|
1178
|
+
// (observePhase), so a loader resolved via this base request-context ctx.use
|
|
1179
|
+
// co-emits the "loader:<id>" perf metric AND the "rango.loader" span — no
|
|
1180
|
+
// drift between the two ctx.use implementations.
|
|
1181
|
+
const promise = observePhase(PHASES.loader(loader.$$id), () =>
|
|
1182
|
+
Promise.resolve(loaderFn(loaderCtx)),
|
|
1183
|
+
);
|
|
1042
1184
|
|
|
1043
|
-
// Memoize for subsequent calls
|
|
1044
1185
|
loaderPromises.set(loader.$$id, promise);
|
|
1045
1186
|
|
|
1046
1187
|
return promise;
|