@rangojs/router 0.0.0-experimental.259 → 0.0.0-experimental.25dbaac3
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/{CLAUDE.md → AGENTS.md} +4 -0
- package/README.md +471 -51
- 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 +490 -94
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +3423 -1718
- 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/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/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +21 -18
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/cache-guide/SKILL.md +41 -5
- package/skills/caching/SKILL.md +49 -8
- package/skills/document-cache/SKILL.md +2 -2
- package/skills/handler-use/SKILL.md +362 -0
- package/skills/hooks/SKILL.md +94 -52
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +99 -0
- package/skills/layout/SKILL.md +84 -2
- package/skills/links/SKILL.md +93 -17
- package/skills/loader/SKILL.md +367 -36
- package/skills/middleware/SKILL.md +145 -33
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/parallel/SKILL.md +249 -2
- package/skills/prerender/SKILL.md +261 -49
- package/skills/rango/SKILL.md +26 -24
- package/skills/response-routes/SKILL.md +11 -3
- package/skills/route/SKILL.md +100 -5
- package/skills/router-setup/SKILL.md +172 -5
- package/skills/server-actions/SKILL.md +739 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/theme/SKILL.md +5 -4
- package/skills/typesafety/SKILL.md +95 -38
- package/skills/use-cache/SKILL.md +16 -2
- package/src/__internal.ts +93 -1
- package/src/bin/rango.ts +56 -19
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +78 -52
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +1 -1
- package/src/browser/link-interceptor.ts +23 -3
- package/src/browser/merge-segment-loaders.ts +9 -2
- package/src/browser/navigation-bridge.ts +234 -453
- package/src/browser/navigation-client.ts +191 -86
- package/src/browser/navigation-store.ts +71 -41
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/partial-update.ts +215 -167
- package/src/browser/prefetch/cache.ts +314 -0
- package/src/browser/prefetch/fetch.ts +282 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +191 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +152 -0
- package/src/browser/react/Link.tsx +241 -47
- package/src/browser/react/NavigationProvider.tsx +136 -16
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +55 -0
- package/src/browser/react/index.ts +2 -6
- package/src/browser/react/location-state-shared.ts +29 -11
- package/src/browser/react/location-state.ts +6 -4
- 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 +23 -45
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +28 -120
- package/src/browser/react/use-navigation.ts +29 -34
- package/src/browser/react/use-params.ts +16 -35
- package/src/browser/react/use-pathname.ts +2 -3
- package/src/browser/react/use-router.ts +31 -14
- package/src/browser/react/use-search-params.ts +2 -1
- package/src/browser/react/use-segments.ts +82 -118
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +202 -67
- package/src/browser/scroll-restoration.ts +47 -45
- package/src/browser/segment-reconciler.ts +36 -9
- package/src/browser/server-action-bridge.ts +464 -409
- package/src/browser/types.ts +100 -40
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +44 -19
- package/src/build/generate-route-types.ts +7 -0
- package/src/build/index.ts +1 -0
- package/src/build/route-trie.ts +67 -25
- package/src/build/route-types/codegen.ts +13 -4
- package/src/build/route-types/include-resolution.ts +21 -1
- package/src/build/route-types/per-module-writer.ts +15 -3
- package/src/build/route-types/router-processing.ts +391 -90
- package/src/build/route-types/scan-filter.ts +8 -1
- package/src/build/runtime-discovery.ts +13 -1
- 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 +140 -123
- package/src/cache/cache-scope.ts +124 -90
- package/src/cache/cf/cf-cache-store.ts +467 -22
- package/src/cache/cf/index.ts +5 -1
- package/src/cache/document-cache.ts +109 -75
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +43 -69
- package/src/cache/profile-registry.ts +43 -8
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +140 -117
- package/src/cache/taint.ts +85 -3
- package/src/cache/types.ts +1 -115
- package/src/client.rsc.tsx +2 -1
- package/src/client.tsx +86 -254
- package/src/context-var.ts +72 -2
- package/src/debug.ts +2 -2
- package/src/errors.ts +6 -1
- package/src/handle.ts +41 -1
- package/src/handles/MetaTags.tsx +5 -2
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/host/cookie-handler.ts +8 -3
- package/src/host/index.ts +0 -3
- package/src/host/router.ts +14 -1
- package/src/href-client.ts +3 -1
- package/src/index.rsc.ts +48 -32
- package/src/index.ts +104 -64
- package/src/loader.rsc.ts +12 -4
- package/src/loader.ts +8 -0
- package/src/outlet-context.ts +1 -1
- package/src/prerender/store.ts +61 -18
- package/src/prerender.ts +207 -88
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +36 -7
- package/src/root-error-boundary.tsx +30 -26
- package/src/route-definition/dsl-helpers.ts +249 -46
- package/src/route-definition/helpers-types.ts +73 -20
- package/src/route-definition/index.ts +3 -3
- package/src/route-definition/redirect.ts +24 -4
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-map-builder.ts +45 -3
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +25 -0
- package/src/router/content-negotiation.ts +101 -2
- package/src/router/debug-manifest.ts +16 -3
- package/src/router/find-match.ts +4 -2
- package/src/router/handler-context.ts +221 -39
- package/src/router/intercept-resolution.ts +17 -8
- package/src/router/lazy-includes.ts +12 -5
- package/src/router/loader-resolution.ts +164 -31
- package/src/router/logging.ts +104 -4
- package/src/router/manifest.ts +53 -9
- package/src/router/match-api.ts +150 -206
- package/src/router/match-context.ts +3 -0
- package/src/router/match-handlers.ts +186 -11
- package/src/router/match-middleware/background-revalidation.ts +94 -86
- package/src/router/match-middleware/cache-lookup.ts +164 -19
- package/src/router/match-middleware/cache-store.ts +55 -10
- package/src/router/match-middleware/intercept-resolution.ts +9 -7
- package/src/router/match-middleware/segment-resolution.ts +61 -5
- package/src/router/match-pipelines.ts +8 -43
- package/src/router/match-result.ts +122 -18
- package/src/router/metrics.ts +238 -13
- package/src/router/middleware-types.ts +64 -61
- package/src/router/middleware.ts +316 -145
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +134 -15
- package/src/router/prerender-match.ts +150 -16
- package/src/router/preview-match.ts +30 -96
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +102 -9
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +20 -0
- package/src/router/router-interfaces.ts +200 -43
- package/src/router/router-options.ts +265 -12
- package/src/router/router-registry.ts +5 -2
- package/src/router/segment-resolution/fresh.ts +365 -256
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +103 -98
- package/src/router/segment-resolution/revalidation.ts +711 -423
- package/src/router/segment-resolution/static-store.ts +2 -2
- package/src/router/segment-resolution.ts +1 -3
- package/src/router/segment-wrappers.ts +5 -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 +30 -6
- package/src/router/types.ts +8 -1
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +269 -25
- package/src/rsc/handler-context.ts +13 -2
- package/src/rsc/handler.ts +784 -629
- package/src/rsc/helpers.ts +168 -20
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +105 -43
- package/src/rsc/manifest-init.ts +7 -2
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +262 -20
- package/src/rsc/response-route-handler.ts +360 -0
- package/src/rsc/rsc-rendering.ts +70 -44
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +178 -66
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +37 -3
- package/src/search-params.ts +38 -23
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +109 -23
- package/src/server/context.ts +227 -24
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +103 -12
- package/src/server/loader-registry.ts +20 -54
- package/src/server/request-context.ts +475 -105
- package/src/server.ts +6 -0
- package/src/ssr/index.tsx +74 -27
- package/src/static-handler.ts +25 -6
- package/src/theme/ThemeProvider.tsx +6 -1
- package/src/theme/index.ts +4 -18
- package/src/theme/theme-context.ts +1 -28
- package/src/theme/theme-script.ts +2 -1
- package/src/types/cache-types.ts +10 -5
- package/src/types/error-types.ts +3 -0
- package/src/types/global-namespace.ts +22 -0
- package/src/types/handler-context.ts +242 -82
- package/src/types/index.ts +1 -1
- package/src/types/loader-types.ts +50 -21
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +17 -26
- package/src/types/route-entry.ts +46 -0
- package/src/types/segments.ts +19 -5
- package/src/urls/include-helper.ts +72 -21
- package/src/urls/index.ts +1 -0
- package/src/urls/path-helper-types.ts +69 -18
- package/src/urls/path-helper.ts +65 -15
- package/src/urls/pattern-types.ts +33 -1
- package/src/urls/response-types.ts +47 -23
- package/src/urls/type-extraction.ts +23 -15
- package/src/use-loader.tsx +103 -13
- package/src/vite/debug.ts +184 -0
- package/src/vite/discovery/bundle-postprocess.ts +62 -85
- package/src/vite/discovery/discover-routers.ts +87 -29
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +224 -106
- package/src/vite/discovery/route-types-writer.ts +7 -7
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +20 -13
- package/src/vite/discovery/virtual-module-codegen.ts +5 -2
- package/src/vite/index.ts +14 -51
- package/src/vite/plugin-types.ts +51 -79
- package/src/vite/plugins/cjs-to-esm.ts +5 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +19 -7
- 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/plugins/expose-action-id.ts +53 -31
- package/src/vite/plugins/expose-id-utils.ts +12 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +30 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
- package/src/vite/plugins/expose-internal-ids.ts +567 -319
- package/src/vite/plugins/performance-tracks.ts +96 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +139 -38
- package/src/vite/plugins/version-injector.ts +37 -11
- package/src/vite/plugins/version-plugin.ts +200 -18
- package/src/vite/rango.ts +233 -221
- package/src/vite/router-discovery.ts +887 -176
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/package-resolution.ts +41 -1
- package/src/vite/utils/prerender-utils.ts +113 -0
- package/src/vite/utils/shared-utils.ts +22 -11
- package/skills/testing/SKILL.md +0 -226
- package/src/browser/lru-cache.ts +0 -61
- package/src/browser/react/prefetch.ts +0 -27
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/route-definition/route-function.ts +0 -119
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
|
@@ -7,23 +7,18 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import type { ReactNode } from "react";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
createErrorInfo,
|
|
13
|
-
createErrorSegment,
|
|
14
|
-
createNotFoundInfo,
|
|
15
|
-
createNotFoundSegment,
|
|
16
|
-
} from "../error-handling.js";
|
|
10
|
+
import { invariant } from "../../errors";
|
|
17
11
|
import { revalidate } from "../loader-resolution.js";
|
|
18
12
|
import { evaluateRevalidation } from "../revalidation.js";
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
-
|
|
13
|
+
import {
|
|
14
|
+
getParallelEntries,
|
|
15
|
+
getParallelSlotEntries,
|
|
16
|
+
type EntryData,
|
|
17
|
+
} from "../../server/context";
|
|
22
18
|
import type {
|
|
23
19
|
HandlerContext,
|
|
24
20
|
InternalHandlerContext,
|
|
25
21
|
ResolvedSegment,
|
|
26
|
-
ErrorInfo,
|
|
27
22
|
ShouldRevalidateFn,
|
|
28
23
|
} from "../../types";
|
|
29
24
|
import type {
|
|
@@ -31,10 +26,123 @@ import type {
|
|
|
31
26
|
SegmentRevalidationResult,
|
|
32
27
|
ActionContext,
|
|
33
28
|
} from "../types.js";
|
|
34
|
-
import {
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
import {
|
|
30
|
+
debugLog,
|
|
31
|
+
pushRevalidationTraceEntry,
|
|
32
|
+
isTraceActive,
|
|
33
|
+
} from "../logging.js";
|
|
37
34
|
import { resolveLoaderData } from "./loader-cache.js";
|
|
35
|
+
import {
|
|
36
|
+
handleHandlerResult,
|
|
37
|
+
tryStaticHandler,
|
|
38
|
+
tryStaticSlot,
|
|
39
|
+
resolveLayoutComponent,
|
|
40
|
+
resolveWithErrorBoundary,
|
|
41
|
+
} from "./helpers.js";
|
|
42
|
+
import { getRouterContext } from "../router-context.js";
|
|
43
|
+
import { resolveSink, safeEmit } from "../telemetry.js";
|
|
44
|
+
import {
|
|
45
|
+
track,
|
|
46
|
+
RSCRouterContext,
|
|
47
|
+
runInsideLoaderScope,
|
|
48
|
+
} from "../../server/context.js";
|
|
49
|
+
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Telemetry helpers
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Attach a fire-and-forget rejection observer to a streamed handler promise.
|
|
56
|
+
* Silently no-ops when called outside RouterContext (e.g. in unit tests).
|
|
57
|
+
*/
|
|
58
|
+
function observeStreamedHandler(
|
|
59
|
+
promise: Promise<ReactNode>,
|
|
60
|
+
segmentId: string,
|
|
61
|
+
segmentType: string,
|
|
62
|
+
pathname?: string,
|
|
63
|
+
routeKey?: string,
|
|
64
|
+
params?: Record<string, string>,
|
|
65
|
+
): void {
|
|
66
|
+
let routerCtx;
|
|
67
|
+
try {
|
|
68
|
+
routerCtx = getRouterContext();
|
|
69
|
+
} catch {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (!routerCtx?.telemetry) return;
|
|
73
|
+
const sink = resolveSink(routerCtx.telemetry);
|
|
74
|
+
const reqId = routerCtx.requestId;
|
|
75
|
+
promise.catch((err: unknown) => {
|
|
76
|
+
const errorObj = err instanceof Error ? err : new Error(String(err));
|
|
77
|
+
safeEmit(sink, {
|
|
78
|
+
type: "handler.error",
|
|
79
|
+
timestamp: performance.now(),
|
|
80
|
+
requestId: reqId,
|
|
81
|
+
segmentId,
|
|
82
|
+
segmentType,
|
|
83
|
+
error: errorObj,
|
|
84
|
+
handledByBoundary: true,
|
|
85
|
+
pathname,
|
|
86
|
+
routeKey,
|
|
87
|
+
params,
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Trace a parallel slot that's being force-rendered on a full refetch (client
|
|
94
|
+
* has no cached state). User revalidate fns are bypassed in this case — see
|
|
95
|
+
* the call sites for the load-bearing rationale.
|
|
96
|
+
*/
|
|
97
|
+
function traceFullRefetchedParallelSlot(
|
|
98
|
+
parallelId: string,
|
|
99
|
+
belongsToRoute: boolean,
|
|
100
|
+
): void {
|
|
101
|
+
if (!isTraceActive()) return;
|
|
102
|
+
pushRevalidationTraceEntry({
|
|
103
|
+
segmentId: parallelId,
|
|
104
|
+
segmentType: "parallel",
|
|
105
|
+
belongsToRoute,
|
|
106
|
+
source: "parallel",
|
|
107
|
+
defaultShouldRevalidate: true,
|
|
108
|
+
finalShouldRevalidate: true,
|
|
109
|
+
reason: "full-refetch",
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
// Revalidation telemetry helper
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Emit revalidation.decision telemetry for a segment if a sink is configured.
|
|
119
|
+
* Called after evaluateRevalidation returns to capture the decision.
|
|
120
|
+
* Silently no-ops when called outside RouterContext (e.g. in unit tests).
|
|
121
|
+
*/
|
|
122
|
+
function emitRevalidationDecision(
|
|
123
|
+
segmentId: string,
|
|
124
|
+
pathname: string,
|
|
125
|
+
routeKey: string,
|
|
126
|
+
shouldRevalidate: boolean,
|
|
127
|
+
): void {
|
|
128
|
+
let routerCtx;
|
|
129
|
+
try {
|
|
130
|
+
routerCtx = getRouterContext();
|
|
131
|
+
} catch {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (routerCtx?.telemetry) {
|
|
135
|
+
safeEmit(resolveSink(routerCtx.telemetry), {
|
|
136
|
+
type: "revalidation.decision",
|
|
137
|
+
timestamp: performance.now(),
|
|
138
|
+
requestId: routerCtx.requestId,
|
|
139
|
+
segmentId,
|
|
140
|
+
pathname,
|
|
141
|
+
routeKey,
|
|
142
|
+
shouldRevalidate,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
38
146
|
|
|
39
147
|
// ---------------------------------------------------------------------------
|
|
40
148
|
// Revalidation path (partial match)
|
|
@@ -85,7 +193,20 @@ export async function resolveLoadersWithRevalidation<TEnv>(
|
|
|
85
193
|
}) => {
|
|
86
194
|
const shouldRun = await revalidate(
|
|
87
195
|
async () => {
|
|
88
|
-
if (!clientSegmentIds.has(segmentId))
|
|
196
|
+
if (!clientSegmentIds.has(segmentId)) {
|
|
197
|
+
if (isTraceActive()) {
|
|
198
|
+
pushRevalidationTraceEntry({
|
|
199
|
+
segmentId,
|
|
200
|
+
segmentType: "loader",
|
|
201
|
+
belongsToRoute,
|
|
202
|
+
source: "loader",
|
|
203
|
+
defaultShouldRevalidate: true,
|
|
204
|
+
finalShouldRevalidate: true,
|
|
205
|
+
reason: "new-segment",
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
89
210
|
|
|
90
211
|
const dummySegment: ResolvedSegment = {
|
|
91
212
|
id: segmentId,
|
|
@@ -113,11 +234,13 @@ export async function resolveLoadersWithRevalidation<TEnv>(
|
|
|
113
234
|
context: ctx,
|
|
114
235
|
actionContext,
|
|
115
236
|
stale,
|
|
237
|
+
traceSource: "loader",
|
|
116
238
|
});
|
|
117
239
|
},
|
|
118
240
|
async () => true,
|
|
119
241
|
() => false,
|
|
120
242
|
);
|
|
243
|
+
emitRevalidationDecision(segmentId, ctx.pathname, routeKey, shouldRun);
|
|
121
244
|
return { shouldRun, loaderEntry, loader, segmentId, index };
|
|
122
245
|
},
|
|
123
246
|
),
|
|
@@ -134,7 +257,9 @@ export async function resolveLoadersWithRevalidation<TEnv>(
|
|
|
134
257
|
params: ctx.params,
|
|
135
258
|
loaderId: loader.$$id,
|
|
136
259
|
loaderData: deps.wrapLoaderPromise(
|
|
137
|
-
|
|
260
|
+
runInsideLoaderScope(() =>
|
|
261
|
+
resolveLoaderData(loaderEntry, ctx, ctx.pathname),
|
|
262
|
+
),
|
|
138
263
|
entry,
|
|
139
264
|
segmentId,
|
|
140
265
|
ctx.pathname,
|
|
@@ -160,27 +285,99 @@ export async function resolveLoadersOnlyWithRevalidation<TEnv>(
|
|
|
160
285
|
routeKey: string,
|
|
161
286
|
deps: SegmentResolutionDeps<TEnv>,
|
|
162
287
|
actionContext?: ActionContext,
|
|
288
|
+
stale?: boolean,
|
|
163
289
|
): Promise<{ segments: ResolvedSegment[]; matchedIds: string[] }> {
|
|
164
290
|
const allLoaderSegments: ResolvedSegment[] = [];
|
|
165
291
|
const allMatchedIds: string[] = [];
|
|
292
|
+
const seenIds = new Set<string>();
|
|
293
|
+
|
|
294
|
+
async function collectEntryLoaders(
|
|
295
|
+
entry: EntryData,
|
|
296
|
+
belongsToRoute: boolean,
|
|
297
|
+
shortCodeOverride?: string,
|
|
298
|
+
): Promise<void> {
|
|
299
|
+
// Skip if all loaders from this entry have already been resolved
|
|
300
|
+
// via a parent (e.g., cache boundary wrapping a layout with shared loaders).
|
|
301
|
+
const loaderEntries = entry.loader ?? [];
|
|
302
|
+
const sc = shortCodeOverride ?? entry.shortCode;
|
|
303
|
+
const allAlreadySeen =
|
|
304
|
+
loaderEntries.length > 0 &&
|
|
305
|
+
loaderEntries.every((le, i) =>
|
|
306
|
+
seenIds.has(`${sc}D${i}.${le.loader.$$id}`),
|
|
307
|
+
);
|
|
308
|
+
if (!allAlreadySeen) {
|
|
309
|
+
const { segments, matchedIds } = await resolveLoadersWithRevalidation(
|
|
310
|
+
entry,
|
|
311
|
+
context,
|
|
312
|
+
belongsToRoute,
|
|
313
|
+
clientSegmentIds,
|
|
314
|
+
prevParams,
|
|
315
|
+
request,
|
|
316
|
+
prevUrl,
|
|
317
|
+
nextUrl,
|
|
318
|
+
routeKey,
|
|
319
|
+
deps,
|
|
320
|
+
actionContext,
|
|
321
|
+
shortCodeOverride,
|
|
322
|
+
stale,
|
|
323
|
+
);
|
|
324
|
+
for (const seg of segments) {
|
|
325
|
+
if (!seenIds.has(seg.id)) {
|
|
326
|
+
seenIds.add(seg.id);
|
|
327
|
+
allLoaderSegments.push(seg);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
allMatchedIds.push(...matchedIds);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
const seenParallelEntryIds = new Set<string>();
|
|
334
|
+
for (const parallelEntry of getParallelEntries(entry.parallel)) {
|
|
335
|
+
if (seenParallelEntryIds.has(parallelEntry.id)) continue;
|
|
336
|
+
seenParallelEntryIds.add(parallelEntry.id);
|
|
337
|
+
await collectEntryLoaders(parallelEntry, belongsToRoute, entry.shortCode);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const childBelongsToRoute = belongsToRoute || entry.type === "route";
|
|
341
|
+
for (const layoutEntry of entry.layout) {
|
|
342
|
+
await collectEntryLoaders(layoutEntry, childBelongsToRoute);
|
|
343
|
+
// Inherit route loaders for orphan layouts with parallels.
|
|
344
|
+
// Resolve directly — do NOT re-enter collectEntryLoaders with the
|
|
345
|
+
// route entry, as that would re-iterate route.layout and loop.
|
|
346
|
+
if (
|
|
347
|
+
entry.type === "route" &&
|
|
348
|
+
entry.loader &&
|
|
349
|
+
entry.loader.length > 0 &&
|
|
350
|
+
Object.keys(layoutEntry.parallel).length > 0
|
|
351
|
+
) {
|
|
352
|
+
const inherited = await resolveLoadersWithRevalidation(
|
|
353
|
+
entry,
|
|
354
|
+
context,
|
|
355
|
+
childBelongsToRoute,
|
|
356
|
+
clientSegmentIds,
|
|
357
|
+
prevParams,
|
|
358
|
+
request,
|
|
359
|
+
prevUrl,
|
|
360
|
+
nextUrl,
|
|
361
|
+
routeKey,
|
|
362
|
+
deps,
|
|
363
|
+
actionContext,
|
|
364
|
+
layoutEntry.shortCode,
|
|
365
|
+
stale,
|
|
366
|
+
);
|
|
367
|
+
for (const seg of inherited.segments) {
|
|
368
|
+
if (!seenIds.has(seg.id)) {
|
|
369
|
+
seenIds.add(seg.id);
|
|
370
|
+
seg._inherited = true;
|
|
371
|
+
allLoaderSegments.push(seg);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
allMatchedIds.push(...inherited.matchedIds);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
166
378
|
|
|
167
379
|
for (const entry of entries) {
|
|
168
|
-
|
|
169
|
-
const { segments, matchedIds } = await resolveLoadersWithRevalidation(
|
|
170
|
-
entry,
|
|
171
|
-
context,
|
|
172
|
-
belongsToRoute,
|
|
173
|
-
clientSegmentIds,
|
|
174
|
-
prevParams,
|
|
175
|
-
request,
|
|
176
|
-
prevUrl,
|
|
177
|
-
nextUrl,
|
|
178
|
-
routeKey,
|
|
179
|
-
deps,
|
|
180
|
-
actionContext,
|
|
181
|
-
);
|
|
182
|
-
allLoaderSegments.push(...segments);
|
|
183
|
-
allMatchedIds.push(...matchedIds);
|
|
380
|
+
await collectEntryLoaders(entry, entry.type === "route");
|
|
184
381
|
}
|
|
185
382
|
|
|
186
383
|
return { segments: allLoaderSegments, matchedIds: allMatchedIds };
|
|
@@ -204,22 +401,20 @@ export function buildEntryRevalidateMap(
|
|
|
204
401
|
map.set(entry.shortCode, { entry, revalidate: entry.revalidate });
|
|
205
402
|
|
|
206
403
|
if (entry.type !== "parallel") {
|
|
207
|
-
for (const parallelEntry of
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
217
|
-
}
|
|
404
|
+
for (const { slot, entry: parallelEntry } of getParallelSlotEntries(
|
|
405
|
+
entry.parallel,
|
|
406
|
+
)) {
|
|
407
|
+
const parallelParentShortCode = parentShortCode ?? entry.shortCode;
|
|
408
|
+
const parallelId = `${parallelParentShortCode}.${slot}`;
|
|
409
|
+
map.set(parallelId, {
|
|
410
|
+
entry: parallelEntry,
|
|
411
|
+
revalidate: parallelEntry.revalidate,
|
|
412
|
+
});
|
|
218
413
|
}
|
|
219
414
|
}
|
|
220
415
|
|
|
221
416
|
for (const layoutEntry of entry.layout) {
|
|
222
|
-
processEntry(layoutEntry);
|
|
417
|
+
processEntry(layoutEntry, entry.shortCode);
|
|
223
418
|
}
|
|
224
419
|
}
|
|
225
420
|
|
|
@@ -251,7 +446,10 @@ export async function resolveParallelSegmentsWithRevalidation<TEnv>(
|
|
|
251
446
|
const segments: ResolvedSegment[] = [];
|
|
252
447
|
const matchedIds: string[] = [];
|
|
253
448
|
|
|
254
|
-
|
|
449
|
+
const resolvedParallelEntries = new Set<string>();
|
|
450
|
+
for (const { slot, entry: parallelEntry } of getParallelSlotEntries(
|
|
451
|
+
entry.parallel,
|
|
452
|
+
)) {
|
|
255
453
|
invariant(
|
|
256
454
|
parallelEntry.type === "parallel",
|
|
257
455
|
`Expected parallel entry, got: ${parallelEntry.type}`,
|
|
@@ -262,94 +460,47 @@ export async function resolveParallelSegmentsWithRevalidation<TEnv>(
|
|
|
262
460
|
| ((ctx: HandlerContext<any, TEnv>) => ReactNode | Promise<ReactNode>)
|
|
263
461
|
| ReactNode
|
|
264
462
|
>;
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
slot,
|
|
298
|
-
belongsToRoute,
|
|
299
|
-
parallelName: `${parallelEntry.id}.${slot}`,
|
|
300
|
-
...(parallelEntry.mountPath
|
|
301
|
-
? { mountPath: parallelEntry.mountPath }
|
|
302
|
-
: {}),
|
|
463
|
+
// In production, static handler bodies are evicted and the slot value
|
|
464
|
+
// may be undefined. The static store holds the pre-rendered component.
|
|
465
|
+
// We defer the handler check until after tryStaticSlot.
|
|
466
|
+
const handler = slots[slot];
|
|
467
|
+
|
|
468
|
+
const parallelId = `${entry.shortCode}.${slot}`;
|
|
469
|
+
|
|
470
|
+
const isFullRefetch = clientSegmentIds.size === 0;
|
|
471
|
+
const isNewParent = !clientSegmentIds.has(entry.shortCode);
|
|
472
|
+
// Always announce the slot in matchedIds — it's unconditionally appended
|
|
473
|
+
// to `segments` below, and a segment present in segments but missing from
|
|
474
|
+
// matched lets the client prune it (then it's missing from clientSegmentIds
|
|
475
|
+
// on the next request, perpetuating the staleness).
|
|
476
|
+
matchedIds.push(parallelId);
|
|
477
|
+
|
|
478
|
+
let shouldResolve: boolean;
|
|
479
|
+
if (isFullRefetch) {
|
|
480
|
+
// Client has nothing cached — slot MUST render. User revalidate fns are
|
|
481
|
+
// bypassed here because returning false would leave the segment blank
|
|
482
|
+
// with no client-side fallback.
|
|
483
|
+
traceFullRefetchedParallelSlot(parallelId, belongsToRoute);
|
|
484
|
+
shouldResolve = true;
|
|
485
|
+
} else {
|
|
486
|
+
// For non-empty client sets, consult user revalidate fns. When the slot
|
|
487
|
+
// is unknown to the client, override the type-derived default so the
|
|
488
|
+
// soft chain seeds with the right "new segment" / "parent-chain" value.
|
|
489
|
+
let defaultOverride: { value: boolean; reason: string } | undefined;
|
|
490
|
+
if (!clientSegmentIds.has(parallelId)) {
|
|
491
|
+
const value = belongsToRoute || isNewParent;
|
|
492
|
+
defaultOverride = {
|
|
493
|
+
value,
|
|
494
|
+
reason: value ? "new-segment" : "skip-parent-chain",
|
|
303
495
|
};
|
|
304
|
-
|
|
305
|
-
return await evaluateRevalidation({
|
|
306
|
-
segment: dummySegment,
|
|
307
|
-
prevParams,
|
|
308
|
-
getPrevSegment: null,
|
|
309
|
-
request,
|
|
310
|
-
prevUrl,
|
|
311
|
-
nextUrl,
|
|
312
|
-
revalidations: parallelEntry.revalidate.map((fn, i) => ({
|
|
313
|
-
name: `revalidate${i}`,
|
|
314
|
-
fn,
|
|
315
|
-
})),
|
|
316
|
-
routeKey,
|
|
317
|
-
context,
|
|
318
|
-
actionContext,
|
|
319
|
-
stale,
|
|
320
|
-
});
|
|
321
|
-
})();
|
|
322
|
-
|
|
323
|
-
let component: ReactNode | undefined;
|
|
324
|
-
// Static handler interception for individual parallel slots
|
|
325
|
-
const slotStaticId = (parallelEntry as any).staticHandlerIds?.[slot];
|
|
326
|
-
if (slotStaticId && shouldResolve) {
|
|
327
|
-
component = await tryStaticLookup(slotStaticId, parallelId);
|
|
328
|
-
}
|
|
329
|
-
if (component === undefined) {
|
|
330
|
-
const hasLoadingFallback =
|
|
331
|
-
parallelEntry.loading !== undefined &&
|
|
332
|
-
parallelEntry.loading !== false;
|
|
333
|
-
if (!shouldResolve) {
|
|
334
|
-
component = null;
|
|
335
|
-
} else if (hasLoadingFallback) {
|
|
336
|
-
component = (
|
|
337
|
-
typeof handler === "function" ? handler(context) : handler
|
|
338
|
-
) as ReactNode;
|
|
339
|
-
} else {
|
|
340
|
-
component =
|
|
341
|
-
typeof handler === "function" ? await handler(context) : handler;
|
|
342
|
-
}
|
|
343
496
|
}
|
|
344
497
|
|
|
345
|
-
|
|
498
|
+
const dummySegment: ResolvedSegment = {
|
|
346
499
|
id: parallelId,
|
|
347
500
|
namespace: parallelEntry.id,
|
|
348
501
|
type: "parallel",
|
|
349
502
|
index: 0,
|
|
350
|
-
component,
|
|
351
|
-
loading: parallelEntry.loading === false ? null : parallelEntry.loading,
|
|
352
|
-
transition: parallelEntry.transition,
|
|
503
|
+
component: null as any,
|
|
353
504
|
params,
|
|
354
505
|
slot,
|
|
355
506
|
belongsToRoute,
|
|
@@ -357,28 +508,124 @@ export async function resolveParallelSegmentsWithRevalidation<TEnv>(
|
|
|
357
508
|
...(parallelEntry.mountPath
|
|
358
509
|
? { mountPath: parallelEntry.mountPath }
|
|
359
510
|
: {}),
|
|
360
|
-
}
|
|
361
|
-
}
|
|
511
|
+
};
|
|
362
512
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
parallelEntry,
|
|
366
|
-
context,
|
|
367
|
-
belongsToRoute,
|
|
368
|
-
clientSegmentIds,
|
|
513
|
+
shouldResolve = await evaluateRevalidation({
|
|
514
|
+
segment: dummySegment,
|
|
369
515
|
prevParams,
|
|
516
|
+
getPrevSegment: null,
|
|
370
517
|
request,
|
|
371
518
|
prevUrl,
|
|
372
519
|
nextUrl,
|
|
520
|
+
revalidations: parallelEntry.revalidate.map((fn, i) => ({
|
|
521
|
+
name: `revalidate${i}`,
|
|
522
|
+
fn,
|
|
523
|
+
})),
|
|
373
524
|
routeKey,
|
|
374
|
-
|
|
525
|
+
context,
|
|
375
526
|
actionContext,
|
|
376
|
-
entry.shortCode,
|
|
377
527
|
stale,
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
528
|
+
traceSource: "parallel",
|
|
529
|
+
defaultOverride,
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
emitRevalidationDecision(
|
|
533
|
+
parallelId,
|
|
534
|
+
context.pathname,
|
|
535
|
+
routeKey,
|
|
536
|
+
shouldResolve,
|
|
537
|
+
);
|
|
538
|
+
|
|
539
|
+
let component: ReactNode | undefined;
|
|
540
|
+
let handlerRan = false;
|
|
541
|
+
if (shouldResolve) {
|
|
542
|
+
component = await tryStaticSlot(parallelEntry, slot, parallelId);
|
|
543
|
+
// tryStaticSlot returning a value means the static cache supplied the
|
|
544
|
+
// component — handler did NOT run. handlerRan stays false.
|
|
545
|
+
}
|
|
546
|
+
if (component === undefined) {
|
|
547
|
+
const hasLoadingFallback =
|
|
548
|
+
parallelEntry.loading !== undefined && parallelEntry.loading !== false;
|
|
549
|
+
if (!shouldResolve) {
|
|
550
|
+
component = null;
|
|
551
|
+
} else if (handler === undefined) {
|
|
552
|
+
// Handler evicted (production static slot) but static lookup missed.
|
|
553
|
+
// Nothing to render — use null so the client keeps its cached version.
|
|
554
|
+
component = null;
|
|
555
|
+
} else {
|
|
556
|
+
// Slot-keyed pushes — slot owns its own bucket, parent layout owns
|
|
557
|
+
// its own. On slot-only revalidations the partial merge updates only
|
|
558
|
+
// the slot's bucket; the parent's bucket stays intact.
|
|
559
|
+
(context as InternalHandlerContext<any, TEnv>)._currentSegmentId =
|
|
560
|
+
parallelId;
|
|
561
|
+
handlerRan = true;
|
|
562
|
+
if (hasLoadingFallback) {
|
|
563
|
+
const result =
|
|
564
|
+
typeof handler === "function" ? handler(context) : handler;
|
|
565
|
+
if (result instanceof Promise) {
|
|
566
|
+
const tracked = deps.trackHandler(result, {
|
|
567
|
+
segmentId: parallelId,
|
|
568
|
+
segmentType: "parallel",
|
|
569
|
+
});
|
|
570
|
+
observeStreamedHandler(
|
|
571
|
+
tracked,
|
|
572
|
+
parallelId,
|
|
573
|
+
"parallel",
|
|
574
|
+
context.pathname,
|
|
575
|
+
routeKey,
|
|
576
|
+
params,
|
|
577
|
+
);
|
|
578
|
+
component = tracked as ReactNode;
|
|
579
|
+
} else {
|
|
580
|
+
component = result as ReactNode;
|
|
581
|
+
}
|
|
582
|
+
} else {
|
|
583
|
+
component =
|
|
584
|
+
typeof handler === "function" ? await handler(context) : handler;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
381
587
|
}
|
|
588
|
+
|
|
589
|
+
segments.push({
|
|
590
|
+
id: parallelId,
|
|
591
|
+
namespace: parallelEntry.id,
|
|
592
|
+
type: "parallel",
|
|
593
|
+
index: 0,
|
|
594
|
+
component,
|
|
595
|
+
loading: parallelEntry.loading === false ? null : parallelEntry.loading,
|
|
596
|
+
transition: parallelEntry.transition,
|
|
597
|
+
params,
|
|
598
|
+
slot,
|
|
599
|
+
_handlerRan: handlerRan,
|
|
600
|
+
belongsToRoute,
|
|
601
|
+
parallelName: `${parallelEntry.id}.${slot}`,
|
|
602
|
+
...(parallelEntry.mountPath
|
|
603
|
+
? { mountPath: parallelEntry.mountPath }
|
|
604
|
+
: {}),
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
if (resolvedParallelEntries.has(parallelEntry.id)) {
|
|
608
|
+
continue;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
const loaderResult = await resolveLoadersWithRevalidation(
|
|
612
|
+
parallelEntry,
|
|
613
|
+
context,
|
|
614
|
+
belongsToRoute,
|
|
615
|
+
clientSegmentIds,
|
|
616
|
+
prevParams,
|
|
617
|
+
request,
|
|
618
|
+
prevUrl,
|
|
619
|
+
nextUrl,
|
|
620
|
+
routeKey,
|
|
621
|
+
deps,
|
|
622
|
+
actionContext,
|
|
623
|
+
entry.shortCode,
|
|
624
|
+
stale,
|
|
625
|
+
);
|
|
626
|
+
segments.push(...loaderResult.segments);
|
|
627
|
+
matchedIds.push(...loaderResult.matchedIds);
|
|
628
|
+
resolvedParallelEntries.add(parallelEntry.id);
|
|
382
629
|
}
|
|
383
630
|
|
|
384
631
|
return { segments, matchedIds };
|
|
@@ -404,6 +651,7 @@ export async function resolveEntryHandlerWithRevalidation<TEnv>(
|
|
|
404
651
|
): Promise<{ segment: ResolvedSegment; matchedId: string }> {
|
|
405
652
|
const matchedId = entry.shortCode;
|
|
406
653
|
|
|
654
|
+
let handlerRan = false;
|
|
407
655
|
const component = await revalidate(
|
|
408
656
|
async () => {
|
|
409
657
|
const hasSegment = clientSegmentIds.has(entry.shortCode);
|
|
@@ -413,7 +661,24 @@ export async function resolveEntryHandlerWithRevalidation<TEnv>(
|
|
|
413
661
|
clientHasSegment: hasSegment,
|
|
414
662
|
belongsToRoute,
|
|
415
663
|
});
|
|
416
|
-
if (!hasSegment)
|
|
664
|
+
if (!hasSegment) {
|
|
665
|
+
if (isTraceActive()) {
|
|
666
|
+
const segType =
|
|
667
|
+
entry.type === "cache"
|
|
668
|
+
? "layout"
|
|
669
|
+
: (entry.type as "layout" | "route");
|
|
670
|
+
pushRevalidationTraceEntry({
|
|
671
|
+
segmentId: entry.shortCode,
|
|
672
|
+
segmentType: segType,
|
|
673
|
+
belongsToRoute,
|
|
674
|
+
source: "segment-resolution",
|
|
675
|
+
defaultShouldRevalidate: true,
|
|
676
|
+
finalShouldRevalidate: true,
|
|
677
|
+
reason: "new-segment",
|
|
678
|
+
});
|
|
679
|
+
}
|
|
680
|
+
return true;
|
|
681
|
+
}
|
|
417
682
|
|
|
418
683
|
const dummySegment: ResolvedSegment = {
|
|
419
684
|
id: entry.shortCode,
|
|
@@ -447,7 +712,15 @@ export async function resolveEntryHandlerWithRevalidation<TEnv>(
|
|
|
447
712
|
context,
|
|
448
713
|
actionContext,
|
|
449
714
|
stale,
|
|
715
|
+
traceSource:
|
|
716
|
+
entry.type === "route" ? "route-handler" : "layout-handler",
|
|
450
717
|
});
|
|
718
|
+
emitRevalidationDecision(
|
|
719
|
+
entry.shortCode,
|
|
720
|
+
context.pathname,
|
|
721
|
+
routeKey,
|
|
722
|
+
shouldRevalidate,
|
|
723
|
+
);
|
|
451
724
|
debugLog("segment.revalidate", "entry revalidation decision", {
|
|
452
725
|
segmentId: entry.shortCode,
|
|
453
726
|
shouldRevalidate,
|
|
@@ -455,49 +728,72 @@ export async function resolveEntryHandlerWithRevalidation<TEnv>(
|
|
|
455
728
|
return shouldRevalidate;
|
|
456
729
|
},
|
|
457
730
|
async () => {
|
|
731
|
+
handlerRan = true;
|
|
732
|
+
const doneHandler = track(`handler:${entry.id}`, 2);
|
|
458
733
|
(context as InternalHandlerContext<any, TEnv>)._currentSegmentId =
|
|
459
734
|
entry.shortCode;
|
|
460
|
-
// Static handler interception: use pre-rendered component from build-time store
|
|
461
|
-
const entryAny = entry as any;
|
|
462
|
-
if (entryAny.isStaticPrerender && entryAny.staticHandlerId) {
|
|
463
|
-
const staticComponent = await tryStaticLookup(
|
|
464
|
-
entryAny.staticHandlerId,
|
|
465
|
-
entry.shortCode,
|
|
466
|
-
);
|
|
467
|
-
if (staticComponent !== undefined) return staticComponent;
|
|
468
|
-
}
|
|
469
735
|
if (entry.type === "layout" || entry.type === "cache") {
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
736
|
+
const layoutComponent = await resolveLayoutComponent(entry, context);
|
|
737
|
+
doneHandler();
|
|
738
|
+
return layoutComponent;
|
|
739
|
+
}
|
|
740
|
+
const staticComponent = await tryStaticHandler(entry, entry.shortCode);
|
|
741
|
+
if (staticComponent !== undefined) {
|
|
742
|
+
doneHandler();
|
|
743
|
+
return staticComponent;
|
|
473
744
|
}
|
|
474
745
|
const routeEntry = entry as Extract<EntryData, { type: "route" }>;
|
|
746
|
+
// For Passthrough routes at runtime, use the live handler instead of
|
|
747
|
+
// the build handler. At build time (context.build === true), always
|
|
748
|
+
// use the build handler from routeEntry.handler.
|
|
749
|
+
const handler =
|
|
750
|
+
!context.build && routeEntry.liveHandler
|
|
751
|
+
? routeEntry.liveHandler
|
|
752
|
+
: routeEntry.handler;
|
|
475
753
|
if (!routeEntry.loading) {
|
|
476
|
-
|
|
754
|
+
const result = handleHandlerResult(await handler(context));
|
|
755
|
+
doneHandler();
|
|
756
|
+
return result;
|
|
477
757
|
}
|
|
478
758
|
if (!actionContext) {
|
|
479
|
-
const result = handleHandlerResult(
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
759
|
+
const result = handleHandlerResult(handler(context));
|
|
760
|
+
if (result instanceof Promise) {
|
|
761
|
+
result.finally(doneHandler).catch(() => {});
|
|
762
|
+
const tracked = deps.trackHandler(result, {
|
|
763
|
+
segmentId: entry.shortCode,
|
|
764
|
+
segmentType: entry.type,
|
|
765
|
+
});
|
|
766
|
+
observeStreamedHandler(
|
|
767
|
+
tracked,
|
|
768
|
+
entry.shortCode,
|
|
769
|
+
entry.type,
|
|
770
|
+
context.pathname,
|
|
771
|
+
routeKey,
|
|
772
|
+
params,
|
|
773
|
+
);
|
|
774
|
+
return { content: tracked };
|
|
775
|
+
}
|
|
776
|
+
doneHandler();
|
|
777
|
+
return { content: result };
|
|
484
778
|
}
|
|
485
779
|
debugLog("segment.action", "resolving action route with awaited value", {
|
|
486
780
|
entryId: entry.id,
|
|
487
781
|
});
|
|
782
|
+
const actionResult = handleHandlerResult(await handler(context));
|
|
783
|
+
doneHandler();
|
|
488
784
|
return {
|
|
489
|
-
content: Promise.resolve(
|
|
490
|
-
handleHandlerResult(await routeEntry.handler(context)),
|
|
491
|
-
),
|
|
785
|
+
content: Promise.resolve(actionResult),
|
|
492
786
|
};
|
|
493
787
|
},
|
|
494
788
|
() => null,
|
|
495
789
|
);
|
|
496
790
|
|
|
791
|
+
// Normalize void handlers (undefined) to null so the reconciler's
|
|
792
|
+
// component === null checks work consistently for both void and explicit null.
|
|
497
793
|
const resolvedComponent =
|
|
498
794
|
component && typeof component === "object" && "content" in component
|
|
499
|
-
? (component as { content: ReactNode }).content
|
|
500
|
-
: component;
|
|
795
|
+
? ((component as { content: ReactNode }).content ?? null)
|
|
796
|
+
: (component ?? null);
|
|
501
797
|
|
|
502
798
|
const segment: ResolvedSegment = {
|
|
503
799
|
id: entry.shortCode,
|
|
@@ -514,6 +810,7 @@ export async function resolveEntryHandlerWithRevalidation<TEnv>(
|
|
|
514
810
|
? { layoutName: entry.id }
|
|
515
811
|
: {}),
|
|
516
812
|
...(entry.mountPath ? { mountPath: entry.mountPath } : {}),
|
|
813
|
+
_handlerRan: handlerRan,
|
|
517
814
|
};
|
|
518
815
|
|
|
519
816
|
return { segment, matchedId };
|
|
@@ -594,42 +891,43 @@ export async function resolveSegmentWithRevalidation<TEnv>(
|
|
|
594
891
|
prevUrl,
|
|
595
892
|
nextUrl,
|
|
596
893
|
routeKey,
|
|
597
|
-
loaderPromises,
|
|
598
894
|
true,
|
|
599
895
|
deps,
|
|
600
896
|
actionContext,
|
|
601
897
|
stale,
|
|
898
|
+
entry,
|
|
602
899
|
);
|
|
603
900
|
segments.push(...orphanResult.segments);
|
|
604
901
|
matchedIds.push(...orphanResult.matchedIds);
|
|
605
902
|
}
|
|
606
903
|
}
|
|
607
904
|
|
|
608
|
-
const parallelResult = await resolveParallelSegmentsWithRevalidation(
|
|
609
|
-
entry,
|
|
610
|
-
params,
|
|
611
|
-
context,
|
|
612
|
-
belongsToRoute,
|
|
613
|
-
clientSegmentIds,
|
|
614
|
-
prevParams,
|
|
615
|
-
request,
|
|
616
|
-
prevUrl,
|
|
617
|
-
nextUrl,
|
|
618
|
-
routeKey,
|
|
619
|
-
deps,
|
|
620
|
-
actionContext,
|
|
621
|
-
stale,
|
|
622
|
-
);
|
|
623
|
-
segments.push(...parallelResult.segments);
|
|
624
|
-
matchedIds.push(...parallelResult.matchedIds);
|
|
625
|
-
|
|
626
|
-
// Push handler BEFORE orphan layouts for layout/cache entries (matching SSR
|
|
627
|
-
// order in resolveSegment). Route handler was already executed and is pushed
|
|
628
|
-
// after children for tree composition.
|
|
629
905
|
if (routeHandlerResult) {
|
|
906
|
+
// Route entry: handler already executed above; resolve parallels
|
|
907
|
+
// (handler data visible) then push handler segment last for tree order.
|
|
908
|
+
const parallelResult = await resolveParallelSegmentsWithRevalidation(
|
|
909
|
+
entry,
|
|
910
|
+
params,
|
|
911
|
+
context,
|
|
912
|
+
belongsToRoute,
|
|
913
|
+
clientSegmentIds,
|
|
914
|
+
prevParams,
|
|
915
|
+
request,
|
|
916
|
+
prevUrl,
|
|
917
|
+
nextUrl,
|
|
918
|
+
routeKey,
|
|
919
|
+
deps,
|
|
920
|
+
actionContext,
|
|
921
|
+
stale,
|
|
922
|
+
);
|
|
923
|
+
segments.push(...parallelResult.segments);
|
|
924
|
+
matchedIds.push(...parallelResult.matchedIds);
|
|
925
|
+
|
|
630
926
|
segments.push(routeHandlerResult.segment);
|
|
631
927
|
matchedIds.push(routeHandlerResult.matchedId);
|
|
632
928
|
} else {
|
|
929
|
+
// Layout/cache entry: handler-first — resolve handler before parallels
|
|
930
|
+
// so ctx.set() values are visible to parallel children.
|
|
633
931
|
const handlerResult = await resolveEntryHandlerWithRevalidation(
|
|
634
932
|
entry,
|
|
635
933
|
params,
|
|
@@ -647,9 +945,25 @@ export async function resolveSegmentWithRevalidation<TEnv>(
|
|
|
647
945
|
);
|
|
648
946
|
segments.push(handlerResult.segment);
|
|
649
947
|
matchedIds.push(handlerResult.matchedId);
|
|
650
|
-
}
|
|
651
948
|
|
|
652
|
-
|
|
949
|
+
const parallelResult = await resolveParallelSegmentsWithRevalidation(
|
|
950
|
+
entry,
|
|
951
|
+
params,
|
|
952
|
+
context,
|
|
953
|
+
belongsToRoute,
|
|
954
|
+
clientSegmentIds,
|
|
955
|
+
prevParams,
|
|
956
|
+
request,
|
|
957
|
+
prevUrl,
|
|
958
|
+
nextUrl,
|
|
959
|
+
routeKey,
|
|
960
|
+
deps,
|
|
961
|
+
actionContext,
|
|
962
|
+
stale,
|
|
963
|
+
);
|
|
964
|
+
segments.push(...parallelResult.segments);
|
|
965
|
+
matchedIds.push(...parallelResult.matchedIds);
|
|
966
|
+
|
|
653
967
|
for (const orphan of entry.layout) {
|
|
654
968
|
const orphanResult = await resolveOrphanLayoutWithRevalidation(
|
|
655
969
|
orphan,
|
|
@@ -661,7 +975,6 @@ export async function resolveSegmentWithRevalidation<TEnv>(
|
|
|
661
975
|
prevUrl,
|
|
662
976
|
nextUrl,
|
|
663
977
|
routeKey,
|
|
664
|
-
loaderPromises,
|
|
665
978
|
false,
|
|
666
979
|
deps,
|
|
667
980
|
actionContext,
|
|
@@ -688,11 +1001,12 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
|
|
|
688
1001
|
prevUrl: URL,
|
|
689
1002
|
nextUrl: URL,
|
|
690
1003
|
routeKey: string,
|
|
691
|
-
loaderPromises: Map<string, Promise<any>>,
|
|
692
1004
|
belongsToRoute: boolean,
|
|
693
1005
|
deps: SegmentResolutionDeps<TEnv>,
|
|
694
1006
|
actionContext?: ActionContext,
|
|
695
1007
|
stale?: boolean,
|
|
1008
|
+
/** Parent route entry — its loaders are inherited so parallel slots can access them. */
|
|
1009
|
+
parentRouteEntry?: EntryData,
|
|
696
1010
|
): Promise<SegmentRevalidationResult> {
|
|
697
1011
|
invariant(
|
|
698
1012
|
orphan.type === "layout" || orphan.type === "cache",
|
|
@@ -720,14 +1034,16 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
|
|
|
720
1034
|
segments.push(...loaderResult.segments);
|
|
721
1035
|
matchedIds.push(...loaderResult.matchedIds);
|
|
722
1036
|
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
1037
|
+
// Inherit parent route's loaders so parallel slots inside this layout
|
|
1038
|
+
// can access them via useLoader(). See resolveOrphanLayout in fresh.ts.
|
|
1039
|
+
if (
|
|
1040
|
+
parentRouteEntry &&
|
|
1041
|
+
parentRouteEntry.loader &&
|
|
1042
|
+
parentRouteEntry.loader.length > 0 &&
|
|
1043
|
+
Object.keys(orphan.parallel).length > 0
|
|
1044
|
+
) {
|
|
1045
|
+
const inheritedResult = await resolveLoadersWithRevalidation(
|
|
1046
|
+
parentRouteEntry,
|
|
731
1047
|
context,
|
|
732
1048
|
belongsToRoute,
|
|
733
1049
|
clientSegmentIds,
|
|
@@ -738,107 +1054,37 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
|
|
|
738
1054
|
routeKey,
|
|
739
1055
|
deps,
|
|
740
1056
|
actionContext,
|
|
741
|
-
|
|
1057
|
+
orphan.shortCode,
|
|
742
1058
|
stale,
|
|
743
1059
|
);
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
const slots = parallelEntry.handler as Record<
|
|
748
|
-
`@${string}`,
|
|
749
|
-
| ((ctx: HandlerContext<any, TEnv>) => ReactNode | Promise<ReactNode>)
|
|
750
|
-
| ReactNode
|
|
751
|
-
>;
|
|
752
|
-
|
|
753
|
-
for (const [slot, handler] of Object.entries(slots)) {
|
|
754
|
-
// Use orphan.shortCode (the parent layout) to match the SSR path
|
|
755
|
-
// (resolveParallelEntry receives parentShortCode = orphan.shortCode).
|
|
756
|
-
// Using parallelEntry.shortCode would generate IDs the client doesn't know about.
|
|
757
|
-
const parallelId = `${orphan.shortCode}.${slot}`;
|
|
758
|
-
matchedIds.push(parallelId);
|
|
759
|
-
|
|
760
|
-
const shouldResolve = await (async () => {
|
|
761
|
-
if (!clientSegmentIds.has(parallelId)) return true;
|
|
762
|
-
|
|
763
|
-
const dummySegment: ResolvedSegment = {
|
|
764
|
-
id: parallelId,
|
|
765
|
-
namespace: parallelEntry.id,
|
|
766
|
-
type: "parallel",
|
|
767
|
-
index: 0,
|
|
768
|
-
component: null as any,
|
|
769
|
-
params,
|
|
770
|
-
slot,
|
|
771
|
-
belongsToRoute,
|
|
772
|
-
parallelName: `${parallelEntry.id}.${slot}`,
|
|
773
|
-
...(parallelEntry.mountPath
|
|
774
|
-
? { mountPath: parallelEntry.mountPath }
|
|
775
|
-
: {}),
|
|
776
|
-
};
|
|
777
|
-
|
|
778
|
-
return await evaluateRevalidation({
|
|
779
|
-
segment: dummySegment,
|
|
780
|
-
prevParams,
|
|
781
|
-
getPrevSegment: null,
|
|
782
|
-
request,
|
|
783
|
-
prevUrl,
|
|
784
|
-
nextUrl,
|
|
785
|
-
revalidations: parallelEntry.revalidate.map((fn, i) => ({
|
|
786
|
-
name: `revalidate${i}`,
|
|
787
|
-
fn,
|
|
788
|
-
})),
|
|
789
|
-
routeKey,
|
|
790
|
-
context,
|
|
791
|
-
actionContext,
|
|
792
|
-
stale,
|
|
793
|
-
});
|
|
794
|
-
})();
|
|
795
|
-
|
|
796
|
-
let component: ReactNode | undefined;
|
|
797
|
-
// Static handler interception for individual parallel slots
|
|
798
|
-
const slotStaticId = (parallelEntry as any).staticHandlerIds?.[slot];
|
|
799
|
-
if (slotStaticId && shouldResolve) {
|
|
800
|
-
component = await tryStaticLookup(slotStaticId, parallelId);
|
|
801
|
-
}
|
|
802
|
-
if (component === undefined) {
|
|
803
|
-
const hasLoadingFallback =
|
|
804
|
-
parallelEntry.loading !== undefined &&
|
|
805
|
-
parallelEntry.loading !== false;
|
|
806
|
-
if (!shouldResolve) {
|
|
807
|
-
component = null;
|
|
808
|
-
} else if (hasLoadingFallback) {
|
|
809
|
-
component = (
|
|
810
|
-
typeof handler === "function" ? handler(context) : handler
|
|
811
|
-
) as ReactNode;
|
|
812
|
-
} else {
|
|
813
|
-
component =
|
|
814
|
-
typeof handler === "function" ? await handler(context) : handler;
|
|
815
|
-
}
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
segments.push({
|
|
819
|
-
id: parallelId,
|
|
820
|
-
namespace: parallelEntry.id,
|
|
821
|
-
type: "parallel",
|
|
822
|
-
index: 0,
|
|
823
|
-
component,
|
|
824
|
-
loading: parallelEntry.loading === false ? null : parallelEntry.loading,
|
|
825
|
-
transition: parallelEntry.transition,
|
|
826
|
-
params,
|
|
827
|
-
slot,
|
|
828
|
-
belongsToRoute,
|
|
829
|
-
parallelName: `${parallelEntry.id}.${slot}`,
|
|
830
|
-
...(parallelEntry.mountPath
|
|
831
|
-
? { mountPath: parallelEntry.mountPath }
|
|
832
|
-
: {}),
|
|
833
|
-
});
|
|
1060
|
+
// Tag as inherited so buildMatchResult can deduplicate when safe
|
|
1061
|
+
for (const s of inheritedResult.segments) {
|
|
1062
|
+
s._inherited = true;
|
|
834
1063
|
}
|
|
1064
|
+
segments.push(...inheritedResult.segments);
|
|
1065
|
+
matchedIds.push(...inheritedResult.matchedIds);
|
|
835
1066
|
}
|
|
836
1067
|
|
|
1068
|
+
// Handler-first: resolve orphan layout handler before its parallels
|
|
1069
|
+
// so ctx.set() values are visible to parallel children.
|
|
837
1070
|
matchedIds.push(orphan.shortCode);
|
|
838
1071
|
|
|
839
1072
|
const component = await revalidate(
|
|
840
1073
|
async () => {
|
|
841
|
-
if (!clientSegmentIds.has(orphan.shortCode))
|
|
1074
|
+
if (!clientSegmentIds.has(orphan.shortCode)) {
|
|
1075
|
+
if (isTraceActive()) {
|
|
1076
|
+
pushRevalidationTraceEntry({
|
|
1077
|
+
segmentId: orphan.shortCode,
|
|
1078
|
+
segmentType: "layout",
|
|
1079
|
+
belongsToRoute,
|
|
1080
|
+
source: "orphan-layout",
|
|
1081
|
+
defaultShouldRevalidate: true,
|
|
1082
|
+
finalShouldRevalidate: true,
|
|
1083
|
+
reason: "new-segment",
|
|
1084
|
+
});
|
|
1085
|
+
}
|
|
1086
|
+
return true;
|
|
1087
|
+
}
|
|
842
1088
|
|
|
843
1089
|
const dummySegment: ResolvedSegment = {
|
|
844
1090
|
id: orphan.shortCode,
|
|
@@ -852,7 +1098,7 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
|
|
|
852
1098
|
...(orphan.mountPath ? { mountPath: orphan.mountPath } : {}),
|
|
853
1099
|
};
|
|
854
1100
|
|
|
855
|
-
|
|
1101
|
+
const shouldRevalidate = await evaluateRevalidation({
|
|
856
1102
|
segment: dummySegment,
|
|
857
1103
|
prevParams,
|
|
858
1104
|
getPrevSegment: null,
|
|
@@ -867,22 +1113,17 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
|
|
|
867
1113
|
context,
|
|
868
1114
|
actionContext,
|
|
869
1115
|
stale,
|
|
1116
|
+
traceSource: "orphan-layout",
|
|
870
1117
|
});
|
|
1118
|
+
emitRevalidationDecision(
|
|
1119
|
+
orphan.shortCode,
|
|
1120
|
+
context.pathname,
|
|
1121
|
+
routeKey,
|
|
1122
|
+
shouldRevalidate,
|
|
1123
|
+
);
|
|
1124
|
+
return shouldRevalidate;
|
|
871
1125
|
},
|
|
872
|
-
async () =>
|
|
873
|
-
// Static handler interception for orphan layouts
|
|
874
|
-
const orphanAny = orphan as any;
|
|
875
|
-
if (orphanAny.isStaticPrerender && orphanAny.staticHandlerId) {
|
|
876
|
-
const staticComponent = await tryStaticLookup(
|
|
877
|
-
orphanAny.staticHandlerId,
|
|
878
|
-
orphan.shortCode,
|
|
879
|
-
);
|
|
880
|
-
if (staticComponent !== undefined) return staticComponent;
|
|
881
|
-
}
|
|
882
|
-
return typeof orphan.handler === "function"
|
|
883
|
-
? handleHandlerResult(await orphan.handler(context))
|
|
884
|
-
: orphan.handler;
|
|
885
|
-
},
|
|
1126
|
+
async () => resolveLayoutComponent(orphan, context),
|
|
886
1127
|
() => null,
|
|
887
1128
|
);
|
|
888
1129
|
|
|
@@ -900,136 +1141,172 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
|
|
|
900
1141
|
...(orphan.mountPath ? { mountPath: orphan.mountPath } : {}),
|
|
901
1142
|
});
|
|
902
1143
|
|
|
903
|
-
|
|
904
|
-
}
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
params: Record<string, string>,
|
|
912
|
-
resolveFn: () => Promise<SegmentRevalidationResult>,
|
|
913
|
-
deps: SegmentResolutionDeps<TEnv>,
|
|
914
|
-
pathname?: string,
|
|
915
|
-
errorContext?: {
|
|
916
|
-
request: Request;
|
|
917
|
-
url: URL;
|
|
918
|
-
routeKey?: string;
|
|
919
|
-
env?: TEnv;
|
|
920
|
-
isPartial?: boolean;
|
|
921
|
-
requestStartTime?: number;
|
|
922
|
-
},
|
|
923
|
-
): Promise<SegmentRevalidationResult> {
|
|
924
|
-
try {
|
|
925
|
-
return await resolveFn();
|
|
926
|
-
} catch (error) {
|
|
927
|
-
if (error instanceof Response) {
|
|
928
|
-
throw error;
|
|
929
|
-
}
|
|
930
|
-
|
|
931
|
-
if (error instanceof DataNotFoundError) {
|
|
932
|
-
const notFoundFallback = deps.findNearestNotFoundBoundary(entry);
|
|
933
|
-
|
|
934
|
-
if (notFoundFallback) {
|
|
935
|
-
const notFoundInfo = createNotFoundInfo(
|
|
936
|
-
error,
|
|
937
|
-
entry.shortCode,
|
|
938
|
-
entry.type,
|
|
939
|
-
pathname,
|
|
940
|
-
);
|
|
941
|
-
|
|
942
|
-
if (errorContext) {
|
|
943
|
-
deps.callOnError(error, "handler", {
|
|
944
|
-
request: errorContext.request,
|
|
945
|
-
url: errorContext.url,
|
|
946
|
-
routeKey: errorContext.routeKey,
|
|
947
|
-
params,
|
|
948
|
-
segmentId: entry.shortCode,
|
|
949
|
-
segmentType: entry.type as any,
|
|
950
|
-
env: errorContext.env,
|
|
951
|
-
isPartial: errorContext.isPartial,
|
|
952
|
-
handledByBoundary: true,
|
|
953
|
-
metadata: { notFound: true, message: notFoundInfo.message },
|
|
954
|
-
requestStartTime: errorContext.requestStartTime,
|
|
955
|
-
});
|
|
956
|
-
}
|
|
957
|
-
|
|
958
|
-
debugLog("segment", "notFound boundary handled error", {
|
|
959
|
-
segmentId: entry.shortCode,
|
|
960
|
-
message: notFoundInfo.message,
|
|
961
|
-
});
|
|
962
|
-
|
|
963
|
-
const reqCtx = getRequestContext();
|
|
964
|
-
if (reqCtx) {
|
|
965
|
-
reqCtx.res = new Response(null, {
|
|
966
|
-
status: 404,
|
|
967
|
-
headers: reqCtx.res.headers,
|
|
968
|
-
});
|
|
969
|
-
}
|
|
970
|
-
|
|
971
|
-
const notFoundSegment = createNotFoundSegment(
|
|
972
|
-
notFoundInfo,
|
|
973
|
-
notFoundFallback,
|
|
974
|
-
entry,
|
|
975
|
-
params,
|
|
976
|
-
);
|
|
1144
|
+
const resolvedParallelEntries = new Set<string>();
|
|
1145
|
+
for (const { slot, entry: parallelEntry } of getParallelSlotEntries(
|
|
1146
|
+
orphan.parallel,
|
|
1147
|
+
)) {
|
|
1148
|
+
invariant(
|
|
1149
|
+
parallelEntry.type === "parallel",
|
|
1150
|
+
`Expected parallel entry, got: ${parallelEntry.type}`,
|
|
1151
|
+
);
|
|
977
1152
|
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
1153
|
+
if (!resolvedParallelEntries.has(parallelEntry.id)) {
|
|
1154
|
+
// shortCodeOverride must match the parent layout, not the parallel entry.
|
|
1155
|
+
const loaderResult = await resolveLoadersWithRevalidation(
|
|
1156
|
+
parallelEntry,
|
|
1157
|
+
context,
|
|
1158
|
+
belongsToRoute,
|
|
1159
|
+
clientSegmentIds,
|
|
1160
|
+
prevParams,
|
|
1161
|
+
request,
|
|
1162
|
+
prevUrl,
|
|
1163
|
+
nextUrl,
|
|
1164
|
+
routeKey,
|
|
1165
|
+
deps,
|
|
1166
|
+
actionContext,
|
|
1167
|
+
orphan.shortCode,
|
|
1168
|
+
stale,
|
|
1169
|
+
);
|
|
1170
|
+
segments.push(...loaderResult.segments);
|
|
1171
|
+
matchedIds.push(...loaderResult.matchedIds);
|
|
1172
|
+
resolvedParallelEntries.add(parallelEntry.id);
|
|
983
1173
|
}
|
|
984
1174
|
|
|
985
|
-
const
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
1175
|
+
const slots = parallelEntry.handler as Record<
|
|
1176
|
+
`@${string}`,
|
|
1177
|
+
| ((ctx: HandlerContext<any, TEnv>) => ReactNode | Promise<ReactNode>)
|
|
1178
|
+
| ReactNode
|
|
1179
|
+
>;
|
|
1180
|
+
// Handler may be undefined in production after static handler eviction.
|
|
1181
|
+
const handler = slots[slot];
|
|
1182
|
+
|
|
1183
|
+
// Use orphan.shortCode (the parent layout) to match the SSR path
|
|
1184
|
+
// (resolveParallelEntry receives parentShortCode = orphan.shortCode).
|
|
1185
|
+
// Using parallelEntry.shortCode would generate IDs the client doesn't know about.
|
|
1186
|
+
const parallelId = `${orphan.shortCode}.${slot}`;
|
|
1187
|
+
matchedIds.push(parallelId);
|
|
1188
|
+
|
|
1189
|
+
const isFullRefetch = clientSegmentIds.size === 0;
|
|
1190
|
+
let shouldResolve: boolean;
|
|
1191
|
+
if (isFullRefetch) {
|
|
1192
|
+
// Same load-bearing rationale as the main parallel path: full refetch
|
|
1193
|
+
// means the client has nothing to fall back to, so the slot must render.
|
|
1194
|
+
traceFullRefetchedParallelSlot(parallelId, belongsToRoute);
|
|
1195
|
+
shouldResolve = true;
|
|
1196
|
+
} else {
|
|
1197
|
+
// When slot is unknown to the client, seed the soft chain with `true`
|
|
1198
|
+
// (orphan parallels always belong to the route — we want them rendered
|
|
1199
|
+
// unless the user explicitly opts out via revalidate()).
|
|
1200
|
+
const defaultOverride = clientSegmentIds.has(parallelId)
|
|
1201
|
+
? undefined
|
|
1202
|
+
: { value: true, reason: "new-segment" };
|
|
989
1203
|
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
1204
|
+
const dummySegment: ResolvedSegment = {
|
|
1205
|
+
id: parallelId,
|
|
1206
|
+
namespace: parallelEntry.id,
|
|
1207
|
+
type: "parallel",
|
|
1208
|
+
index: 0,
|
|
1209
|
+
component: null as any,
|
|
995
1210
|
params,
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1211
|
+
slot,
|
|
1212
|
+
belongsToRoute,
|
|
1213
|
+
parallelName: `${parallelEntry.id}.${slot}`,
|
|
1214
|
+
...(parallelEntry.mountPath
|
|
1215
|
+
? { mountPath: parallelEntry.mountPath }
|
|
1216
|
+
: {}),
|
|
1217
|
+
};
|
|
1218
|
+
|
|
1219
|
+
shouldResolve = await evaluateRevalidation({
|
|
1220
|
+
segment: dummySegment,
|
|
1221
|
+
prevParams,
|
|
1222
|
+
getPrevSegment: null,
|
|
1223
|
+
request,
|
|
1224
|
+
prevUrl,
|
|
1225
|
+
nextUrl,
|
|
1226
|
+
revalidations: parallelEntry.revalidate.map((fn, i) => ({
|
|
1227
|
+
name: `revalidate${i}`,
|
|
1228
|
+
fn,
|
|
1229
|
+
})),
|
|
1230
|
+
routeKey,
|
|
1231
|
+
context,
|
|
1232
|
+
actionContext,
|
|
1233
|
+
stale,
|
|
1234
|
+
traceSource: "parallel",
|
|
1235
|
+
defaultOverride,
|
|
1002
1236
|
});
|
|
1003
1237
|
}
|
|
1238
|
+
emitRevalidationDecision(
|
|
1239
|
+
parallelId,
|
|
1240
|
+
context.pathname,
|
|
1241
|
+
routeKey,
|
|
1242
|
+
shouldResolve,
|
|
1243
|
+
);
|
|
1004
1244
|
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
}
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
if (
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1245
|
+
let component: ReactNode | undefined;
|
|
1246
|
+
let handlerRan = false;
|
|
1247
|
+
if (shouldResolve) {
|
|
1248
|
+
component = await tryStaticSlot(parallelEntry, slot, parallelId);
|
|
1249
|
+
}
|
|
1250
|
+
if (component === undefined) {
|
|
1251
|
+
const hasLoadingFallback =
|
|
1252
|
+
parallelEntry.loading !== undefined && parallelEntry.loading !== false;
|
|
1253
|
+
if (!shouldResolve) {
|
|
1254
|
+
component = null;
|
|
1255
|
+
} else if (handler === undefined) {
|
|
1256
|
+
// Handler evicted (production static slot) but static lookup missed.
|
|
1257
|
+
component = null;
|
|
1258
|
+
} else {
|
|
1259
|
+
// Slot-keyed pushes — see resolveParallelSegmentsWithRevalidation.
|
|
1260
|
+
(context as InternalHandlerContext<any, TEnv>)._currentSegmentId =
|
|
1261
|
+
parallelId;
|
|
1262
|
+
handlerRan = true;
|
|
1263
|
+
if (hasLoadingFallback) {
|
|
1264
|
+
const result =
|
|
1265
|
+
typeof handler === "function" ? handler(context) : handler;
|
|
1266
|
+
if (result instanceof Promise) {
|
|
1267
|
+
const tracked = deps.trackHandler(result, {
|
|
1268
|
+
segmentId: parallelId,
|
|
1269
|
+
segmentType: "parallel",
|
|
1270
|
+
});
|
|
1271
|
+
observeStreamedHandler(
|
|
1272
|
+
tracked,
|
|
1273
|
+
parallelId,
|
|
1274
|
+
"parallel",
|
|
1275
|
+
context.pathname,
|
|
1276
|
+
routeKey,
|
|
1277
|
+
params,
|
|
1278
|
+
);
|
|
1279
|
+
component = tracked as ReactNode;
|
|
1280
|
+
} else {
|
|
1281
|
+
component = result as ReactNode;
|
|
1282
|
+
}
|
|
1283
|
+
} else {
|
|
1284
|
+
component =
|
|
1285
|
+
typeof handler === "function" ? await handler(context) : handler;
|
|
1286
|
+
}
|
|
1018
1287
|
}
|
|
1019
1288
|
}
|
|
1020
1289
|
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1290
|
+
segments.push({
|
|
1291
|
+
id: parallelId,
|
|
1292
|
+
namespace: parallelEntry.id,
|
|
1293
|
+
type: "parallel",
|
|
1294
|
+
index: 0,
|
|
1295
|
+
component,
|
|
1296
|
+
loading: parallelEntry.loading === false ? null : parallelEntry.loading,
|
|
1297
|
+
transition: parallelEntry.transition,
|
|
1025
1298
|
params,
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1299
|
+
slot,
|
|
1300
|
+
_handlerRan: handlerRan,
|
|
1301
|
+
belongsToRoute,
|
|
1302
|
+
parallelName: `${parallelEntry.id}.${slot}`,
|
|
1303
|
+
...(parallelEntry.mountPath
|
|
1304
|
+
? { mountPath: parallelEntry.mountPath }
|
|
1305
|
+
: {}),
|
|
1306
|
+
});
|
|
1032
1307
|
}
|
|
1308
|
+
|
|
1309
|
+
return { segments, matchedIds };
|
|
1033
1310
|
}
|
|
1034
1311
|
|
|
1035
1312
|
/**
|
|
@@ -1051,12 +1328,15 @@ export async function resolveAllSegmentsWithRevalidation<TEnv>(
|
|
|
1051
1328
|
localRouteName: string,
|
|
1052
1329
|
pathname: string,
|
|
1053
1330
|
deps: SegmentResolutionDeps<TEnv>,
|
|
1331
|
+
stale?: boolean,
|
|
1054
1332
|
): Promise<{ segments: ResolvedSegment[]; matchedIds: string[] }> {
|
|
1055
1333
|
const allSegments: ResolvedSegment[] = [];
|
|
1056
1334
|
const matchedIds: string[] = [];
|
|
1057
1335
|
const seenSegIds = new Set<string>();
|
|
1058
1336
|
const seenMatchIds = new Set<string>();
|
|
1059
1337
|
|
|
1338
|
+
const telemetry = getRouterContext()?.telemetry;
|
|
1339
|
+
|
|
1060
1340
|
for (const entry of entries) {
|
|
1061
1341
|
if (entry.type === "route" && interceptResult) {
|
|
1062
1342
|
debugLog(
|
|
@@ -1075,7 +1355,12 @@ export async function resolveAllSegmentsWithRevalidation<TEnv>(
|
|
|
1075
1355
|
}
|
|
1076
1356
|
|
|
1077
1357
|
const nonParallelEntry = entry as Exclude<EntryData, { type: "parallel" }>;
|
|
1078
|
-
|
|
1358
|
+
if (entry.type === "cache") {
|
|
1359
|
+
const store = RSCRouterContext.getStore();
|
|
1360
|
+
if (store) store.insideCacheScope = true;
|
|
1361
|
+
}
|
|
1362
|
+
const doneEntry = track(`segment:${entry.id}`, 1);
|
|
1363
|
+
const resolved = await resolveWithErrorBoundary(
|
|
1079
1364
|
nonParallelEntry,
|
|
1080
1365
|
params,
|
|
1081
1366
|
() =>
|
|
@@ -1092,11 +1377,14 @@ export async function resolveAllSegmentsWithRevalidation<TEnv>(
|
|
|
1092
1377
|
loaderPromises,
|
|
1093
1378
|
deps,
|
|
1094
1379
|
actionContext,
|
|
1095
|
-
|
|
1380
|
+
stale,
|
|
1096
1381
|
),
|
|
1382
|
+
(seg) => ({ segments: [seg], matchedIds: [seg.id] }),
|
|
1097
1383
|
deps,
|
|
1384
|
+
{ request, url: context.url, routeKey, isPartial: true, telemetry },
|
|
1098
1385
|
pathname,
|
|
1099
1386
|
);
|
|
1387
|
+
doneEntry();
|
|
1100
1388
|
|
|
1101
1389
|
// Deduplicate segments and matchedIds by ID, matching resolveAllSegments.
|
|
1102
1390
|
// include() scopes can produce entries that resolve the same shared
|