blob: b6238861003e801174d31dca41cd6d0379c421e3 [file] [log] [blame]
// 2015 December 1
// https://github.com/bevry/base
// http://eslint.org
/* eslint no-warning-comments: 0 */
'use strict'
const IGNORE = 0, WARN = 1, ERROR = 2, MAX_PARAMS = 4
module.exports = {
// parser: 'babel-eslint',
// ^ the bundled ESLINT parser is now actually quite good, and supports the ecmaFeatures property
ecmaFeatures: {
// this property only works with the bundled ESLINT parser, not babel-eslint
arrowFunctions: true,
binaryLiterals: true,
blockBindings: true,
classes: true,
defaultParams: true,
destructuring: true,
forOf: true,
generators: true,
modules: false, // Disabled due to https://twitter.com/balupton/status/671519915795345410
objectLiteralComputedProperties: true,
objectLiteralDuplicateProperties: true,
objectLiteralShorthandMethods: true,
objectLiteralShorthandProperties: true,
octalLiterals: true,
regexUFlag: true,
regexYFlag: true,
restParams: true,
spread: true,
superInFunctions: true,
templateStrings: true,
unicodeCodePointEscapes: true,
globalReturn: true,
jsx: true,
experimentalObjectRestSpread: true
},
env: {
browser: true,
node: true,
es6: true,
commonjs: true,
amd: true
},
rules: {
// ----------------------------
// Problems with these rules
// If we can figure out how to enable the following, that would be great
// Two spaces after one line if or else:
// if ( blah ) return
// Insead of one space:
// if ( blah ) return
// No spaces on embedded function:
// .forEach(function(key, value){
// instead of:
// .forEach(function (key, value) {
// Else and catch statements on the same line as closing brace:
// } else {
// } catch (e) {
// instead of:
// }
// else {
// --------------------------------------
// Possible Errors
// The following rules point out areas where you might have made mistakes.
// ES6 supports dangling commas
'comma-dangle': IGNORE,
// Don't allow assignments in conditional statements (if, while, etc.)
'no-cond-assign': [ERROR, 'always'],
// Warn but don't error about console statements
'no-console': WARN,
// Allow while(true) loops
'no-constant-condition': IGNORE,
// Seems like a good idea to error about this
'no-control-regex': ERROR,
// Warn but don't error about console statements
'no-debugger': WARN,
// Don't allow duplicate arguments in a function, they can cause errors
'no-dupe-args': ERROR,
// Disallow duplicate keys in an object, they can cause errors
'no-dupe-keys': ERROR,
// Disallow duplicate case statements in a switch
'no-duplicate-case': ERROR,
// Disallow empty [] in regular expressions as they cause unexpected behaviour
'no-empty-character-class': ERROR,
// Allow empty block statements, they are useful for clarity
'no-empty': IGNORE,
// Overwriting the exception argument in a catch statement can cause memory leaks in some browsers
'no-ex-assign': ERROR,
// Disallow superflous boolean casts, they offer no value
'no-extra-boolean-cast': ERROR,
// Allow superflous parenthesis as they offer clarity in some cases
'no-extra-parens': IGNORE,
// Disallow superflous semicolons, they offer no value
'no-extra-semi': IGNORE,
// Seems like a good idea to error about this
'no-func-assign': ERROR,
// Seems like a good idea to error about this
'no-inner-declarations': ERROR,
// Seems like a good idea to error about this
'no-invalid-regexp': ERROR,
// Seems like a good idea to error about this
'no-irregular-whitespace': ERROR,
// Seems like a good idea to error about this
'no-negated-in-lhs': ERROR,
// Seems like a good idea to error about this
'no-obj-calls': ERROR,
// Seems like a good idea to error about this
// Instead of / / used / {ERROR}/ instead
'no-regex-spaces': ERROR,
// Seems like a good idea to error about this
'no-sparse-arrays': ERROR,
// Seems like a good idea to error about this
'no-unexpected-multiline': ERROR,
// Seems like a good idea to error about this
'no-unreachable': ERROR,
// Seems like a good idea to error about this
'use-isnan': ERROR,
// We use YUIdoc, not JSDoc
'valid-jsdoc': IGNORE,
// Seems like a good idea to error about this
'valid-typeof': ERROR,
// --------------------------------------
// Best Practices
// These are rules designed to prevent you from making mistakes. They either prescribe a better way of doing something or help you avoid footguns.
// Meh
'accessor-pairs': IGNORE,
// This rule seems buggy
'block-scoped-var': IGNORE,
// Disable complexity checks, they are annoying and not that useful in detecting actual complexity
'complexity': IGNORE,
// We use blank returns for break statements
'consistent-return': IGNORE,
// Always require curly braces unless the statement is all on a single line
'curly': [ERROR, 'multi-line'],
// If we don't have a default cause, it probably means we should throw an error
'default-case': ERROR,
// Dots should be on the newlines
// chainableThingy
// .doSomething()
// .doSomethingElse()
'dot-location': [ERROR, 'property'],
// Use dot notation where possible
'dot-notation': ERROR,
// Unless you are doing == null, then force === to avoid truthy/falsey mistakes
'eqeqeq': [ERROR, 'allow-null'],
// Always use hasOwnProperty when doing for in
'guard-for-in': ERROR,
// Warn about alert statements in our code
// Use one of the suggested alternatives instead
// Reasoning is they could be mistaken for left over debugging statements
'no-alert': WARN,
// They are very slow
'no-caller': ERROR,
// Wow...
'no-case-declarations': ERROR,
// Seems like a good idea to error about this
'no-div-regex': ERROR,
// Returns in else statements offer code clarity, so disable this rule
'no-else-return': IGNORE,
// Seems like a good idea to error about this
'no-empty-label': ERROR,
// Seems sensible
'no-empty-pattern': ERROR,
// We know that == null is a null and undefined check
'no-eq-null': IGNORE,
// Eval is slow and unsafe, use vm's instead
'no-eval': ERROR,
// There is never a good reason for this
'no-extend-native': ERROR,
// Don't allow useless binds
'no-extra-bind': ERROR,
// Don't allow switch case statements to follow through, use continue keyword instead
'no-fallthrough': ERROR,
// Use zero when doing decimals, otherwise it is confusing
'no-floating-decimal': ERROR,
// Cleverness is unclear
'no-implicit-coercion': ERROR,
// A sneaky way to do evals
'no-implied-eval': ERROR,
// This throws for a lot of senseless things, like chainy functions
'no-invalid-this': IGNORE,
// Use proper iterators instead
'no-iterator': ERROR,
// We never use this, it seems silly to allow this
'no-labels': ERROR,
// We never use this, it seems silly to allow this
'no-lone-blocks': ERROR,
// Loop functions always cause problems, as the scope isn't clear through iterations
'no-loop-func': ERROR,
// This is a great idea
// Although ignore -1 and 0 as it is common with indexOf
'no-magic-numbers': [WARN, { ignore: [-1, 0] }],
// We like multi spaces for clarity
// E.g. We like
// if ( blah ) return foo
// Instead of:
// if ( blah ) return foo
// @TODO would be great to enforce the above
'no-multi-spaces': IGNORE,
// Use ES6 template strings instead
'no-multi-str': ERROR,
// Would be silly to allow this
'no-native-reassign': ERROR,
// We never use this, it seems silly to allow this
'no-new-func': ERROR,
// We never use this, it seems silly to allow this
'no-new-wrappers': ERROR,
// We never use this, it seems silly to allow this
'no-new': ERROR,
// We never use this, it seems silly to allow this
'no-octal-escape': ERROR,
// We never use this, it seems silly to allow this
'no-octal': ERROR,
// We got to be pretty silly if we don't realise we are doing this
// As such, take any usage as intentional and aware
'no-param-reassign': IGNORE,
// We use process.env wisely
'no-process-env': IGNORE,
// We never use this, it seems silly to allow this
'no-proto': ERROR,
// We never use this, it seems silly to allow this
'no-redeclare': ERROR,
// We never use this, it seems silly to allow this
'no-return-assign': ERROR,
// We never use this, it seems silly to allow this
'no-script-url': ERROR,
// We never use this, it seems silly to allow this
'no-self-compare': ERROR,
// We never use this, it seems silly to allow this
'no-sequences': ERROR,
// We always want proper error objects as they have stack traces and respond to instanceof Error checks
'no-throw-literal': ERROR,
// We never use this, it seems silly to allow this
'no-unused-expressions': ERROR,
// Seems sensible
'no-useless-call': ERROR,
// Seems sensible
'no-useless-concat': ERROR,
// We never use this, it seems silly to allow this
'no-void': ERROR,
// Warn about todos
'no-warning-comments': [WARN, { terms: ['todo', 'fixme'], location: 'anywhere' }],
// We never use this, it seems silly to allow this
'no-with': ERROR,
// Always specify a radix to avoid errors
'radix': ERROR,
// We appreciate the clarity late defines offer
'vars-on-top': IGNORE,
// Wrap instant called functions in parenthesis for clearer intent
'wrap-iife': ERROR,
// Because we force === and never allow assignments in conditions
// we have no need for yoda statements, so disable them
'yoda': [ERROR, 'never'],
// --------------------------------------
// Strict Mode
// These rules relate to using strict mode.
// Ensure that use strict is specified to prevent the runtime erorr:
// SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
'strict': [ERROR, 'global'],
// --------------------------------------
// Variables
// These rules have to do with variable declarations.
// We don't care
'init-declaration': IGNORE,
// Don't allow the catch method to shadow objects as browsers handle this differently
// Update: We don't care for IE8
'no-catch-shadow': IGNORE,
// Don't use delete, it disables optimisations
'no-delete-var': ERROR,
// We never use this, it seems silly to allow this
'no-label-var': ERROR,
// We never use this, it seems silly to allow this
'no-shadow-restricted-names': ERROR,
// We use shadowing
'no-shadow': IGNORE,
// Makes sense
'no-undef-init': ERROR,
// Error when an undefined variable is used
'no-undef': ERROR,
// typeof blah === 'undefined' should always be used
'no-undefined': ERROR,
// Warn us when we don't use something
'no-unused-vars': WARN,
// Error when we try and use something before it is defined
'no-use-before-define': ERROR,
// --------------------------------------
// Node.js and CommonJS
// These rules are specific to JavaScript running on Node.js or using CommonJS in the browser.
// Seems to difficult to enforce
'callback-return': IGNORE,
// We use require where it is appropriate to use it
'global-require': IGNORE,
// Force handling of callback errors
'handle-callback-err': ERROR,
// @TODO decide if this is good or not
'no-mixed-requires': ERROR,
// Disallow error prone syntax
'no-new-require': ERROR,
// Always use path.join for windows support
'no-path-concat': ERROR,
// We know what we are doing
'no-process-exit': IGNORE,
// No need to disallow any modules
'no-restricted-modules': IGNORE,
// Sometimes sync methods are useful, so warn but don't error
'no-sync': WARN,
// --------------------------------------
// Stylistic
// These rules are purely matters of style and are quite subjective.
// We don't use spaces with brackets
'array-bracket-spacing': [ERROR, 'never'],
// Disallow or enforce spaces inside of single line blocks
'block-spacing': [ERROR, 'always'],
// Opening brace on same line, closing brace on its own line, except when statement is a single line
'brace-style': [ERROR, 'stroustrup', { allowSingleLine: true }],
// Use camel case
'camelcase': ERROR,
// Require a comma after always
'comma-spacing': [ERROR, { before: false, after: true }],
// Commas go last, we have tooling to detect if we forget a comma
'comma-style': [ERROR, 'last'],
// Require or disallow padding inside computed properties
'computed-property-spacing': [ERROR, 'never'],
// Enabling this was incredibly annoying when doing layers of nesting
'consistent-this': IGNORE,
// Enable to make UNIX people's lives easier
'eol-last': ERROR,
// We like anonymous functions
'func-names': IGNORE,
// Prefer to define functions via variables
'func-style': [WARN, 'declaration'],
// Sometimes short names are appropriate
'id-length': IGNORE,
// Camel case handles this for us
'id-match': IGNORE,
// Use tabs and indent case blocks
'indent': [ERROR, 'tab', { SwitchCase: WARN }],
// Prefer double qoutes for JSX properties: <a b="c" />, <a b='"' />
'jsx-quotes': [ERROR, 'prefer-double'],
// Space after the colon
'key-spacing': [ERROR, {
beforeColon: false,
afterColon: true
}],
// Enforce unix line breaks
'linebreak-style': [ERROR, 'unix'],
// Enforce new lines before block comments
'lines-around-comment': [ERROR, { beforeBlockComment: true, allowBlockStart: true }],
// Disabled to ensure consistency with complexity option
'max-depth': IGNORE,
// We use soft wrap
'max-len': IGNORE,
// We are smart enough to know if this is bad or not
'max-nested-callbacks': IGNORE,
// Sometimes we have no control over this for compat reasons, so just warn
'max-params': [WARN, MAX_PARAMS],
// We should be able to use whatever feels right
'max-statements': IGNORE,
// Constructors should be CamelCase
'new-cap': ERROR,
// Always use parens when instantiating a class
'new-parens': ERROR,
// Too difficult to enforce correctly as too many edge-cases
'newline-after-var': IGNORE,
// Don't use the array constructor when it is not needed
'no-array-constructor': ERROR,
// We never use bitwise, they are too clever
'no-bitwise': ERROR,
// We use continue
'no-continue': IGNORE,
// We like inline comments
'no-inline-comments': IGNORE,
// The code could be optimised if this error occurs
'no-lonely-if': ERROR,
// Don't mix spaces and tabs
// @TODO maybe [ERROR, 'smart-tabs'] will be better, we will see
'no-mixed-spaces-and-tabs': ERROR,
// We use multiple empty lines for styling
'no-multiple-empty-lines': IGNORE,
// Sometimes it is more understandable with a negated condition
'no-negated-condition': IGNORE,
// Sometimes these are useful
'no-nested-ternary': IGNORE,
// Use {} instead of new Object()
'no-new-object': ERROR,
// We use plus plus
'no-plusplus': IGNORE,
// Handled by other rules
'no-restricted-syntax': IGNORE,
// We never use this, it seems silly to allow this
'no-spaced-func': ERROR,
// Sometimes ternaries are useful
'no-ternary': IGNORE,
// Disallow trailing spaces
'no-trailing-spaces': ERROR,
// Sometimes this is useful when avoiding shadowing
'no-underscore-dangle': IGNORE,
// Sensible
'no-unneeded-ternary': ERROR,
// Desirable, but too many edge cases it turns out where it is actually preferred
'object-curly-spacing': IGNORE, // [ERROR, 'always'],
// We like multiple var statements
'one-var': IGNORE,
// Force use of shorthands when available
'operator-assignment': [ERROR, 'always'],
// Should be before, but not with =, *=, /=, += lines
// @TODO figure out how to enforce
'operator-linebreak': IGNORE,
// This rule doesn't appear to work correclty
'padded-blocks': IGNORE,
// Seems like a good idea to error about this
'quote-props': [ERROR, 'consistent-as-needed'],
// Use single quotes where escaping isn't needed
'quotes': [ERROR, 'single', 'avoid-escape'],
// We use YUIdoc
'require-jsdoc': IGNORE,
// If semi's are used, then add spacing after
'semi-spacing': [ERROR, { before: false, after: true }],
// Never use semicolons
'semi': [ERROR, 'never'],
// We don't care if our vars are alphabetical
'sort-vars': IGNORE,
// Always force a space after a keyword
'space-after-keywords': [ERROR, 'always'],
// Always force a space before a {
'space-before-blocks': [ERROR, 'always'],
// function () {, get blah () {
'space-before-function-paren': [ERROR, 'always'],
// We do this
'space-before-keywords': [ERROR, 'always'],
// This is for spacing between [], so [ WARN, ERROR, 3 ] which we don't want
'space-in-brackets': IGNORE,
// This is for spacing between (), so doSomething( WARN, ERROR, 3 ) or if ( WARN === 3 )
// which we want for ifs, but don't want for calls
'space-in-parens': IGNORE,
// We use this
'space-infix-ops': ERROR,
// We use this
'space-return-throw-case': ERROR,
// We use this
'space-unary-ops': ERROR,
// We use this
// 'spaced-line-comment': ERROR,
'spaced-comment': ERROR,
// We use this
// @TODO revise this
'wrap-regex': ERROR,
// --------------------------------------
// ECMAScript 6
// Sensible to create more informed and clear code
'arrow-body-style': [ERROR, 'as-needed'],
// We do this, no reason why, just what we do
'arrow-parens': [ERROR, 'always'],
// Require consistent spacing for arrow functions
'arrow-spacing': ERROR,
// Makes sense as otherwise runtime error will occur
'constructor-super': ERROR,
// Seems the most consistent location for it
'generator-star-spacing': [ERROR, 'before'],
// Seems sensible
'no-arrow-condition': ERROR,
// Seems sensible
'no-class-assign': ERROR,
// Makes sense as otherwise runtime error will occur
'no-const-assign': ERROR,
// Makes sense as otherwise runtime error will occur
'no-dupe-class-members': ERROR,
// Makes sense as otherwise runtime error will occur
'no-this-before-super': ERROR,
// @TODO This probably should be an error
// however it is useful for: for ( var key in obj ) {
// which hopefully is more performant than let (@TODO check if it actually is more performant)
'no-var': WARN,
// Enforce ES6 object shorthand
'object-shorthand': ERROR,
// Better performance when running native
// but horrible performance if not running native as could fallback to bind
// https://travis-ci.org/bevry/es6-benchmarks
'prefer-arrow-callback': IGNORE,
// Sure, why not
'prefer-const': WARN,
// Controversial change, but makes sense to move towards to reduce the risk of bad people overwriting apply and call
// https://github.com/eslint/eslint/issues/ERROR939
'prefer-reflect': WARN,
// Sure, why not
'prefer-spread': ERROR,
// Too annoying to enforce
'prefer-template': IGNORE,
// Makes sense
'require-yield': ERROR
}
}