@rangojs/router 0.0.0-experimental.24 → 0.0.0-experimental.24535dcb
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 +11 -3
- package/README.md +303 -740
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +730 -184
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -28
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/{src/handles/index.ts → dist/handles/index.js} +1 -1
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -10
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +4373 -1328
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/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/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +96 -24
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +251 -24
- package/skills/caching/SKILL.md +375 -17
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +110 -4
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +5 -3
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +87 -56
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +73 -690
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +129 -27
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +94 -18
- package/skills/layout/SKILL.md +62 -19
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +319 -31
- package/skills/middleware/SKILL.md +59 -16
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +29 -2
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +225 -10
- package/skills/ppr/SKILL.md +616 -0
- package/skills/prerender/SKILL.md +178 -124
- package/skills/rango/SKILL.md +318 -24
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +138 -49
- package/skills/route/SKILL.md +175 -13
- package/skills/router-setup/SKILL.md +137 -12
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +130 -0
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +45 -614
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +74 -15
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +67 -40
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +257 -158
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +4 -0
- package/src/browser/logging.ts +28 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-bridge.ts +212 -34
- package/src/browser/navigation-client.ts +233 -58
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +203 -80
- package/src/browser/navigation-transaction.ts +18 -66
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +242 -126
- package/src/browser/prefetch/cache.ts +344 -30
- package/src/browser/prefetch/fetch.ts +373 -48
- package/src/browser/prefetch/policy.ts +6 -0
- package/src/browser/prefetch/queue.ts +144 -23
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +135 -18
- package/src/browser/react/NavigationProvider.tsx +240 -122
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +66 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +178 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +23 -69
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +32 -7
- package/src/browser/react/use-params.ts +20 -10
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +46 -11
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +99 -8
- package/src/browser/rsc-router.tsx +276 -76
- package/src/browser/scroll-restoration.ts +61 -47
- package/src/browser/segment-reconciler.ts +44 -7
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +244 -71
- package/src/browser/types.ts +160 -12
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +207 -158
- package/src/build/generate-route-types.ts +6 -1
- package/src/build/index.ts +11 -3
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +215 -42
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +16 -5
- package/src/build/route-types/include-resolution.ts +464 -63
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +22 -6
- package/src/build/route-types/router-processing.ts +336 -110
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +13 -21
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +58 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +436 -69
- package/src/cache/cache-scope.ts +235 -103
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2442 -170
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +11 -17
- package/src/cache/document-cache.ts +144 -49
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +24 -20
- package/src/cache/memory-segment-store.ts +243 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +13 -21
- package/src/cache/shell-snapshot.ts +417 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +55 -0
- package/src/cache/types.ts +180 -99
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1127 -0
- package/src/client.rsc.tsx +42 -21
- package/src/client.tsx +117 -336
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +84 -2
- package/src/debug.ts +2 -2
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +30 -4
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +104 -34
- package/src/handles/MetaTags.tsx +24 -53
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +14 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +13 -22
- package/src/host/index.ts +9 -2
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +84 -29
- package/src/index.ts +134 -43
- package/src/internal-debug.ts +11 -10
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +37 -41
- package/src/prerender.ts +215 -86
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +65 -15
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +19 -77
- package/src/route-definition/dsl-helpers.ts +485 -303
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +153 -77
- package/src/route-definition/index.ts +4 -2
- package/src/route-definition/redirect.ts +53 -12
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +48 -21
- package/src/route-types.ts +37 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +164 -17
- package/src/router/error-handling.ts +45 -18
- package/src/router/find-match.ts +130 -29
- package/src/router/handler-context.ts +110 -39
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +50 -24
- package/src/router/lazy-includes.ts +89 -63
- package/src/router/loader-resolution.ts +286 -56
- package/src/router/logging.ts +5 -8
- package/src/router/manifest.ts +105 -56
- package/src/router/match-api.ts +179 -219
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +211 -165
- package/src/router/match-middleware/background-revalidation.ts +66 -22
- package/src/router/match-middleware/cache-lookup.ts +214 -263
- package/src/router/match-middleware/cache-store.ts +105 -50
- package/src/router/match-middleware/intercept-resolution.ts +8 -28
- package/src/router/match-middleware/segment-resolution.ts +52 -18
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +127 -51
- package/src/router/metrics.ts +133 -58
- package/src/router/middleware-types.ts +22 -120
- package/src/router/middleware.ts +371 -252
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +183 -137
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +207 -58
- package/src/router/preview-match.ts +35 -103
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +144 -74
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +11 -29
- package/src/router/router-interfaces.ts +160 -36
- package/src/router/router-options.ts +214 -22
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +301 -78
- package/src/router/segment-resolution/helpers.ts +116 -31
- package/src/router/segment-resolution/loader-cache.ts +140 -39
- package/src/router/segment-resolution/loader-mask.ts +67 -0
- package/src/router/segment-resolution/loader-snapshot.ts +251 -0
- package/src/router/segment-resolution/revalidation.ts +478 -388
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +5 -1
- package/src/router/segment-wrappers.ts +8 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +160 -200
- package/src/router/telemetry.ts +105 -20
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +188 -58
- package/src/router/types.ts +10 -63
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +217 -68
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +726 -457
- package/src/rsc/helpers.ts +168 -46
- package/src/rsc/index.ts +2 -5
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +127 -31
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +159 -23
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +99 -189
- package/src/rsc/rsc-rendering.ts +467 -122
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +288 -129
- package/src/rsc/shell-capture.ts +1158 -0
- package/src/rsc/shell-serve.ts +150 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +64 -6
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +49 -41
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +418 -131
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +367 -61
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +152 -5
- package/src/server/handle-store.ts +40 -38
- package/src/server/loader-registry.ts +38 -46
- package/src/server/request-context.ts +571 -176
- package/src/ssr/index.tsx +467 -174
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +27 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +371 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +357 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +56 -84
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +17 -8
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +237 -89
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +44 -15
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +23 -46
- package/src/types/route-entry.ts +19 -7
- package/src/types/segments.ts +137 -19
- package/src/urls/include-helper.ts +40 -75
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +2 -11
- package/src/urls/path-helper-types.ts +102 -23
- package/src/urls/path-helper.ts +62 -111
- package/src/urls/pattern-types.ts +84 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +98 -154
- package/src/urls/urls-function.ts +1 -19
- package/src/use-loader.tsx +346 -89
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +36 -38
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +130 -85
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +214 -132
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +57 -6
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +19 -3
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +234 -62
- package/src/vite/plugins/cjs-to-esm.ts +16 -19
- package/src/vite/plugins/client-ref-dedup.ts +16 -11
- package/src/vite/plugins/client-ref-hashing.ts +28 -15
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/plugins/expose-action-id.ts +49 -98
- package/src/vite/plugins/expose-id-utils.ts +96 -51
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
- package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
- package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
- package/src/vite/plugins/expose-internal-ids.ts +553 -317
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +73 -83
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +40 -29
- package/src/vite/plugins/version-plugin.ts +46 -37
- package/src/vite/plugins/virtual-entries.ts +138 -27
- package/src/vite/rango.ts +353 -303
- package/src/vite/router-discovery.ts +1090 -166
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +4 -59
- package/src/vite/utils/package-resolution.ts +20 -52
- package/src/vite/utils/prerender-utils.ts +98 -38
- package/src/vite/utils/shared-utils.ts +144 -44
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/shallow.ts +0 -40
- package/src/router/middleware-cookies.ts +0 -55
package/src/router/middleware.ts
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
/// <reference types="vite/types/importMeta.d.ts" />
|
|
2
|
-
/**
|
|
3
|
-
* Middleware Execution
|
|
4
|
-
*
|
|
5
|
-
* True middleware that wraps the entire RSC handler.
|
|
6
|
-
* - `await next()` returns actual Response
|
|
7
|
-
* - Can modify response headers
|
|
8
|
-
* - Can catch errors from RSC rendering
|
|
9
|
-
* - Forgiving API: if middleware doesn't return, original response is used
|
|
10
|
-
*/
|
|
11
2
|
|
|
12
3
|
import { contextGet, contextSet } from "../context-var.js";
|
|
4
|
+
import { escapeRegExp } from "../regex-escape.js";
|
|
5
|
+
import { parsePattern as parseRoutePattern } from "./pattern-matching.js";
|
|
6
|
+
import { safeDecodeURIComponent } from "./url-params.js";
|
|
7
|
+
import { fireAndForgetWaitUntil } from "../types/request-scope.js";
|
|
13
8
|
import type {
|
|
14
9
|
CollectedMiddleware,
|
|
15
10
|
MiddlewareCollectableEntry,
|
|
@@ -19,40 +14,29 @@ import type {
|
|
|
19
14
|
ResponseHolder,
|
|
20
15
|
} from "./middleware-types.js";
|
|
21
16
|
import { _getRequestContext } from "../server/request-context.js";
|
|
17
|
+
import {
|
|
18
|
+
EXTERNAL_REDIRECT_MARKER,
|
|
19
|
+
isExternalRedirect,
|
|
20
|
+
markExternalRedirect,
|
|
21
|
+
} from "../redirect-origin.js";
|
|
22
22
|
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
23
|
-
import { appendMetric } from "./metrics.js";
|
|
23
|
+
import { appendMetric, createMetricsStore } from "./metrics.js";
|
|
24
|
+
import { observePhase, PHASES } from "./instrument.js";
|
|
25
|
+
import { stripInternalParams } from "./handler-context.js";
|
|
26
|
+
import { isWebSocketUpgradeResponse } from "../response-utils.js";
|
|
24
27
|
|
|
25
|
-
// Re-export types
|
|
28
|
+
// Re-export types consumed through this module's path.
|
|
26
29
|
export type {
|
|
27
30
|
CookieOptions,
|
|
28
|
-
CollectedMiddleware,
|
|
29
|
-
MiddlewareCollectableEntry,
|
|
30
31
|
MiddlewareContext,
|
|
31
32
|
MiddlewareEntry,
|
|
32
33
|
MiddlewareFn,
|
|
33
|
-
ResponseHolder,
|
|
34
34
|
} from "./middleware-types.js";
|
|
35
|
-
export { parseCookies, serializeCookie } from "./middleware-cookies.js";
|
|
36
|
-
|
|
37
|
-
// W5: Deduplicate by function reference so each distinct middleware warns once,
|
|
38
|
-
// regardless of whether it is named or anonymous.
|
|
39
|
-
let warnedRedirectMiddleware = new WeakSet<Function>();
|
|
40
|
-
|
|
41
|
-
function warnCtxSetBeforeRedirect(handler: Function): void {
|
|
42
|
-
if (warnedRedirectMiddleware.has(handler)) return;
|
|
43
|
-
warnedRedirectMiddleware.add(handler);
|
|
44
|
-
const label = handler.name || "(anonymous)";
|
|
45
|
-
console.warn(
|
|
46
|
-
`[rango] Route middleware "${label}" called ctx.set() then returned a ` +
|
|
47
|
-
`redirect. Context variables are per-request and won't be available ` +
|
|
48
|
-
`on the redirect target. Use cookies to persist state across ` +
|
|
49
|
-
`redirects, or move ctx.set() to the target route's middleware.`,
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
35
|
|
|
53
36
|
const MIDDLEWARE_METRIC_DEPTH = 1;
|
|
37
|
+
const POST_METRIC_MIN_DURATION_MS = 0.01;
|
|
54
38
|
|
|
55
|
-
function
|
|
39
|
+
function getMiddlewareMetricLabel<TEnv>(
|
|
56
40
|
entry: MiddlewareEntry<TEnv>,
|
|
57
41
|
ordinal: number,
|
|
58
42
|
): string {
|
|
@@ -60,29 +44,49 @@ function getMiddlewareMetricBase<TEnv>(
|
|
|
60
44
|
const scope = entry.pattern ?? "*";
|
|
61
45
|
|
|
62
46
|
if (handlerName) {
|
|
63
|
-
return
|
|
47
|
+
return `middleware:${handlerName}@${scope}`;
|
|
64
48
|
}
|
|
65
49
|
|
|
66
|
-
return
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function getMiddlewareMetricLabel<TEnv>(
|
|
70
|
-
entry: MiddlewareEntry<TEnv>,
|
|
71
|
-
ordinal: number,
|
|
72
|
-
): string {
|
|
73
|
-
return `middleware:${getMiddlewareMetricBase(entry, ordinal)}`;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/** Reset W5 deduplication state (for tests only). */
|
|
77
|
-
export function _resetW5Warnings(): void {
|
|
78
|
-
warnedRedirectMiddleware = new WeakSet();
|
|
50
|
+
return `middleware:${scope}#${ordinal + 1}`;
|
|
79
51
|
}
|
|
80
52
|
|
|
81
53
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
54
|
+
* Compile a middleware scope pattern to a regex + param names.
|
|
55
|
+
*
|
|
56
|
+
* Middleware scopes reuse the route pattern parser (`parsePattern` from
|
|
57
|
+
* pattern-matching.ts), so they support the same param forms as routes —
|
|
58
|
+
* optional (`:x?`), constrained (`:x(en|gb)`), and suffix (`:x.html`) — in
|
|
59
|
+
* addition to the trailing-`*` wildcard middleware relies on. Before this
|
|
60
|
+
* unification the middleware-side parser handled only static, bare `:param`,
|
|
61
|
+
* and trailing `*`, so e.g. `router.use("/:locale(en|gb)/*", mw)` silently
|
|
62
|
+
* named the param "locale(en|gb)" and never enforced the constraint.
|
|
63
|
+
*
|
|
64
|
+
* Middleware matching semantics deliberately differ from route matching, so we
|
|
65
|
+
* emit the regex here rather than route through `compilePattern`:
|
|
66
|
+
* - `*` alone matches every path (`/^.*$/`).
|
|
67
|
+
* - A trailing `*` segment is an OPTIONAL subtree match (`(?:/.*)?`): `/admin/*`
|
|
68
|
+
* matches `/admin`, `/admin/`, and `/admin/users`. It contributes no param
|
|
69
|
+
* name (unlike route wildcards, which capture `*`).
|
|
70
|
+
* - A NON-trailing `*` is also OPTIONAL (`(?:/.*)?`), matching zero-or-more
|
|
71
|
+
* intermediate segments: `/a/<star>/b` matches both `/a/b` and `/a/x/b`. This
|
|
72
|
+
* mirrors the pre-unification parser, which compiled every `*` part as
|
|
73
|
+
* optional regardless of position.
|
|
74
|
+
* - A pattern without a trailing `*` tolerates a trailing slash (`/?$`).
|
|
75
|
+
* - Constraints are baked into the regex as an alternation so `matchMiddleware`
|
|
76
|
+
* (a bare `regex.test`) enforces them without extra validation. Constraint
|
|
77
|
+
* values are matched against the raw (still URL-encoded) path segment, which
|
|
78
|
+
* matches the pre-unification middleware behavior (it never decoded for
|
|
79
|
+
* matching); the constraint string is regex-escaped so values like `en.gb`
|
|
80
|
+
* are treated literally.
|
|
81
|
+
*
|
|
82
|
+
* The route segment parser only recognizes `/`-prefixed segments, but the
|
|
83
|
+
* pre-unification middleware parser split on `/` and dropped empty parts, so a
|
|
84
|
+
* leading slash was irrelevant: `use("admin/*")` and `use("/admin/*")` scoped
|
|
85
|
+
* identically. Normalize a non-`*` pattern to have a leading slash before
|
|
86
|
+
* parsing so that behavior is preserved (without it, `parseRoutePattern("admin/*")`
|
|
87
|
+
* drops the static `admin` and the scope explodes to every path).
|
|
84
88
|
*/
|
|
85
|
-
export function
|
|
89
|
+
export function compileMiddlewarePattern(pattern: string): {
|
|
86
90
|
regex: RegExp;
|
|
87
91
|
paramNames: string[];
|
|
88
92
|
} {
|
|
@@ -90,47 +94,63 @@ export function parsePattern(pattern: string): {
|
|
|
90
94
|
return { regex: /^.*$/, paramNames: [] };
|
|
91
95
|
}
|
|
92
96
|
|
|
97
|
+
const normalizedPattern = pattern.startsWith("/") ? pattern : `/${pattern}`;
|
|
98
|
+
const segments = parseRoutePattern(normalizedPattern);
|
|
93
99
|
const paramNames: string[] = [];
|
|
94
100
|
let regexStr = "^";
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
101
|
+
let hasTrailingWildcard = false;
|
|
102
|
+
|
|
103
|
+
for (let i = 0; i < segments.length; i++) {
|
|
104
|
+
const segment = segments[i];
|
|
105
|
+
|
|
106
|
+
if (segment.type === "wildcard") {
|
|
107
|
+
if (segment.value === "*") {
|
|
108
|
+
// Bare `*`: optional subtree match, no capture (parity with the original
|
|
109
|
+
// middleware parser). A trailing `*` matches the subtree; a non-trailing
|
|
110
|
+
// `*` matches zero-or-more intermediate segments, so `/a/<star>/b` still
|
|
111
|
+
// matches `/a/b`.
|
|
112
|
+
regexStr += "(?:/.*)?";
|
|
113
|
+
} else {
|
|
114
|
+
// Named catch-all `:name+` / `:name*`: capture the remainder under the
|
|
115
|
+
// name so a scoping middleware sees `ctx.params.<name>`, and respect the
|
|
116
|
+
// one-or-more arity (`+` must not match the bare prefix), mirroring the
|
|
117
|
+
// route matcher instead of collapsing to the bare-`*` subtree.
|
|
118
|
+
paramNames.push(segment.value);
|
|
119
|
+
regexStr += segment.oneOrMore ? "/(.+)" : "(?:/(.*))?";
|
|
120
|
+
}
|
|
121
|
+
if (i === segments.length - 1) {
|
|
122
|
+
hasTrailingWildcard = true;
|
|
123
|
+
}
|
|
124
|
+
} else if (segment.type === "param") {
|
|
125
|
+
paramNames.push(segment.value);
|
|
126
|
+
const suffixPattern = segment.suffix ? escapeRegExp(segment.suffix) : "";
|
|
127
|
+
const valuePattern = segment.constraint
|
|
128
|
+
? `(${segment.constraint.map(escapeRegExp).join("|")})`
|
|
129
|
+
: "([^/]+)";
|
|
130
|
+
if (segment.optional) {
|
|
131
|
+
regexStr += `(?:/${valuePattern}${suffixPattern})?`;
|
|
132
|
+
} else {
|
|
133
|
+
regexStr += `/${valuePattern}${suffixPattern}`;
|
|
134
|
+
}
|
|
109
135
|
} else {
|
|
110
|
-
//
|
|
111
|
-
regexStr += "/" +
|
|
136
|
+
// Static literal
|
|
137
|
+
regexStr += "/" + escapeRegExp(segment.value);
|
|
112
138
|
}
|
|
113
139
|
}
|
|
114
140
|
|
|
115
|
-
//
|
|
116
|
-
|
|
117
|
-
regexStr += "/?$";
|
|
118
|
-
} else {
|
|
119
|
-
regexStr += "$";
|
|
120
|
-
}
|
|
141
|
+
// Without a trailing `*`, match exactly with an optional trailing slash.
|
|
142
|
+
regexStr += hasTrailingWildcard ? "$" : "/?$";
|
|
121
143
|
|
|
122
144
|
return { regex: new RegExp(regexStr), paramNames };
|
|
123
145
|
}
|
|
124
146
|
|
|
125
147
|
/**
|
|
126
|
-
*
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Extract params from a pathname using a pattern's regex and param names
|
|
148
|
+
* Extract params from a pathname using a pattern's regex and param names.
|
|
149
|
+
*
|
|
150
|
+
* Values are URL-decoded so apps see the raw string (e.g. "ivo@example.com")
|
|
151
|
+
* instead of the percent-encoded form ("ivo%40example.com"). This matches the
|
|
152
|
+
* contract assumed by ctx.reverse (which re-encodes) and aligns with
|
|
153
|
+
* Express/React Router/Fastify/Koa.
|
|
134
154
|
*/
|
|
135
155
|
export function extractParams(
|
|
136
156
|
pathname: string,
|
|
@@ -142,7 +162,7 @@ export function extractParams(
|
|
|
142
162
|
|
|
143
163
|
const params: Record<string, string> = {};
|
|
144
164
|
for (let i = 0; i < paramNames.length; i++) {
|
|
145
|
-
params[paramNames[i]] = match[i + 1] || "";
|
|
165
|
+
params[paramNames[i]] = safeDecodeURIComponent(match[i + 1] || "");
|
|
146
166
|
}
|
|
147
167
|
return params;
|
|
148
168
|
}
|
|
@@ -166,7 +186,15 @@ export function createMiddlewareContext<TEnv>(
|
|
|
166
186
|
search?: Record<string, unknown>,
|
|
167
187
|
) => string,
|
|
168
188
|
): MiddlewareContext<TEnv> {
|
|
169
|
-
|
|
189
|
+
// Reuse the request context's clean URL when available. Each middleware still
|
|
190
|
+
// gets its OWN URL clone (a middleware may mutate ctx.url / ctx.searchParams),
|
|
191
|
+
// but cloning the already-clean URL is cheaper than re-parsing + re-stripping
|
|
192
|
+
// request.url per middleware. Fall back to parsing when no ALS context.
|
|
193
|
+
const reqCtx = _getRequestContext();
|
|
194
|
+
const ctxUrl = reqCtx?.url;
|
|
195
|
+
const url = ctxUrl
|
|
196
|
+
? new URL(ctxUrl)
|
|
197
|
+
: stripInternalParams(new URL(request.url));
|
|
170
198
|
|
|
171
199
|
// Track the initial response to detect pre/post-next() phase.
|
|
172
200
|
// Before next(): responseHolder.response === initialResponse (the stub).
|
|
@@ -182,13 +210,36 @@ export function createMiddlewareContext<TEnv>(
|
|
|
182
210
|
// Cookie operations are handled by the standalone cookies() function which
|
|
183
211
|
// delegates to the shared RequestContext internally.
|
|
184
212
|
// The runtime implementation - types are enforced at call sites via MiddlewareContext<TEnv>
|
|
213
|
+
// Internal helper: resolve the current response (stub before next(), real after).
|
|
214
|
+
// Not exposed on the public MiddlewareContext type — use ctx.headers instead.
|
|
215
|
+
const getResponse = (): Response => {
|
|
216
|
+
if (isPreNext()) {
|
|
217
|
+
const reqCtx = _getRequestContext();
|
|
218
|
+
if (reqCtx) return reqCtx.res;
|
|
219
|
+
}
|
|
220
|
+
if (!responseHolder.response) {
|
|
221
|
+
throw new Error(
|
|
222
|
+
"Response is not available - responseHolder was not initialized",
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
return responseHolder.response;
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
// reqCtx captured once above: the request-scoped platform fields
|
|
229
|
+
// (originalUrl, executionContext, waitUntil) are immutable per request,
|
|
230
|
+
// so snapshotting beats re-reading ALS on every access. The lazy getters
|
|
231
|
+
// below (routeName, theme, setTheme) stay lazy because those can change
|
|
232
|
+
// during `await next()`.
|
|
185
233
|
return {
|
|
186
234
|
request,
|
|
187
235
|
url,
|
|
236
|
+
originalUrl: reqCtx?.originalUrl ?? new URL(request.url),
|
|
188
237
|
pathname: url.pathname,
|
|
189
238
|
searchParams: url.searchParams,
|
|
190
239
|
env: env as MiddlewareContext<TEnv>["env"],
|
|
191
240
|
params,
|
|
241
|
+
executionContext: reqCtx?.executionContext,
|
|
242
|
+
waitUntil: reqCtx ? reqCtx.waitUntil.bind(reqCtx) : fireAndForgetWaitUntil,
|
|
192
243
|
// Getter: re-derives from request context on each access so that global
|
|
193
244
|
// middleware sees the matched route name after await next().
|
|
194
245
|
get routeName(): MiddlewareContext<TEnv>["routeName"] {
|
|
@@ -199,33 +250,16 @@ export function createMiddlewareContext<TEnv>(
|
|
|
199
250
|
) as MiddlewareContext<TEnv>["routeName"];
|
|
200
251
|
},
|
|
201
252
|
|
|
202
|
-
get
|
|
203
|
-
|
|
204
|
-
// set via ctx.header() are visible on ctx.res.
|
|
205
|
-
if (isPreNext()) {
|
|
206
|
-
const reqCtx = _getRequestContext();
|
|
207
|
-
if (reqCtx) return reqCtx.res;
|
|
208
|
-
}
|
|
209
|
-
if (!responseHolder.response) {
|
|
210
|
-
throw new Error(
|
|
211
|
-
"ctx.res is not available - responseHolder was not initialized",
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
return responseHolder.response;
|
|
215
|
-
},
|
|
216
|
-
set res(_: Response) {
|
|
217
|
-
throw new Error(
|
|
218
|
-
"ctx.res is read-only. Use ctx.header() to set response headers, or cookies() for cookie mutations.",
|
|
219
|
-
);
|
|
253
|
+
get headers(): Headers {
|
|
254
|
+
return getResponse().headers;
|
|
220
255
|
},
|
|
221
256
|
|
|
222
257
|
get: ((keyOrVar: any) =>
|
|
223
258
|
contextGet(variables, keyOrVar)) as MiddlewareContext<TEnv>["get"],
|
|
224
259
|
|
|
225
|
-
set: ((keyOrVar: any, value: unknown) => {
|
|
226
|
-
contextSet(variables, keyOrVar, value);
|
|
260
|
+
set: ((keyOrVar: any, value: unknown, options?: any) => {
|
|
261
|
+
contextSet(variables, keyOrVar, value, options);
|
|
227
262
|
}) as MiddlewareContext<TEnv>["set"],
|
|
228
|
-
|
|
229
263
|
header(name: string, value: string): void {
|
|
230
264
|
// Before next(): delegate to shared RequestContext stub
|
|
231
265
|
if (isPreNext()) {
|
|
@@ -244,11 +278,33 @@ export function createMiddlewareContext<TEnv>(
|
|
|
244
278
|
responseHolder.response.headers.set(name, value);
|
|
245
279
|
},
|
|
246
280
|
|
|
281
|
+
get theme(): MiddlewareContext<TEnv>["theme"] {
|
|
282
|
+
return _getRequestContext()?.theme;
|
|
283
|
+
},
|
|
284
|
+
|
|
285
|
+
get setTheme(): MiddlewareContext<TEnv>["setTheme"] {
|
|
286
|
+
return _getRequestContext()?.setTheme;
|
|
287
|
+
},
|
|
288
|
+
|
|
289
|
+
setLocationState(entries) {
|
|
290
|
+
const reqCtx = _getRequestContext();
|
|
291
|
+
if (!reqCtx) {
|
|
292
|
+
throw new Error(
|
|
293
|
+
"setLocationState() is not available outside a request context",
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
reqCtx.setLocationState(entries);
|
|
297
|
+
},
|
|
298
|
+
|
|
247
299
|
reverse:
|
|
248
300
|
reverse ??
|
|
249
|
-
((
|
|
301
|
+
((
|
|
302
|
+
name: string,
|
|
303
|
+
_params?: Record<string, string>,
|
|
304
|
+
_search?: Record<string, unknown>,
|
|
305
|
+
) => {
|
|
250
306
|
throw new Error(
|
|
251
|
-
`ctx.reverse() is not available
|
|
307
|
+
`ctx.reverse(${JSON.stringify(name)}) is not available: no route map is bound to this middleware context.`,
|
|
252
308
|
);
|
|
253
309
|
}),
|
|
254
310
|
|
|
@@ -256,6 +312,10 @@ export function createMiddlewareContext<TEnv>(
|
|
|
256
312
|
const reqCtx = _getRequestContext();
|
|
257
313
|
if (reqCtx) {
|
|
258
314
|
reqCtx._debugPerformance = true;
|
|
315
|
+
// Anchor to the true request entry (reqCtx._handlerStart) so phases that
|
|
316
|
+
// began before this opt-in report non-negative offsets; undefined falls
|
|
317
|
+
// back to performance.now() in createMetricsStore.
|
|
318
|
+
reqCtx._metricsStore ??= createMetricsStore(true, reqCtx._handlerStart);
|
|
259
319
|
}
|
|
260
320
|
},
|
|
261
321
|
};
|
|
@@ -281,9 +341,16 @@ export function matchMiddleware<TEnv>(
|
|
|
281
341
|
continue;
|
|
282
342
|
}
|
|
283
343
|
|
|
284
|
-
//
|
|
285
|
-
|
|
286
|
-
|
|
344
|
+
// Run the scope regex ONCE per entry. The old code ran test() then, on a
|
|
345
|
+
// hit, extractParams' match() — a second full pass over the same string for
|
|
346
|
+
// every matching entry on the per-request hot path. The regexes carry no
|
|
347
|
+
// `g` flag, so there is no lastIndex statefulness across this single match.
|
|
348
|
+
const m = pathname.match(entry.regex);
|
|
349
|
+
if (m) {
|
|
350
|
+
const params: Record<string, string> = {};
|
|
351
|
+
for (let i = 0; i < entry.paramNames.length; i++) {
|
|
352
|
+
params[entry.paramNames[i]] = safeDecodeURIComponent(m[i + 1] || "");
|
|
353
|
+
}
|
|
287
354
|
matches.push({ entry, params });
|
|
288
355
|
}
|
|
289
356
|
}
|
|
@@ -291,15 +358,97 @@ export function matchMiddleware<TEnv>(
|
|
|
291
358
|
return matches;
|
|
292
359
|
}
|
|
293
360
|
|
|
361
|
+
// Set-Cookie is appended; for other headers stubOverridesNonCookie=true
|
|
362
|
+
// overwrites (chain ran to completion), false fills only missing slots (an
|
|
363
|
+
// explicit short-circuit Response's own headers win).
|
|
364
|
+
function mergeStubHeaders(
|
|
365
|
+
target: Headers,
|
|
366
|
+
stub: Headers,
|
|
367
|
+
stubOverridesNonCookie: boolean,
|
|
368
|
+
): void {
|
|
369
|
+
stub.forEach((value, name) => {
|
|
370
|
+
// The reserved external-redirect marker is internal and never a trust
|
|
371
|
+
// signal; never copy a stub value (e.g. a stray ctx.header() call) onto a
|
|
372
|
+
// browser-facing response. The opt-in is the out-of-band brand.
|
|
373
|
+
if (name.toLowerCase() === EXTERNAL_REDIRECT_MARKER) return;
|
|
374
|
+
if (name.toLowerCase() === "set-cookie") {
|
|
375
|
+
target.append(name, value);
|
|
376
|
+
} else if (stubOverridesNonCookie || !target.has(name)) {
|
|
377
|
+
target.set(name, value);
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// Set-Cookie is deduped so a nested inner executeMiddleware that already merged
|
|
383
|
+
// the same reqCtx cookies does not duplicate them; other headers fill if missing.
|
|
384
|
+
function mergeReqCtxStub(
|
|
385
|
+
target: Headers,
|
|
386
|
+
reqCtx: ReturnType<typeof _getRequestContext>,
|
|
387
|
+
): void {
|
|
388
|
+
if (!reqCtx) return;
|
|
389
|
+
const stubCookies = reqCtx.res.headers.getSetCookie();
|
|
390
|
+
if (stubCookies.length > 0) {
|
|
391
|
+
const existing = new Set(target.getSetCookie());
|
|
392
|
+
for (const cookie of stubCookies) {
|
|
393
|
+
if (!existing.has(cookie)) {
|
|
394
|
+
target.append("set-cookie", cookie);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
reqCtx.res.headers.forEach((value, name) => {
|
|
399
|
+
// Never propagate the reserved external-redirect marker (see mergeStubHeaders).
|
|
400
|
+
if (name.toLowerCase() === EXTERNAL_REDIRECT_MARKER) return;
|
|
401
|
+
if (name !== "set-cookie" && !target.has(name)) {
|
|
402
|
+
target.set(name, value);
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Clone `base` with stub headers merged into a fresh Headers (the clone keeps
|
|
408
|
+
// the body mutable for post-next() modifications). Set-Cookie is always
|
|
409
|
+
// appended; other headers obey stubOverridesNonCookie (see mergeStubHeaders).
|
|
410
|
+
// mergeReqCtx folds in RequestContext stub cookies/headers; the intercept
|
|
411
|
+
// short-circuit path passes false (its reqCtx headers are not merged here),
|
|
412
|
+
// which is the one deliberate divergence between the call sites.
|
|
413
|
+
function mergeResponse(
|
|
414
|
+
base: Response,
|
|
415
|
+
stub: Headers,
|
|
416
|
+
opts: { stubOverridesNonCookie: boolean; mergeReqCtx: boolean },
|
|
417
|
+
): Response {
|
|
418
|
+
const mergedHeaders = new Headers(base.headers);
|
|
419
|
+
// The reserved external-redirect marker is never a trust signal and must never
|
|
420
|
+
// reach the browser. The guard strips it on 3xx redirects; strip it here too so
|
|
421
|
+
// a forged value cannot ride a non-3xx middleware response (which the 3xx-only
|
|
422
|
+
// guard would not touch) to the client. The opt-in is the out-of-band brand.
|
|
423
|
+
mergedHeaders.delete(EXTERNAL_REDIRECT_MARKER);
|
|
424
|
+
mergeStubHeaders(mergedHeaders, stub, opts.stubOverridesNonCookie);
|
|
425
|
+
if (opts.mergeReqCtx) {
|
|
426
|
+
mergeReqCtxStub(mergedHeaders, _getRequestContext());
|
|
427
|
+
}
|
|
428
|
+
const merged = new Response(base.body, {
|
|
429
|
+
status: base.status,
|
|
430
|
+
statusText: base.statusText,
|
|
431
|
+
headers: mergedHeaders,
|
|
432
|
+
});
|
|
433
|
+
// Transfer the out-of-band external-redirect brand across this rebuild: a
|
|
434
|
+
// middleware short-circuit `return redirect(url, { external: true })` reaches
|
|
435
|
+
// the open-redirect guard only after this merge, and the brand lives on the
|
|
436
|
+
// Response object, not in its headers.
|
|
437
|
+
if (isExternalRedirect(base)) {
|
|
438
|
+
markExternalRedirect(merged);
|
|
439
|
+
}
|
|
440
|
+
return merged;
|
|
441
|
+
}
|
|
442
|
+
|
|
294
443
|
/**
|
|
295
444
|
* Execute middleware chain
|
|
296
445
|
*
|
|
297
446
|
* Features:
|
|
298
447
|
* - `await next()` returns actual Response
|
|
299
|
-
* - `ctx.
|
|
300
|
-
* - `ctx.header()` shorthand for setting
|
|
301
|
-
* - Forgiving: if middleware doesn't return, uses
|
|
302
|
-
* - Short-circuit: return Response to stop chain
|
|
448
|
+
* - `ctx.headers` available before and after `await next()`
|
|
449
|
+
* - `ctx.header()` shorthand for setting a single header
|
|
450
|
+
* - Forgiving: if middleware doesn't return, uses the downstream response
|
|
451
|
+
* - Short-circuit: return OR throw a Response to stop chain
|
|
303
452
|
* - Error catching: try/catch around `next()` works
|
|
304
453
|
*/
|
|
305
454
|
export async function executeMiddleware<TEnv>(
|
|
@@ -329,42 +478,16 @@ export async function executeMiddleware<TEnv>(
|
|
|
329
478
|
// End of chain - call actual RSC handler
|
|
330
479
|
const response = await finalHandler();
|
|
331
480
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
stubResponse.headers.forEach((value, name) => {
|
|
336
|
-
if (name.toLowerCase() === "set-cookie") {
|
|
337
|
-
mergedHeaders.append(name, value);
|
|
338
|
-
} else {
|
|
339
|
-
mergedHeaders.set(name, value);
|
|
340
|
-
}
|
|
341
|
-
});
|
|
342
|
-
// Also merge shared RequestContext stub (cookies written via cookies().set()).
|
|
343
|
-
// Dedup Set-Cookie: an inner executeMiddleware (route-level middleware)
|
|
344
|
-
// may have already merged the same reqCtx cookies into the response.
|
|
345
|
-
const reqCtx = _getRequestContext();
|
|
346
|
-
if (reqCtx) {
|
|
347
|
-
const stubCookies = reqCtx.res.headers.getSetCookie();
|
|
348
|
-
if (stubCookies.length > 0) {
|
|
349
|
-
const existing = new Set(mergedHeaders.getSetCookie());
|
|
350
|
-
for (const cookie of stubCookies) {
|
|
351
|
-
if (!existing.has(cookie)) {
|
|
352
|
-
mergedHeaders.append("set-cookie", cookie);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
reqCtx.res.headers.forEach((value, name) => {
|
|
357
|
-
if (name !== "set-cookie" && !mergedHeaders.has(name)) {
|
|
358
|
-
mergedHeaders.set(name, value);
|
|
359
|
-
}
|
|
360
|
-
});
|
|
481
|
+
if (isWebSocketUpgradeResponse(response)) {
|
|
482
|
+
responseHolder.response = response;
|
|
483
|
+
return response;
|
|
361
484
|
}
|
|
362
485
|
|
|
363
|
-
//
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
486
|
+
// Chain ran to completion: stub headers overwrite (stubOverridesNonCookie)
|
|
487
|
+
// and reqCtx stub headers are merged in.
|
|
488
|
+
responseHolder.response = mergeResponse(response, stubResponse.headers, {
|
|
489
|
+
stubOverridesNonCookie: true,
|
|
490
|
+
mergeReqCtx: true,
|
|
368
491
|
});
|
|
369
492
|
|
|
370
493
|
return responseHolder.response;
|
|
@@ -380,15 +503,15 @@ export async function executeMiddleware<TEnv>(
|
|
|
380
503
|
responseHolder,
|
|
381
504
|
reverse,
|
|
382
505
|
);
|
|
383
|
-
const metricsStore = _getRequestContext()?._metricsStore;
|
|
384
506
|
const metricStart = performance.now();
|
|
507
|
+
const metricLabel = getMiddlewareMetricLabel(entry, middlewareOrdinal);
|
|
385
508
|
let middlewareFinished = false;
|
|
386
509
|
const finishMiddleware = () => {
|
|
387
510
|
if (!middlewareFinished) {
|
|
388
511
|
middlewareFinished = true;
|
|
389
512
|
appendMetric(
|
|
390
|
-
|
|
391
|
-
|
|
513
|
+
_getRequestContext()?._metricsStore,
|
|
514
|
+
`${metricLabel}:pre`,
|
|
392
515
|
metricStart,
|
|
393
516
|
performance.now() - metricStart,
|
|
394
517
|
MIDDLEWARE_METRIC_DEPTH,
|
|
@@ -400,6 +523,7 @@ export async function executeMiddleware<TEnv>(
|
|
|
400
523
|
// Guard against double-calling: a second call would re-enter the
|
|
401
524
|
// downstream chain and overwrite responseHolder.response.
|
|
402
525
|
let nextPromise: Promise<Response> | null = null;
|
|
526
|
+
let nextResolvedAt: number | undefined;
|
|
403
527
|
const wrappedNext = (): Promise<Response> => {
|
|
404
528
|
if (nextPromise) {
|
|
405
529
|
throw new Error(
|
|
@@ -407,76 +531,80 @@ export async function executeMiddleware<TEnv>(
|
|
|
407
531
|
);
|
|
408
532
|
}
|
|
409
533
|
finishMiddleware();
|
|
410
|
-
|
|
534
|
+
const downstream = next();
|
|
535
|
+
nextPromise = downstream.then(
|
|
536
|
+
(res) => {
|
|
537
|
+
nextResolvedAt = performance.now();
|
|
538
|
+
return res;
|
|
539
|
+
},
|
|
540
|
+
(err) => {
|
|
541
|
+
nextResolvedAt = performance.now();
|
|
542
|
+
throw err;
|
|
543
|
+
},
|
|
544
|
+
);
|
|
411
545
|
return nextPromise;
|
|
412
546
|
};
|
|
413
547
|
|
|
414
|
-
//
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
return (originalSet as Function).apply(ctx, args);
|
|
421
|
-
}) as typeof ctx.set;
|
|
422
|
-
}
|
|
423
|
-
|
|
548
|
+
// Wrap the middleware (including its downstream next() chain) in its span
|
|
549
|
+
// via the unified phase API. metric:false — the middleware's perf metric is
|
|
550
|
+
// its exclusive pre/post own-time, recorded directly above and below, finer
|
|
551
|
+
// than a single wrap. Spans nest by async context, so this onions
|
|
552
|
+
// middleware-over-middleware and the core handler underneath. Pass-through
|
|
553
|
+
// when neither surface is active.
|
|
424
554
|
let result: Response | void;
|
|
425
555
|
try {
|
|
426
|
-
result = await
|
|
427
|
-
|
|
556
|
+
result = await observePhase(PHASES.middleware(metricLabel), async () => {
|
|
557
|
+
try {
|
|
558
|
+
return await entry.handler(ctx, wrappedNext);
|
|
559
|
+
} catch (error) {
|
|
560
|
+
// Thrown Response is short-circuit control flow, not an error —
|
|
561
|
+
// absorb it INSIDE the span so the tracing runner settles the
|
|
562
|
+
// rango.middleware span as success, not STATUS_ERROR (every auth
|
|
563
|
+
// redirect would otherwise inflate trace error rates). Returning it
|
|
564
|
+
// routes through the `if (result instanceof Response)` branch below,
|
|
565
|
+
// so stub headers and request-context cookies merge identically to an
|
|
566
|
+
// explicit `return new Response(...)`. Segment handlers already follow
|
|
567
|
+
// this convention (segment-resolution/helpers.ts keeps result handling
|
|
568
|
+
// outside the span). Real errors propagate past the span.
|
|
569
|
+
if (error instanceof Response) return error;
|
|
570
|
+
throw error;
|
|
571
|
+
}
|
|
572
|
+
});
|
|
573
|
+
} finally {
|
|
574
|
+
// Settle the middleware own-time metric once on both the success and
|
|
575
|
+
// error paths (idempotent guard in finishMiddleware).
|
|
428
576
|
finishMiddleware();
|
|
429
|
-
throw error;
|
|
430
577
|
}
|
|
431
|
-
|
|
578
|
+
|
|
579
|
+
// Record post-next() processing time when middleware did work after
|
|
580
|
+
// the downstream chain resolved (e.g. adding headers, logging).
|
|
581
|
+
if (nextResolvedAt !== undefined) {
|
|
582
|
+
const postDur = performance.now() - nextResolvedAt;
|
|
583
|
+
if (postDur > POST_METRIC_MIN_DURATION_MS) {
|
|
584
|
+
appendMetric(
|
|
585
|
+
_getRequestContext()?._metricsStore,
|
|
586
|
+
`${metricLabel}:post`,
|
|
587
|
+
nextResolvedAt,
|
|
588
|
+
postDur,
|
|
589
|
+
MIDDLEWARE_METRIC_DEPTH,
|
|
590
|
+
);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
432
593
|
|
|
433
594
|
// Explicit return takes precedence (middleware short-circuit).
|
|
434
595
|
// Merge stub headers (from ctx.header before this point) and
|
|
435
|
-
// RequestContext stub headers (from
|
|
596
|
+
// RequestContext stub headers (from cookies().set()) into the
|
|
436
597
|
// returned Response so they are not lost.
|
|
437
598
|
if (result instanceof Response) {
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
ctxSetCalled &&
|
|
442
|
-
result.status >= 300 &&
|
|
443
|
-
result.status < 400
|
|
444
|
-
) {
|
|
445
|
-
warnCtxSetBeforeRedirect(entry.handler);
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
const mergedHeaders = new Headers(result.headers);
|
|
449
|
-
stubResponse.headers.forEach((value, name) => {
|
|
450
|
-
if (name.toLowerCase() === "set-cookie") {
|
|
451
|
-
mergedHeaders.append(name, value);
|
|
452
|
-
} else if (!mergedHeaders.has(name)) {
|
|
453
|
-
mergedHeaders.set(name, value);
|
|
454
|
-
}
|
|
455
|
-
});
|
|
456
|
-
// Also merge shared RequestContext stub (cookies written via setCookie).
|
|
457
|
-
// Dedup Set-Cookie: an inner executeMiddleware (route-level middleware)
|
|
458
|
-
// may have already merged the same reqCtx cookies into the response.
|
|
459
|
-
const reqCtx = _getRequestContext();
|
|
460
|
-
if (reqCtx) {
|
|
461
|
-
const stubCookies = reqCtx.res.headers.getSetCookie();
|
|
462
|
-
if (stubCookies.length > 0) {
|
|
463
|
-
const existing = new Set(mergedHeaders.getSetCookie());
|
|
464
|
-
for (const cookie of stubCookies) {
|
|
465
|
-
if (!existing.has(cookie)) {
|
|
466
|
-
mergedHeaders.append("set-cookie", cookie);
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
reqCtx.res.headers.forEach((value, name) => {
|
|
471
|
-
if (name !== "set-cookie" && !mergedHeaders.has(name)) {
|
|
472
|
-
mergedHeaders.set(name, value);
|
|
473
|
-
}
|
|
474
|
-
});
|
|
599
|
+
if (isWebSocketUpgradeResponse(result)) {
|
|
600
|
+
responseHolder.response = result;
|
|
601
|
+
return result;
|
|
475
602
|
}
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
603
|
+
// Explicit short-circuit: the returned Response's own headers win
|
|
604
|
+
// (stubOverridesNonCookie=false); reqCtx stub headers still merge in.
|
|
605
|
+
const merged = mergeResponse(result, stubResponse.headers, {
|
|
606
|
+
stubOverridesNonCookie: false,
|
|
607
|
+
mergeReqCtx: true,
|
|
480
608
|
});
|
|
481
609
|
responseHolder.response = merged;
|
|
482
610
|
return merged;
|
|
@@ -495,19 +623,6 @@ export async function executeMiddleware<TEnv>(
|
|
|
495
623
|
// If middleware called next(), await it and return the response
|
|
496
624
|
if (nextPromise) {
|
|
497
625
|
await nextPromise;
|
|
498
|
-
|
|
499
|
-
// W5: warn if ctx.set() was called but the downstream response is a redirect.
|
|
500
|
-
// The ctx.set() values will be lost because the redirect navigates away.
|
|
501
|
-
if (
|
|
502
|
-
process.env.NODE_ENV !== "production" &&
|
|
503
|
-
ctxSetCalled &&
|
|
504
|
-
responseHolder.response &&
|
|
505
|
-
responseHolder.response.status >= 300 &&
|
|
506
|
-
responseHolder.response.status < 400
|
|
507
|
-
) {
|
|
508
|
-
warnCtxSetBeforeRedirect(entry.handler);
|
|
509
|
-
}
|
|
510
|
-
|
|
511
626
|
return responseHolder.response!;
|
|
512
627
|
}
|
|
513
628
|
|
|
@@ -534,23 +649,12 @@ export async function executeMiddleware<TEnv>(
|
|
|
534
649
|
// last merge point (e.g. cookies().set() called after await next()).
|
|
535
650
|
// The reqCtx stub may have already been partially merged during finalHandler
|
|
536
651
|
// or early-return paths; only append *new* Set-Cookie entries to avoid dupes.
|
|
652
|
+
//
|
|
653
|
+
// Skip for upgrade responses: upgrade headers are semantically immutable and
|
|
654
|
+
// set-cookie on an upgrade is not meaningful.
|
|
537
655
|
const reqCtx = _getRequestContext();
|
|
538
|
-
if (reqCtx) {
|
|
539
|
-
|
|
540
|
-
if (stubCookies.length > 0) {
|
|
541
|
-
const existingCookies = new Set(finalResponse.headers.getSetCookie());
|
|
542
|
-
for (const cookie of stubCookies) {
|
|
543
|
-
if (!existingCookies.has(cookie)) {
|
|
544
|
-
finalResponse.headers.append("set-cookie", cookie);
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
// Fill in non-cookie headers that aren't already on the response
|
|
549
|
-
reqCtx.res.headers.forEach((value, name) => {
|
|
550
|
-
if (name !== "set-cookie" && !finalResponse.headers.has(name)) {
|
|
551
|
-
finalResponse.headers.set(name, value);
|
|
552
|
-
}
|
|
553
|
-
});
|
|
656
|
+
if (reqCtx && !isWebSocketUpgradeResponse(finalResponse)) {
|
|
657
|
+
mergeReqCtxStub(finalResponse.headers, reqCtx);
|
|
554
658
|
}
|
|
555
659
|
|
|
556
660
|
return finalResponse;
|
|
@@ -561,7 +665,7 @@ export async function executeMiddleware<TEnv>(
|
|
|
561
665
|
*
|
|
562
666
|
* Intercepts use a shared stubResponse from the request context. This function:
|
|
563
667
|
* - Runs middleware in sequence with a simple next() chain
|
|
564
|
-
* - Returns Response if any middleware short-circuits (returns Response or redirects BEFORE next())
|
|
668
|
+
* - Returns Response if any middleware short-circuits (returns OR throws a Response, or redirects, BEFORE next())
|
|
565
669
|
* - Returns null if all middleware calls next() - headers set after next() remain on stubResponse
|
|
566
670
|
*
|
|
567
671
|
* @param middlewares - Array of middleware functions
|
|
@@ -599,6 +703,7 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
599
703
|
return stubResponse;
|
|
600
704
|
}
|
|
601
705
|
|
|
706
|
+
const ordinal = index;
|
|
602
707
|
const middleware = middlewares[index++];
|
|
603
708
|
const ctx = createMiddlewareContext(
|
|
604
709
|
request,
|
|
@@ -620,7 +725,30 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
620
725
|
return next();
|
|
621
726
|
};
|
|
622
727
|
|
|
623
|
-
|
|
728
|
+
// Span-wrap each intercept middleware as rango.middleware (metric:false —
|
|
729
|
+
// intercept runs inside the render phase already metered by render:total, so
|
|
730
|
+
// it contributes a span but no separate perf metric). Bare MiddlewareFns
|
|
731
|
+
// have no pattern, so the label is scoped to "*" like a pattern-less entry.
|
|
732
|
+
const label = getMiddlewareMetricLabel(
|
|
733
|
+
{ handler: middleware, pattern: null } as MiddlewareEntry<TEnv>,
|
|
734
|
+
ordinal,
|
|
735
|
+
);
|
|
736
|
+
|
|
737
|
+
const result: Response | void = await observePhase(
|
|
738
|
+
PHASES.middleware(label),
|
|
739
|
+
async () => {
|
|
740
|
+
try {
|
|
741
|
+
return await middleware(ctx, guardedNext);
|
|
742
|
+
} catch (error) {
|
|
743
|
+
// Thrown Response is short-circuit control flow, parity with the
|
|
744
|
+
// explicit-return path below. Absorb it INSIDE the span so the tracing
|
|
745
|
+
// runner settles rango.middleware as success, not STATUS_ERROR (same
|
|
746
|
+
// reasoning as executeMiddleware's main chain). Real errors propagate.
|
|
747
|
+
if (error instanceof Response) return error;
|
|
748
|
+
throw error;
|
|
749
|
+
}
|
|
750
|
+
},
|
|
751
|
+
);
|
|
624
752
|
|
|
625
753
|
if (result instanceof Response) {
|
|
626
754
|
earlyResponse = result;
|
|
@@ -644,21 +772,13 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
644
772
|
});
|
|
645
773
|
|
|
646
774
|
if (hasStubHeaders) {
|
|
647
|
-
//
|
|
648
|
-
//
|
|
649
|
-
//
|
|
650
|
-
|
|
651
|
-
stubResponse.headers
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
} else if (!mergedHeaders.has(name)) {
|
|
655
|
-
mergedHeaders.set(name, value);
|
|
656
|
-
}
|
|
657
|
-
});
|
|
658
|
-
return new Response(response.body, {
|
|
659
|
-
status: response.status,
|
|
660
|
-
statusText: response.statusText,
|
|
661
|
-
headers: mergedHeaders,
|
|
775
|
+
// Only fill in missing headers — the returned Response's explicit headers
|
|
776
|
+
// take precedence (stubOverridesNonCookie=false), matching executeMiddleware.
|
|
777
|
+
// mergeReqCtx=false: the intercept path deliberately does NOT merge reqCtx
|
|
778
|
+
// stub headers here (pinned by intercept-middleware-headers.test.ts).
|
|
779
|
+
return mergeResponse(response, stubResponse.headers, {
|
|
780
|
+
stubOverridesNonCookie: false,
|
|
781
|
+
mergeReqCtx: false,
|
|
662
782
|
});
|
|
663
783
|
}
|
|
664
784
|
return response;
|
|
@@ -699,7 +819,6 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
699
819
|
regex: null,
|
|
700
820
|
paramNames: [],
|
|
701
821
|
handler,
|
|
702
|
-
mountPrefix: null,
|
|
703
822
|
} as MiddlewareEntry<TEnv>,
|
|
704
823
|
params,
|
|
705
824
|
}));
|