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.
		
		
		
		
		
			
		
			
				
					
					
						
							132 lines
						
					
					
						
							4.7 KiB
						
					
					
				
			
		
		
	
	
							132 lines
						
					
					
						
							4.7 KiB
						
					
					
				| "use strict";
 | |
| 
 | |
| Object.defineProperty(exports, "__esModule", {
 | |
|   value: true
 | |
| });
 | |
| exports.default = void 0;
 | |
| var _helperPluginUtils = require("@babel/helper-plugin-utils");
 | |
| var _pluginSyntaxPrivatePropertyInObject = require("@babel/plugin-syntax-private-property-in-object");
 | |
| var _helperCreateClassFeaturesPlugin = require("@babel/helper-create-class-features-plugin");
 | |
| var _helperAnnotateAsPure = require("@babel/helper-annotate-as-pure");
 | |
| var _default = (0, _helperPluginUtils.declare)((api, opt) => {
 | |
|   api.assertVersion(7);
 | |
|   const {
 | |
|     types: t,
 | |
|     template
 | |
|   } = api;
 | |
|   const {
 | |
|     loose
 | |
|   } = opt;
 | |
| 
 | |
|   const classWeakSets = new WeakMap();
 | |
|   const fieldsWeakSets = new WeakMap();
 | |
|   function unshadow(name, targetScope, scope) {
 | |
|     while (scope !== targetScope) {
 | |
|       if (scope.hasOwnBinding(name)) scope.rename(name);
 | |
|       scope = scope.parent;
 | |
|     }
 | |
|   }
 | |
|   function injectToFieldInit(fieldPath, expr, before = false) {
 | |
|     if (fieldPath.node.value) {
 | |
|       const value = fieldPath.get("value");
 | |
|       if (before) {
 | |
|         value.insertBefore(expr);
 | |
|       } else {
 | |
|         value.insertAfter(expr);
 | |
|       }
 | |
|     } else {
 | |
|       fieldPath.set("value", t.unaryExpression("void", expr));
 | |
|     }
 | |
|   }
 | |
|   function injectInitialization(classPath, init) {
 | |
|     let firstFieldPath;
 | |
|     let consturctorPath;
 | |
|     for (const el of classPath.get("body.body")) {
 | |
|       if ((el.isClassProperty() || el.isClassPrivateProperty()) && !el.node.static) {
 | |
|         firstFieldPath = el;
 | |
|         break;
 | |
|       }
 | |
|       if (!consturctorPath && el.isClassMethod({
 | |
|         kind: "constructor"
 | |
|       })) {
 | |
|         consturctorPath = el;
 | |
|       }
 | |
|     }
 | |
|     if (firstFieldPath) {
 | |
|       injectToFieldInit(firstFieldPath, init, true);
 | |
|     } else {
 | |
|       (0, _helperCreateClassFeaturesPlugin.injectInitialization)(classPath, consturctorPath, [t.expressionStatement(init)]);
 | |
|     }
 | |
|   }
 | |
|   function getWeakSetId(weakSets, outerClass, reference, name = "", inject) {
 | |
|     let id = weakSets.get(reference.node);
 | |
|     if (!id) {
 | |
|       id = outerClass.scope.generateUidIdentifier(`${name || ""} brandCheck`);
 | |
|       weakSets.set(reference.node, id);
 | |
|       inject(reference, template.expression.ast`${t.cloneNode(id)}.add(this)`);
 | |
|       const newExpr = t.newExpression(t.identifier("WeakSet"), []);
 | |
|       (0, _helperAnnotateAsPure.default)(newExpr);
 | |
|       outerClass.insertBefore(template.ast`var ${id} = ${newExpr}`);
 | |
|     }
 | |
|     return t.cloneNode(id);
 | |
|   }
 | |
|   return {
 | |
|     name: "proposal-private-property-in-object",
 | |
|     inherits: _pluginSyntaxPrivatePropertyInObject.default,
 | |
|     pre() {
 | |
|       (0, _helperCreateClassFeaturesPlugin.enableFeature)(this.file, _helperCreateClassFeaturesPlugin.FEATURES.privateIn, loose);
 | |
|     },
 | |
|     visitor: {
 | |
|       BinaryExpression(path, state) {
 | |
|         const {
 | |
|           node
 | |
|         } = path;
 | |
|         const {
 | |
|           file
 | |
|         } = state;
 | |
|         if (node.operator !== "in") return;
 | |
|         if (!t.isPrivateName(node.left)) return;
 | |
|         const {
 | |
|           name
 | |
|         } = node.left.id;
 | |
|         let privateElement;
 | |
|         const outerClass = path.findParent(path => {
 | |
|           if (!path.isClass()) return false;
 | |
|           privateElement = path.get("body.body").find(({
 | |
|             node
 | |
|           }) =>
 | |
|           t.isPrivate(node) && node.key.id.name === name);
 | |
|           return !!privateElement;
 | |
|         });
 | |
|         if (outerClass.parentPath.scope.path.isPattern()) {
 | |
|           outerClass.replaceWith(template.ast`(() => ${outerClass.node})()`);
 | |
|           return;
 | |
|         }
 | |
|         if (privateElement.node.type === "ClassPrivateMethod") {
 | |
|           if (privateElement.node.static) {
 | |
|             if (outerClass.node.id) {
 | |
|               unshadow(outerClass.node.id.name, outerClass.scope, path.scope);
 | |
|             } else {
 | |
|               outerClass.set("id", path.scope.generateUidIdentifier("class"));
 | |
|             }
 | |
|             path.replaceWith(template.expression.ast`
 | |
|                 ${t.cloneNode(outerClass.node.id)} === ${(0, _helperCreateClassFeaturesPlugin.buildCheckInRHS)(node.right, file)}
 | |
|               `);
 | |
|           } else {
 | |
|             var _outerClass$node$id;
 | |
|             const id = getWeakSetId(classWeakSets, outerClass, outerClass, (_outerClass$node$id = outerClass.node.id) == null ? void 0 : _outerClass$node$id.name, injectInitialization);
 | |
|             path.replaceWith(template.expression.ast`${id}.has(${(0, _helperCreateClassFeaturesPlugin.buildCheckInRHS)(node.right, file)})`);
 | |
|           }
 | |
|         } else {
 | |
| 
 | |
|           const id = getWeakSetId(fieldsWeakSets, outerClass, privateElement, privateElement.node.key.id.name, injectToFieldInit);
 | |
|           path.replaceWith(template.expression.ast`${id}.has(${(0, _helperCreateClassFeaturesPlugin.buildCheckInRHS)(node.right, file)})`);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   };
 | |
| });
 | |
| exports.default = _default;
 | |
| 
 | |
| //# sourceMappingURL=index.js.map
 |