@rangojs/router 0.0.0-experimental.125 → 0.0.0-experimental.127
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/README.md +6 -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 +5 -1
- 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/{src/handles/index.ts → dist/handles/index.d.ts} +1 -2
- 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/dist/href-context.d.ts +29 -0
- 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 +361 -65
- 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/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +6 -1
- package/skills/breadcrumbs/SKILL.md +60 -0
- package/skills/observability/SKILL.md +12 -3
- package/skills/prerender/SKILL.md +30 -11
- package/skills/router-setup/SKILL.md +11 -3
- package/skills/server-actions/SKILL.md +25 -1
- package/skills/testing/SKILL.md +17 -17
- package/skills/testing/cache-prerender.md +29 -3
- package/skills/testing/flight.md +13 -10
- package/skills/testing/render-handler.md +3 -0
- package/skills/testing/server-tree.md +1 -1
- package/skills/testing/setup.md +1 -1
- package/src/browser/partial-update.ts +22 -1
- package/src/browser/react/use-router.ts +2 -1
- package/src/browser/rsc-router.tsx +8 -1
- package/src/browser/server-action-bridge.ts +51 -3
- package/src/browser/types.ts +23 -4
- package/src/browser/validate-redirect-origin.ts +43 -15
- package/src/build/index.ts +8 -9
- package/src/build/route-trie.ts +43 -11
- package/src/build/route-types/codegen.ts +12 -1
- package/src/cache/cache-runtime.ts +21 -0
- package/src/cache/cache-scope.ts +20 -0
- package/src/cache/document-cache.ts +10 -0
- package/src/cache/profile-registry.ts +6 -34
- package/src/client.rsc.tsx +3 -0
- package/src/client.tsx +5 -0
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/context-var.ts +12 -0
- package/src/defer.ts +196 -0
- package/src/handles/breadcrumbs.ts +16 -5
- package/src/index.rsc.ts +26 -2
- package/src/index.ts +23 -1
- package/src/redirect-origin.ts +100 -0
- package/src/route-definition/dsl-helpers.ts +19 -0
- package/src/route-definition/redirect.ts +32 -8
- package/src/route-definition/resolve-handler-use.ts +6 -0
- package/src/router/find-match.ts +0 -1
- package/src/router/instrument.ts +230 -0
- package/src/router/loader-resolution.ts +37 -31
- package/src/router/match-middleware/cache-lookup.ts +104 -139
- package/src/router/match-middleware/cache-store.ts +12 -0
- package/src/router/match-middleware/segment-resolution.ts +0 -1
- package/src/router/middleware-types.ts +0 -1
- package/src/router/middleware.ts +94 -33
- package/src/router/pattern-matching.ts +4 -23
- package/src/router/prerender-match.ts +32 -8
- package/src/router/revalidation.ts +9 -4
- package/src/router/route-snapshot.ts +0 -1
- package/src/router/router-context.ts +2 -2
- package/src/router/router-interfaces.ts +18 -0
- package/src/router/router-options.ts +58 -4
- package/src/router/segment-resolution/fresh.ts +15 -18
- package/src/router/segment-resolution/helpers.ts +6 -0
- package/src/router/segment-resolution/loader-cache.ts +30 -10
- package/src/router/segment-resolution/revalidation.ts +194 -261
- package/src/router/segment-wrappers.ts +3 -5
- package/src/router/telemetry-otel.ts +161 -179
- package/src/router/tracing.ts +198 -0
- package/src/router/trie-matching.ts +3 -5
- package/src/router.ts +13 -9
- package/src/rsc/handler-context.ts +1 -0
- package/src/rsc/handler.ts +135 -130
- package/src/rsc/helpers.ts +56 -3
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +7 -1
- package/src/rsc/origin-guard.ts +10 -4
- package/src/rsc/progressive-enhancement.ts +17 -2
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-route-handler.ts +23 -18
- package/src/rsc/rsc-rendering.ts +38 -14
- package/src/rsc/server-action.ts +32 -8
- package/src/rsc/types.ts +6 -2
- package/src/segment-system.tsx +4 -1
- package/src/server/request-context.ts +35 -18
- package/src/testing/cache-status.ts +44 -1
- package/src/testing/dispatch.ts +43 -6
- package/src/testing/e2e/index.ts +1 -0
- package/src/testing/flight.ts +48 -2
- package/src/testing/index.ts +1 -0
- package/src/testing/render-handler.ts +31 -12
- package/src/testing/render-route.tsx +75 -13
- package/src/types/handler-context.ts +28 -1
- package/src/vite/discovery/discover-routers.ts +22 -11
- package/src/vite/discovery/prerender-collection.ts +28 -41
- package/src/vite/discovery/state.ts +11 -0
- package/src/vite/plugin-types.ts +56 -7
- package/src/vite/plugins/expose-ids/router-transform.ts +10 -0
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/use-cache-transform.ts +21 -10
- package/src/vite/rango.ts +2 -0
- package/src/vite/router-discovery.ts +16 -3
- package/src/vite/utils/prerender-utils.ts +36 -0
- package/src/router/middleware-cookies.ts +0 -42
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase + event instrumentation — the single internal API for observing router
|
|
3
|
+
* work.
|
|
4
|
+
*
|
|
5
|
+
* The router exposes the same work on three surfaces, and the rule is: each
|
|
6
|
+
* surface has exactly one owner here, so they cannot drift.
|
|
7
|
+
*
|
|
8
|
+
* - observePhase(): a span of work. Co-emits the `debugPerformance` perf
|
|
9
|
+
* metric (metrics store -> [RSC Perf] timeline + Server-Timing) AND the
|
|
10
|
+
* platform span (tracing runner -> Cloudflare custom spans / OTel). From one
|
|
11
|
+
* wrap site, so the span set is always a subset of the perf phases and the
|
|
12
|
+
* two can't disagree. Phases that meter their own perf metric with a finer
|
|
13
|
+
* decomposition (request, middleware) pass `metric: false` and get the span
|
|
14
|
+
* only — still co-located, still one owner per surface.
|
|
15
|
+
* - observeEvent(): a discrete fact (TelemetrySink): cache decisions,
|
|
16
|
+
* revalidation decisions, handler errors, timeouts, origin rejections.
|
|
17
|
+
* Event-shaped, not phase-shaped — derived from the same call sites but a
|
|
18
|
+
* separate surface from spans.
|
|
19
|
+
*
|
|
20
|
+
* Why phases, not events, are the parent abstraction: Cloudflare's span API is
|
|
21
|
+
* callback-bound (enterSpan wraps the actual work), so the callback boundary is
|
|
22
|
+
* the source of truth — async-context nesting (a loader's KV/D1/fetch spans
|
|
23
|
+
* landing under rango.loader) cannot be faithfully reconstructed from
|
|
24
|
+
* after-the-fact start/end events. Spans drive; events are emitted alongside.
|
|
25
|
+
*
|
|
26
|
+
* Phase identity lives in the PHASES registry below, so the raw `rango.*` span
|
|
27
|
+
* names, perf-metric labels, and span attributes have a single definition each.
|
|
28
|
+
*
|
|
29
|
+
* When neither perf surface nor tracing is active on the request, observePhase
|
|
30
|
+
* is a direct call — no wrapper, no timestamp, no allocation.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import { _getRequestContext } from "../server/request-context.js";
|
|
34
|
+
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
35
|
+
import { getRouterContext } from "./router-context.js";
|
|
36
|
+
import { resolveSink, safeEmit, type TelemetryEvent } from "./telemetry.js";
|
|
37
|
+
import { appendMetric } from "./metrics.js";
|
|
38
|
+
import {
|
|
39
|
+
NOOP_TRACE_SPAN,
|
|
40
|
+
traceSpan,
|
|
41
|
+
runThenSettle,
|
|
42
|
+
type TracePhase,
|
|
43
|
+
type TraceSpan,
|
|
44
|
+
} from "./tracing.js";
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Perf-metric boundary for a phase, or `false` for span-only. `false` means the
|
|
48
|
+
* caller records its own perf metric with a finer decomposition than a single
|
|
49
|
+
* wrap (request: a grand total incl. pre-context bootstrap; middleware: pre/post
|
|
50
|
+
* own-time), so observePhase opens the span but records no metric of its own.
|
|
51
|
+
*/
|
|
52
|
+
export type PhaseMetric =
|
|
53
|
+
| { label: string | (() => string); depth?: number }
|
|
54
|
+
| false;
|
|
55
|
+
|
|
56
|
+
/** Describes one observable phase across the perf and span surfaces. */
|
|
57
|
+
export interface PhaseSpec {
|
|
58
|
+
/** Perf timeline label + Server-Timing name, or false for span-only. */
|
|
59
|
+
metric: PhaseMetric;
|
|
60
|
+
/** Span phase gate (per-phase toggle in the tracing config). */
|
|
61
|
+
tracePhase: TracePhase;
|
|
62
|
+
/** Span name (rango.*). */
|
|
63
|
+
spanName: string;
|
|
64
|
+
/** Span attributes set automatically when the span opens. */
|
|
65
|
+
attributes?: Record<string, string | number | boolean>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The router's observable phases. One definition per phase keeps the `rango.*`
|
|
70
|
+
* span names, perf-metric labels, and identifying attributes from spreading
|
|
71
|
+
* across call sites.
|
|
72
|
+
*/
|
|
73
|
+
export const PHASES = {
|
|
74
|
+
/** Whole request pipeline. Span only — handler:total is metered directly. */
|
|
75
|
+
request: {
|
|
76
|
+
metric: false,
|
|
77
|
+
tracePhase: "request",
|
|
78
|
+
spanName: "rango.request",
|
|
79
|
+
} as PhaseSpec,
|
|
80
|
+
|
|
81
|
+
/** One middleware (incl. its downstream onion). Span only — the perf metric
|
|
82
|
+
* is the middleware's exclusive pre/post own-time, recorded directly.
|
|
83
|
+
* `metricLabel` is that metric's label (e.g. "middleware:auth@*"); it doubles
|
|
84
|
+
* as the rango.middleware_name span attribute. */
|
|
85
|
+
middleware: (metricLabel: string): PhaseSpec => ({
|
|
86
|
+
metric: false,
|
|
87
|
+
tracePhase: "middleware",
|
|
88
|
+
spanName: "rango.middleware",
|
|
89
|
+
attributes: { "rango.middleware_name": metricLabel },
|
|
90
|
+
}),
|
|
91
|
+
|
|
92
|
+
/** The server-action execution (decode args + run the action body), before
|
|
93
|
+
* the revalidation render. The metric label carries the action id (the
|
|
94
|
+
* _rsc_action / action $$id) so the perf timeline shows WHICH action ran, not
|
|
95
|
+
* just "an action"; the span also gets it as rango.action_id. */
|
|
96
|
+
action: (id: string): PhaseSpec => ({
|
|
97
|
+
metric: { label: `action:${id}` },
|
|
98
|
+
tracePhase: "action",
|
|
99
|
+
spanName: "rango.action",
|
|
100
|
+
attributes: { "rango.action_id": id },
|
|
101
|
+
}),
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* One loader execution. `depth` is the perf-timeline indentation: 2 (default)
|
|
105
|
+
* for render-time loaders that nest under the render phase; 1 for a standalone
|
|
106
|
+
* fetchable `_rsc_loader` request, which has no render parent.
|
|
107
|
+
*/
|
|
108
|
+
loader: (id: string, depth: number = 2): PhaseSpec => ({
|
|
109
|
+
metric: { label: `loader:${id}`, depth },
|
|
110
|
+
tracePhase: "loader",
|
|
111
|
+
spanName: "rango.loader",
|
|
112
|
+
attributes: { "rango.loader_id": id },
|
|
113
|
+
}),
|
|
114
|
+
|
|
115
|
+
/** Whole render phase: match + serialize + SSR. The metric label is resolved
|
|
116
|
+
* lazily at record time (after match has set the route name) so the perf
|
|
117
|
+
* timeline shows WHICH route rendered: `render:total:<routeName>`, falling back
|
|
118
|
+
* to `render:total` when there is no named route (unmatched / auto-generated). */
|
|
119
|
+
render: {
|
|
120
|
+
metric: {
|
|
121
|
+
label: () => {
|
|
122
|
+
const routeName = _getRequestContext()?._routeName;
|
|
123
|
+
return routeName && !isAutoGeneratedRouteName(routeName)
|
|
124
|
+
? `render:total:${routeName}`
|
|
125
|
+
: "render:total";
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
tracePhase: "render",
|
|
129
|
+
spanName: "rango.render",
|
|
130
|
+
} as PhaseSpec,
|
|
131
|
+
|
|
132
|
+
/** SSR HTML render from the RSC stream. Colon-delimited like the other ssr:*
|
|
133
|
+
* setup metrics (ssr:module-load / ssr:stream-mode). */
|
|
134
|
+
ssr: {
|
|
135
|
+
metric: { label: "ssr:render-html" },
|
|
136
|
+
tracePhase: "ssr",
|
|
137
|
+
spanName: "rango.ssr",
|
|
138
|
+
} as PhaseSpec,
|
|
139
|
+
} as const;
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Instrument one unit of work: open its span AND (unless `metric: false`) record
|
|
143
|
+
* its perf metric, from a single wrap site. fn is invoked exactly once with the
|
|
144
|
+
* span (a no-op span when tracing is off); its return value is returned
|
|
145
|
+
* unchanged and thrown errors / rejected promises propagate unchanged. When fn
|
|
146
|
+
* returns a promise both the metric duration and the span end when it settles.
|
|
147
|
+
*
|
|
148
|
+
* Reads the metrics store + tracing off the RequestContext ALS, which is active
|
|
149
|
+
* for the WHOLE request — contrast observeEvent, which reads the RouterContext
|
|
150
|
+
* ALS (entered later, during match).
|
|
151
|
+
*/
|
|
152
|
+
export function observePhase<T>(
|
|
153
|
+
spec: PhaseSpec,
|
|
154
|
+
fn: (span: TraceSpan) => T,
|
|
155
|
+
): T {
|
|
156
|
+
const reqCtx = _getRequestContext();
|
|
157
|
+
const store = reqCtx?._metricsStore;
|
|
158
|
+
const tracing = reqCtx?._tracing;
|
|
159
|
+
|
|
160
|
+
// Neither surface active: direct call, zero overhead.
|
|
161
|
+
if (!store && !tracing) return fn(NOOP_TRACE_SPAN);
|
|
162
|
+
|
|
163
|
+
// Attributes only land on a real span, so skip the wrapper when only the perf
|
|
164
|
+
// surface is active (traceSpan would apply them to NOOP_TRACE_SPAN for nothing).
|
|
165
|
+
const attributes = spec.attributes;
|
|
166
|
+
const wrapped: (span: TraceSpan) => T =
|
|
167
|
+
attributes && tracing
|
|
168
|
+
? (span) => {
|
|
169
|
+
for (const key in attributes) span.setAttribute(key, attributes[key]);
|
|
170
|
+
return fn(span);
|
|
171
|
+
}
|
|
172
|
+
: fn;
|
|
173
|
+
|
|
174
|
+
const runSpan = (): T =>
|
|
175
|
+
traceSpan(tracing, spec.tracePhase, spec.spanName, wrapped);
|
|
176
|
+
|
|
177
|
+
// Span-only — no perf metric to record (metric:false, or perf surface off).
|
|
178
|
+
const metric = spec.metric;
|
|
179
|
+
if (!store || metric === false) return runSpan();
|
|
180
|
+
|
|
181
|
+
// Record the phase duration on EVERY termination — success or failure — so a
|
|
182
|
+
// failed loader/render still shows its timing in the perf report (parity with
|
|
183
|
+
// the old track().finally() path it replaced).
|
|
184
|
+
const start = performance.now();
|
|
185
|
+
return runThenSettle(runSpan, () => {
|
|
186
|
+
// The label may be lazy (resolved at record time, e.g. render:total needs the
|
|
187
|
+
// route name that match sets partway through the wrapped work).
|
|
188
|
+
const label =
|
|
189
|
+
typeof metric.label === "function" ? metric.label() : metric.label;
|
|
190
|
+
appendMetric(store, label, start, performance.now() - start, metric.depth);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Emit one discrete telemetry event (the event-shaped counterpart to
|
|
196
|
+
* observePhase). Resolves the sink from the active router context and stamps the
|
|
197
|
+
* request id when the event omits it. No-op (and total — never throws) when no
|
|
198
|
+
* sink is configured.
|
|
199
|
+
*
|
|
200
|
+
* This is the canonical emitter for SYNCHRONOUS facts that fire inside the
|
|
201
|
+
* request's ALS scope (handler errors, timeouts, origin rejections, revalidation
|
|
202
|
+
* decisions). A few emitters deliberately stay on the lower-level
|
|
203
|
+
* resolveSink + safeEmit because observeEvent's lazy, per-call
|
|
204
|
+
* getRouterContext() read does not fit them — keep this the complete list:
|
|
205
|
+
* - router.ts wrapLoaderPromise (loader.start/end/error) and
|
|
206
|
+
* segment-resolution/streamed-handler-telemetry.ts (streamed handler.error)
|
|
207
|
+
* capture the sink + request id EAGERLY and emit from a fire-and-forget
|
|
208
|
+
* continuation that runs after the ALS scope may have unwound.
|
|
209
|
+
* - router/match-handlers.ts resolves the sink ONCE for the hot match-pipeline
|
|
210
|
+
* loop (request.start/end/error, cache.decision, ...).
|
|
211
|
+
* - segment-resolution/helpers.ts emits via a caller-provided report.telemetry
|
|
212
|
+
* sink rather than the ALS router context.
|
|
213
|
+
*/
|
|
214
|
+
export function observeEvent(event: TelemetryEvent): void {
|
|
215
|
+
// getRouterContext() either throws (real impl, outside a router context — e.g.
|
|
216
|
+
// the build-time prerender path) or returns null/undefined (e.g. mocked).
|
|
217
|
+
// Either way there is no sink to emit to, so swallow and return.
|
|
218
|
+
let routerCtx: ReturnType<typeof getRouterContext> | null | undefined;
|
|
219
|
+
try {
|
|
220
|
+
routerCtx = getRouterContext();
|
|
221
|
+
} catch {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (!routerCtx?.telemetry) return;
|
|
225
|
+
const stamped =
|
|
226
|
+
event.requestId === undefined && routerCtx.requestId !== undefined
|
|
227
|
+
? ({ ...event, requestId: routerCtx.requestId } as TelemetryEvent)
|
|
228
|
+
: event;
|
|
229
|
+
safeEmit(resolveSink(routerCtx.telemetry), stamped);
|
|
230
|
+
}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { ReactNode } from "react";
|
|
8
|
-
import { track } from "../server/context";
|
|
9
8
|
import type { EntryData } from "../server/context";
|
|
9
|
+
import { observePhase, PHASES } from "./instrument.js";
|
|
10
10
|
import { contextGet } from "../context-var.js";
|
|
11
11
|
import type {
|
|
12
12
|
ResolvedSegment,
|
|
@@ -20,6 +20,7 @@ import type {
|
|
|
20
20
|
ErrorInfo,
|
|
21
21
|
} from "../types";
|
|
22
22
|
import { isHandle, collectHandleData, type Handle } from "../handle.js";
|
|
23
|
+
import { withDefer } from "../defer.js";
|
|
23
24
|
import { buildHandleSnapshot } from "../server/handle-store.js";
|
|
24
25
|
import { getFetchableLoader } from "../server/fetchable-loader-store.js";
|
|
25
26
|
import { _getRequestContext } from "../server/request-context.js";
|
|
@@ -381,7 +382,11 @@ function createLoaderExecutor<TEnv>(
|
|
|
381
382
|
},
|
|
382
383
|
};
|
|
383
384
|
|
|
384
|
-
|
|
385
|
+
// Meter this loader once via observePhase (loader:<id> perf metric +
|
|
386
|
+
// rango.loader span); loaderFn runs inside the span callback so its KV/D1/
|
|
387
|
+
// fetch spans nest under it. This is one of the observePhase loader funnels —
|
|
388
|
+
// see instrument.ts for the single-metering contract.
|
|
389
|
+
//
|
|
385
390
|
// Run the loader body inside loader scope so request-scoped reads
|
|
386
391
|
// (cookies()/headers() and non-cacheable ctx.get) are exempt from the
|
|
387
392
|
// cache-purity guards: loaders always run fresh, so their reads never leak
|
|
@@ -391,14 +396,15 @@ function createLoaderExecutor<TEnv>(
|
|
|
391
396
|
// throw. rendered() gating uses the captured isDslLoader (above), so this
|
|
392
397
|
// does not grant rendered() to handler-invoked loaders. Uses a body-only
|
|
393
398
|
// scope, so isInsideLoaderScope() / barrier / deadlock gating is unchanged.
|
|
394
|
-
const promise =
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
399
|
+
const promise = observePhase(PHASES.loader(loader.$$id), () =>
|
|
400
|
+
Promise.resolve(
|
|
401
|
+
runInsideLoaderBodyScope(() =>
|
|
402
|
+
loaderFn(loaderCtx as LoaderContext<any, TEnv>),
|
|
403
|
+
),
|
|
404
|
+
).finally(() => {
|
|
405
|
+
pendingLoaders.delete(loader.$$id);
|
|
406
|
+
}),
|
|
407
|
+
);
|
|
402
408
|
|
|
403
409
|
loaderPromises.set(loader.$$id, promise);
|
|
404
410
|
return promise;
|
|
@@ -444,28 +450,28 @@ export function setupLoaderAccess<TEnv>(
|
|
|
444
450
|
);
|
|
445
451
|
}
|
|
446
452
|
|
|
447
|
-
return (
|
|
448
|
-
dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>)
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
}
|
|
453
|
+
return withDefer(
|
|
454
|
+
(dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>)) => {
|
|
455
|
+
if (!store) return;
|
|
456
|
+
|
|
457
|
+
if (typeof dataOrFn === "function") {
|
|
458
|
+
// Run the callback inside the push-callback scope so ctx.use(loader)
|
|
459
|
+
// calls it makes — including after its own awaits, for an async
|
|
460
|
+
// callback — are not registered as handler-to-loader deps and do not
|
|
461
|
+
// trip the deadlock guard. A pushed promise value is not tracked by
|
|
462
|
+
// handleStore.settled and does not block segment resolution, so it
|
|
463
|
+
// cannot form a rendered() deadlock. The ALS scope (not a plain
|
|
464
|
+
// boolean) is what survives the callback's awaits.
|
|
465
|
+
const result = runInsidePushCallbackScope(() =>
|
|
466
|
+
(dataOrFn as () => Promise<unknown>)(),
|
|
467
|
+
);
|
|
468
|
+
store.push(handle.$$id, segmentId, result);
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
466
471
|
|
|
467
|
-
|
|
468
|
-
|
|
472
|
+
store.push(handle.$$id, segmentId, dataOrFn);
|
|
473
|
+
},
|
|
474
|
+
);
|
|
469
475
|
}
|
|
470
476
|
|
|
471
477
|
// Deadlock guard and handler-to-loader dependency tracking.
|
|
@@ -93,8 +93,8 @@
|
|
|
93
93
|
*/
|
|
94
94
|
import type { ResolvedSegment } from "../../types.js";
|
|
95
95
|
import type { MatchContext, MatchPipelineState } from "../match-context.js";
|
|
96
|
-
import { getRouterContext } from "../router-context.js";
|
|
97
|
-
import {
|
|
96
|
+
import { getRouterContext, type RouterContext } from "../router-context.js";
|
|
97
|
+
import { observeEvent } from "../instrument.js";
|
|
98
98
|
import { pushRevalidationTraceEntry, isTraceActive } from "../logging.js";
|
|
99
99
|
import { treeHasStreaming } from "./segment-resolution.js";
|
|
100
100
|
import type { PrerenderStore, PrerenderEntry } from "../../prerender/store.js";
|
|
@@ -150,6 +150,81 @@ async function ensurePrerenderDeps() {
|
|
|
150
150
|
* Deserializes segments, replays handle data, yields segments with partial
|
|
151
151
|
* navigation nullification, and resolves fresh loaders.
|
|
152
152
|
*/
|
|
153
|
+
// Resolve loaders fresh on a cache hit (loaders are NEVER cached) and yield
|
|
154
|
+
// the loader segments, updating state.matchedIds and pushing the loader-resolve
|
|
155
|
+
// + cache-hit metrics. Shared verbatim by the prerender-store path
|
|
156
|
+
// (yieldFromStore) and the runtime cache-hit path (withCacheLookup). The router
|
|
157
|
+
// resolve fns are passed in (captured early by the callers) rather than re-read
|
|
158
|
+
// from getRouterContext() here, because that is ALS-backed and the callers run
|
|
159
|
+
// awaits before reaching this point (workerd can disrupt ALS mid-pipeline).
|
|
160
|
+
async function* resolveFreshLoadersAndYield<TEnv>(
|
|
161
|
+
ctx: MatchContext<TEnv>,
|
|
162
|
+
state: MatchPipelineState,
|
|
163
|
+
pipelineStart: number,
|
|
164
|
+
ms: MatchContext<TEnv>["metricsStore"],
|
|
165
|
+
resolveLoadersOnly: RouterContext<TEnv>["resolveLoadersOnly"],
|
|
166
|
+
resolveLoadersOnlyWithRevalidation: RouterContext<TEnv>["resolveLoadersOnlyWithRevalidation"],
|
|
167
|
+
): AsyncGenerator<ResolvedSegment> {
|
|
168
|
+
const loaderStart = performance.now();
|
|
169
|
+
|
|
170
|
+
if (ctx.isFullMatch) {
|
|
171
|
+
if (resolveLoadersOnly) {
|
|
172
|
+
const loaderSegments = await ctx.Store.run(() =>
|
|
173
|
+
resolveLoadersOnly(ctx.entries, ctx.handlerContext),
|
|
174
|
+
);
|
|
175
|
+
state.matchedIds = state.cachedMatchedIds!;
|
|
176
|
+
for (const segment of loaderSegments) {
|
|
177
|
+
yield segment;
|
|
178
|
+
}
|
|
179
|
+
} else {
|
|
180
|
+
state.matchedIds = state.cachedMatchedIds!;
|
|
181
|
+
}
|
|
182
|
+
} else {
|
|
183
|
+
if (resolveLoadersOnlyWithRevalidation) {
|
|
184
|
+
const loaderResult = await ctx.Store.run(() =>
|
|
185
|
+
resolveLoadersOnlyWithRevalidation(
|
|
186
|
+
ctx.entries,
|
|
187
|
+
ctx.handlerContext,
|
|
188
|
+
ctx.clientSegmentSet,
|
|
189
|
+
ctx.prevParams,
|
|
190
|
+
ctx.request,
|
|
191
|
+
ctx.prevUrl,
|
|
192
|
+
ctx.url,
|
|
193
|
+
ctx.routeKey,
|
|
194
|
+
ctx.actionContext,
|
|
195
|
+
// Loaders are never cached in the segment cache, so segment staleness
|
|
196
|
+
// must not propagate; browser-sent staleness (ctx.stale) still must.
|
|
197
|
+
ctx.stale || undefined,
|
|
198
|
+
),
|
|
199
|
+
);
|
|
200
|
+
state.matchedIds = [
|
|
201
|
+
...state.cachedMatchedIds!,
|
|
202
|
+
...loaderResult.matchedIds,
|
|
203
|
+
];
|
|
204
|
+
for (const segment of loaderResult.segments) {
|
|
205
|
+
yield segment;
|
|
206
|
+
}
|
|
207
|
+
} else {
|
|
208
|
+
state.matchedIds = state.cachedMatchedIds!;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (ms) {
|
|
213
|
+
const loaderEnd = performance.now();
|
|
214
|
+
ms.metrics.push({
|
|
215
|
+
label: "pipeline:loader-resolve",
|
|
216
|
+
duration: loaderEnd - loaderStart,
|
|
217
|
+
startTime: loaderStart - ms.requestStart,
|
|
218
|
+
depth: 1,
|
|
219
|
+
});
|
|
220
|
+
ms.metrics.push({
|
|
221
|
+
label: "pipeline:cache-hit",
|
|
222
|
+
duration: loaderEnd - pipelineStart,
|
|
223
|
+
startTime: pipelineStart - ms.requestStart,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
153
228
|
async function* yieldFromStore<TEnv>(
|
|
154
229
|
entry: PrerenderEntry,
|
|
155
230
|
ctx: MatchContext<TEnv>,
|
|
@@ -216,64 +291,15 @@ async function* yieldFromStore<TEnv>(
|
|
|
216
291
|
yield segment;
|
|
217
292
|
}
|
|
218
293
|
|
|
219
|
-
// Resolve loaders fresh (loaders are never pre-rendered/cached)
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
state.matchedIds = state.cachedMatchedIds!;
|
|
229
|
-
for (const segment of loaderSegments) {
|
|
230
|
-
yield segment;
|
|
231
|
-
}
|
|
232
|
-
} else {
|
|
233
|
-
state.matchedIds = state.cachedMatchedIds!;
|
|
234
|
-
}
|
|
235
|
-
} else {
|
|
236
|
-
if (resolveLoadersOnlyWithRevalidation) {
|
|
237
|
-
const loaderResult = await ctx.Store.run(() =>
|
|
238
|
-
resolveLoadersOnlyWithRevalidation(
|
|
239
|
-
ctx.entries,
|
|
240
|
-
ctx.handlerContext,
|
|
241
|
-
ctx.clientSegmentSet,
|
|
242
|
-
ctx.prevParams,
|
|
243
|
-
ctx.request,
|
|
244
|
-
ctx.prevUrl,
|
|
245
|
-
ctx.url,
|
|
246
|
-
ctx.routeKey,
|
|
247
|
-
ctx.actionContext,
|
|
248
|
-
ctx.stale || undefined,
|
|
249
|
-
),
|
|
250
|
-
);
|
|
251
|
-
state.matchedIds = [
|
|
252
|
-
...state.cachedMatchedIds!,
|
|
253
|
-
...loaderResult.matchedIds,
|
|
254
|
-
];
|
|
255
|
-
for (const segment of loaderResult.segments) {
|
|
256
|
-
yield segment;
|
|
257
|
-
}
|
|
258
|
-
} else {
|
|
259
|
-
state.matchedIds = state.cachedMatchedIds!;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
if (ms) {
|
|
264
|
-
const loaderEnd = performance.now();
|
|
265
|
-
ms.metrics.push({
|
|
266
|
-
label: "pipeline:loader-resolve",
|
|
267
|
-
duration: loaderEnd - loaderStart,
|
|
268
|
-
startTime: loaderStart - ms.requestStart,
|
|
269
|
-
depth: 1,
|
|
270
|
-
});
|
|
271
|
-
ms.metrics.push({
|
|
272
|
-
label: "pipeline:cache-hit",
|
|
273
|
-
duration: loaderEnd - pipelineStart,
|
|
274
|
-
startTime: pipelineStart - ms.requestStart,
|
|
275
|
-
});
|
|
276
|
-
}
|
|
294
|
+
// Resolve loaders fresh (loaders are never pre-rendered/cached).
|
|
295
|
+
yield* resolveFreshLoadersAndYield(
|
|
296
|
+
ctx,
|
|
297
|
+
state,
|
|
298
|
+
pipelineStart,
|
|
299
|
+
ctx.metricsStore,
|
|
300
|
+
resolveLoadersOnly,
|
|
301
|
+
resolveLoadersOnlyWithRevalidation,
|
|
302
|
+
);
|
|
277
303
|
}
|
|
278
304
|
|
|
279
305
|
/**
|
|
@@ -520,19 +546,14 @@ export function withCacheLookup<TEnv>(
|
|
|
520
546
|
traceSource: "cache-hit",
|
|
521
547
|
});
|
|
522
548
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
pathname: ctx.pathname,
|
|
532
|
-
routeKey: ctx.routeKey,
|
|
533
|
-
shouldRevalidate,
|
|
534
|
-
});
|
|
535
|
-
}
|
|
549
|
+
observeEvent({
|
|
550
|
+
type: "revalidation.decision",
|
|
551
|
+
timestamp: performance.now(),
|
|
552
|
+
segmentId: segment.id,
|
|
553
|
+
pathname: ctx.pathname,
|
|
554
|
+
routeKey: ctx.routeKey,
|
|
555
|
+
shouldRevalidate,
|
|
556
|
+
});
|
|
536
557
|
|
|
537
558
|
if (!shouldRevalidate) {
|
|
538
559
|
segment.component = null;
|
|
@@ -550,71 +571,15 @@ export function withCacheLookup<TEnv>(
|
|
|
550
571
|
barrierReqCtx._resolveRenderBarrier(cacheResult.segments);
|
|
551
572
|
}
|
|
552
573
|
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
for (const segment of loaderSegments) {
|
|
565
|
-
yield segment;
|
|
566
|
-
}
|
|
567
|
-
} else {
|
|
568
|
-
state.matchedIds = state.cachedMatchedIds!;
|
|
569
|
-
}
|
|
570
|
-
} else {
|
|
571
|
-
if (resolveLoadersOnlyWithRevalidation) {
|
|
572
|
-
const loaderResult = await Store.run(() =>
|
|
573
|
-
resolveLoadersOnlyWithRevalidation(
|
|
574
|
-
ctx.entries,
|
|
575
|
-
ctx.handlerContext,
|
|
576
|
-
ctx.clientSegmentSet,
|
|
577
|
-
ctx.prevParams,
|
|
578
|
-
ctx.request,
|
|
579
|
-
ctx.prevUrl,
|
|
580
|
-
ctx.url,
|
|
581
|
-
ctx.routeKey,
|
|
582
|
-
ctx.actionContext,
|
|
583
|
-
// Loaders are never cached in the segment cache, so segment
|
|
584
|
-
// staleness (cacheResult.shouldRevalidate) must not propagate.
|
|
585
|
-
// But browser-sent staleness (ctx.stale) — indicating an action
|
|
586
|
-
// happened in this or another tab — must still reach loaders.
|
|
587
|
-
ctx.stale || undefined,
|
|
588
|
-
),
|
|
589
|
-
);
|
|
590
|
-
|
|
591
|
-
// Update state with fresh loader matchedIds
|
|
592
|
-
state.matchedIds = [
|
|
593
|
-
...state.cachedMatchedIds!,
|
|
594
|
-
...loaderResult.matchedIds,
|
|
595
|
-
];
|
|
596
|
-
|
|
597
|
-
// Yield fresh loader segments
|
|
598
|
-
for (const segment of loaderResult.segments) {
|
|
599
|
-
yield segment;
|
|
600
|
-
}
|
|
601
|
-
} else {
|
|
602
|
-
state.matchedIds = state.cachedMatchedIds!;
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
if (ms) {
|
|
606
|
-
const loaderEnd = performance.now();
|
|
607
|
-
ms.metrics.push({
|
|
608
|
-
label: "pipeline:loader-resolve",
|
|
609
|
-
duration: loaderEnd - loaderStart,
|
|
610
|
-
startTime: loaderStart - ms.requestStart,
|
|
611
|
-
depth: 1,
|
|
612
|
-
});
|
|
613
|
-
ms.metrics.push({
|
|
614
|
-
label: "pipeline:cache-hit",
|
|
615
|
-
duration: loaderEnd - pipelineStart,
|
|
616
|
-
startTime: pipelineStart - ms.requestStart,
|
|
617
|
-
});
|
|
618
|
-
}
|
|
574
|
+
// Resolve loaders fresh (loaders are never cached). Shared with the
|
|
575
|
+
// prerender-store path via resolveFreshLoadersAndYield.
|
|
576
|
+
yield* resolveFreshLoadersAndYield(
|
|
577
|
+
ctx,
|
|
578
|
+
state,
|
|
579
|
+
pipelineStart,
|
|
580
|
+
ms,
|
|
581
|
+
resolveLoadersOnly,
|
|
582
|
+
resolveLoadersOnlyWithRevalidation,
|
|
583
|
+
);
|
|
619
584
|
};
|
|
620
585
|
}
|
|
@@ -168,6 +168,18 @@ export function withCacheStore<TEnv>(
|
|
|
168
168
|
if (!requestCtx) return;
|
|
169
169
|
|
|
170
170
|
const cacheScope = ctx.cacheScope;
|
|
171
|
+
|
|
172
|
+
// Record the route's segment-DSL cache tags into the request tag union NOW,
|
|
173
|
+
// synchronously in the pipeline. The actual store write (cacheRoute) runs in
|
|
174
|
+
// requestCtx.waitUntil() below — and the proactive path re-resolves the whole
|
|
175
|
+
// tree first — so cacheRoute's own tag recording races the document cache's
|
|
176
|
+
// post-body-drain snapshot of _requestTags. On a first-write miss the document
|
|
177
|
+
// tag union could miss these tags and revalidateTag()/updateTag() would not
|
|
178
|
+
// invalidate the cached document. Recording here (before the snapshot) closes
|
|
179
|
+
// the window for both the direct and proactive write paths; the duplicate
|
|
180
|
+
// record inside cacheRoute is idempotent.
|
|
181
|
+
cacheScope.recordTags(requestCtx);
|
|
182
|
+
|
|
171
183
|
const reqId = INTERNAL_RANGO_DEBUG
|
|
172
184
|
? getOrCreateRequestId(ctx.request)
|
|
173
185
|
: undefined;
|