@gitlab/eslint-plugin
Version:
GitLab package for our custom eslint rules
141 lines (138 loc) • 4.03 kB
JavaScript
const confusingBrowserGlobals = require('confusing-browser-globals');
const globals = require('globals');
const unicornPlugin = require('eslint-plugin-unicorn');
const promisePlugin = require('eslint-plugin-promise');
const importPlugin = require('eslint-plugin-import');
// Import all the base configurations
const bestPracticesConfig = require('./base/best-practices');
const errorsConfig = require('./base/errors');
const nodeConfig = require('./base/node');
const styleConfig = require('./base/style');
const variablesConfig = require('./base/variables');
const es6Config = require('./base/es6');
const importsConfig = require('./base/imports');
const strictConfig = require('./base/strict');
/*
This plugin contains rules related to GitLab JavaScript style guide
Vue specific rules are in lib/configs/vue.js
*/
module.exports = {
languageOptions: {
globals: {
...globals.browser,
...globals.es2020,
...globals.node,
...globals.es6,
},
ecmaVersion: 'latest',
sourceType: 'module',
parserOptions: {
parser: 'espree',
},
},
plugins: {
unicorn: unicornPlugin,
promise: promisePlugin,
import: importPlugin,
},
settings: {
// Merge import settings from imports config
...importsConfig.settings,
},
rules: {
...promisePlugin.configs['flat/recommended'].rules,
// Merge all rules from the base configurations
...bestPracticesConfig.rules,
...errorsConfig.rules,
...nodeConfig.rules,
...styleConfig.rules,
...variablesConfig.rules,
...es6Config.rules,
...importsConfig.rules,
...strictConfig.rules,
// Override specific rules from base configs
// Promise rule customizations
'promise/catch-or-return': [
'error',
{
allowFinally: true,
},
],
camelcase: [
'error',
{
properties: 'never',
ignoreDestructuring: true,
},
],
'default-param-last': 'off',
'arrow-body-style': 'off',
'unicorn/filename-case': ['error', { case: 'snakeCase' }],
'unicorn/no-array-callback-reference': 'error',
'import/prefer-default-export': 'off',
'import/no-default-export': 'error',
'import/no-deprecated': 'error',
'import/no-dynamic-require': ['error', { esmodule: true }],
'no-implicit-coercion': [
'error',
{
boolean: true,
number: true,
string: true,
},
],
'no-param-reassign': [
'error',
{
props: true,
ignorePropertyModificationsFor: ['acc', 'accumulator', 'el', 'element', 'state'],
},
],
'no-restricted-exports': [
'error',
{
restrictedNamedExports: [
'then', // avoid confusion when used with dynamic `import()` promise
],
},
],
'no-restricted-syntax': 'off',
'no-sequences': [
'error',
{
allowInParentheses: false,
},
],
'no-restricted-globals': [
'error',
{
name: 'isFinite',
message:
'Use Number.isFinite instead https://github.com/airbnb/javascript#standard-library--isfinite',
},
{
name: 'isNaN',
message:
'Use Number.isNaN instead https://github.com/airbnb/javascript#standard-library--isnan',
},
{
name: 'escape',
message:
"The global `escape` function is unsafe. Did you mean to use `encodeURI`, `encodeURIComponent` or lodash's `escape` instead?",
},
{
name: 'unescape',
message:
"The global `unescape` function is unsafe. Did you mean to use `decodeURI`, `decodeURIComponent` or lodash's `unescape` instead?",
},
].concat(confusingBrowserGlobals),
'import/order': [
'error',
{
groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'],
},
],
// https://docs.gitlab.com/ee/development/fe_guide/style/javascript.html#limit-number-of-parameters
'max-params': ['error', { max: 3 }],
},
};