/*
rigwild's personal ESLint configuration
Using modern JavaScript syntax, very restrictive.
Preferably use with autofix on save.

This config is made for a Babel + Vue.js project (vue-cli).

https://github.com/rigwild
*/

// prettier-ignore
module.exports = {
  parserOptions: {
    parser: 'babel-eslint',
    ecmaVersion: 2019,
    sourceType: 'module'
  },

  root: true,
  env: {
    node: true,
    es6: true
  },

  extends: [
    'plugin:vue/recommended',
    '@vue/standard' // Optional, add "@vue/eslint-config-standard" as a devDependency
  ],

  rules: {
    // Possible Errors
    // The following rules point out areas where you might have made mistakes.
    'comma-dangle': 1,
    'no-cond-assign': 2,
    'no-constant-condition': 2,
    'no-control-regex': 2,
    'no-debugger': 2,
    'no-dupe-args': 2,
    'no-dupe-keys': 2,
    'no-duplicate-case': 2,
    'no-empty': 2,
    'no-ex-assign': 2,
    'no-extra-boolean-cast': 2,
    'no-extra-parens': 0,
    'no-extra-semi': 2,
    'no-func-assign': 2,
    'no-inner-declarations': 2,
    'no-invalid-regexp': 2,
    'no-irregular-whitespace': 2,
    'no-negated-in-lhs': 2,
    'no-obj-calls': 2,
    'no-regex-spaces': 2,
    'no-sparse-arrays': 2,
    'no-unreachable': 2,
    'use-isnan': 2,
    'valid-jsdoc': 2,
    'valid-typeof': 2,

    // Best Practices
    // These are rules designed to prevent you from making mistakes.
    'block-scoped-var': 0,
    'complexity': 0,
    'curly': 'off',
    'default-case': 2,
    'dot-notation': 2,
    'eqeqeq': 2,
    'guard-for-in': 2,
    'no-alert': 2,
    'no-caller': 2,
    'no-div-regex': 2,
    'no-else-return': 2,
    'no-eq-null': 2,
    'no-eval': 2,
    'no-extend-native': 2,
    'no-extra-bind': 2,
    'no-fallthrough': 2,
    'no-floating-decimal': 2,
    'no-implied-eval': 2,
    'no-iterator': 2,
    'no-labels': 2,
    'no-lone-blocks': 2,
    'no-loop-func': 0,
    'no-multi-spaces': 2,
    'no-multi-str': 2,
    'no-native-reassign': 2,
    'no-new': 2,
    'no-new-func': 2,
    'no-new-wrappers': 2,
    'no-octal': 2,
    'no-octal-escape': 2,
    'no-proto': 2,
    'no-redeclare': 2,
    'no-script-url': 2,
    'no-self-compare': 2,
    'no-sequences': 0,
    'no-throw-literal': 2,
    'no-void': 2,
    'no-warning-comments': [0, { terms: ['todo', 'fixme'], location: 'start' }],
    'no-with': 2,
    'radix': 2,
    'vars-on-top': 2,
    'wrap-iife': 2,
    'yoda': 2,

    // Strict Mode
    // These rules relate to using strict mode.
    'strict': 0,

    // Variables
    // These rules have to do with variable declarations.
    'no-catch-shadow': 2,
    'no-delete-var': 2,
    'no-label-var': 2,
    'no-shadow': 2,
    'no-shadow-restricted-names': 2,
    'no-undef': 2,
    'no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
    'no-use-before-define': 2,

    // Stylistic Issues
    // These rules are purely matters of style and are quite subjective.
    'indent': [1, 2],
    'brace-style': ['error', 'stroustrup'],
    'camelcase': 1,
    'comma-spacing': [1, { before: false, after: true }],
    'comma-style': [1, 'last'],
    'consistent-this': [1, '_this'],
    'eol-last': 1,
    'key-spacing': [1, { beforeColon: false, afterColon: true }],
    'new-cap': [1, { newIsCap: true, capIsNew: false }],
    'new-parens': 1,
    'newline-after-var': 0,
    'no-array-constructor': 1,
    'no-mixed-spaces-and-tabs': 1,
    'no-multiple-empty-lines': [1, { max: 2 }],
    'no-trailing-spaces': 1,
    'no-underscore-dangle': 0,
    'quote-props': [1, 'consistent'],
    'quotes': [1, 'single'],
    'semi': ['error', 'never'],
    'keyword-spacing': 'warn',
    'space-before-function-paren': [1, { anonymous: 'always', named: 'never' }],
    'space-in-parens': [1, 'never'],
    'spaced-comment': 'warn',

    // ECMAScript 6
    // These rules are only relevant to ES6 environments and are off by default.
    'no-var': 2,
    'promise/param-names': 0,

    // Vue.js
    'vue/max-attributes-per-line': 0,
    'vue/attributes-order': 0,
    'vue/singleline-html-element-content-newline': 0,
    'vue/html-self-closing': [
      'error',
      {
        html: {
          void: 'any',
          normal: 'any',
          component: 'always'
        },
        svg: 'always',
        math: 'always'
      }
    ]
  }
}
