| 'use strict'; |
| |
| const { isDefiningError } = require('./rules-utils.js'); |
| |
| const errMsg = 'Please use a printf-like formatted string that util.format' + |
| ' can consume.'; |
| |
| function isArrowFunctionWithTemplateLiteral(node) { |
| return node.type === 'ArrowFunctionExpression' && |
| node.body.type === 'TemplateLiteral'; |
| } |
| |
| module.exports = { |
| create: function(context) { |
| return { |
| ExpressionStatement: function(node) { |
| if (!isDefiningError(node) || node.expression.arguments.length < 2) |
| return; |
| |
| const msg = node.expression.arguments[1]; |
| if (!isArrowFunctionWithTemplateLiteral(msg)) |
| return; |
| |
| // Checks to see if order of arguments to function is the same as the |
| // order of them being concatenated in the template string. The idea is |
| // that if both match, then you can use `util.format`-style args. |
| // Would pass rule: (a, b) => `${b}${a}`. |
| // Would fail rule: (a, b) => `${a}${b}`, and needs to be rewritten. |
| const { expressions } = msg.body; |
| const hasSequentialParams = msg.params.every((param, index) => { |
| const expr = expressions[index]; |
| return expr && expr.type === 'Identifier' && param.name === expr.name; |
| }); |
| if (hasSequentialParams) |
| context.report(msg, errMsg); |
| } |
| }; |
| } |
| }; |