Repository navigation
build(frontend): lint and format with Biome and check the frontend in CI - #117
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
klin2686
force-pushed
the
refactor/frontend-biome
branch
from
October 14, 2026 08:03
2e4894a to
8b94a95
Compare
klin2686
force-pushed
the
refactor/frontend-biome
branch
from
October 14, 2026 08:10
8b94a95 to
538edfb
Compare
This branch was successfully deployed
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
eslint-config-nextwith Biome for linting and formatting; ESLint stays only for the React Compiler rules Biome doesn't have.What changed
Frontend
Tooling
@biomejs/biome2.5.15 (exact pin) withfrontend/biome.jsonc: the recommended preset plus the React and Next.js domains (enabled from dependencies), 2-space indent,lineWidth100, double quotes and semicolons.noNonNullAssertion(!is how the code narrows) anduseExhaustiveDependencies's unnecessary-dependency reports (an extra dependency is a legitimate re-run trigger).noStaticElementInteractionsanduseKeyWithClickEventsfor now: keyboard support for clickable non-buttons is left to an accessibility pass.CheckboxandSwitchas inputs fornoLabelWithoutControl, since both render a labelable element.**/sheets/**(the deprecated Google Sheets import) from Biome and ESLint linting; those files are still formatted.eslint.config.mjsnow runs onlyeslint-plugin-react-hooks'srecommendedpreset, pinned to 7.0.1 (the versioneslint-config-nextbundled), withrules-of-hooksandexhaustive-depsoff because Biome covers them.check,fix(biome check --write),format,lint(Biome),lint:react(ESLint),typecheck.packageManagerto pnpm 10.34.6, the newest version Vercel supports, and replacesignoredBuiltDependencieswithallowBuildsinpnpm-workspace.yaml, which pnpm 11+ requires.biome.jsoncthat coversfrontend/**and.vscode/*.json(lineWidth100) and owns.gitignorehandling, so editors opened at the repo root find Biome;frontend/biome.jsoncis nested under it with"root": false.Formatting
import typefor type-only imports and sorted imports. Listed in.git-blame-ignore-revs. (00171979).gitattributeschecks outfrontend/**, the rootbiome.jsoncand.vscode/*.jsonwith LF endings, so Windows checkouts withcore.autocrlfmatch Biome's output.Lint fixes
useOptionalChainfixes written by hand on the forms, members and invites pages and inlib/exports, keeping thenull/falseresults Biome's own fix would have turned intoundefined.forEachcallbacks that returned values now usefor...of(FormFillFlow,MassEventEditor,MassRoleEditor,MasonryGrid,usePanelSelection).aria-hiddenon the decorative SVGs inIcons.tsxandProgressRing,<title>inpublic/favicon.svg, andtype="button"on five navigation and menu buttons outside forms.ChipInput's caption is now a<label htmlFor>tied to its text input; the captions inProfileQuestionandNewTournamentModal's Division field are<div>s, since they caption groups rather than one input.collect_is_over_18/collect_is_over_21flags change, as their comments say they should.lib/sorting.ts: parametervalueOfrenamed tovalueFor, which no longer shadowsObject.prototype.valueOf.react-hooks/exhaustive-depsdisables converted to Biome suppressions.React Compiler fixes
lib/useIsClient.ts(useSyncExternalStore) replaces the mounted-flag effects inModal,ExportModalandToastProvider;useIsMobilenow usesuseSyncExternalStoreovermatchMedia.TracksSection,Dropdown,FormPopover,Tooltip,FieldKeyPopover,PresetPopover, and the assignments board's per-tab filters and sort and its filter matches, which clear when the filters do.useMyMembership'sloading.Textarea's expand and collapse moved into its focus, blur and mouse-leave handlers.useStatefor banner snoozes, andsnoozedUntilmoves to module scope.useExitAnimationskips its closing ghost while the element is still in the page, which StrictMode's simulated unmount produces now thatModalrenders its portal on the first render.FormPopoverandTooltipeach keep oneset-state-in-effectsuppression for state set from a DOM measurement in a layout effect.Bug fixes
REMOVE: its caption displays in uppercase, but the check required lowercaseremove. (fa7b9d55)/dashboard/tournaments/[id]/members/[membershipId]) re-reads after its assignments section saves;reloadKeywas bumped but never read. (a7d84083)CI and hooks
.github/workflows/frontend.yml("Frontend CI"):biome ci,pnpm lint:reactandpnpm typecheckon PRs that touchfrontend/, the rootbiome.jsoncor the workflow. Nonext build, since Vercel builds every PR..githooks/pre-commitruns its backend and frontend checks independently; the frontend side runs Biome on staged files throughlint-staged, which leaves unstaged changes untouched. The backend checks run in a subshell, so theircd backendcan't hide staged frontend files from the frontend check.Editor
.vscode/settings.jsonpoints the Biome extension atfrontend/node_modulesthroughbiome.lsp.bin, withpublicHoistPatterninpnpm-workspace.yamlputting the binary at an unversioned path.eslint.workingDirectoriespoints the ESLint extension atfrontend/; both extensions are recommended.CONTRIBUTING.mdandfrontend/CLAUDE.mddescribe the new commands, the hook, the editor setup and how to suppress rules.Out of scope
eslint-plugin-react-hooksto 7.1, which reports 44 more React Compiler findings, including the newrefsrule.RadioList,OptionListoptions and theDropdownfooter.<button>nested in a<button>in the form actions menu's "Allow response edits" row (FormActionsMenuputs aSwitchinside aPopoveritem).lib/api.tsrequests a trailing slash that Next.js strips and the proxy route adds back.PUT /forms/{form_id}/fields/: renaming one question away from a key and giving that key to another in the same save returns 409, becausebulk_update_fieldschecks each key against the database while earlier renames in the request are unflushed (autoflush=False).Test plan
Automated
pnpm check,pnpm lint:react,pnpm typecheckandpnpm buildpass.Manual
/verify-email?token=bogusand/confirm-email-change?token=bogusshow the error state once.REMOVE./joinwith no code shows the invalid-invite error./dashboard/tournaments/[id]/members/[membershipId]sees "No access".Textareaexpansion, status tooltips, clearing and re-setting the assignments board's member filters, and the mobile layout; those rely on the type check, lint and production build.