UNPKG

eslint-config-es

Version:

eslint-config-es contains a strict ESLint configuration for ES2015+ and TypeScript.

129 lines (115 loc) 3.13 kB
import { compile } from './betterRules'; import { isInstalled } from './isInstalled'; import { Linter } from 'eslint'; import { mapKeys } from 'lodash'; import path from 'path'; import { comments, coreRules, extended, importRules, mochaRules, react, reactHooks, sharedCoreTypescript, sharedImportTypescript, typescript, unicorn } from './rules'; const parserOptions: Linter.ParserOptions = { sourceType: 'script', ecmaVersion: 'latest', ecmaFeatures: { globalReturn: false, impliedStrict: false, jsx: true } }; const env = { es6: true, mocha: true, node: true }; const globals = {}; const plugins = [ 'eslint-comments', 'extended', 'import', 'mocha', 'unicorn' ]; const settings = {}; if (isInstalled('react')) { plugins.push('react'); plugins.push('react-hooks'); // @ts-expect-error react is actually set by the plugin. settings.react = { version: 'detect' }; } // eslint-disable-next-line import/no-mutable-exports let rules: Linter.RulesRecord = compile({ ...comments, ...coreRules, ...extended, ...importRules, ...mochaRules, ...unicorn, ...sharedCoreTypescript({ language: 'javascript' }), ...sharedImportTypescript({ language: 'javascript' }) }); // The ruleName of "react/prefer-es6-class" is wrongly converted to kebab-case // as lodash's kebab function treats the "6" as its own word, resulting in prefer-es-6-class. // The workaround below fixes this. const fixReactEs6Rule = (reactRulesRecord: Linter.RulesRecord): Linter.RulesRecord => mapKeys(reactRulesRecord, (value, key): string => { if (key === 'react/prefer-es-6-class') { return 'react/prefer-es6-class'; } return key; }); if (plugins.includes('react')) { rules = { ...rules, ...fixReactEs6Rule(compile(react)), ...compile(reactHooks) }; } // This import config is necessary to make eslint-plugin-import work // Import config taken from https://github.com/import-js/eslint-plugin-import/blob/main/config/typescript.js const allExtensions = [ '.ts', '.tsx', '.js', '.jsx' ]; const pluginImportSettings: Linter.BaseConfig['settings'] = { 'import/extensions': allExtensions, 'import/external-module-folders': [ 'node_modules', 'node_modules/@types' ], 'import/parsers': { '@typescript-eslint/parser': [ '.ts', '.tsx' ] }, 'import/resolver': { node: { extensions: allExtensions } } }; const overrides: Linter.ConfigOverride[] = [ { files: [ '*.ts', '*.tsx' ], parser: '@typescript-eslint/parser', settings: { ...pluginImportSettings }, parserOptions: { ...parserOptions, sourceType: 'module', project: path.join('.', 'tsconfig.json') }, // eslint-disable-next-line @typescript-eslint/naming-convention globals: { ...globals, NodeJS: true }, plugins: [ ...plugins, '@typescript-eslint' ], rules: compile({ ...typescript, ...sharedCoreTypescript({ language: 'typescript' }), ...sharedImportTypescript({ language: 'typescript' }) }) } ]; export { parserOptions, env, globals, plugins, settings, rules, overrides };