Skip to content

Adopt Biome lint rules#2926

Merged
schani merged 69 commits into
masterfrom
biome-lint-adoption
Jul 13, 2026
Merged

Adopt Biome lint rules#2926
schani merged 69 commits into
masterfrom
biome-lint-adoption

Conversation

@schani

@schani schani commented Jul 13, 2026

Copy link
Copy Markdown
Member

Adopt Biome lint rules

This PR turns Biome's linter on for real, on top of the formatter-only setup from #2923, and adopts rules deliberately:

  1. First commit enables the linter with the recommended preset. Of the 218 recommended rules, 30 reported diagnostics on the codebase; those were temporarily set to "off" so the commit lands with lint green and zero code changes.
  2. One commit per rule then re-enables each of those 30 and fixes all of its violations — except three that misfit the codebase (see the rejected table).
  3. The non-recommended rules of Biome 2.5 were then evaluated group by group (correctness, complexity, performance, security, style, suspicious): 29 more rules were adopted with fixes, and 27 already-clean guard rules were enabled in per-group batches. The nursery group was skipped as unstable, and a11y plus the framework-specific rules (React/Vue/Qwik/Solid/Next/DOM/CSS/GraphQL) don't apply to this library/CLI.

Every commit keeps npm run lint, npm run build, and the Vitest unit suite green. Lint fixes are behavior-preserving; where a fix would have been risky or wrong, a targeted biome-ignore suppression with a real explanation (or a scoped config override) is used instead. Notably, noUndeclaredDependencies caught a genuine issue: the CLI imported wordwrap without declaring it, relying on hoisting from quicktype-core — it is now a declared dependency.

Result: 270 rules active (215 recommended + 55 opted-in), 3 recommended rules off, 3 scoped overrides.

Adopted rules (with violations fixed)

Recommended preset (re-enabled one by one)

Rule Violations fixed Notes
correctness/noUnusedImports 1 unused lodash import
correctness/noUnusedVariables 5 unused catch bindings → optional catch
correctness/useParseIntRadix 3 single-char parses, radix 10
correctness/noSwitchDeclarations 20 case blocks scoped
complexity/noBannedTypes 13 {}Record<string, never>
complexity/noExtraBooleanCast 2 redundant !!
complexity/noUselessConstructor 7 super-forwarding constructors removed
complexity/noUselessContinue 1
complexity/noUselessSwitchCase 1 case adjacent to identical default
complexity/noUselessTernary 1 x ? false : true!x
complexity/noUselessUndefinedInitialization 24 = undefined initializers
complexity/useDateNow 2 +new Date()Date.now()
complexity/useOptionalChain 1
style/noNonNullAssertion 2 replaced ! with narrowing via destructured consts
style/useConst 1
style/useExponentiationOperator 6 Math.pow**
style/useNodejsImportProtocol 6 node: prefix; quicktype-core exempted via override (its browser field only remaps bare specifiers — enforced by core-package.test.ts)
style/useTemplate 40 concatenation → template literals, escapes hand-verified
suspicious/noExplicitAny 25 6 became unknown; deliberate anys (heterogeneous maps, vendored get-stream, untyped tree-sitter) suppressed with reasons
suspicious/noGlobalIsNan 6 all call sites already number-typed
suspicious/noImplicitAnyLet 3 explicit annotations
suspicious/noPrototypeBuiltins 2 already-safe .call sites suppressed; Object.hasOwn unavailable under core's es6 lib
suspicious/noShadowRestrictedNames 2 toString param renamed; collection-utils hasOwnProperty import suppressed
suspicious/noTsIgnore 1 @ts-expect-error with explanation
suspicious/noUselessEscapeInString 7 \" in template literals
suspicious/useIsArray 1 instanceof ArrayArray.isArray
suspicious/useIterableCallbackReturn 19 forEach expression arrows → statement bodies

Non-recommended rules (opted in, violations fixed)

