feat(router): return ServerError acts like throw#8775
Conversation
🦋 Changeset detectedLatest commit: a9d240c The changes in this PR will be included in the next version bump. This PR includes changesets to release 5 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
@qwik.dev/core
@qwik.dev/router
eslint-plugin-qwik
create-qwik
@qwik.dev/optimizer
commit: |
built with Refined Cloudflare Pages Action⚡ Cloudflare Pages Deployment
|
There was a problem hiding this comment.
Pull request overview
This PR makes “control-flow signals” returned from loaders/actions/request handlers/server functions (e.g. ev.redirect(), ev.error(), ev.rewrite()) behave the same as when they’re thrown, and adjusts the public types/docs so these signals don’t appear as “data” in resolved loader/action results.
Changes:
- Add
throwIfControlFlowSignal()and call it at key boundaries (route loaders, actions, request handlers, server functions) to throw returned control-flow signals. - Introduce
ExcludeControlFlow<T>and apply it toLoader/Actioncallable return types so resolved data types don’t include abort/error signals. - Add unit + e2e regression coverage and update extracted API docs + changeset.
Reviewed changes
Copilot reviewed 23 out of 23 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| packages/qwik-router/src/runtime/src/types.ts | Adds ExcludeControlFlow<T> and applies it to loader/action resolved types. |
| packages/qwik-router/src/runtime/src/route-loaders.ts | Throws returned control-flow signals from loader execution. |
| packages/qwik-router/src/runtime/src/qwik-router.runtime.api.md | Updates extracted runtime API to reflect ExcludeControlFlow usage/export. |
| packages/qwik-router/src/runtime/src/index.ts | Re-exports ExcludeControlFlow. |
| packages/qwik-router/src/middleware/request-handler/types.ts | Expands RequestHandler return type to include control-flow signals. |
| packages/qwik-router/src/middleware/request-handler/server-error.unit.ts | Adds unit coverage for throwIfControlFlowSignal(). |
| packages/qwik-router/src/middleware/request-handler/server-error.ts | Introduces throwIfControlFlowSignal() and treats ServerError as control-flow when returned. |
| packages/qwik-router/src/middleware/request-handler/resolve-request-handlers-core.ts | Throws returned control-flow signals from actions and server functions. |
| packages/qwik-router/src/middleware/request-handler/request-event-core.ts | Throws returned control-flow signals from request handler execution. |
| packages/qwik-router/src/middleware/request-handler/redirect-handler.ts | Adds a type-level brand to AbortMessage to support type exclusion. |
| packages/qwik-router/src/middleware/request-handler/middleware.request-handler.api.md | Updates extracted middleware API docs (including RequestHandler return type and AbortMessage branding). |
| packages/qwik-router/src/middleware/request-handler/handlers/action-handler.ts | Throws returned control-flow signals from action handler execution. |
| packages/docs/src/routes/api/qwik-router/index.mdx | Updates docs to reflect ExcludeControlFlow in loader/action signatures. |
| packages/docs/src/routes/api/qwik-router/api.json | Updates generated docs JSON for the same runtime API changes. |
| packages/docs/src/routes/api/qwik-router-middleware-request-handler/index.mdx | Updates docs for RequestHandler return type and AbortMessage branding. |
| packages/docs/src/routes/api/qwik-router-middleware-request-handler/api.json | Updates generated docs JSON for the same middleware API changes. |
| e2e/qwik-e2e/tests/qwikrouter/returned-control-flow.e2e.ts | Adds e2e coverage asserting returned redirect/error signals behave like thrown. |
| e2e/qwik-e2e/apps/qwikrouter-test/src/routes/returned-control-flow/target/index.tsx | Adds target route used for redirect assertions. |
| e2e/qwik-e2e/apps/qwikrouter-test/src/routes/returned-control-flow/loader-redirect/index.tsx | Adds loader returning redirect signal. |
| e2e/qwik-e2e/apps/qwikrouter-test/src/routes/returned-control-flow/loader-error/index.tsx | Adds loader returning error signal. |
| e2e/qwik-e2e/apps/qwikrouter-test/src/routes/returned-control-flow/handler-redirect/index.tsx | Adds request handler returning redirect signal. |
| e2e/qwik-e2e/apps/qwikrouter-test/src/routes/returned-control-flow/action-error/index.tsx | Adds action returning error signal. |
| .changeset/returned-control-flow-signals.md | Declares a minor feature release for the new behavior. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| export class AbortMessage { | ||
| /** Type-only brand so `Exclude<>` can drop control-flow signals from resolved loader/action data. */ | ||
| declare readonly __controlFlow: true; | ||
| } |
No description provided.