chore: replace Biome with oxlint, oxfmt and Knip - #14
Open
Thomasims wants to merge 4 commits into
Open
Conversation
Adopts the shared @antelopejs/tooling-configs presets: oxlint with the vendored anti-slop rules, oxfmt for formatting and Knip for dead code. Type-aware linting needs a tsconfig tsgolint accepts, so the removed moduleResolution node10 and baseUrl options go away and the self-referential path mapping the suites use becomes relative. The module stays on commonjs so the emit keeps using require, which is what the AntelopeJS resolver hooks. The one biome-ignore in the tree becomes an oxlint disable: Query is deliberately thenable because it implements PromiseLike, so `await query` runs it, and unicorn/no-thenable has to be waived on that method alone. Knip needs the suites and their fixtures declared as entry points: the whole compiled tree ships in the package and the implementing modules run it as their conformance suite, which is not an edge Knip can follow. No export changes: this package is a contract, so its surface is reachable only from consumers Knip cannot see.
Thomasims
marked this pull request as draft
September 7, 2026 10:37
Thomasims
marked this pull request as ready for review
September 7, 2026 16:10
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.
Replaces Biome with the shared
@antelopejs/tooling-configspresets: oxlint(type-aware, with the vendored anti-slop rules), oxfmt for formatting and Knip
for dead-code detection.
oxlintis pinned to 1.81.0 because the JS plugin APIis still alpha and has to match the version tooling-configs builds against.
tsconfig
Type-aware linting runs through tsgolint, which rejects options TypeScript 7
removed, so
moduleResolution: "node"andbaseUrlare gone and theself-referential
@antelopejs/interface-databasepath mapping the suites use isnow written relative (
./src/index.ts), which is what the compiler wants oncebaseUrlis absent.modulestayscommonjson purpose. Raising it tonode16would look like thetidier fix and is a runtime break: tsc stops downlevelling dynamic imports and
emits native ESM ones, which bypass the CommonJS resolver detour the
ajsruntime installs.
pnpm buildsucceeds with no source change.Code changes the linter forced
perfectionist(sort-imports): import ordering across the source and thesuites, all applied by
oxlint --fix.unicorn(no-thenable)onQuery.then. This is the only waiver this migrationadds, and it replaces the
biome-ignorethat was already there:// oxlint-disable-next-line unicorn/no-thenable -- Query is deliberately PromiseLike so `await query` runs it; the contract requires this method.Query<T> implements PromiseLike<T>is howawait queryexecutes a query, sothe method cannot go away — and removing it would be a breaking change to the
interface anyway.
One suppression predates this branch and is carried over unchanged: the file-wide
/* eslint-disable @typescript-eslint/no-unused-expressions */at the top ofsrc/tests/merge_operations.test.ts. oxlint honours eslint-flavoured directives,so it is still load-bearing — removing it surfaces four
eslint(no-unused-expressions)errors from that file's chai property assertions(
expect(order).to.not.be.undefined). Narrowing it to per-lineoxlint-disable-next-linecomments is left for a follow-up rather than smuggled into a tooling swap.
No public export was touched.
Object.keys(require(...))is identical before andafter for all eight published subpaths (
.,common,datum,query,schema,selection,stream,valueproxy).The remaining oxlint output is warnings only, which are a deliberate backlog and
are left as they are.
pnpm lintexits 0.Knip
Nothing was deleted. Two things had to be declared instead:
src/tests/(the preset only knowssrc/test/) andsrc/antelope.test.tsis read byajs module testfrompackage.json#antelopeJs.test. The whole compiled tree ships in the packageand the modules implementing this interface run it as their conformance suite,
which is why the suites are entry points rather than dead code.
src/tests/datasets/**is the fixture surface for those suites.datasets/index.tsis the barrel a suite can pull the whole set from, anddatasets/codec_fields.tsis the type-level regression test added with theio-ts field codecs in feat: accept io-ts codecs as table field types #8 — its only job is to keep type-checking, so nothing
will ever import it. Declaring the directory keeps
io-ts/fp-tshonestlyaccounted for instead of dropping a fixture that guards a shipped feature.
ajsis ignored as a binary because CI installs@antelopejs/coregloballyinstead of adding the CLI to every package.
Verification
pnpm build,pnpm lint,pnpm knip,pnpm format:checkall exit 0.pnpm test: 161 passing, identical to the baseline measured on an untouchedmainworktree.The oxfmt pass is a separate commit and is recorded in
.git-blame-ignore-revsso
git blamestays readable. It also normalizes Markdown, YAML and thepackage.jsonkey order, which accounts for most of the diff.