@rangojs/router 0.0.0-experimental.0b82333f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -0
- package/README.md +899 -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 +1601 -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 +5214 -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 +177 -0
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +262 -0
- package/skills/caching/SKILL.md +220 -0
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +112 -0
- package/skills/document-cache/SKILL.md +182 -0
- package/skills/fonts/SKILL.md +167 -0
- package/skills/hooks/SKILL.md +704 -0
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +313 -0
- package/skills/layout/SKILL.md +310 -0
- package/skills/links/SKILL.md +239 -0
- package/skills/loader/SKILL.md +596 -0
- package/skills/middleware/SKILL.md +339 -0
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +305 -0
- package/skills/prerender/SKILL.md +643 -0
- package/skills/rango/SKILL.md +118 -0
- package/skills/response-routes/SKILL.md +411 -0
- package/skills/route/SKILL.md +385 -0
- package/skills/router-setup/SKILL.md +439 -0
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/theme/SKILL.md +79 -0
- package/skills/typesafety/SKILL.md +623 -0
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +273 -0
- package/src/bin/rango.ts +321 -0
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/event-controller.ts +899 -0
- package/src/browser/history-state.ts +80 -0
- package/src/browser/index.ts +18 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +141 -0
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +134 -0
- package/src/browser/navigation-bridge.ts +640 -0
- package/src/browser/navigation-client.ts +215 -0
- package/src/browser/navigation-store.ts +806 -0
- package/src/browser/navigation-transaction.ts +295 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +552 -0
- package/src/browser/prefetch/cache.ts +154 -0
- package/src/browser/prefetch/fetch.ts +135 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +88 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +360 -0
- package/src/browser/react/NavigationProvider.tsx +386 -0
- package/src/browser/react/ScrollRestoration.tsx +94 -0
- package/src/browser/react/context.ts +59 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +52 -0
- package/src/browser/react/location-state-shared.ts +162 -0
- package/src/browser/react/location-state.ts +107 -0
- package/src/browser/react/mount-context.ts +37 -0
- 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 +218 -0
- package/src/browser/react/use-client-cache.ts +58 -0
- package/src/browser/react/use-handle.ts +162 -0
- package/src/browser/react/use-href.tsx +40 -0
- package/src/browser/react/use-link-status.ts +135 -0
- package/src/browser/react/use-mount.ts +31 -0
- package/src/browser/react/use-navigation.ts +99 -0
- package/src/browser/react/use-params.ts +65 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +63 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +171 -0
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +431 -0
- package/src/browser/scroll-restoration.ts +384 -0
- package/src/browser/segment-reconciler.ts +216 -0
- package/src/browser/segment-structure-assert.ts +83 -0
- package/src/browser/server-action-bridge.ts +667 -0
- package/src/browser/shallow.ts +40 -0
- package/src/browser/types.ts +538 -0
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +438 -0
- package/src/build/generate-route-types.ts +36 -0
- package/src/build/index.ts +35 -0
- package/src/build/route-trie.ts +265 -0
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +411 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +469 -0
- package/src/build/route-types/scan-filter.ts +78 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +338 -0
- package/src/cache/cache-scope.ts +382 -0
- package/src/cache/cf/cf-cache-store.ts +540 -0
- package/src/cache/cf/index.ts +25 -0
- package/src/cache/document-cache.ts +369 -0
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +43 -0
- package/src/cache/memory-segment-store.ts +328 -0
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +98 -0
- package/src/cache/types.ts +342 -0
- package/src/client.rsc.tsx +85 -0
- package/src/client.tsx +601 -0
- package/src/component-utils.ts +76 -0
- package/src/components/DefaultDocument.tsx +27 -0
- package/src/context-var.ts +86 -0
- package/src/debug.ts +243 -0
- package/src/default-error-boundary.tsx +88 -0
- package/src/deps/browser.ts +8 -0
- package/src/deps/html-stream-client.ts +2 -0
- package/src/deps/html-stream-server.ts +2 -0
- package/src/deps/rsc.ts +10 -0
- package/src/deps/ssr.ts +2 -0
- package/src/errors.ts +365 -0
- package/src/handle.ts +135 -0
- package/src/handles/MetaTags.tsx +246 -0
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +7 -0
- package/src/handles/meta.ts +264 -0
- package/src/host/cookie-handler.ts +165 -0
- package/src/host/errors.ts +97 -0
- package/src/host/index.ts +53 -0
- package/src/host/pattern-matcher.ts +214 -0
- package/src/host/router.ts +352 -0
- package/src/host/testing.ts +79 -0
- package/src/host/types.ts +146 -0
- package/src/host/utils.ts +25 -0
- package/src/href-client.ts +222 -0
- package/src/index.rsc.ts +233 -0
- package/src/index.ts +277 -0
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +89 -0
- package/src/loader.ts +64 -0
- package/src/network-error-thrower.tsx +23 -0
- package/src/outlet-context.ts +15 -0
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +185 -0
- package/src/prerender.ts +463 -0
- package/src/reverse.ts +330 -0
- package/src/root-error-boundary.tsx +289 -0
- package/src/route-content-wrapper.tsx +196 -0
- package/src/route-definition/dsl-helpers.ts +934 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +430 -0
- package/src/route-definition/index.ts +52 -0
- package/src/route-definition/redirect.ts +93 -0
- package/src/route-definition.ts +1 -0
- package/src/route-map-builder.ts +275 -0
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +259 -0
- package/src/router/content-negotiation.ts +116 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +287 -0
- package/src/router/find-match.ts +158 -0
- package/src/router/handler-context.ts +451 -0
- package/src/router/intercept-resolution.ts +395 -0
- package/src/router/lazy-includes.ts +234 -0
- package/src/router/loader-resolution.ts +420 -0
- package/src/router/logging.ts +248 -0
- package/src/router/manifest.ts +267 -0
- package/src/router/match-api.ts +620 -0
- package/src/router/match-context.ts +266 -0
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +223 -0
- package/src/router/match-middleware/cache-lookup.ts +634 -0
- package/src/router/match-middleware/cache-store.ts +295 -0
- package/src/router/match-middleware/index.ts +81 -0
- package/src/router/match-middleware/intercept-resolution.ts +306 -0
- package/src/router/match-middleware/segment-resolution.ts +192 -0
- package/src/router/match-pipelines.ts +179 -0
- package/src/router/match-result.ts +219 -0
- package/src/router/metrics.ts +282 -0
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +222 -0
- package/src/router/middleware.ts +748 -0
- package/src/router/pattern-matching.ts +563 -0
- package/src/router/prerender-match.ts +402 -0
- package/src/router/preview-match.ts +170 -0
- package/src/router/revalidation.ts +289 -0
- package/src/router/router-context.ts +316 -0
- package/src/router/router-interfaces.ts +452 -0
- package/src/router/router-options.ts +592 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +570 -0
- package/src/router/segment-resolution/helpers.ts +263 -0
- package/src/router/segment-resolution/loader-cache.ts +198 -0
- package/src/router/segment-resolution/revalidation.ts +1239 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -0
- package/src/router/segment-wrappers.ts +289 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +239 -0
- package/src/router/types.ts +170 -0
- package/src/router.ts +1002 -0
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +1089 -0
- package/src/rsc/helpers.ts +198 -0
- package/src/rsc/index.ts +36 -0
- package/src/rsc/loader-fetch.ts +209 -0
- package/src/rsc/manifest-init.ts +86 -0
- package/src/rsc/nonce.ts +32 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +379 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +237 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +348 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +263 -0
- package/src/search-params.ts +230 -0
- package/src/segment-system.tsx +454 -0
- package/src/server/context.ts +591 -0
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +308 -0
- package/src/server/loader-registry.ts +133 -0
- package/src/server/request-context.ts +914 -0
- package/src/server/root-layout.tsx +10 -0
- package/src/server/tsconfig.json +14 -0
- package/src/server.ts +51 -0
- package/src/ssr/index.tsx +365 -0
- package/src/static-handler.ts +114 -0
- package/src/theme/ThemeProvider.tsx +297 -0
- package/src/theme/ThemeScript.tsx +61 -0
- package/src/theme/constants.ts +62 -0
- package/src/theme/index.ts +48 -0
- package/src/theme/theme-context.ts +44 -0
- package/src/theme/theme-script.ts +155 -0
- package/src/theme/types.ts +182 -0
- package/src/theme/use-theme.ts +44 -0
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +100 -0
- package/src/types/handler-context.ts +687 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +183 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +102 -0
- package/src/types/segments.ts +148 -0
- package/src/types.ts +1 -0
- package/src/urls/include-helper.ts +197 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +339 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +95 -0
- package/src/urls/response-types.ts +106 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -0
- package/src/use-loader.tsx +354 -0
- package/src/vite/discovery/bundle-postprocess.ts +184 -0
- package/src/vite/discovery/discover-routers.ts +344 -0
- package/src/vite/discovery/prerender-collection.ts +385 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +110 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +16 -0
- package/src/vite/plugin-types.ts +131 -0
- package/src/vite/plugins/cjs-to-esm.ts +93 -0
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +105 -0
- package/src/vite/plugins/expose-action-id.ts +365 -0
- package/src/vite/plugins/expose-id-utils.ts +287 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +569 -0
- package/src/vite/plugins/refresh-cmd.ts +65 -0
- package/src/vite/plugins/use-cache-transform.ts +323 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +254 -0
- package/src/vite/plugins/version.d.ts +12 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +510 -0
- package/src/vite/router-discovery.ts +785 -0
- package/src/vite/utils/ast-handler-extract.ts +517 -0
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/utils/package-resolution.ts +121 -0
- package/src/vite/utils/prerender-utils.ts +189 -0
- package/src/vite/utils/shared-utils.ts +169 -0
|
@@ -0,0 +1,1172 @@
|
|
|
1
|
+
/// <reference types="@vitejs/plugin-rsc/types" />
|
|
2
|
+
/// <reference path="../vite/version.d.ts" />
|
|
3
|
+
/**
|
|
4
|
+
* RSC Request Handler
|
|
5
|
+
*
|
|
6
|
+
* Main request handler for RSC rendering, server actions, loader fetching,
|
|
7
|
+
* and progressive enhancement (no-JS form submissions).
|
|
8
|
+
*/
|
|
9
|
+
import { createElement } from "react";
|
|
10
|
+
import { renderSegments } from "../segment-system.js";
|
|
11
|
+
import { RouteNotFoundError, RouterError } from "../errors.js";
|
|
12
|
+
import { getLoaderLazy } from "../server/loader-registry.js";
|
|
13
|
+
import { matchMiddleware, executeMiddleware, executeLoaderMiddleware, } from "../router/middleware.js";
|
|
14
|
+
import { runWithRequestContext, setRequestContextParams, requireRequestContext, createRequestContext, } from "../server/request-context.js";
|
|
15
|
+
import * as rscDeps from "@vitejs/plugin-rsc/rsc";
|
|
16
|
+
import { hasBodyContent, createResponseWithMergedHeaders } from "./helpers.js";
|
|
17
|
+
import { generateNonce } from "./nonce.js";
|
|
18
|
+
import { VERSION } from "@rangojs/router:version";
|
|
19
|
+
import { invokeOnError } from "../router/error-handling.js";
|
|
20
|
+
import { getGlobalRouteMap, hasCachedManifest, setCachedManifest, getRouteTrie, setRouteTrie, getPrecomputedEntries, waitForManifestReady, getRouterManifest, getRouterTrie, setRouterManifest, setRouterTrie, } from "../route-map-builder.js";
|
|
21
|
+
/**
|
|
22
|
+
* Build a ResponseError payload from a caught error.
|
|
23
|
+
* RouterError messages are always exposed (developer-crafted).
|
|
24
|
+
* Standard Error messages are hidden in production.
|
|
25
|
+
*/
|
|
26
|
+
function createResponseErrorPayload(error, isDev) {
|
|
27
|
+
if (error instanceof RouterError) {
|
|
28
|
+
return {
|
|
29
|
+
message: error.message,
|
|
30
|
+
code: error.code,
|
|
31
|
+
...(error.type ? { type: error.type } : {}),
|
|
32
|
+
...(isDev && error.stack ? { stack: error.stack } : {}),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (error instanceof Error) {
|
|
36
|
+
return {
|
|
37
|
+
message: isDev ? error.message : "Internal Server Error",
|
|
38
|
+
...(isDev && error.stack ? { stack: error.stack } : {}),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
message: isDev ? String(error) : "Internal Server Error",
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create an RSC request handler.
|
|
47
|
+
*
|
|
48
|
+
* **Recommended:** Use `router.createHandler()` instead for simpler setup:
|
|
49
|
+
* ```tsx
|
|
50
|
+
* const router = createRouter({ document, urls, nonce: () => true });
|
|
51
|
+
* export const fetch = router.createHandler();
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* This function is still useful for advanced cases like per-request cache
|
|
55
|
+
* configuration (e.g., Cloudflare Workers with ExecutionContext).
|
|
56
|
+
*
|
|
57
|
+
* @example Basic usage (deps and loadSSRModule have sensible defaults)
|
|
58
|
+
* ```tsx
|
|
59
|
+
* import { createRSCHandler } from "@rangojs/router/rsc";
|
|
60
|
+
* import { router } from "./router.js";
|
|
61
|
+
*
|
|
62
|
+
* export default createRSCHandler({ router });
|
|
63
|
+
* ```
|
|
64
|
+
*
|
|
65
|
+
* @example With custom deps (advanced)
|
|
66
|
+
* ```tsx
|
|
67
|
+
* import { createRSCHandler } from "@rangojs/router/rsc";
|
|
68
|
+
* import * as rsc from "@vitejs/plugin-rsc/rsc";
|
|
69
|
+
* import { router } from "./router.js";
|
|
70
|
+
*
|
|
71
|
+
* export default createRSCHandler({
|
|
72
|
+
* router,
|
|
73
|
+
* deps: rsc,
|
|
74
|
+
* loadSSRModule: () => import.meta.viteRsc.loadModule("ssr", "index"),
|
|
75
|
+
* });
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export function createRSCHandler(options) {
|
|
79
|
+
const { router, version = VERSION, nonce: nonceProvider } = options;
|
|
80
|
+
// Use provided deps or default to @vitejs/plugin-rsc/rsc exports
|
|
81
|
+
const deps = options.deps ?? rscDeps;
|
|
82
|
+
const { renderToReadableStream, decodeReply, createTemporaryReferenceSet, loadServerAction, decodeAction, decodeFormState, } = deps;
|
|
83
|
+
// Use provided loadSSRModule or default to vite RSC module loader
|
|
84
|
+
const loadSSRModule = options.loadSSRModule ??
|
|
85
|
+
(() => import.meta.viteRsc.loadModule("ssr", "index"));
|
|
86
|
+
/**
|
|
87
|
+
* Wrapper for invokeOnError that binds the router's onError callback.
|
|
88
|
+
* Uses the shared utility from router/error-handling.ts for consistent behavior.
|
|
89
|
+
*/
|
|
90
|
+
function callOnError(error, phase, context) {
|
|
91
|
+
invokeOnError(router.onError, error, phase, context, "RSC");
|
|
92
|
+
}
|
|
93
|
+
return async function handler(request, env = {}) {
|
|
94
|
+
const handlerStart = performance.now();
|
|
95
|
+
// Connection warmup: return 204 immediately before any processing
|
|
96
|
+
if (router.warmupEnabled && request.method === "HEAD") {
|
|
97
|
+
const warmupUrl = new URL(request.url);
|
|
98
|
+
if (warmupUrl.searchParams.has("_rsc_warmup")) {
|
|
99
|
+
return new Response(null, { status: 204 });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Resolve nonce if provider is set
|
|
103
|
+
const nonceStart = performance.now();
|
|
104
|
+
let nonce;
|
|
105
|
+
if (nonceProvider) {
|
|
106
|
+
const result = await nonceProvider(request, env);
|
|
107
|
+
nonce = result === true ? generateNonce() : result;
|
|
108
|
+
}
|
|
109
|
+
const nonceDur = performance.now() - nonceStart;
|
|
110
|
+
const url = new URL(request.url);
|
|
111
|
+
// Match global middleware
|
|
112
|
+
const mwMatchStart = performance.now();
|
|
113
|
+
const matchedMiddleware = matchMiddleware(url.pathname, router.middleware);
|
|
114
|
+
const mwMatchDur = performance.now() - mwMatchStart;
|
|
115
|
+
// Shared variables between middleware and route handlers
|
|
116
|
+
// Initialize from env.Variables if provided (allows pre-seeding from worker entry)
|
|
117
|
+
const variables = {
|
|
118
|
+
...(env?.Variables ?? {}),
|
|
119
|
+
};
|
|
120
|
+
// Store nonce in variables so middleware can access via ctx.get('nonce')
|
|
121
|
+
if (nonce) {
|
|
122
|
+
variables.nonce = nonce;
|
|
123
|
+
}
|
|
124
|
+
// Resolve cache store configuration
|
|
125
|
+
// Priority: options.cache (handler override) > router.cache (router default)
|
|
126
|
+
// Store is enabled only if: config provided, enabled, and no ?__no_cache query param
|
|
127
|
+
let cacheStore = undefined;
|
|
128
|
+
const cacheOption = options.cache ?? router.cache;
|
|
129
|
+
if (cacheOption && !url.searchParams.has("__no_cache")) {
|
|
130
|
+
const cacheConfig = typeof cacheOption === "function" ? cacheOption(env) : cacheOption;
|
|
131
|
+
if (cacheConfig.enabled !== false) {
|
|
132
|
+
cacheStore = cacheConfig.store;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Route manifest is populated at startup via the virtual module
|
|
136
|
+
// (virtual:rsc-router/routes-manifest). In build/production, it's inlined
|
|
137
|
+
// into the bundle. In dev mode (Node), the discovery plugin populates it
|
|
138
|
+
// via setManifestReadyPromise(). In dev mode (Cloudflare), Miniflare runs
|
|
139
|
+
// in a separate isolate where module-level state doesn't carry over, so
|
|
140
|
+
// we generate inline from the router's urlpatterns.
|
|
141
|
+
//
|
|
142
|
+
// In multi-router setups (e.g. createHostRouter), each router must have
|
|
143
|
+
// its own per-router manifest. We check per-router data first: even if
|
|
144
|
+
// the global manifest was set by a different router, this router still
|
|
145
|
+
// needs its own trie and manifest for correct matching.
|
|
146
|
+
const manifestCacheStart = performance.now();
|
|
147
|
+
const hasRouterData = getRouterManifest(router.id) !== undefined;
|
|
148
|
+
if (!hasRouterData) {
|
|
149
|
+
if (!hasCachedManifest()) {
|
|
150
|
+
const readyPromise = waitForManifestReady();
|
|
151
|
+
if (readyPromise) {
|
|
152
|
+
await readyPromise;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (!getRouterManifest(router.id) && router.urlpatterns) {
|
|
156
|
+
// Cloudflare dev: generate manifest inline for this router.
|
|
157
|
+
// Each router generates its own manifest independently so
|
|
158
|
+
// multi-router setups (host routing) work correctly.
|
|
159
|
+
const { generateManifest } = await import("../build/generate-manifest.js");
|
|
160
|
+
const generated = generateManifest(router.urlpatterns);
|
|
161
|
+
if (generated._routeAncestry &&
|
|
162
|
+
Object.keys(generated._routeAncestry).length > 0) {
|
|
163
|
+
const { buildRouteTrie } = await import("../build/route-trie.js");
|
|
164
|
+
// Map each route to its include() staticPrefix so the trie
|
|
165
|
+
// returns the correct sp for lazy entry lookup in findMatch.
|
|
166
|
+
const routeToStaticPrefix = {};
|
|
167
|
+
for (const name of Object.keys(generated.routeManifest)) {
|
|
168
|
+
routeToStaticPrefix[name] = "";
|
|
169
|
+
}
|
|
170
|
+
// Override with prefix from include() entries so the trie
|
|
171
|
+
// returns the correct sp for lazy entry lookup in findMatch.
|
|
172
|
+
// Walk recursively to include routes in nested includes.
|
|
173
|
+
if (generated.prefixTree) {
|
|
174
|
+
const visitPrefixNode = (node) => {
|
|
175
|
+
const sp = node.staticPrefix || "";
|
|
176
|
+
for (const route of (node.routes || [])) {
|
|
177
|
+
routeToStaticPrefix[route] = sp;
|
|
178
|
+
}
|
|
179
|
+
for (const child of Object.values(node.children || {})) {
|
|
180
|
+
visitPrefixNode(child);
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
for (const node of Object.values(generated.prefixTree)) {
|
|
184
|
+
visitPrefixNode(node);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const trie = buildRouteTrie(generated.routeManifest, generated._routeAncestry, routeToStaticPrefix, generated.routeTrailingSlash, generated.prerenderRoutes ? new Set(generated.prerenderRoutes) : undefined, generated.passthroughRoutes ? new Set(generated.passthroughRoutes) : undefined, generated.responseTypeRoutes);
|
|
188
|
+
setRouterTrie(router.id, trie);
|
|
189
|
+
// Set global trie only if not already set by another router
|
|
190
|
+
if (!getRouteTrie()) {
|
|
191
|
+
setRouteTrie(trie);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
setRouterManifest(router.id, generated.routeManifest);
|
|
195
|
+
// Merge into global manifest (needed for reverse/href across routers)
|
|
196
|
+
const existing = hasCachedManifest() ? getGlobalRouteMap() : {};
|
|
197
|
+
setCachedManifest({ ...existing, ...generated.routeManifest });
|
|
198
|
+
}
|
|
199
|
+
if (!getRouterManifest(router.id) && !hasCachedManifest()) {
|
|
200
|
+
throw new Error('Route manifest not available. Ensure "virtual:rsc-router/routes-manifest" is imported in your entry file.');
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const manifestCacheDur = performance.now() - manifestCacheStart;
|
|
204
|
+
// Note: Route map for useHref() is loaded lazily via getGlobalRouteMap()
|
|
205
|
+
// This allows it to include all routes from lazy includes after manifest loading
|
|
206
|
+
// Create unified request context with all methods
|
|
207
|
+
// Includes: stub response, handle store, loader memoization, use(), cookies, headers, cache store
|
|
208
|
+
// params starts empty, populated after route matching via setRequestContextParams
|
|
209
|
+
const ctxCreateStart = performance.now();
|
|
210
|
+
const requestContext = createRequestContext({
|
|
211
|
+
env,
|
|
212
|
+
request,
|
|
213
|
+
url,
|
|
214
|
+
variables,
|
|
215
|
+
cacheStore,
|
|
216
|
+
executionContext: env.ctx,
|
|
217
|
+
themeConfig: router.themeConfig,
|
|
218
|
+
});
|
|
219
|
+
const ctxCreateDur = performance.now() - ctxCreateStart;
|
|
220
|
+
// Accumulate handler-level timing for Server-Timing header
|
|
221
|
+
const handlerTiming = [
|
|
222
|
+
`handler-nonce;dur=${nonceDur.toFixed(2)}`,
|
|
223
|
+
`handler-mw-match;dur=${mwMatchDur.toFixed(2)}`,
|
|
224
|
+
`handler-manifest-cache;dur=${manifestCacheDur.toFixed(2)}`,
|
|
225
|
+
`handler-ctx-create;dur=${ctxCreateDur.toFixed(2)}`,
|
|
226
|
+
];
|
|
227
|
+
// Store timing data in variables for downstream access
|
|
228
|
+
variables.__handlerTiming = handlerTiming;
|
|
229
|
+
variables.__handlerStart = handlerStart;
|
|
230
|
+
// Wrap entire request handling in request context
|
|
231
|
+
// Makes context available via getRequestContext() throughout:
|
|
232
|
+
// - Middleware execution
|
|
233
|
+
// - Route handlers and loaders
|
|
234
|
+
// - Server components during rendering
|
|
235
|
+
// - Error boundaries
|
|
236
|
+
// - Streaming
|
|
237
|
+
return runWithRequestContext(requestContext, async () => {
|
|
238
|
+
// Core handler logic (wrapped by middleware)
|
|
239
|
+
const coreHandler = async () => {
|
|
240
|
+
return coreRequestHandler(request, env, url, variables, nonce);
|
|
241
|
+
};
|
|
242
|
+
// Execute middleware chain if any, otherwise call core handler directly
|
|
243
|
+
if (matchedMiddleware.length > 0) {
|
|
244
|
+
return executeMiddleware(matchedMiddleware, request, env, variables, coreHandler);
|
|
245
|
+
}
|
|
246
|
+
return coreHandler();
|
|
247
|
+
});
|
|
248
|
+
};
|
|
249
|
+
// Core request handling logic (separated for middleware wrapping)
|
|
250
|
+
async function coreRequestHandler(request, env, url, variables, nonce) {
|
|
251
|
+
// First, check for route-level middleware
|
|
252
|
+
const previewStart = performance.now();
|
|
253
|
+
const preview = await router.previewMatch(request, env);
|
|
254
|
+
const previewDur = performance.now() - previewStart;
|
|
255
|
+
const handlerTiming = variables.__handlerTiming || [];
|
|
256
|
+
handlerTiming.push(`handler-preview-match;dur=${previewDur.toFixed(2)}`);
|
|
257
|
+
// Response route short-circuit: skip entire RSC pipeline
|
|
258
|
+
if (preview?.responseType && preview.handler) {
|
|
259
|
+
const isPartial = url.searchParams.has("_rsc_partial");
|
|
260
|
+
// Partial requests (client-side navigation) to response routes
|
|
261
|
+
// get X-RSC-Reload to trigger hard navigation in the browser
|
|
262
|
+
if (isPartial) {
|
|
263
|
+
const cleanUrl = new URL(url);
|
|
264
|
+
cleanUrl.searchParams.delete("_rsc_partial");
|
|
265
|
+
cleanUrl.searchParams.delete("_rsc_segments");
|
|
266
|
+
cleanUrl.searchParams.delete("_rsc_v");
|
|
267
|
+
cleanUrl.searchParams.delete("_rsc_stale");
|
|
268
|
+
cleanUrl.searchParams.delete("_rsc_action");
|
|
269
|
+
cleanUrl.searchParams.delete("_rsc_prev");
|
|
270
|
+
return createResponseWithMergedHeaders(null, {
|
|
271
|
+
status: 200,
|
|
272
|
+
headers: {
|
|
273
|
+
"X-RSC-Reload": cleanUrl.toString(),
|
|
274
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// Build lightweight context for response handler
|
|
279
|
+
const bindings = env?.Bindings ?? env;
|
|
280
|
+
const reqCtx = requireRequestContext();
|
|
281
|
+
const responseHandlerCtx = {
|
|
282
|
+
request,
|
|
283
|
+
params: preview.params || {},
|
|
284
|
+
env: bindings,
|
|
285
|
+
searchParams: url.searchParams,
|
|
286
|
+
url,
|
|
287
|
+
pathname: url.pathname,
|
|
288
|
+
href: (name, hrefParams) => {
|
|
289
|
+
if (name.startsWith("/")) {
|
|
290
|
+
if (!hrefParams)
|
|
291
|
+
return name;
|
|
292
|
+
return name.replace(/:([^/]+)/g, (_, key) => {
|
|
293
|
+
const value = hrefParams[key];
|
|
294
|
+
if (value === undefined)
|
|
295
|
+
throw new Error(`Missing param "${key}" for path "${name}"`);
|
|
296
|
+
return encodeURIComponent(value);
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
return name;
|
|
300
|
+
},
|
|
301
|
+
get: (key) => variables[key],
|
|
302
|
+
header: (name, value) => reqCtx.header(name, value),
|
|
303
|
+
setCookie: (name, value, options) => reqCtx.setCookie(name, value, options),
|
|
304
|
+
};
|
|
305
|
+
// Call handler directly, wrapped by route middleware if present
|
|
306
|
+
const callHandler = async () => {
|
|
307
|
+
// JSON response routes: wrap in { data } / { error } envelope
|
|
308
|
+
if (preview.responseType === "json") {
|
|
309
|
+
const errorCtx = { request, url, env };
|
|
310
|
+
try {
|
|
311
|
+
const result = await preview.handler(responseHandlerCtx);
|
|
312
|
+
if (result instanceof Response) {
|
|
313
|
+
const mergedHeaders = {};
|
|
314
|
+
result.headers.forEach((value, key) => {
|
|
315
|
+
mergedHeaders[key] = value;
|
|
316
|
+
});
|
|
317
|
+
return createResponseWithMergedHeaders(result.body, {
|
|
318
|
+
status: result.status,
|
|
319
|
+
headers: mergedHeaders,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
return createResponseWithMergedHeaders(JSON.stringify({ data: result }), { status: 200, headers: { "content-type": "application/json;charset=utf-8" } });
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
callOnError(error, "handler", errorCtx);
|
|
326
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
327
|
+
const status = error instanceof RouterError ? error.status : 500;
|
|
328
|
+
return createResponseWithMergedHeaders(JSON.stringify({ error: createResponseErrorPayload(error, isDev) }), { status, headers: { "content-type": "application/json;charset=utf-8" } });
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// Non-JSON response routes: catch errors and return plain Response
|
|
332
|
+
const errorCtx = { request, url, env };
|
|
333
|
+
try {
|
|
334
|
+
const result = await preview.handler(responseHandlerCtx);
|
|
335
|
+
if (result instanceof Response) {
|
|
336
|
+
// Handler returned a Response directly -- pass through
|
|
337
|
+
const mergedHeaders = {};
|
|
338
|
+
result.headers.forEach((value, key) => {
|
|
339
|
+
mergedHeaders[key] = value;
|
|
340
|
+
});
|
|
341
|
+
return createResponseWithMergedHeaders(result.body, {
|
|
342
|
+
status: result.status,
|
|
343
|
+
headers: mergedHeaders,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
// Auto-wrap based on response type tag
|
|
347
|
+
switch (preview.responseType) {
|
|
348
|
+
case "text":
|
|
349
|
+
return createResponseWithMergedHeaders(String(result), { status: 200, headers: { "content-type": "text/plain;charset=utf-8" } });
|
|
350
|
+
case "html":
|
|
351
|
+
return createResponseWithMergedHeaders(String(result), { status: 200, headers: { "content-type": "text/html;charset=utf-8" } });
|
|
352
|
+
case "xml":
|
|
353
|
+
return createResponseWithMergedHeaders(String(result), { status: 200, headers: { "content-type": "application/xml;charset=utf-8" } });
|
|
354
|
+
case "md":
|
|
355
|
+
return createResponseWithMergedHeaders(String(result), { status: 200, headers: { "content-type": "text/markdown;charset=utf-8" } });
|
|
356
|
+
default:
|
|
357
|
+
// image, stream, any -- must return Response
|
|
358
|
+
throw new Error(`Response route handler for "${preview.responseType}" must return a Response object, got ${typeof result}`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
callOnError(error, "handler", errorCtx);
|
|
363
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
364
|
+
const status = error instanceof RouterError ? error.status : 500;
|
|
365
|
+
const message = error instanceof RouterError
|
|
366
|
+
? error.message
|
|
367
|
+
: isDev && error instanceof Error
|
|
368
|
+
? error.message
|
|
369
|
+
: "Internal Server Error";
|
|
370
|
+
return createResponseWithMergedHeaders(message, {
|
|
371
|
+
status,
|
|
372
|
+
headers: { "content-type": "text/plain;charset=utf-8" },
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
// Wrap callHandler to append Vary: Accept on content-negotiated responses
|
|
377
|
+
const callHandlerWithVary = async () => {
|
|
378
|
+
const response = await callHandler();
|
|
379
|
+
if (preview.negotiated) {
|
|
380
|
+
response.headers.append("Vary", "Accept");
|
|
381
|
+
}
|
|
382
|
+
return response;
|
|
383
|
+
};
|
|
384
|
+
if (preview.routeMiddleware && preview.routeMiddleware.length > 0) {
|
|
385
|
+
const middlewareEntries = preview.routeMiddleware.map((mw) => ({
|
|
386
|
+
entry: {
|
|
387
|
+
pattern: null,
|
|
388
|
+
regex: null,
|
|
389
|
+
paramNames: [],
|
|
390
|
+
handler: mw.handler,
|
|
391
|
+
mountPrefix: null,
|
|
392
|
+
},
|
|
393
|
+
params: mw.params,
|
|
394
|
+
}));
|
|
395
|
+
return executeMiddleware(middlewareEntries, request, env, variables, callHandlerWithVary);
|
|
396
|
+
}
|
|
397
|
+
return callHandlerWithVary();
|
|
398
|
+
}
|
|
399
|
+
// Wrap RSC handler to append Vary: Accept on content-negotiated routes
|
|
400
|
+
const rscHandler = async () => {
|
|
401
|
+
const response = await coreRequestHandlerInner(request, env, url, variables, nonce);
|
|
402
|
+
if (preview?.negotiated) {
|
|
403
|
+
response.headers.append("Vary", "Accept");
|
|
404
|
+
}
|
|
405
|
+
return response;
|
|
406
|
+
};
|
|
407
|
+
if (preview?.routeMiddleware && preview.routeMiddleware.length > 0) {
|
|
408
|
+
// Convert route middleware to app middleware format for execution
|
|
409
|
+
const middlewareEntries = preview.routeMiddleware.map((mw) => ({
|
|
410
|
+
entry: {
|
|
411
|
+
pattern: null,
|
|
412
|
+
regex: null,
|
|
413
|
+
paramNames: [],
|
|
414
|
+
handler: mw.handler,
|
|
415
|
+
mountPrefix: null,
|
|
416
|
+
},
|
|
417
|
+
params: mw.params,
|
|
418
|
+
}));
|
|
419
|
+
// Execute route middleware wrapping the actual request handling
|
|
420
|
+
return executeMiddleware(middlewareEntries, request, env, variables, rscHandler);
|
|
421
|
+
}
|
|
422
|
+
// No route middleware, proceed directly
|
|
423
|
+
return rscHandler();
|
|
424
|
+
}
|
|
425
|
+
// Inner request handler (actual RSC logic, wrapped by route middleware if any)
|
|
426
|
+
async function coreRequestHandlerInner(request, env, url, variables, nonce) {
|
|
427
|
+
const isPartial = url.searchParams.has("_rsc_partial");
|
|
428
|
+
const isAction = request.headers.has("rsc-action") || url.searchParams.has("_rsc_action");
|
|
429
|
+
const actionId = request.headers.get("rsc-action") || url.searchParams.get("_rsc_action");
|
|
430
|
+
// Version mismatch detection - client may have stale code after HMR/deployment
|
|
431
|
+
// If versions don't match, tell the client to reload
|
|
432
|
+
const clientVersion = url.searchParams.get("_rsc_v");
|
|
433
|
+
if (version && clientVersion && clientVersion !== version) {
|
|
434
|
+
console.log(`[RSC] Version mismatch: client=${clientVersion}, server=${version}. Forcing reload.`);
|
|
435
|
+
// Clean URL by removing RSC params
|
|
436
|
+
const cleanUrl = new URL(url);
|
|
437
|
+
cleanUrl.searchParams.delete("_rsc_partial");
|
|
438
|
+
cleanUrl.searchParams.delete("_rsc_segments");
|
|
439
|
+
cleanUrl.searchParams.delete("_rsc_v");
|
|
440
|
+
cleanUrl.searchParams.delete("_rsc_stale");
|
|
441
|
+
cleanUrl.searchParams.delete("_rsc_action");
|
|
442
|
+
cleanUrl.searchParams.delete("_rsc_prev");
|
|
443
|
+
// For actions, reload current page (referer)
|
|
444
|
+
// For navigation, load the target URL
|
|
445
|
+
const reloadUrl = isAction
|
|
446
|
+
? request.headers.get("referer") || cleanUrl.toString()
|
|
447
|
+
: cleanUrl.toString();
|
|
448
|
+
// Return special response that tells client to reload
|
|
449
|
+
return createResponseWithMergedHeaders(null, {
|
|
450
|
+
status: 200,
|
|
451
|
+
headers: {
|
|
452
|
+
"X-RSC-Reload": reloadUrl,
|
|
453
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
454
|
+
},
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
// Debug manifest endpoint: ?__debug_manifest on any route.
|
|
458
|
+
// Always available in dev, requires allowDebugManifest option in production.
|
|
459
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
460
|
+
if (url.searchParams.has("__debug_manifest") &&
|
|
461
|
+
(isDev || router.allowDebugManifest)) {
|
|
462
|
+
const trie = getRouterTrie(router.id) ?? getRouteTrie();
|
|
463
|
+
const routeManifest = getRouterManifest(router.id) ?? getGlobalRouteMap();
|
|
464
|
+
const { extractAncestryFromTrie } = await import("../build/route-trie.js");
|
|
465
|
+
return new Response(JSON.stringify({
|
|
466
|
+
routerId: router.id,
|
|
467
|
+
routeManifest,
|
|
468
|
+
routeAncestry: trie ? extractAncestryFromTrie(trie) : {},
|
|
469
|
+
routeTrie: trie,
|
|
470
|
+
precomputedEntries: getPrecomputedEntries(),
|
|
471
|
+
}, null, 2), {
|
|
472
|
+
headers: { "Content-Type": "application/json" },
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
// Get handle store from request context (created at start of request)
|
|
476
|
+
const handleStore = requireRequestContext()._handleStore;
|
|
477
|
+
try {
|
|
478
|
+
// ============================================================================
|
|
479
|
+
// PROGRESSIVE ENHANCEMENT: No-JS Form Submissions
|
|
480
|
+
// ============================================================================
|
|
481
|
+
const progressiveResult = await handleProgressiveEnhancement(request, env, url, isAction, handleStore, nonce);
|
|
482
|
+
if (progressiveResult) {
|
|
483
|
+
return progressiveResult;
|
|
484
|
+
}
|
|
485
|
+
// ============================================================================
|
|
486
|
+
// SERVER ACTION EXECUTION (JavaScript-enabled client)
|
|
487
|
+
// ============================================================================
|
|
488
|
+
if (isAction && actionId) {
|
|
489
|
+
return handleServerAction(request, env, url, actionId, handleStore);
|
|
490
|
+
}
|
|
491
|
+
// ============================================================================
|
|
492
|
+
// LOADER FETCH EXECUTION (data fetching with RSC serialization)
|
|
493
|
+
// ============================================================================
|
|
494
|
+
const isLoaderRequest = url.searchParams.has("_rsc_loader");
|
|
495
|
+
if (isLoaderRequest) {
|
|
496
|
+
return handleLoaderFetch(request, env, url, variables);
|
|
497
|
+
}
|
|
498
|
+
// ============================================================================
|
|
499
|
+
// REGULAR RSC RENDERING (Navigation)
|
|
500
|
+
// ============================================================================
|
|
501
|
+
// Note: Must use "return await" for try/catch to catch async rejections
|
|
502
|
+
return await handleRscRendering(request, env, url, isPartial, handleStore, nonce);
|
|
503
|
+
}
|
|
504
|
+
catch (error) {
|
|
505
|
+
// Check if middleware/handler returned Response
|
|
506
|
+
if (error instanceof Response) {
|
|
507
|
+
// During partial (client-side navigation), a 200 Response from a handler
|
|
508
|
+
// means the route serves raw content (JSON, text, etc.), not JSX.
|
|
509
|
+
// Signal the browser to hard-navigate so it renders the raw response.
|
|
510
|
+
// Only for 200 — redirects (3xx) work already because the browser follows
|
|
511
|
+
// them automatically to a URL that serves Flight data.
|
|
512
|
+
if (isPartial && error.status === 200) {
|
|
513
|
+
console.warn(`[RSC] Route handler at ${url.pathname} returned a Response during client-side navigation. ` +
|
|
514
|
+
`Falling back to hard navigation. Use data-external on the <Link> to avoid the extra round-trip.`);
|
|
515
|
+
const cleanUrl = new URL(url);
|
|
516
|
+
cleanUrl.searchParams.delete("_rsc_partial");
|
|
517
|
+
cleanUrl.searchParams.delete("_rsc_segments");
|
|
518
|
+
cleanUrl.searchParams.delete("_rsc_v");
|
|
519
|
+
cleanUrl.searchParams.delete("_rsc_stale");
|
|
520
|
+
cleanUrl.searchParams.delete("_rsc_action");
|
|
521
|
+
cleanUrl.searchParams.delete("_rsc_prev");
|
|
522
|
+
return createResponseWithMergedHeaders(null, {
|
|
523
|
+
status: 200,
|
|
524
|
+
headers: {
|
|
525
|
+
"X-RSC-Reload": cleanUrl.toString(),
|
|
526
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
527
|
+
},
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
return error;
|
|
531
|
+
}
|
|
532
|
+
// Render 404 page for unmatched routes
|
|
533
|
+
// Check both instanceof and error.name for cross-bundle compatibility
|
|
534
|
+
const isRouteNotFound = error instanceof RouteNotFoundError ||
|
|
535
|
+
(error instanceof Error && error.name === "RouteNotFoundError");
|
|
536
|
+
if (isRouteNotFound) {
|
|
537
|
+
callOnError(error, "routing", {
|
|
538
|
+
request,
|
|
539
|
+
url,
|
|
540
|
+
env,
|
|
541
|
+
handledByBoundary: true, // Handled by notFound component
|
|
542
|
+
});
|
|
543
|
+
// Get notFound component from router options or use default
|
|
544
|
+
const notFoundOption = router.notFound;
|
|
545
|
+
const notFoundComponent = typeof notFoundOption === "function"
|
|
546
|
+
? notFoundOption({ pathname: url.pathname })
|
|
547
|
+
: (notFoundOption ?? createElement("h1", null, "Not Found"));
|
|
548
|
+
// Create a simple segment for the 404 page
|
|
549
|
+
const notFoundSegment = {
|
|
550
|
+
id: "notFound",
|
|
551
|
+
namespace: "notFound",
|
|
552
|
+
type: "route",
|
|
553
|
+
index: 0,
|
|
554
|
+
component: notFoundComponent,
|
|
555
|
+
params: {},
|
|
556
|
+
};
|
|
557
|
+
// Render with rootLayout to maintain app shell
|
|
558
|
+
const root = await renderSegments([notFoundSegment], {
|
|
559
|
+
rootLayout: router.rootLayout,
|
|
560
|
+
// No routeName for not-found routes
|
|
561
|
+
});
|
|
562
|
+
const payload = {
|
|
563
|
+
root,
|
|
564
|
+
metadata: {
|
|
565
|
+
pathname: url.pathname,
|
|
566
|
+
segments: [notFoundSegment],
|
|
567
|
+
matched: [],
|
|
568
|
+
diff: [],
|
|
569
|
+
isPartial: false,
|
|
570
|
+
handles: handleStore.stream(),
|
|
571
|
+
version,
|
|
572
|
+
themeConfig: router.themeConfig,
|
|
573
|
+
warmupEnabled: router.warmupEnabled,
|
|
574
|
+
initialTheme: requireRequestContext().theme,
|
|
575
|
+
// No routeName for not-found routes
|
|
576
|
+
},
|
|
577
|
+
};
|
|
578
|
+
const rscStream = renderToReadableStream(payload);
|
|
579
|
+
// Determine if this is an RSC request or HTML request
|
|
580
|
+
const isRscRequest = (!request.headers.get("accept")?.includes("text/html") &&
|
|
581
|
+
!url.searchParams.has("__html")) ||
|
|
582
|
+
url.searchParams.has("__rsc");
|
|
583
|
+
if (isRscRequest) {
|
|
584
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
585
|
+
status: 404,
|
|
586
|
+
headers: { "content-type": "text/x-component;charset=utf-8" },
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
// Delegate to SSR for HTML response
|
|
590
|
+
const ssrModule = await loadSSRModule();
|
|
591
|
+
const htmlStream = await ssrModule.renderHTML(rscStream, { nonce });
|
|
592
|
+
return createResponseWithMergedHeaders(htmlStream, {
|
|
593
|
+
status: 404,
|
|
594
|
+
headers: { "content-type": "text/html;charset=utf-8" },
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
// Report unhandled errors
|
|
598
|
+
callOnError(error, "routing", {
|
|
599
|
+
request,
|
|
600
|
+
url,
|
|
601
|
+
env,
|
|
602
|
+
handledByBoundary: false,
|
|
603
|
+
});
|
|
604
|
+
console.error(`[RSC] Error:`, error);
|
|
605
|
+
throw error;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
// ============================================================================
|
|
609
|
+
// PROGRESSIVE ENHANCEMENT HANDLER
|
|
610
|
+
// When JavaScript is disabled, React renders forms with hidden fields
|
|
611
|
+
// ($ACTION_REF_*, $ACTION_KEY) containing the action reference.
|
|
612
|
+
// We detect these and return HTML instead of RSC stream.
|
|
613
|
+
// ============================================================================
|
|
614
|
+
async function handleProgressiveEnhancement(request, env, url, isAction, handleStore, nonce) {
|
|
615
|
+
const contentType = request.headers.get("content-type") || "";
|
|
616
|
+
const isFormSubmission = contentType.includes("multipart/form-data") ||
|
|
617
|
+
contentType.includes("application/x-www-form-urlencoded");
|
|
618
|
+
if (request.method !== "POST" || isAction || !isFormSubmission) {
|
|
619
|
+
return null;
|
|
620
|
+
}
|
|
621
|
+
// Clone the request to read FormData without consuming it
|
|
622
|
+
const formData = await request.clone().formData();
|
|
623
|
+
// Look for React's progressive enhancement hidden fields
|
|
624
|
+
let isDirectAction = false;
|
|
625
|
+
let isUseActionState = false;
|
|
626
|
+
let directActionId = null;
|
|
627
|
+
formData.forEach((_value, key) => {
|
|
628
|
+
if (key.startsWith("$ACTION_ID_")) {
|
|
629
|
+
isDirectAction = true;
|
|
630
|
+
directActionId = key.slice("$ACTION_ID_".length);
|
|
631
|
+
}
|
|
632
|
+
else if (key.startsWith("$ACTION_REF_")) {
|
|
633
|
+
isUseActionState = true;
|
|
634
|
+
}
|
|
635
|
+
});
|
|
636
|
+
if (!isDirectAction && !isUseActionState) {
|
|
637
|
+
return null;
|
|
638
|
+
}
|
|
639
|
+
// Execute action and return HTML
|
|
640
|
+
let actionResult = undefined;
|
|
641
|
+
let reactFormState = null;
|
|
642
|
+
if (isUseActionState) {
|
|
643
|
+
try {
|
|
644
|
+
const boundAction = await decodeAction(formData);
|
|
645
|
+
actionResult = await boundAction();
|
|
646
|
+
}
|
|
647
|
+
catch (error) {
|
|
648
|
+
callOnError(error, "action", {
|
|
649
|
+
request,
|
|
650
|
+
url,
|
|
651
|
+
env,
|
|
652
|
+
handledByBoundary: false,
|
|
653
|
+
});
|
|
654
|
+
console.error("[RSC] Progressive enhancement action error:", error);
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
else if (isDirectAction && directActionId) {
|
|
658
|
+
const temporaryReferences = createTemporaryReferenceSet();
|
|
659
|
+
let args = [];
|
|
660
|
+
try {
|
|
661
|
+
args = await decodeReply(formData, { temporaryReferences });
|
|
662
|
+
}
|
|
663
|
+
catch {
|
|
664
|
+
args = [formData];
|
|
665
|
+
}
|
|
666
|
+
try {
|
|
667
|
+
const loadedAction = await loadServerAction(directActionId);
|
|
668
|
+
actionResult = await loadedAction.apply(null, args);
|
|
669
|
+
}
|
|
670
|
+
catch (error) {
|
|
671
|
+
callOnError(error, "action", {
|
|
672
|
+
request,
|
|
673
|
+
url,
|
|
674
|
+
env,
|
|
675
|
+
actionId: directActionId,
|
|
676
|
+
handledByBoundary: false,
|
|
677
|
+
});
|
|
678
|
+
console.error("[RSC] Progressive enhancement action error:", error);
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
// Decode form state for useActionState progressive enhancement
|
|
682
|
+
try {
|
|
683
|
+
reactFormState = await decodeFormState(actionResult, formData);
|
|
684
|
+
}
|
|
685
|
+
catch (error) {
|
|
686
|
+
callOnError(error, "action", {
|
|
687
|
+
request,
|
|
688
|
+
url,
|
|
689
|
+
env,
|
|
690
|
+
handledByBoundary: false,
|
|
691
|
+
});
|
|
692
|
+
console.error("[RSC] Failed to decode form state:", error);
|
|
693
|
+
}
|
|
694
|
+
// Re-render the page and return HTML
|
|
695
|
+
const renderRequest = new Request(url.toString(), {
|
|
696
|
+
method: "GET",
|
|
697
|
+
headers: new Headers({ accept: "text/html" }),
|
|
698
|
+
});
|
|
699
|
+
const match = await router.match(renderRequest, env);
|
|
700
|
+
if (match.redirect) {
|
|
701
|
+
return createResponseWithMergedHeaders(null, {
|
|
702
|
+
status: 308,
|
|
703
|
+
headers: { Location: match.redirect },
|
|
704
|
+
});
|
|
705
|
+
}
|
|
706
|
+
const root = renderSegments(match.segments, {
|
|
707
|
+
rootLayout: router.rootLayout,
|
|
708
|
+
});
|
|
709
|
+
const payload = {
|
|
710
|
+
root,
|
|
711
|
+
metadata: {
|
|
712
|
+
pathname: url.pathname,
|
|
713
|
+
segments: match.segments,
|
|
714
|
+
matched: match.matched,
|
|
715
|
+
diff: match.diff,
|
|
716
|
+
isPartial: false,
|
|
717
|
+
rootLayout: router.rootLayout,
|
|
718
|
+
handles: handleStore.stream(),
|
|
719
|
+
version,
|
|
720
|
+
themeConfig: router.themeConfig,
|
|
721
|
+
warmupEnabled: router.warmupEnabled,
|
|
722
|
+
initialTheme: requireRequestContext().theme,
|
|
723
|
+
},
|
|
724
|
+
formState: actionResult,
|
|
725
|
+
};
|
|
726
|
+
const rscStream = renderToReadableStream(payload);
|
|
727
|
+
const ssrModule = await loadSSRModule();
|
|
728
|
+
const htmlStream = await ssrModule.renderHTML(rscStream, {
|
|
729
|
+
formState: reactFormState,
|
|
730
|
+
nonce,
|
|
731
|
+
});
|
|
732
|
+
return createResponseWithMergedHeaders(htmlStream, {
|
|
733
|
+
headers: { "content-type": "text/html;charset=utf-8" },
|
|
734
|
+
});
|
|
735
|
+
}
|
|
736
|
+
// ============================================================================
|
|
737
|
+
// SERVER ACTION HANDLER
|
|
738
|
+
// ============================================================================
|
|
739
|
+
async function handleServerAction(request, env, url, actionId, handleStore) {
|
|
740
|
+
const temporaryReferences = createTemporaryReferenceSet();
|
|
741
|
+
// Decode action arguments from request body
|
|
742
|
+
const contentType = request.headers.get("content-type") || "";
|
|
743
|
+
let args = [];
|
|
744
|
+
let actionFormData;
|
|
745
|
+
try {
|
|
746
|
+
const body = contentType.includes("multipart/form-data")
|
|
747
|
+
? await request.formData()
|
|
748
|
+
: await request.text();
|
|
749
|
+
if (body instanceof FormData) {
|
|
750
|
+
actionFormData = body;
|
|
751
|
+
}
|
|
752
|
+
if (hasBodyContent(body)) {
|
|
753
|
+
args = await decodeReply(body, { temporaryReferences });
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
catch (error) {
|
|
757
|
+
callOnError(error, "action", {
|
|
758
|
+
request,
|
|
759
|
+
url,
|
|
760
|
+
env,
|
|
761
|
+
actionId,
|
|
762
|
+
handledByBoundary: false,
|
|
763
|
+
});
|
|
764
|
+
throw new Error(`Failed to decode action arguments: ${error}`, {
|
|
765
|
+
cause: error,
|
|
766
|
+
});
|
|
767
|
+
}
|
|
768
|
+
// Execute the server action
|
|
769
|
+
let returnValue;
|
|
770
|
+
let actionStatus = 200;
|
|
771
|
+
let loadedAction;
|
|
772
|
+
try {
|
|
773
|
+
loadedAction = await loadServerAction(actionId);
|
|
774
|
+
const data = await loadedAction.apply(null, args);
|
|
775
|
+
returnValue = { ok: true, data };
|
|
776
|
+
}
|
|
777
|
+
catch (error) {
|
|
778
|
+
returnValue = { ok: false, data: error };
|
|
779
|
+
actionStatus = 500;
|
|
780
|
+
// Try to render error boundary
|
|
781
|
+
const errorResult = await router.matchError(request, env, error, "route");
|
|
782
|
+
// Report the action error (handledByBoundary indicates if error boundary will render)
|
|
783
|
+
callOnError(error, "action", {
|
|
784
|
+
request,
|
|
785
|
+
url,
|
|
786
|
+
env,
|
|
787
|
+
actionId,
|
|
788
|
+
handledByBoundary: !!errorResult,
|
|
789
|
+
});
|
|
790
|
+
if (errorResult) {
|
|
791
|
+
setRequestContextParams(errorResult.params);
|
|
792
|
+
const payload = {
|
|
793
|
+
root: null,
|
|
794
|
+
metadata: {
|
|
795
|
+
pathname: url.pathname,
|
|
796
|
+
segments: errorResult.segments,
|
|
797
|
+
isPartial: true,
|
|
798
|
+
matched: errorResult.matched,
|
|
799
|
+
diff: errorResult.diff,
|
|
800
|
+
isError: true,
|
|
801
|
+
handles: handleStore.stream(),
|
|
802
|
+
version,
|
|
803
|
+
},
|
|
804
|
+
returnValue,
|
|
805
|
+
};
|
|
806
|
+
const rscStream = renderToReadableStream(payload, {
|
|
807
|
+
temporaryReferences,
|
|
808
|
+
});
|
|
809
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
810
|
+
status: actionStatus,
|
|
811
|
+
headers: { "content-type": "text/x-component;charset=utf-8" },
|
|
812
|
+
});
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
// Revalidate after action
|
|
816
|
+
const resolvedActionId = loadedAction?.$id ??
|
|
817
|
+
loadedAction?.$$id ??
|
|
818
|
+
actionId;
|
|
819
|
+
const actionContext = {
|
|
820
|
+
actionId: resolvedActionId,
|
|
821
|
+
actionUrl: new URL(request.url),
|
|
822
|
+
actionResult: returnValue.data,
|
|
823
|
+
formData: actionFormData,
|
|
824
|
+
};
|
|
825
|
+
const matchResult = await router.matchPartial(request, env, actionContext);
|
|
826
|
+
if (!matchResult) {
|
|
827
|
+
// Fall back to full render
|
|
828
|
+
const fullMatch = await router.match(request, env);
|
|
829
|
+
setRequestContextParams(fullMatch.params);
|
|
830
|
+
if (fullMatch.redirect) {
|
|
831
|
+
return createResponseWithMergedHeaders(null, {
|
|
832
|
+
status: 308,
|
|
833
|
+
headers: { Location: fullMatch.redirect },
|
|
834
|
+
});
|
|
835
|
+
}
|
|
836
|
+
const renderStart = performance.now();
|
|
837
|
+
const root = renderSegments(fullMatch.segments, {
|
|
838
|
+
rootLayout: router.rootLayout,
|
|
839
|
+
isAction: true,
|
|
840
|
+
});
|
|
841
|
+
const renderDuration = performance.now() - renderStart;
|
|
842
|
+
const serverTiming = fullMatch.serverTiming
|
|
843
|
+
? `${fullMatch.serverTiming}, rendering;dur=${renderDuration.toFixed(2)}`
|
|
844
|
+
: `rendering;dur=${renderDuration.toFixed(2)}`;
|
|
845
|
+
const payload = {
|
|
846
|
+
root,
|
|
847
|
+
metadata: {
|
|
848
|
+
pathname: url.pathname,
|
|
849
|
+
segments: fullMatch.segments,
|
|
850
|
+
matched: fullMatch.matched,
|
|
851
|
+
diff: fullMatch.diff,
|
|
852
|
+
handles: handleStore.stream(),
|
|
853
|
+
version,
|
|
854
|
+
},
|
|
855
|
+
returnValue,
|
|
856
|
+
};
|
|
857
|
+
const rscStream = renderToReadableStream(payload, {
|
|
858
|
+
temporaryReferences,
|
|
859
|
+
});
|
|
860
|
+
const headers = {
|
|
861
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
862
|
+
};
|
|
863
|
+
if (serverTiming) {
|
|
864
|
+
headers["Server-Timing"] = serverTiming;
|
|
865
|
+
}
|
|
866
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
867
|
+
status: actionStatus,
|
|
868
|
+
headers,
|
|
869
|
+
});
|
|
870
|
+
}
|
|
871
|
+
// Return updated segments
|
|
872
|
+
setRequestContextParams(matchResult.params);
|
|
873
|
+
const renderStart = performance.now();
|
|
874
|
+
const renderDuration = performance.now() - renderStart;
|
|
875
|
+
const serverTiming = matchResult.serverTiming
|
|
876
|
+
? `${matchResult.serverTiming}, rendering;dur=${renderDuration.toFixed(2)}`
|
|
877
|
+
: `rendering;dur=${renderDuration.toFixed(2)}`;
|
|
878
|
+
const payload = {
|
|
879
|
+
root: null,
|
|
880
|
+
metadata: {
|
|
881
|
+
pathname: url.pathname,
|
|
882
|
+
segments: matchResult.segments,
|
|
883
|
+
isPartial: true,
|
|
884
|
+
matched: matchResult.matched,
|
|
885
|
+
diff: matchResult.diff,
|
|
886
|
+
slots: matchResult.slots,
|
|
887
|
+
handles: handleStore.stream(),
|
|
888
|
+
version,
|
|
889
|
+
},
|
|
890
|
+
returnValue,
|
|
891
|
+
};
|
|
892
|
+
const rscStream = renderToReadableStream(payload, {
|
|
893
|
+
temporaryReferences,
|
|
894
|
+
});
|
|
895
|
+
const actionHeaders = {
|
|
896
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
897
|
+
};
|
|
898
|
+
if (serverTiming) {
|
|
899
|
+
actionHeaders["Server-Timing"] = serverTiming;
|
|
900
|
+
}
|
|
901
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
902
|
+
status: actionStatus,
|
|
903
|
+
headers: actionHeaders,
|
|
904
|
+
});
|
|
905
|
+
}
|
|
906
|
+
// ============================================================================
|
|
907
|
+
// LOADER FETCH HANDLER
|
|
908
|
+
// Supports GET (params in query string) and POST/PUT/PATCH/DELETE (JSON body)
|
|
909
|
+
// ============================================================================
|
|
910
|
+
async function handleLoaderFetch(request, env, url, variables) {
|
|
911
|
+
const loaderId = url.searchParams.get("_rsc_loader");
|
|
912
|
+
if (!loaderId) {
|
|
913
|
+
return createResponseWithMergedHeaders("Missing _rsc_loader parameter", {
|
|
914
|
+
status: 400,
|
|
915
|
+
});
|
|
916
|
+
}
|
|
917
|
+
// Look up loader lazily
|
|
918
|
+
const registeredLoader = await getLoaderLazy(loaderId);
|
|
919
|
+
if (!registeredLoader) {
|
|
920
|
+
return createResponseWithMergedHeaders(`Loader "${loaderId}" not found in registry`, { status: 404 });
|
|
921
|
+
}
|
|
922
|
+
// Parse params and body based on request method
|
|
923
|
+
let loaderParams = {};
|
|
924
|
+
let loaderBody = undefined;
|
|
925
|
+
const isBodyMethod = request.method !== "GET" && request.method !== "HEAD";
|
|
926
|
+
if (isBodyMethod) {
|
|
927
|
+
try {
|
|
928
|
+
const contentType = request.headers.get("content-type") || "";
|
|
929
|
+
if (contentType.includes("application/json")) {
|
|
930
|
+
const jsonBody = (await request.json());
|
|
931
|
+
loaderParams = jsonBody.params ?? {};
|
|
932
|
+
loaderBody = jsonBody.body;
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
catch {
|
|
936
|
+
return createResponseWithMergedHeaders("Invalid JSON body", {
|
|
937
|
+
status: 400,
|
|
938
|
+
});
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
else {
|
|
942
|
+
const loaderParamsJson = url.searchParams.get("_rsc_loader_params");
|
|
943
|
+
if (loaderParamsJson) {
|
|
944
|
+
try {
|
|
945
|
+
loaderParams = JSON.parse(loaderParamsJson);
|
|
946
|
+
}
|
|
947
|
+
catch {
|
|
948
|
+
return createResponseWithMergedHeaders("Invalid _rsc_loader_params JSON", { status: 400 });
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
// Execute the loader with middleware
|
|
953
|
+
try {
|
|
954
|
+
const { fn, middleware } = registeredLoader;
|
|
955
|
+
return await executeLoaderMiddleware(middleware, request, env, loaderParams, variables, async () => {
|
|
956
|
+
const ctx = requireRequestContext();
|
|
957
|
+
const loaderCtx = {
|
|
958
|
+
...ctx,
|
|
959
|
+
params: loaderParams,
|
|
960
|
+
body: loaderBody,
|
|
961
|
+
};
|
|
962
|
+
const result = await fn(loaderCtx);
|
|
963
|
+
const loaderPayload = { loaderResult: result };
|
|
964
|
+
const rscStream = renderToReadableStream(loaderPayload);
|
|
965
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
966
|
+
headers: { "content-type": "text/x-component;charset=utf-8" },
|
|
967
|
+
});
|
|
968
|
+
});
|
|
969
|
+
}
|
|
970
|
+
catch (error) {
|
|
971
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
972
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
973
|
+
console.error("[RSC] Loader error:", error);
|
|
974
|
+
callOnError(error, "loader", {
|
|
975
|
+
request,
|
|
976
|
+
url,
|
|
977
|
+
env,
|
|
978
|
+
loaderName: loaderId,
|
|
979
|
+
handledByBoundary: false,
|
|
980
|
+
});
|
|
981
|
+
const errorPayload = {
|
|
982
|
+
loaderResult: null,
|
|
983
|
+
loaderError: {
|
|
984
|
+
message: isDev ? err.message : "An error occurred",
|
|
985
|
+
name: err.name,
|
|
986
|
+
},
|
|
987
|
+
};
|
|
988
|
+
const rscStream = renderToReadableStream(errorPayload);
|
|
989
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
990
|
+
status: 500,
|
|
991
|
+
headers: { "content-type": "text/x-component;charset=utf-8" },
|
|
992
|
+
});
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
// ============================================================================
|
|
996
|
+
// RSC RENDERING HANDLER (Navigation)
|
|
997
|
+
// ============================================================================
|
|
998
|
+
async function handleRscRendering(request, env, url, isPartial, handleStore, nonce) {
|
|
999
|
+
// Retrieve handler-level timing from variables
|
|
1000
|
+
const reqCtx = requireRequestContext();
|
|
1001
|
+
const handlerTimingArr = reqCtx.var.__handlerTiming || [];
|
|
1002
|
+
const handlerStart = reqCtx.var.__handlerStart || 0;
|
|
1003
|
+
let payload;
|
|
1004
|
+
let serverTiming;
|
|
1005
|
+
if (isPartial) {
|
|
1006
|
+
// Partial render (navigation)
|
|
1007
|
+
const result = await router.matchPartial(request, env);
|
|
1008
|
+
if (!result) {
|
|
1009
|
+
// Fall back to full render
|
|
1010
|
+
const match = await router.match(request, env);
|
|
1011
|
+
setRequestContextParams(match.params);
|
|
1012
|
+
if (match.redirect) {
|
|
1013
|
+
return createResponseWithMergedHeaders(null, {
|
|
1014
|
+
status: 308,
|
|
1015
|
+
headers: { Location: match.redirect },
|
|
1016
|
+
});
|
|
1017
|
+
}
|
|
1018
|
+
const renderStart = performance.now();
|
|
1019
|
+
const root = renderSegments(match.segments, {
|
|
1020
|
+
rootLayout: router.rootLayout,
|
|
1021
|
+
});
|
|
1022
|
+
const renderDuration = performance.now() - renderStart;
|
|
1023
|
+
serverTiming = match.serverTiming
|
|
1024
|
+
? `${match.serverTiming}, rendering;dur=${renderDuration.toFixed(2)}`
|
|
1025
|
+
: `rendering;dur=${renderDuration.toFixed(2)}`;
|
|
1026
|
+
payload = {
|
|
1027
|
+
root,
|
|
1028
|
+
metadata: {
|
|
1029
|
+
pathname: url.pathname,
|
|
1030
|
+
segments: match.segments,
|
|
1031
|
+
matched: match.matched,
|
|
1032
|
+
diff: match.diff,
|
|
1033
|
+
isPartial: false,
|
|
1034
|
+
handles: handleStore.stream(),
|
|
1035
|
+
version,
|
|
1036
|
+
themeConfig: router.themeConfig,
|
|
1037
|
+
initialTheme: reqCtx.theme,
|
|
1038
|
+
},
|
|
1039
|
+
};
|
|
1040
|
+
}
|
|
1041
|
+
else {
|
|
1042
|
+
setRequestContextParams(result.params);
|
|
1043
|
+
serverTiming = result.serverTiming;
|
|
1044
|
+
payload = {
|
|
1045
|
+
root: null,
|
|
1046
|
+
metadata: {
|
|
1047
|
+
pathname: url.pathname,
|
|
1048
|
+
segments: result.segments,
|
|
1049
|
+
matched: result.matched,
|
|
1050
|
+
diff: result.diff,
|
|
1051
|
+
isPartial: true,
|
|
1052
|
+
slots: result.slots,
|
|
1053
|
+
handles: handleStore.stream(),
|
|
1054
|
+
version,
|
|
1055
|
+
},
|
|
1056
|
+
};
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
else {
|
|
1060
|
+
// Full render (initial page load)
|
|
1061
|
+
const match = await router.match(request, env);
|
|
1062
|
+
setRequestContextParams(match.params);
|
|
1063
|
+
if (match.redirect) {
|
|
1064
|
+
return createResponseWithMergedHeaders(null, {
|
|
1065
|
+
status: 308,
|
|
1066
|
+
headers: { Location: match.redirect },
|
|
1067
|
+
});
|
|
1068
|
+
}
|
|
1069
|
+
// Caching is now handled in router.match() via cache provider in request context
|
|
1070
|
+
// match.segments already contains cached or fresh segments as appropriate
|
|
1071
|
+
if (url.searchParams.has("__prerender_collect")) {
|
|
1072
|
+
// Build-time prerender collection: serialize segments and handle data
|
|
1073
|
+
// to JSON for storage as build artifacts. At runtime the worker
|
|
1074
|
+
// deserializes these and feeds them through the normal segment pipeline.
|
|
1075
|
+
const nonLoaderSegments = match.segments.filter((s) => s.type !== "loader");
|
|
1076
|
+
await handleStore.settled;
|
|
1077
|
+
const { serializeSegments } = await import("../cache/cache-scope.js");
|
|
1078
|
+
const serializedSegments = await serializeSegments(nonLoaderSegments);
|
|
1079
|
+
const handles = {};
|
|
1080
|
+
for (const seg of nonLoaderSegments) {
|
|
1081
|
+
const segHandles = handleStore.getDataForSegment(seg.id);
|
|
1082
|
+
if (Object.keys(segHandles).length > 0) {
|
|
1083
|
+
handles[seg.id] = segHandles;
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
return new Response(JSON.stringify({
|
|
1087
|
+
segments: serializedSegments,
|
|
1088
|
+
handles,
|
|
1089
|
+
routeName: match.routeName,
|
|
1090
|
+
params: match.params,
|
|
1091
|
+
}), { headers: { "Content-Type": "application/json" } });
|
|
1092
|
+
}
|
|
1093
|
+
else {
|
|
1094
|
+
const renderStart = performance.now();
|
|
1095
|
+
const root = renderSegments(match.segments, {
|
|
1096
|
+
rootLayout: router.rootLayout,
|
|
1097
|
+
});
|
|
1098
|
+
const renderDuration = performance.now() - renderStart;
|
|
1099
|
+
serverTiming = match.serverTiming
|
|
1100
|
+
? `${match.serverTiming}, rendering;dur=${renderDuration.toFixed(2)}`
|
|
1101
|
+
: `rendering;dur=${renderDuration.toFixed(2)}`;
|
|
1102
|
+
payload = {
|
|
1103
|
+
root,
|
|
1104
|
+
metadata: {
|
|
1105
|
+
pathname: url.pathname,
|
|
1106
|
+
segments: match.segments,
|
|
1107
|
+
matched: match.matched,
|
|
1108
|
+
diff: match.diff,
|
|
1109
|
+
isPartial: false,
|
|
1110
|
+
rootLayout: router.rootLayout,
|
|
1111
|
+
handles: handleStore.stream(),
|
|
1112
|
+
version,
|
|
1113
|
+
themeConfig: router.themeConfig,
|
|
1114
|
+
initialTheme: reqCtx.theme,
|
|
1115
|
+
},
|
|
1116
|
+
};
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
// Serialize to RSC stream
|
|
1120
|
+
const rscSerializeStart = performance.now();
|
|
1121
|
+
const rscStream = renderToReadableStream(payload);
|
|
1122
|
+
const rscSerializeDur = performance.now() - rscSerializeStart;
|
|
1123
|
+
// Determine if this is an RSC request or HTML request
|
|
1124
|
+
const isRscRequest = (!request.headers.get("accept")?.includes("text/html") &&
|
|
1125
|
+
!url.searchParams.has("__html")) ||
|
|
1126
|
+
url.searchParams.has("__rsc");
|
|
1127
|
+
// Build complete Server-Timing: handler phases + match/manifest + rendering + RSC serialize
|
|
1128
|
+
const timingParts = [...handlerTimingArr];
|
|
1129
|
+
if (serverTiming) {
|
|
1130
|
+
timingParts.push(serverTiming);
|
|
1131
|
+
}
|
|
1132
|
+
timingParts.push(`rsc-serialize;dur=${rscSerializeDur.toFixed(2)}`);
|
|
1133
|
+
if (isRscRequest) {
|
|
1134
|
+
const fullTiming = timingParts.join(", ");
|
|
1135
|
+
const rscHeaders = {
|
|
1136
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
1137
|
+
vary: "accept",
|
|
1138
|
+
};
|
|
1139
|
+
if (fullTiming) {
|
|
1140
|
+
rscHeaders["Server-Timing"] = fullTiming;
|
|
1141
|
+
}
|
|
1142
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
1143
|
+
headers: rscHeaders,
|
|
1144
|
+
});
|
|
1145
|
+
}
|
|
1146
|
+
// Delegate to SSR for HTML response
|
|
1147
|
+
const ssrModuleStart = performance.now();
|
|
1148
|
+
const ssrModule = await loadSSRModule();
|
|
1149
|
+
const ssrModuleDur = performance.now() - ssrModuleStart;
|
|
1150
|
+
timingParts.push(`ssr-module-load;dur=${ssrModuleDur.toFixed(2)}`);
|
|
1151
|
+
const ssrRenderStart = performance.now();
|
|
1152
|
+
const htmlStream = await ssrModule.renderHTML(rscStream, { nonce });
|
|
1153
|
+
const ssrRenderDur = performance.now() - ssrRenderStart;
|
|
1154
|
+
timingParts.push(`ssr-render-html;dur=${ssrRenderDur.toFixed(2)}`);
|
|
1155
|
+
// Add total handler duration
|
|
1156
|
+
if (handlerStart) {
|
|
1157
|
+
const totalHandler = performance.now() - handlerStart;
|
|
1158
|
+
timingParts.push(`handler-total;dur=${totalHandler.toFixed(2)}`);
|
|
1159
|
+
}
|
|
1160
|
+
const fullTiming = timingParts.join(", ");
|
|
1161
|
+
const htmlHeaders = {
|
|
1162
|
+
"content-type": "text/html;charset=utf-8",
|
|
1163
|
+
};
|
|
1164
|
+
if (fullTiming) {
|
|
1165
|
+
htmlHeaders["Server-Timing"] = fullTiming;
|
|
1166
|
+
}
|
|
1167
|
+
return createResponseWithMergedHeaders(htmlStream, {
|
|
1168
|
+
headers: htmlHeaders,
|
|
1169
|
+
});
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
//# sourceMappingURL=handler.js.map
|