Files
inq-roi-simulador-web/eslint.config.js

93 lines
3.7 KiB
JavaScript

import js from '@eslint/js'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
export default tseslint.config(
{ ignores: ['dist', 'node_modules'] },
// ─── Base: JS + TS strict ────────────────────────────────────────────────────
{
extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ['**/*.{ts,tsx}'],
plugins: {
'react-hooks': reactHooks,
'react-refresh': reactRefresh,
},
rules: {
...reactHooks.configs.recommended.rules,
'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],
// ── Regla estructural crítica ─────────────────────────────────────────
// Repositorios solo pueden llamarse desde stores.
// Cualquier import de persistence/repositories en código que no sea src/store/**
// falla el lint con un mensaje explicativo.
'no-restricted-imports': [
'error',
{
patterns: [
{
group: ['*/persistence/repositories*', '../persistence/repositories*', '@/persistence/repositories*'],
message:
'Los repositorios solo deben llamarse desde stores (src/store/**). ' +
'Usá el store correspondiente (useProcessStore, useSimulationStore, etc.).',
},
],
},
],
// ── Reglas ajustadas al proyecto ─────────────────────────────────────
// any en bordes con librerías sin tipos (bpmn-js, jsPDF, autotable) está
// permitido por CLAUDE.md — se reporta como warning, no error.
'@typescript-eslint/no-explicit-any': 'warn',
// Funciones auxiliares definidas dentro de componentes (ej: Th en ActivitiesTable,
// handlers en BpmnCanvas) son un patrón aceptado en este codebase. El riesgo de
// reset de estado no aplica porque son funciones sin estado propio.
'react-hooks/static-components': 'off',
// setState síncrono en useEffect con condicional deliberado (sincronización de
// estado local con props/store). Los efectos están correctamente dependenciados.
'react-hooks/set-state-in-effect': 'off',
// Cálculos de posición en pdf-export.ts usan y como variable acumulativa;
// el patrón y += delta → doc.addPage() → y = PDF.margin es intencional
// (separa visualmente las secciones del cálculo aunque no use el valor final).
'no-useless-assignment': 'warn',
},
},
// ─── Override: src/store/** puede importar repositories ──────────────────────
{
files: ['src/store/**/*.{ts,tsx}'],
rules: {
'no-restricted-imports': 'off',
},
},
// ─── Override: features/import puede importar repositories (operación de
// importación inicial — no hay estado de simulación previo que invalidar) ──
{
files: ['src/features/import/**/*.{ts,tsx}'],
rules: {
'no-restricted-imports': 'off',
},
},
// ─── Override: features/report usa repos en modo read-only (useReportData) ───
{
files: ['src/features/report/useReportData.ts'],
rules: {
'no-restricted-imports': 'off',
},
},
// ─── Override: tests e2e y integración pueden importar repos directamente ────
{
files: ['tests/**/*.{ts,tsx}'],
rules: {
'no-restricted-imports': 'off',
},
},
)