@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
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
|
package/src/testing/dispatch.ts
CHANGED
|
@@ -55,6 +55,14 @@
|
|
|
55
55
|
* metadata.category, while the request still degrades-to-miss exactly as before.
|
|
56
56
|
* (A thrown response-route HANDLER error is the one onError path NOT covered —
|
|
57
57
|
* see "DOES NOT support" below.)
|
|
58
|
+
* - createRouter({ telemetry }) match-transaction lifecycle: request.start opens
|
|
59
|
+
* the transaction before the global middleware chain, request.end closes it
|
|
60
|
+
* after finalizeResponse (segmentCount 0 / cacheHit false — dispatch renders no
|
|
61
|
+
* RSC segments and holds no match-cache state), and a thrown non-Response error
|
|
62
|
+
* emits request.error with phase "routing". All three carry the same requestId
|
|
63
|
+
* (getRequestId). Emission is gated entirely on a configured sink; with none,
|
|
64
|
+
* dispatch does zero new work and stays byte-identical for existing callers.
|
|
65
|
+
* Lets a consumer unit-test their sink wiring in-process instead of only at e2e.
|
|
58
66
|
*
|
|
59
67
|
* What dispatch DOES NOT support (and why):
|
|
60
68
|
* - RSC component routes — rendering requires the Flight serializer + React
|
|
@@ -76,6 +84,13 @@
|
|
|
76
84
|
* merged cookies/headers all match production; only the Flight-embedded
|
|
77
85
|
* location-state entries are absent. Cover location-state restoration across a
|
|
78
86
|
* partial redirect with an e2e test.
|
|
87
|
+
* - Telemetry cache.decision / loader.* / handler.error events: these fire from
|
|
88
|
+
* the real match()/matchPartial() + RSC render + loader pipeline (match-
|
|
89
|
+
* handlers.ts, loader-resolution.ts, segment-resolution), none of which
|
|
90
|
+
* dispatch runs. Synthesizing them here would be faking (the events would not
|
|
91
|
+
* reflect a real cache lookup or loader run), so dispatch emits only the
|
|
92
|
+
* request.start/end/error lifecycle above; cover cache/loader telemetry with an
|
|
93
|
+
* e2e test driving a real RSC request.
|
|
79
94
|
*
|
|
80
95
|
* dispatch reuses router.previewMatch(), which itself runs content negotiation
|
|
81
96
|
* and resolves route middleware from the matched entry tree, so dispatch's
|
|
@@ -127,6 +142,8 @@ import { isWebSocketUpgradeResponse } from "../response-utils.js";
|
|
|
127
142
|
import { invokeOnError } from "../router/error-handling.js";
|
|
128
143
|
import type { OnErrorCallback } from "../types/error-types.js";
|
|
129
144
|
import type { Rango } from "../router/router-interfaces.js";
|
|
145
|
+
import { getRequestId, resolveSink, safeEmit } from "../router/telemetry.js";
|
|
146
|
+
import type { TelemetrySink } from "../router/telemetry.js";
|
|
130
147
|
|
|
131
148
|
/**
|
|
132
149
|
* The internal subset of the router surface dispatch depends on. The public
|
|
@@ -140,6 +157,13 @@ interface DispatchableRouter<TEnv> {
|
|
|
140
157
|
routeMap: Record<string, unknown>;
|
|
141
158
|
middleware: MiddlewareEntry<TEnv>[];
|
|
142
159
|
onError?: OnErrorCallback<TEnv>;
|
|
160
|
+
/**
|
|
161
|
+
* Optional telemetry sink from createRouter({ telemetry }) (RangoInternal
|
|
162
|
+
* field). dispatch emits the match-transaction lifecycle events onto it so a
|
|
163
|
+
* consumer can unit-test their sink wiring in-process; undefined keeps dispatch
|
|
164
|
+
* byte-identical for every existing caller.
|
|
165
|
+
*/
|
|
166
|
+
telemetry?: TelemetrySink;
|
|
143
167
|
findMatch(pathname: string): Promise<{
|
|
144
168
|
redirectTo?: string;
|
|
145
169
|
routeKey?: string;
|
|
@@ -444,6 +468,19 @@ export async function dispatch<TEnv = any>(
|
|
|
444
468
|
const isPartial = url.searchParams.has("_rsc_partial");
|
|
445
469
|
const isAction = url.searchParams.has("_rsc_action");
|
|
446
470
|
|
|
471
|
+
// Telemetry: mirror the router's match-transaction lifecycle onto the
|
|
472
|
+
// configured sink so a consumer can unit-test createRouter({ telemetry })
|
|
473
|
+
// wiring in-process (the dogfood gap the RSC-free dispatch left — see
|
|
474
|
+
// tests/cloudflare-basic/test/cache-status.test.ts). Every emit is gated on
|
|
475
|
+
// `sink` truthiness: with no sink configured dispatch does zero new work and
|
|
476
|
+
// stays byte-identical for existing callers. Only request.start/end/error are
|
|
477
|
+
// reachable here — cache.decision and loader.* originate in the real match()/
|
|
478
|
+
// matchPartial() + RSC render pipeline dispatch deliberately does not run
|
|
479
|
+
// (module header), so fabricating them would violate the no-fake rule.
|
|
480
|
+
const sink = router.telemetry;
|
|
481
|
+
const telemetryRequestId = sink ? getRequestId(req) : undefined;
|
|
482
|
+
const telemetryStart = sink ? performance.now() : 0;
|
|
483
|
+
|
|
447
484
|
return runWithRequestContext(requestContext, async () => {
|
|
448
485
|
// Set params before middleware/handler run, so global middleware sees
|
|
449
486
|
// ctx.params (production sets them during matching, before middleware).
|
|
@@ -658,44 +695,112 @@ export async function dispatch<TEnv = any>(
|
|
|
658
695
|
return callResponseRoute();
|
|
659
696
|
};
|
|
660
697
|
|
|
661
|
-
//
|
|
662
|
-
//
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
:
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
);
|
|
675
|
-
|
|
676
|
-
// Match production's global-chain exit (handler.ts): on a partial/action
|
|
677
|
-
// request a middleware 3xx redirect is converted to a Flight-safe response
|
|
678
|
-
// so fetch() does not auto-follow it; every path then drains onResponse
|
|
679
|
-
// callbacks via finalizeResponse. dispatch is RSC-free, so the
|
|
680
|
-
// createRedirectFlightResponse stand-in falls back to the no-state
|
|
681
|
-
// 204 + X-RSC-Redirect (see the location-state divergence in the header).
|
|
682
|
-
let finalResponse: Response;
|
|
683
|
-
if (isPartial || isAction) {
|
|
684
|
-
const intercepted = interceptRedirectForPartial(
|
|
685
|
-
mwResponse,
|
|
686
|
-
(redirectUrl) => createSimpleRedirectResponse(redirectUrl),
|
|
687
|
-
);
|
|
688
|
-
finalResponse = finalizeResponse(intercepted ?? mwResponse);
|
|
689
|
-
} else {
|
|
690
|
-
finalResponse = finalizeResponse(mwResponse);
|
|
698
|
+
// request.start opens the match transaction, mirroring match-handlers.ts.
|
|
699
|
+
// transaction is always "match" (dispatch has no matchPartial split);
|
|
700
|
+
// isPartial carries the ?_rsc_partial signal the same way production does.
|
|
701
|
+
if (sink) {
|
|
702
|
+
safeEmit(resolveSink(sink), {
|
|
703
|
+
type: "request.start",
|
|
704
|
+
timestamp: telemetryStart,
|
|
705
|
+
requestId: telemetryRequestId,
|
|
706
|
+
method: req.method,
|
|
707
|
+
pathname: url.pathname,
|
|
708
|
+
transaction: "match",
|
|
709
|
+
isPartial,
|
|
710
|
+
});
|
|
691
711
|
}
|
|
692
712
|
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
713
|
+
try {
|
|
714
|
+
// Global (pattern-matched) middleware wraps coreHandler, exactly as
|
|
715
|
+
// production wraps coreHandler with executeMiddleware (handler.ts).
|
|
716
|
+
const globalMatches = matchMiddleware(url.pathname, router.middleware);
|
|
717
|
+
const mwResponse =
|
|
718
|
+
globalMatches.length === 0
|
|
719
|
+
? await coreHandler()
|
|
720
|
+
: await executeMiddleware<TEnv>(
|
|
721
|
+
globalMatches,
|
|
722
|
+
req,
|
|
723
|
+
env,
|
|
724
|
+
variables,
|
|
725
|
+
coreHandler,
|
|
726
|
+
reverse,
|
|
727
|
+
);
|
|
728
|
+
|
|
729
|
+
// Match production's global-chain exit (handler.ts): on a partial/action
|
|
730
|
+
// request a middleware 3xx redirect is converted to a Flight-safe response
|
|
731
|
+
// so fetch() does not auto-follow it; every path then drains onResponse
|
|
732
|
+
// callbacks via finalizeResponse. dispatch is RSC-free, so the
|
|
733
|
+
// createRedirectFlightResponse stand-in falls back to the no-state
|
|
734
|
+
// 204 + X-RSC-Redirect (see the location-state divergence in the header).
|
|
735
|
+
let finalResponse: Response;
|
|
736
|
+
if (isPartial || isAction) {
|
|
737
|
+
const intercepted = interceptRedirectForPartial(
|
|
738
|
+
mwResponse,
|
|
739
|
+
(redirectUrl) => createSimpleRedirectResponse(redirectUrl),
|
|
740
|
+
);
|
|
741
|
+
finalResponse = finalizeResponse(intercepted ?? mwResponse);
|
|
742
|
+
} else {
|
|
743
|
+
finalResponse = finalizeResponse(mwResponse);
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
// request.end closes the transaction. dispatch produces no RSC segments and
|
|
747
|
+
// holds no match-cache state, so segmentCount/cacheHit are 0/false — the
|
|
748
|
+
// same shape production emits for its own redirect (segment-less) result.
|
|
749
|
+
if (sink) {
|
|
750
|
+
safeEmit(resolveSink(sink), {
|
|
751
|
+
type: "request.end",
|
|
752
|
+
timestamp: performance.now(),
|
|
753
|
+
requestId: telemetryRequestId,
|
|
754
|
+
method: req.method,
|
|
755
|
+
pathname: url.pathname,
|
|
756
|
+
transaction: "match",
|
|
757
|
+
durationMs: performance.now() - telemetryStart,
|
|
758
|
+
segmentCount: 0,
|
|
759
|
+
cacheHit: false,
|
|
760
|
+
});
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
// Mirror production's single open-redirect chokepoint (handler.ts): every
|
|
764
|
+
// browser-followed (3xx + Location) redirect is same-origin guarded before
|
|
765
|
+
// it leaves -- a cross-origin Location is rewritten to the basename root
|
|
766
|
+
// unless redirect(url, { external: true }) opted out. Soft partial/action
|
|
767
|
+
// redirects are 204 + X-RSC-Redirect and pass through untouched (the client
|
|
768
|
+
// validates them), so this is a no-op for them.
|
|
769
|
+
return guardOutgoingRedirect(finalResponse, url.origin, router.basename);
|
|
770
|
+
} catch (error) {
|
|
771
|
+
if (sink) {
|
|
772
|
+
if (error instanceof Response) {
|
|
773
|
+
// executeMiddleware absorbs a middleware-thrown Response and returns it
|
|
774
|
+
// (middleware.ts:566), so a thrown Response never actually reaches this
|
|
775
|
+
// level in dispatch. Defensive: if one ever does it is a completed
|
|
776
|
+
// request from the consumer's seat (a short-circuit redirect), so mirror
|
|
777
|
+
// plan 002 / match-handlers.ts and emit request.end, not request.error.
|
|
778
|
+
safeEmit(resolveSink(sink), {
|
|
779
|
+
type: "request.end",
|
|
780
|
+
timestamp: performance.now(),
|
|
781
|
+
requestId: telemetryRequestId,
|
|
782
|
+
method: req.method,
|
|
783
|
+
pathname: url.pathname,
|
|
784
|
+
transaction: "match",
|
|
785
|
+
durationMs: performance.now() - telemetryStart,
|
|
786
|
+
segmentCount: 0,
|
|
787
|
+
cacheHit: false,
|
|
788
|
+
});
|
|
789
|
+
} else {
|
|
790
|
+
safeEmit(resolveSink(sink), {
|
|
791
|
+
type: "request.error",
|
|
792
|
+
timestamp: performance.now(),
|
|
793
|
+
requestId: telemetryRequestId,
|
|
794
|
+
method: req.method,
|
|
795
|
+
pathname: url.pathname,
|
|
796
|
+
transaction: "match",
|
|
797
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
798
|
+
phase: "routing",
|
|
799
|
+
durationMs: performance.now() - telemetryStart,
|
|
800
|
+
});
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
throw error;
|
|
804
|
+
}
|
|
700
805
|
});
|
|
701
806
|
}
|
|
@@ -268,9 +268,16 @@ export type PathHelpers<TEnv> = {
|
|
|
268
268
|
* `{ handler, use? }` whose `use` is scoped to that slot only. Per-slot
|
|
269
269
|
* merge order is `handler.use` → shared `use` → slot-local `use`, with
|
|
270
270
|
* narrowest scope winning for last-write-wins items like `loading()`.
|
|
271
|
+
*
|
|
272
|
+
* Not generic over the slots record: an inferred type parameter makes the
|
|
273
|
+
* object literal an inference site, which suppresses contextual typing of
|
|
274
|
+
* arrow slot handlers (`(ctx) => ...` was implicit any). Bare handlers infer
|
|
275
|
+
* now; a descriptor's `handler:` arrow still needs an explicit ctx annotation
|
|
276
|
+
* because StaticHandlerDefinition's own `.handler` joins the contextual union
|
|
277
|
+
* (two callables — see parallel-slot-handler-types.test.ts).
|
|
271
278
|
*/
|
|
272
|
-
parallel:
|
|
273
|
-
|
|
279
|
+
parallel: (
|
|
280
|
+
slots: Record<
|
|
274
281
|
`@${string}`,
|
|
275
282
|
| Handler<any, any, TEnv>
|
|
276
283
|
| ReactNode
|
|
@@ -283,8 +290,6 @@ export type PathHelpers<TEnv> = {
|
|
|
283
290
|
use?: () => ParallelUseItem[];
|
|
284
291
|
}
|
|
285
292
|
>,
|
|
286
|
-
>(
|
|
287
|
-
slots: TSlots,
|
|
288
293
|
use?: () => ParallelUseItem[],
|
|
289
294
|
) => ParallelItem;
|
|
290
295
|
|
package/src/vercel/tracing.ts
CHANGED
|
@@ -44,15 +44,15 @@ import {
|
|
|
44
44
|
} from "../router/telemetry-otel.js";
|
|
45
45
|
import type {
|
|
46
46
|
RouterTracingConfig,
|
|
47
|
-
|
|
47
|
+
TracingToggleOptions,
|
|
48
48
|
} from "../router/tracing.js";
|
|
49
49
|
|
|
50
|
-
/**
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Options for createVercelTracing. Extends the shared
|
|
52
|
+
* {@link TracingToggleOptions} (`enabled` + per-phase `spans`) with the
|
|
53
|
+
* Vercel-specific tracer selectors.
|
|
54
|
+
*/
|
|
55
|
+
export interface VercelTracingOptions extends TracingToggleOptions {
|
|
56
56
|
/**
|
|
57
57
|
* OTel instrumentation-scope name passed to `trace.getTracer()`. Defaults to
|
|
58
58
|
* `"rango"`. Ignored when `tracer` is provided.
|
|
@@ -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
|
+
}
|
|
@@ -44,6 +44,11 @@ import {
|
|
|
44
44
|
} from "./discovery/self-gen-tracking.js";
|
|
45
45
|
import { discoverRouters } from "./discovery/discover-routers.js";
|
|
46
46
|
import { describeDiscoveryFailure } from "./discovery/discovery-errors.js";
|
|
47
|
+
import {
|
|
48
|
+
createDevPrerenderCache,
|
|
49
|
+
devPrerenderCacheKey,
|
|
50
|
+
payloadBodiesFromResult,
|
|
51
|
+
} from "./discovery/dev-prerender-cache.js";
|
|
47
52
|
import {
|
|
48
53
|
writeCombinedRouteTypesWithTracking,
|
|
49
54
|
writeRouteTypesFiles,
|
|
@@ -828,6 +833,15 @@ export function createRouterDiscoveryPlugin(
|
|
|
828
833
|
// Registry from the main server's RSC environment (populated by discoverRouters)
|
|
829
834
|
let mainRegistry: Map<string, any> | null = null;
|
|
830
835
|
|
|
836
|
+
// Memoized /__rsc_prerender render results, keyed by router-instance
|
|
837
|
+
// identity (#654). The per-request entry re-import below is what makes
|
|
838
|
+
// identity a valid freshness key: an HMR-invalidated chain re-runs
|
|
839
|
+
// createRouter() and replaces the registry instance, so cached bodies
|
|
840
|
+
// for the old instance become unreachable; an untouched chain returns
|
|
841
|
+
// the same instance and the cached body is byte-identical to a fresh
|
|
842
|
+
// render. See dev-prerender-cache.ts for the full invariant.
|
|
843
|
+
const devPrerenderCache = createDevPrerenderCache();
|
|
844
|
+
|
|
831
845
|
// Push discovery state (manifest, trie, precomputed entries) to the
|
|
832
846
|
// server module so runtime request handling uses the current routes.
|
|
833
847
|
// Shared by initial discovery and HMR-triggered re-discovery.
|
|
@@ -918,9 +932,28 @@ export function createRouterDiscoveryPlugin(
|
|
|
918
932
|
|
|
919
933
|
if (!registry) {
|
|
920
934
|
// No main registry: the RSC env has no module runner (Cloudflare dev).
|
|
921
|
-
// Lazily create a Node.js temp server for prerender evaluation
|
|
922
|
-
|
|
923
|
-
|
|
935
|
+
// Lazily create a Node.js temp server for prerender evaluation, and
|
|
936
|
+
// re-import the entry through it on EVERY request — the temp server
|
|
937
|
+
// has its own file watcher, so a handler-only edit (a file without
|
|
938
|
+
// urls()/createRouter() that the main watcher's route-file sniff
|
|
939
|
+
// ignores) invalidates its module graph; the re-import re-evaluates
|
|
940
|
+
// exactly the dirty subgraph and re-registers fresh router
|
|
941
|
+
// instances. Before #654 the cached registry was only refreshed on
|
|
942
|
+
// route-file edits, so handler-only edits served stale prerender
|
|
943
|
+
// content on this path. Warm-cache re-imports are module-cache hits.
|
|
944
|
+
const tempRscEnv = await getOrCreateTempServer();
|
|
945
|
+
if (tempRscEnv) {
|
|
946
|
+
try {
|
|
947
|
+
await importEntryAndRegistry(tempRscEnv);
|
|
948
|
+
} catch (err: any) {
|
|
949
|
+
console.warn(
|
|
950
|
+
`[rango] Dev prerender module refresh failed: ${err.message}`,
|
|
951
|
+
);
|
|
952
|
+
res.statusCode = 500;
|
|
953
|
+
res.end(`Prerender handler error: ${err.message}`);
|
|
954
|
+
logResult(500, "temp module refresh failed");
|
|
955
|
+
return;
|
|
956
|
+
}
|
|
924
957
|
}
|
|
925
958
|
registry = prerenderNodeRegistry;
|
|
926
959
|
}
|
|
@@ -936,8 +969,38 @@ export function createRouterDiscoveryPlugin(
|
|
|
936
969
|
const wantRouteName = url.searchParams.get("routeName");
|
|
937
970
|
const wantPassthrough = url.searchParams.get("passthrough") === "1";
|
|
938
971
|
|
|
972
|
+
// One render warms BOTH variant keys (matchForPrerender computes the
|
|
973
|
+
// intercept segments unconditionally), so a route's main and modal
|
|
974
|
+
// variants cost a single render per HMR generation.
|
|
975
|
+
const variantDims = {
|
|
976
|
+
passthrough: wantPassthrough,
|
|
977
|
+
routeName: wantRouteName,
|
|
978
|
+
};
|
|
979
|
+
const keyMain = devPrerenderCacheKey(pathname, {
|
|
980
|
+
intercept: false,
|
|
981
|
+
...variantDims,
|
|
982
|
+
});
|
|
983
|
+
const keyIntercept = devPrerenderCacheKey(pathname, {
|
|
984
|
+
intercept: true,
|
|
985
|
+
...variantDims,
|
|
986
|
+
});
|
|
987
|
+
const requestedKey = wantIntercept ? keyIntercept : keyMain;
|
|
988
|
+
|
|
939
989
|
for (const [, routerInstance] of registry) {
|
|
940
990
|
if (!routerInstance.matchForPrerender) continue;
|
|
991
|
+
// Cache is consulted per router IN LOOP ORDER so multi-router
|
|
992
|
+
// fall-through semantics are identical to the uncached path: a
|
|
993
|
+
// router that never produced a payload for this key still runs
|
|
994
|
+
// its matchForPrerender (cheap trie miss / intentionally-uncached
|
|
995
|
+
// error retry) before the next router is considered.
|
|
996
|
+
const cached = devPrerenderCache.get(routerInstance, requestedKey);
|
|
997
|
+
if (cached !== undefined) {
|
|
998
|
+
res.setHeader("content-type", "application/json");
|
|
999
|
+
res.setHeader("x-rango-prerender-cache", "HIT");
|
|
1000
|
+
res.end(cached);
|
|
1001
|
+
logResult(200, "cache hit");
|
|
1002
|
+
return;
|
|
1003
|
+
}
|
|
941
1004
|
try {
|
|
942
1005
|
const result = await routerInstance.matchForPrerender(
|
|
943
1006
|
pathname,
|
|
@@ -953,19 +1016,19 @@ export function createRouterDiscoveryPlugin(
|
|
|
953
1016
|
// This prevents returning the wrong entry when multiple routers
|
|
954
1017
|
// have prerenderable routes sharing the same pathname.
|
|
955
1018
|
if (wantRouteName && result.routeName !== wantRouteName) continue;
|
|
1019
|
+
// Pre-encoded MERGED handle string in the intercept body comes
|
|
1020
|
+
// from the producer (handles are Flight-encoded so
|
|
1021
|
+
// Promise/ReactNode values survive the wire).
|
|
1022
|
+
const bodies = payloadBodiesFromResult(result);
|
|
1023
|
+
devPrerenderCache.set(routerInstance, keyMain, bodies.main);
|
|
1024
|
+
devPrerenderCache.set(
|
|
1025
|
+
routerInstance,
|
|
1026
|
+
keyIntercept,
|
|
1027
|
+
bodies.intercept,
|
|
1028
|
+
);
|
|
956
1029
|
res.setHeader("content-type", "application/json");
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
payload = {
|
|
960
|
-
segments: [...result.segments, ...result.interceptSegments],
|
|
961
|
-
// Pre-encoded MERGED handle string from the producer (handles are
|
|
962
|
-
// Flight-encoded so Promise/ReactNode values survive the wire).
|
|
963
|
-
handles: result.interceptHandles ?? "",
|
|
964
|
-
};
|
|
965
|
-
} else {
|
|
966
|
-
payload = { segments: result.segments, handles: result.handles };
|
|
967
|
-
}
|
|
968
|
-
res.end(JSON.stringify(payload));
|
|
1030
|
+
res.setHeader("x-rango-prerender-cache", "MISS");
|
|
1031
|
+
res.end(wantIntercept ? bodies.intercept : bodies.main);
|
|
969
1032
|
logResult(200, `match ${result.routeName}`);
|
|
970
1033
|
return;
|
|
971
1034
|
} catch (err: any) {
|