@rangojs/router 0.0.0-experimental.15 → 0.0.0-experimental.151
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +13 -0
- package/README.md +308 -451
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +1844 -237
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/{src/handles/index.ts → dist/handles/index.js} +1 -1
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -8
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +7554 -2070
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +142 -61
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +489 -0
- package/skills/caching/SKILL.md +413 -26
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +278 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +16 -18
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +96 -63
- package/skills/fonts/SKILL.md +7 -5
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +76 -436
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +215 -16
- package/skills/layout/SKILL.md +147 -7
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +629 -55
- package/skills/middleware/SKILL.md +251 -38
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +60 -21
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +296 -4
- package/skills/ppr/SKILL.md +658 -0
- package/skills/prerender/SKILL.md +487 -52
- package/skills/rango/SKILL.md +324 -29
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +264 -122
- package/skills/route/SKILL.md +359 -22
- package/skills/router-setup/SKILL.md +247 -34
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +126 -222
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +10 -9
- package/skills/typesafety/SKILL.md +45 -496
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +383 -0
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +77 -44
- package/src/bin/rango.ts +275 -29
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +348 -212
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +39 -0
- package/src/browser/merge-segment-loaders.ts +23 -13
- package/src/browser/navigation-bridge.ts +385 -576
- package/src/browser/navigation-client.ts +249 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +230 -124
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +88 -0
- package/src/browser/partial-update.ts +432 -365
- package/src/browser/prefetch/cache.ts +381 -0
- package/src/browser/prefetch/fetch.ts +462 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +209 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +284 -67
- package/src/browser/react/NavigationProvider.tsx +267 -109
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +70 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +272 -60
- package/src/browser/react/location-state.ts +90 -20
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +39 -13
- package/src/browser/react/use-navigation.ts +53 -69
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +164 -0
- package/src/browser/rsc-router.tsx +355 -73
- package/src/browser/scroll-restoration.ts +140 -50
- package/src/browser/segment-reconciler.ts +253 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +668 -613
- package/src/browser/types.ts +235 -51
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +243 -183
- package/src/build/generate-route-types.ts +41 -848
- package/src/build/index.ts +12 -7
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +218 -80
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +105 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +812 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +144 -0
- package/src/build/route-types/router-processing.ts +695 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +223 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +88 -0
- package/src/cache/cache-policy.ts +199 -0
- package/src/cache/cache-runtime.ts +695 -0
- package/src/cache/cache-scope.ts +324 -335
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2602 -156
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +17 -17
- package/src/cache/document-cache.ts +226 -102
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +132 -0
- package/src/cache/index.ts +24 -35
- package/src/cache/memory-segment-store.ts +446 -30
- package/src/cache/profile-registry.ts +88 -0
- package/src/cache/read-through-swr.ts +178 -0
- package/src/cache/segment-codec.ts +295 -0
- package/src/cache/shell-snapshot.ts +464 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +283 -211
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1201 -0
- package/src/client.rsc.tsx +43 -21
- package/src/client.tsx +131 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +13 -3
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +4 -2
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +106 -10
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +110 -35
- package/src/handles/MetaTags.tsx +83 -59
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +44 -53
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +20 -65
- package/src/host/errors.ts +21 -30
- package/src/host/index.ts +13 -9
- package/src/host/pattern-matcher.ts +50 -79
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +180 -35
- package/src/index.ts +245 -73
- package/src/internal-debug.ts +9 -2
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/build-shell-capture.ts +447 -0
- package/src/prerender/param-hash.ts +16 -14
- package/src/prerender/shell-manifest-key.ts +20 -0
- package/src/prerender/store.ts +131 -22
- package/src/prerender.ts +460 -26
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +22 -77
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +88 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +54 -0
- package/src/route-definition/redirect.ts +134 -0
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-definition.ts +1 -1481
- package/src/route-map-builder.ts +120 -145
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +71 -45
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +305 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +54 -27
- package/src/router/find-match.ts +259 -0
- package/src/router/handler-context.ts +385 -125
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +88 -28
- package/src/router/lazy-includes.ts +260 -0
- package/src/router/loader-resolution.ts +449 -157
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +144 -62
- package/src/router/match-api.ts +224 -256
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +499 -0
- package/src/router/match-middleware/background-revalidation.ts +117 -93
- package/src/router/match-middleware/cache-lookup.ts +308 -150
- package/src/router/match-middleware/cache-store.ts +123 -51
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +143 -52
- package/src/router/metrics.ts +235 -29
- package/src/router/middleware-types.ts +110 -0
- package/src/router/middleware.ts +526 -441
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +311 -142
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +575 -0
- package/src/router/preview-match.ts +102 -0
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +203 -62
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +45 -48
- package/src/router/router-interfaces.ts +564 -0
- package/src/router/router-options.ts +784 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +812 -0
- package/src/router/segment-resolution/helpers.ts +348 -0
- package/src/router/segment-resolution/loader-cache.ts +315 -0
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +99 -0
- package/src/router/segment-resolution/revalidation.ts +1340 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +25 -1354
- package/src/router/segment-wrappers.ts +292 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +259 -0
- package/src/router/telemetry.ts +385 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +240 -61
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +795 -2390
- package/src/rsc/capture-queue.ts +67 -0
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +956 -1164
- package/src/rsc/helpers.ts +736 -19
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +305 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +23 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +541 -0
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +257 -0
- package/src/rsc/rsc-rendering.ts +856 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +525 -0
- package/src/rsc/shell-build-manifest.ts +316 -0
- package/src/rsc/shell-capture-constants.ts +27 -0
- package/src/rsc/shell-capture.ts +1716 -0
- package/src/rsc/shell-serve.ts +226 -0
- package/src/rsc/ssr-setup.ts +176 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +95 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +99 -82
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-fragments.ts +124 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +464 -135
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +640 -85
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +337 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +123 -42
- package/src/server/loader-registry.ts +51 -100
- package/src/server/request-context.ts +1069 -152
- package/src/server.ts +15 -8
- package/src/ssr/index.tsx +661 -140
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/preinit-client-references.ts +106 -0
- package/src/ssr/ssr-root.tsx +261 -0
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +380 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +371 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +219 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +76 -98
- package/src/theme/ThemeScript.tsx +12 -14
- package/src/theme/constants.ts +57 -15
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +43 -39
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +850 -0
- package/src/types/index.ts +81 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +138 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +271 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +162 -0
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +44 -0
- package/src/urls/path-helper-types.ts +418 -0
- package/src/urls/path-helper.ts +280 -0
- package/src/urls/pattern-types.ts +189 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +316 -0
- package/src/urls/urls-function.ts +80 -0
- package/src/urls.ts +1 -1352
- package/src/use-loader.tsx +406 -141
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +408 -0
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +483 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/shell-prerender-phase.ts +397 -0
- package/src/vite/discovery/state.ts +205 -0
- package/src/vite/discovery/virtual-module-codegen.ts +293 -0
- package/src/vite/index.ts +31 -2255
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +336 -0
- package/src/vite/plugins/cjs-to-esm.ts +90 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
- package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +805 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +94 -0
- package/src/vite/plugins/version-plugin.ts +271 -0
- package/src/vite/plugins/virtual-entries.ts +267 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +600 -0
- package/src/vite/router-discovery.ts +2120 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +268 -0
- package/src/vite/utils/shared-utils.ts +271 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/src/server/context.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
2
|
import type { ReactNode } from "react";
|
|
3
|
-
import type {
|
|
4
|
-
|
|
3
|
+
import type {
|
|
4
|
+
PartialCacheOptions,
|
|
5
|
+
ErrorBoundaryHandler,
|
|
6
|
+
Handler,
|
|
7
|
+
LoaderDefinition,
|
|
8
|
+
MiddlewareFn,
|
|
9
|
+
NotFoundBoundaryHandler,
|
|
10
|
+
ShouldRevalidateFn,
|
|
11
|
+
TransitionConfig,
|
|
12
|
+
} from "../types";
|
|
13
|
+
import { invariant, DslContextError } from "../errors";
|
|
14
|
+
import type { DefaultRouteName } from "../types/global-namespace.js";
|
|
5
15
|
|
|
6
16
|
// ============================================================================
|
|
7
17
|
// Performance Metrics Types
|
|
@@ -13,9 +23,11 @@ import { invariant } from "../errors";
|
|
|
13
23
|
* @internal This type is an implementation detail and may change without notice.
|
|
14
24
|
*/
|
|
15
25
|
export interface PerformanceMetric {
|
|
16
|
-
label: string;
|
|
17
|
-
duration: number;
|
|
18
|
-
startTime: number;
|
|
26
|
+
label: string; // e.g., "route-matching", "loader:UserLoader"
|
|
27
|
+
duration: number; // milliseconds
|
|
28
|
+
startTime: number; // relative to request start
|
|
29
|
+
depth?: number; // nesting level for hierarchical display (0 = top-level)
|
|
30
|
+
desc?: string; // free-form outcome detail, emitted as Server-Timing desc="..."
|
|
19
31
|
}
|
|
20
32
|
|
|
21
33
|
/**
|
|
@@ -29,7 +41,7 @@ export interface MetricsStore {
|
|
|
29
41
|
metrics: PerformanceMetric[];
|
|
30
42
|
}
|
|
31
43
|
// ============================================================================
|
|
32
|
-
//
|
|
44
|
+
// Rango Context
|
|
33
45
|
// ============================================================================
|
|
34
46
|
|
|
35
47
|
/**
|
|
@@ -60,6 +72,10 @@ export type EntryPropCommon = {
|
|
|
60
72
|
};
|
|
61
73
|
|
|
62
74
|
/**
|
|
75
|
+
* Attachments resolved by walking the parent chain, not owned by the entry:
|
|
76
|
+
* middleware composes downward; revalidate and the error/notFound boundaries are
|
|
77
|
+
* resolved by nearest-ancestor lookup. Inherited, not a single execution chain.
|
|
78
|
+
*
|
|
63
79
|
* @internal This type is an implementation detail and may change without notice.
|
|
64
80
|
*/
|
|
65
81
|
export type EntryPropDatas = {
|
|
@@ -69,6 +85,16 @@ export type EntryPropDatas = {
|
|
|
69
85
|
notFoundBoundary: (ReactNode | NotFoundBoundaryHandler)[];
|
|
70
86
|
};
|
|
71
87
|
|
|
88
|
+
/**
|
|
89
|
+
* Render-time presentation fields shared by every entry variant.
|
|
90
|
+
*
|
|
91
|
+
* @internal This type is an implementation detail and may change without notice.
|
|
92
|
+
*/
|
|
93
|
+
export type EntryPropRender = {
|
|
94
|
+
loading?: ReactNode | false;
|
|
95
|
+
transition?: TransitionConfig;
|
|
96
|
+
};
|
|
97
|
+
|
|
72
98
|
/**
|
|
73
99
|
* Loader entry stored in EntryData
|
|
74
100
|
* Contains the loader definition and its revalidation rules
|
|
@@ -105,12 +131,14 @@ export type InterceptSegmentsState = {
|
|
|
105
131
|
* @internal This type is an implementation detail and may change without notice.
|
|
106
132
|
*/
|
|
107
133
|
export type InterceptSelectorContext<TEnv = any> = {
|
|
108
|
-
from: URL;
|
|
109
|
-
to: URL;
|
|
110
|
-
params: Record<string, string>;
|
|
111
|
-
request: Request;
|
|
112
|
-
env: TEnv;
|
|
113
|
-
segments: InterceptSegmentsState;
|
|
134
|
+
from: URL; // Source URL (where user is coming from)
|
|
135
|
+
to: URL; // Destination URL (where user is navigating to)
|
|
136
|
+
params: Record<string, string>; // Matched route params
|
|
137
|
+
request: Request; // The HTTP request object
|
|
138
|
+
env: TEnv; // Platform bindings (Cloudflare env, etc.)
|
|
139
|
+
segments: InterceptSegmentsState; // Client's current segments (where navigating FROM)
|
|
140
|
+
fromRouteName?: DefaultRouteName; // Named route being navigated away from (undefined for unnamed routes)
|
|
141
|
+
toRouteName?: DefaultRouteName; // Named route being navigated to (undefined for unnamed routes)
|
|
114
142
|
};
|
|
115
143
|
|
|
116
144
|
/**
|
|
@@ -119,7 +147,22 @@ export type InterceptSelectorContext<TEnv = any> = {
|
|
|
119
147
|
*
|
|
120
148
|
* @internal This type is an implementation detail and may change without notice.
|
|
121
149
|
*/
|
|
122
|
-
export type InterceptWhenFn<TEnv = any> = (
|
|
150
|
+
export type InterceptWhenFn<TEnv = any> = (
|
|
151
|
+
ctx: InterceptSelectorContext<TEnv>,
|
|
152
|
+
) => boolean;
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Config object passed to intercept() (its 4th argument). `when` gates whether
|
|
156
|
+
* the intercept activates on a soft navigation — a single match-time selector or
|
|
157
|
+
* an array of them (ALL must return true; omit to always activate). This is the
|
|
158
|
+
* intercept counterpart to transition({ when }); both express conditional
|
|
159
|
+
* behavior as a config field rather than a separate DSL helper.
|
|
160
|
+
*
|
|
161
|
+
* @internal This type is an implementation detail and may change without notice.
|
|
162
|
+
*/
|
|
163
|
+
export interface InterceptConfig<TEnv = any> {
|
|
164
|
+
when?: InterceptWhenFn<TEnv> | InterceptWhenFn<TEnv>[];
|
|
165
|
+
}
|
|
123
166
|
|
|
124
167
|
/**
|
|
125
168
|
* Intercept entry stored in EntryData
|
|
@@ -128,8 +171,8 @@ export type InterceptWhenFn<TEnv = any> = (ctx: InterceptSelectorContext<TEnv>)
|
|
|
128
171
|
* @internal This type is an implementation detail and may change without notice.
|
|
129
172
|
*/
|
|
130
173
|
export type InterceptEntry = {
|
|
131
|
-
slotName: `@${string}`;
|
|
132
|
-
routeName: string;
|
|
174
|
+
slotName: `@${string}`; // e.g., "@modal"
|
|
175
|
+
routeName: string; // e.g., "card"
|
|
133
176
|
handler: ReactNode | Handler<any, any, any>;
|
|
134
177
|
middleware: MiddlewareFn<any, any>[];
|
|
135
178
|
revalidate: ShouldRevalidateFn<any, any>[];
|
|
@@ -137,14 +180,34 @@ export type InterceptEntry = {
|
|
|
137
180
|
notFoundBoundary: (ReactNode | NotFoundBoundaryHandler)[];
|
|
138
181
|
loader: LoaderEntry[];
|
|
139
182
|
loading?: ReactNode | false;
|
|
140
|
-
|
|
141
|
-
|
|
183
|
+
transition?: TransitionConfig;
|
|
184
|
+
layout?: ReactNode | Handler<any, any, any>; // Wrapper layout with <Outlet /> for content
|
|
185
|
+
when: InterceptWhenFn[]; // Selector conditions - all must return true to intercept
|
|
142
186
|
};
|
|
143
187
|
|
|
188
|
+
export interface ParallelEntryData
|
|
189
|
+
extends EntryPropCommon, EntryPropDatas, EntryPropSegments, EntryPropRender {
|
|
190
|
+
type: "parallel";
|
|
191
|
+
handler: Record<`@${string}`, Handler<any, any, any> | ReactNode>;
|
|
192
|
+
/** Set when any parallel slot is a Static definition */
|
|
193
|
+
isStaticPrerender?: true;
|
|
194
|
+
/** Per-slot static handler $$ids for build-time store lookup */
|
|
195
|
+
staticHandlerIds?: Record<string, string>;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export type ParallelEntries = Partial<Record<`@${string}`, ParallelEntryData>>;
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* This entry's own structural children plus its owned loaders. `loader` lives
|
|
202
|
+
* here (not in EntryPropDatas) because loaders are owned by the entry, not
|
|
203
|
+
* inherited from ancestors.
|
|
204
|
+
*
|
|
205
|
+
* @internal This type is an implementation detail and may change without notice.
|
|
206
|
+
*/
|
|
144
207
|
export type EntryPropSegments = {
|
|
145
208
|
loader: LoaderEntry[];
|
|
146
209
|
layout: EntryData[];
|
|
147
|
-
parallel:
|
|
210
|
+
parallel: ParallelEntries; // slot -> parallel entry (same entry may back multiple slots)
|
|
148
211
|
intercept: InterceptEntry[]; // intercept definitions for soft navigation
|
|
149
212
|
};
|
|
150
213
|
|
|
@@ -152,46 +215,56 @@ export type EntryData =
|
|
|
152
215
|
| ({
|
|
153
216
|
type: "route";
|
|
154
217
|
handler: Handler<any, any, any>;
|
|
155
|
-
loading?: ReactNode | false;
|
|
156
218
|
/** URL pattern for this route (used by path() in urls()) */
|
|
157
219
|
pattern?: string;
|
|
158
220
|
/** Set when handler is a Prerender definition */
|
|
159
221
|
isPrerender?: true;
|
|
160
222
|
/** Original PrerenderHandlerDefinition (for build-time getParams access) */
|
|
161
|
-
prerenderDef?: {
|
|
223
|
+
prerenderDef?: {
|
|
224
|
+
getParams?: (ctx: any) => Promise<any[]> | any[];
|
|
225
|
+
options?: { concurrency?: number };
|
|
226
|
+
};
|
|
227
|
+
/** Set when route is wrapped with Passthrough() — has a separate live handler */
|
|
228
|
+
isPassthrough?: true;
|
|
229
|
+
/** Live handler for runtime fallback (only set on Passthrough routes) */
|
|
230
|
+
liveHandler?: Handler<any, any, any>;
|
|
162
231
|
/** Set when handler is a Static definition (build-time only) */
|
|
163
232
|
isStaticPrerender?: true;
|
|
233
|
+
/** Static handler $$id for build-time store lookup */
|
|
234
|
+
staticHandlerId?: string;
|
|
164
235
|
/** Response type for non-RSC routes (json, text, image, any) */
|
|
165
236
|
responseType?: string;
|
|
237
|
+
/**
|
|
238
|
+
* PPR (partial pre-rendering) opt-in from the path() `ppr` option. A
|
|
239
|
+
* document-level property of the page route: `true` uses the default
|
|
240
|
+
* shell policy, an object carries ttl/swr/tags. Read by the integrated
|
|
241
|
+
* PPR serve path (rsc/shell-serve.ts resolvePprConfig).
|
|
242
|
+
*/
|
|
243
|
+
ppr?: boolean | import("../urls/pattern-types.js").PartialPrerenderProps;
|
|
166
244
|
} & EntryPropCommon &
|
|
167
245
|
EntryPropDatas &
|
|
168
|
-
EntryPropSegments
|
|
246
|
+
EntryPropSegments &
|
|
247
|
+
EntryPropRender)
|
|
169
248
|
| ({
|
|
170
249
|
type: "layout";
|
|
171
250
|
handler: ReactNode | Handler<any, any, any>;
|
|
172
|
-
loading?: ReactNode | false;
|
|
173
251
|
/** Set when handler is a Static definition (build-time only) */
|
|
174
252
|
isStaticPrerender?: true;
|
|
253
|
+
/** Static handler $$id for build-time store lookup */
|
|
254
|
+
staticHandlerId?: string;
|
|
175
255
|
} & EntryPropCommon &
|
|
176
256
|
EntryPropDatas &
|
|
177
|
-
EntryPropSegments
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
handler: Record<`@${string}`, Handler<any, any, any> | ReactNode>;
|
|
181
|
-
loading?: ReactNode | false;
|
|
182
|
-
/** Set when any parallel slot is a Static definition */
|
|
183
|
-
isStaticPrerender?: true;
|
|
184
|
-
} & EntryPropCommon &
|
|
185
|
-
EntryPropDatas &
|
|
186
|
-
EntryPropSegments)
|
|
257
|
+
EntryPropSegments &
|
|
258
|
+
EntryPropRender)
|
|
259
|
+
| ParallelEntryData
|
|
187
260
|
| ({
|
|
188
261
|
type: "cache";
|
|
189
262
|
/** Cache entries create cache boundaries and render like layouts (with Outlet) */
|
|
190
263
|
handler: ReactNode | Handler<any, any, any>;
|
|
191
|
-
loading?: ReactNode | false;
|
|
192
264
|
} & EntryPropCommon &
|
|
193
265
|
EntryPropDatas &
|
|
194
|
-
EntryPropSegments
|
|
266
|
+
EntryPropSegments &
|
|
267
|
+
EntryPropRender);
|
|
195
268
|
|
|
196
269
|
/**
|
|
197
270
|
* Tracked include info for build-time manifest generation
|
|
@@ -204,6 +277,17 @@ export interface TrackedInclude {
|
|
|
204
277
|
lazy: boolean;
|
|
205
278
|
}
|
|
206
279
|
|
|
280
|
+
/**
|
|
281
|
+
* Cached response-header write scope (issue #713). `kind` selects the error
|
|
282
|
+
* wording; `routeKey` names the route in the error.
|
|
283
|
+
*
|
|
284
|
+
* @internal This type is an implementation detail and may change without notice.
|
|
285
|
+
*/
|
|
286
|
+
export type CachedHeaderScope = {
|
|
287
|
+
kind: "cache" | "ppr";
|
|
288
|
+
routeKey?: string;
|
|
289
|
+
};
|
|
290
|
+
|
|
207
291
|
/**
|
|
208
292
|
* Context stored in AsyncLocalStorage
|
|
209
293
|
*/
|
|
@@ -229,13 +313,72 @@ interface HelperContext {
|
|
|
229
313
|
urlPrefix?: string;
|
|
230
314
|
/** Name prefix from include() - applied to all named routes */
|
|
231
315
|
namePrefix?: string;
|
|
316
|
+
/** True when this scope is at root level (no named include boundary above).
|
|
317
|
+
* Routes at root scope allow dot-local reverse to fall back to bare names. */
|
|
318
|
+
rootScoped?: boolean;
|
|
232
319
|
/** Run helper for cleaner middleware code */
|
|
233
320
|
run?: <T>(fn: () => T | Promise<T>) => T | Promise<T>;
|
|
234
321
|
/** Tracked includes for build-time manifest generation */
|
|
235
322
|
trackedIncludes?: TrackedInclude[];
|
|
323
|
+
/** Cache profiles for DSL-time cache("profileName") resolution */
|
|
324
|
+
cacheProfiles?: Record<
|
|
325
|
+
string,
|
|
326
|
+
import("../cache/profile-registry.js").CacheProfile
|
|
327
|
+
>;
|
|
328
|
+
/** True when resolving handlers inside a cache() DSL boundary.
|
|
329
|
+
* Read by ctx.get() to guard non-cacheable variable reads. */
|
|
330
|
+
insideCacheScope?: boolean;
|
|
331
|
+
/**
|
|
332
|
+
* RULE (issue #713): in any cached scenario ONLY MIDDLEWARE writes response
|
|
333
|
+
* headers. Latched by the segment funnels, consulted by
|
|
334
|
+
* assertCachedHeaderWriteAllowed(); full doctrine in
|
|
335
|
+
* docs/design/ppr-shell-resume.md "The header doctrine".
|
|
336
|
+
*/
|
|
337
|
+
cachedHeaderScope?: CachedHeaderScope;
|
|
338
|
+
/**
|
|
339
|
+
* Include scope string applied to direct-descendant shortCodes.
|
|
340
|
+
*
|
|
341
|
+
* Each `include(...)` call allocates a sibling-positional token like `I0`,
|
|
342
|
+
* `I1` from its parent's include counter and stores the composed scope
|
|
343
|
+
* (`${parentScope}I${idx}`) in its lazyContext. When the include's handler
|
|
344
|
+
* evaluates lazily, the store's `includeScope` is set from that context so
|
|
345
|
+
* every direct-descendant shortCode is generated as
|
|
346
|
+
* `${parent.shortCode}${includeScope}${prefix}${index}` — preventing
|
|
347
|
+
* collisions with siblings declared outside the include.
|
|
348
|
+
*
|
|
349
|
+
* The scope is NOT propagated through `store.run(...)`, so layouts /
|
|
350
|
+
* parallels / caches inside the include absorb the scope into their own
|
|
351
|
+
* shortCodes and their children start fresh.
|
|
352
|
+
*/
|
|
353
|
+
includeScope?: string;
|
|
354
|
+
}
|
|
355
|
+
// Use a global symbol key so the AsyncLocalStorage instance survives HMR
|
|
356
|
+
// module re-evaluation. Without this, Vite's RSC module runner may create
|
|
357
|
+
// a new instance when context.ts is re-evaluated, while other modules still
|
|
358
|
+
// hold references to the old instance — causing getStore() to return
|
|
359
|
+
// undefined even inside a run() callback.
|
|
360
|
+
const RSC_CONTEXT_KEY = Symbol.for("rangojs-router:rsc-context");
|
|
361
|
+
export const RangoContext: AsyncLocalStorage<HelperContext> = ((
|
|
362
|
+
globalThis as any
|
|
363
|
+
)[RSC_CONTEXT_KEY] ??= new AsyncLocalStorage<HelperContext>());
|
|
364
|
+
|
|
365
|
+
/** shortCode prefix letter per entry type (e.g. "L0", "R2", "M1C0"). */
|
|
366
|
+
const SHORT_CODE_PREFIX: Record<
|
|
367
|
+
"layout" | "parallel" | "route" | "loader" | "cache",
|
|
368
|
+
string
|
|
369
|
+
> = {
|
|
370
|
+
layout: "L",
|
|
371
|
+
parallel: "P",
|
|
372
|
+
route: "R",
|
|
373
|
+
loader: "D",
|
|
374
|
+
cache: "C",
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
/** Post-increment a named per-store counter, returning the prior value. */
|
|
378
|
+
function bumpCounter(store: HelperContext, key: string): number {
|
|
379
|
+
store.counters[key] ??= 0;
|
|
380
|
+
return store.counters[key]++;
|
|
236
381
|
}
|
|
237
|
-
export const RSCRouterContext: AsyncLocalStorage<HelperContext> =
|
|
238
|
-
new AsyncLocalStorage<HelperContext>();
|
|
239
382
|
|
|
240
383
|
export const getContext = (): {
|
|
241
384
|
context: AsyncLocalStorage<HelperContext>;
|
|
@@ -243,29 +386,29 @@ export const getContext = (): {
|
|
|
243
386
|
getParent: () => EntryData | null;
|
|
244
387
|
getOrCreateStore: (forRoute?: string) => HelperContext;
|
|
245
388
|
getNextIndex: (
|
|
246
|
-
type: (string & {}) | "layout" | "parallel" | "middleware" | "revalidate"
|
|
389
|
+
type: (string & {}) | "layout" | "parallel" | "middleware" | "revalidate",
|
|
247
390
|
) => string;
|
|
248
391
|
getShortCode: (
|
|
249
|
-
type: "layout" | "parallel" | "route" | "loader" | "cache"
|
|
392
|
+
type: "layout" | "parallel" | "route" | "loader" | "cache",
|
|
250
393
|
) => string;
|
|
251
394
|
run: <T>(
|
|
252
395
|
namespace: string,
|
|
253
396
|
parent: EntryData | null,
|
|
254
|
-
callback: (...args: any[]) => T
|
|
397
|
+
callback: (...args: any[]) => T,
|
|
255
398
|
) => T;
|
|
256
399
|
runWithStore: <T>(
|
|
257
400
|
store: HelperContext,
|
|
258
401
|
namespace: string,
|
|
259
402
|
parent: EntryData | null,
|
|
260
|
-
callback: (...args: any[]) => T
|
|
403
|
+
callback: (...args: any[]) => T,
|
|
261
404
|
) => T;
|
|
262
405
|
} => {
|
|
263
|
-
const context =
|
|
406
|
+
const context = RangoContext;
|
|
264
407
|
|
|
265
408
|
return {
|
|
266
409
|
context,
|
|
267
410
|
getOrCreateStore: (forRoute?: string): HelperContext => {
|
|
268
|
-
let store =
|
|
411
|
+
let store = RangoContext.getStore();
|
|
269
412
|
if (!store) {
|
|
270
413
|
store = {
|
|
271
414
|
manifest: new Map<string, EntryData>(),
|
|
@@ -285,7 +428,7 @@ export const getContext = (): {
|
|
|
285
428
|
const store = context.getStore();
|
|
286
429
|
if (!store) {
|
|
287
430
|
throw new Error(
|
|
288
|
-
"
|
|
431
|
+
"Rango context store is not available. Make sure to run within Rango context.",
|
|
289
432
|
);
|
|
290
433
|
}
|
|
291
434
|
return store;
|
|
@@ -299,44 +442,46 @@ export const getContext = (): {
|
|
|
299
442
|
return store.parent;
|
|
300
443
|
},
|
|
301
444
|
getNextIndex: (
|
|
302
|
-
type: (string & {}) | "layout" | "parallel" | "middleware" | "revalidate"
|
|
445
|
+
type: (string & {}) | "layout" | "parallel" | "middleware" | "revalidate",
|
|
303
446
|
) => {
|
|
304
447
|
const store = context.getStore();
|
|
305
|
-
invariant(store, "No context
|
|
306
|
-
store
|
|
307
|
-
const index = store.counters[type];
|
|
308
|
-
store.counters[type] = index + 1;
|
|
309
|
-
return `$${type}.${index}`;
|
|
448
|
+
invariant(store, "No context RangoContext available");
|
|
449
|
+
return `$${type}.${bumpCounter(store, type)}`;
|
|
310
450
|
},
|
|
311
|
-
getShortCode: (
|
|
451
|
+
getShortCode: (
|
|
452
|
+
type: "layout" | "parallel" | "route" | "loader" | "cache",
|
|
453
|
+
) => {
|
|
312
454
|
const store = context.getStore();
|
|
313
|
-
invariant(store, "No context
|
|
455
|
+
invariant(store, "No context RangoContext available");
|
|
314
456
|
|
|
315
457
|
const parent = store.parent;
|
|
316
|
-
const prefix = type
|
|
317
|
-
const mountPrefix =
|
|
458
|
+
const prefix = SHORT_CODE_PREFIX[type];
|
|
459
|
+
const mountPrefix =
|
|
460
|
+
store.mountIndex !== undefined ? `M${store.mountIndex}` : "";
|
|
461
|
+
|
|
462
|
+
const includeScope = store.includeScope ?? "";
|
|
318
463
|
|
|
319
464
|
if (!parent) {
|
|
320
465
|
// Root entry: prefix with mount index and use mount-scoped counter
|
|
321
|
-
const counterKey = mountPrefix
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
store
|
|
325
|
-
return `${mountPrefix}${prefix}${index}`;
|
|
466
|
+
const counterKey = mountPrefix
|
|
467
|
+
? `${mountPrefix}_root_${type}`
|
|
468
|
+
: `root_${type}`;
|
|
469
|
+
return `${mountPrefix}${prefix}${bumpCounter(store, counterKey)}`;
|
|
326
470
|
} else {
|
|
327
|
-
// Child entry: use parent-scoped counter
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
471
|
+
// Child entry: use parent-scoped counter with includeScope appended.
|
|
472
|
+
// When we're evaluating a lazy include's direct children, includeScope
|
|
473
|
+
// is a per-include token like "I0" / "I1I0" that partitions the
|
|
474
|
+
// parent's counter namespace so routes inside one include cannot
|
|
475
|
+
// collide with siblings declared outside it.
|
|
476
|
+
const counterKey = `${parent.shortCode}${includeScope}_${type}`;
|
|
477
|
+
return `${parent.shortCode}${includeScope}${prefix}${bumpCounter(store, counterKey)}`;
|
|
333
478
|
}
|
|
334
479
|
},
|
|
335
480
|
runWithStore: <T>(
|
|
336
481
|
store: HelperContext,
|
|
337
482
|
namespace: string,
|
|
338
483
|
parent: EntryData | null,
|
|
339
|
-
callback: (...args: any[]) => T
|
|
484
|
+
callback: (...args: any[]) => T,
|
|
340
485
|
): T => {
|
|
341
486
|
return context.run(
|
|
342
487
|
{
|
|
@@ -353,23 +498,33 @@ export const getContext = (): {
|
|
|
353
498
|
searchSchemas: store.searchSchemas,
|
|
354
499
|
urlPrefix: store.urlPrefix,
|
|
355
500
|
namePrefix: store.namePrefix,
|
|
501
|
+
rootScoped: store.rootScoped,
|
|
356
502
|
trackedIncludes: store.trackedIncludes,
|
|
503
|
+
cacheProfiles: store.cacheProfiles,
|
|
504
|
+
includeScope: store.includeScope,
|
|
505
|
+
// cachedHeaderScope (and insideCacheScope) deliberately NOT copied —
|
|
506
|
+
// the header guard's middleware exemption depends on the latch dying
|
|
507
|
+
// with the funnel scope (see assertCachedHeaderWriteAllowed).
|
|
357
508
|
},
|
|
358
|
-
callback
|
|
509
|
+
callback,
|
|
359
510
|
);
|
|
360
511
|
},
|
|
361
512
|
run: <T>(
|
|
362
513
|
namespace: string,
|
|
363
514
|
parent: EntryData | null,
|
|
364
|
-
callback: (...args: any[]) => T
|
|
515
|
+
callback: (...args: any[]) => T,
|
|
365
516
|
) => {
|
|
366
517
|
const store = context.getStore();
|
|
367
518
|
// Preserve parent counters to ensure globally unique shortCodes
|
|
368
519
|
const counters = store?.counters || {};
|
|
369
520
|
const manifest = store ? store.manifest : new Map<string, EntryData>();
|
|
370
521
|
const patterns = store?.patterns || new Map<string, string>();
|
|
371
|
-
const
|
|
372
|
-
const
|
|
522
|
+
const patternsByPrefix = store?.patternsByPrefix;
|
|
523
|
+
const trailingSlash =
|
|
524
|
+
store?.trailingSlash ||
|
|
525
|
+
new Map<string, "never" | "always" | "ignore">();
|
|
526
|
+
const searchSchemas =
|
|
527
|
+
store?.searchSchemas || new Map<string, Record<string, string>>();
|
|
373
528
|
return context.run(
|
|
374
529
|
{
|
|
375
530
|
manifest,
|
|
@@ -381,18 +536,46 @@ export const getContext = (): {
|
|
|
381
536
|
metrics: store?.metrics,
|
|
382
537
|
isSSR: store?.isSSR,
|
|
383
538
|
patterns,
|
|
539
|
+
patternsByPrefix,
|
|
384
540
|
trailingSlash,
|
|
385
541
|
searchSchemas,
|
|
386
542
|
urlPrefix: store?.urlPrefix,
|
|
387
543
|
namePrefix: store?.namePrefix,
|
|
544
|
+
rootScoped: store?.rootScoped,
|
|
388
545
|
trackedIncludes: store?.trackedIncludes,
|
|
546
|
+
cacheProfiles: store?.cacheProfiles,
|
|
389
547
|
},
|
|
390
|
-
callback
|
|
548
|
+
callback,
|
|
391
549
|
);
|
|
392
550
|
},
|
|
393
551
|
};
|
|
394
552
|
};
|
|
395
553
|
|
|
554
|
+
/**
|
|
555
|
+
* Acquire the active DSL build context, throwing `message` if a helper was
|
|
556
|
+
* called outside a urls()/map() builder. Returns the store API and the live
|
|
557
|
+
* HelperContext so callers avoid a second getContext() lookup.
|
|
558
|
+
*/
|
|
559
|
+
export function requireDslContext(message: string): {
|
|
560
|
+
store: ReturnType<typeof getContext>;
|
|
561
|
+
ctx: HelperContext;
|
|
562
|
+
} {
|
|
563
|
+
const store = getContext();
|
|
564
|
+
const ctx = store.context.getStore();
|
|
565
|
+
if (!ctx) {
|
|
566
|
+
// The only reason the store is absent here is that a route-definition helper
|
|
567
|
+
// ran with no active RangoContext — i.e. outside a urls()/map() builder.
|
|
568
|
+
// Record that as the cause so the throw is self-explanatory, not a bare
|
|
569
|
+
// "must be called inside urls()" with no indication of the mechanism.
|
|
570
|
+
throw new DslContextError(message, {
|
|
571
|
+
cause:
|
|
572
|
+
"RangoContext store is undefined: a route-definition helper was called " +
|
|
573
|
+
"outside an active urls()/map() builder.",
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
return { store, ctx };
|
|
577
|
+
}
|
|
578
|
+
|
|
396
579
|
/**
|
|
397
580
|
* Run a callback with specific URL and name prefixes
|
|
398
581
|
* Used by include() to apply prefixes to nested patterns
|
|
@@ -400,9 +583,9 @@ export const getContext = (): {
|
|
|
400
583
|
export function runWithPrefixes<T>(
|
|
401
584
|
urlPrefix: string,
|
|
402
585
|
namePrefix: string | undefined,
|
|
403
|
-
callback: () => T
|
|
586
|
+
callback: () => T,
|
|
404
587
|
): T {
|
|
405
|
-
const store =
|
|
588
|
+
const store = RangoContext.getStore();
|
|
406
589
|
if (!store) {
|
|
407
590
|
throw new Error("runWithPrefixes must be called within router context");
|
|
408
591
|
}
|
|
@@ -418,19 +601,43 @@ export function runWithPrefixes<T>(
|
|
|
418
601
|
} else {
|
|
419
602
|
combinedUrlPrefix = urlPrefix;
|
|
420
603
|
}
|
|
421
|
-
const combinedNamePrefix =
|
|
422
|
-
|
|
423
|
-
?
|
|
424
|
-
|
|
425
|
-
|
|
604
|
+
const combinedNamePrefix =
|
|
605
|
+
namePrefix !== undefined
|
|
606
|
+
? namePrefix === ""
|
|
607
|
+
? store.namePrefix
|
|
608
|
+
: store.namePrefix
|
|
609
|
+
? `${store.namePrefix}.${namePrefix}`
|
|
610
|
+
: namePrefix
|
|
611
|
+
: store.namePrefix;
|
|
426
612
|
|
|
427
|
-
|
|
613
|
+
// Track root scope for dot-local reverse resolution.
|
|
614
|
+
//
|
|
615
|
+
// The flag answers: "can this route reach bare names at root scope?"
|
|
616
|
+
// It propagates through the include chain:
|
|
617
|
+
//
|
|
618
|
+
// { name: "" } — transparent: inherit parent, default true
|
|
619
|
+
// { name: "foo" } — inherit parent if already set, else create boundary (false)
|
|
620
|
+
// no name — inherit parent unchanged
|
|
621
|
+
//
|
|
622
|
+
// This means { name: "" } + nested { name: "sub" } keeps rootScoped=true
|
|
623
|
+
// (the outer transparent include establishes root access, and the inner
|
|
624
|
+
// named include inherits it). But a direct { name: "sub" } at root gets
|
|
625
|
+
// rootScoped=false (no prior root-access grant, so it creates a boundary).
|
|
626
|
+
const combinedRootScoped =
|
|
627
|
+
namePrefix === ""
|
|
628
|
+
? (store.rootScoped ?? true)
|
|
629
|
+
: namePrefix !== undefined
|
|
630
|
+
? (store.rootScoped ?? false)
|
|
631
|
+
: store.rootScoped;
|
|
632
|
+
|
|
633
|
+
return RangoContext.run(
|
|
428
634
|
{
|
|
429
635
|
...store,
|
|
430
636
|
urlPrefix: combinedUrlPrefix,
|
|
431
637
|
namePrefix: combinedNamePrefix,
|
|
638
|
+
rootScoped: combinedRootScoped,
|
|
432
639
|
},
|
|
433
|
-
callback
|
|
640
|
+
callback,
|
|
434
641
|
);
|
|
435
642
|
}
|
|
436
643
|
|
|
@@ -438,7 +645,7 @@ export function runWithPrefixes<T>(
|
|
|
438
645
|
* Get current URL prefix from context
|
|
439
646
|
*/
|
|
440
647
|
export function getUrlPrefix(): string {
|
|
441
|
-
const store =
|
|
648
|
+
const store = RangoContext.getStore();
|
|
442
649
|
return store?.urlPrefix || "";
|
|
443
650
|
}
|
|
444
651
|
|
|
@@ -446,13 +653,96 @@ export function getUrlPrefix(): string {
|
|
|
446
653
|
* Get current name prefix from context
|
|
447
654
|
*/
|
|
448
655
|
export function getNamePrefix(): string | undefined {
|
|
449
|
-
const store =
|
|
656
|
+
const store = RangoContext.getStore();
|
|
450
657
|
return store?.namePrefix;
|
|
451
658
|
}
|
|
452
659
|
|
|
660
|
+
/**
|
|
661
|
+
* Get whether the current scope is at root level (no named include boundary above).
|
|
662
|
+
* Returns true at root or inside { name: "" } includes, false inside named includes.
|
|
663
|
+
*/
|
|
664
|
+
export function getRootScoped(): boolean {
|
|
665
|
+
const store = RangoContext.getStore();
|
|
666
|
+
return store?.rootScoped ?? true;
|
|
667
|
+
}
|
|
668
|
+
|
|
453
669
|
// Export HelperContext type for use in other modules
|
|
454
670
|
export type { HelperContext };
|
|
455
671
|
|
|
672
|
+
/**
|
|
673
|
+
* Return an isolated copy of a lazy include's captured parent entry.
|
|
674
|
+
*
|
|
675
|
+
* DSL helpers (loader(), middleware(), etc.) mutate ctx.parent in place.
|
|
676
|
+
* Multiple include() scopes capture the *same* syntheticMapRoot as their
|
|
677
|
+
* parent, so without isolation one include's loaders/middleware leak into
|
|
678
|
+
* every other route that shares that root.
|
|
679
|
+
*
|
|
680
|
+
* The clone is shallow: only the mutable arrays are copied so each
|
|
681
|
+
* include pushes to its own list. The rest of the entry (id, shortCode,
|
|
682
|
+
* parent pointer, handler) stays shared, which is correct and cheap.
|
|
683
|
+
*/
|
|
684
|
+
export function getIsolatedLazyParent(
|
|
685
|
+
captured: EntryData | null | undefined,
|
|
686
|
+
): EntryData | null {
|
|
687
|
+
if (!captured) return null;
|
|
688
|
+
return {
|
|
689
|
+
...captured,
|
|
690
|
+
loader: [...captured.loader],
|
|
691
|
+
middleware: [...captured.middleware],
|
|
692
|
+
revalidate: [...captured.revalidate],
|
|
693
|
+
errorBoundary: [...captured.errorBoundary],
|
|
694
|
+
notFoundBoundary: [...captured.notFoundBoundary],
|
|
695
|
+
layout: [...captured.layout],
|
|
696
|
+
parallel: { ...captured.parallel },
|
|
697
|
+
intercept: [...captured.intercept],
|
|
698
|
+
};
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
export function getParallelEntries(
|
|
702
|
+
parallels: ParallelEntries | EntryData[] | undefined,
|
|
703
|
+
): ParallelEntryData[] {
|
|
704
|
+
if (!parallels) return [];
|
|
705
|
+
if (Array.isArray(parallels)) {
|
|
706
|
+
return parallels.filter(
|
|
707
|
+
(entry): entry is ParallelEntryData => entry.type === "parallel",
|
|
708
|
+
);
|
|
709
|
+
}
|
|
710
|
+
return Object.values(parallels).filter(
|
|
711
|
+
(entry): entry is ParallelEntryData => !!entry,
|
|
712
|
+
);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
export function getParallelSlotEntries(
|
|
716
|
+
parallels: ParallelEntries | EntryData[] | undefined,
|
|
717
|
+
): Array<{ slot: `@${string}`; entry: ParallelEntryData }> {
|
|
718
|
+
if (!parallels) return [];
|
|
719
|
+
|
|
720
|
+
if (Array.isArray(parallels)) {
|
|
721
|
+
return getParallelEntries(parallels).flatMap((entry) =>
|
|
722
|
+
(Object.keys(entry.handler) as `@${string}`[]).map((slot) => ({
|
|
723
|
+
slot,
|
|
724
|
+
entry,
|
|
725
|
+
})),
|
|
726
|
+
);
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
return Object.entries(parallels)
|
|
730
|
+
.filter(([, entry]) => !!entry)
|
|
731
|
+
.map(([slot, entry]) => ({
|
|
732
|
+
slot: slot as `@${string}`,
|
|
733
|
+
entry: entry!,
|
|
734
|
+
}));
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
export function getParallelSlotCount(
|
|
738
|
+
parallels: ParallelEntries | EntryData[] | undefined,
|
|
739
|
+
): number {
|
|
740
|
+
if (!parallels) return 0;
|
|
741
|
+
return Array.isArray(parallels)
|
|
742
|
+
? parallels.filter((entry) => entry?.type === "parallel").length
|
|
743
|
+
: Object.keys(parallels).length;
|
|
744
|
+
}
|
|
745
|
+
|
|
456
746
|
// ============================================================================
|
|
457
747
|
// Performance Metrics Helpers
|
|
458
748
|
// ============================================================================
|
|
@@ -468,8 +758,8 @@ export type { HelperContext };
|
|
|
468
758
|
* done(); // Records duration
|
|
469
759
|
* ```
|
|
470
760
|
*/
|
|
471
|
-
export function track(label: string): () => void {
|
|
472
|
-
const store =
|
|
761
|
+
export function track(label: string, depth?: number): () => void {
|
|
762
|
+
const store = RangoContext.getStore();
|
|
473
763
|
|
|
474
764
|
// No-op if context unavailable or metrics not enabled
|
|
475
765
|
if (!store?.metrics?.enabled) {
|
|
@@ -479,7 +769,272 @@ export function track(label: string): () => void {
|
|
|
479
769
|
const startTime = performance.now() - store.metrics.requestStart;
|
|
480
770
|
|
|
481
771
|
return () => {
|
|
482
|
-
const duration =
|
|
483
|
-
|
|
772
|
+
const duration =
|
|
773
|
+
performance.now() - store.metrics!.requestStart - startTime;
|
|
774
|
+
store.metrics!.metrics.push({
|
|
775
|
+
label,
|
|
776
|
+
duration,
|
|
777
|
+
startTime,
|
|
778
|
+
...(depth != null ? { depth } : {}),
|
|
779
|
+
});
|
|
484
780
|
};
|
|
485
781
|
}
|
|
782
|
+
|
|
783
|
+
/**
|
|
784
|
+
* Separate ALS for tracking loader execution scope.
|
|
785
|
+
* Uses a dedicated ALS (not RangoContext) to avoid issues with
|
|
786
|
+
* nested RangoContext.run() calls in Vite's module runner.
|
|
787
|
+
*/
|
|
788
|
+
const LOADER_SCOPE_KEY = Symbol.for("rangojs-router:loader-scope");
|
|
789
|
+
const loaderScopeALS: AsyncLocalStorage<{ active: true }> = ((
|
|
790
|
+
globalThis as any
|
|
791
|
+
)[LOADER_SCOPE_KEY] ??= new AsyncLocalStorage<{ active: true }>());
|
|
792
|
+
|
|
793
|
+
// Purity-only scope: marks that a loader FUNCTION BODY is executing, regardless
|
|
794
|
+
// of how the loader was invoked (DSL via runInsideLoaderScope, or handler-
|
|
795
|
+
// invoked via ctx.use). Consulted by isInsideCacheScope() to exempt
|
|
796
|
+
// request-scoped reads, by getCurrentLoaderBodyId() for guard-warning
|
|
797
|
+
// attribution, and by isInsideHandlerInvokedLoaderBody() for the
|
|
798
|
+
// consumption-lane rule (the shell-capture guard exemption). It deliberately
|
|
799
|
+
// does NOT affect isInsideLoaderScope(), so rendered()/barrier/deadlock
|
|
800
|
+
// gating (which must distinguish DSL from handler-invoked loaders) is
|
|
801
|
+
// unchanged.
|
|
802
|
+
const LOADER_BODY_SCOPE_KEY = Symbol.for("rangojs-router:loader-body-scope");
|
|
803
|
+
const loaderBodyScopeALS: AsyncLocalStorage<{
|
|
804
|
+
active: true;
|
|
805
|
+
loaderId?: string;
|
|
806
|
+
handlerInvoked?: boolean;
|
|
807
|
+
}> = ((globalThis as any)[LOADER_BODY_SCOPE_KEY] ??= new AsyncLocalStorage<{
|
|
808
|
+
active: true;
|
|
809
|
+
loaderId?: string;
|
|
810
|
+
handlerInvoked?: boolean;
|
|
811
|
+
}>());
|
|
812
|
+
|
|
813
|
+
/**
|
|
814
|
+
* Check if the current execution is inside a cache() DSL boundary.
|
|
815
|
+
* Returns false inside loader execution — loaders are always fresh
|
|
816
|
+
* (never cached), so non-cacheable reads are safe.
|
|
817
|
+
*/
|
|
818
|
+
export function isInsideCacheScope(): boolean {
|
|
819
|
+
if (RangoContext.getStore()?.insideCacheScope !== true) return false;
|
|
820
|
+
// Request-scoped READS are exempt in any loader body — DSL loaders re-run on
|
|
821
|
+
// every request (including cache() HITs via resolveLoadersOnly), and a
|
|
822
|
+
// handler-invoked loader body, though skipped with its handler on a HIT,
|
|
823
|
+
// yields a BAKED shared copy in the cached artifact — an accepted
|
|
824
|
+
// consumption-lane tradeoff (#672/#674). This is deliberately BROADER than
|
|
825
|
+
// the WRITE guard (assertCachedHeaderWriteAllowed narrows the cache()
|
|
826
|
+
// exemption to DSL scope, #725): a read bakes-and-accepts, a Set-Cookie/header
|
|
827
|
+
// write drops-and-throws because it has no baked-copy semantics on a HIT.
|
|
828
|
+
if (isInsideAnyLoaderScope()) return false;
|
|
829
|
+
return true;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
/**
|
|
833
|
+
* Check if the current execution is inside a DSL loader scope
|
|
834
|
+
* (wrapped by runInsideLoaderScope). Used by rendered() barrier
|
|
835
|
+
* to distinguish DSL loaders from handler-invoked loaders.
|
|
836
|
+
*/
|
|
837
|
+
export function isInsideLoaderScope(): boolean {
|
|
838
|
+
return loaderScopeALS.getStore()?.active === true;
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
/**
|
|
842
|
+
* Latch the cached header-write scope for the current request. First latch
|
|
843
|
+
* wins: a ppr route latched at the funnel top is not downgraded by a nested
|
|
844
|
+
* cache() entry (the document-scoped wording is the more useful one).
|
|
845
|
+
* Takes scalars so the already-latched path allocates nothing.
|
|
846
|
+
*/
|
|
847
|
+
export function latchCachedHeaderScope(
|
|
848
|
+
kind: CachedHeaderScope["kind"],
|
|
849
|
+
routeKey?: string,
|
|
850
|
+
): void {
|
|
851
|
+
const store = RangoContext.getStore();
|
|
852
|
+
if (store && !store.cachedHeaderScope) {
|
|
853
|
+
store.cachedHeaderScope = { kind, routeKey };
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
/** True inside ANY loader execution — DSL loader scope or a loader body
|
|
858
|
+
* (however invoked). The "loaders always re-run fresh" exemptions key off
|
|
859
|
+
* this. */
|
|
860
|
+
function isInsideAnyLoaderScope(): boolean {
|
|
861
|
+
return (
|
|
862
|
+
loaderScopeALS.getStore()?.active === true ||
|
|
863
|
+
loaderBodyScopeALS.getStore()?.active === true
|
|
864
|
+
);
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
/**
|
|
868
|
+
* The one ppr opt-in predicate: a page route entry that DECLARED `ppr`
|
|
869
|
+
* (`false` and undefined mean plain axis 1). Shared by the serve path
|
|
870
|
+
* (rsc/shell-serve.ts resolvePprConfig) and the header-write latch below so
|
|
871
|
+
* the two layers can never drift on what counts as a ppr route.
|
|
872
|
+
*/
|
|
873
|
+
export function isPprEntry(entry: EntryData): entry is EntryData & {
|
|
874
|
+
type: "route";
|
|
875
|
+
ppr: true | import("../urls/pattern-types.js").PartialPrerenderProps;
|
|
876
|
+
} {
|
|
877
|
+
return (
|
|
878
|
+
entry.type === "route" && entry.ppr !== undefined && entry.ppr !== false
|
|
879
|
+
);
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
/**
|
|
883
|
+
* Latch the ppr header-write scope when the entry chain about to resolve is a
|
|
884
|
+
* `ppr` page route's. Called at the TOP of every segment funnel — unlike
|
|
885
|
+
* cache() (positional: ancestors before the boundary stay writable), ppr is
|
|
886
|
+
* document-scoped: the root layout down to the page bakes into the shared
|
|
887
|
+
* shell, so the whole funnel is cached territory.
|
|
888
|
+
*
|
|
889
|
+
* Checks the LEAF entry only: `entries` is the traverseBack chain
|
|
890
|
+
* [root, ..., manifestEntry], and the serve path reads `ppr` off the same
|
|
891
|
+
* leaf (rsc-rendering.ts: resolvePprConfig(manifestEntry)) — guard and serve
|
|
892
|
+
* share the predicate (isPprEntry) AND the input, so they cannot drift.
|
|
893
|
+
*/
|
|
894
|
+
export function latchPprHeaderScopeForEntries(
|
|
895
|
+
entries: EntryData[],
|
|
896
|
+
routeKey?: string,
|
|
897
|
+
): void {
|
|
898
|
+
const store = RangoContext.getStore();
|
|
899
|
+
if (!store || store.cachedHeaderScope) return;
|
|
900
|
+
const leaf = entries[entries.length - 1];
|
|
901
|
+
if (leaf !== undefined && isPprEntry(leaf)) {
|
|
902
|
+
store.cachedHeaderScope = { kind: "ppr", routeKey };
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
/**
|
|
907
|
+
* RULE (issue #713): in any cached scenario ONLY MIDDLEWARE writes response
|
|
908
|
+
* headers — handler and loader writes throw while a scope is latched; the one
|
|
909
|
+
* exemption is DSL (registered) loaders under plain cache(). A handler-invoked
|
|
910
|
+
* loader body (ctx.use from a handler, never registered with loader()) is
|
|
911
|
+
* skipped with its handler on a HIT and throws like a handler write (#725).
|
|
912
|
+
* Full layer rules and rationale: docs/design/ppr-shell-resume.md "The header
|
|
913
|
+
* doctrine".
|
|
914
|
+
*/
|
|
915
|
+
export function assertCachedHeaderWriteAllowed(
|
|
916
|
+
surface: string,
|
|
917
|
+
surfaceProp?: string | symbol,
|
|
918
|
+
): void {
|
|
919
|
+
const scope = RangoContext.getStore()?.cachedHeaderScope;
|
|
920
|
+
if (!scope) return;
|
|
921
|
+
// Exempt DSL loaders (loaderScopeALS) ONLY. A registered loader re-runs on
|
|
922
|
+
// every cache HIT (fresh.ts runInsideLoaderScope -> cache-lookup.ts
|
|
923
|
+
// resolveLoadersOnly), so its header/cookie writes merge into every response
|
|
924
|
+
// with no MISS/HIT divergence. A handler-invoked loader body has
|
|
925
|
+
// loaderBodyScopeALS active but loaderScopeALS unset (loader-resolution.ts
|
|
926
|
+
// derives isDslLoader from isInsideLoaderScope()); on a HIT the handler is
|
|
927
|
+
// skipped so that loader never re-runs and its write would land only on the
|
|
928
|
+
// MISS — throw it. isInsideLoaderScope() (not isInsideAnyLoaderScope) is the
|
|
929
|
+
// discriminator; the DSL scope ALS survives nested ctx.use bodies, so a
|
|
930
|
+
// handler-invoked loader nested under a DSL loader stays exempt (its DSL
|
|
931
|
+
// parent re-invokes it on every HIT). This is the exempt fast path, so the
|
|
932
|
+
// broad predicate for the error label is deferred to the throw path below.
|
|
933
|
+
if (scope.kind === "cache" && isInsideLoaderScope()) return;
|
|
934
|
+
// Everything below runs only on the throw path — `surfaceProp` exists so
|
|
935
|
+
// callers pass constants and the success path allocates nothing (the full
|
|
936
|
+
// surface, e.g. "ctx.headers.set()", is assembled here). isInsideAnyLoaderScope
|
|
937
|
+
// (broad) labels a now-throwing handler-invoked loader body "loader".
|
|
938
|
+
const fullSurface =
|
|
939
|
+
surfaceProp === undefined ? surface : `${surface}.${String(surfaceProp)}()`;
|
|
940
|
+
const layer = isInsideAnyLoaderScope() ? "loader" : "handler";
|
|
941
|
+
const route = scope.routeKey ? ` (route "${scope.routeKey}")` : "";
|
|
942
|
+
const where =
|
|
943
|
+
scope.kind === "ppr"
|
|
944
|
+
? `on a ppr route${route} — the document shell is cached and replayed`
|
|
945
|
+
: `inside a cache() boundary${route}`;
|
|
946
|
+
// ppr loader writes fail by physics (headers flush before loaders settle);
|
|
947
|
+
// every other throw — a handler, or a handler-invoked loader under cache() —
|
|
948
|
+
// fails because the handler is skipped on a HIT, so key the reason on the
|
|
949
|
+
// scope kind, not the layer.
|
|
950
|
+
const why =
|
|
951
|
+
scope.kind === "ppr" && layer === "loader"
|
|
952
|
+
? "The response headers flush with the shell before loaders settle, so this write is dropped on cache hits."
|
|
953
|
+
: "On a cache hit the handler is skipped, so this write would silently vanish.";
|
|
954
|
+
throw new Error(
|
|
955
|
+
`${fullSurface} cannot be called from a ${layer} ${where}. ${why} ` +
|
|
956
|
+
"Set response headers in route middleware instead — middleware runs " +
|
|
957
|
+
"on every request, including cache hits.",
|
|
958
|
+
);
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
/**
|
|
962
|
+
* Run `fn` inside a loader scope. While active, cache-scope guards
|
|
963
|
+
* are bypassed because loaders are always fresh (never cached) and
|
|
964
|
+
* their side effects (setCookie, header, etc.) are safe.
|
|
965
|
+
*/
|
|
966
|
+
export function runInsideLoaderScope<T>(fn: () => T): T {
|
|
967
|
+
return loaderScopeALS.run({ active: true }, fn);
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
/**
|
|
971
|
+
* Run `fn` inside a loader BODY scope. Marks loader-function execution for the
|
|
972
|
+
* cache-purity guard only (isInsideCacheScope), WITHOUT affecting
|
|
973
|
+
* isInsideLoaderScope()/rendered() gating. Applied to every loader body (DSL
|
|
974
|
+
* and handler-invoked via ctx.use) so request-scoped reads inside a loader
|
|
975
|
+
* never trip the cache-scope guards — loaders always run fresh.
|
|
976
|
+
*/
|
|
977
|
+
export function runInsideLoaderBodyScope<T>(
|
|
978
|
+
fn: () => T,
|
|
979
|
+
loaderId?: string,
|
|
980
|
+
handlerInvoked?: boolean,
|
|
981
|
+
): T {
|
|
982
|
+
return loaderBodyScopeALS.run({ active: true, loaderId, handlerInvoked }, fn);
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
/**
|
|
986
|
+
* The $$id of the loader whose body is currently executing, or undefined
|
|
987
|
+
* outside any loader body. Used by the shell-capture identity guard
|
|
988
|
+
* (cookie-store.ts) so its refusal warning can name the loader that read
|
|
989
|
+
* cookies()/headers() instead of blaming a lane it cannot see — the old
|
|
990
|
+
* hardcoded "bake-lane loader" text misled a live-lane debugging session
|
|
991
|
+
* (issue #672, secondary).
|
|
992
|
+
*/
|
|
993
|
+
export function getCurrentLoaderBodyId(): string | undefined {
|
|
994
|
+
return loaderBodyScopeALS.getStore()?.loaderId;
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
/**
|
|
998
|
+
* True while a HANDLER-invoked loader body (`await ctx.use(Loader)` from a
|
|
999
|
+
* handler, not the DSL segment funnel) is executing. The consumption-lane
|
|
1000
|
+
* rule keys off this: handler consumption yields a BAKED copy in every shared
|
|
1001
|
+
* artifact — cache(), "use cache", and the PPR shell — so the shell-capture
|
|
1002
|
+
* identity guard (cookie-store.ts) permits cookies()/headers() here, exactly
|
|
1003
|
+
* like the cache-purity guards do. DSL segment loaders (live lane masked at
|
|
1004
|
+
* capture, bake lane guarded) never set the flag.
|
|
1005
|
+
*/
|
|
1006
|
+
export function isInsideHandlerInvokedLoaderBody(): boolean {
|
|
1007
|
+
return loaderBodyScopeALS.getStore()?.handlerInvoked === true;
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
// Scope for handle PUSH CALLBACKS (push(() => ...), including async ones).
|
|
1011
|
+
// A push callback's value is stored as-is; if it is a promise it is NOT tracked
|
|
1012
|
+
// by handleStore.settled and does not block segment resolution, so a
|
|
1013
|
+
// ctx.use(loader) made from inside such a callback can never form a rendered()
|
|
1014
|
+
// deadlock. This is an ALS (not a plain boolean) so the exemption survives the
|
|
1015
|
+
// callback's own awaits — an async push callback that resumes after `await`
|
|
1016
|
+
// still reads as "inside a push callback" and stays out of the deadlock guard.
|
|
1017
|
+
const PUSH_CALLBACK_SCOPE_KEY = Symbol.for(
|
|
1018
|
+
"rangojs-router:push-callback-scope",
|
|
1019
|
+
);
|
|
1020
|
+
const pushCallbackScopeALS: AsyncLocalStorage<{ active: true }> = ((
|
|
1021
|
+
globalThis as any
|
|
1022
|
+
)[PUSH_CALLBACK_SCOPE_KEY] ??= new AsyncLocalStorage<{ active: true }>());
|
|
1023
|
+
|
|
1024
|
+
/**
|
|
1025
|
+
* Check if the current execution is inside a handle push callback (sync or an
|
|
1026
|
+
* async callback's continuation). Used by the handler-to-loader deadlock guard
|
|
1027
|
+
* to exempt push-callback continuations.
|
|
1028
|
+
*/
|
|
1029
|
+
export function isInsidePushCallbackScope(): boolean {
|
|
1030
|
+
return pushCallbackScopeALS.getStore()?.active === true;
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
/**
|
|
1034
|
+
* Run `fn` inside a push-callback scope. Wraps the invocation of a handle push
|
|
1035
|
+
* callback so that any ctx.use(loader) it makes — including after one of its own
|
|
1036
|
+
* awaits — is exempt from the deadlock guard.
|
|
1037
|
+
*/
|
|
1038
|
+
export function runInsidePushCallbackScope<T>(fn: () => T): T {
|
|
1039
|
+
return pushCallbackScopeALS.run({ active: true }, fn);
|
|
1040
|
+
}
|