@rangojs/router 0.0.0-experimental.6 → 0.0.0-experimental.60
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 +889 -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 +1688 -0
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +4778 -770
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/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} +16 -18
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +78 -59
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +294 -0
- package/skills/caching/SKILL.md +93 -23
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +18 -16
- package/skills/fonts/SKILL.md +167 -0
- package/skills/hooks/SKILL.md +334 -72
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +131 -8
- package/skills/layout/SKILL.md +100 -3
- package/skills/links/SKILL.md +92 -31
- package/skills/loader/SKILL.md +404 -44
- package/skills/middleware/SKILL.md +173 -34
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +204 -1
- package/skills/prerender/SKILL.md +643 -0
- package/skills/rango/SKILL.md +85 -16
- package/skills/response-routes/SKILL.md +411 -0
- package/skills/route/SKILL.md +257 -14
- package/skills/router-setup/SKILL.md +210 -32
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +328 -89
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +321 -0
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +92 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +296 -558
- package/src/browser/navigation-client.ts +179 -69
- package/src/browser/navigation-store.ts +73 -55
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +328 -313
- package/src/browser/prefetch/cache.ts +206 -0
- package/src/browser/prefetch/fetch.ts +150 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +160 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +230 -74
- package/src/browser/react/NavigationProvider.tsx +87 -11
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +12 -12
- package/src/browser/react/location-state-shared.ts +95 -53
- package/src/browser/react/location-state.ts +60 -15
- 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 +32 -79
- package/src/browser/react/use-href.tsx +2 -2
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +22 -63
- package/src/browser/react/use-params.ts +65 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +76 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +80 -97
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +214 -58
- package/src/browser/scroll-restoration.ts +127 -52
- package/src/browser/segment-reconciler.ts +221 -0
- package/src/browser/segment-structure-assert.ts +16 -0
- package/src/browser/server-action-bridge.ts +510 -603
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +141 -48
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +238 -24
- package/src/build/generate-route-types.ts +39 -0
- package/src/build/index.ts +13 -0
- package/src/build/route-trie.ts +265 -0
- 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 +128 -0
- package/src/build/route-types/router-processing.ts +618 -0
- package/src/build/route-types/scan-filter.ts +78 -0
- package/src/build/runtime-discovery.ts +231 -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 +342 -0
- package/src/cache/cache-scope.ts +167 -309
- package/src/cache/cf/cf-cache-store.ts +571 -17
- 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 +41 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +191 -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 +72 -122
- package/src/client.rsc.tsx +3 -1
- package/src/client.tsx +106 -126
- 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/errors.ts +108 -2
- package/src/handle.ts +15 -29
- 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 +165 -0
- package/src/host/errors.ts +97 -0
- package/src/host/index.ts +53 -0
- package/src/host/pattern-matcher.ts +214 -0
- package/src/host/router.ts +352 -0
- package/src/host/testing.ts +79 -0
- package/src/host/types.ts +146 -0
- package/src/host/utils.ts +25 -0
- package/src/href-client.ts +119 -29
- package/src/index.rsc.ts +153 -19
- package/src/index.ts +211 -30
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +26 -147
- package/src/loader.ts +27 -10
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +185 -0
- package/src/prerender.ts +463 -0
- package/src/reverse.ts +349 -0
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +7 -4
- package/src/route-definition/dsl-helpers.ts +959 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +431 -0
- package/src/route-definition/index.ts +52 -0
- package/src/route-definition/redirect.ts +101 -0
- package/src/route-definition.ts +1 -1428
- package/src/route-map-builder.ts +217 -123
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +59 -8
- package/src/router/content-negotiation.ts +116 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +160 -0
- package/src/router/handler-context.ts +418 -86
- package/src/router/intercept-resolution.ts +402 -0
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +224 -124
- package/src/router/logging.ts +251 -0
- package/src/router/manifest.ts +154 -35
- package/src/router/match-api.ts +620 -0
- package/src/router/match-context.ts +5 -3
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +108 -93
- package/src/router/match-middleware/cache-lookup.ts +443 -10
- package/src/router/match-middleware/cache-store.ts +98 -26
- package/src/router/match-middleware/intercept-resolution.ts +57 -17
- package/src/router/match-middleware/segment-resolution.ts +27 -6
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +55 -33
- package/src/router/metrics.ts +240 -15
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +220 -0
- package/src/router/middleware.ts +324 -369
- package/src/router/pattern-matching.ts +211 -43
- package/src/router/prerender-match.ts +402 -0
- package/src/router/preview-match.ts +170 -0
- package/src/router/revalidation.ts +137 -38
- package/src/router/router-context.ts +41 -21
- package/src/router/router-interfaces.ts +473 -0
- package/src/router/router-options.ts +618 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +691 -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 +1306 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -0
- package/src/router/segment-wrappers.ts +291 -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 +239 -0
- package/src/router/types.ts +78 -3
- package/src/router.ts +703 -4183
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +775 -756
- package/src/rsc/helpers.ts +140 -6
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +209 -0
- package/src/rsc/manifest-init.ts +90 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +383 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +242 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +350 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +45 -11
- package/src/search-params.ts +230 -0
- package/src/segment-system.tsx +166 -18
- package/src/server/context.ts +302 -58
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +94 -15
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +482 -78
- package/src/server.ts +35 -128
- package/src/ssr/index.tsx +103 -30
- package/src/static-handler.ts +114 -0
- 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 +100 -0
- package/src/types/handler-context.ts +781 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +182 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +109 -0
- package/src/types/segments.ts +150 -0
- package/src/types.ts +1 -1623
- package/src/urls/include-helper.ts +197 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +339 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +107 -0
- package/src/urls/response-types.ts +106 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -802
- package/src/use-loader.tsx +85 -77
- package/src/vite/discovery/bundle-postprocess.ts +184 -0
- package/src/vite/discovery/discover-routers.ts +348 -0
- package/src/vite/discovery/prerender-collection.ts +385 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +108 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +11 -782
- package/src/vite/plugin-types.ts +48 -0
- package/src/vite/plugins/cjs-to-esm.ts +93 -0
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +105 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -53
- package/src/vite/plugins/expose-id-utils.ts +287 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +569 -0
- package/src/vite/plugins/performance-tracks.ts +88 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +323 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +266 -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 +461 -0
- package/src/vite/router-discovery.ts +777 -0
- package/src/vite/utils/ast-handler-extract.ts +517 -0
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
- package/src/vite/utils/prerender-utils.ts +189 -0
- package/src/vite/utils/shared-utils.ts +170 -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/href.ts +0 -255
- package/src/server/route-manifest-cache.ts +0 -173
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -426
- package/src/vite/expose-location-state-id.ts +0 -177
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -13,13 +13,36 @@
|
|
|
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";
|
|
23
|
+
import {
|
|
24
|
+
type ContextVar,
|
|
25
|
+
contextGet,
|
|
26
|
+
contextSet,
|
|
27
|
+
isNonCacheable,
|
|
28
|
+
} from "../context-var.js";
|
|
17
29
|
import { createHandleStore, type HandleStore } from "./handle-store.js";
|
|
18
30
|
import { isHandle } from "../handle.js";
|
|
19
|
-
import { track } from "./context.js";
|
|
31
|
+
import { track, type MetricsStore } from "./context.js";
|
|
32
|
+
import { getFetchableLoader } from "./fetchable-loader-store.js";
|
|
20
33
|
import type { SegmentCacheStore } from "../cache/types.js";
|
|
21
34
|
import type { Theme, ResolvedThemeConfig } from "../theme/types.js";
|
|
22
35
|
import { THEME_COOKIE } from "../theme/constants.js";
|
|
36
|
+
import type { LocationStateEntry } from "../browser/react/location-state-shared.js";
|
|
37
|
+
import { NOCACHE_SYMBOL, assertNotInsideCacheExec } from "../cache/taint.js";
|
|
38
|
+
import { isInsideCacheScope } from "./context.js";
|
|
39
|
+
import {
|
|
40
|
+
createReverseFunction,
|
|
41
|
+
stripInternalParams,
|
|
42
|
+
} from "../router/handler-context.js";
|
|
43
|
+
import { getGlobalRouteMap, isRouteRootScoped } from "../route-map-builder.js";
|
|
44
|
+
import { invariant } from "../errors.js";
|
|
45
|
+
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
23
46
|
|
|
24
47
|
/**
|
|
25
48
|
* Unified request context available via getRequestContext()
|
|
@@ -28,46 +51,65 @@ import { THEME_COOKIE } from "../theme/constants.js";
|
|
|
28
51
|
* Use this when you need access to request data outside of route handlers.
|
|
29
52
|
*/
|
|
30
53
|
export interface RequestContext<
|
|
31
|
-
TEnv =
|
|
54
|
+
TEnv = DefaultEnv,
|
|
32
55
|
TParams = Record<string, string>,
|
|
33
56
|
> {
|
|
34
57
|
/** Platform bindings (Cloudflare env, etc.) */
|
|
35
58
|
env: TEnv;
|
|
36
59
|
/** Original HTTP request */
|
|
37
60
|
request: Request;
|
|
38
|
-
/** Parsed URL (
|
|
61
|
+
/** Parsed URL (with internal `_rsc*` params stripped) */
|
|
39
62
|
url: URL;
|
|
63
|
+
/**
|
|
64
|
+
* The original request URL with all parameters intact, including
|
|
65
|
+
* internal `_rsc*` transport params.
|
|
66
|
+
*/
|
|
67
|
+
originalUrl: URL;
|
|
40
68
|
/** URL pathname */
|
|
41
69
|
pathname: string;
|
|
42
|
-
/** URL search params (
|
|
70
|
+
/** URL search params (with internal `_rsc*` params stripped, same as `url.searchParams`) */
|
|
43
71
|
searchParams: URLSearchParams;
|
|
44
|
-
/**
|
|
45
|
-
|
|
72
|
+
/** @internal Shared variable backing store for ctx.get()/ctx.set(). */
|
|
73
|
+
_variables: Record<string, any>;
|
|
46
74
|
/** Get a variable set by middleware */
|
|
47
|
-
get:
|
|
75
|
+
get: {
|
|
76
|
+
<T>(contextVar: ContextVar<T>): T | undefined;
|
|
77
|
+
<K extends string>(key: K): any;
|
|
78
|
+
};
|
|
48
79
|
/** Set a variable (shared with middleware and handlers) */
|
|
49
|
-
set:
|
|
80
|
+
set: {
|
|
81
|
+
<T>(
|
|
82
|
+
contextVar: ContextVar<T>,
|
|
83
|
+
value: T,
|
|
84
|
+
options?: { cache?: boolean },
|
|
85
|
+
): void;
|
|
86
|
+
<K extends string>(key: K, value: any, options?: { cache?: boolean }): void;
|
|
87
|
+
};
|
|
50
88
|
/**
|
|
51
89
|
* Route params (populated after route matching)
|
|
52
90
|
* Initially empty, then set to matched params
|
|
53
91
|
*/
|
|
54
92
|
params: TParams;
|
|
55
|
-
/**
|
|
56
|
-
|
|
57
|
-
* Headers set here are merged into the final response
|
|
58
|
-
*/
|
|
59
|
-
res: Response;
|
|
93
|
+
/** @internal Stub response for collecting headers/cookies. Use ctx.headers or ctx.header() instead. */
|
|
94
|
+
readonly res: Response;
|
|
60
95
|
|
|
61
|
-
/** Get a cookie value
|
|
96
|
+
/** @internal Get a cookie value (effective: request + response mutations). Use cookies().get() instead. */
|
|
62
97
|
cookie(name: string): string | undefined;
|
|
63
|
-
/** Get all cookies
|
|
98
|
+
/** @internal Get all cookies (effective merged view). Use cookies().getAll() instead. */
|
|
64
99
|
cookies(): Record<string, string>;
|
|
65
|
-
/** Set a cookie on the response */
|
|
100
|
+
/** @internal Set a cookie on the response. Use cookies().set() instead. */
|
|
66
101
|
setCookie(name: string, value: string, options?: CookieOptions): void;
|
|
67
|
-
/** Delete a cookie */
|
|
68
|
-
deleteCookie(
|
|
102
|
+
/** @internal Delete a cookie. Use cookies().delete() instead. */
|
|
103
|
+
deleteCookie(
|
|
104
|
+
name: string,
|
|
105
|
+
options?: Pick<CookieOptions, "domain" | "path">,
|
|
106
|
+
): void;
|
|
69
107
|
/** Set a response header */
|
|
70
108
|
header(name: string, value: string): void;
|
|
109
|
+
/** Set the response status code */
|
|
110
|
+
setStatus(status: number): void;
|
|
111
|
+
/** @internal Set status bypassing cache-exec guard (for framework error handling) */
|
|
112
|
+
_setStatus(status: number): void;
|
|
71
113
|
|
|
72
114
|
/**
|
|
73
115
|
* Access loader data or push handle data.
|
|
@@ -89,10 +131,12 @@ export interface RequestContext<
|
|
|
89
131
|
* ```
|
|
90
132
|
*/
|
|
91
133
|
use: {
|
|
92
|
-
<T, TLoaderParams = any>(
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
134
|
+
<T, TLoaderParams = any>(
|
|
135
|
+
loader: LoaderDefinition<T, TLoaderParams>,
|
|
136
|
+
): Promise<T>;
|
|
137
|
+
<TData, TAccumulated = TData[]>(
|
|
138
|
+
handle: Handle<TData, TAccumulated>,
|
|
139
|
+
): (data: TData | Promise<TData> | (() => Promise<TData>)) => void;
|
|
96
140
|
};
|
|
97
141
|
|
|
98
142
|
/** HTTP method (GET, POST, PUT, PATCH, DELETE, etc.) */
|
|
@@ -104,6 +148,12 @@ export interface RequestContext<
|
|
|
104
148
|
/** @internal Cache store for segment caching (optional, used by CacheScope) */
|
|
105
149
|
_cacheStore?: SegmentCacheStore;
|
|
106
150
|
|
|
151
|
+
/** @internal Cache profiles for "use cache" profile resolution (per-router) */
|
|
152
|
+
_cacheProfiles?: Record<
|
|
153
|
+
string,
|
|
154
|
+
import("../cache/profile-registry.js").CacheProfile
|
|
155
|
+
>;
|
|
156
|
+
|
|
107
157
|
/**
|
|
108
158
|
* Schedule work to run after the response is sent.
|
|
109
159
|
* On Cloudflare Workers, uses ctx.waitUntil().
|
|
@@ -177,8 +227,104 @@ export interface RequestContext<
|
|
|
177
227
|
|
|
178
228
|
/** @internal Theme configuration (null if theme not enabled) */
|
|
179
229
|
_themeConfig?: ResolvedThemeConfig | null;
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Attach location state entries to the current response.
|
|
233
|
+
*
|
|
234
|
+
* For partial (SPA) requests, the state is included in the RSC payload
|
|
235
|
+
* metadata and merged into history.pushState on the client. For redirect
|
|
236
|
+
* responses, the state travels through the redirect payload so the target
|
|
237
|
+
* page can read it via useLocationState.
|
|
238
|
+
*
|
|
239
|
+
* Multiple calls accumulate entries.
|
|
240
|
+
*
|
|
241
|
+
* @example
|
|
242
|
+
* ```typescript
|
|
243
|
+
* ctx.setLocationState(Flash({ text: "Item saved!" }));
|
|
244
|
+
* ```
|
|
245
|
+
*/
|
|
246
|
+
setLocationState(entries: LocationStateEntry | LocationStateEntry[]): void;
|
|
247
|
+
|
|
248
|
+
/** @internal Accumulated location state entries */
|
|
249
|
+
_locationState?: LocationStateEntry[];
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* The matched route name, if the route has an explicit name.
|
|
253
|
+
* Undefined before route matching or for unnamed routes.
|
|
254
|
+
* Includes the namespace prefix from include() (e.g., "blog.post").
|
|
255
|
+
*/
|
|
256
|
+
routeName?: DefaultRouteName;
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Generate URLs from route names.
|
|
260
|
+
* Uses the global route map. After route matching, scoped (`.name`) resolution
|
|
261
|
+
* works within the matched include() scope.
|
|
262
|
+
*/
|
|
263
|
+
reverse: ScopedReverseFunction<
|
|
264
|
+
Record<string, string>,
|
|
265
|
+
DefaultReverseRouteMap
|
|
266
|
+
>;
|
|
267
|
+
|
|
268
|
+
/** @internal Route name from route matching, used for scoped reverse resolution */
|
|
269
|
+
_routeName?: string;
|
|
270
|
+
|
|
271
|
+
/** @internal Previous route key (from the navigation source), used for revalidation */
|
|
272
|
+
_prevRouteKey?: string;
|
|
273
|
+
|
|
274
|
+
/** @internal Per-request error dedup set for onError reporting */
|
|
275
|
+
_reportedErrors: WeakSet<object>;
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* @internal Report a non-fatal background error through the router's
|
|
279
|
+
* onError callback. Wired by the RSC handler / router during request
|
|
280
|
+
* creation. Cache-runtime and other subsystems call this to surface
|
|
281
|
+
* errors without failing the response.
|
|
282
|
+
*/
|
|
283
|
+
_reportBackgroundError?: (error: unknown, category: string) => void;
|
|
284
|
+
|
|
285
|
+
/** @internal Per-request debug performance override (set via ctx.debugPerformance()) */
|
|
286
|
+
_debugPerformance?: boolean;
|
|
287
|
+
|
|
288
|
+
/** @internal Request-scoped performance metrics store */
|
|
289
|
+
_metricsStore?: MetricsStore;
|
|
290
|
+
|
|
291
|
+
/** @internal Router basename for this request (used by redirect()) */
|
|
292
|
+
_basename?: string;
|
|
180
293
|
}
|
|
181
294
|
|
|
295
|
+
/**
|
|
296
|
+
* Public view of RequestContext, without internal methods and fields.
|
|
297
|
+
*
|
|
298
|
+
* This is the type exported to library consumers. Internal code should
|
|
299
|
+
* use the full RequestContext interface directly.
|
|
300
|
+
*/
|
|
301
|
+
export type PublicRequestContext<
|
|
302
|
+
TEnv = DefaultEnv,
|
|
303
|
+
TParams = Record<string, string>,
|
|
304
|
+
> = Omit<
|
|
305
|
+
RequestContext<TEnv, TParams>,
|
|
306
|
+
| "cookie"
|
|
307
|
+
| "cookies"
|
|
308
|
+
| "setCookie"
|
|
309
|
+
| "deleteCookie"
|
|
310
|
+
| "_handleStore"
|
|
311
|
+
| "_cacheStore"
|
|
312
|
+
| "_cacheProfiles"
|
|
313
|
+
| "_onResponseCallbacks"
|
|
314
|
+
| "_themeConfig"
|
|
315
|
+
| "_locationState"
|
|
316
|
+
| "_routeName"
|
|
317
|
+
| "_prevRouteKey"
|
|
318
|
+
| "_reportedErrors"
|
|
319
|
+
| "_reportBackgroundError"
|
|
320
|
+
| "_debugPerformance"
|
|
321
|
+
| "_metricsStore"
|
|
322
|
+
| "_basename"
|
|
323
|
+
| "_setStatus"
|
|
324
|
+
| "_variables"
|
|
325
|
+
| "res"
|
|
326
|
+
>;
|
|
327
|
+
|
|
182
328
|
// AsyncLocalStorage instance for request context
|
|
183
329
|
const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
|
|
184
330
|
|
|
@@ -188,16 +334,33 @@ const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
|
|
|
188
334
|
*/
|
|
189
335
|
export function runWithRequestContext<TEnv, T>(
|
|
190
336
|
context: RequestContext<TEnv>,
|
|
191
|
-
fn: () => T
|
|
337
|
+
fn: () => T,
|
|
192
338
|
): T {
|
|
193
339
|
return requestContextStorage.run(context, fn);
|
|
194
340
|
}
|
|
195
341
|
|
|
196
342
|
/**
|
|
197
343
|
* Get the current request context
|
|
198
|
-
*
|
|
344
|
+
* Throws if called outside of a request context
|
|
345
|
+
*/
|
|
346
|
+
export function getRequestContext<TEnv = DefaultEnv>(): RequestContext<TEnv> {
|
|
347
|
+
const ctx = requestContextStorage.getStore() as
|
|
348
|
+
| RequestContext<TEnv>
|
|
349
|
+
| undefined;
|
|
350
|
+
invariant(
|
|
351
|
+
ctx,
|
|
352
|
+
"getRequestContext() called outside of a request context. " +
|
|
353
|
+
"This function must be called from within a route handler, loader, middleware, " +
|
|
354
|
+
"server action, or server component.",
|
|
355
|
+
);
|
|
356
|
+
return ctx;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* @internal Get the request context without throwing — for internal code that
|
|
361
|
+
* may run outside a request context (cache stores, optional handle lookups, etc.)
|
|
199
362
|
*/
|
|
200
|
-
export function
|
|
363
|
+
export function _getRequestContext<TEnv = DefaultEnv>():
|
|
201
364
|
| RequestContext<TEnv>
|
|
202
365
|
| undefined {
|
|
203
366
|
return requestContextStorage.getStore() as RequestContext<TEnv> | undefined;
|
|
@@ -205,28 +368,67 @@ export function getRequestContext<TEnv = unknown>():
|
|
|
205
368
|
|
|
206
369
|
/**
|
|
207
370
|
* Update params on the current request context
|
|
208
|
-
* Called after route matching to populate route params
|
|
371
|
+
* Called after route matching to populate route params and route name
|
|
209
372
|
*/
|
|
210
|
-
export function setRequestContextParams(
|
|
373
|
+
export function setRequestContextParams(
|
|
374
|
+
params: Record<string, string>,
|
|
375
|
+
routeName?: string,
|
|
376
|
+
): void {
|
|
211
377
|
const ctx = requestContextStorage.getStore();
|
|
212
378
|
if (ctx) {
|
|
213
379
|
ctx.params = params;
|
|
380
|
+
if (routeName !== undefined) {
|
|
381
|
+
ctx._routeName = routeName;
|
|
382
|
+
ctx.routeName = (
|
|
383
|
+
routeName && !isAutoGeneratedRouteName(routeName)
|
|
384
|
+
? routeName
|
|
385
|
+
: undefined
|
|
386
|
+
) as DefaultRouteName | undefined;
|
|
387
|
+
}
|
|
388
|
+
// Update reverse with scoped resolution now that route is known
|
|
389
|
+
ctx.reverse = createReverseFunction(
|
|
390
|
+
getGlobalRouteMap(),
|
|
391
|
+
routeName,
|
|
392
|
+
params,
|
|
393
|
+
routeName ? isRouteRootScoped(routeName) : undefined,
|
|
394
|
+
);
|
|
214
395
|
}
|
|
215
396
|
}
|
|
216
397
|
|
|
217
398
|
/**
|
|
218
|
-
*
|
|
219
|
-
*
|
|
399
|
+
* Store the previous route key on the request context.
|
|
400
|
+
* Called during partial-match context creation to make the navigation source
|
|
401
|
+
* route key available for revalidation and intercept evaluation.
|
|
402
|
+
* @internal
|
|
220
403
|
*/
|
|
221
|
-
export function
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
);
|
|
404
|
+
export function setRequestContextPrevRouteKey(
|
|
405
|
+
prevRouteKey: string | undefined,
|
|
406
|
+
): void {
|
|
407
|
+
const ctx = requestContextStorage.getStore();
|
|
408
|
+
if (ctx && prevRouteKey !== undefined) {
|
|
409
|
+
ctx._prevRouteKey = prevRouteKey;
|
|
228
410
|
}
|
|
229
|
-
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Get accumulated location state entries from the current request context.
|
|
415
|
+
* Returns undefined if no state has been set.
|
|
416
|
+
*
|
|
417
|
+
* @internal Used by the RSC handler to include state in payload metadata.
|
|
418
|
+
*/
|
|
419
|
+
export function getLocationState(): LocationStateEntry[] | undefined {
|
|
420
|
+
const ctx = getRequestContext();
|
|
421
|
+
return ctx?._locationState;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Get the current request context, throwing if not available
|
|
426
|
+
* @deprecated Use getRequestContext() directly — it now throws if outside context
|
|
427
|
+
*/
|
|
428
|
+
export function requireRequestContext<
|
|
429
|
+
TEnv = DefaultEnv,
|
|
430
|
+
>(): RequestContext<TEnv> {
|
|
431
|
+
return getRequestContext<TEnv>();
|
|
230
432
|
}
|
|
231
433
|
|
|
232
434
|
/**
|
|
@@ -245,8 +447,15 @@ export interface CreateRequestContextOptions<TEnv> {
|
|
|
245
447
|
request: Request;
|
|
246
448
|
url: URL;
|
|
247
449
|
variables: Record<string, any>;
|
|
450
|
+
/** Optional initial response stub headers/status to seed effective cookie reads */
|
|
451
|
+
initialResponse?: Response;
|
|
248
452
|
/** Optional cache store for segment caching (used by CacheScope) */
|
|
249
453
|
cacheStore?: SegmentCacheStore;
|
|
454
|
+
/** Optional cache profiles for "use cache" resolution (per-router) */
|
|
455
|
+
cacheProfiles?: Record<
|
|
456
|
+
string,
|
|
457
|
+
import("../cache/profile-registry.js").CacheProfile
|
|
458
|
+
>;
|
|
250
459
|
/** Optional Cloudflare execution context for waitUntil support */
|
|
251
460
|
executionContext?: ExecutionContext;
|
|
252
461
|
/** Optional theme configuration (enables ctx.theme and ctx.setTheme) */
|
|
@@ -262,20 +471,37 @@ export interface CreateRequestContextOptions<TEnv> {
|
|
|
262
471
|
* - Passed to handlers as ctx
|
|
263
472
|
*/
|
|
264
473
|
export function createRequestContext<TEnv>(
|
|
265
|
-
options: CreateRequestContextOptions<TEnv
|
|
474
|
+
options: CreateRequestContextOptions<TEnv>,
|
|
266
475
|
): RequestContext<TEnv> {
|
|
267
|
-
const {
|
|
476
|
+
const {
|
|
477
|
+
env,
|
|
478
|
+
request,
|
|
479
|
+
url,
|
|
480
|
+
variables,
|
|
481
|
+
initialResponse,
|
|
482
|
+
cacheStore,
|
|
483
|
+
cacheProfiles,
|
|
484
|
+
executionContext,
|
|
485
|
+
themeConfig,
|
|
486
|
+
} = options;
|
|
268
487
|
const cookieHeader = request.headers.get("Cookie");
|
|
269
488
|
let parsedCookies: Record<string, string> | null = null;
|
|
270
489
|
|
|
271
|
-
// Create stub response for collecting headers/cookies
|
|
272
|
-
|
|
490
|
+
// Create stub response for collecting headers/cookies.
|
|
491
|
+
// All cookie/header mutations go here; cookie reads derive from it.
|
|
492
|
+
let stubResponse = initialResponse
|
|
493
|
+
? new Response(null, {
|
|
494
|
+
status: initialResponse.status,
|
|
495
|
+
statusText: initialResponse.statusText,
|
|
496
|
+
headers: new Headers(initialResponse.headers),
|
|
497
|
+
})
|
|
498
|
+
: new Response(null, { status: 200 });
|
|
273
499
|
|
|
274
500
|
// Create handle store and loader memoization for this request
|
|
275
501
|
const handleStore = createHandleStore();
|
|
276
502
|
const loaderPromises = new Map<string, Promise<any>>();
|
|
277
503
|
|
|
278
|
-
// Lazy parse cookies
|
|
504
|
+
// Lazy parse cookies from the original Cookie header
|
|
279
505
|
const getParsedCookies = (): Record<string, string> => {
|
|
280
506
|
if (!parsedCookies) {
|
|
281
507
|
parsedCookies = parseCookiesFromHeader(cookieHeader);
|
|
@@ -283,11 +509,47 @@ export function createRequestContext<TEnv>(
|
|
|
283
509
|
return parsedCookies;
|
|
284
510
|
};
|
|
285
511
|
|
|
512
|
+
// Cached response cookie mutations — invalidated on setCookie/deleteCookie/setTheme
|
|
513
|
+
let responseCookieCache: Map<string, string | null> | null = null;
|
|
514
|
+
const getResponseCookies = (): Map<string, string | null> => {
|
|
515
|
+
if (!responseCookieCache) {
|
|
516
|
+
responseCookieCache = parseResponseCookies(stubResponse);
|
|
517
|
+
}
|
|
518
|
+
return responseCookieCache;
|
|
519
|
+
};
|
|
520
|
+
const invalidateResponseCookieCache = () => {
|
|
521
|
+
responseCookieCache = null;
|
|
522
|
+
};
|
|
523
|
+
|
|
524
|
+
// Guard: throw if a response-level side effect is called inside a cache() scope.
|
|
525
|
+
// Uses ALS to detect the scope (set during segment resolution).
|
|
526
|
+
function assertNotInsideCacheScopeALS(methodName: string): void {
|
|
527
|
+
if (isInsideCacheScope()) {
|
|
528
|
+
throw new Error(
|
|
529
|
+
`ctx.${methodName}() cannot be called inside a cache() boundary. ` +
|
|
530
|
+
`On cache hit the handler is skipped, so this side effect would be lost. ` +
|
|
531
|
+
`Move ctx.${methodName}() to a middleware or layout outside the cache() scope.`,
|
|
532
|
+
);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
// Effective cookie read: response stub Set-Cookie wins, then original header.
|
|
537
|
+
// The stub IS the source of truth for same-request mutations.
|
|
538
|
+
const effectiveCookie = (name: string): string | undefined => {
|
|
539
|
+
const mutations = getResponseCookies();
|
|
540
|
+
if (mutations.has(name)) {
|
|
541
|
+
const v = mutations.get(name);
|
|
542
|
+
return v === null ? undefined : v;
|
|
543
|
+
}
|
|
544
|
+
return getParsedCookies()[name];
|
|
545
|
+
};
|
|
546
|
+
|
|
286
547
|
// Theme helpers (only used when themeConfig is provided)
|
|
287
548
|
const getTheme = (): Theme | undefined => {
|
|
288
549
|
if (!themeConfig) return undefined;
|
|
289
550
|
|
|
290
|
-
|
|
551
|
+
// Use overlay-aware read so setTheme() in the same request is reflected
|
|
552
|
+
const stored = effectiveCookie(themeConfig.storageKey);
|
|
291
553
|
if (stored) {
|
|
292
554
|
// Validate stored value
|
|
293
555
|
if (stored === "system" && themeConfig.enableSystem) {
|
|
@@ -305,65 +567,129 @@ export function createRequestContext<TEnv>(
|
|
|
305
567
|
|
|
306
568
|
// Validate theme value
|
|
307
569
|
if (theme !== "system" && !themeConfig.themes.includes(theme)) {
|
|
308
|
-
console.warn(
|
|
570
|
+
console.warn(
|
|
571
|
+
`[Theme] Invalid theme value: "${theme}". Valid values: system, ${themeConfig.themes.join(", ")}`,
|
|
572
|
+
);
|
|
309
573
|
return;
|
|
310
574
|
}
|
|
311
575
|
|
|
312
|
-
//
|
|
576
|
+
// Write to stub — effectiveCookie() will pick it up on next read
|
|
313
577
|
stubResponse.headers.append(
|
|
314
578
|
"Set-Cookie",
|
|
315
579
|
serializeCookieValue(themeConfig.storageKey, theme, {
|
|
316
580
|
path: THEME_COOKIE.path,
|
|
317
581
|
maxAge: THEME_COOKIE.maxAge,
|
|
318
582
|
sameSite: THEME_COOKIE.sameSite,
|
|
319
|
-
})
|
|
583
|
+
}),
|
|
320
584
|
);
|
|
585
|
+
invalidateResponseCookieCache();
|
|
321
586
|
};
|
|
322
587
|
|
|
588
|
+
// Strip internal _rsc* params so userland sees a clean URL.
|
|
589
|
+
const cleanUrl = stripInternalParams(url);
|
|
590
|
+
|
|
323
591
|
// Build the context object first (without use), then add use
|
|
324
592
|
const ctx: RequestContext<TEnv> = {
|
|
325
593
|
env,
|
|
326
594
|
request,
|
|
327
|
-
url,
|
|
595
|
+
url: cleanUrl,
|
|
596
|
+
originalUrl: new URL(request.url),
|
|
328
597
|
pathname: url.pathname,
|
|
329
|
-
searchParams:
|
|
330
|
-
|
|
331
|
-
get:
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
598
|
+
searchParams: cleanUrl.searchParams,
|
|
599
|
+
_variables: variables,
|
|
600
|
+
get: ((keyOrVar: any) => {
|
|
601
|
+
if (isNonCacheable(variables, keyOrVar) && isInsideCacheScope()) {
|
|
602
|
+
throw new Error(
|
|
603
|
+
`ctx.get() for a non-cacheable variable cannot be called inside a cache() boundary. ` +
|
|
604
|
+
`The variable was created with { cache: false } or set with { cache: false }, ` +
|
|
605
|
+
`and its value would be stale on cache hit. Move the read outside the cached scope.`,
|
|
606
|
+
);
|
|
607
|
+
}
|
|
608
|
+
return contextGet(variables, keyOrVar);
|
|
609
|
+
}) as RequestContext<TEnv>["get"],
|
|
610
|
+
set: ((keyOrVar: any, value: any, options?: any) => {
|
|
611
|
+
assertNotInsideCacheExec(ctx, "set");
|
|
612
|
+
contextSet(variables, keyOrVar, value, options);
|
|
613
|
+
}) as RequestContext<TEnv>["set"],
|
|
335
614
|
params: {} as Record<string, string>,
|
|
336
|
-
|
|
615
|
+
|
|
616
|
+
get res(): Response {
|
|
617
|
+
return stubResponse;
|
|
618
|
+
},
|
|
619
|
+
set res(_: Response) {
|
|
620
|
+
throw new Error(
|
|
621
|
+
"ctx.res is read-only. Use ctx.header() to set response headers, or cookies() for cookie mutations.",
|
|
622
|
+
);
|
|
623
|
+
},
|
|
337
624
|
|
|
338
625
|
cookie(name: string): string | undefined {
|
|
339
|
-
return
|
|
626
|
+
return effectiveCookie(name);
|
|
340
627
|
},
|
|
341
628
|
|
|
342
629
|
cookies(): Record<string, string> {
|
|
343
|
-
|
|
630
|
+
const parsed = getParsedCookies();
|
|
631
|
+
const mutations = getResponseCookies();
|
|
632
|
+
if (mutations.size === 0) return { ...parsed };
|
|
633
|
+
// Build result without delete (avoids V8 dictionary-mode de-opt)
|
|
634
|
+
const deleted = new Set<string>();
|
|
635
|
+
for (const [k, v] of mutations) {
|
|
636
|
+
if (v === null) deleted.add(k);
|
|
637
|
+
}
|
|
638
|
+
const result: Record<string, string> = {};
|
|
639
|
+
for (const key of Object.keys(parsed)) {
|
|
640
|
+
if (!deleted.has(key)) result[key] = parsed[key];
|
|
641
|
+
}
|
|
642
|
+
for (const [k, v] of mutations) {
|
|
643
|
+
if (v !== null) result[k] = v;
|
|
644
|
+
}
|
|
645
|
+
return result;
|
|
344
646
|
},
|
|
345
647
|
|
|
346
648
|
setCookie(name: string, value: string, options?: CookieOptions): void {
|
|
649
|
+
assertNotInsideCacheExec(ctx, "setCookie");
|
|
650
|
+
assertNotInsideCacheScopeALS("setCookie");
|
|
347
651
|
stubResponse.headers.append(
|
|
348
652
|
"Set-Cookie",
|
|
349
|
-
serializeCookieValue(name, value, options)
|
|
653
|
+
serializeCookieValue(name, value, options),
|
|
350
654
|
);
|
|
655
|
+
invalidateResponseCookieCache();
|
|
351
656
|
},
|
|
352
657
|
|
|
353
658
|
deleteCookie(
|
|
354
659
|
name: string,
|
|
355
|
-
options?: Pick<CookieOptions, "domain" | "path"
|
|
660
|
+
options?: Pick<CookieOptions, "domain" | "path">,
|
|
356
661
|
): void {
|
|
662
|
+
assertNotInsideCacheExec(ctx, "deleteCookie");
|
|
663
|
+
assertNotInsideCacheScopeALS("deleteCookie");
|
|
357
664
|
stubResponse.headers.append(
|
|
358
665
|
"Set-Cookie",
|
|
359
|
-
serializeCookieValue(name, "", { ...options, maxAge: 0 })
|
|
666
|
+
serializeCookieValue(name, "", { ...options, maxAge: 0 }),
|
|
360
667
|
);
|
|
668
|
+
invalidateResponseCookieCache();
|
|
361
669
|
},
|
|
362
670
|
|
|
363
671
|
header(name: string, value: string): void {
|
|
672
|
+
assertNotInsideCacheExec(ctx, "header");
|
|
673
|
+
assertNotInsideCacheScopeALS("header");
|
|
364
674
|
stubResponse.headers.set(name, value);
|
|
365
675
|
},
|
|
366
676
|
|
|
677
|
+
setStatus(status: number): void {
|
|
678
|
+
assertNotInsideCacheExec(ctx, "setStatus");
|
|
679
|
+
assertNotInsideCacheScopeALS("setStatus");
|
|
680
|
+
stubResponse = new Response(null, {
|
|
681
|
+
status,
|
|
682
|
+
headers: stubResponse.headers,
|
|
683
|
+
});
|
|
684
|
+
},
|
|
685
|
+
|
|
686
|
+
_setStatus(status: number): void {
|
|
687
|
+
stubResponse = new Response(null, {
|
|
688
|
+
status,
|
|
689
|
+
headers: stubResponse.headers,
|
|
690
|
+
});
|
|
691
|
+
},
|
|
692
|
+
|
|
367
693
|
// Placeholder - will be replaced below
|
|
368
694
|
use: null as any,
|
|
369
695
|
|
|
@@ -371,6 +697,7 @@ export function createRequestContext<TEnv>(
|
|
|
371
697
|
|
|
372
698
|
_handleStore: handleStore,
|
|
373
699
|
_cacheStore: cacheStore,
|
|
700
|
+
_cacheProfiles: cacheProfiles,
|
|
374
701
|
|
|
375
702
|
waitUntil(fn: () => Promise<void>): void {
|
|
376
703
|
if (executionContext?.waitUntil) {
|
|
@@ -378,20 +705,45 @@ export function createRequestContext<TEnv>(
|
|
|
378
705
|
executionContext.waitUntil(fn());
|
|
379
706
|
} else {
|
|
380
707
|
// Node.js / dev: fire-and-forget with error logging
|
|
381
|
-
fn().catch((err) =>
|
|
708
|
+
fn().catch((err) =>
|
|
709
|
+
console.error("[waitUntil] Background task failed:", err),
|
|
710
|
+
);
|
|
382
711
|
}
|
|
383
712
|
},
|
|
384
713
|
|
|
385
714
|
_onResponseCallbacks: [],
|
|
386
715
|
|
|
387
716
|
onResponse(callback: (response: Response) => Response): void {
|
|
717
|
+
assertNotInsideCacheExec(ctx, "onResponse");
|
|
718
|
+
assertNotInsideCacheScopeALS("onResponse");
|
|
388
719
|
this._onResponseCallbacks.push(callback);
|
|
389
720
|
},
|
|
390
721
|
|
|
391
722
|
// Theme properties (only set when themeConfig is provided)
|
|
392
|
-
theme
|
|
393
|
-
|
|
723
|
+
get theme() {
|
|
724
|
+
return themeConfig ? getTheme() : undefined;
|
|
725
|
+
},
|
|
726
|
+
setTheme: themeConfig
|
|
727
|
+
? (theme: Theme) => {
|
|
728
|
+
assertNotInsideCacheExec(ctx, "setTheme");
|
|
729
|
+
setTheme(theme);
|
|
730
|
+
}
|
|
731
|
+
: undefined,
|
|
394
732
|
_themeConfig: themeConfig,
|
|
733
|
+
|
|
734
|
+
setLocationState(entries: LocationStateEntry | LocationStateEntry[]): void {
|
|
735
|
+
assertNotInsideCacheExec(ctx, "setLocationState");
|
|
736
|
+
const arr = Array.isArray(entries) ? entries : [entries];
|
|
737
|
+
this._locationState = this._locationState
|
|
738
|
+
? [...this._locationState, ...arr]
|
|
739
|
+
: arr;
|
|
740
|
+
},
|
|
741
|
+
_locationState: undefined,
|
|
742
|
+
|
|
743
|
+
_reportedErrors: new WeakSet<object>(),
|
|
744
|
+
_metricsStore: undefined,
|
|
745
|
+
|
|
746
|
+
reverse: createReverseFunction(getGlobalRouteMap(), undefined, {}),
|
|
395
747
|
};
|
|
396
748
|
|
|
397
749
|
// Now create use() with access to ctx
|
|
@@ -401,14 +753,53 @@ export function createRequestContext<TEnv>(
|
|
|
401
753
|
getContext: () => ctx,
|
|
402
754
|
});
|
|
403
755
|
|
|
756
|
+
// Brand with taint symbol so "use cache" excludes ctx from cache keys
|
|
757
|
+
(ctx as any)[NOCACHE_SYMBOL] = true;
|
|
404
758
|
return ctx;
|
|
405
759
|
}
|
|
406
760
|
|
|
761
|
+
/**
|
|
762
|
+
* Parse Set-Cookie headers from a response into effective cookie state.
|
|
763
|
+
* Returns a map of cookie name -> value (string) or name -> null (deleted).
|
|
764
|
+
* Last-write-wins: later Set-Cookie entries for the same name overwrite earlier ones.
|
|
765
|
+
* Max-Age=0 is treated as a delete.
|
|
766
|
+
*/
|
|
767
|
+
const MAX_AGE_ZERO_RE = /;\s*Max-Age\s*=\s*0/i;
|
|
768
|
+
|
|
769
|
+
function parseResponseCookies(response: Response): Map<string, string | null> {
|
|
770
|
+
const result = new Map<string, string | null>();
|
|
771
|
+
const setCookies = response.headers.getSetCookie();
|
|
772
|
+
|
|
773
|
+
for (const header of setCookies) {
|
|
774
|
+
// First segment before ';' is the name=value pair
|
|
775
|
+
const semiIdx = header.indexOf(";");
|
|
776
|
+
const pair = semiIdx === -1 ? header : header.substring(0, semiIdx);
|
|
777
|
+
const eqIdx = pair.indexOf("=");
|
|
778
|
+
if (eqIdx === -1) continue;
|
|
779
|
+
|
|
780
|
+
let name: string;
|
|
781
|
+
let value: string;
|
|
782
|
+
try {
|
|
783
|
+
name = decodeURIComponent(pair.substring(0, eqIdx).trim());
|
|
784
|
+
value = decodeURIComponent(pair.substring(eqIdx + 1).trim());
|
|
785
|
+
} catch {
|
|
786
|
+
// Malformed encoding — skip this entry
|
|
787
|
+
continue;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
// Max-Age=0 means the cookie is being deleted
|
|
791
|
+
const isDeleted = MAX_AGE_ZERO_RE.test(header);
|
|
792
|
+
result.set(name, isDeleted ? null : value);
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
return result;
|
|
796
|
+
}
|
|
797
|
+
|
|
407
798
|
/**
|
|
408
799
|
* Parse cookies from Cookie header
|
|
409
800
|
*/
|
|
410
801
|
function parseCookiesFromHeader(
|
|
411
|
-
cookieHeader: string | null
|
|
802
|
+
cookieHeader: string | null,
|
|
412
803
|
): Record<string, string> {
|
|
413
804
|
if (!cookieHeader) return {};
|
|
414
805
|
|
|
@@ -418,7 +809,13 @@ function parseCookiesFromHeader(
|
|
|
418
809
|
for (const pair of pairs) {
|
|
419
810
|
const [name, ...rest] = pair.trim().split("=");
|
|
420
811
|
if (name) {
|
|
421
|
-
|
|
812
|
+
const raw = rest.join("=");
|
|
813
|
+
try {
|
|
814
|
+
cookies[name] = decodeURIComponent(raw);
|
|
815
|
+
} catch {
|
|
816
|
+
// Malformed percent-encoded value (e.g. %zz, %2) - fall back to raw value
|
|
817
|
+
cookies[name] = raw;
|
|
818
|
+
}
|
|
422
819
|
}
|
|
423
820
|
}
|
|
424
821
|
|
|
@@ -431,7 +828,7 @@ function parseCookiesFromHeader(
|
|
|
431
828
|
function serializeCookieValue(
|
|
432
829
|
name: string,
|
|
433
830
|
value: string,
|
|
434
|
-
options: CookieOptions = {}
|
|
831
|
+
options: CookieOptions = {},
|
|
435
832
|
): string {
|
|
436
833
|
let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
|
|
437
834
|
|
|
@@ -463,7 +860,7 @@ export interface CreateUseFunctionOptions<TEnv> {
|
|
|
463
860
|
* - For handles: returns a push function to add handle data
|
|
464
861
|
*/
|
|
465
862
|
export function createUseFunction<TEnv>(
|
|
466
|
-
options: CreateUseFunctionOptions<TEnv
|
|
863
|
+
options: CreateUseFunctionOptions<TEnv>,
|
|
467
864
|
): RequestContext["use"] {
|
|
468
865
|
const { handleStore, loaderPromises, getContext } = options;
|
|
469
866
|
|
|
@@ -477,16 +874,19 @@ export function createUseFunction<TEnv>(
|
|
|
477
874
|
if (!segmentId) {
|
|
478
875
|
throw new Error(
|
|
479
876
|
`Handle "${handle.$$id}" used outside of handler context. ` +
|
|
480
|
-
`Handles must be used within route/layout handlers
|
|
877
|
+
`Handles must be used within route/layout handlers.`,
|
|
481
878
|
);
|
|
482
879
|
}
|
|
483
880
|
|
|
484
881
|
// Return a push function bound to this handle and segment
|
|
485
|
-
return (
|
|
882
|
+
return (
|
|
883
|
+
dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>),
|
|
884
|
+
) => {
|
|
486
885
|
// If it's a function, call it immediately to get the promise
|
|
487
|
-
const valueOrPromise =
|
|
488
|
-
|
|
489
|
-
|
|
886
|
+
const valueOrPromise =
|
|
887
|
+
typeof dataOrFn === "function"
|
|
888
|
+
? (dataOrFn as () => Promise<unknown>)()
|
|
889
|
+
: dataOrFn;
|
|
490
890
|
|
|
491
891
|
// Push directly - promises will be serialized by RSC and streamed
|
|
492
892
|
handleStore.push(handle.$$id, segmentId, valueOrPromise);
|
|
@@ -504,8 +904,6 @@ export function createUseFunction<TEnv>(
|
|
|
504
904
|
// Get loader function - either from loader object or fetchable registry
|
|
505
905
|
let loaderFn = loader.fn;
|
|
506
906
|
if (!loaderFn) {
|
|
507
|
-
// Lazy import to avoid circular dependency
|
|
508
|
-
const { getFetchableLoader } = require("../loader.rsc.js");
|
|
509
907
|
const fetchable = getFetchableLoader(loader.$$id);
|
|
510
908
|
if (fetchable) {
|
|
511
909
|
loaderFn = fetchable.fn;
|
|
@@ -514,7 +912,7 @@ export function createUseFunction<TEnv>(
|
|
|
514
912
|
|
|
515
913
|
if (!loaderFn) {
|
|
516
914
|
throw new Error(
|
|
517
|
-
`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
|
|
915
|
+
`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.`,
|
|
518
916
|
);
|
|
519
917
|
}
|
|
520
918
|
|
|
@@ -523,25 +921,31 @@ export function createUseFunction<TEnv>(
|
|
|
523
921
|
// Create loader context with recursive use() support
|
|
524
922
|
const loaderCtx: LoaderContext<Record<string, string | undefined>, TEnv> = {
|
|
525
923
|
params: ctx.params,
|
|
924
|
+
routeParams: (ctx.params ?? {}) as Record<string, string>,
|
|
526
925
|
request: ctx.request,
|
|
527
926
|
searchParams: ctx.searchParams,
|
|
927
|
+
search: (ctx as any).search ?? {},
|
|
528
928
|
pathname: ctx.pathname,
|
|
529
929
|
url: ctx.url,
|
|
530
930
|
env: ctx.env as any,
|
|
531
|
-
var: ctx.var as any,
|
|
532
931
|
get: ctx.get as any,
|
|
533
932
|
use: <TDep, TDepParams = any>(
|
|
534
|
-
dep: LoaderDefinition<TDep, TDepParams
|
|
933
|
+
dep: LoaderDefinition<TDep, TDepParams>,
|
|
535
934
|
): Promise<TDep> => {
|
|
536
935
|
// Recursive call - will start dep loader if not already started
|
|
537
936
|
return ctx.use(dep);
|
|
538
937
|
},
|
|
539
938
|
method: "GET",
|
|
540
939
|
body: undefined,
|
|
940
|
+
reverse: createReverseFunction(
|
|
941
|
+
getGlobalRouteMap(),
|
|
942
|
+
ctx._routeName,
|
|
943
|
+
ctx.params as Record<string, string>,
|
|
944
|
+
ctx._routeName ? isRouteRootScoped(ctx._routeName) : undefined,
|
|
945
|
+
),
|
|
541
946
|
};
|
|
542
947
|
|
|
543
|
-
|
|
544
|
-
const doneLoader = track(`loader:${loader.$$id}`);
|
|
948
|
+
const doneLoader = track(`loader:${loader.$$id}`, 2);
|
|
545
949
|
const promise = Promise.resolve(loaderFn(loaderCtx)).finally(() => {
|
|
546
950
|
doneLoader();
|
|
547
951
|
});
|