93 lines
3.7 KiB
JavaScript
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',
|
|
},
|
|
},
|
|
)
|