Skip to content

feat: switch from biome to oxc fmt, oxc lint#125

Merged
nikilok merged 5 commits into
mainfrom
feat/oxc
May 22, 2026
Merged

feat: switch from biome to oxc fmt, oxc lint#125
nikilok merged 5 commits into
mainfrom
feat/oxc

Conversation

@nikilok
Copy link
Copy Markdown
Owner

@nikilok nikilok commented May 22, 2026

Summary by CodeRabbit

Release Notes

  • Chores
    • Migrated code quality tooling from Biome to OXlint for linting and oxfmt for formatting.
    • Updated VS Code workspace settings to use OXC formatter by default.
    • Updated package scripts and CI workflows to use new linting tools.
    • Standardized code formatting including quote styles and import organization across the codebase.

Review Change Stack

@vercel
Copy link
Copy Markdown

vercel Bot commented May 22, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
learn-tanstack-start Ready Ready Preview, Comment May 22, 2026 10:28pm

Request Review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 22, 2026

Warning

Rate limit exceeded

@nikilok has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 20 minutes and 1 second before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 9e0de064-a031-4040-be22-12c710788bb0

📥 Commits

Reviewing files that changed from the base of the PR and between 57f7e5f and 3eed92f.

📒 Files selected for processing (18)
  • .github/workflows/ci.yaml
  • .oxfmtrc.json
  • apps/ch-stream/biome.json
  • apps/web/biome.json
  • apps/web/src/components/Footer.tsx
  • apps/web/src/components/Header.tsx
  • apps/web/src/components/HmrcCard.tsx
  • apps/web/src/components/HmrcResults.tsx
  • apps/web/src/components/NavigationProgress.tsx
  • apps/web/src/components/SearchInput.tsx
  • apps/web/src/components/SkeletonCards.tsx
  • apps/web/src/components/StatusBadge.tsx
  • apps/web/src/components/Tooltip.tsx
  • apps/web/src/routes/__root.tsx
  • apps/web/src/routes/company.$id.$slug.tsx
  • apps/web/src/routes/index.tsx
  • apps/web/src/routes/privacy.tsx
  • packages/db/biome.json
📝 Walkthrough

Walkthrough

This PR migrates the project's linting and formatting tooling from Biome to OXC (oxlint/oxfmt). It introduces new OXC configuration files, removes Biome configuration, updates all package.json scripts across workspaces, replaces linting suppression comments, adds missing imports for existing features, and normalizes code formatting throughout the codebase to match OXC style rules.

Changes

Biome to OXC Tooling Migration

Layer / File(s) Summary
OXC configuration and VS Code settings
.oxfmtrc.json, .oxlintrc.json, .vscode/settings.json
OXC formatter and linter configurations are introduced with schema references, plugin enablement, and formatting options; VS Code is configured to use OXC as the default formatter with code actions enabled on save.
Root package dependencies and format scripts
package.json
Biome dependency is removed and replaced with oxfmt and oxlint; new format and format:check scripts using oxfmt are added to the root scripts section.
Lint scripts across apps and packages
apps/web/package.json, apps/ch-stream/package.json, packages/db/package.json
All npm linting commands are updated from biome check to oxlint, and the packages/db exports block is reordered before the scripts block.
Lint suppressions: biome\-ignore to oxlint\-disable
apps/web/src/components/SearchBar.tsx, apps/web/src/components/SearchInput.tsx, apps/web/src/components/SkeletonCards.tsx, apps/web/src/routes/__root.tsx
All biome-ignore comments are replaced with oxlint-disable-next-line or file-level oxlint-disable directives for the same rules.
Add missing imports for existing features
apps/web/src/components/Footer.tsx, apps/web/src/components/McpTools.tsx
Suspense import is added to Footer for its existing Suspense boundary, and @mcp-b/global import is added to McpTools for MCP browser API registration.
Processor and schema updates
apps/ch-stream/src/processor.ts, packages/db/src/schema.ts
companiesHouseProfileTrails is added to processor imports for profile-trail insertion; sicCodes column definition is reformatted to multi-line chained style.
Quote and whitespace normalization across codebase
.coderabbit.yaml, .deepsec/*, .github/actions/*, .github/workflows/*, apps/web/src/**/*, apps/web/server/**/*, apps/web/src/fonts.css, apps/web/src/styles.css, apps/web/src/transitions.css
Single quotes are standardized throughout configuration, CSS, and workflow files; blank lines are normalized in import sections across TypeScript/TSX files; CSS shadow and selector formatting is adjusted for consistency.
Documentation and tooling references
apps/web/README.md
README is updated to document oxlint/oxfmt as the project's linting and formatting tooling, and developer scripts for lint, lint:fix, format, and format:check are documented.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • nikilok/learn-tanstack-start#122: Reformats apps/web/src/transitions.css Safari view-transition selectors and aligns with Biome→OXC tooling migration context.
  • nikilok/learn-tanstack-start#85: Implements Phase 5 sweep feature that is directly referenced in this PR's GitHub Action workflow and composite action formatting updates.
  • nikilok/learn-tanstack-start#45: Introduces the "last update view" feature that the Footer.tsx Suspense import addition in this PR supports.

Poem

🐰 Biome has run its course, dear friends,
OXC takes the linting reins once more.
From config files to blessed component imports,
We format single-quoted, whitespace-restored.
The tools have shifted—now let the code align!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title 'feat: switch from biome to oxc fmt, oxc lint' directly and clearly summarizes the main change: replacing Biome linting/formatting tools with Oxc-based alternatives (oxfmt and oxlint).
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ 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 feat/oxc

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.

Copy link
Copy Markdown

@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.

🧹 Nitpick comments (1)
apps/web/src/components/SearchInput.tsx (1)

