universo-platform-2d

Форк
0
/
.eslintrc.js 
289 строк · 8.0 Кб
1
const { join } = require('node:path');
2

3
const createPattern = packageName => [
4
  {
5
    group: ['**/dist', '**/dist/**'],
6
    message: 'Do not import from dist',
7
    allowTypeImports: false,
8
  },
9
  {
10
    group: ['**/src', '**/src/**'],
11
    message: 'Do not import from src',
12
    allowTypeImports: false,
13
  },
14
  {
15
    group: [`@affine/${packageName}`],
16
    message: 'Do not import package itself',
17
    allowTypeImports: false,
18
  },
19
  {
20
    group: [`@toeverything/${packageName}`],
21
    message: 'Do not import package itself',
22
    allowTypeImports: false,
23
  },
24
  {
25
    group: ['@blocksuite/store'],
26
    message: "Import from '@blocksuite/global/utils'",
27
    importNames: ['assertExists', 'assertEquals'],
28
  },
29
  {
30
    group: ['react-router-dom'],
31
    message: 'Use `useNavigateHelper` instead',
32
    importNames: ['useNavigate'],
33
  },
34
  {
35
    group: ['@affine/env/constant'],
36
    message:
37
      'Do not import from @affine/env/constant. Use `BUILD_CONFIG.isElectron` instead',
38
    importNames: ['isElectron'],
39
  },
40
];
41

42
const allPackages = [
43
  'packages/backend/server',
44
  'packages/frontend/component',
45
  'packages/frontend/core',
46
  'packages/frontend/apps/electron',
47
  'packages/frontend/apps/web',
48
  'packages/frontend/apps/mobile',
49
  'packages/frontend/graphql',
50
  'packages/frontend/i18n',
51
  'packages/frontend/native',
52
  'packages/frontend/templates',
53
  'packages/frontend/track',
54
  'packages/common/debug',
55
  'packages/common/env',
56
  'packages/common/infra',
57
  'packages/common/theme',
58
  'tools/cli',
59
];
60

61
/**
62
 * @type {import('eslint').Linter.Config}
63
 */
