xo
Version:
JavaScript/TypeScript linter (ESLint wrapper) with great defaults
405 lines (368 loc) • 8.79 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',
'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: true,
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,
},
// Reverse.
application: {
app: true,
},
applications: {
apps: true,
},
// Disable some that may be too annoying.
env: false,
i: false, // Do it at some point, but not ready for it yet. Maybe 2025.
// Not part of `eslint-plugin-unicorn`. Upstream them at some point.
bin: {
binary: true,
},
eof: {
endOfFile: true,
},
impl: {
implement: true,
implementation: true,
},
anim: {
animation: true,
},
calc: {
calculate: true,
},
dict: {
dictionary: true,
},
dup: {
duplicate: true,
},
enc: {
encode: true,
encryption: true,
},
gen: {
generate: true,
general: true,
},
gfx: {
graphics: true,
},
inc: {
increment: true,
},
iter: {
iterate: true,
iterator: true,
},
nav: {
navigate: true,
navigation: true,
},
norm: {
normalize: true,
},
notif: {
notification: true,
},
perf: {
performance: true,
},
proc: {
process: true,
},
rand: {
random: true,
},
sys: {
system: true,
},
temp: {
temporary: 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,
},
],
// Temporarily disabled because of https://github.com/sindresorhus/eslint-plugin-unicorn/issues/2218
'unicorn/no-empty-file': '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 2025.
'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: Enable it when I have tried it more in practice.
'unicorn/prefer-string-raw': 'off',
// TODO: Temporarily disabled as the rule is buggy.
'function-call-argument-newline': 'off',
'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',
{
// TODO: Buggy.
// considerComments: true,
},
],
'import/no-amd': 'error',
'import/no-duplicates': [
'error',
{
'prefer-inline': true,
},
],
// We use `unicorn/prefer-module` instead.
// 'import/no-commonjs': 'error',
// Looks useful, but too unstable at the moment
// 'import/no-deprecated': 'error',
'import/no-empty-named-blocks': 'error',
'import/no-extraneous-dependencies': [
'error',
{
includeTypes: true,
},
],
'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',
{
groups: [
'builtin',
'external',
'parent',
'sibling',
'index',
],
'newlines-between': 'never',
warnOnUnassignedImports: true,
},
],
'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',
],
'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/hashbang': 'error',
'n/no-deprecated-api': 'error',
// We no longer enforce this as we don't want to use Buffer at all, but sometimes we need to conditionally use the `Buffer` global, but we then don't want the import so the module works cross-platform.
// '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',
},
};