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