75 lines
2.8 KiB
JavaScript
75 lines
2.8 KiB
JavaScript
const { defineConfig } = require('eslint/config');
|
||
const expoConfig = require('eslint-config-expo/flat');
|
||
const boundaries = require('eslint-plugin-boundaries');
|
||
|
||
module.exports = defineConfig([
|
||
expoConfig,
|
||
{
|
||
ignores: ['dist/*', '.expo/*'],
|
||
},
|
||
{
|
||
files: ['src/**/*.{ts,tsx}', 'app/**/*.{ts,tsx}'],
|
||
plugins: { boundaries },
|
||
settings: {
|
||
'import/resolver': { typescript: { project: './tsconfig.json' } },
|
||
'boundaries/include': ['src/**/*', 'app/**/*'],
|
||
'boundaries/elements': [
|
||
{ type: 'routes', pattern: 'app' },
|
||
{ type: 'pages', pattern: 'src/pages/*', capture: ['slice'] },
|
||
{ type: 'widgets', pattern: 'src/widgets/*', capture: ['slice'] },
|
||
{ type: 'features', pattern: 'src/features/*', capture: ['slice'] },
|
||
{ type: 'entities', pattern: 'src/entities/*', capture: ['slice'] },
|
||
{ type: 'shared', pattern: 'src/shared/*', capture: ['segment'] },
|
||
],
|
||
},
|
||
rules: {
|
||
'boundaries/dependencies': ['error', {
|
||
default: 'disallow',
|
||
message: 'Слой {{from.type}} не может импортировать {{to.type}}',
|
||
policies: [
|
||
{
|
||
from: { element: { type: 'routes' } },
|
||
allow: { to: { element: { types: { anyOf: ['pages', 'widgets', 'features', 'entities', 'shared'] } } } },
|
||
},
|
||
{
|
||
from: { element: { type: 'pages' } },
|
||
allow: { to: { element: { types: { anyOf: ['widgets', 'features', 'entities', 'shared'] } } } },
|
||
},
|
||
{
|
||
from: { element: { type: 'widgets' } },
|
||
allow: { to: { element: { types: { anyOf: ['features', 'entities', 'shared'] } } } },
|
||
},
|
||
{
|
||
from: { element: { type: 'features' } },
|
||
allow: { to: { element: { types: { anyOf: ['entities', 'shared'] } } } },
|
||
},
|
||
{
|
||
from: { element: { type: 'entities' } },
|
||
allow: { to: { element: { type: 'shared' } } },
|
||
},
|
||
{
|
||
from: { element: { type: 'entities' } },
|
||
allow: { to: { element: { type: 'entities', fileInternalPath: '@x/*.ts' } } },
|
||
},
|
||
{
|
||
from: { element: { type: 'shared' } },
|
||
allow: { to: { element: { type: 'shared' } } },
|
||
},
|
||
{
|
||
disallow: {
|
||
to: {
|
||
element: {
|
||
types: { anyOf: ['pages', 'widgets', 'features', 'entities'] },
|
||
fileInternalPath: '!(index.ts|@x/*.ts)',
|
||
},
|
||
},
|
||
},
|
||
message: 'Импортируйте слайс через public API, а не вглубь: {{dependency.source}}',
|
||
},
|
||
],
|
||
}],
|
||
'boundaries/no-unknown-dependencies': ['warn', { require: 'element' }],
|
||
},
|
||
},
|
||
]);
|