2019-06-26 05:49:37 +08:00
const path = require ( 'path' )
2017-05-18 04:51:43 +08:00
module . exports = {
env : {
es6 : true ,
amd : true ,
2018-11-03 01:48:59 +08:00
browser : true
2016-12-17 07:08:07 +08:00
} ,
2017-08-19 01:09:04 +08:00
extends : [
2018-11-03 01:48:59 +08:00
'airbnb' ,
'prettier/react' ,
'plugin:jest/recommended' ,
'plugin:prettier/recommended' ,
'plugin:eslint-comments/recommended' ,
'plugin:promise/recommended'
2017-08-19 01:09:04 +08:00
] ,
2017-05-18 04:51:43 +08:00
parserOptions : {
2018-11-03 01:48:59 +08:00
ecmaVersion : 2018 ,
2017-05-18 04:51:43 +08:00
ecmaFeatures : {
jsx : true
2016-12-17 07:08:07 +08:00
} ,
2018-11-03 01:48:59 +08:00
sourceType : 'module'
2016-12-17 07:08:07 +08:00
} ,
2018-11-03 01:48:59 +08:00
parser : 'babel-eslint' ,
2017-05-18 04:51:43 +08:00
globals : {
ENV : true ,
INST : true ,
2018-11-03 01:48:59 +08:00
tinyMCE : true ,
tinymce : true
2017-05-18 04:51:43 +08:00
} ,
2019-06-26 05:24:47 +08:00
plugins : [
'promise' ,
'import' ,
'notice' ,
'jest' ,
'prettier' ,
'jsx-a11y' ,
'lodash' ,
'react' ,
'react-hooks'
] ,
2017-05-18 04:51:43 +08:00
rules : {
2018-11-03 01:48:59 +08:00
// These deal with prettier and will eventually be removed
'prettier/prettier' : 'off' ,
'no-cond-assign' : [ 'error' , 'except-parens' ] ,
2019-06-26 05:24:47 +08:00
// enable the react-hooks rules
'react-hooks/rules-of-hooks' : 'error' ,
'react-hooks/exhaustive-deps' : 'warn' ,
2018-11-03 01:48:59 +08:00
// These come from our extended configurations, but we don't care about them
camelcase : 'off' , // because we have a ton of `const $user_name = $('#user_name')`
'class-methods-use-this' : 'off' ,
'consistent-return' : 'off' ,
'default-case' : 'off' ,
eqeqeq : 'warn' , // great goal! but since we do it 1061 times, downgrade AirBnB's 'error' to 'warn' :(
'func-names' : 'off' ,
'global-require' : 'off' , // every time we did this, we meant to
2018-10-12 00:57:01 +08:00
'guard-for-in' : 'off' ,
2018-11-03 01:48:59 +08:00
'no-continue' : 'off' ,
'no-else-return' : 'off' ,
'no-multi-assign' : 'off' ,
'no-nested-ternary' : 'off' ,
'no-new' : 'off' , // because we do `new SomeView()` all the time in Backbone just for the sideffects
2018-10-12 00:27:11 +08:00
'no-param-reassign' : 'off' ,
2018-11-03 01:48:59 +08:00
'no-plusplus' : 'off' ,
2018-10-12 01:05:00 +08:00
'no-prototype-builtins' : 'off' ,
2018-11-03 01:48:59 +08:00
'no-return-assign' : 'off' ,
'no-shadow' : 'warn' , // AirBnB says 'error', we downgrade to just 'warn'
'no-underscore-dangle' : 'off' ,
'no-use-before-define' : 'off' ,
'no-useless-escape' : 'off' ,
'one-var' : 'off' ,
'prefer-destructuring' : 'off' ,
'prefer-rest-params' : 'off' ,
2019-08-15 23:42:29 +08:00
'prefer-template' : 'off' , // AirBnB says 'error', we don't care
2018-11-03 01:48:59 +08:00
'eslint-comments/disable-enable-pair' : [ 'error' , { allowWholeFile : true } ] , // We are okay with turning rules off for the entirety of a file (though use it sparingly)
'import/prefer-default-export' : 'off' ,
'jsx-a11y/label-has-for' : 'off' ,
'jsx-a11y/anchor-is-valid' : [ 'error' , { components : [ ] } ] , // InstUI has special behavior around this
'promise/always-return' : 'off' ,
'promise/catch-or-return' : 'warn' , // The recommendation is to error on this, but we downgrade it to a warning
'promise/avoid-new' : 'off' ,
'promise/no-nesting' : 'off' ,
'react/destructuring-assignment' : 'off' ,
'react/no-typos' : 'off' ,
'react/sort-comp' : 'off' ,
'react/require-default-props' : 'off' ,
2019-08-13 05:55:16 +08:00
'react/prop-types' : [
'error' ,
{ 'skipUndeclared' : true }
] ,
2018-11-03 01:48:59 +08:00
'react/default-props-match-prop-types' : [ 'error' , { allowRequiredDefaults : true } ] , // add the `allowRequiredDefaults: true` option to allow specifying something as a required prop (so you get propType error messages), but in case it's not present at runtime, I'll use `[]` as the default (so it is resilient)".
'react/forbid-foreign-prop-types' : 'off' , // You can refer to proptypes within proptypes, but you shouldn't use proptypes in actual app code of the component
2019-08-14 09:31:44 +08:00
'react/jsx-no-bind' : 'off' ,
'react/jsx-props-no-spreading' : 'off' ,
2018-11-03 01:48:59 +08:00
'react/no-danger' : 'off' , // dangerouslySetInnerHTML is already pretty explicit on making you aware of its danger
'react/no-render-return-value' : 'warn' , // In future versions of react this will fail
2019-08-14 09:31:44 +08:00
'react/state-in-constructor' : 'off' ,
'react/static-property-placement' : 'off' ,
2018-11-03 01:48:59 +08:00
'no-restricted-syntax' : [
// This is here because we are turning off 2 items from what AirBnB cares about.
'error' ,
2018-10-12 00:57:01 +08:00
{
2018-11-03 01:48:59 +08:00
selector : 'LabeledStatement' ,
message :
'Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.'
2018-10-12 00:57:01 +08:00
} ,
{
2018-11-03 01:48:59 +08:00
selector : 'WithStatement' ,
message :
'`with` is disallowed in strict mode because it makes code impossible to predict and optimize.'
2018-10-12 00:57:01 +08:00
}
] ,
2018-11-03 01:48:59 +08:00
// These are discouraged, but allowed
'no-console' : 'warn' ,
'jest/no-large-snapshots' : 'warn' ,
// These are things we care about
'react/jsx-filename-extension' : [ 'error' , { extensions : [ '.js' ] } ] ,
eslint: add ignoreRestSiblings to no-unused-vars
We frequently have code like:
const {id, children} = props
const otherProps = omitProps(props, null, ['id', 'value', 'onChange'])
you could rewrite that as:
const {id, children, value, onChange, ...otherProps} = this.props
But if you did that right now, without this change, you’d get an eslint
error about `no-unused-vars` because you didn’t use value or onChange
in this function.
This makes it so eslint doesn’t complain about that.
See: https://eslint.org/docs/rules/no-unused-vars#ignorerestsiblings
Test plan:
* So the question is:
* Do you think that complaining about this rule actually catches any
real bugs?
* if so, -2 this.
* if not, +2 it
Change-Id: I2fc9b351f34e80ec74199569f768ccc71dfcd705
Reviewed-on: https://gerrit.instructure.com/202669
Tested-by: Jenkins
Reviewed-by: Ed Schiebel <eschiebel@instructure.com>
QA-Review: Ed Schiebel <eschiebel@instructure.com>
Product-Review: Ryan Shaw <ryan@instructure.com>
2019-07-26 02:28:15 +08:00
'no-unused-vars' : [ 'error' , {
argsIgnorePattern : '^_' ,
// allows `const {propIUse, propIDontUseButDontWantToPassOn, ...propsToPassOn} = this.props`
ignoreRestSiblings : true
} ] ,
2018-11-03 01:48:59 +08:00
'eslint-comments/no-unused-disable' : 'error' ,
'import/extensions' : [ 'error' , 'ignorePackages' , { js : 'never' } ] ,
'import/no-commonjs' : 'off' , // This is overridden where it counts
'import/no-extraneous-dependencies' : [ 'error' , { devDependencies : true } ] ,
'lodash/callback-binding' : 'error' ,
'lodash/collection-method-value' : 'error' ,
'lodash/collection-return' : 'error' ,
'lodash/no-extra-args' : 'error' ,
'lodash/no-unbound-this' : 'error' ,
'notice/notice' : [
'error' ,
{
2019-06-26 05:49:37 +08:00
templateFile : path . join ( _ _dirname , 'config' , 'copyright-template.js' ) ,
2018-11-03 01:48:59 +08:00
// purposely lenient so we don't automatically put our copyright notice on
// top of something already copyrighted by someone else.
mustMatch : 'Copyright '
}
2019-08-21 04:47:00 +08:00
] ,
'no-unused-expressions' : [ 'error' , { 'allowShortCircuit' : true } ]
2018-11-03 01:48:59 +08:00
} ,
settings : {
react : {
2019-08-14 09:31:44 +08:00
version : 'detect'
2018-11-03 01:48:59 +08:00
}
2018-04-24 02:40:57 +08:00
} ,
2018-05-09 03:46:39 +08:00
overrides : [
2018-11-03 01:48:59 +08:00
{
files : require ( './jest.config' ) . testMatch ,
plugins : [ 'jest' ] ,
env : {
'jest/globals' : true
} ,
rules : {
'jest/prefer-to-be-null' : 'error' ,
'jest/prefer-to-be-undefined' : 'error' ,
'jest/prefer-to-contain' : 'error' ,
'jest/no-test-return-statement' : 'error' ,
'jest/no-large-snapshots' : 'warn'
}
} ,
2018-05-09 03:46:39 +08:00
{
files : [ 'app/**/*' , 'spec/**/*' , 'public/**/*' ] ,
rules : {
2018-05-22 22:48:46 +08:00
// Turn off the "absolute-first" rule. Until we get rid of the `compiled/` and `jsx/`
// stuff and use real realitive paths it will tell you to do the wrong thing
2018-11-03 01:48:59 +08:00
'import/first' : [ 'error' , { 'absolute-first' : false } ] ,
2018-05-22 22:48:46 +08:00
2018-11-03 01:48:59 +08:00
'import/no-amd' : 'error' ,
'import/no-commonjs' : 'warn' ,
'import/no-extraneous-dependencies' : 'off' , // allows 'i18n!webzip_exports' and 'compiled/foo/bar'
'import/no-nodejs-modules' : 'error' ,
2018-10-11 07:39:10 +08:00
'import/order' : 'off' , // because it thinks 'jsx/whatever' and 'compiled/baz' should go in their groups. we don't want to encourage people to do that just so they move them back together once those everything is in same dir
2018-11-03 01:48:59 +08:00
'import/no-unresolved' : 'off' ,
'import/no-webpack-loader-syntax' : 'off'
}
2018-05-09 03:46:39 +08:00
} ,
{
2018-11-08 07:04:08 +08:00
files : require ( './.prettierwhitelist' ) ,
2018-05-09 03:46:39 +08:00
rules : {
'prettier/prettier' : 'error'
}
2018-04-24 02:40:57 +08:00
}
2018-05-09 03:46:39 +08:00
]
2017-05-18 04:51:43 +08:00
}