module.exports = { env: { node: true, es2021: true, jest: true, }, extends: [ 'eslint:recommended', 'plugin:import/errors', 'plugin:import/warnings', 'plugin:node/recommended', 'plugin:promise/recommended', 'plugin:prettier/recommended', ], parserOptions: { ecmaVersion: 2021, sourceType: 'commonjs', }, plugins: ['import', 'node', 'promise', 'prettier'], rules: { // Error prevention 'no-var': 'error', 'no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }], 'no-console': ['warn', { allow: ['warn', 'error', 'log', 'info'] }], 'no-debugger': 'warn', 'no-duplicate-imports': 'error', 'no-unused-expressions': ['error', { allowShortCircuit: true, allowTernary: true }], 'no-use-before-define': ['error', { functions: false }], // Best practices 'prefer-const': 'error', 'no-const-assign': 'error', 'prefer-arrow-callback': 'error', 'arrow-body-style': ['error', 'as-needed'], 'no-return-await': 'off', 'require-await': 'warn', // Import rules 'import/order': [ 'error', { groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], 'newlines-between': 'always', alphabetize: { order: 'asc', caseInsensitive: true }, }, ], 'import/no-unresolved': 'error', 'import/no-duplicates': 'error', 'import/no-commonjs': 'off', 'import/no-dynamic-require': 'off', // Node.js specific rules 'node/no-unsupported-features/es-syntax': [ 'error', { version: '>=20.0.0', ignores: ['modules', 'restSpreadProperties'], }, ], 'node/no-unsupported-features/node-builtins': [ 'error', { version: '>=20.0.0', }, ], 'node/no-missing-import': 'error', 'node/no-deprecated-api': 'error', 'node/no-missing-require': 'error', 'node/no-new-require': 'error', 'node/no-callback-literal': 'error', 'node/handle-callback-err': 'error', 'node/no-path-concat': 'error', 'node/no-process-exit': 'error', 'node/no-sync': 'warn', // Promise rules 'promise/always-return': 'off', 'promise/no-return-wrap': 'error', 'promise/param-names': 'error', 'promise/catch-or-return': 'error', 'promise/no-native': 'off', 'promise/no-callback-in-promise': 'warn', 'promise/no-promise-in-callback': 'warn', 'promise/no-nesting': 'warn', // Prettier rules 'prettier/prettier': [ 'error', { singleQuote: true, trailingComma: 'es5', printWidth: 100, tabWidth: 2, semi: true, }, ], }, settings: { 'import/resolver': { node: { extensions: ['.js', '.jsx', '.ts', '.tsx'], }, }, node: { tryExtensions: ['.js', '.jsx', '.ts', '.tsx', '.json'], }, }, overrides: [ { files: ['**/*.test.js', '**/*.spec.js'], env: { jest: true, }, rules: { 'node/no-unpublished-import': 'off', 'node/no-missing-import': 'off', }, }, ], };