@rangojs/router 0.0.0-experimental.13 → 0.0.0-experimental.130
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 +9 -0
- package/README.md +1040 -5
- 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 +1712 -212
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/{src/handles/index.ts → dist/handles/index.js} +1 -1
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +6263 -2733
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +123 -68
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +312 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +486 -0
- package/skills/caching/SKILL.md +349 -24
- package/skills/composability/SKILL.md +197 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +87 -62
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +557 -79
- package/skills/host-router/SKILL.md +278 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +175 -8
- package/skills/layout/SKILL.md +128 -5
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +604 -54
- package/skills/middleware/SKILL.md +213 -37
- package/skills/migrate-nextjs/SKILL.md +584 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +41 -10
- package/skills/observability/SKILL.md +172 -0
- package/skills/parallel/SKILL.md +276 -3
- package/skills/prerender/SKILL.md +432 -52
- package/skills/rango/SKILL.md +313 -21
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +248 -120
- package/skills/route/SKILL.md +287 -21
- package/skills/router-setup/SKILL.md +231 -33
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +129 -0
- package/skills/testing/bindings.md +89 -0
- package/skills/testing/cache-prerender.md +124 -0
- package/skills/testing/client-components.md +122 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +92 -0
- package/skills/testing/handles.md +129 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +121 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +84 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +120 -0
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +547 -107
- package/skills/use-cache/SKILL.md +355 -0
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +77 -44
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +162 -200
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +323 -563
- package/src/browser/navigation-client.ts +219 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +104 -112
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +328 -348
- package/src/browser/prefetch/cache.ts +324 -0
- package/src/browser/prefetch/fetch.ts +357 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +194 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +253 -71
- package/src/browser/react/NavigationProvider.tsx +155 -34
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +53 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +260 -60
- package/src/browser/react/location-state.ts +90 -20
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-link-status.ts +6 -9
- package/src/browser/react/use-navigation.ts +44 -68
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +124 -0
- package/src/browser/rsc-router.tsx +290 -72
- package/src/browser/scroll-restoration.ts +132 -49
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +621 -613
- package/src/browser/types.ts +175 -50
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +123 -56
- package/src/build/generate-route-types.ts +41 -1038
- package/src/build/index.ts +9 -6
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +165 -34
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +131 -0
- package/src/build/route-types/router-processing.ts +651 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +220 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +165 -0
- package/src/cache/cache-runtime.ts +444 -0
- package/src/cache/cache-scope.ts +231 -325
- package/src/cache/cache-tag.ts +98 -0
- package/src/cache/cf/cf-cache-store.ts +2644 -75
- package/src/cache/cf/index.ts +17 -17
- package/src/cache/document-cache.ts +172 -92
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +104 -0
- package/src/cache/index.ts +11 -35
- package/src/cache/memory-segment-store.ts +307 -30
- package/src/cache/profile-registry.ts +49 -0
- package/src/cache/read-through-swr.ts +164 -0
- package/src/cache/segment-codec.ts +240 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +94 -211
- package/src/client.rsc.tsx +8 -21
- package/src/client.tsx +123 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +36 -0
- package/src/defer.ts +196 -0
- package/src/deps/ssr.ts +0 -1
- package/src/errors.ts +106 -10
- package/src/handle.ts +76 -23
- package/src/handles/MetaTags.tsx +73 -34
- package/src/handles/breadcrumbs.ts +77 -0
- package/src/handles/meta.ts +30 -52
- package/src/host/cookie-handler.ts +21 -51
- package/src/host/errors.ts +8 -32
- package/src/host/index.ts +12 -9
- package/src/host/pattern-matcher.ts +34 -77
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +174 -34
- package/src/index.ts +241 -73
- package/src/internal-debug.ts +8 -4
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/network-error-thrower.tsx +4 -7
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/param-hash.ts +14 -13
- package/src/prerender/store.ts +121 -21
- package/src/prerender.ts +445 -24
- package/src/redirect-origin.ts +100 -0
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +10 -72
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +90 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +135 -0
- package/src/route-definition/resolve-handler-use.ts +161 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-definition.ts +1 -1450
- package/src/route-map-builder.ts +82 -144
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +72 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +215 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +22 -26
- package/src/router/find-match.ts +181 -0
- package/src/router/handler-context.ts +372 -125
- package/src/router/instrument.ts +308 -0
- package/src/router/intercept-resolution.ts +34 -27
- package/src/router/lazy-includes.ts +200 -0
- package/src/router/loader-resolution.ts +381 -147
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +88 -51
- package/src/router/match-api.ts +162 -245
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +90 -89
- package/src/router/match-middleware/cache-lookup.ts +297 -150
- package/src/router/match-middleware/cache-store.ts +75 -33
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +121 -50
- package/src/router/metrics.ts +219 -28
- package/src/router/middleware-types.ts +93 -0
- package/src/router/middleware.ts +421 -413
- package/src/router/navigation-snapshot.ts +131 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +263 -79
- package/src/router/prerender-match.ts +541 -0
- package/src/router/preview-match.ts +100 -0
- package/src/router/request-classification.ts +276 -0
- package/src/router/revalidation.ts +143 -44
- package/src/router/route-snapshot.ts +244 -0
- package/src/router/router-context.ts +41 -47
- package/src/router/router-interfaces.ts +525 -0
- package/src/router/router-options.ts +726 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +748 -0
- package/src/router/segment-resolution/helpers.ts +313 -0
- package/src/router/segment-resolution/loader-cache.ts +207 -0
- package/src/router/segment-resolution/revalidation.ts +1322 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/segment-resolution.ts +24 -1354
- package/src/router/segment-wrappers.ts +289 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +261 -0
- package/src/router/telemetry.ts +377 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +172 -60
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +44 -0
- package/src/router.ts +748 -2376
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +861 -1141
- package/src/rsc/helpers.ts +269 -19
- package/src/rsc/index.ts +1 -21
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +235 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +413 -0
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +374 -0
- package/src/rsc/rsc-rendering.ts +261 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +376 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/types.ts +58 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +70 -74
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +134 -0
- package/src/segment-system.tsx +292 -134
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +439 -85
- package/src/server/cookie-store.ts +265 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +112 -31
- package/src/server/loader-registry.ts +23 -82
- package/src/server/request-context.ts +724 -143
- package/src/server.ts +26 -164
- package/src/ssr/index.tsx +113 -36
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +618 -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 +232 -0
- package/src/testing/generated-routes.ts +183 -0
- package/src/testing/index.ts +99 -0
- package/src/testing/internal/context.ts +348 -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 +330 -0
- package/src/testing/render-route.tsx +566 -0
- package/src/testing/run-loader.ts +378 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +21 -67
- package/src/theme/ThemeScript.tsx +5 -11
- package/src/theme/constants.ts +5 -14
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +21 -32
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +839 -0
- package/src/types/index.ts +79 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +107 -0
- package/src/types/route-config.ts +126 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +171 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +160 -0
- package/src/urls/index.ts +43 -0
- package/src/urls/path-helper-types.ts +386 -0
- package/src/urls/path-helper.ts +275 -0
- package/src/urls/pattern-types.ts +124 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +291 -0
- package/src/urls/urls-function.ts +81 -0
- package/src/urls.ts +1 -1323
- package/src/use-loader.tsx +406 -141
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/discover-routers.ts +389 -0
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +467 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/state.ts +161 -0
- package/src/vite/discovery/virtual-module-codegen.ts +183 -0
- package/src/vite/index.ts +17 -2259
- package/src/vite/plugin-types.ts +221 -0
- package/src/vite/plugins/cjs-to-esm.ts +83 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +13 -87
- package/src/vite/plugins/expose-ids/export-analysis.ts +338 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +141 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +57 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +124 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +806 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/version-injector.ts +79 -0
- package/src/vite/plugins/version-plugin.ts +275 -0
- package/src/vite/plugins/virtual-entries.ts +108 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +444 -0
- package/src/vite/router-discovery.ts +1581 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +193 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +223 -0
- package/src/vite/utils/shared-utils.ts +219 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -11,16 +11,55 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
14
|
+
import type { CacheErrorCategory } from "../cache/cache-error.js";
|
|
14
15
|
import type { CookieOptions } from "../router/middleware.js";
|
|
16
|
+
import {
|
|
17
|
+
KEEP_CACHE_HEADER,
|
|
18
|
+
getRawCookieValue,
|
|
19
|
+
mintStateValue,
|
|
20
|
+
serializeStateCookie,
|
|
21
|
+
} from "../browser/cookie-name.js";
|
|
15
22
|
import type { LoaderDefinition, LoaderContext } from "../types.js";
|
|
23
|
+
import type { ScopedReverseFunction } from "../reverse.js";
|
|
24
|
+
import type {
|
|
25
|
+
DefaultEnv,
|
|
26
|
+
DefaultReverseRouteMap,
|
|
27
|
+
DefaultRouteName,
|
|
28
|
+
} from "../types/global-namespace.js";
|
|
16
29
|
import type { Handle } from "../handle.js";
|
|
17
|
-
import {
|
|
30
|
+
import {
|
|
31
|
+
type ContextVar,
|
|
32
|
+
contextGet,
|
|
33
|
+
contextSet,
|
|
34
|
+
isNonCacheable,
|
|
35
|
+
} from "../context-var.js";
|
|
36
|
+
import {
|
|
37
|
+
createHandleStore,
|
|
38
|
+
buildHandleSnapshot,
|
|
39
|
+
type HandleStore,
|
|
40
|
+
type HandleData,
|
|
41
|
+
} from "./handle-store.js";
|
|
18
42
|
import { isHandle } from "../handle.js";
|
|
19
|
-
import {
|
|
43
|
+
import { withDefer } from "../defer.js";
|
|
44
|
+
import { type MetricsStore } from "./context.js";
|
|
45
|
+
import { observePhase, PHASES } from "../router/instrument.js";
|
|
20
46
|
import { getFetchableLoader } from "./fetchable-loader-store.js";
|
|
21
47
|
import type { SegmentCacheStore } from "../cache/types.js";
|
|
22
48
|
import type { Theme, ResolvedThemeConfig } from "../theme/types.js";
|
|
49
|
+
import type { ExecutionContext, RequestScope } from "../types/request-scope.js";
|
|
50
|
+
import type { ResolvedTracing } from "../router/tracing.js";
|
|
51
|
+
import { fireAndForgetWaitUntil } from "../types/request-scope.js";
|
|
23
52
|
import { THEME_COOKIE } from "../theme/constants.js";
|
|
53
|
+
import type { LocationStateEntry } from "../browser/react/location-state-shared.js";
|
|
54
|
+
import { NOCACHE_SYMBOL, assertNotInsideCacheExec } from "../cache/taint.js";
|
|
55
|
+
import { isInsideCacheScope } from "./context.js";
|
|
56
|
+
import {
|
|
57
|
+
createReverseFunction,
|
|
58
|
+
stripInternalParams,
|
|
59
|
+
} from "../router/handler-context.js";
|
|
60
|
+
import { getGlobalRouteMap, isRouteRootScoped } from "../route-map-builder.js";
|
|
61
|
+
import { invariant } from "../errors.js";
|
|
62
|
+
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
24
63
|
|
|
25
64
|
/**
|
|
26
65
|
* Unified request context available via getRequestContext()
|
|
@@ -29,46 +68,54 @@ import { THEME_COOKIE } from "../theme/constants.js";
|
|
|
29
68
|
* Use this when you need access to request data outside of route handlers.
|
|
30
69
|
*/
|
|
31
70
|
export interface RequestContext<
|
|
32
|
-
TEnv =
|
|
71
|
+
TEnv = DefaultEnv,
|
|
33
72
|
TParams = Record<string, string>,
|
|
34
|
-
> {
|
|
35
|
-
/**
|
|
36
|
-
|
|
37
|
-
/** Original HTTP request */
|
|
38
|
-
request: Request;
|
|
39
|
-
/** Parsed URL (system params like _rsc* are NOT filtered here) */
|
|
40
|
-
url: URL;
|
|
41
|
-
/** URL pathname */
|
|
42
|
-
pathname: string;
|
|
43
|
-
/** URL search params (system params like _rsc* are NOT filtered here) */
|
|
44
|
-
searchParams: URLSearchParams;
|
|
45
|
-
/** Variables set by middleware (same as ctx.var) */
|
|
46
|
-
var: Record<string, any>;
|
|
73
|
+
> extends RequestScope<TEnv> {
|
|
74
|
+
/** @internal Shared variable backing store for ctx.get()/ctx.set(). */
|
|
75
|
+
_variables: Record<string, any>;
|
|
47
76
|
/** Get a variable set by middleware */
|
|
48
|
-
get:
|
|
77
|
+
get: {
|
|
78
|
+
<T>(contextVar: ContextVar<T>): T | undefined;
|
|
79
|
+
<K extends string>(key: K): any;
|
|
80
|
+
};
|
|
49
81
|
/** Set a variable (shared with middleware and handlers) */
|
|
50
|
-
set:
|
|
82
|
+
set: {
|
|
83
|
+
<T>(
|
|
84
|
+
contextVar: ContextVar<T>,
|
|
85
|
+
value: T,
|
|
86
|
+
options?: { cache?: boolean },
|
|
87
|
+
): void;
|
|
88
|
+
<K extends string>(key: K, value: any, options?: { cache?: boolean }): void;
|
|
89
|
+
};
|
|
51
90
|
/**
|
|
52
91
|
* Route params (populated after route matching)
|
|
53
92
|
* Initially empty, then set to matched params
|
|
54
93
|
*/
|
|
55
94
|
params: TParams;
|
|
56
|
-
/**
|
|
57
|
-
|
|
58
|
-
* Headers set here are merged into the final response
|
|
59
|
-
*/
|
|
60
|
-
res: Response;
|
|
95
|
+
/** @internal Stub response for collecting headers/cookies. Use ctx.headers or ctx.header() instead. */
|
|
96
|
+
readonly res: Response;
|
|
61
97
|
|
|
62
|
-
/** Get a cookie value
|
|
98
|
+
/** @internal Get a cookie value (effective: request + response mutations). Use cookies().get() instead. */
|
|
63
99
|
cookie(name: string): string | undefined;
|
|
64
|
-
/** Get all cookies
|
|
100
|
+
/** @internal Get all cookies (effective merged view). Use cookies().getAll() instead. */
|
|
65
101
|
cookies(): Record<string, string>;
|
|
66
|
-
/** Set a cookie on the response */
|
|
102
|
+
/** @internal Set a cookie on the response. Use cookies().set() instead. */
|
|
67
103
|
setCookie(name: string, value: string, options?: CookieOptions): void;
|
|
68
|
-
/** Delete a cookie */
|
|
69
|
-
deleteCookie(
|
|
104
|
+
/** @internal Delete a cookie. Use cookies().delete() instead. */
|
|
105
|
+
deleteCookie(
|
|
106
|
+
name: string,
|
|
107
|
+
options?: Pick<CookieOptions, "domain" | "path">,
|
|
108
|
+
): void;
|
|
70
109
|
/** Set a response header */
|
|
71
110
|
header(name: string, value: string): void;
|
|
111
|
+
/** Set the response status code */
|
|
112
|
+
setStatus(status: number): void;
|
|
113
|
+
/** @internal Set status bypassing cache-exec guard (for framework error handling) */
|
|
114
|
+
_setStatus(status: number): void;
|
|
115
|
+
/** @internal Rotate the rango state cookie (server seat of invalidateClientCache). */
|
|
116
|
+
_rotateStateCookie(): void;
|
|
117
|
+
/** @internal Set the keepClientCache() directive header on the response. */
|
|
118
|
+
_setKeepCacheDirective(): void;
|
|
72
119
|
|
|
73
120
|
/**
|
|
74
121
|
* Access loader data or push handle data.
|
|
@@ -90,10 +137,12 @@ export interface RequestContext<
|
|
|
90
137
|
* ```
|
|
91
138
|
*/
|
|
92
139
|
use: {
|
|
93
|
-
<T, TLoaderParams = any>(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
140
|
+
<T, TLoaderParams = any>(
|
|
141
|
+
loader: LoaderDefinition<T, TLoaderParams>,
|
|
142
|
+
): Promise<T>;
|
|
143
|
+
<TData, TAccumulated = TData[]>(
|
|
144
|
+
handle: Handle<TData, TAccumulated>,
|
|
145
|
+
): (data: TData | Promise<TData> | (() => Promise<TData>)) => void;
|
|
97
146
|
};
|
|
98
147
|
|
|
99
148
|
/** HTTP method (GET, POST, PUT, PATCH, DELETE, etc.) */
|
|
@@ -106,18 +155,29 @@ export interface RequestContext<
|
|
|
106
155
|
_cacheStore?: SegmentCacheStore;
|
|
107
156
|
|
|
108
157
|
/**
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
158
|
+
* @internal Handler-owned registry of explicit per-scope stores from
|
|
159
|
+
* cache({ store }). Created once per createRSCHandler() and threaded into
|
|
160
|
+
* every request context, so it accumulates every explicit store the handler
|
|
161
|
+
* resolves. updateTag()/revalidateTag() iterate this set plus _cacheStore to
|
|
162
|
+
* reach every store that may hold tagged entries. The app-level store is not
|
|
163
|
+
* added here (it is always reachable via _cacheStore).
|
|
164
|
+
*/
|
|
165
|
+
_explicitTaggedStores?: Set<SegmentCacheStore>;
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* @internal Union of every cache tag resolved while producing this request's
|
|
169
|
+
* response (from cache({ tags }), runtime cacheTag(), and loader cache tags).
|
|
170
|
+
* Populated at the tag-resolution sites via recordRequestTags(). Read by the
|
|
171
|
+
* document cache middleware so a full-page entry is tagged with everything its
|
|
172
|
+
* content used and can therefore be invalidated by updateTag()/revalidateTag().
|
|
119
173
|
*/
|
|
120
|
-
|
|
174
|
+
_requestTags: Set<string>;
|
|
175
|
+
|
|
176
|
+
/** @internal Cache profiles for "use cache" profile resolution (per-router) */
|
|
177
|
+
_cacheProfiles?: Record<
|
|
178
|
+
string,
|
|
179
|
+
import("../cache/profile-registry.js").CacheProfile
|
|
180
|
+
>;
|
|
121
181
|
|
|
122
182
|
/**
|
|
123
183
|
* Register a callback to run when the response is created.
|
|
@@ -178,8 +238,202 @@ export interface RequestContext<
|
|
|
178
238
|
|
|
179
239
|
/** @internal Theme configuration (null if theme not enabled) */
|
|
180
240
|
_themeConfig?: ResolvedThemeConfig | null;
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Attach location state entries to the current response.
|
|
244
|
+
*
|
|
245
|
+
* For partial (SPA) requests, the state is included in the RSC payload
|
|
246
|
+
* metadata and merged into history.pushState on the client. For redirect
|
|
247
|
+
* responses, the state travels through the redirect payload so the target
|
|
248
|
+
* page can read it via useLocationState.
|
|
249
|
+
*
|
|
250
|
+
* Multiple calls accumulate entries.
|
|
251
|
+
*
|
|
252
|
+
* @example
|
|
253
|
+
* ```typescript
|
|
254
|
+
* ctx.setLocationState(Flash({ text: "Item saved!" }));
|
|
255
|
+
* ```
|
|
256
|
+
*/
|
|
257
|
+
setLocationState(entries: LocationStateEntry | LocationStateEntry[]): void;
|
|
258
|
+
|
|
259
|
+
/** @internal Accumulated location state entries */
|
|
260
|
+
_locationState?: LocationStateEntry[];
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* The matched route name, if the route has an explicit name.
|
|
264
|
+
* Undefined before route matching or for unnamed routes.
|
|
265
|
+
* Includes the namespace prefix from include() (e.g., "blog.post").
|
|
266
|
+
*/
|
|
267
|
+
routeName?: DefaultRouteName;
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Generate URLs from route names.
|
|
271
|
+
* Uses the global route map. After route matching, scoped (`.name`) resolution
|
|
272
|
+
* works within the matched include() scope.
|
|
273
|
+
*/
|
|
274
|
+
reverse: ScopedReverseFunction<
|
|
275
|
+
Record<string, string>,
|
|
276
|
+
DefaultReverseRouteMap
|
|
277
|
+
>;
|
|
278
|
+
|
|
279
|
+
/** @internal Route name from route matching, used for scoped reverse resolution */
|
|
280
|
+
_routeName?: string;
|
|
281
|
+
|
|
282
|
+
/** @internal Previous route key (from the navigation source), used for revalidation */
|
|
283
|
+
_prevRouteKey?: string;
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* @internal Render barrier for experimental `rendered()` API.
|
|
287
|
+
* Resolves when all non-loader segments have settled and handle data
|
|
288
|
+
* is available. Used by DSL loaders that call `ctx.rendered()`.
|
|
289
|
+
*/
|
|
290
|
+
_renderBarrier: Promise<void>;
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* @internal Resolve the render barrier. Accepts resolved segments, filters
|
|
294
|
+
* out loaders, and captures non-loader segment IDs as the handle ordering.
|
|
295
|
+
* Called after segment resolution (fresh) or handle replay (cache/prerender).
|
|
296
|
+
*/
|
|
297
|
+
_resolveRenderBarrier: (
|
|
298
|
+
segments: Array<{ type: string; id: string }>,
|
|
299
|
+
) => void;
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* @internal Segment order at barrier resolution time, used by loader
|
|
303
|
+
* ctx.use(handle) to collect handle data in correct order.
|
|
304
|
+
*/
|
|
305
|
+
_renderBarrierSegmentOrder?: string[];
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* @internal Set to true when the matched entry tree contains any `loading()`
|
|
309
|
+
* entries (streaming). On a streaming tree rendered() waits for the streaming
|
|
310
|
+
* handlers to settle (via handleStore.settled) before resolving, and the
|
|
311
|
+
* deadlock guard state is kept live until that wait completes.
|
|
312
|
+
*/
|
|
313
|
+
_treeHasStreaming?: boolean;
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* @internal Loader IDs that have called rendered() and are waiting for the
|
|
317
|
+
* barrier. Used to detect deadlocks when a handler tries to await the same
|
|
318
|
+
* loader via ctx.use(Loader).
|
|
319
|
+
*/
|
|
320
|
+
_renderBarrierWaiters?: Set<string>;
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* @internal Loader IDs that handlers have started awaiting via ctx.use().
|
|
324
|
+
* Used for bidirectional deadlock detection: if a loader later calls
|
|
325
|
+
* rendered() and a handler already awaits it, we can detect the deadlock.
|
|
326
|
+
*/
|
|
327
|
+
_handlerLoaderDeps?: Set<string>;
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* @internal Cached HandleData snapshot built at barrier resolution time.
|
|
331
|
+
* Avoids rebuilding the snapshot on every loader ctx.use(handle) call.
|
|
332
|
+
*/
|
|
333
|
+
_renderBarrierHandleSnapshot?: HandleData;
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* @internal The deadlock guard window is closed (no further handler-awaits-
|
|
337
|
+
* loader cycle is possible). For non-streaming trees this is set when the
|
|
338
|
+
* barrier resolves. For streaming trees the window stays open until
|
|
339
|
+
* handleStore.settled — rendered() keeps waiting past the barrier and a
|
|
340
|
+
* loading() handler can still resume and await a still-waiting loader — so it
|
|
341
|
+
* is set only after settled. The guard (loader-resolution `setupLoaderAccess`)
|
|
342
|
+
* reads this instead of `_renderBarrierSegmentOrder` so it does not go blind
|
|
343
|
+
* during the streaming settle wait.
|
|
344
|
+
*/
|
|
345
|
+
_renderBarrierGuardClosed?: boolean;
|
|
346
|
+
|
|
347
|
+
/** @internal Per-request error dedup set for onError reporting */
|
|
348
|
+
_reportedErrors: WeakSet<object>;
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* @internal Report a non-fatal background error through the router's
|
|
352
|
+
* onError callback. Wired by the RSC handler / router during request
|
|
353
|
+
* creation. Cache-runtime and other subsystems call this to surface
|
|
354
|
+
* errors without failing the response. `category` is surfaced to consumers as
|
|
355
|
+
* `metadata.category` on the onError context (phase `cache`).
|
|
356
|
+
*/
|
|
357
|
+
_reportBackgroundError?: (
|
|
358
|
+
error: unknown,
|
|
359
|
+
category: CacheErrorCategory,
|
|
360
|
+
) => void;
|
|
361
|
+
|
|
362
|
+
/** @internal Per-request debug performance override (set via ctx.debugPerformance()) */
|
|
363
|
+
_debugPerformance?: boolean;
|
|
364
|
+
|
|
365
|
+
/** @internal Request-scoped performance metrics store */
|
|
366
|
+
_metricsStore?: MetricsStore;
|
|
367
|
+
|
|
368
|
+
/** @internal Resolved platform phase-span tracing for this request (Cloudflare or OTel) */
|
|
369
|
+
_tracing?: ResolvedTracing;
|
|
370
|
+
|
|
371
|
+
/** @internal Router basename for this request (used by redirect()) */
|
|
372
|
+
_basename?: string;
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* @internal RouteSnapshot from classifyRequest, reused by match/matchPartial
|
|
376
|
+
* to avoid a second resolveRoute call. Cleared on HMR invalidation.
|
|
377
|
+
*/
|
|
378
|
+
_classifiedRoute?: import("../router/route-snapshot.js").RouteSnapshot;
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* @internal Coarse route-level cache signal for the X-Rango-Cache debug
|
|
382
|
+
* header. Populated by match/matchPartial only when the debug cache signal
|
|
383
|
+
* gate is enabled (debugCacheSignal option or RANGO_TEST_SIGNALS=1). Read by
|
|
384
|
+
* the response-finalization path (createResponseWithMergedHeaders). Undefined
|
|
385
|
+
* when the gate is off, so no header is emitted.
|
|
386
|
+
*/
|
|
387
|
+
_cacheSignal?: import("../router/telemetry.js").CacheSegmentSignal[];
|
|
181
388
|
}
|
|
182
389
|
|
|
390
|
+
/**
|
|
391
|
+
* Public view of RequestContext, without internal methods and fields.
|
|
392
|
+
*
|
|
393
|
+
* This is the type exported to library consumers. Internal code should
|
|
394
|
+
* use the full RequestContext interface directly.
|
|
395
|
+
*/
|
|
396
|
+
export type PublicRequestContext<
|
|
397
|
+
TEnv = DefaultEnv,
|
|
398
|
+
TParams = Record<string, string>,
|
|
399
|
+
> = Omit<
|
|
400
|
+
RequestContext<TEnv, TParams>,
|
|
401
|
+
| "cookie"
|
|
402
|
+
| "cookies"
|
|
403
|
+
| "setCookie"
|
|
404
|
+
| "deleteCookie"
|
|
405
|
+
| "_handleStore"
|
|
406
|
+
| "_cacheStore"
|
|
407
|
+
| "_explicitTaggedStores"
|
|
408
|
+
| "_requestTags"
|
|
409
|
+
| "_cacheProfiles"
|
|
410
|
+
| "_onResponseCallbacks"
|
|
411
|
+
| "_themeConfig"
|
|
412
|
+
| "_locationState"
|
|
413
|
+
| "_routeName"
|
|
414
|
+
| "_prevRouteKey"
|
|
415
|
+
| "_reportedErrors"
|
|
416
|
+
| "_renderBarrier"
|
|
417
|
+
| "_resolveRenderBarrier"
|
|
418
|
+
| "_renderBarrierSegmentOrder"
|
|
419
|
+
| "_treeHasStreaming"
|
|
420
|
+
| "_renderBarrierWaiters"
|
|
421
|
+
| "_handlerLoaderDeps"
|
|
422
|
+
| "_renderBarrierHandleSnapshot"
|
|
423
|
+
| "_renderBarrierGuardClosed"
|
|
424
|
+
| "_reportBackgroundError"
|
|
425
|
+
| "_debugPerformance"
|
|
426
|
+
| "_metricsStore"
|
|
427
|
+
| "_basename"
|
|
428
|
+
| "_setStatus"
|
|
429
|
+
| "_rotateStateCookie"
|
|
430
|
+
| "_setKeepCacheDirective"
|
|
431
|
+
| "_variables"
|
|
432
|
+
| "_classifiedRoute"
|
|
433
|
+
| "_cacheSignal"
|
|
434
|
+
| "res"
|
|
435
|
+
>;
|
|
436
|
+
|
|
183
437
|
// AsyncLocalStorage instance for request context
|
|
184
438
|
const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
|
|
185
439
|
|
|
@@ -189,16 +443,33 @@ const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
|
|
|
189
443
|
*/
|
|
190
444
|
export function runWithRequestContext<TEnv, T>(
|
|
191
445
|
context: RequestContext<TEnv>,
|
|
192
|
-
fn: () => T
|
|
446
|
+
fn: () => T,
|
|
193
447
|
): T {
|
|
194
448
|
return requestContextStorage.run(context, fn);
|
|
195
449
|
}
|
|
196
450
|
|
|
197
451
|
/**
|
|
198
452
|
* Get the current request context
|
|
199
|
-
*
|
|
453
|
+
* Throws if called outside of a request context
|
|
200
454
|
*/
|
|
201
|
-
export function getRequestContext<TEnv =
|
|
455
|
+
export function getRequestContext<TEnv = DefaultEnv>(): RequestContext<TEnv> {
|
|
456
|
+
const ctx = requestContextStorage.getStore() as
|
|
457
|
+
| RequestContext<TEnv>
|
|
458
|
+
| undefined;
|
|
459
|
+
invariant(
|
|
460
|
+
ctx,
|
|
461
|
+
"getRequestContext() called outside of a request context. " +
|
|
462
|
+
"This function must be called from within a route handler, loader, middleware, " +
|
|
463
|
+
"server action, or server component.",
|
|
464
|
+
);
|
|
465
|
+
return ctx;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* @internal Get the request context without throwing — for internal code that
|
|
470
|
+
* may run outside a request context (cache stores, optional handle lookups, etc.)
|
|
471
|
+
*/
|
|
472
|
+
export function _getRequestContext<TEnv = DefaultEnv>():
|
|
202
473
|
| RequestContext<TEnv>
|
|
203
474
|
| undefined {
|
|
204
475
|
return requestContextStorage.getStore() as RequestContext<TEnv> | undefined;
|
|
@@ -206,38 +477,76 @@ export function getRequestContext<TEnv = unknown>():
|
|
|
206
477
|
|
|
207
478
|
/**
|
|
208
479
|
* Update params on the current request context
|
|
209
|
-
* Called after route matching to populate route params
|
|
480
|
+
* Called after route matching to populate route params and route name
|
|
210
481
|
*/
|
|
211
|
-
export function setRequestContextParams(
|
|
482
|
+
export function setRequestContextParams(
|
|
483
|
+
params: Record<string, string>,
|
|
484
|
+
routeName?: string,
|
|
485
|
+
routeMap?: Record<string, string>,
|
|
486
|
+
): void {
|
|
212
487
|
const ctx = requestContextStorage.getStore();
|
|
213
488
|
if (ctx) {
|
|
214
489
|
ctx.params = params;
|
|
490
|
+
if (routeName !== undefined) {
|
|
491
|
+
ctx._routeName = routeName;
|
|
492
|
+
ctx.routeName = (
|
|
493
|
+
routeName && !isAutoGeneratedRouteName(routeName)
|
|
494
|
+
? routeName
|
|
495
|
+
: undefined
|
|
496
|
+
) as DefaultRouteName | undefined;
|
|
497
|
+
}
|
|
498
|
+
// Update reverse with scoped resolution now that route is known. Production
|
|
499
|
+
// omits routeMap and uses the global map (routes are registered globally);
|
|
500
|
+
// the testing primitives (renderToFlightString/renderServerTree) pass a
|
|
501
|
+
// scoped routeMap so `ctx.reverse` is not order-dependent on whatever router
|
|
502
|
+
// registered last.
|
|
503
|
+
ctx.reverse = createReverseFunction(
|
|
504
|
+
routeMap ?? getGlobalRouteMap(),
|
|
505
|
+
routeName,
|
|
506
|
+
params,
|
|
507
|
+
routeName ? isRouteRootScoped(routeName) : undefined,
|
|
508
|
+
);
|
|
215
509
|
}
|
|
216
510
|
}
|
|
217
511
|
|
|
218
512
|
/**
|
|
219
|
-
*
|
|
220
|
-
*
|
|
513
|
+
* Store the previous route key on the request context.
|
|
514
|
+
* Called during partial-match context creation to make the navigation source
|
|
515
|
+
* route key available for revalidation and intercept evaluation.
|
|
516
|
+
* @internal
|
|
221
517
|
*/
|
|
222
|
-
export function
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
);
|
|
518
|
+
export function setRequestContextPrevRouteKey(
|
|
519
|
+
prevRouteKey: string | undefined,
|
|
520
|
+
): void {
|
|
521
|
+
const ctx = requestContextStorage.getStore();
|
|
522
|
+
if (ctx && prevRouteKey !== undefined) {
|
|
523
|
+
ctx._prevRouteKey = prevRouteKey;
|
|
229
524
|
}
|
|
230
|
-
return ctx;
|
|
231
525
|
}
|
|
232
526
|
|
|
233
527
|
/**
|
|
234
|
-
*
|
|
528
|
+
* Get accumulated location state entries from the current request context.
|
|
529
|
+
* Returns undefined if no state has been set.
|
|
530
|
+
*
|
|
531
|
+
* @internal Used by the RSC handler to include state in payload metadata.
|
|
235
532
|
*/
|
|
236
|
-
export
|
|
237
|
-
|
|
238
|
-
|
|
533
|
+
export function getLocationState(): LocationStateEntry[] | undefined {
|
|
534
|
+
const ctx = getRequestContext();
|
|
535
|
+
return ctx?._locationState;
|
|
239
536
|
}
|
|
240
537
|
|
|
538
|
+
/**
|
|
539
|
+
* Get the current request context, throwing if not available
|
|
540
|
+
* @deprecated Use getRequestContext() directly — it now throws if outside context
|
|
541
|
+
*/
|
|
542
|
+
export function requireRequestContext<
|
|
543
|
+
TEnv = DefaultEnv,
|
|
544
|
+
>(): RequestContext<TEnv> {
|
|
545
|
+
return getRequestContext<TEnv>();
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
export type { ExecutionContext };
|
|
549
|
+
|
|
241
550
|
/**
|
|
242
551
|
* Options for creating a request context
|
|
243
552
|
*/
|
|
@@ -246,12 +555,28 @@ export interface CreateRequestContextOptions<TEnv> {
|
|
|
246
555
|
request: Request;
|
|
247
556
|
url: URL;
|
|
248
557
|
variables: Record<string, any>;
|
|
558
|
+
/** Optional initial response stub headers/status to seed effective cookie reads */
|
|
559
|
+
initialResponse?: Response;
|
|
249
560
|
/** Optional cache store for segment caching (used by CacheScope) */
|
|
250
561
|
cacheStore?: SegmentCacheStore;
|
|
562
|
+
/**
|
|
563
|
+
* Handler-owned registry of explicit per-scope stores for cross-store tag
|
|
564
|
+
* invalidation. Created once per handler, reused across requests.
|
|
565
|
+
*/
|
|
566
|
+
explicitTaggedStores?: Set<SegmentCacheStore>;
|
|
567
|
+
/** Optional cache profiles for "use cache" resolution (per-router) */
|
|
568
|
+
cacheProfiles?: Record<
|
|
569
|
+
string,
|
|
570
|
+
import("../cache/profile-registry.js").CacheProfile
|
|
571
|
+
>;
|
|
251
572
|
/** Optional Cloudflare execution context for waitUntil support */
|
|
252
573
|
executionContext?: ExecutionContext;
|
|
253
574
|
/** Optional theme configuration (enables ctx.theme and ctx.setTheme) */
|
|
254
575
|
themeConfig?: ResolvedThemeConfig | null;
|
|
576
|
+
/** Resolved rango state cookie name, for the server seat of invalidateClientCache(). */
|
|
577
|
+
stateCookieName?: string;
|
|
578
|
+
/** Build version, used as the prefix of a server-rotated rango state value. */
|
|
579
|
+
version?: string;
|
|
255
580
|
}
|
|
256
581
|
|
|
257
582
|
/**
|
|
@@ -263,20 +588,37 @@ export interface CreateRequestContextOptions<TEnv> {
|
|
|
263
588
|
* - Passed to handlers as ctx
|
|
264
589
|
*/
|
|
265
590
|
export function createRequestContext<TEnv>(
|
|
266
|
-
options: CreateRequestContextOptions<TEnv
|
|
591
|
+
options: CreateRequestContextOptions<TEnv>,
|
|
267
592
|
): RequestContext<TEnv> {
|
|
268
|
-
const {
|
|
593
|
+
const {
|
|
594
|
+
env,
|
|
595
|
+
request,
|
|
596
|
+
url,
|
|
597
|
+
variables,
|
|
598
|
+
initialResponse,
|
|
599
|
+
cacheStore,
|
|
600
|
+
explicitTaggedStores,
|
|
601
|
+
cacheProfiles,
|
|
602
|
+
executionContext,
|
|
603
|
+
themeConfig,
|
|
604
|
+
stateCookieName,
|
|
605
|
+
version: stateVersion,
|
|
606
|
+
} = options;
|
|
269
607
|
const cookieHeader = request.headers.get("Cookie");
|
|
608
|
+
let rangoStateRotated = false;
|
|
270
609
|
let parsedCookies: Record<string, string> | null = null;
|
|
271
610
|
|
|
272
|
-
|
|
273
|
-
|
|
611
|
+
let stubResponse = initialResponse
|
|
612
|
+
? new Response(null, {
|
|
613
|
+
status: initialResponse.status,
|
|
614
|
+
statusText: initialResponse.statusText,
|
|
615
|
+
headers: new Headers(initialResponse.headers),
|
|
616
|
+
})
|
|
617
|
+
: new Response(null, { status: 200 });
|
|
274
618
|
|
|
275
|
-
// Create handle store and loader memoization for this request
|
|
276
619
|
const handleStore = createHandleStore();
|
|
277
620
|
const loaderPromises = new Map<string, Promise<any>>();
|
|
278
621
|
|
|
279
|
-
// Lazy parse cookies
|
|
280
622
|
const getParsedCookies = (): Record<string, string> => {
|
|
281
623
|
if (!parsedCookies) {
|
|
282
624
|
parsedCookies = parseCookiesFromHeader(cookieHeader);
|
|
@@ -284,13 +626,42 @@ export function createRequestContext<TEnv>(
|
|
|
284
626
|
return parsedCookies;
|
|
285
627
|
};
|
|
286
628
|
|
|
287
|
-
|
|
629
|
+
let responseCookieCache: Map<string, string | null> | null = null;
|
|
630
|
+
const getResponseCookies = (): Map<string, string | null> => {
|
|
631
|
+
if (!responseCookieCache) {
|
|
632
|
+
responseCookieCache = parseResponseCookies(stubResponse);
|
|
633
|
+
}
|
|
634
|
+
return responseCookieCache;
|
|
635
|
+
};
|
|
636
|
+
const invalidateResponseCookieCache = () => {
|
|
637
|
+
responseCookieCache = null;
|
|
638
|
+
};
|
|
639
|
+
|
|
640
|
+
function assertNotInsideCacheScopeALS(methodName: string): void {
|
|
641
|
+
if (isInsideCacheScope()) {
|
|
642
|
+
throw new Error(
|
|
643
|
+
`ctx.${methodName}() cannot be called inside a cache() boundary. ` +
|
|
644
|
+
`On cache hit the handler is skipped, so this side effect would be lost. ` +
|
|
645
|
+
`Move ctx.${methodName}() to a middleware or layout outside the cache() scope.`,
|
|
646
|
+
);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
// Response stub Set-Cookie wins, then original header (source of truth for mutations).
|
|
651
|
+
const effectiveCookie = (name: string): string | undefined => {
|
|
652
|
+
const mutations = getResponseCookies();
|
|
653
|
+
if (mutations.has(name)) {
|
|
654
|
+
const v = mutations.get(name);
|
|
655
|
+
return v === null ? undefined : v;
|
|
656
|
+
}
|
|
657
|
+
return getParsedCookies()[name];
|
|
658
|
+
};
|
|
659
|
+
|
|
288
660
|
const getTheme = (): Theme | undefined => {
|
|
289
661
|
if (!themeConfig) return undefined;
|
|
290
662
|
|
|
291
|
-
const stored =
|
|
663
|
+
const stored = effectiveCookie(themeConfig.storageKey);
|
|
292
664
|
if (stored) {
|
|
293
|
-
// Validate stored value
|
|
294
665
|
if (stored === "system" && themeConfig.enableSystem) {
|
|
295
666
|
return "system";
|
|
296
667
|
}
|
|
@@ -304,112 +675,315 @@ export function createRequestContext<TEnv>(
|
|
|
304
675
|
const setTheme = (theme: Theme): void => {
|
|
305
676
|
if (!themeConfig) return;
|
|
306
677
|
|
|
307
|
-
// Validate theme value
|
|
308
678
|
if (theme !== "system" && !themeConfig.themes.includes(theme)) {
|
|
309
|
-
console.warn(
|
|
679
|
+
console.warn(
|
|
680
|
+
`[Theme] Invalid theme value: "${theme}". Valid values: system, ${themeConfig.themes.join(", ")}`,
|
|
681
|
+
);
|
|
310
682
|
return;
|
|
311
683
|
}
|
|
312
684
|
|
|
313
|
-
// Set cookie
|
|
314
685
|
stubResponse.headers.append(
|
|
315
686
|
"Set-Cookie",
|
|
316
687
|
serializeCookieValue(themeConfig.storageKey, theme, {
|
|
317
688
|
path: THEME_COOKIE.path,
|
|
318
689
|
maxAge: THEME_COOKIE.maxAge,
|
|
319
690
|
sameSite: THEME_COOKIE.sameSite,
|
|
320
|
-
})
|
|
691
|
+
}),
|
|
321
692
|
);
|
|
693
|
+
invalidateResponseCookieCache();
|
|
322
694
|
};
|
|
323
695
|
|
|
324
|
-
|
|
696
|
+
const cleanUrl = stripInternalParams(url);
|
|
697
|
+
|
|
325
698
|
const ctx: RequestContext<TEnv> = {
|
|
326
699
|
env,
|
|
327
700
|
request,
|
|
328
|
-
url,
|
|
701
|
+
url: cleanUrl,
|
|
702
|
+
originalUrl: new URL(request.url),
|
|
329
703
|
pathname: url.pathname,
|
|
330
|
-
searchParams:
|
|
331
|
-
|
|
332
|
-
get:
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
704
|
+
searchParams: cleanUrl.searchParams,
|
|
705
|
+
_variables: variables,
|
|
706
|
+
get: ((keyOrVar: any) => {
|
|
707
|
+
if (isNonCacheable(variables, keyOrVar) && isInsideCacheScope()) {
|
|
708
|
+
throw new Error(
|
|
709
|
+
`ctx.get() for a non-cacheable variable cannot be called inside a cache() boundary. ` +
|
|
710
|
+
`The variable was created with { cache: false } or set with { cache: false }, ` +
|
|
711
|
+
`and its value would be stale on cache hit. Move the read outside the cached scope.`,
|
|
712
|
+
);
|
|
713
|
+
}
|
|
714
|
+
return contextGet(variables, keyOrVar);
|
|
715
|
+
}) as RequestContext<TEnv>["get"],
|
|
716
|
+
set: ((keyOrVar: any, value: any, options?: any) => {
|
|
717
|
+
assertNotInsideCacheExec(ctx, "set");
|
|
718
|
+
contextSet(variables, keyOrVar, value, options);
|
|
719
|
+
}) as RequestContext<TEnv>["set"],
|
|
336
720
|
params: {} as Record<string, string>,
|
|
337
|
-
|
|
721
|
+
|
|
722
|
+
get res(): Response {
|
|
723
|
+
return stubResponse;
|
|
724
|
+
},
|
|
725
|
+
set res(_: Response) {
|
|
726
|
+
throw new Error(
|
|
727
|
+
"ctx.res is read-only. Use ctx.header() to set response headers, or cookies() for cookie mutations.",
|
|
728
|
+
);
|
|
729
|
+
},
|
|
338
730
|
|
|
339
731
|
cookie(name: string): string | undefined {
|
|
340
|
-
return
|
|
732
|
+
return effectiveCookie(name);
|
|
341
733
|
},
|
|
342
734
|
|
|
343
735
|
cookies(): Record<string, string> {
|
|
344
|
-
|
|
736
|
+
const parsed = getParsedCookies();
|
|
737
|
+
const mutations = getResponseCookies();
|
|
738
|
+
if (mutations.size === 0) return { ...parsed };
|
|
739
|
+
// Build result without delete (avoids V8 dictionary-mode de-opt)
|
|
740
|
+
const deleted = new Set<string>();
|
|
741
|
+
for (const [k, v] of mutations) {
|
|
742
|
+
if (v === null) deleted.add(k);
|
|
743
|
+
}
|
|
744
|
+
const result: Record<string, string> = {};
|
|
745
|
+
for (const key of Object.keys(parsed)) {
|
|
746
|
+
if (!deleted.has(key)) result[key] = parsed[key];
|
|
747
|
+
}
|
|
748
|
+
for (const [k, v] of mutations) {
|
|
749
|
+
if (v !== null) result[k] = v;
|
|
750
|
+
}
|
|
751
|
+
return result;
|
|
345
752
|
},
|
|
346
753
|
|
|
347
754
|
setCookie(name: string, value: string, options?: CookieOptions): void {
|
|
755
|
+
assertNotInsideCacheExec(ctx, "setCookie");
|
|
756
|
+
assertNotInsideCacheScopeALS("setCookie");
|
|
348
757
|
stubResponse.headers.append(
|
|
349
758
|
"Set-Cookie",
|
|
350
|
-
serializeCookieValue(name, value, options)
|
|
759
|
+
serializeCookieValue(name, value, options),
|
|
351
760
|
);
|
|
761
|
+
invalidateResponseCookieCache();
|
|
352
762
|
},
|
|
353
763
|
|
|
354
764
|
deleteCookie(
|
|
355
765
|
name: string,
|
|
356
|
-
options?: Pick<CookieOptions, "domain" | "path"
|
|
766
|
+
options?: Pick<CookieOptions, "domain" | "path">,
|
|
357
767
|
): void {
|
|
768
|
+
assertNotInsideCacheExec(ctx, "deleteCookie");
|
|
769
|
+
assertNotInsideCacheScopeALS("deleteCookie");
|
|
358
770
|
stubResponse.headers.append(
|
|
359
771
|
"Set-Cookie",
|
|
360
|
-
serializeCookieValue(name, "", { ...options, maxAge: 0 })
|
|
772
|
+
serializeCookieValue(name, "", { ...options, maxAge: 0 }),
|
|
361
773
|
);
|
|
774
|
+
invalidateResponseCookieCache();
|
|
362
775
|
},
|
|
363
776
|
|
|
364
777
|
header(name: string, value: string): void {
|
|
778
|
+
assertNotInsideCacheExec(ctx, "header");
|
|
779
|
+
assertNotInsideCacheScopeALS("header");
|
|
365
780
|
stubResponse.headers.set(name, value);
|
|
366
781
|
},
|
|
367
782
|
|
|
368
|
-
//
|
|
783
|
+
// Rotate the rango state cookie for the responding client (the server seat
|
|
784
|
+
// of invalidateClientCache). Writes ONE Set-Cookie per request with the
|
|
785
|
+
// value {version}:{timestamp}; the `:` stays raw (the cookie-name.ts
|
|
786
|
+
// serializer), not the URL-encoded form serializeCookieValue would produce.
|
|
787
|
+
// The timestamp is strictly greater than the client's current one (inbound
|
|
788
|
+
// X-Rango-State), so a same-millisecond server rotation still differs from
|
|
789
|
+
// the client value and the divergence observer fires.
|
|
790
|
+
_rotateStateCookie(): void {
|
|
791
|
+
if (rangoStateRotated) return;
|
|
792
|
+
rangoStateRotated = true;
|
|
793
|
+
if (!stateCookieName) return;
|
|
794
|
+
// The client's current value, for the monotonic guard: prefer the
|
|
795
|
+
// X-Rango-State header (router navigation/prefetch fetches send it), but
|
|
796
|
+
// fall back to the request's rango state cookie — action POSTs / plain
|
|
797
|
+
// app fetch()s carry no router header yet DO send the cookie. Without the
|
|
798
|
+
// fallback, prevTs stays 0 and a same-ms mint can equal the client value,
|
|
799
|
+
// leaving the divergence observer silent. `|| null` so an empty header
|
|
800
|
+
// ('' from proxy normalization) falls through instead of short-circuiting.
|
|
801
|
+
// getRawCookieValue reads the cookie undecoded (the wire value
|
|
802
|
+
// decodeStateValue decodes exactly once) AND is the same parser the client
|
|
803
|
+
// mirror uses, so both seats read the same jar entry.
|
|
804
|
+
const prevRaw =
|
|
805
|
+
(request.headers.get("x-rango-state") || null) ??
|
|
806
|
+
getRawCookieValue(cookieHeader, stateCookieName);
|
|
807
|
+
const value = mintStateValue(stateVersion ?? "0", prevRaw);
|
|
808
|
+
stubResponse.headers.append(
|
|
809
|
+
"Set-Cookie",
|
|
810
|
+
serializeStateCookie(stateCookieName, value, url.protocol === "https:"),
|
|
811
|
+
);
|
|
812
|
+
invalidateResponseCookieCache();
|
|
813
|
+
},
|
|
814
|
+
|
|
815
|
+
// Set the keepClientCache() directive header. The action bridge reads it on
|
|
816
|
+
// the response and suppresses its automatic invalidation. `.set` makes this
|
|
817
|
+
// idempotent (one header regardless of call count).
|
|
818
|
+
_setKeepCacheDirective(): void {
|
|
819
|
+
stubResponse.headers.set(KEEP_CACHE_HEADER, "1");
|
|
820
|
+
},
|
|
821
|
+
|
|
822
|
+
setStatus(status: number): void {
|
|
823
|
+
assertNotInsideCacheExec(ctx, "setStatus");
|
|
824
|
+
assertNotInsideCacheScopeALS("setStatus");
|
|
825
|
+
stubResponse = new Response(null, {
|
|
826
|
+
status,
|
|
827
|
+
headers: stubResponse.headers,
|
|
828
|
+
});
|
|
829
|
+
},
|
|
830
|
+
|
|
831
|
+
_setStatus(status: number): void {
|
|
832
|
+
stubResponse = new Response(null, {
|
|
833
|
+
status,
|
|
834
|
+
headers: stubResponse.headers,
|
|
835
|
+
});
|
|
836
|
+
},
|
|
837
|
+
|
|
369
838
|
use: null as any,
|
|
370
839
|
|
|
371
840
|
method: request.method,
|
|
372
841
|
|
|
373
842
|
_handleStore: handleStore,
|
|
374
843
|
_cacheStore: cacheStore,
|
|
844
|
+
_explicitTaggedStores: explicitTaggedStores,
|
|
845
|
+
_requestTags: new Set<string>(),
|
|
846
|
+
_cacheProfiles: cacheProfiles,
|
|
375
847
|
|
|
376
848
|
waitUntil(fn: () => Promise<void>): void {
|
|
377
849
|
if (executionContext?.waitUntil) {
|
|
378
|
-
// Cloudflare Workers: use native waitUntil
|
|
379
850
|
executionContext.waitUntil(fn());
|
|
380
851
|
} else {
|
|
381
|
-
|
|
382
|
-
fn().catch((err) => console.error("[waitUntil] Background task failed:", err));
|
|
852
|
+
fireAndForgetWaitUntil(fn);
|
|
383
853
|
}
|
|
384
854
|
},
|
|
385
855
|
|
|
856
|
+
executionContext,
|
|
857
|
+
|
|
386
858
|
_onResponseCallbacks: [],
|
|
387
859
|
|
|
388
860
|
onResponse(callback: (response: Response) => Response): void {
|
|
861
|
+
assertNotInsideCacheExec(ctx, "onResponse");
|
|
862
|
+
assertNotInsideCacheScopeALS("onResponse");
|
|
389
863
|
this._onResponseCallbacks.push(callback);
|
|
390
864
|
},
|
|
391
865
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
866
|
+
get theme() {
|
|
867
|
+
return themeConfig ? getTheme() : undefined;
|
|
868
|
+
},
|
|
869
|
+
setTheme: themeConfig
|
|
870
|
+
? (theme: Theme) => {
|
|
871
|
+
assertNotInsideCacheExec(ctx, "setTheme");
|
|
872
|
+
setTheme(theme);
|
|
873
|
+
}
|
|
874
|
+
: undefined,
|
|
395
875
|
_themeConfig: themeConfig,
|
|
876
|
+
|
|
877
|
+
setLocationState(entries: LocationStateEntry | LocationStateEntry[]): void {
|
|
878
|
+
assertNotInsideCacheExec(ctx, "setLocationState");
|
|
879
|
+
const arr = Array.isArray(entries) ? entries : [entries];
|
|
880
|
+
this._locationState = this._locationState
|
|
881
|
+
? [...this._locationState, ...arr]
|
|
882
|
+
: arr;
|
|
883
|
+
},
|
|
884
|
+
_locationState: undefined,
|
|
885
|
+
|
|
886
|
+
_reportedErrors: new WeakSet<object>(),
|
|
887
|
+
_metricsStore: undefined,
|
|
888
|
+
|
|
889
|
+
_renderBarrier: null as any,
|
|
890
|
+
_resolveRenderBarrier: null as any,
|
|
891
|
+
_renderBarrierSegmentOrder: undefined,
|
|
892
|
+
|
|
893
|
+
reverse: createReverseFunction(getGlobalRouteMap(), undefined, {}),
|
|
396
894
|
};
|
|
397
895
|
|
|
398
|
-
//
|
|
896
|
+
// Lazy allocation: only create Promise when a loader calls rendered().
|
|
897
|
+
let barrierResolved = false;
|
|
898
|
+
let resolveBarrier: (() => void) | undefined;
|
|
899
|
+
ctx._renderBarrier = null as any;
|
|
900
|
+
ctx._resolveRenderBarrier = (
|
|
901
|
+
segments: Array<{ type: string; id: string }>,
|
|
902
|
+
) => {
|
|
903
|
+
if (barrierResolved) return;
|
|
904
|
+
barrierResolved = true;
|
|
905
|
+
const segOrder = segments
|
|
906
|
+
.filter((s) => s.type !== "loader")
|
|
907
|
+
.map((s) => s.id);
|
|
908
|
+
ctx._renderBarrierSegmentOrder = segOrder;
|
|
909
|
+
|
|
910
|
+
const closeGuard = () => {
|
|
911
|
+
ctx._renderBarrierWaiters = undefined;
|
|
912
|
+
ctx._handlerLoaderDeps = undefined;
|
|
913
|
+
ctx._renderBarrierGuardClosed = true;
|
|
914
|
+
};
|
|
915
|
+
|
|
916
|
+
if (ctx._treeHasStreaming) {
|
|
917
|
+
handleStore.settled.then(closeGuard);
|
|
918
|
+
} else {
|
|
919
|
+
ctx._renderBarrierHandleSnapshot = buildHandleSnapshot(
|
|
920
|
+
handleStore,
|
|
921
|
+
segOrder,
|
|
922
|
+
);
|
|
923
|
+
closeGuard();
|
|
924
|
+
}
|
|
925
|
+
if (resolveBarrier) resolveBarrier();
|
|
926
|
+
};
|
|
927
|
+
Object.defineProperty(ctx, "_renderBarrier", {
|
|
928
|
+
get() {
|
|
929
|
+
const p = barrierResolved
|
|
930
|
+
? Promise.resolve()
|
|
931
|
+
: new Promise<void>((resolve) => {
|
|
932
|
+
resolveBarrier = resolve;
|
|
933
|
+
});
|
|
934
|
+
Object.defineProperty(ctx, "_renderBarrier", {
|
|
935
|
+
value: p,
|
|
936
|
+
writable: false,
|
|
937
|
+
configurable: false,
|
|
938
|
+
});
|
|
939
|
+
return p;
|
|
940
|
+
},
|
|
941
|
+
configurable: true,
|
|
942
|
+
});
|
|
943
|
+
|
|
399
944
|
ctx.use = createUseFunction({
|
|
400
945
|
handleStore,
|
|
401
946
|
loaderPromises,
|
|
402
947
|
getContext: () => ctx,
|
|
403
948
|
});
|
|
404
949
|
|
|
950
|
+
(ctx as any)[NOCACHE_SYMBOL] = true;
|
|
405
951
|
return ctx;
|
|
406
952
|
}
|
|
407
953
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
954
|
+
const MAX_AGE_ZERO_RE = /;\s*Max-Age\s*=\s*0/i;
|
|
955
|
+
|
|
956
|
+
function parseResponseCookies(response: Response): Map<string, string | null> {
|
|
957
|
+
const result = new Map<string, string | null>();
|
|
958
|
+
const setCookies = response.headers.getSetCookie();
|
|
959
|
+
|
|
960
|
+
for (const header of setCookies) {
|
|
961
|
+
const semiIdx = header.indexOf(";");
|
|
962
|
+
const pair = semiIdx === -1 ? header : header.substring(0, semiIdx);
|
|
963
|
+
const eqIdx = pair.indexOf("=");
|
|
964
|
+
if (eqIdx === -1) continue;
|
|
965
|
+
|
|
966
|
+
let name: string;
|
|
967
|
+
let value: string;
|
|
968
|
+
try {
|
|
969
|
+
name = decodeURIComponent(pair.substring(0, eqIdx).trim());
|
|
970
|
+
value = decodeURIComponent(pair.substring(eqIdx + 1).trim());
|
|
971
|
+
} catch {
|
|
972
|
+
continue;
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
const isDeleted = MAX_AGE_ZERO_RE.test(header);
|
|
976
|
+
result.set(name, isDeleted ? null : value);
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
return result;
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
// Exported for unit tests; the canonical cookie parse/serialize lives here
|
|
983
|
+
// (a duplicate copy in middleware-cookies.ts was removed). Not part of the
|
|
984
|
+
// public export surface.
|
|
985
|
+
export function parseCookiesFromHeader(
|
|
986
|
+
cookieHeader: string | null,
|
|
413
987
|
): Record<string, string> {
|
|
414
988
|
if (!cookieHeader) return {};
|
|
415
989
|
|
|
@@ -419,20 +993,23 @@ function parseCookiesFromHeader(
|
|
|
419
993
|
for (const pair of pairs) {
|
|
420
994
|
const [name, ...rest] = pair.trim().split("=");
|
|
421
995
|
if (name) {
|
|
422
|
-
|
|
996
|
+
const raw = rest.join("=");
|
|
997
|
+
try {
|
|
998
|
+
cookies[name] = decodeURIComponent(raw);
|
|
999
|
+
} catch {
|
|
1000
|
+
// Malformed percent-encoding: fall back to raw value
|
|
1001
|
+
cookies[name] = raw;
|
|
1002
|
+
}
|
|
423
1003
|
}
|
|
424
1004
|
}
|
|
425
1005
|
|
|
426
1006
|
return cookies;
|
|
427
1007
|
}
|
|
428
1008
|
|
|
429
|
-
|
|
430
|
-
* Serialize a cookie for Set-Cookie header
|
|
431
|
-
*/
|
|
432
|
-
function serializeCookieValue(
|
|
1009
|
+
export function serializeCookieValue(
|
|
433
1010
|
name: string,
|
|
434
1011
|
value: string,
|
|
435
|
-
options: CookieOptions = {}
|
|
1012
|
+
options: CookieOptions = {},
|
|
436
1013
|
): string {
|
|
437
1014
|
let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
|
|
438
1015
|
|
|
@@ -456,20 +1033,12 @@ export interface CreateUseFunctionOptions<TEnv> {
|
|
|
456
1033
|
getContext: () => RequestContext<TEnv>;
|
|
457
1034
|
}
|
|
458
1035
|
|
|
459
|
-
/**
|
|
460
|
-
* Create the use() function for loader and handle composition.
|
|
461
|
-
*
|
|
462
|
-
* This is the unified implementation used by both RequestContext and HandlerContext.
|
|
463
|
-
* - For loaders: executes and memoizes loader functions
|
|
464
|
-
* - For handles: returns a push function to add handle data
|
|
465
|
-
*/
|
|
466
1036
|
export function createUseFunction<TEnv>(
|
|
467
|
-
options: CreateUseFunctionOptions<TEnv
|
|
1037
|
+
options: CreateUseFunctionOptions<TEnv>,
|
|
468
1038
|
): RequestContext["use"] {
|
|
469
1039
|
const { handleStore, loaderPromises, getContext } = options;
|
|
470
1040
|
|
|
471
1041
|
return ((item: LoaderDefinition<any, any> | Handle<any, any>) => {
|
|
472
|
-
// Handle case: return a push function
|
|
473
1042
|
if (isHandle(item)) {
|
|
474
1043
|
const handle = item;
|
|
475
1044
|
const ctx = getContext();
|
|
@@ -478,31 +1047,28 @@ export function createUseFunction<TEnv>(
|
|
|
478
1047
|
if (!segmentId) {
|
|
479
1048
|
throw new Error(
|
|
480
1049
|
`Handle "${handle.$$id}" used outside of handler context. ` +
|
|
481
|
-
`Handles must be used within route/layout handlers
|
|
1050
|
+
`Handles must be used within route/layout handlers.`,
|
|
482
1051
|
);
|
|
483
1052
|
}
|
|
484
1053
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
1054
|
+
return withDefer(
|
|
1055
|
+
(dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>)) => {
|
|
1056
|
+
const valueOrPromise =
|
|
1057
|
+
typeof dataOrFn === "function"
|
|
1058
|
+
? (dataOrFn as () => Promise<unknown>)()
|
|
1059
|
+
: dataOrFn;
|
|
491
1060
|
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
1061
|
+
handleStore.push(handle.$$id, segmentId, valueOrPromise);
|
|
1062
|
+
},
|
|
1063
|
+
);
|
|
495
1064
|
}
|
|
496
1065
|
|
|
497
|
-
// Loader case
|
|
498
1066
|
const loader = item as LoaderDefinition<any, any>;
|
|
499
1067
|
|
|
500
|
-
// Return cached promise if already started
|
|
501
1068
|
if (loaderPromises.has(loader.$$id)) {
|
|
502
1069
|
return loaderPromises.get(loader.$$id);
|
|
503
1070
|
}
|
|
504
1071
|
|
|
505
|
-
// Get loader function - either from loader object or fetchable registry
|
|
506
1072
|
let loaderFn = loader.fn;
|
|
507
1073
|
if (!loaderFn) {
|
|
508
1074
|
const fetchable = getFetchableLoader(loader.$$id);
|
|
@@ -513,39 +1079,54 @@ export function createUseFunction<TEnv>(
|
|
|
513
1079
|
|
|
514
1080
|
if (!loaderFn) {
|
|
515
1081
|
throw new Error(
|
|
516
|
-
`Loader "${loader.$$id}" has no function. This usually means the loader was defined without "use server" and the function was not included in the build
|
|
1082
|
+
`Loader "${loader.$$id}" has no function. This usually means the loader was defined without "use server" and the function was not included in the build.`,
|
|
517
1083
|
);
|
|
518
1084
|
}
|
|
519
1085
|
|
|
520
1086
|
const ctx = getContext();
|
|
521
1087
|
|
|
522
|
-
// Create loader context with recursive use() support
|
|
523
1088
|
const loaderCtx: LoaderContext<Record<string, string | undefined>, TEnv> = {
|
|
524
1089
|
params: ctx.params,
|
|
1090
|
+
routeParams: (ctx.params ?? {}) as Record<string, string>,
|
|
525
1091
|
request: ctx.request,
|
|
526
1092
|
searchParams: ctx.searchParams,
|
|
1093
|
+
search: (ctx as any).search ?? {},
|
|
527
1094
|
pathname: ctx.pathname,
|
|
528
1095
|
url: ctx.url,
|
|
1096
|
+
originalUrl: ctx.originalUrl,
|
|
529
1097
|
env: ctx.env as any,
|
|
530
|
-
|
|
1098
|
+
waitUntil: ctx.waitUntil.bind(ctx),
|
|
1099
|
+
executionContext: ctx.executionContext,
|
|
531
1100
|
get: ctx.get as any,
|
|
532
|
-
use: <TDep, TDepParams = any>(
|
|
533
|
-
dep: LoaderDefinition<TDep, TDepParams
|
|
1101
|
+
use: (<TDep, TDepParams = any>(
|
|
1102
|
+
dep: LoaderDefinition<TDep, TDepParams>,
|
|
534
1103
|
): Promise<TDep> => {
|
|
535
|
-
// Recursive call - will start dep loader if not already started
|
|
536
1104
|
return ctx.use(dep);
|
|
537
|
-
},
|
|
1105
|
+
}) as LoaderContext["use"],
|
|
538
1106
|
method: "GET",
|
|
539
1107
|
body: undefined,
|
|
1108
|
+
reverse: createReverseFunction(
|
|
1109
|
+
getGlobalRouteMap(),
|
|
1110
|
+
ctx._routeName,
|
|
1111
|
+
ctx.params as Record<string, string>,
|
|
1112
|
+
ctx._routeName ? isRouteRootScoped(ctx._routeName) : undefined,
|
|
1113
|
+
),
|
|
1114
|
+
rendered: () => {
|
|
1115
|
+
throw new Error(
|
|
1116
|
+
`ctx.rendered() is only available in DSL loaders (registered via loader() in urls()). ` +
|
|
1117
|
+
`It cannot be used from request-context loaders or server actions.`,
|
|
1118
|
+
);
|
|
1119
|
+
},
|
|
540
1120
|
};
|
|
541
1121
|
|
|
542
|
-
//
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
1122
|
+
// Meter through the same unified phase API as the loader-resolution funnel
|
|
1123
|
+
// (observePhase), so a loader resolved via this base request-context ctx.use
|
|
1124
|
+
// co-emits the "loader:<id>" perf metric AND the "rango.loader" span — no
|
|
1125
|
+
// drift between the two ctx.use implementations.
|
|
1126
|
+
const promise = observePhase(PHASES.loader(loader.$$id), () =>
|
|
1127
|
+
Promise.resolve(loaderFn(loaderCtx)),
|
|
1128
|
+
);
|
|
547
1129
|
|
|
548
|
-
// Memoize for subsequent calls
|
|
549
1130
|
loaderPromises.set(loader.$$id, promise);
|
|
550
1131
|
|
|
551
1132
|
return promise;
|