Skip to content

Replace ESLint + Prettier with Biome#310

Merged
brianmhunt merged 5 commits intomainfrom
modern-tooling/phase-4-biome
Apr 15, 2026
Merged

Replace ESLint + Prettier with Biome#310
brianmhunt merged 5 commits intomainfrom
modern-tooling/phase-4-biome

Conversation

@brianmhunt
Copy link
Copy Markdown
Member

@brianmhunt brianmhunt commented Apr 15, 2026

Summary

  • Replace ESLint + Prettier with Biome β€” single Rust-native tool for linting + formatting
  • Auto-fix safe lint rules (useArrowFunction, useTemplate, useLiteralKeys, useOptionalChain, useImportType)
  • Turn off unfixable rules to match current ESLint parity
  • Remove ESLint, Prettier, and their configs/deps
  • Update CI workflow and package.json scripts

Plan

See plans/biome.md for full execution plan.

Test plan

  • bunx @biomejs/biome ci . passes (0 errors)
  • bun run build succeeds (all 27 packages)
  • bunx vitest run passes (2679 tests)
  • bunx tsc passes (0 type errors)
  • Verify useArrowFunction auto-fix didn't break KO this-binding callbacks

πŸ€– Generated with Claude Code

Summary by CodeRabbit

  • Chores

    • Migrated from Prettier and ESLint to Biome, a unified Rust-native tool for code formatting and linting.
    • Updated CI pipeline to use Biome for consistency checks.
  • Style

    • Applied consistent code formatting across the codebase, including indentation and quote style normalization.
  • Documentation

    • Updated development guide to reflect new Biome-based workflow and tooling.

Migrated from ESLint + Prettier using `biome migrate` commands.
Rules turned off to match current ESLint config.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings April 15, 2026 17:17
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 15, 2026

Warning

Rate limit exceeded

@brianmhunt has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 34 minutes and 31 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 34 minutes and 31 seconds.

βŒ› How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
βš™οΈ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 84fdad9c-0574-498a-b314-e42db53e16dc

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between f68ef93 and 0ef4f53.

πŸ“’ Files selected for processing (8)
  • biome.json
  • builds/knockout/spec/bindingDependencyBehaviors.js
  • builds/knockout/spec/components/componentBindingBehaviors.js
  • builds/knockout/spec/components/defaultLoaderBehaviors.js
  • builds/knockout/spec/defaultBindings/eventBehaviors.js
  • builds/knockout/spec/defaultBindings/ifnotBehaviors.js
  • plans/biome.md
  • tools/build.ts
πŸ“ Walkthrough

Walkthrough

The pull request migrates the repository's code quality tooling from separate Prettier and ESLint configurations to Biome, a unified Rust-based linter and formatter. This includes removing old configuration files, adding Biome configuration, updating CI workflows, updating documentation, and reformatting the codebase to conform to Biome's style conventions.

Changes

