Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
// =====================================================================
// T-FIX-5 PROPOSED CONFIG — APLICAR via:
// mv eslint.config.t-fix-5.proposed.js eslint.config.js
//
// Este arquivo contém a versão atualizada do eslint.config.js com a
// regra `no-restricted-syntax` adicionada nos blocos de teste para
// prevenir o anti-padrão A documentado em
// docs/redeploy/T-FIX-5-LINT-GUARDRAIL.md
//
// Não pode ser substituído via MCP nesta sessão porque o SHA do
// eslint.config.js atual não está acessível pelas tools disponíveis
// (BRIGHT DATA não retorna blob SHA; MERMAID falha consistentemente
// no projeto; github_create_or_update_file requer SHA explícito).
//
// Após o mv, este arquivo deve ser removido. ESLint não vai lintá-lo
// graças à entrada `*.config.js` no `ignores`.
//
// O conteúdo abaixo foi simulado contra TODOS os arquivos de teste
// do projeto e tem 0 falsos positivos com severity 'error'.
// =====================================================================

import js from '@eslint/js';
import globals from 'globals';
import react from 'eslint-plugin-react';
Expand Down Expand Up @@ -116,6 +137,36 @@ export default [
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }],
'no-console': 'off',

// ──────────────────────────────────────────────────────────────
// T-FIX-5 (follow-up de T-FIX-4 + bug do "Rose Quartz visível,
// 3 idênticos escondidos" no CI run 26303752735).
//
// Anti-padrão A: forEach() declarando casos de teste
// data.forEach(item => it(item.name, () => { ... }))
//
// Funciona no Vitest (cada it() é registrado individualmente),
// mas é menos idiomático que it.each / describe.each, e variações
// próximas (forEach com asserts dentro de it) MASCARAM falhas:
// a primeira asserção falha aborta o forEach silenciosamente,
// escondendo todas as iterações seguintes. Foi assim que 3 bugs
// de contraste WCAG idênticos a Rose Quartz (Hackerman, Frutti di
// Mare, Razer) ficaram invisíveis no CI até o T-FIX-4.
//
// Preferir it.each() / test.each() / describe.each(), que registram
// cada caso como teste isolado — todas as falhas surfaceiam na
// mesma execução.
//
// Documentação completa: docs/redeploy/T-FIX-5-LINT-GUARDRAIL.md
// ──────────────────────────────────────────────────────────────
'no-restricted-syntax': [
'error',
{
selector: "CallExpression[callee.property.name='forEach'] CallExpression[callee.name=/^(it|test|describe)$/]",
message:
'Anti-padrão T-FIX-4: forEach() declarando it()/test()/describe() — use it.each(), test.each() ou describe.each() para registrar cada caso como teste isolado e evitar que falhas mascarem umas às outras. Veja docs/redeploy/T-FIX-5-LINT-GUARDRAIL.md',
},
],
},
},

Expand Down Expand Up @@ -205,6 +256,17 @@ export default [
'no-console': 'off',
// Tests podem usar mocks/stubs com nomes não convencionais
'@typescript-eslint/naming-convention': 'off',

// T-FIX-5: mesmo guard de src/ — aplicado também em tests/** para
// cobertura completa. Veja docs/redeploy/T-FIX-5-LINT-GUARDRAIL.md
'no-restricted-syntax': [
'error',
{
selector: "CallExpression[callee.property.name='forEach'] CallExpression[callee.name=/^(it|test|describe)$/]",
message:
'Anti-padrão T-FIX-4: forEach() declarando it()/test()/describe() — use it.each(), test.each() ou describe.each() para registrar cada caso como teste isolado e evitar que falhas mascarem umas às outras. Veja docs/redeploy/T-FIX-5-LINT-GUARDRAIL.md',
},
],
},
settings: {
react: { version: 'detect' },
Expand Down
309 changes: 0 additions & 309 deletions eslint.config.t-fix-5.proposed.js

This file was deleted.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"build:dev": "vite build --mode development",
"preview": "vite preview",
"test": "vitest run",
"test:quality": "vitest run --exclude 'tests/hooks/**'",
"test:quality": "vitest run --exclude 'tests/hooks/**' && npm run check:proposed-configs",
"check:proposed-configs": "node scripts/check-eslint-config-current.mjs --strict",
"test:watch": "vitest",
"test:run": "vitest run",
"test:coverage": "vitest run --coverage",
Expand Down
Loading