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