@rangojs/router 0.0.0-experimental.12 → 0.0.0-experimental.121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -0
- package/README.md +1037 -4
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +1704 -212
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +5994 -2763
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +64 -54
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +484 -0
- package/skills/caching/SKILL.md +202 -24
- package/skills/composability/SKILL.md +197 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +87 -62
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +537 -70
- package/skills/host-router/SKILL.md +264 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +173 -8
- package/skills/layout/SKILL.md +123 -5
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +600 -54
- package/skills/middleware/SKILL.md +211 -37
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +41 -10
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +271 -3
- package/skills/prerender/SKILL.md +413 -52
- package/skills/rango/SKILL.md +301 -21
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +248 -120
- package/skills/route/SKILL.md +279 -21
- package/skills/router-setup/SKILL.md +211 -33
- package/skills/server-actions/SKILL.md +751 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +547 -107
- package/skills/use-cache/SKILL.md +353 -0
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +172 -128
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +309 -562
- package/src/browser/navigation-client.ts +206 -75
- package/src/browser/navigation-store.ts +80 -63
- package/src/browser/navigation-transaction.ts +279 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +355 -314
- package/src/browser/prefetch/cache.ts +363 -0
- package/src/browser/prefetch/fetch.ts +350 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +191 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +136 -0
- package/src/browser/react/Link.tsx +255 -71
- package/src/browser/react/NavigationProvider.tsx +153 -33
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +55 -0
- package/src/browser/react/index.ts +15 -12
- package/src/browser/react/location-state-shared.ts +269 -56
- package/src/browser/react/location-state.ts +90 -19
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +41 -123
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +44 -65
- package/src/browser/react/use-params.ts +77 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +97 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +85 -99
- package/src/browser/response-adapter.ts +124 -0
- package/src/browser/rsc-router.tsx +275 -72
- package/src/browser/scroll-restoration.ts +132 -49
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +508 -610
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +149 -48
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +123 -56
- package/src/build/generate-route-types.ts +41 -1029
- package/src/build/index.ts +4 -0
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +127 -31
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +131 -0
- package/src/build/route-types/router-processing.ts +659 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +220 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +354 -0
- package/src/cache/cache-scope.ts +170 -308
- package/src/cache/cf/cf-cache-store.ts +716 -30
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +144 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +192 -13
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +78 -124
- package/src/client.rsc.tsx +6 -1
- package/src/client.tsx +117 -322
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +156 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +36 -0
- package/src/errors.ts +106 -10
- package/src/handle.ts +54 -11
- package/src/handles/MetaTags.tsx +73 -20
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +30 -13
- package/src/host/cookie-handler.ts +21 -15
- package/src/host/errors.ts +8 -8
- package/src/host/index.ts +6 -9
- package/src/host/pattern-matcher.ts +27 -27
- package/src/host/router.ts +176 -82
- package/src/host/testing.ts +8 -8
- package/src/host/types.ts +46 -9
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +196 -57
- package/src/index.rsc.ts +112 -42
- package/src/index.ts +178 -74
- package/src/internal-debug.ts +9 -3
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +15 -93
- package/src/loader.ts +20 -10
- package/src/missing-id-error.ts +68 -0
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +4 -2
- package/src/prerender/store.ts +125 -18
- package/src/prerender.ts +389 -23
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +13 -32
- package/src/route-definition/dsl-helpers.ts +1109 -0
- package/src/route-definition/helper-factories.ts +90 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +101 -0
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-definition.ts +1 -1450
- package/src/route-map-builder.ts +87 -133
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +72 -41
- package/src/router/content-negotiation.ts +228 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +10 -10
- package/src/router/find-match.ts +208 -0
- package/src/router/handler-context.ts +372 -125
- package/src/router/intercept-resolution.ts +24 -26
- package/src/router/lazy-includes.ts +256 -0
- package/src/router/loader-resolution.ts +367 -140
- package/src/router/logging.ts +112 -6
- package/src/router/manifest.ts +89 -28
- package/src/router/match-api.ts +175 -238
- package/src/router/match-context.ts +4 -2
- package/src/router/match-handlers.ts +441 -0
- package/src/router/match-middleware/background-revalidation.ts +97 -89
- package/src/router/match-middleware/cache-lookup.ts +289 -54
- package/src/router/match-middleware/cache-store.ts +78 -17
- package/src/router/match-middleware/intercept-resolution.ts +45 -22
- package/src/router/match-middleware/segment-resolution.ts +73 -9
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +146 -24
- package/src/router/metrics.ts +241 -16
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +209 -0
- package/src/router/middleware.ts +354 -384
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +279 -44
- package/src/router/prerender-match.ts +527 -0
- package/src/router/preview-match.ts +100 -0
- package/src/router/request-classification.ts +313 -0
- package/src/router/revalidation.ts +163 -16
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +41 -21
- package/src/router/router-interfaces.ts +500 -0
- package/src/router/router-options.ts +642 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +769 -0
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1420 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/segment-resolution.ts +21 -1354
- package/src/router/segment-wrappers.ts +291 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +133 -42
- package/src/router/types.ts +24 -9
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +710 -2373
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +821 -1128
- package/src/rsc/helpers.ts +182 -19
- package/src/rsc/index.ts +1 -21
- package/src/rsc/loader-fetch.ts +229 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +161 -0
- package/src/rsc/progressive-enhancement.ts +395 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +362 -0
- package/src/rsc/rsc-rendering.ts +240 -0
- package/src/rsc/runtime-warnings.ts +41 -0
- package/src/rsc/server-action.ts +350 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/types.ts +52 -11
- package/src/search-params.ts +70 -58
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +237 -73
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +439 -85
- package/src/server/cookie-store.ts +214 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +113 -15
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +640 -107
- package/src/server.ts +26 -164
- package/src/ssr/index.tsx +107 -30
- package/src/static-handler.ts +39 -9
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +5 -2
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +4 -30
- package/src/theme/theme-script.ts +21 -18
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +809 -0
- package/src/types/index.ts +89 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +120 -0
- package/src/types/segments.ts +184 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +164 -0
- package/src/urls/index.ts +49 -0
- package/src/urls/path-helper-types.ts +386 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +124 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +291 -0
- package/src/urls/urls-function.ts +94 -0
- package/src/urls.ts +1 -1323
- package/src/use-loader.tsx +559 -108
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +379 -0
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +480 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/state.ts +150 -0
- package/src/vite/discovery/virtual-module-codegen.ts +193 -0
- package/src/vite/index.ts +17 -2261
- package/src/vite/plugin-types.ts +170 -0
- package/src/vite/plugins/cjs-to-esm.ts +94 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +128 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +109 -60
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +32 -51
- package/src/vite/plugins/expose-ids/export-analysis.ts +376 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +156 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +72 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +796 -0
- package/src/vite/plugins/performance-tracks.ts +92 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +338 -0
- package/src/vite/plugins/version-injector.ts +99 -0
- package/src/vite/plugins/version-plugin.ts +323 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +549 -0
- package/src/vite/router-discovery.ts +1567 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +194 -22
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +139 -0
- package/src/vite/utils/client-chunks.ts +190 -0
- package/src/vite/utils/forward-user-plugins.ts +193 -0
- package/src/vite/utils/manifest-utils.ts +19 -0
- package/src/vite/utils/package-resolution.ts +161 -0
- package/src/vite/utils/prerender-utils.ts +222 -0
- package/src/vite/utils/shared-utils.ts +251 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import type { ReactNode } from "react";
|
|
8
8
|
import { track } from "../server/context";
|
|
9
9
|
import type { EntryData } from "../server/context";
|
|
10
|
+
import { contextGet } from "../context-var.js";
|
|
10
11
|
import type {
|
|
11
12
|
ResolvedSegment,
|
|
12
13
|
HandlerContext,
|
|
@@ -19,10 +20,16 @@ import type {
|
|
|
19
20
|
ErrorInfo,
|
|
20
21
|
} from "../types";
|
|
21
22
|
import type { LoaderRevalidationResult, ActionContext } from "./types";
|
|
22
|
-
import { isHandle, type Handle } from "../handle.js";
|
|
23
|
-
import
|
|
23
|
+
import { isHandle, collectHandleData, type Handle } from "../handle.js";
|
|
24
|
+
import { buildHandleSnapshot } from "../server/handle-store.js";
|
|
24
25
|
import { getFetchableLoader } from "../server/fetchable-loader-store.js";
|
|
25
|
-
import {
|
|
26
|
+
import { _getRequestContext } from "../server/request-context.js";
|
|
27
|
+
import {
|
|
28
|
+
isInsideLoaderScope,
|
|
29
|
+
runInsideLoaderBodyScope,
|
|
30
|
+
isInsidePushCallbackScope,
|
|
31
|
+
runInsidePushCallbackScope,
|
|
32
|
+
} from "../server/context.js";
|
|
26
33
|
import { debugLog } from "./logging.js";
|
|
27
34
|
|
|
28
35
|
/**
|
|
@@ -36,7 +43,7 @@ export type LoaderErrorCallback = (
|
|
|
36
43
|
segmentId: string;
|
|
37
44
|
loaderName: string;
|
|
38
45
|
handledByBoundary: boolean;
|
|
39
|
-
}
|
|
46
|
+
},
|
|
40
47
|
) => void;
|
|
41
48
|
|
|
42
49
|
/**
|
|
@@ -55,14 +62,14 @@ export function wrapLoaderWithErrorHandling<T>(
|
|
|
55
62
|
segmentId: string,
|
|
56
63
|
pathname: string,
|
|
57
64
|
findNearestErrorBoundary: (
|
|
58
|
-
entry: EntryData | null
|
|
65
|
+
entry: EntryData | null,
|
|
59
66
|
) => ReactNode | ErrorBoundaryHandler | null,
|
|
60
67
|
createErrorInfo: (
|
|
61
68
|
error: unknown,
|
|
62
69
|
segmentId: string,
|
|
63
|
-
segmentType: ErrorInfo["segmentType"]
|
|
70
|
+
segmentType: ErrorInfo["segmentType"],
|
|
64
71
|
) => ErrorInfo,
|
|
65
|
-
onError?: LoaderErrorCallback
|
|
72
|
+
onError?: LoaderErrorCallback,
|
|
66
73
|
): Promise<LoaderDataResult<T>> {
|
|
67
74
|
// Extract loader name from segmentId (format: "M1L0D0.loaderName")
|
|
68
75
|
const loaderName = segmentId.split(".").pop() || "unknown";
|
|
@@ -73,7 +80,7 @@ export function wrapLoaderWithErrorHandling<T>(
|
|
|
73
80
|
__loaderResult: true,
|
|
74
81
|
ok: true,
|
|
75
82
|
data,
|
|
76
|
-
})
|
|
83
|
+
}),
|
|
77
84
|
)
|
|
78
85
|
.catch((error): LoaderDataResult<T> => {
|
|
79
86
|
// Find nearest error boundary
|
|
@@ -127,61 +134,103 @@ export function wrapLoaderWithErrorHandling<T>(
|
|
|
127
134
|
}
|
|
128
135
|
|
|
129
136
|
/**
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
* For handles: Returns a push function bound to the current segment.
|
|
137
|
+
* Detect cycles in the loader dependency graph using DFS from a given node.
|
|
138
|
+
* Returns the cycle path (array of loader IDs forming the cycle) if one exists,
|
|
139
|
+
* or null if no cycle is found.
|
|
134
140
|
*/
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
141
|
+
function detectLoaderCycle(
|
|
142
|
+
from: string,
|
|
143
|
+
to: string,
|
|
144
|
+
dependsOn: Map<string, Set<string>>,
|
|
145
|
+
): string[] | null {
|
|
146
|
+
// If `to` can reach `from` via the dependency graph, adding the edge
|
|
147
|
+
// from -> to creates a cycle. We search from `to` looking for `from`.
|
|
148
|
+
const visited = new Set<string>();
|
|
149
|
+
const path: string[] = [from, to];
|
|
150
|
+
|
|
151
|
+
function dfs(current: string): string[] | null {
|
|
152
|
+
if (current === from) {
|
|
153
|
+
// Found a cycle: return the path leading back to `from`
|
|
154
|
+
return path;
|
|
155
|
+
}
|
|
156
|
+
if (visited.has(current)) return null;
|
|
157
|
+
visited.add(current);
|
|
143
158
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
// Handle case: return a push function
|
|
147
|
-
if (isHandle(item)) {
|
|
148
|
-
const handle = item;
|
|
149
|
-
const store = getHandleStore();
|
|
150
|
-
const segmentId = (ctx as InternalHandlerContext)._currentSegmentId;
|
|
159
|
+
const deps = dependsOn.get(current);
|
|
160
|
+
if (!deps) return null;
|
|
151
161
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
162
|
+
for (const dep of deps) {
|
|
163
|
+
path.push(dep);
|
|
164
|
+
const cycle = dfs(dep);
|
|
165
|
+
if (cycle) return cycle;
|
|
166
|
+
path.pop();
|
|
167
|
+
}
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
158
170
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
// Promises are pushed directly - RSC will serialize and stream them
|
|
162
|
-
return (dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>)) => {
|
|
163
|
-
if (!store) return;
|
|
171
|
+
return dfs(to);
|
|
172
|
+
}
|
|
164
173
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
174
|
+
/**
|
|
175
|
+
* Creates a memoizing loader executor with cycle detection.
|
|
176
|
+
* Shared by setupLoaderAccess and setupLoaderAccessSilent; only the handle
|
|
177
|
+
* branch differs between the two, so only the loader logic is extracted here.
|
|
178
|
+
*
|
|
179
|
+
* Returns a useLoader(loader, callerLoaderId) function that:
|
|
180
|
+
* - Tracks dependency edges between loaders for cycle detection
|
|
181
|
+
* - Throws immediately (synchronously inside an async fn) on circular deps
|
|
182
|
+
* - Memoizes each loader's promise so it runs at most once per request
|
|
183
|
+
*/
|
|
184
|
+
function createLoaderExecutor<TEnv>(
|
|
185
|
+
ctx: HandlerContext<any, TEnv>,
|
|
186
|
+
loaderPromises: Map<string, Promise<any>>,
|
|
187
|
+
): (
|
|
188
|
+
loader: LoaderDefinition<any, any>,
|
|
189
|
+
callerLoaderId: string | null,
|
|
190
|
+
) => Promise<any> {
|
|
191
|
+
// Capture RequestContext eagerly for cookie access (ALS protection on Cloudflare)
|
|
192
|
+
const reqCtxRef = _getRequestContext();
|
|
193
|
+
|
|
194
|
+
// Dependency graph: loaderId -> set of loader IDs it directly depends on.
|
|
195
|
+
const dependsOn = new Map<string, Set<string>>();
|
|
196
|
+
|
|
197
|
+
// Loaders whose promises have not yet settled.
|
|
198
|
+
// A dependency on a pending loader that closes a cycle means deadlock.
|
|
199
|
+
const pendingLoaders = new Set<string>();
|
|
200
|
+
|
|
201
|
+
function useLoader(
|
|
202
|
+
loader: LoaderDefinition<any, any>,
|
|
203
|
+
callerLoaderId: string | null,
|
|
204
|
+
): Promise<any> {
|
|
205
|
+
// Record the dependency edge and check for cycles before running
|
|
206
|
+
if (callerLoaderId !== null) {
|
|
207
|
+
let deps = dependsOn.get(callerLoaderId);
|
|
208
|
+
if (!deps) {
|
|
209
|
+
deps = new Set();
|
|
210
|
+
dependsOn.set(callerLoaderId, deps);
|
|
211
|
+
}
|
|
169
212
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
213
|
+
// Only relevant when the target is still pending (would deadlock)
|
|
214
|
+
if (pendingLoaders.has(loader.$$id)) {
|
|
215
|
+
const cycle = detectLoaderCycle(callerLoaderId, loader.$$id, dependsOn);
|
|
216
|
+
if (cycle) {
|
|
217
|
+
throw new Error(
|
|
218
|
+
`Circular loader dependency detected: ${cycle.join(" -> ")}. ` +
|
|
219
|
+
`Loaders cannot depend on each other in a cycle. ` +
|
|
220
|
+
`Refactor to break the circular dependency.`,
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
174
224
|
|
|
175
|
-
|
|
176
|
-
|
|
225
|
+
deps.add(loader.$$id);
|
|
226
|
+
}
|
|
177
227
|
|
|
178
228
|
// Return cached promise if already started
|
|
179
229
|
if (loaderPromises.has(loader.$$id)) {
|
|
180
|
-
return loaderPromises.get(loader.$$id)
|
|
230
|
+
return loaderPromises.get(loader.$$id)!;
|
|
181
231
|
}
|
|
182
232
|
|
|
183
233
|
// Get loader function - either from loader object or fetchable registry
|
|
184
|
-
// Fetchable loaders store fn in registry (not on object) to avoid client bundling issues
|
|
185
234
|
let loaderFn = loader.fn;
|
|
186
235
|
if (!loaderFn) {
|
|
187
236
|
const fetchable = getFetchableLoader(loader.$$id);
|
|
@@ -190,46 +239,276 @@ export function setupLoaderAccess<TEnv>(
|
|
|
190
239
|
}
|
|
191
240
|
}
|
|
192
241
|
|
|
193
|
-
// Ensure loader has a function
|
|
194
242
|
if (!loaderFn) {
|
|
195
243
|
throw new Error(
|
|
196
|
-
`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
|
|
244
|
+
`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.`,
|
|
197
245
|
);
|
|
198
246
|
}
|
|
199
247
|
|
|
200
|
-
|
|
248
|
+
pendingLoaders.add(loader.$$id);
|
|
249
|
+
|
|
250
|
+
const currentLoaderId = loader.$$id;
|
|
251
|
+
const variables = (ctx as InternalHandlerContext<any, TEnv>)._variables;
|
|
252
|
+
|
|
253
|
+
// Capture whether this loader is being started from a DSL loader scope
|
|
254
|
+
// (runInsideLoaderScope in fresh.ts). Handler-invoked loaders are NOT
|
|
255
|
+
// inside loader scope. This determines whether rendered() is allowed.
|
|
256
|
+
const isDslLoader = isInsideLoaderScope();
|
|
257
|
+
|
|
258
|
+
let renderedResolved = false;
|
|
259
|
+
let renderedPromise: Promise<void> | null = null;
|
|
260
|
+
|
|
261
|
+
// Loader functions are always fresh (never cached), so they get an
|
|
262
|
+
// unguarded get that bypasses non-cacheable read guards. This applies
|
|
263
|
+
// to ALL loaders — DSL and handler-called — because the loader
|
|
264
|
+
// function itself always re-executes. Also handles nested deps
|
|
265
|
+
// (loaderA → use(loaderB)) since all share this unguarded get.
|
|
201
266
|
const loaderCtx: LoaderContext<Record<string, string | undefined>, TEnv> = {
|
|
202
267
|
params: ctx.params,
|
|
268
|
+
routeParams: (ctx.params ?? {}) as Record<string, string>,
|
|
203
269
|
request: ctx.request,
|
|
204
270
|
searchParams: ctx.searchParams,
|
|
271
|
+
search: (ctx as any).search,
|
|
205
272
|
pathname: ctx.pathname,
|
|
206
273
|
url: ctx.url,
|
|
274
|
+
originalUrl: ctx.originalUrl,
|
|
207
275
|
env: ctx.env,
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
276
|
+
waitUntil: ctx.waitUntil.bind(ctx),
|
|
277
|
+
executionContext: ctx.executionContext,
|
|
278
|
+
get: ((keyOrVar: any) =>
|
|
279
|
+
contextGet(variables, keyOrVar)) as typeof ctx.get,
|
|
280
|
+
use: ((item: LoaderDefinition<any, any> | Handle<any, any>) => {
|
|
281
|
+
if (isHandle(item)) {
|
|
282
|
+
if (!renderedResolved) {
|
|
283
|
+
throw new Error(
|
|
284
|
+
`ctx.use(handle) in a loader requires "await ctx.rendered()" first. ` +
|
|
285
|
+
`Handle "${item.$$id}" cannot be read until the render tree has settled.`,
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
const reqCtx = reqCtxRef ?? _getRequestContext();
|
|
289
|
+
if (!reqCtx) {
|
|
290
|
+
throw new Error(
|
|
291
|
+
`ctx.use(handle) failed: request context not available.`,
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
const segmentOrder = reqCtx._renderBarrierSegmentOrder ?? [];
|
|
295
|
+
// The complete snapshot is cached at barrier resolution for
|
|
296
|
+
// non-streaming trees, and by rendered() after handleStore.settled for
|
|
297
|
+
// streaming trees (where the eager snapshot would have been incomplete
|
|
298
|
+
// because loading() handlers were still in flight). Either way it is
|
|
299
|
+
// present by the time a loader reads a handle; the fresh build is only
|
|
300
|
+
// a defensive fallback.
|
|
301
|
+
const snapshot =
|
|
302
|
+
reqCtx._renderBarrierHandleSnapshot ??
|
|
303
|
+
buildHandleSnapshot(reqCtx._handleStore, segmentOrder);
|
|
304
|
+
return collectHandleData(item, snapshot, segmentOrder);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Loader case
|
|
308
|
+
return useLoader(item as LoaderDefinition<any, any>, currentLoaderId);
|
|
309
|
+
}) as LoaderContext["use"],
|
|
217
310
|
method: "GET",
|
|
218
311
|
body: undefined,
|
|
312
|
+
reverse: ctx.reverse as LoaderContext["reverse"],
|
|
313
|
+
rendered: (): Promise<void> => {
|
|
314
|
+
// Guard: only DSL loaders may use rendered()
|
|
315
|
+
if (!isDslLoader) {
|
|
316
|
+
throw new Error(
|
|
317
|
+
`ctx.rendered() is only available in DSL loaders (registered via loader() in urls()). ` +
|
|
318
|
+
`Handler-invoked loaders (ctx.use(Loader) inside a handler) cannot use rendered().`,
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const reqCtx = reqCtxRef ?? _getRequestContext();
|
|
323
|
+
|
|
324
|
+
if (renderedPromise) return renderedPromise;
|
|
325
|
+
|
|
326
|
+
if (!reqCtx) {
|
|
327
|
+
throw new Error(
|
|
328
|
+
`ctx.rendered() failed: request context not available.`,
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Bidirectional deadlock check: if a handler already started
|
|
333
|
+
// awaiting this loader, calling rendered() would deadlock. This is the
|
|
334
|
+
// real cycle guard (it holds for both streaming and non-streaming): the
|
|
335
|
+
// handler blocks segment resolution, which blocks the barrier, which
|
|
336
|
+
// blocks this loader.
|
|
337
|
+
if (reqCtx._handlerLoaderDeps?.has(currentLoaderId)) {
|
|
338
|
+
throw new Error(
|
|
339
|
+
`Deadlock: loader "${currentLoaderId}" called ctx.rendered() but a handler ` +
|
|
340
|
+
`is already awaiting this loader via ctx.use(). The handler blocks ` +
|
|
341
|
+
`segment resolution, which blocks the barrier, which blocks this loader. ` +
|
|
342
|
+
`Move the data dependency to a loader-to-loader pattern instead.`,
|
|
343
|
+
);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Register this loader as waiting for the barrier so that
|
|
347
|
+
// setupLoaderAccess can detect deadlocks when a handler
|
|
348
|
+
// tries to await the same loader via ctx.use().
|
|
349
|
+
if (!reqCtx._renderBarrierWaiters) {
|
|
350
|
+
reqCtx._renderBarrierWaiters = new Set();
|
|
351
|
+
}
|
|
352
|
+
reqCtx._renderBarrierWaiters.add(currentLoaderId);
|
|
353
|
+
|
|
354
|
+
// Streaming trees (loading()): the barrier resolves once the segment
|
|
355
|
+
// tree is resolved, but loading() handlers stream behind Suspense and
|
|
356
|
+
// their handle pushes are still in flight then. Their async execution
|
|
357
|
+
// IS tracked in the handle store (trackHandler -> store.track), so after
|
|
358
|
+
// the barrier we seal (no further handlers register once the tree is
|
|
359
|
+
// resolved) and wait for settled — every tracked handler, streaming
|
|
360
|
+
// included, has finished pushing. The loader's own segment streams in
|
|
361
|
+
// after, so this does not block the shell; the deadlock guard above
|
|
362
|
+
// keeps a handler from depending on this loader.
|
|
363
|
+
const streaming = reqCtx._treeHasStreaming === true;
|
|
364
|
+
renderedPromise = reqCtx._renderBarrier.then(async () => {
|
|
365
|
+
if (streaming) {
|
|
366
|
+
reqCtx._handleStore.seal();
|
|
367
|
+
await reqCtx._handleStore.settled;
|
|
368
|
+
// The eager snapshot was intentionally left unbuilt for streaming
|
|
369
|
+
// (it would have been incomplete). Build the complete one once, now
|
|
370
|
+
// that the store has settled, so every ctx.use(handle) reads the
|
|
371
|
+
// cached snapshot instead of rebuilding it per call.
|
|
372
|
+
reqCtx._renderBarrierHandleSnapshot ??= buildHandleSnapshot(
|
|
373
|
+
reqCtx._handleStore,
|
|
374
|
+
reqCtx._renderBarrierSegmentOrder ?? [],
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
renderedResolved = true;
|
|
378
|
+
});
|
|
379
|
+
return renderedPromise;
|
|
380
|
+
},
|
|
219
381
|
};
|
|
220
382
|
|
|
221
|
-
|
|
222
|
-
|
|
383
|
+
const doneLoader = track(`loader:${loader.$$id}`, 2);
|
|
384
|
+
// Run the loader body inside loader scope so request-scoped reads
|
|
385
|
+
// (cookies()/headers() and non-cacheable ctx.get) are exempt from the
|
|
386
|
+
// cache-purity guards: loaders always run fresh, so their reads never leak
|
|
387
|
+
// into a cached segment. DSL loaders are already wrapped by fresh.ts; this
|
|
388
|
+
// also covers handler-invoked loaders (ctx.use(Loader) from a handler),
|
|
389
|
+
// which otherwise execute in the caller's cache scope and would wrongly
|
|
390
|
+
// throw. rendered() gating uses the captured isDslLoader (above), so this
|
|
391
|
+
// does not grant rendered() to handler-invoked loaders. Uses a body-only
|
|
392
|
+
// scope, so isInsideLoaderScope() / barrier / deadlock gating is unchanged.
|
|
223
393
|
const promise = Promise.resolve(
|
|
224
|
-
|
|
394
|
+
runInsideLoaderBodyScope(() =>
|
|
395
|
+
loaderFn(loaderCtx as LoaderContext<any, TEnv>),
|
|
396
|
+
),
|
|
225
397
|
).finally(() => {
|
|
398
|
+
pendingLoaders.delete(loader.$$id);
|
|
226
399
|
doneLoader();
|
|
227
400
|
});
|
|
228
401
|
|
|
229
|
-
// Memoize for subsequent calls
|
|
230
402
|
loaderPromises.set(loader.$$id, promise);
|
|
231
|
-
|
|
232
403
|
return promise;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
return useLoader;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Set up the use() method on handler context to access loaders and handles.
|
|
411
|
+
*
|
|
412
|
+
* For loaders: Lazily runs loaders, memoizes results per request.
|
|
413
|
+
* For handles: Returns a push function bound to the current segment.
|
|
414
|
+
*
|
|
415
|
+
* Includes cycle detection: tracks dependency edges between loaders and
|
|
416
|
+
* throws on circular dependencies to prevent deadlocks.
|
|
417
|
+
*/
|
|
418
|
+
export function setupLoaderAccess<TEnv>(
|
|
419
|
+
ctx: HandlerContext<any, TEnv>,
|
|
420
|
+
loaderPromises: Map<string, Promise<any>>,
|
|
421
|
+
): void {
|
|
422
|
+
// Eagerly capture the request context and HandleStore at setup time
|
|
423
|
+
// (before pipeline async ops). In workerd/Cloudflare, dynamic imports and
|
|
424
|
+
// fetch() in the match pipeline can disrupt AsyncLocalStorage, causing
|
|
425
|
+
// getRequestContext() to return undefined when handlers later call
|
|
426
|
+
// ctx.use(handle). Capturing early ensures references survive ALS disruption.
|
|
427
|
+
const reqCtxRef = _getRequestContext();
|
|
428
|
+
const handleStoreRef = reqCtxRef?._handleStore;
|
|
429
|
+
|
|
430
|
+
const useLoader = createLoaderExecutor(ctx, loaderPromises);
|
|
431
|
+
|
|
432
|
+
ctx.use = ((item: LoaderDefinition<any, any> | Handle<any, any>) => {
|
|
433
|
+
if (isHandle(item)) {
|
|
434
|
+
const handle = item;
|
|
435
|
+
const store = handleStoreRef;
|
|
436
|
+
const segmentId = (ctx as InternalHandlerContext<any, TEnv>)
|
|
437
|
+
._currentSegmentId;
|
|
438
|
+
|
|
439
|
+
if (!segmentId) {
|
|
440
|
+
throw new Error(
|
|
441
|
+
`Handle "${handle.$$id}" used outside of handler context. ` +
|
|
442
|
+
`Handles must be used within route/layout handlers.`,
|
|
443
|
+
);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
return (
|
|
447
|
+
dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>),
|
|
448
|
+
) => {
|
|
449
|
+
if (!store) return;
|
|
450
|
+
|
|
451
|
+
if (typeof dataOrFn === "function") {
|
|
452
|
+
// Run the callback inside the push-callback scope so ctx.use(loader)
|
|
453
|
+
// calls it makes — including after its own awaits, for an async
|
|
454
|
+
// callback — are not registered as handler-to-loader deps and do not
|
|
455
|
+
// trip the deadlock guard. A pushed promise value is not tracked by
|
|
456
|
+
// handleStore.settled and does not block segment resolution, so it
|
|
457
|
+
// cannot form a rendered() deadlock. The ALS scope (not a plain
|
|
458
|
+
// boolean) is what survives the callback's awaits.
|
|
459
|
+
const result = runInsidePushCallbackScope(() =>
|
|
460
|
+
(dataOrFn as () => Promise<unknown>)(),
|
|
461
|
+
);
|
|
462
|
+
store.push(handle.$$id, segmentId, result);
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
store.push(handle.$$id, segmentId, dataOrFn);
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// Deadlock guard and handler-to-loader dependency tracking.
|
|
471
|
+
// Skip when inside a DSL loader scope (resolveLoaderData also calls
|
|
472
|
+
// ctx.use() but that's DSL-to-DSL, not handler-to-loader) or when
|
|
473
|
+
// inside a handle push callback (push callbacks don't block segment
|
|
474
|
+
// resolution so they can't cause rendered() deadlocks). The push-callback
|
|
475
|
+
// check is an ALS scope so it also exempts an ASYNC callback's continuation
|
|
476
|
+
// after its first await — relevant on streaming trees, where the guard
|
|
477
|
+
// state now stays live until handleStore.settled.
|
|
478
|
+
const loader = item as LoaderDefinition<any, any>;
|
|
479
|
+
if (!isInsideLoaderScope() && !isInsidePushCallbackScope()) {
|
|
480
|
+
const reqCtx = reqCtxRef ?? _getRequestContext();
|
|
481
|
+
if (reqCtx) {
|
|
482
|
+
// Direction 1: handler awaits loader that already called rendered()
|
|
483
|
+
if (
|
|
484
|
+
loaderPromises.has(loader.$$id) &&
|
|
485
|
+
reqCtx._renderBarrierWaiters?.has(loader.$$id)
|
|
486
|
+
) {
|
|
487
|
+
throw new Error(
|
|
488
|
+
`Deadlock: handler is awaiting loader "${loader.$$id}" which called ctx.rendered(). ` +
|
|
489
|
+
`The loader is waiting for segment resolution, but the handler blocks resolution. ` +
|
|
490
|
+
`Move the data dependency to a loader-to-loader pattern instead.`,
|
|
491
|
+
);
|
|
492
|
+
}
|
|
493
|
+
// Direction 2: track dep so rendered() can detect the deadlock if the
|
|
494
|
+
// loader calls it later. Skip once the guard window is CLOSED — for a
|
|
495
|
+
// non-streaming tree that is when the barrier resolves (rendered()
|
|
496
|
+
// resolves immediately), and for a streaming tree it is when
|
|
497
|
+
// handleStore.settled completes (rendered() keeps waiting until then, so
|
|
498
|
+
// a loading() handler resuming after the barrier can still form a
|
|
499
|
+
// cycle). Using the explicit guard-closed flag rather than
|
|
500
|
+
// _renderBarrierSegmentOrder keeps tracking live across the streaming
|
|
501
|
+
// settle wait. (Handle push callbacks are already excluded above via
|
|
502
|
+
// isInsidePushCallbackScope(), so they cannot produce false positives
|
|
503
|
+
// here.)
|
|
504
|
+
if (!reqCtx._renderBarrierGuardClosed) {
|
|
505
|
+
if (!reqCtx._handlerLoaderDeps) reqCtx._handlerLoaderDeps = new Set();
|
|
506
|
+
reqCtx._handlerLoaderDeps.add(loader.$$id);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
return useLoader(loader, null);
|
|
233
512
|
}) as typeof ctx.use;
|
|
234
513
|
}
|
|
235
514
|
|
|
@@ -237,20 +516,17 @@ export function setupLoaderAccess<TEnv>(
|
|
|
237
516
|
* Set up ctx.use() for pre-rendering (build-time).
|
|
238
517
|
* Handles push to HandleStore; loaders throw with a clear error.
|
|
239
518
|
*/
|
|
240
|
-
export function setupBuildUse<TEnv>(
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
// Get HandleStore from request context
|
|
244
|
-
const getHandleStore = (): HandleStore | undefined => {
|
|
245
|
-
return getRequestContext()?._handleStore;
|
|
246
|
-
};
|
|
519
|
+
export function setupBuildUse<TEnv>(ctx: HandlerContext<any, TEnv>): void {
|
|
520
|
+
// Eagerly capture the HandleStore (same ALS protection as setupLoaderAccess).
|
|
521
|
+
const handleStoreRef = _getRequestContext()?._handleStore;
|
|
247
522
|
|
|
248
523
|
ctx.use = ((item: LoaderDefinition<any, any> | Handle<any, any>) => {
|
|
249
524
|
// Handle case: return a push function bound to the current segment
|
|
250
525
|
if (isHandle(item)) {
|
|
251
526
|
const handle = item;
|
|
252
|
-
const store =
|
|
253
|
-
const segmentId = (ctx as InternalHandlerContext)
|
|
527
|
+
const store = handleStoreRef;
|
|
528
|
+
const segmentId = (ctx as InternalHandlerContext<any, TEnv>)
|
|
529
|
+
._currentSegmentId;
|
|
254
530
|
|
|
255
531
|
if (!segmentId) {
|
|
256
532
|
throw new Error(
|
|
@@ -259,12 +535,15 @@ export function setupBuildUse<TEnv>(
|
|
|
259
535
|
);
|
|
260
536
|
}
|
|
261
537
|
|
|
262
|
-
return (
|
|
538
|
+
return (
|
|
539
|
+
dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>),
|
|
540
|
+
) => {
|
|
263
541
|
if (!store) return;
|
|
264
542
|
|
|
265
|
-
const valueOrPromise =
|
|
266
|
-
|
|
267
|
-
|
|
543
|
+
const valueOrPromise =
|
|
544
|
+
typeof dataOrFn === "function"
|
|
545
|
+
? (dataOrFn as () => Promise<unknown>)()
|
|
546
|
+
: dataOrFn;
|
|
268
547
|
|
|
269
548
|
store.push(handle.$$id, segmentId, valueOrPromise);
|
|
270
549
|
};
|
|
@@ -282,76 +561,24 @@ export function setupBuildUse<TEnv>(
|
|
|
282
561
|
/**
|
|
283
562
|
* Set up ctx.use() for proactive caching (silent mode).
|
|
284
563
|
* Handles are silently ignored (no push to HandleStore).
|
|
285
|
-
* Loaders work normally but with fresh memoization.
|
|
564
|
+
* Loaders work normally but with fresh memoization and cycle detection.
|
|
286
565
|
*
|
|
287
566
|
* This prevents duplicate handle data (breadcrumbs, meta) from being
|
|
288
567
|
* pushed to the response stream during background proactive caching.
|
|
289
568
|
*/
|
|
290
569
|
export function setupLoaderAccessSilent<TEnv>(
|
|
291
570
|
ctx: HandlerContext<any, TEnv>,
|
|
292
|
-
loaderPromises: Map<string, Promise<any
|
|
571
|
+
loaderPromises: Map<string, Promise<any>>,
|
|
293
572
|
): void {
|
|
573
|
+
const useLoader = createLoaderExecutor(ctx, loaderPromises);
|
|
574
|
+
|
|
294
575
|
ctx.use = ((item: LoaderDefinition<any, any> | Handle<any, any>) => {
|
|
295
|
-
// Handle case: return a no-op push function
|
|
296
576
|
if (isHandle(item)) {
|
|
297
|
-
// Silent mode - return a
|
|
298
|
-
return (_dataOrFn: unknown) => {
|
|
299
|
-
// Intentionally empty - don't push handle data during proactive caching
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
// Loader case: same as setupLoaderAccess
|
|
304
|
-
const loader = item as LoaderDefinition<any, any>;
|
|
305
|
-
|
|
306
|
-
// Return cached promise if already started
|
|
307
|
-
if (loaderPromises.has(loader.$$id)) {
|
|
308
|
-
return loaderPromises.get(loader.$$id);
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// Get loader function
|
|
312
|
-
let loaderFn = loader.fn;
|
|
313
|
-
if (!loaderFn) {
|
|
314
|
-
const fetchable = getFetchableLoader(loader.$$id);
|
|
315
|
-
if (fetchable) {
|
|
316
|
-
loaderFn = fetchable.fn;
|
|
317
|
-
}
|
|
577
|
+
// Silent mode - return a no-op so handle data is not pushed during caching
|
|
578
|
+
return (_dataOrFn: unknown) => {};
|
|
318
579
|
}
|
|
319
580
|
|
|
320
|
-
|
|
321
|
-
throw new Error(
|
|
322
|
-
`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.`
|
|
323
|
-
);
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// Create loader context with recursive use() support
|
|
327
|
-
const loaderCtx: LoaderContext<Record<string, string | undefined>, TEnv> = {
|
|
328
|
-
params: ctx.params,
|
|
329
|
-
request: ctx.request,
|
|
330
|
-
searchParams: ctx.searchParams,
|
|
331
|
-
pathname: ctx.pathname,
|
|
332
|
-
url: ctx.url,
|
|
333
|
-
env: ctx.env,
|
|
334
|
-
var: ctx.var,
|
|
335
|
-
get: ctx.get,
|
|
336
|
-
use: <TDep, TDepParams = any>(
|
|
337
|
-
dep: LoaderDefinition<TDep, TDepParams>
|
|
338
|
-
): Promise<TDep> => {
|
|
339
|
-
return ctx.use(dep);
|
|
340
|
-
},
|
|
341
|
-
method: "GET",
|
|
342
|
-
body: undefined,
|
|
343
|
-
};
|
|
344
|
-
|
|
345
|
-
// Start loader execution with tracking
|
|
346
|
-
const doneLoader = track(`loader:${loader.$$id}`);
|
|
347
|
-
const promise = Promise.resolve(
|
|
348
|
-
loaderFn(loaderCtx as LoaderContext<any, TEnv>)
|
|
349
|
-
).finally(() => {
|
|
350
|
-
doneLoader();
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
loaderPromises.set(loader.$$id, promise);
|
|
354
|
-
return promise;
|
|
581
|
+
return useLoader(item as LoaderDefinition<any, any>, null);
|
|
355
582
|
}) as typeof ctx.use;
|
|
356
583
|
}
|
|
357
584
|
|
|
@@ -367,7 +594,7 @@ export function setupLoaderAccessSilent<TEnv>(
|
|
|
367
594
|
export async function revalidate<T>(
|
|
368
595
|
shouldRevalidate: () => Promise<boolean>,
|
|
369
596
|
onRevalidate: () => Promise<T>,
|
|
370
|
-
onSkip: () => T
|
|
597
|
+
onSkip: () => T,
|
|
371
598
|
): Promise<T> {
|
|
372
599
|
const needsRevalidation = await shouldRevalidate();
|
|
373
600
|
return needsRevalidation ? await onRevalidate() : onSkip();
|