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
						
					
					
				| "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
 | |
|   };
 | |
| } |