UNPKG

6.54 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4
5var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
6
7exports.isBinding = isBinding;
8exports.isReferenced = isReferenced;
9exports.isValidIdentifier = isValidIdentifier;
10exports.isLet = isLet;
11exports.isBlockScoped = isBlockScoped;
12exports.isVar = isVar;
13exports.isSpecifierDefault = isSpecifierDefault;
14exports.isScope = isScope;
15exports.isImmutable = isImmutable;
16exports.isNodesEquivalent = isNodesEquivalent;
17
18var _retrievers = require("./retrievers");
19
20var _esutils = require("esutils");
21
22var _esutils2 = _interopRequireDefault(_esutils);
23
24var _index = require("./index");
25
26var t = _interopRequireWildcard(_index);
27
28var _constants = require("./constants");
29
30function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
31
32function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33
34function isBinding(node, parent) {
35 var keys = _retrievers.getBindingIdentifiers.keys[parent.type];
36 if (keys) {
37 for (var i = 0; i < keys.length; i++) {
38 var key = keys[i];
39 var val = parent[key];
40 if (Array.isArray(val)) {
41 if (val.indexOf(node) >= 0) return true;
42 } else {
43 if (val === node) return true;
44 }
45 }
46 }
47
48 return false;
49}
50
51function isReferenced(node, parent) {
52 switch (parent.type) {
53 case "BindExpression":
54 return parent.object === node || parent.callee === node;
55
56 case "MemberExpression":
57 case "JSXMemberExpression":
58 if (parent.property === node && parent.computed) {
59 return true;
60 } else if (parent.object === node) {
61 return true;
62 } else {
63 return false;
64 }
65
66 case "MetaProperty":
67 return false;
68
69 case "ObjectProperty":
70 if (parent.key === node) {
71 return parent.computed;
72 }
73
74 case "VariableDeclarator":
75 return parent.id !== node;
76
77 case "ArrowFunctionExpression":
78 case "FunctionDeclaration":
79 case "FunctionExpression":
80 for (var _iterator = parent.params, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
81 var _ref;
82
83 if (_isArray) {
84 if (_i >= _iterator.length) break;
85 _ref = _iterator[_i++];
86 } else {
87 _i = _iterator.next();
88 if (_i.done) break;
89 _ref = _i.value;
90 }
91
92 var param = _ref;
93
94 if (param === node) return false;
95 }
96
97 return parent.id !== node;
98
99 case "ExportSpecifier":
100 if (parent.source) {
101 return false;
102 } else {
103 return parent.local === node;
104 }
105
106 case "ExportNamespaceSpecifier":
107 case "ExportDefaultSpecifier":
108 return false;
109
110 case "JSXAttribute":
111 return parent.name !== node;
112
113 case "ClassProperty":
114 if (parent.key === node) {
115 return parent.computed;
116 } else {
117 return parent.value === node;
118 }
119
120 case "ImportDefaultSpecifier":
121 case "ImportNamespaceSpecifier":
122 case "ImportSpecifier":
123 return false;
124
125 case "ClassDeclaration":
126 case "ClassExpression":
127 return parent.id !== node;
128
129 case "ClassMethod":
130 case "ObjectMethod":
131 return parent.key === node && parent.computed;
132
133 case "LabeledStatement":
134 return false;
135
136 case "CatchClause":
137 return parent.param !== node;
138
139 case "RestElement":
140 return false;
141
142 case "AssignmentExpression":
143 return parent.right === node;
144
145 case "AssignmentPattern":
146 return parent.right === node;
147
148 case "ObjectPattern":
149 case "ArrayPattern":
150 return false;
151 }
152
153 return true;
154}
155
156function isValidIdentifier(name) {
157 if (typeof name !== "string" || _esutils2.default.keyword.isReservedWordES6(name, true)) {
158 return false;
159 } else if (name === "await") {
160 return false;
161 } else {
162 return _esutils2.default.keyword.isIdentifierNameES6(name);
163 }
164}
165
166function isLet(node) {
167 return t.isVariableDeclaration(node) && (node.kind !== "var" || node[_constants.BLOCK_SCOPED_SYMBOL]);
168}
169
170function isBlockScoped(node) {
171 return t.isFunctionDeclaration(node) || t.isClassDeclaration(node) || t.isLet(node);
172}
173
174function isVar(node) {
175 return t.isVariableDeclaration(node, { kind: "var" }) && !node[_constants.BLOCK_SCOPED_SYMBOL];
176}
177
178function isSpecifierDefault(specifier) {
179 return t.isImportDefaultSpecifier(specifier) || t.isIdentifier(specifier.imported || specifier.exported, { name: "default" });
180}
181
182function isScope(node, parent) {
183 if (t.isBlockStatement(node) && t.isFunction(parent, { body: node })) {
184 return false;
185 }
186
187 return t.isScopable(node);
188}
189
190function isImmutable(node) {
191 if (t.isType(node.type, "Immutable")) return true;
192
193 if (t.isIdentifier(node)) {
194 if (node.name === "undefined") {
195 return true;
196 } else {
197 return false;
198 }
199 }
200
201 return false;
202}
203
204function isNodesEquivalent(a, b) {
205 if ((typeof a === "undefined" ? "undefined" : _typeof(a)) !== "object" || (typeof b === "undefined" ? "undefined" : _typeof(b)) !== "object" || a == null || b == null) {
206 return a === b;
207 }
208
209 if (a.type !== b.type) {
210 return false;
211 }
212
213 var fields = Object.keys(t.NODE_FIELDS[a.type] || a.type);
214
215 for (var _iterator2 = fields, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
216 var _ref2;
217
218 if (_isArray2) {
219 if (_i2 >= _iterator2.length) break;
220 _ref2 = _iterator2[_i2++];
221 } else {
222 _i2 = _iterator2.next();
223 if (_i2.done) break;
224 _ref2 = _i2.value;
225 }
226
227 var field = _ref2;
228
229 if (_typeof(a[field]) !== _typeof(b[field])) {
230 return false;
231 }
232
233 if (Array.isArray(a[field])) {
234 if (!Array.isArray(b[field])) {
235 return false;
236 }
237 if (a[field].length !== b[field].length) {
238 return false;
239 }
240
241 for (var i = 0; i < a[field].length; i++) {
242 if (!isNodesEquivalent(a[field][i], b[field][i])) {
243 return false;
244 }
245 }
246 continue;
247 }
248
249 if (!isNodesEquivalent(a[field], b[field])) {
250 return false;
251 }
252 }
253
254 return true;
255}
\No newline at end of file