@rangojs/router 0.0.0-experimental.13 → 0.0.0-experimental.130
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 +9 -0
- package/README.md +1040 -5
- 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 +1712 -212
- 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/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/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 +6263 -2733
- 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 +123 -68
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +312 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +486 -0
- package/skills/caching/SKILL.md +349 -24
- package/skills/composability/SKILL.md +197 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +87 -62
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +557 -79
- package/skills/host-router/SKILL.md +278 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +175 -8
- package/skills/layout/SKILL.md +128 -5
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +604 -54
- package/skills/middleware/SKILL.md +213 -37
- package/skills/migrate-nextjs/SKILL.md +584 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +41 -10
- package/skills/observability/SKILL.md +172 -0
- package/skills/parallel/SKILL.md +276 -3
- package/skills/prerender/SKILL.md +432 -52
- package/skills/rango/SKILL.md +313 -21
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +248 -120
- package/skills/route/SKILL.md +287 -21
- package/skills/router-setup/SKILL.md +231 -33
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +129 -0
- package/skills/testing/bindings.md +89 -0
- package/skills/testing/cache-prerender.md +124 -0
- package/skills/testing/client-components.md +122 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +92 -0
- package/skills/testing/handles.md +129 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +121 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +84 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +120 -0
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +547 -107
- package/skills/use-cache/SKILL.md +355 -0
- package/skills/view-transitions/SKILL.md +294 -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 +312 -15
- 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/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +162 -200
- 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 +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +323 -563
- package/src/browser/navigation-client.ts +219 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +104 -112
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +328 -348
- package/src/browser/prefetch/cache.ts +324 -0
- package/src/browser/prefetch/fetch.ts +357 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +194 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +253 -71
- package/src/browser/react/NavigationProvider.tsx +155 -34
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +53 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +260 -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-link-status.ts +6 -9
- package/src/browser/react/use-navigation.ts +44 -68
- 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 +124 -0
- package/src/browser/rsc-router.tsx +290 -72
- package/src/browser/scroll-restoration.ts +132 -49
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +621 -613
- package/src/browser/types.ts +175 -50
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +123 -56
- package/src/build/generate-route-types.ts +41 -1038
- package/src/build/index.ts +9 -6
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +165 -34
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +131 -0
- package/src/build/route-types/router-processing.ts +651 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +220 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +165 -0
- package/src/cache/cache-runtime.ts +444 -0
- package/src/cache/cache-scope.ts +231 -325
- package/src/cache/cache-tag.ts +98 -0
- package/src/cache/cf/cf-cache-store.ts +2644 -75
- package/src/cache/cf/index.ts +17 -17
- package/src/cache/document-cache.ts +172 -92
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +104 -0
- package/src/cache/index.ts +11 -35
- package/src/cache/memory-segment-store.ts +307 -30
- package/src/cache/profile-registry.ts +49 -0
- package/src/cache/read-through-swr.ts +164 -0
- package/src/cache/segment-codec.ts +240 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +94 -211
- package/src/client.rsc.tsx +8 -21
- package/src/client.tsx +123 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +36 -0
- package/src/defer.ts +196 -0
- package/src/deps/ssr.ts +0 -1
- package/src/errors.ts +106 -10
- package/src/handle.ts +76 -23
- package/src/handles/MetaTags.tsx +73 -34
- package/src/handles/breadcrumbs.ts +77 -0
- package/src/handles/meta.ts +30 -52
- package/src/host/cookie-handler.ts +21 -51
- package/src/host/errors.ts +8 -32
- package/src/host/index.ts +12 -9
- package/src/host/pattern-matcher.ts +34 -77
- 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 +174 -34
- package/src/index.ts +241 -73
- package/src/internal-debug.ts +8 -4
- 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/network-error-thrower.tsx +4 -7
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/param-hash.ts +14 -13
- package/src/prerender/store.ts +121 -21
- package/src/prerender.ts +445 -24
- package/src/redirect-origin.ts +100 -0
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +10 -72
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +90 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +135 -0
- package/src/route-definition/resolve-handler-use.ts +161 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-definition.ts +1 -1450
- package/src/route-map-builder.ts +82 -144
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +72 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +215 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +22 -26
- package/src/router/find-match.ts +181 -0
- package/src/router/handler-context.ts +372 -125
- package/src/router/instrument.ts +308 -0
- package/src/router/intercept-resolution.ts +34 -27
- package/src/router/lazy-includes.ts +200 -0
- package/src/router/loader-resolution.ts +381 -147
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +88 -51
- package/src/router/match-api.ts +162 -245
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +90 -89
- package/src/router/match-middleware/cache-lookup.ts +297 -150
- package/src/router/match-middleware/cache-store.ts +75 -33
- 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 +121 -50
- package/src/router/metrics.ts +219 -28
- package/src/router/middleware-types.ts +93 -0
- package/src/router/middleware.ts +421 -413
- package/src/router/navigation-snapshot.ts +131 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +263 -79
- package/src/router/prerender-match.ts +541 -0
- package/src/router/preview-match.ts +100 -0
- package/src/router/request-classification.ts +276 -0
- package/src/router/revalidation.ts +143 -44
- package/src/router/route-snapshot.ts +244 -0
- package/src/router/router-context.ts +41 -47
- package/src/router/router-interfaces.ts +525 -0
- package/src/router/router-options.ts +726 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +748 -0
- package/src/router/segment-resolution/helpers.ts +313 -0
- package/src/router/segment-resolution/loader-cache.ts +207 -0
- package/src/router/segment-resolution/revalidation.ts +1322 -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 +36 -0
- package/src/router/segment-resolution.ts +24 -1354
- package/src/router/segment-wrappers.ts +289 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +261 -0
- package/src/router/telemetry.ts +377 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +172 -60
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +44 -0
- package/src/router.ts +748 -2376
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +861 -1141
- package/src/rsc/helpers.ts +269 -19
- package/src/rsc/index.ts +1 -21
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +235 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +413 -0
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +374 -0
- package/src/rsc/rsc-rendering.ts +261 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +376 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/types.ts +58 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +70 -74
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +134 -0
- package/src/segment-system.tsx +292 -134
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +439 -85
- package/src/server/cookie-store.ts +265 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +112 -31
- package/src/server/loader-registry.ts +23 -82
- package/src/server/request-context.ts +724 -143
- package/src/server.ts +26 -164
- package/src/ssr/index.tsx +113 -36
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +618 -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 +232 -0
- package/src/testing/generated-routes.ts +183 -0
- package/src/testing/index.ts +99 -0
- package/src/testing/internal/context.ts +348 -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 +330 -0
- package/src/testing/render-route.tsx +566 -0
- package/src/testing/run-loader.ts +378 -0
- package/src/testing/run-middleware.ts +205 -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 +21 -67
- package/src/theme/ThemeScript.tsx +5 -11
- package/src/theme/constants.ts +5 -14
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +21 -32
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +839 -0
- package/src/types/index.ts +79 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +107 -0
- package/src/types/route-config.ts +126 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +171 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +160 -0
- package/src/urls/index.ts +43 -0
- package/src/urls/path-helper-types.ts +386 -0
- package/src/urls/path-helper.ts +275 -0
- package/src/urls/pattern-types.ts +124 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +291 -0
- package/src/urls/urls-function.ts +81 -0
- package/src/urls.ts +1 -1323
- package/src/use-loader.tsx +406 -141
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/discover-routers.ts +389 -0
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +467 -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/state.ts +161 -0
- package/src/vite/discovery/virtual-module-codegen.ts +183 -0
- package/src/vite/index.ts +17 -2259
- package/src/vite/plugin-types.ts +221 -0
- package/src/vite/plugins/cjs-to-esm.ts +83 -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} +13 -87
- package/src/vite/plugins/expose-ids/export-analysis.ts +338 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +141 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +57 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +124 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +806 -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/version-injector.ts +79 -0
- package/src/vite/plugins/version-plugin.ts +275 -0
- package/src/vite/plugins/virtual-entries.ts +108 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +444 -0
- package/src/vite/router-discovery.ts +1581 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +193 -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/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 +223 -0
- package/src/vite/utils/shared-utils.ts +219 -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/rsc/helpers.ts
CHANGED
|
@@ -4,7 +4,90 @@
|
|
|
4
4
|
* Utility functions for RSC request handling.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
_getRequestContext,
|
|
9
|
+
getLocationState,
|
|
10
|
+
} from "../server/request-context.js";
|
|
11
|
+
import type { RequestContext } from "../server/request-context.js";
|
|
12
|
+
import { resolveLocationStateEntries } from "../browser/react/location-state-shared.js";
|
|
13
|
+
import { isRedirectResponse } from "../response-utils.js";
|
|
14
|
+
import {
|
|
15
|
+
EXTERNAL_REDIRECT_MARKER,
|
|
16
|
+
isExternalRedirect,
|
|
17
|
+
markExternalRedirect,
|
|
18
|
+
} from "../redirect-origin.js";
|
|
19
|
+
import type { MiddlewareEntry, MiddlewareFn } from "../router/middleware.js";
|
|
20
|
+
import { formatCacheSignalHeader } from "../router/telemetry.js";
|
|
21
|
+
import type { RscPayload } from "./types.js";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* DEVELOPMENT/TEST ONLY. When the debug cache signal gate is on,
|
|
25
|
+
* match/matchPartial populate ctx._cacheSignal. Emit it as the X-Rango-Cache
|
|
26
|
+
* header. When the gate is off, ctx._cacheSignal is undefined and NOTHING is
|
|
27
|
+
* attached — output is byte-identical to the default. Header mutation failures
|
|
28
|
+
* are swallowed so immutable Response headers (e.g. protocol-switch) are safe.
|
|
29
|
+
*/
|
|
30
|
+
function applyCacheSignalHeader(target: Headers, ctx: RequestContext): void {
|
|
31
|
+
const signal = ctx._cacheSignal;
|
|
32
|
+
if (!signal || signal.length === 0) return;
|
|
33
|
+
try {
|
|
34
|
+
target.set("X-Rango-Cache", formatCacheSignalHeader(signal));
|
|
35
|
+
} catch {
|
|
36
|
+
// Headers immutable — skip.
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Copy stub headers from the request context onto a target Headers instance:
|
|
42
|
+
* append Set-Cookie entries, set everything else only if absent. Header
|
|
43
|
+
* mutation failures are swallowed so the same logic works against Response
|
|
44
|
+
* headers that may be immutable (e.g. Cloudflare protocol-switch responses).
|
|
45
|
+
*/
|
|
46
|
+
function applyStubHeaders(target: Headers, stub: Headers): void {
|
|
47
|
+
stub.forEach((value, name) => {
|
|
48
|
+
try {
|
|
49
|
+
// The reserved external-redirect marker is internal and never a trust
|
|
50
|
+
// signal; never copy a stub value (e.g. a stray ctx.header() call) onto a
|
|
51
|
+
// browser-facing response. The opt-in is the out-of-band brand.
|
|
52
|
+
if (name.toLowerCase() === EXTERNAL_REDIRECT_MARKER) return;
|
|
53
|
+
if (name.toLowerCase() === "set-cookie") {
|
|
54
|
+
target.append(name, value);
|
|
55
|
+
} else if (!target.has(name)) {
|
|
56
|
+
target.set(name, value);
|
|
57
|
+
}
|
|
58
|
+
} catch {
|
|
59
|
+
// Headers immutable — skip.
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Drain ctx._onResponseCallbacks onto a response. Swapping the array before
|
|
66
|
+
* iteration prevents re-entrant registrations from double-firing and matches
|
|
67
|
+
* the contract that each callback runs at most once per request.
|
|
68
|
+
*/
|
|
69
|
+
function drainOnResponseCallbacks(
|
|
70
|
+
ctx: RequestContext,
|
|
71
|
+
response: Response,
|
|
72
|
+
): Response {
|
|
73
|
+
const callbacks = ctx._onResponseCallbacks;
|
|
74
|
+
if (callbacks.length === 0) return response;
|
|
75
|
+
ctx._onResponseCallbacks = [];
|
|
76
|
+
// An onResponse callback may return a NEW Response (e.g. to add a header),
|
|
77
|
+
// which drops the out-of-band external-redirect brand (brand is keyed on
|
|
78
|
+
// Response object identity). Preserve a redirect(url, { external: true })
|
|
79
|
+
// opt-in across that rebuild so a callback can't silently neutralize the
|
|
80
|
+
// off-host redirect at the guard chokepoint.
|
|
81
|
+
const wasExternal = isExternalRedirect(response);
|
|
82
|
+
let result = response;
|
|
83
|
+
for (const callback of callbacks) {
|
|
84
|
+
result = callback(result) ?? result;
|
|
85
|
+
}
|
|
86
|
+
if (wasExternal && !isExternalRedirect(result)) {
|
|
87
|
+
markExternalRedirect(result);
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
8
91
|
|
|
9
92
|
/**
|
|
10
93
|
* Check if a request body has content to decode
|
|
@@ -27,38 +110,205 @@ export function hasBodyContent(body: FormData | string): boolean {
|
|
|
27
110
|
*/
|
|
28
111
|
export function createResponseWithMergedHeaders(
|
|
29
112
|
body: BodyInit | null,
|
|
30
|
-
init: ResponseInit
|
|
113
|
+
init: ResponseInit,
|
|
31
114
|
): Response {
|
|
32
|
-
const ctx =
|
|
115
|
+
const ctx = _getRequestContext();
|
|
33
116
|
if (!ctx) {
|
|
34
117
|
return new Response(body, init);
|
|
35
118
|
}
|
|
36
119
|
|
|
37
|
-
//
|
|
120
|
+
// Delete Set-Cookie from the stub after consuming so downstream merge
|
|
121
|
+
// points (e.g. executeMiddleware) don't duplicate them.
|
|
38
122
|
const mergedHeaders = new Headers(init.headers);
|
|
39
|
-
ctx.res.headers
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
} else if (!mergedHeaders.has(name)) {
|
|
43
|
-
// Only set if not already present in init.headers
|
|
44
|
-
mergedHeaders.set(name, value);
|
|
45
|
-
}
|
|
46
|
-
});
|
|
123
|
+
applyStubHeaders(mergedHeaders, ctx.res.headers);
|
|
124
|
+
ctx.res.headers.delete("set-cookie");
|
|
125
|
+
applyCacheSignalHeader(mergedHeaders, ctx);
|
|
47
126
|
|
|
48
|
-
//
|
|
49
|
-
//
|
|
127
|
+
// ctx.res.status overrides init.status when explicitly set (e.g. 404 for
|
|
128
|
+
// notFound, 500 for error). Default ctx.res.status is 200.
|
|
50
129
|
const status = ctx.res.status !== 200 ? ctx.res.status : init.status;
|
|
51
130
|
|
|
52
|
-
|
|
131
|
+
const response = new Response(body, {
|
|
53
132
|
...init,
|
|
54
133
|
status,
|
|
55
134
|
headers: mergedHeaders,
|
|
56
135
|
});
|
|
57
136
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
137
|
+
return drainOnResponseCallbacks(ctx, response);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Create a 204 response with X-RSC-Redirect header for stateless redirects.
|
|
142
|
+
* Used during partial/action requests where fetch would auto-follow a raw
|
|
143
|
+
* 3xx to a URL that renders full HTML instead of Flight data. The 204 status
|
|
144
|
+
* prevents auto-follow; the client reads the header and re-navigates via
|
|
145
|
+
* the router.
|
|
146
|
+
*/
|
|
147
|
+
export function createSimpleRedirectResponse(redirectUrl: string): Response {
|
|
148
|
+
return createResponseWithMergedHeaders(null, {
|
|
149
|
+
status: 204,
|
|
150
|
+
headers: { "X-RSC-Redirect": redirectUrl },
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Carry over headers from a source redirect Response to a wrapper Response.
|
|
156
|
+
* Skips Location and X-RSC-Redirect (intentionally replaced by the wrapper) and
|
|
157
|
+
* appends Set-Cookie to avoid clobbering multiple cookie headers.
|
|
158
|
+
*
|
|
159
|
+
* This is a GENERIC copier used by every redirect-rebuild path (PE
|
|
160
|
+
* extractRedirectResponse, the SPA intercept below, the guard's neutralize
|
|
161
|
+
* rebuild), so it has two redirect-specific jobs:
|
|
162
|
+
*
|
|
163
|
+
* 1. NEVER copy the reserved external-redirect header: it is no longer a trust
|
|
164
|
+
* signal (the opt-in is the out-of-band brand), and a forged value from a
|
|
165
|
+
* proxied upstream must not ride a rebuilt response to the browser.
|
|
166
|
+
* 2. Transfer the out-of-band external brand: a rebuilt document-native redirect
|
|
167
|
+
* has to carry the opt-in to the guard chokepoint, which reads and clears it.
|
|
168
|
+
* Without this transfer, redirect(url, { external: true }) would be silently
|
|
169
|
+
* neutralized on any rebuild path (fail-closed, but a feature regression).
|
|
170
|
+
*/
|
|
171
|
+
export function carryOverRedirectHeaders(
|
|
172
|
+
source: Response,
|
|
173
|
+
target: Response,
|
|
174
|
+
): void {
|
|
175
|
+
source.headers.forEach((value, name) => {
|
|
176
|
+
const lower = name.toLowerCase();
|
|
177
|
+
if (lower === "location" || lower === "x-rsc-redirect") return;
|
|
178
|
+
if (lower === EXTERNAL_REDIRECT_MARKER) return;
|
|
179
|
+
if (lower === "set-cookie") {
|
|
180
|
+
target.headers.append(name, value);
|
|
181
|
+
} else if (!target.headers.has(name)) {
|
|
182
|
+
target.headers.set(name, value);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
if (isExternalRedirect(source)) {
|
|
186
|
+
markExternalRedirect(target);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* If a response is a 3xx redirect during a partial (client-side) request,
|
|
192
|
+
* intercept it and return a Flight-compatible redirect instead.
|
|
193
|
+
* fetch() auto-follows 3xx which would hit a URL that renders full HTML
|
|
194
|
+
* the client can't parse. Returns null if the response is not a redirect.
|
|
195
|
+
*/
|
|
196
|
+
export function interceptRedirectForPartial(
|
|
197
|
+
response: Response,
|
|
198
|
+
createRedirectFlightResponse: (
|
|
199
|
+
redirectUrl: string,
|
|
200
|
+
locationState?: Record<string, unknown>,
|
|
201
|
+
external?: boolean,
|
|
202
|
+
) => Response,
|
|
203
|
+
): Response | null {
|
|
204
|
+
if (!isRedirectResponse(response)) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
const redirectUrl = response.headers.get("Location")!;
|
|
208
|
+
// redirect(url, { external: true }) marks an explicit off-host redirect via
|
|
209
|
+
// the out-of-band brand (not a wire header). On the SPA/action channel the
|
|
210
|
+
// intent must travel as a Flight payload (metadata.redirect.external) so the
|
|
211
|
+
// client does a scheme-validated hard navigation (location.assign) rather than
|
|
212
|
+
// a partial fetch. The client re-validates the scheme; see partial-update.ts.
|
|
213
|
+
const external = isExternalRedirect(response);
|
|
214
|
+
const locationState = getLocationState();
|
|
215
|
+
let intercepted: Response;
|
|
216
|
+
if (locationState) {
|
|
217
|
+
intercepted = createRedirectFlightResponse(
|
|
218
|
+
redirectUrl,
|
|
219
|
+
resolveLocationStateEntries(locationState),
|
|
220
|
+
external,
|
|
221
|
+
);
|
|
222
|
+
} else if (external) {
|
|
223
|
+
intercepted = createRedirectFlightResponse(redirectUrl, undefined, true);
|
|
224
|
+
} else {
|
|
225
|
+
intercepted = createSimpleRedirectResponse(redirectUrl);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
carryOverRedirectHeaders(response, intercepted);
|
|
229
|
+
// Defense-in-depth at the SPA browser-facing exit: carryOverRedirectHeaders
|
|
230
|
+
// already refuses to copy the reserved marker, but strip any value that might
|
|
231
|
+
// exist on `intercepted` so a forged header can never ride the 200/204 to the
|
|
232
|
+
// browser. The external intent travels in metadata.redirect.external (Flight),
|
|
233
|
+
// where the client re-validates the scheme.
|
|
234
|
+
try {
|
|
235
|
+
intercepted.headers.delete(EXTERNAL_REDIRECT_MARKER);
|
|
236
|
+
} catch {
|
|
237
|
+
// Immutable headers: the marker was never copied here, so this is inert.
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return intercepted;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Attach location state set during a request to a payload's metadata.
|
|
245
|
+
* No-op if no location state was set. Callers must ensure payload.metadata
|
|
246
|
+
* is populated (the non-null assertion holds for the partial/action payloads
|
|
247
|
+
* that reach this helper).
|
|
248
|
+
*/
|
|
249
|
+
export function attachLocationStateIfPresent(payload: RscPayload): void {
|
|
250
|
+
const locationState = getLocationState();
|
|
251
|
+
if (locationState) {
|
|
252
|
+
payload.metadata!.locationState =
|
|
253
|
+
resolveLocationStateEntries(locationState);
|
|
61
254
|
}
|
|
255
|
+
}
|
|
62
256
|
|
|
63
|
-
|
|
257
|
+
/**
|
|
258
|
+
* Only cache successful responses. Non-200 statuses (errors, redirects) are
|
|
259
|
+
* not cached -- notFound() produces 500 in response routes, and explicit
|
|
260
|
+
* non-200 Responses are rare enough that caching them would be surprising.
|
|
261
|
+
*/
|
|
262
|
+
export function isCacheableStatus(status: number): boolean {
|
|
263
|
+
return status === 200;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Convert route-level middleware entries to the format expected by
|
|
268
|
+
* executeMiddleware. Route middleware from previewMatch carries just
|
|
269
|
+
* { handler, params }; this wraps them in the full MiddlewareEntry shape.
|
|
270
|
+
*/
|
|
271
|
+
export function buildRouteMiddlewareEntries<TEnv>(
|
|
272
|
+
routeMiddleware: Array<{
|
|
273
|
+
handler: MiddlewareFn;
|
|
274
|
+
params: Record<string, string>;
|
|
275
|
+
}>,
|
|
276
|
+
): Array<{ entry: MiddlewareEntry<TEnv>; params: Record<string, string> }> {
|
|
277
|
+
return routeMiddleware.map((mw) => ({
|
|
278
|
+
entry: {
|
|
279
|
+
pattern: null,
|
|
280
|
+
regex: null,
|
|
281
|
+
paramNames: [],
|
|
282
|
+
handler: mw.handler,
|
|
283
|
+
} as MiddlewareEntry<TEnv>,
|
|
284
|
+
params: mw.params,
|
|
285
|
+
}));
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Merge stub headers from the request context onto an existing Response in
|
|
290
|
+
* place, then drain onResponse callbacks. Used when a Response cannot flow
|
|
291
|
+
* through `new Response()` — status 101 is outside the constructor's
|
|
292
|
+
* 200-599 range, and the Cloudflare-specific `webSocket` property would be
|
|
293
|
+
* lost on reconstruction.
|
|
294
|
+
*/
|
|
295
|
+
export function mergeStubHeadersAndFinalize(response: Response): Response {
|
|
296
|
+
const ctx = _getRequestContext();
|
|
297
|
+
if (!ctx) return response;
|
|
298
|
+
|
|
299
|
+
applyStubHeaders(response.headers, ctx.res.headers);
|
|
300
|
+
ctx.res.headers.delete("set-cookie");
|
|
301
|
+
|
|
302
|
+
return drainOnResponseCallbacks(ctx, response);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Run onResponse callbacks on an existing Response. Used by code paths that
|
|
307
|
+
* bypass createResponseWithMergedHeaders (e.g. middleware short-circuits)
|
|
308
|
+
* but still need ctx.onResponse() callbacks to fire.
|
|
309
|
+
*/
|
|
310
|
+
export function finalizeResponse(response: Response): Response {
|
|
311
|
+
const ctx = _getRequestContext();
|
|
312
|
+
if (!ctx) return response;
|
|
313
|
+
return drainOnResponseCallbacks(ctx, response);
|
|
64
314
|
}
|
package/src/rsc/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Rango - RSC Entry Point
|
|
3
3
|
*
|
|
4
4
|
* This module provides RSC utilities for server-side rendering,
|
|
5
5
|
* server actions, loader fetching, and progressive enhancement.
|
|
@@ -29,28 +29,8 @@ export type {
|
|
|
29
29
|
NonceProvider,
|
|
30
30
|
} from "./types.js";
|
|
31
31
|
|
|
32
|
-
// Re-export HandleStore types for consumers who need custom handling
|
|
33
|
-
export {
|
|
34
|
-
createHandleStore,
|
|
35
|
-
type HandleStore,
|
|
36
|
-
type HandleData,
|
|
37
|
-
} from "../server/handle-store.js";
|
|
38
|
-
|
|
39
32
|
// Re-export request context utilities for server-side access to env/request/params
|
|
40
33
|
export {
|
|
41
34
|
getRequestContext,
|
|
42
35
|
requireRequestContext,
|
|
43
|
-
setRequestContextParams,
|
|
44
36
|
} from "../server/request-context.js";
|
|
45
|
-
|
|
46
|
-
// Re-export cache store types and implementations
|
|
47
|
-
export type {
|
|
48
|
-
SegmentCacheStore,
|
|
49
|
-
CachedEntryData,
|
|
50
|
-
CachedEntryResult,
|
|
51
|
-
SegmentCacheProvider,
|
|
52
|
-
SegmentHandleData,
|
|
53
|
-
} from "../cache/types.js";
|
|
54
|
-
|
|
55
|
-
export { MemorySegmentCacheStore } from "../cache/memory-segment-store.js";
|
|
56
|
-
export { CFCacheStore, type CFCacheStoreOptions } from "../cache/cf/index.js";
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared serialization for `json()` response-route results.
|
|
3
|
+
*
|
|
4
|
+
* Kept in its own lightweight module (depends only on `errors.js`) so the
|
|
5
|
+
* `dispatch()` testing primitive can import it WITHOUT dragging in
|
|
6
|
+
* `response-route-handler.ts`'s heavy runtime graph, which transitively reaches
|
|
7
|
+
* a Vite virtual module and breaks a plain (non-Vite) vitest import.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { RouterError } from "../errors.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Serialize a `json()` response-route result, rejecting a nested unresolved
|
|
14
|
+
* Promise (the forgotten-await footgun: `() => ({ data: fetchSomething() })`).
|
|
15
|
+
* `JSON.stringify` would silently emit `{}` for a Promise, shipping empty data;
|
|
16
|
+
* the RSC pipeline awaits nested promises but this path does not. Throwing
|
|
17
|
+
* `RESPONSE_NOT_SERIALIZABLE` makes the failure loud.
|
|
18
|
+
*
|
|
19
|
+
* Shared by the production response-route handler and the `dispatch()` testing
|
|
20
|
+
* primitive so a `dispatch` json test of a forgotten await fails exactly where
|
|
21
|
+
* production 500s, instead of going green.
|
|
22
|
+
*/
|
|
23
|
+
export function stringifyJsonRouteResult(result: unknown): string {
|
|
24
|
+
return JSON.stringify(result, (_key, value) => {
|
|
25
|
+
if (
|
|
26
|
+
value != null &&
|
|
27
|
+
typeof (value as { then?: unknown }).then === "function"
|
|
28
|
+
) {
|
|
29
|
+
throw new RouterError(
|
|
30
|
+
"RESPONSE_NOT_SERIALIZABLE",
|
|
31
|
+
"A json() response route returned a Promise (likely a forgotten " +
|
|
32
|
+
"await). Await async values before returning so they serialize, " +
|
|
33
|
+
"instead of emitting an empty {}.",
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loader Fetch Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles load() requests (GET, POST, PUT, PATCH, DELETE) from the client.
|
|
5
|
+
* All loader data fetching and mutations go through this endpoint.
|
|
6
|
+
*
|
|
7
|
+
* Route params (e.g. slug from /blog/:slug) come from previewMatch() in the
|
|
8
|
+
* outer coreRequestHandler, threaded through coreRequestHandlerInner as
|
|
9
|
+
* routeParams. This is necessary because handleLoaderFetch doesn't do its
|
|
10
|
+
* own route matching -- the URL is the page's pathname, and previewMatch
|
|
11
|
+
* has already extracted params from it.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { getLoaderLazy } from "../server/loader-registry.js";
|
|
15
|
+
import { executeLoaderMiddleware } from "../router/middleware.js";
|
|
16
|
+
import { requireRequestContext } from "../server/request-context.js";
|
|
17
|
+
import { observePhase, PHASES } from "../router/instrument.js";
|
|
18
|
+
import {
|
|
19
|
+
createReverseFunction,
|
|
20
|
+
stripInternalParams,
|
|
21
|
+
} from "../router/handler-context.js";
|
|
22
|
+
import {
|
|
23
|
+
getGlobalRouteMap,
|
|
24
|
+
getSearchSchema,
|
|
25
|
+
isRouteRootScoped,
|
|
26
|
+
} from "../route-map-builder.js";
|
|
27
|
+
import { parseSearchParams } from "../search-params.js";
|
|
28
|
+
import {
|
|
29
|
+
createResponseWithMergedHeaders,
|
|
30
|
+
finalizeResponse,
|
|
31
|
+
} from "./helpers.js";
|
|
32
|
+
import type { HandlerContext } from "./handler-context.js";
|
|
33
|
+
|
|
34
|
+
export async function handleLoaderFetch<TEnv>(
|
|
35
|
+
ctx: HandlerContext<TEnv>,
|
|
36
|
+
request: Request,
|
|
37
|
+
env: TEnv,
|
|
38
|
+
url: URL,
|
|
39
|
+
variables: Record<string, any>,
|
|
40
|
+
routeParams?: Record<string, string>,
|
|
41
|
+
): Promise<Response> {
|
|
42
|
+
const loaderId = url.searchParams.get("_rsc_loader");
|
|
43
|
+
|
|
44
|
+
if (!loaderId) {
|
|
45
|
+
return createResponseWithMergedHeaders("Missing _rsc_loader parameter", {
|
|
46
|
+
status: 400,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Look up loader lazily
|
|
51
|
+
const registeredLoader = await getLoaderLazy(loaderId);
|
|
52
|
+
if (!registeredLoader) {
|
|
53
|
+
return createResponseWithMergedHeaders(
|
|
54
|
+
`Loader "${loaderId}" not found in registry`,
|
|
55
|
+
{ status: 404 },
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Non-fetchable loaders are registered for SSR ctx.use() only.
|
|
60
|
+
// They must not be callable through the standalone _rsc_loader endpoint.
|
|
61
|
+
if (!registeredLoader.fetchable) {
|
|
62
|
+
return createResponseWithMergedHeaders(
|
|
63
|
+
`Loader "${loaderId}" is not fetchable`,
|
|
64
|
+
{ status: 403 },
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Parse params, body, and formData based on request method and content type
|
|
69
|
+
let loaderParams: Record<string, string> = {};
|
|
70
|
+
let loaderBody: unknown = undefined;
|
|
71
|
+
let loaderFormData: FormData | undefined;
|
|
72
|
+
const isBodyMethod = request.method !== "GET" && request.method !== "HEAD";
|
|
73
|
+
|
|
74
|
+
if (isBodyMethod) {
|
|
75
|
+
try {
|
|
76
|
+
const contentType = request.headers.get("content-type") || "";
|
|
77
|
+
if (contentType.includes("multipart/form-data")) {
|
|
78
|
+
// FormData body — sent by load() when body is a FormData instance.
|
|
79
|
+
// Preserves File objects and binary data.
|
|
80
|
+
loaderFormData = await request.formData();
|
|
81
|
+
// Extract params if provided via the special field
|
|
82
|
+
const paramsField = loaderFormData.get("_rsc_loader_params");
|
|
83
|
+
if (typeof paramsField === "string") {
|
|
84
|
+
loaderParams = JSON.parse(paramsField);
|
|
85
|
+
loaderFormData.delete("_rsc_loader_params");
|
|
86
|
+
}
|
|
87
|
+
} else if (contentType.includes("application/json")) {
|
|
88
|
+
const jsonBody = (await request.json()) as {
|
|
89
|
+
params?: Record<string, string>;
|
|
90
|
+
body?: unknown;
|
|
91
|
+
};
|
|
92
|
+
loaderParams = jsonBody.params ?? {};
|
|
93
|
+
loaderBody = jsonBody.body;
|
|
94
|
+
}
|
|
95
|
+
} catch {
|
|
96
|
+
return createResponseWithMergedHeaders("Invalid request body", {
|
|
97
|
+
status: 400,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
const loaderParamsJson = url.searchParams.get("_rsc_loader_params");
|
|
102
|
+
if (loaderParamsJson) {
|
|
103
|
+
try {
|
|
104
|
+
loaderParams = JSON.parse(loaderParamsJson);
|
|
105
|
+
} catch {
|
|
106
|
+
return createResponseWithMergedHeaders(
|
|
107
|
+
"Invalid _rsc_loader_params JSON",
|
|
108
|
+
{ status: 400 },
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Execute the loader with middleware.
|
|
115
|
+
// finalizeResponse drains onResponse callbacks that middleware short-circuits
|
|
116
|
+
// may leave behind (executeLoaderMiddleware does not finalize them itself).
|
|
117
|
+
try {
|
|
118
|
+
const { fn, middleware } = registeredLoader;
|
|
119
|
+
|
|
120
|
+
return finalizeResponse(
|
|
121
|
+
await executeLoaderMiddleware(
|
|
122
|
+
middleware,
|
|
123
|
+
request,
|
|
124
|
+
env,
|
|
125
|
+
loaderParams,
|
|
126
|
+
variables,
|
|
127
|
+
async () => {
|
|
128
|
+
const reqCtx = requireRequestContext();
|
|
129
|
+
// Merge route params (from previewMatch) with explicit loader params.
|
|
130
|
+
// Explicit params take precedence over route-matched params.
|
|
131
|
+
const resolvedRouteParams = routeParams ?? {};
|
|
132
|
+
const mergedParams = {
|
|
133
|
+
...resolvedRouteParams,
|
|
134
|
+
...loaderParams,
|
|
135
|
+
};
|
|
136
|
+
// Strip _rsc_* transport params so loaders see the same
|
|
137
|
+
// url/searchParams as during SSR/navigation.
|
|
138
|
+
const cleanUrl = stripInternalParams(url);
|
|
139
|
+
const cleanSearchParams = cleanUrl.searchParams;
|
|
140
|
+
const searchSchema = reqCtx._routeName
|
|
141
|
+
? getSearchSchema(reqCtx._routeName)
|
|
142
|
+
: undefined;
|
|
143
|
+
const loaderCtx: any = {
|
|
144
|
+
...reqCtx,
|
|
145
|
+
url: cleanUrl,
|
|
146
|
+
pathname: cleanUrl.pathname,
|
|
147
|
+
searchParams: cleanSearchParams,
|
|
148
|
+
search: searchSchema
|
|
149
|
+
? parseSearchParams(cleanSearchParams, searchSchema)
|
|
150
|
+
: {},
|
|
151
|
+
params: mergedParams,
|
|
152
|
+
routeParams: resolvedRouteParams,
|
|
153
|
+
body: loaderBody,
|
|
154
|
+
method: request.method,
|
|
155
|
+
reverse: createReverseFunction(
|
|
156
|
+
getGlobalRouteMap(),
|
|
157
|
+
reqCtx._routeName,
|
|
158
|
+
mergedParams,
|
|
159
|
+
reqCtx._routeName
|
|
160
|
+
? isRouteRootScoped(reqCtx._routeName)
|
|
161
|
+
: undefined,
|
|
162
|
+
),
|
|
163
|
+
...(loaderFormData ? { formData: loaderFormData } : {}),
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
// Meter the fetchable-loader execution via observePhase, the sole
|
|
167
|
+
// funnel for this path (fn is called directly, not via ctx.use).
|
|
168
|
+
// depth:1 — a fetchable request has no render-phase parent.
|
|
169
|
+
const result = await observePhase(PHASES.loader(loaderId, 1), () =>
|
|
170
|
+
fn(loaderCtx),
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
interface LoaderPayload {
|
|
174
|
+
loaderResult: unknown;
|
|
175
|
+
}
|
|
176
|
+
const loaderPayload: LoaderPayload = { loaderResult: result };
|
|
177
|
+
const rscStream = ctx.renderToReadableStream<LoaderPayload>(
|
|
178
|
+
loaderPayload,
|
|
179
|
+
{
|
|
180
|
+
onError: (error: unknown) => {
|
|
181
|
+
ctx.callOnError(error, "rendering", {
|
|
182
|
+
request,
|
|
183
|
+
url,
|
|
184
|
+
env,
|
|
185
|
+
loaderName: loaderId,
|
|
186
|
+
});
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
192
|
+
headers: { "content-type": "text/x-component;charset=utf-8" },
|
|
193
|
+
});
|
|
194
|
+
},
|
|
195
|
+
createReverseFunction(ctx.getRequiredRouteMap()),
|
|
196
|
+
),
|
|
197
|
+
);
|
|
198
|
+
} catch (error) {
|
|
199
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
200
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
201
|
+
|
|
202
|
+
console.error("[RSC] Loader error:", error);
|
|
203
|
+
|
|
204
|
+
ctx.callOnError(error, "loader", {
|
|
205
|
+
request,
|
|
206
|
+
url,
|
|
207
|
+
env,
|
|
208
|
+
loaderName: loaderId,
|
|
209
|
+
handledByBoundary: false,
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
const errorPayload = {
|
|
213
|
+
loaderResult: null,
|
|
214
|
+
loaderError: {
|
|
215
|
+
message: isDev ? err.message : "An error occurred",
|
|
216
|
+
name: err.name,
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
const rscStream = ctx.renderToReadableStream(errorPayload, {
|
|
220
|
+
onError: (error: unknown) => {
|
|
221
|
+
ctx.callOnError(error, "rendering", {
|
|
222
|
+
request,
|
|
223
|
+
url,
|
|
224
|
+
env,
|
|
225
|
+
loaderName: loaderId,
|
|
226
|
+
});
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
231
|
+
status: 500,
|
|
232
|
+
headers: { "content-type": "text/x-component;charset=utf-8" },
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|