Cohort / File(s) Summary
Tooling Configuration
.github/workflows/lint-and-typecheck.yml, .prettierignore, .prettierrc, biome.json
Replaced Prettier and ESLint CI steps with unified Biome check; removed .prettierignore and .prettierrc files; added new biome.json configuration specifying linting rules, formatter settings (2-space indent, 120-char line width, LF endings), and VCS integration.
Documentation
AGENTS.md
Updated style guide and commit guidance to reference Biome instead of Prettier/ESLint; changed documented scripts from separate lint/format/lint:fix/format:fix to check command with Biome equivalents; narrowed commit guidance to run only lint:fix instead of both format:fix && lint:fix.
Test Helpers
builds/knockout/helpers/mocha-test-helpers.js
Reformatted assertion helper functions into multi-line style with additional parentheses; no logic changes.
Test Suites (Formatting)
builds/knockout/spec/arrayEditDetectionBehaviors.js, builds/knockout/spec/arrayToDomEditDetectionBehaviors.js, builds/knockout/spec/asyncBindingBehaviors.js, builds/knockout/spec/bindingAttributeBehaviors.js, builds/knockout/spec/bindingDependencyBehaviors.js, builds/knockout/spec/bindingGlobalsBehaviors.js, builds/knockout/spec/bindingPreprocessingBehaviors.js, and 20+ additional test files in builds/knockout/spec/**
Bulk reformatting to match Biome style: removed semicolons, converted function() to function (), normalized quote usage (double to single quotes), adjusted indentation and whitespace. Test logic, assertions, and control flow remain functionally equivalent.
Test Suites (Formatting with Logic)
builds/knockout/spec/components/componentBindingBehaviors.js, builds/knockout/spec/components/defaultLoaderBehaviors.js
Reformatted to Biome style; minor control-flow adjustments (e.g., afterEach cleanup call signature simplified) while preserving test semantics.
Test Suites (Formatting plus Functional Changes)
builds/knockout/spec/components/customElementBehaviors.js, builds/knockout/spec/components/loaderRegistryBehaviors.js
Reformatted to Biome style and added new test coverage: customElementBehaviors.js introduces tests for component-name routing via binding provider, data-binding support in custom elements, observable params, and transclusion; loaderRegistryBehaviors.js adds async/sync completion behavior coverage and synchronous loader registry handling.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Poem

🐰 A Biome of Harmony

From Prettier's rules and ESLint's call,
One Rust-born tool now handles all,
Semicolons fade like morning dew,
Biome arrivesβ€”our code shines new! ✨

πŸš₯ Pre-merge checks | βœ… 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
βœ… Passed checks (2 passed)
Check name Status Explanation
Description Check βœ… Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check βœ… Passed The title "Replace ESLint + Prettier with Biome" clearly and concisely summarizes the primary change: migrating from a two-tool linting/formatting setup to a single unified tool.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
πŸ§ͺ Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch modern-tooling/phase-4-biome

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❀️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@brianmhunt
Copy link
Copy Markdown
Member Author

Performance comparison: ESLint + Prettier vs Biome

Benchmark (local, clean tree after worktree cleanup)

Tool Time Command
ESLint 1.06s bunx eslint .
Prettier 1.34s bunx prettier . --check
ESLint + Prettier total 2.4s sequential
Biome check (lint + format) 86ms bunx @biomejs/biome check .

~27x faster.

Rule coverage

ESLint Biome
Rules configured 91 74 migrated directly
Coverage 100% 83% (91% including "inspired" rules)
Not yet in Biome β€” 8 rules (obscure: no-delete-var, no-invalid-regexp, no-octal, etc.)

Auto-fixable improvements Biome finds (not caught by ESLint)

Rule Count Description
useArrowFunction 2,599 function() β†’ () => (safe: skips when this/arguments used)
useTemplate 123 string concat β†’ template literals
useLiteralKeys 68 obj["key"] β†’ obj.key
useOptionalChain 44 a && a.b β†’ a?.b
useImportType 9 type-only import cleanup

CI impact

The Lint & Typecheck workflow currently runs Prettier and ESLint as separate steps. Biome replaces both with a single biome ci . command, reducing CI time and eliminating 4 npm dependencies (eslint, @eslint/js, typescript-eslint, prettier).

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

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

πŸ’‘ Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 993ea2d30c

ℹ️ 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".

If Codex has suggestions, it will comment; otherwise it will react with πŸ‘.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread biome.json Outdated
"vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true },
"files": {
"ignoreUnknown": true,
"includes": ["packages/**", "builds/**", "global.d.ts"]
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Include tooling TypeScript files in Biome scope

files.includes currently limits Biome to packages/**, builds/**, and global.d.ts, which drops tracked TS files like tools/build.ts, tools/template/index.ts, and vitest.config.ts from linting/formatting. In the current setup, ESLint only ignores JS and builds/**/* (eslint.config.js), so these tooling files are still checked today; after migrating scripts to biome ci ., this config silently reduces lint coverage and can let regressions in build/test tooling slip through.

Useful? React with πŸ‘Β / πŸ‘Ž.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Introduces Biome configuration and a migration plan intended to replace the repo’s current ESLint + Prettier tooling with a single lint/format tool.

Changes:

  • Add a Biome configuration (biome.json) for formatting, linting rules, and import organization.
  • Add a step-by-step migration plan document (plans/biome.md) describing the intended rollout and parity goals.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

File Description
plans/biome.md Documents the intended migration steps and parity targets for switching to Biome.
biome.json Defines Biome formatter/linter settings and rule overrides for the repo.

Comment thread biome.json
Comment on lines +4 to +7
"files": {
"ignoreUnknown": true,
"includes": ["packages/**", "builds/**", "global.d.ts"]
},
Copy link

Copilot AI Apr 15, 2026

Choose a reason for hiding this comment

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

