---
parser: babel-eslint

plugins:
  - react

env:
  browser: true
  node: true

globals:
  __DEV__: true
  # Jest / Jasmine
  describe: false
  xdescribe: false
  beforeEach: false
  afterEach: false
  it: false
  xit: false
  jest: false
  pit: false
  expect: false
  spyOn: false
  jasmine: false

rules:
  # ERRORS
  space-before-blocks: 2
  indent: [2, 2, indentSwitchCase: true]
  brace-style: 2
  space-after-keywords: 2
  strict: 2
  # WARNS
  comma-dangle: [1, always-multiline]
  semi: [1, always]
  # Make this a warning for now. We do this in a few places so we might need to
  # disable
  no-unused-expressions: 2
  eol-last: 2
  dot-notation: 2
  dot-location: [2, property]
  consistent-return: 2
  no-unused-vars: [2, args: none]
  quotes: [2, single, avoid-escape]
  no-shadow: 2
  no-multi-spaces: 2

  # WISHLIST. One day...
  # We'll need a custom version of this that does a subset of the whole rule.
  # Otherwise this is just too noisy.
  # valid-jsdoc: 1
  # Ideally, we could just warn when *new* lines are added that exceed 80 chars
  # while not warning about existing ones (often URLs, etc. which are
  # necessarily long), but we don't have a good way to do so.
  # max-len: [0, 80]

  # DISABLED. These aren't compatible with our style
  # We use this for private/internal variables
  no-underscore-dangle: 0
  # We pass constructors around / access them from members
  new-cap: 0
  # We do this a lot.
  no-use-before-define: 0
  # We do this in a few places to align values
  key-spacing: 0
  # It's nice to be able to leave catch blocks empty
  no-empty: 0
  # It makes code more readable to make this explicit sometimes
  no-undef-init: 0

  # BROKEN. We'd like to turn these back on.
  # causes a ton of noise, eslint is too picky?
  block-scoped-var: 0

  # JSX
  # Our transforms set this automatically
  react/display-name: 0
  react/jsx-boolean-value: [2, always]
  react/jsx-no-undef: 2
  react/jsx-quotes: [2, double]
  # We don't care to do this
  react/jsx-sort-prop-types: 0
  react/jsx-sort-props: 0
  react/jsx-uses-react: 2
  react/jsx-uses-vars: 2
  # It's easier to test some things this way
  react/no-did-mount-set-state: 0
  react/no-did-update-set-state: 0
  # We define multiple components in test files
  react/no-multi-comp: 0
  react/no-unknown-property: 2
  # This isn't useful in our test code
  react/prop-types: 0
  react/react-in-jsx-scope: 2
  react/self-closing-comp: 2
  # We don't care to do this
  react/sort-comp: 0
  react/wrap-multilines: [2, {declaration: false, assignment: false}]
