Skip to main content
Jump to: navigation, search

Difference between revisions of "Orion/ESLint"

(Use rule message rather than link, where possible)
(Add setting message)
Line 9: Line 9:
  
 
{| class="wikitable" border="1" cellpadding="5" cellspacing="0" style="width: 100%;"
 
{| class="wikitable" border="1" cellpadding="5" cellspacing="0" style="width: 100%;"
! width=12% | Rule
+
! width=13% | Rule
! width=6% | Default Severity
+
! width=5% | Default Severity
! width=5% | Available Since
+
! width=3% | Available Since
! width=30%| Problem Message
+
! width=24% | Setting Message
! width=40% | Details
+
! width=24%| Problem Message
 +
! width=24% | Details
 
! width=3% | Quick Fix?
 
! width=3% | Quick Fix?
 
! width=3% | Fix All?
 
! width=3% | Fix All?
Line 20: Line 21:
 
| Ignore
 
| Ignore
 
|style="text-align:center;"| 8.0
 
|style="text-align:center;"| 8.0
 +
|Trailing commas in object expressions
 
| ''Trailing commas in object expressions are discouraged.''
 
| ''Trailing commas in object expressions are discouraged.''
 
| Flags trailing commas in object expressions.
 
| Flags trailing commas in object expressions.
Line 28: Line 30:
 
| Error
 
| Error
 
|style="text-align:center;"| 8.0
 
|style="text-align:center;"| 8.0
 +
|Assignments in conditional expressions
 
| ''Expected a conditional expression and instead saw an assignment.''
 
| ''Expected a conditional expression and instead saw an assignment.''
 
| Flags assignment in an <code>if/while/do..while/for</code> condition.
 
| Flags assignment in an <code>if/while/do..while/for</code> condition.
Line 36: Line 39:
 
| Warning
 
| Warning
 
|style="text-align:center;"| 8.0
 
|style="text-align:center;"| 8.0
 +
|Discouraged console use in browser code
 
| ''Discouraged use of console in browser-based code.''
 
| ''Discouraged use of console in browser-based code.''
 
| Flags the use of console in browser-based code
 
| Flags the use of console in browser-based code
Line 44: Line 48:
 
| Error
 
| Error
 
|style="text-align:center;"| 8.0
 
|style="text-align:center;"| 8.0
 +
|Constant as conditional expression
 
| ''Discouraged use of constant as a conditional expression.''
 
| ''Discouraged use of constant as a conditional expression.''
 
| Flags the use of a constant as a conditional expression
 
| Flags the use of a constant as a conditional expression
Line 60: Line 65:
 
| Warning
 
| Warning
 
|style="text-align:center;"| 6.0
 
|style="text-align:center;"| 6.0
 +
|Discouraged 'debugger' statement use
 
| ''debugger' statement use is discouraged.''
 
| ''debugger' statement use is discouraged.''
 
| Warns when the <code>debugger</code> keyword is used
 
| Warns when the <code>debugger</code> keyword is used
Line 68: Line 74:
 
| Error
 
| Error
 
|style="text-align:center;"| 6.0
 
|style="text-align:center;"| 6.0
 +
|Duplicate object keys
 
| ''Duplicate object key '{key}'.''
 
| ''Duplicate object key '{key}'.''
 
| Flags object literals that contain the same key more than once.
 
| Flags object literals that contain the same key more than once.
Line 76: Line 83:
 
| Error
 
| Error
 
|style="text-align:center;"| 11.0
 
|style="text-align:center;"| 11.0
 +
|
 
| ''Duplicate case label.''
 
| ''Duplicate case label.''
 
| A switch statements with duplicate case labels is normally an indication of a programmer error.
 
| A switch statements with duplicate case labels is normally an indication of a programmer error.
Line 84: Line 92:
 
| Warning
 
| Warning
 
|style="text-align:center;"| 7.0
 
|style="text-align:center;"| 7.0
 +
|Undocumented empty block
 
| ''Empty block should be removed or commented.''
 
| ''Empty block should be removed or commented.''
 
| Flags an empty block like <code>if (something) { }</code>.
 
| Flags an empty block like <code>if (something) { }</code>.
Line 100: Line 109:
 
| Error
 
| Error
 
|style="text-align:center;"| 11.0
 
|style="text-align:center;"| 11.0
 +
|
 
| [http://eslint.org/docs/rules/no-extra-boolean-cast no-extra-boolean-cast]
 
| [http://eslint.org/docs/rules/no-extra-boolean-cast no-extra-boolean-cast]
 
| In contexts such as an if statement's test where the result of the expression will already be coerced to a Boolean, casting to a Boolean via double negation (!!) is unnecessary.
 
| In contexts such as an if statement's test where the result of the expression will already be coerced to a Boolean, casting to a Boolean via double negation (!!) is unnecessary.
Line 116: Line 126:
 
| Warning
 
| Warning
 
|style="text-align:center;"| 5.0
 
|style="text-align:center;"| 5.0
 +
|Unnecessary semicolons
 
| ''Unnecessary semicolon.''
 
| ''Unnecessary semicolon.''
 
| Warns when a semicolon is found where it is not needed
 
| Warns when a semicolon is found where it is not needed
Line 124: Line 135:
 
| Error
 
| Error
 
|style="text-align:center;" | 6.0
 
|style="text-align:center;" | 6.0
 +
|Switch case fall-through
 
| ''Switch case may be entered by falling through previous case. If intended, add a new comment //$FALL-THROUGH$ on the line above''
 
| ''Switch case may be entered by falling through previous case. If intended, add a new comment //$FALL-THROUGH$ on the line above''
 
| Flags a fallthrough case within a <code>switch</code> statement, unless it is explicitly commented.
 
| Flags a fallthrough case within a <code>switch</code> statement, unless it is explicitly commented.
Line 132: Line 144:
 
| Error
 
| Error
 
|style="text-align:center;"| 11.0
 
|style="text-align:center;"| 11.0
 +
|
 
| ''Invalid flags supplied to RegExp constructor '{${0}}'.'' or the error message from calling the constructor with the regex
 
| ''Invalid flags supplied to RegExp constructor '{${0}}'.'' or the error message from calling the constructor with the regex
 
| This rule validates string arguments passed to the RegExp constructor.
 
| This rule validates string arguments passed to the RegExp constructor.
Line 140: Line 153:
 
| Ignore
 
| Ignore
 
|style="text-align:center;"| 11.0
 
|style="text-align:center;"| 11.0
 +
|
 
| ''Irregular whitespace not allowed.''
 
| ''Irregular whitespace not allowed.''
 
| Invalid or irregular whitespace causes issues with ECMAScript 5 parsers and also makes code harder to debug in a similar nature to mixed tabs and spaces.
 
| Invalid or irregular whitespace causes issues with ECMAScript 5 parsers and also makes code harder to debug in a similar nature to mixed tabs and spaces.
Line 148: Line 162:
 
| Error
 
| Error
 
|style="text-align:center;"| 11.0
 
|style="text-align:center;"| 11.0
 +
|
 
| ''The 'in' expression's left operand is negated.''
 
| ''The 'in' expression's left operand is negated.''
 
| Disallow negated left operand of in operator
 
| Disallow negated left operand of in operator
Line 156: Line 171:
 
| Error
 
| Error
 
|style="text-align:center;"| 11.0
 
|style="text-align:center;"| 11.0
 +
|
 
| '' '{${0}}' is not a function.''
 
| '' '{${0}}' is not a function.''
 
| ECMAScript provides several global objects that are intended to be used as-is. Some of these objects look as if they could be constructors due their capitalization (such as Math and JSON) but will throw an error if you try to execute them as functions.
 
| ECMAScript provides several global objects that are intended to be used as-is. Some of these objects look as if they could be constructors due their capitalization (such as Math and JSON) but will throw an error if you try to execute them as functions.
Line 164: Line 180:
 
| Error
 
| Error
 
|style="text-align:center;"| 8.0
 
|style="text-align:center;"| 8.0
 +
|Multiple spaces in regular expressions
 
| ''Avoid using multiple spaces in regular expressions. Use ' {${0}}' instead.''
 
| ''Avoid using multiple spaces in regular expressions. Use ' {${0}}' instead.''
 
| Flags regular expressions that have two or more subsequent spaces.
 
| Flags regular expressions that have two or more subsequent spaces.
Line 172: Line 189:
 
| Error
 
| Error
 
|style="text-align:center;"| 8.0
 
|style="text-align:center;"| 8.0
 +
|Reserved words used as property keys
 
| ''Reserved words should not be used as property keys.''
 
| ''Reserved words should not be used as property keys.''
 
| Checks to see if a JavaScript reserved word is being used as a property key
 
| Checks to see if a JavaScript reserved word is being used as a property key
Line 180: Line 198:
 
| Warning
 
| Warning
 
|style="text-align:center;"| 8.0
 
|style="text-align:center;"| 8.0
 +
|Sparse array declarations
 
| ''Sparse array declarations should be avoided.''
 
| ''Sparse array declarations should be avoided.''
 
| Flags sparse arrays with null elements like <code>var arr = [1, ,2]</code>
 
| Flags sparse arrays with null elements like <code>var arr = [1, ,2]</code>
Line 188: Line 207:
 
| Error
 
| Error
 
|style="text-align:center;"| 6.0
 
|style="text-align:center;"| 6.0
 +
|Unreachable code
 
| ''Unreachable code.''
 
| ''Unreachable code.''
 
| Flags statements that occur after a <code>return</code>, <code>throw</code>, etc.
 
| Flags statements that occur after a <code>return</code>, <code>throw</code>, etc.
Line 196: Line 216:
 
| Error
 
| Error
 
|style="text-align:center;"| 6.0
 
|style="text-align:center;"| 6.0
 +
|NaN not compared with isNaN()
 
| ''Use the isNaN function to compare with NaN.''
 
| ''Use the isNaN function to compare with NaN.''
 
| Warns when a comparison is done against NaN without using the <code>isNaN</code> function
 
| Warns when a comparison is done against NaN without using the <code>isNaN</code> function
Line 204: Line 225:
 
| Error
 
| Error
 
|style="text-align:center;"| 7.0
 
|style="text-align:center;"| 7.0
 +
|Invalid 'typeof' comparison
 
| ''Invalid typeof comparison.''
 
| ''Invalid typeof comparison.''
 
| Warns when a typeof comparison uses an invalid type.
 
| Warns when a typeof comparison uses an invalid type.
Line 216: Line 238:
  
 
{| class="wikitable" border="1" cellpadding="5" cellspacing="0" style="width: 100%;"
 
{| class="wikitable" border="1" cellpadding="5" cellspacing="0" style="width: 100%;"
! width=12% | Rule
+
! width=13% | Rule
! width=6% | Default Severity
+
! width=5% | Default Severity
! width=5% | Available Since
+
! width=3% | Available Since
! width=30%| Problem Message
+
! width=24% | Setting Message
! width=40% | Details
+
! width=24%| Problem Message
 +
! width=24% | Details
 
! width=3% | Quick Fix?
 
! width=3% | Quick Fix?
 
! width=3% | Fix All?
 
! width=3% | Fix All?
Line 235: Line 258:
 
| Error
 
| Error
 
|style="text-align:center;" | -
 
|style="text-align:center;" | -
 +
|
 
| '''{variable}' used outside of binding context.''
 
| '''{variable}' used outside of binding context.''
 
|
 
|
Line 244: Line 268:
 
| Ignore
 
| Ignore
 
|style="text-align:center;" | 6.0
 
|style="text-align:center;" | 6.0
 +
|Statements not enclosed in braces
 
| ''Statements should be enclosed in braces.''
 
| ''Statements should be enclosed in braces.''
 
| Warns when statements should be enclosed in braces, for example <code>if(something) foo();</code>
 
| Warns when statements should be enclosed in braces, for example <code>if(something) foo();</code>
Line 252: Line 277:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 5.0
 
|style="text-align:center;" | 5.0
 +
|Discouraged '==' use
 
|
 
|
 
* ''Expected '===' and saw '=='.''
 
* ''Expected '===' and saw '=='.''
Line 262: Line 288:
 
| Error
 
| Error
 
|style="text-align:center;" | 9.0
 
|style="text-align:center;" | 9.0
 +
|Discouraged 'arguments.caller' or 'arguments.callee' use
 
| ''arguments.{callee, caller} is deprecated.''
 
| ''arguments.{callee, caller} is deprecated.''
 
| Flags references to <code>arguments.callee</code> and <code>arguments.caller</code>.
 
| Flags references to <code>arguments.callee</code> and <code>arguments.caller</code>.
Line 270: Line 297:
 
| Warning
 
| Warning
 
|style="text-align:center;"| 11.0
 
|style="text-align:center;"| 11.0
 +
|
 
| ''Unexpected 'else' after 'return'.''
 
| ''Unexpected 'else' after 'return'.''
 
| If an if block contains a return statement, the else block becomes unnecessary. Its contents can be placed outside of the block.
 
| If an if block contains a return statement, the else block becomes unnecessary. Its contents can be placed outside of the block.
Line 278: Line 306:
 
| Error
 
| Error
 
|style="text-align:center;"| 11.0
 
|style="text-align:center;"| 11.0
 +
|
 
| ''Unexpected label "{${0}}"''
 
| ''Unexpected label "{${0}}"''
 
| Labeled statements are only used in conjunction with labeled break and continue statements. ECMAScript has no goto statement.
 
| Labeled statements are only used in conjunction with labeled break and continue statements. ECMAScript has no goto statement.
Line 286: Line 315:
 
| Error
 
| Error
 
|style="text-align:center;"| 11.0
 
|style="text-align:center;"| 11.0
 +
|
 
| ''Use ‘===’ to compare with ‘null’.'' or ''Use ‘!==’ to compare with ‘null’.''
 
| ''Use ‘===’ to compare with ‘null’.'' or ''Use ‘!==’ to compare with ‘null’.''
 
| Comparing to null without a type-checking operator (== or !=), can have unintended results as the comparison will evaluate to true when comparing to not just a null, but also an undefined value.
 
| Comparing to null without a type-checking operator (== or !=), can have unintended results as the comparison will evaluate to true when comparing to not just a null, but also an undefined value.
Line 294: Line 324:
 
| Ignore
 
| Ignore
 
|style="text-align:center;" | 6.0
 
|style="text-align:center;" | 6.0
 +
|Discouraged 'eval()' use
 
| '''eval' function calls are discouraged.''
 
| '''eval' function calls are discouraged.''
 
| Warns when the <code>eval()</code> function is used
 
| Warns when the <code>eval()</code> function is used
Line 302: Line 333:
 
| Ignore
 
| Ignore
 
|style="text-align:center;" | 6.0
 
|style="text-align:center;" | 6.0
 +
|Discouraged implied 'eval()' use
 
| ''Implicit 'eval' function calls are discouraged.''
 
| ''Implicit 'eval' function calls are discouraged.''
 
| Flags calls to the string-argument form of <code>setTimeout</code> and <code>setInterval</code>, which implicitly perform <code>eval</code>. This rule logic was merged to be part of the <b>no-eval</b> rule.
 
| Flags calls to the string-argument form of <code>setTimeout</code> and <code>setInterval</code>, which implicitly perform <code>eval</code>. This rule logic was merged to be part of the <b>no-eval</b> rule.
Line 310: Line 342:
 
| Error
 
| Error
 
|style="text-align:center;" | 8.0
 
|style="text-align:center;" | 8.0
 +
|Discouraged __iterator__ property use
 
| ''Discouraged __iterator__ property use.''
 
| ''Discouraged __iterator__ property use.''
 
| Flags use of <code>__iterator__</code> as an identifier name or property key.
 
| Flags use of <code>__iterator__</code> as an identifier name or property key.
Line 318: Line 351:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 6.0
 
|style="text-align:center;" | 6.0
 +
|Discouraged 'new Array()'
 
| ''Use the array literal notation [].''
 
| ''Use the array literal notation [].''
 
| Flags <code>new Array()</code>. ESLint calls this rule <code>no-array-constructor</code>
 
| Flags <code>new Array()</code>. ESLint calls this rule <code>no-array-constructor</code>
Line 326: Line 360:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 6.0
 
|style="text-align:center;" | 6.0
 +
|Discouraged 'new Function()'
 
| ''The Function constructor is eval.''
 
| ''The Function constructor is eval.''
 
| Flags <code>new Function()</code>.
 
| Flags <code>new Function()</code>.
Line 334: Line 369:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 6.0
 
|style="text-align:center;" | 6.0
 +
|Discouraged 'new Object()'
 
| ''Use the object literal notation {}.''
 
| ''Use the object literal notation {}.''
 
| Flags <code>new Object()</code>.
 
| Flags <code>new Object()</code>.
Line 342: Line 378:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 6.0
 
|style="text-align:center;" | 6.0
 +
|Discouraged wrapper objects
 
| ''Do not use {String, Number, Boolean, Math, JSON} as a constructor.''
 
| ''Do not use {String, Number, Boolean, Math, JSON} as a constructor.''
 
| Flags <code>new</code> applied to any of those.
 
| Flags <code>new</code> applied to any of those.
Line 350: Line 387:
 
| Error
 
| Error
 
|style="text-align:center;" | 9.0
 
|style="text-align:center;" | 9.0
 +
|Discouraged __proto__ property use
 
|
 
|
 
* ''Reserved name '__proto__' should not be assigned.''
 
* ''Reserved name '__proto__' should not be assigned.''
Line 360: Line 398:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 5.0
 
|style="text-align:center;" | 5.0
 +
|Variable re-declarations
 
| '''{a}' is already defined.''
 
| '''{a}' is already defined.''
 
| Usually results from having two <code>for</code> loops in the same function that share a loop variable declaration like <code>var i=...</code>.
 
| Usually results from having two <code>for</code> loops in the same function that share a loop variable declaration like <code>var i=...</code>.
Line 368: Line 407:
 
| Error
 
| Error
 
|style="text-align:center;"| 11.0
 
|style="text-align:center;"| 11.0
 +
|
 
| ''Comparing to itself is potentially pointless.''
 
| ''Comparing to itself is potentially pointless.''
 
| Comparing a variable against itself is usually an error, either an typo or refactoring error. It is confusing to the reader and may potentially introduce a runtime error.
 
| Comparing a variable against itself is usually an error, either an typo or refactoring error. It is confusing to the reader and may potentially introduce a runtime error.
Line 376: Line 416:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 8.0
 
|style="text-align:center;" | 8.0
 +
|Variable shadowing
 
| '''{a}' is already declared in the upper scope.''
 
| '''{a}' is already declared in the upper scope.''
 
| Flags variables that have the same name as a variable declared in an upper scope.
 
| Flags variables that have the same name as a variable declared in an upper scope.
Line 384: Line 425:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 9.0
 
|style="text-align:center;" | 9.0
 +
|Global shadowing
 
| '''{a}' shadows a global member.''
 
| '''{a}' shadows a global member.''
 
| Flags variables that have the same name as a variable declared in the global scope or specified environments.
 
| Flags variables that have the same name as a variable declared in the global scope or specified environments.
Line 392: Line 434:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 9.0
 
|style="text-align:center;" | 9.0
 +
|Literal used in 'throw'
 
| ''Throw an Error instead.''
 
| ''Throw an Error instead.''
 
| Flags code that throws a literal, eg. <code>throw "a problem occurred";</code>
 
| Flags code that throws a literal, eg. <code>throw "a problem occurred";</code>
Line 400: Line 443:
 
| Error
 
| Error
 
|style="text-align:center;" | 5.0
 
|style="text-align:center;" | 5.0
 +
|Undeclared global reference
 
| '''{variable}' is not defined.''
 
| '''{variable}' is not defined.''
 
|
 
|
Line 410: Line 454:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 6.0
 
|style="text-align:center;" | 6.0
 +
|Unused parameters
 
| ''Parameter '{param}' is not used.''
 
| ''Parameter '{param}' is not used.''
 
| Flags parameters in function declarations / expressions if they are not being used
 
| Flags parameters in function declarations / expressions if they are not being used
Line 418: Line 463:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 5.0
 
|style="text-align:center;" | 5.0
 +
|Unused variables
 
|  
 
|  
 
*'''{a}' is not read.''
 
*'''{a}' is not read.''
Line 428: Line 474:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 5.0
 
|style="text-align:center;" | 5.0
 +
|Member used before definition
 
| '''{a}' was used before it was defined.''
 
| '''{a}' was used before it was defined.''
 
| Warns when a variable or function is used before it is defined
 
| Warns when a variable or function is used before it is defined
Line 436: Line 483:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 9.0
 
|style="text-align:center;" | 9.0
 +
|Discouraged 'with' statement use
 
| ''Expected an identifier and instead saw 'with'.''
 
| ''Expected an identifier and instead saw 'with'.''
 
| Treated as fatal parse error in JSLint.
 
| Treated as fatal parse error in JSLint.
Line 444: Line 492:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 8.0
 
|style="text-align:center;" | 8.0
 +
|Missing radix parameter to parseInt()
 
| ''Missing radix parameter.''
 
| ''Missing radix parameter.''
 
| Warns when parseInt() called without the 2nd parameter (radix).
 
| Warns when parseInt() called without the 2nd parameter (radix).
Line 452: Line 501:
 
| Error
 
| Error
 
|style="text-align:center;" | 11.0
 
|style="text-align:center;" | 11.0
 +
|Disallow self assignment
 
| ''Assigning to itself is pointless.''
 
| ''Assigning to itself is pointless.''
 
| Warns when a variable is being assigned to itself
 
| Warns when a variable is being assigned to itself
Line 463: Line 513:
  
 
{| class="wikitable" border="1" cellpadding="5" cellspacing="0" style="width: 100%;"
 
{| class="wikitable" border="1" cellpadding="5" cellspacing="0" style="width: 100%;"
! width=12% | Rule
+
! width=13% | Rule
! width=6% | Default Severity
+
! width=5% | Default Severity
! width=5% | Available Since
+
! width=3% | Available Since
! width=30%| Problem Message
+
! width=24% | Setting Message
! width=40% | Details
+
! width=24%| Problem Message
 +
! width=24% | Details
 
! width=3% | Quick Fix?
 
! width=3% | Quick Fix?
 
! width=3% | Fix All?
 
! width=3% | Fix All?
Line 474: Line 525:
 
| Ignore
 
| Ignore
 
|style="text-align:center;" | 5.0
 
|style="text-align:center;" | 5.0
 +
|Missing JSDoc
 
| ''Missing documentation for function '{name}'.''
 
| ''Missing documentation for function '{name}'.''
 
| Flags missing documentation nodes on function declarations and function expressions when they appear as object properties
 
| Flags missing documentation nodes on function declarations and function expressions when they appear as object properties
Line 482: Line 534:
 
| Ignore
 
| Ignore
 
|style="text-align:center;" | -
 
|style="text-align:center;" | -
 +
|
 
| ''Missing '{a}' tag for '{b}'.''  
 
| ''Missing '{a}' tag for '{b}'.''  
 
| Flags missing documentation for parameters, returns, throws, etc on function declarations and function expressions when they appear as object properties
 
| Flags missing documentation for parameters, returns, throws, etc on function declarations and function expressions when they appear as object properties
Line 490: Line 543:
 
| Ignore
 
| Ignore
 
|style="text-align:center;" | 9.0
 
|style="text-align:center;" | 9.0
 +
|Non-externalized string literals (missing $NON-NLS$ tag)
 
| ''Non-externalized string literal '{a}'.''
 
| ''Non-externalized string literal '{a}'.''
 
| Flags String literals that are not properly NLS'd
 
| Flags String literals that are not properly NLS'd
Line 498: Line 552:
 
| Ignore
 
| Ignore
 
|style="text-align:center;" | 11.0
 
|style="text-align:center;" | 11.0
 +
|Unnecessary $NON-NLS$ tags
 
| ''Unnecessary $NON-NLS$ tag.''
 
| ''Unnecessary $NON-NLS$ tag.''
 
| Flags $NON-NLS$ comments that are not needed to exclude a string literal
 
| Flags $NON-NLS$ comments that are not needed to exclude a string literal
Line 506: Line 561:
 
| Error
 
| Error
 
|style="text-align:center;" | 6.0
 
|style="text-align:center;" | 6.0
 +
|Missing parentheses in constructor call
 
| ''Missing parentheses invoking constructor.''
 
| ''Missing parentheses invoking constructor.''
 
| Flags <code>new Whatever</code>  
 
| Flags <code>new Whatever</code>  
Line 514: Line 570:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 7.0
 
|style="text-align:center;" | 7.0
 +
|Unsupported environment directive
 
| ''The 'jslint' directive is unsupported, please use eslint-env.''
 
| ''The 'jslint' directive is unsupported, please use eslint-env.''
 
| Flags use of the /* jslint */ directive
 
| Flags use of the /* jslint */ directive
Line 522: Line 579:
 
| Error
 
| Error
 
|style="text-align:center;" | -
 
|style="text-align:center;" | -
 +
|
 
| ''Mixed return types should be avoided.''
 
| ''Mixed return types should be avoided.''
 
| Flags functions that return more than one kind of item, for example returning String and Object
 
| Flags functions that return more than one kind of item, for example returning String and Object
Line 528: Line 586:
 
|-
 
|-
 
!style="text-align:left;"| [https://bugs.eclipse.org/bugs/show_bug.cgi?id=461852 no-undef-init]
 
!style="text-align:left;"| [https://bugs.eclipse.org/bugs/show_bug.cgi?id=461852 no-undef-init]
 +
Moved to best practices
 
| Warning
 
| Warning
 
|style="text-align:center;" | 9.0
 
|style="text-align:center;" | 9.0
 +
|Explicitly initializing variables to undefined
 
| ''Avoid explicitly initializing variables to 'undefined'.''
 
| ''Avoid explicitly initializing variables to 'undefined'.''
 
| Warns when an explicit assignment to undefined is done, for example <code>var foo = undefined;</code>
 
| Warns when an explicit assignment to undefined is done, for example <code>var foo = undefined;</code>
Line 538: Line 598:
 
| Warning
 
| Warning
 
|style="text-align:center;" | 5.0
 
|style="text-align:center;" | 5.0
 +
|Missing semicolons
 
| ''Missing semicolon.''
 
| ''Missing semicolon.''
 
| Warns when a semicolon should be used but is not
 
| Warns when a semicolon should be used but is not

Revision as of 11:00, 13 January 2016

Orion 5.0 introduced ESLint as the validator that ships with Orion. This page captures ongoing issues.

Rules

The following sections describe all of the rules currently available in Orion and ones that we plan to add in the future.

Potential Programming Problems

These rules report about problems with your code that might have undesired or incorrect results. Warnings from these rules should be addressed.

Rule Default Severity Available Since Setting Message Problem Message Details Quick Fix? Fix All?
no-comma-dangle Ignore 8.0 Trailing commas in object expressions Trailing commas in object expressions are discouraged. Flags trailing commas in object expressions.
no-cond-assign Error 8.0 Assignments in conditional expressions Expected a conditional expression and instead saw an assignment. Flags assignment in an if/while/do..while/for condition. Future
no-console Warning 8.0 Discouraged console use in browser code Discouraged use of console in browser-based code. Flags the use of console in browser-based code
no-constant-condition Error 8.0 Constant as conditional expression Discouraged use of constant as a conditional expression. Flags the use of a constant as a conditional expression
no-control-regex Error 11.0 Unexpected control character in regular expression Control characters are special, invisible characters in the ASCII range 0-31. These characters are rarely used in JavaScript strings so a regular expression containing these characters is most likely a mistake.
no-debugger Warning 6.0 Discouraged 'debugger' statement use debugger' statement use is discouraged. Warns when the debugger keyword is used Future
no-dupe-keys Error 6.0 Duplicate object keys Duplicate object key '{key}'. Flags object literals that contain the same key more than once. Future
no-duplicate-case Error 11.0 Duplicate case label. A switch statements with duplicate case labels is normally an indication of a programmer error.
no-empty-block Warning 7.0 Undocumented empty block Empty block should be removed or commented. Flags an empty block like if (something) { }.
no-empty-character-class Error 11.0 Empty class. Empty character classes in regular expressions do not match anything and can result in code that may not work as intended.
no-extra-boolean-cast Error 11.0 no-extra-boolean-cast In contexts such as an if statement's test where the result of the expression will already be coerced to a Boolean, casting to a Boolean via double negation (!!) is unnecessary.
no-extra-parens Warning 11.0 Gratuitous parentheses around expression. This rule restricts the use of parentheses to only where they are necessary. It may be restricted to report only function expressions.
no-extra-semi Warning 5.0 Unnecessary semicolons Unnecessary semicolon. Warns when a semicolon is found where it is not needed
no-fallthrough Error 6.0 Switch case fall-through Switch case may be entered by falling through previous case. If intended, add a new comment //$FALL-THROUGH$ on the line above Flags a fallthrough case within a switch statement, unless it is explicitly commented.
no-invalid-regexp Error 11.0 Invalid flags supplied to RegExp constructor '{${0}}'. or the error message from calling the constructor with the regex This rule validates string arguments passed to the RegExp constructor.
no-irregular-whitespace Ignore 11.0 Irregular whitespace not allowed. Invalid or irregular whitespace causes issues with ECMAScript 5 parsers and also makes code harder to debug in a similar nature to mixed tabs and spaces.
no-negated-in-lhs Error 11.0 The 'in' expression's left operand is negated. Disallow negated left operand of in operator
no-obj-calls Error 11.0 '{${0}}' is not a function. ECMAScript provides several global objects that are intended to be used as-is. Some of these objects look as if they could be constructors due their capitalization (such as Math and JSON) but will throw an error if you try to execute them as functions.
no-regex-spaces Error 8.0 Multiple spaces in regular expressions Avoid using multiple spaces in regular expressions. Use ' {${0}}' instead. Flags regular expressions that have two or more subsequent spaces.
no-reserved-keys Error 8.0 Reserved words used as property keys Reserved words should not be used as property keys. Checks to see if a JavaScript reserved word is being used as a property key Future
no-sparse-arrays Warning 8.0 Sparse array declarations Sparse array declarations should be avoided. Flags sparse arrays with null elements like var arr = [1, ,2] Future
no-unreachable Error 6.0 Unreachable code Unreachable code. Flags statements that occur after a return, throw, etc.
use-isnan Error 6.0 NaN not compared with isNaN() Use the isNaN function to compare with NaN. Warns when a comparison is done against NaN without using the isNaN function Future
valid-typeof Error 7.0 Invalid 'typeof' comparison Invalid typeof comparison. Warns when a typeof comparison uses an invalid type.

Best Practices

These rules are not necessarily problem with your code, but are warnings that you might be doing something you probably should not be.

Rule Default Severity Available Since Setting Message Problem Message Details Quick Fix? Fix All?
accessor-pairs Warning 11.0 Getter is not present or Setter is not present It's a common mistake in JavaScript to create an object with just a setter for a property but never have a corresponding getter defined for it. Without a getter, you cannot read the property, so it ends up not being used.
block-scoped-var Error - '{variable}' used outside of binding context.

Occurs when a function-scoped variable (var) is treated as if it was block scoped.

curly Ignore 6.0 Statements not enclosed in braces Statements should be enclosed in braces. Warns when statements should be enclosed in braces, for example if(something) foo(); Future Future
eqeqeq Warning 5.0 Discouraged '==' use
  • Expected '===' and saw '=='.
  • Expected '!==' and saw '!='.
Warns when == or != is used
no-caller Error 9.0 Discouraged 'arguments.caller' or 'arguments.callee' use arguments.{callee, caller} is deprecated. Flags references to arguments.callee and arguments.caller.
no-else-return Warning 11.0 Unexpected 'else' after 'return'. If an if block contains a return statement, the else block becomes unnecessary. Its contents can be placed outside of the block.
no-empty-label Error 11.0 Unexpected label "{${0}}" Labeled statements are only used in conjunction with labeled break and continue statements. ECMAScript has no goto statement.
no-eq-null Error 11.0 Use ‘===’ to compare with ‘null’. or Use ‘!==’ to compare with ‘null’. Comparing to null without a type-checking operator (== or !=), can have unintended results as the comparison will evaluate to true when comparing to not just a null, but also an undefined value.
no-eval Ignore 6.0 Discouraged 'eval()' use 'eval' function calls are discouraged. Warns when the eval() function is used
no-implied-eval Ignore 6.0 Discouraged implied 'eval()' use Implicit 'eval' function calls are discouraged. Flags calls to the string-argument form of setTimeout and setInterval, which implicitly perform eval. This rule logic was merged to be part of the no-eval rule.
no-iterator Error 8.0 Discouraged __iterator__ property use Discouraged __iterator__ property use. Flags use of __iterator__ as an identifier name or property key.
no-new-array Warning 6.0 Discouraged 'new Array()' Use the array literal notation []. Flags new Array(). ESLint calls this rule no-array-constructor Future Future
no-new-func Warning 6.0 Discouraged 'new Function()' The Function constructor is eval. Flags new Function().
no-new-object Warning 6.0 Discouraged 'new Object()' Use the object literal notation {}. Flags new Object().
no-new-wrappers Warning 6.0 Discouraged wrapper objects Do not use {String, Number, Boolean, Math, JSON} as a constructor. Flags new applied to any of those. Future
no-proto Error 9.0 Discouraged __proto__ property use
  • Reserved name '__proto__' should not be assigned.
  • Reserved name '__proto__' should not be used as a key.
Flags use of the property __proto__ as object keys or in assignments
no-redeclare Warning 5.0 Variable re-declarations '{a}' is already defined. Usually results from having two for loops in the same function that share a loop variable declaration like var i=.... Future
no-self-compare Error 11.0 Comparing to itself is potentially pointless. Comparing a variable against itself is usually an error, either an typo or refactoring error. It is confusing to the reader and may potentially introduce a runtime error.
no-shadow Warning 8.0 Variable shadowing '{a}' is already declared in the upper scope. Flags variables that have the same name as a variable declared in an upper scope. Future
no-shadow-global Warning 9.0 Global shadowing '{a}' shadows a global member. Flags variables that have the same name as a variable declared in the global scope or specified environments. Future
no-throw-literal Warning 9.0 Literal used in 'throw' Throw an Error instead. Flags code that throws a literal, eg. throw "a problem occurred"; Future
no-undef Error 5.0 Undeclared global reference '{variable}' is not defined.
  • Flags references to a global variable that is not listed in a /*global*/ or /*globals*/ block.
  • Predefined environments (eg. node, browser, amd) can be set in a /*eslint-env*/ block.
no-unused-params Warning 6.0 Unused parameters Parameter '{param}' is not used. Flags parameters in function declarations / expressions if they are not being used
no-unused-vars Warning 5.0 Unused variables
  • '{a}' is not read.
  • '{a}' is read-only.
Warns when a variable is created and not used (read) or a variable that is read-only is assigned to.
no-use-before-define Warning 5.0 Member used before definition '{a}' was used before it was defined. Warns when a variable or function is used before it is defined
no-with Warning 9.0 Discouraged 'with' statement use Expected an identifier and instead saw 'with'. Treated as fatal parse error in JSLint.
radix Warning 8.0 Missing radix parameter to parseInt() Missing radix parameter. Warns when parseInt() called without the 2nd parameter (radix).
no-self-assign Error 11.0 Disallow self assignment Assigning to itself is pointless. Warns when a variable is being assigned to itself Future Future

Code Style

These rules are not problems in any way but will warn based on certain accepted styles for coding.

Rule Default Severity Available Since Setting Message Problem Message Details Quick Fix? Fix All?
missing-doc Ignore 5.0 Missing JSDoc Missing documentation for function '{name}'. Flags missing documentation nodes on function declarations and function expressions when they appear as object properties Future Future
missing-doc-items Ignore - Missing '{a}' tag for '{b}'. Flags missing documentation for parameters, returns, throws, etc on function declarations and function expressions when they appear as object properties
missing-nls Ignore 9.0 Non-externalized string literals (missing $NON-NLS$ tag) Non-externalized string literal '{a}'. Flags String literals that are not properly NLS'd Future
unnecessary-nls Ignore 11.0 Unnecessary $NON-NLS$ tags Unnecessary $NON-NLS$ tag. Flags $NON-NLS$ comments that are not needed to exclude a string literal
new-parens Error 6.0 Missing parentheses in constructor call Missing parentheses invoking constructor. Flags new Whatever Future
no-jslint Warning 7.0 Unsupported environment directive The 'jslint' directive is unsupported, please use eslint-env. Flags use of the /* jslint */ directive Future
no-mixed-returns Error - Mixed return types should be avoided. Flags functions that return more than one kind of item, for example returning String and Object
no-undef-init

Moved to best practices

Warning 9.0 Explicitly initializing variables to undefined Avoid explicitly initializing variables to 'undefined'. Warns when an explicit assignment to undefined is done, for example var foo = undefined; Future Future
semi Warning 5.0 Missing semicolons Missing semicolon. Warns when a semicolon should be used but is not

Implementing a new rule

This section explains how to implement a new linting rule. For brevity, all paths are given relative to bundles/org.eclipse.orion.client.javascript/web/ in the client repo.

First, create the tests and rule:

  1. Create a new describe("{rule-name}") block in: /js-tests/javascript/eslintRuleTests.js. Add several tests to it.
  2. Run the JS bundle tests and ensure that your new tests fail.
  3. Implement the actual logic for your rule in /eslint/lib/load-rules-async.js.
  4. Run the tests again. This time they should all pass.

To get your rule running in the Orion product's validator, there are additional steps:

  1. Create strings for the validation message(s) generated by your rule in /javascript/nls/root/problems.js.
  2. Create a short string describing what your rule does in /javascript/nls/root/messages.js.
  3. Add an entry to the orion.core.setting declaration in /javascript/plugins/javascriptPlugin.js. This allows your rule to be configured from the JS validator settings page. Make sure it references the same nameKey used in messages.js.
  4. Add a config entry for your rule to /javascript/ruleData.js.
  5. Add your rule to the #updated() handler in /javascript/validator.js.

Reload the JS plugin, and your rule should now be configurable from the Settings page, and properly set up for translation too.

Tests

  • Every rule needs extensive unit tests.
  • Unit tests should use Mocha.

Running the tests

  • To run the ESLint tests as part of the main JavaScript tests suite load {orion-server-url}/javascript/js-tests/JsMochaSuite.html in your web browser.
  • To run just the ESLint rule tests, load {orion-server-url}/js-tests/javascript/JsMochaSuite.html?grep=ESLint%20Rule%20Tests in your browser.
  • To run just the ESLint core tests, load {orion-server-url}/js-tests/javascript/JsMochaSuite.html?grep=ESLint%20Core%20Tests in your browser.
  • To run only a subset of the tests, add ?grep=ESLint%20Rule%20Tests onto the test page URL.

See Mocha usage options for more options.

User interface

  • Should we have a UI for configuring what rules are active? bug 424268.
  • Should we try to support .eslintrc? This would be an ideal project-scope setting, and is being tracked in bug 461228.
  • Should we try to honor equivalent JSLint/JSHint flags when possible? For example /*jslint eqeqeq:false */ could disable the eqeqeq rule on a per-file basis.
    • ESLint now has its own syntax for this: /*eslint ..*/, which we are using instead.

i18n

We need to support i18n. Pre-req is bug 422278 (orion.edit.validator support for i18n).

Back to the top