@rangojs/router 0.0.0-experimental.12 → 0.0.0-experimental.120
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -0
- package/README.md +1037 -4
- 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 +1704 -212
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/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/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 +5994 -2763
- 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/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +64 -54
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +484 -0
- package/skills/caching/SKILL.md +202 -24
- package/skills/composability/SKILL.md +197 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +87 -62
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +537 -70
- package/skills/host-router/SKILL.md +264 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +173 -8
- package/skills/layout/SKILL.md +123 -5
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +600 -54
- package/skills/middleware/SKILL.md +211 -37
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +41 -10
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +271 -3
- package/skills/prerender/SKILL.md +413 -52
- package/skills/rango/SKILL.md +301 -21
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +248 -120
- package/skills/route/SKILL.md +279 -21
- package/skills/router-setup/SKILL.md +211 -33
- package/skills/server-actions/SKILL.md +751 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +547 -107
- package/skills/use-cache/SKILL.md +353 -0
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +172 -128
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +309 -562
- package/src/browser/navigation-client.ts +206 -75
- package/src/browser/navigation-store.ts +80 -63
- package/src/browser/navigation-transaction.ts +279 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +355 -314
- package/src/browser/prefetch/cache.ts +363 -0
- package/src/browser/prefetch/fetch.ts +350 -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 +136 -0
- package/src/browser/react/Link.tsx +255 -71
- package/src/browser/react/NavigationProvider.tsx +153 -33
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +55 -0
- package/src/browser/react/index.ts +15 -12
- package/src/browser/react/location-state-shared.ts +269 -56
- package/src/browser/react/location-state.ts +90 -19
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +41 -123
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +44 -65
- package/src/browser/react/use-params.ts +77 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +97 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +85 -99
- package/src/browser/response-adapter.ts +124 -0
- package/src/browser/rsc-router.tsx +275 -72
- package/src/browser/scroll-restoration.ts +132 -49
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +508 -610
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +149 -48
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +123 -56
- package/src/build/generate-route-types.ts +41 -1029
- package/src/build/index.ts +4 -0
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +127 -31
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +131 -0
- package/src/build/route-types/router-processing.ts +659 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +220 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +354 -0
- package/src/cache/cache-scope.ts +170 -308
- package/src/cache/cf/cf-cache-store.ts +696 -30
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +144 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +192 -13
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +78 -124
- package/src/client.rsc.tsx +6 -1
- package/src/client.tsx +117 -322
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +156 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +36 -0
- package/src/errors.ts +106 -10
- package/src/handle.ts +54 -11
- package/src/handles/MetaTags.tsx +73 -20
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +30 -13
- package/src/host/cookie-handler.ts +21 -15
- package/src/host/errors.ts +8 -8
- package/src/host/index.ts +6 -9
- package/src/host/pattern-matcher.ts +27 -27
- package/src/host/router.ts +176 -82
- package/src/host/testing.ts +8 -8
- package/src/host/types.ts +46 -9
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +196 -57
- package/src/index.rsc.ts +112 -42
- package/src/index.ts +178 -74
- package/src/internal-debug.ts +9 -3
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +15 -93
- package/src/loader.ts +20 -10
- package/src/missing-id-error.ts +68 -0
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +4 -2
- package/src/prerender/store.ts +125 -18
- package/src/prerender.ts +389 -23
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +13 -32
- package/src/route-definition/dsl-helpers.ts +1109 -0
- package/src/route-definition/helper-factories.ts +90 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +101 -0
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-definition.ts +1 -1450
- package/src/route-map-builder.ts +87 -133
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +72 -41
- package/src/router/content-negotiation.ts +228 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +10 -10
- package/src/router/find-match.ts +208 -0
- package/src/router/handler-context.ts +372 -125
- package/src/router/intercept-resolution.ts +24 -26
- package/src/router/lazy-includes.ts +256 -0
- package/src/router/loader-resolution.ts +367 -140
- package/src/router/logging.ts +112 -6
- package/src/router/manifest.ts +89 -28
- package/src/router/match-api.ts +175 -238
- package/src/router/match-context.ts +4 -2
- package/src/router/match-handlers.ts +441 -0
- package/src/router/match-middleware/background-revalidation.ts +97 -89
- package/src/router/match-middleware/cache-lookup.ts +289 -54
- package/src/router/match-middleware/cache-store.ts +78 -17
- package/src/router/match-middleware/intercept-resolution.ts +45 -22
- package/src/router/match-middleware/segment-resolution.ts +73 -9
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +146 -24
- package/src/router/metrics.ts +241 -16
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +209 -0
- package/src/router/middleware.ts +354 -384
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +279 -44
- package/src/router/prerender-match.ts +527 -0
- package/src/router/preview-match.ts +100 -0
- package/src/router/request-classification.ts +313 -0
- package/src/router/revalidation.ts +163 -16
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +41 -21
- package/src/router/router-interfaces.ts +500 -0
- package/src/router/router-options.ts +642 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +769 -0
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1420 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/segment-resolution.ts +21 -1354
- package/src/router/segment-wrappers.ts +291 -0
- package/src/router/substitute-pattern-params.ts +56 -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 +133 -42
- package/src/router/types.ts +24 -9
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +710 -2373
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +821 -1128
- package/src/rsc/helpers.ts +182 -19
- package/src/rsc/index.ts +1 -21
- package/src/rsc/loader-fetch.ts +229 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +161 -0
- package/src/rsc/progressive-enhancement.ts +395 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +362 -0
- package/src/rsc/rsc-rendering.ts +240 -0
- package/src/rsc/runtime-warnings.ts +41 -0
- package/src/rsc/server-action.ts +350 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/types.ts +52 -11
- package/src/search-params.ts +70 -58
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +237 -73
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +439 -85
- package/src/server/cookie-store.ts +214 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +113 -15
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +640 -107
- package/src/server.ts +26 -164
- package/src/ssr/index.tsx +107 -30
- package/src/static-handler.ts +39 -9
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +5 -2
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +4 -30
- package/src/theme/theme-script.ts +21 -18
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +809 -0
- package/src/types/index.ts +89 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +120 -0
- package/src/types/segments.ts +184 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +164 -0
- package/src/urls/index.ts +49 -0
- package/src/urls/path-helper-types.ts +386 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +124 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +291 -0
- package/src/urls/urls-function.ts +94 -0
- package/src/urls.ts +1 -1323
- package/src/use-loader.tsx +559 -108
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +379 -0
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +480 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/state.ts +150 -0
- package/src/vite/discovery/virtual-module-codegen.ts +193 -0
- package/src/vite/index.ts +17 -2261
- package/src/vite/plugin-types.ts +170 -0
- package/src/vite/plugins/cjs-to-esm.ts +94 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +128 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +109 -60
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +32 -51
- package/src/vite/plugins/expose-ids/export-analysis.ts +376 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +156 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +72 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +796 -0
- package/src/vite/plugins/performance-tracks.ts +92 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +338 -0
- package/src/vite/plugins/version-injector.ts +99 -0
- package/src/vite/plugins/version-plugin.ts +323 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +549 -0
- package/src/vite/router-discovery.ts +1567 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +194 -22
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +139 -0
- package/src/vite/utils/client-chunks.ts +190 -0
- package/src/vite/utils/forward-user-plugins.ts +193 -0
- package/src/vite/utils/manifest-utils.ts +19 -0
- package/src/vite/utils/package-resolution.ts +161 -0
- package/src/vite/utils/prerender-utils.ts +222 -0
- package/src/vite/utils/shared-utils.ts +251 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -13,14 +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 {
|
|
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";
|
|
18
35
|
import { isHandle } from "../handle.js";
|
|
19
|
-
import { track } from "./context.js";
|
|
36
|
+
import { track, type MetricsStore } from "./context.js";
|
|
20
37
|
import { getFetchableLoader } from "./fetchable-loader-store.js";
|
|
21
38
|
import type { SegmentCacheStore } from "../cache/types.js";
|
|
22
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";
|
|
23
42
|
import { THEME_COOKIE } from "../theme/constants.js";
|
|
43
|
+
import type { LocationStateEntry } from "../browser/react/location-state-shared.js";
|
|
44
|
+
import { NOCACHE_SYMBOL, assertNotInsideCacheExec } from "../cache/taint.js";
|
|
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";
|
|
24
53
|
|
|
25
54
|
/**
|
|
26
55
|
* Unified request context available via getRequestContext()
|
|
@@ -29,46 +58,50 @@ import { THEME_COOKIE } from "../theme/constants.js";
|
|
|
29
58
|
* Use this when you need access to request data outside of route handlers.
|
|
30
59
|
*/
|
|
31
60
|
export interface RequestContext<
|
|
32
|
-
TEnv =
|
|
61
|
+
TEnv = DefaultEnv,
|
|
33
62
|
TParams = Record<string, string>,
|
|
34
|
-
> {
|
|
35
|
-
/**
|
|
36
|
-
|
|
37
|
-
/** Original HTTP request */
|
|
38
|
-
request: Request;
|
|
39
|
-
/** Parsed URL (system params like _rsc* are NOT filtered here) */
|
|
40
|
-
url: URL;
|
|
41
|
-
/** URL pathname */
|
|
42
|
-
pathname: string;
|
|
43
|
-
/** URL search params (system params like _rsc* are NOT filtered here) */
|
|
44
|
-
searchParams: URLSearchParams;
|
|
45
|
-
/** Variables set by middleware (same as ctx.var) */
|
|
46
|
-
var: Record<string, any>;
|
|
63
|
+
> extends RequestScope<TEnv> {
|
|
64
|
+
/** @internal Shared variable backing store for ctx.get()/ctx.set(). */
|
|
65
|
+
_variables: Record<string, any>;
|
|
47
66
|
/** Get a variable set by middleware */
|
|
48
|
-
get:
|
|
67
|
+
get: {
|
|
68
|
+
<T>(contextVar: ContextVar<T>): T | undefined;
|
|
69
|
+
<K extends string>(key: K): any;
|
|
70
|
+
};
|
|
49
71
|
/** Set a variable (shared with middleware and handlers) */
|
|
50
|
-
set:
|
|
72
|
+
set: {
|
|
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;
|
|
79
|
+
};
|
|
51
80
|
/**
|
|
52
81
|
* Route params (populated after route matching)
|
|
53
82
|
* Initially empty, then set to matched params
|
|
54
83
|
*/
|
|
55
84
|
params: TParams;
|
|
56
|
-
/**
|
|
57
|
-
|
|
58
|
-
* Headers set here are merged into the final response
|
|
59
|
-
*/
|
|
60
|
-
res: Response;
|
|
85
|
+
/** @internal Stub response for collecting headers/cookies. Use ctx.headers or ctx.header() instead. */
|
|
86
|
+
readonly res: Response;
|
|
61
87
|
|
|
62
|
-
/** Get a cookie value
|
|
88
|
+
/** @internal Get a cookie value (effective: request + response mutations). Use cookies().get() instead. */
|
|
63
89
|
cookie(name: string): string | undefined;
|
|
64
|
-
/** Get all cookies
|
|
90
|
+
/** @internal Get all cookies (effective merged view). Use cookies().getAll() instead. */
|
|
65
91
|
cookies(): Record<string, string>;
|
|
66
|
-
/** Set a cookie on the response */
|
|
92
|
+
/** @internal Set a cookie on the response. Use cookies().set() instead. */
|
|
67
93
|
setCookie(name: string, value: string, options?: CookieOptions): void;
|
|
68
|
-
/** Delete a cookie */
|
|
69
|
-
deleteCookie(
|
|
94
|
+
/** @internal Delete a cookie. Use cookies().delete() instead. */
|
|
95
|
+
deleteCookie(
|
|
96
|
+
name: string,
|
|
97
|
+
options?: Pick<CookieOptions, "domain" | "path">,
|
|
98
|
+
): void;
|
|
70
99
|
/** Set a response header */
|
|
71
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;
|
|
72
105
|
|
|
73
106
|
/**
|
|
74
107
|
* Access loader data or push handle data.
|
|
@@ -90,10 +123,12 @@ export interface RequestContext<
|
|
|
90
123
|
* ```
|
|
91
124
|
*/
|
|
92
125
|
use: {
|
|
93
|
-
<T, TLoaderParams = any>(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
126
|
+
<T, TLoaderParams = any>(
|
|
127
|
+
loader: LoaderDefinition<T, TLoaderParams>,
|
|
128
|
+
): Promise<T>;
|
|
129
|
+
<TData, TAccumulated = TData[]>(
|
|
130
|
+
handle: Handle<TData, TAccumulated>,
|
|
131
|
+
): (data: TData | Promise<TData> | (() => Promise<TData>)) => void;
|
|
97
132
|
};
|
|
98
133
|
|
|
99
134
|
/** HTTP method (GET, POST, PUT, PATCH, DELETE, etc.) */
|
|
@@ -105,19 +140,11 @@ export interface RequestContext<
|
|
|
105
140
|
/** @internal Cache store for segment caching (optional, used by CacheScope) */
|
|
106
141
|
_cacheStore?: SegmentCacheStore;
|
|
107
142
|
|
|
108
|
-
/**
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
* @example
|
|
114
|
-
* ```typescript
|
|
115
|
-
* ctx.waitUntil(async () => {
|
|
116
|
-
* await cacheStore.set(key, data, ttl);
|
|
117
|
-
* });
|
|
118
|
-
* ```
|
|
119
|
-
*/
|
|
120
|
-
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
|
+
>;
|
|
121
148
|
|
|
122
149
|
/**
|
|
123
150
|
* Register a callback to run when the response is created.
|
|
@@ -178,8 +205,181 @@ export interface RequestContext<
|
|
|
178
205
|
|
|
179
206
|
/** @internal Theme configuration (null if theme not enabled) */
|
|
180
207
|
_themeConfig?: ResolvedThemeConfig | null;
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Attach location state entries to the current response.
|
|
211
|
+
*
|
|
212
|
+
* For partial (SPA) requests, the state is included in the RSC payload
|
|
213
|
+
* metadata and merged into history.pushState on the client. For redirect
|
|
214
|
+
* responses, the state travels through the redirect payload so the target
|
|
215
|
+
* page can read it via useLocationState.
|
|
216
|
+
*
|
|
217
|
+
* Multiple calls accumulate entries.
|
|
218
|
+
*
|
|
219
|
+
* @example
|
|
220
|
+
* ```typescript
|
|
221
|
+
* ctx.setLocationState(Flash({ text: "Item saved!" }));
|
|
222
|
+
* ```
|
|
223
|
+
*/
|
|
224
|
+
setLocationState(entries: LocationStateEntry | LocationStateEntry[]): void;
|
|
225
|
+
|
|
226
|
+
/** @internal Accumulated location state entries */
|
|
227
|
+
_locationState?: LocationStateEntry[];
|
|
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
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Generate URLs from route names.
|
|
238
|
+
* Uses the global route map. After route matching, scoped (`.name`) resolution
|
|
239
|
+
* works within the matched include() scope.
|
|
240
|
+
*/
|
|
241
|
+
reverse: ScopedReverseFunction<
|
|
242
|
+
Record<string, string>,
|
|
243
|
+
DefaultReverseRouteMap
|
|
244
|
+
>;
|
|
245
|
+
|
|
246
|
+
/** @internal Route name from route matching, used for scoped reverse resolution */
|
|
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). On a streaming tree rendered() waits for the streaming
|
|
277
|
+
* handlers to settle (via handleStore.settled) before resolving, and the
|
|
278
|
+
* deadlock guard state is kept live until that wait completes.
|
|
279
|
+
*/
|
|
280
|
+
_treeHasStreaming?: boolean;
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* @internal Loader IDs that have called rendered() and are waiting for the
|
|
284
|
+
* barrier. Used to detect deadlocks when a handler tries to await the same
|
|
285
|
+
* loader via ctx.use(Loader).
|
|
286
|
+
*/
|
|
287
|
+
_renderBarrierWaiters?: Set<string>;
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* @internal Loader IDs that handlers have started awaiting via ctx.use().
|
|
291
|
+
* Used for bidirectional deadlock detection: if a loader later calls
|
|
292
|
+
* rendered() and a handler already awaits it, we can detect the deadlock.
|
|
293
|
+
*/
|
|
294
|
+
_handlerLoaderDeps?: Set<string>;
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* @internal Cached HandleData snapshot built at barrier resolution time.
|
|
298
|
+
* Avoids rebuilding the snapshot on every loader ctx.use(handle) call.
|
|
299
|
+
*/
|
|
300
|
+
_renderBarrierHandleSnapshot?: HandleData;
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* @internal The deadlock guard window is closed (no further handler-awaits-
|
|
304
|
+
* loader cycle is possible). For non-streaming trees this is set when the
|
|
305
|
+
* barrier resolves. For streaming trees the window stays open until
|
|
306
|
+
* handleStore.settled — rendered() keeps waiting past the barrier and a
|
|
307
|
+
* loading() handler can still resume and await a still-waiting loader — so it
|
|
308
|
+
* is set only after settled. The guard (loader-resolution `setupLoaderAccess`)
|
|
309
|
+
* reads this instead of `_renderBarrierSegmentOrder` so it does not go blind
|
|
310
|
+
* during the streaming settle wait.
|
|
311
|
+
*/
|
|
312
|
+
_renderBarrierGuardClosed?: boolean;
|
|
313
|
+
|
|
314
|
+
/** @internal Per-request error dedup set for onError reporting */
|
|
315
|
+
_reportedErrors: WeakSet<object>;
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* @internal Report a non-fatal background error through the router's
|
|
319
|
+
* onError callback. Wired by the RSC handler / router during request
|
|
320
|
+
* creation. Cache-runtime and other subsystems call this to surface
|
|
321
|
+
* errors without failing the response.
|
|
322
|
+
*/
|
|
323
|
+
_reportBackgroundError?: (error: unknown, category: string) => void;
|
|
324
|
+
|
|
325
|
+
/** @internal Per-request debug performance override (set via ctx.debugPerformance()) */
|
|
326
|
+
_debugPerformance?: boolean;
|
|
327
|
+
|
|
328
|
+
/** @internal Request-scoped performance metrics store */
|
|
329
|
+
_metricsStore?: MetricsStore;
|
|
330
|
+
|
|
331
|
+
/** @internal Router basename for this request (used by redirect()) */
|
|
332
|
+
_basename?: string;
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* @internal RouteSnapshot from classifyRequest, reused by match/matchPartial
|
|
336
|
+
* to avoid a second resolveRoute call. Cleared on HMR invalidation.
|
|
337
|
+
*/
|
|
338
|
+
_classifiedRoute?: import("../router/route-snapshot.js").RouteSnapshot;
|
|
181
339
|
}
|
|
182
340
|
|
|
341
|
+
/**
|
|
342
|
+
* Public view of RequestContext, without internal methods and fields.
|
|
343
|
+
*
|
|
344
|
+
* This is the type exported to library consumers. Internal code should
|
|
345
|
+
* use the full RequestContext interface directly.
|
|
346
|
+
*/
|
|
347
|
+
export type PublicRequestContext<
|
|
348
|
+
TEnv = DefaultEnv,
|
|
349
|
+
TParams = Record<string, string>,
|
|
350
|
+
> = Omit<
|
|
351
|
+
RequestContext<TEnv, TParams>,
|
|
352
|
+
| "cookie"
|
|
353
|
+
| "cookies"
|
|
354
|
+
| "setCookie"
|
|
355
|
+
| "deleteCookie"
|
|
356
|
+
| "_handleStore"
|
|
357
|
+
| "_cacheStore"
|
|
358
|
+
| "_cacheProfiles"
|
|
359
|
+
| "_onResponseCallbacks"
|
|
360
|
+
| "_themeConfig"
|
|
361
|
+
| "_locationState"
|
|
362
|
+
| "_routeName"
|
|
363
|
+
| "_prevRouteKey"
|
|
364
|
+
| "_reportedErrors"
|
|
365
|
+
| "_renderBarrier"
|
|
366
|
+
| "_resolveRenderBarrier"
|
|
367
|
+
| "_renderBarrierSegmentOrder"
|
|
368
|
+
| "_treeHasStreaming"
|
|
369
|
+
| "_renderBarrierWaiters"
|
|
370
|
+
| "_handlerLoaderDeps"
|
|
371
|
+
| "_renderBarrierHandleSnapshot"
|
|
372
|
+
| "_renderBarrierGuardClosed"
|
|
373
|
+
| "_reportBackgroundError"
|
|
374
|
+
| "_debugPerformance"
|
|
375
|
+
| "_metricsStore"
|
|
376
|
+
| "_basename"
|
|
377
|
+
| "_setStatus"
|
|
378
|
+
| "_variables"
|
|
379
|
+
| "_classifiedRoute"
|
|
380
|
+
| "res"
|
|
381
|
+
>;
|
|
382
|
+
|
|
183
383
|
// AsyncLocalStorage instance for request context
|
|
184
384
|
const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
|
|
185
385
|
|
|
@@ -189,16 +389,33 @@ const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
|
|
|
189
389
|
*/
|
|
190
390
|
export function runWithRequestContext<TEnv, T>(
|
|
191
391
|
context: RequestContext<TEnv>,
|
|
192
|
-
fn: () => T
|
|
392
|
+
fn: () => T,
|
|
193
393
|
): T {
|
|
194
394
|
return requestContextStorage.run(context, fn);
|
|
195
395
|
}
|
|
196
396
|
|
|
197
397
|
/**
|
|
198
398
|
* Get the current request context
|
|
199
|
-
*
|
|
399
|
+
* Throws if called outside of a request context
|
|
200
400
|
*/
|
|
201
|
-
export function getRequestContext<TEnv =
|
|
401
|
+
export function getRequestContext<TEnv = DefaultEnv>(): RequestContext<TEnv> {
|
|
402
|
+
const ctx = requestContextStorage.getStore() as
|
|
403
|
+
| RequestContext<TEnv>
|
|
404
|
+
| undefined;
|
|
405
|
+
invariant(
|
|
406
|
+
ctx,
|
|
407
|
+
"getRequestContext() called outside of a request context. " +
|
|
408
|
+
"This function must be called from within a route handler, loader, middleware, " +
|
|
409
|
+
"server action, or server component.",
|
|
410
|
+
);
|
|
411
|
+
return ctx;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* @internal Get the request context without throwing — for internal code that
|
|
416
|
+
* may run outside a request context (cache stores, optional handle lookups, etc.)
|
|
417
|
+
*/
|
|
418
|
+
export function _getRequestContext<TEnv = DefaultEnv>():
|
|
202
419
|
| RequestContext<TEnv>
|
|
203
420
|
| undefined {
|
|
204
421
|
return requestContextStorage.getStore() as RequestContext<TEnv> | undefined;
|
|
@@ -206,38 +423,71 @@ export function getRequestContext<TEnv = unknown>():
|
|
|
206
423
|
|
|
207
424
|
/**
|
|
208
425
|
* Update params on the current request context
|
|
209
|
-
* Called after route matching to populate route params
|
|
426
|
+
* Called after route matching to populate route params and route name
|
|
210
427
|
*/
|
|
211
|
-
export function setRequestContextParams(
|
|
428
|
+
export function setRequestContextParams(
|
|
429
|
+
params: Record<string, string>,
|
|
430
|
+
routeName?: string,
|
|
431
|
+
): void {
|
|
212
432
|
const ctx = requestContextStorage.getStore();
|
|
213
433
|
if (ctx) {
|
|
214
434
|
ctx.params = params;
|
|
435
|
+
if (routeName !== undefined) {
|
|
436
|
+
ctx._routeName = routeName;
|
|
437
|
+
ctx.routeName = (
|
|
438
|
+
routeName && !isAutoGeneratedRouteName(routeName)
|
|
439
|
+
? routeName
|
|
440
|
+
: undefined
|
|
441
|
+
) as DefaultRouteName | undefined;
|
|
442
|
+
}
|
|
443
|
+
// Update reverse with scoped resolution now that route is known
|
|
444
|
+
ctx.reverse = createReverseFunction(
|
|
445
|
+
getGlobalRouteMap(),
|
|
446
|
+
routeName,
|
|
447
|
+
params,
|
|
448
|
+
routeName ? isRouteRootScoped(routeName) : undefined,
|
|
449
|
+
);
|
|
215
450
|
}
|
|
216
451
|
}
|
|
217
452
|
|
|
218
453
|
/**
|
|
219
|
-
*
|
|
220
|
-
*
|
|
454
|
+
* Store the previous route key on the request context.
|
|
455
|
+
* Called during partial-match context creation to make the navigation source
|
|
456
|
+
* route key available for revalidation and intercept evaluation.
|
|
457
|
+
* @internal
|
|
221
458
|
*/
|
|
222
|
-
export function
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
);
|
|
459
|
+
export function setRequestContextPrevRouteKey(
|
|
460
|
+
prevRouteKey: string | undefined,
|
|
461
|
+
): void {
|
|
462
|
+
const ctx = requestContextStorage.getStore();
|
|
463
|
+
if (ctx && prevRouteKey !== undefined) {
|
|
464
|
+
ctx._prevRouteKey = prevRouteKey;
|
|
229
465
|
}
|
|
230
|
-
return ctx;
|
|
231
466
|
}
|
|
232
467
|
|
|
233
468
|
/**
|
|
234
|
-
*
|
|
469
|
+
* Get accumulated location state entries from the current request context.
|
|
470
|
+
* Returns undefined if no state has been set.
|
|
471
|
+
*
|
|
472
|
+
* @internal Used by the RSC handler to include state in payload metadata.
|
|
235
473
|
*/
|
|
236
|
-
export
|
|
237
|
-
|
|
238
|
-
|
|
474
|
+
export function getLocationState(): LocationStateEntry[] | undefined {
|
|
475
|
+
const ctx = getRequestContext();
|
|
476
|
+
return ctx?._locationState;
|
|
239
477
|
}
|
|
240
478
|
|
|
479
|
+
/**
|
|
480
|
+
* Get the current request context, throwing if not available
|
|
481
|
+
* @deprecated Use getRequestContext() directly — it now throws if outside context
|
|
482
|
+
*/
|
|
483
|
+
export function requireRequestContext<
|
|
484
|
+
TEnv = DefaultEnv,
|
|
485
|
+
>(): RequestContext<TEnv> {
|
|
486
|
+
return getRequestContext<TEnv>();
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
export type { ExecutionContext };
|
|
490
|
+
|
|
241
491
|
/**
|
|
242
492
|
* Options for creating a request context
|
|
243
493
|
*/
|
|
@@ -246,8 +496,15 @@ export interface CreateRequestContextOptions<TEnv> {
|
|
|
246
496
|
request: Request;
|
|
247
497
|
url: URL;
|
|
248
498
|
variables: Record<string, any>;
|
|
499
|
+
/** Optional initial response stub headers/status to seed effective cookie reads */
|
|
500
|
+
initialResponse?: Response;
|
|
249
501
|
/** Optional cache store for segment caching (used by CacheScope) */
|
|
250
502
|
cacheStore?: SegmentCacheStore;
|
|
503
|
+
/** Optional cache profiles for "use cache" resolution (per-router) */
|
|
504
|
+
cacheProfiles?: Record<
|
|
505
|
+
string,
|
|
506
|
+
import("../cache/profile-registry.js").CacheProfile
|
|
507
|
+
>;
|
|
251
508
|
/** Optional Cloudflare execution context for waitUntil support */
|
|
252
509
|
executionContext?: ExecutionContext;
|
|
253
510
|
/** Optional theme configuration (enables ctx.theme and ctx.setTheme) */
|
|
@@ -263,20 +520,37 @@ export interface CreateRequestContextOptions<TEnv> {
|
|
|
263
520
|
* - Passed to handlers as ctx
|
|
264
521
|
*/
|
|
265
522
|
export function createRequestContext<TEnv>(
|
|
266
|
-
options: CreateRequestContextOptions<TEnv
|
|
523
|
+
options: CreateRequestContextOptions<TEnv>,
|
|
267
524
|
): RequestContext<TEnv> {
|
|
268
|
-
const {
|
|
525
|
+
const {
|
|
526
|
+
env,
|
|
527
|
+
request,
|
|
528
|
+
url,
|
|
529
|
+
variables,
|
|
530
|
+
initialResponse,
|
|
531
|
+
cacheStore,
|
|
532
|
+
cacheProfiles,
|
|
533
|
+
executionContext,
|
|
534
|
+
themeConfig,
|
|
535
|
+
} = options;
|
|
269
536
|
const cookieHeader = request.headers.get("Cookie");
|
|
270
537
|
let parsedCookies: Record<string, string> | null = null;
|
|
271
538
|
|
|
272
|
-
// Create stub response for collecting headers/cookies
|
|
273
|
-
|
|
539
|
+
// Create stub response for collecting headers/cookies.
|
|
540
|
+
// All cookie/header mutations go here; cookie reads derive from it.
|
|
541
|
+
let stubResponse = initialResponse
|
|
542
|
+
? new Response(null, {
|
|
543
|
+
status: initialResponse.status,
|
|
544
|
+
statusText: initialResponse.statusText,
|
|
545
|
+
headers: new Headers(initialResponse.headers),
|
|
546
|
+
})
|
|
547
|
+
: new Response(null, { status: 200 });
|
|
274
548
|
|
|
275
549
|
// Create handle store and loader memoization for this request
|
|
276
550
|
const handleStore = createHandleStore();
|
|
277
551
|
const loaderPromises = new Map<string, Promise<any>>();
|
|
278
552
|
|
|
279
|
-
// Lazy parse cookies
|
|
553
|
+
// Lazy parse cookies from the original Cookie header
|
|
280
554
|
const getParsedCookies = (): Record<string, string> => {
|
|
281
555
|
if (!parsedCookies) {
|
|
282
556
|
parsedCookies = parseCookiesFromHeader(cookieHeader);
|
|
@@ -284,11 +558,47 @@ export function createRequestContext<TEnv>(
|
|
|
284
558
|
return parsedCookies;
|
|
285
559
|
};
|
|
286
560
|
|
|
561
|
+
// Cached response cookie mutations — invalidated on setCookie/deleteCookie/setTheme
|
|
562
|
+
let responseCookieCache: Map<string, string | null> | null = null;
|
|
563
|
+
const getResponseCookies = (): Map<string, string | null> => {
|
|
564
|
+
if (!responseCookieCache) {
|
|
565
|
+
responseCookieCache = parseResponseCookies(stubResponse);
|
|
566
|
+
}
|
|
567
|
+
return responseCookieCache;
|
|
568
|
+
};
|
|
569
|
+
const invalidateResponseCookieCache = () => {
|
|
570
|
+
responseCookieCache = null;
|
|
571
|
+
};
|
|
572
|
+
|
|
573
|
+
// Guard: throw if a response-level side effect is called inside a cache() scope.
|
|
574
|
+
// Uses ALS to detect the scope (set during segment resolution).
|
|
575
|
+
function assertNotInsideCacheScopeALS(methodName: string): void {
|
|
576
|
+
if (isInsideCacheScope()) {
|
|
577
|
+
throw new Error(
|
|
578
|
+
`ctx.${methodName}() cannot be called inside a cache() boundary. ` +
|
|
579
|
+
`On cache hit the handler is skipped, so this side effect would be lost. ` +
|
|
580
|
+
`Move ctx.${methodName}() to a middleware or layout outside the cache() scope.`,
|
|
581
|
+
);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// Effective cookie read: response stub Set-Cookie wins, then original header.
|
|
586
|
+
// The stub IS the source of truth for same-request mutations.
|
|
587
|
+
const effectiveCookie = (name: string): string | undefined => {
|
|
588
|
+
const mutations = getResponseCookies();
|
|
589
|
+
if (mutations.has(name)) {
|
|
590
|
+
const v = mutations.get(name);
|
|
591
|
+
return v === null ? undefined : v;
|
|
592
|
+
}
|
|
593
|
+
return getParsedCookies()[name];
|
|
594
|
+
};
|
|
595
|
+
|
|
287
596
|
// Theme helpers (only used when themeConfig is provided)
|
|
288
597
|
const getTheme = (): Theme | undefined => {
|
|
289
598
|
if (!themeConfig) return undefined;
|
|
290
599
|
|
|
291
|
-
|
|
600
|
+
// Use overlay-aware read so setTheme() in the same request is reflected
|
|
601
|
+
const stored = effectiveCookie(themeConfig.storageKey);
|
|
292
602
|
if (stored) {
|
|
293
603
|
// Validate stored value
|
|
294
604
|
if (stored === "system" && themeConfig.enableSystem) {
|
|
@@ -306,65 +616,129 @@ export function createRequestContext<TEnv>(
|
|
|
306
616
|
|
|
307
617
|
// Validate theme value
|
|
308
618
|
if (theme !== "system" && !themeConfig.themes.includes(theme)) {
|
|
309
|
-
console.warn(
|
|
619
|
+
console.warn(
|
|
620
|
+
`[Theme] Invalid theme value: "${theme}". Valid values: system, ${themeConfig.themes.join(", ")}`,
|
|
621
|
+
);
|
|
310
622
|
return;
|
|
311
623
|
}
|
|
312
624
|
|
|
313
|
-
//
|
|
625
|
+
// Write to stub — effectiveCookie() will pick it up on next read
|
|
314
626
|
stubResponse.headers.append(
|
|
315
627
|
"Set-Cookie",
|
|
316
628
|
serializeCookieValue(themeConfig.storageKey, theme, {
|
|
317
629
|
path: THEME_COOKIE.path,
|
|
318
630
|
maxAge: THEME_COOKIE.maxAge,
|
|
319
631
|
sameSite: THEME_COOKIE.sameSite,
|
|
320
|
-
})
|
|
632
|
+
}),
|
|
321
633
|
);
|
|
634
|
+
invalidateResponseCookieCache();
|
|
322
635
|
};
|
|
323
636
|
|
|
637
|
+
// Strip internal _rsc* params so userland sees a clean URL.
|
|
638
|
+
const cleanUrl = stripInternalParams(url);
|
|
639
|
+
|
|
324
640
|
// Build the context object first (without use), then add use
|
|
325
641
|
const ctx: RequestContext<TEnv> = {
|
|
326
642
|
env,
|
|
327
643
|
request,
|
|
328
|
-
url,
|
|
644
|
+
url: cleanUrl,
|
|
645
|
+
originalUrl: new URL(request.url),
|
|
329
646
|
pathname: url.pathname,
|
|
330
|
-
searchParams:
|
|
331
|
-
|
|
332
|
-
get:
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
647
|
+
searchParams: cleanUrl.searchParams,
|
|
648
|
+
_variables: variables,
|
|
649
|
+
get: ((keyOrVar: any) => {
|
|
650
|
+
if (isNonCacheable(variables, keyOrVar) && isInsideCacheScope()) {
|
|
651
|
+
throw new Error(
|
|
652
|
+
`ctx.get() for a non-cacheable variable cannot be called inside a cache() boundary. ` +
|
|
653
|
+
`The variable was created with { cache: false } or set with { cache: false }, ` +
|
|
654
|
+
`and its value would be stale on cache hit. Move the read outside the cached scope.`,
|
|
655
|
+
);
|
|
656
|
+
}
|
|
657
|
+
return contextGet(variables, keyOrVar);
|
|
658
|
+
}) as RequestContext<TEnv>["get"],
|
|
659
|
+
set: ((keyOrVar: any, value: any, options?: any) => {
|
|
660
|
+
assertNotInsideCacheExec(ctx, "set");
|
|
661
|
+
contextSet(variables, keyOrVar, value, options);
|
|
662
|
+
}) as RequestContext<TEnv>["set"],
|
|
336
663
|
params: {} as Record<string, string>,
|
|
337
|
-
|
|
664
|
+
|
|
665
|
+
get res(): Response {
|
|
666
|
+
return stubResponse;
|
|
667
|
+
},
|
|
668
|
+
set res(_: Response) {
|
|
669
|
+
throw new Error(
|
|
670
|
+
"ctx.res is read-only. Use ctx.header() to set response headers, or cookies() for cookie mutations.",
|
|
671
|
+
);
|
|
672
|
+
},
|
|
338
673
|
|
|
339
674
|
cookie(name: string): string | undefined {
|
|
340
|
-
return
|
|
675
|
+
return effectiveCookie(name);
|
|
341
676
|
},
|
|
342
677
|
|
|
343
678
|
cookies(): Record<string, string> {
|
|
344
|
-
|
|
679
|
+
const parsed = getParsedCookies();
|
|
680
|
+
const mutations = getResponseCookies();
|
|
681
|
+
if (mutations.size === 0) return { ...parsed };
|
|
682
|
+
// Build result without delete (avoids V8 dictionary-mode de-opt)
|
|
683
|
+
const deleted = new Set<string>();
|
|
684
|
+
for (const [k, v] of mutations) {
|
|
685
|
+
if (v === null) deleted.add(k);
|
|
686
|
+
}
|
|
687
|
+
const result: Record<string, string> = {};
|
|
688
|
+
for (const key of Object.keys(parsed)) {
|
|
689
|
+
if (!deleted.has(key)) result[key] = parsed[key];
|
|
690
|
+
}
|
|
691
|
+
for (const [k, v] of mutations) {
|
|
692
|
+
if (v !== null) result[k] = v;
|
|
693
|
+
}
|
|
694
|
+
return result;
|
|
345
695
|
},
|
|
346
696
|
|
|
347
697
|
setCookie(name: string, value: string, options?: CookieOptions): void {
|
|
698
|
+
assertNotInsideCacheExec(ctx, "setCookie");
|
|
699
|
+
assertNotInsideCacheScopeALS("setCookie");
|
|
348
700
|
stubResponse.headers.append(
|
|
349
701
|
"Set-Cookie",
|
|
350
|
-
serializeCookieValue(name, value, options)
|
|
702
|
+
serializeCookieValue(name, value, options),
|
|
351
703
|
);
|
|
704
|
+
invalidateResponseCookieCache();
|
|
352
705
|
},
|
|
353
706
|
|
|
354
707
|
deleteCookie(
|
|
355
708
|
name: string,
|
|
356
|
-
options?: Pick<CookieOptions, "domain" | "path"
|
|
709
|
+
options?: Pick<CookieOptions, "domain" | "path">,
|
|
357
710
|
): void {
|
|
711
|
+
assertNotInsideCacheExec(ctx, "deleteCookie");
|
|
712
|
+
assertNotInsideCacheScopeALS("deleteCookie");
|
|
358
713
|
stubResponse.headers.append(
|
|
359
714
|
"Set-Cookie",
|
|
360
|
-
serializeCookieValue(name, "", { ...options, maxAge: 0 })
|
|
715
|
+
serializeCookieValue(name, "", { ...options, maxAge: 0 }),
|
|
361
716
|
);
|
|
717
|
+
invalidateResponseCookieCache();
|
|
362
718
|
},
|
|
363
719
|
|
|
364
720
|
header(name: string, value: string): void {
|
|
721
|
+
assertNotInsideCacheExec(ctx, "header");
|
|
722
|
+
assertNotInsideCacheScopeALS("header");
|
|
365
723
|
stubResponse.headers.set(name, value);
|
|
366
724
|
},
|
|
367
725
|
|
|
726
|
+
setStatus(status: number): void {
|
|
727
|
+
assertNotInsideCacheExec(ctx, "setStatus");
|
|
728
|
+
assertNotInsideCacheScopeALS("setStatus");
|
|
729
|
+
stubResponse = new Response(null, {
|
|
730
|
+
status,
|
|
731
|
+
headers: stubResponse.headers,
|
|
732
|
+
});
|
|
733
|
+
},
|
|
734
|
+
|
|
735
|
+
_setStatus(status: number): void {
|
|
736
|
+
stubResponse = new Response(null, {
|
|
737
|
+
status,
|
|
738
|
+
headers: stubResponse.headers,
|
|
739
|
+
});
|
|
740
|
+
},
|
|
741
|
+
|
|
368
742
|
// Placeholder - will be replaced below
|
|
369
743
|
use: null as any,
|
|
370
744
|
|
|
@@ -372,28 +746,124 @@ export function createRequestContext<TEnv>(
|
|
|
372
746
|
|
|
373
747
|
_handleStore: handleStore,
|
|
374
748
|
_cacheStore: cacheStore,
|
|
749
|
+
_cacheProfiles: cacheProfiles,
|
|
375
750
|
|
|
376
751
|
waitUntil(fn: () => Promise<void>): void {
|
|
377
752
|
if (executionContext?.waitUntil) {
|
|
378
|
-
// Cloudflare Workers: use native waitUntil
|
|
379
753
|
executionContext.waitUntil(fn());
|
|
380
754
|
} else {
|
|
381
|
-
|
|
382
|
-
fn().catch((err) => console.error("[waitUntil] Background task failed:", err));
|
|
755
|
+
fireAndForgetWaitUntil(fn);
|
|
383
756
|
}
|
|
384
757
|
},
|
|
385
758
|
|
|
759
|
+
executionContext,
|
|
760
|
+
|
|
386
761
|
_onResponseCallbacks: [],
|
|
387
762
|
|
|
388
763
|
onResponse(callback: (response: Response) => Response): void {
|
|
764
|
+
assertNotInsideCacheExec(ctx, "onResponse");
|
|
765
|
+
assertNotInsideCacheScopeALS("onResponse");
|
|
389
766
|
this._onResponseCallbacks.push(callback);
|
|
390
767
|
},
|
|
391
768
|
|
|
392
769
|
// Theme properties (only set when themeConfig is provided)
|
|
393
|
-
theme
|
|
394
|
-
|
|
770
|
+
get theme() {
|
|
771
|
+
return themeConfig ? getTheme() : undefined;
|
|
772
|
+
},
|
|
773
|
+
setTheme: themeConfig
|
|
774
|
+
? (theme: Theme) => {
|
|
775
|
+
assertNotInsideCacheExec(ctx, "setTheme");
|
|
776
|
+
setTheme(theme);
|
|
777
|
+
}
|
|
778
|
+
: undefined,
|
|
395
779
|
_themeConfig: themeConfig,
|
|
780
|
+
|
|
781
|
+
setLocationState(entries: LocationStateEntry | LocationStateEntry[]): void {
|
|
782
|
+
assertNotInsideCacheExec(ctx, "setLocationState");
|
|
783
|
+
const arr = Array.isArray(entries) ? entries : [entries];
|
|
784
|
+
this._locationState = this._locationState
|
|
785
|
+
? [...this._locationState, ...arr]
|
|
786
|
+
: arr;
|
|
787
|
+
},
|
|
788
|
+
_locationState: undefined,
|
|
789
|
+
|
|
790
|
+
_reportedErrors: new WeakSet<object>(),
|
|
791
|
+
_metricsStore: undefined,
|
|
792
|
+
|
|
793
|
+
// Render barrier: deferred promise resolved after non-loader segments settle.
|
|
794
|
+
_renderBarrier: null as any, // set below
|
|
795
|
+
_resolveRenderBarrier: null as any, // set below
|
|
796
|
+
_renderBarrierSegmentOrder: undefined,
|
|
797
|
+
|
|
798
|
+
reverse: createReverseFunction(getGlobalRouteMap(), undefined, {}),
|
|
799
|
+
};
|
|
800
|
+
|
|
801
|
+
// Lazy render barrier: only allocate the Promise when a loader actually
|
|
802
|
+
// calls rendered(). Requests that don't use rendered() pay zero cost.
|
|
803
|
+
let barrierResolved = false;
|
|
804
|
+
let resolveBarrier: (() => void) | undefined;
|
|
805
|
+
ctx._renderBarrier = null as any; // lazy — created on first access
|
|
806
|
+
ctx._resolveRenderBarrier = (
|
|
807
|
+
segments: Array<{ type: string; id: string }>,
|
|
808
|
+
) => {
|
|
809
|
+
if (barrierResolved) return;
|
|
810
|
+
barrierResolved = true;
|
|
811
|
+
const segOrder = segments
|
|
812
|
+
.filter((s) => s.type !== "loader")
|
|
813
|
+
.map((s) => s.id);
|
|
814
|
+
ctx._renderBarrierSegmentOrder = segOrder;
|
|
815
|
+
|
|
816
|
+
// Closing the guard window means no handler can still form a deadlock cycle
|
|
817
|
+
// with a rendered() loader: drop the dependency-tracking state and mark it
|
|
818
|
+
// closed. WHEN this runs is the only streaming/non-streaming difference.
|
|
819
|
+
const closeGuard = () => {
|
|
820
|
+
ctx._renderBarrierWaiters = undefined;
|
|
821
|
+
ctx._handlerLoaderDeps = undefined;
|
|
822
|
+
ctx._renderBarrierGuardClosed = true;
|
|
823
|
+
};
|
|
824
|
+
|
|
825
|
+
if (ctx._treeHasStreaming) {
|
|
826
|
+
// Streaming: rendered() keeps waiting on handleStore.settled past this
|
|
827
|
+
// point, and loading() handlers are still in flight. The eager snapshot
|
|
828
|
+
// here would be incomplete, so leave it unset — rendered() builds and
|
|
829
|
+
// caches the complete one after settled. Keep the guard window OPEN so a
|
|
830
|
+
// handler that resumes and awaits a still-waiting rendered() loader is
|
|
831
|
+
// still caught; close it once settled (every tracked handler has finished
|
|
832
|
+
// then, so none can await a loader anymore). settled resolves after
|
|
833
|
+
// rendered() seals; if no loader used rendered(), nothing seals and the
|
|
834
|
+
// (empty) guard state is simply GC'd at request end.
|
|
835
|
+
handleStore.settled.then(closeGuard);
|
|
836
|
+
} else {
|
|
837
|
+
// Non-streaming: all handlers have settled by now. Build and cache the
|
|
838
|
+
// snapshot so loader ctx.use(handle) calls don't rebuild it, and close the
|
|
839
|
+
// guard window immediately.
|
|
840
|
+
ctx._renderBarrierHandleSnapshot = buildHandleSnapshot(
|
|
841
|
+
handleStore,
|
|
842
|
+
segOrder,
|
|
843
|
+
);
|
|
844
|
+
closeGuard();
|
|
845
|
+
}
|
|
846
|
+
if (resolveBarrier) resolveBarrier();
|
|
396
847
|
};
|
|
848
|
+
Object.defineProperty(ctx, "_renderBarrier", {
|
|
849
|
+
get() {
|
|
850
|
+
// Barrier already resolved (cache/prerender hit) or first lazy access.
|
|
851
|
+
// Either way, replace the getter with a concrete value to avoid
|
|
852
|
+
// repeated Promise.resolve() allocations on subsequent reads.
|
|
853
|
+
const p = barrierResolved
|
|
854
|
+
? Promise.resolve()
|
|
855
|
+
: new Promise<void>((resolve) => {
|
|
856
|
+
resolveBarrier = resolve;
|
|
857
|
+
});
|
|
858
|
+
Object.defineProperty(ctx, "_renderBarrier", {
|
|
859
|
+
value: p,
|
|
860
|
+
writable: false,
|
|
861
|
+
configurable: false,
|
|
862
|
+
});
|
|
863
|
+
return p;
|
|
864
|
+
},
|
|
865
|
+
configurable: true,
|
|
866
|
+
});
|
|
397
867
|
|
|
398
868
|
// Now create use() with access to ctx
|
|
399
869
|
ctx.use = createUseFunction({
|
|
@@ -402,14 +872,53 @@ export function createRequestContext<TEnv>(
|
|
|
402
872
|
getContext: () => ctx,
|
|
403
873
|
});
|
|
404
874
|
|
|
875
|
+
// Brand with taint symbol so "use cache" excludes ctx from cache keys
|
|
876
|
+
(ctx as any)[NOCACHE_SYMBOL] = true;
|
|
405
877
|
return ctx;
|
|
406
878
|
}
|
|
407
879
|
|
|
880
|
+
/**
|
|
881
|
+
* Parse Set-Cookie headers from a response into effective cookie state.
|
|
882
|
+
* Returns a map of cookie name -> value (string) or name -> null (deleted).
|
|
883
|
+
* Last-write-wins: later Set-Cookie entries for the same name overwrite earlier ones.
|
|
884
|
+
* Max-Age=0 is treated as a delete.
|
|
885
|
+
*/
|
|
886
|
+
const MAX_AGE_ZERO_RE = /;\s*Max-Age\s*=\s*0/i;
|
|
887
|
+
|
|
888
|
+
function parseResponseCookies(response: Response): Map<string, string | null> {
|
|
889
|
+
const result = new Map<string, string | null>();
|
|
890
|
+
const setCookies = response.headers.getSetCookie();
|
|
891
|
+
|
|
892
|
+
for (const header of setCookies) {
|
|
893
|
+
// First segment before ';' is the name=value pair
|
|
894
|
+
const semiIdx = header.indexOf(";");
|
|
895
|
+
const pair = semiIdx === -1 ? header : header.substring(0, semiIdx);
|
|
896
|
+
const eqIdx = pair.indexOf("=");
|
|
897
|
+
if (eqIdx === -1) continue;
|
|
898
|
+
|
|
899
|
+
let name: string;
|
|
900
|
+
let value: string;
|
|
901
|
+
try {
|
|
902
|
+
name = decodeURIComponent(pair.substring(0, eqIdx).trim());
|
|
903
|
+
value = decodeURIComponent(pair.substring(eqIdx + 1).trim());
|
|
904
|
+
} catch {
|
|
905
|
+
// Malformed encoding — skip this entry
|
|
906
|
+
continue;
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
// Max-Age=0 means the cookie is being deleted
|
|
910
|
+
const isDeleted = MAX_AGE_ZERO_RE.test(header);
|
|
911
|
+
result.set(name, isDeleted ? null : value);
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
return result;
|
|
915
|
+
}
|
|
916
|
+
|
|
408
917
|
/**
|
|
409
918
|
* Parse cookies from Cookie header
|
|
410
919
|
*/
|
|
411
920
|
function parseCookiesFromHeader(
|
|
412
|
-
cookieHeader: string | null
|
|
921
|
+
cookieHeader: string | null,
|
|
413
922
|
): Record<string, string> {
|
|
414
923
|
if (!cookieHeader) return {};
|
|
415
924
|
|
|
@@ -419,7 +928,13 @@ function parseCookiesFromHeader(
|
|
|
419
928
|
for (const pair of pairs) {
|
|
420
929
|
const [name, ...rest] = pair.trim().split("=");
|
|
421
930
|
if (name) {
|
|
422
|
-
|
|
931
|
+
const raw = rest.join("=");
|
|
932
|
+
try {
|
|
933
|
+
cookies[name] = decodeURIComponent(raw);
|
|
934
|
+
} catch {
|
|
935
|
+
// Malformed percent-encoded value (e.g. %zz, %2) - fall back to raw value
|
|
936
|
+
cookies[name] = raw;
|
|
937
|
+
}
|
|
423
938
|
}
|
|
424
939
|
}
|
|
425
940
|
|
|
@@ -432,7 +947,7 @@ function parseCookiesFromHeader(
|
|
|
432
947
|
function serializeCookieValue(
|
|
433
948
|
name: string,
|
|
434
949
|
value: string,
|
|
435
|
-
options: CookieOptions = {}
|
|
950
|
+
options: CookieOptions = {},
|
|
436
951
|
): string {
|
|
437
952
|
let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
|
|
438
953
|
|
|
@@ -464,7 +979,7 @@ export interface CreateUseFunctionOptions<TEnv> {
|
|
|
464
979
|
* - For handles: returns a push function to add handle data
|
|
465
980
|
*/
|
|
466
981
|
export function createUseFunction<TEnv>(
|
|
467
|
-
options: CreateUseFunctionOptions<TEnv
|
|
982
|
+
options: CreateUseFunctionOptions<TEnv>,
|
|
468
983
|
): RequestContext["use"] {
|
|
469
984
|
const { handleStore, loaderPromises, getContext } = options;
|
|
470
985
|
|
|
@@ -478,16 +993,19 @@ export function createUseFunction<TEnv>(
|
|
|
478
993
|
if (!segmentId) {
|
|
479
994
|
throw new Error(
|
|
480
995
|
`Handle "${handle.$$id}" used outside of handler context. ` +
|
|
481
|
-
`Handles must be used within route/layout handlers
|
|
996
|
+
`Handles must be used within route/layout handlers.`,
|
|
482
997
|
);
|
|
483
998
|
}
|
|
484
999
|
|
|
485
1000
|
// Return a push function bound to this handle and segment
|
|
486
|
-
return (
|
|
1001
|
+
return (
|
|
1002
|
+
dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>),
|
|
1003
|
+
) => {
|
|
487
1004
|
// If it's a function, call it immediately to get the promise
|
|
488
|
-
const valueOrPromise =
|
|
489
|
-
|
|
490
|
-
|
|
1005
|
+
const valueOrPromise =
|
|
1006
|
+
typeof dataOrFn === "function"
|
|
1007
|
+
? (dataOrFn as () => Promise<unknown>)()
|
|
1008
|
+
: dataOrFn;
|
|
491
1009
|
|
|
492
1010
|
// Push directly - promises will be serialized by RSC and streamed
|
|
493
1011
|
handleStore.push(handle.$$id, segmentId, valueOrPromise);
|
|
@@ -513,7 +1031,7 @@ export function createUseFunction<TEnv>(
|
|
|
513
1031
|
|
|
514
1032
|
if (!loaderFn) {
|
|
515
1033
|
throw new Error(
|
|
516
|
-
`Loader "${loader.$$id}" has no function. This usually means the loader was defined without "use server" and the function was not included in the build
|
|
1034
|
+
`Loader "${loader.$$id}" has no function. This usually means the loader was defined without "use server" and the function was not included in the build.`,
|
|
517
1035
|
);
|
|
518
1036
|
}
|
|
519
1037
|
|
|
@@ -522,25 +1040,40 @@ export function createUseFunction<TEnv>(
|
|
|
522
1040
|
// Create loader context with recursive use() support
|
|
523
1041
|
const loaderCtx: LoaderContext<Record<string, string | undefined>, TEnv> = {
|
|
524
1042
|
params: ctx.params,
|
|
1043
|
+
routeParams: (ctx.params ?? {}) as Record<string, string>,
|
|
525
1044
|
request: ctx.request,
|
|
526
1045
|
searchParams: ctx.searchParams,
|
|
1046
|
+
search: (ctx as any).search ?? {},
|
|
527
1047
|
pathname: ctx.pathname,
|
|
528
1048
|
url: ctx.url,
|
|
1049
|
+
originalUrl: ctx.originalUrl,
|
|
529
1050
|
env: ctx.env as any,
|
|
530
|
-
|
|
1051
|
+
waitUntil: ctx.waitUntil.bind(ctx),
|
|
1052
|
+
executionContext: ctx.executionContext,
|
|
531
1053
|
get: ctx.get as any,
|
|
532
|
-
use: <TDep, TDepParams = any>(
|
|
533
|
-
dep: LoaderDefinition<TDep, TDepParams
|
|
1054
|
+
use: (<TDep, TDepParams = any>(
|
|
1055
|
+
dep: LoaderDefinition<TDep, TDepParams>,
|
|
534
1056
|
): Promise<TDep> => {
|
|
535
1057
|
// Recursive call - will start dep loader if not already started
|
|
536
1058
|
return ctx.use(dep);
|
|
537
|
-
},
|
|
1059
|
+
}) as LoaderContext["use"],
|
|
538
1060
|
method: "GET",
|
|
539
1061
|
body: undefined,
|
|
1062
|
+
reverse: createReverseFunction(
|
|
1063
|
+
getGlobalRouteMap(),
|
|
1064
|
+
ctx._routeName,
|
|
1065
|
+
ctx.params as Record<string, string>,
|
|
1066
|
+
ctx._routeName ? isRouteRootScoped(ctx._routeName) : undefined,
|
|
1067
|
+
),
|
|
1068
|
+
rendered: () => {
|
|
1069
|
+
throw new Error(
|
|
1070
|
+
`ctx.rendered() is only available in DSL loaders (registered via loader() in urls()). ` +
|
|
1071
|
+
`It cannot be used from request-context loaders or server actions.`,
|
|
1072
|
+
);
|
|
1073
|
+
},
|
|
540
1074
|
};
|
|
541
1075
|
|
|
542
|
-
|
|
543
|
-
const doneLoader = track(`loader:${loader.$$id}`);
|
|
1076
|
+
const doneLoader = track(`loader:${loader.$$id}`, 2);
|
|
544
1077
|
const promise = Promise.resolve(loaderFn(loaderCtx)).finally(() => {
|
|
545
1078
|
doneLoader();
|
|
546
1079
|
});
|