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.
		
		
		
		
		
			
		
			
				
					88 lines
				
				2.3 KiB
			
		
		
			
		
	
	
					88 lines
				
				2.3 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", {
							 | 
						||
| 
								 | 
							
								  value: true
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								exports.default = void 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var _helperPluginUtils = require("@babel/helper-plugin-utils");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var _core = require("@babel/core");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var _default = (0, _helperPluginUtils.declare)(api => {
							 | 
						||
| 
								 | 
							
								  api.assertVersion(7);
							 | 
						||
| 
								 | 
							
								  return {
							 | 
						||
| 
								 | 
							
								    name: "transform-new-target",
							 | 
						||
| 
								 | 
							
								    visitor: {
							 | 
						||
| 
								 | 
							
								      MetaProperty(path) {
							 | 
						||
| 
								 | 
							
								        const meta = path.get("meta");
							 | 
						||
| 
								 | 
							
								        const property = path.get("property");
							 | 
						||
| 
								 | 
							
								        const {
							 | 
						||
| 
								 | 
							
								          scope
							 | 
						||
| 
								 | 
							
								        } = path;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (meta.isIdentifier({
							 | 
						||
| 
								 | 
							
								          name: "new"
							 | 
						||
| 
								 | 
							
								        }) && property.isIdentifier({
							 | 
						||
| 
								 | 
							
								          name: "target"
							 | 
						||
| 
								 | 
							
								        })) {
							 | 
						||
| 
								 | 
							
								          const func = path.findParent(path => {
							 | 
						||
| 
								 | 
							
								            if (path.isClass()) return true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (path.isFunction() && !path.isArrowFunctionExpression()) {
							 | 
						||
| 
								 | 
							
								              if (path.isClassMethod({
							 | 
						||
| 
								 | 
							
								                kind: "constructor"
							 | 
						||
| 
								 | 
							
								              })) {
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								              return true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								          });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          if (!func) {
							 | 
						||
| 
								 | 
							
								            throw path.buildCodeFrameError("new.target must be under a (non-arrow) function or a class.");
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          const {
							 | 
						||
| 
								 | 
							
								            node
							 | 
						||
| 
								 | 
							
								          } = func;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          if (_core.types.isMethod(node)) {
							 | 
						||
| 
								 | 
							
								            path.replaceWith(scope.buildUndefinedNode());
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          const constructor = _core.types.memberExpression(_core.types.thisExpression(), _core.types.identifier("constructor"));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          if (func.isClass()) {
							 | 
						||
| 
								 | 
							
								            path.replaceWith(constructor);
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          if (!node.id) {
							 | 
						||
| 
								 | 
							
								            node.id = scope.generateUidIdentifier("target");
							 | 
						||
| 
								 | 
							
								          } else {
							 | 
						||
| 
								 | 
							
								            let scope = path.scope;
							 | 
						||
| 
								 | 
							
								            const name = node.id.name;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            while (scope !== func.parentPath.scope) {
							 | 
						||
| 
								 | 
							
								              if (scope.hasOwnBinding(name) && !scope.bindingIdentifierEquals(name, node.id)) {
							 | 
						||
| 
								 | 
							
								                scope.rename(name);
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								              scope = scope.parent;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          path.replaceWith(_core.types.conditionalExpression(_core.types.binaryExpression("instanceof", _core.types.thisExpression(), _core.types.cloneNode(node.id)), constructor, scope.buildUndefinedNode()));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								exports.default = _default;
							 |