eslint-plugin-unicorn
Advanced tools
Comparing version 12.1.0 to 13.0.0
{ | ||
"name": "eslint-plugin-unicorn", | ||
"version": "12.1.0", | ||
"version": "13.0.0", | ||
"description": "Various awesome ESLint rules", | ||
@@ -17,2 +17,3 @@ "license": "MIT", | ||
"test": "xo && nyc ava", | ||
"lint": "./test/lint/lint.js", | ||
"integration": "./test/integration/test.js" | ||
@@ -38,3 +39,3 @@ }, | ||
"eslint-ast-utils": "^1.1.0", | ||
"eslint-template-visitor": "^1.0.0", | ||
"eslint-template-visitor": "^1.1.0", | ||
"import-modules": "^2.0.0", | ||
@@ -50,15 +51,16 @@ "lodash.camelcase": "^4.3.0", | ||
"reserved-words": "^0.1.2", | ||
"safe-regex": "^2.0.2", | ||
"safe-regex": "^2.1.1", | ||
"semver": "^6.3.0" | ||
}, | ||
"devDependencies": { | ||
"ava": "^2.3.0", | ||
"@lubien/fixture-beta-package": "^1.0.0-beta.1", | ||
"ava": "^2.4.0", | ||
"babel-eslint": "^10.0.3", | ||
"chalk": "^2.4.2", | ||
"coveralls": "^3.0.6", | ||
"coveralls": "^3.0.7", | ||
"del": "^5.1.0", | ||
"eslint": "^6.5.1", | ||
"eslint-ava-rule-tester": "^3.0.0", | ||
"eslint": "^6.6.0", | ||
"eslint-ava-rule-tester": "^4.0.0", | ||
"eslint-plugin-eslint-plugin": "2.1.0", | ||
"execa": "^2.0.4", | ||
"execa": "^3.2.0", | ||
"listr": "^0.14.3", | ||
@@ -72,3 +74,3 @@ "nyc": "^14.1.1", | ||
"peerDependencies": { | ||
"eslint": ">=6.3.0" | ||
"eslint": ">=6.6.0" | ||
}, | ||
@@ -75,0 +77,0 @@ "ava": { |
'use strict'; | ||
const astUtils = require('eslint-ast-utils'); | ||
const avoidCapture = require('./utils/avoid-capture'); | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -24,5 +24,5 @@ // Matches `someObj.then([FunctionExpression | ArrowFunctionExpression])` | ||
const [arg0] = node.arguments; | ||
const [firstArgument] = node.arguments; | ||
return arg0.type === 'FunctionExpression' || arg0.type === 'ArrowFunctionExpression'; | ||
return firstArgument.type === 'FunctionExpression' || firstArgument.type === 'ArrowFunctionExpression'; | ||
} | ||
@@ -69,3 +69,3 @@ | ||
const variables = scopeManager.getDeclaredVariables(scopeNode); | ||
const variables = scopeManager.getDeclaredVariables(scopeNode); | ||
for (const variable of variables) { | ||
@@ -123,4 +123,4 @@ if (variable.name !== node.name) { | ||
const scope = context.getScope(); | ||
const errName = avoidCapture(name, [scope.variableScope], ecmaVersion); | ||
push(node.param.name === errName || errName); | ||
const errorName = avoidCapture(name, [scope.variableScope], ecmaVersion); | ||
push(node.param.name === errorName || errorName); | ||
}, | ||
@@ -150,3 +150,3 @@ 'CatchClause:exit': node => { | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -153,0 +153,0 @@ fixable: 'code', |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -175,3 +175,3 @@ const MESSAGE_ID_ARROW = 'ArrowFunctionExpression'; | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -178,0 +178,0 @@ messages: { |
'use strict'; | ||
const upperfirst = require('lodash.upperfirst'); | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -181,3 +181,3 @@ const MESSAGE_ID_INVALID_EXPORT = 'invalidExport'; | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -184,0 +184,0 @@ fixable: 'code', |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -97,5 +97,5 @@ const errorConstructors = new Set([ | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
} | ||
} | ||
}; |
@@ -7,3 +7,3 @@ 'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -131,3 +131,3 @@ const escapeWithLowercase = /((?:^|[^\\])(?:\\\\)*)\\(x[a-f\d]{2}|u[a-f\d]{4}|u{(?:[a-f\d]+)})/; | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -134,0 +134,0 @@ fixable: 'code' |
@@ -6,3 +6,3 @@ 'use strict'; | ||
const baseRule = require('eslint/lib/rules/no-warning-comments'); | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -25,3 +25,3 @@ const MESSAGE_ID_AVOID_MULTIPLE_DATES = 'avoidMultipleDates'; | ||
const pkgDependencies = { | ||
const packageDependencies = { | ||
...packageJson.dependencies, | ||
@@ -32,4 +32,4 @@ ...packageJson.devDependencies | ||
const DEPENDENCY_INCLUSION_RE = /^[+|-]\s*@?[\S+]\/?\S+/; | ||
const VERSION_COMPARISON_RE = /^(@?[\S+]\/?\S+)@(>|>=)([\d]+(\.\d+){0,2})/; | ||
const PKG_VERSION_RE = /^(>|>=)([\d]+(\.\d+){0,2})\s*$/; | ||
const VERSION_COMPARISON_RE = /^(@?[\S+]\/?\S+)@(>|>=)([\d]+(\.\d+){0,2}(-[\da-z-]+(\.[\da-z-]+)*)?(\+[\da-z-]+(\.[\da-z-]+)*)?)/i; | ||
const PKG_VERSION_RE = /^(>|>=)([\d]+(\.\d+){0,2}(-[\da-z-]+(\.[\da-z-]+)*)?(\+[\da-z-]+(\.[\da-z-]+)*)?)\s*$/; | ||
const ISO8601_DATE = /(\d{4})-(\d{2})-(\d{2})/; | ||
@@ -164,5 +164,33 @@ | ||
function tryToCoerceVersion(version) { | ||
function tryToCoerceVersion(rawVersion) { | ||
let version = rawVersion; | ||
// Remove leading things like `^1.0.0`, `>1.0.0` | ||
const leadingNoises = [ | ||
'>=', | ||
'<=', | ||
'>', | ||
'<', | ||
'~', | ||
'^' | ||
]; | ||
const foundTrailingNoise = leadingNoises.find(noise => version.startsWith(noise)); | ||
if (foundTrailingNoise) { | ||
version = version.slice(foundTrailingNoise.length); | ||
} | ||
// Get only the first member for cases such as `1.0.0 - 2.9999.9999` | ||
const parts = version.split(' '); | ||
if (parts.length > 1) { | ||
version = parts[0]; | ||
} | ||
if (semver.valid(version)) { | ||
return version; | ||
} | ||
try { | ||
return semver.coerce(version); | ||
// Try to semver.parse a perfect match while semver.coerce tries to fix errors | ||
// But coerce can't parse pre-releases. | ||
return semver.parse(version) || semver.coerce(version); | ||
} catch (_) { | ||
@@ -290,7 +318,7 @@ return false; | ||
const pkgVersion = tryToCoerceVersion(packageJson.version); | ||
const desidedPkgVersion = tryToCoerceVersion(version); | ||
const packageVersion = tryToCoerceVersion(packageJson.version); | ||
const desidedPackageVersion = tryToCoerceVersion(version); | ||
const compare = semverComparisonForOperator(condition); | ||
if (compare(pkgVersion, desidedPkgVersion)) { | ||
if (compare(packageVersion, desidedPackageVersion)) { | ||
context.report({ | ||
@@ -312,3 +340,3 @@ node: null, | ||
uses++; | ||
const targetPackageRawVersion = pkgDependencies[dependency.name]; | ||
const targetPackageRawVersion = packageDependencies[dependency.name]; | ||
const hasTargetPackage = Boolean(targetPackageRawVersion); | ||
@@ -361,3 +389,3 @@ | ||
const pkgEngines = packageJson.engines || {}; | ||
const packageEngines = packageJson.engines || {}; | ||
@@ -367,3 +395,3 @@ for (const engine of engines) { | ||
const targetPackageRawEngineVersion = pkgEngines.node; | ||
const targetPackageRawEngineVersion = packageEngines.node; | ||
const hasTargetEngine = Boolean(targetPackageRawEngineVersion); | ||
@@ -478,3 +506,3 @@ | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -481,0 +509,0 @@ messages: { |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -167,3 +167,3 @@ const operatorTypes = { | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -170,0 +170,0 @@ fixable: 'code', |
@@ -7,3 +7,3 @@ 'use strict'; | ||
const upperfirst = require('lodash.upperfirst'); | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const cartesianProductSamples = require('./utils/cartesian-product-samples'); | ||
@@ -60,15 +60,13 @@ | ||
@param {unknown} context | ||
@param {object} options | ||
@returns {string[]} The chosen cases. | ||
*/ | ||
function getChosenCases(context) { | ||
const option = context.options[0] || {}; | ||
if (option.case) { | ||
return [option.case]; | ||
function getChosenCases(options) { | ||
if (options.case) { | ||
return [options.case]; | ||
} | ||
if (option.cases) { | ||
const cases = Object.keys(option.cases) | ||
.filter(cases => option.cases[cases]); | ||
if (options.cases) { | ||
const cases = Object.keys(options.cases) | ||
.filter(cases => options.cases[cases]); | ||
@@ -100,6 +98,6 @@ return cases.length > 0 ? cases : ['kebabCase']; | ||
function splitFilename(filename) { | ||
const res = leadingUnserscoresRegex.exec(filename); | ||
const result = leadingUnserscoresRegex.exec(filename); | ||
const leading = (res && res[1]) || ''; | ||
const tailing = (res && res[2]) || filename; | ||
const leading = (result && result[1]) || ''; | ||
const tailing = (result && result[2]) || filename; | ||
@@ -150,3 +148,11 @@ const words = []; | ||
const create = context => { | ||
const chosenCases = getChosenCases(context); | ||
const options = context.options[0] || {}; | ||
const chosenCases = getChosenCases(options); | ||
const ignore = (options.ignore || []).map(item => { | ||
if (item instanceof RegExp) { | ||
return item; | ||
} | ||
return new RegExp(item, 'u'); | ||
}); | ||
const chosenCasesFunctions = chosenCases.map(case_ => ignoreNumbers(cases[case_].fn)); | ||
@@ -163,4 +169,5 @@ const filenameWithExtension = context.getFilename(); | ||
const filename = path.basename(filenameWithExtension, extension); | ||
const base = filename + extension; | ||
if (filename + extension === 'index.js') { | ||
if (base === 'index.js' || ignore.some(regexp => regexp.test(base))) { | ||
return; | ||
@@ -207,2 +214,6 @@ } | ||
] | ||
}, | ||
ignore: { | ||
type: 'array', | ||
uniqueItems: true | ||
} | ||
@@ -230,2 +241,6 @@ }, | ||
additionalProperties: false | ||
}, | ||
ignore: { | ||
type: 'array', | ||
uniqueItems: true | ||
} | ||
@@ -243,3 +258,3 @@ }, | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -246,0 +261,0 @@ schema, |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -9,3 +9,3 @@ const regexp = /^(@.*?\/.*?|[./]+?.*?)(?:\/(\.|(?:index(?:\.js)?))?)$/; | ||
const importIndex = (context, node, argument) => { | ||
if (isImportingIndex(argument.value)) { | ||
if (argument && isImportingIndex(argument.value)) { | ||
context.report({ | ||
@@ -31,3 +31,3 @@ node, | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -34,0 +34,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -74,3 +74,3 @@ const enforceNew = new Set([ | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -77,0 +77,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -10,7 +10,7 @@ const disableRegex = /^eslint-disable(-next-line|-line)?($|(\s+(@[\w-]+\/(?:[\w-]+\/)?)?[\w-]+)?)/; | ||
const value = comment.value.trim(); | ||
const res = disableRegex.exec(value); | ||
const result = disableRegex.exec(value); | ||
if ( | ||
res && // It's a eslint-disable comment | ||
!res[2] // But it did not specify any rules | ||
result && // It's a eslint-disable comment | ||
!result[2] // But it did not specify any rules | ||
) { | ||
@@ -37,5 +37,5 @@ context.report({ | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
} | ||
} | ||
}; |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -24,3 +24,3 @@ const create = context => ({ | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -27,0 +27,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -73,8 +73,8 @@ const getConsoleMethod = node => { | ||
const { | ||
arguments: args | ||
arguments: arguments_ | ||
} = node; | ||
const fixables = args.map((nodeArgument, i) => { | ||
const fixables = arguments_.map((nodeArgument, i) => { | ||
const fixLeading = i !== 0; | ||
const fixTrailing = i !== (args.length - 1); | ||
const fixTrailing = i !== (arguments_.length - 1); | ||
@@ -95,3 +95,3 @@ const value = getArgumentValue(context, nodeArgument); | ||
const fixArg = (context, fixable, fixer) => { | ||
const fixArgument = (context, fixable, fixer) => { | ||
const { | ||
@@ -128,3 +128,3 @@ nodeArgument, | ||
message: buildErrorMessage(method), | ||
fix: fixer => fixArg(context, fixable, fixer) | ||
fix: fixer => fixArgument(context, fixable, fixer) | ||
}); | ||
@@ -141,3 +141,3 @@ } | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -144,0 +144,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -32,10 +32,10 @@ const iteratorMethods = new Map([ | ||
const getNumberOfArguments = node => node.callee.property && iteratorMethods.get(node.callee.property.name); | ||
const parseArgument = (context, arg) => arg.type === 'Identifier' ? arg.name : context.getSourceCode().getText(arg); | ||
const parseArgument = (context, argument) => argument.type === 'Identifier' ? argument.name : context.getSourceCode().getText(argument); | ||
const fix = (context, node) => { | ||
const numberOfArgs = getNumberOfArguments(node); | ||
const numberOfArguments = getNumberOfArguments(node); | ||
const argument = node.arguments[0]; | ||
const argumentString = numberOfArgs === 1 ? 'x' : 'a, b'; | ||
const argumentString = numberOfArguments === 1 ? 'x' : 'a, b'; | ||
return fixer => fixer.replaceText(argument, `${numberOfArgs === 1 ? argumentString : `(${argumentString})`} => ${parseArgument(context, argument)}(${argumentString})`); | ||
return fixer => fixer.replaceText(argument, `${numberOfArguments === 1 ? argumentString : `(${argumentString})`} => ${parseArgument(context, argument)}(${argumentString})`); | ||
}; | ||
@@ -54,6 +54,6 @@ | ||
if (isIteratorMethod(node) && hasFunctionArgument(node) && node.arguments.length <= getNumberOfArguments(node)) { | ||
const [arg] = node.arguments; | ||
const [argument] = node.arguments; | ||
context.report({ | ||
node: arg, | ||
node: argument, | ||
message: 'Do not pass a function reference directly to an iterator method.', | ||
@@ -71,3 +71,3 @@ fix: fix(context, node) | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -74,0 +74,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const isLiteralValue = require('./utils/is-literal-value'); | ||
const defaultElementName = 'element'; | ||
const isLiteralValue = value => node => node && node.type === 'Literal' && node.value === value; | ||
const isLiteralZero = isLiteralValue(0); | ||
const isLiteralOne = isLiteralValue(1); | ||
const isLiteralZero = node => isLiteralValue(node, 0); | ||
const isLiteralOne = node => isLiteralValue(node, 1); | ||
@@ -251,3 +251,3 @@ const isIdentifierWithName = (node, name) => node && node.type === 'Identifier' && node.name === name; | ||
.map(s => getReferencesInChildScopes(s, name)) | ||
.reduce((acc, scopeReferences) => [...acc, ...scopeReferences], []) | ||
.reduce((accumulator, scopeReferences) => [...accumulator, ...scopeReferences], []) | ||
]; | ||
@@ -364,3 +364,3 @@ }; | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -367,0 +367,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -32,3 +32,3 @@ function checkEscape(context, node, value) { | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -35,0 +35,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -187,3 +187,3 @@ const MESSAGE_ID = 'noKeywordPrefix'; | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -190,0 +190,0 @@ fixable: 'code', |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -53,3 +53,3 @@ const isParethesized = (sourceCode, node) => { | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -56,0 +56,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const inferMethod = args => (args.length > 0 && typeof args[0].value === 'number') ? 'alloc' : 'from'; | ||
const inferMethod = arguments_ => (arguments_.length > 0 && typeof arguments_[0].value === 'number') ? 'alloc' : 'from'; | ||
@@ -29,3 +29,3 @@ const create = context => { | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -32,0 +32,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const isLiteralValue = require('./utils/is-literal-value'); | ||
const isLiteralWorkerThreads = node => isLiteralValue(node, 'worker_threads'); | ||
const create = context => { | ||
@@ -22,11 +25,11 @@ const startsWithHashBang = context.getSourceCode().lines[0].indexOf('#!') === 0; | ||
if (callee.type === 'Identifier' && callee.name === 'require') { | ||
const args = node.arguments; | ||
const arguments_ = node.arguments; | ||
if (args.length === 0) { | ||
if (arguments_.length === 0) { | ||
return; | ||
} | ||
const [argument] = args; | ||
const [argument] = arguments_; | ||
if (argument.type === 'Literal' && argument.value === 'worker_threads') { | ||
if (isLiteralWorkerThreads(argument)) { | ||
requiredWorkerThreadsModule = true; | ||
@@ -63,3 +66,3 @@ return; | ||
if (source.type === 'Literal' && source.value === 'worker_threads') { | ||
if (isLiteralWorkerThreads(source)) { | ||
requiredWorkerThreadsModule = true; | ||
@@ -84,5 +87,5 @@ } | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
} | ||
} | ||
}; |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -31,5 +31,5 @@ const isCommaFollowedWithComma = (element, index, array) => { | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
} | ||
} | ||
}; |
'use strict'; | ||
const safeRegex = require('safe-regex'); | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -23,9 +23,9 @@ const message = 'Unsafe regular expression.'; | ||
'NewExpression[callee.name="RegExp"]': node => { | ||
const args = node.arguments; | ||
const arguments_ = node.arguments; | ||
if (args.length === 0 || args[0].type !== 'Literal') { | ||
if (arguments_.length === 0 || arguments_[0].type !== 'Literal') { | ||
return; | ||
} | ||
const hasRegExp = args[0].regex; | ||
const hasRegExp = arguments_[0].regex; | ||
@@ -35,7 +35,7 @@ let pattern; | ||
if (hasRegExp) { | ||
({pattern} = args[0].regex); | ||
flags = args[1] && args[1].type === 'Literal' ? args[1].value : args[0].regex.flags; | ||
({pattern} = arguments_[0].regex); | ||
flags = arguments_[1] && arguments_[1].type === 'Literal' ? arguments_[1].value : arguments_[0].regex.flags; | ||
} else { | ||
pattern = args[0].value; | ||
flags = args[1] && args[1].type === 'Literal' ? args[1].value : ''; | ||
pattern = arguments_[0].value; | ||
flags = arguments_[1] && arguments_[1].type === 'Literal' ? arguments_[1].value : ''; | ||
} | ||
@@ -58,5 +58,5 @@ | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
} | ||
} | ||
}; |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -78,4 +78,4 @@ const getDeclaratorOrPropertyValue = declaratorOrProperty => { | ||
const isUnusedVariable = variable => { | ||
const hasReadRef = variable.references.some(ref => ref.isRead()); | ||
return !hasReadRef; | ||
const hasReadReference = variable.references.some(reference => reference.isRead()); | ||
return !hasReadReference; | ||
}; | ||
@@ -238,5 +238,5 @@ | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
} | ||
} | ||
}; |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -51,3 +51,3 @@ const MESSAGE_ZERO_FRACTION = 'Don\'t use a zero fraction in the number.'; | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -54,0 +54,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -37,3 +37,3 @@ const fix = value => { | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -40,0 +40,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const domEventsJson = require('./utils/dom-events.json'); | ||
const nestedEvents = Object.keys(domEventsJson).map(key => domEventsJson[key]); | ||
const eventTypes = new Set(nestedEvents.reduce((accEvents, events) => accEvents.concat(events), [])); | ||
const eventTypes = new Set(nestedEvents.reduce((accumulatorEvents, events) => accumulatorEvents.concat(events), [])); | ||
const getEventMethodName = memberExpression => memberExpression.property.name; | ||
@@ -162,3 +162,3 @@ const getEventTypeName = eventMethodName => eventMethodName.slice('on'.length); | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -165,0 +165,0 @@ fixable: 'code', |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const isValidVariableName = require('./utils/is-valid-variable-name'); | ||
@@ -7,5 +7,5 @@ | ||
const getDataAttributeName = arg => { | ||
if (arg.type === 'Literal') { | ||
return (arg.value.match(/^data-(.+)/) || ['', ''])[1]; | ||
const getDataAttributeName = argument => { | ||
if (argument.type === 'Literal') { | ||
return (argument.value.match(/^data-(.+)/) || ['', ''])[1]; | ||
} | ||
@@ -16,3 +16,3 @@ | ||
const parseNodeText = (context, arg) => context.getSourceCode().getText(arg); | ||
const parseNodeText = (context, argument) => context.getSourceCode().getText(argument); | ||
@@ -77,3 +77,3 @@ const dashToCamelCase = string => string.replace(/-([a-z])/g, s => s[1].toUpperCase()); | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -80,0 +80,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const quoteString = require('./utils/quote-string'); | ||
@@ -204,7 +204,7 @@ | ||
// When the event parameter itself is destructured directly | ||
const isEventParamDestructured = event.type === 'ObjectPattern'; | ||
if (isEventParamDestructured) { | ||
const isEventParameterDestructured = event.type === 'ObjectPattern'; | ||
if (isEventParameterDestructured) { | ||
// Check for properties | ||
for (const prop of event.properties) { | ||
if (prop === node) { | ||
for (const property of event.properties) { | ||
if (property === node) { | ||
report(node.value); | ||
@@ -223,3 +223,3 @@ } | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -226,0 +226,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const isObjectMethod = require('./utils/is-object-method'); | ||
const isMathPow = node => { | ||
const {callee} = node; | ||
return ( | ||
callee.type === 'MemberExpression' && | ||
callee.object.type === 'Identifier' && | ||
callee.object.name === 'Math' && | ||
callee.property.type === 'Identifier' && | ||
callee.property.name === 'pow' | ||
); | ||
}; | ||
const isMathPow = node => isObjectMethod(node, 'Math', 'pow'); | ||
const parseArgument = (source, arg) => { | ||
const text = source.getText(arg); | ||
const parseArgument = (source, argument) => { | ||
const text = source.getText(argument); | ||
switch (arg.type) { | ||
switch (argument.type) { | ||
case 'Identifier': | ||
return arg.name; | ||
return argument.name; | ||
case 'Literal': | ||
@@ -66,3 +58,3 @@ return text; | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -69,0 +61,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const isMethodNamed = require('./utils/is-method-named'); | ||
@@ -154,3 +154,3 @@ | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -157,0 +157,0 @@ fixable: 'code', |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const isMethodNamed = require('./utils/is-method-named'); | ||
const isLiteralValue = require('./utils/is-literal-value'); | ||
const message = 'Use `.includes()`, rather than `.indexOf()`, when checking for existence.'; | ||
// Ignore {_,lodash,underscore}.indexOf | ||
const ignoredVariables = new Set(['_', 'lodash', 'underscore']); | ||
const isNegativeOne = (operator, value) => operator === '-' && value === 1; | ||
const isIgnoredTarget = node => node.type === 'Identifier' && ignoredVariables.has(node.name); | ||
const isNegativeOne = node => node.type === 'UnaryExpression' && node.operator === '-' && node.argument && node.argument.type === 'Literal' && node.argument.value === 1; | ||
const isLiteralZero = node => isLiteralValue(node, 0); | ||
const isNegativeResult = node => ['===', '==', '<'].includes(node.operator); | ||
@@ -17,3 +21,3 @@ const report = (context, node, target, argumentsNodes) => { | ||
// Strip default `fromIndex` | ||
if (argumentsNodes.length === 2 && argumentsNodes[1].type === 'Literal' && argumentsNodes[1].value === 0) { | ||
if (isLiteralZero(argumentsNodes[1])) { | ||
argumentsNodes = argumentsNodes.slice(0, 1); | ||
@@ -26,6 +30,5 @@ } | ||
node, | ||
message: 'Use `.includes()`, rather than `.indexOf()`, when checking for existence.', | ||
message, | ||
fix: fixer => { | ||
const isNot = node => ['===', '==', '<'].includes(node.operator) ? '!' : ''; | ||
const replacement = `${isNot(node)}${targetSource}.includes(${argumentsSource.join(', ')})`; | ||
const replacement = `${isNegativeResult(node) ? '!' : ''}${targetSource}.includes(${argumentsSource.join(', ')})`; | ||
return fixer.replaceText(node, replacement); | ||
@@ -57,19 +60,13 @@ } | ||
if (right.type === 'UnaryExpression') { | ||
const {argument} = right; | ||
if (argument.type !== 'Literal') { | ||
return; | ||
} | ||
const {value} = argument; | ||
if (['!==', '!=', '>', '===', '=='].includes(node.operator) && isNegativeOne(right.operator, value)) { | ||
report(context, node, target, argumentsNodes); | ||
} | ||
if ( | ||
(['!==', '!=', '>', '===', '=='].includes(node.operator) && isNegativeOne(right)) || | ||
(['>=', '<'].includes(node.operator) && isLiteralZero(right)) | ||
) { | ||
report( | ||
context, | ||
node, | ||
target, | ||
argumentsNodes | ||
); | ||
} | ||
if (right.type === 'Literal' && ['>=', '<'].includes(node.operator) && right.value === 0) { | ||
report(context, node, target, argumentsNodes); | ||
} | ||
} | ||
@@ -83,3 +80,3 @@ }); | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -86,0 +83,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -57,3 +57,3 @@ const getMethodName = memberExpression => memberExpression.property.name; | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -60,0 +60,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -32,4 +32,4 @@ const getMethodName = callee => { | ||
const getArgumentName = args => { | ||
const [identifier] = args; | ||
const getArgumentName = arguments_ => { | ||
const [identifier] = arguments_; | ||
@@ -85,3 +85,3 @@ if (identifier.type === 'ThisExpression') { | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -88,0 +88,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -11,3 +11,3 @@ const forbiddenIdentifierNames = new Map([ | ||
const getReplacementForId = value => `#${value}`; | ||
const getReplacementForClass = value => value.match(/\S+/g).map(e => `.${e}`).join(''); | ||
const getReplacementForClass = value => value.match(/\S+/g).map(className => `.${className}`).join(''); | ||
@@ -116,3 +116,3 @@ const getQuotedReplacement = (node, value) => { | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -119,0 +119,0 @@ fixable: 'code' |
'use strict'; | ||
const astUtils = require('eslint-ast-utils'); | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const isLiteralValue = require('./utils/is-literal-value'); | ||
const isApplySignature = (argument1, argument2) => ( | ||
((argument1.type === 'Literal' && argument1.raw === 'null') || | ||
(isLiteralValue(argument1, null) || | ||
argument1.type === 'ThisExpression') && | ||
@@ -13,4 +14,4 @@ (argument2.type === 'ArrayExpression' || | ||
const getReflectApplyCall = (sourceCode, func, receiver, args) => ( | ||
`Reflect.apply(${sourceCode.getText(func)}, ${sourceCode.getText(receiver)}, ${sourceCode.getText(args)})` | ||
const getReflectApplyCall = (sourceCode, func, receiver, arguments_) => ( | ||
`Reflect.apply(${sourceCode.getText(func)}, ${sourceCode.getText(receiver)}, ${sourceCode.getText(arguments_)})` | ||
); | ||
@@ -83,3 +84,3 @@ | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -86,0 +87,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const isObjectMethod = require('./utils/is-object-method'); | ||
const isArrayFrom = node => { | ||
const {callee} = node; | ||
return ( | ||
callee.type === 'MemberExpression' && | ||
callee.object.type === 'Identifier' && | ||
callee.object.name === 'Array' && | ||
callee.property.type === 'Identifier' && | ||
callee.property.name === 'from' | ||
); | ||
}; | ||
const isArrayFrom = node => isObjectMethod(node, 'Array', 'from'); | ||
const isArrayLike = argument => argument && argument.type !== 'ObjectExpression'; | ||
@@ -33,11 +24,11 @@ | ||
fix: fixer => { | ||
const arrayLikeArg = parseArgument(context, node.arguments[0]); | ||
const replacement = `[...${arrayLikeArg}]`; | ||
const arrayLikeArgument = parseArgument(context, node.arguments[0]); | ||
const replacement = `[...${arrayLikeArgument}]`; | ||
if (node.arguments.length > 1) { | ||
const mapFn = parseArgument(context, node.arguments[1]); | ||
const thisArg = node.arguments.length === 3 ? parseArgument(context, node.arguments[2]) : null; | ||
const thisArgReplacement = thisArg ? `, ${thisArg}` : ''; | ||
const thisArgument = node.arguments.length === 3 ? parseArgument(context, node.arguments[2]) : null; | ||
const thisArgumentReplacement = thisArgument ? `, ${thisArgument}` : ''; | ||
return fixer.replaceText(node, `${replacement}.map(${mapFn}${thisArgReplacement})`); | ||
return fixer.replaceText(node, `${replacement}.map(${mapFn}${thisArgumentReplacement})`); | ||
} | ||
@@ -58,3 +49,3 @@ | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -61,0 +52,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -15,15 +15,15 @@ const doesNotContain = (string, characters) => characters.every(character => !string.includes(character)); | ||
const {callee} = node; | ||
const prop = callee.property; | ||
const {property} = callee; | ||
if (!(prop && callee.type === 'MemberExpression')) { | ||
if (!(property && callee.type === 'MemberExpression')) { | ||
return; | ||
} | ||
const args = node.arguments; | ||
const arguments_ = node.arguments; | ||
let regex; | ||
if (prop.name === 'test' && callee.object.regex) { | ||
if (property.name === 'test' && callee.object.regex) { | ||
({regex} = callee.object); | ||
} else if (prop.name === 'match' && args && args[0] && args[0].regex) { | ||
({regex} = args[0]); | ||
} else if (property.name === 'match' && arguments_ && arguments_[0] && arguments_[0].regex) { | ||
({regex} = arguments_[0]); | ||
} else { | ||
@@ -58,5 +58,5 @@ return; | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
} | ||
} | ||
}; |
'use strict'; | ||
const eslintTemplateVisitor = require('eslint-template-visitor'); | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -60,3 +60,3 @@ const templates = eslintTemplateVisitor(); | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -63,0 +63,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -27,3 +27,3 @@ const message = 'Prefer `.textContent` over `.innerText`.'; | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -30,0 +30,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -125,3 +125,3 @@ const tcIdentifiers = new Set([ | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -128,0 +128,0 @@ fixable: 'code' |
@@ -7,3 +7,3 @@ 'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const avoidCapture = require('./utils/avoid-capture'); | ||
@@ -145,3 +145,4 @@ const cartesianProductSamples = require('./utils/cartesian-product-samples'); | ||
docs: { | ||
documents: true | ||
documents: true, | ||
documentation: true | ||
}, | ||
@@ -202,4 +203,4 @@ elem: { | ||
checkDefaultAndNamespaceImports = false, | ||
checkShorthandImports = false, | ||
checkDefaultAndNamespaceImports = 'internal', | ||
checkShorthandImports = 'internal', | ||
checkShorthandProperties = false, | ||
@@ -496,2 +497,14 @@ | ||
const isInternalImport = node => { | ||
let source = ''; | ||
if (node.type === 'Variable') { | ||
source = node.node.init.arguments[0].value; | ||
} else if (node.type === 'ImportBinding') { | ||
source = node.parent.source.value; | ||
} | ||
return !source.includes('node_modules') && (source.startsWith('.') || source.startsWith('/')); | ||
}; | ||
const create = context => { | ||
@@ -559,8 +572,20 @@ const { | ||
if (!options.checkDefaultAndNamespaceImports && isDefaultOrNamespaceImportName(definition.name)) { | ||
return; | ||
if (isDefaultOrNamespaceImportName(definition.name)) { | ||
if (!options.checkDefaultAndNamespaceImports) { | ||
return; | ||
} | ||
if (options.checkDefaultAndNamespaceImports === 'internal' && !isInternalImport(definition)) { | ||
return; | ||
} | ||
} | ||
if (!options.checkShorthandImports && isShorthandImportIdentifier(definition.name)) { | ||
return; | ||
if (isShorthandImportIdentifier(definition.name)) { | ||
if (!options.checkShorthandImports) { | ||
return; | ||
} | ||
if (options.checkShorthandImports === 'internal' && !isInternalImport(definition)) { | ||
return; | ||
} | ||
} | ||
@@ -691,4 +716,10 @@ | ||
checkDefaultAndNamespaceImports: {type: 'boolean'}, | ||
checkShorthandImports: {type: 'boolean'}, | ||
checkDefaultAndNamespaceImports: { | ||
type: ['boolean', 'string'], | ||
pattern: 'internal' | ||
}, | ||
checkShorthandImports: { | ||
type: ['boolean', 'string'], | ||
pattern: 'internal' | ||
}, | ||
checkShorthandProperties: {type: 'boolean'}, | ||
@@ -730,3 +761,3 @@ | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -733,0 +764,0 @@ fixable: 'code', |
'use strict'; | ||
const cleanRegexp = require('clean-regexp'); | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
const quoteString = require('./utils/quote-string'); | ||
@@ -30,9 +30,9 @@ | ||
'NewExpression[callee.name="RegExp"]': node => { | ||
const args = node.arguments; | ||
const arguments_ = node.arguments; | ||
if (args.length === 0 || args[0].type !== 'Literal') { | ||
if (arguments_.length === 0 || arguments_[0].type !== 'Literal') { | ||
return; | ||
} | ||
const hasRegExp = args[0].regex; | ||
const hasRegExp = arguments_[0].regex; | ||
@@ -42,7 +42,7 @@ let oldPattern; | ||
if (hasRegExp) { | ||
oldPattern = args[0].regex.pattern; | ||
flags = args[1] && args[1].type === 'Literal' ? args[1].value : args[0].regex.flags; | ||
oldPattern = arguments_[0].regex.pattern; | ||
flags = arguments_[1] && arguments_[1].type === 'Literal' ? arguments_[1].value : arguments_[0].regex.flags; | ||
} else { | ||
oldPattern = args[0].value; | ||
flags = args[1] && args[1].type === 'Literal' ? args[1].value : ''; | ||
oldPattern = arguments_[0].value; | ||
flags = arguments_[1] && arguments_[1].type === 'Literal' ? arguments_[1].value : ''; | ||
} | ||
@@ -65,3 +65,3 @@ | ||
message, | ||
fix: fixer => fixer.replaceText(args[0], fixed) | ||
fix: fixer => fixer.replaceText(arguments_[0], fixed) | ||
}); | ||
@@ -78,3 +78,3 @@ } | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -81,0 +81,0 @@ fixable: 'code' |
'use strict'; | ||
const getDocsUrl = require('./utils/get-docs-url'); | ||
const getDocumentationUrl = require('./utils/get-documentation-url'); | ||
@@ -26,3 +26,3 @@ const customError = /^(?:[A-Z][a-z\d]*)*Error$/; | ||
docs: { | ||
url: getDocsUrl(__filename) | ||
url: getDocumentationUrl(__filename) | ||
}, | ||
@@ -29,0 +29,0 @@ fixable: 'code' |
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
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
161413
58
5046
16
Updatedsafe-regex@^2.1.1