const project = [ './tsconfig.json', './packages/*/tsconfig.json', ]; module.exports = { root: true, plugins: [ '@typescript-eslint', ], extends: [ 'airbnb', 'airbnb-typescript', 'airbnb/hooks', 'plugin:@typescript-eslint/recommended', 'plugin:@typescript-eslint/recommended-requiring-type-checking', ], env: { es6: true, node: true, browser: false, jest: true, }, parser: '@typescript-eslint/parser', parserOptions: { extraFileExtensions: ['.cjs'], sourceType: 'module', project, allowAutomaticSingleRunInference: false, tsconfigRootDir: __dirname, warnOnUnsupportedTypeScriptVersion: false, EXPERIMENTAL_useSourceOfProjectReferenceRedirect: false, }, settings: { 'import/parsers': { '@typescript-eslint/parser': ['.ts', '.tsx'], }, 'import/resolver': { typescript: { alwaysTryTypes: true, project, }, }, }, rules: { 'import/no-unresolved': 'error', 'import/order': [ 'error', { alphabetize: { order: 'asc', }, 'newlines-between': 'always', }, ], }, overrides: [ { files: [ '**/stores/**/*.ts', ], rules: { // In a mobx-state-tree action, we assign to the properties of `self` to update the store. 'no-param-reassign': 'off', // mobx-state-tree uses empty interfaces to speed up typechecking. '@typescript-eslint/no-empty-interface': 'off', }, }, { files: [ '**/__tests__/*.{ts,tsx}', '**/*.{spec,test}.{ts,tsx}', ], rules: { // If a non-null assertion fails in a test, the test will also fail anyways. '@typescript-eslint/no-non-null-assertion': 'off', // Jest mocks use unbound method references. '@typescript-eslint/unbound-method': 'off', }, }, { files: [ '**/*.js', ], rules: { // ESM requires extensions for imports. 'import/extensions': [ 'error', 'ignorePackages', ], }, }, { files: [ '**/*.cjs', ], parserOptions: { sourceType: 'script', }, }, { files: [ '.electron-builder.config.cjs', 'config/**/*.{cjs,js}', 'jest.config.js', 'scripts/**/*.js', 'packages/*/.eslintrc.cjs', 'packages/*/*.config.js', ], env: { // Config files are never run in a browser (even in frontend projects). browser: false, node: true, jest: false, }, rules: { // Config files and build scripts are allowed to use devDependencies. 'import/no-extraneous-dependencies': [ 'error', { devDependencies: true, }, ], // Allow reporting progress to the console from scripts. 'no-console': 'off', }, }, { files: [ 'packages/*/*.config.js', ], rules: { // Allow relative imports of config files from the root package. 'import/no-relative-packages': 'off', }, }, ], };