Skip to content

chore: migrate from Biome to oxlint + oxfmt - #538

Draft
MarioCadenas wants to merge 1 commit into
mainfrom
chore/migrate-biome-to-oxc
Draft

chore: migrate from Biome to oxlint + oxfmt#538
MarioCadenas wants to merge 1 commit into
mainfrom
chore/migrate-biome-to-oxc

Conversation

@MarioCadenas

Copy link
Copy Markdown
Collaborator

What

Migrate the repo's lint/format toolchain from Biome to the oxc (VoidZero) stack:

  • oxlint for linting (.oxlintrc.json)
  • oxfmt for formatting + import sorting (.oxfmtrc.json)

@biomejs/biome and biome.json are removed.

Why

Ecosystem alignment (the repo already runs rolldown-vite, a VoidZero fork) and speed. Both configs were migrated from biome.json via oxfmt --migrate=biome, then tuned for behavior parity.

Changes

  • Add .oxlintrc.json / .oxfmtrc.json.
  • Rewrite lint / format / check (+ docs:*) scripts and lint-staged for oxlint + oxfmt.
  • Rename tools/format-with-biome.tstools/format-generated.ts (formats generated files with oxfmt); update its 3 importers.
  • Translate the live biome-ignore suppressions to oxlint-disable; drop 64 dead noExplicitAny suppressions (the rule was already off).
  • Reorganize imports repo-wide via oxfmt sortImports (the Biome organizeImports equivalent). Order-critical side-effect imports — reflect-metadata, dotenv/config, CSS — are preserved (oxfmt treats bare imports as partition boundaries).

Parity decisions

Biome did lint + format + import-org in one binary; oxc splits these. To keep this a behavior-preserving swap rather than a lint-bar change:

  • package.json sorting disabled (sortPackageJson: false) — oxfmt would otherwise reorder keys, which Biome never did.
  • oxlint's stricter-than-Biome correctness rules are disabled with a documented // Re-enable and fix in a follow-up block in .oxlintrc.json (no-unsafe-optional-chaining, typescript/no-this-alias, react/exhaustive-deps, react/no-array-index-key, several unicorn/*, etc.). These flag ~65 pre-existing, working sites that Biome's CI was green over; tightening them is deliberately left as a follow-up.
  • The @databricks/sdk-experimental import boundary (no-restricted-imports) is preserved, including the workspace-client / lakebase overrides.

Accepted loss

  • CSS is no longer linted/formatted — oxc does not handle CSS (8 .css files). This is the only capability lost vs Biome.

Verification

  • oxlint → exit 0 (3 advisory no-unused-vars warnings, non-failing — pre-existing, left as-is)
  • oxfmt --check → exit 0 (idempotent)
  • pnpm -r typecheck → pass (7 projects)
  • pnpm generate:types → all generated files written and oxfmt-clean
  • Import boundary guardrail → fires with the correct message
  • pnpm test → 3788 passed, 1 skipped, 0 failed

Follow-ups

  • Optionally re-enable the deferred stricter oxlint rules and fix the flagged sites.
  • Optionally add a dedicated CSS formatter if CSS formatting is still wanted.

Replace @biomejs/biome with the oxc (VoidZero) toolchain: oxlint for
linting and oxfmt for formatting + import sorting.

- Add .oxlintrc.json / .oxfmtrc.json (migrated from biome.json)
- Rewrite lint/format/check scripts and lint-staged for oxlint + oxfmt
- Rename tools/format-with-biome.ts -> format-generated.ts (calls oxfmt)
- Translate live biome-ignore suppressions to oxlint-disable; drop 64
  dead noExplicitAny suppressions (rule was already off)
- Reorganize imports repo-wide via oxfmt sortImports

Parity notes:
- oxc does not lint/format CSS (Biome did) — accepted loss
- oxlint correctness rules stricter than Biome's former bar are disabled
  with a documented follow-up to tighten later

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
@MarioCadenas
MarioCadenas force-pushed the chore/migrate-biome-to-oxc branch from ec336c2 to fb816a8 Compare August 17, 2026 10:50
@github-actions

