chore: migrate from Biome to oxlint + oxfmt - #538
Draft
MarioCadenas wants to merge 1 commit into
Draft
Conversation
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
force-pushed
the
chore/migrate-biome-to-oxc
branch
from
August 17, 2026 10:50
ec336c2 to
fb816a8
Compare
Contributor
📦 Bundle size reportCompared against
|
| 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 |
Contributor
🤖 AppKit PR bot🔬 Run evalsStart an eval for this PR from the evals-monitor app: Go to Evals Monitor → 📦 Try this PR's app templateScaffolds a new app from this PR's SDK build. Run it in any folder (requires the GitHub 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Migrate the repo's lint/format toolchain from Biome to the oxc (VoidZero) stack:
.oxlintrc.json).oxfmtrc.json)@biomejs/biomeandbiome.jsonare removed.Why
Ecosystem alignment (the repo already runs
rolldown-vite, a VoidZero fork) and speed. Both configs were migrated frombiome.jsonviaoxfmt --migrate=biome, then tuned for behavior parity.Changes
.oxlintrc.json/.oxfmtrc.json.lint/format/check(+docs:*) scripts andlint-stagedfor oxlint + oxfmt.tools/format-with-biome.ts→tools/format-generated.ts(formats generated files with oxfmt); update its 3 importers.biome-ignoresuppressions tooxlint-disable; drop 64 deadnoExplicitAnysuppressions (the rule was alreadyoff).sortImports(the BiomeorganizeImportsequivalent). 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.jsonsorting disabled (sortPackageJson: false) — oxfmt would otherwise reorder keys, which Biome never did.// Re-enable and fix in a follow-upblock in.oxlintrc.json(no-unsafe-optional-chaining,typescript/no-this-alias,react/exhaustive-deps,react/no-array-index-key, severalunicorn/*, etc.). These flag ~65 pre-existing, working sites that Biome's CI was green over; tightening them is deliberately left as a follow-up.@databricks/sdk-experimentalimport boundary (no-restricted-imports) is preserved, including the workspace-client / lakebase overrides.Accepted loss
.cssfiles). This is the only capability lost vs Biome.Verification
oxlint→ exit 0 (3 advisoryno-unused-varswarnings, 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-cleanpnpm test→ 3788 passed, 1 skipped, 0 failedFollow-ups