123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- "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)(({
- assertVersion,
- types: t,
- template
- }, {
- loose
- }) => {
- assertVersion(7);
- 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) {
- if (before) {
- fieldPath.get("value").insertBefore(expr);
- } else {
- fieldPath.get("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 = classWeakSets.get(reference.node);
- if (!id) {
- id = outerClass.scope.generateUidIdentifier(`${name || ""} brandCheck`);
- classWeakSets.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) {
- const {
- node
- } = path;
- 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.isMethod()) {
- 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)} === ${path.node.right}
- `);
- } 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(${path.node.right})`);
- }
- } else {
- const id = getWeakSetId(fieldsWeakSets, outerClass, privateElement, privateElement.node.key.id.name, injectToFieldInit);
- path.replaceWith(template.expression.ast`${id}.has(${path.node.right})`);
- }
- }
- }
- };
- });
- exports.default = _default;
|