Skip to content

chore: bump @exadev/eslint-config to 2.12.1 - #45

Merged
Mearman merged 9 commits into
mainfrom
chore/bump-exadev-eslint-config
Sep 14, 2026
Merged

Mearman merged 9 commits into
mainfrom
chore/bump-exadev-eslint-config

Conversation

@Mearman

@Mearman Mearman commented Sep 14, 2026

Copy link
Copy Markdown
Member

Summary

Bumps @exadev/eslint-config from ^2.10.2 to an exact 2.12.1 across the workspace root and all three packages, and adds the config this repo needs going forward (saveExact, a minimumReleaseAgeExclude entry that already covered it, .npmrc fallback). Also bumps the pinned package manager from pnpm 11.6.0 to 12.4.1.

2.12.1 brings JSDoc/TSDoc comment-quality validation, a ban on Stryker-suppression comments, and an 800-real-line-per-file cap. The comment-validation rule surfaced several genuine doc-comment syntax issues (package names and arrow notation TSDoc misreads as tags/HTML, @throws {Type} using JSDoc syntax TSDoc doesn't support) — all fixed at the syntax level, nothing suppressed. The line-count rule flagged three files: evaluator.ts (1564 real lines) and its two companion test files, evaluator.test.ts (3152) and evaluator.indeterminacy.test.ts (1138). All three are split along their own existing internal seams into focused modules/files, each comfortably under the cap — see individual commits for the reasoning behind each split, including how the collection-resolution logic was decoupled via dependency injection specifically to avoid recreating a circular-import hazard the original file's own comments already documented.

No no-warning-comments (Stryker-suppression) hits — this repo has none.

Test plan

  • pnpm lint clean across all three packages
  • pnpm typecheck clean (including attw --pack)
  • pnpm test, test:integration, test:smoke, test:workers all green (unchanged pass counts throughout)
  • pnpm build clean
  • Full suite re-verified again after the pnpm 11 → 12.4.1 bump

Bumps the shared ESLint config from the ^2.10.2 range to an exact
2.12.1 in the root package.json and in trilean, trilean-regex, and
trilean-sql, each pinned independently. 2.12.1 brings JSDoc/TSDoc
comment-quality validation, a ban on Stryker-suppression comments, and
an 800-real-line-per-file cap, none of which change any existing
runtime behaviour on their own.
Sets saveExact: true in pnpm-workspace.yaml, the settings location
pnpm 11+ actually reads (.npmrc is registry/auth-only there), so every
future pnpm add lands as an exact version by default rather than a
caret range -- matching the exact pin @exadev/eslint-config and
@exadev/semantic-release-workspace already carry. Adds the equivalent
save-exact/minimum-release-age-exclude lines to .npmrc as a fallback
for a pnpm 10.x release older than 10.17, which predates
pnpm-workspace.yaml's own settings block.
…comment

TSDoc's parser treats a bare @word as an attempted block tag even
mid-sentence, so "@exadev/semantic-release-workspace" and
"@semantic-release/git" in this comment's prose were each read as a
malformed tag rather than plain text. Wrapping both in backticks marks
them as code spans, which TSDoc skips over during tag parsing.
TSDoc has no bracketed-type syntax for @throws -- writing
`@throws {RegexParseError} ...` makes the parser expect an inline tag
starting with "{@" and fail on the bare "{". Backticking the type name
instead reads as an ordinary code span, which is what these comments
already do for every other inline type reference.
…it as HTML

A bare > after a hyphen (an ASCII "->" arrow) reads to TSDoc as the
start of an HTML closing tag, which it flags as needing escape.
Backslash-escaping each > lets these comments keep using "->" as a
mapping/traversal arrow without tripping the parser.
…r the 800-line cap

evaluator.test.ts had grown to 3152 lines of real code, well over the
new max-lines cap. Splits it by tested concern into nine files
(literal/reference values, temporal arithmetic, real-number
arithmetic, complex-number arithmetic, compare/textCompare,
memberOf/exists/quantifiers, lookup/fold/accumulator,
conditional/delegate/treeReference/call, and the resource-limit and
golden-example integration checks), each comfortably under the cap.
Extracts the shared default resolver, expectDefinite/expectIndeterminate
assertion helpers, and the isPlainRecord/isUnknownArray type guards --
previously duplicated near-verbatim in evaluator.indeterminacy.test.ts
-- into a new evaluator-test-helpers.ts every split file imports from.
…line cap

evaluator.indeterminacy.test.ts had grown to 1138 lines of real code,
over the new max-lines cap. Its own structure already separated
cleanly into a fixture-driven reference table (one row per
node-kind x reason-code combination) and a set of explicitly
called-out edge cases beyond that table, so it splits along that same
seam into evaluator.indeterminacy-table.test.ts and
evaluator.indeterminacy-cases.test.ts. Extracts the fixture machinery
both files share (baseResolvers, the shared node fragments, the
pred/expr/runFixture helpers) into evaluator-indeterminacy-helpers.ts.

Also fixes the one real new-rule violation this uncovered: runFixture
narrowed an indeterminate result's reason via `result as { reason:
IndeterminateReason }`, banned outright by this project's own
no-assertions rule (allowed in *.test.ts files specifically, which
this shared helper module no longer is). Typing Fixture.run's result
as a proper `FixtureRunResult` discriminated union, rather than the
looser `{ status: string }` it replaces, lets runFixture narrow
result.reason directly with no assertion needed.
…y logic into dedicated modules

evaluator.ts had grown to 1564 lines of real code, over the new
800-line cap. Splits it into four cohesive pieces along its own
existing seams: evaluator-operations.ts holds the pure, non-recursive
three-valued combination/comparison/arithmetic helpers (combineAnd,
compareValues, applyArithmetic and their siblings); evaluator-budget.ts
holds the per-call resource-limit infrastructure (EvaluationBudget and
its constants); evaluator-collection.ts holds some/every/fold's shared
collection-resolution logic, decoupled from evaluatePredicateInternal
via an injected EvaluatePredicate callback rather than a direct import,
which is what lets it live in its own module without recreating the
circular-import hazard evaluator.ts's own top comment already
documents for its two mutually-recursive core functions;
evaluator-factory.ts holds createEvaluator and the default
evaluatePredicate/evaluateValue pair, since that factory only ever
calls into evaluator.ts and never the reverse. evaluator.ts itself now
holds only evaluatePredicateInternal and evaluateValueInternal, the
one part of the original file that genuinely cannot be split further
without breaking their mutual recursion across a module boundary.

Every caller of createEvaluator/evaluatePredicate/evaluateValue now
imports from evaluator-factory.ts instead of evaluator.ts.
Runs corepack use pnpm@12.4.1 to update the packageManager field and
regenerate the lockfile's packageManagerDependencies entries for the
new engine. lint, typecheck, test (unit/integration/smoke/workers),
and build all still pass unchanged under the new version.
@Mearman
Mearman marked this pull request as ready for review September 14, 2026 09:27
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 14, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
🔒 Security Review Completed 2026-09-14T09:34:23.500384Z 14446a0 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@Mearman
Mearman merged commit f8ea96c into main Sep 14, 2026
14 checks passed
@Mearman
Mearman deleted the chore/bump-exadev-eslint-config branch September 14, 2026 09:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant