@rangojs/router 0.0.0-experimental.141 → 0.0.0-experimental.143
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 +6 -10
- package/README.md +17 -0
- 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.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +84 -15
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +21 -18
- package/skills/api-client/SKILL.md +1 -1
- package/skills/breadcrumbs/SKILL.md +1 -1
- package/skills/cache-guide/SKILL.md +1 -1
- package/skills/caching/SKILL.md +35 -1
- package/skills/catalog.json +265 -0
- package/skills/comparison/references/framework-comparison.md +1 -1
- package/skills/composability/SKILL.md +33 -1
- package/skills/debug-manifest/SKILL.md +1 -1
- package/skills/document-cache/SKILL.md +9 -1
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +1 -1
- package/skills/hooks/SKILL.md +54 -892
- 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 +1 -1
- package/skills/i18n/SKILL.md +1 -1
- package/skills/intercept/SKILL.md +8 -1
- package/skills/layout/SKILL.md +1 -1
- package/skills/links/SKILL.md +1 -1
- package/skills/loader/SKILL.md +8 -1
- package/skills/middleware/SKILL.md +1 -1
- package/skills/migrate-nextjs/SKILL.md +133 -1
- package/skills/migrate-react-router/SKILL.md +42 -816
- 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 +1 -1
- package/skills/observability/SKILL.md +9 -1
- package/skills/parallel/SKILL.md +10 -1
- package/skills/ppr/SKILL.md +331 -32
- package/skills/prerender/SKILL.md +8 -1
- package/skills/rango/SKILL.md +12 -12
- package/skills/response-routes/SKILL.md +1 -1
- package/skills/route/SKILL.md +9 -1
- package/skills/router-setup/SKILL.md +1 -1
- package/skills/scripts/SKILL.md +1 -1
- package/skills/server-actions/SKILL.md +3 -2
- package/skills/shell-manifest/SKILL.md +1 -1
- package/skills/streams-and-websockets/SKILL.md +1 -1
- package/skills/tailwind/SKILL.md +1 -1
- package/skills/testing/SKILL.md +1 -1
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +45 -919
- 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 +7 -1
- package/skills/vercel/SKILL.md +1 -1
- package/skills/view-transitions/SKILL.md +1 -1
- package/src/browser/event-controller.ts +41 -10
- package/src/browser/logging.ts +10 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-client.ts +5 -1
- package/src/browser/navigation-store.ts +46 -6
- package/src/browser/partial-update.ts +27 -15
- package/src/browser/prefetch/cache.ts +26 -4
- package/src/browser/prefetch/fetch.ts +27 -17
- package/src/browser/react/Link.tsx +13 -3
- package/src/browser/react/NavigationProvider.tsx +21 -19
- package/src/browser/scroll-restoration.ts +7 -5
- package/src/browser/segment-reconciler.ts +31 -21
- package/src/browser/types.ts +12 -0
- package/src/cache/cache-runtime.ts +203 -23
- package/src/cache/document-cache.ts +20 -9
- package/src/cache/memory-segment-store.ts +53 -2
- package/src/cache/segment-codec.ts +4 -4
- package/src/cache/shell-snapshot.ts +50 -1
- package/src/cache/types.ts +25 -5
- package/src/cache/vercel/vercel-cache-store.ts +131 -107
- package/src/cloudflare/tracing.ts +7 -8
- package/src/index.rsc.ts +1 -0
- package/src/index.ts +12 -8
- package/src/route-definition/helpers-types.ts +5 -4
- package/src/route-map-builder.ts +24 -1
- package/src/router/find-match.ts +15 -1
- package/src/router/instrument.ts +9 -4
- package/src/router/manifest.ts +13 -5
- package/src/router/match-api.ts +70 -30
- package/src/router/match-handlers.ts +176 -135
- package/src/router/match-result.ts +35 -15
- package/src/router/middleware.ts +46 -32
- package/src/router/request-classification.ts +20 -7
- package/src/router/route-snapshot.ts +10 -0
- package/src/router/router-interfaces.ts +9 -0
- package/src/router/segment-resolution/fresh.ts +25 -4
- package/src/router/segment-resolution/loader-cache.ts +57 -8
- package/src/router/segment-resolution/loader-mask.ts +26 -3
- package/src/router/segment-resolution/loader-snapshot.ts +251 -0
- package/src/router/telemetry-otel.ts +6 -8
- package/src/router/tracing.ts +14 -5
- package/src/router.ts +15 -6
- package/src/rsc/handler.ts +46 -30
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/rsc-rendering.ts +39 -8
- package/src/rsc/shell-capture.ts +201 -13
- package/src/rsc/shell-serve.ts +26 -0
- package/src/server/cookie-store.ts +6 -0
- package/src/server/request-context.ts +33 -0
- package/src/ssr/index.tsx +7 -0
- package/src/testing/dispatch.ts +142 -37
- package/src/urls/path-helper-types.ts +9 -4
- package/src/vercel/tracing.ts +7 -7
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/router-discovery.ts +78 -15
|
@@ -41,7 +41,7 @@ import { runThenSettle } from "./tracing.js";
|
|
|
41
41
|
import type {
|
|
42
42
|
RouterTracingConfig,
|
|
43
43
|
SpanRunner,
|
|
44
|
-
|
|
44
|
+
TracingToggleOptions,
|
|
45
45
|
} from "./tracing.js";
|
|
46
46
|
|
|
47
47
|
// ---------------------------------------------------------------------------
|
|
@@ -92,13 +92,11 @@ const STATUS_ERROR = 2;
|
|
|
92
92
|
// Tracing adapter: phase spans via startActiveSpan (the `tracing` slot)
|
|
93
93
|
// ---------------------------------------------------------------------------
|
|
94
94
|
|
|
95
|
-
/**
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
spans?: TracePhaseToggles;
|
|
101
|
-
}
|
|
95
|
+
/**
|
|
96
|
+
* Options for createOTelTracing. Alias of the shared {@link TracingToggleOptions}
|
|
97
|
+
* (`enabled` master switch + per-phase `spans` toggles); the name is public API.
|
|
98
|
+
*/
|
|
99
|
+
export type OTelTracingOptions = TracingToggleOptions;
|
|
102
100
|
|
|
103
101
|
/**
|
|
104
102
|
* Create the tracing config that maps the router's phases onto OTel spans via
|
package/src/router/tracing.ts
CHANGED
|
@@ -81,17 +81,26 @@ export interface TracePhaseToggles {
|
|
|
81
81
|
ssr?: boolean;
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
+
/**
|
|
85
|
+
* The option pair shared by every tracing factory (enabled master switch +
|
|
86
|
+
* per-phase span toggles). Extended by OTelTracingOptions,
|
|
87
|
+
* CloudflareTracingOptions, VercelTracingOptions, and RouterTracingConfig so
|
|
88
|
+
* a phase added to TracePhaseToggles propagates everywhere from one place.
|
|
89
|
+
*/
|
|
90
|
+
export interface TracingToggleOptions {
|
|
91
|
+
/** Master switch. Defaults to true. */
|
|
92
|
+
enabled?: boolean;
|
|
93
|
+
/** Per-phase span toggles. Omitted phases default to enabled. */
|
|
94
|
+
spans?: TracePhaseToggles;
|
|
95
|
+
}
|
|
96
|
+
|
|
84
97
|
/**
|
|
85
98
|
* Value passed to `createRouter({ tracing })`. Produced by a platform factory
|
|
86
99
|
* such as `createCloudflareTracing()`.
|
|
87
100
|
*/
|
|
88
|
-
export interface RouterTracingConfig {
|
|
101
|
+
export interface RouterTracingConfig extends TracingToggleOptions {
|
|
89
102
|
/** Platform span runner. */
|
|
90
103
|
runner: SpanRunner;
|
|
91
|
-
/** Master switch. Defaults to true when a config object is provided. */
|
|
92
|
-
enabled?: boolean;
|
|
93
|
-
/** Per-phase span toggles. */
|
|
94
|
-
spans?: TracePhaseToggles;
|
|
95
104
|
}
|
|
96
105
|
|
|
97
106
|
/**
|
package/src/router.ts
CHANGED
|
@@ -420,13 +420,13 @@ export function createRouter<TEnv = any>(
|
|
|
420
420
|
|
|
421
421
|
// Wrapper to pass debugPerformance to external createMetricsStore.
|
|
422
422
|
// Also checks per-request flag set by ctx.debugPerformance() in middleware.
|
|
423
|
+
// With no active request context there is nowhere to hang the store, so return
|
|
424
|
+
// undefined: an orphan store would collect metrics no reader can reach (nothing
|
|
425
|
+
// holds it, and appendMetric(undefined, ...) is already a no-op).
|
|
423
426
|
const getMetricsStore = () => {
|
|
424
427
|
const reqCtx = _getRequestContext();
|
|
425
428
|
const enabled = debugPerformance || !!reqCtx?._debugPerformance;
|
|
426
|
-
if (!enabled) return undefined;
|
|
427
|
-
if (!reqCtx) {
|
|
428
|
-
return createMetricsStore(true);
|
|
429
|
-
}
|
|
429
|
+
if (!enabled || !reqCtx) return undefined;
|
|
430
430
|
reqCtx._metricsStore ??= createMetricsStore(true);
|
|
431
431
|
return reqCtx._metricsStore;
|
|
432
432
|
};
|
|
@@ -501,8 +501,12 @@ export function createRouter<TEnv = any>(
|
|
|
501
501
|
? getRequestId(errorContext.request)
|
|
502
502
|
: undefined
|
|
503
503
|
: undefined;
|
|
504
|
+
// Derived once here for both the loader.start and loader.end emits (the
|
|
505
|
+
// loader.error emit uses ctx.loaderName from wrapLoaderWithErrorHandling).
|
|
506
|
+
const loaderName = telemetrySink
|
|
507
|
+
? segmentId.split(".").pop() || "unknown"
|
|
508
|
+
: "";
|
|
504
509
|
if (telemetrySink) {
|
|
505
|
-
const loaderName = segmentId.split(".").pop() || "unknown";
|
|
506
510
|
safeEmit(telemetry, {
|
|
507
511
|
type: "loader.start",
|
|
508
512
|
timestamp: loaderStart,
|
|
@@ -556,7 +560,6 @@ export function createRouter<TEnv = any>(
|
|
|
556
560
|
|
|
557
561
|
// Emit loader.end after the promise settles (fire-and-forget)
|
|
558
562
|
if (telemetrySink) {
|
|
559
|
-
const loaderName = segmentId.split(".").pop() || "unknown";
|
|
560
563
|
result.then((r) => {
|
|
561
564
|
safeEmit(telemetry, {
|
|
562
565
|
type: "loader.end",
|
|
@@ -1008,6 +1011,12 @@ export function createRouter<TEnv = any>(
|
|
|
1008
1011
|
// Expose resolved span tracing for the handler (Cloudflare custom spans)
|
|
1009
1012
|
tracing: resolvedTracing,
|
|
1010
1013
|
|
|
1014
|
+
// Expose the raw telemetry sink so handler-level emitters (timeout, origin
|
|
1015
|
+
// rejection, late-handle handler.error) can emit outside the match ALS.
|
|
1016
|
+
// Raw (not the resolveSink no-op wrapper) so router.telemetry stays
|
|
1017
|
+
// undefined when unconfigured and call sites gate on truthiness.
|
|
1018
|
+
telemetry: telemetrySink,
|
|
1019
|
+
|
|
1011
1020
|
// Expose debug manifest flag for handler
|
|
1012
1021
|
allowDebugManifest: allowDebugManifestOption,
|
|
1013
1022
|
|
package/src/rsc/handler.ts
CHANGED
|
@@ -85,7 +85,8 @@ import {
|
|
|
85
85
|
appendMetric,
|
|
86
86
|
buildMetricsTiming,
|
|
87
87
|
} from "../router/metrics.js";
|
|
88
|
-
import { observePhase,
|
|
88
|
+
import { observePhase, PHASES } from "../router/instrument.js";
|
|
89
|
+
import { safeEmit, resolveSink, getRequestId } from "../router/telemetry.js";
|
|
89
90
|
import {
|
|
90
91
|
startSSRSetup,
|
|
91
92
|
getSSRSetup,
|
|
@@ -246,16 +247,19 @@ export function createRSCHandler<
|
|
|
246
247
|
metadata: { timeout: true, phase, durationMs },
|
|
247
248
|
});
|
|
248
249
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
250
|
+
if (router.telemetry) {
|
|
251
|
+
safeEmit(resolveSink(router.telemetry), {
|
|
252
|
+
type: "request.timeout",
|
|
253
|
+
timestamp: performance.now(),
|
|
254
|
+
requestId: getRequestId(request),
|
|
255
|
+
phase,
|
|
256
|
+
pathname: url.pathname,
|
|
257
|
+
routeKey,
|
|
258
|
+
actionId,
|
|
259
|
+
durationMs,
|
|
260
|
+
customHandler: !!router.onTimeout,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
259
263
|
|
|
260
264
|
if (router.onTimeout) {
|
|
261
265
|
try {
|
|
@@ -590,7 +594,13 @@ export function createRSCHandler<
|
|
|
590
594
|
|
|
591
595
|
const fullTiming = timingParts.join(", ");
|
|
592
596
|
if (fullTiming && !isWebSocketUpgradeResponse(response)) {
|
|
593
|
-
|
|
597
|
+
try {
|
|
598
|
+
response.headers.set("Server-Timing", fullTiming);
|
|
599
|
+
} catch {
|
|
600
|
+
// Immutable headers (e.g. a passed-through platform Response) — drop
|
|
601
|
+
// the timing header, never the response. Instrumentation must not
|
|
602
|
+
// 500 a request.
|
|
603
|
+
}
|
|
594
604
|
}
|
|
595
605
|
|
|
596
606
|
// Single open-redirect chokepoint: every response (PE, full-page,
|
|
@@ -737,15 +747,18 @@ export function createRSCHandler<
|
|
|
737
747
|
},
|
|
738
748
|
});
|
|
739
749
|
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
750
|
+
if (router.telemetry) {
|
|
751
|
+
safeEmit(resolveSink(router.telemetry), {
|
|
752
|
+
type: "request.origin-rejected",
|
|
753
|
+
timestamp: performance.now(),
|
|
754
|
+
requestId: getRequestId(request),
|
|
755
|
+
method: request.method,
|
|
756
|
+
pathname: url.pathname,
|
|
757
|
+
phase: originPhase,
|
|
758
|
+
origin: request.headers.get("origin"),
|
|
759
|
+
host: request.headers.get("host"),
|
|
760
|
+
});
|
|
761
|
+
}
|
|
749
762
|
|
|
750
763
|
return originResult;
|
|
751
764
|
}
|
|
@@ -787,15 +800,18 @@ export function createRSCHandler<
|
|
|
787
800
|
params: reqCtx.params as Record<string, string>,
|
|
788
801
|
handledByBoundary: true,
|
|
789
802
|
});
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
803
|
+
if (router.telemetry) {
|
|
804
|
+
safeEmit(resolveSink(router.telemetry), {
|
|
805
|
+
type: "handler.error",
|
|
806
|
+
timestamp: performance.now(),
|
|
807
|
+
requestId: getRequestId(request),
|
|
808
|
+
error,
|
|
809
|
+
handledByBoundary: true,
|
|
810
|
+
pathname: url.pathname,
|
|
811
|
+
routeKey: reqCtx._routeName,
|
|
812
|
+
params: reqCtx.params as Record<string, string>,
|
|
813
|
+
});
|
|
814
|
+
}
|
|
799
815
|
};
|
|
800
816
|
|
|
801
817
|
// Set route params early so all execution paths can access ctx.params.
|
package/src/rsc/nonce.ts
CHANGED
|
@@ -8,11 +8,20 @@ import { createVar } from "../context-var.js";
|
|
|
8
8
|
/**
|
|
9
9
|
* Typed ContextVar token for CSP nonce.
|
|
10
10
|
*
|
|
11
|
-
* Use this to
|
|
11
|
+
* Use this to READ the nonce in middleware or handlers:
|
|
12
12
|
* ```ts
|
|
13
13
|
* import { nonce } from "@rangojs/router";
|
|
14
14
|
* const value = ctx.get(nonce); // string | undefined
|
|
15
15
|
* ```
|
|
16
|
+
*
|
|
17
|
+
* Supply the nonce via the `createRouter({ nonce })` provider, not by writing
|
|
18
|
+
* this token yourself. The provider value is threaded into the router's SSR
|
|
19
|
+
* machinery (NonceContext/useNonce, Scripts/MetaTags attributes, the inlined
|
|
20
|
+
* Flight payload scripts) AND sets this token. A direct `ctx.set(nonce, value)`
|
|
21
|
+
* in middleware runs AFTER the SSR nonce is resolved: the value is readable via
|
|
22
|
+
* `ctx.get(nonce)` and gates PPR shell capture (a per-request nonce must never
|
|
23
|
+
* bake into a shared shell), but the router will not apply it to its own
|
|
24
|
+
* scripts — useNonce() stays undefined for that request.
|
|
16
25
|
*/
|
|
17
26
|
export const nonce: ContextVar<string> = createVar<string>();
|
|
18
27
|
|
package/src/rsc/rsc-rendering.ts
CHANGED
|
@@ -11,7 +11,10 @@ import {
|
|
|
11
11
|
setRequestContextParams,
|
|
12
12
|
runWithRequestContext,
|
|
13
13
|
} from "../server/request-context.js";
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
SeededShellStore,
|
|
16
|
+
buildShellLoaderSeed,
|
|
17
|
+
} from "../cache/shell-snapshot.js";
|
|
15
18
|
import { appendMetric } from "../router/metrics.js";
|
|
16
19
|
import { observePhase, PHASES } from "../router/instrument.js";
|
|
17
20
|
import { getSSRSetup, isRscRequest } from "./ssr-setup.js";
|
|
@@ -38,7 +41,10 @@ import {
|
|
|
38
41
|
base64ToBytes,
|
|
39
42
|
hasShellFamily,
|
|
40
43
|
warnShellStoreMissingOnce,
|
|
44
|
+
warnPprNonceActiveOnce,
|
|
41
45
|
} from "./shell-serve.js";
|
|
46
|
+
import { contextGet } from "../context-var.js";
|
|
47
|
+
import { nonce as nonceToken } from "./nonce.js";
|
|
42
48
|
import { reportCacheError } from "../cache/cache-error.js";
|
|
43
49
|
import { INTERNAL_RANGO_DEBUG } from "../internal-debug.js";
|
|
44
50
|
import type { ShellCacheEntry } from "../cache/types.js";
|
|
@@ -107,16 +113,33 @@ async function handleRscRenderingInner<TEnv>(
|
|
|
107
113
|
} | null = null;
|
|
108
114
|
if (
|
|
109
115
|
!isPartial &&
|
|
110
|
-
nonce === undefined &&
|
|
111
116
|
request.method === "GET" &&
|
|
112
117
|
!url.searchParams.has("__prerender_collect") &&
|
|
113
118
|
!isRscRequest(request, url, false)
|
|
114
119
|
) {
|
|
115
120
|
const pprConfig = resolvePprConfig(reqCtx._classifiedRoute?.manifestEntry);
|
|
116
121
|
if (pprConfig) {
|
|
122
|
+
// A per-request CSP nonce pins the route to axis 1: useNonce() (and any app
|
|
123
|
+
// code reading the nonce) renders it into every nonced script/style/meta, so
|
|
124
|
+
// a shell shared per host+URL would freeze one request's nonce for every
|
|
125
|
+
// visitor and the browser's CSP would reject the frozen nonce for all but the
|
|
126
|
+
// capture request. The nonce arrives two ways and BOTH must gate: the
|
|
127
|
+
// createRouter({ nonce }) provider (threaded here as `nonce`), and a direct
|
|
128
|
+
// token write in middleware (ctx.set(nonce, value)). The token is only
|
|
129
|
+
// visible in the post-middleware request variables — and this commit point
|
|
130
|
+
// runs AFTER the whole middleware chain (see the block header), so it is
|
|
131
|
+
// present here. Reading it closes the gap the provider-only check left open
|
|
132
|
+
// (issue #656). The threaded-param check stays first: the provider path is
|
|
133
|
+
// resolved before any variable read and short-circuits cheaply.
|
|
134
|
+
const activeNonce = nonce ?? contextGet(reqCtx._variables, nonceToken);
|
|
117
135
|
const store = reqCtx._cacheStore;
|
|
118
136
|
const key = buildShellKey(url);
|
|
119
|
-
if (
|
|
137
|
+
if (activeNonce !== undefined) {
|
|
138
|
+
// Declared intent that cannot be honored deserves a diagnostic (unlike an
|
|
139
|
+
// undeclared route, which is silent): a ppr route gated off by an active
|
|
140
|
+
// per-request nonce warns once per key. Axis 1 after the warning.
|
|
141
|
+
warnPprNonceActiveOnce(key);
|
|
142
|
+
} else if (!hasShellFamily(store)) {
|
|
120
143
|
// Declared intent that cannot be honored deserves a diagnostic (unlike an
|
|
121
144
|
// undeclared route, which is silent). Axis 1 after the warning.
|
|
122
145
|
warnShellStoreMissingOnce(key);
|
|
@@ -469,12 +492,20 @@ function serveShellHit(
|
|
|
469
492
|
// never recorded) falls through to the real store and stays LIVE. The
|
|
470
493
|
// overlay lives on a DERIVED context (own _cacheStore), so the shared reqCtx
|
|
471
494
|
// is untouched; an entry without a snapshot keeps the pre-snapshot behavior.
|
|
472
|
-
if (entry.snapshot && entry.snapshot.length > 0
|
|
495
|
+
if (entry.snapshot && entry.snapshot.length > 0) {
|
|
473
496
|
const seededCtx: RequestContext<any> = Object.create(reqCtx);
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
497
|
+
if (reqCtx._cacheStore) {
|
|
498
|
+
seededCtx._cacheStore = new SeededShellStore(
|
|
499
|
+
reqCtx._cacheStore,
|
|
500
|
+
entry.snapshot,
|
|
501
|
+
);
|
|
502
|
+
}
|
|
503
|
+
// Loader-family records (bake-lane containers, loader-container-bake):
|
|
504
|
+
// decode into a seed Map for the resolveLoaderData overlay, so the
|
|
505
|
+
// payload's baked container bytes match the frozen prelude while the
|
|
506
|
+
// hole-marker paths keep the fresh run's live nested promises.
|
|
507
|
+
const loaderSeed = await buildShellLoaderSeed(entry.snapshot);
|
|
508
|
+
if (loaderSeed) seededCtx._shellLoaderSeed = loaderSeed;
|
|
478
509
|
return runWithRequestContext(seededCtx, () => renderTail(seededCtx));
|
|
479
510
|
}
|
|
480
511
|
return renderTail(reqCtx);
|
package/src/rsc/shell-capture.ts
CHANGED
|
@@ -33,6 +33,10 @@ import type {
|
|
|
33
33
|
SegmentCacheStore,
|
|
34
34
|
ShellSnapshotRecord,
|
|
35
35
|
} from "../cache/types.js";
|
|
36
|
+
import {
|
|
37
|
+
elideLoaderContainer,
|
|
38
|
+
isLoaderHoleMarker,
|
|
39
|
+
} from "../router/segment-resolution/loader-snapshot.js";
|
|
36
40
|
import {
|
|
37
41
|
RecordingShellStore,
|
|
38
42
|
getRecordingStore,
|
|
@@ -169,7 +173,8 @@ const inFlightCaptures = new Set<string>();
|
|
|
169
173
|
|
|
170
174
|
/**
|
|
171
175
|
* Refused-capture backoff bounds. The window is EXPONENTIAL in the consecutive
|
|
172
|
-
* failure count: `min(BASE * 2^(failures-1),
|
|
176
|
+
* failure count: `min(BASE * 2^(failures-1), ceiling)` — 1s, 2s, 4s, … up to the
|
|
177
|
+
* mode's ceiling (60s in production, {@link REFUSED_CAPTURE_DEV_MAX_MS} in dev).
|
|
173
178
|
*
|
|
174
179
|
* Why exponential and not a flat 60s: a flat long window conflates two very
|
|
175
180
|
* different failures. A STRUCTURALLY ineligible route (no loading(), a cookie
|
|
@@ -179,12 +184,44 @@ const inFlightCaptures = new Set<string>();
|
|
|
179
184
|
* request or two, not be frozen for 60s (that would re-break the very cold-start DX
|
|
180
185
|
* the retry fixes; it bit the cloudflare dev e2e). Escalating from 1s means the
|
|
181
186
|
* eligible route re-probes almost immediately (warm now → HIT and clear), while the
|
|
182
|
-
* doomed route ramps to the
|
|
187
|
+
* doomed route ramps to the ceiling within a handful of failures. Either way an
|
|
183
188
|
* app-wide mount never re-renders a doomed route on EVERY request.
|
|
184
189
|
*/
|
|
185
190
|
const REFUSED_CAPTURE_BASE_MS = 1_000;
|
|
186
191
|
const REFUSED_CAPTURE_MAX_MS = 60_000;
|
|
187
192
|
|
|
193
|
+
/**
|
|
194
|
+
* DEV-only backoff ceiling. In dev the 60s production cap is pure harm: the
|
|
195
|
+
* dominant no-shell cause is a COLD module graph (route modules, SSR/Flight
|
|
196
|
+
* transforms built lazily), and the very attempt that failed WARMS that graph, so
|
|
197
|
+
* the next attempt a beat later usually completes the shell. Capping the dev window
|
|
198
|
+
* low keeps a cold-but-eligible route re-probing every ~2s instead of freezing for
|
|
199
|
+
* up to 60s once the exponential climbs (1s→2s→4s→…→60s). A 60s freeze outlasts the
|
|
200
|
+
* e2e warm windows on cold CI runners: the capture races an unfinished shell,
|
|
201
|
+
* escalates the backoff past the poll window, and every subsequent request inside
|
|
202
|
+
* that window is skipped as backed-off — an eternal MISS for the test even though
|
|
203
|
+
* the modules are warm by then. Production keeps the full 60s cap: there the
|
|
204
|
+
* no-shell cause is far more likely to be a genuinely ineligible route (no
|
|
205
|
+
* loading()), which SHOULD be re-probed rarely. See #652 (item 3) and
|
|
206
|
+
* docs/design/ppr-shell-resume.md ("Refused-capture backoff").
|
|
207
|
+
*/
|
|
208
|
+
const REFUSED_CAPTURE_DEV_MAX_MS = 2_000;
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Dev signal, matching the rest of the RSC runtime (handler.ts, server-action.ts,
|
|
212
|
+
* progressive-enhancement.ts): treat anything but an explicit production build as
|
|
213
|
+
* dev. The build folds `process.env.NODE_ENV` to a literal, so this is a compile-
|
|
214
|
+
* time constant in the shipped worker — no runtime probe.
|
|
215
|
+
*/
|
|
216
|
+
function isDevMode(): boolean {
|
|
217
|
+
return process.env.NODE_ENV !== "production";
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** The active backoff ceiling for the current mode (dev capped low, prod at 60s). */
|
|
221
|
+
function refusedCaptureCeilingMs(): number {
|
|
222
|
+
return isDevMode() ? REFUSED_CAPTURE_DEV_MAX_MS : REFUSED_CAPTURE_MAX_MS;
|
|
223
|
+
}
|
|
224
|
+
|
|
188
225
|
/**
|
|
189
226
|
* Refused-capture backoff: key -> { consecutive failure count, epoch ms until which
|
|
190
227
|
* the key is not re-probed }. A key enters backoff only after runShellCapture's
|
|
@@ -203,12 +240,19 @@ function isCaptureBackedOff(key: string): boolean {
|
|
|
203
240
|
return Date.now() < entry.until;
|
|
204
241
|
}
|
|
205
242
|
|
|
206
|
-
/**
|
|
243
|
+
/**
|
|
244
|
+
* Record a refused/failed capture, escalating the backoff window exponentially up
|
|
245
|
+
* to the current mode's ceiling. The failure count keeps climbing across attempts
|
|
246
|
+
* (so a genuinely doomed route still ramps toward its cap), but the WINDOW is
|
|
247
|
+
* clamped: 60s in production, {@link REFUSED_CAPTURE_DEV_MAX_MS} in dev so a
|
|
248
|
+
* cold-but-eligible route re-probes fast instead of freezing out the e2e warm
|
|
249
|
+
* window on a cold CI runner (#652 item 3).
|
|
250
|
+
*/
|
|
207
251
|
function markCaptureBackoff(key: string): void {
|
|
208
252
|
const failures = (refusedCaptures.get(key)?.failures ?? 0) + 1;
|
|
209
253
|
const window = Math.min(
|
|
210
254
|
REFUSED_CAPTURE_BASE_MS * 2 ** (failures - 1),
|
|
211
|
-
|
|
255
|
+
refusedCaptureCeilingMs(),
|
|
212
256
|
);
|
|
213
257
|
refusedCaptures.set(key, { failures, until: Date.now() + window });
|
|
214
258
|
}
|
|
@@ -243,21 +287,46 @@ function warnNullCaptureOnce(key: string): void {
|
|
|
243
287
|
warnedNullCaptures.add(key);
|
|
244
288
|
console.warn(
|
|
245
289
|
`[rango] Shell capture for "${key}" produced no usable shell after an in-place ` +
|
|
246
|
-
"retry; nothing was stored, so this request stays on MISS.
|
|
247
|
-
"
|
|
290
|
+
"retry; nothing was stored, so this request stays on MISS. Causes, told apart " +
|
|
291
|
+
"by whether the route ever flips to HIT:\n" +
|
|
248
292
|
" 1. Cold-start warmup (dev module transform, or a cold worker): the capture raced " +
|
|
249
293
|
"an unfinished shell render. This SELF-HEALS — the route flips to HIT once a later " +
|
|
250
294
|
"request warms the modules. Usually nothing to do.\n" +
|
|
251
|
-
" 2.
|
|
252
|
-
"
|
|
253
|
-
"
|
|
254
|
-
"
|
|
295
|
+
" 2. Something suspends above <body> with no Suspense boundary and never settles " +
|
|
296
|
+
"within the capture window: a slower-than-the-capture-guard bake-lane loader " +
|
|
297
|
+
"(loaders on entries WITHOUT loading() execute at capture and their containers " +
|
|
298
|
+
"bake — the boundary-less await must settle for a shell to exist), or a pending " +
|
|
299
|
+
"promise consumed without a <Suspense> above it. The boundary belongs on the " +
|
|
300
|
+
"entry/component that OWNS the data: loading() on the entry that registers the " +
|
|
301
|
+
"loader (a child route's loading() does not unpin a parent layout's loaders), or " +
|
|
302
|
+
"a <Suspense> above the consuming component.\n" +
|
|
255
303
|
'See the /ppr skill (node_modules/@rangojs/router/skills/ppr/SKILL.md), "The hole ' +
|
|
256
|
-
'
|
|
304
|
+
'doctrine" and "The layout-with-loaders playbook", or the design docs: ' +
|
|
257
305
|
"https://github.com/ivogt/vite-rsc/blob/main/packages/rangojs-router/docs/design/ppr-shell-resume.md",
|
|
258
306
|
);
|
|
259
307
|
}
|
|
260
308
|
|
|
309
|
+
/** Keys already warned about a deterministic capture refusal (once per key). */
|
|
310
|
+
const warnedRefusedCaptures = new Set<string>();
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Warn once per key that the capture was REFUSED for a deterministic reason
|
|
314
|
+
* (identity-guard trip or a rejected bake-lane loader). Distinct from
|
|
315
|
+
* warnNullCaptureOnce: these are not cold-start shapes, the retry is skipped,
|
|
316
|
+
* and the message carries the concrete cause instead of a differential.
|
|
317
|
+
*/
|
|
318
|
+
function warnCaptureRefusedOnce(key: string, reason: string): void {
|
|
319
|
+
if (warnedRefusedCaptures.has(key)) return;
|
|
320
|
+
warnedRefusedCaptures.add(key);
|
|
321
|
+
console.warn(
|
|
322
|
+
`[rango] Shell capture for "${key}" was refused: ${reason}\n` +
|
|
323
|
+
"The route stays on MISS (axis 1) — the page keeps working, only the shell " +
|
|
324
|
+
"cache is off. See the /ppr skill " +
|
|
325
|
+
"(node_modules/@rangojs/router/skills/ppr/SKILL.md) and " +
|
|
326
|
+
"docs/design/loader-container-bake.md.",
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
|
|
261
330
|
export interface FlightCaptureGate {
|
|
262
331
|
/** Identity passthrough of the source stream; feed this to captureShellHTML. */
|
|
263
332
|
stream: ReadableStream<Uint8Array>;
|
|
@@ -504,7 +573,7 @@ export function scheduleShellCapture(
|
|
|
504
573
|
* - `no-shell`: the prelude came back trivial (no <body>) OR captureShellHTML
|
|
505
574
|
* rejected with our own abort. This is the only RETRYABLE outcome.
|
|
506
575
|
*/
|
|
507
|
-
type CaptureAttemptOutcome = "stored" | "redirect" | "no-shell";
|
|
576
|
+
type CaptureAttemptOutcome = "stored" | "redirect" | "no-shell" | "refused";
|
|
508
577
|
|
|
509
578
|
/**
|
|
510
579
|
* Run the shell capture with a single in-place retry, then store the result.
|
|
@@ -547,6 +616,10 @@ async function runShellCapture(
|
|
|
547
616
|
ssrModule,
|
|
548
617
|
descriptor,
|
|
549
618
|
);
|
|
619
|
+
// "refused" is deterministic (identity guard / rejected bake-lane loader —
|
|
620
|
+
// its own warning already fired): no retry, and the caller backs the key off
|
|
621
|
+
// exactly like a structural no-shell.
|
|
622
|
+
if (first === "refused") return "no-shell";
|
|
550
623
|
// "stored" (success) or "redirect" (no shell exists): nothing to retry.
|
|
551
624
|
if (first !== "no-shell") return first;
|
|
552
625
|
|
|
@@ -568,6 +641,7 @@ async function runShellCapture(
|
|
|
568
641
|
ssrModule,
|
|
569
642
|
descriptor,
|
|
570
643
|
);
|
|
644
|
+
if (second === "refused") return "no-shell";
|
|
571
645
|
if (second !== "no-shell") return second;
|
|
572
646
|
|
|
573
647
|
// Both attempts came back with no usable shell. Cold-start would have healed by
|
|
@@ -641,6 +715,16 @@ async function attemptCapture(
|
|
|
641
715
|
derivedCtx._transitionWhen = [];
|
|
642
716
|
derivedCtx._shellCaptureRun = true;
|
|
643
717
|
derivedCtx._metricsStore = undefined;
|
|
718
|
+
// Spans, like perf metrics above, are a FOREGROUND surface: the capture
|
|
719
|
+
// re-render must not emit a second rango.render/loader/ssr set after the
|
|
720
|
+
// foreground rango.request span ended (orphan spans in the trace).
|
|
721
|
+
// _tracing is otherwise inherited through Object.create(reqCtx).
|
|
722
|
+
derivedCtx._tracing = undefined;
|
|
723
|
+
// Bake-lane loader containers (loaders on entries with no renderable
|
|
724
|
+
// loading() execute during capture — docs/design/loader-container-bake.md).
|
|
725
|
+
// resolveLoaderData registers each container promise here; the drain in
|
|
726
|
+
// captureAndStoreShell elides + pins them into the snapshot's loader family.
|
|
727
|
+
derivedCtx._shellCaptureLoaderRecords = new Map();
|
|
644
728
|
// Own onResponse list so the capture's match-middleware callbacks (the ring-3
|
|
645
729
|
// segment cache write registers here) are ISOLATED from the foreground's shared
|
|
646
730
|
// array AND can be fired by captureAndStoreShell. The segment write is gated
|
|
@@ -765,13 +849,44 @@ async function captureAndStoreShell(
|
|
|
765
849
|
// Bounded by maxWaitMs like every quiesce input (a defer hanging on a masked
|
|
766
850
|
// loader still ends in the sanity-gate refusal).
|
|
767
851
|
const handlesBaked = handleStore.getData().then(resolveDeferredHandleValues);
|
|
768
|
-
|
|
852
|
+
// Bake-lane loader containers hold the gate the same way (loader-container-
|
|
853
|
+
// bake): a boundary-less container with real latency (a 100ms layout loader)
|
|
854
|
+
// would otherwise lose the 2-hop byte-quiet race — the pending loaderData row
|
|
855
|
+
// emits no bytes, the gate freezes, and the awaiting tree pins above <body>.
|
|
856
|
+
// The records map is fully populated before this point (loader promises are
|
|
857
|
+
// created during the capture's match()), so the hold covers every bake-lane
|
|
858
|
+
// container. allSettled: a REJECTED container releases the hold (the drain
|
|
859
|
+
// below refuses the capture); nested promises INSIDE a container never hold
|
|
860
|
+
// the gate — they stay holes. Bounded by maxWaitMs like every quiesce input.
|
|
861
|
+
const loaderRecordsForHold = reqCtx._shellCaptureLoaderRecords;
|
|
862
|
+
const holdUntil =
|
|
863
|
+
loaderRecordsForHold && loaderRecordsForHold.size > 0
|
|
864
|
+
? Promise.allSettled([handlesBaked, ...loaderRecordsForHold.values()])
|
|
865
|
+
: handlesBaked;
|
|
866
|
+
const gate = gateFlightForCapture(rscStream, undefined, holdUntil);
|
|
769
867
|
// Quiesce = handles settled AND the Flight shell rows went task-quiet. Either
|
|
770
868
|
// half stalling is bounded by captureShellHTML's maxWaitMs.
|
|
771
869
|
const quiesce = Promise.all([handleStore.settled, gate.quiesce]).then(
|
|
772
870
|
() => {},
|
|
773
871
|
);
|
|
774
872
|
|
|
873
|
+
// Deterministic identity-guard refusal, checked at BOTH exits below: the
|
|
874
|
+
// guard error either rejects the prerender itself (boundary-less segment —
|
|
875
|
+
// lands in the catch) or is swallowed into per-loader error UI (the render
|
|
876
|
+
// completes — caught after the try). One helper so the message and the
|
|
877
|
+
// "refused" mapping cannot drift between the two sites.
|
|
878
|
+
const refuseOnGuardTrip = (): "refused" | undefined => {
|
|
879
|
+
const fnName = reqCtx._shellCaptureGuardTripped;
|
|
880
|
+
if (!fnName) return undefined;
|
|
881
|
+
warnCaptureRefusedOnce(
|
|
882
|
+
capture.key,
|
|
883
|
+
`a bake-lane loader (a loader on an entry with no loading()) called ${fnName}() during capture. ` +
|
|
884
|
+
"Identity must not bake into a shared shell. Give that loader's entry a loading() boundary " +
|
|
885
|
+
"(the live lane, exempt from the guard) or move the identity-dependent part into a nested promise.",
|
|
886
|
+
);
|
|
887
|
+
return "refused";
|
|
888
|
+
};
|
|
889
|
+
|
|
775
890
|
try {
|
|
776
891
|
// captureShellHTML CONSUMES the (gated) stream — it is not also SSR'd.
|
|
777
892
|
let result: Awaited<ReturnType<typeof captureShellHTML>>;
|
|
@@ -783,6 +898,10 @@ async function captureAndStoreShell(
|
|
|
783
898
|
}),
|
|
784
899
|
);
|
|
785
900
|
} catch (error) {
|
|
901
|
+
// Guard-tripped rejection arrives here (not at the drain) — refuse
|
|
902
|
+
// BEFORE the AbortError-vs-rethrow decision below.
|
|
903
|
+
const refused = refuseOnGuardTrip();
|
|
904
|
+
if (refused) return refused;
|
|
786
905
|
// captureShellHTML normally converts its OWN deliberate abort to a null
|
|
787
906
|
// return (index.tsx). This catch is defensive: if an AbortError still escapes
|
|
788
907
|
// (a runtime where the abort surfaces as a stream rejection outside its
|
|
@@ -801,6 +920,13 @@ async function captureAndStoreShell(
|
|
|
801
920
|
// yet finished; on a loader route WITHOUT a route-level loading() boundary it is
|
|
802
921
|
// the structural eternal-MISS shape (the masked loader pins the tree above
|
|
803
922
|
// <body> at tree-build). The caller's warning names both.
|
|
923
|
+
// Guard check first — BEFORE the trivial-prelude retry path. A guard trip
|
|
924
|
+
// is deterministic (retrying re-trips it), and when the tripping loader's
|
|
925
|
+
// error UI still completed a shell, storing it would bake the failure into
|
|
926
|
+
// a shared page.
|
|
927
|
+
const refused = refuseOnGuardTrip();
|
|
928
|
+
if (refused) return refused;
|
|
929
|
+
|
|
804
930
|
if (result === null) {
|
|
805
931
|
return "no-shell";
|
|
806
932
|
}
|
|
@@ -847,6 +973,54 @@ async function captureAndStoreShell(
|
|
|
847
973
|
snapshot = recording.drainSnapshot();
|
|
848
974
|
}
|
|
849
975
|
|
|
976
|
+
// Pin the bake-lane loader containers (loader family). Settled containers
|
|
977
|
+
// are promise-elided (a still-pending nested promise is a hole marker, not
|
|
978
|
+
// shell material) and Flight-serialized; a REJECTED container refuses the
|
|
979
|
+
// capture — per-loader error UI must never bake into the shared shell. A
|
|
980
|
+
// container still pending here either pinned the tree (the trivial-prelude
|
|
981
|
+
// gate above already returned no-shell) or postponed under an ANCESTOR
|
|
982
|
+
// boundary (it is a hole; omitting the record keeps it live).
|
|
983
|
+
const loaderRecords = reqCtx._shellCaptureLoaderRecords;
|
|
984
|
+
if (loaderRecords && loaderRecords.size > 0) {
|
|
985
|
+
// The codec import is deferred past the elide probes: a rejected record
|
|
986
|
+
// refuses and a never-settled record is omitted WITHOUT touching Flight
|
|
987
|
+
// (also keeps the virtual @vitejs/plugin-rsc import out of unit configs).
|
|
988
|
+
let serializeContainer:
|
|
989
|
+
| typeof import("../cache/segment-codec.js").serializeResult
|
|
990
|
+
| undefined;
|
|
991
|
+
for (const [segmentKey, containerPromise] of loaderRecords) {
|
|
992
|
+
const elided = await elideLoaderContainer(containerPromise);
|
|
993
|
+
if (elided.state === "rejected") {
|
|
994
|
+
warnCaptureRefusedOnce(
|
|
995
|
+
capture.key,
|
|
996
|
+
`the loader for segment "${segmentKey}" rejected during capture; its error UI must not bake into the shared shell. ` +
|
|
997
|
+
"Fix the loader, or give its entry a loading() boundary so it stays on the live lane.",
|
|
998
|
+
);
|
|
999
|
+
return "refused";
|
|
1000
|
+
}
|
|
1001
|
+
// The container itself never settled: it is a hole (under an ancestor
|
|
1002
|
+
// boundary) or the trivial-prelude gate already fired. Omit — no pin.
|
|
1003
|
+
if (isLoaderHoleMarker(elided.value)) continue;
|
|
1004
|
+
try {
|
|
1005
|
+
// serializeResult (not rscSerialize): null is a valid container and
|
|
1006
|
+
// must round-trip; serializeResult preserves it through Flight.
|
|
1007
|
+
serializeContainer ??= (await import("../cache/segment-codec.js"))
|
|
1008
|
+
.serializeResult;
|
|
1009
|
+
const serialized = await serializeContainer(elided.value);
|
|
1010
|
+
if (serialized !== null) {
|
|
1011
|
+
(snapshot ??= []).push({
|
|
1012
|
+
family: "loader",
|
|
1013
|
+
key: segmentKey,
|
|
1014
|
+
value: { value: serialized },
|
|
1015
|
+
});
|
|
1016
|
+
}
|
|
1017
|
+
} catch {
|
|
1018
|
+
// Non-serializable container: leave it unpinned (it drifts on a HIT,
|
|
1019
|
+
// the pre-snapshot behavior) rather than failing the capture.
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
|
|
850
1024
|
const store = capture.store ?? reqCtx._cacheStore;
|
|
851
1025
|
if (store?.putShell) {
|
|
852
1026
|
try {
|
|
@@ -895,3 +1069,17 @@ async function captureAndStoreShell(
|
|
|
895
1069
|
|
|
896
1070
|
// Exported for unit tests that drive the capture core directly.
|
|
897
1071
|
export { runShellCapture, captureAndStoreShell };
|
|
1072
|
+
|
|
1073
|
+
// Exported for unit tests that pin the refused-capture backoff policy directly
|
|
1074
|
+
// (dev cap vs production exponential growth, stored-clears, cold-start re-probe).
|
|
1075
|
+
// These are the same module-level functions the schedule path uses; a test that
|
|
1076
|
+
// drove them through a real capture round-trip could not assert the exact window
|
|
1077
|
+
// arithmetic without a full cold render.
|
|
1078
|
+
export {
|
|
1079
|
+
isCaptureBackedOff,
|
|
1080
|
+
markCaptureBackoff,
|
|
1081
|
+
clearCaptureBackoff,
|
|
1082
|
+
REFUSED_CAPTURE_BASE_MS,
|
|
1083
|
+
REFUSED_CAPTURE_MAX_MS,
|
|
1084
|
+
REFUSED_CAPTURE_DEV_MAX_MS,
|
|
1085
|
+
};
|