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.
		
		
		
		
		
			
		
			
				
					240 lines
				
				7.7 KiB
			
		
		
			
		
	
	
					240 lines
				
				7.7 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", {
							 | 
						||
| 
								 | 
							
								  value: true
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								exports.default = void 0;
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "environmentVisitor", {
							 | 
						||
| 
								 | 
							
								  enumerable: true,
							 | 
						||
| 
								 | 
							
								  get: function () {
							 | 
						||
| 
								 | 
							
								    return _helperEnvironmentVisitor.default;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "skipAllButComputedKey", {
							 | 
						||
| 
								 | 
							
								  enumerable: true,
							 | 
						||
| 
								 | 
							
								  get: function () {
							 | 
						||
| 
								 | 
							
								    return _helperEnvironmentVisitor.skipAllButComputedKey;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								var _helperEnvironmentVisitor = require("@babel/helper-environment-visitor");
							 | 
						||
| 
								 | 
							
								var _helperMemberExpressionToFunctions = require("@babel/helper-member-expression-to-functions");
							 | 
						||
| 
								 | 
							
								var _helperOptimiseCallExpression = require("@babel/helper-optimise-call-expression");
							 | 
						||
| 
								 | 
							
								var _template = require("@babel/template");
							 | 
						||
| 
								 | 
							
								var _traverse = require("@babel/traverse");
							 | 
						||
| 
								 | 
							
								var _t = require("@babel/types");
							 | 
						||
| 
								 | 
							
								const {
							 | 
						||
| 
								 | 
							
								  assignmentExpression,
							 | 
						||
| 
								 | 
							
								  booleanLiteral,
							 | 
						||
| 
								 | 
							
								  callExpression,
							 | 
						||
| 
								 | 
							
								  cloneNode,
							 | 
						||
| 
								 | 
							
								  identifier,
							 | 
						||
| 
								 | 
							
								  memberExpression,
							 | 
						||
| 
								 | 
							
								  sequenceExpression,
							 | 
						||
| 
								 | 
							
								  stringLiteral,
							 | 
						||
| 
								 | 
							
								  thisExpression
							 | 
						||
| 
								 | 
							
								} = _t;
							 | 
						||
| 
								 | 
							
								function getPrototypeOfExpression(objectRef, isStatic, file, isPrivateMethod) {
							 | 
						||
| 
								 | 
							
								  objectRef = cloneNode(objectRef);
							 | 
						||
| 
								 | 
							
								  const targetRef = isStatic || isPrivateMethod ? objectRef : memberExpression(objectRef, identifier("prototype"));
							 | 
						||
| 
								 | 
							
								  return callExpression(file.addHelper("getPrototypeOf"), [targetRef]);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								const visitor = _traverse.default.visitors.merge([_helperEnvironmentVisitor.default, {
							 | 
						||
| 
								 | 
							
								  Super(path, state) {
							 | 
						||
| 
								 | 
							
								    const {
							 | 
						||
| 
								 | 
							
								      node,
							 | 
						||
| 
								 | 
							
								      parentPath
							 | 
						||
| 
								 | 
							
								    } = path;
							 | 
						||
| 
								 | 
							
								    if (!parentPath.isMemberExpression({
							 | 
						||
| 
								 | 
							
								      object: node
							 | 
						||
| 
								 | 
							
								    })) return;
							 | 
						||
| 
								 | 
							
								    state.handle(parentPath);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}]);
							 | 
						||
| 
								 | 
							
								const unshadowSuperBindingVisitor = _traverse.default.visitors.merge([_helperEnvironmentVisitor.default, {
							 | 
						||
| 
								 | 
							
								  Scopable(path, {
							 | 
						||
| 
								 | 
							
								    refName
							 | 
						||
| 
								 | 
							
								  }) {
							 | 
						||
| 
								 | 
							
								    const binding = path.scope.getOwnBinding(refName);
							 | 
						||
| 
								 | 
							
								    if (binding && binding.identifier.name === refName) {
							 | 
						||
| 
								 | 
							
								      path.scope.rename(refName);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}]);
							 | 
						||
| 
								 | 
							
								const specHandlers = {
							 | 
						||
| 
								 | 
							
								  memoise(superMember, count) {
							 | 
						||
| 
								 | 
							
								    const {
							 | 
						||
| 
								 | 
							
								      scope,
							 | 
						||
| 
								 | 
							
								      node
							 | 
						||
| 
								 | 
							
								    } = superMember;
							 | 
						||
| 
								 | 
							
								    const {
							 | 
						||
| 
								 | 
							
								      computed,
							 | 
						||
| 
								 | 
							
								      property
							 | 
						||
| 
								 | 
							
								    } = node;
							 | 
						||
| 
								 | 
							
								    if (!computed) {
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    const memo = scope.maybeGenerateMemoised(property);
							 | 
						||
| 
								 | 
							
								    if (!memo) {
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this.memoiser.set(property, memo, count);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  prop(superMember) {
							 | 
						||
| 
								 | 
							
								    const {
							 | 
						||
| 
								 | 
							
								      computed,
							 | 
						||
| 
								 | 
							
								      property
							 | 
						||
| 
								 | 
							
								    } = superMember.node;
							 | 
						||
| 
								 | 
							
								    if (this.memoiser.has(property)) {
							 | 
						||
| 
								 | 
							
								      return cloneNode(this.memoiser.get(property));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (computed) {
							 | 
						||
| 
								 | 
							
								      return cloneNode(property);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return stringLiteral(property.name);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  get(superMember) {
							 | 
						||
| 
								 | 
							
								    return this._get(superMember, this._getThisRefs());
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  _get(superMember, thisRefs) {
							 | 
						||
| 
								 | 
							
								    const proto = getPrototypeOfExpression(this.getObjectRef(), this.isStatic, this.file, this.isPrivateMethod);
							 | 
						||
| 
								 | 
							
								    return callExpression(this.file.addHelper("get"), [
							 | 
						||
| 
								 | 
							
								    thisRefs.memo ? sequenceExpression([thisRefs.memo, proto]) : proto, this.prop(superMember), thisRefs.this]);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  _getThisRefs() {
							 | 
						||
| 
								 | 
							
								    if (!this.isDerivedConstructor) {
							 | 
						||
| 
								 | 
							
								      return {
							 | 
						||
| 
								 | 
							
								        this: thisExpression()
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    const thisRef = this.scope.generateDeclaredUidIdentifier("thisSuper");
							 | 
						||
| 
								 | 
							
								    return {
							 | 
						||
| 
								 | 
							
								      memo: assignmentExpression("=", thisRef, thisExpression()),
							 | 
						||
| 
								 | 
							
								      this: cloneNode(thisRef)
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  set(superMember, value) {
							 | 
						||
| 
								 | 
							
								    const thisRefs = this._getThisRefs();
							 | 
						||
| 
								 | 
							
								    const proto = getPrototypeOfExpression(this.getObjectRef(), this.isStatic, this.file, this.isPrivateMethod);
							 | 
						||
| 
								 | 
							
								    return callExpression(this.file.addHelper("set"), [
							 | 
						||
| 
								 | 
							
								    thisRefs.memo ? sequenceExpression([thisRefs.memo, proto]) : proto, this.prop(superMember), value, thisRefs.this, booleanLiteral(superMember.isInStrictMode())]);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  destructureSet(superMember) {
							 | 
						||
| 
								 | 
							
								    throw superMember.buildCodeFrameError(`Destructuring to a super field is not supported yet.`);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  call(superMember, args) {
							 | 
						||
| 
								 | 
							
								    const thisRefs = this._getThisRefs();
							 | 
						||
| 
								 | 
							
								    return (0, _helperOptimiseCallExpression.default)(this._get(superMember, thisRefs), cloneNode(thisRefs.this), args, false);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  optionalCall(superMember, args) {
							 | 
						||
| 
								 | 
							
								    const thisRefs = this._getThisRefs();
							 | 
						||
| 
								 | 
							
								    return (0, _helperOptimiseCallExpression.default)(this._get(superMember, thisRefs), cloneNode(thisRefs.this), args, true);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  delete(superMember) {
							 | 
						||
| 
								 | 
							
								    if (superMember.node.computed) {
							 | 
						||
| 
								 | 
							
								      return sequenceExpression([callExpression(this.file.addHelper("toPropertyKey"), [cloneNode(superMember.node.property)]), _template.default.expression.ast`
							 | 
						||
| 
								 | 
							
								          function () { throw new ReferenceError("'delete super[expr]' is invalid"); }()
							 | 
						||
| 
								 | 
							
								        `]);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      return _template.default.expression.ast`
							 | 
						||
| 
								 | 
							
								        function () { throw new ReferenceError("'delete super.prop' is invalid"); }()
							 | 
						||
| 
								 | 
							
								      `;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								const looseHandlers = Object.assign({}, specHandlers, {
							 | 
						||
| 
								 | 
							
								  prop(superMember) {
							 | 
						||
| 
								 | 
							
								    const {
							 | 
						||
| 
								 | 
							
								      property
							 | 
						||
| 
								 | 
							
								    } = superMember.node;
							 | 
						||
| 
								 | 
							
								    if (this.memoiser.has(property)) {
							 | 
						||
| 
								 | 
							
								      return cloneNode(this.memoiser.get(property));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return cloneNode(property);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  get(superMember) {
							 | 
						||
| 
								 | 
							
								    const {
							 | 
						||
| 
								 | 
							
								      isStatic,
							 | 
						||
| 
								 | 
							
								      getSuperRef
							 | 
						||
| 
								 | 
							
								    } = this;
							 | 
						||
| 
								 | 
							
								    const {
							 | 
						||
| 
								 | 
							
								      computed
							 | 
						||
| 
								 | 
							
								    } = superMember.node;
							 | 
						||
| 
								 | 
							
								    const prop = this.prop(superMember);
							 | 
						||
| 
								 | 
							
								    let object;
							 | 
						||
| 
								 | 
							
								    if (isStatic) {
							 | 
						||
| 
								 | 
							
								      var _getSuperRef;
							 | 
						||
| 
								 | 
							
								      object = (_getSuperRef = getSuperRef()) != null ? _getSuperRef : memberExpression(identifier("Function"), identifier("prototype"));
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      var _getSuperRef2;
							 | 
						||
| 
								 | 
							
								      object = memberExpression((_getSuperRef2 = getSuperRef()) != null ? _getSuperRef2 : identifier("Object"), identifier("prototype"));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return memberExpression(object, prop, computed);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  set(superMember, value) {
							 | 
						||
| 
								 | 
							
								    const {
							 | 
						||
| 
								 | 
							
								      computed
							 | 
						||
| 
								 | 
							
								    } = superMember.node;
							 | 
						||
| 
								 | 
							
								    const prop = this.prop(superMember);
							 | 
						||
| 
								 | 
							
								    return assignmentExpression("=", memberExpression(thisExpression(), prop, computed), value);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  destructureSet(superMember) {
							 | 
						||
| 
								 | 
							
								    const {
							 | 
						||
| 
								 | 
							
								      computed
							 | 
						||
| 
								 | 
							
								    } = superMember.node;
							 | 
						||
| 
								 | 
							
								    const prop = this.prop(superMember);
							 | 
						||
| 
								 | 
							
								    return memberExpression(thisExpression(), prop, computed);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  call(superMember, args) {
							 | 
						||
| 
								 | 
							
								    return (0, _helperOptimiseCallExpression.default)(this.get(superMember), thisExpression(), args, false);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  optionalCall(superMember, args) {
							 | 
						||
| 
								 | 
							
								    return (0, _helperOptimiseCallExpression.default)(this.get(superMember), thisExpression(), args, true);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								class ReplaceSupers {
							 | 
						||
| 
								 | 
							
								  constructor(opts) {
							 | 
						||
| 
								 | 
							
								    var _opts$constantSuper;
							 | 
						||
| 
								 | 
							
								    const path = opts.methodPath;
							 | 
						||
| 
								 | 
							
								    this.methodPath = path;
							 | 
						||
| 
								 | 
							
								    this.isDerivedConstructor = path.isClassMethod({
							 | 
						||
| 
								 | 
							
								      kind: "constructor"
							 | 
						||
| 
								 | 
							
								    }) && !!opts.superRef;
							 | 
						||
| 
								 | 
							
								    this.isStatic = path.isObjectMethod() ||
							 | 
						||
| 
								 | 
							
								    path.node.static || (path.isStaticBlock == null ? void 0 : path.isStaticBlock());
							 | 
						||
| 
								 | 
							
								    this.isPrivateMethod = path.isPrivate() && path.isMethod();
							 | 
						||
| 
								 | 
							
								    this.file = opts.file;
							 | 
						||
| 
								 | 
							
								    this.constantSuper = (_opts$constantSuper = opts.constantSuper) != null ? _opts$constantSuper : opts.isLoose;
							 | 
						||
| 
								 | 
							
								    this.opts = opts;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  getObjectRef() {
							 | 
						||
| 
								 | 
							
								    return cloneNode(this.opts.objectRef || this.opts.getObjectRef());
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  getSuperRef() {
							 | 
						||
| 
								 | 
							
								    if (this.opts.superRef) return cloneNode(this.opts.superRef);
							 | 
						||
| 
								 | 
							
								    if (this.opts.getSuperRef) {
							 | 
						||
| 
								 | 
							
								      return cloneNode(this.opts.getSuperRef());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  replace() {
							 | 
						||
| 
								 | 
							
								    if (this.opts.refToPreserve) {
							 | 
						||
| 
								 | 
							
								      this.methodPath.traverse(unshadowSuperBindingVisitor, {
							 | 
						||
| 
								 | 
							
								        refName: this.opts.refToPreserve.name
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    const handler = this.constantSuper ? looseHandlers : specHandlers;
							 | 
						||
| 
								 | 
							
								    (0, _helperMemberExpressionToFunctions.default)(this.methodPath, visitor, Object.assign({
							 | 
						||
| 
								 | 
							
								      file: this.file,
							 | 
						||
| 
								 | 
							
								      scope: this.methodPath.scope,
							 | 
						||
| 
								 | 
							
								      isDerivedConstructor: this.isDerivedConstructor,
							 | 
						||
| 
								 | 
							
								      isStatic: this.isStatic,
							 | 
						||
| 
								 | 
							
								      isPrivateMethod: this.isPrivateMethod,
							 | 
						||
| 
								 | 
							
								      getObjectRef: this.getObjectRef.bind(this),
							 | 
						||
| 
								 | 
							
								      getSuperRef: this.getSuperRef.bind(this),
							 | 
						||
| 
								 | 
							
								      boundGet: handler.get
							 | 
						||
| 
								 | 
							
								    }, handler));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								exports.default = ReplaceSupers;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=index.js.map
							 |