diff --git a/.eslintrc.yaml b/.eslintrc.yaml index e510de49b7b48f..36677b7cea0b2f 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -119,6 +119,12 @@ rules: no-mixed-spaces-and-tabs: error no-multiple-empty-lines: [error, {max: 2, maxEOF: 0, maxBOF: 0}] no-restricted-syntax: [error, { + 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." }, { @@ -163,7 +169,6 @@ rules: template-curly-spacing: error # Custom rules in tools/eslint-rules - assert-throws-arguments: [error, { requireTwo: true }] no-unescaped-regexp-dot: error # Global scoped method and vars diff --git a/doc/api/assert.md b/doc/api/assert.md index c92ae3f3f12e9f..5126c334e16599 100644 --- a/doc/api/assert.md +++ b/doc/api/assert.md @@ -583,7 +583,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: - + ```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 164edc8dc25f2a..30e80274890ce6 100644 --- a/test/parallel/test-assert.js +++ b/test/parallel/test-assert.js @@ -412,11 +412,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 @@ -618,7 +618,7 @@ testAssertionMessage({ a: NaN, b: Infinity, c: -Infinity }, { let threw = false; 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) - }; - } -};