Blame view

node_modules/eslint/lib/rules/no-underscore-dangle.js 4.36 KB
c39994410   Ryan Glover   wip converting to...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
  /**
   * @fileoverview Rule to flag trailing underscores in variable declarations.
   * @author Matt DuVall <http://www.mattduvall.com>
   */
  
  "use strict";
  
  //------------------------------------------------------------------------------
  // Rule Definition
  //------------------------------------------------------------------------------
  
  module.exports = function(context) {
  
      var ALLOWED_VARIABLES = context.options[0] && context.options[0].allow ? context.options[0].allow : [];
  
      //-------------------------------------------------------------------------
      // Helpers
      //-------------------------------------------------------------------------
  
      /**
       * Check if identifier is present inside the allowed option
       * @param {string} identifier name of the node
       * @returns {boolean} true if its is present
       * @private
       */
      function isAllowed(identifier) {
          return ALLOWED_VARIABLES.some(function(ident) {
              return ident === identifier;
          });
      }
  
      /**
       * Check if identifier has a underscore at the end
       * @param {ASTNode} identifier node to evaluate
       * @returns {boolean} true if its is present
       * @private
       */
      function hasTrailingUnderscore(identifier) {
          var len = identifier.length;
  
          return identifier !== "_" && (identifier[0] === "_" || identifier[len - 1] === "_");
      }
  
      /**
       * Check if identifier is a special case member expression
       * @param {ASTNode} identifier node to evaluate
       * @returns {boolean} true if its is a special case
       * @private
       */
      function isSpecialCaseIdentifierForMemberExpression(identifier) {
          return identifier === "__proto__";
      }
  
      /**
       * Check if identifier is a special case variable expression
       * @param {ASTNode} identifier node to evaluate
       * @returns {boolean} true if its is a special case
       * @private
       */
      function isSpecialCaseIdentifierInVariableExpression(identifier) {
          // Checks for the underscore library usage here
          return identifier === "_";
      }
  
      /**
       * Check if function has a underscore at the end
       * @param {ASTNode} node node to evaluate
       * @returns {void}
       * @private
       */
      function checkForTrailingUnderscoreInFunctionDeclaration(node) {
          if (node.id) {
              var identifier = node.id.name;
  
              if (typeof identifier !== "undefined" && hasTrailingUnderscore(identifier) && !isAllowed(identifier)) {
                  context.report(node, "Unexpected dangling \"_\" in \"" + identifier + "\".");
              }
          }
      }
  
      /**
       * Check if variable expression has a underscore at the end
       * @param {ASTNode} node node to evaluate
       * @returns {void}
       * @private
       */
      function checkForTrailingUnderscoreInVariableExpression(node) {
          var identifier = node.id.name;
  
          if (typeof identifier !== "undefined" && hasTrailingUnderscore(identifier) &&
              !isSpecialCaseIdentifierInVariableExpression(identifier) && !isAllowed(identifier)) {
              context.report(node, "Unexpected dangling \"_\" in \"" + identifier + "\".");
          }
      }
  
      /**
       * Check if member expression has a underscore at the end
       * @param {ASTNode} node node to evaluate
       * @returns {void}
       * @private
       */
      function checkForTrailingUnderscoreInMemberExpression(node) {
          var identifier = node.property.name;
  
          if (typeof identifier !== "undefined" && hasTrailingUnderscore(identifier) &&
              !isSpecialCaseIdentifierForMemberExpression(identifier) && !isAllowed(identifier)) {
              context.report(node, "Unexpected dangling \"_\" in \"" + identifier + "\".");
          }
      }
  
      //--------------------------------------------------------------------------
      // Public API
      //--------------------------------------------------------------------------
  
      return {
          "FunctionDeclaration": checkForTrailingUnderscoreInFunctionDeclaration,
          "VariableDeclarator": checkForTrailingUnderscoreInVariableExpression,
          "MemberExpression": checkForTrailingUnderscoreInMemberExpression
      };
  
  };
  
  module.exports.schema = [
      {
          "type": "object",
          "properties": {
              "allow": {
                  "type": "array",
                  "items": {
                      "type": "string"
                  }
              }
          },
          "additionalProperties": false
      }
  ];