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