• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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