1/** 2 * @fileoverview Check that TypeError[ERR_INVALID_ARG_TYPE] uses 3 * lowercase for primitive types 4 * @author Weijia Wang <starkwang@126.com> 5 */ 6'use strict'; 7 8//------------------------------------------------------------------------------ 9// Rule Definition 10//------------------------------------------------------------------------------ 11 12const astSelector = 'NewExpression[callee.property.name="TypeError"]' + 13 '[arguments.0.value="ERR_INVALID_ARG_TYPE"]'; 14 15const primitives = [ 'number', 'string', 'boolean', 'null', 'undefined' ]; 16 17module.exports = function(context) { 18 function checkNamesArgument(node) { 19 const names = node.arguments[2]; 20 21 switch (names.type) { 22 case 'Literal': 23 checkName(names); 24 break; 25 case 'ArrayExpression': 26 names.elements.forEach((name) => { 27 checkName(name); 28 }); 29 break; 30 } 31 } 32 33 function checkName(node) { 34 const name = node.value; 35 const lowercaseName = name.toLowerCase(); 36 if (name !== lowercaseName && primitives.includes(lowercaseName)) { 37 const msg = `primitive should use lowercase: ${name}`; 38 context.report({ 39 node, 40 message: msg, 41 fix: (fixer) => { 42 return fixer.replaceText( 43 node, 44 `'${lowercaseName}'` 45 ); 46 } 47 }); 48 } 49 50 } 51 52 return { 53 [astSelector]: (node) => checkNamesArgument(node) 54 }; 55}; 56 57module.exports.meta = { 58 fixable: 'code' 59}; 60