@rangojs/router 0.0.0-experimental.2 → 0.0.0-experimental.204030a9
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 +1037 -4
- 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/{src/__mocks__/version.ts → dist/__mocks__/version.js} +1 -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 +1779 -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/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/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 +6440 -809
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +18 -17
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +140 -57
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +484 -0
- package/skills/caching/SKILL.md +276 -226
- package/skills/composability/SKILL.md +197 -0
- package/skills/debug-manifest/SKILL.md +112 -0
- package/skills/document-cache/SKILL.md +106 -53
- package/skills/fonts/SKILL.md +167 -0
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +621 -67
- package/skills/host-router/SKILL.md +243 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +265 -202
- package/skills/layout/SKILL.md +261 -146
- package/skills/links/SKILL.md +471 -0
- package/skills/loader/SKILL.md +701 -250
- package/skills/middleware/SKILL.md +254 -320
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +155 -0
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +399 -158
- package/skills/prerender/SKILL.md +666 -0
- package/skills/rango/SKILL.md +338 -0
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +468 -0
- package/skills/route/SKILL.md +417 -89
- package/skills/router-setup/SKILL.md +389 -268
- package/skills/server-actions/SKILL.md +751 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/testing/SKILL.md +549 -0
- package/skills/theme/SKILL.md +36 -11
- package/skills/typesafety/SKILL.md +747 -174
- package/skills/use-cache/SKILL.md +353 -0
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +117 -0
- package/src/__internal.ts +273 -0
- package/src/bin/rango.ts +321 -0
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +172 -128
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +390 -557
- package/src/browser/navigation-client.ts +228 -70
- package/src/browser/navigation-store.ts +104 -63
- package/src/browser/navigation-transaction.ts +279 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +397 -303
- package/src/browser/prefetch/cache.ts +314 -0
- package/src/browser/prefetch/fetch.ts +282 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +191 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +152 -0
- package/src/browser/react/Link.tsx +258 -74
- package/src/browser/react/NavigationProvider.tsx +237 -49
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +55 -0
- package/src/browser/react/index.ts +15 -12
- package/src/browser/react/location-state-shared.ts +269 -56
- package/src/browser/react/location-state.ts +90 -19
- 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 +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +41 -98
- package/src/browser/react/use-href.tsx +20 -188
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-mount.ts +31 -0
- package/src/browser/react/use-navigation.ts +49 -80
- package/src/browser/react/use-params.ts +77 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +96 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +85 -99
- package/src/browser/response-adapter.ts +98 -0
- package/src/browser/rsc-router.tsx +273 -78
- package/src/browser/scroll-restoration.ts +132 -49
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +83 -0
- package/src/browser/server-action-bridge.ts +504 -589
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +184 -58
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +463 -0
- package/src/build/generate-route-types.ts +41 -0
- package/src/build/index.ts +37 -0
- package/src/build/route-trie.ts +292 -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 +418 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +131 -0
- package/src/build/route-types/router-processing.ts +659 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +220 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +342 -0
- package/src/cache/cache-scope.ts +150 -306
- package/src/cache/cf/cf-cache-store.ts +619 -24
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +191 -13
- 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 +153 -0
- package/src/cache/types.ts +76 -121
- package/src/client.rsc.tsx +15 -15
- package/src/client.tsx +145 -309
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +6 -2
- package/src/context-var.ts +156 -0
- package/src/debug.ts +243 -0
- package/src/decode-loader-results.ts +36 -0
- package/src/errors.ts +138 -3
- package/src/handle.ts +90 -22
- package/src/handles/MetaTags.tsx +76 -23
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +32 -15
- 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 +424 -0
- package/src/host/testing.ts +79 -0
- package/src/host/types.ts +175 -0
- package/src/host/utils.ts +25 -0
- package/src/href-client.ts +263 -49
- package/src/index.rsc.ts +190 -29
- package/src/index.ts +278 -38
- package/src/internal-debug.ts +11 -0
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +24 -142
- package/src/loader.ts +21 -11
- package/src/missing-id-error.ts +68 -0
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +186 -0
- package/src/prerender.ts +524 -0
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +380 -0
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +15 -39
- package/src/route-definition/dsl-helpers.ts +1109 -0
- package/src/route-definition/helper-factories.ts +90 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +101 -0
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-definition.ts +1 -1371
- package/src/route-map-builder.ts +247 -112
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +99 -42
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +228 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +10 -10
- package/src/router/find-match.ts +160 -0
- package/src/router/handler-context.ts +420 -88
- package/src/router/intercept-resolution.ts +388 -0
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +374 -128
- package/src/router/logging.ts +251 -0
- package/src/router/manifest.ts +187 -43
- package/src/router/match-api.ts +556 -0
- package/src/router/match-context.ts +6 -4
- package/src/router/match-handlers.ts +483 -0
- package/src/router/match-middleware/background-revalidation.ts +108 -93
- package/src/router/match-middleware/cache-lookup.ts +413 -10
- package/src/router/match-middleware/cache-store.ts +99 -26
- package/src/router/match-middleware/intercept-resolution.ts +57 -17
- package/src/router/match-middleware/segment-resolution.ts +80 -6
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +156 -36
- package/src/router/metrics.ts +241 -16
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +209 -0
- package/src/router/middleware.ts +359 -346
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +416 -41
- package/src/router/prerender-match.ts +502 -0
- package/src/router/preview-match.ts +100 -0
- package/src/router/request-classification.ts +286 -0
- package/src/router/revalidation.ts +195 -40
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +45 -23
- package/src/router/router-interfaces.ts +501 -0
- package/src/router/router-options.ts +657 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +769 -0
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1420 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/segment-resolution.ts +21 -0
- package/src/router/segment-wrappers.ts +291 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +399 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +244 -0
- package/src/router/types.ts +87 -4
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +768 -3574
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +894 -806
- package/src/rsc/helpers.ts +201 -19
- package/src/rsc/index.ts +5 -25
- package/src/rsc/loader-fetch.ts +229 -0
- package/src/rsc/manifest-init.ts +90 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +159 -0
- package/src/rsc/progressive-enhancement.ts +395 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +340 -0
- package/src/rsc/rsc-rendering.ts +230 -0
- package/src/rsc/runtime-warnings.ts +41 -0
- package/src/rsc/server-action.ts +336 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/types.ts +54 -14
- package/src/search-params.ts +230 -0
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +265 -115
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +480 -90
- package/src/server/cookie-store.ts +214 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +117 -20
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +613 -109
- package/src/server.ts +36 -131
- package/src/ssr/index.tsx +164 -25
- package/src/static-handler.ts +126 -0
- package/src/testing/cache-status.ts +166 -0
- package/src/testing/collect-handle.ts +63 -0
- package/src/testing/dispatch.ts +440 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +154 -0
- package/src/testing/e2e/index.ts +149 -0
- package/src/testing/e2e/matchers.ts +51 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +306 -0
- package/src/testing/e2e/server.ts +183 -0
- package/src/testing/flight-matchers.ts +104 -0
- package/src/testing/flight-runtime.d.ts +21 -0
- package/src/testing/flight.entry.ts +22 -0
- package/src/testing/flight.ts +182 -0
- package/src/testing/generated-routes.ts +223 -0
- package/src/testing/index.ts +98 -0
- package/src/testing/internal/context.ts +151 -0
- package/src/testing/render-route.tsx +536 -0
- package/src/testing/run-loader.ts +296 -0
- package/src/testing/run-middleware.ts +170 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +112 -0
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +11 -4
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +5 -31
- package/src/theme/theme-script.ts +21 -18
- package/src/theme/types.ts +1 -1
- 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 +113 -0
- package/src/types/handler-context.ts +809 -0
- package/src/types/index.ts +89 -0
- package/src/types/loader-types.ts +209 -0
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +120 -0
- package/src/types/segments.ts +184 -0
- package/src/types.ts +1 -1561
- package/src/urls/include-helper.ts +164 -0
- package/src/urls/index.ts +50 -0
- package/src/urls/path-helper-types.ts +380 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +124 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +282 -0
- package/src/urls/urls-function.ts +94 -0
- package/src/urls.ts +1 -726
- package/src/use-loader.tsx +559 -108
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +398 -0
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +480 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/state.ts +150 -0
- package/src/vite/discovery/virtual-module-codegen.ts +193 -0
- package/src/vite/index.ts +20 -785
- package/src/vite/plugin-types.ts +170 -0
- package/src/vite/plugins/cjs-to-esm.ts +94 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +128 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +109 -66
- package/src/vite/plugins/expose-id-utils.ts +303 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +376 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +156 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +72 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +796 -0
- package/src/vite/plugins/performance-tracks.ts +92 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +338 -0
- package/src/vite/plugins/version-injector.ts +99 -0
- package/src/vite/plugins/version-plugin.ts +323 -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 +549 -0
- package/src/vite/router-discovery.ts +1568 -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 +139 -0
- package/src/vite/utils/client-chunks.ts +190 -0
- package/src/vite/utils/forward-user-plugins.ts +193 -0
- package/src/vite/utils/manifest-utils.ts +86 -0
- package/src/vite/utils/package-resolution.ts +161 -0
- package/src/vite/utils/prerender-utils.ts +222 -0
- package/src/vite/utils/shared-utils.ts +251 -0
- package/CLAUDE.md +0 -7
- package/src/__tests__/component-utils.test.ts +0 -76
- package/src/__tests__/route-definition.test.ts +0 -63
- package/src/__tests__/urls.test.tsx +0 -436
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/__tests__/document-cache.test.ts +0 -522
- package/src/cache/__tests__/memory-segment-store.test.ts +0 -487
- package/src/cache/__tests__/memory-store.test.ts +0 -484
- package/src/cache/cf/__tests__/cf-cache-store.test.ts +0 -428
- package/src/cache/memory-store.ts +0 -253
- package/src/href.ts +0 -177
- package/src/route-utils.ts +0 -89
- package/src/router/__tests__/match-context.test.ts +0 -104
- package/src/router/__tests__/match-pipelines.test.ts +0 -537
- package/src/router/__tests__/match-result.test.ts +0 -566
- package/src/router/__tests__/on-error.test.ts +0 -935
- package/src/router/__tests__/pattern-matching.test.ts +0 -577
- package/src/router/middleware.test.ts +0 -1355
- package/src/rsc/__tests__/helpers.test.ts +0 -175
- package/src/server/__tests__/request-context.test.ts +0 -171
- package/src/ssr/__tests__/ssr-handler.test.tsx +0 -188
- package/src/theme/__tests__/theme.test.ts +0 -120
- package/src/vite/__tests__/expose-loader-id.test.ts +0 -117
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -357
- package/src/vite/expose-location-state-id.ts +0 -177
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/src/router/middleware.ts
CHANGED
|
@@ -9,129 +9,58 @@
|
|
|
9
9
|
* - Forgiving API: if middleware doesn't return, original response is used
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
params: TParams;
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Response object - available immediately via stub, real response after `await next()`
|
|
55
|
-
*
|
|
56
|
-
* Headers set before `next()` are merged into the final response.
|
|
57
|
-
* Can be used to modify headers directly like Hono's `c.res`.
|
|
58
|
-
*
|
|
59
|
-
* @example
|
|
60
|
-
* ```typescript
|
|
61
|
-
* middleware(async (ctx, next) => {
|
|
62
|
-
* // Set headers BEFORE next() - will be merged into final response
|
|
63
|
-
* ctx.res.headers.set('X-Request-Id', generateId());
|
|
64
|
-
*
|
|
65
|
-
* await next();
|
|
66
|
-
*
|
|
67
|
-
* // Set headers AFTER next() - applied directly
|
|
68
|
-
* ctx.res.headers.set('X-Custom', 'value');
|
|
69
|
-
* // No return needed!
|
|
70
|
-
* });
|
|
71
|
-
* ```
|
|
72
|
-
*/
|
|
73
|
-
res: Response;
|
|
74
|
-
|
|
75
|
-
/** Get a cookie value */
|
|
76
|
-
cookie(name: string): string | undefined;
|
|
77
|
-
|
|
78
|
-
/** Get all cookies as object */
|
|
79
|
-
cookies(): Record<string, string>;
|
|
80
|
-
|
|
81
|
-
/** Set a cookie on the response */
|
|
82
|
-
setCookie(name: string, value: string, options?: CookieOptions): void;
|
|
83
|
-
|
|
84
|
-
/** Delete a cookie */
|
|
85
|
-
deleteCookie(
|
|
86
|
-
name: string,
|
|
87
|
-
options?: Pick<CookieOptions, "domain" | "path">
|
|
88
|
-
): void;
|
|
89
|
-
|
|
90
|
-
/** Get a context variable (shared with route handlers) */
|
|
91
|
-
get<K extends string>(key: K): any;
|
|
92
|
-
|
|
93
|
-
/** Set a context variable (shared with route handlers) */
|
|
94
|
-
set<K extends string>(key: K, value: any): void;
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Set a response header - can be called before or after `next()`
|
|
98
|
-
*
|
|
99
|
-
* When called before `next()`, headers are queued and merged into the final response.
|
|
100
|
-
* When called after `next()`, headers are set directly on the response.
|
|
101
|
-
* Shorthand for `ctx.res.headers.set()`.
|
|
102
|
-
*/
|
|
103
|
-
header(name: string, value: string): void;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Middleware function signature
|
|
108
|
-
*
|
|
109
|
-
* @template TEnv - Environment type
|
|
110
|
-
* @template TParams - URL params type (typed for route middleware)
|
|
111
|
-
*/
|
|
112
|
-
export type MiddlewareFn<TEnv = any, TParams = Record<string, string>> = (
|
|
113
|
-
ctx: MiddlewareContext<TEnv, TParams>,
|
|
114
|
-
next: () => Promise<Response>
|
|
115
|
-
) => Response | Promise<Response> | void | Promise<void>;
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Stored middleware entry with pattern matching info
|
|
119
|
-
*/
|
|
120
|
-
export interface MiddlewareEntry<TEnv = any> {
|
|
121
|
-
/** Original pattern string */
|
|
122
|
-
pattern: string | null;
|
|
123
|
-
|
|
124
|
-
/** Compiled regex for matching */
|
|
125
|
-
regex: RegExp | null;
|
|
12
|
+
import { contextGet, contextSet } from "../context-var.js";
|
|
13
|
+
import { safeDecodeURIComponent } from "./url-params.js";
|
|
14
|
+
import { fireAndForgetWaitUntil } from "../types/request-scope.js";
|
|
15
|
+
import type {
|
|
16
|
+
CollectedMiddleware,
|
|
17
|
+
MiddlewareCollectableEntry,
|
|
18
|
+
MiddlewareContext,
|
|
19
|
+
MiddlewareEntry,
|
|
20
|
+
MiddlewareFn,
|
|
21
|
+
ResponseHolder,
|
|
22
|
+
} from "./middleware-types.js";
|
|
23
|
+
import { _getRequestContext } from "../server/request-context.js";
|
|
24
|
+
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
25
|
+
import { appendMetric, createMetricsStore } from "./metrics.js";
|
|
26
|
+
import { stripInternalParams } from "./handler-context.js";
|
|
27
|
+
import { isWebSocketUpgradeResponse } from "../response-utils.js";
|
|
28
|
+
|
|
29
|
+
// Re-export types and cookie utilities for backward compatibility
|
|
30
|
+
export type {
|
|
31
|
+
CookieOptions,
|
|
32
|
+
CollectedMiddleware,
|
|
33
|
+
MiddlewareCollectableEntry,
|
|
34
|
+
MiddlewareContext,
|
|
35
|
+
MiddlewareEntry,
|
|
36
|
+
MiddlewareFn,
|
|
37
|
+
ResponseHolder,
|
|
38
|
+
} from "./middleware-types.js";
|
|
39
|
+
export { parseCookies, serializeCookie } from "./middleware-cookies.js";
|
|
40
|
+
|
|
41
|
+
const MIDDLEWARE_METRIC_DEPTH = 1;
|
|
42
|
+
/** Ignore post-next() durations below this threshold (measurement noise). */
|
|
43
|
+
const POST_METRIC_MIN_DURATION_MS = 0.01;
|
|
44
|
+
|
|
45
|
+
function getMiddlewareMetricBase<TEnv>(
|
|
46
|
+
entry: MiddlewareEntry<TEnv>,
|
|
47
|
+
ordinal: number,
|
|
48
|
+
): string {
|
|
49
|
+
const handlerName = entry.handler.name?.trim();
|
|
50
|
+
const scope = entry.pattern ?? "*";
|
|
126
51
|
|
|
127
|
-
|
|
128
|
-
|
|
52
|
+
if (handlerName) {
|
|
53
|
+
return `${handlerName}@${scope}`;
|
|
54
|
+
}
|
|
129
55
|
|
|
130
|
-
|
|
131
|
-
|
|
56
|
+
return `${scope}#${ordinal + 1}`;
|
|
57
|
+
}
|
|
132
58
|
|
|
133
|
-
|
|
134
|
-
|
|
59
|
+
function getMiddlewareMetricLabel<TEnv>(
|
|
60
|
+
entry: MiddlewareEntry<TEnv>,
|
|
61
|
+
ordinal: number,
|
|
62
|
+
): string {
|
|
63
|
+
return `middleware:${getMiddlewareMetricBase(entry, ordinal)}`;
|
|
135
64
|
}
|
|
136
65
|
|
|
137
66
|
/**
|
|
@@ -186,165 +115,164 @@ function escapeRegex(str: string): string {
|
|
|
186
115
|
}
|
|
187
116
|
|
|
188
117
|
/**
|
|
189
|
-
* Extract params from a pathname using a pattern's regex and param names
|
|
118
|
+
* Extract params from a pathname using a pattern's regex and param names.
|
|
119
|
+
*
|
|
120
|
+
* Values are URL-decoded so apps see the raw string (e.g. "ivo@example.com")
|
|
121
|
+
* instead of the percent-encoded form ("ivo%40example.com"). This matches the
|
|
122
|
+
* contract assumed by ctx.reverse (which re-encodes) and aligns with
|
|
123
|
+
* Express/React Router/Fastify/Koa.
|
|
190
124
|
*/
|
|
191
125
|
export function extractParams(
|
|
192
126
|
pathname: string,
|
|
193
127
|
regex: RegExp,
|
|
194
|
-
paramNames: string[]
|
|
128
|
+
paramNames: string[],
|
|
195
129
|
): Record<string, string> {
|
|
196
130
|
const match = pathname.match(regex);
|
|
197
131
|
if (!match) return {};
|
|
198
132
|
|
|
199
133
|
const params: Record<string, string> = {};
|
|
200
134
|
for (let i = 0; i < paramNames.length; i++) {
|
|
201
|
-
params[paramNames[i]] = match[i + 1] || "";
|
|
135
|
+
params[paramNames[i]] = safeDecodeURIComponent(match[i + 1] || "");
|
|
202
136
|
}
|
|
203
137
|
return params;
|
|
204
138
|
}
|
|
205
139
|
|
|
206
|
-
/**
|
|
207
|
-
* Parse cookies from Cookie header
|
|
208
|
-
*/
|
|
209
|
-
export function parseCookies(
|
|
210
|
-
cookieHeader: string | null
|
|
211
|
-
): Record<string, string> {
|
|
212
|
-
if (!cookieHeader) return {};
|
|
213
|
-
|
|
214
|
-
const cookies: Record<string, string> = {};
|
|
215
|
-
const pairs = cookieHeader.split(";");
|
|
216
|
-
|
|
217
|
-
for (const pair of pairs) {
|
|
218
|
-
const [name, ...rest] = pair.trim().split("=");
|
|
219
|
-
if (name) {
|
|
220
|
-
cookies[name] = decodeURIComponent(rest.join("="));
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
return cookies;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Serialize a cookie for Set-Cookie header
|
|
229
|
-
*/
|
|
230
|
-
export function serializeCookie(
|
|
231
|
-
name: string,
|
|
232
|
-
value: string,
|
|
233
|
-
options: CookieOptions = {}
|
|
234
|
-
): string {
|
|
235
|
-
let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
|
|
236
|
-
|
|
237
|
-
if (options.domain) cookie += `; Domain=${options.domain}`;
|
|
238
|
-
if (options.path) cookie += `; Path=${options.path}`;
|
|
239
|
-
if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`;
|
|
240
|
-
if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;
|
|
241
|
-
if (options.httpOnly) cookie += "; HttpOnly";
|
|
242
|
-
if (options.secure) cookie += "; Secure";
|
|
243
|
-
if (options.sameSite) cookie += `; SameSite=${options.sameSite}`;
|
|
244
|
-
|
|
245
|
-
return cookie;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* Mutable response holder - allows ctx.res to be updated after next() is called
|
|
250
|
-
*/
|
|
251
|
-
export interface ResponseHolder {
|
|
252
|
-
response: Response | null;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
140
|
/**
|
|
256
141
|
* Create middleware context
|
|
142
|
+
*
|
|
143
|
+
* Note: The implementation uses runtime values while the interface provides
|
|
144
|
+
* compile-time type safety. The env/get/set types are resolved at call sites
|
|
145
|
+
* via conditional types based on TEnv from createRouter<TBindings>().
|
|
257
146
|
*/
|
|
258
147
|
export function createMiddlewareContext<TEnv>(
|
|
259
148
|
request: Request,
|
|
260
149
|
env: TEnv,
|
|
261
150
|
params: Record<string, string>,
|
|
262
|
-
variables: Record<string,
|
|
263
|
-
responseHolder: ResponseHolder
|
|
151
|
+
variables: Record<string, unknown>,
|
|
152
|
+
responseHolder: ResponseHolder,
|
|
153
|
+
reverse?: (
|
|
154
|
+
name: string,
|
|
155
|
+
params?: Record<string, string>,
|
|
156
|
+
search?: Record<string, unknown>,
|
|
157
|
+
) => string,
|
|
264
158
|
): MiddlewareContext<TEnv> {
|
|
265
|
-
const url = new URL(request.url);
|
|
266
|
-
|
|
267
|
-
|
|
159
|
+
const url = stripInternalParams(new URL(request.url));
|
|
160
|
+
|
|
161
|
+
// Track the initial response to detect pre/post-next() phase.
|
|
162
|
+
// Before next(): responseHolder.response === initialResponse (the stub).
|
|
163
|
+
// After next(): responseHolder.response is the real downstream response.
|
|
164
|
+
const initialResponse = responseHolder.response;
|
|
165
|
+
const isPreNext = () => responseHolder.response === initialResponse;
|
|
166
|
+
|
|
167
|
+
// Delegation strategy for RequestContext (reqCtx):
|
|
168
|
+
// - res getter: before next() returns shared reqCtx stub; after next() returns
|
|
169
|
+
// the real downstream response.
|
|
170
|
+
// - header(): before next() delegates to reqCtx; after next() writes to the
|
|
171
|
+
// real downstream response.
|
|
172
|
+
// Cookie operations are handled by the standalone cookies() function which
|
|
173
|
+
// delegates to the shared RequestContext internally.
|
|
174
|
+
// The runtime implementation - types are enforced at call sites via MiddlewareContext<TEnv>
|
|
175
|
+
// Internal helper: resolve the current response (stub before next(), real after).
|
|
176
|
+
// Not exposed on the public MiddlewareContext type — use ctx.headers instead.
|
|
177
|
+
const getResponse = (): Response => {
|
|
178
|
+
if (isPreNext()) {
|
|
179
|
+
const reqCtx = _getRequestContext();
|
|
180
|
+
if (reqCtx) return reqCtx.res;
|
|
181
|
+
}
|
|
182
|
+
if (!responseHolder.response) {
|
|
183
|
+
throw new Error(
|
|
184
|
+
"Response is not available - responseHolder was not initialized",
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
return responseHolder.response;
|
|
188
|
+
};
|
|
268
189
|
|
|
190
|
+
// Capture reqCtx once: the request-scoped platform fields
|
|
191
|
+
// (originalUrl, executionContext, waitUntil) are immutable per request,
|
|
192
|
+
// so snapshotting beats re-reading ALS on every access. The lazy getters
|
|
193
|
+
// below (routeName, theme, setTheme) stay lazy because those can change
|
|
194
|
+
// during `await next()`.
|
|
195
|
+
const reqCtx = _getRequestContext();
|
|
269
196
|
return {
|
|
270
197
|
request,
|
|
271
198
|
url,
|
|
199
|
+
originalUrl: reqCtx?.originalUrl ?? new URL(request.url),
|
|
272
200
|
pathname: url.pathname,
|
|
273
201
|
searchParams: url.searchParams,
|
|
274
|
-
env,
|
|
202
|
+
env: env as MiddlewareContext<TEnv>["env"],
|
|
275
203
|
params,
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
204
|
+
executionContext: reqCtx?.executionContext,
|
|
205
|
+
waitUntil: reqCtx ? reqCtx.waitUntil.bind(reqCtx) : fireAndForgetWaitUntil,
|
|
206
|
+
// Getter: re-derives from request context on each access so that global
|
|
207
|
+
// middleware sees the matched route name after await next().
|
|
208
|
+
get routeName(): MiddlewareContext<TEnv>["routeName"] {
|
|
209
|
+
const reqCtx = _getRequestContext();
|
|
210
|
+
const raw = reqCtx?._routeName;
|
|
211
|
+
return (
|
|
212
|
+
raw && !isAutoGeneratedRouteName(raw) ? raw : undefined
|
|
213
|
+
) as MiddlewareContext<TEnv>["routeName"];
|
|
285
214
|
},
|
|
286
215
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
responseHolder.response = response;
|
|
216
|
+
get headers(): Headers {
|
|
217
|
+
return getResponse().headers;
|
|
290
218
|
},
|
|
291
219
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
parsedCookies = parseCookies(cookieHeader);
|
|
295
|
-
}
|
|
296
|
-
return parsedCookies[name];
|
|
297
|
-
},
|
|
220
|
+
get: ((keyOrVar: any) =>
|
|
221
|
+
contextGet(variables, keyOrVar)) as MiddlewareContext<TEnv>["get"],
|
|
298
222
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
223
|
+
set: ((keyOrVar: any, value: unknown, options?: any) => {
|
|
224
|
+
contextSet(variables, keyOrVar, value, options);
|
|
225
|
+
}) as MiddlewareContext<TEnv>["set"],
|
|
226
|
+
header(name: string, value: string): void {
|
|
227
|
+
// Before next(): delegate to shared RequestContext stub
|
|
228
|
+
if (isPreNext()) {
|
|
229
|
+
const reqCtx = _getRequestContext();
|
|
230
|
+
if (reqCtx) {
|
|
231
|
+
reqCtx.header(name, value);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
302
234
|
}
|
|
303
|
-
|
|
304
|
-
},
|
|
305
|
-
|
|
306
|
-
setCookie(name: string, value: string, options?: CookieOptions): void {
|
|
235
|
+
// After next() or standalone: write to current response
|
|
307
236
|
if (!responseHolder.response) {
|
|
308
237
|
throw new Error(
|
|
309
|
-
"ctx.
|
|
238
|
+
"ctx.header() is not available - responseHolder was not initialized",
|
|
310
239
|
);
|
|
311
240
|
}
|
|
312
|
-
responseHolder.response.headers.
|
|
313
|
-
"Set-Cookie",
|
|
314
|
-
serializeCookie(name, value, options)
|
|
315
|
-
);
|
|
241
|
+
responseHolder.response.headers.set(name, value);
|
|
316
242
|
},
|
|
317
243
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
options?: Pick<CookieOptions, "domain" | "path">
|
|
321
|
-
): void {
|
|
322
|
-
if (!responseHolder.response) {
|
|
323
|
-
throw new Error(
|
|
324
|
-
"ctx.deleteCookie() is not available - responseHolder was not initialized"
|
|
325
|
-
);
|
|
326
|
-
}
|
|
327
|
-
responseHolder.response.headers.append(
|
|
328
|
-
"Set-Cookie",
|
|
329
|
-
serializeCookie(name, "", { ...options, maxAge: 0 })
|
|
330
|
-
);
|
|
244
|
+
get theme(): MiddlewareContext<TEnv>["theme"] {
|
|
245
|
+
return _getRequestContext()?.theme;
|
|
331
246
|
},
|
|
332
247
|
|
|
333
|
-
get
|
|
334
|
-
return
|
|
248
|
+
get setTheme(): MiddlewareContext<TEnv>["setTheme"] {
|
|
249
|
+
return _getRequestContext()?.setTheme;
|
|
335
250
|
},
|
|
336
251
|
|
|
337
|
-
|
|
338
|
-
|
|
252
|
+
setLocationState(entries) {
|
|
253
|
+
const reqCtx = _getRequestContext();
|
|
254
|
+
if (!reqCtx) {
|
|
255
|
+
throw new Error(
|
|
256
|
+
"setLocationState() is not available outside a request context",
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
reqCtx.setLocationState(entries);
|
|
339
260
|
},
|
|
340
261
|
|
|
341
|
-
|
|
342
|
-
|
|
262
|
+
reverse:
|
|
263
|
+
reverse ??
|
|
264
|
+
((name: string) => {
|
|
343
265
|
throw new Error(
|
|
344
|
-
|
|
266
|
+
`ctx.reverse() is not available - route map was not provided to middleware context`,
|
|
345
267
|
);
|
|
268
|
+
}),
|
|
269
|
+
|
|
270
|
+
debugPerformance(): void {
|
|
271
|
+
const reqCtx = _getRequestContext();
|
|
272
|
+
if (reqCtx) {
|
|
273
|
+
reqCtx._debugPerformance = true;
|
|
274
|
+
reqCtx._metricsStore ??= createMetricsStore(true);
|
|
346
275
|
}
|
|
347
|
-
responseHolder.response.headers.set(name, value);
|
|
348
276
|
},
|
|
349
277
|
};
|
|
350
278
|
}
|
|
@@ -355,7 +283,7 @@ export function createMiddlewareContext<TEnv>(
|
|
|
355
283
|
*/
|
|
356
284
|
export function matchMiddleware<TEnv>(
|
|
357
285
|
pathname: string,
|
|
358
|
-
entries: MiddlewareEntry<TEnv>[]
|
|
286
|
+
entries: MiddlewareEntry<TEnv>[],
|
|
359
287
|
): Array<{ entry: MiddlewareEntry<TEnv>; params: Record<string, string> }> {
|
|
360
288
|
const matches: Array<{
|
|
361
289
|
entry: MiddlewareEntry<TEnv>;
|
|
@@ -379,14 +307,54 @@ export function matchMiddleware<TEnv>(
|
|
|
379
307
|
return matches;
|
|
380
308
|
}
|
|
381
309
|
|
|
310
|
+
// Set-Cookie is appended; for other headers stubOverridesNonCookie=true
|
|
311
|
+
// overwrites (chain ran to completion), false fills only missing slots (an
|
|
312
|
+
// explicit short-circuit Response's own headers win).
|
|
313
|
+
function mergeStubHeaders(
|
|
314
|
+
target: Headers,
|
|
315
|
+
stub: Headers,
|
|
316
|
+
stubOverridesNonCookie: boolean,
|
|
317
|
+
): void {
|
|
318
|
+
stub.forEach((value, name) => {
|
|
319
|
+
if (name.toLowerCase() === "set-cookie") {
|
|
320
|
+
target.append(name, value);
|
|
321
|
+
} else if (stubOverridesNonCookie || !target.has(name)) {
|
|
322
|
+
target.set(name, value);
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Set-Cookie is deduped so a nested inner executeMiddleware that already merged
|
|
328
|
+
// the same reqCtx cookies does not duplicate them; other headers fill if missing.
|
|
329
|
+
function mergeReqCtxStub(
|
|
330
|
+
target: Headers,
|
|
331
|
+
reqCtx: ReturnType<typeof _getRequestContext>,
|
|
332
|
+
): void {
|
|
333
|
+
if (!reqCtx) return;
|
|
334
|
+
const stubCookies = reqCtx.res.headers.getSetCookie();
|
|
335
|
+
if (stubCookies.length > 0) {
|
|
336
|
+
const existing = new Set(target.getSetCookie());
|
|
337
|
+
for (const cookie of stubCookies) {
|
|
338
|
+
if (!existing.has(cookie)) {
|
|
339
|
+
target.append("set-cookie", cookie);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
reqCtx.res.headers.forEach((value, name) => {
|
|
344
|
+
if (name !== "set-cookie" && !target.has(name)) {
|
|
345
|
+
target.set(name, value);
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
|
|
382
350
|
/**
|
|
383
351
|
* Execute middleware chain
|
|
384
352
|
*
|
|
385
353
|
* Features:
|
|
386
354
|
* - `await next()` returns actual Response
|
|
387
|
-
* - `ctx.
|
|
388
|
-
* - `ctx.header()` shorthand for setting
|
|
389
|
-
* - Forgiving: if middleware doesn't return, uses
|
|
355
|
+
* - `ctx.headers` available before and after `await next()`
|
|
356
|
+
* - `ctx.header()` shorthand for setting a single header
|
|
357
|
+
* - Forgiving: if middleware doesn't return, uses the downstream response
|
|
390
358
|
* - Short-circuit: return Response to stop chain
|
|
391
359
|
* - Error catching: try/catch around `next()` works
|
|
392
360
|
*/
|
|
@@ -398,7 +366,12 @@ export async function executeMiddleware<TEnv>(
|
|
|
398
366
|
request: Request,
|
|
399
367
|
env: TEnv,
|
|
400
368
|
variables: Record<string, any>,
|
|
401
|
-
finalHandler: () => Promise<Response
|
|
369
|
+
finalHandler: () => Promise<Response>,
|
|
370
|
+
reverse?: (
|
|
371
|
+
name: string,
|
|
372
|
+
params?: Record<string, string>,
|
|
373
|
+
search?: Record<string, unknown>,
|
|
374
|
+
) => string,
|
|
402
375
|
): Promise<Response> {
|
|
403
376
|
let index = 0;
|
|
404
377
|
|
|
@@ -412,16 +385,14 @@ export async function executeMiddleware<TEnv>(
|
|
|
412
385
|
// End of chain - call actual RSC handler
|
|
413
386
|
const response = await finalHandler();
|
|
414
387
|
|
|
415
|
-
// Merge headers set on stub into the real response
|
|
416
|
-
// Use append for Set-Cookie to preserve multiple cookies
|
|
417
388
|
const mergedHeaders = new Headers(response.headers);
|
|
418
|
-
stubResponse.headers
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
}
|
|
389
|
+
mergeStubHeaders(mergedHeaders, stubResponse.headers, true);
|
|
390
|
+
mergeReqCtxStub(mergedHeaders, _getRequestContext());
|
|
391
|
+
|
|
392
|
+
if (isWebSocketUpgradeResponse(response)) {
|
|
393
|
+
responseHolder.response = response;
|
|
394
|
+
return response;
|
|
395
|
+
}
|
|
425
396
|
|
|
426
397
|
// Clone response with merged headers (mutable for post-next() modifications)
|
|
427
398
|
responseHolder.response = new Response(response.body, {
|
|
@@ -433,29 +404,109 @@ export async function executeMiddleware<TEnv>(
|
|
|
433
404
|
return responseHolder.response;
|
|
434
405
|
}
|
|
435
406
|
|
|
407
|
+
const middlewareOrdinal = index;
|
|
436
408
|
const { entry, params } = middlewares[index++];
|
|
437
409
|
const ctx = createMiddlewareContext(
|
|
438
410
|
request,
|
|
439
411
|
env,
|
|
440
412
|
params,
|
|
441
413
|
variables,
|
|
442
|
-
responseHolder
|
|
414
|
+
responseHolder,
|
|
415
|
+
reverse,
|
|
443
416
|
);
|
|
417
|
+
const metricStart = performance.now();
|
|
418
|
+
const metricLabel = getMiddlewareMetricLabel(entry, middlewareOrdinal);
|
|
419
|
+
let middlewareFinished = false;
|
|
420
|
+
const finishMiddleware = () => {
|
|
421
|
+
if (!middlewareFinished) {
|
|
422
|
+
middlewareFinished = true;
|
|
423
|
+
appendMetric(
|
|
424
|
+
_getRequestContext()?._metricsStore,
|
|
425
|
+
`${metricLabel}:pre`,
|
|
426
|
+
metricStart,
|
|
427
|
+
performance.now() - metricStart,
|
|
428
|
+
MIDDLEWARE_METRIC_DEPTH,
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
};
|
|
444
432
|
|
|
445
|
-
// Track if next() was called and capture its Promise
|
|
446
|
-
//
|
|
433
|
+
// Track if next() was called and capture its Promise.
|
|
434
|
+
// Guard against double-calling: a second call would re-enter the
|
|
435
|
+
// downstream chain and overwrite responseHolder.response.
|
|
447
436
|
let nextPromise: Promise<Response> | null = null;
|
|
437
|
+
let nextResolvedAt: number | undefined;
|
|
448
438
|
const wrappedNext = (): Promise<Response> => {
|
|
449
|
-
|
|
439
|
+
if (nextPromise) {
|
|
440
|
+
throw new Error(
|
|
441
|
+
`[@rangojs/router] Middleware called next() more than once.`,
|
|
442
|
+
);
|
|
443
|
+
}
|
|
444
|
+
finishMiddleware();
|
|
445
|
+
const downstream = next();
|
|
446
|
+
nextPromise = downstream.then(
|
|
447
|
+
(res) => {
|
|
448
|
+
nextResolvedAt = performance.now();
|
|
449
|
+
return res;
|
|
450
|
+
},
|
|
451
|
+
(err) => {
|
|
452
|
+
nextResolvedAt = performance.now();
|
|
453
|
+
throw err;
|
|
454
|
+
},
|
|
455
|
+
);
|
|
450
456
|
return nextPromise;
|
|
451
457
|
};
|
|
452
458
|
|
|
453
|
-
|
|
459
|
+
let result: Response | void;
|
|
460
|
+
try {
|
|
461
|
+
result = await entry.handler(ctx, wrappedNext);
|
|
462
|
+
} catch (error) {
|
|
463
|
+
// Thrown Response is short-circuit control flow, not an error.
|
|
464
|
+
// Fall through to the `if (result instanceof Response)` branch below
|
|
465
|
+
// so stub headers and request-context cookies merge as they do for
|
|
466
|
+
// an explicit `return new Response(...)`. Real errors propagate.
|
|
467
|
+
if (error instanceof Response) {
|
|
468
|
+
result = error;
|
|
469
|
+
} else {
|
|
470
|
+
finishMiddleware();
|
|
471
|
+
throw error;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
finishMiddleware();
|
|
475
|
+
|
|
476
|
+
// Record post-next() processing time when middleware did work after
|
|
477
|
+
// the downstream chain resolved (e.g. adding headers, logging).
|
|
478
|
+
if (nextResolvedAt !== undefined) {
|
|
479
|
+
const postDur = performance.now() - nextResolvedAt;
|
|
480
|
+
if (postDur > POST_METRIC_MIN_DURATION_MS) {
|
|
481
|
+
appendMetric(
|
|
482
|
+
_getRequestContext()?._metricsStore,
|
|
483
|
+
`${metricLabel}:post`,
|
|
484
|
+
nextResolvedAt,
|
|
485
|
+
postDur,
|
|
486
|
+
MIDDLEWARE_METRIC_DEPTH,
|
|
487
|
+
);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
454
490
|
|
|
455
|
-
// Explicit return takes precedence
|
|
491
|
+
// Explicit return takes precedence (middleware short-circuit).
|
|
492
|
+
// Merge stub headers (from ctx.header before this point) and
|
|
493
|
+
// RequestContext stub headers (from ctx.setCookie) into the
|
|
494
|
+
// returned Response so they are not lost.
|
|
456
495
|
if (result instanceof Response) {
|
|
457
|
-
|
|
458
|
-
|
|
496
|
+
if (isWebSocketUpgradeResponse(result)) {
|
|
497
|
+
responseHolder.response = result;
|
|
498
|
+
return result;
|
|
499
|
+
}
|
|
500
|
+
const mergedHeaders = new Headers(result.headers);
|
|
501
|
+
mergeStubHeaders(mergedHeaders, stubResponse.headers, false);
|
|
502
|
+
mergeReqCtxStub(mergedHeaders, _getRequestContext());
|
|
503
|
+
const merged = new Response(result.body, {
|
|
504
|
+
status: result.status,
|
|
505
|
+
statusText: result.statusText,
|
|
506
|
+
headers: mergedHeaders,
|
|
507
|
+
});
|
|
508
|
+
responseHolder.response = merged;
|
|
509
|
+
return merged;
|
|
459
510
|
}
|
|
460
511
|
|
|
461
512
|
// Warn about unexpected return values (non-Response, non-undefined)
|
|
@@ -464,7 +515,7 @@ export async function executeMiddleware<TEnv>(
|
|
|
464
515
|
const fnName = entry.handler.name || "(anonymous)";
|
|
465
516
|
console.warn(
|
|
466
517
|
`[Middleware] "${fnName}" returned ${typeof result} instead of Response or undefined. ` +
|
|
467
|
-
`This return value will be ignored. Did you mean to return a Response
|
|
518
|
+
`This return value will be ignored. Did you mean to return a Response?`,
|
|
468
519
|
);
|
|
469
520
|
}
|
|
470
521
|
|
|
@@ -481,7 +532,7 @@ export async function executeMiddleware<TEnv>(
|
|
|
481
532
|
`Middleware must call next() or return a Response. ` +
|
|
482
533
|
`Function: ${fnName}, Pattern: ${entry.pattern ?? "(all)"}
|
|
483
534
|
Source: ${import.meta.env.DEV ? entry.handler.toString().slice(0, 200) : "(source hidden in production)"}`,
|
|
484
|
-
{ cause: { url: request.url, fn: entry.handler } }
|
|
535
|
+
{ cause: { url: request.url, fn: entry.handler } },
|
|
485
536
|
);
|
|
486
537
|
};
|
|
487
538
|
|
|
@@ -493,64 +544,19 @@ export async function executeMiddleware<TEnv>(
|
|
|
493
544
|
throw new Error("No response generated by middleware chain");
|
|
494
545
|
}
|
|
495
546
|
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
* - Throws if middleware returns Response (can't short-circuit server action)
|
|
507
|
-
*/
|
|
508
|
-
export async function executeServerActionMiddleware<TEnv>(
|
|
509
|
-
middlewares: MiddlewareFn<TEnv>[],
|
|
510
|
-
request: Request,
|
|
511
|
-
env: TEnv,
|
|
512
|
-
params: Record<string, string>,
|
|
513
|
-
variables: Record<string, any>,
|
|
514
|
-
stubResponse: Response
|
|
515
|
-
): Promise<void> {
|
|
516
|
-
if (middlewares.length === 0) {
|
|
517
|
-
return;
|
|
547
|
+
// Final re-merge: capture any RequestContext stub headers added after the
|
|
548
|
+
// last merge point (e.g. cookies().set() called after await next()).
|
|
549
|
+
// The reqCtx stub may have already been partially merged during finalHandler
|
|
550
|
+
// or early-return paths; only append *new* Set-Cookie entries to avoid dupes.
|
|
551
|
+
//
|
|
552
|
+
// Skip for upgrade responses: upgrade headers are semantically immutable and
|
|
553
|
+
// set-cookie on an upgrade is not meaningful.
|
|
554
|
+
const reqCtx = _getRequestContext();
|
|
555
|
+
if (reqCtx && !isWebSocketUpgradeResponse(finalResponse)) {
|
|
556
|
+
mergeReqCtxStub(finalResponse.headers, reqCtx);
|
|
518
557
|
}
|
|
519
558
|
|
|
520
|
-
|
|
521
|
-
const responseHolder: ResponseHolder = { response: stubResponse };
|
|
522
|
-
|
|
523
|
-
const next = async (): Promise<Response> => {
|
|
524
|
-
if (index >= middlewares.length) {
|
|
525
|
-
return stubResponse;
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
const middleware = middlewares[index++];
|
|
529
|
-
const ctx = createMiddlewareContext(
|
|
530
|
-
request,
|
|
531
|
-
env,
|
|
532
|
-
params,
|
|
533
|
-
variables,
|
|
534
|
-
responseHolder
|
|
535
|
-
);
|
|
536
|
-
|
|
537
|
-
const result = await middleware(ctx, next);
|
|
538
|
-
|
|
539
|
-
// If middleware returned a Response, throw an error
|
|
540
|
-
// Server actions can't short-circuit with a Response
|
|
541
|
-
if (result instanceof Response) {
|
|
542
|
-
throw new Error(
|
|
543
|
-
`Loader middleware returned a Response (status: ${result.status}). ` +
|
|
544
|
-
`Server actions cannot return Response. ` +
|
|
545
|
-
`Use GET-based loader fetching for redirects, or throw an error instead.`
|
|
546
|
-
);
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
return stubResponse;
|
|
550
|
-
};
|
|
551
|
-
|
|
552
|
-
await next();
|
|
553
|
-
// Headers/cookies set on stubResponse will be merged by the caller
|
|
559
|
+
return finalResponse;
|
|
554
560
|
}
|
|
555
561
|
|
|
556
562
|
/**
|
|
@@ -574,7 +580,12 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
574
580
|
env: TEnv,
|
|
575
581
|
params: Record<string, string>,
|
|
576
582
|
variables: Record<string, any>,
|
|
577
|
-
stubResponse: Response
|
|
583
|
+
stubResponse: Response,
|
|
584
|
+
reverse?: (
|
|
585
|
+
name: string,
|
|
586
|
+
params?: Record<string, string>,
|
|
587
|
+
search?: Record<string, unknown>,
|
|
588
|
+
) => string,
|
|
578
589
|
): Promise<Response | null> {
|
|
579
590
|
if (middlewares.length === 0) {
|
|
580
591
|
return null;
|
|
@@ -597,22 +608,39 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
597
608
|
env,
|
|
598
609
|
params,
|
|
599
610
|
variables,
|
|
600
|
-
responseHolder
|
|
611
|
+
responseHolder,
|
|
612
|
+
reverse,
|
|
601
613
|
);
|
|
602
614
|
|
|
603
|
-
|
|
615
|
+
let nextCalled = false;
|
|
616
|
+
const guardedNext = (): Promise<Response> => {
|
|
617
|
+
if (nextCalled) {
|
|
618
|
+
throw new Error(
|
|
619
|
+
`[@rangojs/router] Intercept middleware called next() more than once.`,
|
|
620
|
+
);
|
|
621
|
+
}
|
|
622
|
+
nextCalled = true;
|
|
623
|
+
return next();
|
|
624
|
+
};
|
|
625
|
+
|
|
626
|
+
let result: Response | void;
|
|
627
|
+
try {
|
|
628
|
+
result = await middleware(ctx, guardedNext);
|
|
629
|
+
} catch (error) {
|
|
630
|
+
// Thrown Response is short-circuit control flow, parity with the
|
|
631
|
+
// explicit-return path below. Real errors propagate.
|
|
632
|
+
if (error instanceof Response) {
|
|
633
|
+
result = error;
|
|
634
|
+
} else {
|
|
635
|
+
throw error;
|
|
636
|
+
}
|
|
637
|
+
}
|
|
604
638
|
|
|
605
639
|
if (result instanceof Response) {
|
|
606
640
|
earlyResponse = result;
|
|
607
641
|
return result;
|
|
608
642
|
}
|
|
609
643
|
|
|
610
|
-
// Check if middleware replaced ctx.res with a different response
|
|
611
|
-
if (responseHolder.response && responseHolder.response !== stubResponse) {
|
|
612
|
-
earlyResponse = responseHolder.response;
|
|
613
|
-
return earlyResponse;
|
|
614
|
-
}
|
|
615
|
-
|
|
616
644
|
return stubResponse;
|
|
617
645
|
};
|
|
618
646
|
|
|
@@ -630,15 +658,11 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
630
658
|
});
|
|
631
659
|
|
|
632
660
|
if (hasStubHeaders) {
|
|
633
|
-
// Clone and merge headers from stub into early response
|
|
661
|
+
// Clone and merge headers from stub into early response.
|
|
662
|
+
// Only fill in missing headers — the returned Response's explicit
|
|
663
|
+
// headers take precedence, matching executeMiddleware behavior.
|
|
634
664
|
const mergedHeaders = new Headers(response.headers);
|
|
635
|
-
stubResponse.headers
|
|
636
|
-
if (name.toLowerCase() === "set-cookie") {
|
|
637
|
-
mergedHeaders.append(name, value);
|
|
638
|
-
} else {
|
|
639
|
-
mergedHeaders.set(name, value);
|
|
640
|
-
}
|
|
641
|
-
});
|
|
665
|
+
mergeStubHeaders(mergedHeaders, stubResponse.headers, false);
|
|
642
666
|
return new Response(response.body, {
|
|
643
667
|
status: response.status,
|
|
644
668
|
statusText: response.statusText,
|
|
@@ -665,7 +689,12 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
665
689
|
env: TEnv,
|
|
666
690
|
params: Record<string, string>,
|
|
667
691
|
variables: Record<string, any>,
|
|
668
|
-
finalHandler: () => Promise<Response
|
|
692
|
+
finalHandler: () => Promise<Response>,
|
|
693
|
+
reverse?: (
|
|
694
|
+
name: string,
|
|
695
|
+
params?: Record<string, string>,
|
|
696
|
+
search?: Record<string, unknown>,
|
|
697
|
+
) => string,
|
|
669
698
|
): Promise<Response> {
|
|
670
699
|
if (middlewares.length === 0) {
|
|
671
700
|
return finalHandler();
|
|
@@ -688,27 +717,11 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
688
717
|
request,
|
|
689
718
|
env,
|
|
690
719
|
variables,
|
|
691
|
-
finalHandler
|
|
720
|
+
finalHandler,
|
|
721
|
+
reverse,
|
|
692
722
|
);
|
|
693
723
|
}
|
|
694
724
|
|
|
695
|
-
/**
|
|
696
|
-
* Entry type for middleware collection
|
|
697
|
-
* Matches the shape of EntryData used in router.ts
|
|
698
|
-
*/
|
|
699
|
-
export interface MiddlewareCollectableEntry {
|
|
700
|
-
middleware?: MiddlewareFn<any, any>[];
|
|
701
|
-
layout?: MiddlewareCollectableEntry[];
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
/**
|
|
705
|
-
* Collected route middleware with params
|
|
706
|
-
*/
|
|
707
|
-
export interface CollectedMiddleware {
|
|
708
|
-
handler: MiddlewareFn<any, any>;
|
|
709
|
-
params: Record<string, string>;
|
|
710
|
-
}
|
|
711
|
-
|
|
712
725
|
/**
|
|
713
726
|
* Collect route-level middleware from an entry tree
|
|
714
727
|
*
|
|
@@ -721,7 +734,7 @@ export interface CollectedMiddleware {
|
|
|
721
734
|
*/
|
|
722
735
|
export function collectRouteMiddleware(
|
|
723
736
|
entries: Iterable<MiddlewareCollectableEntry>,
|
|
724
|
-
params: Record<string, string
|
|
737
|
+
params: Record<string, string>,
|
|
725
738
|
): CollectedMiddleware[] {
|
|
726
739
|
const result: CollectedMiddleware[] = [];
|
|
727
740
|
|