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