• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

RobinTail / express-zod-api / 30998016093
100%

Build:
DEFAULT BRANCH: master
Ran 05 Aug 2026 10:36AM UTC
Jobs 6
Files 50
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

05 Aug 2026 10:35AM UTC coverage: 100.0%. Remained the same
30998016093

push

github

web-flow
feat: Warn about unacceptable query/path params (#3596)

## What

Adds a startup warning for `query` and `path` parameters whose schema
can never be satisfied, because values in those positions always arrive
as strings.

Fixes #3577.

## Why

`Documentation` emits the Zod type as-is (`z.number()` → `type:
number`), so a `GET` endpoint with `z.number()` in `query`/`path`
advertises a contract that rejects every possible request with 400 — and
no warning fired, even though `z.bigint()` in the same position does
warn about the JSON-incompatible payload. This adds the missing
diagnostics while being coercion-aware (`z.coerce.number()` is the
documented workaround and must not be flagged).

## What changed

- `diagnostics.ts`: `Diagnostics` now receives `config`; new
`#checkStringOnlyParams` derives the stuck parameters entirely from the
flattened JSON Schema depiction of the input
(`flattenIO(z.toJSONSchema(..., { override }))`), mirroring the
documentation location logic (skipping headers/cookies). The `override`
stamps a custom `x-coerce` marker onto coercing schemas, so the
coercion-aware conclusion is drawn from the JSON depiction rather than
from Zod defs. This also covers input schemas that are more complex than
an object intersection (top-level transforms/refinements, records),
which `getObjectProperties` could not handle.
- `deep-checks.ts`: new JSON-Schema-driven `isStringSatisfiable(schema)`
(a property is satisfiable when its type accepts strings, is
unconstrained, or is marked `x-coerce`, with `anyOf`/`oneOf`/`allOf`
support) and `stringifyType(schema)` for a readable type label in the
message. Unsupported/unknown/complex types are treated as satisfiable to
avoid false positives (e.g. `bigint` is already covered by the
JSON-incompatible warning).
- `routing.ts`: passes `config` into `new Diagnostics(...)`.
- `tests/routing.spec.ts`: covers query/path
`number`/`int`/`boolean`/`literal(42)` (warn), a top-level-transformed
input (warn),
`z.coerce... (continued)

1052 of 1103 branches covered (95.38%)

47 of 47 new or added lines in 5 files covered. (100.0%)

1512 of 1512 relevant lines covered (100.0%)

553.27 hits per line

Jobs
ID Job ID Ran Files Coverage
1 run-22.19.0 - 30998016093.1 05 Aug 2026 10:36AM UTC 50
100.0
GitHub Action Run
2 run-22.x - 30998016093.2 05 Aug 2026 10:36AM UTC 50
100.0
GitHub Action Run
3 run-26.x - 30998016093.3 05 Aug 2026 10:36AM UTC 50
100.0
GitHub Action Run
4 run-24.11.0 - 30998016093.4 05 Aug 2026 10:36AM UTC 50
100.0
GitHub Action Run
5 run-24.x - 30998016093.5 05 Aug 2026 10:36AM UTC 50
100.0
GitHub Action Run
6 run-26.0.0 - 30998016093.6 05 Aug 2026 10:36AM UTC 50
100.0
GitHub Action Run
Source Files on build 30998016093
  • Tree
  • List 50
  • Changed 5
  • Source Changed 5
  • Coverage Changed 4
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #30998016093
  • 269c8a36 on github
  • Prev Build on master (#30986493582)
  • Next Build on master (#31018938863)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc