@rangojs/router 0.0.0-experimental.19 → 0.0.0-experimental.190fb30d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +13 -0
- package/README.md +304 -708
- 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 +822 -182
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -28
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/{src/handles/index.ts → dist/handles/index.js} +1 -1
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -10
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +4644 -1433
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +87 -16
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +251 -24
- package/skills/caching/SKILL.md +379 -21
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +110 -4
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +5 -3
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +87 -56
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +76 -692
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +94 -18
- package/skills/layout/SKILL.md +62 -19
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +320 -32
- package/skills/middleware/SKILL.md +59 -16
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +29 -2
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +225 -10
- package/skills/ppr/SKILL.md +618 -0
- package/skills/prerender/SKILL.md +180 -126
- package/skills/rango/SKILL.md +318 -25
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +138 -49
- package/skills/route/SKILL.md +175 -13
- package/skills/router-setup/SKILL.md +139 -14
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +126 -222
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +45 -614
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +74 -15
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +67 -40
- package/src/bin/rango.ts +18 -0
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +257 -158
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +4 -0
- package/src/browser/logging.ts +28 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-bridge.ts +222 -38
- package/src/browser/navigation-client.ts +233 -58
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +203 -80
- package/src/browser/navigation-transaction.ts +18 -66
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +242 -126
- package/src/browser/prefetch/cache.ts +344 -30
- package/src/browser/prefetch/fetch.ts +373 -48
- package/src/browser/prefetch/policy.ts +6 -0
- package/src/browser/prefetch/queue.ts +144 -23
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +135 -18
- package/src/browser/react/NavigationProvider.tsx +240 -122
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +66 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +178 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +23 -69
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +32 -7
- package/src/browser/react/use-params.ts +20 -10
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +46 -11
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +99 -8
- package/src/browser/rsc-router.tsx +276 -75
- package/src/browser/scroll-restoration.ts +61 -47
- package/src/browser/segment-reconciler.ts +44 -7
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +631 -442
- package/src/browser/types.ts +160 -12
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +207 -158
- package/src/build/generate-route-types.ts +8 -1
- package/src/build/index.ts +11 -3
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +215 -42
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +16 -5
- package/src/build/route-types/include-resolution.ts +464 -63
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +22 -6
- package/src/build/route-types/router-processing.ts +442 -106
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +13 -21
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +58 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +454 -97
- package/src/cache/cache-scope.ts +235 -103
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2446 -170
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +11 -17
- package/src/cache/document-cache.ts +144 -49
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +24 -20
- package/src/cache/memory-segment-store.ts +243 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +13 -21
- package/src/cache/shell-snapshot.ts +417 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +55 -0
- package/src/cache/types.ts +194 -99
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1132 -0
- package/src/client.rsc.tsx +42 -21
- package/src/client.tsx +117 -336
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +84 -2
- package/src/debug.ts +2 -2
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +30 -4
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +104 -34
- package/src/handles/MetaTags.tsx +24 -53
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +14 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +13 -22
- package/src/host/index.ts +9 -5
- 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 +86 -30
- package/src/index.ts +158 -68
- package/src/internal-debug.ts +11 -10
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +63 -26
- package/src/prerender.ts +215 -86
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +65 -15
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +19 -77
- package/src/route-definition/dsl-helpers.ts +485 -303
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +153 -77
- package/src/route-definition/index.ts +4 -5
- package/src/route-definition/redirect.ts +53 -12
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +48 -21
- package/src/route-types.ts +37 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +164 -17
- package/src/router/error-handling.ts +45 -18
- package/src/router/find-match.ts +130 -29
- package/src/router/handler-context.ts +110 -39
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +50 -24
- package/src/router/lazy-includes.ts +89 -63
- package/src/router/loader-resolution.ts +286 -56
- package/src/router/logging.ts +5 -8
- package/src/router/manifest.ts +105 -56
- package/src/router/match-api.ts +179 -219
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +211 -165
- package/src/router/match-middleware/background-revalidation.ts +66 -22
- package/src/router/match-middleware/cache-lookup.ts +214 -263
- package/src/router/match-middleware/cache-store.ts +105 -50
- package/src/router/match-middleware/intercept-resolution.ts +8 -28
- package/src/router/match-middleware/segment-resolution.ts +52 -18
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +127 -52
- package/src/router/metrics.ts +217 -26
- package/src/router/middleware-types.ts +24 -110
- package/src/router/middleware.ts +412 -199
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +183 -137
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +207 -58
- package/src/router/preview-match.ts +35 -103
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +144 -74
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +11 -29
- package/src/router/router-interfaces.ts +160 -36
- package/src/router/router-options.ts +215 -23
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +318 -77
- package/src/router/segment-resolution/helpers.ts +116 -31
- package/src/router/segment-resolution/loader-cache.ts +156 -39
- package/src/router/segment-resolution/loader-mask.ts +67 -0
- package/src/router/segment-resolution/loader-snapshot.ts +308 -0
- package/src/router/segment-resolution/revalidation.ts +496 -391
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +5 -1
- package/src/router/segment-wrappers.ts +8 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +160 -200
- package/src/router/telemetry.ts +105 -20
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +188 -58
- package/src/router/types.ts +10 -63
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +224 -65
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +726 -457
- package/src/rsc/helpers.ts +168 -46
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +127 -31
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +159 -23
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +99 -189
- package/src/rsc/rsc-rendering.ts +516 -104
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +293 -115
- package/src/rsc/shell-capture.ts +1166 -0
- package/src/rsc/shell-serve.ts +181 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +64 -6
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +49 -41
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +418 -131
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +375 -63
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +152 -5
- package/src/server/handle-store.ts +40 -38
- package/src/server/loader-registry.ts +38 -46
- package/src/server/request-context.ts +585 -178
- package/src/server.ts +6 -0
- package/src/ssr/index.tsx +467 -174
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +27 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +371 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +357 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +56 -84
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +3 -19
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +17 -8
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +237 -89
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +44 -15
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +23 -46
- package/src/types/route-entry.ts +19 -7
- package/src/types/segments.ts +137 -19
- package/src/urls/include-helper.ts +40 -75
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +2 -11
- package/src/urls/path-helper-types.ts +102 -23
- package/src/urls/path-helper.ts +62 -111
- package/src/urls/pattern-types.ts +84 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +98 -154
- package/src/urls/urls-function.ts +1 -19
- package/src/use-loader.tsx +346 -89
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +64 -91
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +147 -88
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +247 -145
- 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 +61 -13
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +19 -3
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +234 -62
- package/src/vite/plugins/cjs-to-esm.ts +16 -19
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +28 -15
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/plugins/expose-action-id.ts +49 -98
- package/src/vite/plugins/expose-id-utils.ts +96 -51
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
- package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
- package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
- package/src/vite/plugins/expose-internal-ids.ts +553 -317
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +73 -83
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +40 -29
- package/src/vite/plugins/version-plugin.ts +46 -37
- package/src/vite/plugins/virtual-entries.ts +138 -27
- package/src/vite/rango.ts +356 -295
- package/src/vite/router-discovery.ts +1106 -166
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +4 -59
- package/src/vite/utils/package-resolution.ts +20 -52
- package/src/vite/utils/prerender-utils.ts +158 -38
- package/src/vite/utils/shared-utils.ts +144 -44
- package/CLAUDE.md +0 -5
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/shallow.ts +0 -40
- package/src/route-definition/route-function.ts +0 -119
- package/src/router/middleware-cookies.ts +0 -55
|
@@ -11,26 +11,63 @@
|
|
|
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 {
|
|
26
|
+
DefaultEnv,
|
|
18
27
|
DefaultReverseRouteMap,
|
|
19
28
|
DefaultRouteName,
|
|
20
29
|
} from "../types/global-namespace.js";
|
|
21
30
|
import type { Handle } from "../handle.js";
|
|
22
|
-
import {
|
|
23
|
-
|
|
31
|
+
import {
|
|
32
|
+
type ContextVar,
|
|
33
|
+
contextGet,
|
|
34
|
+
contextSet,
|
|
35
|
+
isNonCacheable,
|
|
36
|
+
} from "../context-var.js";
|
|
37
|
+
import {
|
|
38
|
+
createHandleStore,
|
|
39
|
+
buildHandleSnapshot,
|
|
40
|
+
type HandleStore,
|
|
41
|
+
type HandleData,
|
|
42
|
+
} from "./handle-store.js";
|
|
24
43
|
import { isHandle } from "../handle.js";
|
|
25
|
-
import {
|
|
44
|
+
import { withDefer } from "../defer.js";
|
|
45
|
+
import { type MetricsStore } from "./context.js";
|
|
46
|
+
import { observePhase, PHASES } from "../router/instrument.js";
|
|
26
47
|
import { getFetchableLoader } from "./fetchable-loader-store.js";
|
|
27
48
|
import type { SegmentCacheStore } from "../cache/types.js";
|
|
28
49
|
import type { Theme, ResolvedThemeConfig } from "../theme/types.js";
|
|
29
|
-
import {
|
|
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";
|
|
53
|
+
import {
|
|
54
|
+
THEME_COOKIE,
|
|
55
|
+
isValidTheme,
|
|
56
|
+
warnInvalidTheme,
|
|
57
|
+
} from "../theme/constants.js";
|
|
30
58
|
import type { LocationStateEntry } from "../browser/react/location-state-shared.js";
|
|
31
59
|
import { NOCACHE_SYMBOL, assertNotInsideCacheExec } from "../cache/taint.js";
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
60
|
+
import { isInsideCacheScope } from "./context.js";
|
|
61
|
+
import {
|
|
62
|
+
createReverseFunction,
|
|
63
|
+
stripInternalParams,
|
|
64
|
+
} from "../router/handler-context.js";
|
|
65
|
+
import {
|
|
66
|
+
getGlobalRouteMap,
|
|
67
|
+
isRouteRootScoped,
|
|
68
|
+
getSearchSchema,
|
|
69
|
+
} from "../route-map-builder.js";
|
|
70
|
+
import { parseSearchParams } from "../search-params.js";
|
|
34
71
|
import { invariant } from "../errors.js";
|
|
35
72
|
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
36
73
|
|
|
@@ -41,21 +78,11 @@ import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
|
41
78
|
* Use this when you need access to request data outside of route handlers.
|
|
42
79
|
*/
|
|
43
80
|
export interface RequestContext<
|
|
44
|
-
TEnv =
|
|
81
|
+
TEnv = DefaultEnv,
|
|
45
82
|
TParams = Record<string, string>,
|
|
46
|
-
> {
|
|
47
|
-
/**
|
|
48
|
-
|
|
49
|
-
/** Original HTTP request */
|
|
50
|
-
request: Request;
|
|
51
|
-
/** Parsed URL (system params like _rsc* are NOT filtered here) */
|
|
52
|
-
url: URL;
|
|
53
|
-
/** URL pathname */
|
|
54
|
-
pathname: string;
|
|
55
|
-
/** URL search params (system params like _rsc* are NOT filtered here) */
|
|
56
|
-
searchParams: URLSearchParams;
|
|
57
|
-
/** Variables set by middleware (same as ctx.var) */
|
|
58
|
-
var: Record<string, any>;
|
|
83
|
+
> extends RequestScope<TEnv> {
|
|
84
|
+
/** @internal Shared variable backing store for ctx.get()/ctx.set(). */
|
|
85
|
+
_variables: Record<string, any>;
|
|
59
86
|
/** Get a variable set by middleware */
|
|
60
87
|
get: {
|
|
61
88
|
<T>(contextVar: ContextVar<T>): T | undefined;
|
|
@@ -63,20 +90,19 @@ export interface RequestContext<
|
|
|
63
90
|
};
|
|
64
91
|
/** Set a variable (shared with middleware and handlers) */
|
|
65
92
|
set: {
|
|
66
|
-
<T>(
|
|
67
|
-
|
|
93
|
+
<T>(
|
|
94
|
+
contextVar: ContextVar<T>,
|
|
95
|
+
value: T,
|
|
96
|
+
options?: { cache?: boolean },
|
|
97
|
+
): void;
|
|
98
|
+
<K extends string>(key: K, value: any, options?: { cache?: boolean }): void;
|
|
68
99
|
};
|
|
69
100
|
/**
|
|
70
101
|
* Route params (populated after route matching)
|
|
71
102
|
* Initially empty, then set to matched params
|
|
72
103
|
*/
|
|
73
104
|
params: TParams;
|
|
74
|
-
/**
|
|
75
|
-
* Stub response for setting headers/cookies (read-only).
|
|
76
|
-
* Headers set here are merged into the final response.
|
|
77
|
-
* Use header() or setStatus() to mutate response headers/status.
|
|
78
|
-
* Use cookies().set()/cookies().delete() for cookie mutations.
|
|
79
|
-
*/
|
|
105
|
+
/** @internal Stub response for collecting headers/cookies. Use ctx.headers or ctx.header() instead. */
|
|
80
106
|
readonly res: Response;
|
|
81
107
|
|
|
82
108
|
/** @internal Get a cookie value (effective: request + response mutations). Use cookies().get() instead. */
|
|
@@ -94,6 +120,12 @@ export interface RequestContext<
|
|
|
94
120
|
header(name: string, value: string): void;
|
|
95
121
|
/** Set the response status code */
|
|
96
122
|
setStatus(status: number): void;
|
|
123
|
+
/** @internal Set status bypassing cache-exec guard (for framework error handling) */
|
|
124
|
+
_setStatus(status: number): void;
|
|
125
|
+
/** @internal Rotate the rango state cookie (server seat of invalidateClientCache). */
|
|
126
|
+
_rotateStateCookie(): void;
|
|
127
|
+
/** @internal Set the keepClientCache() directive header on the response. */
|
|
128
|
+
_setKeepCacheDirective(): void;
|
|
97
129
|
|
|
98
130
|
/**
|
|
99
131
|
* Access loader data or push handle data.
|
|
@@ -129,29 +161,100 @@ export interface RequestContext<
|
|
|
129
161
|
/** @internal Handle store for tracking handle data across segments */
|
|
130
162
|
_handleStore: HandleStore;
|
|
131
163
|
|
|
164
|
+
/**
|
|
165
|
+
* @internal transition({ when }) predicates for segments matched this request,
|
|
166
|
+
* keyed by segment id. Collected during resolution (the function is stripped
|
|
167
|
+
* from the serialized segment config), then evaluated post-handler in
|
|
168
|
+
* rsc-rendering — outside any cache scope — to drop the transition of any
|
|
169
|
+
* segment whose predicate returns false.
|
|
170
|
+
*/
|
|
171
|
+
_transitionWhen?: Array<{ id: string; when: TransitionWhenFn }>;
|
|
172
|
+
|
|
132
173
|
/** @internal Cache store for segment caching (optional, used by CacheScope) */
|
|
133
174
|
_cacheStore?: SegmentCacheStore;
|
|
134
175
|
|
|
176
|
+
/**
|
|
177
|
+
* @internal PPR shell-capture ACTIVE marker. True ONLY inside the background
|
|
178
|
+
* capture task's derived request context (built by shell-capture.ts). This is
|
|
179
|
+
* the switch every capture-specific behavior reads: loader masking
|
|
180
|
+
* (loader-mask.ts isShellCaptureActive / fresh.ts emitStreaming) and the
|
|
181
|
+
* cookies()/headers() capture guard (cookie-store.ts
|
|
182
|
+
* assertNotInsideShellCapture). The foreground render never sets it, so the
|
|
183
|
+
* served response is byte-identical to axis 1. The capture descriptor itself
|
|
184
|
+
* (key/ttl/swr/tags/store) is NOT threaded through the request context — the
|
|
185
|
+
* integrated PPR serve path (rsc/shell-serve.ts + rsc-rendering.ts) builds it
|
|
186
|
+
* locally and passes it to scheduleShellCapture directly.
|
|
187
|
+
*/
|
|
188
|
+
_shellCaptureRun?: boolean;
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* @internal Bake-lane loader containers collected DURING a shell capture:
|
|
192
|
+
* segment-key -> the loader's (pre-wrap) result promise. Populated by
|
|
193
|
+
* resolveLoaderData for loaders on entries with no renderable loading() (the
|
|
194
|
+
* bake lane — they execute at capture instead of being masked; see
|
|
195
|
+
* docs/design/loader-container-bake.md). Drained by captureAndStoreShell
|
|
196
|
+
* after the shell quiesces: settled containers are promise-elided,
|
|
197
|
+
* Flight-serialized, and pinned into the snapshot's loader family; a
|
|
198
|
+
* REJECTED container refuses the capture (error UI must never bake into the
|
|
199
|
+
* shared shell). Own property of the capture's derived context only.
|
|
200
|
+
*/
|
|
201
|
+
_shellCaptureLoaderRecords?: Map<string, Promise<unknown>>;
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* @internal Loader-family snapshot seed for a shell HIT's tail render:
|
|
205
|
+
* segment-key -> the capture's elided container (already Flight-deserialized
|
|
206
|
+
* by serveShellHit). resolveLoaderData overlays it onto the fresh run's
|
|
207
|
+
* container (recorded paths pinned, hole-marker paths keep the fresh nested
|
|
208
|
+
* promises) so the payload's baked bytes match the frozen prelude. Own
|
|
209
|
+
* property of the HIT tail's derived context only.
|
|
210
|
+
*/
|
|
211
|
+
_shellLoaderSeed?: Map<string, unknown>;
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* @internal Set (to the offending fn name) by the cookies()/headers()
|
|
215
|
+
* capture guard when it throws DURING a capture render. Load-bearing for the
|
|
216
|
+
* bake lane: a guard throw inside an executing loader is swallowed by
|
|
217
|
+
* wrapLoaderPromise into per-loader error UI, which would otherwise bake
|
|
218
|
+
* silently into the shared shell — the capture checks this flag after the
|
|
219
|
+
* render and refuses instead. Deterministic, so the capture does not retry.
|
|
220
|
+
*/
|
|
221
|
+
_shellCaptureGuardTripped?: string;
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* @internal The loader $$id whose BODY was executing when the capture guard
|
|
225
|
+
* tripped (read off the loader-body ALS scope at trip time), or undefined
|
|
226
|
+
* when the read came from handler/render code. Only used to make the
|
|
227
|
+
* once-per-key refusal warning name the real source — the old text
|
|
228
|
+
* hardcoded "a bake-lane loader", which misattributed handler-land reads
|
|
229
|
+
* and sent users debugging the wrong lane (issue #672, secondary).
|
|
230
|
+
*/
|
|
231
|
+
_shellCaptureGuardTrippedLoaderId?: string;
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* @internal Handler-owned registry of explicit per-scope stores from
|
|
235
|
+
* cache({ store }). Created once per createRSCHandler() and threaded into
|
|
236
|
+
* every request context, so it accumulates every explicit store the handler
|
|
237
|
+
* resolves. updateTag()/revalidateTag() iterate this set plus _cacheStore to
|
|
238
|
+
* reach every store that may hold tagged entries. The app-level store is not
|
|
239
|
+
* added here (it is always reachable via _cacheStore).
|
|
240
|
+
*/
|
|
241
|
+
_explicitTaggedStores?: Set<SegmentCacheStore>;
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* @internal Union of every cache tag resolved while producing this request's
|
|
245
|
+
* response (from cache({ tags }), runtime cacheTag(), and loader cache tags).
|
|
246
|
+
* Populated at the tag-resolution sites via recordRequestTags(). Read by the
|
|
247
|
+
* document cache middleware so a full-page entry is tagged with everything its
|
|
248
|
+
* content used and can therefore be invalidated by updateTag()/revalidateTag().
|
|
249
|
+
*/
|
|
250
|
+
_requestTags: Set<string>;
|
|
251
|
+
|
|
135
252
|
/** @internal Cache profiles for "use cache" profile resolution (per-router) */
|
|
136
253
|
_cacheProfiles?: Record<
|
|
137
254
|
string,
|
|
138
255
|
import("../cache/profile-registry.js").CacheProfile
|
|
139
256
|
>;
|
|
140
257
|
|
|
141
|
-
/**
|
|
142
|
-
* Schedule work to run after the response is sent.
|
|
143
|
-
* On Cloudflare Workers, uses ctx.waitUntil().
|
|
144
|
-
* On Node.js, runs as fire-and-forget.
|
|
145
|
-
*
|
|
146
|
-
* @example
|
|
147
|
-
* ```typescript
|
|
148
|
-
* ctx.waitUntil(async () => {
|
|
149
|
-
* await cacheStore.set(key, data, ttl);
|
|
150
|
-
* });
|
|
151
|
-
* ```
|
|
152
|
-
*/
|
|
153
|
-
waitUntil(fn: () => Promise<void>): void;
|
|
154
|
-
|
|
155
258
|
/**
|
|
156
259
|
* Register a callback to run when the response is created.
|
|
157
260
|
* Callbacks are sync and receive the response. They can:
|
|
@@ -174,6 +277,19 @@ export interface RequestContext<
|
|
|
174
277
|
/** @internal Registered onResponse callbacks */
|
|
175
278
|
_onResponseCallbacks: Array<(response: Response) => Response>;
|
|
176
279
|
|
|
280
|
+
/**
|
|
281
|
+
* @internal Promises of the background tasks scheduled via this context's
|
|
282
|
+
* waitUntil (deferred cache writes, revalidations, consumer tasks). The PPR
|
|
283
|
+
* shell capture drains this list BEFORE its match/render as an ORDERING EDGE:
|
|
284
|
+
* every foreground deferred cache write is scheduled here before the capture
|
|
285
|
+
* task is, so settling the list first guarantees the capture's cache reads
|
|
286
|
+
* observe the foreground's generation instead of racing it (see
|
|
287
|
+
* shell-capture.ts). Tasks whose scheduling fn carries
|
|
288
|
+
* UNTRACKED_BACKGROUND_TASK are not tracked (the capture task itself —
|
|
289
|
+
* tracking it would make that drain await its own promise).
|
|
290
|
+
*/
|
|
291
|
+
_pendingBackgroundTasks?: Array<Promise<unknown>>;
|
|
292
|
+
|
|
177
293
|
/**
|
|
178
294
|
* Current theme setting (only available when theme is enabled in router config)
|
|
179
295
|
*
|
|
@@ -255,6 +371,92 @@ export interface RequestContext<
|
|
|
255
371
|
/** @internal Previous route key (from the navigation source), used for revalidation */
|
|
256
372
|
_prevRouteKey?: string;
|
|
257
373
|
|
|
374
|
+
/**
|
|
375
|
+
* @internal Navigation/action source data the transition({ when }) gate reads
|
|
376
|
+
* to build its ShouldRevalidateFn-shaped predicate context. currentUrl/Params
|
|
377
|
+
* come from the navigation snapshot (set at match time); action* are stashed
|
|
378
|
+
* at the action-bearing gate call sites. All undefined when there is no source
|
|
379
|
+
* (initial full load) or no action (plain navigation).
|
|
380
|
+
*/
|
|
381
|
+
_gateCurrentUrl?: URL;
|
|
382
|
+
_gateCurrentParams?: Record<string, string>;
|
|
383
|
+
_gateActionId?: string;
|
|
384
|
+
_gateActionUrl?: URL;
|
|
385
|
+
_gateActionResult?: unknown;
|
|
386
|
+
_gateFormData?: FormData;
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* @internal True while the post-action revalidation render is running (set by
|
|
390
|
+
* revalidateAfterAction). The "use cache" runtime reads this to prefer
|
|
391
|
+
* freshness over a fast stale response during an action: a stale entry
|
|
392
|
+
* re-executes in the foreground (so the action response reflects the refreshed
|
|
393
|
+
* value) with only the store write deferred, instead of serving stale and
|
|
394
|
+
* revalidating in the background. A plain navigation (flag unset) keeps SWR.
|
|
395
|
+
*/
|
|
396
|
+
_inActionRevalidation?: boolean;
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* @internal Render barrier for experimental `rendered()` API.
|
|
400
|
+
* Resolves when all non-loader segments have settled and handle data
|
|
401
|
+
* is available. Used by DSL loaders that call `ctx.rendered()`.
|
|
402
|
+
*/
|
|
403
|
+
_renderBarrier: Promise<void>;
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* @internal Resolve the render barrier. Accepts resolved segments, filters
|
|
407
|
+
* out loaders, and captures non-loader segment IDs as the handle ordering.
|
|
408
|
+
* Called after segment resolution (fresh) or handle replay (cache/prerender).
|
|
409
|
+
*/
|
|
410
|
+
_resolveRenderBarrier: (
|
|
411
|
+
segments: Array<{ type: string; id: string }>,
|
|
412
|
+
) => void;
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* @internal Segment order at barrier resolution time, used by loader
|
|
416
|
+
* ctx.use(handle) to collect handle data in correct order.
|
|
417
|
+
*/
|
|
418
|
+
_renderBarrierSegmentOrder?: string[];
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* @internal Set to true when the matched entry tree contains any `loading()`
|
|
422
|
+
* entries (streaming). On a streaming tree rendered() waits for the streaming
|
|
423
|
+
* handlers to settle (via handleStore.settled) before resolving, and the
|
|
424
|
+
* deadlock guard state is kept live until that wait completes.
|
|
425
|
+
*/
|
|
426
|
+
_treeHasStreaming?: boolean;
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* @internal Loader IDs that have called rendered() and are waiting for the
|
|
430
|
+
* barrier. Used to detect deadlocks when a handler tries to await the same
|
|
431
|
+
* loader via ctx.use(Loader).
|
|
432
|
+
*/
|
|
433
|
+
_renderBarrierWaiters?: Set<string>;
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* @internal Loader IDs that handlers have started awaiting via ctx.use().
|
|
437
|
+
* Used for bidirectional deadlock detection: if a loader later calls
|
|
438
|
+
* rendered() and a handler already awaits it, we can detect the deadlock.
|
|
439
|
+
*/
|
|
440
|
+
_handlerLoaderDeps?: Set<string>;
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* @internal Cached HandleData snapshot built at barrier resolution time.
|
|
444
|
+
* Avoids rebuilding the snapshot on every loader ctx.use(handle) call.
|
|
445
|
+
*/
|
|
446
|
+
_renderBarrierHandleSnapshot?: HandleData;
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* @internal The deadlock guard window is closed (no further handler-awaits-
|
|
450
|
+
* loader cycle is possible). For non-streaming trees this is set when the
|
|
451
|
+
* barrier resolves. For streaming trees the window stays open until
|
|
452
|
+
* handleStore.settled — rendered() keeps waiting past the barrier and a
|
|
453
|
+
* loading() handler can still resume and await a still-waiting loader — so it
|
|
454
|
+
* is set only after settled. The guard (loader-resolution `setupLoaderAccess`)
|
|
455
|
+
* reads this instead of `_renderBarrierSegmentOrder` so it does not go blind
|
|
456
|
+
* during the streaming settle wait.
|
|
457
|
+
*/
|
|
458
|
+
_renderBarrierGuardClosed?: boolean;
|
|
459
|
+
|
|
258
460
|
/** @internal Per-request error dedup set for onError reporting */
|
|
259
461
|
_reportedErrors: WeakSet<object>;
|
|
260
462
|
|
|
@@ -262,9 +464,49 @@ export interface RequestContext<
|
|
|
262
464
|
* @internal Report a non-fatal background error through the router's
|
|
263
465
|
* onError callback. Wired by the RSC handler / router during request
|
|
264
466
|
* creation. Cache-runtime and other subsystems call this to surface
|
|
265
|
-
* errors without failing the response.
|
|
467
|
+
* errors without failing the response. `category` is surfaced to consumers as
|
|
468
|
+
* `metadata.category` on the onError context (phase `cache`).
|
|
469
|
+
*/
|
|
470
|
+
_reportBackgroundError?: (
|
|
471
|
+
error: unknown,
|
|
472
|
+
category: CacheErrorCategory,
|
|
473
|
+
) => void;
|
|
474
|
+
|
|
475
|
+
/** @internal Per-request debug performance override (set via ctx.debugPerformance()) */
|
|
476
|
+
_debugPerformance?: boolean;
|
|
477
|
+
|
|
478
|
+
/** @internal Request-scoped performance metrics store */
|
|
479
|
+
_metricsStore?: MetricsStore;
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* @internal True request entry timestamp (performance.now() at handler entry).
|
|
483
|
+
* Set once at request-context creation (rsc/handler.ts) so a metrics store
|
|
484
|
+
* created MID-request — ctx.debugPerformance() or the getMetricsStore wrapper —
|
|
485
|
+
* anchors its timeline to the real request start instead of the opt-in moment,
|
|
486
|
+
* keeping phases that began before the opt-in at their true (non-negative) offset.
|
|
487
|
+
*/
|
|
488
|
+
_handlerStart?: number;
|
|
489
|
+
|
|
490
|
+
/** @internal Resolved platform phase-span tracing for this request (Cloudflare or OTel) */
|
|
491
|
+
_tracing?: ResolvedTracing;
|
|
492
|
+
|
|
493
|
+
/** @internal Router basename for this request (used by redirect()) */
|
|
494
|
+
_basename?: string;
|
|
495
|
+
|
|
496
|
+
/**
|
|
497
|
+
* @internal RouteSnapshot from classifyRequest, reused by match/matchPartial
|
|
498
|
+
* to avoid a second resolveRoute call. Cleared on HMR invalidation.
|
|
266
499
|
*/
|
|
267
|
-
|
|
500
|
+
_classifiedRoute?: import("../router/route-snapshot.js").RouteSnapshot;
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* @internal Coarse route-level cache signal for the X-Rango-Cache debug
|
|
504
|
+
* header. Populated by match/matchPartial only when the debug cache signal
|
|
505
|
+
* gate is enabled (debugCacheSignal option or RANGO_TEST_SIGNALS=1). Read by
|
|
506
|
+
* the response-finalization path (createResponseWithMergedHeaders). Undefined
|
|
507
|
+
* when the gate is off, so no header is emitted.
|
|
508
|
+
*/
|
|
509
|
+
_cacheSignal?: import("../router/telemetry.js").CacheSegmentSignal[];
|
|
268
510
|
}
|
|
269
511
|
|
|
270
512
|
/**
|
|
@@ -274,7 +516,7 @@ export interface RequestContext<
|
|
|
274
516
|
* use the full RequestContext interface directly.
|
|
275
517
|
*/
|
|
276
518
|
export type PublicRequestContext<
|
|
277
|
-
TEnv =
|
|
519
|
+
TEnv = DefaultEnv,
|
|
278
520
|
TParams = Record<string, string>,
|
|
279
521
|
> = Omit<
|
|
280
522
|
RequestContext<TEnv, TParams>,
|
|
@@ -283,17 +525,59 @@ export type PublicRequestContext<
|
|
|
283
525
|
| "setCookie"
|
|
284
526
|
| "deleteCookie"
|
|
285
527
|
| "_handleStore"
|
|
528
|
+
| "_transitionWhen"
|
|
286
529
|
| "_cacheStore"
|
|
530
|
+
| "_shellCaptureRun"
|
|
531
|
+
| "_shellCaptureGuardTrippedLoaderId"
|
|
532
|
+
| "_explicitTaggedStores"
|
|
533
|
+
| "_requestTags"
|
|
287
534
|
| "_cacheProfiles"
|
|
288
535
|
| "_onResponseCallbacks"
|
|
289
536
|
| "_themeConfig"
|
|
290
537
|
| "_locationState"
|
|
291
538
|
| "_routeName"
|
|
292
539
|
| "_prevRouteKey"
|
|
540
|
+
| "_gateCurrentUrl"
|
|
541
|
+
| "_gateCurrentParams"
|
|
542
|
+
| "_gateActionId"
|
|
543
|
+
| "_gateActionUrl"
|
|
544
|
+
| "_gateActionResult"
|
|
545
|
+
| "_gateFormData"
|
|
546
|
+
| "_inActionRevalidation"
|
|
293
547
|
| "_reportedErrors"
|
|
548
|
+
| "_renderBarrier"
|
|
549
|
+
| "_resolveRenderBarrier"
|
|
550
|
+
| "_renderBarrierSegmentOrder"
|
|
551
|
+
| "_treeHasStreaming"
|
|
552
|
+
| "_renderBarrierWaiters"
|
|
553
|
+
| "_handlerLoaderDeps"
|
|
554
|
+
| "_renderBarrierHandleSnapshot"
|
|
555
|
+
| "_renderBarrierGuardClosed"
|
|
294
556
|
| "_reportBackgroundError"
|
|
557
|
+
| "_debugPerformance"
|
|
558
|
+
| "_metricsStore"
|
|
559
|
+
| "_handlerStart"
|
|
560
|
+
| "_basename"
|
|
561
|
+
| "_setStatus"
|
|
562
|
+
| "_rotateStateCookie"
|
|
563
|
+
| "_setKeepCacheDirective"
|
|
564
|
+
| "_variables"
|
|
565
|
+
| "_classifiedRoute"
|
|
566
|
+
| "_cacheSignal"
|
|
567
|
+
| "res"
|
|
295
568
|
>;
|
|
296
569
|
|
|
570
|
+
/**
|
|
571
|
+
* Marker for a waitUntil-scheduled fn whose task promise must NOT enter
|
|
572
|
+
* _pendingBackgroundTasks. Used by the PPR shell capture for its own task:
|
|
573
|
+
* the capture's pre-render write barrier settles that list, so tracking the
|
|
574
|
+
* capture itself would make the drain wait on its own (still-running) promise.
|
|
575
|
+
* @internal
|
|
576
|
+
*/
|
|
577
|
+
export const UNTRACKED_BACKGROUND_TASK: unique symbol = Symbol.for(
|
|
578
|
+
"rango.untrackedBackgroundTask",
|
|
579
|
+
);
|
|
580
|
+
|
|
297
581
|
// AsyncLocalStorage instance for request context
|
|
298
582
|
const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
|
|
299
583
|
|
|
@@ -312,7 +596,7 @@ export function runWithRequestContext<TEnv, T>(
|
|
|
312
596
|
* Get the current request context
|
|
313
597
|
* Throws if called outside of a request context
|
|
314
598
|
*/
|
|
315
|
-
export function getRequestContext<TEnv =
|
|
599
|
+
export function getRequestContext<TEnv = DefaultEnv>(): RequestContext<TEnv> {
|
|
316
600
|
const ctx = requestContextStorage.getStore() as
|
|
317
601
|
| RequestContext<TEnv>
|
|
318
602
|
| undefined;
|
|
@@ -329,7 +613,7 @@ export function getRequestContext<TEnv = unknown>(): RequestContext<TEnv> {
|
|
|
329
613
|
* @internal Get the request context without throwing — for internal code that
|
|
330
614
|
* may run outside a request context (cache stores, optional handle lookups, etc.)
|
|
331
615
|
*/
|
|
332
|
-
export function _getRequestContext<TEnv =
|
|
616
|
+
export function _getRequestContext<TEnv = DefaultEnv>():
|
|
333
617
|
| RequestContext<TEnv>
|
|
334
618
|
| undefined {
|
|
335
619
|
return requestContextStorage.getStore() as RequestContext<TEnv> | undefined;
|
|
@@ -342,6 +626,7 @@ export function _getRequestContext<TEnv = unknown>():
|
|
|
342
626
|
export function setRequestContextParams(
|
|
343
627
|
params: Record<string, string>,
|
|
344
628
|
routeName?: string,
|
|
629
|
+
routeMap?: Record<string, string>,
|
|
345
630
|
): void {
|
|
346
631
|
const ctx = requestContextStorage.getStore();
|
|
347
632
|
if (ctx) {
|
|
@@ -354,9 +639,13 @@ export function setRequestContextParams(
|
|
|
354
639
|
: undefined
|
|
355
640
|
) as DefaultRouteName | undefined;
|
|
356
641
|
}
|
|
357
|
-
// Update reverse with scoped resolution now that route is known
|
|
642
|
+
// Update reverse with scoped resolution now that route is known. Production
|
|
643
|
+
// omits routeMap and uses the global map (routes are registered globally);
|
|
644
|
+
// the testing primitives (renderToFlightString/renderServerTree) pass a
|
|
645
|
+
// scoped routeMap so `ctx.reverse` is not order-dependent on whatever router
|
|
646
|
+
// registered last.
|
|
358
647
|
ctx.reverse = createReverseFunction(
|
|
359
|
-
getGlobalRouteMap(),
|
|
648
|
+
routeMap ?? getGlobalRouteMap(),
|
|
360
649
|
routeName,
|
|
361
650
|
params,
|
|
362
651
|
routeName ? isRouteRootScoped(routeName) : undefined,
|
|
@@ -372,11 +661,17 @@ export function setRequestContextParams(
|
|
|
372
661
|
*/
|
|
373
662
|
export function setRequestContextPrevRouteKey(
|
|
374
663
|
prevRouteKey: string | undefined,
|
|
664
|
+
currentUrl?: URL,
|
|
665
|
+
currentParams?: Record<string, string>,
|
|
375
666
|
): void {
|
|
376
667
|
const ctx = requestContextStorage.getStore();
|
|
377
|
-
if (ctx
|
|
378
|
-
|
|
379
|
-
}
|
|
668
|
+
if (!ctx) return;
|
|
669
|
+
if (prevRouteKey !== undefined) ctx._prevRouteKey = prevRouteKey;
|
|
670
|
+
// Source URL/params for the transition({ when }) gate (effectiveFromUrl /
|
|
671
|
+
// effectiveFromMatch.params from the navigation snapshot). Same write point as
|
|
672
|
+
// _prevRouteKey, which doubles as fromRouteName.
|
|
673
|
+
if (currentUrl !== undefined) ctx._gateCurrentUrl = currentUrl;
|
|
674
|
+
if (currentParams !== undefined) ctx._gateCurrentParams = currentParams;
|
|
380
675
|
}
|
|
381
676
|
|
|
382
677
|
/**
|
|
@@ -390,21 +685,7 @@ export function getLocationState(): LocationStateEntry[] | undefined {
|
|
|
390
685
|
return ctx?._locationState;
|
|
391
686
|
}
|
|
392
687
|
|
|
393
|
-
|
|
394
|
-
* Get the current request context, throwing if not available
|
|
395
|
-
* @deprecated Use getRequestContext() directly — it now throws if outside context
|
|
396
|
-
*/
|
|
397
|
-
export function requireRequestContext<TEnv = unknown>(): RequestContext<TEnv> {
|
|
398
|
-
return getRequestContext<TEnv>();
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
/**
|
|
402
|
-
* Cloudflare Workers ExecutionContext (subset we need)
|
|
403
|
-
*/
|
|
404
|
-
export interface ExecutionContext {
|
|
405
|
-
waitUntil(promise: Promise<any>): void;
|
|
406
|
-
passThroughOnException(): void;
|
|
407
|
-
}
|
|
688
|
+
export type { ExecutionContext };
|
|
408
689
|
|
|
409
690
|
/**
|
|
410
691
|
* Options for creating a request context
|
|
@@ -418,6 +699,11 @@ export interface CreateRequestContextOptions<TEnv> {
|
|
|
418
699
|
initialResponse?: Response;
|
|
419
700
|
/** Optional cache store for segment caching (used by CacheScope) */
|
|
420
701
|
cacheStore?: SegmentCacheStore;
|
|
702
|
+
/**
|
|
703
|
+
* Handler-owned registry of explicit per-scope stores for cross-store tag
|
|
704
|
+
* invalidation. Created once per handler, reused across requests.
|
|
705
|
+
*/
|
|
706
|
+
explicitTaggedStores?: Set<SegmentCacheStore>;
|
|
421
707
|
/** Optional cache profiles for "use cache" resolution (per-router) */
|
|
422
708
|
cacheProfiles?: Record<
|
|
423
709
|
string,
|
|
@@ -427,6 +713,10 @@ export interface CreateRequestContextOptions<TEnv> {
|
|
|
427
713
|
executionContext?: ExecutionContext;
|
|
428
714
|
/** Optional theme configuration (enables ctx.theme and ctx.setTheme) */
|
|
429
715
|
themeConfig?: ResolvedThemeConfig | null;
|
|
716
|
+
/** Resolved rango state cookie name, for the server seat of invalidateClientCache(). */
|
|
717
|
+
stateCookieName?: string;
|
|
718
|
+
/** Build version, used as the prefix of a server-rotated rango state value. */
|
|
719
|
+
version?: string;
|
|
430
720
|
}
|
|
431
721
|
|
|
432
722
|
/**
|
|
@@ -447,15 +737,17 @@ export function createRequestContext<TEnv>(
|
|
|
447
737
|
variables,
|
|
448
738
|
initialResponse,
|
|
449
739
|
cacheStore,
|
|
740
|
+
explicitTaggedStores,
|
|
450
741
|
cacheProfiles,
|
|
451
742
|
executionContext,
|
|
452
743
|
themeConfig,
|
|
744
|
+
stateCookieName,
|
|
745
|
+
version: stateVersion,
|
|
453
746
|
} = options;
|
|
454
747
|
const cookieHeader = request.headers.get("Cookie");
|
|
748
|
+
let rangoStateRotated = false;
|
|
455
749
|
let parsedCookies: Record<string, string> | null = null;
|
|
456
750
|
|
|
457
|
-
// Create stub response for collecting headers/cookies.
|
|
458
|
-
// All cookie/header mutations go here; cookie reads derive from it.
|
|
459
751
|
let stubResponse = initialResponse
|
|
460
752
|
? new Response(null, {
|
|
461
753
|
status: initialResponse.status,
|
|
@@ -464,11 +756,9 @@ export function createRequestContext<TEnv>(
|
|
|
464
756
|
})
|
|
465
757
|
: new Response(null, { status: 200 });
|
|
466
758
|
|
|
467
|
-
// Create handle store and loader memoization for this request
|
|
468
759
|
const handleStore = createHandleStore();
|
|
469
760
|
const loaderPromises = new Map<string, Promise<any>>();
|
|
470
761
|
|
|
471
|
-
// Lazy parse cookies from the original Cookie header
|
|
472
762
|
const getParsedCookies = (): Record<string, string> => {
|
|
473
763
|
if (!parsedCookies) {
|
|
474
764
|
parsedCookies = parseCookiesFromHeader(cookieHeader);
|
|
@@ -476,7 +766,6 @@ export function createRequestContext<TEnv>(
|
|
|
476
766
|
return parsedCookies;
|
|
477
767
|
};
|
|
478
768
|
|
|
479
|
-
// Cached response cookie mutations — invalidated on setCookie/deleteCookie/setTheme
|
|
480
769
|
let responseCookieCache: Map<string, string | null> | null = null;
|
|
481
770
|
const getResponseCookies = (): Map<string, string | null> => {
|
|
482
771
|
if (!responseCookieCache) {
|
|
@@ -488,8 +777,17 @@ export function createRequestContext<TEnv>(
|
|
|
488
777
|
responseCookieCache = null;
|
|
489
778
|
};
|
|
490
779
|
|
|
491
|
-
|
|
492
|
-
|
|
780
|
+
function assertNotInsideCacheScopeALS(methodName: string): void {
|
|
781
|
+
if (isInsideCacheScope()) {
|
|
782
|
+
throw new Error(
|
|
783
|
+
`ctx.${methodName}() cannot be called inside a cache() boundary. ` +
|
|
784
|
+
`On cache hit the handler is skipped, so this side effect would be lost. ` +
|
|
785
|
+
`Move ctx.${methodName}() to a middleware or layout outside the cache() scope.`,
|
|
786
|
+
);
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
// Response stub Set-Cookie wins, then original header (source of truth for mutations).
|
|
493
791
|
const effectiveCookie = (name: string): string | undefined => {
|
|
494
792
|
const mutations = getResponseCookies();
|
|
495
793
|
if (mutations.has(name)) {
|
|
@@ -499,14 +797,11 @@ export function createRequestContext<TEnv>(
|
|
|
499
797
|
return getParsedCookies()[name];
|
|
500
798
|
};
|
|
501
799
|
|
|
502
|
-
// Theme helpers (only used when themeConfig is provided)
|
|
503
800
|
const getTheme = (): Theme | undefined => {
|
|
504
801
|
if (!themeConfig) return undefined;
|
|
505
802
|
|
|
506
|
-
// Use overlay-aware read so setTheme() in the same request is reflected
|
|
507
803
|
const stored = effectiveCookie(themeConfig.storageKey);
|
|
508
804
|
if (stored) {
|
|
509
|
-
// Validate stored value
|
|
510
805
|
if (stored === "system" && themeConfig.enableSystem) {
|
|
511
806
|
return "system";
|
|
512
807
|
}
|
|
@@ -520,15 +815,15 @@ export function createRequestContext<TEnv>(
|
|
|
520
815
|
const setTheme = (theme: Theme): void => {
|
|
521
816
|
if (!themeConfig) return;
|
|
522
817
|
|
|
523
|
-
//
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
818
|
+
// Shared guard (isValidTheme): reject any value not in the configured theme
|
|
819
|
+
// set, AND reject "system" when system detection is off — a cookie of
|
|
820
|
+
// theme=system with enableSystem:false would re-apply a bogus class="system"
|
|
821
|
+
// on the next SSR.
|
|
822
|
+
if (!isValidTheme(theme, themeConfig)) {
|
|
823
|
+
warnInvalidTheme(theme, themeConfig);
|
|
528
824
|
return;
|
|
529
825
|
}
|
|
530
826
|
|
|
531
|
-
// Write to stub — effectiveCookie() will pick it up on next read
|
|
532
827
|
stubResponse.headers.append(
|
|
533
828
|
"Set-Cookie",
|
|
534
829
|
serializeCookieValue(themeConfig.storageKey, theme, {
|
|
@@ -540,19 +835,29 @@ export function createRequestContext<TEnv>(
|
|
|
540
835
|
invalidateResponseCookieCache();
|
|
541
836
|
};
|
|
542
837
|
|
|
543
|
-
|
|
838
|
+
const cleanUrl = stripInternalParams(url);
|
|
839
|
+
|
|
544
840
|
const ctx: RequestContext<TEnv> = {
|
|
545
841
|
env,
|
|
546
842
|
request,
|
|
547
|
-
url,
|
|
843
|
+
url: cleanUrl,
|
|
844
|
+
originalUrl: new URL(request.url),
|
|
548
845
|
pathname: url.pathname,
|
|
549
|
-
searchParams:
|
|
550
|
-
|
|
551
|
-
get: ((keyOrVar: any) =>
|
|
552
|
-
|
|
553
|
-
|
|
846
|
+
searchParams: cleanUrl.searchParams,
|
|
847
|
+
_variables: variables,
|
|
848
|
+
get: ((keyOrVar: any) => {
|
|
849
|
+
if (isNonCacheable(variables, keyOrVar) && isInsideCacheScope()) {
|
|
850
|
+
throw new Error(
|
|
851
|
+
`ctx.get() for a non-cacheable variable cannot be called inside a cache() boundary. ` +
|
|
852
|
+
`The variable was created with { cache: false } or set with { cache: false }, ` +
|
|
853
|
+
`and its value would be stale on cache hit. Move the read outside the cached scope.`,
|
|
854
|
+
);
|
|
855
|
+
}
|
|
856
|
+
return contextGet(variables, keyOrVar);
|
|
857
|
+
}) as RequestContext<TEnv>["get"],
|
|
858
|
+
set: ((keyOrVar: any, value: any, options?: any) => {
|
|
554
859
|
assertNotInsideCacheExec(ctx, "set");
|
|
555
|
-
contextSet(variables, keyOrVar, value);
|
|
860
|
+
contextSet(variables, keyOrVar, value, options);
|
|
556
861
|
}) as RequestContext<TEnv>["set"],
|
|
557
862
|
params: {} as Record<string, string>,
|
|
558
863
|
|
|
@@ -590,6 +895,7 @@ export function createRequestContext<TEnv>(
|
|
|
590
895
|
|
|
591
896
|
setCookie(name: string, value: string, options?: CookieOptions): void {
|
|
592
897
|
assertNotInsideCacheExec(ctx, "setCookie");
|
|
898
|
+
assertNotInsideCacheScopeALS("setCookie");
|
|
593
899
|
stubResponse.headers.append(
|
|
594
900
|
"Set-Cookie",
|
|
595
901
|
serializeCookieValue(name, value, options),
|
|
@@ -602,6 +908,7 @@ export function createRequestContext<TEnv>(
|
|
|
602
908
|
options?: Pick<CookieOptions, "domain" | "path">,
|
|
603
909
|
): void {
|
|
604
910
|
assertNotInsideCacheExec(ctx, "deleteCookie");
|
|
911
|
+
assertNotInsideCacheScopeALS("deleteCookie");
|
|
605
912
|
stubResponse.headers.append(
|
|
606
913
|
"Set-Cookie",
|
|
607
914
|
serializeCookieValue(name, "", { ...options, maxAge: 0 }),
|
|
@@ -611,48 +918,115 @@ export function createRequestContext<TEnv>(
|
|
|
611
918
|
|
|
612
919
|
header(name: string, value: string): void {
|
|
613
920
|
assertNotInsideCacheExec(ctx, "header");
|
|
921
|
+
assertNotInsideCacheScopeALS("header");
|
|
614
922
|
stubResponse.headers.set(name, value);
|
|
615
923
|
},
|
|
616
924
|
|
|
925
|
+
// Rotate the rango state cookie for the responding client (the server seat
|
|
926
|
+
// of invalidateClientCache). Writes ONE Set-Cookie per request with the
|
|
927
|
+
// value {version}:{timestamp}; the `:` stays raw (the cookie-name.ts
|
|
928
|
+
// serializer), not the URL-encoded form serializeCookieValue would produce.
|
|
929
|
+
// The timestamp is strictly greater than the client's current one (inbound
|
|
930
|
+
// X-Rango-State), so a same-millisecond server rotation still differs from
|
|
931
|
+
// the client value and the divergence observer fires.
|
|
932
|
+
_rotateStateCookie(): void {
|
|
933
|
+
if (rangoStateRotated) return;
|
|
934
|
+
rangoStateRotated = true;
|
|
935
|
+
if (!stateCookieName) return;
|
|
936
|
+
// The client's current value, for the monotonic guard: prefer the
|
|
937
|
+
// X-Rango-State header (router navigation/prefetch fetches send it), but
|
|
938
|
+
// fall back to the request's rango state cookie — action POSTs / plain
|
|
939
|
+
// app fetch()s carry no router header yet DO send the cookie. Without the
|
|
940
|
+
// fallback, prevTs stays 0 and a same-ms mint can equal the client value,
|
|
941
|
+
// leaving the divergence observer silent. `|| null` so an empty header
|
|
942
|
+
// ('' from proxy normalization) falls through instead of short-circuiting.
|
|
943
|
+
// getRawCookieValue reads the cookie undecoded (the wire value
|
|
944
|
+
// decodeStateValue decodes exactly once) AND is the same parser the client
|
|
945
|
+
// mirror uses, so both seats read the same jar entry.
|
|
946
|
+
const prevRaw =
|
|
947
|
+
(request.headers.get("x-rango-state") || null) ??
|
|
948
|
+
getRawCookieValue(cookieHeader, stateCookieName);
|
|
949
|
+
const value = mintStateValue(stateVersion ?? "0", prevRaw);
|
|
950
|
+
stubResponse.headers.append(
|
|
951
|
+
"Set-Cookie",
|
|
952
|
+
serializeStateCookie(stateCookieName, value, url.protocol === "https:"),
|
|
953
|
+
);
|
|
954
|
+
invalidateResponseCookieCache();
|
|
955
|
+
},
|
|
956
|
+
|
|
957
|
+
// Set the keepClientCache() directive header. The action bridge reads it on
|
|
958
|
+
// the response and suppresses its automatic invalidation. `.set` makes this
|
|
959
|
+
// idempotent (one header regardless of call count).
|
|
960
|
+
_setKeepCacheDirective(): void {
|
|
961
|
+
stubResponse.headers.set(KEEP_CACHE_HEADER, "1");
|
|
962
|
+
},
|
|
963
|
+
|
|
617
964
|
setStatus(status: number): void {
|
|
618
965
|
assertNotInsideCacheExec(ctx, "setStatus");
|
|
619
|
-
|
|
620
|
-
|
|
966
|
+
assertNotInsideCacheScopeALS("setStatus");
|
|
967
|
+
stubResponse = new Response(null, {
|
|
968
|
+
status,
|
|
969
|
+
headers: stubResponse.headers,
|
|
970
|
+
});
|
|
971
|
+
},
|
|
972
|
+
|
|
973
|
+
_setStatus(status: number): void {
|
|
621
974
|
stubResponse = new Response(null, {
|
|
622
975
|
status,
|
|
623
976
|
headers: stubResponse.headers,
|
|
624
977
|
});
|
|
625
978
|
},
|
|
626
979
|
|
|
627
|
-
// Placeholder - will be replaced below
|
|
628
980
|
use: null as any,
|
|
629
981
|
|
|
630
982
|
method: request.method,
|
|
631
983
|
|
|
632
984
|
_handleStore: handleStore,
|
|
985
|
+
_transitionWhen: [],
|
|
633
986
|
_cacheStore: cacheStore,
|
|
987
|
+
_explicitTaggedStores: explicitTaggedStores,
|
|
988
|
+
_requestTags: new Set<string>(),
|
|
634
989
|
_cacheProfiles: cacheProfiles,
|
|
635
990
|
|
|
636
991
|
waitUntil(fn: () => Promise<void>): void {
|
|
992
|
+
// Wrap in Promise.resolve().then(fn) so a SYNCHRONOUS throw in a
|
|
993
|
+
// non-async callback becomes a rejected promise handed to the host's
|
|
994
|
+
// waitUntil (logged as a background failure), instead of escaping into
|
|
995
|
+
// the request flow. Mirrors fireAndForgetWaitUntil's deferral.
|
|
996
|
+
const task = Promise.resolve().then(fn);
|
|
997
|
+
// Track the task promise so the PPR shell capture can settle the
|
|
998
|
+
// foreground's deferred cache writes before its own match/render (the
|
|
999
|
+
// ordering edge; see _pendingBackgroundTasks). The capture task itself
|
|
1000
|
+
// opts out via the marker — the drain must never await its own promise.
|
|
1001
|
+
if (
|
|
1002
|
+
!(fn as { [UNTRACKED_BACKGROUND_TASK]?: boolean })[
|
|
1003
|
+
UNTRACKED_BACKGROUND_TASK
|
|
1004
|
+
]
|
|
1005
|
+
) {
|
|
1006
|
+
ctx._pendingBackgroundTasks?.push(task);
|
|
1007
|
+
}
|
|
637
1008
|
if (executionContext?.waitUntil) {
|
|
638
|
-
|
|
639
|
-
executionContext.waitUntil(fn());
|
|
1009
|
+
executionContext.waitUntil(task);
|
|
640
1010
|
} else {
|
|
641
|
-
// Node
|
|
642
|
-
|
|
1011
|
+
// Node/dev fallback: fire-and-forget with error logging (the same
|
|
1012
|
+
// policy fireAndForgetWaitUntil applies).
|
|
1013
|
+
task.catch((err) =>
|
|
643
1014
|
console.error("[waitUntil] Background task failed:", err),
|
|
644
1015
|
);
|
|
645
1016
|
}
|
|
646
1017
|
},
|
|
647
1018
|
|
|
1019
|
+
executionContext,
|
|
1020
|
+
|
|
648
1021
|
_onResponseCallbacks: [],
|
|
1022
|
+
_pendingBackgroundTasks: [],
|
|
649
1023
|
|
|
650
1024
|
onResponse(callback: (response: Response) => Response): void {
|
|
651
1025
|
assertNotInsideCacheExec(ctx, "onResponse");
|
|
1026
|
+
assertNotInsideCacheScopeALS("onResponse");
|
|
652
1027
|
this._onResponseCallbacks.push(callback);
|
|
653
1028
|
},
|
|
654
1029
|
|
|
655
|
-
// Theme properties (only set when themeConfig is provided)
|
|
656
1030
|
get theme() {
|
|
657
1031
|
return themeConfig ? getTheme() : undefined;
|
|
658
1032
|
},
|
|
@@ -674,36 +1048,91 @@ export function createRequestContext<TEnv>(
|
|
|
674
1048
|
_locationState: undefined,
|
|
675
1049
|
|
|
676
1050
|
_reportedErrors: new WeakSet<object>(),
|
|
1051
|
+
_metricsStore: undefined,
|
|
1052
|
+
_handlerStart: undefined,
|
|
1053
|
+
|
|
1054
|
+
_renderBarrier: null as any,
|
|
1055
|
+
_resolveRenderBarrier: null as any,
|
|
1056
|
+
_renderBarrierSegmentOrder: undefined,
|
|
677
1057
|
|
|
678
1058
|
reverse: createReverseFunction(getGlobalRouteMap(), undefined, {}),
|
|
679
1059
|
};
|
|
680
1060
|
|
|
681
|
-
//
|
|
1061
|
+
// Lazy allocation: only create Promise when a loader calls rendered().
|
|
1062
|
+
let barrierResolved = false;
|
|
1063
|
+
let resolveBarrier: (() => void) | undefined;
|
|
1064
|
+
ctx._renderBarrier = null as any;
|
|
1065
|
+
ctx._resolveRenderBarrier = (
|
|
1066
|
+
segments: Array<{ type: string; id: string }>,
|
|
1067
|
+
) => {
|
|
1068
|
+
if (barrierResolved) return;
|
|
1069
|
+
barrierResolved = true;
|
|
1070
|
+
const segOrder = segments
|
|
1071
|
+
.filter((s) => s.type !== "loader")
|
|
1072
|
+
.map((s) => s.id);
|
|
1073
|
+
ctx._renderBarrierSegmentOrder = segOrder;
|
|
1074
|
+
|
|
1075
|
+
const closeGuard = () => {
|
|
1076
|
+
ctx._renderBarrierWaiters = undefined;
|
|
1077
|
+
ctx._handlerLoaderDeps = undefined;
|
|
1078
|
+
ctx._renderBarrierGuardClosed = true;
|
|
1079
|
+
};
|
|
1080
|
+
|
|
1081
|
+
if (ctx._treeHasStreaming) {
|
|
1082
|
+
handleStore.settled.then(closeGuard);
|
|
1083
|
+
} else {
|
|
1084
|
+
ctx._renderBarrierHandleSnapshot = buildHandleSnapshot(
|
|
1085
|
+
handleStore,
|
|
1086
|
+
segOrder,
|
|
1087
|
+
);
|
|
1088
|
+
closeGuard();
|
|
1089
|
+
}
|
|
1090
|
+
if (resolveBarrier) resolveBarrier();
|
|
1091
|
+
};
|
|
1092
|
+
Object.defineProperty(ctx, "_renderBarrier", {
|
|
1093
|
+
get() {
|
|
1094
|
+
const p = barrierResolved
|
|
1095
|
+
? Promise.resolve()
|
|
1096
|
+
: new Promise<void>((resolve) => {
|
|
1097
|
+
resolveBarrier = resolve;
|
|
1098
|
+
});
|
|
1099
|
+
Object.defineProperty(ctx, "_renderBarrier", {
|
|
1100
|
+
value: p,
|
|
1101
|
+
writable: false,
|
|
1102
|
+
configurable: false,
|
|
1103
|
+
});
|
|
1104
|
+
return p;
|
|
1105
|
+
},
|
|
1106
|
+
configurable: true,
|
|
1107
|
+
});
|
|
1108
|
+
|
|
682
1109
|
ctx.use = createUseFunction({
|
|
683
1110
|
handleStore,
|
|
684
1111
|
loaderPromises,
|
|
685
1112
|
getContext: () => ctx,
|
|
686
1113
|
});
|
|
687
1114
|
|
|
688
|
-
// Brand with taint symbol so "use cache" excludes ctx from cache keys
|
|
689
1115
|
(ctx as any)[NOCACHE_SYMBOL] = true;
|
|
690
1116
|
return ctx;
|
|
691
1117
|
}
|
|
692
1118
|
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
*
|
|
698
|
-
|
|
699
|
-
|
|
1119
|
+
// Capture the Max-Age value so it can be parsed numerically. A leading zero
|
|
1120
|
+
// (Max-Age=05) is a non-zero lifetime, not a deletion; only a value that parses
|
|
1121
|
+
// to <= 0 marks a cookie for deletion. Pattern-matching a leading "0" misread
|
|
1122
|
+
// zero-prefixed values like 05 / 010 as deletions.
|
|
1123
|
+
const MAX_AGE_RE = /;\s*Max-Age\s*=\s*(-?\d+)/i;
|
|
1124
|
+
|
|
1125
|
+
function isCookieDeletion(header: string): boolean {
|
|
1126
|
+
const m = MAX_AGE_RE.exec(header);
|
|
1127
|
+
if (!m) return false;
|
|
1128
|
+
return Number(m[1]) <= 0;
|
|
1129
|
+
}
|
|
700
1130
|
|
|
701
1131
|
function parseResponseCookies(response: Response): Map<string, string | null> {
|
|
702
1132
|
const result = new Map<string, string | null>();
|
|
703
1133
|
const setCookies = response.headers.getSetCookie();
|
|
704
1134
|
|
|
705
1135
|
for (const header of setCookies) {
|
|
706
|
-
// First segment before ';' is the name=value pair
|
|
707
1136
|
const semiIdx = header.indexOf(";");
|
|
708
1137
|
const pair = semiIdx === -1 ? header : header.substring(0, semiIdx);
|
|
709
1138
|
const eqIdx = pair.indexOf("=");
|
|
@@ -715,49 +1144,22 @@ function parseResponseCookies(response: Response): Map<string, string | null> {
|
|
|
715
1144
|
name = decodeURIComponent(pair.substring(0, eqIdx).trim());
|
|
716
1145
|
value = decodeURIComponent(pair.substring(eqIdx + 1).trim());
|
|
717
1146
|
} catch {
|
|
718
|
-
// Malformed encoding — skip this entry
|
|
719
1147
|
continue;
|
|
720
1148
|
}
|
|
721
1149
|
|
|
722
|
-
|
|
723
|
-
const isDeleted = MAX_AGE_ZERO_RE.test(header);
|
|
1150
|
+
const isDeleted = isCookieDeletion(header);
|
|
724
1151
|
result.set(name, isDeleted ? null : value);
|
|
725
1152
|
}
|
|
726
1153
|
|
|
727
1154
|
return result;
|
|
728
1155
|
}
|
|
729
1156
|
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
cookieHeader: string | null,
|
|
735
|
-
): Record<string, string> {
|
|
736
|
-
if (!cookieHeader) return {};
|
|
737
|
-
|
|
738
|
-
const cookies: Record<string, string> = {};
|
|
739
|
-
const pairs = cookieHeader.split(";");
|
|
740
|
-
|
|
741
|
-
for (const pair of pairs) {
|
|
742
|
-
const [name, ...rest] = pair.trim().split("=");
|
|
743
|
-
if (name) {
|
|
744
|
-
const raw = rest.join("=");
|
|
745
|
-
try {
|
|
746
|
-
cookies[name] = decodeURIComponent(raw);
|
|
747
|
-
} catch {
|
|
748
|
-
// Malformed percent-encoded value (e.g. %zz, %2) - fall back to raw value
|
|
749
|
-
cookies[name] = raw;
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
}
|
|
753
|
-
|
|
754
|
-
return cookies;
|
|
755
|
-
}
|
|
1157
|
+
// Re-exported for unit tests and the existing import path. The implementation
|
|
1158
|
+
// lives in the dependency-free ./cookie-parse leaf so consumers (e.g. the host
|
|
1159
|
+
// dispatcher) can share it without pulling this module's request-context graph.
|
|
1160
|
+
export { parseCookiesFromHeader };
|
|
756
1161
|
|
|
757
|
-
|
|
758
|
-
* Serialize a cookie for Set-Cookie header
|
|
759
|
-
*/
|
|
760
|
-
function serializeCookieValue(
|
|
1162
|
+
export function serializeCookieValue(
|
|
761
1163
|
name: string,
|
|
762
1164
|
value: string,
|
|
763
1165
|
options: CookieOptions = {},
|
|
@@ -784,20 +1186,12 @@ export interface CreateUseFunctionOptions<TEnv> {
|
|
|
784
1186
|
getContext: () => RequestContext<TEnv>;
|
|
785
1187
|
}
|
|
786
1188
|
|
|
787
|
-
/**
|
|
788
|
-
* Create the use() function for loader and handle composition.
|
|
789
|
-
*
|
|
790
|
-
* This is the unified implementation used by both RequestContext and HandlerContext.
|
|
791
|
-
* - For loaders: executes and memoizes loader functions
|
|
792
|
-
* - For handles: returns a push function to add handle data
|
|
793
|
-
*/
|
|
794
1189
|
export function createUseFunction<TEnv>(
|
|
795
1190
|
options: CreateUseFunctionOptions<TEnv>,
|
|
796
1191
|
): RequestContext["use"] {
|
|
797
1192
|
const { handleStore, loaderPromises, getContext } = options;
|
|
798
1193
|
|
|
799
1194
|
return ((item: LoaderDefinition<any, any> | Handle<any, any>) => {
|
|
800
|
-
// Handle case: return a push function
|
|
801
1195
|
if (isHandle(item)) {
|
|
802
1196
|
const handle = item;
|
|
803
1197
|
const ctx = getContext();
|
|
@@ -810,30 +1204,24 @@ export function createUseFunction<TEnv>(
|
|
|
810
1204
|
);
|
|
811
1205
|
}
|
|
812
1206
|
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
// Push directly - promises will be serialized by RSC and streamed
|
|
824
|
-
handleStore.push(handle.$$id, segmentId, valueOrPromise);
|
|
825
|
-
};
|
|
1207
|
+
return withDefer(
|
|
1208
|
+
(dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>)) => {
|
|
1209
|
+
const valueOrPromise =
|
|
1210
|
+
typeof dataOrFn === "function"
|
|
1211
|
+
? (dataOrFn as () => Promise<unknown>)()
|
|
1212
|
+
: dataOrFn;
|
|
1213
|
+
|
|
1214
|
+
handleStore.push(handle.$$id, segmentId, valueOrPromise);
|
|
1215
|
+
},
|
|
1216
|
+
);
|
|
826
1217
|
}
|
|
827
1218
|
|
|
828
|
-
// Loader case
|
|
829
1219
|
const loader = item as LoaderDefinition<any, any>;
|
|
830
1220
|
|
|
831
|
-
// Return cached promise if already started
|
|
832
1221
|
if (loaderPromises.has(loader.$$id)) {
|
|
833
1222
|
return loaderPromises.get(loader.$$id);
|
|
834
1223
|
}
|
|
835
1224
|
|
|
836
|
-
// Get loader function - either from loader object or fetchable registry
|
|
837
1225
|
let loaderFn = loader.fn;
|
|
838
1226
|
if (!loaderFn) {
|
|
839
1227
|
const fetchable = getFetchableLoader(loader.$$id);
|
|
@@ -850,24 +1238,36 @@ export function createUseFunction<TEnv>(
|
|
|
850
1238
|
|
|
851
1239
|
const ctx = getContext();
|
|
852
1240
|
|
|
853
|
-
//
|
|
1241
|
+
// Build the typed ctx.search the same way the render path
|
|
1242
|
+
// (createHandlerContext) and the fetchable-loader path (loader-fetch.ts) do:
|
|
1243
|
+
// parse the route's search schema over the cleaned searchParams. The base
|
|
1244
|
+
// RequestContext carries no `search` field, so reading `(ctx as any).search`
|
|
1245
|
+
// here always yielded {} — dropping typed search for action/dispatch loaders.
|
|
1246
|
+
const searchSchema = ctx._routeName
|
|
1247
|
+
? getSearchSchema(ctx._routeName)
|
|
1248
|
+
: undefined;
|
|
1249
|
+
const loaderSearch = searchSchema
|
|
1250
|
+
? parseSearchParams(ctx.searchParams, searchSchema)
|
|
1251
|
+
: {};
|
|
1252
|
+
|
|
854
1253
|
const loaderCtx: LoaderContext<Record<string, string | undefined>, TEnv> = {
|
|
855
1254
|
params: ctx.params,
|
|
856
1255
|
routeParams: (ctx.params ?? {}) as Record<string, string>,
|
|
857
1256
|
request: ctx.request,
|
|
858
1257
|
searchParams: ctx.searchParams,
|
|
859
|
-
search:
|
|
1258
|
+
search: loaderSearch,
|
|
860
1259
|
pathname: ctx.pathname,
|
|
861
1260
|
url: ctx.url,
|
|
1261
|
+
originalUrl: ctx.originalUrl,
|
|
862
1262
|
env: ctx.env as any,
|
|
863
|
-
|
|
1263
|
+
waitUntil: ctx.waitUntil.bind(ctx),
|
|
1264
|
+
executionContext: ctx.executionContext,
|
|
864
1265
|
get: ctx.get as any,
|
|
865
|
-
use: <TDep, TDepParams = any>(
|
|
1266
|
+
use: (<TDep, TDepParams = any>(
|
|
866
1267
|
dep: LoaderDefinition<TDep, TDepParams>,
|
|
867
1268
|
): Promise<TDep> => {
|
|
868
|
-
// Recursive call - will start dep loader if not already started
|
|
869
1269
|
return ctx.use(dep);
|
|
870
|
-
},
|
|
1270
|
+
}) as LoaderContext["use"],
|
|
871
1271
|
method: "GET",
|
|
872
1272
|
body: undefined,
|
|
873
1273
|
reverse: createReverseFunction(
|
|
@@ -876,15 +1276,22 @@ export function createUseFunction<TEnv>(
|
|
|
876
1276
|
ctx.params as Record<string, string>,
|
|
877
1277
|
ctx._routeName ? isRouteRootScoped(ctx._routeName) : undefined,
|
|
878
1278
|
),
|
|
1279
|
+
rendered: () => {
|
|
1280
|
+
throw new Error(
|
|
1281
|
+
`ctx.rendered() is only available in DSL loaders (registered via loader() in urls()). ` +
|
|
1282
|
+
`It cannot be used from request-context loaders or server actions.`,
|
|
1283
|
+
);
|
|
1284
|
+
},
|
|
879
1285
|
};
|
|
880
1286
|
|
|
881
|
-
//
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
1287
|
+
// Meter through the same unified phase API as the loader-resolution funnel
|
|
1288
|
+
// (observePhase), so a loader resolved via this base request-context ctx.use
|
|
1289
|
+
// co-emits the "loader:<id>" perf metric AND the "rango.loader" span — no
|
|
1290
|
+
// drift between the two ctx.use implementations.
|
|
1291
|
+
const promise = observePhase(PHASES.loader(loader.$$id), () =>
|
|
1292
|
+
Promise.resolve(loaderFn(loaderCtx)),
|
|
1293
|
+
);
|
|
886
1294
|
|
|
887
|
-
// Memoize for subsequent calls
|
|
888
1295
|
loaderPromises.set(loader.$$id, promise);
|
|
889
1296
|
|
|
890
1297
|
return promise;
|