Rule Violations fixed Notes
correctness/noUndeclaredDependencies 2 real catch: wordwrap now declared for the CLI; vscode host module suppressed
correctness/noGlobalDirnameFilename 1 protects the ESM dual build; CJS test harness suppressed
complexity/noUselessReturn 24 trailing return;
style/useCollapsedElseIf 16 one site hand-collapsed to keep a comment
style/useCollapsedIf 5 one site hand-collapsed to keep a comment
style/useThrowNewError 15 throw Error(...)throw new Error(...)
style/useConsistentBuiltinInstantiation 0 overlapped entirely with useThrowNewError
style/useObjectSpread 17 Object.assign({}, ...) → spread; 3 sites needed type annotations
style/noYodaExpression 7
style/noSubstr 11 substringslice; one site got an explicit guard to preserve edge-case behavior
style/useExplicitLengthCheck 11 one numeric-fallback site suppressed (autofix would have produced a boolean)
style/noMultiAssign 9 chains split
style/useConsistentObjectDefinitions 6 shorthand
style/useForOf 2 replaced eslint-disabled index loops
style/noUnusedTemplateLiteral 2
style/useShorthandAssign 1
style/noInferrableTypes 1
style/useDefaultParameterLast 2 both sites are exported API (DartRenderer's protected dynamic-expression methods), so per review the defaults are kept with targeted suppressions — the rule now only guards new code
style/useConsistentMethodSignatures 2 property-style interface signatures
style/useUnifiedTypeSignatures 1 compose() overloads unified
style/noNamespace 1 obsolete declare namespace Math (fround is in ES2015 lib)
style/useNodeAssertStrict 1 same strict assert object
style/useReadonlyClassProperties 13 type-level only
suspicious/noEqualsToNull 1 value is Type | null, never undefined
suspicious/noUnusedExpressions 2 deliberate satisfies checks suppressed
suspicious/useArraySortCompare 3 string sorts where UTF-16 order is intended, suppressed
suspicious/noMisplacedAssertion 10 script-style test/release-version.ts exempted via override; one test helper suppressed
suspicious/noShadow 29 one real shadow renamed; CJSONRenderer.ts exempted (28 same-named nested emit-lambda params; bulk rename too risky)

Already-clean guard rules enabled (no violations)

correctness: noUnusedInstantiation, useSingleJsDocAsterisk · complexity: noDivRegex, noUselessCatchBinding, noUselessStringConcat, useArrayFind, useWhile, noRedundantDefaultExport, noExcessiveNestedTestSuites · performance: noDelete · style: useThrowOnlyError, useTrimStartEnd, useSymbolDescription, useSpreadOverApply, useNumberNamespace, useGlobalThis, useErrorCause · suspicious: noConstantBinaryExpressions, noVar, noFocusedTests, noSkippedTests, noReturnAssign, noDuplicateTestHooks, noDeprecatedImports, noDuplicateDependencies, useErrorMessage, noEmptySource

Rejected / skipped rules

Recommended rules kept off

Rule Violations Rationale
suspicious/noTemplateCurlyInString 48 quicktype's error messages use ${placeholder} templates in plain strings by design (Messages.ts, substituted at runtime by messageError), and the Kotlin renderers emit Kotlin's own ${} interpolation syntax. The rule flags the codebase's intended core patterns wholesale.
correctness/noVoidTypeReturn 13 rejected in review: the owner prefers return panic(...) in void functions — the return makes the control-flow termination explicit at the call site. Initially adopted, then reverted.
correctness/noConstructorReturn 6 rejected in review, same idiom objection as noVoidTypeReturn: all six violations were return panic(...) in a constructor. Reverting restored the @ts-expect-error on queryType that the fix had made obsolete.

Non-recommended rules not adopted (off by default; rationale)

Rule Violations Rationale
style/noUselessElse 20 rejected in review: the owner prefers explicit else blocks after returning branches over flattened straight-line code. Initially adopted, then reverted; kept explicitly "off".
suspicious/noEmptyBlockStatements 25 empty method bodies are deliberate no-op default hooks throughout the renderer class hierarchy
suspicious/useAwait 7 async methods implement async-by-contract interfaces (Input.addSource etc.) with sync bodies
suspicious/noParametersOnlyUsedInRecursion 5 the fix removes parameters from protected renderer API signatures
suspicious/noUnnecessaryConditions 97 flags defensive checks; high false-positive rate
suspicious/noConsole 71 the CLI writes to the console by design
suspicious/noBitwiseOperators 56 hashing/Markov/Mersenne-Twister code uses bitwise math deliberately
suspicious/noUndeclaredEnvVars CLI/test harness read arbitrary env vars by design
complexity/noVoid 5 void promise deliberately marks fire-and-forget calls
complexity/noImplicitCoercions 11 +str / !!x are deliberate idioms
complexity/noForEach 41 forEach is used pervasively; useIterableCallbackReturn guards actual misuse
complexity/noExcessiveCognitiveComplexity, noExcessiveLinesPerFunction, useMaxParams 105/273/70 arbitrary size thresholds; language renderers are legitimately large
complexity/useSimplifiedLogicExpression 20 its De Morgan rewrites reduce readability
correctness/noUndeclaredVariables, noUnresolvedImports 0/12 redundant with the TypeScript compiler
correctness/useImportExtensions 1189 extension policy is owned by TS NodeNext resolution
correctness/noNodejsModules 38 it's a Node CLI; core's browser-compat is guarded by its own test
performance/noAwaitInLoops 14 sequential awaits are intentional (ordering, IO)
performance/noNamespaceImport, noBarrelFile, noReExportAll 39/31/35 import * and barrel index files are the package structure
performance/useTopLevelRegex 20 hoisting regexes risks shared lastIndex state and hurts locality
security/noSecrets 121 entropy heuristic false-positives on code-generation strings and fixtures
security/noDangerouslySetInnerHtml* DOM/JSX only, N/A
style/noMagicNumbers 1328 absurd churn for a code generator full of structural constants
style/useConsistentMemberAccessibility 949 repo convention is explicit public; the rule's default demands the opposite
style/noTernary, useBlockStatements, noContinue, noNestedTernary, noEnum, noIncrementDecrement, noNegationElse 484/437/46/18/18/97/76 ban or churn idioms the codebase uses deliberately
style/useNamingConvention 424 underscore-prefixed privates and renderer naming clash with the rule
style/useNumericSeparators 195 churn incl. vendored PRNG constants
style/noParameterProperties 154 constructor parameter properties are a core idiom here
style/useDestructuring, useConsistentArrowReturn 99/41 mechanical churn, marginal benefit
style/noParameterAssign 75 parameter normalization (opts defaulting) is deliberate
style/useExportsLast, useFilenamingConvention, noExcessiveLinesPerFile, noExcessiveClassesPerFile 61/47/64/26 structural churn / arbitrary thresholds
style/noProcessEnv, correctness/noProcessGlobal 16/43 CLI and test harness use process/env by design
style/useConsistentArrayType, useConsistentTypeDefinitions 33/10 both forms used deliberately; pure churn
style/useAtIndex 3 .at() is not in quicktype-core's es6 lib
style/noCommonJs 5 build/test scripts legitimately use require
style/noDefaultExport 3 existing default exports are module API
style/noUselessUndefined 109 explicit undefined returns/arguments are used deliberately with strict optional typing
nursery group skipped as unstable
a11y group + React/Vue/Qwik/Solid/Next/GraphQL/CSS rules no DOM/JSX/framework code in this repo

Verification

  • npm run lint exits 0 with zero diagnostics
  • npm run build (all workspaces + CLI) succeeds
  • npm run test:unit — 70/70 Vitest tests pass
  • after every one of the 68 commits, all three of the above were green

🤖 Generated with Claude Code

schani and others added 30 commits July 13, 2026 09:42
Turn on Biome's linter using the recommended rule preset. Of the 218
recommended rules, 30 currently report diagnostics on this codebase;
those 30 are explicitly set to "off" for now so that lint passes with
no code changes, leaving 188 recommended rules active. The disabled
rules will be re-evaluated and either adopted (with violations fixed)
or rejected with rationale in follow-up commits.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: an unused lodash import in the PHP language utils.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Five violations, all unused catch-clause bindings; converted to
optional catch binding (catch without a parameter).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Three violations, all parsing a single character with Number.parseInt;
added an explicit radix of 10, which preserves behavior.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Wrapped switch cases that declare variables in blocks so the
declarations are properly scoped to their case. Safe fixes only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Six violations, all "return panic(...)" statements in the
GQLSchemaFromJSON constructor. Since panic() returns never, dropping
the "return" keyword preserves behavior, and TypeScript's control-flow
analysis now sees the definite assignment of queryType, making the
existing @ts-expect-error directive obsolete.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Thirteen violations, all "return panic(...)", "return messageError(...)"
or "return assertNever(...)" inside void-returning functions. All three
helpers return never, so dropping the "return" keyword preserves
behavior.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: a redundant trailing continue in breakCycles. Safe fix.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: a "java8" case clause that fell through to an adjacent
default clause with the same body.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: "propCount ? false : true" simplified to "!propCount".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two violations: redundant double-negations in boolean conditions in
the test helpers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two violations: "+new Date()" timing code in the test harness replaced
with Date.now().

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: an undefined-check-plus-method-call collapsed into an
optional chain.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Seven violations: constructors that only forwarded their arguments to
super with no other work. Removed them along with the type imports
that only they used.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
24 violations: "let x: T | undefined = undefined" initializers where
the explicit "= undefined" is redundant.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Thirteen violations of the banned "{}" type: eight "properties: {}"
members in the ErrorProperties union and five "getOptions(): {}"
signatures in option-less target languages. All replaced with the
precise Record<string, never> empty-object type.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: a never-reassigned "let" arrow function changed to
"const".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Six violations: Math.pow calls replaced with the ** operator.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Six violations: bare Node.js builtin imports now use the node:
protocol in the VS Code extension and the test harness. quicktype-core
is exempted via a config override because its "browser" package.json
field only remaps bare builtin specifiers ("fs"), not "node:fs" --
an invariant already enforced by test/unit/core-package.test.ts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two violations in the System.Text.Json C# renderer: the transformers
were already guarded against undefined, but the narrowing was lost
inside emitBlock closures. Destructuring them into consts before the
guard preserves the narrowing without assertions, matching the
existing nullTransformer pattern in the same function.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Forty violations: string concatenations converted to template
literals. All conversions are straight stringifications; escapes for
literal ${, backticks, and backslash sequences were verified by hand.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: "sl instanceof Array" replaced with Array.isArray(sl),
which is also correct across realms.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: a @ts-ignore on a type-only import of a build artifact
in test/languages.ts, replaced with @ts-expect-error and an
explanation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Three violations: added explicit type annotations to "let" bindings in
the vendored get-stream helper and the Chance Mersenne Twister port.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two violations, both already using the safe
Object.prototype.hasOwnProperty.call pattern. The suggested
Object.hasOwn is not available under quicktype-core's es6 lib (and
would raise the package's runtime floor), so both sites carry a
targeted suppression instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two violations: a constructor parameter named toString in the C++
utils (renamed to toStringCode), and a hasOwnProperty import from
collection-utils in TransformedStringType.ts, which now carries the
same biome-ignore suppression used at the other import sites of that
name (replacing a stale eslint-disable).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Six violations converted to Number.isNaN. Every call site passes a
value that is already a number (parseInt/parseFloat results, or values
behind a typeof === "number" guard), so dropping the global isNaN
coercion does not change behavior.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Seven violations in test/languages.ts: escaped double quotes inside
template literals, where the backslash is a no-op. The resulting
strings are byte-for-byte identical.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Nineteen violations: forEach callbacks written as expression-bodied
arrows that implicitly returned a value. Converted each to a statement
body; no return values were ever consumed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
25 violations. The six "any" members of the ErrorProperties union in
Messages.ts became "unknown" (the values are only formatted into
messages). The rest are deliberate anys -- heterogeneous attribute
maps, arbitrary JSON containers, vendored get-stream code, untyped
web-tree-sitter modules -- and now carry biome-ignore suppressions
with reasons, replacing the stale eslint-disable comments where those
existed. This also puts the two pre-existing noExplicitAny
suppressions back into effect.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
schani and others added 21 commits July 13, 2026 10:39
Two violations: template literals without interpolation converted to
plain string literals.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: "p = p * cp" changed to "p *= cp".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: a redundant ": boolean" annotation on an initialized
variable removed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two violations in the Dart renderer: a leading "isNullable = false"
default parameter followed by required parameters. A leading default
can never be omitted, and every call site passes the argument
explicitly, so it is now a required boolean parameter. Also drops the
eslint-disable comments that waived the equivalent ESLint rule.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two violations in the multicore test helper: method-style interface
signatures converted to property-style arrow signatures, which also
get strict (non-bivariant) parameter checking.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: the compose() overload pair in the Python renderer
(previously waived with an eslint-disable) collapsed into the single
union-typed signature the implementation already had.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: an ambient "declare namespace Math" in the deepEquals
test helper that added Math.fround for an ancient TypeScript lib.
Math.fround has been in the standard lib since ES2015, so the
declaration is simply removed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: "strict as assert" from node:assert now imports from
node:assert/strict, which is the identical strict assert object.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Thirteen violations: private class properties that are never
reassigned marked readonly. Type-level only; verified by tsc.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: "nullableFromUnion(...) != null" changed to "!== null".
The function returns Type | null (never undefined), so the loose
comparison was equivalent.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two violations, both deliberate compile-time "satisfies" type checks;
suppressed with explanations so the rule can guard against genuinely
dead expressions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Three violations, all default-sorts of string arrays (JSON Schema
required lists and Java imports) where UTF-16 code unit order is the
intended, deterministic order for generated code. Suppressed with
explanations; the rule now guards against comparator-less sorts of
non-string arrays.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ten violations: nine in test/release-version.ts, a script-style test
that runs its node:assert checks at module top level by design (now
exempted via a config override), and one expect() in a test helper
function, suppressed with an explanation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
29 violations: one genuine shadow in JSONSchemaInput (a lambda
parameter named "name" shadowing a function-scoped variable, renamed
to "key"), and 28 in CJSONRenderer.ts, whose deeply nested emit
closures reuse the same parameter names by design; that file is
exempted via a config override because bulk-renaming those parameters
would be high-risk churn.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two violations. A genuine catch: the quicktype CLI imports wordwrap
but only had @types/wordwrap declared, relying on hoisting from
quicktype-core; wordwrap is now a declared dependency (lockfile
updated, no version changes to existing entries). The vscode import in
the extension is provided by the VS Code host at runtime and carries a
suppression.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One violation: __dirname in the CommonJS test harness, suppressed with
an explanation. The rule now protects quicktype-core's dual CJS/ESM
build from accidental __dirname/__filename usage, which would break
the ES module leg.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Enables noUnusedInstantiation and useSingleJsDocAsterisk, which are
already clean on the codebase, to guard against future violations.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Enables noDivRegex, noUselessCatchBinding, noUselessStringConcat,
useArrayFind, useWhile, noRedundantDefaultExport and
noExcessiveNestedTestSuites, all already clean on the codebase.
noUselessCatchBinding also locks in the optional-catch-binding cleanup
done for noUnusedVariables.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Enables noConstantBinaryExpressions, noVar, noFocusedTests,
noSkippedTests, noReturnAssign, noDuplicateTestHooks,
noDeprecatedImports, noDuplicateDependencies, useErrorMessage and
noEmptySource, all already clean on the codebase.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Enables useThrowOnlyError, useTrimStartEnd, useSymbolDescription,
useSpreadOverApply, useNumberNamespace, useGlobalThis and
useErrorCause, all already clean on the codebase.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The delete operator is not used anywhere in the codebase; enabling the
rule keeps it that way.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Comment thread packages/quicktype-core/src/attributes/TypeAttributes.ts
Comment thread packages/quicktype-core/src/input/CompressedJSON.ts Outdated
schani and others added 2 commits July 13, 2026 14:13
The owner prefers explicit else blocks after returning branches; the
flattened straight-line form loses the visual symmetry of the two arms.
Rule set explicitly to "off" to document the deliberate rejection.

Reverts commit e4df2f0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The owner prefers "return panic(...)" over a bare "panic(...)" statement
in void-returning functions: the return makes the control-flow
termination explicit at the call site. Rule set explicitly to "off" to
document the deliberate rejection.

Reverts commit 4509283.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@schani schani left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One API-compatibility issue found.

Comment thread packages/quicktype-core/src/language/Dart/DartRenderer.ts Outdated
schani and others added 3 commits July 13, 2026 15:51
Same idiom objection as noVoidTypeReturn: the owner prefers
"return panic(...)" over a bare "panic(...)" statement. Restores the
@ts-expect-error on queryType that the definite-assignment analysis had
made obsolete. Rule set explicitly to "off" to document the deliberate
rejection.

Reverts commit 279491f.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
DartRenderer is exported from quicktype-core, so fromDynamicExpression
and toDynamicExpression are downstream-subclass API; dropping their
"isNullable = false" defaults was a breaking signature change. Restore
the defaults and suppress useDefaultParameterLast at the two parameters
instead. These were the rule's only two violations, so no other API
surface was affected.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@schani schani merged commit 5dd529c into master Jul 13, 2026
23 checks passed
@schani schani deleted the biome-lint-adoption branch July 13, 2026 20:14
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