{
  "parser": "babel-eslint",
  "parserOptions": {
    "ecmaVersion": 6,
    "sourceType": "module",
    "ecmaFeatures": {
      "arrowFunctions": true,
      "blockBindings": true,
      "classes": true,
      "destructuring": true,
      "defaultParams": true,
      "modules": true,
      "restParams": true,
      "spread": true
    },
  },
  "plugins": [
    "async-await",
    "flowtype",
    "import"
  ],
  "settings": {
    "flowtype": {
      "onlyFilesWithFlowAnnotation": true
    },
  },
  "env": {
    "node": true,
    "es6": true
  },
  "extends": [
    "eslint:recommended",
    "plugin:flowtype/recommended"
  ],
  "globals": {
    "exports": false,
    "module": false,
    "require": false
  },
  "rules": {
    "arrow-parens": 2,
    "arrow-spacing": 2,
    "block-scoped-var": 0,
    "brace-style": [2, "1tbs", {"allowSingleLine": false}],
    "camelcase": 0,
    "comma-dangle": [2, "always-multiline"],
    "comma-spacing": 2,
    "comma-style": [2, "last"],
    "curly": [2, "all"],
    "dot-notation": [2, {"allowKeywords": true}],
    "eqeqeq": [2, "allow-null"],
    "guard-for-in": 0,
    "indent": [2, 2, {
      "CallExpression": {
        "arguments": "first"
      },
      "SwitchCase": 1,
      "VariableDeclarator": 1,
      "outerIIFEBody": 1,
      "MemberExpression": 1,
      "FunctionDeclaration": {
        "parameters": 1,
        "body": 1
      },
      "FunctionExpression": {
        "parameters": 1,
        "body": 1
      }
    }],
    "key-spacing": 2,
    "keyword-spacing": 2,
    "max-len": [2, 80, 2, {"ignoreComments": true}],
    "new-cap": [2, {"capIsNewExceptions": ["Deferred"]}],
    "no-bitwise": 2,
    "no-caller": 2,
    "no-cond-assign": [2, "except-parens"],
    "no-console": 2,
    "no-debugger": 2,
    "no-empty": 2,
    "no-eval": 2,
    "no-extend-native": 2,
    "no-extra-parens": 0,
    "no-extra-semi": 2,
    "no-implicit-coercion": [2, {
      "boolean": true,
      "number": true,
      "string": true,
    }],
    "no-irregular-whitespace": 2,
    "no-iterator": 2,
    "no-loop-func": 0,
    "no-mixed-spaces-and-tabs": 2,
    "no-multi-str": 2,
    "no-multi-spaces": 2,
    "no-multiple-empty-lines": [2, {"max": 2}],
    "no-new": 2,
    "no-plusplus": 0,
    "no-proto": 2,
    "no-redeclare": 0,
    "no-shadow": [2, {"builtinGlobals": true}],
    "no-shadow-restricted-names": 2,
    "no-script-url": 2,
    "no-sequences": 2,
    "no-template-curly-in-string": 2,
    "no-trailing-spaces": [2, {"skipBlankLines": false}],
    "no-undef": 2,
    "no-underscore-dangle": 0,
    "no-unneeded-ternary": 2,
    "no-unused-vars": 2,
    "no-with": 2,
    "object-property-newline": [2, {
      "allowMultiplePropertiesPerLine": true
    }],
    "object-shorthand": 2,
    "one-var": [2, "never"],
    "prefer-const": 2,
    "prefer-template": 2,
    "quote-props": [1, "consistent-as-needed"],
    "quotes": [2, "single", "avoid-escape"],
    "require-yield": 2,
    "semi": [2, "always"],
    "space-before-blocks": [2, "always"],
    "space-before-function-paren": [2, {
      "anonymous": "never",
      "named": "never",
      "asyncArrow": "always"
    }],
    "space-infix-ops": 2,
    "strict": [2, "never"],
    "valid-typeof": 2,
    "wrap-iife": [2, "inside"],

    "async-await/space-after-async": 2,
    "async-await/space-after-await": 2,

    "flowtype/define-flow-type": 1,
    "flowtype/use-flow-type": 1,
    "flowtype/space-after-type-colon": [1, "always"],

    // This makes sure imported modules exist.
    "import/no-unresolved": 2,
    // This makes sure imported names exist.
    "import/named": 2,
    // This will catch accidental default imports when no default is defined.
    "import/default": 2,
    // This makes sure `*' imports are dereferenced to real exports.
    "import/namespace": 2,
    // This catches any export mistakes.
    "import/export": 2,
    // This catches default names that conflict with actual exported names.
    // For example, this was probably a typo:
    //   import foo from 'bar';
    // that should be corrected as:
    //   import { foo } from 'bar';
    "import/no-named-as-default": 2,
    // This catches possible typos like trying to access a real export on a
    // default import.
    "import/no-named-as-default-member": 2,
    // This prevents exporting a mutable variable.
    "import/no-mutable-exports": 2,
    // This makes sure package.json defines dev vs. prod dependencies correctly.
    "import/no-extraneous-dependencies": [2, {
      // The following are not allowed to be imported. See .eslintrc in other
      // directories (like ./test) for where this gets overidden.
      "devDependencies":["Gruntfile.js", "webpack.*.js", "tasks/*.js"],
      "optionalDependencies": false, "peerDependencies": false
    }],
    // This ensures imports are at the top of the file.
    "import/imports-first": 2,
    // This catches duplicate exports.
    "import/no-duplicates": 2,
    // This ensures import statements never provide a file extension in the path.
    "import/extensions": [2, "never"],
    // This ensures imports are organized by type and that groups are separated
    // by a new line.
    "import/order": [2, {
      "groups": [
        "builtin", "external", "internal", ["parent", "sibling"], "index"
      ],
      "newlines-between": "always"
    }],
    // This ensures a new line after all import statements.
    "import/newline-after-import": 2,
  }
}
