Bump @exadev/eslint-config to 2.12.1 - #31
Merged
Merged
Conversation
Moves off the ^2.1.1 range onto an exact version, matching this repo's new saveExact default for @ExaDev packages. Pulls in strictTypeChecked as the config's default export (up from recommendedTypeChecked), the barrel-policy and readonly-safety rule families added since 2.1.x, and the new no-warning-comments/max-lines rules from 2.12.0.
Sets saveExact in pnpm-workspace.yaml (the only location pnpm 11+ reads project settings from) so every future pnpm add records the resolved version rather than a caret range, and adds a matching .npmrc as a fallback for a pnpm 10.x release older than 10.17. The existing @exadev/* minimumReleaseAgeExclude entry already covers @exadev/eslint-config, so no change was needed there.
typescript-eslint's own tseslint.config is deprecated as of the version this repo now pulls in, in favour of the array-flattening helper ESLint core itself now ships. Behaviourally identical here: same nested arrays and spread configs, just built by defineConfig instead of the deprecated wrapper.
…en promise wrapper Replaces promisify(execFile) in git.ts and pnpm.ts with a small, explicitly-typed execFile helper: execFile synchronously returns a ChildProcess in addition to invoking its callback, which the newly enabled strict-void-return rule correctly flags as a value-returning function handed to promisify where a void-returning one is expected, a mismatch tsc itself accepts under its own return-type leniency. Calling execFile directly with our own void callback avoids the mismatch instead of working around it. git.ts's own git() now derives its 100 MiB maxBuffer from a single literal default parameter rather than a multiplied module constant, sanitizeGitEnv() deletes discovery-affecting env keys via Reflect.deleteProperty instead of the dynamic delete operator, and workingTreeChanges() slices a porcelain entry down to its path and checks for emptiness instead of comparing its length against a bare minimum, removing every magic number from the parse. git-workspace-fixture.ts drops its own duplicate promisify(execFile) lockfile regeneration in favour of calling pnpm.ts's regenerateLockfile directly.
semantic-release's own getLastRelease returns {} for a package with
no prior tag, not undefined and not a fully-populated LastRelease,
contradicting the gitHead: string its own type declares. A new
hasGitHead structural guard reads gitHead only when it is genuinely
present, replacing an optional chain and a `?? undefined` that were
provably redundant against the (inaccurate) declared type. The two
inline analyzeCommits/generateNotes plugins now check their upstream
result with typeof rather than a bare truthy check, since both can
return the empty string as a real, meaningful value distinct from
false/undefined. Also renames the deprecated NodeRequire type to
NodeJS.Require, converts DependencyBumpSource.bumpsFor to a property
signature per this config's method-signature-style rule, and escapes
scoped package names in two doc comments so they don't parse as
inline JSDoc tags.
version, gitTag, and type were three independently-optional fields that every one of the four sites building a PackageReleaseOutcome actually set together or not at all, tied to whether the package released. Splitting the type into a released: true branch (where all three are required strings) and a released: false branch (where none are present) lets a caller that has already checked pkg.released read gitTag/type as plain strings, and turns every constructor into an explicit branch on the same condition instead of three parallel optional-chained assignments. Also stringifies the numeric counts interpolated into several log and error template literals, wraps four logger callbacks that previously returned shared.log's own return value in a block body so they return void as their callers expect, and escapes scoped package names in a few doc comments so they don't parse as inline JSDoc tags.
restrict-template-expressions no longer allows a bare number in a template literal. Both are simple .length counts, so String() is a plain, behaviour-preserving wrap. Also widens collectRepeated's previous parameter to readonly string[], since it only ever reads it.
…s array validate-npm-package-name's own overloaded return type guarantees errors: string[] (not optional) once validForOldPackages is false, so the ?? [] fallback could never actually run; TypeScript's own narrowing already proves this once the guard above it is in scope.
@ExaDev, @semantic-release, and @types read as inline JSDoc/TSDoc tags to the new doc-comment quality rules this bump enables. Backtick-wrapping each name as an identifier resolves both, and reads no differently.
Each callback's body is a bare return of rm(...), a promise-returning call, which promise-function-async now requires the callback itself to be declared async for.
…tions Every fixture-backed test's third-argument timeout (240_000, 60_000, or 20_000ms) was a bare literal repeated across four files, which the newly enabled no-magic-numbers rule flags wherever it appears, including a well-named module constant: the shared config exempts enum members from that rule but not const declarations. A new TestTimeoutMs enum in test-timeouts.ts replaces every one of those literals with a named tier (Long/Medium/Short) shared across the suite instead of redeclaring it per file. A handful of assertions also hardcoded a package or commit count that was really a property of the fixture array already in scope (chainPackages.length, or a newly-named cyclePackages.length + 1 for createWorkspaceFixture's own "one scaffold commit plus one per package" invariant) -- deriving it from that array instead of a literal removes the magic number and keeps the assertion correct if the fixture ever grows.
Run via `corepack use pnpm@12.4.1`, which also regenerates the lockfile for the new engine: pnpm 12 records its own executable as a packageManagerDependency in a new leading YAML document ahead of the existing workspace lockfile, rather than changing that document's own shape. install (plain and --frozen-lockfile), lint, typecheck, test, and build all pass unchanged under the new engine.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
🎉 This PR is included in version 1.3.6 🎉 The release is available on: Your semantic-release bot 📦🚀 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps
@exadev/eslint-configfrom^2.1.1to the exact2.12.1, and picks up everything else this repo's own dependency-hygiene conventions call for while touching it.What's in here
@exadev/eslint-configpinned to the exact2.12.1(was a caret range).saveExact/minimumReleaseAgeExcludesettings inpnpm-workspace.yaml(the location pnpm 11+ actually reads) plus a.npmrcfallback for pre-10.17 pnpm 10.x. The existing@exadev/*exclude entry already covered@exadev/eslint-config, so nothing needed adding there.packageManagerbumped frompnpm@11.6.0to the exactpnpm@12.4.1, viacorepack use, as its own commit.Fallout from the version jump
This repo's old
^2.1.1pin predated several breaking-in-practice changes upstream: the config's default export switched fromrecommendedTypeCheckedtostrictTypeChecked(2.7.0), a JSDoc/TSDoc quality pass was added (2.11.0), and the two rules the task specifically called out (no-warning-commentsfor Stryker suppression comments,max-lines) landed in 2.12.0. Neither of the two headline rules actually fired here (no Stryker comments, no file over 800 lines), but thestrictTypeCheckedswitch alone surfaced real violations that needed fixing at the root, not suppressing:PackageReleaseOutcome'sversion/gitTag/typefields were three independently-optional fields that every producer set together or not at all — now a properreleased-discriminated union.promisify(execFile)ingit.ts/pnpm.tstrippedstrict-void-return(execFile synchronously returns aChildProcess, whichtsctolerates but the stricter rule doesn't); replaced with a small hand-written promise wrapper.lastReleaseshape from semantic-release's own types, a handful of scoped-package-name doc comments parsing as JSDoc tags, and a few other strict-mode violations.Each is its own commit with a description of the actual code change. Everything is a real fix, not a suppression — no
eslint-disable, no downgraded dependency, no file-level ignore.Verification
lint,typecheck,test(94 tests), andbuildall pass, both before and after thepnpm@12.4.1bump (also re-verifiedpnpm install --frozen-lockfileunder the new engine).