Web: Migrate from Prettier + ESLint to Ultracite + Biome - #94
Merged
Conversation
Replace the Prettier + ESLint toolchain with Ultracite + Biome. Adds biome.jsonc (extends ultracite core/react/next presets) and editor settings, removes the ESLint/Prettier configs and devDependencies, and rewires the lint/format scripts. Applies Biome's safe autofixes across the app; remaining lint violations are addressed in follow-up commits. Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Rename the lint scripts to lint:check (ultracite check) and lint:fix (ultracite fix) and point the typescript-lint workflow and the fe-format/fe-lint Make targets at them, dropping the obsolete Prettier format:check CI step. Co-authored-by: Cursor <cursoragent@cursor.com>
Convert object types to interfaces, replace global isNaN with Number.isNaN, and disable useTopLevelRegex and noExcessiveCognitiveComplexity. Co-authored-by: Cursor <cursoragent@cursor.com>
Remove non-null assertions, apply remaining autofixes, and disable selected a11y, complexity, and style rules that do not fit this codebase. Co-authored-by: Cursor <cursoragent@cursor.com>
Remove non-null assertions, add switch defaults and stable React keys, and fix type errors from optional-chaining replacements. Co-authored-by: Cursor <cursoragent@cursor.com>
Add config disables, inline ignores for intentional patterns, remove the runs-table metadata barrel, and fix switch defaults and label associations. Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve Biome `useAwait` violations by awaiting returned thenables or dropping `async` where nothing is awaited, and convert flagged object type aliases to interfaces. Split the pure archive retry-estimate into `lib/api/archive-retry.ts` so the unit test no longer imports `@/lib/db` (which throws at import when DATABASE_URL is unset). Co-authored-by: Cursor <cursoragent@cursor.com>
Replace Prettier/ESLint and old script names (lint, format, format:check) with the Biome/Ultracite commands (lint:check, lint:fix) across the web README, getting-started, conventions, CI, and AGENTS docs. Co-authored-by: Cursor <cursoragent@cursor.com>
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.
Summary
Migrates the
web/toolchain from Prettier + ESLint to Ultracite + Biome, and resolves every resulting lint/type violation so the check is green.Toolchain swap
web/biome.jsonc(extendsultracite/biome/core+react+next) andweb/.vscode/settings.json. The preset reproduces the prior style (2-space indent, double quotes,es5trailing commas, 80-col width) plus import organizing and Tailwind class sorting, with a small set oflinter.rulesoverrides for rules we intentionally disable and an override turning linting off for generatedcomponents/ui/**.eslint.config.mjs,.prettierrc,.prettierignoreand the ESLint/Prettier devDependencies; regeneratespackage-lock.json.web/package.jsonscripts:lint:check(ultracite check),lint:fix(ultracite fix);checkandprecommitrun lint +typecheck.Makefile: thetypescript-lintworkflow drops the Prettierformat:checkstep and runslint:check(Biome's combined formatter + linter);make fe-format/fe-lintpoint atlint:fix/lint:check.Lint + type cleanup
web/tree (~296 files).useAwait(await returned thenables, or drop a needlessasync),useConsistentTypeDefinitions(typeobject aliases →interface), plus assortednoNonNullAssertion,noNestedTernary,noArrayIndexKey, etc.lint:checkandtypecheckare now clean.biome check --write --unsafewas deliberately not run — its fixes can change runtime behavior (e.g. stripping intentional hook dependencies) — so any unsafe suggestions were reviewed and applied individually.Incidental refactor
estimateRetryAfterSeconds+ its constants) intoweb/lib/api/archive-retry.tsso its unit test no longer transitively imports@/lib/db, which throws at import time whenDATABASE_URLis unset (the no-Postgres unit/MCP vitest suite).