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

sdougbrown / umpire / 24307963604
92%

Build:
DEFAULT BRANCH: main
Ran 12 Apr 2026 01:36PM UTC
Jobs 1
Files 44
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

12 Apr 2026 01:35PM UTC coverage: 92.616% (-0.4%) from 93.007%
24307963604

push

github

web-flow
🔌 Add @umpire/eslint-plugin (#21)

* 🔌 Add @umpire/eslint-plugin with three initial rules

Adds `packages/eslint-plugin` as a new published workspace package.

Rules:
- `no-unknown-fields` — reports field-name string literals in rule
  factories (requires, disables, oneOf, anyOf, eitherOf, enabledWhen,
  fairWhen) that are not declared in the same umpire() fields config.
  Handles the check() helper in disables source position and recurses
  into anyOf/eitherOf. Bails out silently when fields contains spread
  elements to avoid false positives.
- `no-inline-umpire-init` — reports umpire() calls inside React
  component or hook bodies (name starts with uppercase or `use`) that
  are not wrapped in useMemo. Building the dependency graph on every
  render is an invisible perf regression with no runtime error.
- `no-self-disable` — reports when the source field of disables() also
  appears in its targets array.

Exports a `recommended` flat-config preset that sets no-unknown-fields
and no-inline-umpire-init to warn, and no-self-disable to error.

36 tests pass across all three rules.

https://claude.ai/code/session_016ZuZgFVvc37SSn1bKDPW8b

* 🔍 Add no-contradicting-rules and no-circular-requires

Both rules operate within a single umpire() call's top-level rules array
and skip rules nested inside anyOf/eitherOf (OR/branch semantics).

no-contradicting-rules (error):
  Detects requires/disables pairs that make a field permanently unavailable.
  Two patterns:
  - Case A: requires(X, Y) + disables(Y, [X]) — Y satisfies, disables X,
    but X needs Y → X can never be enabled
  - Case B: requires(X, Y) + disables(X, [Y]) — X satisfies, disables Y,
    but X needs Y → X's requirement can never hold while X has a value
  Reports on the disables() call with field names in the message.

no-circular-requires (error):
  Detects cycles in the requires dependency graph using DFS with gray/black
  coloring. Handles cycles of any length (A↔B, A→B→C→A, self-cycles).
  Re... (continued)

1533 of 1753 branches covered (87.45%)

Branch coverage included in aggregate %.

216 of 222 new or added lines in 6 files covered. (97.3%)

2280 of 2364 relevant lines covered (96.45%)

3722.66 hits per line

Uncovered Changes

Lines Coverage ∆ File
3
81.6
packages/eslint-plugin/src/utils.ts
2
92.0
packages/eslint-plugin/src/rules/no-inline-umpire-init.ts
1
91.03
packages/eslint-plugin/src/rules/no-contradicting-rules.ts
Jobs
ID Job ID Ran Files Coverage
1 24307963604.1 12 Apr 2026 01:36PM UTC 44
92.62
GitHub Action Run
Source Files on build 24307963604
  • Tree
  • List 44
  • Changed 0
  • Source Changed 0
  • Coverage Changed 0
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #24307963604
  • e77d58e9 on github
  • Prev Build on main (#24307920560)
  • Next Build on main (#24308123931)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc