@rangojs/router 0.0.0-experimental.15 → 0.0.0-experimental.150
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +13 -0
- package/README.md +308 -451
- 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 +1844 -237
- 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/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
- 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/{src/handles/index.ts → dist/handles/index.js} +1 -1
- 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/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -8
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +7471 -2057
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +142 -61
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +489 -0
- package/skills/caching/SKILL.md +413 -26
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +278 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +17 -11
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +96 -63
- package/skills/fonts/SKILL.md +7 -5
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +76 -436
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +215 -16
- package/skills/layout/SKILL.md +147 -7
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +629 -55
- package/skills/middleware/SKILL.md +218 -38
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +60 -21
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +296 -4
- package/skills/ppr/SKILL.md +643 -0
- package/skills/prerender/SKILL.md +444 -52
- package/skills/rango/SKILL.md +324 -29
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +264 -122
- package/skills/route/SKILL.md +359 -22
- package/skills/router-setup/SKILL.md +247 -34
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +126 -222
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +10 -9
- package/skills/typesafety/SKILL.md +45 -496
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +383 -0
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +77 -44
- package/src/bin/rango.ts +275 -29
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +348 -212
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +39 -0
- package/src/browser/merge-segment-loaders.ts +23 -13
- package/src/browser/navigation-bridge.ts +385 -576
- package/src/browser/navigation-client.ts +249 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +230 -124
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +88 -0
- package/src/browser/partial-update.ts +432 -365
- package/src/browser/prefetch/cache.ts +381 -0
- package/src/browser/prefetch/fetch.ts +462 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +209 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +284 -67
- package/src/browser/react/NavigationProvider.tsx +267 -109
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +70 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +272 -60
- package/src/browser/react/location-state.ts +90 -20
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +39 -13
- package/src/browser/react/use-navigation.ts +53 -69
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +164 -0
- package/src/browser/rsc-router.tsx +355 -73
- package/src/browser/scroll-restoration.ts +140 -50
- package/src/browser/segment-reconciler.ts +253 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +668 -613
- package/src/browser/types.ts +235 -51
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +252 -161
- package/src/build/generate-route-types.ts +41 -848
- package/src/build/index.ts +12 -7
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +225 -42
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +105 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +812 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +144 -0
- package/src/build/route-types/router-processing.ts +695 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +223 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +89 -0
- package/src/cache/cache-policy.ts +199 -0
- package/src/cache/cache-runtime.ts +695 -0
- package/src/cache/cache-scope.ts +324 -335
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2602 -156
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +17 -17
- package/src/cache/document-cache.ts +226 -102
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +132 -0
- package/src/cache/index.ts +24 -35
- package/src/cache/memory-segment-store.ts +446 -30
- package/src/cache/profile-registry.ts +88 -0
- package/src/cache/read-through-swr.ts +178 -0
- package/src/cache/segment-codec.ts +295 -0
- package/src/cache/shell-snapshot.ts +464 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +283 -211
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1201 -0
- package/src/client.rsc.tsx +43 -21
- package/src/client.tsx +131 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +13 -3
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +4 -2
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +106 -10
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +110 -35
- package/src/handles/MetaTags.tsx +83 -59
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +44 -53
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +20 -65
- package/src/host/errors.ts +21 -30
- package/src/host/index.ts +13 -9
- package/src/host/pattern-matcher.ts +50 -79
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +180 -35
- package/src/index.ts +245 -73
- package/src/internal-debug.ts +9 -2
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/build-shell-capture.ts +253 -0
- package/src/prerender/param-hash.ts +16 -14
- package/src/prerender/shell-manifest-key.ts +20 -0
- package/src/prerender/store.ts +131 -22
- package/src/prerender.ts +460 -26
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +22 -77
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +88 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +54 -0
- package/src/route-definition/redirect.ts +134 -0
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-definition.ts +1 -1481
- package/src/route-map-builder.ts +120 -145
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +71 -45
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +305 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +54 -27
- package/src/router/find-match.ts +259 -0
- package/src/router/handler-context.ts +376 -125
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +88 -28
- package/src/router/lazy-includes.ts +260 -0
- package/src/router/loader-resolution.ts +449 -157
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +144 -62
- package/src/router/match-api.ts +224 -256
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +499 -0
- package/src/router/match-middleware/background-revalidation.ts +117 -93
- package/src/router/match-middleware/cache-lookup.ts +308 -150
- package/src/router/match-middleware/cache-store.ts +123 -51
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +143 -52
- package/src/router/metrics.ts +235 -29
- package/src/router/middleware-types.ts +93 -0
- package/src/router/middleware.ts +522 -441
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +311 -142
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +568 -0
- package/src/router/preview-match.ts +102 -0
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +203 -62
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +45 -48
- package/src/router/router-interfaces.ts +570 -0
- package/src/router/router-options.ts +792 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +812 -0
- package/src/router/segment-resolution/helpers.ts +348 -0
- package/src/router/segment-resolution/loader-cache.ts +315 -0
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +99 -0
- package/src/router/segment-resolution/revalidation.ts +1340 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +25 -1354
- package/src/router/segment-wrappers.ts +292 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +259 -0
- package/src/router/telemetry.ts +385 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +240 -61
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +796 -2387
- package/src/rsc/capture-queue.ts +67 -0
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +927 -1139
- package/src/rsc/helpers.ts +275 -19
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +305 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +23 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +502 -0
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +257 -0
- package/src/rsc/rsc-rendering.ts +822 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +522 -0
- package/src/rsc/shell-build-manifest.ts +274 -0
- package/src/rsc/shell-capture-constants.ts +27 -0
- package/src/rsc/shell-capture.ts +1705 -0
- package/src/rsc/shell-serve.ts +226 -0
- package/src/rsc/ssr-setup.ts +176 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +95 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +99 -82
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-fragments.ts +124 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +464 -135
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +616 -85
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +337 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +123 -42
- package/src/server/loader-registry.ts +51 -100
- package/src/server/request-context.ts +1041 -155
- package/src/server.ts +15 -8
- package/src/ssr/index.tsx +661 -140
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/preinit-client-references.ts +106 -0
- package/src/ssr/ssr-root.tsx +261 -0
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +371 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +357 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +76 -98
- package/src/theme/ThemeScript.tsx +12 -14
- package/src/theme/constants.ts +57 -15
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +43 -39
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +839 -0
- package/src/types/index.ts +81 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +138 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +271 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +162 -0
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +44 -0
- package/src/urls/path-helper-types.ts +418 -0
- package/src/urls/path-helper.ts +280 -0
- package/src/urls/pattern-types.ts +189 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +316 -0
- package/src/urls/urls-function.ts +80 -0
- package/src/urls.ts +1 -1352
- package/src/use-loader.tsx +406 -141
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +416 -0
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +483 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/shell-prerender-phase.ts +397 -0
- package/src/vite/discovery/state.ts +205 -0
- package/src/vite/discovery/virtual-module-codegen.ts +183 -0
- package/src/vite/index.ts +31 -2255
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +336 -0
- package/src/vite/plugins/cjs-to-esm.ts +90 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
- package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +805 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +94 -0
- package/src/vite/plugins/version-plugin.ts +271 -0
- package/src/vite/plugins/virtual-entries.ts +267 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +569 -0
- package/src/vite/router-discovery.ts +2011 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +268 -0
- package/src/vite/utils/shared-utils.ts +271 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -0,0 +1,822 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RSC Rendering Handler (Navigation)
|
|
3
|
+
*
|
|
4
|
+
* Handles RSC rendering for both partial (client-side navigation) and full
|
|
5
|
+
* (initial page load) requests. Includes prerender collection for build-time
|
|
6
|
+
* static generation.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
getRequestContext,
|
|
11
|
+
setRequestContextParams,
|
|
12
|
+
runWithRequestContext,
|
|
13
|
+
} from "../server/request-context.js";
|
|
14
|
+
import {
|
|
15
|
+
SeededShellStore,
|
|
16
|
+
buildShellLoaderSeed,
|
|
17
|
+
} from "../cache/shell-snapshot.js";
|
|
18
|
+
import { appendMetric } from "../router/metrics.js";
|
|
19
|
+
import { observePhase, PHASES } from "../router/instrument.js";
|
|
20
|
+
import { getSSRSetup, isRscRequest } from "./ssr-setup.js";
|
|
21
|
+
import type { RscPayload } from "./types.js";
|
|
22
|
+
import type { SSRModule } from "./types.js";
|
|
23
|
+
import type { RequestContext } from "../server/request-context.js";
|
|
24
|
+
import {
|
|
25
|
+
createResponseWithMergedHeaders,
|
|
26
|
+
createSimpleRedirectResponse,
|
|
27
|
+
attachLocationStateIfPresent,
|
|
28
|
+
} from "./helpers.js";
|
|
29
|
+
import type { HandlerContext } from "./handler-context.js";
|
|
30
|
+
import { gateTransitions } from "./transition-gate.js";
|
|
31
|
+
import { buildFullPayload } from "./full-payload.js";
|
|
32
|
+
import {
|
|
33
|
+
scheduleShellCapture,
|
|
34
|
+
resolveShellCaptureDebugSink,
|
|
35
|
+
takeCaptureDebugEventForTiming,
|
|
36
|
+
describeShellCaptureEvent,
|
|
37
|
+
type ShellCaptureDescriptor,
|
|
38
|
+
} from "./shell-capture.js";
|
|
39
|
+
import {
|
|
40
|
+
SHELL_STATUS_HEADER,
|
|
41
|
+
resolvePprConfig,
|
|
42
|
+
buildShellKey,
|
|
43
|
+
isValidShellHit,
|
|
44
|
+
hasIntactShellPayload,
|
|
45
|
+
base64ToBytes,
|
|
46
|
+
hasShellFamily,
|
|
47
|
+
warnShellStoreMissingOnce,
|
|
48
|
+
warnPprNonceActiveOnce,
|
|
49
|
+
} from "./shell-serve.js";
|
|
50
|
+
import { lookupBuildShell } from "./shell-build-manifest.js";
|
|
51
|
+
import { contextGet } from "../context-var.js";
|
|
52
|
+
import {
|
|
53
|
+
resolveSameOriginRedirect,
|
|
54
|
+
safeSameOriginLanding,
|
|
55
|
+
} from "../redirect-origin.js";
|
|
56
|
+
import { nonce as nonceToken } from "./nonce.js";
|
|
57
|
+
import { reportCacheError } from "../cache/cache-error.js";
|
|
58
|
+
import { INTERNAL_RANGO_DEBUG } from "../internal-debug.js";
|
|
59
|
+
import type { ShellCacheEntry } from "../cache/types.js";
|
|
60
|
+
|
|
61
|
+
export function handleRscRendering<TEnv>(
|
|
62
|
+
ctx: HandlerContext<TEnv>,
|
|
63
|
+
request: Request,
|
|
64
|
+
env: TEnv,
|
|
65
|
+
url: URL,
|
|
66
|
+
isPartial: boolean,
|
|
67
|
+
handleStore: ReturnType<typeof getRequestContext>["_handleStore"],
|
|
68
|
+
nonce: string | undefined,
|
|
69
|
+
): Promise<Response> {
|
|
70
|
+
// Instrument the whole render phase once through the unified API: it records
|
|
71
|
+
// the "render:total" perf metric AND opens the "rango.render" span from the
|
|
72
|
+
// same boundary (match -> serialize -> SSR), so the two surfaces agree.
|
|
73
|
+
// Loaders kicked off during matching nest under the span; the SSR HTML pass
|
|
74
|
+
// below opens "rango.ssr" the same way.
|
|
75
|
+
return observePhase(PHASES.render, () =>
|
|
76
|
+
handleRscRenderingInner(
|
|
77
|
+
ctx,
|
|
78
|
+
request,
|
|
79
|
+
env,
|
|
80
|
+
url,
|
|
81
|
+
isPartial,
|
|
82
|
+
handleStore,
|
|
83
|
+
nonce,
|
|
84
|
+
),
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async function handleRscRenderingInner<TEnv>(
|
|
89
|
+
ctx: HandlerContext<TEnv>,
|
|
90
|
+
request: Request,
|
|
91
|
+
env: TEnv,
|
|
92
|
+
url: URL,
|
|
93
|
+
isPartial: boolean,
|
|
94
|
+
handleStore: ReturnType<typeof getRequestContext>["_handleStore"],
|
|
95
|
+
nonce: string | undefined,
|
|
96
|
+
): Promise<Response> {
|
|
97
|
+
const reqCtx = getRequestContext();
|
|
98
|
+
|
|
99
|
+
let payload: RscPayload;
|
|
100
|
+
let hasInterceptSlots = false;
|
|
101
|
+
|
|
102
|
+
// --- Axis 2: integrated PPR shell serve (docs/design/ppr-shell-resume.md) ---
|
|
103
|
+
//
|
|
104
|
+
// COMMIT POINT. This function is the render pass executeRender wraps, so it runs
|
|
105
|
+
// strictly AFTER the whole middleware chain — the global router.use() chain AND
|
|
106
|
+
// route DSL middleware() both wrap it. Any middleware rejection/redirect/401 has
|
|
107
|
+
// already returned before this line, which is what makes a shared shell safe:
|
|
108
|
+
// not a single shell byte can precede a guard decision, on MISS or HIT.
|
|
109
|
+
//
|
|
110
|
+
// PPR is opt-in per PAGE ROUTE via the `ppr` path option (read off the classified
|
|
111
|
+
// route snapshot — the same matched entry match() will resolve). No `ppr` option
|
|
112
|
+
// means pure axis 1: no store read, no capture, no logs, zero cost.
|
|
113
|
+
//
|
|
114
|
+
// On a valid HIT the composed response is committed HERE — the stored prelude
|
|
115
|
+
// bytes flush immediately while match()/segment resolution/Flight render/resume
|
|
116
|
+
// run behind them inside the response stream (ring-3 reads and render setup hide
|
|
117
|
+
// behind wire bytes). On a MISS the request continues as plain axis 1 and a
|
|
118
|
+
// background capture is scheduled after the response is built.
|
|
119
|
+
let pprMiss: {
|
|
120
|
+
descriptor: ShellCaptureDescriptor;
|
|
121
|
+
ssrModule: SSRModule;
|
|
122
|
+
} | null = null;
|
|
123
|
+
if (
|
|
124
|
+
!isPartial &&
|
|
125
|
+
request.method === "GET" &&
|
|
126
|
+
!url.searchParams.has("__prerender_collect") &&
|
|
127
|
+
!isRscRequest(request, url, false)
|
|
128
|
+
) {
|
|
129
|
+
const pprConfig = resolvePprConfig(reqCtx._classifiedRoute?.manifestEntry);
|
|
130
|
+
if (pprConfig) {
|
|
131
|
+
// A per-request CSP nonce pins the route to axis 1: useNonce() (and any app
|
|
132
|
+
// code reading the nonce) renders it into every nonced script/style/meta, so
|
|
133
|
+
// a shell shared per host+URL would freeze one request's nonce for every
|
|
134
|
+
// visitor and the browser's CSP would reject the frozen nonce for all but the
|
|
135
|
+
// capture request. The nonce arrives two ways and BOTH must gate: the
|
|
136
|
+
// createRouter({ nonce }) provider (threaded here as `nonce`), and a direct
|
|
137
|
+
// token write in middleware (ctx.set(nonce, value)). The token is only
|
|
138
|
+
// visible in the post-middleware request variables — and this commit point
|
|
139
|
+
// runs AFTER the whole middleware chain (see the block header), so it is
|
|
140
|
+
// present here. Reading it closes the gap the provider-only check left open
|
|
141
|
+
// (issue #656). The threaded-param check stays first: the provider path is
|
|
142
|
+
// resolved before any variable read and short-circuits cheaply.
|
|
143
|
+
const activeNonce = nonce ?? contextGet(reqCtx._variables, nonceToken);
|
|
144
|
+
const store = reqCtx._cacheStore;
|
|
145
|
+
const key = buildShellKey(url);
|
|
146
|
+
// Dev Server-Timing mirror (issue #651): a capture runs AFTER its
|
|
147
|
+
// triggering response committed, so its outcome can only ride a LATER
|
|
148
|
+
// response's header. When the metrics surface is active
|
|
149
|
+
// (debugPerformance), fold the buffered terminal capture event for this
|
|
150
|
+
// key into THIS request's Server-Timing as `ppr-capture;dur=<attempt
|
|
151
|
+
// ms>;desc="<outcome + sizes + waits>"`. Consuming (read-and-clear)
|
|
152
|
+
// keeps one capture = one report. Dev-only: the buffer is only written
|
|
153
|
+
// in dev (see takeCaptureDebugEventForTiming), and production folds the
|
|
154
|
+
// whole branch away.
|
|
155
|
+
if (process.env.NODE_ENV !== "production" && reqCtx._metricsStore) {
|
|
156
|
+
const lastCapture = takeCaptureDebugEventForTiming(key);
|
|
157
|
+
if (lastCapture) {
|
|
158
|
+
appendMetric(
|
|
159
|
+
reqCtx._metricsStore,
|
|
160
|
+
"ppr:capture",
|
|
161
|
+
performance.now(),
|
|
162
|
+
lastCapture.attemptMs ?? 0,
|
|
163
|
+
undefined,
|
|
164
|
+
// attemptMs already rides as this entry's dur — drop it from desc.
|
|
165
|
+
describeShellCaptureEvent({ ...lastCapture, attemptMs: undefined }),
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (activeNonce !== undefined) {
|
|
170
|
+
// Declared intent that cannot be honored deserves a diagnostic (unlike an
|
|
171
|
+
// undeclared route, which is silent): a ppr route gated off by an active
|
|
172
|
+
// per-request nonce warns once per key. Axis 1 after the warning.
|
|
173
|
+
warnPprNonceActiveOnce(key);
|
|
174
|
+
} else if (!hasShellFamily(store)) {
|
|
175
|
+
// Declared intent that cannot be honored deserves a diagnostic (unlike an
|
|
176
|
+
// undeclared route, which is silent). Axis 1 after the warning.
|
|
177
|
+
warnShellStoreMissingOnce(key);
|
|
178
|
+
} else {
|
|
179
|
+
// allReady (ssr.resolveStreaming) bypasses PPR entirely: buffering defeats
|
|
180
|
+
// streaming, so bots/SEO crawlers get one complete axis-1 document.
|
|
181
|
+
const [ssrModule, streamMode] = await getSSRSetup(
|
|
182
|
+
ctx,
|
|
183
|
+
request,
|
|
184
|
+
env,
|
|
185
|
+
url,
|
|
186
|
+
reqCtx._metricsStore,
|
|
187
|
+
);
|
|
188
|
+
if (
|
|
189
|
+
streamMode !== "allReady" &&
|
|
190
|
+
ssrModule.resumeShellHTML &&
|
|
191
|
+
ssrModule.captureShellHTML
|
|
192
|
+
) {
|
|
193
|
+
const descriptor: ShellCaptureDescriptor = {
|
|
194
|
+
key,
|
|
195
|
+
buildVersion: ctx.version,
|
|
196
|
+
ttl: pprConfig.ttl,
|
|
197
|
+
swr: pprConfig.swr,
|
|
198
|
+
tags: pprConfig.tags,
|
|
199
|
+
captureTimeout: pprConfig.captureTimeout,
|
|
200
|
+
store,
|
|
201
|
+
debug: INTERNAL_RANGO_DEBUG,
|
|
202
|
+
maxSnapshotBytes: pprConfig.maxSnapshotBytes,
|
|
203
|
+
// The resolver owns the whole policy: option wins, the
|
|
204
|
+
// INTERNAL_RANGO_DEBUG env flag lights the events up when no
|
|
205
|
+
// option is set, an explicit `false` stays off.
|
|
206
|
+
debugSink: resolveShellCaptureDebugSink(
|
|
207
|
+
ctx.router.debugShellCapture,
|
|
208
|
+
),
|
|
209
|
+
};
|
|
210
|
+
// One serve funnel for BOTH entry sources (runtime store hit below,
|
|
211
|
+
// build-manifest hit further down): schedule the background
|
|
212
|
+
// recapture when asked, then commit the composed response.
|
|
213
|
+
const serveHit = (
|
|
214
|
+
entry: ShellCacheEntry,
|
|
215
|
+
revalidate: boolean | undefined,
|
|
216
|
+
): Response => {
|
|
217
|
+
if (revalidate) {
|
|
218
|
+
scheduleShellCapture(
|
|
219
|
+
ctx,
|
|
220
|
+
request,
|
|
221
|
+
env,
|
|
222
|
+
url,
|
|
223
|
+
reqCtx,
|
|
224
|
+
ssrModule,
|
|
225
|
+
descriptor,
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
return serveShellHit(
|
|
229
|
+
ctx,
|
|
230
|
+
request,
|
|
231
|
+
env,
|
|
232
|
+
url,
|
|
233
|
+
reqCtx,
|
|
234
|
+
handleStore,
|
|
235
|
+
ssrModule,
|
|
236
|
+
entry,
|
|
237
|
+
descriptor,
|
|
238
|
+
);
|
|
239
|
+
};
|
|
240
|
+
let cached: Awaited<ReturnType<typeof store.getShell>> = null;
|
|
241
|
+
const shellReadStart = reqCtx._metricsStore ? performance.now() : 0;
|
|
242
|
+
try {
|
|
243
|
+
cached = await store.getShell(key);
|
|
244
|
+
} catch (error) {
|
|
245
|
+
// A failing store read degrades to axis 1 (MISS), never a 500.
|
|
246
|
+
reportCacheError(error, "cache-read", "[ShellServe] getShell");
|
|
247
|
+
}
|
|
248
|
+
if (reqCtx._metricsStore) {
|
|
249
|
+
// Raw store outcome (pre-validity-gates), so a version-mismatch
|
|
250
|
+
// lifecycle miss is still distinguishable from a store miss.
|
|
251
|
+
appendMetric(
|
|
252
|
+
reqCtx._metricsStore,
|
|
253
|
+
"ppr:shell-read",
|
|
254
|
+
shellReadStart,
|
|
255
|
+
performance.now() - shellReadStart,
|
|
256
|
+
undefined,
|
|
257
|
+
cached ? "hit" : "miss",
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
if (cached && isValidShellHit(cached.entry, ctx.version)) {
|
|
261
|
+
if (!hasIntactShellPayload(cached.entry)) {
|
|
262
|
+
// Corrupt stored payload (undecodable prelude / unparseable
|
|
263
|
+
// postponed): a store-layer fault worth a diagnostic, unlike the
|
|
264
|
+
// silent version-mismatch lifecycle misses above. Degrade to MISS
|
|
265
|
+
// — pprMiss below schedules the recapture that overwrites it.
|
|
266
|
+
reportCacheError(
|
|
267
|
+
new Error(
|
|
268
|
+
`corrupt shell entry for "${key}": prelude/postponed failed ` +
|
|
269
|
+
"the integrity check; serving axis 1 and recapturing",
|
|
270
|
+
),
|
|
271
|
+
"cache-read",
|
|
272
|
+
"[ShellServe] getShell",
|
|
273
|
+
);
|
|
274
|
+
} else {
|
|
275
|
+
// Stale (SWR) hit: serve the stale shell now, recapture in the
|
|
276
|
+
// background (stampede-guarded + backoff inside scheduleShellCapture).
|
|
277
|
+
return serveHit(cached.entry, cached.shouldRevalidate);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// Build-time shell read-through (producer B, #699): on a runtime
|
|
281
|
+
// store MISS (or an invalid/corrupt runtime entry), a Prerender+ppr
|
|
282
|
+
// route's shell was already produced at `vite build` — serve it
|
|
283
|
+
// through the SAME serveShellHit, so the first-ever request after a
|
|
284
|
+
// deploy is a HIT with zero runtime capture. lookupBuildShell owns
|
|
285
|
+
// every gate (search-less request, versions, integrity, tag
|
|
286
|
+
// markers) and fails to null — the ordinary MISS path below takes
|
|
287
|
+
// over. Past ppr.ttl the baked entry still serves but a runtime
|
|
288
|
+
// recapture is scheduled: SWR is the UPGRADE path from build entry
|
|
289
|
+
// to fresher runtime entry (the runtime store read above wins once
|
|
290
|
+
// the capture lands).
|
|
291
|
+
const buildHit = await lookupBuildShell(
|
|
292
|
+
url,
|
|
293
|
+
ctx.version,
|
|
294
|
+
store,
|
|
295
|
+
// Dev: no build manifest exists; producer B runs on demand via
|
|
296
|
+
// the dev server's /__rsc_shell endpoint for PRERENDERED routes
|
|
297
|
+
// only (production's exact candidate set). Folded away in
|
|
298
|
+
// production builds (NODE_ENV is a compile-time constant).
|
|
299
|
+
process.env.NODE_ENV !== "production"
|
|
300
|
+
? {
|
|
301
|
+
isPrerenderRoute:
|
|
302
|
+
reqCtx._classifiedRoute?.matched?.pr === true,
|
|
303
|
+
routeName: reqCtx._classifiedRoute?.routeKey,
|
|
304
|
+
ttl: pprConfig.ttl,
|
|
305
|
+
swr: pprConfig.swr,
|
|
306
|
+
tags: pprConfig.tags,
|
|
307
|
+
maxSnapshotBytes: pprConfig.maxSnapshotBytes,
|
|
308
|
+
captureTimeout: pprConfig.captureTimeout,
|
|
309
|
+
}
|
|
310
|
+
: undefined,
|
|
311
|
+
);
|
|
312
|
+
if (buildHit) {
|
|
313
|
+
// Past ppr.ttl: still serve the baked entry, recapture upgrades it.
|
|
314
|
+
return serveHit(buildHit.entry, buildHit.stale);
|
|
315
|
+
}
|
|
316
|
+
// MISS (no entry, invalid reactVersion, or store read failure): axis 1
|
|
317
|
+
// + a background capture scheduled once the response is known servable.
|
|
318
|
+
pprMiss = { descriptor, ssrModule };
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (isPartial) {
|
|
325
|
+
// Partial render (navigation)
|
|
326
|
+
const result = await ctx.router.matchPartial(request, { env });
|
|
327
|
+
|
|
328
|
+
if (!result) {
|
|
329
|
+
// Fall back to full render
|
|
330
|
+
const match = await ctx.router.match(request, { env });
|
|
331
|
+
setRequestContextParams(match.params, match.routeName);
|
|
332
|
+
|
|
333
|
+
if (match.redirect) {
|
|
334
|
+
// Partial request: use X-RSC-Redirect header so the client can
|
|
335
|
+
// perform SPA navigation. A raw 308 would be auto-followed by
|
|
336
|
+
// fetch, hitting the target without _rsc_partial.
|
|
337
|
+
return createSimpleRedirectResponse(match.redirect);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
payload = buildFullPayload(match, ctx, url, reqCtx, handleStore);
|
|
341
|
+
} else {
|
|
342
|
+
setRequestContextParams(result.params, result.routeName);
|
|
343
|
+
|
|
344
|
+
hasInterceptSlots = !!result.slots;
|
|
345
|
+
|
|
346
|
+
payload = {
|
|
347
|
+
metadata: {
|
|
348
|
+
pathname: url.pathname,
|
|
349
|
+
// routerId is serialized on every payload (including within-session
|
|
350
|
+
// ones) so the frontend can read the current app/router identity. It
|
|
351
|
+
// always equals the current app's id: a cross-app navigation is
|
|
352
|
+
// intercepted server-side (X-RSC-Reload) and never delivers a
|
|
353
|
+
// different-router payload to the client.
|
|
354
|
+
routerId: ctx.router.id,
|
|
355
|
+
segments: gateTransitions(
|
|
356
|
+
result.segments,
|
|
357
|
+
reqCtx,
|
|
358
|
+
ctx.router.onError,
|
|
359
|
+
),
|
|
360
|
+
matched: result.matched,
|
|
361
|
+
diff: result.diff,
|
|
362
|
+
resolvedIds: result.resolvedIds,
|
|
363
|
+
params: result.params,
|
|
364
|
+
isPartial: true,
|
|
365
|
+
slots: result.slots,
|
|
366
|
+
handles: handleStore.stream(),
|
|
367
|
+
version: ctx.version,
|
|
368
|
+
prefetchCacheTTL: ctx.router.prefetchCacheTTL,
|
|
369
|
+
prefetchCacheSize: ctx.router.prefetchCacheSize,
|
|
370
|
+
prefetchConcurrency: ctx.router.prefetchConcurrency,
|
|
371
|
+
stateCookieName: ctx.router.resolvedStateCookieName,
|
|
372
|
+
},
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
} else {
|
|
376
|
+
// Full render (initial page load)
|
|
377
|
+
const match = await ctx.router.match(request, { env });
|
|
378
|
+
setRequestContextParams(match.params, match.routeName);
|
|
379
|
+
|
|
380
|
+
if (match.redirect) {
|
|
381
|
+
return createResponseWithMergedHeaders(null, {
|
|
382
|
+
status: 308,
|
|
383
|
+
headers: { Location: match.redirect },
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// Caching is now handled in router.match() via cache provider in request context
|
|
388
|
+
// match.segments already contains cached or fresh segments as appropriate
|
|
389
|
+
|
|
390
|
+
if (url.searchParams.has("__prerender_collect")) {
|
|
391
|
+
// Build-time prerender collection: serialize segments and handle data
|
|
392
|
+
// to JSON for storage as build artifacts. At runtime the worker
|
|
393
|
+
// deserializes these and feeds them through the normal segment pipeline.
|
|
394
|
+
const nonLoaderSegments = match.segments.filter(
|
|
395
|
+
(s) => s.type !== "loader",
|
|
396
|
+
);
|
|
397
|
+
handleStore.seal();
|
|
398
|
+
await handleStore.settled;
|
|
399
|
+
const { serializeSegments } = await import("../cache/segment-codec.js");
|
|
400
|
+
const serializedSegments = await serializeSegments(nonLoaderSegments);
|
|
401
|
+
const handles: Record<string, Record<string, unknown[]>> = {};
|
|
402
|
+
for (const seg of nonLoaderSegments) {
|
|
403
|
+
const segHandles = handleStore.getDataForSegment(seg.id);
|
|
404
|
+
if (Object.keys(segHandles).length > 0) {
|
|
405
|
+
handles[seg.id] = segHandles;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return new Response(
|
|
409
|
+
JSON.stringify({
|
|
410
|
+
segments: serializedSegments,
|
|
411
|
+
handles,
|
|
412
|
+
routeName: match.routeName,
|
|
413
|
+
params: match.params,
|
|
414
|
+
}),
|
|
415
|
+
{ headers: { "Content-Type": "application/json" } },
|
|
416
|
+
);
|
|
417
|
+
} else {
|
|
418
|
+
payload = buildFullPayload(match, ctx, url, reqCtx, handleStore);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// For partial requests, include any server-set location state in the payload.
|
|
423
|
+
// SSR (full page) requests ignore location state since there's no history.state
|
|
424
|
+
// to write to on a fresh page load.
|
|
425
|
+
if (isPartial && payload.metadata) {
|
|
426
|
+
attachLocationStateIfPresent(payload);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
const metricsStore = reqCtx._metricsStore;
|
|
430
|
+
|
|
431
|
+
// Serialize to RSC stream
|
|
432
|
+
const rscSerializeStart = performance.now();
|
|
433
|
+
const rscStream = ctx.renderToReadableStream<RscPayload>(payload, {
|
|
434
|
+
onError: (error: unknown) => {
|
|
435
|
+
ctx.callOnError(error, "rendering", { request, url, env });
|
|
436
|
+
},
|
|
437
|
+
});
|
|
438
|
+
const rscSerializeDur = performance.now() - rscSerializeStart;
|
|
439
|
+
// This measures synchronous stream creation, not end-to-end stream consumption.
|
|
440
|
+
appendMetric(
|
|
441
|
+
metricsStore,
|
|
442
|
+
"rsc-serialize",
|
|
443
|
+
rscSerializeStart,
|
|
444
|
+
rscSerializeDur,
|
|
445
|
+
);
|
|
446
|
+
|
|
447
|
+
if (isRscRequest(request, url, isPartial)) {
|
|
448
|
+
// render:total is recorded by the observePhase wrapper around this function.
|
|
449
|
+
const rscHeaders: Record<string, string> = {
|
|
450
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
451
|
+
vary: "accept, X-Rango-State, X-RSC-Router-Client-Path",
|
|
452
|
+
// Router identity, so the client can verify pre-decode (before importing
|
|
453
|
+
// chunks) that this content payload belongs to its app and refuse a
|
|
454
|
+
// foreign one (cache/proxy/bug). Control-only reload/redirect responses
|
|
455
|
+
// are deliberately NOT stamped. See browser/response-adapter.ts.
|
|
456
|
+
"X-RSC-Router-Id": ctx.router.id,
|
|
457
|
+
};
|
|
458
|
+
// Tell the client's prefetch cache to scope this response to its source
|
|
459
|
+
// URL (instead of the default source-agnostic wildcard). Intercept
|
|
460
|
+
// responses depend on the source page matching an intercept rule, so
|
|
461
|
+
// they must not be reused for navigations from other sources.
|
|
462
|
+
if (hasInterceptSlots) {
|
|
463
|
+
rscHeaders["x-rsc-prefetch-scope"] = "source";
|
|
464
|
+
}
|
|
465
|
+
// Enable browser HTTP caching for prefetch responses only.
|
|
466
|
+
// Requires X-Rango-Prefetch header (sent by Link prefetch fetch),
|
|
467
|
+
// non-intercept context (intercept responses depend on source page),
|
|
468
|
+
// and a configured cache-control value (false disables caching).
|
|
469
|
+
const isPrefetch = request.headers.has("X-Rango-Prefetch");
|
|
470
|
+
if (isPrefetch && isPartial && !hasInterceptSlots) {
|
|
471
|
+
const cc = ctx.router.prefetchCacheControl;
|
|
472
|
+
if (cc) {
|
|
473
|
+
rscHeaders["cache-control"] = cc;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
477
|
+
headers: rscHeaders,
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
// Delegate to SSR for HTML response (reuse early setup if available)
|
|
482
|
+
const [ssrModule, streamMode] = await getSSRSetup(
|
|
483
|
+
ctx,
|
|
484
|
+
request,
|
|
485
|
+
env,
|
|
486
|
+
url,
|
|
487
|
+
metricsStore,
|
|
488
|
+
);
|
|
489
|
+
|
|
490
|
+
// ssr-render-html metric + rango.ssr span from one boundary. render:total is
|
|
491
|
+
// recorded by the observePhase wrapper around this function.
|
|
492
|
+
const htmlStream = await observePhase(PHASES.ssr, () =>
|
|
493
|
+
ssrModule.renderHTML(rscStream, {
|
|
494
|
+
nonce,
|
|
495
|
+
streamMode,
|
|
496
|
+
}),
|
|
497
|
+
);
|
|
498
|
+
const response = createResponseWithMergedHeaders(htmlStream, {
|
|
499
|
+
headers: { "content-type": "text/html;charset=utf-8" },
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
// --- Axis 2: PPR shell CAPTURE on MISS (background task; see design doc) ---
|
|
503
|
+
// The ppr route missed its shell above. Schedule the background capture only
|
|
504
|
+
// when the served response is a 200 HTML document (a 404/error render is not a
|
|
505
|
+
// cacheable shell), and tag the response for observability either way. Capture
|
|
506
|
+
// does NOT flow through the HTTP pipeline: scheduleShellCapture re-derives the
|
|
507
|
+
// page via router.match() under a derived context (fresh handle store,
|
|
508
|
+
// _shellCaptureRun: true) — middleware never re-runs; it already ran for this
|
|
509
|
+
// request and guarding is serve-time.
|
|
510
|
+
if (pprMiss) {
|
|
511
|
+
if (
|
|
512
|
+
response.status === 200 &&
|
|
513
|
+
(response.headers.get("content-type") ?? "").includes("text/html")
|
|
514
|
+
) {
|
|
515
|
+
scheduleShellCapture(
|
|
516
|
+
ctx,
|
|
517
|
+
request,
|
|
518
|
+
env,
|
|
519
|
+
url,
|
|
520
|
+
reqCtx,
|
|
521
|
+
pprMiss.ssrModule,
|
|
522
|
+
pprMiss.descriptor,
|
|
523
|
+
);
|
|
524
|
+
}
|
|
525
|
+
response.headers.set(SHELL_STATUS_HEADER, "MISS");
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
return response;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* Neutralize the shell-HIT degradation redirect target.
|
|
533
|
+
*
|
|
534
|
+
* The inline `location.replace` emitted by serveShellHit when a shell HIT lands
|
|
535
|
+
* on a URL whose route became redirecting mid-TTL is a document-native redirect
|
|
536
|
+
* exit that BYPASSES the 3xx chokepoint (guardOutgoingRedirect acts only on 3xx
|
|
537
|
+
* + Location responses, never a committed 200 body). So it reuses the ONE
|
|
538
|
+
* same-origin resolver directly: a cross-origin/unparseable/unsafe target
|
|
539
|
+
* neutralizes to the same safe same-origin landing as redirect-guard.ts
|
|
540
|
+
* (basename root, or "/" when unset) rather than navigating the user off-host.
|
|
541
|
+
* A safe same-origin/relative target passes through as its normalized href.
|
|
542
|
+
*/
|
|
543
|
+
export function resolveShellHitRedirectTarget(
|
|
544
|
+
rawTarget: string,
|
|
545
|
+
requestOrigin: string,
|
|
546
|
+
basename: string | undefined,
|
|
547
|
+
): string {
|
|
548
|
+
return (
|
|
549
|
+
resolveSameOriginRedirect(rawTarget, requestOrigin) ??
|
|
550
|
+
safeSameOriginLanding(basename)
|
|
551
|
+
);
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/**
|
|
555
|
+
* Serve a validated shell HIT: commit the composed response NOW — the stored
|
|
556
|
+
* prelude bytes are the first thing on the wire — and run the live tail
|
|
557
|
+
* (match(), fresh loaders, full Flight render for hydration, fizz resume of just
|
|
558
|
+
* the holes) BEHIND them inside the response stream. React relies on HTML-parser
|
|
559
|
+
* foster-parenting for content streamed after the prelude's closing
|
|
560
|
+
* `</body></html>`, so plain byte concatenation is the correct composition.
|
|
561
|
+
*
|
|
562
|
+
* Status and headers are committed at the flush: middleware already ran (their
|
|
563
|
+
* ctx.res headers merge in via createResponseWithMergedHeaders), and route
|
|
564
|
+
* middleware code after its next() can still adjust headers on the returned
|
|
565
|
+
* Response object. A failing hole cannot become a 500/redirect after this point —
|
|
566
|
+
* error UI renders inline via Suspense/error boundaries, the documented PPR
|
|
567
|
+
* constraint.
|
|
568
|
+
*
|
|
569
|
+
* The tail promise is kicked off SYNCHRONOUSLY so match/Flight/resume run inside
|
|
570
|
+
* the current ALS request-context frame (the stream may be pulled by the server
|
|
571
|
+
* adapter outside it).
|
|
572
|
+
*/
|
|
573
|
+
function serveShellHit(
|
|
574
|
+
ctx: HandlerContext<any>,
|
|
575
|
+
request: Request,
|
|
576
|
+
env: any,
|
|
577
|
+
url: URL,
|
|
578
|
+
reqCtx: RequestContext<any>,
|
|
579
|
+
handleStore: ReturnType<typeof getRequestContext>["_handleStore"],
|
|
580
|
+
ssrModule: SSRModule,
|
|
581
|
+
entry: ShellCacheEntry,
|
|
582
|
+
descriptor: ShellCaptureDescriptor,
|
|
583
|
+
): Response {
|
|
584
|
+
const preludeBytes = base64ToBytes(entry.prelude);
|
|
585
|
+
|
|
586
|
+
const renderTail = async (
|
|
587
|
+
activeCtx: RequestContext<any>,
|
|
588
|
+
): Promise<ReadableStream<Uint8Array> | { redirect: string }> => {
|
|
589
|
+
const matchStart = INTERNAL_RANGO_DEBUG ? performance.now() : 0;
|
|
590
|
+
const match = await ctx.router.match(request, { env });
|
|
591
|
+
if (INTERNAL_RANGO_DEBUG) {
|
|
592
|
+
console.log(
|
|
593
|
+
`[Server][ppr] shell HIT: tail match done +${Math.round(performance.now() - matchStart)}ms (abs ${Math.round(performance.now())}, started ${Math.round(matchStart)})`,
|
|
594
|
+
);
|
|
595
|
+
}
|
|
596
|
+
if (match.redirect) return { redirect: match.redirect };
|
|
597
|
+
setRequestContextParams(match.params, match.routeName);
|
|
598
|
+
const payload = buildFullPayload(match, ctx, url, activeCtx, handleStore);
|
|
599
|
+
// Theme fidelity for resume: initialTheme is per-request METADATA (the
|
|
600
|
+
// visitor's cookie), but React resume requires the tree above the holes to
|
|
601
|
+
// match the frozen prelude, which was rendered with the CAPTURE's
|
|
602
|
+
// initialTheme. Replay the captured value into the payload (the SSR resume
|
|
603
|
+
// tree AND client hydration both read it) so the trees agree by
|
|
604
|
+
// construction. The visitor still sees THEIR theme: the FOUC script in the
|
|
605
|
+
// prelude applies it pre-paint from the cookie, and ThemeProvider re-syncs
|
|
606
|
+
// its state from the cookie post-mount.
|
|
607
|
+
if (payload.metadata) {
|
|
608
|
+
payload.metadata.initialTheme = entry.initialTheme as
|
|
609
|
+
| import("../theme/types.js").Theme
|
|
610
|
+
| undefined;
|
|
611
|
+
}
|
|
612
|
+
// Full Flight render per request: hydration needs the whole payload (there
|
|
613
|
+
// is no Flight-side resume — a React limitation, not ours).
|
|
614
|
+
let rscStream = ctx.renderToReadableStream<RscPayload>(payload, {
|
|
615
|
+
onError: (error: unknown) => {
|
|
616
|
+
ctx.callOnError(error, "rendering", { request, url, env });
|
|
617
|
+
},
|
|
618
|
+
});
|
|
619
|
+
// Timing tap: when does the Flight render produce its FIRST byte? Compared
|
|
620
|
+
// with the eager-inject/first-tail logs this proves whether hydration-start
|
|
621
|
+
// latency is genuine server work (loaders) or stream plumbing holding
|
|
622
|
+
// ready bytes back.
|
|
623
|
+
if (INTERNAL_RANGO_DEBUG) {
|
|
624
|
+
const tapStart = performance.now();
|
|
625
|
+
let first = false;
|
|
626
|
+
rscStream = rscStream.pipeThrough(
|
|
627
|
+
new TransformStream({
|
|
628
|
+
transform(chunk, controller) {
|
|
629
|
+
if (!first) {
|
|
630
|
+
first = true;
|
|
631
|
+
console.log(
|
|
632
|
+
`[Server][ppr] flight render: first chunk +${Math.round(performance.now() - tapStart)}ms (abs ${Math.round(performance.now())})`,
|
|
633
|
+
);
|
|
634
|
+
}
|
|
635
|
+
controller.enqueue(chunk);
|
|
636
|
+
},
|
|
637
|
+
}),
|
|
638
|
+
);
|
|
639
|
+
}
|
|
640
|
+
return observePhase(PHASES.ssr, () =>
|
|
641
|
+
ssrModule.resumeShellHTML!(rscStream, {
|
|
642
|
+
postponed: entry.postponed,
|
|
643
|
+
nonce: undefined,
|
|
644
|
+
}),
|
|
645
|
+
);
|
|
646
|
+
};
|
|
647
|
+
|
|
648
|
+
const tailPromise: Promise<
|
|
649
|
+
ReadableStream<Uint8Array> | { redirect: string }
|
|
650
|
+
> = (async () => {
|
|
651
|
+
// Capture data snapshot seeding (docs/design/ppr-shell-resume.md): the tail
|
|
652
|
+
// is a FULL FRESH render whose payload must match the frozen prelude. If the
|
|
653
|
+
// capture recorded a snapshot, run the tail through a SeededShellStore
|
|
654
|
+
// overlay so every cache-store read the capture pinned returns its
|
|
655
|
+
// capture-time value AS FRESH — the shell region reproduces byte-identically
|
|
656
|
+
// even after the underlying cache entries drifted (expired/recomputed/
|
|
657
|
+
// tag-invalidated). Everything not pinned (the holes — masked loaders were
|
|
658
|
+
// never recorded) falls through to the real store and stays LIVE. The
|
|
659
|
+
// overlay lives on a DERIVED context (own _cacheStore), so the shared reqCtx
|
|
660
|
+
// is untouched; an entry without a snapshot keeps the pre-snapshot behavior.
|
|
661
|
+
if (entry.snapshot && entry.snapshot.length > 0) {
|
|
662
|
+
const seededCtx: RequestContext<any> = Object.create(reqCtx);
|
|
663
|
+
if (reqCtx._cacheStore) {
|
|
664
|
+
seededCtx._cacheStore = new SeededShellStore(
|
|
665
|
+
reqCtx._cacheStore,
|
|
666
|
+
entry.snapshot,
|
|
667
|
+
);
|
|
668
|
+
}
|
|
669
|
+
// Loader-family records (bake-lane containers, loader-container-bake):
|
|
670
|
+
// decode into a seed Map for the resolveLoaderData overlay, so the
|
|
671
|
+
// payload's baked container bytes match the frozen prelude while the
|
|
672
|
+
// hole-marker paths keep the fresh run's live nested promises.
|
|
673
|
+
const seedStart = INTERNAL_RANGO_DEBUG ? performance.now() : 0;
|
|
674
|
+
const loaderSeed = await buildShellLoaderSeed(entry.snapshot);
|
|
675
|
+
if (INTERNAL_RANGO_DEBUG) {
|
|
676
|
+
console.log(
|
|
677
|
+
`[Server][ppr] shell HIT: loader seed built +${Math.round(performance.now() - seedStart)}ms (abs ${Math.round(performance.now())})`,
|
|
678
|
+
);
|
|
679
|
+
}
|
|
680
|
+
if (loaderSeed) seededCtx._shellLoaderSeed = loaderSeed;
|
|
681
|
+
// Shell fast path (serve side): when the capture recorded the implicit
|
|
682
|
+
// doc segment record and the handler layer declared no liveness, arm the
|
|
683
|
+
// implicit scope on the seeded context — the tail match's cache lookup
|
|
684
|
+
// then HITs the SeededShellStore's doc entry and the whole handler layer
|
|
685
|
+
// is REPLAYED, not re-executed (loaders still run fresh via
|
|
686
|
+
// resolveFreshLoadersAndYield; per-request payload metadata is rebuilt
|
|
687
|
+
// by buildFullPayload as always). A route with handler-live holes, a
|
|
688
|
+
// route-derived cache scope, or a missing/corrupt record degrades to
|
|
689
|
+
// the full tail (handler re-run — today's behavior) automatically.
|
|
690
|
+
if (!entry.handlerLiveHoles) {
|
|
691
|
+
seededCtx._shellImplicitCache = {
|
|
692
|
+
ttl: descriptor.ttl,
|
|
693
|
+
swr: descriptor.swr,
|
|
694
|
+
};
|
|
695
|
+
if (INTERNAL_RANGO_DEBUG) {
|
|
696
|
+
console.log(
|
|
697
|
+
`[Server][ppr] shell HIT: fast path armed (implicit doc cache) (abs ${Math.round(performance.now())})`,
|
|
698
|
+
);
|
|
699
|
+
}
|
|
700
|
+
} else if (INTERNAL_RANGO_DEBUG) {
|
|
701
|
+
console.log(
|
|
702
|
+
`[Server][ppr] shell HIT: fast path declined — handler-live holes; tail re-runs handlers (abs ${Math.round(performance.now())})`,
|
|
703
|
+
);
|
|
704
|
+
}
|
|
705
|
+
// Fragment splice (issue #700): cache/prerender-store hits inside THIS
|
|
706
|
+
// tail render emit their stored segment fragments verbatim into the
|
|
707
|
+
// payload; the SSR resume pass and browser hydration expand them
|
|
708
|
+
// (segment-fragments.ts). Tail-only: the flag lives on the derived
|
|
709
|
+
// context so it can never leak into a capture render (which serializes
|
|
710
|
+
// segments and must see real elements).
|
|
711
|
+
seededCtx._shellFragmentPayload = true;
|
|
712
|
+
return runWithRequestContext(seededCtx, () => renderTail(seededCtx));
|
|
713
|
+
}
|
|
714
|
+
// No snapshot (e.g. a producer B entry whose capture hit only the
|
|
715
|
+
// prerender store): still a shell-HIT tail, so arm the fragment splice on
|
|
716
|
+
// a derived context — the tail's prerender-store/cache hits (if any) then
|
|
717
|
+
// splice; a route with neither serves exactly as before. Derived, never
|
|
718
|
+
// the shared reqCtx: scheduleShellCapture derives the capture context from
|
|
719
|
+
// reqCtx and the flag must not be inherited there.
|
|
720
|
+
const fragmentCtx: RequestContext<any> = Object.create(reqCtx);
|
|
721
|
+
fragmentCtx._shellFragmentPayload = true;
|
|
722
|
+
return runWithRequestContext(fragmentCtx, () => renderTail(fragmentCtx));
|
|
723
|
+
})();
|
|
724
|
+
// The stream below is the only consumer; pre-attach a no-op catch so a tail
|
|
725
|
+
// failure before the stream is pulled never surfaces as an unhandled rejection.
|
|
726
|
+
tailPromise.catch(() => {});
|
|
727
|
+
|
|
728
|
+
const serveStart = INTERNAL_RANGO_DEBUG ? performance.now() : 0;
|
|
729
|
+
const body = new ReadableStream<Uint8Array>({
|
|
730
|
+
async start(controller) {
|
|
731
|
+
controller.enqueue(preludeBytes);
|
|
732
|
+
if (INTERNAL_RANGO_DEBUG) {
|
|
733
|
+
console.log(
|
|
734
|
+
`[Server][ppr] shell HIT: prelude enqueued (${preludeBytes.length}b) +${Math.round(performance.now() - serveStart)}ms`,
|
|
735
|
+
);
|
|
736
|
+
}
|
|
737
|
+
try {
|
|
738
|
+
const tail = await tailPromise;
|
|
739
|
+
if (INTERNAL_RANGO_DEBUG) {
|
|
740
|
+
console.log(
|
|
741
|
+
`[Server][ppr] shell HIT: tail stream handed over +${Math.round(performance.now() - serveStart)}ms (abs ${Math.round(performance.now())})`,
|
|
742
|
+
);
|
|
743
|
+
}
|
|
744
|
+
if (tail instanceof ReadableStream) {
|
|
745
|
+
const reader = tail.getReader();
|
|
746
|
+
let firstTailChunk = true;
|
|
747
|
+
let tailBytes = 0;
|
|
748
|
+
try {
|
|
749
|
+
for (;;) {
|
|
750
|
+
const { done, value } = await reader.read();
|
|
751
|
+
if (done) break;
|
|
752
|
+
if (INTERNAL_RANGO_DEBUG && firstTailChunk) {
|
|
753
|
+
firstTailChunk = false;
|
|
754
|
+
console.log(
|
|
755
|
+
`[Server][ppr] shell HIT: first tail chunk on the wire +${Math.round(performance.now() - serveStart)}ms (abs ${Math.round(performance.now())})`,
|
|
756
|
+
);
|
|
757
|
+
}
|
|
758
|
+
if (INTERNAL_RANGO_DEBUG) tailBytes += value.length;
|
|
759
|
+
controller.enqueue(value);
|
|
760
|
+
}
|
|
761
|
+
} finally {
|
|
762
|
+
reader.releaseLock();
|
|
763
|
+
}
|
|
764
|
+
// Bounds the post-header work Server-Timing structurally cannot see:
|
|
765
|
+
// the HIT commits headers at the flush, so ALL live-tail time (match,
|
|
766
|
+
// loaders, Flight, resume) happens inside the response body. This
|
|
767
|
+
// line plus the [Server][segments] build logs narrate that window.
|
|
768
|
+
if (INTERNAL_RANGO_DEBUG) {
|
|
769
|
+
console.log(
|
|
770
|
+
`[Server][ppr] shell HIT: tail complete +${Math.round(performance.now() - serveStart)}ms (${tailBytes}b)`,
|
|
771
|
+
);
|
|
772
|
+
}
|
|
773
|
+
} else {
|
|
774
|
+
// Defensive, near-unreachable: a redirecting match cannot have captured
|
|
775
|
+
// a shell (capture bails on redirects), so a HIT on a redirecting URL
|
|
776
|
+
// requires the route to have BECOME redirecting within the shell TTL.
|
|
777
|
+
// The 200 + prelude are already committed; degrade to a client-side
|
|
778
|
+
// replace so the user still lands on the target. The target is
|
|
779
|
+
// neutralized first (see resolveShellHitRedirectTarget).
|
|
780
|
+
const safeTarget = resolveShellHitRedirectTarget(
|
|
781
|
+
tail.redirect,
|
|
782
|
+
url.origin,
|
|
783
|
+
ctx.router.basename,
|
|
784
|
+
);
|
|
785
|
+
controller.enqueue(
|
|
786
|
+
new TextEncoder().encode(
|
|
787
|
+
`<script>location.replace(${JSON.stringify(safeTarget)})</script>`,
|
|
788
|
+
),
|
|
789
|
+
);
|
|
790
|
+
}
|
|
791
|
+
controller.close();
|
|
792
|
+
} catch (error) {
|
|
793
|
+
// Self-heal on a failed tail: the pre-commit gates (isValidShellHit +
|
|
794
|
+
// hasIntactShellPayload) cannot catch a parseable-but-mismatched
|
|
795
|
+
// postponed blob or a hard render error above the holes — those throw
|
|
796
|
+
// here, AFTER the 200 + prelude flushed, and would otherwise re-fail on
|
|
797
|
+
// every request until the entry ages out (nothing else evicts it).
|
|
798
|
+
// Recapturing overwrites the entry with one the current server
|
|
799
|
+
// produced. A client disconnect mid-stream also lands here and
|
|
800
|
+
// schedules a spurious-but-idempotent recapture — bounded by the
|
|
801
|
+
// stampede guard + backoff inside scheduleShellCapture.
|
|
802
|
+
scheduleShellCapture(
|
|
803
|
+
ctx,
|
|
804
|
+
request,
|
|
805
|
+
env,
|
|
806
|
+
url,
|
|
807
|
+
reqCtx,
|
|
808
|
+
ssrModule,
|
|
809
|
+
descriptor,
|
|
810
|
+
);
|
|
811
|
+
controller.error(error);
|
|
812
|
+
}
|
|
813
|
+
},
|
|
814
|
+
});
|
|
815
|
+
|
|
816
|
+
return createResponseWithMergedHeaders(body, {
|
|
817
|
+
headers: {
|
|
818
|
+
"content-type": "text/html;charset=utf-8",
|
|
819
|
+
[SHELL_STATUS_HEADER]: "HIT",
|
|
820
|
+
},
|
|
821
|
+
});
|
|
822
|
+
}
|