@rangojs/router 0.0.0-experimental.141 → 0.0.0-experimental.142
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +6 -10
- package/README.md +17 -0
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +82 -15
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +19 -18
- package/skills/api-client/SKILL.md +1 -1
- package/skills/breadcrumbs/SKILL.md +1 -1
- package/skills/cache-guide/SKILL.md +1 -1
- package/skills/caching/SKILL.md +17 -1
- package/skills/catalog.json +265 -0
- package/skills/comparison/references/framework-comparison.md +1 -1
- package/skills/composability/SKILL.md +1 -1
- package/skills/debug-manifest/SKILL.md +1 -1
- package/skills/document-cache/SKILL.md +9 -1
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +1 -1
- package/skills/hooks/SKILL.md +54 -892
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +1 -1
- package/skills/i18n/SKILL.md +1 -1
- package/skills/intercept/SKILL.md +8 -1
- package/skills/layout/SKILL.md +1 -1
- package/skills/links/SKILL.md +1 -1
- package/skills/loader/SKILL.md +8 -1
- package/skills/middleware/SKILL.md +1 -1
- package/skills/migrate-nextjs/SKILL.md +133 -1
- package/skills/migrate-react-router/SKILL.md +42 -816
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +1 -1
- package/skills/observability/SKILL.md +1 -1
- package/skills/parallel/SKILL.md +8 -1
- package/skills/ppr/SKILL.md +261 -28
- package/skills/prerender/SKILL.md +8 -1
- package/skills/rango/SKILL.md +12 -12
- package/skills/response-routes/SKILL.md +1 -1
- package/skills/route/SKILL.md +1 -1
- package/skills/router-setup/SKILL.md +1 -1
- package/skills/scripts/SKILL.md +1 -1
- package/skills/server-actions/SKILL.md +3 -2
- package/skills/shell-manifest/SKILL.md +1 -1
- package/skills/streams-and-websockets/SKILL.md +1 -1
- package/skills/tailwind/SKILL.md +1 -1
- package/skills/testing/SKILL.md +1 -1
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +44 -919
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +305 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +7 -1
- package/skills/vercel/SKILL.md +1 -1
- package/skills/view-transitions/SKILL.md +1 -1
- package/src/browser/event-controller.ts +41 -10
- package/src/browser/logging.ts +10 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-client.ts +5 -1
- package/src/browser/navigation-store.ts +46 -6
- package/src/browser/partial-update.ts +27 -15
- package/src/browser/prefetch/cache.ts +26 -4
- package/src/browser/prefetch/fetch.ts +27 -17
- package/src/browser/react/Link.tsx +13 -3
- package/src/browser/react/NavigationProvider.tsx +21 -19
- package/src/browser/scroll-restoration.ts +7 -5
- package/src/browser/segment-reconciler.ts +31 -21
- package/src/browser/types.ts +12 -0
- package/src/cache/cache-runtime.ts +203 -23
- package/src/cache/document-cache.ts +20 -9
- package/src/cache/memory-segment-store.ts +53 -2
- package/src/cache/segment-codec.ts +4 -4
- package/src/cache/shell-snapshot.ts +50 -1
- package/src/cache/types.ts +25 -5
- package/src/cache/vercel/vercel-cache-store.ts +131 -107
- package/src/router/manifest.ts +13 -5
- package/src/router/match-api.ts +70 -30
- package/src/router/match-handlers.ts +6 -2
- package/src/router/match-result.ts +35 -15
- package/src/router/middleware.ts +10 -3
- package/src/router/request-classification.ts +20 -7
- package/src/router/route-snapshot.ts +10 -0
- package/src/router/segment-resolution/fresh.ts +25 -4
- package/src/router/segment-resolution/loader-cache.ts +57 -8
- package/src/router/segment-resolution/loader-mask.ts +26 -3
- package/src/router/segment-resolution/loader-snapshot.ts +170 -0
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/rsc-rendering.ts +39 -8
- package/src/rsc/shell-capture.ts +196 -13
- package/src/rsc/shell-serve.ts +26 -0
- package/src/server/cookie-store.ts +6 -0
- package/src/server/request-context.ts +33 -0
- package/src/ssr/index.tsx +7 -0
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/router-discovery.ts +78 -15
|
@@ -201,17 +201,23 @@ export function buildMatchResult<TEnv>(
|
|
|
201
201
|
|
|
202
202
|
let allIds: string[];
|
|
203
203
|
let segmentsToRender: ResolvedSegment[];
|
|
204
|
+
let resolvedIds: string[];
|
|
204
205
|
|
|
205
206
|
if (ctx.isFullMatch) {
|
|
207
|
+
// One pass over allSegments: dedup by id (segmentsToRender + allIds) while
|
|
208
|
+
// collecting every id for resolvedIds, which keeps duplicates unlike allIds.
|
|
206
209
|
const seen = new Set<string>();
|
|
207
210
|
segmentsToRender = [];
|
|
211
|
+
allIds = [];
|
|
212
|
+
resolvedIds = [];
|
|
208
213
|
for (const s of allSegments) {
|
|
214
|
+
resolvedIds.push(s.id);
|
|
209
215
|
if (!seen.has(s.id)) {
|
|
210
216
|
seen.add(s.id);
|
|
211
217
|
segmentsToRender.push(s);
|
|
218
|
+
allIds.push(s.id);
|
|
212
219
|
}
|
|
213
220
|
}
|
|
214
|
-
allIds = segmentsToRender.map((s) => s.id);
|
|
215
221
|
} else {
|
|
216
222
|
allIds = ctx.interceptResult
|
|
217
223
|
? ctx.clientSegmentIds.length > 0
|
|
@@ -221,11 +227,21 @@ export function buildMatchResult<TEnv>(
|
|
|
221
227
|
|
|
222
228
|
allIds = [...new Set(allIds)];
|
|
223
229
|
|
|
230
|
+
// One pass over allSegments: keep renderable segments and collect the
|
|
231
|
+
// handler-ran ids (resolvedIds) together.
|
|
224
232
|
const clientIdSet = new Set(ctx.clientSegmentIds);
|
|
225
|
-
segmentsToRender =
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
233
|
+
segmentsToRender = [];
|
|
234
|
+
resolvedIds = [];
|
|
235
|
+
for (const s of allSegments) {
|
|
236
|
+
if (s._handlerRan) resolvedIds.push(s.id);
|
|
237
|
+
if (
|
|
238
|
+
s.component !== null ||
|
|
239
|
+
s.type === "loader" ||
|
|
240
|
+
!clientIdSet.has(s.id)
|
|
241
|
+
) {
|
|
242
|
+
segmentsToRender.push(s);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
229
245
|
}
|
|
230
246
|
|
|
231
247
|
const { segments: dedupedSegments, removedIds } = deduplicateLoaderSegments(
|
|
@@ -236,20 +252,24 @@ export function buildMatchResult<TEnv>(
|
|
|
236
252
|
const matchedIds =
|
|
237
253
|
removedIds.size > 0 ? allIds.filter((id) => !removedIds.has(id)) : allIds;
|
|
238
254
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
const
|
|
244
|
-
if (s._handlerRan === undefined)
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
255
|
+
// One pass over dedupedSegments: strip the internal _handlerRan marker and
|
|
256
|
+
// collect the diff ids (id is unchanged by the strip) together.
|
|
257
|
+
const cleanedSegments: ResolvedSegment[] = [];
|
|
258
|
+
const diff: string[] = [];
|
|
259
|
+
for (const s of dedupedSegments) {
|
|
260
|
+
if (s._handlerRan === undefined) {
|
|
261
|
+
cleanedSegments.push(s);
|
|
262
|
+
} else {
|
|
263
|
+
const { _handlerRan: _drop, ...rest } = s;
|
|
264
|
+
cleanedSegments.push(rest as ResolvedSegment);
|
|
265
|
+
}
|
|
266
|
+
diff.push(s.id);
|
|
267
|
+
}
|
|
248
268
|
|
|
249
269
|
return {
|
|
250
270
|
segments: cleanedSegments,
|
|
251
271
|
matched: matchedIds,
|
|
252
|
-
diff
|
|
272
|
+
diff,
|
|
253
273
|
resolvedIds,
|
|
254
274
|
params: ctx.matched.params,
|
|
255
275
|
routeName: ctx.routeKey,
|
package/src/router/middleware.ts
CHANGED
|
@@ -186,7 +186,15 @@ export function createMiddlewareContext<TEnv>(
|
|
|
186
186
|
search?: Record<string, unknown>,
|
|
187
187
|
) => string,
|
|
188
188
|
): MiddlewareContext<TEnv> {
|
|
189
|
-
|
|
189
|
+
// Reuse the request context's clean URL when available. Each middleware still
|
|
190
|
+
// gets its OWN URL clone (a middleware may mutate ctx.url / ctx.searchParams),
|
|
191
|
+
// but cloning the already-clean URL is cheaper than re-parsing + re-stripping
|
|
192
|
+
// request.url per middleware. Fall back to parsing when no ALS context.
|
|
193
|
+
const reqCtx = _getRequestContext();
|
|
194
|
+
const ctxUrl = reqCtx?.url;
|
|
195
|
+
const url = ctxUrl
|
|
196
|
+
? new URL(ctxUrl)
|
|
197
|
+
: stripInternalParams(new URL(request.url));
|
|
190
198
|
|
|
191
199
|
// Track the initial response to detect pre/post-next() phase.
|
|
192
200
|
// Before next(): responseHolder.response === initialResponse (the stub).
|
|
@@ -217,12 +225,11 @@ export function createMiddlewareContext<TEnv>(
|
|
|
217
225
|
return responseHolder.response;
|
|
218
226
|
};
|
|
219
227
|
|
|
220
|
-
//
|
|
228
|
+
// reqCtx captured once above: the request-scoped platform fields
|
|
221
229
|
// (originalUrl, executionContext, waitUntil) are immutable per request,
|
|
222
230
|
// so snapshotting beats re-reading ALS on every access. The lazy getters
|
|
223
231
|
// below (routeName, theme, setTheme) stay lazy because those can change
|
|
224
232
|
// during `await next()`.
|
|
225
|
-
const reqCtx = _getRequestContext();
|
|
226
233
|
return {
|
|
227
234
|
request,
|
|
228
235
|
url,
|
|
@@ -150,6 +150,23 @@ export async function classifyRequest<TEnv = any>(
|
|
|
150
150
|
const pathname = url.pathname;
|
|
151
151
|
const isAction =
|
|
152
152
|
request.headers.has("rsc-action") || url.searchParams.has("_rsc_action");
|
|
153
|
+
const isLoaderFetch = url.searchParams.has("_rsc_loader");
|
|
154
|
+
const isPartialReq = url.searchParams.has("_rsc_partial");
|
|
155
|
+
const contentType = request.headers.get("content-type") || "";
|
|
156
|
+
const isFormSubmission =
|
|
157
|
+
contentType.includes("multipart/form-data") ||
|
|
158
|
+
contentType.includes("application/x-www-form-urlencoded");
|
|
159
|
+
const isPeRender = request.method === "POST" && !isAction && isFormSubmission;
|
|
160
|
+
|
|
161
|
+
// A plain document request (full-render mode) is the only mode that renders
|
|
162
|
+
// through match() with isSSR:true; every other mode (action, loader, PE,
|
|
163
|
+
// partial) renders — if at all — through the non-SSR matchPartial() path.
|
|
164
|
+
// Resolve the manifest under the flag the eventual render will use so
|
|
165
|
+
// createMatchContextForFull can reuse this snapshot instead of re-resolving.
|
|
166
|
+
// Response routes ignore isSSR entirely (they short-circuit before match),
|
|
167
|
+
// so the flag is moot for them. Mode detection below reuses these booleans.
|
|
168
|
+
const willFullRender =
|
|
169
|
+
!isAction && !isLoaderFetch && !isPartialReq && !isPeRender;
|
|
153
170
|
|
|
154
171
|
const clientVersion = url.searchParams.get("_rsc_v");
|
|
155
172
|
if (
|
|
@@ -191,6 +208,7 @@ export async function classifyRequest<TEnv = any>(
|
|
|
191
208
|
const result = await resolveRoute<TEnv>(pathname, {
|
|
192
209
|
findMatch: deps.findMatch,
|
|
193
210
|
lite: true,
|
|
211
|
+
isSSR: willFullRender,
|
|
194
212
|
});
|
|
195
213
|
|
|
196
214
|
if (!result) {
|
|
@@ -231,7 +249,6 @@ export async function classifyRequest<TEnv = any>(
|
|
|
231
249
|
|
|
232
250
|
const actionId =
|
|
233
251
|
request.headers.get("rsc-action") || url.searchParams.get("_rsc_action");
|
|
234
|
-
const isLoaderFetch = url.searchParams.has("_rsc_loader");
|
|
235
252
|
|
|
236
253
|
const hasVariants =
|
|
237
254
|
snapshot.matched.negotiateVariants &&
|
|
@@ -246,15 +263,11 @@ export async function classifyRequest<TEnv = any>(
|
|
|
246
263
|
return { mode: "loader", route: snapshot };
|
|
247
264
|
}
|
|
248
265
|
|
|
249
|
-
|
|
250
|
-
const isFormSubmission =
|
|
251
|
-
contentType.includes("multipart/form-data") ||
|
|
252
|
-
contentType.includes("application/x-www-form-urlencoded");
|
|
253
|
-
if (request.method === "POST" && !isAction && isFormSubmission) {
|
|
266
|
+
if (isPeRender) {
|
|
254
267
|
return { mode: "pe-render", route: snapshot };
|
|
255
268
|
}
|
|
256
269
|
|
|
257
|
-
if (
|
|
270
|
+
if (isPartialReq) {
|
|
258
271
|
return { mode: "partial-render", route: snapshot, negotiated };
|
|
259
272
|
}
|
|
260
273
|
|
|
@@ -48,6 +48,15 @@ export interface RouteSnapshot<TEnv = any> {
|
|
|
48
48
|
isPassthrough: boolean;
|
|
49
49
|
/** Response type for non-RSC routes (e.g. "application/json") */
|
|
50
50
|
responseType?: string;
|
|
51
|
+
/**
|
|
52
|
+
* The isSSR flag the manifest was resolved with. Recorded so consumers can
|
|
53
|
+
* decide whether the snapshot is reusable: a snapshot resolved with isSSR
|
|
54
|
+
* differs (loading({ ssr: false }) entries) and is cached under a different
|
|
55
|
+
* manifest partition, so the full (document) path only reuses an isSSR:true
|
|
56
|
+
* snapshot and the partial path only reuses a non-isSSR one. Undefined on
|
|
57
|
+
* inline snapshots (redirect / not-found) that are never reused.
|
|
58
|
+
*/
|
|
59
|
+
isSSR?: boolean;
|
|
51
60
|
}
|
|
52
61
|
|
|
53
62
|
export type ResolveRouteResult<TEnv = any> =
|
|
@@ -177,6 +186,7 @@ export async function resolveRoute<TEnv = any>(
|
|
|
177
186
|
cacheScope,
|
|
178
187
|
isPassthrough,
|
|
179
188
|
responseType,
|
|
189
|
+
isSSR,
|
|
180
190
|
},
|
|
181
191
|
};
|
|
182
192
|
}
|
|
@@ -19,7 +19,10 @@ import type {
|
|
|
19
19
|
} from "../../types";
|
|
20
20
|
import type { SegmentResolutionDeps } from "../types.js";
|
|
21
21
|
import { resolveLoaderData } from "./loader-cache.js";
|
|
22
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
isShellCaptureActive,
|
|
24
|
+
entryLoadingMasksLoaders,
|
|
25
|
+
} from "./loader-mask.js";
|
|
23
26
|
import {
|
|
24
27
|
handleHandlerResult,
|
|
25
28
|
tryStaticHandler,
|
|
@@ -62,7 +65,7 @@ export async function resolveLoaders<TEnv>(
|
|
|
62
65
|
const loadingDisabled = hasLoading && entry.loading === false;
|
|
63
66
|
|
|
64
67
|
// Emit the streaming (non-awaiting) loader shape when loading is enabled OR
|
|
65
|
-
// during a PPR shell capture. In capture, loaders are masked with
|
|
68
|
+
// during a PPR shell capture. In capture, LIVE-lane loaders are masked with
|
|
66
69
|
// never-resolving promises (loader-mask.ts); the loading-disabled branch below
|
|
67
70
|
// AWAITS the loader promises, which would hang the capture render's match()
|
|
68
71
|
// forever on those masked promises. Forcing the streaming shape lets match()
|
|
@@ -71,6 +74,14 @@ export async function resolveLoaders<TEnv>(
|
|
|
71
74
|
// loading-disabled entries consult it), so normal requests are unchanged.
|
|
72
75
|
const emitStreaming = !loadingDisabled || isShellCaptureActive();
|
|
73
76
|
|
|
77
|
+
// PPR lane decision for this entry's loaders (loader-container-bake): an
|
|
78
|
+
// entry WITHOUT renderable loading() puts its loaders on the BAKE lane —
|
|
79
|
+
// executed at capture (container bakes, nested pending promises hole at the
|
|
80
|
+
// consumer's Suspense) and overlay-pinned from the shell snapshot on a HIT.
|
|
81
|
+
// Renderable loading() keeps the LIVE lane (masked at capture, always
|
|
82
|
+
// fresh). Computed per entry; resolveLoaderData applies the policy.
|
|
83
|
+
const bakeLane = !entryLoadingMasksLoaders(entry.loading);
|
|
84
|
+
|
|
74
85
|
// Error context for wrapLoaderPromise: without it, a throwing DSL loader never
|
|
75
86
|
// fires createRouter({ onError }) (phase "loader") nor emits the loader.error
|
|
76
87
|
// telemetry event — wrapLoaderPromise only builds the onError/telemetry path
|
|
@@ -93,7 +104,12 @@ export async function resolveLoaders<TEnv>(
|
|
|
93
104
|
loaderId: loader.$$id,
|
|
94
105
|
loaderData: deps.wrapLoaderPromise(
|
|
95
106
|
runInsideLoaderScope(() =>
|
|
96
|
-
resolveLoaderData(
|
|
107
|
+
resolveLoaderData(
|
|
108
|
+
loaderEntry,
|
|
109
|
+
ctx,
|
|
110
|
+
ctx.pathname,
|
|
111
|
+
bakeLane ? segmentId : null,
|
|
112
|
+
),
|
|
97
113
|
),
|
|
98
114
|
entry,
|
|
99
115
|
segmentId,
|
|
@@ -122,7 +138,12 @@ export async function resolveLoaders<TEnv>(
|
|
|
122
138
|
const segmentId = `${shortCode}D${i}.${loader.$$id}`;
|
|
123
139
|
const wrapped = deps.wrapLoaderPromise(
|
|
124
140
|
runInsideLoaderScope(() =>
|
|
125
|
-
resolveLoaderData(
|
|
141
|
+
resolveLoaderData(
|
|
142
|
+
loaderEntry,
|
|
143
|
+
ctx,
|
|
144
|
+
ctx.pathname,
|
|
145
|
+
bakeLane ? segmentId : null,
|
|
146
|
+
),
|
|
126
147
|
),
|
|
127
148
|
entry,
|
|
128
149
|
segmentId,
|
|
@@ -23,6 +23,7 @@ import type { HandlerContext, InternalHandlerContext } from "../../types.js";
|
|
|
23
23
|
import { INTERNAL_RANGO_DEBUG } from "../../internal-debug.js";
|
|
24
24
|
import {
|
|
25
25
|
getRequestContext,
|
|
26
|
+
_getRequestContext,
|
|
26
27
|
runWithRequestContext,
|
|
27
28
|
} from "../../server/request-context.js";
|
|
28
29
|
import { sortedRouteParams } from "../../cache/cache-key-utils.js";
|
|
@@ -35,6 +36,7 @@ import {
|
|
|
35
36
|
DEFAULT_ROUTE_TTL,
|
|
36
37
|
} from "../../cache/cache-policy.js";
|
|
37
38
|
import { readThroughItem } from "../../cache/read-through-swr.js";
|
|
39
|
+
import { overlayLoaderContainer } from "./loader-snapshot.js";
|
|
38
40
|
import { recordRequestTags } from "../../cache/cache-tag.js";
|
|
39
41
|
import {
|
|
40
42
|
isShellCaptureActive,
|
|
@@ -130,17 +132,64 @@ export function resolveLoaderData<TEnv>(
|
|
|
130
132
|
loaderEntry: LoaderEntry,
|
|
131
133
|
ctx: HandlerContext<any, TEnv>,
|
|
132
134
|
pathname: string,
|
|
135
|
+
bakeSegmentKey?: string | null,
|
|
133
136
|
): Promise<any> {
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
//
|
|
140
|
-
|
|
141
|
-
|
|
137
|
+
// One ALS read serves the capture check, the record registration, and the
|
|
138
|
+
// seed lookup — this runs for every loader on every request.
|
|
139
|
+
const reqCtx = _getRequestContext();
|
|
140
|
+
// PPR shell capture policy — gated here, the single funnel every loader
|
|
141
|
+
// segment path routes through (fresh resolveLoaders, cache-hit
|
|
142
|
+
// resolveLoadersOnly, revalidation resolveLoadersOnlyWithRevalidation).
|
|
143
|
+
//
|
|
144
|
+
// Two lanes (docs/design/loader-container-bake.md):
|
|
145
|
+
// - LIVE lane (entry has renderable loading(); no `bakeSegmentKey`): never
|
|
146
|
+
// execute during capture. The slot gets a never-resolving promise so the
|
|
147
|
+
// LoaderBoundary postpones (a hole). See loader-mask.ts.
|
|
148
|
+
// - BAKE lane (no renderable loading(); callers pass `bakeSegmentKey`):
|
|
149
|
+
// execute during capture exactly like axis 1 — the settled container bakes
|
|
150
|
+
// into the prelude, nested pending promises postpone at the consumer's own
|
|
151
|
+
// Suspense. The container promise is registered on the derived context so
|
|
152
|
+
// captureAndStoreShell pins it into the snapshot's loader family; on a
|
|
153
|
+
// shell HIT the recorded container is overlaid onto the fresh run so the
|
|
154
|
+
// payload matches the frozen prelude byte-for-byte.
|
|
155
|
+
if (isShellCaptureActive(reqCtx)) {
|
|
156
|
+
if (!bakeSegmentKey) {
|
|
157
|
+
return createMaskedLoaderPromise();
|
|
158
|
+
}
|
|
159
|
+
const containerPromise = executeLoaderData(loaderEntry, ctx, pathname);
|
|
160
|
+
// Pre-attach a no-op catch: a bake-lane rejection during capture must
|
|
161
|
+
// surface through the drain's refusal (and the wrapper's error boundary),
|
|
162
|
+
// never as an unhandled rejection that can kill the worker before the
|
|
163
|
+
// drain probes this record.
|
|
164
|
+
containerPromise.catch(() => {});
|
|
165
|
+
reqCtx?._shellCaptureLoaderRecords?.set(bakeSegmentKey, containerPromise);
|
|
166
|
+
return containerPromise;
|
|
142
167
|
}
|
|
143
168
|
|
|
169
|
+
if (bakeSegmentKey) {
|
|
170
|
+
const seed = reqCtx?._shellLoaderSeed;
|
|
171
|
+
if (seed && seed.has(bakeSegmentKey)) {
|
|
172
|
+
const recorded = seed.get(bakeSegmentKey);
|
|
173
|
+
// HIT tail: run fresh (only the loader body can mint the live nested
|
|
174
|
+
// promises), then pin the recorded paths over it. A fresh REJECTION here
|
|
175
|
+
// skips the overlay and flows to the per-loader error boundary — the
|
|
176
|
+
// payload then diverges from the prelude (same residual class as uncached
|
|
177
|
+
// nondeterminism in shell material).
|
|
178
|
+
return executeLoaderData(loaderEntry, ctx, pathname).then(
|
|
179
|
+
(fresh: unknown) => overlayLoaderContainer(fresh, recorded),
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return executeLoaderData(loaderEntry, ctx, pathname);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** The pre-policy loader execution: cache read-through or plain ctx.use. */
|
|
188
|
+
function executeLoaderData<TEnv>(
|
|
189
|
+
loaderEntry: LoaderEntry,
|
|
190
|
+
ctx: HandlerContext<any, TEnv>,
|
|
191
|
+
pathname: string,
|
|
192
|
+
): Promise<any> {
|
|
144
193
|
const cacheConfig = loaderEntry.cache;
|
|
145
194
|
|
|
146
195
|
// No cache config or disabled — run fresh (zero overhead path)
|
|
@@ -18,7 +18,10 @@
|
|
|
18
18
|
* `resolveLoaderData`, fresh.ts `resolveLoaders`).
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
_getRequestContext,
|
|
23
|
+
type RequestContext,
|
|
24
|
+
} from "../../server/request-context.js";
|
|
22
25
|
|
|
23
26
|
/**
|
|
24
27
|
* True when the current render is the active PPR shell capture and route loaders
|
|
@@ -27,8 +30,10 @@ import { _getRequestContext } from "../../server/request-context.js";
|
|
|
27
30
|
* runWithRequestContext), so it is accurate at the loader resolution sites, which
|
|
28
31
|
* run synchronously inside the pipeline's context frame.
|
|
29
32
|
*/
|
|
30
|
-
export function isShellCaptureActive(
|
|
31
|
-
|
|
33
|
+
export function isShellCaptureActive(
|
|
34
|
+
reqCtx: RequestContext<any> | undefined = _getRequestContext(),
|
|
35
|
+
): boolean {
|
|
36
|
+
return reqCtx?._shellCaptureRun === true;
|
|
32
37
|
}
|
|
33
38
|
|
|
34
39
|
/**
|
|
@@ -42,3 +47,21 @@ export function isShellCaptureActive(): boolean {
|
|
|
42
47
|
export function createMaskedLoaderPromise<T = unknown>(): Promise<T> {
|
|
43
48
|
return new Promise<T>(() => {});
|
|
44
49
|
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Lane decision for an entry's loaders under PPR (the loading() value decides;
|
|
53
|
+
* docs/design/loader-container-bake.md):
|
|
54
|
+
*
|
|
55
|
+
* - RENDERABLE loading() (the LoaderBoundary Suspense fallback) — the LIVE
|
|
56
|
+
* lane: masked at capture, guaranteed fresh on every serve. Returns true.
|
|
57
|
+
* - No loading() (absent, or explicitly `false`, incl. `loading(x, { ssr:
|
|
58
|
+
* false })` under the SSR manifest) — the BAKE lane: the loader executes
|
|
59
|
+
* during capture, its settled container bakes, nested pending promises hole
|
|
60
|
+
* at the consumer's own Suspense. Returns false.
|
|
61
|
+
*
|
|
62
|
+
* Mirrors segment-system's isRenderableLoading so the mask decision and the
|
|
63
|
+
* tree's boundary placement can never disagree.
|
|
64
|
+
*/
|
|
65
|
+
export function entryLoadingMasksLoaders(loading: unknown): boolean {
|
|
66
|
+
return loading !== undefined && loading !== null && loading !== false;
|
|
67
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loader-family capture snapshot: elide + overlay for bake-lane loader
|
|
3
|
+
* containers (docs/design/loader-container-bake.md).
|
|
4
|
+
*
|
|
5
|
+
* A loader on an entry with NO renderable loading() executes during shell
|
|
6
|
+
* capture; its settled container bakes into the prelude while every promise
|
|
7
|
+
* still pending at the quiet window postpones as a hole. To keep a HIT's fresh
|
|
8
|
+
* payload byte-identical to that frozen prelude, the capture pins the container
|
|
9
|
+
* in the shell snapshot:
|
|
10
|
+
*
|
|
11
|
+
* - elide: deep-walk the settled container; a SETTLED nested promise baked
|
|
12
|
+
* its value (physics: it won the quiet window), so it is pinned as
|
|
13
|
+
* that value; a PENDING nested promise is a hole, replaced by
|
|
14
|
+
* {@link LOADER_HOLE_MARKER}. The result is promise-free and
|
|
15
|
+
* Flight-serializable.
|
|
16
|
+
* - overlay: on a HIT the loader runs fresh (only the loader body can mint
|
|
17
|
+
* the live nested promises), then the recorded container is laid
|
|
18
|
+
* over it: recorded paths win (they are what the prelude froze),
|
|
19
|
+
* marker paths take the fresh run's value (the live hole), and
|
|
20
|
+
* fresh-only paths pass through (they cannot contradict prelude
|
|
21
|
+
* bytes that never rendered them).
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { isThenable } from "../../handles/is-thenable.js";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Marker object standing in for a pending nested promise in a recorded loader
|
|
28
|
+
* container. Shape-checked (not identity-checked) because the record round-trips
|
|
29
|
+
* through Flight serialization and a JSON-embedding store envelope.
|
|
30
|
+
*/
|
|
31
|
+
export const LOADER_HOLE_KEY = "$rangoLoaderHole" as const;
|
|
32
|
+
|
|
33
|
+
export interface LoaderHoleMarker {
|
|
34
|
+
[LOADER_HOLE_KEY]: 1;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function isLoaderHoleMarker(value: unknown): value is LoaderHoleMarker {
|
|
38
|
+
return (
|
|
39
|
+
typeof value === "object" &&
|
|
40
|
+
value !== null &&
|
|
41
|
+
(value as Record<string, unknown>)[LOADER_HOLE_KEY] === 1
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
46
|
+
if (typeof value !== "object" || value === null) return false;
|
|
47
|
+
const proto = Object.getPrototypeOf(value);
|
|
48
|
+
return proto === Object.prototype || proto === null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Probe whether a promise is already settled without waiting for it: races it
|
|
53
|
+
* against an immediately-resolved sentinel across two microtask hops (then
|
|
54
|
+
* chaining means a resolved inner value needs one extra hop to surface).
|
|
55
|
+
* Returns the settled state, or "pending" if it has not settled by then.
|
|
56
|
+
*/
|
|
57
|
+
async function probeSettled(
|
|
58
|
+
p: PromiseLike<unknown>,
|
|
59
|
+
): Promise<
|
|
60
|
+
| { state: "fulfilled"; value: unknown }
|
|
61
|
+
| { state: "rejected" }
|
|
62
|
+
| { state: "pending" }
|
|
63
|
+
> {
|
|
64
|
+
const PENDING = Symbol("pending");
|
|
65
|
+
// Two sentinel hops: Promise.resolve(p) adoption costs a microtask, so a
|
|
66
|
+
// single-hop sentinel would misreport an already-fulfilled promise as pending.
|
|
67
|
+
const sentinel = Promise.resolve()
|
|
68
|
+
.then(() => undefined)
|
|
69
|
+
.then(() => PENDING as unknown);
|
|
70
|
+
try {
|
|
71
|
+
const raced = await Promise.race([Promise.resolve(p), sentinel]);
|
|
72
|
+
if (raced === PENDING) return { state: "pending" };
|
|
73
|
+
return { state: "fulfilled", value: raced };
|
|
74
|
+
} catch {
|
|
75
|
+
return { state: "rejected" };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export type ElideResult =
|
|
80
|
+
| { state: "ok"; value: unknown }
|
|
81
|
+
| { state: "rejected" };
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Deep-elide a settled bake-lane container for recording. Settled nested
|
|
85
|
+
* promises are inlined (they baked); pending ones become hole markers; a
|
|
86
|
+
* REJECTED nested promise poisons the record (error UI must never bake into a
|
|
87
|
+
* shared shell) — the caller refuses the capture. Only plain objects/arrays are
|
|
88
|
+
* traversed; anything else (Date, Map, class instance) is a pinned leaf.
|
|
89
|
+
* Cycles are cut as pinned references (best effort — Flight rejects true
|
|
90
|
+
* cycles later regardless).
|
|
91
|
+
*/
|
|
92
|
+
export async function elideLoaderContainer(
|
|
93
|
+
value: unknown,
|
|
94
|
+
seen: Set<object> = new Set(),
|
|
95
|
+
): Promise<ElideResult> {
|
|
96
|
+
if (isThenable(value)) {
|
|
97
|
+
const probed = await probeSettled(value);
|
|
98
|
+
if (probed.state === "pending") {
|
|
99
|
+
return { state: "ok", value: { [LOADER_HOLE_KEY]: 1 } };
|
|
100
|
+
}
|
|
101
|
+
if (probed.state === "rejected") return { state: "rejected" };
|
|
102
|
+
return elideLoaderContainer(probed.value, seen);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (Array.isArray(value)) {
|
|
106
|
+
if (seen.has(value)) return { state: "ok", value };
|
|
107
|
+
seen.add(value);
|
|
108
|
+
const out: unknown[] = new Array(value.length);
|
|
109
|
+
for (let i = 0; i < value.length; i++) {
|
|
110
|
+
const r = await elideLoaderContainer(value[i], seen);
|
|
111
|
+
if (r.state === "rejected") return r;
|
|
112
|
+
out[i] = r.value;
|
|
113
|
+
}
|
|
114
|
+
return { state: "ok", value: out };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (isPlainObject(value)) {
|
|
118
|
+
if (seen.has(value)) return { state: "ok", value };
|
|
119
|
+
seen.add(value);
|
|
120
|
+
const out: Record<string, unknown> = {};
|
|
121
|
+
for (const key of Object.keys(value)) {
|
|
122
|
+
const r = await elideLoaderContainer(value[key], seen);
|
|
123
|
+
if (r.state === "rejected") return r;
|
|
124
|
+
out[key] = r.value;
|
|
125
|
+
}
|
|
126
|
+
return { state: "ok", value: out };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return { state: "ok", value };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Overlay a recorded (elided) container onto the fresh run's container for a
|
|
134
|
+
* shell HIT. Recorded wins per path; hole markers take the fresh value (the
|
|
135
|
+
* live nested promise); fresh-only object keys pass through. Where the shapes
|
|
136
|
+
* disagree structurally, recorded wins wholesale — it is what the prelude
|
|
137
|
+
* froze, and parity beats freshness inside the shell.
|
|
138
|
+
*/
|
|
139
|
+
export function overlayLoaderContainer(
|
|
140
|
+
fresh: unknown,
|
|
141
|
+
recorded: unknown,
|
|
142
|
+
): unknown {
|
|
143
|
+
if (isLoaderHoleMarker(recorded)) return fresh;
|
|
144
|
+
|
|
145
|
+
if (Array.isArray(recorded)) {
|
|
146
|
+
const freshArr = Array.isArray(fresh) ? fresh : [];
|
|
147
|
+
return recorded.map((item, i) => overlayLoaderContainer(freshArr[i], item));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (isPlainObject(recorded)) {
|
|
151
|
+
if (!isPlainObject(fresh)) {
|
|
152
|
+
// Shape drift: still honor markers (holes fall back to undefined).
|
|
153
|
+
const out: Record<string, unknown> = {};
|
|
154
|
+
for (const key of Object.keys(recorded)) {
|
|
155
|
+
out[key] = overlayLoaderContainer(undefined, recorded[key]);
|
|
156
|
+
}
|
|
157
|
+
return out;
|
|
158
|
+
}
|
|
159
|
+
const out: Record<string, unknown> = {};
|
|
160
|
+
for (const key of Object.keys(recorded)) {
|
|
161
|
+
out[key] = overlayLoaderContainer(fresh[key], recorded[key]);
|
|
162
|
+
}
|
|
163
|
+
for (const key of Object.keys(fresh)) {
|
|
164
|
+
if (!(key in out)) out[key] = fresh[key];
|
|
165
|
+
}
|
|
166
|
+
return out;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return recorded;
|
|
170
|
+
}
|
package/src/rsc/nonce.ts
CHANGED
|
@@ -8,11 +8,20 @@ import { createVar } from "../context-var.js";
|
|
|
8
8
|
/**
|
|
9
9
|
* Typed ContextVar token for CSP nonce.
|
|
10
10
|
*
|
|
11
|
-
* Use this to
|
|
11
|
+
* Use this to READ the nonce in middleware or handlers:
|
|
12
12
|
* ```ts
|
|
13
13
|
* import { nonce } from "@rangojs/router";
|
|
14
14
|
* const value = ctx.get(nonce); // string | undefined
|
|
15
15
|
* ```
|
|
16
|
+
*
|
|
17
|
+
* Supply the nonce via the `createRouter({ nonce })` provider, not by writing
|
|
18
|
+
* this token yourself. The provider value is threaded into the router's SSR
|
|
19
|
+
* machinery (NonceContext/useNonce, Scripts/MetaTags attributes, the inlined
|
|
20
|
+
* Flight payload scripts) AND sets this token. A direct `ctx.set(nonce, value)`
|
|
21
|
+
* in middleware runs AFTER the SSR nonce is resolved: the value is readable via
|
|
22
|
+
* `ctx.get(nonce)` and gates PPR shell capture (a per-request nonce must never
|
|
23
|
+
* bake into a shared shell), but the router will not apply it to its own
|
|
24
|
+
* scripts — useNonce() stays undefined for that request.
|
|
16
25
|
*/
|
|
17
26
|
export const nonce: ContextVar<string> = createVar<string>();
|
|
18
27
|
|