Skip to content

feat(router): return ServerError acts like throw#8775

Merged
wmertens merged 1 commit into
build/v2from
throw-or-return-error
Jun 27, 2026
Merged

feat(router): return ServerError acts like throw#8775
wmertens merged 1 commit into
build/v2from
throw-or-return-error

Conversation

@wmertens

Copy link
Copy Markdown
Member

No description provided.

@changeset-bot

changeset-bot Bot commented Jun 26, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: a9d240c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 5 packages
Name Type
@qwik.dev/router Minor
eslint-plugin-qwik Minor
@qwik.dev/core Minor
create-qwik Minor
@qwik.dev/react Minor

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

@pkg-pr-new

pkg-pr-new Bot commented Jun 26, 2026

Copy link
Copy Markdown

Open in StackBlitz

@qwik.dev/core

npm i https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8775

@qwik.dev/router

npm i https://pkg.pr.new/QwikDev/qwik/@qwik.dev/router@8775

eslint-plugin-qwik

npm i https://pkg.pr.new/QwikDev/qwik/eslint-plugin-qwik@8775

create-qwik

npm i https://pkg.pr.new/QwikDev/qwik/create-qwik@8775

@qwik.dev/optimizer

npm i https://pkg.pr.new/QwikDev/qwik/@qwik.dev/optimizer@8775

commit: a9d240c

@github-actions

github-actions Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor
built with Refined Cloudflare Pages Action

⚡ Cloudflare Pages Deployment

Name Status Preview Last Commit
qwik-docs ✅ Ready (View Log) Visit Preview a9d240c

@wmertens wmertens marked this pull request as ready for review June 27, 2026 13:29
@wmertens wmertens requested a review from a team as a code owner June 27, 2026 13:29
Copilot AI review requested due to automatic review settings June 27, 2026 13:29
@wmertens wmertens requested review from a team as code owners June 27, 2026 13:29
@wmertens wmertens merged commit b611790 into build/v2 Jun 27, 2026
50 checks passed
@maiieul maiieul moved this from In progress to Waiting For Review in Qwik Development Jun 27, 2026
@wmertens wmertens deleted the throw-or-return-error branch June 27, 2026 13:29
@github-project-automation github-project-automation Bot moved this from Waiting For Review to Done in Qwik Development Jun 27, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 to Loader/Action callable 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.

Comment on lines +2 to +5
export class AbortMessage {
/** Type-only brand so `Exclude<>` can drop control-flow signals from resolved loader/action data. */
declare readonly __controlFlow: true;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants