@rangojs/router 0.0.0-experimental.9 → 0.0.0-experimental.9c87b9aa
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 +884 -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 +1536 -155
- 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 +4450 -2226
- 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} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +69 -62
- 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 +6 -4
- package/skills/hooks/SKILL.md +333 -71
- 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 +74 -15
- package/skills/loader/SKILL.md +403 -43
- package/skills/middleware/SKILL.md +171 -34
- package/skills/mime-routes/SKILL.md +15 -11
- package/skills/parallel/SKILL.md +204 -1
- package/skills/prerender/SKILL.md +405 -45
- package/skills/rango/SKILL.md +85 -21
- package/skills/response-routes/SKILL.md +144 -91
- package/skills/route/SKILL.md +257 -14
- package/skills/router-setup/SKILL.md +123 -30
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +326 -87
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -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 +282 -557
- package/src/browser/navigation-client.ts +156 -73
- package/src/browser/navigation-store.ts +33 -50
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +303 -310
- package/src/browser/prefetch/cache.ts +206 -0
- package/src/browser/prefetch/fetch.ts +144 -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 +190 -70
- package/src/browser/react/NavigationProvider.tsx +78 -11
- package/src/browser/react/context.ts +6 -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 +29 -70
- 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 +63 -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 +188 -57
- package/src/browser/scroll-restoration.ts +117 -44
- package/src/browser/segment-reconciler.ts +221 -0
- package/src/browser/segment-structure-assert.ts +16 -0
- package/src/browser/server-action-bridge.ts +504 -599
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +116 -47
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +82 -21
- package/src/build/generate-route-types.ts +36 -752
- package/src/build/index.ts +6 -5
- package/src/build/route-trie.ts +39 -13
- 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 +411 -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 +479 -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 -307
- 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 +84 -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 +77 -7
- package/src/handle.ts +15 -10
- 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 +4 -7
- package/src/host/pattern-matcher.ts +27 -27
- package/src/host/router.ts +61 -39
- package/src/host/testing.ts +8 -8
- package/src/host/types.ts +15 -7
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +65 -45
- package/src/index.rsc.ts +133 -21
- package/src/index.ts +164 -52
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +25 -143
- 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 +4 -2
- package/src/prerender/store.ts +158 -13
- package/src/prerender.ts +333 -26
- package/src/reverse.ts +184 -121
- 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 +93 -0
- package/src/route-definition.ts +1 -1431
- package/src/route-map-builder.ts +162 -123
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +48 -9
- 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 +400 -84
- package/src/router/intercept-resolution.ts +26 -16
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +222 -123
- package/src/router/logging.ts +251 -0
- package/src/router/manifest.ts +89 -32
- package/src/router/match-api.ts +118 -119
- package/src/router/match-context.ts +4 -2
- 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 +394 -85
- package/src/router/match-middleware/cache-store.ts +91 -29
- package/src/router/match-middleware/intercept-resolution.ts +48 -21
- package/src/router/match-middleware/segment-resolution.ts +20 -9
- 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 +226 -0
- package/src/router/middleware.ts +327 -369
- package/src/router/pattern-matching.ts +197 -41
- 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 +452 -0
- package/src/router/router-options.ts +592 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +683 -0
- package/src/router/segment-resolution/helpers.ts +263 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1301 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -1315
- 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 +96 -29
- package/src/router/types.ts +16 -9
- package/src/router.ts +594 -1983
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +661 -1015
- 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 +86 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +379 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +237 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +348 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +38 -11
- package/src/search-params.ts +230 -0
- package/src/segment-system.tsx +165 -17
- package/src/server/context.ts +270 -56
- 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 +15 -56
- package/src/server/request-context.ts +474 -74
- package/src/server.ts +35 -155
- package/src/ssr/index.tsx +101 -31
- 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 +785 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +183 -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 -1757
- 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 +95 -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 -1282
- package/src/use-loader.tsx +85 -77
- package/src/vite/discovery/bundle-postprocess.ts +184 -0
- package/src/vite/discovery/discover-routers.ts +344 -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 -1963
- 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/refresh-cmd.ts +65 -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 +445 -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 +169 -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/urls.gen.ts +0 -8
- 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/expose-prerender-handler-id.ts +0 -429
- /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
72
|
/** Variables set by middleware (same as ctx.var) */
|
|
45
73
|
var: 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,99 @@ 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;
|
|
180
290
|
}
|
|
181
291
|
|
|
292
|
+
/**
|
|
293
|
+
* Public view of RequestContext, without internal methods and fields.
|
|
294
|
+
*
|
|
295
|
+
* This is the type exported to library consumers. Internal code should
|
|
296
|
+
* use the full RequestContext interface directly.
|
|
297
|
+
*/
|
|
298
|
+
export type PublicRequestContext<
|
|
299
|
+
TEnv = DefaultEnv,
|
|
300
|
+
TParams = Record<string, string>,
|
|
301
|
+
> = Omit<
|
|
302
|
+
RequestContext<TEnv, TParams>,
|
|
303
|
+
| "cookie"
|
|
304
|
+
| "cookies"
|
|
305
|
+
| "setCookie"
|
|
306
|
+
| "deleteCookie"
|
|
307
|
+
| "_handleStore"
|
|
308
|
+
| "_cacheStore"
|
|
309
|
+
| "_cacheProfiles"
|
|
310
|
+
| "_onResponseCallbacks"
|
|
311
|
+
| "_themeConfig"
|
|
312
|
+
| "_locationState"
|
|
313
|
+
| "_routeName"
|
|
314
|
+
| "_prevRouteKey"
|
|
315
|
+
| "_reportedErrors"
|
|
316
|
+
| "_reportBackgroundError"
|
|
317
|
+
| "_debugPerformance"
|
|
318
|
+
| "_metricsStore"
|
|
319
|
+
| "_setStatus"
|
|
320
|
+
| "res"
|
|
321
|
+
>;
|
|
322
|
+
|
|
182
323
|
// AsyncLocalStorage instance for request context
|
|
183
324
|
const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
|
|
184
325
|
|
|
@@ -188,16 +329,33 @@ const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
|
|
|
188
329
|
*/
|
|
189
330
|
export function runWithRequestContext<TEnv, T>(
|
|
190
331
|
context: RequestContext<TEnv>,
|
|
191
|
-
fn: () => T
|
|
332
|
+
fn: () => T,
|
|
192
333
|
): T {
|
|
193
334
|
return requestContextStorage.run(context, fn);
|
|
194
335
|
}
|
|
195
336
|
|
|
196
337
|
/**
|
|
197
338
|
* Get the current request context
|
|
198
|
-
*
|
|
339
|
+
* Throws if called outside of a request context
|
|
340
|
+
*/
|
|
341
|
+
export function getRequestContext<TEnv = DefaultEnv>(): RequestContext<TEnv> {
|
|
342
|
+
const ctx = requestContextStorage.getStore() as
|
|
343
|
+
| RequestContext<TEnv>
|
|
344
|
+
| undefined;
|
|
345
|
+
invariant(
|
|
346
|
+
ctx,
|
|
347
|
+
"getRequestContext() called outside of a request context. " +
|
|
348
|
+
"This function must be called from within a route handler, loader, middleware, " +
|
|
349
|
+
"server action, or server component.",
|
|
350
|
+
);
|
|
351
|
+
return ctx;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* @internal Get the request context without throwing — for internal code that
|
|
356
|
+
* may run outside a request context (cache stores, optional handle lookups, etc.)
|
|
199
357
|
*/
|
|
200
|
-
export function
|
|
358
|
+
export function _getRequestContext<TEnv = DefaultEnv>():
|
|
201
359
|
| RequestContext<TEnv>
|
|
202
360
|
| undefined {
|
|
203
361
|
return requestContextStorage.getStore() as RequestContext<TEnv> | undefined;
|
|
@@ -205,28 +363,67 @@ export function getRequestContext<TEnv = unknown>():
|
|
|
205
363
|
|
|
206
364
|
/**
|
|
207
365
|
* Update params on the current request context
|
|
208
|
-
* Called after route matching to populate route params
|
|
366
|
+
* Called after route matching to populate route params and route name
|
|
209
367
|
*/
|
|
210
|
-
export function setRequestContextParams(
|
|
368
|
+
export function setRequestContextParams(
|
|
369
|
+
params: Record<string, string>,
|
|
370
|
+
routeName?: string,
|
|
371
|
+
): void {
|
|
211
372
|
const ctx = requestContextStorage.getStore();
|
|
212
373
|
if (ctx) {
|
|
213
374
|
ctx.params = params;
|
|
375
|
+
if (routeName !== undefined) {
|
|
376
|
+
ctx._routeName = routeName;
|
|
377
|
+
ctx.routeName = (
|
|
378
|
+
routeName && !isAutoGeneratedRouteName(routeName)
|
|
379
|
+
? routeName
|
|
380
|
+
: undefined
|
|
381
|
+
) as DefaultRouteName | undefined;
|
|
382
|
+
}
|
|
383
|
+
// Update reverse with scoped resolution now that route is known
|
|
384
|
+
ctx.reverse = createReverseFunction(
|
|
385
|
+
getGlobalRouteMap(),
|
|
386
|
+
routeName,
|
|
387
|
+
params,
|
|
388
|
+
routeName ? isRouteRootScoped(routeName) : undefined,
|
|
389
|
+
);
|
|
214
390
|
}
|
|
215
391
|
}
|
|
216
392
|
|
|
217
393
|
/**
|
|
218
|
-
*
|
|
219
|
-
*
|
|
394
|
+
* Store the previous route key on the request context.
|
|
395
|
+
* Called during partial-match context creation to make the navigation source
|
|
396
|
+
* route key available for revalidation and intercept evaluation.
|
|
397
|
+
* @internal
|
|
220
398
|
*/
|
|
221
|
-
export function
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
);
|
|
399
|
+
export function setRequestContextPrevRouteKey(
|
|
400
|
+
prevRouteKey: string | undefined,
|
|
401
|
+
): void {
|
|
402
|
+
const ctx = requestContextStorage.getStore();
|
|
403
|
+
if (ctx && prevRouteKey !== undefined) {
|
|
404
|
+
ctx._prevRouteKey = prevRouteKey;
|
|
228
405
|
}
|
|
229
|
-
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Get accumulated location state entries from the current request context.
|
|
410
|
+
* Returns undefined if no state has been set.
|
|
411
|
+
*
|
|
412
|
+
* @internal Used by the RSC handler to include state in payload metadata.
|
|
413
|
+
*/
|
|
414
|
+
export function getLocationState(): LocationStateEntry[] | undefined {
|
|
415
|
+
const ctx = getRequestContext();
|
|
416
|
+
return ctx?._locationState;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Get the current request context, throwing if not available
|
|
421
|
+
* @deprecated Use getRequestContext() directly — it now throws if outside context
|
|
422
|
+
*/
|
|
423
|
+
export function requireRequestContext<
|
|
424
|
+
TEnv = DefaultEnv,
|
|
425
|
+
>(): RequestContext<TEnv> {
|
|
426
|
+
return getRequestContext<TEnv>();
|
|
230
427
|
}
|
|
231
428
|
|
|
232
429
|
/**
|
|
@@ -245,8 +442,15 @@ export interface CreateRequestContextOptions<TEnv> {
|
|
|
245
442
|
request: Request;
|
|
246
443
|
url: URL;
|
|
247
444
|
variables: Record<string, any>;
|
|
445
|
+
/** Optional initial response stub headers/status to seed effective cookie reads */
|
|
446
|
+
initialResponse?: Response;
|
|
248
447
|
/** Optional cache store for segment caching (used by CacheScope) */
|
|
249
448
|
cacheStore?: SegmentCacheStore;
|
|
449
|
+
/** Optional cache profiles for "use cache" resolution (per-router) */
|
|
450
|
+
cacheProfiles?: Record<
|
|
451
|
+
string,
|
|
452
|
+
import("../cache/profile-registry.js").CacheProfile
|
|
453
|
+
>;
|
|
250
454
|
/** Optional Cloudflare execution context for waitUntil support */
|
|
251
455
|
executionContext?: ExecutionContext;
|
|
252
456
|
/** Optional theme configuration (enables ctx.theme and ctx.setTheme) */
|
|
@@ -262,20 +466,37 @@ export interface CreateRequestContextOptions<TEnv> {
|
|
|
262
466
|
* - Passed to handlers as ctx
|
|
263
467
|
*/
|
|
264
468
|
export function createRequestContext<TEnv>(
|
|
265
|
-
options: CreateRequestContextOptions<TEnv
|
|
469
|
+
options: CreateRequestContextOptions<TEnv>,
|
|
266
470
|
): RequestContext<TEnv> {
|
|
267
|
-
const {
|
|
471
|
+
const {
|
|
472
|
+
env,
|
|
473
|
+
request,
|
|
474
|
+
url,
|
|
475
|
+
variables,
|
|
476
|
+
initialResponse,
|
|
477
|
+
cacheStore,
|
|
478
|
+
cacheProfiles,
|
|
479
|
+
executionContext,
|
|
480
|
+
themeConfig,
|
|
481
|
+
} = options;
|
|
268
482
|
const cookieHeader = request.headers.get("Cookie");
|
|
269
483
|
let parsedCookies: Record<string, string> | null = null;
|
|
270
484
|
|
|
271
|
-
// Create stub response for collecting headers/cookies
|
|
272
|
-
|
|
485
|
+
// Create stub response for collecting headers/cookies.
|
|
486
|
+
// All cookie/header mutations go here; cookie reads derive from it.
|
|
487
|
+
let stubResponse = initialResponse
|
|
488
|
+
? new Response(null, {
|
|
489
|
+
status: initialResponse.status,
|
|
490
|
+
statusText: initialResponse.statusText,
|
|
491
|
+
headers: new Headers(initialResponse.headers),
|
|
492
|
+
})
|
|
493
|
+
: new Response(null, { status: 200 });
|
|
273
494
|
|
|
274
495
|
// Create handle store and loader memoization for this request
|
|
275
496
|
const handleStore = createHandleStore();
|
|
276
497
|
const loaderPromises = new Map<string, Promise<any>>();
|
|
277
498
|
|
|
278
|
-
// Lazy parse cookies
|
|
499
|
+
// Lazy parse cookies from the original Cookie header
|
|
279
500
|
const getParsedCookies = (): Record<string, string> => {
|
|
280
501
|
if (!parsedCookies) {
|
|
281
502
|
parsedCookies = parseCookiesFromHeader(cookieHeader);
|
|
@@ -283,11 +504,47 @@ export function createRequestContext<TEnv>(
|
|
|
283
504
|
return parsedCookies;
|
|
284
505
|
};
|
|
285
506
|
|
|
507
|
+
// Cached response cookie mutations — invalidated on setCookie/deleteCookie/setTheme
|
|
508
|
+
let responseCookieCache: Map<string, string | null> | null = null;
|
|
509
|
+
const getResponseCookies = (): Map<string, string | null> => {
|
|
510
|
+
if (!responseCookieCache) {
|
|
511
|
+
responseCookieCache = parseResponseCookies(stubResponse);
|
|
512
|
+
}
|
|
513
|
+
return responseCookieCache;
|
|
514
|
+
};
|
|
515
|
+
const invalidateResponseCookieCache = () => {
|
|
516
|
+
responseCookieCache = null;
|
|
517
|
+
};
|
|
518
|
+
|
|
519
|
+
// Guard: throw if a response-level side effect is called inside a cache() scope.
|
|
520
|
+
// Uses ALS to detect the scope (set during segment resolution).
|
|
521
|
+
function assertNotInsideCacheScopeALS(methodName: string): void {
|
|
522
|
+
if (isInsideCacheScope()) {
|
|
523
|
+
throw new Error(
|
|
524
|
+
`ctx.${methodName}() cannot be called inside a cache() boundary. ` +
|
|
525
|
+
`On cache hit the handler is skipped, so this side effect would be lost. ` +
|
|
526
|
+
`Move ctx.${methodName}() to a middleware or layout outside the cache() scope.`,
|
|
527
|
+
);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// Effective cookie read: response stub Set-Cookie wins, then original header.
|
|
532
|
+
// The stub IS the source of truth for same-request mutations.
|
|
533
|
+
const effectiveCookie = (name: string): string | undefined => {
|
|
534
|
+
const mutations = getResponseCookies();
|
|
535
|
+
if (mutations.has(name)) {
|
|
536
|
+
const v = mutations.get(name);
|
|
537
|
+
return v === null ? undefined : v;
|
|
538
|
+
}
|
|
539
|
+
return getParsedCookies()[name];
|
|
540
|
+
};
|
|
541
|
+
|
|
286
542
|
// Theme helpers (only used when themeConfig is provided)
|
|
287
543
|
const getTheme = (): Theme | undefined => {
|
|
288
544
|
if (!themeConfig) return undefined;
|
|
289
545
|
|
|
290
|
-
|
|
546
|
+
// Use overlay-aware read so setTheme() in the same request is reflected
|
|
547
|
+
const stored = effectiveCookie(themeConfig.storageKey);
|
|
291
548
|
if (stored) {
|
|
292
549
|
// Validate stored value
|
|
293
550
|
if (stored === "system" && themeConfig.enableSystem) {
|
|
@@ -305,65 +562,129 @@ export function createRequestContext<TEnv>(
|
|
|
305
562
|
|
|
306
563
|
// Validate theme value
|
|
307
564
|
if (theme !== "system" && !themeConfig.themes.includes(theme)) {
|
|
308
|
-
console.warn(
|
|
565
|
+
console.warn(
|
|
566
|
+
`[Theme] Invalid theme value: "${theme}". Valid values: system, ${themeConfig.themes.join(", ")}`,
|
|
567
|
+
);
|
|
309
568
|
return;
|
|
310
569
|
}
|
|
311
570
|
|
|
312
|
-
//
|
|
571
|
+
// Write to stub — effectiveCookie() will pick it up on next read
|
|
313
572
|
stubResponse.headers.append(
|
|
314
573
|
"Set-Cookie",
|
|
315
574
|
serializeCookieValue(themeConfig.storageKey, theme, {
|
|
316
575
|
path: THEME_COOKIE.path,
|
|
317
576
|
maxAge: THEME_COOKIE.maxAge,
|
|
318
577
|
sameSite: THEME_COOKIE.sameSite,
|
|
319
|
-
})
|
|
578
|
+
}),
|
|
320
579
|
);
|
|
580
|
+
invalidateResponseCookieCache();
|
|
321
581
|
};
|
|
322
582
|
|
|
583
|
+
// Strip internal _rsc* params so userland sees a clean URL.
|
|
584
|
+
const cleanUrl = stripInternalParams(url);
|
|
585
|
+
|
|
323
586
|
// Build the context object first (without use), then add use
|
|
324
587
|
const ctx: RequestContext<TEnv> = {
|
|
325
588
|
env,
|
|
326
589
|
request,
|
|
327
|
-
url,
|
|
590
|
+
url: cleanUrl,
|
|
591
|
+
originalUrl: new URL(request.url),
|
|
328
592
|
pathname: url.pathname,
|
|
329
|
-
searchParams:
|
|
593
|
+
searchParams: cleanUrl.searchParams,
|
|
330
594
|
var: variables,
|
|
331
|
-
get:
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
595
|
+
get: ((keyOrVar: any) => {
|
|
596
|
+
if (isNonCacheable(variables, keyOrVar) && isInsideCacheScope()) {
|
|
597
|
+
throw new Error(
|
|
598
|
+
`ctx.get() for a non-cacheable variable cannot be called inside a cache() boundary. ` +
|
|
599
|
+
`The variable was created with { cache: false } or set with { cache: false }, ` +
|
|
600
|
+
`and its value would be stale on cache hit. Move the read outside the cached scope.`,
|
|
601
|
+
);
|
|
602
|
+
}
|
|
603
|
+
return contextGet(variables, keyOrVar);
|
|
604
|
+
}) as RequestContext<TEnv>["get"],
|
|
605
|
+
set: ((keyOrVar: any, value: any, options?: any) => {
|
|
606
|
+
assertNotInsideCacheExec(ctx, "set");
|
|
607
|
+
contextSet(variables, keyOrVar, value, options);
|
|
608
|
+
}) as RequestContext<TEnv>["set"],
|
|
335
609
|
params: {} as Record<string, string>,
|
|
336
|
-
|
|
610
|
+
|
|
611
|
+
get res(): Response {
|
|
612
|
+
return stubResponse;
|
|
613
|
+
},
|
|
614
|
+
set res(_: Response) {
|
|
615
|
+
throw new Error(
|
|
616
|
+
"ctx.res is read-only. Use ctx.header() to set response headers, or cookies() for cookie mutations.",
|
|
617
|
+
);
|
|
618
|
+
},
|
|
337
619
|
|
|
338
620
|
cookie(name: string): string | undefined {
|
|
339
|
-
return
|
|
621
|
+
return effectiveCookie(name);
|
|
340
622
|
},
|
|
341
623
|
|
|
342
624
|
cookies(): Record<string, string> {
|
|
343
|
-
|
|
625
|
+
const parsed = getParsedCookies();
|
|
626
|
+
const mutations = getResponseCookies();
|
|
627
|
+
if (mutations.size === 0) return { ...parsed };
|
|
628
|
+
// Build result without delete (avoids V8 dictionary-mode de-opt)
|
|
629
|
+
const deleted = new Set<string>();
|
|
630
|
+
for (const [k, v] of mutations) {
|
|
631
|
+
if (v === null) deleted.add(k);
|
|
632
|
+
}
|
|
633
|
+
const result: Record<string, string> = {};
|
|
634
|
+
for (const key of Object.keys(parsed)) {
|
|
635
|
+
if (!deleted.has(key)) result[key] = parsed[key];
|
|
636
|
+
}
|
|
637
|
+
for (const [k, v] of mutations) {
|
|
638
|
+
if (v !== null) result[k] = v;
|
|
639
|
+
}
|
|
640
|
+
return result;
|
|
344
641
|
},
|
|
345
642
|
|
|
346
643
|
setCookie(name: string, value: string, options?: CookieOptions): void {
|
|
644
|
+
assertNotInsideCacheExec(ctx, "setCookie");
|
|
645
|
+
assertNotInsideCacheScopeALS("setCookie");
|
|
347
646
|
stubResponse.headers.append(
|
|
348
647
|
"Set-Cookie",
|
|
349
|
-
serializeCookieValue(name, value, options)
|
|
648
|
+
serializeCookieValue(name, value, options),
|
|
350
649
|
);
|
|
650
|
+
invalidateResponseCookieCache();
|
|
351
651
|
},
|
|
352
652
|
|
|
353
653
|
deleteCookie(
|
|
354
654
|
name: string,
|
|
355
|
-
options?: Pick<CookieOptions, "domain" | "path"
|
|
655
|
+
options?: Pick<CookieOptions, "domain" | "path">,
|
|
356
656
|
): void {
|
|
657
|
+
assertNotInsideCacheExec(ctx, "deleteCookie");
|
|
658
|
+
assertNotInsideCacheScopeALS("deleteCookie");
|
|
357
659
|
stubResponse.headers.append(
|
|
358
660
|
"Set-Cookie",
|
|
359
|
-
serializeCookieValue(name, "", { ...options, maxAge: 0 })
|
|
661
|
+
serializeCookieValue(name, "", { ...options, maxAge: 0 }),
|
|
360
662
|
);
|
|
663
|
+
invalidateResponseCookieCache();
|
|
361
664
|
},
|
|
362
665
|
|
|
363
666
|
header(name: string, value: string): void {
|
|
667
|
+
assertNotInsideCacheExec(ctx, "header");
|
|
668
|
+
assertNotInsideCacheScopeALS("header");
|
|
364
669
|
stubResponse.headers.set(name, value);
|
|
365
670
|
},
|
|
366
671
|
|
|
672
|
+
setStatus(status: number): void {
|
|
673
|
+
assertNotInsideCacheExec(ctx, "setStatus");
|
|
674
|
+
assertNotInsideCacheScopeALS("setStatus");
|
|
675
|
+
stubResponse = new Response(null, {
|
|
676
|
+
status,
|
|
677
|
+
headers: stubResponse.headers,
|
|
678
|
+
});
|
|
679
|
+
},
|
|
680
|
+
|
|
681
|
+
_setStatus(status: number): void {
|
|
682
|
+
stubResponse = new Response(null, {
|
|
683
|
+
status,
|
|
684
|
+
headers: stubResponse.headers,
|
|
685
|
+
});
|
|
686
|
+
},
|
|
687
|
+
|
|
367
688
|
// Placeholder - will be replaced below
|
|
368
689
|
use: null as any,
|
|
369
690
|
|
|
@@ -371,6 +692,7 @@ export function createRequestContext<TEnv>(
|
|
|
371
692
|
|
|
372
693
|
_handleStore: handleStore,
|
|
373
694
|
_cacheStore: cacheStore,
|
|
695
|
+
_cacheProfiles: cacheProfiles,
|
|
374
696
|
|
|
375
697
|
waitUntil(fn: () => Promise<void>): void {
|
|
376
698
|
if (executionContext?.waitUntil) {
|
|
@@ -378,20 +700,45 @@ export function createRequestContext<TEnv>(
|
|
|
378
700
|
executionContext.waitUntil(fn());
|
|
379
701
|
} else {
|
|
380
702
|
// Node.js / dev: fire-and-forget with error logging
|
|
381
|
-
fn().catch((err) =>
|
|
703
|
+
fn().catch((err) =>
|
|
704
|
+
console.error("[waitUntil] Background task failed:", err),
|
|
705
|
+
);
|
|
382
706
|
}
|
|
383
707
|
},
|
|
384
708
|
|
|
385
709
|
_onResponseCallbacks: [],
|
|
386
710
|
|
|
387
711
|
onResponse(callback: (response: Response) => Response): void {
|
|
712
|
+
assertNotInsideCacheExec(ctx, "onResponse");
|
|
713
|
+
assertNotInsideCacheScopeALS("onResponse");
|
|
388
714
|
this._onResponseCallbacks.push(callback);
|
|
389
715
|
},
|
|
390
716
|
|
|
391
717
|
// Theme properties (only set when themeConfig is provided)
|
|
392
|
-
theme
|
|
393
|
-
|
|
718
|
+
get theme() {
|
|
719
|
+
return themeConfig ? getTheme() : undefined;
|
|
720
|
+
},
|
|
721
|
+
setTheme: themeConfig
|
|
722
|
+
? (theme: Theme) => {
|
|
723
|
+
assertNotInsideCacheExec(ctx, "setTheme");
|
|
724
|
+
setTheme(theme);
|
|
725
|
+
}
|
|
726
|
+
: undefined,
|
|
394
727
|
_themeConfig: themeConfig,
|
|
728
|
+
|
|
729
|
+
setLocationState(entries: LocationStateEntry | LocationStateEntry[]): void {
|
|
730
|
+
assertNotInsideCacheExec(ctx, "setLocationState");
|
|
731
|
+
const arr = Array.isArray(entries) ? entries : [entries];
|
|
732
|
+
this._locationState = this._locationState
|
|
733
|
+
? [...this._locationState, ...arr]
|
|
734
|
+
: arr;
|
|
735
|
+
},
|
|
736
|
+
_locationState: undefined,
|
|
737
|
+
|
|
738
|
+
_reportedErrors: new WeakSet<object>(),
|
|
739
|
+
_metricsStore: undefined,
|
|
740
|
+
|
|
741
|
+
reverse: createReverseFunction(getGlobalRouteMap(), undefined, {}),
|
|
395
742
|
};
|
|
396
743
|
|
|
397
744
|
// Now create use() with access to ctx
|
|
@@ -401,14 +748,53 @@ export function createRequestContext<TEnv>(
|
|
|
401
748
|
getContext: () => ctx,
|
|
402
749
|
});
|
|
403
750
|
|
|
751
|
+
// Brand with taint symbol so "use cache" excludes ctx from cache keys
|
|
752
|
+
(ctx as any)[NOCACHE_SYMBOL] = true;
|
|
404
753
|
return ctx;
|
|
405
754
|
}
|
|
406
755
|
|
|
756
|
+
/**
|
|
757
|
+
* Parse Set-Cookie headers from a response into effective cookie state.
|
|
758
|
+
* Returns a map of cookie name -> value (string) or name -> null (deleted).
|
|
759
|
+
* Last-write-wins: later Set-Cookie entries for the same name overwrite earlier ones.
|
|
760
|
+
* Max-Age=0 is treated as a delete.
|
|
761
|
+
*/
|
|
762
|
+
const MAX_AGE_ZERO_RE = /;\s*Max-Age\s*=\s*0/i;
|
|
763
|
+
|
|
764
|
+
function parseResponseCookies(response: Response): Map<string, string | null> {
|
|
765
|
+
const result = new Map<string, string | null>();
|
|
766
|
+
const setCookies = response.headers.getSetCookie();
|
|
767
|
+
|
|
768
|
+
for (const header of setCookies) {
|
|
769
|
+
// First segment before ';' is the name=value pair
|
|
770
|
+
const semiIdx = header.indexOf(";");
|
|
771
|
+
const pair = semiIdx === -1 ? header : header.substring(0, semiIdx);
|
|
772
|
+
const eqIdx = pair.indexOf("=");
|
|
773
|
+
if (eqIdx === -1) continue;
|
|
774
|
+
|
|
775
|
+
let name: string;
|
|
776
|
+
let value: string;
|
|
777
|
+
try {
|
|
778
|
+
name = decodeURIComponent(pair.substring(0, eqIdx).trim());
|
|
779
|
+
value = decodeURIComponent(pair.substring(eqIdx + 1).trim());
|
|
780
|
+
} catch {
|
|
781
|
+
// Malformed encoding — skip this entry
|
|
782
|
+
continue;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
// Max-Age=0 means the cookie is being deleted
|
|
786
|
+
const isDeleted = MAX_AGE_ZERO_RE.test(header);
|
|
787
|
+
result.set(name, isDeleted ? null : value);
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
return result;
|
|
791
|
+
}
|
|
792
|
+
|
|
407
793
|
/**
|
|
408
794
|
* Parse cookies from Cookie header
|
|
409
795
|
*/
|
|
410
796
|
function parseCookiesFromHeader(
|
|
411
|
-
cookieHeader: string | null
|
|
797
|
+
cookieHeader: string | null,
|
|
412
798
|
): Record<string, string> {
|
|
413
799
|
if (!cookieHeader) return {};
|
|
414
800
|
|
|
@@ -418,7 +804,13 @@ function parseCookiesFromHeader(
|
|
|
418
804
|
for (const pair of pairs) {
|
|
419
805
|
const [name, ...rest] = pair.trim().split("=");
|
|
420
806
|
if (name) {
|
|
421
|
-
|
|
807
|
+
const raw = rest.join("=");
|
|
808
|
+
try {
|
|
809
|
+
cookies[name] = decodeURIComponent(raw);
|
|
810
|
+
} catch {
|
|
811
|
+
// Malformed percent-encoded value (e.g. %zz, %2) - fall back to raw value
|
|
812
|
+
cookies[name] = raw;
|
|
813
|
+
}
|
|
422
814
|
}
|
|
423
815
|
}
|
|
424
816
|
|
|
@@ -431,7 +823,7 @@ function parseCookiesFromHeader(
|
|
|
431
823
|
function serializeCookieValue(
|
|
432
824
|
name: string,
|
|
433
825
|
value: string,
|
|
434
|
-
options: CookieOptions = {}
|
|
826
|
+
options: CookieOptions = {},
|
|
435
827
|
): string {
|
|
436
828
|
let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
|
|
437
829
|
|
|
@@ -463,7 +855,7 @@ export interface CreateUseFunctionOptions<TEnv> {
|
|
|
463
855
|
* - For handles: returns a push function to add handle data
|
|
464
856
|
*/
|
|
465
857
|
export function createUseFunction<TEnv>(
|
|
466
|
-
options: CreateUseFunctionOptions<TEnv
|
|
858
|
+
options: CreateUseFunctionOptions<TEnv>,
|
|
467
859
|
): RequestContext["use"] {
|
|
468
860
|
const { handleStore, loaderPromises, getContext } = options;
|
|
469
861
|
|
|
@@ -477,16 +869,19 @@ export function createUseFunction<TEnv>(
|
|
|
477
869
|
if (!segmentId) {
|
|
478
870
|
throw new Error(
|
|
479
871
|
`Handle "${handle.$$id}" used outside of handler context. ` +
|
|
480
|
-
`Handles must be used within route/layout handlers
|
|
872
|
+
`Handles must be used within route/layout handlers.`,
|
|
481
873
|
);
|
|
482
874
|
}
|
|
483
875
|
|
|
484
876
|
// Return a push function bound to this handle and segment
|
|
485
|
-
return (
|
|
877
|
+
return (
|
|
878
|
+
dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>),
|
|
879
|
+
) => {
|
|
486
880
|
// If it's a function, call it immediately to get the promise
|
|
487
|
-
const valueOrPromise =
|
|
488
|
-
|
|
489
|
-
|
|
881
|
+
const valueOrPromise =
|
|
882
|
+
typeof dataOrFn === "function"
|
|
883
|
+
? (dataOrFn as () => Promise<unknown>)()
|
|
884
|
+
: dataOrFn;
|
|
490
885
|
|
|
491
886
|
// Push directly - promises will be serialized by RSC and streamed
|
|
492
887
|
handleStore.push(handle.$$id, segmentId, valueOrPromise);
|
|
@@ -504,8 +899,6 @@ export function createUseFunction<TEnv>(
|
|
|
504
899
|
// Get loader function - either from loader object or fetchable registry
|
|
505
900
|
let loaderFn = loader.fn;
|
|
506
901
|
if (!loaderFn) {
|
|
507
|
-
// Lazy import to avoid circular dependency
|
|
508
|
-
const { getFetchableLoader } = require("../loader.rsc.js");
|
|
509
902
|
const fetchable = getFetchableLoader(loader.$$id);
|
|
510
903
|
if (fetchable) {
|
|
511
904
|
loaderFn = fetchable.fn;
|
|
@@ -514,7 +907,7 @@ export function createUseFunction<TEnv>(
|
|
|
514
907
|
|
|
515
908
|
if (!loaderFn) {
|
|
516
909
|
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
|
|
910
|
+
`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
911
|
);
|
|
519
912
|
}
|
|
520
913
|
|
|
@@ -523,25 +916,32 @@ export function createUseFunction<TEnv>(
|
|
|
523
916
|
// Create loader context with recursive use() support
|
|
524
917
|
const loaderCtx: LoaderContext<Record<string, string | undefined>, TEnv> = {
|
|
525
918
|
params: ctx.params,
|
|
919
|
+
routeParams: (ctx.params ?? {}) as Record<string, string>,
|
|
526
920
|
request: ctx.request,
|
|
527
921
|
searchParams: ctx.searchParams,
|
|
922
|
+
search: (ctx as any).search ?? {},
|
|
528
923
|
pathname: ctx.pathname,
|
|
529
924
|
url: ctx.url,
|
|
530
925
|
env: ctx.env as any,
|
|
531
926
|
var: ctx.var as any,
|
|
532
927
|
get: ctx.get as any,
|
|
533
928
|
use: <TDep, TDepParams = any>(
|
|
534
|
-
dep: LoaderDefinition<TDep, TDepParams
|
|
929
|
+
dep: LoaderDefinition<TDep, TDepParams>,
|
|
535
930
|
): Promise<TDep> => {
|
|
536
931
|
// Recursive call - will start dep loader if not already started
|
|
537
932
|
return ctx.use(dep);
|
|
538
933
|
},
|
|
539
934
|
method: "GET",
|
|
540
935
|
body: undefined,
|
|
936
|
+
reverse: createReverseFunction(
|
|
937
|
+
getGlobalRouteMap(),
|
|
938
|
+
ctx._routeName,
|
|
939
|
+
ctx.params as Record<string, string>,
|
|
940
|
+
ctx._routeName ? isRouteRootScoped(ctx._routeName) : undefined,
|
|
941
|
+
),
|
|
541
942
|
};
|
|
542
943
|
|
|
543
|
-
|
|
544
|
-
const doneLoader = track(`loader:${loader.$$id}`);
|
|
944
|
+
const doneLoader = track(`loader:${loader.$$id}`, 2);
|
|
545
945
|
const promise = Promise.resolve(loaderFn(loaderCtx)).finally(() => {
|
|
546
946
|
doneLoader();
|
|
547
947
|
});
|