Skip to content

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

Merged
MarioCadenas merged 1 commit into
mainfrom
chore/migrate-biome-to-oxc
Aug 18, 2026
Merged

chore: migrate from Biome to oxlint + oxfmt#538
MarioCadenas merged 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
MarioCadenasforce-pushed the chore/migrate-biome-to-oxc branch from ec336c2 to fb816a8CompareAugust 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).

distrawgzip
JS (runtime)869 KB303 KB
Type declarations315 KB109 KB (-9 B)
Source maps1.7 MB (+159 B)566 KB (+143 B)
Other11 KB3.7 KB
Total2.9 MB (+159 B)982 KB (+134 B)
Per-entry composition (own code — deps external (as shipped))
EntryInitial (gz)Lazy (gz)Total (gz)node_modules (min)Own code (min)
.88 KB2.5 KB91 KBexternal288 KB
./beta49 KB457 B49 KBexternal143 KB
./type-generator21 KB0 B21 KBexternal61 KB

Chunks:

EntryChunkLoadSize (gz)
.index.jsinitial84 KB
.utils.jsinitial4.0 KB
.remote-tunnel-manager.jslazy2.5 KB
./betabeta.jsinitial33 KB
./betastream-manager.jsinitial5.8 KB
./betawide-event-emitter.jsinitial3.2 KB
./betadatabricks.jsinitial3.0 KB
./betaconfiguration.jsinitial2.1 KB
./betaservice-context.jsinitial1.3 KB
./betaclient.jsinitial434 B
./betaclient-options.jsinitial220 B
./betasupervisor-api.jslazy192 B
./betadatabricks.jslazy142 B
./betaindex.jslazy123 B
./type-generatorindex.jsinitial21 KB

@databricks/appkit-ui

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

distrawgzip
JS (runtime)390 KB130 KB (+1 B)
Type declarations228 KB83 KB
Source maps752 KB (-334 B)247 KB (-197 B)
CSS16 KB (-462 B)3.2 KB (-90 B)
Total1.4 MB (-796 B)464 KB (-286 B)
Per-entry composition (consumer bundle — deps bundled, peerDeps external)
EntryInitial (gz)Lazy (gz)Total (gz)node_modules (min)Own code (min)
./js5.3 KB49 KB55 KB208 KB14 KB
./js/beta20 B0 B20 B0 B0 B
./react432 KB (+127 B)49 KB480 KB (+127 B)1.3 MB175 KB
./react/beta1.0 KB0 B1.0 KB0 B1.9 KB

Chunks:

EntryChunkLoadSize (gz)
./jsindex.jsinitial5.2 KB
./jschunkinitial120 B
./jsapache-arrowlazy49 KB
./js/betabeta.jsinitial20 B
./reactindex.jsinitial430 KB
./reacttslibinitial2.1 KB
./reactapache-arrowlazy49 KB
./react/betabeta.jsinitial1.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.

@MarioCadenas
MarioCadenas marked this pull request as ready for review August 18, 2026 08:33
@MarioCadenas
MarioCadenas requested a review from a team as a code ownerAugust 18, 2026 08:33
@MarioCadenas
MarioCadenas merged commit 9538d58 into mainAug 18, 2026
10 checks passed
@MarioCadenas
MarioCadenas deleted the chore/migrate-biome-to-oxc branch August 18, 2026 08:33
MarioCadenas added a commit that referenced this pull request Aug 18, 2026
Post-rebase integration with main's biome->oxc migration (#538) and the
SDK-facade boundary rule (#534):
- Route the mlflow connector's auth through createWorkspaceClient instead
of importing @databricks/sdk-experimental directly (oxlint
no-restricted-imports); behaviour is unchanged.
- Apply oxfmt import grouping to the evals + connector files authored
before the migration.
Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Sign up for freeto 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.

2 participants

@MarioCadenas@atilafassina