xo
Version:
JavaScript/TypeScript linter (ESLint wrapper) with great defaults
369 lines (336 loc) • 8.19 kB
JavaScript
;
module.exports = {
// Repeated here from eslint-config-xo in case some plugins set something different
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
ecmaFeatures: {
jsx: true,
},
},
// -- End repeat
plugins: [
'no-use-extend-native',
'ava',
'unicorn',
// Disabled as the plugin doesn't support ESLint 8 yet.
// 'promise',
'import',
'n', // eslint-plugin-node's successor
'eslint-comments',
],
extends: [
'plugin:ava/recommended',
'plugin:unicorn/recommended',
],
settings: {
'import/core-modules': [
'electron',
'atom',
],
},
rules: {
'no-use-extend-native/no-use-extend-native': 'error',
// TODO: Remove this override at some point.
// It's just here to ease users into readable variable names.
'unicorn/prevent-abbreviations': [
'error',
{
checkFilenames: false,
checkDefaultAndNamespaceImports: false,
checkShorthandImports: false,
extendDefaultReplacements: false,
replacements: {
// https://thenextweb.com/dd/2020/07/13/linux-kernel-will-no-longer-use-terms-blacklist-and-slave/
whitelist: {
include: true,
},
blacklist: {
exclude: true,
},
master: {
main: true,
},
slave: {
secondary: true,
},
// Not part of `eslint-plugin-unicorn`
application: {
app: true,
},
applications: {
apps: true,
},
// Part of `eslint-plugin-unicorn`
arr: {
array: true,
},
e: {
error: true,
event: true,
},
el: {
element: true,
},
elem: {
element: true,
},
len: {
length: true,
},
msg: {
message: true,
},
num: {
number: true,
},
obj: {
object: true,
},
opts: {
options: true,
},
param: {
parameter: true,
},
params: {
parameters: true,
},
prev: {
previous: true,
},
req: {
request: true,
},
res: {
response: true,
result: true,
},
ret: {
returnValue: true,
},
str: {
string: true,
},
temp: {
temporary: true,
},
tmp: {
temporary: true,
},
val: {
value: true,
},
err: {
error: true,
},
},
},
],
// TODO: Restore when it becomes safer: https://github.com/sindresorhus/eslint-plugin-unicorn/issues/681
// 'unicorn/string-content': [
// 'error',
// {
// patterns: {
// '': '’',
// [/\.\.\./.source]: '…',
// '->': '→',
// [/^http:\/\//.source]: 'http://'
// }
// }
// ],
// The character class sorting is a bit buggy at the moment.
'unicorn/better-regex': [
'error',
{
sortCharacterClasses: false,
},
],
// TODO: Disabled for now until it becomes more stable: https://github.com/sindresorhus/eslint-plugin-unicorn/search?q=consistent-destructuring+is:issue&state=open&type=issues
'unicorn/consistent-destructuring': 'off',
// TODO: Disabled for now as I don't have time to deal with the backslash that might come from this. Try to enable this rule in 2021.
'unicorn/no-null': 'off',
// We only enforce it for single-line statements to not be too opinionated.
'unicorn/prefer-ternary': [
'error',
'only-single-line',
],
// It will be disabled in the next version of eslint-plugin-unicorn.
'unicorn/prefer-json-parse-buffer': 'off',
// TODO: Remove this override when the rule is more stable.
'unicorn/consistent-function-scoping': 'off',
// TODO: Temporarily disabled until it becomes more mature.
'unicorn/no-useless-undefined': 'off',
// TODO: Temporarily disabled as the rule is buggy.
'function-call-argument-newline': 'off',
// Disabled as the plugin doesn't support ESLint 8 yet.
// 'promise/param-names': 'error',
// 'promise/no-return-wrap': [
// 'error',
// {
// allowReject: true,
// },
// ],
// 'promise/no-new-statics': 'error',
// 'promise/no-return-in-finally': 'error',
// 'promise/valid-params': 'error',
// 'promise/prefer-await-to-then': 'error',
'import/default': 'error',
'import/export': 'error',
'import/extensions': [
'error',
'always',
{
ignorePackages: true,
},
],
'import/first': 'error',
// Enabled, but disabled on TypeScript (https://github.com/xojs/xo/issues/576)
'import/named': 'error',
'import/namespace': [
'error',
{
allowComputed: true,
},
],
'import/no-absolute-path': 'error',
'import/no-anonymous-default-export': 'error',
'import/no-named-default': 'error',
'import/no-webpack-loader-syntax': 'error',
'import/no-self-import': 'error',
'import/no-cycle': [
'error',
{
ignoreExternal: true,
},
],
'import/no-useless-path-segments': 'error',
'import/newline-after-import': 'error',
'import/no-amd': 'error',
'import/no-duplicates': 'error',
// We use `unicorn/prefer-module` instead.
// 'import/no-commonjs': 'error',
// Looks useful, but too unstable at the moment
// 'import/no-deprecated': 'error',
'import/no-extraneous-dependencies': 'error',
'import/no-mutable-exports': 'error',
'import/no-named-as-default-member': 'error',
'import/no-named-as-default': 'error',
// Disabled because it's buggy and it also doesn't work with TypeScript
// 'import/no-unresolved': [
// 'error',
// {
// commonjs: false
// }
// ],
'import/order': 'error',
'import/no-unassigned-import': [
'error',
{
allow: [
'@babel/polyfill',
'**/register',
'**/register.*',
'**/register/**',
'**/register/**.*',
'**/*.css',
'**/*.scss',
'**/*.sass',
'**/*.less',
],
},
],
// Redundant with `import/no-extraneous-dependencies`.
// 'n/no-extraneous-import': 'error',
// 'n/no-extraneous-require': 'error',
// Redundant with `import/no-unresolved`.
// 'n/no-missing-import': 'error', // This rule is also buggy and doesn't support `node:`.
// 'n/no-missing-require': 'error',
'n/no-unpublished-bin': 'error',
// We have this enabled in addition to `import/extensions` as this one has an auto-fix.
'n/file-extension-in-import': [
'error',
'always',
{
// TypeScript doesn't yet support using extensions and fails with error TS2691.
'.ts': 'never',
'.tsx': 'never',
},
],
'n/no-mixed-requires': [
'error',
{
grouping: true,
allowCall: true,
},
],
'n/no-new-require': 'error',
'n/no-path-concat': 'error',
// Disabled because they're too annoying, see:
// https://github.com/mysticatea/eslint-plugin-node/issues/105
// 'n/no-unpublished-import': [
// 'error',
// {
// allowModules: [
// 'electron',
// 'atom'
// ]
// }
// ],
// 'n/no-unpublished-require': [
// 'error',
// {
// allowModules: [
// 'electron',
// 'atom'
// ]
// }
// ],
'n/process-exit-as-throw': 'error',
// Disabled as the rule doesn't exclude scripts executed with `node` but not referenced in 'bin'. See https://github.com/mysticatea/eslint-plugin-node/issues/96
// 'n/shebang': 'error',
'n/no-deprecated-api': 'error',
'n/prefer-global/buffer': [
'error',
'never',
],
'n/prefer-global/console': [
'error',
'always',
],
'n/prefer-global/process': [
'error',
'never',
],
'n/prefer-global/text-decoder': [
'error',
'always',
],
'n/prefer-global/text-encoder': [
'error',
'always',
],
'n/prefer-global/url-search-params': [
'error',
'always',
],
'n/prefer-global/url': [
'error',
'always',
],
'n/prefer-promises/dns': 'error',
'n/prefer-promises/fs': 'error',
'eslint-comments/disable-enable-pair': [
'error',
{
allowWholeFile: true,
},
],
'eslint-comments/no-aggregating-enable': 'error',
'eslint-comments/no-duplicate-disable': 'error',
// Disabled as it's already covered by the `unicorn/no-abusive-eslint-disable` rule.
// 'eslint-comments/no-unlimited-disable': 'error',
'eslint-comments/no-unused-disable': 'error',
'eslint-comments/no-unused-enable': 'error',
},
};