/** * @remarks * Notes on plugins we _don't_ use: * * ## plugin:react-hooks * We don't use the react hooks plugin because it disallows valid use-cases * such as this: * * ```ts * export default function useValToAtom(val: S): Atom { * const atom = useMemo(() => { * return new Atom(val) * }, []) // <-- we don't _need_ to include `val` here, but the lint rule will require it * * useLayoutEffect(() => { * atom.setState(val) * }, [val]) // <-- we also know `atom` will never change, but the lint rule doesn't * * return atom * ``` * * @type {import("eslint").Linter.Config} */ module.exports = { root: true, plugins: ['unused-imports', 'eslint-plugin-tsdoc', 'import', 'react'], settings: { react: { version: '18.2', }, }, extends: [], rules: { 'unused-imports/no-unused-imports': 'warn', 'tsdoc/syntax': 'warn', 'no-debugger': 'error', 'react/no-deprecated': 'error', 'no-restricted-imports': [ 'error', { paths: [ { name: 'lodash', message: 'Use lodash-es which is tree-shaking friendly', }, ], }, ], }, ignorePatterns: ['*.d.ts', '*.ignore.ts', 'compat-tests/*'], overrides: [ { files: ['*.ts', '*.tsx'], parser: '@typescript-eslint/parser', plugins: ['@typescript-eslint'], parserOptions: { project: [ './theatre/tsconfig.json', './packages/*/tsconfig.json', './packages/*/devEnv/tsconfig.json', './examples/*/tsconfig.json', './devEnv/tsconfig.json', './compat-tests/tsconfig.json', ], }, rules: { '@typescript-eslint/await-thenable': 'warn', '@typescript-eslint/no-throw-literal': 'warn', '@typescript-eslint/switch-exhaustiveness-check': 'error', '@typescript-eslint/consistent-type-imports': [ 'warn', { prefer: 'type-imports', }, ], '@typescript-eslint/no-unused-vars': 'off', '@typescript-eslint/no-floating-promises': 'warn', }, }, { plugins: ['react'], files: ['*.mjs', '*.js'], rules: { 'react/jsx-uses-react': 'error', 'react/jsx-uses-vars': 'error', 'tsdoc/syntax': 'off', }, parser: 'espree', parserOptions: { sourceType: 'module', ecmaVersion: 2021, ecmaFeatures: { jsx: true, }, }, }, { files: [ `packages/*/**/*.ts`, `packages/*/**/*.tsx`, `packages/*/**/*.js`, ], rules: { 'import/no-extraneous-dependencies': [ 'error', // {optionalDependencies: false, peerDependencies: false}, ], }, }, ], }