64
const config = {
65
  root: true,
66
  settings: {
67
    react: {
68
      version: 'detect',
69
    },
70
    next: {
71
      rootDir: 'packages/frontend/core',
72
    },
73
  },
74
  extends: [
75
    'eslint:recommended',
76
    'plugin:react-hooks/recommended',
77
    'plugin:react/recommended',
78
    'plugin:react/jsx-runtime',
79
    'plugin:@typescript-eslint/recommended',
80
    'prettier',
81
  ],
82
  parser: '@typescript-eslint/parser',
83
  parserOptions: {
84
    ecmaFeatures: {
85
      globalReturn: false,
86
      impliedStrict: true,
87
      jsx: true,
88
    },
89
    ecmaVersion: 'latest',
90
    sourceType: 'module',
91
    project: join(__dirname, 'tsconfig.eslint.json'),
92
  },
93
  plugins: [
94
    'react',
95
    '@typescript-eslint',
96
    'simple-import-sort',
97
    'sonarjs',
98
    'import-x',
99
    'unused-imports',
100
    'unicorn',
101
    'rxjs',
102
  ],
103
  rules: {
104
    'array-callback-return': 'error',
105
    'no-undef': 'off',
106
    'no-empty': 'off',
107
    'no-func-assign': 'off',
108
    'no-cond-assign': 'off',
109
    'no-constant-binary-expression': 'error',
110
    'no-constructor-return': 'error',
111
    'no-self-compare': 'error',
112
    eqeqeq: ['error', 'always', { null: 'ignore' }],
113
    'react/prop-types': 'off',
114
    'react/jsx-no-useless-fragment': 'error',
115
    '@typescript-eslint/consistent-type-imports': 'error',
116
    '@typescript-eslint/no-non-null-assertion': 'error',
117
    '@typescript-eslint/no-explicit-any': 'off',
118
    '@typescript-eslint/no-empty-function': 'off',
119
    '@typescript-eslint/await-thenable': 'error',
120
    '@typescript-eslint/require-array-sort-compare': 'error',
121
    '@typescript-eslint/unified-signatures': 'error',
122
    '@typescript-eslint/prefer-for-of': 'error',
123
    '@typescript-eslint/no-unused-vars': [
124
      'error',
125
      {
126
        varsIgnorePattern: '^_',
127
        argsIgnorePattern: '^_',
128
        caughtErrorsIgnorePattern: '^_',
129
      },
130
    ],
131
    'unused-imports/no-unused-imports': 'error',
132
    'simple-import-sort/imports': 'error',
133
    'simple-import-sort/exports': 'error',
134
    'import-x/no-duplicates': 'error',
135
    '@typescript-eslint/ban-ts-comment': [
136
      'error',
137
      {
138
        'ts-expect-error': 'allow-with-description',
139
        'ts-ignore': true,
140
        'ts-nocheck': true,
141
        'ts-check': false,
142
      },
143
    ],
144
    '@typescript-eslint/no-restricted-imports': [
145
      'error',
146
      {
147
        patterns: [
148
          {
149
            group: ['**/dist'],
150
            message: "Don't import from dist",
151
            allowTypeImports: false,
152
          },
153
          {
154
            group: ['**/src'],
155
            message: "Don't import from src",
156
            allowTypeImports: false,
157
          },
158
          {
159
            group: ['@blocksuite/store'],
160
            message: "Import from '@blocksuite/global/utils'",
161
            importNames: ['assertExists', 'assertEquals'],
162
          },
163
        ],
164
      },
165
    ],
166
    'unicorn/filename-case': [
167
      'error',
168
      {
169
        case: 'kebabCase',
170
        ignore: ['^\\[[a-zA-Z0-9-_]+\\]\\.tsx$'],
171
      },
172
    ],
173
    'unicorn/no-unnecessary-await': 'error',
174
    'unicorn/no-useless-fallback-in-spread': 'error',
175
    'unicorn/prefer-dom-node-dataset': 'error',
176
    'unicorn/prefer-dom-node-append': 'error',
177
    'unicorn/prefer-dom-node-remove': 'error',
178
    'unicorn/prefer-array-some': 'error',
179
    'unicorn/prefer-date-now': 'error',
180
    'unicorn/prefer-blob-reading-methods': 'error',
181
    'unicorn/no-typeof-undefined': 'error',
182
    'unicorn/no-useless-promise-resolve-reject': 'error',
183
    'unicorn/no-new-array': 'error',
184
    'unicorn/new-for-builtins': 'error',
185
    'unicorn/prefer-node-protocol': 'error',
186
    'sonarjs/no-all-duplicated-branches': 'error',
187
    'sonarjs/no-element-overwrite': 'error',
188
    'sonarjs/no-empty-collection': 'error',
189
    'sonarjs/no-extra-arguments': 'error',
190
    'sonarjs/no-identical-conditions': 'error',
191
    'sonarjs/no-identical-expressions': 'error',
192
    'sonarjs/no-ignored-return': 'error',
193
    'sonarjs/no-one-iteration-loop': 'error',
194
    'sonarjs/no-use-of-empty-return-value': 'error',
195
    'sonarjs/non-existent-operator': 'error',
196
    'sonarjs/no-collapsible-if': 'error',
197
    'sonarjs/no-same-line-conditional': 'error',
198
    'sonarjs/no-duplicated-branches': 'error',
199
    'sonarjs/no-collection-size-mischeck': 'error',
200
    'sonarjs/no-useless-catch': 'error',
201
    'sonarjs/no-identical-functions': 'error',
202
    'rxjs/finnish': [
203
      'error',
204
      {
205
        functions: false,
206
        methods: false,
207
        strict: true,
208
        types: {
209
          '^LiveData$': true,
210
          // some yjs classes are Observables, but they don't need to be in Finnish notation
211
          '^Doc$': false, // yjs Doc
212
          '^Awareness$': false, // yjs Awareness
213
          '^UndoManager$': false, // yjs UndoManager
214
        },
215
      },
216
    ],
217
  },
218
  overrides: [
219
    {
220
      files: 'packages/backend/server/**/*.ts',
221
      rules: {
222
        '@typescript-eslint/consistent-type-imports': 0,
223
      },
224
    },
225
    {
226
      files: '*.cjs',
227
      rules: {
228
        '@typescript-eslint/no-var-requires': 0,
229
      },
230
    },
231
    ...allPackages.map(pkg => ({
232
      files: [`${pkg}/src/**/*.ts`, `${pkg}/src/**/*.tsx`, `${pkg}/**/*.mjs`],
233
      rules: {
234
        '@typescript-eslint/no-restricted-imports': [
235
          'error',
236
          {
237
            patterns: createPattern(pkg),
238
          },
239
        ],
240
        '@typescript-eslint/no-floating-promises': [
241
          'error',
242
          {
243
            ignoreVoid: false,
244
            ignoreIIFE: false,
245
          },
246
        ],
247
        '@typescript-eslint/no-misused-promises': ['error'],
248
        '@typescript-eslint/prefer-readonly': 'error',
249
        'import-x/no-extraneous-dependencies': ['error'],
250
        'react-hooks/exhaustive-deps': [
251
          'warn',
252
          {
253
            additionalHooks:
254
              '(useAsyncCallback|useCatchEventCallback|useDraggable|useDropTarget|useRefEffect)',
255
          },
256
        ],
257
      },
258
    })),
259
    {
260
      files: [
261
        '**/__tests__/**/*',
262
        '**/*.stories.tsx',
263
        '**/*.spec.ts',
264
        '**/tests/**/*',
265
        'scripts/**/*',
266
        '**/benchmark/**/*',
267
        '**/__debug__/**/*',
268
        '**/e2e/**/*',
269
      ],
270
      rules: {
271
        '@typescript-eslint/no-non-null-assertion': 0,
272
        '@typescript-eslint/ban-ts-comment': [
273
          'error',
274
          {
275
            'ts-expect-error': false,
276
            'ts-ignore': true,
277
            'ts-nocheck': true,
278
            'ts-check': false,
279
          },
280
        ],
281
        '@typescript-eslint/no-floating-promises': 0,
282
        '@typescript-eslint/no-misused-promises': 0,
283
        '@typescript-eslint/no-restricted-imports': 0,
284
      },
285
    },
286
  ],
287
};
288

289
module.exports = config;
290

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.