@rangojs/router 0.0.0-experimental.15 → 0.0.0-experimental.151
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +13 -0
- package/README.md +308 -451
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +1844 -237
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/{src/handles/index.ts → dist/handles/index.js} +1 -1
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -8
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +7554 -2070
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +142 -61
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +489 -0
- package/skills/caching/SKILL.md +413 -26
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +278 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +16 -18
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +96 -63
- package/skills/fonts/SKILL.md +7 -5
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +76 -436
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +215 -16
- package/skills/layout/SKILL.md +147 -7
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +629 -55
- package/skills/middleware/SKILL.md +251 -38
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +60 -21
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +296 -4
- package/skills/ppr/SKILL.md +658 -0
- package/skills/prerender/SKILL.md +487 -52
- package/skills/rango/SKILL.md +324 -29
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +264 -122
- package/skills/route/SKILL.md +359 -22
- package/skills/router-setup/SKILL.md +247 -34
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +126 -222
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +10 -9
- package/skills/typesafety/SKILL.md +45 -496
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +383 -0
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +77 -44
- package/src/bin/rango.ts +275 -29
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +348 -212
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +39 -0
- package/src/browser/merge-segment-loaders.ts +23 -13
- package/src/browser/navigation-bridge.ts +385 -576
- package/src/browser/navigation-client.ts +249 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +230 -124
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +88 -0
- package/src/browser/partial-update.ts +432 -365
- package/src/browser/prefetch/cache.ts +381 -0
- package/src/browser/prefetch/fetch.ts +462 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +209 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +284 -67
- package/src/browser/react/NavigationProvider.tsx +267 -109
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +70 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +272 -60
- package/src/browser/react/location-state.ts +90 -20
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +39 -13
- package/src/browser/react/use-navigation.ts +53 -69
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +164 -0
- package/src/browser/rsc-router.tsx +355 -73
- package/src/browser/scroll-restoration.ts +140 -50
- package/src/browser/segment-reconciler.ts +253 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +668 -613
- package/src/browser/types.ts +235 -51
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +243 -183
- package/src/build/generate-route-types.ts +41 -848
- package/src/build/index.ts +12 -7
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +218 -80
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +105 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +812 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +144 -0
- package/src/build/route-types/router-processing.ts +695 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +223 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +88 -0
- package/src/cache/cache-policy.ts +199 -0
- package/src/cache/cache-runtime.ts +695 -0
- package/src/cache/cache-scope.ts +324 -335
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2602 -156
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +17 -17
- package/src/cache/document-cache.ts +226 -102
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +132 -0
- package/src/cache/index.ts +24 -35
- package/src/cache/memory-segment-store.ts +446 -30
- package/src/cache/profile-registry.ts +88 -0
- package/src/cache/read-through-swr.ts +178 -0
- package/src/cache/segment-codec.ts +295 -0
- package/src/cache/shell-snapshot.ts +464 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +283 -211
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1201 -0
- package/src/client.rsc.tsx +43 -21
- package/src/client.tsx +131 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +13 -3
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +4 -2
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +106 -10
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +110 -35
- package/src/handles/MetaTags.tsx +83 -59
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +44 -53
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +20 -65
- package/src/host/errors.ts +21 -30
- package/src/host/index.ts +13 -9
- package/src/host/pattern-matcher.ts +50 -79
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +180 -35
- package/src/index.ts +245 -73
- package/src/internal-debug.ts +9 -2
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/build-shell-capture.ts +447 -0
- package/src/prerender/param-hash.ts +16 -14
- package/src/prerender/shell-manifest-key.ts +20 -0
- package/src/prerender/store.ts +131 -22
- package/src/prerender.ts +460 -26
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +22 -77
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +88 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +54 -0
- package/src/route-definition/redirect.ts +134 -0
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-definition.ts +1 -1481
- package/src/route-map-builder.ts +120 -145
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +71 -45
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +305 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +54 -27
- package/src/router/find-match.ts +259 -0
- package/src/router/handler-context.ts +385 -125
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +88 -28
- package/src/router/lazy-includes.ts +260 -0
- package/src/router/loader-resolution.ts +449 -157
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +144 -62
- package/src/router/match-api.ts +224 -256
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +499 -0
- package/src/router/match-middleware/background-revalidation.ts +117 -93
- package/src/router/match-middleware/cache-lookup.ts +308 -150
- package/src/router/match-middleware/cache-store.ts +123 -51
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +143 -52
- package/src/router/metrics.ts +235 -29
- package/src/router/middleware-types.ts +110 -0
- package/src/router/middleware.ts +526 -441
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +311 -142
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +575 -0
- package/src/router/preview-match.ts +102 -0
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +203 -62
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +45 -48
- package/src/router/router-interfaces.ts +564 -0
- package/src/router/router-options.ts +784 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +812 -0
- package/src/router/segment-resolution/helpers.ts +348 -0
- package/src/router/segment-resolution/loader-cache.ts +315 -0
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +99 -0
- package/src/router/segment-resolution/revalidation.ts +1340 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +25 -1354
- package/src/router/segment-wrappers.ts +292 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +259 -0
- package/src/router/telemetry.ts +385 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +240 -61
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +795 -2390
- package/src/rsc/capture-queue.ts +67 -0
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +956 -1164
- package/src/rsc/helpers.ts +736 -19
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +305 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +23 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +541 -0
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +257 -0
- package/src/rsc/rsc-rendering.ts +856 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +525 -0
- package/src/rsc/shell-build-manifest.ts +316 -0
- package/src/rsc/shell-capture-constants.ts +27 -0
- package/src/rsc/shell-capture.ts +1716 -0
- package/src/rsc/shell-serve.ts +226 -0
- package/src/rsc/ssr-setup.ts +176 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +95 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +99 -82
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-fragments.ts +124 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +464 -135
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +640 -85
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +337 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +123 -42
- package/src/server/loader-registry.ts +51 -100
- package/src/server/request-context.ts +1069 -152
- package/src/server.ts +15 -8
- package/src/ssr/index.tsx +661 -140
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/preinit-client-references.ts +106 -0
- package/src/ssr/ssr-root.tsx +261 -0
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +380 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +371 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +219 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +76 -98
- package/src/theme/ThemeScript.tsx +12 -14
- package/src/theme/constants.ts +57 -15
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +43 -39
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +850 -0
- package/src/types/index.ts +81 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +138 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +271 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +162 -0
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +44 -0
- package/src/urls/path-helper-types.ts +418 -0
- package/src/urls/path-helper.ts +280 -0
- package/src/urls/pattern-types.ts +189 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +316 -0
- package/src/urls/urls-function.ts +80 -0
- package/src/urls.ts +1 -1352
- package/src/use-loader.tsx +406 -141
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +408 -0
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +483 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/shell-prerender-phase.ts +397 -0
- package/src/vite/discovery/state.ts +205 -0
- package/src/vite/discovery/virtual-module-codegen.ts +293 -0
- package/src/vite/index.ts +31 -2255
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +336 -0
- package/src/vite/plugins/cjs-to-esm.ts +90 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
- package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +805 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +94 -0
- package/src/vite/plugins/version-plugin.ts +271 -0
- package/src/vite/plugins/virtual-entries.ts +267 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +600 -0
- package/src/vite/router-discovery.ts +2120 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +268 -0
- package/src/vite/utils/shared-utils.ts +271 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: prerender
|
|
3
|
-
description: Pre-render route segments at build time with Prerender and
|
|
3
|
+
description: Pre-render route segments at build time with Prerender and Passthrough live fallback. Use when a page's content is mostly static and shouldn't render on every request, speeding up cold responses, or deciding which routes to prerender vs render live.
|
|
4
4
|
argument-hint: [passthrough]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -11,6 +11,13 @@ deserialization path, same segment system. The worker handles every request --
|
|
|
11
11
|
there are NO static .html or .rsc files served from assets. The worker reads
|
|
12
12
|
pre-computed Flight payloads instead of executing handler code.
|
|
13
13
|
|
|
14
|
+
## Not this skill if…
|
|
15
|
+
|
|
16
|
+
- You want a cached HTML shell captured at runtime, with holes and loaders
|
|
17
|
+
staying live per request — see `/ppr`.
|
|
18
|
+
- You want runtime segment caching with TTL/SWR — that is the `cache()` DSL:
|
|
19
|
+
see `/caching`. Prerender is the same cache filled at build time.
|
|
20
|
+
|
|
14
21
|
## API: Prerender
|
|
15
22
|
|
|
16
23
|
### Static Route (no params)
|
|
@@ -51,8 +58,14 @@ path("/blog/:slug", BlogPost, { name: "blog.post" })
|
|
|
51
58
|
|
|
52
59
|
### With Passthrough (live fallback for unknown params)
|
|
53
60
|
|
|
61
|
+
Wrap a `Prerender` definition with `Passthrough()` to add a separate live handler
|
|
62
|
+
for unknown params at runtime. The build handler runs at build time, the live
|
|
63
|
+
handler runs at request time.
|
|
64
|
+
|
|
54
65
|
```typescript
|
|
55
|
-
|
|
66
|
+
import { Prerender, Passthrough } from "@rangojs/router";
|
|
67
|
+
|
|
68
|
+
export const ProductPageDef = Prerender(
|
|
56
69
|
async () => {
|
|
57
70
|
const top = await db.query("SELECT id FROM products WHERE featured");
|
|
58
71
|
return top.map(p => ({ id: p.id }));
|
|
@@ -61,30 +74,42 @@ export const ProductPage = Prerender(
|
|
|
61
74
|
const product = await db.query("SELECT * FROM products WHERE id = ?", ctx.params.id);
|
|
62
75
|
return <Product data={product} />;
|
|
63
76
|
},
|
|
64
|
-
{
|
|
77
|
+
{ concurrency: 4 }
|
|
65
78
|
);
|
|
79
|
+
|
|
80
|
+
// In route definition:
|
|
81
|
+
path("/products/:id", Passthrough(ProductPageDef, async (ctx) => {
|
|
82
|
+
const product = await ctx.env.DB.query("SELECT * FROM products WHERE id = ?", ctx.params.id);
|
|
83
|
+
return <Product data={product} />;
|
|
84
|
+
}), { name: "product" })
|
|
66
85
|
```
|
|
67
86
|
|
|
68
|
-
## Passthrough
|
|
87
|
+
## Passthrough Wrapper
|
|
69
88
|
|
|
70
|
-
|
|
89
|
+
`Passthrough(prerenderDef, liveHandler)` wraps a `Prerender` definition with a
|
|
90
|
+
separate handler for runtime fallback. The build and live handlers are separate
|
|
91
|
+
functions — no `ctx.build` branching needed.
|
|
71
92
|
|
|
72
|
-
|
|
|
73
|
-
|
|
74
|
-
| Known params
|
|
75
|
-
| Unknown params
|
|
76
|
-
|
|
|
77
|
-
|
|
|
78
|
-
| `
|
|
93
|
+
| | Plain `Prerender` (no wrapper) | `Passthrough(def, liveHandler)` |
|
|
94
|
+
| ------------------- | --------------------------------------- | ---------------------------------------- |
|
|
95
|
+
| Known params | Served from pre-rendered Flight payload | Served from pre-rendered Flight payload |
|
|
96
|
+
| Unknown params | Handler evicted, no live fallback | Live handler runs at request time |
|
|
97
|
+
| `ctx.passthrough()` | Throws (not on Passthrough route) | Skips artifact, defers to live handler |
|
|
98
|
+
| Bundle size | Build handler code + imports removed | Build handler evicted, live handler kept |
|
|
99
|
+
| `revalidate()` | Not allowed (handler gone) | Allowed (live handler can re-render) |
|
|
100
|
+
| `loading()` | Ignored (segments fully resolved) | Works for live fallback renders |
|
|
79
101
|
|
|
80
|
-
### When to use
|
|
102
|
+
### When to use Passthrough
|
|
103
|
+
|
|
104
|
+
Use `Passthrough()` when:
|
|
81
105
|
|
|
82
|
-
Use `passthrough: true` when:
|
|
83
106
|
- The route has a large or open-ended param space (e.g., user profiles, product pages)
|
|
84
107
|
- You want to pre-render popular/known params for speed but still serve unknown params live
|
|
85
108
|
- You need `revalidate()` on the route
|
|
109
|
+
- The live handler needs runtime bindings (e.g., `ctx.env.DB`)
|
|
110
|
+
|
|
111
|
+
Use plain `Prerender` (no wrapper) when:
|
|
86
112
|
|
|
87
|
-
Use `passthrough: false` (default) when:
|
|
88
113
|
- All possible params are known at build time (e.g., markdown files, config-driven pages)
|
|
89
114
|
- You want maximum bundle size reduction (handler code + node:fs imports removed)
|
|
90
115
|
- The route uses build-only APIs (node:fs, local files) not available at runtime
|
|
@@ -95,18 +120,61 @@ Handlers receive `BuildContext` at build time, a subset of the runtime `HandlerC
|
|
|
95
120
|
|
|
96
121
|
```typescript
|
|
97
122
|
interface BuildContext<TParams> {
|
|
98
|
-
params: TParams;
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
123
|
+
params: TParams; // From getParams
|
|
124
|
+
build: true; // Always true at build time
|
|
125
|
+
dev: boolean; // true in Vite dev mode, false during production build
|
|
126
|
+
use: <T>(handle: Handle<T>) => (data: T) => void; // Push handle data
|
|
127
|
+
url: URL; // Synthetic URL from pattern + params
|
|
128
|
+
pathname: string; // Pathname from synthetic URL
|
|
129
|
+
searchParams: URLSearchParams; // URLSearchParams from the synthetic URL (always empty for prerender)
|
|
130
|
+
search: {}; // Typed search params -- always {} for prerender (no real query string)
|
|
131
|
+
set(key: string, value: any): void; // Set context variable (string key)
|
|
132
|
+
set<T>(contextVar: ContextVar<T>, value: T): void; // Set typed context variable
|
|
133
|
+
get(key: string): any; // Read context variable (string key)
|
|
134
|
+
get<T>(contextVar: ContextVar<T>): T | undefined; // Read typed context variable
|
|
135
|
+
reverse(
|
|
136
|
+
name: string,
|
|
137
|
+
params?: Record<string, string>,
|
|
138
|
+
search?: Record<string, unknown>,
|
|
139
|
+
): string; // URL generation
|
|
140
|
+
passthrough(): PrerenderPassthroughResult; // Skip local artifact (Passthrough routes only)
|
|
141
|
+
dynamic(): void; // No-op in Prerender/Static handlers; use middleware for PPR shell opt-out
|
|
142
|
+
env: DefaultEnv; // Available when buildEnv is configured in rango() (throws otherwise)
|
|
143
|
+
// NOT available: request, headers, cookies (always throw)
|
|
103
144
|
}
|
|
104
145
|
```
|
|
105
146
|
|
|
147
|
+
Use `createVar<T>()` to share typed data from a Prerender handler to child layouts:
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
import { Prerender, createVar } from "@rangojs/router";
|
|
151
|
+
|
|
152
|
+
interface PaginationData { current: number; total: number; }
|
|
153
|
+
export const Pagination = createVar<PaginationData>();
|
|
154
|
+
|
|
155
|
+
export const ArticleList = Prerender<{ page: string }>(
|
|
156
|
+
async () => [{ page: "1" }, { page: "2" }],
|
|
157
|
+
async (ctx) => {
|
|
158
|
+
ctx.set(Pagination, { current: Number(ctx.params.page), total: 2 });
|
|
159
|
+
return <Articles />;
|
|
160
|
+
},
|
|
161
|
+
);
|
|
162
|
+
```
|
|
163
|
+
|
|
106
164
|
All items inside the path's use() callback (child layouts, parallels) also receive
|
|
107
165
|
`BuildContext` during pre-rendering. Loaders are the exception -- they run at
|
|
108
166
|
request time with full server context.
|
|
109
167
|
|
|
168
|
+
This is one reason prerender is a good fit for handler-first composition:
|
|
169
|
+
the handler and its child layouts/parallels participate in the same full
|
|
170
|
+
render pass, so data set with `ctx.set()` is available downstream via
|
|
171
|
+
`ctx.get()`.
|
|
172
|
+
|
|
173
|
+
At runtime, partial action revalidation follows a narrower rule: only
|
|
174
|
+
revalidated segments are recomputed. If a child segment depends on data
|
|
175
|
+
established by an outer handler/layout, that outer segment must also be
|
|
176
|
+
revalidated, or the child must load/guard the data independently.
|
|
177
|
+
|
|
110
178
|
## Supported Export Patterns
|
|
111
179
|
|
|
112
180
|
All of the following are equivalent and fully supported by the Vite transform:
|
|
@@ -139,15 +207,17 @@ In production builds, `Prerender` exports are replaced with stubs:
|
|
|
139
207
|
// Original
|
|
140
208
|
export const BlogPost = Prerender(getParams, handler);
|
|
141
209
|
|
|
142
|
-
// Stubbed (
|
|
143
|
-
export const BlogPost = {
|
|
210
|
+
// Stubbed (all Prerender handlers are evicted)
|
|
211
|
+
export const BlogPost = {
|
|
212
|
+
__brand: "prerenderHandler",
|
|
213
|
+
$$id: "abc123#BlogPost",
|
|
214
|
+
};
|
|
144
215
|
```
|
|
145
216
|
|
|
146
|
-
|
|
147
|
-
|
|
217
|
+
All Prerender handlers are evicted in production. The live handler for
|
|
218
|
+
`Passthrough()` routes lives in the urls module and is not evicted.
|
|
148
219
|
|
|
149
|
-
In client and SSR environments, ALL prerender handlers are always stubbed
|
|
150
|
-
(passthrough only affects the RSC server bundle).
|
|
220
|
+
In client and SSR environments, ALL prerender handlers are always stubbed.
|
|
151
221
|
|
|
152
222
|
## Sub-use Semantics
|
|
153
223
|
|
|
@@ -181,22 +251,78 @@ path("/blog/:slug", BlogPost, { name: "blog.post" }, () => [
|
|
|
181
251
|
|
|
182
252
|
## Interaction with DSL Items
|
|
183
253
|
|
|
184
|
-
| DSL item | Behavior with Prerender
|
|
185
|
-
|
|
186
|
-
| `loader()` | Live at runtime, bundled normally. Use `cache()` for caching.
|
|
187
|
-
| `revalidate()` | Not allowed without
|
|
188
|
-
| `cache()` | Orthogonal -- use on parent layouts and loaders.
|
|
189
|
-
| `layout()` | Child layouts inside path are pre-rendered. Parent layouts are live.
|
|
190
|
-
| `parallel()` | Parallel slots inside path are pre-rendered.
|
|
191
|
-
| `middleware()`
|
|
192
|
-
| `loading()` | Ignored without
|
|
193
|
-
| `intercept()` |
|
|
254
|
+
| DSL item | Behavior with Prerender |
|
|
255
|
+
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
256
|
+
| `loader()` | Live at runtime, bundled normally. Use `cache()` for caching. |
|
|
257
|
+
| `revalidate()` | Not allowed without Passthrough. Allowed with Passthrough. |
|
|
258
|
+
| `cache()` | Orthogonal -- use on parent layouts and loaders. |
|
|
259
|
+
| `layout()` | Child layouts inside path are pre-rendered. Parent layouts are live. |
|
|
260
|
+
| `parallel()` | Parallel slots inside path are pre-rendered. |
|
|
261
|
+
| `middleware()` | Skipped while collecting build-time Flight payloads (no request). For `Prerender` + `ppr`, producer B replays global and route middleware during build-shell capture with `ctx.build === true`; `ctx.dynamic()` skips that shell. Runs at request time for loaders. |
|
|
262
|
+
| `loading()` | Ignored without Passthrough. Works for live fallback with Passthrough. |
|
|
263
|
+
| `intercept()` | Pre-rendered at build time. Intercept variant stored under `/i` key alongside main segments. At runtime, the correct variant is served based on `ctx.isIntercept`. `when` config conditions are skipped at build time (all intercepts are pre-rendered unconditionally). |
|
|
264
|
+
|
|
265
|
+
When Passthrough revalidation is enabled, remember that revalidation is
|
|
266
|
+
still partial: opting a child segment into revalidation does not
|
|
267
|
+
implicitly re-run outer prerender-derived handlers/layouts.
|
|
268
|
+
|
|
269
|
+
## Prerender + PPR Build Shells
|
|
270
|
+
|
|
271
|
+
A `Prerender` page may also declare `ppr` on the path option. The build still
|
|
272
|
+
stores the Flight payload first. After that, producer B tries to bake the HTML
|
|
273
|
+
shell for each generated URL so the first document request can be an
|
|
274
|
+
`x-rango-shell: HIT`.
|
|
275
|
+
|
|
276
|
+
That shell capture is request-shaped enough to run middleware safely:
|
|
277
|
+
|
|
278
|
+
- global and route middleware run before shell capture;
|
|
279
|
+
- middleware sees `ctx.build === true`;
|
|
280
|
+
- `ctx.waitUntil()` is inert during build;
|
|
281
|
+
- `ctx.dynamic()` skips the baked shell for that URL.
|
|
282
|
+
|
|
283
|
+
Use `ctx.build` inside middleware to avoid runtime-only side effects during
|
|
284
|
+
build shell capture, or call `ctx.dynamic()` to leave that route to runtime
|
|
285
|
+
PPR. Runtime requests still run the normal middleware chain.
|
|
286
|
+
|
|
287
|
+
### Freshness of a build shell
|
|
288
|
+
|
|
289
|
+
A build-baked shell is not on a wall clock the way a pure runtime `ppr` shell is.
|
|
290
|
+
It serves from the first request after a deploy and keeps serving until one of:
|
|
291
|
+
|
|
292
|
+
- **a redeploy** — the `buildVersion` gate retires every build entry (like a
|
|
293
|
+
React-version bump); the new build re-bakes;
|
|
294
|
+
- **`updateTag`** on a tag the shell carries — drops it, so the next request
|
|
295
|
+
MISSes and a runtime capture takes over.
|
|
296
|
+
|
|
297
|
+
`ppr.ttl` / `swr` are staleness-only here, NOT an expiry: past `ttl` the baked
|
|
298
|
+
entry STILL serves and a runtime recapture is scheduled that upgrades it in place
|
|
299
|
+
(SWR is the upgrade path from build entry → fresher runtime entry). Because the
|
|
300
|
+
`Prerender` handler is evicted from the production bundle, that recapture never
|
|
301
|
+
re-runs the handler — it replays the same build-time segments and only refreshes
|
|
302
|
+
`cache()`-scoped data baked into the shell. **If nothing in the shell is
|
|
303
|
+
`cache()`-backed, `ttl` has nothing to refresh** — reach for `updateTag` (or a
|
|
304
|
+
redeploy) instead of a shorter `ttl`.
|
|
305
|
+
|
|
306
|
+
`ctx.dynamic()` opts a request off the shell axis ONLY. A `Prerender` route has
|
|
307
|
+
no live handler to fall back to (it was evicted), so a `dynamic()` request still
|
|
308
|
+
serves the build-baked B-segments — fresh loaders in their holes, not a fresh
|
|
309
|
+
handler render. There is no "fully dynamic" render for a prerendered route.
|
|
194
310
|
|
|
195
311
|
## Dev Mode
|
|
196
312
|
|
|
197
|
-
In dev mode
|
|
198
|
-
|
|
199
|
-
|
|
313
|
+
In dev mode there is no production-style prerender build pass and no handler
|
|
314
|
+
stubbing.
|
|
315
|
+
|
|
316
|
+
**Node.js dev server** — `Prerender` acts as a normal handler. Routes render
|
|
317
|
+
live on every request with full runtime context (`ctx.build === false`).
|
|
318
|
+
|
|
319
|
+
**Non-Node runtimes (Cloudflare workerd, Deno workers)** — Handlers that
|
|
320
|
+
depend on Node APIs (e.g. `node:fs`) cannot run in-process. The Vite plugin
|
|
321
|
+
can intercept these requests and resolve them via the `/__rsc_prerender`
|
|
322
|
+
endpoint, which runs `matchForPrerender` in a Node.js temp server. In this
|
|
323
|
+
path the handler receives `BuildContext` (`ctx.build === true`) and segments
|
|
324
|
+
are resolved identically to production prerendering, then served on-demand.
|
|
325
|
+
This only applies when `__PRERENDER_DEV_URL` is set by the plugin.
|
|
200
326
|
|
|
201
327
|
## Storage Layout
|
|
202
328
|
|
|
@@ -212,41 +338,249 @@ dist/static/__<hash>/
|
|
|
212
338
|
_.flight # static route, no params
|
|
213
339
|
```
|
|
214
340
|
|
|
341
|
+
## Concurrency
|
|
342
|
+
|
|
343
|
+
Prerender handlers can specify how many param sets render in parallel:
|
|
344
|
+
|
|
345
|
+
```typescript
|
|
346
|
+
export const BlogPost = Prerender(
|
|
347
|
+
async () => posts.map(p => ({ slug: p.slug })),
|
|
348
|
+
async (ctx) => <PostPage slug={ctx.params.slug} />,
|
|
349
|
+
{ concurrency: 4 },
|
|
350
|
+
);
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
Default is `1` (sequential). Only `Prerender` supports concurrency; `Static` handlers
|
|
354
|
+
always render sequentially.
|
|
355
|
+
|
|
356
|
+
## Skipping Entries with Skip
|
|
357
|
+
|
|
358
|
+
Throw `Skip` inside a Prerender or Static handler to skip an individual entry
|
|
359
|
+
without failing the build:
|
|
360
|
+
|
|
361
|
+
```typescript
|
|
362
|
+
import { Prerender, Skip } from "@rangojs/router";
|
|
363
|
+
|
|
364
|
+
export const BlogPost = Prerender(
|
|
365
|
+
async () => [{ slug: "published" }, { slug: "draft" }],
|
|
366
|
+
async (ctx) => {
|
|
367
|
+
if (ctx.params.slug === "draft") {
|
|
368
|
+
throw new Skip("Draft articles are not pre-rendered");
|
|
369
|
+
}
|
|
370
|
+
return <PostPage slug={ctx.params.slug} />;
|
|
371
|
+
},
|
|
372
|
+
);
|
|
373
|
+
|
|
374
|
+
// Wrap with Passthrough to serve skipped params live at runtime
|
|
375
|
+
export const BlogPost = Passthrough(BlogPostDef, async (ctx) => {
|
|
376
|
+
if (ctx.params.slug === "draft") {
|
|
377
|
+
throw new Skip("Draft articles are not pre-rendered");
|
|
378
|
+
}
|
|
379
|
+
return <PostPage slug={ctx.params.slug} />;
|
|
380
|
+
});
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
Skipped entries are excluded from the build output. With `Passthrough()`,
|
|
384
|
+
the live handler serves skipped params at request time.
|
|
385
|
+
|
|
386
|
+
`Skip` also works in `Static` handlers:
|
|
387
|
+
|
|
388
|
+
```typescript
|
|
389
|
+
import { Static, Skip } from "@rangojs/router";
|
|
390
|
+
|
|
391
|
+
export const TocSidebar = Static(() => {
|
|
392
|
+
throw new Skip("Not ready for pre-rendering");
|
|
393
|
+
});
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### Error behavior at build time
|
|
397
|
+
|
|
398
|
+
When a render throws a non-`Skip` error, it is **surfaced to the build** — never
|
|
399
|
+
baked into a frozen error page served as a 200 (issue #587). What happens next is
|
|
400
|
+
controlled by `prerender.onError` in your `rango()` options:
|
|
401
|
+
|
|
402
|
+
```ts
|
|
403
|
+
rango({ prerender: { onError: "warn" } }); // default is "fail"
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
| Handler outcome | `onError: "fail"` (default) | `onError: "warn"` |
|
|
407
|
+
| --------------------------- | -------------------------------------------- | -------------------------------- |
|
|
408
|
+
| JSX / `null` | Normal prerender entry, log OK | Normal prerender entry, log OK |
|
|
409
|
+
| `return ctx.passthrough()` | Skip entry, log PASS (Passthrough routes) | Skip entry, log PASS |
|
|
410
|
+
| `throw new Skip("reason")` | Skip entry, log SKIP, continue | Skip entry, log SKIP, continue |
|
|
411
|
+
| `throw new Error("reason")` | Log FAIL, stop ALL pre-rendering, fail build | Log WARN, skip the URL, continue |
|
|
412
|
+
|
|
413
|
+
With `"warn"` the errored entry is logged and left un-baked (never served as a baked
|
|
414
|
+
200 error page). `"warn"` is a build-unblock, not a runtime contract: the route falls
|
|
415
|
+
through to normal resolution — it may render live (its handler is still bundled) or
|
|
416
|
+
404 (once other baked entries trigger prerender handler eviction), so the outcome
|
|
417
|
+
depends on the rest of the build, and a skipped `Static()` handler's evicted code can
|
|
418
|
+
surface as an error. For DEFINED runtime behavior reach for `Passthrough()` (a live
|
|
419
|
+
fallback) or `throw new Skip()` (an intentional skip — works in the render fn, not
|
|
420
|
+
only `getParams()`); otherwise prefer the default `"fail"`.
|
|
421
|
+
|
|
422
|
+
Both `Skip` and hard errors propagate to the router's `onError` callback with phase
|
|
423
|
+
`"prerender"` or `"static"`.
|
|
424
|
+
|
|
425
|
+
### Build logs
|
|
426
|
+
|
|
427
|
+
The build produces per-URL timing logs:
|
|
428
|
+
|
|
429
|
+
```
|
|
430
|
+
[rango] Pre-rendering 12 URL(s) (concurrency: 4)...
|
|
431
|
+
[rango] OK /articles/hello (42ms)
|
|
432
|
+
[rango] PASS /articles/remote-only (5ms) - live fallback
|
|
433
|
+
[rango] SKIP /articles/draft-post (3ms) - Article is a draft
|
|
434
|
+
[rango] Pre-render complete: 11 done, 1 skipped (1204ms total)
|
|
435
|
+
|
|
436
|
+
[rango] Rendering 3 static handler(s)...
|
|
437
|
+
[rango] OK DocsLayout (28ms)
|
|
438
|
+
[rango] SKIP TocSidebar (1ms) - Not ready
|
|
439
|
+
[rango] Static render complete: 2 done, 1 skipped (120ms total)
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
A `FAIL` line is logged per-URL when a handler throws a non-Skip error (with the
|
|
443
|
+
default `prerender.onError: "fail"`). The error is re-thrown immediately, so no
|
|
444
|
+
summary line is printed — the build stops at the first failure. Under
|
|
445
|
+
`prerender.onError: "warn"` the same case logs a `WARN` line, skips that URL, and
|
|
446
|
+
the build continues.
|
|
447
|
+
|
|
448
|
+
### Dev mode behavior
|
|
449
|
+
|
|
450
|
+
**Node.js dev server** — `Skip` behaves like a regular runtime error because
|
|
451
|
+
the handler runs live with `ctx.build === false`.
|
|
452
|
+
|
|
453
|
+
**Non-Node runtimes using `/__rsc_prerender`** — `Skip` participates in the
|
|
454
|
+
on-demand prerender path, so build-style skip logic does run for that request.
|
|
455
|
+
The dev prerender endpoint treats it like a prerender miss and the request
|
|
456
|
+
falls back according to normal dev/runtime behavior.
|
|
457
|
+
|
|
458
|
+
## Per-Param Passthrough with ctx.passthrough()
|
|
459
|
+
|
|
460
|
+
On routes wrapped with `Passthrough()`, the build handler can return
|
|
461
|
+
`ctx.passthrough()` to skip writing a local prerender artifact for a specific
|
|
462
|
+
param set. At runtime, the missing entry falls through to the live handler.
|
|
463
|
+
|
|
464
|
+
```typescript
|
|
465
|
+
export const BlogPostDef = Prerender(
|
|
466
|
+
async () => [{ slug: "a" }, { slug: "b" }, { slug: "c" }],
|
|
467
|
+
async (ctx) => {
|
|
468
|
+
const post = await getPost(ctx.params.slug);
|
|
469
|
+
if (!post) return ctx.passthrough();
|
|
470
|
+
return <article>{post.content}</article>;
|
|
471
|
+
},
|
|
472
|
+
);
|
|
473
|
+
|
|
474
|
+
export const BlogPost = Passthrough(BlogPostDef, async (ctx) => {
|
|
475
|
+
const post = await getPost(ctx.params.slug);
|
|
476
|
+
return <article>{post.content}</article>;
|
|
477
|
+
});
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### Semantics
|
|
481
|
+
|
|
482
|
+
- JSX or `null` from the build handler produces a normal prerender entry.
|
|
483
|
+
- `ctx.passthrough()` returns a sentinel that signals "no local artifact".
|
|
484
|
+
The build skips the manifest entry for that param set.
|
|
485
|
+
- `ctx.passthrough()` on a route not wrapped with `Passthrough()` throws.
|
|
486
|
+
- `ctx.passthrough()` at runtime (`ctx.build === false`) also throws.
|
|
487
|
+
It is a build-time-only control flow.
|
|
488
|
+
- `getParams()` still enumerates the param set; the build handler decides
|
|
489
|
+
per-param whether to produce an artifact or defer to the live handler.
|
|
490
|
+
|
|
491
|
+
### Difference from Skip
|
|
492
|
+
|
|
493
|
+
| Mechanism | Effect on build | Runtime behavior |
|
|
494
|
+
| ------------------- | ---------------------- | ------------------------------------------------------ |
|
|
495
|
+
| `throw new Skip()` | Skips entry, logs SKIP | No artifact, no live fallback unless Passthrough route |
|
|
496
|
+
| `ctx.passthrough()` | Skips entry, logs PASS | Always defers to live handler (requires Passthrough) |
|
|
497
|
+
|
|
498
|
+
Use `ctx.passthrough()` when you want the live handler to run at request time
|
|
499
|
+
for specific params. Use `Skip` when you want to exclude params entirely.
|
|
500
|
+
|
|
501
|
+
### Use case: Remote storage
|
|
502
|
+
|
|
503
|
+
`ctx.passthrough()` enables a pattern where build-time data is stored in a
|
|
504
|
+
remote KV store instead of the local prerender manifest. The build handler
|
|
505
|
+
pre-computes data during `getParams`, pushes it to KV, then calls
|
|
506
|
+
`ctx.passthrough()` so the local build skips the artifact. At runtime,
|
|
507
|
+
the Passthrough live handler reads from KV:
|
|
508
|
+
|
|
509
|
+
```typescript
|
|
510
|
+
export const ProductDef = Prerender(
|
|
511
|
+
async () => {
|
|
512
|
+
const products = await db.getFeaturedProducts();
|
|
513
|
+
for (const p of products) {
|
|
514
|
+
await kv.put(`product:${p.id}`, await renderProduct(p));
|
|
515
|
+
}
|
|
516
|
+
return products.map(p => ({ id: p.id }));
|
|
517
|
+
},
|
|
518
|
+
async (ctx) => {
|
|
519
|
+
// At build time: skip local artifact, data is in KV
|
|
520
|
+
return ctx.passthrough();
|
|
521
|
+
},
|
|
522
|
+
);
|
|
523
|
+
|
|
524
|
+
export const Product = Passthrough(ProductDef, async (ctx) => {
|
|
525
|
+
// At runtime: read from KV, fall back to DB
|
|
526
|
+
const cached = await kv.get(`product:${ctx.params.id}`);
|
|
527
|
+
if (cached) return cached;
|
|
528
|
+
return <Product data={await ctx.env.DB.getProduct(ctx.params.id)} />;
|
|
529
|
+
});
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### Build logs
|
|
533
|
+
|
|
534
|
+
Passthrough entries are logged distinctly:
|
|
535
|
+
|
|
536
|
+
```
|
|
537
|
+
[rango] OK /blog/a (42ms)
|
|
538
|
+
[rango] PASS /blog/b (3ms) - live fallback
|
|
539
|
+
[rango] OK /blog/c (38ms)
|
|
540
|
+
```
|
|
541
|
+
|
|
215
542
|
## Edge Cases and Constraints
|
|
216
543
|
|
|
217
544
|
### Loaders are always live
|
|
545
|
+
|
|
218
546
|
Loaders on pre-rendered routes run at request time. They are bundled normally
|
|
219
547
|
and need `cache()` for caching. Do not use build-only APIs in loaders.
|
|
220
548
|
|
|
221
549
|
### Handle data is frozen
|
|
550
|
+
|
|
222
551
|
Handle values pushed via `ctx.use()` during pre-rendering are baked into the
|
|
223
552
|
Flight payload. They do not update at request time.
|
|
224
553
|
|
|
225
554
|
### Server actions work normally
|
|
555
|
+
|
|
226
556
|
Actions do not re-render the B segment. The pre-rendered handler output stays
|
|
227
|
-
frozen. Loaders are live and can be revalidated by actions. With `
|
|
228
|
-
and `revalidate()`, the handler
|
|
557
|
+
frozen. Loaders are live and can be revalidated by actions. With `Passthrough()`
|
|
558
|
+
and `revalidate()`, the live handler can re-render.
|
|
229
559
|
|
|
230
560
|
### Empty getParams
|
|
561
|
+
|
|
231
562
|
If `getParams` returns an empty array, no Flight payloads are written. No error.
|
|
232
563
|
|
|
233
564
|
### Route name is required
|
|
565
|
+
|
|
234
566
|
Routes using `Prerender` must have a `name` in path options.
|
|
235
567
|
The name is used as the storage key for Flight payloads.
|
|
236
568
|
|
|
237
|
-
### No revalidate without
|
|
238
|
-
|
|
569
|
+
### No revalidate without Passthrough
|
|
570
|
+
|
|
571
|
+
Using `revalidate()` without `Passthrough()` produces a build-time warning.
|
|
239
572
|
The handler is evicted -- there is nothing to re-render.
|
|
240
573
|
|
|
241
|
-
### loading() is ignored without
|
|
574
|
+
### loading() is ignored without Passthrough
|
|
575
|
+
|
|
242
576
|
Pre-rendered segments are fully resolved at build time and never suspend.
|
|
243
|
-
With `
|
|
577
|
+
With `Passthrough()`, `loading()` works for live fallback renders.
|
|
244
578
|
|
|
245
579
|
## Complete Example
|
|
246
580
|
|
|
247
581
|
```typescript
|
|
248
582
|
// pages/guides-handler.tsx
|
|
249
|
-
import { Prerender } from "@rangojs/router";
|
|
583
|
+
import { Prerender, Passthrough } from "@rangojs/router";
|
|
250
584
|
import { Link } from "@rangojs/router/client";
|
|
251
585
|
import { href } from "../router.js";
|
|
252
586
|
|
|
@@ -255,7 +589,7 @@ const knownGuides: Record<string, string> = {
|
|
|
255
589
|
caching: "Caching Guide",
|
|
256
590
|
};
|
|
257
591
|
|
|
258
|
-
export const
|
|
592
|
+
export const GuidesDetailDef = Prerender<{ slug: string }>(
|
|
259
593
|
async () => Object.keys(knownGuides).map((slug) => ({ slug })),
|
|
260
594
|
async (ctx) => {
|
|
261
595
|
const title = knownGuides[ctx.params.slug] ?? `Guide: ${ctx.params.slug}`;
|
|
@@ -271,9 +605,23 @@ export const GuidesDetail = Prerender<{ slug: string }>(
|
|
|
271
605
|
</div>
|
|
272
606
|
);
|
|
273
607
|
},
|
|
274
|
-
{ passthrough: true },
|
|
275
608
|
);
|
|
276
609
|
|
|
610
|
+
export const GuidesDetail = Passthrough(GuidesDetailDef, async (ctx) => {
|
|
611
|
+
const title = knownGuides[ctx.params.slug] ?? `Guide: ${ctx.params.slug}`;
|
|
612
|
+
return (
|
|
613
|
+
<div>
|
|
614
|
+
<h1>{title}</h1>
|
|
615
|
+
<p>Slug: {ctx.params.slug}</p>
|
|
616
|
+
<nav>
|
|
617
|
+
<Link to={href("guides.detail", { slug: "routing" })}>Routing</Link>
|
|
618
|
+
{" | "}
|
|
619
|
+
<Link to={href("guides.detail", { slug: "dynamic-test" })}>Dynamic</Link>
|
|
620
|
+
</nav>
|
|
621
|
+
</div>
|
|
622
|
+
);
|
|
623
|
+
});
|
|
624
|
+
|
|
277
625
|
// pages/guides.tsx
|
|
278
626
|
import { urls } from "@rangojs/router";
|
|
279
627
|
import { GuidesDetail } from "./guides-handler.js";
|
|
@@ -283,23 +631,110 @@ export const guidesPatterns = urls(({ path }) => [
|
|
|
283
631
|
]);
|
|
284
632
|
|
|
285
633
|
// urls.tsx
|
|
286
|
-
import { urls
|
|
634
|
+
import { urls } from "@rangojs/router";
|
|
287
635
|
import { guidesPatterns } from "./pages/guides.js";
|
|
288
636
|
|
|
289
|
-
export const urlpatterns = urls(({ path }) => [
|
|
637
|
+
export const urlpatterns = urls(({ path, include }) => [
|
|
290
638
|
path("/", HomePage, { name: "home" }),
|
|
291
639
|
include("/guides", guidesPatterns, { name: "guides" }),
|
|
292
640
|
]);
|
|
293
641
|
```
|
|
294
642
|
|
|
643
|
+
## Interaction with intercept()
|
|
644
|
+
|
|
645
|
+
When a pre-rendered route is also the target of an `intercept()`, the build system
|
|
646
|
+
resolves the intercept handler at build time and stores a combined entry (main
|
|
647
|
+
segments + intercept segments) under an `/i`-suffixed key alongside the main entry:
|
|
648
|
+
|
|
649
|
+
```
|
|
650
|
+
prerender store keys:
|
|
651
|
+
"blog.post/a1b2c3" -> main segments (full page)
|
|
652
|
+
"blog.post/a1b2c3/i" -> main segments + intercept segments (modal variant)
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
At runtime, the cache-lookup middleware checks `ctx.isIntercept`:
|
|
656
|
+
|
|
657
|
+
- **Intercept navigation**: looks up `paramHash/i` first. If found, yields
|
|
658
|
+
the combined entry. `handleCacheHitIntercept()` extracts intercept segments
|
|
659
|
+
(filtered by `namespace?.startsWith("intercept:")`) and sets up slots.
|
|
660
|
+
- **Direct navigation**: looks up `paramHash` (no suffix). Standard prerender path.
|
|
661
|
+
- **Intercept miss (no `/i` entry)**: falls through to the normal pipeline so
|
|
662
|
+
intercept-resolution middleware runs live. This handles `when` config conditions
|
|
663
|
+
that prevented pre-rendering.
|
|
664
|
+
|
|
665
|
+
The `when` config selector receives an `InterceptSelectorContext` with `from.pathname`
|
|
666
|
+
which is unknown at build time. All intercepts are pre-rendered unconditionally;
|
|
667
|
+
`when` is evaluated at runtime by the intercept-resolution middleware.
|
|
668
|
+
|
|
669
|
+
### Example: Pre-rendered route with intercept
|
|
670
|
+
|
|
671
|
+
```typescript
|
|
672
|
+
// Route handler is pre-rendered at build time
|
|
673
|
+
export const ProductDetail = Prerender(
|
|
674
|
+
async () => [{ slug: "shoes" }, { slug: "jacket" }],
|
|
675
|
+
async (ctx) => <ProductPage slug={ctx.params.slug} />,
|
|
676
|
+
);
|
|
677
|
+
|
|
678
|
+
// urls.tsx
|
|
679
|
+
layout(ShopLayout, () => [
|
|
680
|
+
path("/:slug", ProductDetail, { name: "detail" }, () => [
|
|
681
|
+
loader(ProductLoader),
|
|
682
|
+
]),
|
|
683
|
+
|
|
684
|
+
// Intercept detail from shop index into a modal.
|
|
685
|
+
// At build time, this is resolved and stored under the /i key.
|
|
686
|
+
intercept(
|
|
687
|
+
"@modal",
|
|
688
|
+
".detail",
|
|
689
|
+
<ProductModal />,
|
|
690
|
+
{ when: ({ from }) => from.pathname === "/shop" },
|
|
691
|
+
() => [loader(ProductLoader)],
|
|
692
|
+
),
|
|
693
|
+
])
|
|
694
|
+
```
|
|
695
|
+
|
|
696
|
+
Both `ProductPage` (main) and `ProductModal` (intercept) are frozen at build time.
|
|
697
|
+
Loaders run fresh at request time for both variants.
|
|
698
|
+
|
|
295
699
|
## Trie Flags
|
|
296
700
|
|
|
297
701
|
Pre-rendered routes set flags on the route trie leaf at build time:
|
|
298
702
|
|
|
299
703
|
- `pr: true` -- route has pre-rendered B segment data
|
|
300
|
-
- `pt: true` --
|
|
704
|
+
- `pt: true` -- route wrapped with `Passthrough()` (live handler available)
|
|
301
705
|
|
|
302
706
|
At runtime, the cache-lookup middleware uses these flags:
|
|
707
|
+
|
|
303
708
|
- `pr + hit` -- serve pre-rendered Flight payload
|
|
304
|
-
- `pr + pt + miss` -- fall through to live handler
|
|
709
|
+
- `pr + pt + miss` -- fall through to Passthrough live handler
|
|
305
710
|
- `pr + miss` (no pt) -- fall through (handler stubbed, no live render)
|
|
711
|
+
|
|
712
|
+
## Contributor Checklist
|
|
713
|
+
|
|
714
|
+
Before changing prerender behavior, run these tests.
|
|
715
|
+
|
|
716
|
+
### Tests to run
|
|
717
|
+
|
|
718
|
+
```bash
|
|
719
|
+
# Core prerender e2e (Passthrough, eviction, loaders, sub-use, intercept)
|
|
720
|
+
pnpm --filter @rangojs/router exec playwright test prerender
|
|
721
|
+
|
|
722
|
+
# Prerender-specific unit test
|
|
723
|
+
pnpm --filter @rangojs/router run test:unit -- prerender-passthrough
|
|
724
|
+
|
|
725
|
+
# Semantic matrix (prerender rows cover intercept + ctx propagation)
|
|
726
|
+
pnpm --filter @rangojs/router exec playwright test semantic-matrix
|
|
727
|
+
|
|
728
|
+
# Handler-first (ctx.set/get visibility with prerender handlers)
|
|
729
|
+
pnpm --filter @rangojs/router exec playwright test handler-first
|
|
730
|
+
```
|
|
731
|
+
|
|
732
|
+
### Dev-only vs build-parity
|
|
733
|
+
|
|
734
|
+
- Prerender e2e tests run against a real production build by default (the
|
|
735
|
+
fixture builds the test app). Dev-mode prerender behavior is tested via
|
|
736
|
+
`/__rsc_prerender` endpoint tests and node.js dev-server fallback.
|
|
737
|
+
- Log-based assertions (build output lines, debug cache logs) are inherently
|
|
738
|
+
dev/build-only and do not need a production counterpart.
|
|
739
|
+
- Behavioral assertions (rendered content, loader freshness, Passthrough
|
|
740
|
+
fallback, intercept variant selection) must work in the production build.
|