---
  plugins:
    - react
  ecmaFeatures:
    arrowFunctions: true
    classes: true
    defaultParams: true
    destructuring: true
    jsx: true
    objectLiteralComputedProperties: true
    objectLiteralShorthandMethods: true
    objectLiteralShorthandProperties: true
    restParams: true
    spread: true
    superInFunctions: true
  rules:
    # possible errors
    comma-dangle: 2
    no-cond-assign: 2
    no-console: 2
    no-constant-condition: 2
    no-debugger: 2
    no-dupe-args: 2
    no-dupe-keys: 2
    no-duplicate-case: 2
    no-empty-character-class: 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-unexpected-multiline: 2
    no-unreachable: 2
    use-isnan: 2
    valid-typeof: 2

    # best practices
    block-scoped-var: 2
    complexity: 0
    consistent-return: 0
    dot-location: [2, property]
    dot-notation: 2
    no-alert: 2
    no-caller: 2
    no-else-return: 0
    no-empty-label: 2
    no-empty-pattern: 2
    no-eq-null: 2
    no-eval: 2
    no-implied-eval: 2
    no-extend-native: 2
    no-extra-bind: 2
    no-fallthrough: 2
    no-floating-decimal: 2
    no-lone-blocks: 2
    no-loop-func: 2
    no-multi-spaces: 2
    no-native-reassign: 2
    no-new-wrappers: 2
    no-new-func: 2
    no-new: 2
    no-octal-escape: 2
    no-octal: 2
    no-param-reassign: 0
    no-proto: 2
    no-redeclare: 2
    no-return-assign: 2
    no-script-url: 0
    no-self-compare: 2
    no-sequences: 2
    no-throw-literal: 2
    no-unused-expressions: 2
    no-useless-call: 2
    no-with: 2
    radix: 0
    yoda: 2

    # strict mode
    strict: 2

    # variables
    no-delete-var: 2
    no-shadow-restricted-names: 2
    no-undef-init: 2
    no-undef: 2
    no-unused-vars: 2
    no-use-before-define: 2

    # stylistic issues
    array-bracket-spacing: [2, never]
    brace-style: [2, 1tbs, {allowSingleLine: true}]
    camelcase: [2, {properties: never}]
    comma-style: [2, last]
    comma-spacing: [2, {before: false, after: true}]
    computed-property-spacing: [2, never]
    eol-last: 2
    id-length: [0, {min: 2, exceptions: ['$', '_', 'e']}]
    id-match: [2, '^([A-Za-z\d_$]+)$', {properties: true}]
    jsx-quotes: [2, prefer-single]
    key-spacing: [2, {beforeColon: false, afterColon: true}]
    linebreak-style: [2, unix]
    max-nested-callbacks: [0, 5]
    new-cap: [2, {newIsCap: true, capIsNew: false}]
    no-array-constructor: 2
    no-new-object: 2
    no-lonely-if: 2
    no-multiple-empty-lines: [2, {max: 1}]
    no-spaced-func: 2
    no-unneeded-ternary: 2
    object-curly-spacing: 2
    operator-linebreak: [0, after, {overrides: {':': null}}]
    padded-blocks: [2, never]
    quote-props: [2, as-needed]
    quotes: [2, single, avoid-escape]
    semi-spacing: [2, {before: false, after: true}]
    semi: [2, always]
    space-after-keywords: [2, always]
    space-before-blocks: [2, always]
    space-before-function-paren: [2, never]
    space-before-keywords: [2, always]
    space-in-parens: [2, never]
    space-infix-ops: 2
    space-return-throw-case: 2
    space-unary-ops: [2, {words: true, nonwords: false}]
    spaced-comment: [0, always]

    # es6
    arrow-parens: [2, always]
    arrow-spacing: [2, {before: true, after: true}]
    constructor-super: 2
    #no-arrow-condition: 2
    no-class-assign: 2
    no-const-assign: 2
    no-dupe-class-members: 2
    no-this-before-super: 2
    no-var: 0
    object-shorthand: 0
    prefer-arrow-callback: 0
    prefer-const: 0
    prefer-spread: 2
    prefer-template: 0

    # react
    react/jsx-boolean-value: [2, never]
    react/jsx-closing-bracket-location: [2, {nonEmpty: false, selfClosing: line-aligned}]
    react/jsx-curly-spacing: [2, never]
    react/jsx-indent-props: [2, 4]
    react/jsx-key: 2
    react/jsx-no-duplicate-props: 2
    react/jsx-no-literals: 0
    react/jsx-no-undef: 2
    react/jsx-uses-react: 2
    react/jsx-uses-vars: 2
    react/no-unknown-property: 2
    react/prop-types: 0
    react/react-in-jsx-scope: 2
    react/self-closing-comp: 2
    react/sort-comp: 0
  env:
    browser: true
    node: true
    mocha: true
    amd: true
  globals:
    app: false
    assert: false
    sinon: false
