diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 1e660b8de77056..95ff2ba3c0c77e 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -117,6 +117,12 @@ rules: no-mixed-spaces-and-tabs: 2 no-multiple-empty-lines: [2, {max: 2, maxEOF: 0, maxBOF: 0}] no-restricted-syntax: [2, { + selector: "CallExpression[callee.object.name='assert'][callee.property.name='throws'][arguments.1.type='Literal']:not([arguments.1.regex])", + message: "use a regular expression for second argument of assert.throws()" + }, { + selector: "CallExpression[callee.object.name='assert'][callee.property.name='throws'][arguments.length<2]", + message: "assert.throws() must be invoked with at least two arguments." + }, { selector: "CallExpression[callee.name='setTimeout'][arguments.length<2]", message: "setTimeout() must be invoked with at least two arguments." }, { @@ -161,7 +167,6 @@ rules: template-curly-spacing: 2 # Custom rules in tools/eslint-rules - assert-throws-arguments: [2, { requireTwo: true }] # Global scoped method and vars globals: diff --git a/doc/api/assert.md b/doc/api/assert.md index 0b7621520b688f..2adc5549efb959 100644 --- a/doc/api/assert.md +++ b/doc/api/assert.md @@ -478,7 +478,7 @@ Note that `error` can not be a string. If a string is provided as the second argument, then `error` is assumed to be omitted and the string will be used for `message` instead. This can lead to easy-to-miss mistakes: -<!-- eslint-disable assert-throws-arguments --> +<!-- eslint-disable no-restricted-syntax --> ```js // THIS IS A MISTAKE! DO NOT DO THIS! assert.throws(myFunction, 'missing foo', 'did not throw with expected message'); diff --git a/test/parallel/test-assert.js b/test/parallel/test-assert.js index 3579c10f159ad5..aa51eb7e523e2e 100644 --- a/test/parallel/test-assert.js +++ b/test/parallel/test-assert.js @@ -345,11 +345,11 @@ function thrower(errorConstructor) { assert.throws(makeBlock(thrower, a.AssertionError), a.AssertionError, 'message'); assert.throws(makeBlock(thrower, a.AssertionError), a.AssertionError); -// eslint-disable-next-line assert-throws-arguments +// eslint-disable-next-line no-restricted-syntax assert.throws(makeBlock(thrower, a.AssertionError)); // if not passing an error, catch all. -// eslint-disable-next-line assert-throws-arguments +// eslint-disable-next-line no-restricted-syntax assert.throws(makeBlock(thrower, TypeError)); // when passing a type, only catch errors of the appropriate type @@ -524,7 +524,7 @@ testAssertionMessage({a: NaN, b: Infinity, c: -Infinity}, // #2893 try { - // eslint-disable-next-line assert-throws-arguments + // eslint-disable-next-line no-restricted-syntax assert.throws(function() { assert.ifError(null); }); diff --git a/tools/eslint-rules/assert-throws-arguments.js b/tools/eslint-rules/assert-throws-arguments.js deleted file mode 100644 index 3b51188c0c89bc..00000000000000 --- a/tools/eslint-rules/assert-throws-arguments.js +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @fileoverview Check that assert.throws is never called with a string as - * second argument. - * @author Michaƫl Zasso - */ -'use strict'; - -//------------------------------------------------------------------------------ -// Rule Definition -//------------------------------------------------------------------------------ - -function checkThrowsArguments(context, node) { - if (node.callee.type === 'MemberExpression' && - node.callee.object.name === 'assert' && - node.callee.property.name === 'throws') { - const args = node.arguments; - if (args.length > 3) { - context.report({ - message: 'Too many arguments', - node: node - }); - } else if (args.length > 1) { - const error = args[1]; - if (error.type === 'Literal' && typeof error.value === 'string' || - error.type === 'TemplateLiteral') { - context.report({ - message: 'Unexpected string as second argument', - node: error - }); - } - } else { - if (context.options[0].requireTwo) { - context.report({ - message: 'Expected at least two arguments', - node: node - }); - } - } - } -} - -module.exports = { - meta: { - schema: [ - { - type: 'object', - properties: { - requireTwo: { - type: 'boolean' - } - } - } - ] - }, - create: function(context) { - return { - CallExpression: (node) => checkThrowsArguments(context, node) - }; - } -};