{"slug":"eslint-fixes","title":"eslint-fixes","summary":"Resolve specific ESLint errors and warnings that appear in this project. Use when fixing lint failures, ESLint reported issues, or autofix conflicts (e.g. no-void, canonical/export-specifier-newline vs prettier, no-shadow trailing underscores, sonarjs/deprecation, you-dont-need-l","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-08-23T11:50:53.77288Z","repo":{"url":"https://github.com/gaia-react/gaia","stars":23,"forks":4,"license":"MIT","updatedAt":"2026-09-27T15:04:13Z"},"bodyHtml":"<hr>\n<h2>name: eslint-fixes\ndescription: Resolve specific ESLint errors and warnings that appear in this project. Use when fixing lint failures, ESLint reported issues, or autofix conflicts (e.g. no-void, canonical/export-specifier-newline vs prettier, no-shadow trailing underscores, sonarjs/deprecation, you-dont-need-lodash-underscore, testing-library/prefer-screen-queries, testing-library/await-async-events, jest-dom/prefer-*).\nmodel: haiku</h2>\n<h1>ESLint Fix Patterns</h1>\n<p>How to resolve specific ESLint errors in this project.</p>\n<h2>no-void</h2>\n<p>Don't use the <code>void</code> operator in event listener functions. Instead, make the function <code>async</code> and <code>await</code> the promise.</p>\n<pre><code>// BAD\nconst handleClickNavigate = () =&gt; {\n  void navigate('/path');\n};\n\n// GOOD\nconst handleClickNavigate = async () =&gt; {\n  await navigate('/path');\n};\n</code></pre>\n<h2>canonical/export-specifier-newline vs prettier conflict</h2>\n<p>Use inline <code>export const</code> declarations instead of a grouped <code>export { ... }</code> statement to avoid circular fix warnings between these two rules.</p>\n<pre><code>// BAD, causes circular fix between prettier and canonical\nexport {DAYS, DURATIONS, FITNESS_GOALS};\n\n// GOOD, declare with export directly\nexport const DAYS = ['mon', 'tue'] as const;\nexport const DURATIONS = [15, 30, 45] as const;\nexport const FITNESS_GOALS = ['weight_loss'] as const;\n</code></pre>\n<h2>no-shadow trailing underscores</h2>\n<p>ESLint's <code>no-shadow</code> autofixes by appending <code>_</code>. Once shadowing is resolved, remove the trailing <code>_</code>.</p>\n<h2>sonarjs/deprecation</h2>\n<p>Never suppress with <code>eslint-disable</code>. Always fix the underlying deprecation.</p>\n<p>Common case: Zod v4 deprecated <code>z.string().email()</code> in favor of <code>z.email()</code>.</p>\n<pre><code>// BAD, suppressing the warning\n// eslint-disable-next-line sonarjs/deprecation\nemail: z.string().email(),\n\n// GOOD, use the non-deprecated API\nemail: z.email(),\n</code></pre>\n<h2>you-dont-need-lodash-underscore/*</h2>\n<p>Use native JavaScript instead of lodash/underscore equivalents.</p>\n<pre><code>// BAD\nimport _ from 'lodash';\nconst first = _.find(items, (item) =&gt; item.active);\nconst names = _.map(items, (item) =&gt; item.name);\n\n// GOOD\nconst first = items.find((item) =&gt; item.active);\nconst names = items.map((item) =&gt; item.name);\n</code></pre>\n<h2>testing-library/prefer-screen-queries</h2>\n<p>Use <code>screen</code> queries instead of destructuring from <code>render()</code>.</p>\n<pre><code>// BAD\nconst {getByText, getByRole} = render(&lt;MyComponent /&gt;);\n\n// GOOD\nrender(&lt;MyComponent /&gt;);\nscreen.getByText('...');\nscreen.getByRole('button');\n</code></pre>\n<h2>testing-library/await-async-events</h2>\n<p><code>userEvent</code> methods are async, always <code>await</code> them.</p>\n<pre><code>// BAD\nuserEvent.click(button);\n\n// GOOD\nawait userEvent.click(button);\n</code></pre>\n<h2>jest-dom/prefer-*</h2>\n<p>Use jest-dom matchers instead of raw DOM property checks.</p>\n<pre><code>// BAD\nexpect(input.value).toBe('hello');\nexpect(checkbox.checked).toBe(true);\nexpect(el.textContent).toBe('Hello');\n\n// GOOD\nexpect(input).toHaveValue('hello');\nexpect(checkbox).toBeChecked();\nexpect(el).toHaveTextContent('Hello');\n</code></pre>\n","files":[{"path":"SKILL.md","sizeBytes":2940,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-08-23T11:51:32.548181Z","sha256":"C7D2D11D10D4F8D23EA53CC8973A0AD61606C21C3FF8911833FAF334090D12D0","sizeBytes":1339},"review":null,"source":{"repositoryUrl":"https://github.com/gaia-react/gaia","path":".claude/skills/eslint-fixes","license":"MIT","commit":"8fcb968f0e6ebaa8764869019b653e308e0cb4ce","subtreeSha":"C88840F618CCBB1585B9DD16A7005C790527AB14E4DCE353C62D31B3FC5AD50E","lastSyncedAt":"2026-09-27T20:54:19.325959Z"},"reviewedAt":"2026-08-23T11:53:03.088245Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/gaia-react/gaia/tree/main/.claude/skills/eslint-fixes"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install gaia-react-gaia@llmmart"},{"target":"git","command":"git clone https://github.com/gaia-react/gaia.git"}]}