Copy link
Copy Markdown
Contributor

📦 Bundle size report

Compared against bundle-size-baseline.json (main).

@databricks/appkit

npm tarball (packed): 840 KB (+167 B) — gzipped download (dist + bin; excludes release-only docs/NOTICE).

dist raw gzip
JS (runtime) 869 KB 303 KB
Type declarations 315 KB 109 KB (-9 B)
Source maps 1.7 MB (+159 B) 566 KB (+143 B)
Other 11 KB 3.7 KB
Total 2.9 MB (+159 B) 982 KB (+134 B)
Per-entry composition (own code — deps external (as shipped))
Entry Initial (gz) Lazy (gz) Total (gz) node_modules (min) Own code (min)
. 88 KB 2.5 KB 91 KB external 288 KB
./beta 49 KB 457 B 49 KB external 143 KB
./type-generator 21 KB 0 B 21 KB external 61 KB

Chunks:

Entry Chunk Load Size (gz)
. index.js initial 84 KB
. utils.js initial 4.0 KB
. remote-tunnel-manager.js lazy 2.5 KB
./beta beta.js initial 33 KB
./beta stream-manager.js initial 5.8 KB
./beta wide-event-emitter.js initial 3.2 KB
./beta databricks.js initial 3.0 KB
./beta configuration.js initial 2.1 KB
./beta service-context.js initial 1.3 KB
./beta client.js initial 434 B
./beta client-options.js initial 220 B
./beta supervisor-api.js lazy 192 B
./beta databricks.js lazy 142 B
./beta index.js lazy 123 B
./type-generator index.js initial 21 KB

@databricks/appkit-ui

npm tarball (packed): 342 KB (-291 B) — gzipped download (dist + bin; excludes release-only docs/NOTICE).

dist raw gzip
JS (runtime) 390 KB 130 KB (+1 B)
Type declarations 228 KB 83 KB
Source maps 752 KB (-334 B) 247 KB (-197 B)
CSS 16 KB (-462 B) 3.2 KB (-90 B)
Total 1.4 MB (-796 B) 464 KB (-286 B)
Per-entry composition (consumer bundle — deps bundled, peerDeps external)
Entry Initial (gz) Lazy (gz) Total (gz) node_modules (min) Own code (min)
./js 5.3 KB 49 KB 55 KB 208 KB 14 KB
./js/beta 20 B 0 B 20 B 0 B 0 B
./react 432 KB (+127 B) 49 KB 480 KB (+127 B) 1.3 MB 175 KB
./react/beta 1.0 KB 0 B 1.0 KB 0 B 1.9 KB

Chunks:

Entry Chunk Load Size (gz)
./js index.js initial 5.2 KB
./js chunk initial 120 B
./js apache-arrow lazy 49 KB
./js/beta beta.js initial 20 B
./react index.js initial 430 KB
./react tslib initial 2.1 KB
./react apache-arrow lazy 49 KB
./react/beta beta.js initial 1.0 KB

@github-actions

Copy link
Copy Markdown
Contributor

🤖 AppKit PR bot

🔬 Run evals

Start an eval for this PR from the evals-monitor app: Go to Evals Monitor →

📦 Try this PR's app template

Scaffolds a new app from this PR's SDK build. Run it in any folder (requires the GitHub CLI — gh auth login — and the Databricks CLI):

gh run download 32022037310 -R databricks/appkit -n appkit-template-0.61.1-pr.25c8dd8-chore-migrate-biome-to-oxc-538 -D appkit-pr-538 \
  && unzip -o "appkit-pr-538/appkit-template-0.61.1-pr.25c8dd8-chore-migrate-biome-to-oxc-538.zip" -d "appkit-pr-538" \
  && databricks apps init --template "appkit-pr-538"

The template pins @databricks/appkit and @databricks/appkit-ui to tarballs built from this branch, so the scaffolded app runs against this PR's code.

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