Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

eslint-plugin-babel

Package Overview
Dependencies
Maintainers
2
Versions
22
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

eslint-plugin-babel - npm Package Compare versions

Comparing version 3.3.0 to 4.0.0

ast-utils.js

2

index.js

@@ -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,
}
};

18

package.json
{
"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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc