chore: adopt Oxlint for JS/TS semantics; keep Biome for format/non-JS (#321) - #14
Closed
thedavidweng wants to merge 3 commits into
Closed
chore: adopt Oxlint for JS/TS semantics; keep Biome for format/non-JS (#321)#14thedavidweng wants to merge 3 commits into
thedavidweng wants to merge 3 commits into
Conversation
thedavidweng
force-pushed
the
vite-8-migration-21be
branch
from
July 16, 2026 05:43
ab2a5fb to
fc023fc
Compare
thedavidweng
force-pushed
the
oxlint-biome-split-21be
branch
from
July 16, 2026 05:43
2ed9b17 to
f586148
Compare
thedavidweng
force-pushed
the
vite-8-migration-21be
branch
from
July 26, 2026 06:16
fc023fc to
aa2258e
Compare
Adopt Oxlint 1.74 for JS/TS/React/Vitest/import semantics with type-aware floating-promise and import-cycle checks. Keep Biome as the sole formatter and non-JS linter (CSS/JSON). Update scripts, docs, and fix correctness findings surfaced by the new lint path. Co-authored-by: Davy <thedavidweng@users.noreply.github.com>
…icker-dialog Add oxlint-enable after the drop-zone section so jsx-a11y/no-noninteractive-element-interactions is not silenced for the rest of each file.
thedavidweng
force-pushed
the
oxlint-biome-split-21be
branch
from
July 26, 2026 06:20
f586148 to
6393682
Compare
Owner
Author
|
Superseded by upstream PR 1weiho#371 (1weiho#371). The stacked fork branch has been rebased onto current |
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.
Issue
Closes / implements 1weiho#321 (parent roadmap 1weiho#318).
Stacked on:
cursor/vite-8-migration-21be(PR for 1weiho#320). Merge after that branch.Exact scope
Versions before → after
oxlint1.74.0oxlint-tsgolint0.24.0@biomejs/biome2.4.122.4.12(unchanged)Base commit for this branch tip parent:
2331ec590346baf8306455a23a396b0bcd1ea14d(Vite 8 PR tip).Why the old state was a problem
Biome owned JS/TS lint, formatting, and CSS/JSON together. That duplicated parser generations vs the Vite 8 / Oxc / Rolldown stack and limited type-aware / multi-file semantic checks (floating promises, import cycles).
Why these tools/versions were chosen
1.74.0+oxlint-tsgolint0.24.0for type-aware rulestypescript/no-floating-promisesandimport/no-cycleBreaking changes reviewed
pnpm lint/pnpm checksemantics changed (documented in README / CONTRIBUTING / AGENTS / CLAUDE)packages/core/tsconfig.json: removedbaseUrlso type-aware lint works (tsgolint rejectsbaseUrl; see Crash when running tsgolint:Option 'baseUrl' has been removed.oxc-project/tsgolint#351).pathsremain;pnpm typecheckstill passesSource changes required
||expression, useless spreads, floating promises (void), hook deps, a11y labels, unbound method on presenter channel, Vitest mock typing / conditional expectjsx-a11y/prefer-tag-over-roleleft off (intentional ARIA/rolepatterns; BiomeuseSemanticElementswas already selectively off for slides/landing)Tests added or changed
print-ready.test.ts: typedvi.fn<() => Promise<void>>()design-plugin.test.ts: replace conditional expect withtoEqualRule mapping table
linter.rules.recommended(correctness/suspicious/complexity/…)categories.correctness: error+ default pluginsuseExhaustiveDependencies)reactplugin +react-hooks/exhaustive-depsnoStaticElementInteractions, labels, …)jsx-a11ypluginuseSemanticElements/ prefer semantic tagsjsx-a11y/prefer-tag-over-rolerolepatterns**/slides/**,apps/web/components/landing/**assist.organizeImportstypescript/no-floating-promisesvoidimport/no-cyclevitest/*correctnessassertFunctionNamesincludes helperspackages/core/src/app/components/ui/**packages/cli/template/**No previous JS/TS coverage was dropped silently; gaps above are classified.
Benchmark results
Same machine, Node 24.18.0, pnpm 11.13.1. One warm-up + 10 measured runs (median / p95). Times for wrapped
pnpm/pnpm execinclude package-manager startup.pnpm lintuseOptionalChain)oxlint --fix)Type-aware on vs off (Oxlint only): median 1.168 s vs 0.598 s (~2×). Decision: keep type-aware on in
lint:jsfor floating-promise + cycle coverage;lint:js:no-type-awareavailable for local comparison.Biome post-split non-JS-only median: 0.400 s (40 files).
Security audit results
pnpm audit --prod/pnpm auditstill report lockfile advisories (mostly transitive / website). This PR does not claim to resolve vulnerabilities; no new advisory was introduced by adding Oxlint. Remaining advisories are tracked for 1weiho#323.Package and bundle-size changes
oxlint+oxlint-tsgolint(devDependencies only)pnpm --filter @open-slide/core pack --dry-runand CLI pack dry-run succeedManual validation results
Known limitations
jsx-a11y/prefer-tag-over-roleintentionally offProhibited workarounds
Confirmed not used:
--force,--legacy-peer-deps, dependency overrides/resolutions, patch-package, vendored forks, blanket TS/lint suppressions, prerelease packages, silent snapshot updates, unrelated features/UI churn.