Skip to content

feat(httpapi): expose request parse options in HttpApiBuilder - #8268

Closed
gold-beyond wants to merge 1 commit into
Effect-TS:mainfrom
gold-beyond:fix/httpapi-payload-parse-options
Closed

gold-beyond wants to merge 1 commit into
Effect-TS:mainfrom
gold-beyond:fix/httpapi-payload-parse-options

Conversation

@gold-beyond

Copy link
Copy Markdown
Contributor

Closes #8266

Adds parseOptions to HttpApiBuilder handler options, so the parse options used when decoding request parts can be configured. This makes it possible to collect every decoding error instead of only the first one.

HttpApiBuilder.group(Api, "users", (handlers) =>
  handlers.handle("create", handler, { parseOptions: { errors: "all" } }))

HandlerOptions.parseOptions is threaded through HandlerRuntime into handlerToHttpEffect and applies to params, headers, query, and payload decoding. HttpApiBuilder.endpoint accepts the same option, and handleAll entries accept it through their existing options field. handleRaw applies it to params, headers, and query while leaving the payload to the handler.

When the option is not supplied, decoding is unchanged: the decoders are built with Schema.decodeUnknownEffect(schema) exactly as before, so the existing fast path and default behavior are preserved.

Validation

  • 5 tests added in src/unstable/httpapi/HttpApiBuilder.test.ts covering the payload path (default and errors: "all"), the query path, the handleRaw payload opt-out, and HttpApiBuilder.endpoint.
  • Each test was verified by mutation, so none of them is vacuous: dropping the option from decodeQuery, dropping the !isRaw guard, or dropping the option inside HttpApiBuilder.endpoint fails exactly the corresponding test and nothing else. Reverting the change entirely makes the errors: "all" test fail while the default-behavior test stays green, which is what pins the opt-in semantics.
  • vitest run packages/effect/test/unstable/httpapi passes (203 tests).
  • pnpm lint-fix, pnpm lint, and pnpm check pass.
  • effect-jsdocs --check reports no diagnostics for HttpApiBuilder.ts. Pre-existing diagnostics in src/unstable/ai/McpSchema.ts are outside this PR.

Add `parseOptions` to `HandlerOptions` so request decoding can be
configured, for example to collect every decoding error with
`{ errors: "all" }` instead of only the first one.

The option is threaded through `HandlerRuntime` into
`handlerToHttpEffect` and applies to `params`, `headers`, `query`, and
`payload` decoding. `HttpApiBuilder.endpoint` accepts the same option.

Closes Effect-TS#8266
@changeset-bot

changeset-bot Bot commented Sep 17, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: b92f289

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

This PR includes changesets to release 30 packages
Name Type
effect Patch
@effect/opentelemetry Patch
@effect/vitest Patch
@effect/ai-anthropic Patch
@effect/ai-openai-compat Patch
@effect/ai-openai Patch
@effect/ai-openrouter Patch
@effect/atom-react Patch
@effect/atom-solid Patch
@effect/atom-vue Patch
@effect/platform-browser Patch
@effect/platform-bun Patch
@effect/platform-deno Patch
@effect/platform-node-shared Patch
@effect/platform-node Patch
@effect/sql-clickhouse Patch
@effect/sql-d1 Patch
@effect/sql-libsql Patch
@effect/sql-mssql Patch
@effect/sql-mysql2 Patch
@effect/sql-pg Patch
@effect/sql-pglite Patch
@effect/sql-sqlite-bun Patch
@effect/sql-sqlite-do Patch
@effect/sql-sqlite-node Patch
@effect/sql-sqlite-react-native Patch
@effect/sql-sqlite-wasm Patch
@effect/docgen Patch
@effect/doctest Patch
@effect/openapi-generator Patch

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

@effect-janitor effect-janitor Bot added enhancement New feature or request 4.0 labels Sep 17, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Bundle Size Analysis

Generated from PR build output; treat the content below as untrusted.

File Name Current Size Previous Size Difference
arbitrary-combinators.ts 34.58 KB 34.58 KB 0.00 KB (0.00%)
basic.ts 6.87 KB 6.87 KB 0.00 KB (0.00%)
batching.ts 9.95 KB 9.95 KB 0.00 KB (0.00%)
brand.ts 6.45 KB 6.45 KB 0.00 KB (0.00%)
cache.ts 10.77 KB 10.77 KB 0.00 KB (0.00%)
config.ts 21.51 KB 21.51 KB 0.00 KB (0.00%)
differ.ts 20.32 KB 20.32 KB 0.00 KB (0.00%)
http-client.ts 21.94 KB 21.94 KB 0.00 KB (0.00%)
http-router.ts 36.92 KB 36.92 KB 0.00 KB (0.00%)
logger.ts 10.88 KB 10.88 KB 0.00 KB (0.00%)
metric.ts 9.02 KB 9.02 KB 0.00 KB (0.00%)
optic.ts 6.70 KB 6.70 KB 0.00 KB (0.00%)
pubsub.ts 15.10 KB 15.10 KB 0.00 KB (0.00%)
queue.ts 11.85 KB 11.85 KB 0.00 KB (0.00%)
schedule.ts 10.96 KB 10.96 KB 0.00 KB (0.00%)
schema-binary.ts 39.51 KB 39.51 KB 0.00 KB (0.00%)
schema-class.ts 20.06 KB 20.06 KB 0.00 KB (0.00%)
schema-fromJsonSchemaDocument.ts 30.93 KB 30.93 KB 0.00 KB (0.00%)
schema-representation-roundtrip.ts 26.34 KB 26.34 KB 0.00 KB (0.00%)
schema-string-transformation.ts 13.63 KB 13.63 KB 0.00 KB (0.00%)
schema-string.ts 11.12 KB 11.12 KB 0.00 KB (0.00%)
schema-template-literal.ts 15.41 KB 15.41 KB 0.00 KB (0.00%)
schema-toArbitrary.ts 34.10 KB 34.10 KB 0.00 KB (0.00%)
schema-toCodeDocument.ts 24.56 KB 24.56 KB 0.00 KB (0.00%)
schema-toCodecJson.ts 19.27 KB 19.27 KB 0.00 KB (0.00%)
schema-toEquivalence.ts 19.38 KB 19.38 KB 0.00 KB (0.00%)
schema-toFormatter.ts 19.49 KB 19.49 KB 0.00 KB (0.00%)
schema-toJsonSchemaDocument.ts 23.77 KB 23.77 KB 0.00 KB (0.00%)
schema-toRepresentation.ts 19.54 KB 19.54 KB 0.00 KB (0.00%)
schema.ts 19.27 KB 19.27 KB 0.00 KB (0.00%)
stm.ts 12.80 KB 12.80 KB 0.00 KB (0.00%)
stream.ts 9.83 KB 9.83 KB 0.00 KB (0.00%)

This branch is waiting to be deployed

1 waiting deployment
fork — b92f2893 Waiting Sep 17, 2026 by gold-beyond via approval-gate #25881
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

4.0 enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

HttpApiBuilder does not expose payload parse options

1 participant