This repository was archived by the owner on Mar 23, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 509
/
Copy pathrequire-capitalized-constructors.js
74 lines (66 loc) · 1.78 KB
/
require-capitalized-constructors.js
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
/**
* Requires constructors to be capitalized (except for `this`)
*
* Types: `Boolean` or `Object`
*
* Values: `true` or Object with `allExcept` Array of quoted identifiers which are exempted
*
* JSHint: [`newcap`](http://jshint.com/docs/options/#newcap)
*
* #### Example
*
* ```js
* "requireCapitalizedConstructors": true
* "requireCapitalizedConstructors": {
* "allExcept": ["somethingNative"]
* }
* ```
*
* ##### Valid
*
* ```js
* var a = new B();
* var c = new this();
* var d = new somethingNative();
* ```
*
* ##### Invalid
*
* ```js
* var d = new e();
* ```
*/
var assert = require('assert');
module.exports = function() {};
module.exports.prototype = {
configure: function(options) {
assert(
options === true || Array.isArray(options.allExcept),
this.getOptionName() + ' option requires a true value or an object of exceptions'
);
this._allowedConstructors = {};
var allExcept = options.allExcept;
if (allExcept) {
for (var i = 0, l = allExcept.length; i < l; i++) {
this._allowedConstructors[allExcept[i]] = true;
}
}
},
getOptionName: function() {
return 'requireCapitalizedConstructors';
},
check: function(file, errors) {
var allowedConstructors = this._allowedConstructors;
file.iterateNodesByType('NewExpression', function(node) {
if (node.callee.type === 'Identifier' &&
!allowedConstructors[node.callee.name] &&
node.callee.name[0].toUpperCase() !== node.callee.name[0]
) {
errors.add(
'Constructor functions should be capitalized',
node.callee
);
}
});
}
};