From fc6ee39ea609d8797e7d97ac09e05d5b3a7d9336 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Sun, 18 Feb 2018 20:19:20 +0100 Subject: [PATCH] tools: fix custom eslint rule errors This fixes a few rules by making sure the input is actually ready to be checked. Otherwise those can throw TypeErrors or result in faulty error messages. PR-URL: https://github.com/nodejs/node/pull/18853 Reviewed-By: Luigi Pinca --- tools/eslint-rules/alphabetize-errors.js | 9 ++------- tools/eslint-rules/documented-errors.js | 10 ++-------- tools/eslint-rules/prefer-util-format-errors.js | 11 +++-------- tools/eslint-rules/rules-utils.js | 8 ++++++++ 4 files changed, 15 insertions(+), 23 deletions(-) diff --git a/tools/eslint-rules/alphabetize-errors.js b/tools/eslint-rules/alphabetize-errors.js index 2f604130e995b4..b2dcacbb866816 100644 --- a/tools/eslint-rules/alphabetize-errors.js +++ b/tools/eslint-rules/alphabetize-errors.js @@ -1,5 +1,7 @@ 'use strict'; +const { isDefiningError } = require('./rules-utils.js'); + const prefix = 'Out of ASCIIbetical order - '; const opStr = ' >= '; @@ -7,13 +9,6 @@ function errorForNode(node) { return node.expression.arguments[0].value; } -function isDefiningError(node) { - return node.expression && - node.expression.type === 'CallExpression' && - node.expression.callee && - node.expression.callee.name === 'E'; -} - module.exports = { create: function(context) { let previousNode; diff --git a/tools/eslint-rules/documented-errors.js b/tools/eslint-rules/documented-errors.js index 471452d67a04f2..0dbabb0673aa4b 100644 --- a/tools/eslint-rules/documented-errors.js +++ b/tools/eslint-rules/documented-errors.js @@ -2,6 +2,7 @@ const fs = require('fs'); const path = require('path'); +const { isDefiningError } = require('./rules-utils.js'); const doc = fs.readFileSync(path.resolve(__dirname, '../../doc/api/errors.md'), 'utf8'); @@ -18,18 +19,11 @@ function errorForNode(node) { return node.expression.arguments[0].value; } -function isDefiningError(node) { - return node.expression && - node.expression.type === 'CallExpression' && - node.expression.callee && - node.expression.callee.name === 'E'; -} - module.exports = { create: function(context) { return { ExpressionStatement: function(node) { - if (!isDefiningError(node)) return; + if (!isDefiningError(node) || !errorForNode(node)) return; const code = errorForNode(node); if (!isInDoc(code)) { const message = `"${code}" is not documented in doc/api/errors.md`; diff --git a/tools/eslint-rules/prefer-util-format-errors.js b/tools/eslint-rules/prefer-util-format-errors.js index f6993e627782dd..407b6e20dd23ea 100644 --- a/tools/eslint-rules/prefer-util-format-errors.js +++ b/tools/eslint-rules/prefer-util-format-errors.js @@ -1,5 +1,7 @@ 'use strict'; +const { isDefiningError } = require('./rules-utils.js'); + const errMsg = 'Please use a printf-like formatted string that util.format' + ' can consume.'; @@ -8,18 +10,11 @@ function isArrowFunctionWithTemplateLiteral(node) { node.body.type === 'TemplateLiteral'; } -function isDefiningError(node) { - return node.expression && - node.expression.type === 'CallExpression' && - node.expression.callee && - node.expression.callee.name === 'E'; -} - module.exports = { create: function(context) { return { ExpressionStatement: function(node) { - if (!isDefiningError(node)) + if (!isDefiningError(node) || node.expression.arguments.length < 2) return; const msg = node.expression.arguments[1]; diff --git a/tools/eslint-rules/rules-utils.js b/tools/eslint-rules/rules-utils.js index 88ecf658ce37f0..0e89a715450edb 100644 --- a/tools/eslint-rules/rules-utils.js +++ b/tools/eslint-rules/rules-utils.js @@ -3,6 +3,14 @@ */ 'use strict'; +module.exports.isDefiningError = function(node) { + return node.expression && + node.expression.type === 'CallExpression' && + node.expression.callee && + node.expression.callee.name === 'E' && + node.expression.arguments.length !== 0; +}; + /** * Returns true if any of the passed in modules are used in * require calls.