files.includes restricts Biome to only packages/**, builds/**, and global.d.ts, which is a narrower scope than the current prettier . / eslint . scripts (e.g., it would exclude tools/build.ts and root config .ts files). If the goal is a full ESLint+Prettier replacement, expand this include list (or remove it) so biome format/biome ci covers the same files as today.

Copilot uses AI. Check for mistakes.
Comment thread biome.json
Comment on lines +18 to +23
"rules": {
"recommended": true,
"complexity": {
"noUselessEscapeInRegex": "off"
},
"correctness": {
Copy link

Copilot AI Apr 15, 2026

Choose a reason for hiding this comment

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

The plan/PR description calls out turning off several unfixable rules for parity (e.g. noArguments, noImplicitAnyLet, noUnusedFunctionParameters, noGlobalEval, noNonNullAssertion, noThisInStatic), but they are not disabled in this linter.rules config. If those rules are enabled by recommended: true, biome ci will still fail/noise; please add explicit "off" entries (or update the plan if it’s outdated).

Copilot uses AI. Check for mistakes.
Comment thread plans/biome.md Outdated
Comment on lines +15 to +20
## What gets deleted

- `eslint.config.js`
- `.prettierrc`
- `.prettierignore`
- `eslint`, `@eslint/js`, `typescript-eslint`, `prettier` from devDependencies
Copy link

Copilot AI Apr 15, 2026

Choose a reason for hiding this comment

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

This plan (and the PR description) says ESLint/Prettier configs and deps will be deleted/removed, but in the current branch those files still exist at repo root (eslint.config.js, .prettierrc, .prettierignore) and scripts still reference Prettier/ESLint. Either include those removals/updates in this PR (as described), or adjust the plan/PR description to match what’s actually being delivered.

Copilot uses AI. Check for mistakes.
Comment thread builds/knockout/spec/components/componentBindingBehaviors.js Fixed
@phillipc
Copy link
Copy Markdown
Member

phillipc commented Apr 15, 2026

@brianmhunt: Have we lost the Firefox test run?

(Update: Found, perfect)

try {
applyBindings({}, testNode)
} catch (ex) {
} catch (_ex) {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Which rule is it? Any-type starts with underscore? It seems strange.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@brianmhunt There are a lot of changes of this kind. I can understand that with class variables. But here, or with local const variables not. Can you explain it?

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.

This is Biome's noUnusedFunctionParameters rule. When a function parameter isn't used, Biome's auto-fix prefixes it with _ to signal it's intentionally ignored (same convention as TypeScript's noUnusedParameters).

On second thought, these _ prefixes add noise on a legacy codebase. We've changed the approach: noUnusedFunctionParameters is now set to warn (not auto-fixed), so these won't be modified. The current diff should only contain pure formatting changes (matching the existing Prettier config) plus 5 targeted fixes (explicit getter returns, annotated switch fallthroughs).

Brian M Hunt and others added 2 commits April 15, 2026 13:57
Format all files with Biome (matches Prettier settings). Safe auto-fixes
applied by `biome check --fix`: unused imports removed, unused variables
prefixed, getter returns made explicit, switch fallthroughs annotated.

Skipped unsafe fixes (useLiteralKeys, useOptionalChain, useTemplate) as
they surface latent type errors when converting bracket to dot notation.
Disabled organizeImports (reorders break TS inference in some files).

All 2679 tests pass, tsc 0 errors.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Single Rust-native tool for linting + formatting (27x faster).
Migrated config matches Prettier style + ESLint rules.

New rules enabled: noUnusedImports, noUnusedVariables,
noUnusedFunctionParameters (warn), noRedeclare,
noFallthroughSwitchClause, useGetterReturn (error).

Removed: eslint, @eslint/js, typescript-eslint, prettier, globals
Added: @biomejs/biome
CI: single `biome ci .` replaces Prettier + ESLint steps

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@brianmhunt brianmhunt force-pushed the modern-tooling/phase-4-biome branch from 904395c to f68ef93 Compare April 15, 2026 17:58
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

πŸ€– Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@builds/knockout/spec/bindingDependencyBehaviors.js`:
- Around line 568-569: Fix the typo in the inline comment above the vm call:
change "ch ange view model to new object" to "change view model to new object"
(the comment immediately preceding the vm({ obj1: { prop1: 'Second view ' },
prop2: 'model' }) invocation).

In `@builds/knockout/spec/components/defaultLoaderBehaviors.js`:
- Around line 14-15: Remove the unused second argument from the two unregister
calls: locate the ko.components.unregister calls referencing testComponentName
and 'nonexistent-component' and change them to the single-argument form (call
ko.components.unregister with only the component name) so they match the rest of
the file.

In `@builds/knockout/spec/defaultBindings/eventBehaviors.js`:
- Line 38: The test fixture assigns HTML to testNode.innerHTML with a mismatched
closing tag (opens <a> but closes </button>); update the string in the
assignment to use a matching closing tag (change the closing tag to </a>) so the
element markup is consistent and the test becomes deterministic. Refer to the
testNode.innerHTML assignment in eventBehaviors.js to locate and correct the
closing tag.

In `@builds/knockout/spec/defaultBindings/ifnotBehaviors.js`:
- Line 4: Update the test title strings to fix spelling and improve clarity:
change "truey" to "truthy" in the it() description "Should remove descendant
nodes from the document (and not bind them) if the value is truey" and replace
"bindedness" with a correct term such as "binding" or "boundness" in the other
it() description that uses "bindedness" (around line 42) so both test names read
clearly and correctly.
πŸͺ„ Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
βš™οΈ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: fde9a392-9b04-4aa7-8921-ba3c728e58e3

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 203236f and f68ef93.

β›” Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
πŸ“’ Files selected for processing (144)
  • .github/workflows/lint-and-typecheck.yml
  • .prettierignore
  • .prettierrc
  • AGENTS.md
  • biome.json
  • builds/knockout/helpers/mocha-test-helpers.js
  • builds/knockout/spec/arrayEditDetectionBehaviors.js
  • builds/knockout/spec/arrayToDomEditDetectionBehaviors.js
  • builds/knockout/spec/asyncBehaviors.js
  • builds/knockout/spec/asyncBindingBehaviors.js
  • builds/knockout/spec/bindingAttributeBehaviors.js
  • builds/knockout/spec/bindingDependencyBehaviors.js
  • builds/knockout/spec/bindingGlobalsBehaviors.js
  • builds/knockout/spec/bindingPreprocessingBehaviors.js
  • builds/knockout/spec/components/componentBindingBehaviors.js
  • builds/knockout/spec/components/customElementBehaviors.js
  • builds/knockout/spec/components/defaultLoaderBehaviors.js
  • builds/knockout/spec/components/loaderRegistryBehaviors.js
  • builds/knockout/spec/crossWindowBehaviors.js
  • builds/knockout/spec/defaultBindings/attrBehaviors.js
  • builds/knockout/spec/defaultBindings/checkedBehaviors.js
  • builds/knockout/spec/defaultBindings/clickBehaviors.js
  • builds/knockout/spec/defaultBindings/cssBehaviors.js
  • builds/knockout/spec/defaultBindings/enableDisableBehaviors.js
  • builds/knockout/spec/defaultBindings/eventBehaviors.js
  • builds/knockout/spec/defaultBindings/foreachBehaviors.js
  • builds/knockout/spec/defaultBindings/hasfocusBehaviors.js
  • builds/knockout/spec/defaultBindings/htmlBehaviors.js
  • builds/knockout/spec/defaultBindings/ifBehaviors.js
  • builds/knockout/spec/defaultBindings/ifnotBehaviors.js
  • builds/knockout/spec/defaultBindings/letBehaviors.js
  • builds/knockout/spec/defaultBindings/optionsBehaviors.js
  • builds/knockout/spec/defaultBindings/selectedOptionsBehaviors.js
  • builds/knockout/spec/defaultBindings/styleBehaviors.js
  • builds/knockout/spec/defaultBindings/submitBehaviors.js
  • builds/knockout/spec/defaultBindings/textBehaviors.js
  • builds/knockout/spec/defaultBindings/textInputBehaviors.js
  • builds/knockout/spec/defaultBindings/uniqueNameBehaviors.js
  • builds/knockout/spec/defaultBindings/usingBehaviors.js
  • builds/knockout/spec/defaultBindings/valueBehaviors.js
  • builds/knockout/spec/defaultBindings/visibleHiddenBehaviors.js
  • builds/knockout/spec/defaultBindings/withBehaviors.js
  • builds/knockout/spec/dependentObservableBehaviors.js
  • builds/knockout/spec/dependentObservableDomBehaviors.js
  • builds/knockout/spec/domNodeDisposalBehaviors.js
  • builds/knockout/spec/expressionRewritingBehaviors.js
  • builds/knockout/spec/extenderBehaviors.js
  • builds/knockout/spec/mappingHelperBehaviors.js
  • builds/knockout/spec/memoizationBehaviors.js
  • builds/knockout/spec/nativeTemplateEngineBehaviors.js
  • builds/knockout/spec/nodePreprocessingBehaviors.js
  • builds/knockout/spec/observableArrayBehaviors.js
  • builds/knockout/spec/observableArrayChangeTrackingBehaviors.js
  • builds/knockout/spec/observableBehaviors.js
  • builds/knockout/spec/observableUtilsBehaviors.js
  • builds/knockout/spec/onErrorBehaviors.js
  • builds/knockout/spec/parseHtmlFragment.js
  • builds/knockout/spec/pureComputedBehaviors.js
  • builds/knockout/spec/subscribableBehaviors.js
  • builds/knockout/spec/taskBehaviors.js
  • builds/knockout/spec/templatingBehaviors.js
  • builds/knockout/spec/utilsBehaviors.js
  • builds/knockout/spec/utilsDomBehaviors.js
  • builds/knockout/src/index.ts
  • builds/reference/index.ts
  • builds/reference/spec/bindingGlobalsBehavior.js
  • builds/reference/spec/iifeBehavior.js
  • builds/reference/src/index.ts
  • eslint.config.js
  • package.json
  • packages/bind/spec/bindingAttributeBehaviors.ts
  • packages/bind/spec/bindingCompletionPromiseBehavior.ts
  • packages/bind/src/applyBindings.ts
  • packages/bind/src/bindingContext.ts
  • packages/bind/verified-behaviors.json
  • packages/binding.component/spec/componentBindingBehaviors.ts
  • packages/binding.component/src/slotBinding.ts
  • packages/binding.component/verified-behaviors.json
  • packages/binding.core/spec/attrBehaviors.ts
  • packages/binding.core/spec/checkedBehaviors.ts
  • packages/binding.core/spec/descendantsCompleteBehaviors.ts
  • packages/binding.core/spec/textInputBehaviors.ts
  • packages/binding.core/spec/usingBehaviors.ts
  • packages/binding.core/spec/valueBehaviors.ts
  • packages/binding.core/src/options.ts
  • packages/binding.core/src/value.ts
  • packages/binding.core/verified-behaviors.json
  • packages/binding.foreach/spec/eachBehavior.ts
  • packages/binding.foreach/src/foreach.ts
  • packages/binding.foreach/verified-behaviors.json
  • packages/binding.if/spec/elseBehaviors.ts
  • packages/binding.if/spec/withBehaviors.ts
  • packages/binding.if/verified-behaviors.json
  • packages/binding.template/spec/foreachBehaviors.ts
  • packages/binding.template/spec/nativeTemplateEngineBehaviors.ts
  • packages/binding.template/spec/templatingBehaviors.ts
  • packages/binding.template/src/nativeTemplateEngine.ts
  • packages/binding.template/src/templateSources.ts
  • packages/binding.template/src/templating.ts
  • packages/binding.template/verified-behaviors.json
  • packages/builder/verified-behaviors.json
  • packages/computed/src/computed.ts
  • packages/computed/src/throttleExtender.ts
  • packages/computed/verified-behaviors.json
  • packages/filter.punches/verified-behaviors.json
  • packages/lifecycle/spec/LifeCycleBehaviors.ts
  • packages/lifecycle/src/LifeCycle.ts
  • packages/lifecycle/verified-behaviors.json
  • packages/observable/spec/mappingHelperBehaviors.ts
  • packages/observable/src/mappingHelpers.ts
  • packages/observable/src/observable.ts
  • packages/observable/src/observableArray.changeTracking.ts
  • packages/observable/verified-behaviors.json
  • packages/provider.attr/verified-behaviors.json
  • packages/provider.bindingstring/verified-behaviors.json
  • packages/provider.component/spec/customElementBehaviors.ts
  • packages/provider.component/verified-behaviors.json
  • packages/provider.databind/spec/dataBindProviderBehaviors.ts
  • packages/provider.databind/verified-behaviors.json
  • packages/provider.multi/verified-behaviors.json
  • packages/provider.mustache/spec/attributeInterpolationSpec.ts
  • packages/provider.mustache/verified-behaviors.json
  • packages/provider.native/verified-behaviors.json
  • packages/provider.virtual/verified-behaviors.json
  • packages/provider/spec/providerBehaviors.ts
  • packages/provider/verified-behaviors.json
  • packages/utils.component/src/ComponentABC.ts
  • packages/utils.component/verified-behaviors.json
  • packages/utils.functionrewrite/verified-behaviors.json
  • packages/utils.jsx/verified-behaviors.json
  • packages/utils.parser/spec/parserBehaviors.ts
  • packages/utils.parser/spec/preparserBehavior.ts
  • packages/utils.parser/src/Identifier.ts
  • packages/utils.parser/src/Node.ts
  • packages/utils.parser/src/Parser.ts
  • packages/utils.parser/verified-behaviors.json
  • packages/utils/spec/memoizationBehaviors.ts
  • packages/utils/src/dom/fixes.ts
  • packages/utils/src/dom/virtualElements.ts
  • packages/utils/src/options.ts
  • packages/utils/src/tasks.ts
  • packages/utils/verified-behaviors.json
  • plans/biome.md
  • plans/modern-tooling.md
πŸ’€ Files with no reviewable changes (2)
  • .prettierignore
  • .prettierrc

Comment thread builds/knockout/spec/bindingDependencyBehaviors.js Outdated
Comment thread builds/knockout/spec/components/defaultLoaderBehaviors.js Outdated
Comment thread builds/knockout/spec/defaultBindings/eventBehaviors.js Outdated
ko.applyBindings({ someItem: null, condition: true }, testNode);
expect(testNode.childNodes[0].childNodes.length).to.deep.equal(0);
});
it('Should remove descendant nodes from the document (and not bind them) if the value is truey', function () {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟑 Minor

Fix typos in test names for clarity.

Line 4 uses truey and Line 42 uses bindedness; these read as spelling errors and make test output noisier to scan.

Also applies to: 42-42

πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@builds/knockout/spec/defaultBindings/ifnotBehaviors.js` at line 4, Update the
test title strings to fix spelling and improve clarity: change "truey" to
"truthy" in the it() description "Should remove descendant nodes from the
document (and not bind them) if the value is truey" and replace "bindedness"
with a correct term such as "binding" or "boundness" in the other it()
description that uses "bindedness" (around line 42) so both test names read
clearly and correctly.

Brian M Hunt and others added 2 commits April 15, 2026 14:11
- Expand files.includes to cover tools/ and vitest.config.ts
- Fix mismatched HTML tag in eventBehaviors (<a>...</button> β†’ </a>)
- Fix typo "ch ange" β†’ "change" in bindingDependencyBehaviors
- Fix typo "truey" β†’ "truthy" in ifnotBehaviors
- Remove unused requireCallbacks variable
- Remove unused second arg in unregister calls

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Document what was skipped and why (unsafe fixes break tsc,
organizeImports breaks TS inference, useArrowFunction breaks
KO this-binding).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@brianmhunt
Copy link
Copy Markdown
Member Author

Safety review

Three independent adversarial reviews were run against this PR. Summary:

Formatting changes (safe)

The bulk of the 135-file diff is pure formatting matching the existing Prettier config:

  • Semicollon removal (Biome correctly inserts ; prefix for ASI protection where needed)
  • Single-quote style ("foo" β†’ 'foo")
  • Line wrapping / operator placement
  • Trailing comma removal (4 instances, no behavioral effect)

Semantic changes (all verified safe)

Beyond the 5 originally disclosed fixes, the adversarial review found additional semantic changes applied by biome check --fix:

Change Files Why safe
return β†’ return undefined in getters 2 Explicit; bare return already returns undefined
biome-ignore for intentional switch fallthrough 2 Comment-only, no code change
biome-ignore for intentional this alias 1 Comment-only, no code change
this-alias elimination (var node = this β†’ direct this) 2 (Node.ts, computed.ts) Variable immediately shadowed this; identical behavior
import β†’ import type 9 Type-only imports already erased at compile time; tsc passes
'use strict' removal 2 ES modules are implicitly strict; no behavior change
new RegExp('') β†’ /(?:)/ 1 Identical regex
= undefined initializer removal 1 Uninitialized let is undefined by default
Extra parens in while condition 1 ((expr, cond)) β€” no-op grouping

Config parity

All Prettier formatting options are replicated. All ESLint rules that were enforced remain enforced. Three intentionally stricter additions: noUnusedVariables, noUnusedImports, noUnusedFunctionParameters (warn, not error β€” won't fail CI).

File scope is equal or wider (now includes tools/**, builds/**).

Verification

  • bunx @biomejs/biome ci . β€” 0 errors
  • bunx tsc β€” 0 type errors
  • bunx vitest run β€” 2679 passed, 42 skipped, 0 failed
  • bun run build β€” all 27 packages build

@brianmhunt brianmhunt merged commit 9e24cd9 into main Apr 15, 2026
5 checks passed
@brianmhunt brianmhunt deleted the modern-tooling/phase-4-biome branch April 15, 2026 19:12
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.

3 participants