You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					92 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					92 lines
				
				2.0 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.default = _default; | ||
|  | 
 | ||
|  | var _t = require("@babel/types"); | ||
|  | 
 | ||
|  | const { | ||
|  |   assignmentExpression, | ||
|  |   cloneNode, | ||
|  |   isIdentifier, | ||
|  |   isLiteral, | ||
|  |   isMemberExpression, | ||
|  |   isPrivateName, | ||
|  |   isPureish, | ||
|  |   isSuper, | ||
|  |   memberExpression, | ||
|  |   toComputedKey | ||
|  | } = _t; | ||
|  | 
 | ||
|  | function getObjRef(node, nodes, scope) { | ||
|  |   let ref; | ||
|  | 
 | ||
|  |   if (isIdentifier(node)) { | ||
|  |     if (scope.hasBinding(node.name)) { | ||
|  |       return node; | ||
|  |     } else { | ||
|  |       ref = node; | ||
|  |     } | ||
|  |   } else if (isMemberExpression(node)) { | ||
|  |     ref = node.object; | ||
|  | 
 | ||
|  |     if (isSuper(ref) || isIdentifier(ref) && scope.hasBinding(ref.name)) { | ||
|  |       return ref; | ||
|  |     } | ||
|  |   } else { | ||
|  |     throw new Error(`We can't explode this node type ${node["type"]}`); | ||
|  |   } | ||
|  | 
 | ||
|  |   const temp = scope.generateUidIdentifierBasedOnNode(ref); | ||
|  |   scope.push({ | ||
|  |     id: temp | ||
|  |   }); | ||
|  |   nodes.push(assignmentExpression("=", cloneNode(temp), cloneNode(ref))); | ||
|  |   return temp; | ||
|  | } | ||
|  | 
 | ||
|  | function getPropRef(node, nodes, scope) { | ||
|  |   const prop = node.property; | ||
|  | 
 | ||
|  |   if (isPrivateName(prop)) { | ||
|  |     throw new Error("We can't generate property ref for private name, please install `@babel/plugin-proposal-class-properties`"); | ||
|  |   } | ||
|  | 
 | ||
|  |   const key = toComputedKey(node, prop); | ||
|  |   if (isLiteral(key) && isPureish(key)) return key; | ||
|  |   const temp = scope.generateUidIdentifierBasedOnNode(prop); | ||
|  |   scope.push({ | ||
|  |     id: temp | ||
|  |   }); | ||
|  |   nodes.push(assignmentExpression("=", cloneNode(temp), cloneNode(prop))); | ||
|  |   return temp; | ||
|  | } | ||
|  | 
 | ||
|  | function _default(node, nodes, file, scope, allowedSingleIdent) { | ||
|  |   let obj; | ||
|  | 
 | ||
|  |   if (isIdentifier(node) && allowedSingleIdent) { | ||
|  |     obj = node; | ||
|  |   } else { | ||
|  |     obj = getObjRef(node, nodes, scope); | ||
|  |   } | ||
|  | 
 | ||
|  |   let ref, uid; | ||
|  | 
 | ||
|  |   if (isIdentifier(node)) { | ||
|  |     ref = cloneNode(node); | ||
|  |     uid = obj; | ||
|  |   } else { | ||
|  |     const prop = getPropRef(node, nodes, scope); | ||
|  |     const computed = node.computed || isLiteral(prop); | ||
|  |     uid = memberExpression(cloneNode(obj), cloneNode(prop), computed); | ||
|  |     ref = memberExpression(cloneNode(obj), cloneNode(prop), computed); | ||
|  |   } | ||
|  | 
 | ||
|  |   return { | ||
|  |     uid: uid, | ||
|  |     ref: ref | ||
|  |   }; | ||
|  | } |