universo-platform-2d
/
.eslintrc.js
289 строк · 8.0 Кб
1const { join } = require('node:path');2
3const createPattern = packageName => [4{5group: ['**/dist', '**/dist/**'],6message: 'Do not import from dist',7allowTypeImports: false,8},9{10group: ['**/src', '**/src/**'],11message: 'Do not import from src',12allowTypeImports: false,13},14{15group: [`@affine/${packageName}`],16message: 'Do not import package itself',17allowTypeImports: false,18},19{20group: [`@toeverything/${packageName}`],21message: 'Do not import package itself',22allowTypeImports: false,23},24{25group: ['@blocksuite/store'],26message: "Import from '@blocksuite/global/utils'",27importNames: ['assertExists', 'assertEquals'],28},29{30group: ['react-router-dom'],31message: 'Use `useNavigateHelper` instead',32importNames: ['useNavigate'],33},34{35group: ['@affine/env/constant'],36message:37'Do not import from @affine/env/constant. Use `BUILD_CONFIG.isElectron` instead',38importNames: ['isElectron'],39},40];41
42const 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*/
64const config = {65root: true,66settings: {67react: {68version: 'detect',69},70next: {71rootDir: 'packages/frontend/core',72},73},74extends: [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],82parser: '@typescript-eslint/parser',83parserOptions: {84ecmaFeatures: {85globalReturn: false,86impliedStrict: true,87jsx: true,88},89ecmaVersion: 'latest',90sourceType: 'module',91project: join(__dirname, 'tsconfig.eslint.json'),92},93plugins: [94'react',95'@typescript-eslint',96'simple-import-sort',97'sonarjs',98'import-x',99'unused-imports',100'unicorn',101'rxjs',102],103rules: {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',112eqeqeq: ['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{126varsIgnorePattern: '^_',127argsIgnorePattern: '^_',128caughtErrorsIgnorePattern: '^_',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{147patterns: [148{149group: ['**/dist'],150message: "Don't import from dist",151allowTypeImports: false,152},153{154group: ['**/src'],155message: "Don't import from src",156allowTypeImports: false,157},158{159group: ['@blocksuite/store'],160message: "Import from '@blocksuite/global/utils'",161importNames: ['assertExists', 'assertEquals'],162},163],164},165],166'unicorn/filename-case': [167'error',168{169case: 'kebabCase',170ignore: ['^\\[[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{205functions: false,206methods: false,207strict: true,208types: {209'^LiveData$': true,210// some yjs classes are Observables, but they don't need to be in Finnish notation211'^Doc$': false, // yjs Doc212'^Awareness$': false, // yjs Awareness213'^UndoManager$': false, // yjs UndoManager214},215},216],217},218overrides: [219{220files: 'packages/backend/server/**/*.ts',221rules: {222'@typescript-eslint/consistent-type-imports': 0,223},224},225{226files: '*.cjs',227rules: {228'@typescript-eslint/no-var-requires': 0,229},230},231...allPackages.map(pkg => ({232files: [`${pkg}/src/**/*.ts`, `${pkg}/src/**/*.tsx`, `${pkg}/**/*.mjs`],233rules: {234'@typescript-eslint/no-restricted-imports': [235'error',236{237patterns: createPattern(pkg),238},239],240'@typescript-eslint/no-floating-promises': [241'error',242{243ignoreVoid: false,244ignoreIIFE: 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{253additionalHooks:254'(useAsyncCallback|useCatchEventCallback|useDraggable|useDropTarget|useRefEffect)',255},256],257},258})),259{260files: [261'**/__tests__/**/*',262'**/*.stories.tsx',263'**/*.spec.ts',264'**/tests/**/*',265'scripts/**/*',266'**/benchmark/**/*',267'**/__debug__/**/*',268'**/e2e/**/*',269],270rules: {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
289module.exports = config;290