text: /**
   * Copyright 2013-2015, Facebook, Inc.
   * All rights reserved.
   *
   * This source code is licensed under the BSD-style license found in the
   * LICENSE file in the root directory of this source tree. An additional grant
   * of patent rights can be found in the PATENTS file in the same directory.
   */
  
  /**
   * This file resembles what we use for our internal configuration. Several changes
   * have been made to acoomodate the differences between our internal setup and
   * what we would expect to see in open source.
   *
   * Internally we also lint each file individually, allowing use to use the file
   * path to selectively enable/disable pieces of the lint configuration. For
   * example, we don't actually want jest globals to be enabled all the time so
   * we only enable that when we know we're linting a test file. That isn't possible
   * here so we just always enable that.
   *
   * We are also missing our growing library of custom rules. Many of those will
   * make their way out here soon, but it does mean we need to do some editing of
   * our configuration object.
   */
  
  'use strict';
  
  // see http://eslint.org/docs/user-guide/configuring.html#configuring-rules
  const OFF = 0;
  const WARNING = 1;
  const ERROR = 2;
  
  // This pattern will match these texts:
  //   var Foo = require('Foo');
  //   var Bar = require('Foo').Bar;
  //   var BarFoo = require(Bar + 'Foo');
  //   var {Bar, Foo} = require('Foo');
  //   import type {Bar, Foo} from 'Foo';
  // Also supports 'let' and 'const'.
  const variableNamePattern = String.raw`\s*[a-zA-Z_$][a-zA-Z_$\d]*\s*`;
  const maxLenIgnorePattern =
    String.raw`^(?:var|let|const|import type)\s+` +
    '{?' +
    variableNamePattern +
    '(?:,' +
    variableNamePattern +
    ')*}?' +
    String.raw`\s*(?:=\s*require\(|from)[a-zA-Z_+./"'\s\d\-]+\)?[^;\n]*[;\n]`;
  
  function getBaseConfig() {
    return {
      parser: 'babel-eslint',
      parserOptions: {
        ecmaVersion: 6,
        sourceType: 'module',
      },
      plugins: ['flowtype', 'react'],
  
      // Tries to match the jshint configuration as closely as possible, with the
      // exeception of a few things that jshint doesn't check, but that we really
      // shouldn't be using anyways.
      //
      // Things that jshint checked for are errors, new rules are warnings.
      //
      // If you update eslint, be sure to check the changelog to figure out what
      // rules to add/remove to/from this list.
      rules: {
        // Possible Errors <http://eslint.org/docs/rules/#possible-errors>
  
        // Forked and moved to fb-www/comma-dangle
        'comma-dangle': OFF,
        // equivalent to jshint boss
        'no-cond-assign': OFF,
        // equivalent to jshint devel
        'no-console': OFF,
        // prohibits things like `while (true)`
        'no-constant-condition': OFF,
        // we need to be able to match these
        'no-control-regex': OFF,
        // equivalent to jshint debug
        'no-debugger': ERROR,
        // equivalent to jshint W004
        'no-dupe-args': ERROR,
        // syntax error in strict mode, almost certainly unintended in any case
        'no-dupe-keys': ERROR,
        // almost certainly a bug
        'no-duplicate-case': WARNING,
        // almost certainly a bug
        'no-empty-character-class': WARNING,
        // would warn on uncommented empty `catch (ex) {}` blocks
        'no-empty': OFF,
        // can cause subtle bugs in IE 8, and we shouldn't do this anyways
        'no-ex-assign': WARNING,
        // we shouldn't do this anyways
        'no-extra-boolean-cast': WARNING,
        // parens may be used to improve clarity, equivalent to jshint W068
        'no-extra-parens': [WARNING, 'functions'],
        // equivalent to jshint W032
        'no-extra-semi': WARNING,
        // a function delaration shouldn't be rewritable
        'no-func-assign': ERROR,
        // babel and es6 allow block-scoped functions
        'no-inner-declarations': OFF,
        // will cause a runtime error
        'no-invalid-regexp': WARNING,
        // disallow non-space or tab whitespace characters
        'no-irregular-whitespace': WARNING,
        // write `if (!(a in b))`, not `if (!a in b)`, equivalent to jshint W007
        'no-negated-in-lhs': ERROR,
        // will cause a runtime error
        'no-obj-calls': ERROR,
        // improves legibility
        'no-regex-spaces': WARNING,
        // equivalent to jshint elision
        'no-sparse-arrays': ERROR,
        // equivalent to jshint W027
        'no-unreachable': ERROR,
        // equivalent to jshint use-isnan
        'use-isnan': ERROR,
        // probably too noisy ATM
        'valid-jsdoc': OFF,
        // equivalent to jshint notypeof
        'valid-typeof': ERROR,
        // we already require semicolons
        'no-unexpected-multiline': OFF,
  
        // Best Practices <http://eslint.org/docs/rules/#best-practices>
  
        // probably a bug, we shouldn't actually even use this yet, because of IE8
        'accessor-pairs': [WARNING, { setWithoutGet: true }],
        // probably too noisy ATM
        'block-scoped-var': OFF,
        // cyclomatic complexity, we're too far gone
        complexity: OFF,
        // require return statements to either always or never specify values
        'consistent-return': WARNING,
        // style guide: Always use brackets, even when optional.
        curly: [WARNING, 'all'],
        // we don't do this/care about this
        'default-case': OFF,
        // disabled in favor of our temporary fork
        'dot-notation': OFF,
        // we don't do this/care about this, but probably should eventually
        'dot-location': OFF,
        // disabled as it's too noisy ATM
        eqeqeq: [OFF, 'allow-null'],
        // we don't do this/care about this, equivalent to jshint forin
        'guard-for-in': OFF,
        // we have too many internal examples/tools using this
        'no-alert': OFF,
        // incompatible with 'use strict' equivalent to jshint noarg
        'no-caller': ERROR,
        // we don't care about this right now, but might later
        'no-case-declarations': OFF,
        // we don't do this/care about this
        'no-div-regex': OFF,
        // we don't do this/care about this
        'no-else-return': OFF,
        // avoid mistaken variables when destructuring
        'no-empty-pattern': WARNING,
        // see eqeqeq: we explicitly allow this, equivalent to jshint eqnull
        'no-eq-null': OFF,
        // equivalent to jshint evil
        'no-eval': ERROR,
        // should only be triggered on polyfills, which we can fix case-by-case
        'no-extend-native': WARNING,
        // might be a sign of a bug
        'no-extra-bind': WARNING,
        // equivalent to jshint W089
        'no-fallthrough': WARNING,
        // equivalent to jshint W008
        'no-floating-decimal': ERROR,
        // implicit coercion is often idiomatic
        'no-implicit-coercion': OFF,
        // equivalent to jshint evil/W066
        'no-implied-eval': ERROR,
        // will likely create more signal than noise
        'no-invalid-this': OFF,
        // babel should handle this fine
        'no-iterator': OFF,
        // Should be effectively equivalent to jshint W028 - allowing the use
        // of labels in very specific situations. ESLint no-empty-labels was
        // deprecated.
        'no-labels': [ERROR, { allowLoop: true, allowSwitch: true }],
        // lone blocks create no scope, will ignore blocks with let/const
        'no-lone-blocks': WARNING,
        // equivalent to jshint loopfunc
        'no-loop-func': OFF,
        // we surely have these, don't bother with it
        'no-magic-numbers': OFF,
        // we may use this for alignment in some places
        'no-multi-spaces': OFF,
        // equivalent to jshint multistr, consider using es6 template strings
        'no-multi-str': ERROR,
        // equivalent to jshint W02OFF, similar to no-extend-native
        'no-native-reassign': [ERROR, { exceptions: ['Map', 'Set'] }],
        // equivalent to jshint evil/W054
        'no-new-func': ERROR,
        // don't use constructors for side-effects, equivalent to jshint nonew
        'no-new': WARNING,
        // very limited uses, mostly in third_party
        'no-new-wrappers': WARNING,
        // deprecated in ES5, but we still use it in some places
        'no-octal-escape': WARNING,
        // deprecated in ES5, may cause unexpected behavior
        'no-octal': WARNING,
        // treats function parameters as constants, probably too noisy ATM
        'no-param-reassign': OFF,
        // only relevant to node code
        'no-process-env': OFF,
        // deprecated in ES3.WARNING, equivalent to jshint proto
        'no-proto': ERROR,
        // jshint doesn't catch this, but this is inexcusable
        'no-redeclare': WARNING,
        // equivalent to jshint boss
        'no-return-assign': OFF,
        // equivalent to jshint scripturl
        'no-script-url': ERROR,
        // not in jshint, but is in jslint, and is almost certainly a mistake
        'no-self-compare': WARNING,
        // there are very limited valid use-cases for this
        'no-sequences': WARNING,
        // we're already pretty good about this, and it hides stack traces
        'no-throw-literal': WARNING,
        // breaks on `foo && foo.bar()` expression statements, which are common
        'no-unused-expressions': OFF,
        // disallow unnecessary .call() and .apply()
        'no-useless-call': WARNING,
        // disallow concatenating string literals
        'no-useless-concat': WARNING,
        // this has valid use-cases, eg. to circumvent no-unused-expressions
        'no-void': OFF,
        // this journey is 1% finished (allow TODO comments)
        'no-warning-comments': OFF,
        // equivalent to jshint withstmt
        'no-with': OFF,
        // require radix argument in parseInt, we do this in most places already
        radix: WARNING,
        // we don't do this/care about this
        'vars-on-top': OFF,
        // equivalent to jshint immed
        'wrap-iife': OFF,
        // probably too noisy ATM
        yoda: OFF,
  
        // Strict Mode <http://eslint.org/docs/rules/#strict-mode>
        // jshint wasn't checking this, and the compiler should add this anyways
        strict: OFF,
  
        // Variables <http://eslint.org/docs/rules/#variables>
        // we don't do this/care about this
        'init-declarations': OFF,
        // equivalent to jshint W002, catches an IE8 bug
        'no-catch-shadow': ERROR,
        // equivalent to jshint W051, is a strict mode violation
        'no-delete-var': ERROR,
        // we should avoid labels anyways
        'no-label-var': WARNING,
        // redefining undefined, NaN, Infinity, arguments, and eval is bad, mkay?
        'no-shadow-restricted-names': WARNING,
        // a definite code-smell, but probably too noisy
        'no-shadow': OFF,
        // it's nice to be explicit sometimes: `let foo = undefined;`
        'no-undef-init': OFF,
        // equivalent to jshint undef, turned into an error in getConfig
        'no-undef': WARNING,
        // using undefined is safe because we enforce no-shadow-restricted-names
        'no-undefined': OFF,
        // equivalent to jshint unused
        'no-unused-vars': [WARNING, { args: 'none' }],
        // too noisy
        'no-use-before-define': OFF,
  
        // Node.js <http://eslint.org/docs/rules/#nodejs>
        // TODO: turn some of these on in places where we lint node code
        'callback-return': OFF,
        'global-require': OFF,
        'handle-callback-err': OFF,
        'no-mixed-requires': OFF,
        'no-new-require': OFF,
        'no-path-concat': OFF,
        'no-process-exit': OFF,
        'no-restricted-modules': OFF,
        'no-sync': OFF,
  
        // Stylistic Issues <http://eslint.org/docs/rules/#stylistic-issues>
        // See also: https://our.intern.facebook.com/intern/dex/style-guide/
        'array-bracket-spacing': WARNING,
        // TODO: enable this with consensus on single line blocks
        'block-spacing': OFF,
        'brace-style': [WARNING, '1tbs', { allowSingleLine: true }],
        // too noisy at the moment, and jshint didn't check it
        camelcase: [OFF, { properties: 'always' }],
        'comma-spacing': [WARNING, { before: false, after: true }],
        // jshint had laxcomma, but that was against our style guide
        'comma-style': [WARNING, 'last'],
        'computed-property-spacing': [WARNING, 'never'],
        // we may use more contextually relevant names for this than self
        'consistent-this': [OFF, 'self'],
        // should be handled by a generic TXT linter instead
        'eol-last': OFF,
        'func-names': OFF,
        // too noisy ATM
        'func-style': [OFF, 'declaration'],
        // no way we could enforce min/max lengths or patterns for vars
        'id-length': OFF,
        'id-match': OFF,
        // we weren't enforcing this with jshint, so erroring would be too noisy
        indent: [WARNING, 2, { SwitchCase: 1 }],
        // we use single quotes for JS literals, double quotes for JSX literals
        'jsx-quotes': [WARNING, 'prefer-double'],
        // we may use extra spaces for alignment
        'key-spacing': [OFF, { beforeColon: false, afterColon: true }],
        'keyword-spacing': [WARNING],
        'lines-around-comment': OFF,
        // should be handled by a generic TXT linter instead
        'linebreak-style': [OFF, 'unix'],
        'max-depth': OFF,
        'max-len': [WARNING, 120, 2, { ignorePattern: maxLenIgnorePattern }],
        'max-nested-callbacks': OFF,
        'max-params': OFF,
        'max-statements': OFF,
        // https://facebook.com/groups/995898333776940/1027358627297577
        'new-cap': OFF,
        // equivalent to jshint W058
        'new-parens': ERROR,
        'newline-after-var': OFF,
        'no-array-constructor': ERROR,
        'no-bitwise': WARNING,
        'no-continue': OFF,
        'no-inline-comments': OFF,
        // doesn't play well with `if (__DEV__) {}`
        'no-lonely-if': OFF,
        // stopgap, irrelevant if we can eventually turn `indent` on to error
        'no-mixed-spaces-and-tabs': ERROR,
        // don't care
        'no-multiple-empty-lines': OFF,
        'no-negated-condition': OFF,
        // we do this a bunch of places, and it's less bad with proper indentation
        'no-nested-ternary': OFF,
        // similar to FacebookWebJSLintLinter's checkPhpStyleArray
        'no-new-object': WARNING,
        'no-plusplus': OFF,
        'no-restricted-syntax': OFF,
        'no-spaced-func': WARNING,
        'no-ternary': OFF,
        // should be handled by a generic TXT linter instead
        'no-trailing-spaces': OFF,
        // we use this for private/protected identifiers
        'no-underscore-dangle': OFF,
        // disallow `let isYes = answer === 1 ? true : false;`
        'no-unneeded-ternary': WARNING,
        // too noisy ATM
        'object-curly-spacing': OFF,
        // makes indentation warnings clearer
        'one-var': [WARNING, { initialized: 'never' }],
        // prefer `x += 4` over `x = x + 4`
        'operator-assignment': [WARNING, 'always'],
        // equivalent to jshint laxbreak
        'operator-linebreak': OFF,
        'padded-blocks': OFF,
        // probably too noisy on pre-ES5 code
        'quote-props': [OFF, 'as-needed'],
        quotes: [WARNING, 'single', 'avoid-escape'],
        'require-jsdoc': OFF,
        'semi-spacing': [WARNING, { before: false, after: true }],
        // equivalent to jshint asi/W032
        semi: [WARNING, 'always'],
        'sort-vars': OFF,
        // require `if () {` instead of `if (){`
        'space-before-blocks': [WARNING, 'always'],
        // require `function foo()` instead of `function foo ()`
        'space-before-function-paren': [WARNING, { anonymous: 'never', named: 'never' }],
        // incompatible with our legacy inline type annotations
        'space-in-parens': [OFF, 'never'],
        'space-infix-ops': [WARNING, { int32Hint: true }],
        'space-unary-ops': [WARNING, { words: true, nonwords: false }],
        // TODO: Figure out a way to do this that doesn't break typechecks
        // or wait for https://github.com/eslint/eslint/issues/2897
        'spaced-comment': [OFF, 'always', { exceptions: ['jshint', 'jslint', 'eslint', 'global'] }],
        'wrap-regex': OFF,
  
        // ECMAScript 6 <http://eslint.org/docs/rules/#ecmascript-6>
        'arrow-body-style': OFF,
        // Forked to fb-www/arrow-parens to fix issues with flow and add fixer
        'arrow-parens': OFF,
        // tbgs finds *very few* places where we don't put spaces around =>
        'arrow-spacing': [WARNING, { before: true, after: true }],
        // violation of the ES6 spec, won't transform
        'constructor-super': ERROR,
        // https://github.com/babel/babel-eslint#known-issues
        'generator-star-spacing': OFF,
        'no-class-assign': WARNING,
        'no-confusing-arrow': OFF,
        // this is a runtime error
        'no-const-assign': ERROR,
        'no-dupe-class-members': ERROR,
        // violation of the ES6 spec, won't transform, `this` is part of the TDZ
        'no-this-before-super': ERROR,
        // we have way too much ES3 & ES5 code
        'no-var': OFF,
        'object-shorthand': OFF,
        'prefer-const': OFF,
        'prefer-spread': OFF,
        // we don't support/polyfill this yet
        'prefer-reflect': OFF,
        'prefer-template': OFF,
        // there are legitimate use-cases for an empty generator
        'require-yield': OFF,
  
        'no-await-in-loop': OFF,
  
        // eslint-plugin-react <https://github.com/yannickcr/eslint-plugin-react>
        // TODO: We're being extremely conservative here as we roll out eslint on
        // www. As we finish rollout, we can turn on more of these, and replace
        // some legacy regex rules in the process.
        'react/display-name': OFF,
        'react/forbid-prop-types': OFF,
        'react/jsx-boolean-value': OFF,
        'react/jsx-closing-bracket-location': OFF,
        'react/jsx-curly-spacing': OFF,
        'react/jsx-equals-spacing': WARNING,
        'react/jsx-filename-extension': OFF,
        'react/jsx-first-prop-new-line': OFF,
        'react/jsx-handler-names': OFF,
        'react/jsx-indent': OFF,
        'react/jsx-indent-props': OFF,
        'react/jsx-key': OFF,
        'react/jsx-max-props-per-line': OFF,
        'react/jsx-no-bind': OFF,
        'react/jsx-no-duplicate-props': ERROR,
        'react/jsx-no-literals': OFF,
        'react/jsx-no-target-blank': OFF,
        'react/jsx-no-undef': ERROR,
        'react/jsx-pascal-case': OFF,
        'react/jsx-sort-props': OFF,
        'react/jsx-space-before-closing': OFF,
        // forked to fb-www/jsx-uses-react
        'react/jsx-uses-react': OFF,
        'react/jsx-uses-vars': ERROR,
        'react/no-comment-textnodes': OFF,
        'react/no-danger': OFF,
        'react/no-deprecated': OFF,
        'react/no-did-mount-set-state': OFF,
        'react/no-did-update-set-state': OFF,
        'react/no-direct-mutation-state': OFF,
        'react/no-is-mounted': WARNING,
        'react/no-multi-comp': OFF,
        'react/no-render-return-value': OFF,
        'react/no-set-state': OFF,
        'react/no-string-refs': OFF,
        'react/no-unknown-property': OFF,
        'react/prefer-es6-class': OFF,
        'react/prefer-stateless-function': OFF,
        'react/prop-types': OFF,
        // forked to fb-www/react-in-jsx-scope
        'react/react-in-jsx-scope': OFF,
        'react/require-extension': OFF,
        'react/require-optimization': OFF,
        'react/require-render-return': OFF,
        'react/self-closing-comp': OFF,
        'react/sort-comp': OFF,
        'react/sort-prop-types': OFF,
        'react/wrap-multilines': OFF,
  
        // eslint-plugin-flowtype
        // These don't actually result in warnings. Enabling them ensures they run
        // and mark variables as used, avoiding false positives with Flow
        // annotations.
        'flowtype/define-flow-type': WARNING,
        'flowtype/use-flow-type': WARNING,
        'flowtype/object-type-delimiter': [WARNING, 'comma'],
      },
  
      // Defines a basic set of globals
      env: {
        browser: true,
        es6: true,
        node: true
      },
  
      // The jshint code had more globals, which may have had something to do with
      // machine-generated code. I couldn't find references with tbgs.
      //
      // Values of true mean the global may be modified. Values of false represent
      // constants.
      globals: {
        __DEV__: true,
        __ENV__: true
      },
    };
  }
  
  // Override some rules for open source. Due to the way we apply our configuation
  // internally, these are effectively part of the same configuration we apply.
  var config = getBaseConfig();
  var extendedConfig = {
    rules: {
      // just turned into an error here since we almost always do that anyway.
      'no-undef': ERROR,
  
      // Re-enable some forked rules. Good enough for open source
      'comma-dangle': [WARNING, 'always-multiline'],
  
      'react/jsx-uses-react': ERROR,
      'react/react-in-jsx-scope': ERROR,
      'no-redeclare': ERROR,
    },
  };
  
  Object.keys(extendedConfig).forEach(key => {
    config[key] = Object.assign(config[key], extendedConfig[key]);
  });
  
  module.exports = config;
  