1-1: ⚡ Quick win

Narrow the exhaustive-deps suppression scope.

Disabling react-hooks/exhaustive-deps at file scope can mask future dependency regressions in unrelated hooks. Prefer per-hook oxlint-disable-next-line comments only where needed.

Suggested minimal change
-/* oxlint-disable react-hooks/exhaustive-deps -- inputRef is a stable RefObject prop; exhaustive-deps reports stable refs as missing deps in oxlint */
+// Keep rule enabled globally; suppress only on specific hook lines where dependency omission is intentional.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/components/SearchInput.tsx` at line 1, The file-scoped oxlint
suppression disables react-hooks/exhaustive-deps for the whole SearchInput.tsx
and should be narrowed: remove the top-of-file comment and instead add targeted
per-hook suppressions (e.g., add // oxlint-disable-next-line
react-hooks/exhaustive-deps immediately above the specific
useEffect/useLayoutEffect inside the SearchInput component that intentionally
omits inputRef from its dependency array). Keep references to the stable
RefObject prop inputRef in those per-hook comments so other hooks in SearchInput
remain lint-checked.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@apps/web/src/components/SearchInput.tsx`:
- Line 1: The file-scoped oxlint suppression disables
react-hooks/exhaustive-deps for the whole SearchInput.tsx and should be
narrowed: remove the top-of-file comment and instead add targeted per-hook
suppressions (e.g., add // oxlint-disable-next-line react-hooks/exhaustive-deps
immediately above the specific useEffect/useLayoutEffect inside the SearchInput
component that intentionally omits inputRef from its dependency array). Keep
references to the stable RefObject prop inputRef in those per-hook comments so
other hooks in SearchInput remain lint-checked.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 4b5678c3-eb47-44a0-beb1-7a4b4e78f5dc

📥 Commits

Reviewing files that changed from the base of the PR and between 9d449d6 and 57f7e5f.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (70)
  • .coderabbit.yaml
  • .deepsec/deepsec.config.ts
  • .deepsec/package.json
  • .github/actions/run-phase5-sweep/action.yaml
  • .github/actions/run-playwright-script/action.yaml
  • .github/workflows/hmrc-ingestion.yaml
  • .github/workflows/phase5-sweep-exact.yaml
  • .github/workflows/phase5-sweep-no-match.yaml
  • .github/workflows/phase5-sweep-non-exact.yaml
  • .oxfmtrc.json
  • .oxlintrc.json
  • .vscode/settings.json
  • apps/ch-stream/package.json
  • apps/ch-stream/src/processor.ts
  • apps/web/README.md
  • apps/web/package.json
  • apps/web/scripts/generate-hmrc-seed-sql.ts
  • apps/web/scripts/generate-sitemap.ts
  • apps/web/scripts/ingest-hmrc-csv.ts
  • apps/web/scripts/phase0a-classify-mappings.ts
  • apps/web/scripts/phase0b-resolve-suspects.ts
  • apps/web/scripts/phase1-apply.ts
  • apps/web/scripts/phase1-sanity-check.ts
  • apps/web/scripts/phase5-sanity-check.ts
  • apps/web/scripts/phase5-sweep.ts
  • apps/web/scripts/render-og.ts
  • apps/web/scripts/seed-companies-house.ts
  • apps/web/scripts/seed-sic-codes.ts
  • apps/web/server/api/revalidate.post.ts
  • apps/web/server/api/tiles/[theme]/[z]/[x]/[y].get.ts
  • apps/web/server/routes/.well-known/vercel/flags.get.ts
  • apps/web/server/utils/withSecret.ts
  • apps/web/src/api/companiesHouse.ts
  • apps/web/src/api/flags.ts
  • apps/web/src/api/geocode.ts
  • apps/web/src/api/hmrc.ts
  • apps/web/src/api/ingestion.ts
  • apps/web/src/components/AddressMap.tsx
  • apps/web/src/components/Footer.tsx
  • apps/web/src/components/Header.tsx
  • apps/web/src/components/HmrcCard.tsx
  • apps/web/src/components/HmrcResults.tsx
  • apps/web/src/components/LastUpdated.tsx
  • apps/web/src/components/LeafletMap.tsx
  • apps/web/src/components/McpTools.tsx
  • apps/web/src/components/NavigationProgress.tsx
  • apps/web/src/components/RouteError.tsx
  • apps/web/src/components/SearchBar.tsx
  • apps/web/src/components/SearchInput.tsx
  • apps/web/src/components/SkeletonCards.tsx
  • apps/web/src/components/ThemeToggle.tsx
  • apps/web/src/fonts.css
  • apps/web/src/hooks/useHmrcSearch.ts
  • apps/web/src/hooks/useSearchPill.ts
  • apps/web/src/lib/phase5/apply-promotion.test.ts
  • apps/web/src/lib/phase5/db-host.test.ts
  • apps/web/src/lib/phase5/decide.test.ts
  • apps/web/src/lib/phase5/sql.ts
  • apps/web/src/lib/phase5/sweep.test.ts
  • apps/web/src/router.tsx
  • apps/web/src/routes/__root.tsx
  • apps/web/src/routes/company.$id.$slug.tsx
  • apps/web/src/routes/index.tsx
  • apps/web/src/styles.css
  • apps/web/src/transitions.css
  • biome.json
  • package.json
  • packages/db/package.json
  • packages/db/src/migrate.ts
  • packages/db/src/schema.ts
💤 Files with no reviewable changes (1)
  • biome.json

@nikilok nikilok merged commit 3a5f26f into main May 22, 2026
5 checks passed
@nikilok nikilok deleted the feat/oxc branch May 22, 2026 22:31
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