eslint-plugin-babel
Advanced tools
Comparing version 3.3.0 to 4.0.0
@@ -14,2 +14,3 @@ 'use strict'; | ||
'func-params-comma-dangle': require('./rules/func-params-comma-dangle'), | ||
'no-invalid-this': require('./rules/no-invalid-this'), | ||
}, | ||
@@ -26,3 +27,4 @@ rulesConfig: { | ||
'func-params-comma-dangle': 0, | ||
'no-invalid-this': 0, | ||
} | ||
}; |
{ | ||
"name": "eslint-plugin-babel", | ||
"version": "3.3.0", | ||
"version": "4.0.0", | ||
"description": "an eslint rule plugin companion to babel-eslint", | ||
"main": "index.js", | ||
"scripts": { | ||
"test": "mocha ./tests/*.js" | ||
"test": "mocha ./tests/rules/*.js" | ||
}, | ||
@@ -22,2 +22,5 @@ "repository": { | ||
"license": "MIT", | ||
"engines": { | ||
"node": ">=4" | ||
}, | ||
"bugs": { | ||
@@ -28,11 +31,10 @@ "url": "https://github.com/babel/eslint-plugin-babel/issues" | ||
"peerDependencies": { | ||
"eslint": ">=1.0.0" | ||
"eslint": ">=3.0.0" | ||
}, | ||
"devDependencies": { | ||
"babel-eslint": "^4.0.7", | ||
"eslint": "^1.1.0", | ||
"is-my-json-valid": "^2.12.0", | ||
"mocha": "^2.2.5", | ||
"phantomjs": "^1.9.17" | ||
"babel-eslint": "^7.1.0", | ||
"eslint": "^3.0.0", | ||
"lodash.clonedeep": "^4.5.0", | ||
"mocha": "^3.0.0" | ||
} | ||
} |
@@ -7,6 +7,8 @@ # eslint-plugin-babel | ||
> Requires Node 4 or greater | ||
### Install | ||
```sh | ||
npm install eslint-plugin-babel -D | ||
npm install eslint-plugin-babel --save-dev | ||
``` | ||
@@ -30,11 +32,7 @@ | ||
"rules": { | ||
"babel/generator-star-spacing": 1, | ||
"babel/new-cap": 1, | ||
"babel/array-bracket-spacing": 1, | ||
"babel/object-curly-spacing": 1, | ||
"babel/object-shorthand": 1, | ||
"babel/arrow-parens": 1, | ||
"babel/no-await-in-loop": 1, | ||
"babel/flow-object-type": 1, | ||
"babel/func-params-comma-dangle": 1 | ||
"babel/no-invalid-this": 1 | ||
} | ||
@@ -49,8 +47,5 @@ } | ||
- `babel/generator-star-spacing`: Handles async/await functions correctly | ||
- `babel/new-cap`: Ignores capitalized decorators (`@Decorator`) | ||
- `babel/array-bracket-spacing`: Handles destructuring arrays with flow type in function parameters (🛠 ) | ||
- `babel/object-curly-spacing`: doesn't complain about `export x from "mod";` or `export * as x from "mod";` (🛠 ) | ||
- `babel/object-shorthand`: doesn't fail when using object spread (`...obj`) | ||
- `babel/arrow-parens`: Handles async functions correctly (🛠 ) | ||
- `babel/no-invalid-this`: doesn't fail when inside class properties (`class A { a = this.b; }`) | ||
@@ -61,5 +56,10 @@ The following rules are not in `eslint`, but are relevant only to syntax that is not specified by | ||
- `babel/no-await-in-loop`: guard against awaiting async functions inside of a loop | ||
- `babel/flow-object-type`: Require a particular separator between properties in Flow object types. (🛠 ) | ||
- Use the option `semicolon` to require semicolons (e.g. `type Foo = { bar: number; baz: string }`). | ||
- Use the option `comma` to require commas (e.g. `type Foo = { bar: number, baz: string }`). | ||
- `babel/func-params-comma-dangle`: Require or forbid trailing commas for function paramater lists. Behaves like, and takes the same options as, `eslint`'s [`comma-dangle`](http://eslint.org/docs/rules/comma-dangle). (🛠 ) | ||
#### Deprecated | ||
- `babel/generator-star-spacing`: Use [`generator-star-spacing`](http://eslint.org/docs/rules/generator-star-spacing). | ||
- `babel/object-shorthand`: Use [`object-shorthand`](http://eslint.org/docs/rules/object-shorthand). | ||
- `babel/arrow-parens`: Use [`arrow-parens`](http://eslint.org/docs/rules/arrow-parens). | ||
- `babel/func-params-comma-dangle`: Use [`comma-dangle`](http://eslint.org/docs/rules/comma-dangle). | ||
- `babel/array-bracket-spacing`: Use [`array-bracket-spacing`](http://eslint.org/docs/rules/array-bracket-spacing). | ||
- `babel/flow-object-type`: Use [`flowtype/object-type-delimiter`](https://github.com/gajus/eslint-plugin-flowtype#eslint-plugin-flowtype-rules-object-type-delimiter). |
@@ -1,201 +0,18 @@ | ||
/** | ||
* @fileoverview Disallows or enforces spaces inside of array brackets. | ||
* @author Jamund Ferguson | ||
* @copyright 2015 Jamund Ferguson. All rights reserved. | ||
* @copyright 2014 Brandyn Bennett. All rights reserved. | ||
* @copyright 2014 Michael Ficarra. No rights reserved. | ||
* @copyright 2014 Vignesh Anand. All rights reserved. | ||
*/ | ||
"use strict"; | ||
//------------------------------------------------------------------------------ | ||
// Rule Definition | ||
//------------------------------------------------------------------------------ | ||
module.exports = function(context) { | ||
var spaced = context.options[0] === "always", | ||
sourceCode = context.getSourceCode(); | ||
/** | ||
* Determines whether an option is set, relative to the spacing option. | ||
* If spaced is "always", then check whether option is set to false. | ||
* If spaced is "never", then check whether option is set to true. | ||
* @param {Object} option - The option to exclude. | ||
* @returns {boolean} Whether or not the property is excluded. | ||
*/ | ||
function isOptionSet(option) { | ||
return context.options[1] ? context.options[1][option] === !spaced : false; | ||
} | ||
var options = { | ||
spaced: spaced, | ||
singleElementException: isOptionSet("singleValue"), | ||
objectsInArraysException: isOptionSet("objectsInArrays"), | ||
arraysInArraysException: isOptionSet("arraysInArrays") | ||
}; | ||
//-------------------------------------------------------------------------- | ||
// Helpers | ||
//-------------------------------------------------------------------------- | ||
/** | ||
* Determines whether two adjacent tokens are on the same line. | ||
* @param {Object} left - The left token object. | ||
* @param {Object} right - The right token object. | ||
* @returns {boolean} Whether or not the tokens are on the same line. | ||
*/ | ||
function isSameLine(left, right) { | ||
return left.loc.start.line === right.loc.start.line; | ||
} | ||
/** | ||
* Reports that there shouldn't be a space after the first token | ||
* @param {ASTNode} node - The node to report in the event of an error. | ||
* @param {Token} token - The token to use for the report. | ||
* @returns {void} | ||
*/ | ||
function reportNoBeginningSpace(node, token) { | ||
context.report({ | ||
node: node, | ||
loc: token.loc.start, | ||
message: "There should be no space after '" + token.value + "'", | ||
fix: function(fixer) { | ||
var nextToken = sourceCode.getTokenAfter(token); | ||
return fixer.removeRange([token.range[1], nextToken.range[0]]); | ||
var isWarnedForDeprecation = false; | ||
module.exports = function() { | ||
return { | ||
Program() { | ||
if (isWarnedForDeprecation || /\=-(f|-format)=/.test(process.argv.join('='))) { | ||
return; | ||
} | ||
}); | ||
} | ||
/** | ||
* Reports that there shouldn't be a space before the last token | ||
* @param {ASTNode} node - The node to report in the event of an error. | ||
* @param {Token} token - The token to use for the report. | ||
* @returns {void} | ||
*/ | ||
function reportNoEndingSpace(node, token) { | ||
context.report({ | ||
node: node, | ||
loc: token.loc.start, | ||
message: "There should be no space before '" + token.value + "'", | ||
fix: function(fixer) { | ||
var previousToken = sourceCode.getTokenBefore(token); | ||
return fixer.removeRange([previousToken.range[1], token.range[0]]); | ||
} | ||
}); | ||
} | ||
/** | ||
* Reports that there should be a space after the first token | ||
* @param {ASTNode} node - The node to report in the event of an error. | ||
* @param {Token} token - The token to use for the report. | ||
* @returns {void} | ||
*/ | ||
function reportRequiredBeginningSpace(node, token) { | ||
context.report({ | ||
node: node, | ||
loc: token.loc.start, | ||
message: "A space is required after '" + token.value + "'", | ||
fix: function(fixer) { | ||
return fixer.insertTextAfter(token, " "); | ||
} | ||
}); | ||
} | ||
/** | ||
* Reports that there should be a space before the last token | ||
* @param {ASTNode} node - The node to report in the event of an error. | ||
* @param {Token} token - The token to use for the report. | ||
* @returns {void} | ||
*/ | ||
function reportRequiredEndingSpace(node, token) { | ||
context.report({ | ||
node: node, | ||
loc: token.loc.start, | ||
message: "A space is required before '" + token.value + "'", | ||
fix: function(fixer) { | ||
return fixer.insertTextBefore(token, " "); | ||
} | ||
}); | ||
} | ||
/** | ||
* Determines if a node is an object type | ||
* @param {ASTNode} node - The node to check. | ||
* @returns {boolean} Whether or not the node is an object type. | ||
*/ | ||
function isObjectType(node) { | ||
return node && (node.type === "ObjectExpression" || node.type === "ObjectPattern"); | ||
} | ||
/** | ||
* Determines if a node is an array type | ||
* @param {ASTNode} node - The node to check. | ||
* @returns {boolean} Whether or not the node is an array type. | ||
*/ | ||
function isArrayType(node) { | ||
return node && (node.type === "ArrayExpression" || node.type === "ArrayPattern"); | ||
} | ||
/** | ||
* Validates the spacing around array brackets | ||
* @param {ASTNode} node - The node we're checking for spacing | ||
* @returns {void} | ||
*/ | ||
function validateArraySpacing(node) { | ||
if (options.spaced && node.elements.length === 0) { | ||
return; | ||
/* eslint-disable no-console */ | ||
console.log('The babel/array-bracket-spacing rule is deprecated. Please ' + | ||
'use the built in array-bracket-spacing rule instead.'); | ||
/* eslint-enable no-console */ | ||
isWarnedForDeprecation = true; | ||
} | ||
var first = sourceCode.getFirstToken(node), | ||
second = sourceCode.getFirstToken(node, 1), | ||
last = sourceCode.getLastToken(node), | ||
firstElement = node.elements[0], | ||
lastElement = node.elements[node.elements.length - 1]; | ||
while (last.type !== "Punctuation" && last.value !== "]") { | ||
last = sourceCode.getTokenBefore(last); | ||
} | ||
var penultimate = sourceCode.getTokenBefore(last); | ||
var openingBracketMustBeSpaced = | ||
options.objectsInArraysException && isObjectType(firstElement) || | ||
options.arraysInArraysException && isArrayType(firstElement) || | ||
options.singleElementException && node.elements.length === 1 | ||
? !options.spaced : options.spaced; | ||
var closingBracketMustBeSpaced = | ||
options.objectsInArraysException && isObjectType(lastElement) || | ||
options.arraysInArraysException && isArrayType(lastElement) || | ||
options.singleElementException && node.elements.length === 1 | ||
? !options.spaced : options.spaced; | ||
if (isSameLine(first, second)) { | ||
if (openingBracketMustBeSpaced && !sourceCode.isSpaceBetweenTokens(first, second)) { | ||
reportRequiredBeginningSpace(node, first); | ||
} | ||
if (!openingBracketMustBeSpaced && sourceCode.isSpaceBetweenTokens(first, second)) { | ||
reportNoBeginningSpace(node, first); | ||
} | ||
} | ||
if (first !== penultimate && isSameLine(penultimate, last)) { | ||
if (closingBracketMustBeSpaced && !sourceCode.isSpaceBetweenTokens(penultimate, last)) { | ||
reportRequiredEndingSpace(node, last); | ||
} | ||
if (!closingBracketMustBeSpaced && sourceCode.isSpaceBetweenTokens(penultimate, last)) { | ||
reportNoEndingSpace(node, last); | ||
} | ||
} | ||
} | ||
//-------------------------------------------------------------------------- | ||
// Public | ||
//-------------------------------------------------------------------------- | ||
return { | ||
ArrayPattern: validateArraySpacing, | ||
ArrayExpression: validateArraySpacing | ||
}; | ||
}; | ||
@@ -202,0 +19,0 @@ |
@@ -1,65 +0,17 @@ | ||
/** | ||
* @fileoverview Rule to require parens in arrow function arguments. | ||
* @author Jxck | ||
* @copyright 2015 Jxck. All rights reserved. | ||
*/ | ||
"use strict"; | ||
//------------------------------------------------------------------------------ | ||
// Rule Definition | ||
//------------------------------------------------------------------------------ | ||
module.exports = function(context) { | ||
var message = "Expected parentheses around arrow function argument."; | ||
var asNeededMessage = "Unexpected parentheses around single function argument"; | ||
var asNeeded = context.options[0] === "as-needed"; | ||
/** | ||
* Determines whether a arrow function argument end with `)` | ||
* @param {ASTNode} node The arrow function node. | ||
* @returns {void} | ||
*/ | ||
function parens(node) { | ||
var token = context.getFirstToken(node); | ||
if (node.async) token = context.getTokenAfter(token); | ||
// as-needed: x => x | ||
if (asNeeded && node.params.length === 1 | ||
&& node.params[0].type === "Identifier" | ||
&& node.params[0].typeAnnotation === undefined) { | ||
if (token.type === "Punctuator" && token.value === "(") { | ||
context.report({ | ||
node: node, | ||
message: asNeededMessage, | ||
fix: function(fixer) { | ||
var paramToken = context.getTokenAfter(token); | ||
var closingParenToken = context.getTokenAfter(paramToken); | ||
return fixer.replaceTextRange([ | ||
token.range[0], | ||
closingParenToken.range[1] | ||
], paramToken.value); | ||
} | ||
}); | ||
var isWarnedForDeprecation = false; | ||
module.exports = function() { | ||
return { | ||
Program() { | ||
if (isWarnedForDeprecation || /\=-(f|-format)=/.test(process.argv.join('='))) { | ||
return; | ||
} | ||
return; | ||
} | ||
if (token.type === "Identifier") { | ||
var after = context.getTokenAfter(token); | ||
// (x) => x | ||
if (after.value !== ")") { | ||
context.report({ | ||
node: node, | ||
message: message, | ||
fix: function(fixer) { | ||
return fixer.replaceText(token, '(' + token.value + ')'); | ||
} | ||
}); | ||
} | ||
/* eslint-disable no-console */ | ||
console.log('The babel/arrow-parens rule is deprecated. Please ' + | ||
'use the built in arrow-parens rule instead.'); | ||
/* eslint-enable no-console */ | ||
isWarnedForDeprecation = true; | ||
} | ||
} | ||
return { | ||
"ArrowFunctionExpression": parens | ||
}; | ||
@@ -66,0 +18,0 @@ }; |
@@ -1,48 +0,21 @@ | ||
/** | ||
* @fileoverview Enforces a choice between semicolons and commas in Flow object and class types. | ||
* @author Nat Mote | ||
*/ | ||
"use strict"; | ||
var SEMICOLON = { | ||
char: ';', | ||
name: 'semicolon', | ||
} | ||
var isWarnedForDeprecation = false; | ||
module.exports = function() { | ||
return { | ||
Program() { | ||
if (isWarnedForDeprecation || /\=-(f|-format)=/.test(process.argv.join('='))) { | ||
return; | ||
} | ||
var COMMA = { | ||
char: ',', | ||
name: 'comma', | ||
/* eslint-disable no-console */ | ||
console.log('The babel/flow-object-type rule is deprecated. Please ' + | ||
'use the flowtype/object-type-delimiter rule instead.\n' + | ||
'Check out https://github.com/gajus/eslint-plugin-flowtype#eslint-plugin-flowtype-rules-object-type-delimiter'); | ||
/* eslint-enable no-console */ | ||
isWarnedForDeprecation = true; | ||
} | ||
}; | ||
}; | ||
module.exports = function(context) { | ||
var GOOD; | ||
var BAD; | ||
if (context.options[0] === undefined || context.options[0] === SEMICOLON.name) { | ||
GOOD = SEMICOLON; | ||
BAD = COMMA; | ||
} else { | ||
GOOD = COMMA; | ||
BAD = SEMICOLON; | ||
} | ||
function requireProperPunctuation(node) { | ||
var tokens = context.getSourceCode().getTokens(node); | ||
var lastToken = tokens[tokens.length - 1]; | ||
if (lastToken.type === 'Punctuator') { | ||
if (lastToken.value === BAD.char) { | ||
context.report({ | ||
message: 'Prefer ' + GOOD.name + 's to ' + BAD.name + 's in object and class types', | ||
node: lastToken, | ||
fix: function(fixer) { | ||
return fixer.replaceText(lastToken, GOOD.char); | ||
}, | ||
}); | ||
} | ||
} | ||
} | ||
return { | ||
ObjectTypeProperty: requireProperPunctuation, | ||
}; | ||
}; | ||
module.exports.schema = [ | ||
@@ -49,0 +22,0 @@ { |
'use strict'; | ||
// Based on https://github.com/eslint/eslint/blob/v2.11.1/lib/rules/comma-dangle.js | ||
var isWarnedForDeprecation = false; | ||
module.exports = function() { | ||
return { | ||
Program() { | ||
if (isWarnedForDeprecation || /\=-(f|-format)=/.test(process.argv.join('='))) { | ||
return; | ||
} | ||
//------------------------------------------------------------------------------ | ||
// Requirements | ||
//------------------------------------------------------------------------------ | ||
function last(arr) { | ||
return arr.length !== 0 ? arr[arr.length - 1] : undefined; | ||
} | ||
//------------------------------------------------------------------------------ | ||
// Rule Definition | ||
//------------------------------------------------------------------------------ | ||
module.exports = function(context) { | ||
var mode = context.options[0]; | ||
var UNEXPECTED_MESSAGE = 'Unexpected trailing comma.'; | ||
var MISSING_MESSAGE = 'Missing trailing comma.'; | ||
function isMultiline(node) { | ||
var lastItem = last(node.params || node.arguments); | ||
if (!lastItem) { | ||
return false; | ||
} | ||
var sourceCode = context.getSourceCode(); | ||
var penultimateToken = sourceCode.getLastToken(lastItem); | ||
var lastToken = sourceCode.getTokenAfter(penultimateToken); | ||
if (lastToken.value === ',') { | ||
penultimateToken = lastToken; | ||
lastToken = sourceCode.getTokenAfter(lastToken); | ||
} | ||
return lastToken.loc.end.line !== penultimateToken.loc.end.line; | ||
} | ||
function forbidTrailingComma(node) { | ||
var lastItem = last(node.params || node.arguments); | ||
if (!lastItem) { | ||
return; | ||
} | ||
var sourceCode = context.getSourceCode(); | ||
var trailingToken = sourceCode.getTokenAfter(lastItem); | ||
if (trailingToken.value === ',') { | ||
context.report({ | ||
node: lastItem, | ||
loc: trailingToken.loc.start, | ||
message: UNEXPECTED_MESSAGE, | ||
fix: function(fixer) { | ||
return fixer.remove(trailingToken); | ||
} | ||
}); | ||
} | ||
} | ||
function forceTrailingComma(node) { | ||
var lastItem = last(node.params || node.arguments); | ||
if (!lastItem) { | ||
return; | ||
} | ||
// `f(...a,)` is ok, but `function f(...a,) {}` is invalid syntax. | ||
if (lastItem.type === 'RestElement') { | ||
return; | ||
} | ||
var sourceCode = context.getSourceCode(); | ||
var penultimateToken = lastItem; | ||
var trailingToken = sourceCode.getTokenAfter(lastItem); | ||
// `f = a, => {}` is invalid syntax. | ||
if (node.type === 'ArrowFunctionExpression' && | ||
node.params.length === 1 && | ||
sourceCode.getTokenBefore(lastItem).value !== '(') { | ||
return; | ||
} | ||
if (trailingToken.value !== ',') { | ||
context.report({ | ||
node: lastItem, | ||
loc: lastItem.loc.end, | ||
message: MISSING_MESSAGE, | ||
fix: function(fixer) { | ||
return fixer.insertTextAfter(penultimateToken, ','); | ||
} | ||
}); | ||
} | ||
} | ||
function forceTrailingCommaIfMultiline(node) { | ||
if (isMultiline(node)) { | ||
forceTrailingComma(node); | ||
} else { | ||
forbidTrailingComma(node); | ||
} | ||
} | ||
function allowTrailingCommaIfMultiline(node) { | ||
if (!isMultiline(node)) { | ||
forbidTrailingComma(node); | ||
} | ||
} | ||
var checkForTrailingComma; | ||
if (mode === 'always') { | ||
checkForTrailingComma = forceTrailingComma; | ||
} else if (mode === 'always-multiline') { | ||
checkForTrailingComma = forceTrailingCommaIfMultiline; | ||
} else if (mode === 'only-multiline') { | ||
checkForTrailingComma = allowTrailingCommaIfMultiline; | ||
} else { | ||
checkForTrailingComma = forbidTrailingComma; | ||
} | ||
return { | ||
ArrowFunctionExpression: checkForTrailingComma, | ||
FunctionDeclaration: checkForTrailingComma, | ||
FunctionExpression: checkForTrailingComma, | ||
CallExpression: checkForTrailingComma, | ||
NewExpression: checkForTrailingComma, | ||
/* eslint-disable no-console */ | ||
console.log('The babel/func-params-comma-dangle rule is deprecated. Please ' + | ||
'use the built in comma-dangle rule instead.'); | ||
/* eslint-enable no-console */ | ||
isWarnedForDeprecation = true; | ||
} | ||
}; | ||
}; | ||
module.exports.fixable = 'code'; | ||
module.exports.schema = [ | ||
@@ -134,0 +21,0 @@ { |
@@ -1,91 +0,18 @@ | ||
/** | ||
* @fileoverview Rule to check the spacing around the * in generator functions. | ||
* @author Jamund Ferguson | ||
* @copyright 2015 Brandon Mills. All rights reserved. | ||
* @copyright 2014 Jamund Ferguson. All rights reserved. | ||
*/ | ||
"use strict"; | ||
module.exports = function(context) { | ||
var isWarnedForDeprecation = false; | ||
module.exports = function() { | ||
return { | ||
Program() { | ||
if (isWarnedForDeprecation || /\=-(f|-format)=/.test(process.argv.join('='))) { | ||
return; | ||
} | ||
var mode = (function(option) { | ||
if (option == null || typeof option === "string") { | ||
return { | ||
before: { before: true, after: false }, | ||
after: { before: false, after: true }, | ||
both: { before: true, after: true }, | ||
neither: { before: false, after: false } | ||
}[option || "before"]; | ||
/* eslint-disable no-console */ | ||
console.log('The babel/generator-star-spacing rule is deprecated. Please ' + | ||
'use the built in generator-star-spacing rule instead.'); | ||
/* eslint-enable no-console */ | ||
isWarnedForDeprecation = true; | ||
} | ||
return option; | ||
}(context.options[0])); | ||
function isAsyncGenerator(node){ | ||
return context.getFirstToken(node, 2).value === '*' | ||
} | ||
/** | ||
* Checks the spacing between two tokens before or after the star token. | ||
* @param {string} side Either "before" or "after". | ||
* @param {Token} leftToken `function` keyword token if side is "before", or | ||
* star token if side is "after". | ||
* @param {Token} rightToken Star token if side is "before", or identifier | ||
* token if side is "after". | ||
* @returns {void} | ||
*/ | ||
function checkSpacing(side, leftToken, rightToken) { | ||
if (!!(rightToken.range[0] - leftToken.range[1]) !== mode[side]) { | ||
context.report( | ||
leftToken.value === "*" ? leftToken : rightToken, | ||
"{{type}} space {{side}} *.", | ||
{ | ||
type: mode[side] ? "Missing" : "Unexpected", | ||
side: side | ||
} | ||
); | ||
} | ||
} | ||
/** | ||
* Enforces the spacing around the star if node is a generator function. | ||
* @param {ASTNode} node A function expression or declaration node. | ||
* @returns {void} | ||
*/ | ||
function checkFunction(node) { | ||
var first = context.getFirstToken(node) | ||
, isMethod = node.parent.method || node.parent.type === "MethodDefinition" | ||
, isAsync = first.value === 'async'; | ||
var prevToken, starToken, nextToken; | ||
if ( !node.generator || (isAsync && !isAsyncGenerator(node))) { | ||
return; | ||
} | ||
if (isMethod) { | ||
starToken = context.getTokenBefore(node, 1); | ||
} else { | ||
starToken = context.getFirstToken(node, isAsync ? 2 : 1); | ||
} | ||
// Only check before when preceded by `function` keyword | ||
prevToken = context.getTokenBefore(starToken); | ||
if (prevToken.value === "function" || prevToken.value === "static") { | ||
checkSpacing("before", prevToken, starToken); | ||
} | ||
// Only check after when followed by an identifier | ||
nextToken = context.getTokenAfter(starToken); | ||
if (nextToken.type === "Identifier") { | ||
checkSpacing("after", starToken, nextToken); | ||
} | ||
} | ||
return { | ||
"FunctionDeclaration": checkFunction, | ||
"FunctionExpression": checkFunction | ||
}; | ||
}; | ||
@@ -92,0 +19,0 @@ |
@@ -26,44 +26,40 @@ /** | ||
return { | ||
// babel-eslint transpiles AwaitExpressions to YieldExpressions, but the actual node kind is | ||
// still available in _babelType. | ||
YieldExpression: function(node) { | ||
if (node._babelType === 'AwaitExpression') { | ||
var ancestors = context.getAncestors(); | ||
// Reverse so that we can traverse from the deepest node upwards. | ||
ancestors.reverse(); | ||
// Create a set of all the ancestors plus this node so that we can check | ||
// if this use of await appears in the body of the loop as opposed to | ||
// the right-hand side of a for...of, for example. | ||
// | ||
// Implement the set with an Array since there are likely to be very few | ||
// elements. An Object would not be appropriate since the elements are | ||
// not strings. | ||
var ancestorSet = [].concat(ancestors, [node]); | ||
var ancestorSetHas = function(element) { | ||
return ancestorSet.indexOf(element) !== -1; | ||
AwaitExpression(node) { | ||
var ancestors = context.getAncestors(); | ||
// Reverse so that we can traverse from the deepest node upwards. | ||
ancestors.reverse(); | ||
// Create a set of all the ancestors plus this node so that we can check | ||
// if this use of await appears in the body of the loop as opposed to | ||
// the right-hand side of a for...of, for example. | ||
// | ||
// Implement the set with an Array since there are likely to be very few | ||
// elements. An Object would not be appropriate since the elements are | ||
// not strings. | ||
var ancestorSet = [].concat(ancestors, [node]); | ||
var ancestorSetHas = function(element) { | ||
return ancestorSet.indexOf(element) !== -1; | ||
} | ||
for (var i = 0; i < ancestors.length; i++) { | ||
var ancestor = ancestors[i]; | ||
if (boundaryTypes.hasOwnProperty(ancestor.type)) { | ||
// Short-circuit out if we encounter a boundary type. Loops above | ||
// this do not matter. | ||
return; | ||
} | ||
for (var i = 0; i < ancestors.length; i++) { | ||
var ancestor = ancestors[i]; | ||
if (boundaryTypes.hasOwnProperty(ancestor.type)) { | ||
// Short-circuit out if we encounter a boundary type. Loops above | ||
// this do not matter. | ||
if (loopTypes.hasOwnProperty(ancestor.type)) { | ||
// Only report if we are actually in the body or another part that gets executed on | ||
// every iteration. | ||
if ( | ||
ancestorSetHas(ancestor.body) || | ||
ancestorSetHas(ancestor.test) || | ||
ancestorSetHas(ancestor.update) | ||
) { | ||
context.report( | ||
node, | ||
'Avoid using await inside a loop. Consider refactoring to use Promise.all. If ' + | ||
'you are sure you want to do this, add `// eslint-disable-line ' + | ||
context.id + '` at the end of this line.' | ||
); | ||
return; | ||
} | ||
if (loopTypes.hasOwnProperty(ancestor.type)) { | ||
// Only report if we are actually in the body or another part that gets executed on | ||
// every iteration. | ||
if ( | ||
ancestorSetHas(ancestor.body) || | ||
ancestorSetHas(ancestor.test) || | ||
ancestorSetHas(ancestor.update) | ||
) { | ||
context.report( | ||
node, | ||
'Avoid using await inside a loop. Consider refactoring to use Promise.all. If ' + | ||
'you are sure you want to do this, add `// eslint-disable-line ' + | ||
context.id + '` at the end of this line.' | ||
); | ||
return; | ||
} | ||
} | ||
} | ||
@@ -70,0 +66,0 @@ } |
@@ -0,68 +1,18 @@ | ||
"use strict"; | ||
/** | ||
* @fileoverview Rule to enforce concise object methods and properties. | ||
* @author Jamund Ferguson | ||
* @copyright 2015 Jamund Ferguson. All rights reserved. | ||
*/ | ||
var isWarnedForDeprecation = false; | ||
module.exports = function() { | ||
return { | ||
Program() { | ||
if (isWarnedForDeprecation || /\=-(f|-format)=/.test(process.argv.join('='))) { | ||
return; | ||
} | ||
'use strict'; | ||
var OPTIONS = { | ||
always: 'always', | ||
never: 'never', | ||
methods: 'methods', | ||
properties: 'properties' | ||
/* eslint-disable no-console */ | ||
console.log('The babel/object-shorthand rule is deprecated. Please ' + | ||
'use the built in object-shorthand rule instead.'); | ||
/* eslint-enable no-console */ | ||
isWarnedForDeprecation = true; | ||
} | ||
}; | ||
//------------------------------------------------------------------------------ | ||
// Rule Definition | ||
//------------------------------------------------------------------------------ | ||
module.exports = function(context) { | ||
var APPLY = context.options[0] || OPTIONS.always; | ||
var APPLY_TO_METHODS = APPLY === OPTIONS.methods || APPLY === OPTIONS.always; | ||
var APPLY_TO_PROPS = APPLY === OPTIONS.properties || APPLY === OPTIONS.always; | ||
var APPLY_NEVER = APPLY === OPTIONS.never; | ||
return { | ||
Property: function(node) { | ||
var isConciseProperty = node.method || node.shorthand | ||
, isSpreadProperty = !!this.getSource(node).match(/^\.\.\./) | ||
, type; | ||
// if we're 'never' and concise we should warn now | ||
if (APPLY_NEVER && isConciseProperty) { | ||
type = node.method ? 'method' : 'property'; | ||
context.report(node, 'Expected longform ' + type + ' syntax.'); | ||
} | ||
// at this point if we're concise or if we're 'never' we can leave | ||
if (APPLY_NEVER || isConciseProperty) { | ||
return; | ||
} | ||
// getters, setters and computed properties are ignored | ||
if (node.kind === "get" || node.kind === "set" || node.computed) { | ||
return; | ||
} | ||
if (isSpreadProperty) { | ||
return; | ||
} | ||
if (node.value.type === 'FunctionExpression' && node.value.id == null && APPLY_TO_METHODS) { | ||
// {x: function(){}} should be written as {x() {}} | ||
context.report(node, 'Expected method shorthand.'); | ||
} | ||
else if (node.value.type === 'Identifier' && node.key.name === node.value.name && APPLY_TO_PROPS) { | ||
// {x: x} should be written as {x} | ||
context.report(node, 'Expected property shorthand.'); | ||
} | ||
else if (node.value.type === 'Identifier' && node.key.type === 'Literal' && node.key.value === node.value.name && APPLY_TO_PROPS) { | ||
// {'x': x} should be written as {x} | ||
context.report(node, 'Expected property shorthand.'); | ||
} | ||
} | ||
}; | ||
}; | ||
@@ -69,0 +19,0 @@ |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
4
120318
22
3063
1