import { base } from '../../eslint.config.mjs'; import reactHooks from 'eslint-plugin-react-hooks'; import globals from 'globals'; // Strict Feature-Sliced Design: a layer may import only from itself and the // layers below it. Upward imports are build errors. Enforced with path-based // no-restricted-imports (reliable across relative imports), one override per // layer forbidding every higher layer. const FSD_LAYERS = ['app', 'pages', 'widgets', 'features', 'entities', 'shared']; const fsdLayerOverrides = FSD_LAYERS.flatMap((layer, index) => { const higherLayers = FSD_LAYERS.slice(0, index); if (higherLayers.length === 0) { return []; } return [ { files: [`src/${layer}/**/*.{ts,tsx}`], rules: { 'no-restricted-imports': [ 'error', { patterns: higherLayers.map((higher) => ({ group: [`**/${higher}`, `**/${higher}/**`], message: `FSD violation: layer '${layer}' may not import from the higher layer '${higher}'.`, })), }, ], }, }, ]; }); export default [ // `public/` holds static assets (incl. the service worker) served as-is; it is // not part of the typed TS project, so keep it out of the typed-lint graph. { ignores: ['dist/**', 'public/**'] }, ...base, { files: ['src/**/*.{ts,tsx}'], languageOptions: { globals: { ...globals.browser }, }, plugins: { 'react-hooks': reactHooks, }, rules: { 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'warn', }, }, ...fsdLayerOverrides, ];