@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/prerender.ts
CHANGED
|
@@ -26,24 +26,145 @@
|
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
28
|
import type { ReactNode } from "react";
|
|
29
|
-
import type {
|
|
29
|
+
import type {
|
|
30
|
+
Handler,
|
|
31
|
+
HandlerContext,
|
|
32
|
+
DefaultEnv,
|
|
33
|
+
ExtractParams,
|
|
34
|
+
} from "./types.js";
|
|
30
35
|
import type { Handle } from "./handle.js";
|
|
36
|
+
import type { ContextVar } from "./context-var.js";
|
|
37
|
+
import type { ReverseFunction } from "./reverse.js";
|
|
38
|
+
import type { DefaultReverseRouteMap } from "./types/global-namespace.js";
|
|
39
|
+
import type { UseItems, HandlerUseItem } from "./route-types.js";
|
|
40
|
+
import { isCachedFunction } from "./cache/taint.js";
|
|
41
|
+
import { isUnderTestRunner } from "./runtime-env.js";
|
|
42
|
+
|
|
43
|
+
// -- Named route resolution types -------------------------------------------
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Reverse function for build contexts (BuildContext, StaticBuildContext, GetParamsContext).
|
|
47
|
+
* Global names get full autocomplete and param validation from the generated route map.
|
|
48
|
+
* Local `.name` calls are accepted but not validated (the include() scope is unknown
|
|
49
|
+
* at the type level).
|
|
50
|
+
*/
|
|
51
|
+
type BuildReverseFunction = [DefaultReverseRouteMap] extends [
|
|
52
|
+
Record<string, string>,
|
|
53
|
+
]
|
|
54
|
+
? // No generated route map — permissive fallback
|
|
55
|
+
(
|
|
56
|
+
name: string,
|
|
57
|
+
params?: Record<string, string>,
|
|
58
|
+
search?: Record<string, unknown>,
|
|
59
|
+
) => string
|
|
60
|
+
: // Generated route map available — typed globals + permissive locals
|
|
61
|
+
ReverseFunction<DefaultReverseRouteMap> & {
|
|
62
|
+
(
|
|
63
|
+
name: `.${string}`,
|
|
64
|
+
params?: Record<string, string>,
|
|
65
|
+
search?: Record<string, unknown>,
|
|
66
|
+
): string;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Default route map for Prerender named route resolution.
|
|
71
|
+
* Uses GeneratedRouteMap (from gen file) to avoid circular dependencies.
|
|
72
|
+
*/
|
|
73
|
+
type DefaultPrerenderRouteMap = keyof Rango.GeneratedRouteMap extends never
|
|
74
|
+
? {}
|
|
75
|
+
: Rango.GeneratedRouteMap;
|
|
76
|
+
|
|
77
|
+
/** Extract params from a route map entry (string pattern or { path } object). */
|
|
78
|
+
type ExtractParamsFromEntry<TEntry> = TEntry extends string
|
|
79
|
+
? ExtractParams<TEntry>
|
|
80
|
+
: TEntry extends { readonly path: infer P extends string }
|
|
81
|
+
? ExtractParams<P>
|
|
82
|
+
: Record<string, string>;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Resolve params from Prerender's type parameter.
|
|
86
|
+
* Accepts named routes (global or .local) and explicit param objects.
|
|
87
|
+
*
|
|
88
|
+
* Resolution order:
|
|
89
|
+
* 1. ".local" string → look up in TRouteMap
|
|
90
|
+
* 2. Global route name string → look up in DefaultPrerenderRouteMap
|
|
91
|
+
* 3. Record<string, any> object → use as-is (explicit params)
|
|
92
|
+
* 4. Fallback → {}
|
|
93
|
+
*/
|
|
94
|
+
type ResolvePrerenderParams<
|
|
95
|
+
T,
|
|
96
|
+
TRouteMap extends {} = DefaultPrerenderRouteMap,
|
|
97
|
+
> = T extends `.${infer Local}`
|
|
98
|
+
? Local extends keyof TRouteMap
|
|
99
|
+
? ExtractParamsFromEntry<TRouteMap[Local]>
|
|
100
|
+
: Record<string, string>
|
|
101
|
+
: T extends keyof DefaultPrerenderRouteMap
|
|
102
|
+
? ExtractParamsFromEntry<DefaultPrerenderRouteMap[T]>
|
|
103
|
+
: T extends Record<string, any>
|
|
104
|
+
? T
|
|
105
|
+
: {};
|
|
31
106
|
|
|
32
107
|
// -- Types ------------------------------------------------------------------
|
|
33
108
|
|
|
34
109
|
export interface PrerenderOptions {
|
|
35
110
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
111
|
+
* Maximum number of param sets to render in parallel (default: 1).
|
|
112
|
+
* Only applies to dynamic Prerender handlers with getParams().
|
|
113
|
+
* Set to higher values to speed up builds with many routes.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```typescript
|
|
117
|
+
* export const BlogPost = Prerender(
|
|
118
|
+
* async () => allPosts.map(p => ({ slug: p.slug })),
|
|
119
|
+
* async (ctx) => <PostPage slug={ctx.params.slug} />,
|
|
120
|
+
* { concurrency: 4 },
|
|
121
|
+
* );
|
|
122
|
+
* ```
|
|
39
123
|
*/
|
|
40
|
-
|
|
124
|
+
concurrency?: number;
|
|
41
125
|
}
|
|
42
126
|
|
|
127
|
+
/**
|
|
128
|
+
* Context passed to Prerender() handlers at build time.
|
|
129
|
+
* Has a synthetic URL from getParams, params, pathname, and optionally env.
|
|
130
|
+
* No request, headers, cookies.
|
|
131
|
+
*/
|
|
43
132
|
export interface BuildContext<TParams> {
|
|
44
133
|
/** Params extracted from the route pattern (populated from getParams). */
|
|
45
134
|
params: TParams;
|
|
46
135
|
|
|
136
|
+
/** True during build-time pre-rendering, false during passthrough live render. */
|
|
137
|
+
build: true;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* True when running in Vite dev mode (on-demand prerender), false during
|
|
141
|
+
* production `vite build`. Use this to branch on runtime mode without
|
|
142
|
+
* changing build semantics.
|
|
143
|
+
*/
|
|
144
|
+
dev: boolean;
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Build-time environment bindings (KV, D1, etc.) supplied by the Vite plugin.
|
|
148
|
+
* Only available when `buildEnv` is configured in rango() options.
|
|
149
|
+
* Throws with a clear error if not configured.
|
|
150
|
+
*
|
|
151
|
+
* This is NOT the live request env — it is shared across all prerender
|
|
152
|
+
* invocations for the build.
|
|
153
|
+
*/
|
|
154
|
+
env: DefaultEnv;
|
|
155
|
+
|
|
156
|
+
/** Read a variable set by getParams or a parent handler. */
|
|
157
|
+
get: {
|
|
158
|
+
<T>(contextVar: ContextVar<T>): T | undefined;
|
|
159
|
+
(key: string): any;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/** Set a variable readable by child layouts and parallels. */
|
|
163
|
+
set: {
|
|
164
|
+
<T>(contextVar: ContextVar<T>, value: T): void;
|
|
165
|
+
(key: string, value: any): void;
|
|
166
|
+
};
|
|
167
|
+
|
|
47
168
|
/** Push handle data (frozen into pre-rendered output at build time). */
|
|
48
169
|
use: <T>(handle: Handle<T>) => (data: T) => void;
|
|
49
170
|
|
|
@@ -52,36 +173,160 @@ export interface BuildContext<TParams> {
|
|
|
52
173
|
|
|
53
174
|
/** Pathname portion of the synthetic URL. */
|
|
54
175
|
pathname: string;
|
|
176
|
+
|
|
177
|
+
/** URLSearchParams from the synthetic URL (always empty for prerender). */
|
|
178
|
+
searchParams: URLSearchParams;
|
|
179
|
+
|
|
180
|
+
/** Typed search params — always {} for prerender (no real query string). */
|
|
181
|
+
search: {};
|
|
182
|
+
|
|
183
|
+
/** URL generation by route name. */
|
|
184
|
+
reverse: BuildReverseFunction;
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Signal that this param set should not produce a local prerender artifact.
|
|
188
|
+
* At runtime the live handler runs instead. Only valid on routes wrapped
|
|
189
|
+
* with `Passthrough()`.
|
|
190
|
+
*/
|
|
191
|
+
passthrough: () => PrerenderPassthroughResult;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Context passed to Static() handlers at build time.
|
|
196
|
+
* No URL, no params, no pathname — just renders content.
|
|
197
|
+
*/
|
|
198
|
+
export interface StaticBuildContext {
|
|
199
|
+
/** Always true for Static handlers at build time. */
|
|
200
|
+
build: true;
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* True when running in Vite dev mode, false during production build.
|
|
204
|
+
*/
|
|
205
|
+
dev: boolean;
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Build-time environment bindings supplied by the Vite plugin.
|
|
209
|
+
* Only available when `buildEnv` is configured in rango() options.
|
|
210
|
+
*/
|
|
211
|
+
env: DefaultEnv;
|
|
212
|
+
|
|
213
|
+
/** Read a variable (available for type consistency with BuildContext). */
|
|
214
|
+
get: {
|
|
215
|
+
<T>(contextVar: ContextVar<T>): T | undefined;
|
|
216
|
+
(key: string): any;
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
/** Set a variable (available for type consistency with BuildContext). */
|
|
220
|
+
set: {
|
|
221
|
+
<T>(contextVar: ContextVar<T>, value: T): void;
|
|
222
|
+
(key: string, value: any): void;
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
/** Push handle data (frozen into pre-rendered output at build time). */
|
|
226
|
+
use: <T>(handle: Handle<T>) => (data: T) => void;
|
|
227
|
+
|
|
228
|
+
/** URL generation by route name. */
|
|
229
|
+
reverse: BuildReverseFunction;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Context passed to getParams() at build time.
|
|
234
|
+
* Allows sharing data with handler invocations via set().
|
|
235
|
+
*/
|
|
236
|
+
export interface GetParamsContext {
|
|
237
|
+
/** Always true during build-time getParams execution. */
|
|
238
|
+
build: true;
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* True when running in Vite dev mode, false during production build.
|
|
242
|
+
*/
|
|
243
|
+
dev: boolean;
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Build-time environment bindings supplied by the Vite plugin.
|
|
247
|
+
* Only available when `buildEnv` is configured in rango() options.
|
|
248
|
+
*/
|
|
249
|
+
env: DefaultEnv;
|
|
250
|
+
|
|
251
|
+
/** Set a variable that will be available to each handler invocation via ctx.get(). */
|
|
252
|
+
set: {
|
|
253
|
+
<T>(contextVar: ContextVar<T>, value: T): void;
|
|
254
|
+
(key: string, value: any): void;
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
/** URL generation by route name. */
|
|
258
|
+
reverse: BuildReverseFunction;
|
|
55
259
|
}
|
|
56
260
|
|
|
57
|
-
export interface PrerenderHandlerDefinition<
|
|
261
|
+
export interface PrerenderHandlerDefinition<
|
|
262
|
+
TParams extends Record<string, any> = any,
|
|
263
|
+
> {
|
|
58
264
|
readonly __brand: "prerenderHandler";
|
|
59
265
|
/** Auto-generated unique ID (injected by Vite plugin). */
|
|
60
266
|
$$id: string;
|
|
61
267
|
/** In dev mode, the actual handler function that path() can call. */
|
|
62
268
|
handler: Handler<TParams>;
|
|
63
269
|
/** Returns the list of param objects to pre-render (dynamic routes). */
|
|
64
|
-
getParams?: () => Promise<TParams[]> | TParams[];
|
|
270
|
+
getParams?: (ctx: GetParamsContext) => Promise<TParams[]> | TParams[];
|
|
65
271
|
/** Pre-render options. */
|
|
66
272
|
options?: PrerenderOptions;
|
|
273
|
+
/** Composable default DSL items merged when the handler is mounted. */
|
|
274
|
+
use?: () => UseItems<HandlerUseItem>;
|
|
67
275
|
}
|
|
68
276
|
|
|
277
|
+
// Process-stable fallback id counter (mirrors createHandle / createLoader). Only
|
|
278
|
+
// assigned in a bare unit test where the Vite plugin did not inject an id; never
|
|
279
|
+
// fires in a real build (the plugin always injects).
|
|
280
|
+
let runtimePrerenderIdCounter = 0;
|
|
281
|
+
|
|
69
282
|
// -- Overloads --------------------------------------------------------------
|
|
283
|
+
//
|
|
284
|
+
// T accepts: named route string (global or .local) OR explicit param object.
|
|
285
|
+
// Named routes resolve params from GeneratedRouteMap, e.g.:
|
|
286
|
+
// Prerender<"locale.detail"> → params = { locale: string; slug: string }
|
|
287
|
+
// Explicit params work as before:
|
|
288
|
+
// Prerender<{ slug: string }> → params = { slug: string }
|
|
70
289
|
|
|
71
|
-
// Overload 1: Static handler (
|
|
72
|
-
export function Prerender<
|
|
73
|
-
|
|
290
|
+
// Overload 1: Static handler (build-time only)
|
|
291
|
+
export function Prerender<
|
|
292
|
+
T extends
|
|
293
|
+
| keyof DefaultPrerenderRouteMap
|
|
294
|
+
| `.${keyof TRouteMap & string}`
|
|
295
|
+
| Record<string, any> = {},
|
|
296
|
+
TRouteMap extends {} = DefaultPrerenderRouteMap,
|
|
297
|
+
>(
|
|
298
|
+
handler: (
|
|
299
|
+
ctx: BuildContext<ResolvePrerenderParams<T, TRouteMap>>,
|
|
300
|
+
) =>
|
|
301
|
+
| ReactNode
|
|
302
|
+
| PrerenderPassthroughResult
|
|
303
|
+
| Promise<ReactNode | PrerenderPassthroughResult>,
|
|
74
304
|
options?: PrerenderOptions,
|
|
75
305
|
__injectedId?: string,
|
|
76
|
-
): PrerenderHandlerDefinition<
|
|
306
|
+
): PrerenderHandlerDefinition<ResolvePrerenderParams<T, TRouteMap>>;
|
|
77
307
|
|
|
78
|
-
// Overload 2: Dynamic handler (
|
|
79
|
-
export function Prerender<
|
|
80
|
-
|
|
81
|
-
|
|
308
|
+
// Overload 2: Dynamic handler (build-time only)
|
|
309
|
+
export function Prerender<
|
|
310
|
+
T extends
|
|
311
|
+
| keyof DefaultPrerenderRouteMap
|
|
312
|
+
| `.${keyof TRouteMap & string}`
|
|
313
|
+
| Record<string, any>,
|
|
314
|
+
TRouteMap extends {} = DefaultPrerenderRouteMap,
|
|
315
|
+
>(
|
|
316
|
+
getParams: (
|
|
317
|
+
ctx: GetParamsContext,
|
|
318
|
+
) =>
|
|
319
|
+
| Promise<ResolvePrerenderParams<T, TRouteMap>[]>
|
|
320
|
+
| ResolvePrerenderParams<T, TRouteMap>[],
|
|
321
|
+
handler: (
|
|
322
|
+
ctx: BuildContext<ResolvePrerenderParams<T, TRouteMap>>,
|
|
323
|
+
) =>
|
|
324
|
+
| ReactNode
|
|
325
|
+
| PrerenderPassthroughResult
|
|
326
|
+
| Promise<ReactNode | PrerenderPassthroughResult>,
|
|
82
327
|
options?: PrerenderOptions,
|
|
83
328
|
__injectedId?: string,
|
|
84
|
-
): PrerenderHandlerDefinition<
|
|
329
|
+
): PrerenderHandlerDefinition<ResolvePrerenderParams<T, TRouteMap>>;
|
|
85
330
|
|
|
86
331
|
// -- Implementation ---------------------------------------------------------
|
|
87
332
|
|
|
@@ -122,14 +367,41 @@ export function Prerender<TParams extends Record<string, any>>(
|
|
|
122
367
|
}
|
|
123
368
|
}
|
|
124
369
|
|
|
370
|
+
if (isCachedFunction(handler)) {
|
|
371
|
+
throw new Error(
|
|
372
|
+
'A "use cache" function cannot be used as a Prerender() handler. ' +
|
|
373
|
+
"Prerender handlers are rendered at build time. Remove the " +
|
|
374
|
+
'"use cache" directive — Prerender already provides caching.',
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
if (getParams && isCachedFunction(getParams)) {
|
|
378
|
+
throw new Error(
|
|
379
|
+
'A "use cache" function cannot be used as Prerender() getParams. ' +
|
|
380
|
+
"getParams runs at build time to enumerate params. Remove the " +
|
|
381
|
+
'"use cache" directive.',
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Throw unless under a test runner. The plugin always injects $$id for a
|
|
386
|
+
// supported `export const` Prerender on every build, so a missing id means
|
|
387
|
+
// either no plugin (a bare test — fall back below) or an UNSUPPORTED shape the
|
|
388
|
+
// plugin silently skipped (dev OR a real build — fail loud; a synthetic id
|
|
389
|
+
// would degrade to a silent prerender miss). The message is already small (no
|
|
390
|
+
// stack-parsing diagnostic), so it ships as-is. isUnderTestRunner() is
|
|
391
|
+
// runtime-safe — never a bare `process.env` access.
|
|
392
|
+
if (!id && !isUnderTestRunner()) {
|
|
393
|
+
throw new Error(
|
|
394
|
+
"[rango] Prerender: missing $$id. Use `export const X = Prerender(...)` " +
|
|
395
|
+
"and ensure the exposeInternalIds Vite plugin is configured.",
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
// Under vitest with no plugin id: assign a process-stable runtime id so a
|
|
399
|
+
// whole-app router with Prerender routes constructs in a bare test (for
|
|
400
|
+
// dispatch / assertGeneratedRoutesMatch). Never reached in a real build (the
|
|
401
|
+
// throw above fires there); prerender storage/lookup keys on routeName +
|
|
402
|
+
// paramHash, never $$id (mirrors createHandle / createLoader).
|
|
125
403
|
if (!id) {
|
|
126
|
-
|
|
127
|
-
throw new Error(
|
|
128
|
-
"[rsc-router] Prerender: missing $$id. " +
|
|
129
|
-
"Ensure the exposeInternalIds Vite plugin is configured.",
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
id = "";
|
|
404
|
+
id = `__rango_runtime_prerender_${runtimePrerenderIdCounter++}`;
|
|
133
405
|
}
|
|
134
406
|
|
|
135
407
|
return {
|
|
@@ -141,7 +413,70 @@ export function Prerender<TParams extends Record<string, any>>(
|
|
|
141
413
|
};
|
|
142
414
|
}
|
|
143
415
|
|
|
144
|
-
// --
|
|
416
|
+
// -- Passthrough sentinel ---------------------------------------------------
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* Sentinel returned by `ctx.passthrough()` to signal that a specific param set
|
|
420
|
+
* should not produce a local prerender artifact. The build skips writing the
|
|
421
|
+
* entry; at runtime the Passthrough live handler runs instead.
|
|
422
|
+
*/
|
|
423
|
+
export const PRERENDER_PASSTHROUGH: Readonly<{
|
|
424
|
+
__brand: "prerenderPassthrough";
|
|
425
|
+
}> = Object.freeze({
|
|
426
|
+
__brand: "prerenderPassthrough" as const,
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
export type PrerenderPassthroughResult = typeof PRERENDER_PASSTHROUGH;
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Type guard to check if a value is the passthrough sentinel.
|
|
433
|
+
*/
|
|
434
|
+
export function isPrerenderPassthrough(
|
|
435
|
+
value: unknown,
|
|
436
|
+
): value is PrerenderPassthroughResult {
|
|
437
|
+
return (
|
|
438
|
+
typeof value === "object" &&
|
|
439
|
+
value !== null &&
|
|
440
|
+
"__brand" in value &&
|
|
441
|
+
(value as { __brand: unknown }).__brand === "prerenderPassthrough"
|
|
442
|
+
);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Detect whether any resolved segment carries the passthrough sentinel.
|
|
447
|
+
*
|
|
448
|
+
* A build handler signals passthrough by returning `ctx.passthrough()` (the
|
|
449
|
+
* PRERENDER_PASSTHROUGH sentinel), which lands on the segment's `component`.
|
|
450
|
+
* But when the route declares `loading()`, the handler result is deferred
|
|
451
|
+
* upstream (segment-resolution/fresh.ts), so `component` is a thenable resolving
|
|
452
|
+
* to the sentinel rather than the sentinel itself — a synchronous
|
|
453
|
+
* `isPrerenderPassthrough(component)` on the Promise returns false and the build
|
|
454
|
+
* bakes a corrupt artifact instead of deferring. Resolve thenables first.
|
|
455
|
+
*
|
|
456
|
+
* Rejections are swallowed here: a throwing build handler resurfaces during
|
|
457
|
+
* segment serialization, preserving the prior error-handling behavior.
|
|
458
|
+
*/
|
|
459
|
+
export async function detectPrerenderPassthrough(
|
|
460
|
+
segments: ReadonlyArray<{ component: unknown }>,
|
|
461
|
+
): Promise<boolean> {
|
|
462
|
+
for (const seg of segments) {
|
|
463
|
+
let component: unknown = seg.component;
|
|
464
|
+
if (
|
|
465
|
+
component &&
|
|
466
|
+
typeof (component as { then?: unknown }).then === "function"
|
|
467
|
+
) {
|
|
468
|
+
try {
|
|
469
|
+
component = await component;
|
|
470
|
+
} catch {
|
|
471
|
+
continue;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
if (isPrerenderPassthrough(component)) return true;
|
|
475
|
+
}
|
|
476
|
+
return false;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
// -- Type guards ------------------------------------------------------------
|
|
145
480
|
|
|
146
481
|
/**
|
|
147
482
|
* Type guard to check if a value is a PrerenderHandlerDefinition.
|
|
@@ -156,3 +491,89 @@ export function isPrerenderHandler(
|
|
|
156
491
|
(value as { __brand: unknown }).__brand === "prerenderHandler"
|
|
157
492
|
);
|
|
158
493
|
}
|
|
494
|
+
|
|
495
|
+
// -- Passthrough wrapper ----------------------------------------------------
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* A prerender route with a live fallback handler for unknown params at runtime.
|
|
499
|
+
*
|
|
500
|
+
* Wraps a `Prerender(...)` definition with a separate handler that runs at
|
|
501
|
+
* request time for params not covered by `getParams()`.
|
|
502
|
+
*
|
|
503
|
+
* - Build time: `prerenderDef` provides getParams + build handler.
|
|
504
|
+
* - Runtime: `liveHandler` runs for unknown params with full HandlerContext.
|
|
505
|
+
*
|
|
506
|
+
* @example
|
|
507
|
+
* ```ts
|
|
508
|
+
* const BlogPrerender = Prerender(
|
|
509
|
+
* async () => [{ slug: "getting-started" }, { slug: "api-reference" }],
|
|
510
|
+
* async (ctx) => <BlogPost slug={ctx.params.slug} />,
|
|
511
|
+
* );
|
|
512
|
+
*
|
|
513
|
+
* // In route definition:
|
|
514
|
+
* path("/blog/:slug", Passthrough(BlogPrerender, async (ctx) => {
|
|
515
|
+
* const post = await ctx.env.DB.get(ctx.params.slug);
|
|
516
|
+
* return <BlogPost slug={ctx.params.slug} post={post} />;
|
|
517
|
+
* }))
|
|
518
|
+
* ```
|
|
519
|
+
*/
|
|
520
|
+
export interface PassthroughHandlerDefinition<
|
|
521
|
+
TParams extends Record<string, any> = any,
|
|
522
|
+
TEnv = DefaultEnv,
|
|
523
|
+
> {
|
|
524
|
+
readonly __brand: "passthroughHandler";
|
|
525
|
+
/** The underlying prerender definition (build-time rendering). */
|
|
526
|
+
prerenderDef: PrerenderHandlerDefinition<TParams>;
|
|
527
|
+
/** Live handler for runtime fallback on unknown params. */
|
|
528
|
+
liveHandler: (
|
|
529
|
+
ctx: HandlerContext<TParams, TEnv>,
|
|
530
|
+
) => ReactNode | Promise<ReactNode> | Response | Promise<Response>;
|
|
531
|
+
/** Composable default DSL items merged when the handler is mounted. */
|
|
532
|
+
use?: () => UseItems<HandlerUseItem>;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
export function Passthrough<
|
|
536
|
+
TParams extends Record<string, any>,
|
|
537
|
+
TEnv = DefaultEnv,
|
|
538
|
+
>(
|
|
539
|
+
prerenderDef: PrerenderHandlerDefinition<TParams>,
|
|
540
|
+
liveHandler: (
|
|
541
|
+
ctx: HandlerContext<TParams, TEnv>,
|
|
542
|
+
) => ReactNode | Promise<ReactNode> | Response | Promise<Response>,
|
|
543
|
+
): PassthroughHandlerDefinition<TParams, TEnv>;
|
|
544
|
+
|
|
545
|
+
// Implementation
|
|
546
|
+
export function Passthrough<
|
|
547
|
+
TParams extends Record<string, any>,
|
|
548
|
+
TEnv = DefaultEnv,
|
|
549
|
+
>(
|
|
550
|
+
prerenderDef: PrerenderHandlerDefinition<TParams>,
|
|
551
|
+
liveHandler: (
|
|
552
|
+
ctx: HandlerContext<TParams, TEnv>,
|
|
553
|
+
) => ReactNode | Promise<ReactNode> | Response | Promise<Response>,
|
|
554
|
+
): PassthroughHandlerDefinition<TParams, TEnv> {
|
|
555
|
+
if (!isPrerenderHandler(prerenderDef)) {
|
|
556
|
+
throw new Error(
|
|
557
|
+
"[rango] Passthrough: first argument must be a Prerender() definition.",
|
|
558
|
+
);
|
|
559
|
+
}
|
|
560
|
+
return {
|
|
561
|
+
__brand: "passthroughHandler" as const,
|
|
562
|
+
prerenderDef,
|
|
563
|
+
liveHandler,
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Type guard to check if a value is a PassthroughHandlerDefinition.
|
|
569
|
+
*/
|
|
570
|
+
export function isPassthroughHandler(
|
|
571
|
+
value: unknown,
|
|
572
|
+
): value is PassthroughHandlerDefinition {
|
|
573
|
+
return (
|
|
574
|
+
typeof value === "object" &&
|
|
575
|
+
value !== null &&
|
|
576
|
+
"__brand" in value &&
|
|
577
|
+
(value as { __brand: unknown }).__brand === "passthroughHandler"
|
|
578
|
+
);
|
|
579
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime-neutral same-origin redirect rule.
|
|
3
|
+
*
|
|
4
|
+
* Shared by the client redirect guard (`browser/validate-redirect-origin.ts`,
|
|
5
|
+
* which validates redirect targets the client JS is about to navigate to) and
|
|
6
|
+
* the server outgoing-redirect guard (`rsc/redirect-guard.ts`, which validates
|
|
7
|
+
* every browser-followed `Location` header before it leaves the handler). Kept
|
|
8
|
+
* at the `src/` root so both layers import the ONE rule and cannot drift -- a
|
|
9
|
+
* cross-origin target blocked on the JS/fetch path is blocked identically on the
|
|
10
|
+
* no-JS (PE) and full-page document paths.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Resolve a redirect target against the current origin.
|
|
15
|
+
*
|
|
16
|
+
* Returns the canonical (normalized) same-origin href -- which also collapses
|
|
17
|
+
* protocol-relative (`//evil.com`) and other ambiguous forms -- or `null` when
|
|
18
|
+
* the target resolves to a different origin or is unparseable. Pure: no logging,
|
|
19
|
+
* no side effects.
|
|
20
|
+
*/
|
|
21
|
+
export function resolveSameOriginRedirect(
|
|
22
|
+
url: string,
|
|
23
|
+
currentOrigin: string,
|
|
24
|
+
): string | null {
|
|
25
|
+
try {
|
|
26
|
+
const target = new URL(url, currentOrigin);
|
|
27
|
+
if (target.origin !== currentOrigin) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return target.href;
|
|
31
|
+
} catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Validate an explicit off-origin redirect target (`redirect(url, { external:
|
|
38
|
+
* true })`).
|
|
39
|
+
*
|
|
40
|
+
* `external` opts out of the same-origin rule, but NOT out of scheme safety:
|
|
41
|
+
* only `http:`/`https:` targets are allowed. A redirect ultimately reaches the
|
|
42
|
+
* browser via `window.location.assign()` on the SPA/action client paths, so a
|
|
43
|
+
* forged or mistaken `redirect("javascript:...", { external: true })` would be a
|
|
44
|
+
* scriptable navigation if the scheme were not checked here. Returns the
|
|
45
|
+
* normalized href for an http(s) target (same- or cross-origin), or `null`
|
|
46
|
+
* otherwise. Pure: no logging, no side effects.
|
|
47
|
+
*/
|
|
48
|
+
export function resolveExternalRedirect(
|
|
49
|
+
url: string,
|
|
50
|
+
currentOrigin: string,
|
|
51
|
+
): string | null {
|
|
52
|
+
try {
|
|
53
|
+
const target = new URL(url, currentOrigin);
|
|
54
|
+
if (target.protocol !== "http:" && target.protocol !== "https:") {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return target.href;
|
|
58
|
+
} catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Out-of-band brand for `redirect(url, { external: true })`.
|
|
65
|
+
*
|
|
66
|
+
* The external opt-in MUST be settable only by app code calling `redirect(...,
|
|
67
|
+
* { external: true })`, never by an attacker. An earlier design carried the
|
|
68
|
+
* opt-in as a wire header (`x-rango-redirect-external`), but a wire header is
|
|
69
|
+
* forgeable: a proxy-style response route that copies an attacker-controlled
|
|
70
|
+
* upstream response's headers would let `302 Location: https://evil` plus that
|
|
71
|
+
* header bypass the same-origin guard without app code ever opting in. So the
|
|
72
|
+
* opt-in is now an out-of-band brand on the Response object itself, tracked in a
|
|
73
|
+
* `WeakSet` that cannot cross the wire. `redirect()` brands the Response; the
|
|
74
|
+
* small set of internal redirect-rebuild paths (middleware `mergeResponse`,
|
|
75
|
+
* `carryOverRedirectHeaders`, the response-route rewrap) transfer the brand onto
|
|
76
|
+
* the rebuilt Response; the guard and the SPA intercept read it. An upstream
|
|
77
|
+
* Response an app proxies is never branded, so its forged header is inert.
|
|
78
|
+
*
|
|
79
|
+
* Fail-closed: if a rebuild path ever drops the brand, the redirect is
|
|
80
|
+
* neutralized to the app root rather than allowed off-host.
|
|
81
|
+
*/
|
|
82
|
+
const externalRedirects = new WeakSet<Response>();
|
|
83
|
+
|
|
84
|
+
/** Brand a Response as an explicit `{ external: true }` redirect (out-of-band). */
|
|
85
|
+
export function markExternalRedirect(response: Response): void {
|
|
86
|
+
externalRedirects.add(response);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Read the out-of-band `{ external: true }` brand off a Response. */
|
|
90
|
+
export function isExternalRedirect(response: Response): boolean {
|
|
91
|
+
return externalRedirects.has(response);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Reserved internal header name. No longer a trust signal -- the external
|
|
96
|
+
* opt-in is the out-of-band brand above. It is kept only so the redirect-rebuild
|
|
97
|
+
* paths and the guard can defensively strip any value (e.g. one forged by a
|
|
98
|
+
* proxied upstream) and guarantee it never reaches the browser.
|
|
99
|
+
*/
|
|
100
|
+
export const EXTERNAL_REDIRECT_MARKER: string = "x-rango-redirect-external";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime-neutral Response shape utilities.
|
|
3
|
+
*
|
|
4
|
+
* Kept at the src/ root so both `router/` and `rsc/` can depend on it
|
|
5
|
+
* without creating a cross-layer import cycle.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* True when a Response represents a WebSocket upgrade handoff and must not
|
|
10
|
+
* be reconstructed or mutated:
|
|
11
|
+
*
|
|
12
|
+
* - Status 101 (Switching Protocols) is outside the standard Response
|
|
13
|
+
* constructor's 200–599 range, so `new Response(body, { status: 101 })`
|
|
14
|
+
* throws RangeError on Node/undici and any spec-compliant runtime.
|
|
15
|
+
* - Cloudflare's workerd attaches a non-standard `webSocket` property on
|
|
16
|
+
* the upgrade Response (e.g. from `acceptWebSocket`/`handleWebSocketUpgrade`
|
|
17
|
+
* or the `agents` library's `routeAgentRequest`). That property is dropped
|
|
18
|
+
* by a `new Response(...)` copy, breaking the upgrade even on workerd
|
|
19
|
+
* where the status range is relaxed.
|
|
20
|
+
*
|
|
21
|
+
* Callers should short-circuit header/body merges for these responses.
|
|
22
|
+
*/
|
|
23
|
+
export function isWebSocketUpgradeResponse(response: Response): boolean {
|
|
24
|
+
return (
|
|
25
|
+
response.status === 101 ||
|
|
26
|
+
(response as unknown as { webSocket?: unknown }).webSocket != null
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Location truthiness (not presence) so an empty `Location: ""` is not a redirect.
|
|
31
|
+
export function isRedirectResponse(response: Response): boolean {
|
|
32
|
+
return (
|
|
33
|
+
response.status >= 300 &&
|
|
34
|
+
response.status < 400 &&
|
|
35
|
+
Boolean(response.headers.get("Location"))
|
|
36
|
+
);
|
|
37
|
+
}
|