Repository navigation
Releases: gaia-harness/lint
Release list
v3.0.3
Patch Changes
- #81
1549479Thanks @stevensacks! - Updated dependencies:@eslint-react/eslint-plugin5.28.2 andeslint-plugin-better-tailwindcss4.10.0. The enabled rule set is unchanged.
v3.0.2
Patch Changes
- #77
12b5435Thanks @stevensacks! - Updated dependencies:@eslint-react/eslint-plugin5.28.1,eslint-plugin-zod5.2.0,@shadcn/lint0.2.3,eslint-plugin-better-tailwindcss4.9.1,eslint-plugin-prettier5.5.7 andeslint-plugin-storybook10.6.2. The enabled rule set is unchanged.
v3.0.1
Patch Changes
- #75
22cb670Thanks @stevensacks! - Fixed: every item in the shadcn registry now lints clean asshadcn addwrites it. The vendored-ui rule list was built from a sample of registry items, so stock files outside that sample failed lint (pnpm shadcn add paginationtrippedjsx-a11y/anchor-has-contentonPaginationLink's spread children). The list now comes from a sweep ofshadcn add --all(shadcn 4.22.0) and adds the style rules and maintainer-sanctioned correctness rules that sweep found.react-hooks/set-state-in-effectandbetter-tailwindcss/no-unknown-classesare now off for vendored files;react-hooks/rules-of-hooks,react-hooks/exhaustive-depsandshadcn/no-raw-colorsstay on. The defaultuiFilesalso covers the three helpers the registry writes outsidecomponents/ui(hooks/use-mobile.ts,hooks/use-highlighted-code.ts,utils/highlighter.tsx), while a project's own hooks and utils beside them stay fully linted.
v3.0.0
Major Changes
-
#61
1d66414Thanks @stevensacks! - Removed: thetesting-libraryblock and theeslint-plugin-testing-librarydependency. GAIA tests run in Vitest browser mode (vitest-browser-react,pagelocators), where Testing Library's rules no longer apply andprefer-screen-queriesfalse-positives onpage.getByRole. Delete anyeslint-disablecomments that name atesting-library/*rule. The jest-dom rules stay, because stories still assert with the jest-dom matchers thatstorybook/testre-exports. -
#54
fa0b343Thanks @stevensacks! - Breaking: thestyleHygienenaming rules now enforce GAIA's kebab-case layout. Component and page folders are kebab-case,components/ui/holds flat kebab-case component files withtests/as its only subfolder, a route page ispages/<path>/page.tsxexporting<Name>Page, and hook files areuse-*.ts.canonical/filename-match-exportedapplies a kebab transform to component and page.tsxfiles, sotheme-switch/index.tsxexportsThemeSwitch; everywhere else it keeps exact matching. PascalCase component folders and camelCase hook files now fail lint, so rename them before upgrading. -
#56
9d48fbcThanks @stevensacks! - Breaking: importingFCorFunctionComponentfromreactis now an error everywhere, including test and story files. Type props inline instead:type ButtonProps = {...}; const Button = ({...}: ButtonProps) => ....Added: the opt-in
shadcn()factory bundles@shadcn/lint(exact-pinned) so role tokens are the only color vocabulary. It setsshadcn/no-raw-colors,shadcn/require-static-classes,shadcn/no-arbitrary-valuesandshadcn/no-inline-stylesto error,shadcn/no-restyleto error withallow: ['layout'], andshadcn/no-unknown-classesoff in favor of better-tailwindcss'sno-unknown-classes. Its vendored-ui block turns Prettier and the house-style rules off forcomponents/ui/*.tsx(registry output stays byte-identical toshadcn add) whileshadcn/no-raw-colors,react-hooks/*and the other correctness rules stay on, andcomponents/ui/tests/**stays fully linted. Spread...lint.shadcn({ui: '~/components/ui'})as the last entry, after the full GAIA composition and...lint.prettier.The
eslintpeer floor rises from^9.0.0to^9.30.0, which@shadcn/lintrequires.@shadcn/lintalso pulls a dev-only copy of thecnpackage.
Minor Changes
-
#70
751e0edThanks @stevensacks! - Changed:shadcnallows an arbitrary value where no scale step or token fits (grid-cols-[auto_1fr],bg-size-[200%_100%]);shadcn/no-arbitrary-valuesis off.betterTailwindsetsrootFontSize: 16onenforce-canonical-classes, so an arbitrary value that has a scale equivalent is rewritten to it (w-[16px]tow-4). Arbitrary colors stay banned throughbetter-tailwindcss/no-restricted-classes, since every color is a theme role token; vendored ui files are exempt. -
#65
cd7d1d9Thanks @stevensacks! - Added: four rule sets that close gaps in the bundle.baseturns on the type-aware@typescript-eslint/no-unsafe-call,no-unsafe-member-access,no-unsafe-argument,no-deprecatedandno-unnecessary-type-conversion, completing theno-unsafe-*family. Tests and stories keep theno-unsafe-*relaxation they already had.baseadds@eslint-community/eslint-comments: everyeslint-disablemust give a reason after--(// eslint-disable-next-line no-console -- startup banner), a bare blanketeslint-disableis banned, and block disables must be paired with an enable unless they cover the whole file.guardrailsaddseslint-plugin-regexp's recommended set, which catches patterns that backtrack catastrophically (ReDoS), alternatives that can never match and needless escapes.reactaddsreact-refresh/only-export-components, so a component module that also exports non-components, which breaks Fast Refresh, is reported.reactRouterallows React Router's route-module exports (loader,action,meta, ...) in route modules androot.tsx, and theshadcnvendored-ui exemption turns the rule off for registry files.
Action required on upgrade: add a
-- reasonto eacheslint-disablethat lacks one, and move any non-component export out of a component module. -
#66
8a1ecf4Thanks @stevensacks! - Added:reactreports Effects that should not be Effects (react-you-might-not-need-an-effect: state derived from other state or props, user-event logic in an Effect, chained updates, notifying a parent, resetting state on a prop change instead of usingkey). It also adds nine@eslint-reactrules: an Effect that adds a listener, timer, interval, observer or fetch must clean it up, and React 19 forms replaceforwardRef,useContextand<Context.Provider>.Added: two opt-in arrays.
lint.i18nreports raw JSX text that should come fromt(); spread it only if the UI is translated.lint.zodturns oneslint-plugin-zod's recommended rules for Zod 4 projects, minusconsistent-import.Changed: the
.length && <JSX/>selector's comment now says thatsonarjs/jsx-no-leaked-renderalready catches the generalcount && <JSX/>case. -
#63
f58c5ffThanks @stevensacks! - Added:reactRouternow carriesno-imperative-query-fetch/no-imperative-query-fetch, on by default for every TypeScript file under the source dir. It bansensureQueryData,fetchQuery,prefetchQueryand their infinite variants, so a route has one fetch idiom:queryClient.queryawaited in a clientLoader, read withuseSuspenseQuery.reactRouternow followssourceDir. Fix any reported call by moving the fetch into the clientLoader.Changed:
import-x/no-unresolvedignores^virtual:imports, so Vite plugin virtual modules such asvirtual:mswresolve, and checks case and CommonJSrequire. Under the source dir it now also covers*.test.*and*.stories.*files, where an unresolved import is the same defect. A project that carried a localno-unresolvedoverride for either reason can delete it.
Patch Changes
-
#57
c2e285fThanks @stevensacks! - Fixed: an unusedeslint-disabledirective now fails a plaineslintrun at error severity (linterOptions.reportUnusedDisableDirectives: 'error'). Theeslint-comments/no-unused-disablerule it replaces could never report, so the@eslint-community/eslint-plugin-eslint-commentsdependency is removed.unicorn/prefer-set-sizeandunicorn/no-blob-to-fileare now off: under the TypeScript parser they cannot report.Updated: minor and patch releases of
eslint-plugin-perfectionist,eslint-plugin-playwright,eslint-plugin-sonarjs,eslint-plugin-storybookandeslint-plugin-no-relative-import-paths. -
#68
83a68aaThanks @stevensacks! - Updated:@shadcn/lintto 0.2.1,eslint-plugin-better-tailwindcssto 4.9.0,eslint-plugin-playwrightto 2.12.1 andstylelint-orderto 8.1.2, and refreshed the lockfile. -
#61
1d66414Thanks @stevensacks! - Updated:eslint-config-airbnb-extendedto 3.3.0,eslint-plugin-sonarjsto 4.2.2 andeslint-plugin-storybookto 10.6.1. Refreshed the lockfile, which picks up patched transitive releases and clears mostpnpm auditadvisories. The dependency release-age window drops from 7 days to 3, matching GAIA. -
#72
fc8086cThanks @stevensacks! - Updated:@eslint-react/eslint-pluginto 5.26.1 and the pinned pnpm to 12.11.2, and refreshed the lockfile. -
#56
9d48fbcThanks @stevensacks! - Fixed: the stylelint config no longer reports every Tailwind@applyunderat-rule-prelude-no-invalid. Stylelint 17's standard config validates at-rule preludes as CSS, and@applytakes utility class names, so the rule now ignores@applyand still checks every standard at-rule. -
#59
3f29c02Thanks @stevensacks! - Fixed: `@typesc...
v3.0.0-rc.7
Minor Changes
- #70
751e0edThanks @stevensacks! - Changed:shadcnallows an arbitrary value where no scale step or token fits (grid-cols-[auto_1fr],bg-size-[200%_100%]);shadcn/no-arbitrary-valuesis off.betterTailwindsetsrootFontSize: 16onenforce-canonical-classes, so an arbitrary value that has a scale equivalent is rewritten to it (w-[16px]tow-4). Arbitrary colors stay banned throughbetter-tailwindcss/no-restricted-classes, since every color is a theme role token; vendored ui files are exempt.
v3.0.0-rc.6
Patch Changes
- #68
83a68aaThanks @stevensacks! - Updated:@shadcn/lintto 0.2.1,eslint-plugin-better-tailwindcssto 4.9.0,eslint-plugin-playwrightto 2.12.1 andstylelint-orderto 8.1.2, and refreshed the lockfile.
v3.0.0-rc.5
Minor Changes
-
#65
cd7d1d9Thanks @stevensacks! - Added: four rule sets that close gaps in the bundle.baseturns on the type-aware@typescript-eslint/no-unsafe-call,no-unsafe-member-access,no-unsafe-argument,no-deprecatedandno-unnecessary-type-conversion, completing theno-unsafe-*family. Tests and stories keep theno-unsafe-*relaxation they already had.baseadds@eslint-community/eslint-comments: everyeslint-disablemust give a reason after--(// eslint-disable-next-line no-console -- startup banner), a bare blanketeslint-disableis banned, and block disables must be paired with an enable unless they cover the whole file.guardrailsaddseslint-plugin-regexp's recommended set, which catches patterns that backtrack catastrophically (ReDoS), alternatives that can never match and needless escapes.reactaddsreact-refresh/only-export-components, so a component module that also exports non-components, which breaks Fast Refresh, is reported.reactRouterallows React Router's route-module exports (loader,action,meta, ...) in route modules androot.tsx, and theshadcnvendored-ui exemption turns the rule off for registry files.
Action required on upgrade: add a
-- reasonto eacheslint-disablethat lacks one, and move any non-component export out of a component module. -
#66
8a1ecf4Thanks @stevensacks! - Added:reactreports Effects that should not be Effects (react-you-might-not-need-an-effect: state derived from other state or props, user-event logic in an Effect, chained updates, notifying a parent, resetting state on a prop change instead of usingkey). It also adds nine@eslint-reactrules: an Effect that adds a listener, timer, interval, observer or fetch must clean it up, and React 19 forms replaceforwardRef,useContextand<Context.Provider>.Added: two opt-in arrays.
lint.i18nreports raw JSX text that should come fromt(); spread it only if the UI is translated.lint.zodturns oneslint-plugin-zod's recommended rules for Zod 4 projects, minusconsistent-import.Changed: the
.length && <JSX/>selector's comment now says thatsonarjs/jsx-no-leaked-renderalready catches the generalcount && <JSX/>case.
v3.0.0-rc.4
Minor Changes
-
#63
f58c5ffThanks @stevensacks! - Added:reactRouternow carriesno-imperative-query-fetch/no-imperative-query-fetch, on by default for every TypeScript file under the source dir. It bansensureQueryData,fetchQuery,prefetchQueryand their infinite variants, so a route has one fetch idiom:queryClient.queryawaited in a clientLoader, read withuseSuspenseQuery.reactRouternow followssourceDir. Fix any reported call by moving the fetch into the clientLoader.Changed:
import-x/no-unresolvedignores^virtual:imports, so Vite plugin virtual modules such asvirtual:mswresolve, and checks case and CommonJSrequire. Under the source dir it now also covers*.test.*and*.stories.*files, where an unresolved import is the same defect. A project that carried a localno-unresolvedoverride for either reason can delete it.
v3.0.0-rc.3
Major Changes
- #61
1d66414Thanks @stevensacks! - Removed: thetesting-libraryblock and theeslint-plugin-testing-librarydependency. GAIA tests run in Vitest browser mode (vitest-browser-react,pagelocators), where Testing Library's rules no longer apply andprefer-screen-queriesfalse-positives onpage.getByRole. Delete anyeslint-disablecomments that name atesting-library/*rule. The jest-dom rules stay, because stories still assert with the jest-dom matchers thatstorybook/testre-exports.
Patch Changes
- #61
1d66414Thanks @stevensacks! - Updated:eslint-config-airbnb-extendedto 3.3.0,eslint-plugin-sonarjsto 4.2.2 andeslint-plugin-storybookto 10.6.1. Refreshed the lockfile, which picks up patched transitive releases and clears mostpnpm auditadvisories. The dependency release-age window drops from 7 days to 3, matching GAIA.
v3.0.0-rc.2
Patch Changes
- #59
3f29c02Thanks @stevensacks! - Fixed:@typescript-eslint/prefer-destructuringis off in vendored shadcn ui files. shadcn'stoastcomponent re-exports namespace members asconst a = Namespace.a, which the rule reported on uneditedshadcn addoutput.