/home/techb158/balavpn.abdallabala.com/node_modules/eslint/lib/rules
NameSizeModeActions
utils/-0777rm
accessor-pairs.js112100666editdlrm
array-bracket-newline.js81230666editdlrm
array-bracket-spacing.js80710666editdlrm
array-callback-return.js128150666editdlrm
array-element-newline.js90700666editdlrm
arrow-body-style.js103650666editdlrm
arrow-parens.js71190666editdlrm
arrow-spacing.js46180666editdlrm
block-scoped-var.js35010666editdlrm
block-spacing.js51590666editdlrm
brace-style.js75920666editdlrm
callback-return.js58790666editdlrm
camelcase.js103630666editdlrm
capitalized-comments.js92850666editdlrm
class-methods-use-this.js63930666editdlrm
comma-dangle.js116520666editdlrm
comma-spacing.js58920666editdlrm
comma-style.js102410666editdlrm
complexity.js51940666editdlrm
computed-property-spacing.js67030666editdlrm
consistent-return.js57390666editdlrm
consistent-this.js44290666editdlrm
constructor-super.js120510666editdlrm
curly.js117580666editdlrm
default-case-last.js11030666editdlrm
default-case.js23110666editdlrm
default-param-last.js16900666editdlrm
dot-location.js34040666editdlrm
dot-notation.js51920666editdlrm
eol-last.js35660666editdlrm
eqeqeq.js48740666editdlrm
for-direction.js43050666editdlrm
func-call-spacing.js82900666editdlrm
func-name-matching.js88350666editdlrm
func-names.js51350666editdlrm
func-style.js53370666editdlrm
function-call-argument-newline.js42220666editdlrm
function-paren-newline.js101980666editdlrm
generator-star-spacing.js63190666editdlrm
getter-return.js57560666editdlrm
global-require.js28530666editdlrm
grouped-accessor-pairs.js71850666editdlrm
guard-for-in.js19240666editdlrm
handle-callback-err.js32470666editdlrm
id-blacklist.js67000666editdlrm
id-denylist.js63570666editdlrm
id-length.js56130666editdlrm
id-match.js92080666editdlrm
implicit-arrow-linebreak.js31470666editdlrm
indent-legacy.js357430666editdlrm
indent.js664740666editdlrm
index.js179130666editdlrm
init-declarations.js39740666editdlrm
jsx-quotes.js31470666editdlrm
key-spacing.js212680666editdlrm
keyword-spacing.js204170666editdlrm
line-comment-position.js37360666editdlrm
linebreak-style.js35690666editdlrm
lines-around-comment.js154970666editdlrm
lines-around-directive.js70230666editdlrm
lines-between-class-members.js101290666editdlrm
logical-assignment-operators.js190470666editdlrm
max-classes-per-file.js18580666editdlrm
max-depth.js36330666editdlrm
max-len.js136520666editdlrm
max-lines-per-function.js60500666editdlrm
max-lines.js44030666editdlrm
max-nested-callbacks.js26910666editdlrm
max-params.js30750666editdlrm
max-statements-per-line.js67380666editdlrm
max-statements.js45750666editdlrm
multiline-comment-style.js183950666editdlrm
multiline-ternary.js65410666editdlrm
new-cap.js72040666editdlrm
new-parens.js31670666editdlrm
newline-after-var.js88520666editdlrm
newline-before-return.js71260666editdlrm
newline-per-chained-call.js38830666editdlrm
no-alert.js38430666editdlrm
no-array-constructor.js49950666editdlrm
no-async-promise-executor.js10070666editdlrm
no-await-in-loop.js24940666editdlrm
no-bitwise.js29480666editdlrm
no-buffer-constructor.js18680666editdlrm
no-caller.js10860666editdlrm
no-case-declarations.js18670666editdlrm
no-catch-shadow.js25150666editdlrm
no-class-assign.js15660666editdlrm
no-compare-neg-zero.js16620666editdlrm
no-cond-assign.js48370666editdlrm
no-confusing-arrow.js32320666editdlrm
no-console.js62330666editdlrm
no-const-assign.js18480666editdlrm
no-constant-binary-expression.js181500666editdlrm
no-constant-condition.js44690666editdlrm
no-constructor-return.js11910666editdlrm
no-continue.js7840666editdlrm
no-control-regex.js38300666editdlrm
no-debugger.js7930666editdlrm
no-delete-var.js8520666editdlrm
no-div-regex.js12450666editdlrm
no-dupe-args.js23870666editdlrm
no-dupe-class-members.js29050666editdlrm
no-dupe-else-if.js41970666editdlrm
no-dupe-keys.js39630666editdlrm
no-duplicate-case.js17650666editdlrm
no-duplicate-imports.js100240666editdlrm
no-else-return.js134050666editdlrm
no-empty-character-class.js19380666editdlrm
no-empty-function.js57540666editdlrm
no-empty-pattern.js18410666editdlrm
no-empty-static-block.js15890666editdlrm
no-empty.js32020666editdlrm
no-eq-null.js11170666editdlrm
no-eval.js75420666editdlrm
no-ex-assign.js13010666editdlrm
no-extend-native.js54210666editdlrm
no-extra-bind.js60070666editdlrm
no-extra-boolean-cast.js105900666editdlrm
no-extra-label.js42650666editdlrm
no-extra-parens.js435960666editdlrm
no-extra-semi.js46280666editdlrm
no-fallthrough.js69660666editdlrm
no-floating-decimal.js25680666editdlrm
no-func-assign.js18610666editdlrm
no-global-assign.js24260666editdlrm
no-implicit-coercion.js126000666editdlrm
no-implicit-globals.js46260666editdlrm
no-implied-eval.js43390666editdlrm
no-import-assign.js61790666editdlrm
no-inline-comments.js26910666editdlrm
no-inner-declarations.js32210666editdlrm
no-invalid-regexp.js59620666editdlrm
no-invalid-this.js44880666editdlrm
no-irregular-whitespace.js78530666editdlrm
no-iterator.js11100666editdlrm
no-label-var.js20630666editdlrm
no-labels.js33650666editdlrm
no-lone-blocks.js33200666editdlrm
no-lonely-if.js33030666editdlrm
no-loop-func.js70350666editdlrm
no-loss-of-precision.js73930666editdlrm
no-magic-numbers.js105800666editdlrm
no-misleading-character-class.js163690666editdlrm
no-mixed-operators.js71470666editdlrm
no-mixed-requires.js63830666editdlrm
no-mixed-spaces-and-tabs.js34650666editdlrm
no-multi-assign.js13270666editdlrm
no-multi-spaces.js45880666editdlrm
no-multi-str.js16100666editdlrm
no-multiple-empty-lines.js55810666editdlrm
no-native-reassign.js27650666editdlrm
no-negated-condition.js24310666editdlrm
no-negated-in-lhs.js13380666editdlrm
no-nested-ternary.js9600666editdlrm
no-new-func.js23930666editdlrm
no-new-native-nonconstructor.js17540666editdlrm
no-new-object.js18660666editdlrm
no-new-require.js15880666editdlrm
no-new-symbol.js17390666editdlrm
no-new-wrappers.js14600666editdlrm
no-new.js9050666editdlrm
no-nonoctal-decimal-escape.js45660666editdlrm
no-obj-calls.js24660666editdlrm
no-object-constructor.js29230666editdlrm
no-octal-escape.js11750666editdlrm
no-octal.js8320666editdlrm
no-param-reassign.js63630666editdlrm
no-path-concat.js20120666editdlrm
no-plusplus.js26720666editdlrm
no-process-env.js16460666editdlrm
no-process-exit.js17350666editdlrm
no-promise-executor-return.js66750666editdlrm
no-proto.js10930666editdlrm
no-prototype-builtins.js47210666editdlrm
no-redeclare.js44250666editdlrm
no-regex-spaces.js52760666editdlrm
no-restricted-exports.js56360666editdlrm
no-restricted-globals.js62290666editdlrm
no-restricted-imports.js238800666editdlrm
no-restricted-modules.js61280666editdlrm
no-restricted-properties.js59480666editdlrm
no-restricted-syntax.js16980666editdlrm
no-return-assign.js22590666editdlrm
no-return-await.js44570666editdlrm
no-script-url.js15120666editdlrm
no-self-assign.js46660666editdlrm
no-self-compare.js17050666editdlrm
no-sequences.js40110666editdlrm
no-setter-return.js57250666editdlrm
no-shadow-restricted-names.js26720666editdlrm
no-shadow.js173530666editdlrm
no-spaced-func.js26030666editdlrm
no-sparse-arrays.js14830666editdlrm
no-sync.js18870666editdlrm
no-tabs.js24490666editdlrm
no-template-curly-in-string.js9890666editdlrm
no-ternary.js7850666editdlrm
no-this-before-super.js90430666editdlrm
no-throw-literal.js10880666editdlrm
no-trailing-spaces.js61100666editdlrm
no-unassigned-vars.js19640666editdlrm
no-undef-init.js24090666editdlrm
no-undef.js18990666editdlrm
no-undefined.js18610666editdlrm
no-underscore-dangle.js95350666editdlrm
no-unexpected-multiline.js34770666editdlrm
no-unmodified-loop-condition.js100350666editdlrm
no-unneeded-ternary.js59350666editdlrm
no-unreachable-loop.js50760666editdlrm
no-unreachable.js74980666editdlrm
no-unsafe-finally.js33390666editdlrm
no-unsafe-negation.js39720666editdlrm
no-unsafe-optional-chaining.js53890666editdlrm
no-unused-expressions.js55200666editdlrm
no-unused-labels.js38780666editdlrm
no-unused-private-class-members.js62770666editdlrm
no-unused-vars.js485520666editdlrm
no-use-before-define.js118660666editdlrm
no-useless-assignment.js193340666editdlrm
no-useless-backreference.js76620666editdlrm
no-useless-call.js27790666editdlrm
no-useless-catch.js13100666editdlrm
no-useless-computed-key.js59360666editdlrm
no-useless-concat.js29660666editdlrm
no-useless-constructor.js69860666editdlrm
no-useless-escape.js110650666editdlrm
no-useless-rename.js49290666editdlrm
no-useless-return.js119540666editdlrm
no-var.js114610666editdlrm
no-void.js13660666editdlrm
no-warning-comments.js56700666editdlrm
no-whitespace-before-property.js38830666editdlrm
no-with.js7570666editdlrm
nonblock-statement-body-position.js44180666editdlrm
object-curly-newline.js101150666editdlrm
object-curly-spacing.js103990666editdlrm
object-property-newline.js37580666editdlrm
object-shorthand.js185430666editdlrm
one-var-declaration-per-line.js29950666editdlrm
one-var.js191820666editdlrm
operator-assignment.js75360666editdlrm
operator-linebreak.js89010666editdlrm
padded-blocks.js89100666editdlrm
padding-line-between-statements.js169890666editdlrm
prefer-arrow-callback.js116670666editdlrm
prefer-const.js157800666editdlrm
prefer-destructuring.js89310666editdlrm
prefer-exponentiation-operator.js67270666editdlrm
prefer-named-capture-group.js50480666editdlrm
prefer-numeric-literals.js45040666editdlrm
prefer-object-has-own.js38040666editdlrm
prefer-object-spread.js94890666editdlrm
prefer-promise-reject-errors.js46140666editdlrm
prefer-reflect.js38280666editdlrm
prefer-regex-literals.js143790666editdlrm
prefer-rest-params.js30320666editdlrm
prefer-spread.js25550666editdlrm
prefer-template.js105370666editdlrm
preserve-caught-error.js162690666editdlrm
quote-props.js101290666editdlrm
quotes.js109340666editdlrm
radix.js55490666editdlrm
require-atomic-updates.js92930666editdlrm
require-await.js45640666editdlrm
require-unicode-regexp.js77650666editdlrm
require-yield.js17180666editdlrm
rest-spread-spacing.js37390666editdlrm
semi-spacing.js73840666editdlrm
semi-style.js52460666editdlrm
semi.js133240666editdlrm
sort-imports.js86030666editdlrm
sort-keys.js58800666editdlrm
sort-vars.js33200666editdlrm
space-before-blocks.js63280666editdlrm
space-before-function-paren.js52530666editdlrm
space-in-parens.js93140666editdlrm
space-infix-ops.js58900666editdlrm
space-unary-ops.js106440666editdlrm
spaced-comment.js112460666editdlrm
strict.js91410666editdlrm
switch-colon-spacing.js47010666editdlrm
symbol-description.js17010666editdlrm
template-curly-spacing.js43370666editdlrm
template-tag-spacing.js30590666editdlrm
unicode-bom.js17160666editdlrm
use-isnan.js71300666editdlrm
valid-typeof.js42620666editdlrm
vars-on-top.js43040666editdlrm
wrap-iife.js69140666editdlrm
wrap-regex.js21670666editdlrm
yield-star-spacing.js39920666editdlrm
yoda.js97130666editdlrm
Edit: /home/techb158/balavpn.abdallabala.com/node_modules/eslint/lib/rules/object-shorthand.js (18543B)
/** * @fileoverview Rule to enforce concise object methods and properties. * @author Jamund Ferguson */ "use strict"; const OPTIONS = { always: "always", never: "never", methods: "methods", properties: "properties", consistent: "consistent", consistentAsNeeded: "consistent-as-needed", }; //------------------------------------------------------------------------------ // Requirements //------------------------------------------------------------------------------ const astUtils = require("./utils/ast-utils"); //-------------------------------------------------------------------------- // Helpers //-------------------------------------------------------------------------- const CTOR_PREFIX_REGEX = /[^_$0-9]/u; const JSDOC_COMMENT_REGEX = /^\s*\*/u; /** * Determines if the first character of the name is a capital letter. * @param {string} name The name of the node to evaluate. * @returns {boolean} True if the first character of the property name is a capital letter, false if not. * @private */ function isConstructor(name) { const match = CTOR_PREFIX_REGEX.exec(name); // Not a constructor if name has no characters apart from '_', '$' and digits e.g. '_', '$$', '_8' if (!match) { return false; } const firstChar = name.charAt(match.index); return firstChar === firstChar.toUpperCase(); } /** * Determines if the property can have a shorthand form. * @param {ASTNode} property Property AST node * @returns {boolean} True if the property can have a shorthand form * @private */ function canHaveShorthand(property) { return ( property.kind !== "set" && property.kind !== "get" && property.type !== "SpreadElement" && property.type !== "SpreadProperty" && property.type !== "ExperimentalSpreadProperty" ); } /** * Checks whether a node is a string literal. * @param {ASTNode} node Any AST node. * @returns {boolean} `true` if it is a string literal. */ function isStringLiteral(node) { return node.type === "Literal" && typeof node.value === "string"; } /** * Determines if the property is a shorthand or not. * @param {ASTNode} property Property AST node * @returns {boolean} True if the property is considered shorthand, false if not. * @private */ function isShorthand(property) { // property.method is true when `{a(){}}`. return property.shorthand || property.method; } /** * Determines if the property's key and method or value are named equally. * @param {ASTNode} property Property AST node * @returns {boolean} True if the key and value are named equally, false if not. * @private */ function isRedundant(property) { const value = property.value; if (value.type === "FunctionExpression") { return !value.id; // Only anonymous should be shorthand method. } if (value.type === "Identifier") { return astUtils.getStaticPropertyName(property) === value.name; } return false; } //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ /** @type {import('../types').Rule.RuleModule} */ module.exports = { meta: { type: "suggestion", docs: { description: "Require or disallow method and property shorthand syntax for object literals", recommended: false, frozen: true, url: "https://eslint.org/docs/latest/rules/object-shorthand", }, fixable: "code", schema: { anyOf: [ { type: "array", items: [ { enum: [ "always", "methods", "properties", "never", "consistent", "consistent-as-needed", ], }, ], minItems: 0, maxItems: 1, }, { type: "array", items: [ { enum: ["always", "methods", "properties"], }, { type: "object", properties: { avoidQuotes: { type: "boolean", }, }, additionalProperties: false, }, ], minItems: 0, maxItems: 2, }, { type: "array", items: [ { enum: ["always", "methods"], }, { type: "object", properties: { ignoreConstructors: { type: "boolean", }, methodsIgnorePattern: { type: "string", }, avoidQuotes: { type: "boolean", }, avoidExplicitReturnArrows: { type: "boolean", }, }, additionalProperties: false, }, ], minItems: 0, maxItems: 2, }, ], }, messages: { expectedAllPropertiesShorthanded: "Expected shorthand for all properties.", expectedLiteralMethodLongform: "Expected longform method syntax for string literal keys.", expectedPropertyShorthand: "Expected property shorthand.", expectedPropertyLongform: "Expected longform property syntax.", expectedMethodShorthand: "Expected method shorthand.", expectedMethodLongform: "Expected longform method syntax.", unexpectedMix: "Unexpected mix of shorthand and non-shorthand properties.", }, }, create(context) { const APPLY = context.options[0] || OPTIONS.always; const APPLY_TO_METHODS = APPLY === OPTIONS.methods || APPLY === OPTIONS.always; const APPLY_TO_PROPS = APPLY === OPTIONS.properties || APPLY === OPTIONS.always; const APPLY_NEVER = APPLY === OPTIONS.never; const APPLY_CONSISTENT = APPLY === OPTIONS.consistent; const APPLY_CONSISTENT_AS_NEEDED = APPLY === OPTIONS.consistentAsNeeded; const PARAMS = context.options[1] || {}; const IGNORE_CONSTRUCTORS = PARAMS.ignoreConstructors; const METHODS_IGNORE_PATTERN = PARAMS.methodsIgnorePattern ? new RegExp(PARAMS.methodsIgnorePattern, "u") : null; const AVOID_QUOTES = PARAMS.avoidQuotes; const AVOID_EXPLICIT_RETURN_ARROWS = !!PARAMS.avoidExplicitReturnArrows; const sourceCode = context.sourceCode; /** * Ensures that an object's properties are consistently shorthand, or not shorthand at all. * @param {ASTNode} node Property AST node * @param {boolean} checkRedundancy Whether to check longform redundancy * @returns {void} */ function checkConsistency(node, checkRedundancy) { // We are excluding getters/setters and spread properties as they are considered neither longform nor shorthand. const properties = node.properties.filter(canHaveShorthand); // Do we still have properties left after filtering the getters and setters? if (properties.length > 0) { const shorthandProperties = properties.filter(isShorthand); /* * If we do not have an equal number of longform properties as * shorthand properties, we are using the annotations inconsistently */ if (shorthandProperties.length !== properties.length) { // We have at least 1 shorthand property if (shorthandProperties.length > 0) { context.report({ node, messageId: "unexpectedMix" }); } else if (checkRedundancy) { /* * If all properties of the object contain a method or value with a name matching it's key, * all the keys are redundant. */ const canAlwaysUseShorthand = properties.every(isRedundant); if (canAlwaysUseShorthand) { context.report({ node, messageId: "expectedAllPropertiesShorthanded", }); } } } } } /** * Fixes a FunctionExpression node by making it into a shorthand property. * @param {SourceCodeFixer} fixer The fixer object * @param {ASTNode} node A `Property` node that has a `FunctionExpression` or `ArrowFunctionExpression` as its value * @returns {Object} A fix for this node */ function makeFunctionShorthand(fixer, node) { const firstKeyToken = node.computed ? sourceCode.getFirstToken(node, astUtils.isOpeningBracketToken) : sourceCode.getFirstToken(node.key); const lastKeyToken = node.computed ? sourceCode.getFirstTokenBetween( node.key, node.value, astUtils.isClosingBracketToken, ) : sourceCode.getLastToken(node.key); const keyText = sourceCode.text.slice( firstKeyToken.range[0], lastKeyToken.range[1], ); let keyPrefix = ""; // key: /* */ () => {} if (sourceCode.commentsExistBetween(lastKeyToken, node.value)) { return null; } if (node.value.async) { keyPrefix += "async "; } if (node.value.generator) { keyPrefix += "*"; } const fixRange = [firstKeyToken.range[0], node.range[1]]; const methodPrefix = keyPrefix + keyText; if (node.value.type === "FunctionExpression") { const functionToken = sourceCode .getTokens(node.value) .find( token => token.type === "Keyword" && token.value === "function", ); const tokenBeforeParams = node.value.generator ? sourceCode.getTokenAfter(functionToken) : functionToken; return fixer.replaceTextRange( fixRange, methodPrefix + sourceCode.text.slice( tokenBeforeParams.range[1], node.value.range[1], ), ); } const arrowToken = sourceCode.getTokenBefore( node.value.body, astUtils.isArrowToken, ); const fnBody = sourceCode.text.slice( arrowToken.range[1], node.value.range[1], ); // First token should not be `async` const firstValueToken = sourceCode.getFirstToken(node.value, { skip: node.value.async ? 1 : 0, }); const sliceStart = firstValueToken.range[0]; const sliceEnd = sourceCode.getTokenBefore(arrowToken).range[1]; const shouldAddParens = node.value.params.length === 1 && node.value.params[0].range[0] === sliceStart; const oldParamText = sourceCode.text.slice(sliceStart, sliceEnd); const newParamText = shouldAddParens ? `(${oldParamText})` : oldParamText; return fixer.replaceTextRange( fixRange, methodPrefix + newParamText + fnBody, ); } /** * Fixes a FunctionExpression node by making it into a longform property. * @param {SourceCodeFixer} fixer The fixer object * @param {ASTNode} node A `Property` node that has a `FunctionExpression` as its value * @returns {Object} A fix for this node */ function makeFunctionLongform(fixer, node) { const firstKeyToken = node.computed ? sourceCode.getTokens(node).find(token => token.value === "[") : sourceCode.getFirstToken(node.key); const lastKeyToken = node.computed ? sourceCode .getTokensBetween(node.key, node.value) .find(token => token.value === "]") : sourceCode.getLastToken(node.key); const keyText = sourceCode.text.slice( firstKeyToken.range[0], lastKeyToken.range[1], ); let functionHeader = "function"; if (node.value.async) { functionHeader = `async ${functionHeader}`; } if (node.value.generator) { functionHeader = `${functionHeader}*`; } return fixer.replaceTextRange( [node.range[0], lastKeyToken.range[1]], `${keyText}: ${functionHeader}`, ); } /* * To determine whether a given arrow function has a lexical identifier (`this`, `arguments`, `super`, or `new.target`), * create a stack of functions that define these identifiers (i.e. all functions except arrow functions) as the AST is * traversed. Whenever a new function is encountered, create a new entry on the stack (corresponding to a different lexical * scope of `this`), and whenever a function is exited, pop that entry off the stack. When an arrow function is entered, * keep a reference to it on the current stack entry, and remove that reference when the arrow function is exited. * When a lexical identifier is encountered, mark all the arrow functions on the current stack entry by adding them * to an `arrowsWithLexicalIdentifiers` set. Any arrow function in that set will not be reported by this rule, * because converting it into a method would change the value of one of the lexical identifiers. */ const lexicalScopeStack = []; const arrowsWithLexicalIdentifiers = new WeakSet(); const argumentsIdentifiers = new WeakSet(); /** * Enters a function. This creates a new lexical identifier scope, so a new Set of arrow functions is pushed onto the stack. * Also, this marks all `arguments` identifiers so that they can be detected later. * @param {ASTNode} node The node representing the function. * @returns {void} */ function enterFunction(node) { lexicalScopeStack.unshift(new Set()); sourceCode .getScope(node) .variables.filter(variable => variable.name === "arguments") .forEach(variable => { variable.references .map(ref => ref.identifier) .forEach(identifier => argumentsIdentifiers.add(identifier), ); }); } /** * Exits a function. This pops the current set of arrow functions off the lexical scope stack. * @returns {void} */ function exitFunction() { lexicalScopeStack.shift(); } /** * Marks the current function as having a lexical keyword. This implies that all arrow functions * in the current lexical scope contain a reference to this lexical keyword. * @returns {void} */ function reportLexicalIdentifier() { lexicalScopeStack[0].forEach(arrowFunction => arrowsWithLexicalIdentifiers.add(arrowFunction), ); } //-------------------------------------------------------------------------- // Public //-------------------------------------------------------------------------- return { Program: enterFunction, FunctionDeclaration: enterFunction, FunctionExpression: enterFunction, "Program:exit": exitFunction, "FunctionDeclaration:exit": exitFunction, "FunctionExpression:exit": exitFunction, ArrowFunctionExpression(node) { lexicalScopeStack[0].add(node); }, "ArrowFunctionExpression:exit"(node) { lexicalScopeStack[0].delete(node); }, ThisExpression: reportLexicalIdentifier, Super: reportLexicalIdentifier, MetaProperty(node) { if ( node.meta.name === "new" && node.property.name === "target" ) { reportLexicalIdentifier(); } }, Identifier(node) { if (argumentsIdentifiers.has(node)) { reportLexicalIdentifier(); } }, ObjectExpression(node) { if (APPLY_CONSISTENT) { checkConsistency(node, false); } else if (APPLY_CONSISTENT_AS_NEEDED) { checkConsistency(node, true); } }, "Property:exit"(node) { const isConciseProperty = node.method || node.shorthand; // Ignore destructuring assignment if (node.parent.type === "ObjectPattern") { return; } // getters and setters are ignored if (node.kind === "get" || node.kind === "set") { return; } // only computed methods can fail the following checks if ( node.computed && node.value.type !== "FunctionExpression" && node.value.type !== "ArrowFunctionExpression" ) { return; } //-------------------------------------------------------------- // Checks for property/method shorthand. if (isConciseProperty) { if ( node.method && (APPLY_NEVER || (AVOID_QUOTES && isStringLiteral(node.key))) ) { const messageId = APPLY_NEVER ? "expectedMethodLongform" : "expectedLiteralMethodLongform"; // { x() {} } should be written as { x: function() {} } context.report({ node, messageId, fix: fixer => makeFunctionLongform(fixer, node), }); } else if (APPLY_NEVER) { // { x } should be written as { x: x } context.report({ node, messageId: "expectedPropertyLongform", fix: fixer => fixer.insertTextAfter( node.key, `: ${node.key.name}`, ), }); } } else if ( APPLY_TO_METHODS && !node.value.id && (node.value.type === "FunctionExpression" || node.value.type === "ArrowFunctionExpression") ) { if ( IGNORE_CONSTRUCTORS && node.key.type === "Identifier" && isConstructor(node.key.name) ) { return; } if (METHODS_IGNORE_PATTERN) { const propertyName = astUtils.getStaticPropertyName(node); if ( propertyName !== null && METHODS_IGNORE_PATTERN.test(propertyName) ) { return; } } if (AVOID_QUOTES && isStringLiteral(node.key)) { return; } // {[x]: function(){}} should be written as {[x]() {}} if ( node.value.type === "FunctionExpression" || (node.value.type === "ArrowFunctionExpression" && node.value.body.type === "BlockStatement" && AVOID_EXPLICIT_RETURN_ARROWS && !arrowsWithLexicalIdentifiers.has(node.value)) ) { context.report({ node, messageId: "expectedMethodShorthand", fix: fixer => makeFunctionShorthand(fixer, node), }); } } else if ( node.value.type === "Identifier" && node.key.name === node.value.name && APPLY_TO_PROPS ) { // Skip if there are JSDoc comments inside the property (e.g., JSDoc type annotations) const comments = sourceCode.getCommentsInside(node); if ( comments.some( comment => comment.type === "Block" && JSDOC_COMMENT_REGEX.test(comment.value) && comment.value.includes("@type"), ) ) { return; } // {x: x} should be written as {x} context.report({ node, messageId: "expectedPropertyShorthand", fix(fixer) { // x: /* */ x // x: (/* */ x) if (sourceCode.getCommentsInside(node).length > 0) { return null; } return fixer.replaceText(node, node.value.name); }, }); } else if ( node.value.type === "Identifier" && node.key.type === "Literal" && node.key.value === node.value.name && APPLY_TO_PROPS ) { if (AVOID_QUOTES) { return; } const comments = sourceCode.getCommentsInside(node); if ( comments.some( comment => comment.type === "Block" && comment.value.startsWith("*") && comment.value.includes("@type"), ) ) { return; } // {"x": x} should be written as {x} context.report({ node, messageId: "expectedPropertyShorthand", fix(fixer) { // "x": /* */ x // "x": (/* */ x) if (sourceCode.getCommentsInside(node).length > 0) { return null; } return fixer.replaceText(node, node.value.name); }, }); } }, }; }, };