@rangojs/router 0.0.0-experimental.259 → 0.0.0-experimental.25dbaac3
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/{CLAUDE.md → AGENTS.md} +4 -0
- package/README.md +471 -51
- 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 +490 -94
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/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 +3423 -1718
- 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 +21 -18
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/cache-guide/SKILL.md +41 -5
- package/skills/caching/SKILL.md +49 -8
- package/skills/document-cache/SKILL.md +2 -2
- package/skills/handler-use/SKILL.md +362 -0
- package/skills/hooks/SKILL.md +94 -52
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +99 -0
- package/skills/layout/SKILL.md +84 -2
- package/skills/links/SKILL.md +93 -17
- package/skills/loader/SKILL.md +367 -36
- package/skills/middleware/SKILL.md +145 -33
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/parallel/SKILL.md +249 -2
- package/skills/prerender/SKILL.md +261 -49
- package/skills/rango/SKILL.md +26 -24
- package/skills/response-routes/SKILL.md +11 -3
- package/skills/route/SKILL.md +100 -5
- package/skills/router-setup/SKILL.md +172 -5
- package/skills/server-actions/SKILL.md +739 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/theme/SKILL.md +5 -4
- package/skills/typesafety/SKILL.md +95 -38
- package/skills/use-cache/SKILL.md +16 -2
- package/src/__internal.ts +93 -1
- package/src/bin/rango.ts +56 -19
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +78 -52
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +1 -1
- package/src/browser/link-interceptor.ts +23 -3
- package/src/browser/merge-segment-loaders.ts +9 -2
- package/src/browser/navigation-bridge.ts +234 -453
- package/src/browser/navigation-client.ts +191 -86
- package/src/browser/navigation-store.ts +71 -41
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/partial-update.ts +215 -167
- package/src/browser/prefetch/cache.ts +314 -0
- package/src/browser/prefetch/fetch.ts +282 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +191 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +152 -0
- package/src/browser/react/Link.tsx +241 -47
- package/src/browser/react/NavigationProvider.tsx +136 -16
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +55 -0
- package/src/browser/react/index.ts +2 -6
- package/src/browser/react/location-state-shared.ts +29 -11
- package/src/browser/react/location-state.ts +6 -4
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +23 -45
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +28 -120
- package/src/browser/react/use-navigation.ts +29 -34
- package/src/browser/react/use-params.ts +16 -35
- package/src/browser/react/use-pathname.ts +2 -3
- package/src/browser/react/use-router.ts +31 -14
- package/src/browser/react/use-search-params.ts +2 -1
- package/src/browser/react/use-segments.ts +82 -118
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +202 -67
- package/src/browser/scroll-restoration.ts +47 -45
- package/src/browser/segment-reconciler.ts +36 -9
- package/src/browser/server-action-bridge.ts +464 -409
- package/src/browser/types.ts +100 -40
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +44 -19
- package/src/build/generate-route-types.ts +7 -0
- package/src/build/index.ts +1 -0
- package/src/build/route-trie.ts +67 -25
- package/src/build/route-types/codegen.ts +13 -4
- package/src/build/route-types/include-resolution.ts +21 -1
- package/src/build/route-types/per-module-writer.ts +15 -3
- package/src/build/route-types/router-processing.ts +391 -90
- package/src/build/route-types/scan-filter.ts +8 -1
- package/src/build/runtime-discovery.ts +13 -1
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +140 -123
- package/src/cache/cache-scope.ts +124 -90
- package/src/cache/cf/cf-cache-store.ts +467 -22
- package/src/cache/cf/index.ts +5 -1
- package/src/cache/document-cache.ts +109 -75
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +43 -69
- package/src/cache/profile-registry.ts +43 -8
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +140 -117
- package/src/cache/taint.ts +85 -3
- package/src/cache/types.ts +1 -115
- package/src/client.rsc.tsx +2 -1
- package/src/client.tsx +86 -254
- package/src/context-var.ts +72 -2
- package/src/debug.ts +2 -2
- package/src/errors.ts +6 -1
- package/src/handle.ts +41 -1
- package/src/handles/MetaTags.tsx +5 -2
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/host/cookie-handler.ts +8 -3
- package/src/host/index.ts +0 -3
- package/src/host/router.ts +14 -1
- package/src/href-client.ts +3 -1
- package/src/index.rsc.ts +48 -32
- package/src/index.ts +104 -64
- package/src/loader.rsc.ts +12 -4
- package/src/loader.ts +8 -0
- package/src/outlet-context.ts +1 -1
- package/src/prerender/store.ts +61 -18
- package/src/prerender.ts +207 -88
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +36 -7
- package/src/root-error-boundary.tsx +30 -26
- package/src/route-definition/dsl-helpers.ts +249 -46
- package/src/route-definition/helpers-types.ts +73 -20
- package/src/route-definition/index.ts +3 -3
- package/src/route-definition/redirect.ts +24 -4
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-map-builder.ts +45 -3
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +25 -0
- package/src/router/content-negotiation.ts +101 -2
- package/src/router/debug-manifest.ts +16 -3
- package/src/router/find-match.ts +4 -2
- package/src/router/handler-context.ts +221 -39
- package/src/router/intercept-resolution.ts +17 -8
- package/src/router/lazy-includes.ts +12 -5
- package/src/router/loader-resolution.ts +164 -31
- package/src/router/logging.ts +104 -4
- package/src/router/manifest.ts +53 -9
- package/src/router/match-api.ts +150 -206
- package/src/router/match-context.ts +3 -0
- package/src/router/match-handlers.ts +186 -11
- package/src/router/match-middleware/background-revalidation.ts +94 -86
- package/src/router/match-middleware/cache-lookup.ts +164 -19
- package/src/router/match-middleware/cache-store.ts +55 -10
- package/src/router/match-middleware/intercept-resolution.ts +9 -7
- package/src/router/match-middleware/segment-resolution.ts +61 -5
- package/src/router/match-pipelines.ts +8 -43
- package/src/router/match-result.ts +122 -18
- package/src/router/metrics.ts +238 -13
- package/src/router/middleware-types.ts +64 -61
- package/src/router/middleware.ts +316 -145
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +134 -15
- package/src/router/prerender-match.ts +150 -16
- package/src/router/preview-match.ts +30 -96
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +102 -9
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +20 -0
- package/src/router/router-interfaces.ts +200 -43
- package/src/router/router-options.ts +265 -12
- package/src/router/router-registry.ts +5 -2
- package/src/router/segment-resolution/fresh.ts +365 -256
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +103 -98
- package/src/router/segment-resolution/revalidation.ts +711 -423
- package/src/router/segment-resolution/static-store.ts +2 -2
- package/src/router/segment-resolution.ts +1 -3
- package/src/router/segment-wrappers.ts +5 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +30 -6
- package/src/router/types.ts +8 -1
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +269 -25
- package/src/rsc/handler-context.ts +13 -2
- package/src/rsc/handler.ts +784 -629
- package/src/rsc/helpers.ts +168 -20
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +105 -43
- package/src/rsc/manifest-init.ts +7 -2
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +262 -20
- package/src/rsc/response-route-handler.ts +360 -0
- package/src/rsc/rsc-rendering.ts +70 -44
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +178 -66
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +37 -3
- package/src/search-params.ts +38 -23
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +109 -23
- package/src/server/context.ts +227 -24
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +103 -12
- package/src/server/loader-registry.ts +20 -54
- package/src/server/request-context.ts +475 -105
- package/src/server.ts +6 -0
- package/src/ssr/index.tsx +74 -27
- package/src/static-handler.ts +25 -6
- package/src/theme/ThemeProvider.tsx +6 -1
- package/src/theme/index.ts +4 -18
- package/src/theme/theme-context.ts +1 -28
- package/src/theme/theme-script.ts +2 -1
- package/src/types/cache-types.ts +10 -5
- package/src/types/error-types.ts +3 -0
- package/src/types/global-namespace.ts +22 -0
- package/src/types/handler-context.ts +242 -82
- package/src/types/index.ts +1 -1
- package/src/types/loader-types.ts +50 -21
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +17 -26
- package/src/types/route-entry.ts +46 -0
- package/src/types/segments.ts +19 -5
- package/src/urls/include-helper.ts +72 -21
- package/src/urls/index.ts +1 -0
- package/src/urls/path-helper-types.ts +69 -18
- package/src/urls/path-helper.ts +65 -15
- package/src/urls/pattern-types.ts +33 -1
- package/src/urls/response-types.ts +47 -23
- package/src/urls/type-extraction.ts +23 -15
- package/src/use-loader.tsx +103 -13
- package/src/vite/debug.ts +184 -0
- package/src/vite/discovery/bundle-postprocess.ts +62 -85
- package/src/vite/discovery/discover-routers.ts +87 -29
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +224 -106
- package/src/vite/discovery/route-types-writer.ts +7 -7
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +20 -13
- package/src/vite/discovery/virtual-module-codegen.ts +5 -2
- package/src/vite/index.ts +14 -51
- package/src/vite/plugin-types.ts +51 -79
- package/src/vite/plugins/cjs-to-esm.ts +5 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +19 -7
- 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 +214 -0
- package/src/vite/plugins/expose-action-id.ts +53 -31
- package/src/vite/plugins/expose-id-utils.ts +12 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +30 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
- package/src/vite/plugins/expose-internal-ids.ts +567 -319
- package/src/vite/plugins/performance-tracks.ts +96 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +139 -38
- package/src/vite/plugins/version-injector.ts +37 -11
- package/src/vite/plugins/version-plugin.ts +200 -18
- package/src/vite/rango.ts +233 -221
- package/src/vite/router-discovery.ts +887 -176
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/package-resolution.ts +41 -1
- package/src/vite/utils/prerender-utils.ts +113 -0
- package/src/vite/utils/shared-utils.ts +22 -11
- package/skills/testing/SKILL.md +0 -226
- package/src/browser/lru-cache.ts +0 -61
- package/src/browser/react/prefetch.ts +0 -27
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/route-definition/route-function.ts +0 -119
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
|
@@ -13,19 +13,43 @@
|
|
|
13
13
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
14
14
|
import type { CookieOptions } from "../router/middleware.js";
|
|
15
15
|
import type { LoaderDefinition, LoaderContext } from "../types.js";
|
|
16
|
+
import type { ScopedReverseFunction } from "../reverse.js";
|
|
17
|
+
import type {
|
|
18
|
+
DefaultEnv,
|
|
19
|
+
DefaultReverseRouteMap,
|
|
20
|
+
DefaultRouteName,
|
|
21
|
+
} from "../types/global-namespace.js";
|
|
16
22
|
import type { Handle } from "../handle.js";
|
|
17
|
-
import {
|
|
18
|
-
|
|
23
|
+
import {
|
|
24
|
+
type ContextVar,
|
|
25
|
+
contextGet,
|
|
26
|
+
contextSet,
|
|
27
|
+
isNonCacheable,
|
|
28
|
+
} from "../context-var.js";
|
|
29
|
+
import {
|
|
30
|
+
createHandleStore,
|
|
31
|
+
buildHandleSnapshot,
|
|
32
|
+
type HandleStore,
|
|
33
|
+
type HandleData,
|
|
34
|
+
} from "./handle-store.js";
|
|
19
35
|
import { isHandle } from "../handle.js";
|
|
20
|
-
import { track } from "./context.js";
|
|
36
|
+
import { track, type MetricsStore } from "./context.js";
|
|
21
37
|
import { getFetchableLoader } from "./fetchable-loader-store.js";
|
|
22
38
|
import type { SegmentCacheStore } from "../cache/types.js";
|
|
23
39
|
import type { Theme, ResolvedThemeConfig } from "../theme/types.js";
|
|
40
|
+
import type { ExecutionContext, RequestScope } from "../types/request-scope.js";
|
|
41
|
+
import { fireAndForgetWaitUntil } from "../types/request-scope.js";
|
|
24
42
|
import { THEME_COOKIE } from "../theme/constants.js";
|
|
25
43
|
import type { LocationStateEntry } from "../browser/react/location-state-shared.js";
|
|
26
44
|
import { NOCACHE_SYMBOL, assertNotInsideCacheExec } from "../cache/taint.js";
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
45
|
+
import { isInsideCacheScope } from "./context.js";
|
|
46
|
+
import {
|
|
47
|
+
createReverseFunction,
|
|
48
|
+
stripInternalParams,
|
|
49
|
+
} from "../router/handler-context.js";
|
|
50
|
+
import { getGlobalRouteMap, isRouteRootScoped } from "../route-map-builder.js";
|
|
51
|
+
import { invariant } from "../errors.js";
|
|
52
|
+
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
29
53
|
|
|
30
54
|
/**
|
|
31
55
|
* Unified request context available via getRequestContext()
|
|
@@ -34,21 +58,11 @@ import { getGlobalRouteMap } from "../route-map-builder.js";
|
|
|
34
58
|
* Use this when you need access to request data outside of route handlers.
|
|
35
59
|
*/
|
|
36
60
|
export interface RequestContext<
|
|
37
|
-
TEnv =
|
|
61
|
+
TEnv = DefaultEnv,
|
|
38
62
|
TParams = Record<string, string>,
|
|
39
|
-
> {
|
|
40
|
-
/**
|
|
41
|
-
|
|
42
|
-
/** Original HTTP request */
|
|
43
|
-
request: Request;
|
|
44
|
-
/** Parsed URL (system params like _rsc* are NOT filtered here) */
|
|
45
|
-
url: URL;
|
|
46
|
-
/** URL pathname */
|
|
47
|
-
pathname: string;
|
|
48
|
-
/** URL search params (system params like _rsc* are NOT filtered here) */
|
|
49
|
-
searchParams: URLSearchParams;
|
|
50
|
-
/** Variables set by middleware (same as ctx.var) */
|
|
51
|
-
var: Record<string, any>;
|
|
63
|
+
> extends RequestScope<TEnv> {
|
|
64
|
+
/** @internal Shared variable backing store for ctx.get()/ctx.set(). */
|
|
65
|
+
_variables: Record<string, any>;
|
|
52
66
|
/** Get a variable set by middleware */
|
|
53
67
|
get: {
|
|
54
68
|
<T>(contextVar: ContextVar<T>): T | undefined;
|
|
@@ -56,33 +70,38 @@ export interface RequestContext<
|
|
|
56
70
|
};
|
|
57
71
|
/** Set a variable (shared with middleware and handlers) */
|
|
58
72
|
set: {
|
|
59
|
-
<T>(
|
|
60
|
-
|
|
73
|
+
<T>(
|
|
74
|
+
contextVar: ContextVar<T>,
|
|
75
|
+
value: T,
|
|
76
|
+
options?: { cache?: boolean },
|
|
77
|
+
): void;
|
|
78
|
+
<K extends string>(key: K, value: any, options?: { cache?: boolean }): void;
|
|
61
79
|
};
|
|
62
80
|
/**
|
|
63
81
|
* Route params (populated after route matching)
|
|
64
82
|
* Initially empty, then set to matched params
|
|
65
83
|
*/
|
|
66
84
|
params: TParams;
|
|
67
|
-
/**
|
|
68
|
-
|
|
69
|
-
* Headers set here are merged into the final response
|
|
70
|
-
*/
|
|
71
|
-
res: Response;
|
|
85
|
+
/** @internal Stub response for collecting headers/cookies. Use ctx.headers or ctx.header() instead. */
|
|
86
|
+
readonly res: Response;
|
|
72
87
|
|
|
73
|
-
/** Get a cookie value
|
|
88
|
+
/** @internal Get a cookie value (effective: request + response mutations). Use cookies().get() instead. */
|
|
74
89
|
cookie(name: string): string | undefined;
|
|
75
|
-
/** Get all cookies
|
|
90
|
+
/** @internal Get all cookies (effective merged view). Use cookies().getAll() instead. */
|
|
76
91
|
cookies(): Record<string, string>;
|
|
77
|
-
/** Set a cookie on the response */
|
|
92
|
+
/** @internal Set a cookie on the response. Use cookies().set() instead. */
|
|
78
93
|
setCookie(name: string, value: string, options?: CookieOptions): void;
|
|
79
|
-
/** Delete a cookie */
|
|
94
|
+
/** @internal Delete a cookie. Use cookies().delete() instead. */
|
|
80
95
|
deleteCookie(
|
|
81
96
|
name: string,
|
|
82
97
|
options?: Pick<CookieOptions, "domain" | "path">,
|
|
83
98
|
): void;
|
|
84
99
|
/** Set a response header */
|
|
85
100
|
header(name: string, value: string): void;
|
|
101
|
+
/** Set the response status code */
|
|
102
|
+
setStatus(status: number): void;
|
|
103
|
+
/** @internal Set status bypassing cache-exec guard (for framework error handling) */
|
|
104
|
+
_setStatus(status: number): void;
|
|
86
105
|
|
|
87
106
|
/**
|
|
88
107
|
* Access loader data or push handle data.
|
|
@@ -121,19 +140,11 @@ export interface RequestContext<
|
|
|
121
140
|
/** @internal Cache store for segment caching (optional, used by CacheScope) */
|
|
122
141
|
_cacheStore?: SegmentCacheStore;
|
|
123
142
|
|
|
124
|
-
/**
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
* @example
|
|
130
|
-
* ```typescript
|
|
131
|
-
* ctx.waitUntil(async () => {
|
|
132
|
-
* await cacheStore.set(key, data, ttl);
|
|
133
|
-
* });
|
|
134
|
-
* ```
|
|
135
|
-
*/
|
|
136
|
-
waitUntil(fn: () => Promise<void>): void;
|
|
143
|
+
/** @internal Cache profiles for "use cache" profile resolution (per-router) */
|
|
144
|
+
_cacheProfiles?: Record<
|
|
145
|
+
string,
|
|
146
|
+
import("../cache/profile-registry.js").CacheProfile
|
|
147
|
+
>;
|
|
137
148
|
|
|
138
149
|
/**
|
|
139
150
|
* Register a callback to run when the response is created.
|
|
@@ -207,29 +218,153 @@ export interface RequestContext<
|
|
|
207
218
|
*
|
|
208
219
|
* @example
|
|
209
220
|
* ```typescript
|
|
210
|
-
* ctx.setLocationState(
|
|
221
|
+
* ctx.setLocationState(Flash({ text: "Item saved!" }));
|
|
211
222
|
* ```
|
|
212
223
|
*/
|
|
213
|
-
setLocationState(entries: LocationStateEntry[]): void;
|
|
224
|
+
setLocationState(entries: LocationStateEntry | LocationStateEntry[]): void;
|
|
214
225
|
|
|
215
226
|
/** @internal Accumulated location state entries */
|
|
216
227
|
_locationState?: LocationStateEntry[];
|
|
217
228
|
|
|
229
|
+
/**
|
|
230
|
+
* The matched route name, if the route has an explicit name.
|
|
231
|
+
* Undefined before route matching or for unnamed routes.
|
|
232
|
+
* Includes the namespace prefix from include() (e.g., "blog.post").
|
|
233
|
+
*/
|
|
234
|
+
routeName?: DefaultRouteName;
|
|
235
|
+
|
|
218
236
|
/**
|
|
219
237
|
* Generate URLs from route names.
|
|
220
238
|
* Uses the global route map. After route matching, scoped (`.name`) resolution
|
|
221
239
|
* works within the matched include() scope.
|
|
222
240
|
*/
|
|
223
|
-
reverse
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
): string;
|
|
241
|
+
reverse: ScopedReverseFunction<
|
|
242
|
+
Record<string, string>,
|
|
243
|
+
DefaultReverseRouteMap
|
|
244
|
+
>;
|
|
228
245
|
|
|
229
246
|
/** @internal Route name from route matching, used for scoped reverse resolution */
|
|
230
247
|
_routeName?: string;
|
|
248
|
+
|
|
249
|
+
/** @internal Previous route key (from the navigation source), used for revalidation */
|
|
250
|
+
_prevRouteKey?: string;
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* @internal Render barrier for experimental `rendered()` API.
|
|
254
|
+
* Resolves when all non-loader segments have settled and handle data
|
|
255
|
+
* is available. Used by DSL loaders that call `ctx.rendered()`.
|
|
256
|
+
*/
|
|
257
|
+
_renderBarrier: Promise<void>;
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* @internal Resolve the render barrier. Accepts resolved segments, filters
|
|
261
|
+
* out loaders, and captures non-loader segment IDs as the handle ordering.
|
|
262
|
+
* Called after segment resolution (fresh) or handle replay (cache/prerender).
|
|
263
|
+
*/
|
|
264
|
+
_resolveRenderBarrier: (
|
|
265
|
+
segments: Array<{ type: string; id: string }>,
|
|
266
|
+
) => void;
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* @internal Segment order at barrier resolution time, used by loader
|
|
270
|
+
* ctx.use(handle) to collect handle data in correct order.
|
|
271
|
+
*/
|
|
272
|
+
_renderBarrierSegmentOrder?: string[];
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* @internal Set to true when the matched entry tree contains any `loading()`
|
|
276
|
+
* entries (streaming). Used by rendered() to fail fast.
|
|
277
|
+
*/
|
|
278
|
+
_treeHasStreaming?: boolean;
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* @internal Loader IDs that have called rendered() and are waiting for the
|
|
282
|
+
* barrier. Used to detect deadlocks when a handler tries to await the same
|
|
283
|
+
* loader via ctx.use(Loader).
|
|
284
|
+
*/
|
|
285
|
+
_renderBarrierWaiters?: Set<string>;
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* @internal Loader IDs that handlers have started awaiting via ctx.use().
|
|
289
|
+
* Used for bidirectional deadlock detection: if a loader later calls
|
|
290
|
+
* rendered() and a handler already awaits it, we can detect the deadlock.
|
|
291
|
+
*/
|
|
292
|
+
_handlerLoaderDeps?: Set<string>;
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* @internal Cached HandleData snapshot built at barrier resolution time.
|
|
296
|
+
* Avoids rebuilding the snapshot on every loader ctx.use(handle) call.
|
|
297
|
+
*/
|
|
298
|
+
_renderBarrierHandleSnapshot?: HandleData;
|
|
299
|
+
|
|
300
|
+
/** @internal Per-request error dedup set for onError reporting */
|
|
301
|
+
_reportedErrors: WeakSet<object>;
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* @internal Report a non-fatal background error through the router's
|
|
305
|
+
* onError callback. Wired by the RSC handler / router during request
|
|
306
|
+
* creation. Cache-runtime and other subsystems call this to surface
|
|
307
|
+
* errors without failing the response.
|
|
308
|
+
*/
|
|
309
|
+
_reportBackgroundError?: (error: unknown, category: string) => void;
|
|
310
|
+
|
|
311
|
+
/** @internal Per-request debug performance override (set via ctx.debugPerformance()) */
|
|
312
|
+
_debugPerformance?: boolean;
|
|
313
|
+
|
|
314
|
+
/** @internal Request-scoped performance metrics store */
|
|
315
|
+
_metricsStore?: MetricsStore;
|
|
316
|
+
|
|
317
|
+
/** @internal Router basename for this request (used by redirect()) */
|
|
318
|
+
_basename?: string;
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* @internal RouteSnapshot from classifyRequest, reused by match/matchPartial
|
|
322
|
+
* to avoid a second resolveRoute call. Cleared on HMR invalidation.
|
|
323
|
+
*/
|
|
324
|
+
_classifiedRoute?: import("../router/route-snapshot.js").RouteSnapshot;
|
|
231
325
|
}
|
|
232
326
|
|
|
327
|
+
/**
|
|
328
|
+
* Public view of RequestContext, without internal methods and fields.
|
|
329
|
+
*
|
|
330
|
+
* This is the type exported to library consumers. Internal code should
|
|
331
|
+
* use the full RequestContext interface directly.
|
|
332
|
+
*/
|
|
333
|
+
export type PublicRequestContext<
|
|
334
|
+
TEnv = DefaultEnv,
|
|
335
|
+
TParams = Record<string, string>,
|
|
336
|
+
> = Omit<
|
|
337
|
+
RequestContext<TEnv, TParams>,
|
|
338
|
+
| "cookie"
|
|
339
|
+
| "cookies"
|
|
340
|
+
| "setCookie"
|
|
341
|
+
| "deleteCookie"
|
|
342
|
+
| "_handleStore"
|
|
343
|
+
| "_cacheStore"
|
|
344
|
+
| "_cacheProfiles"
|
|
345
|
+
| "_onResponseCallbacks"
|
|
346
|
+
| "_themeConfig"
|
|
347
|
+
| "_locationState"
|
|
348
|
+
| "_routeName"
|
|
349
|
+
| "_prevRouteKey"
|
|
350
|
+
| "_reportedErrors"
|
|
351
|
+
| "_renderBarrier"
|
|
352
|
+
| "_resolveRenderBarrier"
|
|
353
|
+
| "_renderBarrierSegmentOrder"
|
|
354
|
+
| "_treeHasStreaming"
|
|
355
|
+
| "_renderBarrierWaiters"
|
|
356
|
+
| "_handlerLoaderDeps"
|
|
357
|
+
| "_renderBarrierHandleSnapshot"
|
|
358
|
+
| "_reportBackgroundError"
|
|
359
|
+
| "_debugPerformance"
|
|
360
|
+
| "_metricsStore"
|
|
361
|
+
| "_basename"
|
|
362
|
+
| "_setStatus"
|
|
363
|
+
| "_variables"
|
|
364
|
+
| "_classifiedRoute"
|
|
365
|
+
| "res"
|
|
366
|
+
>;
|
|
367
|
+
|
|
233
368
|
// AsyncLocalStorage instance for request context
|
|
234
369
|
const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
|
|
235
370
|
|
|
@@ -246,9 +381,26 @@ export function runWithRequestContext<TEnv, T>(
|
|
|
246
381
|
|
|
247
382
|
/**
|
|
248
383
|
* Get the current request context
|
|
249
|
-
*
|
|
384
|
+
* Throws if called outside of a request context
|
|
250
385
|
*/
|
|
251
|
-
export function getRequestContext<TEnv =
|
|
386
|
+
export function getRequestContext<TEnv = DefaultEnv>(): RequestContext<TEnv> {
|
|
387
|
+
const ctx = requestContextStorage.getStore() as
|
|
388
|
+
| RequestContext<TEnv>
|
|
389
|
+
| undefined;
|
|
390
|
+
invariant(
|
|
391
|
+
ctx,
|
|
392
|
+
"getRequestContext() called outside of a request context. " +
|
|
393
|
+
"This function must be called from within a route handler, loader, middleware, " +
|
|
394
|
+
"server action, or server component.",
|
|
395
|
+
);
|
|
396
|
+
return ctx;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* @internal Get the request context without throwing — for internal code that
|
|
401
|
+
* may run outside a request context (cache stores, optional handle lookups, etc.)
|
|
402
|
+
*/
|
|
403
|
+
export function _getRequestContext<TEnv = DefaultEnv>():
|
|
252
404
|
| RequestContext<TEnv>
|
|
253
405
|
| undefined {
|
|
254
406
|
return requestContextStorage.getStore() as RequestContext<TEnv> | undefined;
|
|
@@ -267,9 +419,34 @@ export function setRequestContextParams(
|
|
|
267
419
|
ctx.params = params;
|
|
268
420
|
if (routeName !== undefined) {
|
|
269
421
|
ctx._routeName = routeName;
|
|
422
|
+
ctx.routeName = (
|
|
423
|
+
routeName && !isAutoGeneratedRouteName(routeName)
|
|
424
|
+
? routeName
|
|
425
|
+
: undefined
|
|
426
|
+
) as DefaultRouteName | undefined;
|
|
270
427
|
}
|
|
271
428
|
// Update reverse with scoped resolution now that route is known
|
|
272
|
-
ctx.reverse = createReverseFunction(
|
|
429
|
+
ctx.reverse = createReverseFunction(
|
|
430
|
+
getGlobalRouteMap(),
|
|
431
|
+
routeName,
|
|
432
|
+
params,
|
|
433
|
+
routeName ? isRouteRootScoped(routeName) : undefined,
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Store the previous route key on the request context.
|
|
440
|
+
* Called during partial-match context creation to make the navigation source
|
|
441
|
+
* route key available for revalidation and intercept evaluation.
|
|
442
|
+
* @internal
|
|
443
|
+
*/
|
|
444
|
+
export function setRequestContextPrevRouteKey(
|
|
445
|
+
prevRouteKey: string | undefined,
|
|
446
|
+
): void {
|
|
447
|
+
const ctx = requestContextStorage.getStore();
|
|
448
|
+
if (ctx && prevRouteKey !== undefined) {
|
|
449
|
+
ctx._prevRouteKey = prevRouteKey;
|
|
273
450
|
}
|
|
274
451
|
}
|
|
275
452
|
|
|
@@ -286,26 +463,15 @@ export function getLocationState(): LocationStateEntry[] | undefined {
|
|
|
286
463
|
|
|
287
464
|
/**
|
|
288
465
|
* Get the current request context, throwing if not available
|
|
289
|
-
* Use
|
|
466
|
+
* @deprecated Use getRequestContext() directly — it now throws if outside context
|
|
290
467
|
*/
|
|
291
|
-
export function requireRequestContext<
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
"Request context not available. This function must be called from within a server action " +
|
|
296
|
-
"executed through the RSC handler.",
|
|
297
|
-
);
|
|
298
|
-
}
|
|
299
|
-
return ctx;
|
|
468
|
+
export function requireRequestContext<
|
|
469
|
+
TEnv = DefaultEnv,
|
|
470
|
+
>(): RequestContext<TEnv> {
|
|
471
|
+
return getRequestContext<TEnv>();
|
|
300
472
|
}
|
|
301
473
|
|
|
302
|
-
|
|
303
|
-
* Cloudflare Workers ExecutionContext (subset we need)
|
|
304
|
-
*/
|
|
305
|
-
export interface ExecutionContext {
|
|
306
|
-
waitUntil(promise: Promise<any>): void;
|
|
307
|
-
passThroughOnException(): void;
|
|
308
|
-
}
|
|
474
|
+
export type { ExecutionContext };
|
|
309
475
|
|
|
310
476
|
/**
|
|
311
477
|
* Options for creating a request context
|
|
@@ -315,8 +481,15 @@ export interface CreateRequestContextOptions<TEnv> {
|
|
|
315
481
|
request: Request;
|
|
316
482
|
url: URL;
|
|
317
483
|
variables: Record<string, any>;
|
|
484
|
+
/** Optional initial response stub headers/status to seed effective cookie reads */
|
|
485
|
+
initialResponse?: Response;
|
|
318
486
|
/** Optional cache store for segment caching (used by CacheScope) */
|
|
319
487
|
cacheStore?: SegmentCacheStore;
|
|
488
|
+
/** Optional cache profiles for "use cache" resolution (per-router) */
|
|
489
|
+
cacheProfiles?: Record<
|
|
490
|
+
string,
|
|
491
|
+
import("../cache/profile-registry.js").CacheProfile
|
|
492
|
+
>;
|
|
320
493
|
/** Optional Cloudflare execution context for waitUntil support */
|
|
321
494
|
executionContext?: ExecutionContext;
|
|
322
495
|
/** Optional theme configuration (enables ctx.theme and ctx.setTheme) */
|
|
@@ -339,21 +512,30 @@ export function createRequestContext<TEnv>(
|
|
|
339
512
|
request,
|
|
340
513
|
url,
|
|
341
514
|
variables,
|
|
515
|
+
initialResponse,
|
|
342
516
|
cacheStore,
|
|
517
|
+
cacheProfiles,
|
|
343
518
|
executionContext,
|
|
344
519
|
themeConfig,
|
|
345
520
|
} = options;
|
|
346
521
|
const cookieHeader = request.headers.get("Cookie");
|
|
347
522
|
let parsedCookies: Record<string, string> | null = null;
|
|
348
523
|
|
|
349
|
-
// Create stub response for collecting headers/cookies
|
|
350
|
-
|
|
524
|
+
// Create stub response for collecting headers/cookies.
|
|
525
|
+
// All cookie/header mutations go here; cookie reads derive from it.
|
|
526
|
+
let stubResponse = initialResponse
|
|
527
|
+
? new Response(null, {
|
|
528
|
+
status: initialResponse.status,
|
|
529
|
+
statusText: initialResponse.statusText,
|
|
530
|
+
headers: new Headers(initialResponse.headers),
|
|
531
|
+
})
|
|
532
|
+
: new Response(null, { status: 200 });
|
|
351
533
|
|
|
352
534
|
// Create handle store and loader memoization for this request
|
|
353
535
|
const handleStore = createHandleStore();
|
|
354
536
|
const loaderPromises = new Map<string, Promise<any>>();
|
|
355
537
|
|
|
356
|
-
// Lazy parse cookies
|
|
538
|
+
// Lazy parse cookies from the original Cookie header
|
|
357
539
|
const getParsedCookies = (): Record<string, string> => {
|
|
358
540
|
if (!parsedCookies) {
|
|
359
541
|
parsedCookies = parseCookiesFromHeader(cookieHeader);
|
|
@@ -361,11 +543,47 @@ export function createRequestContext<TEnv>(
|
|
|
361
543
|
return parsedCookies;
|
|
362
544
|
};
|
|
363
545
|
|
|
546
|
+
// Cached response cookie mutations — invalidated on setCookie/deleteCookie/setTheme
|
|
547
|
+
let responseCookieCache: Map<string, string | null> | null = null;
|
|
548
|
+
const getResponseCookies = (): Map<string, string | null> => {
|
|
549
|
+
if (!responseCookieCache) {
|
|
550
|
+
responseCookieCache = parseResponseCookies(stubResponse);
|
|
551
|
+
}
|
|
552
|
+
return responseCookieCache;
|
|
553
|
+
};
|
|
554
|
+
const invalidateResponseCookieCache = () => {
|
|
555
|
+
responseCookieCache = null;
|
|
556
|
+
};
|
|
557
|
+
|
|
558
|
+
// Guard: throw if a response-level side effect is called inside a cache() scope.
|
|
559
|
+
// Uses ALS to detect the scope (set during segment resolution).
|
|
560
|
+
function assertNotInsideCacheScopeALS(methodName: string): void {
|
|
561
|
+
if (isInsideCacheScope()) {
|
|
562
|
+
throw new Error(
|
|
563
|
+
`ctx.${methodName}() cannot be called inside a cache() boundary. ` +
|
|
564
|
+
`On cache hit the handler is skipped, so this side effect would be lost. ` +
|
|
565
|
+
`Move ctx.${methodName}() to a middleware or layout outside the cache() scope.`,
|
|
566
|
+
);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// Effective cookie read: response stub Set-Cookie wins, then original header.
|
|
571
|
+
// The stub IS the source of truth for same-request mutations.
|
|
572
|
+
const effectiveCookie = (name: string): string | undefined => {
|
|
573
|
+
const mutations = getResponseCookies();
|
|
574
|
+
if (mutations.has(name)) {
|
|
575
|
+
const v = mutations.get(name);
|
|
576
|
+
return v === null ? undefined : v;
|
|
577
|
+
}
|
|
578
|
+
return getParsedCookies()[name];
|
|
579
|
+
};
|
|
580
|
+
|
|
364
581
|
// Theme helpers (only used when themeConfig is provided)
|
|
365
582
|
const getTheme = (): Theme | undefined => {
|
|
366
583
|
if (!themeConfig) return undefined;
|
|
367
584
|
|
|
368
|
-
|
|
585
|
+
// Use overlay-aware read so setTheme() in the same request is reflected
|
|
586
|
+
const stored = effectiveCookie(themeConfig.storageKey);
|
|
369
587
|
if (stored) {
|
|
370
588
|
// Validate stored value
|
|
371
589
|
if (stored === "system" && themeConfig.enableSystem) {
|
|
@@ -389,7 +607,7 @@ export function createRequestContext<TEnv>(
|
|
|
389
607
|
return;
|
|
390
608
|
}
|
|
391
609
|
|
|
392
|
-
//
|
|
610
|
+
// Write to stub — effectiveCookie() will pick it up on next read
|
|
393
611
|
stubResponse.headers.append(
|
|
394
612
|
"Set-Cookie",
|
|
395
613
|
serializeCookieValue(themeConfig.storageKey, theme, {
|
|
@@ -398,39 +616,77 @@ export function createRequestContext<TEnv>(
|
|
|
398
616
|
sameSite: THEME_COOKIE.sameSite,
|
|
399
617
|
}),
|
|
400
618
|
);
|
|
619
|
+
invalidateResponseCookieCache();
|
|
401
620
|
};
|
|
402
621
|
|
|
622
|
+
// Strip internal _rsc* params so userland sees a clean URL.
|
|
623
|
+
const cleanUrl = stripInternalParams(url);
|
|
624
|
+
|
|
403
625
|
// Build the context object first (without use), then add use
|
|
404
626
|
const ctx: RequestContext<TEnv> = {
|
|
405
627
|
env,
|
|
406
628
|
request,
|
|
407
|
-
url,
|
|
629
|
+
url: cleanUrl,
|
|
630
|
+
originalUrl: new URL(request.url),
|
|
408
631
|
pathname: url.pathname,
|
|
409
|
-
searchParams:
|
|
410
|
-
|
|
411
|
-
get: ((keyOrVar: any) =>
|
|
412
|
-
|
|
413
|
-
|
|
632
|
+
searchParams: cleanUrl.searchParams,
|
|
633
|
+
_variables: variables,
|
|
634
|
+
get: ((keyOrVar: any) => {
|
|
635
|
+
if (isNonCacheable(variables, keyOrVar) && isInsideCacheScope()) {
|
|
636
|
+
throw new Error(
|
|
637
|
+
`ctx.get() for a non-cacheable variable cannot be called inside a cache() boundary. ` +
|
|
638
|
+
`The variable was created with { cache: false } or set with { cache: false }, ` +
|
|
639
|
+
`and its value would be stale on cache hit. Move the read outside the cached scope.`,
|
|
640
|
+
);
|
|
641
|
+
}
|
|
642
|
+
return contextGet(variables, keyOrVar);
|
|
643
|
+
}) as RequestContext<TEnv>["get"],
|
|
644
|
+
set: ((keyOrVar: any, value: any, options?: any) => {
|
|
414
645
|
assertNotInsideCacheExec(ctx, "set");
|
|
415
|
-
contextSet(variables, keyOrVar, value);
|
|
646
|
+
contextSet(variables, keyOrVar, value, options);
|
|
416
647
|
}) as RequestContext<TEnv>["set"],
|
|
417
648
|
params: {} as Record<string, string>,
|
|
418
|
-
|
|
649
|
+
|
|
650
|
+
get res(): Response {
|
|
651
|
+
return stubResponse;
|
|
652
|
+
},
|
|
653
|
+
set res(_: Response) {
|
|
654
|
+
throw new Error(
|
|
655
|
+
"ctx.res is read-only. Use ctx.header() to set response headers, or cookies() for cookie mutations.",
|
|
656
|
+
);
|
|
657
|
+
},
|
|
419
658
|
|
|
420
659
|
cookie(name: string): string | undefined {
|
|
421
|
-
return
|
|
660
|
+
return effectiveCookie(name);
|
|
422
661
|
},
|
|
423
662
|
|
|
424
663
|
cookies(): Record<string, string> {
|
|
425
|
-
|
|
664
|
+
const parsed = getParsedCookies();
|
|
665
|
+
const mutations = getResponseCookies();
|
|
666
|
+
if (mutations.size === 0) return { ...parsed };
|
|
667
|
+
// Build result without delete (avoids V8 dictionary-mode de-opt)
|
|
668
|
+
const deleted = new Set<string>();
|
|
669
|
+
for (const [k, v] of mutations) {
|
|
670
|
+
if (v === null) deleted.add(k);
|
|
671
|
+
}
|
|
672
|
+
const result: Record<string, string> = {};
|
|
673
|
+
for (const key of Object.keys(parsed)) {
|
|
674
|
+
if (!deleted.has(key)) result[key] = parsed[key];
|
|
675
|
+
}
|
|
676
|
+
for (const [k, v] of mutations) {
|
|
677
|
+
if (v !== null) result[k] = v;
|
|
678
|
+
}
|
|
679
|
+
return result;
|
|
426
680
|
},
|
|
427
681
|
|
|
428
682
|
setCookie(name: string, value: string, options?: CookieOptions): void {
|
|
429
683
|
assertNotInsideCacheExec(ctx, "setCookie");
|
|
684
|
+
assertNotInsideCacheScopeALS("setCookie");
|
|
430
685
|
stubResponse.headers.append(
|
|
431
686
|
"Set-Cookie",
|
|
432
687
|
serializeCookieValue(name, value, options),
|
|
433
688
|
);
|
|
689
|
+
invalidateResponseCookieCache();
|
|
434
690
|
},
|
|
435
691
|
|
|
436
692
|
deleteCookie(
|
|
@@ -438,17 +694,36 @@ export function createRequestContext<TEnv>(
|
|
|
438
694
|
options?: Pick<CookieOptions, "domain" | "path">,
|
|
439
695
|
): void {
|
|
440
696
|
assertNotInsideCacheExec(ctx, "deleteCookie");
|
|
697
|
+
assertNotInsideCacheScopeALS("deleteCookie");
|
|
441
698
|
stubResponse.headers.append(
|
|
442
699
|
"Set-Cookie",
|
|
443
700
|
serializeCookieValue(name, "", { ...options, maxAge: 0 }),
|
|
444
701
|
);
|
|
702
|
+
invalidateResponseCookieCache();
|
|
445
703
|
},
|
|
446
704
|
|
|
447
705
|
header(name: string, value: string): void {
|
|
448
706
|
assertNotInsideCacheExec(ctx, "header");
|
|
707
|
+
assertNotInsideCacheScopeALS("header");
|
|
449
708
|
stubResponse.headers.set(name, value);
|
|
450
709
|
},
|
|
451
710
|
|
|
711
|
+
setStatus(status: number): void {
|
|
712
|
+
assertNotInsideCacheExec(ctx, "setStatus");
|
|
713
|
+
assertNotInsideCacheScopeALS("setStatus");
|
|
714
|
+
stubResponse = new Response(null, {
|
|
715
|
+
status,
|
|
716
|
+
headers: stubResponse.headers,
|
|
717
|
+
});
|
|
718
|
+
},
|
|
719
|
+
|
|
720
|
+
_setStatus(status: number): void {
|
|
721
|
+
stubResponse = new Response(null, {
|
|
722
|
+
status,
|
|
723
|
+
headers: stubResponse.headers,
|
|
724
|
+
});
|
|
725
|
+
},
|
|
726
|
+
|
|
452
727
|
// Placeholder - will be replaced below
|
|
453
728
|
use: null as any,
|
|
454
729
|
|
|
@@ -456,28 +731,30 @@ export function createRequestContext<TEnv>(
|
|
|
456
731
|
|
|
457
732
|
_handleStore: handleStore,
|
|
458
733
|
_cacheStore: cacheStore,
|
|
734
|
+
_cacheProfiles: cacheProfiles,
|
|
459
735
|
|
|
460
736
|
waitUntil(fn: () => Promise<void>): void {
|
|
461
737
|
if (executionContext?.waitUntil) {
|
|
462
|
-
// Cloudflare Workers: use native waitUntil
|
|
463
738
|
executionContext.waitUntil(fn());
|
|
464
739
|
} else {
|
|
465
|
-
|
|
466
|
-
fn().catch((err) =>
|
|
467
|
-
console.error("[waitUntil] Background task failed:", err),
|
|
468
|
-
);
|
|
740
|
+
fireAndForgetWaitUntil(fn);
|
|
469
741
|
}
|
|
470
742
|
},
|
|
471
743
|
|
|
744
|
+
executionContext,
|
|
745
|
+
|
|
472
746
|
_onResponseCallbacks: [],
|
|
473
747
|
|
|
474
748
|
onResponse(callback: (response: Response) => Response): void {
|
|
475
749
|
assertNotInsideCacheExec(ctx, "onResponse");
|
|
750
|
+
assertNotInsideCacheScopeALS("onResponse");
|
|
476
751
|
this._onResponseCallbacks.push(callback);
|
|
477
752
|
},
|
|
478
753
|
|
|
479
754
|
// Theme properties (only set when themeConfig is provided)
|
|
480
|
-
theme
|
|
755
|
+
get theme() {
|
|
756
|
+
return themeConfig ? getTheme() : undefined;
|
|
757
|
+
},
|
|
481
758
|
setTheme: themeConfig
|
|
482
759
|
? (theme: Theme) => {
|
|
483
760
|
assertNotInsideCacheExec(ctx, "setTheme");
|
|
@@ -486,17 +763,70 @@ export function createRequestContext<TEnv>(
|
|
|
486
763
|
: undefined,
|
|
487
764
|
_themeConfig: themeConfig,
|
|
488
765
|
|
|
489
|
-
setLocationState(entries: LocationStateEntry[]): void {
|
|
766
|
+
setLocationState(entries: LocationStateEntry | LocationStateEntry[]): void {
|
|
490
767
|
assertNotInsideCacheExec(ctx, "setLocationState");
|
|
768
|
+
const arr = Array.isArray(entries) ? entries : [entries];
|
|
491
769
|
this._locationState = this._locationState
|
|
492
|
-
? [...this._locationState, ...
|
|
493
|
-
:
|
|
770
|
+
? [...this._locationState, ...arr]
|
|
771
|
+
: arr;
|
|
494
772
|
},
|
|
495
773
|
_locationState: undefined,
|
|
496
774
|
|
|
775
|
+
_reportedErrors: new WeakSet<object>(),
|
|
776
|
+
_metricsStore: undefined,
|
|
777
|
+
|
|
778
|
+
// Render barrier: deferred promise resolved after non-loader segments settle.
|
|
779
|
+
_renderBarrier: null as any, // set below
|
|
780
|
+
_resolveRenderBarrier: null as any, // set below
|
|
781
|
+
_renderBarrierSegmentOrder: undefined,
|
|
782
|
+
|
|
497
783
|
reverse: createReverseFunction(getGlobalRouteMap(), undefined, {}),
|
|
498
784
|
};
|
|
499
785
|
|
|
786
|
+
// Lazy render barrier: only allocate the Promise when a loader actually
|
|
787
|
+
// calls rendered(). Requests that don't use rendered() pay zero cost.
|
|
788
|
+
let barrierResolved = false;
|
|
789
|
+
let resolveBarrier: (() => void) | undefined;
|
|
790
|
+
ctx._renderBarrier = null as any; // lazy — created on first access
|
|
791
|
+
ctx._resolveRenderBarrier = (
|
|
792
|
+
segments: Array<{ type: string; id: string }>,
|
|
793
|
+
) => {
|
|
794
|
+
if (barrierResolved) return;
|
|
795
|
+
barrierResolved = true;
|
|
796
|
+
const segOrder = segments
|
|
797
|
+
.filter((s) => s.type !== "loader")
|
|
798
|
+
.map((s) => s.id);
|
|
799
|
+
ctx._renderBarrierSegmentOrder = segOrder;
|
|
800
|
+
// Build and cache handle snapshot so loader ctx.use(handle) calls
|
|
801
|
+
// don't rebuild it on every invocation.
|
|
802
|
+
ctx._renderBarrierHandleSnapshot = buildHandleSnapshot(
|
|
803
|
+
handleStore,
|
|
804
|
+
segOrder,
|
|
805
|
+
);
|
|
806
|
+
ctx._renderBarrierWaiters = undefined;
|
|
807
|
+
ctx._handlerLoaderDeps = undefined;
|
|
808
|
+
if (resolveBarrier) resolveBarrier();
|
|
809
|
+
};
|
|
810
|
+
Object.defineProperty(ctx, "_renderBarrier", {
|
|
811
|
+
get() {
|
|
812
|
+
// Barrier already resolved (cache/prerender hit) or first lazy access.
|
|
813
|
+
// Either way, replace the getter with a concrete value to avoid
|
|
814
|
+
// repeated Promise.resolve() allocations on subsequent reads.
|
|
815
|
+
const p = barrierResolved
|
|
816
|
+
? Promise.resolve()
|
|
817
|
+
: new Promise<void>((resolve) => {
|
|
818
|
+
resolveBarrier = resolve;
|
|
819
|
+
});
|
|
820
|
+
Object.defineProperty(ctx, "_renderBarrier", {
|
|
821
|
+
value: p,
|
|
822
|
+
writable: false,
|
|
823
|
+
configurable: false,
|
|
824
|
+
});
|
|
825
|
+
return p;
|
|
826
|
+
},
|
|
827
|
+
configurable: true,
|
|
828
|
+
});
|
|
829
|
+
|
|
500
830
|
// Now create use() with access to ctx
|
|
501
831
|
ctx.use = createUseFunction({
|
|
502
832
|
handleStore,
|
|
@@ -509,6 +839,43 @@ export function createRequestContext<TEnv>(
|
|
|
509
839
|
return ctx;
|
|
510
840
|
}
|
|
511
841
|
|
|
842
|
+
/**
|
|
843
|
+
* Parse Set-Cookie headers from a response into effective cookie state.
|
|
844
|
+
* Returns a map of cookie name -> value (string) or name -> null (deleted).
|
|
845
|
+
* Last-write-wins: later Set-Cookie entries for the same name overwrite earlier ones.
|
|
846
|
+
* Max-Age=0 is treated as a delete.
|
|
847
|
+
*/
|
|
848
|
+
const MAX_AGE_ZERO_RE = /;\s*Max-Age\s*=\s*0/i;
|
|
849
|
+
|
|
850
|
+
function parseResponseCookies(response: Response): Map<string, string | null> {
|
|
851
|
+
const result = new Map<string, string | null>();
|
|
852
|
+
const setCookies = response.headers.getSetCookie();
|
|
853
|
+
|
|
854
|
+
for (const header of setCookies) {
|
|
855
|
+
// First segment before ';' is the name=value pair
|
|
856
|
+
const semiIdx = header.indexOf(";");
|
|
857
|
+
const pair = semiIdx === -1 ? header : header.substring(0, semiIdx);
|
|
858
|
+
const eqIdx = pair.indexOf("=");
|
|
859
|
+
if (eqIdx === -1) continue;
|
|
860
|
+
|
|
861
|
+
let name: string;
|
|
862
|
+
let value: string;
|
|
863
|
+
try {
|
|
864
|
+
name = decodeURIComponent(pair.substring(0, eqIdx).trim());
|
|
865
|
+
value = decodeURIComponent(pair.substring(eqIdx + 1).trim());
|
|
866
|
+
} catch {
|
|
867
|
+
// Malformed encoding — skip this entry
|
|
868
|
+
continue;
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
// Max-Age=0 means the cookie is being deleted
|
|
872
|
+
const isDeleted = MAX_AGE_ZERO_RE.test(header);
|
|
873
|
+
result.set(name, isDeleted ? null : value);
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
return result;
|
|
877
|
+
}
|
|
878
|
+
|
|
512
879
|
/**
|
|
513
880
|
* Parse cookies from Cookie header
|
|
514
881
|
*/
|
|
@@ -635,37 +1002,40 @@ export function createUseFunction<TEnv>(
|
|
|
635
1002
|
// Create loader context with recursive use() support
|
|
636
1003
|
const loaderCtx: LoaderContext<Record<string, string | undefined>, TEnv> = {
|
|
637
1004
|
params: ctx.params,
|
|
1005
|
+
routeParams: (ctx.params ?? {}) as Record<string, string>,
|
|
638
1006
|
request: ctx.request,
|
|
639
1007
|
searchParams: ctx.searchParams,
|
|
640
1008
|
search: (ctx as any).search ?? {},
|
|
641
1009
|
pathname: ctx.pathname,
|
|
642
1010
|
url: ctx.url,
|
|
1011
|
+
originalUrl: ctx.originalUrl,
|
|
643
1012
|
env: ctx.env as any,
|
|
644
|
-
|
|
1013
|
+
waitUntil: ctx.waitUntil.bind(ctx),
|
|
1014
|
+
executionContext: ctx.executionContext,
|
|
645
1015
|
get: ctx.get as any,
|
|
646
|
-
|
|
647
|
-
return ctx.cookie(name);
|
|
648
|
-
},
|
|
649
|
-
cookies() {
|
|
650
|
-
return ctx.cookies();
|
|
651
|
-
},
|
|
652
|
-
use: <TDep, TDepParams = any>(
|
|
1016
|
+
use: (<TDep, TDepParams = any>(
|
|
653
1017
|
dep: LoaderDefinition<TDep, TDepParams>,
|
|
654
1018
|
): Promise<TDep> => {
|
|
655
1019
|
// Recursive call - will start dep loader if not already started
|
|
656
1020
|
return ctx.use(dep);
|
|
657
|
-
},
|
|
1021
|
+
}) as LoaderContext["use"],
|
|
658
1022
|
method: "GET",
|
|
659
1023
|
body: undefined,
|
|
660
1024
|
reverse: createReverseFunction(
|
|
661
1025
|
getGlobalRouteMap(),
|
|
662
1026
|
ctx._routeName,
|
|
663
1027
|
ctx.params as Record<string, string>,
|
|
1028
|
+
ctx._routeName ? isRouteRootScoped(ctx._routeName) : undefined,
|
|
664
1029
|
),
|
|
1030
|
+
rendered: () => {
|
|
1031
|
+
throw new Error(
|
|
1032
|
+
`ctx.rendered() is only available in DSL loaders (registered via loader() in urls()). ` +
|
|
1033
|
+
`It cannot be used from request-context loaders or server actions.`,
|
|
1034
|
+
);
|
|
1035
|
+
},
|
|
665
1036
|
};
|
|
666
1037
|
|
|
667
|
-
|
|
668
|
-
const doneLoader = track(`loader:${loader.$$id}`);
|
|
1038
|
+
const doneLoader = track(`loader:${loader.$$id}`, 2);
|
|
669
1039
|
const promise = Promise.resolve(loaderFn(loaderCtx)).finally(() => {
|
|
670
1040
|
doneLoader();
|
|
671
1041
|
});
|