@rangojs/router 0.0.0-experimental.141 → 0.0.0-experimental.142
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 +82 -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 +19 -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 +17 -1
- package/skills/catalog.json +265 -0
- package/skills/comparison/references/framework-comparison.md +1 -1
- package/skills/composability/SKILL.md +1 -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 +1 -1
- package/skills/parallel/SKILL.md +8 -1
- package/skills/ppr/SKILL.md +261 -28
- 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 +1 -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 +44 -919
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +305 -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/router/manifest.ts +13 -5
- package/src/router/match-api.ts +70 -30
- package/src/router/match-handlers.ts +6 -2
- package/src/router/match-result.ts +35 -15
- package/src/router/middleware.ts +10 -3
- package/src/router/request-classification.ts +20 -7
- package/src/router/route-snapshot.ts +10 -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 +170 -0
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/rsc-rendering.ts +39 -8
- package/src/rsc/shell-capture.ts +196 -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/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/router-discovery.ts +78 -15
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,11 @@ async function attemptCapture(
|
|
|
641
715
|
derivedCtx._transitionWhen = [];
|
|
642
716
|
derivedCtx._shellCaptureRun = true;
|
|
643
717
|
derivedCtx._metricsStore = undefined;
|
|
718
|
+
// Bake-lane loader containers (loaders on entries with no renderable
|
|
719
|
+
// loading() execute during capture — docs/design/loader-container-bake.md).
|
|
720
|
+
// resolveLoaderData registers each container promise here; the drain in
|
|
721
|
+
// captureAndStoreShell elides + pins them into the snapshot's loader family.
|
|
722
|
+
derivedCtx._shellCaptureLoaderRecords = new Map();
|
|
644
723
|
// Own onResponse list so the capture's match-middleware callbacks (the ring-3
|
|
645
724
|
// segment cache write registers here) are ISOLATED from the foreground's shared
|
|
646
725
|
// array AND can be fired by captureAndStoreShell. The segment write is gated
|
|
@@ -765,13 +844,44 @@ async function captureAndStoreShell(
|
|
|
765
844
|
// Bounded by maxWaitMs like every quiesce input (a defer hanging on a masked
|
|
766
845
|
// loader still ends in the sanity-gate refusal).
|
|
767
846
|
const handlesBaked = handleStore.getData().then(resolveDeferredHandleValues);
|
|
768
|
-
|
|
847
|
+
// Bake-lane loader containers hold the gate the same way (loader-container-
|
|
848
|
+
// bake): a boundary-less container with real latency (a 100ms layout loader)
|
|
849
|
+
// would otherwise lose the 2-hop byte-quiet race — the pending loaderData row
|
|
850
|
+
// emits no bytes, the gate freezes, and the awaiting tree pins above <body>.
|
|
851
|
+
// The records map is fully populated before this point (loader promises are
|
|
852
|
+
// created during the capture's match()), so the hold covers every bake-lane
|
|
853
|
+
// container. allSettled: a REJECTED container releases the hold (the drain
|
|
854
|
+
// below refuses the capture); nested promises INSIDE a container never hold
|
|
855
|
+
// the gate — they stay holes. Bounded by maxWaitMs like every quiesce input.
|
|
856
|
+
const loaderRecordsForHold = reqCtx._shellCaptureLoaderRecords;
|
|
857
|
+
const holdUntil =
|
|
858
|
+
loaderRecordsForHold && loaderRecordsForHold.size > 0
|
|
859
|
+
? Promise.allSettled([handlesBaked, ...loaderRecordsForHold.values()])
|
|
860
|
+
: handlesBaked;
|
|
861
|
+
const gate = gateFlightForCapture(rscStream, undefined, holdUntil);
|
|
769
862
|
// Quiesce = handles settled AND the Flight shell rows went task-quiet. Either
|
|
770
863
|
// half stalling is bounded by captureShellHTML's maxWaitMs.
|
|
771
864
|
const quiesce = Promise.all([handleStore.settled, gate.quiesce]).then(
|
|
772
865
|
() => {},
|
|
773
866
|
);
|
|
774
867
|
|
|
868
|
+
// Deterministic identity-guard refusal, checked at BOTH exits below: the
|
|
869
|
+
// guard error either rejects the prerender itself (boundary-less segment —
|
|
870
|
+
// lands in the catch) or is swallowed into per-loader error UI (the render
|
|
871
|
+
// completes — caught after the try). One helper so the message and the
|
|
872
|
+
// "refused" mapping cannot drift between the two sites.
|
|
873
|
+
const refuseOnGuardTrip = (): "refused" | undefined => {
|
|
874
|
+
const fnName = reqCtx._shellCaptureGuardTripped;
|
|
875
|
+
if (!fnName) return undefined;
|
|
876
|
+
warnCaptureRefusedOnce(
|
|
877
|
+
capture.key,
|
|
878
|
+
`a bake-lane loader (a loader on an entry with no loading()) called ${fnName}() during capture. ` +
|
|
879
|
+
"Identity must not bake into a shared shell. Give that loader's entry a loading() boundary " +
|
|
880
|
+
"(the live lane, exempt from the guard) or move the identity-dependent part into a nested promise.",
|
|
881
|
+
);
|
|
882
|
+
return "refused";
|
|
883
|
+
};
|
|
884
|
+
|
|
775
885
|
try {
|
|
776
886
|
// captureShellHTML CONSUMES the (gated) stream — it is not also SSR'd.
|
|
777
887
|
let result: Awaited<ReturnType<typeof captureShellHTML>>;
|
|
@@ -783,6 +893,10 @@ async function captureAndStoreShell(
|
|
|
783
893
|
}),
|
|
784
894
|
);
|
|
785
895
|
} catch (error) {
|
|
896
|
+
// Guard-tripped rejection arrives here (not at the drain) — refuse
|
|
897
|
+
// BEFORE the AbortError-vs-rethrow decision below.
|
|
898
|
+
const refused = refuseOnGuardTrip();
|
|
899
|
+
if (refused) return refused;
|
|
786
900
|
// captureShellHTML normally converts its OWN deliberate abort to a null
|
|
787
901
|
// return (index.tsx). This catch is defensive: if an AbortError still escapes
|
|
788
902
|
// (a runtime where the abort surfaces as a stream rejection outside its
|
|
@@ -801,6 +915,13 @@ async function captureAndStoreShell(
|
|
|
801
915
|
// yet finished; on a loader route WITHOUT a route-level loading() boundary it is
|
|
802
916
|
// the structural eternal-MISS shape (the masked loader pins the tree above
|
|
803
917
|
// <body> at tree-build). The caller's warning names both.
|
|
918
|
+
// Guard check first — BEFORE the trivial-prelude retry path. A guard trip
|
|
919
|
+
// is deterministic (retrying re-trips it), and when the tripping loader's
|
|
920
|
+
// error UI still completed a shell, storing it would bake the failure into
|
|
921
|
+
// a shared page.
|
|
922
|
+
const refused = refuseOnGuardTrip();
|
|
923
|
+
if (refused) return refused;
|
|
924
|
+
|
|
804
925
|
if (result === null) {
|
|
805
926
|
return "no-shell";
|
|
806
927
|
}
|
|
@@ -847,6 +968,54 @@ async function captureAndStoreShell(
|
|
|
847
968
|
snapshot = recording.drainSnapshot();
|
|
848
969
|
}
|
|
849
970
|
|
|
971
|
+
// Pin the bake-lane loader containers (loader family). Settled containers
|
|
972
|
+
// are promise-elided (a still-pending nested promise is a hole marker, not
|
|
973
|
+
// shell material) and Flight-serialized; a REJECTED container refuses the
|
|
974
|
+
// capture — per-loader error UI must never bake into the shared shell. A
|
|
975
|
+
// container still pending here either pinned the tree (the trivial-prelude
|
|
976
|
+
// gate above already returned no-shell) or postponed under an ANCESTOR
|
|
977
|
+
// boundary (it is a hole; omitting the record keeps it live).
|
|
978
|
+
const loaderRecords = reqCtx._shellCaptureLoaderRecords;
|
|
979
|
+
if (loaderRecords && loaderRecords.size > 0) {
|
|
980
|
+
// The codec import is deferred past the elide probes: a rejected record
|
|
981
|
+
// refuses and a never-settled record is omitted WITHOUT touching Flight
|
|
982
|
+
// (also keeps the virtual @vitejs/plugin-rsc import out of unit configs).
|
|
983
|
+
let serializeContainer:
|
|
984
|
+
| typeof import("../cache/segment-codec.js").serializeResult
|
|
985
|
+
| undefined;
|
|
986
|
+
for (const [segmentKey, containerPromise] of loaderRecords) {
|
|
987
|
+
const elided = await elideLoaderContainer(containerPromise);
|
|
988
|
+
if (elided.state === "rejected") {
|
|
989
|
+
warnCaptureRefusedOnce(
|
|
990
|
+
capture.key,
|
|
991
|
+
`the loader for segment "${segmentKey}" rejected during capture; its error UI must not bake into the shared shell. ` +
|
|
992
|
+
"Fix the loader, or give its entry a loading() boundary so it stays on the live lane.",
|
|
993
|
+
);
|
|
994
|
+
return "refused";
|
|
995
|
+
}
|
|
996
|
+
// The container itself never settled: it is a hole (under an ancestor
|
|
997
|
+
// boundary) or the trivial-prelude gate already fired. Omit — no pin.
|
|
998
|
+
if (isLoaderHoleMarker(elided.value)) continue;
|
|
999
|
+
try {
|
|
1000
|
+
// serializeResult (not rscSerialize): null is a valid container and
|
|
1001
|
+
// must round-trip; serializeResult preserves it through Flight.
|
|
1002
|
+
serializeContainer ??= (await import("../cache/segment-codec.js"))
|
|
1003
|
+
.serializeResult;
|
|
1004
|
+
const serialized = await serializeContainer(elided.value);
|
|
1005
|
+
if (serialized !== null) {
|
|
1006
|
+
(snapshot ??= []).push({
|
|
1007
|
+
family: "loader",
|
|
1008
|
+
key: segmentKey,
|
|
1009
|
+
value: { value: serialized },
|
|
1010
|
+
});
|
|
1011
|
+
}
|
|
1012
|
+
} catch {
|
|
1013
|
+
// Non-serializable container: leave it unpinned (it drifts on a HIT,
|
|
1014
|
+
// the pre-snapshot behavior) rather than failing the capture.
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
|
|
850
1019
|
const store = capture.store ?? reqCtx._cacheStore;
|
|
851
1020
|
if (store?.putShell) {
|
|
852
1021
|
try {
|
|
@@ -895,3 +1064,17 @@ async function captureAndStoreShell(
|
|
|
895
1064
|
|
|
896
1065
|
// Exported for unit tests that drive the capture core directly.
|
|
897
1066
|
export { runShellCapture, captureAndStoreShell };
|
|
1067
|
+
|
|
1068
|
+
// Exported for unit tests that pin the refused-capture backoff policy directly
|
|
1069
|
+
// (dev cap vs production exponential growth, stored-clears, cold-start re-probe).
|
|
1070
|
+
// These are the same module-level functions the schedule path uses; a test that
|
|
1071
|
+
// drove them through a real capture round-trip could not assert the exact window
|
|
1072
|
+
// arithmetic without a full cold render.
|
|
1073
|
+
export {
|
|
1074
|
+
isCaptureBackedOff,
|
|
1075
|
+
markCaptureBackoff,
|
|
1076
|
+
clearCaptureBackoff,
|
|
1077
|
+
REFUSED_CAPTURE_BASE_MS,
|
|
1078
|
+
REFUSED_CAPTURE_MAX_MS,
|
|
1079
|
+
REFUSED_CAPTURE_DEV_MAX_MS,
|
|
1080
|
+
};
|
package/src/rsc/shell-serve.ts
CHANGED
|
@@ -122,3 +122,29 @@ export function warnShellStoreMissingOnce(key: string): void {
|
|
|
122
122
|
"via createRouter({ cache }).",
|
|
123
123
|
);
|
|
124
124
|
}
|
|
125
|
+
|
|
126
|
+
/** Keys already warned about an active per-request nonce (once per key). */
|
|
127
|
+
const warnedNonceActive = new Set<string>();
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Warn once per key that a route declared `ppr` but a per-request CSP nonce is
|
|
131
|
+
* active for the request, so the route stays on axis 1 (a shared shell would
|
|
132
|
+
* freeze one request's nonce for every visitor — useNonce() renders it into every
|
|
133
|
+
* nonced script/style/meta and the browser's CSP would then reject the frozen
|
|
134
|
+
* nonce for all but the capture request). The nonce blocks capture whether it came
|
|
135
|
+
* from the `createRouter({ nonce })` provider or from a direct `ctx.set(nonce, …)`
|
|
136
|
+
* token write in middleware. Same declared-intent-cannot-be-honored doctrine as
|
|
137
|
+
* the missing-store warning above (an undeclared route stays silent).
|
|
138
|
+
*/
|
|
139
|
+
export function warnPprNonceActiveOnce(key: string): void {
|
|
140
|
+
if (warnedNonceActive.has(key)) return;
|
|
141
|
+
warnedNonceActive.add(key);
|
|
142
|
+
console.warn(
|
|
143
|
+
`[rango] Route for "${key}" declares the ppr path option, but a per-request ` +
|
|
144
|
+
"CSP nonce is active for this request (from createRouter({ nonce }) or a " +
|
|
145
|
+
"ctx.set(nonce, …) token write in middleware), so the route is served on " +
|
|
146
|
+
"axis 1 without a shell. A shell is shared per host+URL; baking one " +
|
|
147
|
+
"request's nonce into it would break CSP for every other visitor. Drop the " +
|
|
148
|
+
"ppr option on this route, or stop setting a per-request nonce for it.",
|
|
149
|
+
);
|
|
150
|
+
}
|
|
@@ -164,6 +164,12 @@ function assertNotInsideShellCapture(ctx: unknown, fnName: string): void {
|
|
|
164
164
|
typeof ctx === "object" &&
|
|
165
165
|
(ctx as { _shellCaptureRun?: unknown })._shellCaptureRun === true
|
|
166
166
|
) {
|
|
167
|
+
// Flag the capture context BEFORE throwing: inside an executing bake-lane
|
|
168
|
+
// loader this throw is swallowed by wrapLoaderPromise into per-loader error
|
|
169
|
+
// UI, which would bake silently into the shared shell. The capture checks
|
|
170
|
+
// the flag after the render and refuses (shell-capture.ts).
|
|
171
|
+
(ctx as { _shellCaptureGuardTripped?: string })._shellCaptureGuardTripped =
|
|
172
|
+
fnName;
|
|
167
173
|
throw new Error(
|
|
168
174
|
`${fnName}() cannot be called while capturing a shared shell ` +
|
|
169
175
|
`(shell-cache middleware). The captured shell is served to every user ` +
|
|
@@ -187,6 +187,39 @@ export interface RequestContext<
|
|
|
187
187
|
*/
|
|
188
188
|
_shellCaptureRun?: boolean;
|
|
189
189
|
|
|
190
|
+
/**
|
|
191
|
+
* @internal Bake-lane loader containers collected DURING a shell capture:
|
|
192
|
+
* segment-key -> the loader's (pre-wrap) result promise. Populated by
|
|
193
|
+
* resolveLoaderData for loaders on entries with no renderable loading() (the
|
|
194
|
+
* bake lane — they execute at capture instead of being masked; see
|
|
195
|
+
* docs/design/loader-container-bake.md). Drained by captureAndStoreShell
|
|
196
|
+
* after the shell quiesces: settled containers are promise-elided,
|
|
197
|
+
* Flight-serialized, and pinned into the snapshot's loader family; a
|
|
198
|
+
* REJECTED container refuses the capture (error UI must never bake into the
|
|
199
|
+
* shared shell). Own property of the capture's derived context only.
|
|
200
|
+
*/
|
|
201
|
+
_shellCaptureLoaderRecords?: Map<string, Promise<unknown>>;
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* @internal Loader-family snapshot seed for a shell HIT's tail render:
|
|
205
|
+
* segment-key -> the capture's elided container (already Flight-deserialized
|
|
206
|
+
* by serveShellHit). resolveLoaderData overlays it onto the fresh run's
|
|
207
|
+
* container (recorded paths pinned, hole-marker paths keep the fresh nested
|
|
208
|
+
* promises) so the payload's baked bytes match the frozen prelude. Own
|
|
209
|
+
* property of the HIT tail's derived context only.
|
|
210
|
+
*/
|
|
211
|
+
_shellLoaderSeed?: Map<string, unknown>;
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* @internal Set (to the offending fn name) by the cookies()/headers()
|
|
215
|
+
* capture guard when it throws DURING a capture render. Load-bearing for the
|
|
216
|
+
* bake lane: a guard throw inside an executing loader is swallowed by
|
|
217
|
+
* wrapLoaderPromise into per-loader error UI, which would otherwise bake
|
|
218
|
+
* silently into the shared shell — the capture checks this flag after the
|
|
219
|
+
* render and refuses instead. Deterministic, so the capture does not retry.
|
|
220
|
+
*/
|
|
221
|
+
_shellCaptureGuardTripped?: string;
|
|
222
|
+
|
|
190
223
|
/**
|
|
191
224
|
* @internal Handler-owned registry of explicit per-scope stores from
|
|
192
225
|
* cache({ store }). Created once per createRSCHandler() and threaded into
|
package/src/ssr/index.tsx
CHANGED
|
@@ -470,6 +470,13 @@ export function createShellCaptureHandler<TEnv = unknown>(
|
|
|
470
470
|
reportRenderError(onError, error);
|
|
471
471
|
},
|
|
472
472
|
});
|
|
473
|
+
// Pre-attach a no-op catch: the real await sits AFTER quiesce + the
|
|
474
|
+
// post-quiesce hops, so an early prerender rejection (e.g. a bake-lane
|
|
475
|
+
// loader tripping the identity guard within milliseconds) would otherwise
|
|
476
|
+
// spend several turns handler-less and crash the worker as an unhandled
|
|
477
|
+
// rejection. The actual rejection handling still happens at the await
|
|
478
|
+
// below; this parallel handler only keeps the gap crash-free.
|
|
479
|
+
prerenderPromise.catch(() => {});
|
|
473
480
|
|
|
474
481
|
// Wait for the caller's quiesce signal. By the time it resolves the Flight
|
|
475
482
|
// input is byte-quiet and FROZEN by the capture gate (shell-capture.ts
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev prerender result cache — memoizes /__rsc_prerender responses between
|
|
3
|
+
* HMR edits (issue #654).
|
|
4
|
+
*
|
|
5
|
+
* Freshness invariant (why identity keying is correct): the endpoint
|
|
6
|
+
* re-imports the user's entry module through a Vite module runner on every
|
|
7
|
+
* request. When ANY module in the entry → router → urls → handler chain was
|
|
8
|
+
* invalidated (file edit propagates up the importer graph), that import
|
|
9
|
+
* re-executes the entry, `createRouter()` re-runs, and `RouterRegistry.set`
|
|
10
|
+
* (router.ts) replaces the router instance with a NEW object. When nothing
|
|
11
|
+
* was invalidated, the import is a module-cache hit and the instance is the
|
|
12
|
+
* SAME object. Router-instance identity therefore IS the HMR generation:
|
|
13
|
+
* keying the cache on it gives "serve cached until an edit invalidates the
|
|
14
|
+
* chain" without any watcher bookkeeping, and the WeakMap lets every stale
|
|
15
|
+
* generation's bucket be garbage-collected the moment the registry drops
|
|
16
|
+
* the old instance.
|
|
17
|
+
*
|
|
18
|
+
* Staleness envelope: a cached body can only go stale through NON-module
|
|
19
|
+
* inputs (a getParams() reading a database, fs content outside the module
|
|
20
|
+
* graph). Production freezes those at build time, so serving them frozen
|
|
21
|
+
* between edits makes dev MORE faithful to production, not less — the
|
|
22
|
+
* pre-#654 behavior of re-rendering per request was the anomaly.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import type { SerializedSegmentData } from "../../cache/types.js";
|
|
26
|
+
|
|
27
|
+
/** Structural slice of `matchForPrerender`'s result the payload derivation needs. */
|
|
28
|
+
export interface DevPrerenderMatchPayloadSource {
|
|
29
|
+
segments: SerializedSegmentData[];
|
|
30
|
+
handles: string;
|
|
31
|
+
interceptSegments?: SerializedSegmentData[];
|
|
32
|
+
interceptHandles?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Serialized response bodies for the two endpoint variants of one render. */
|
|
36
|
+
export interface DevPrerenderPayloadBodies {
|
|
37
|
+
/** `intercept != 1` response: the route's own segments + handles. */
|
|
38
|
+
main: string;
|
|
39
|
+
/**
|
|
40
|
+
* `intercept=1` response: main + intercept segments with the MERGED handle
|
|
41
|
+
* string. Falls back to `main` byte-for-byte when the route has no
|
|
42
|
+
* intercept segments — mirroring the endpoint's historical behavior.
|
|
43
|
+
*/
|
|
44
|
+
intercept: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface DevPrerenderCache {
|
|
48
|
+
get(router: object, key: string): string | undefined;
|
|
49
|
+
set(router: object, key: string, body: string): void;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Derive both variant bodies from one matchForPrerender result, so a single
|
|
54
|
+
* render warms the main AND intercept cache keys (matchForPrerender computes
|
|
55
|
+
* intercept segments unconditionally either way — see prerender-match.ts
|
|
56
|
+
* step 14).
|
|
57
|
+
*/
|
|
58
|
+
export function payloadBodiesFromResult(
|
|
59
|
+
result: DevPrerenderMatchPayloadSource,
|
|
60
|
+
): DevPrerenderPayloadBodies {
|
|
61
|
+
const main = JSON.stringify({
|
|
62
|
+
segments: result.segments,
|
|
63
|
+
handles: result.handles,
|
|
64
|
+
});
|
|
65
|
+
const intercept = result.interceptSegments?.length
|
|
66
|
+
? JSON.stringify({
|
|
67
|
+
segments: [...result.segments, ...result.interceptSegments],
|
|
68
|
+
handles: result.interceptHandles ?? "",
|
|
69
|
+
})
|
|
70
|
+
: main;
|
|
71
|
+
return { main, intercept };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Cache key for one endpoint request shape. `pathname` and `routeName` come
|
|
76
|
+
* straight from the query; `passthrough` selects the getParams-checked match
|
|
77
|
+
* path; `intercept` selects which variant body is served. All four dimensions
|
|
78
|
+
* change the response, so all four are in the key.
|
|
79
|
+
*/
|
|
80
|
+
export function devPrerenderCacheKey(
|
|
81
|
+
pathname: string,
|
|
82
|
+
opts: { intercept: boolean; passthrough: boolean; routeName: string | null },
|
|
83
|
+
): string {
|
|
84
|
+
return `${pathname}|i=${opts.intercept ? 1 : 0}|p=${opts.passthrough ? 1 : 0}|r=${opts.routeName ?? ""}`;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Per-router FIFO cap: a dev session that visits an unbounded set of
|
|
89
|
+
* prerendered pathnames (e.g. crawling param routes) must not grow one
|
|
90
|
+
* bucket without limit. 500 rendered payloads is far beyond any interactive
|
|
91
|
+
* session; eviction order does not matter for correctness (a miss just
|
|
92
|
+
* re-renders).
|
|
93
|
+
*/
|
|
94
|
+
const MAX_ENTRIES_PER_ROUTER = 500;
|
|
95
|
+
|
|
96
|
+
export function createDevPrerenderCache(
|
|
97
|
+
maxEntriesPerRouter: number = MAX_ENTRIES_PER_ROUTER,
|
|
98
|
+
): DevPrerenderCache {
|
|
99
|
+
const buckets = new WeakMap<object, Map<string, string>>();
|
|
100
|
+
return {
|
|
101
|
+
get(router: object, key: string): string | undefined {
|
|
102
|
+
return buckets.get(router)?.get(key);
|
|
103
|
+
},
|
|
104
|
+
set(router: object, key: string, body: string): void {
|
|
105
|
+
let bucket = buckets.get(router);
|
|
106
|
+
if (!bucket) {
|
|
107
|
+
bucket = new Map();
|
|
108
|
+
buckets.set(router, bucket);
|
|
109
|
+
}
|
|
110
|
+
if (!bucket.has(key) && bucket.size >= maxEntriesPerRouter) {
|
|
111
|
+
const oldest = bucket.keys().next().value;
|
|
112
|
+
if (oldest !== undefined) bucket.delete(oldest);
|
|
113
|
+
}
|
|
114
|
+
bucket.set(key, body);
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|