Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Socket
Sign inDemoInstall

@babel/helper-create-class-features-plugin

Package Overview
Dependencies
Maintainers
4
Versions
109
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@babel/helper-create-class-features-plugin - npm Package Compare versions

Comparing version 7.23.10 to 7.24.0

376

lib/decorators.js

@@ -89,7 +89,4 @@ "use strict";

}
function addProxyAccessorsFor(className, element, originalKey, targetKey, version, isComputed = false) {
const {
static: isStatic
} = element.node;
const thisArg = version === "2023-05" && isStatic ? className : _core.types.thisExpression();
function addProxyAccessorsFor(className, element, originalKey, targetKey, version, isComputed, isStatic) {
const thisArg = (version === "2023-11" || version === "2023-05") && isStatic ? className : _core.types.thisExpression();
const getterBody = _core.types.blockStatement([_core.types.returnStatement(_core.types.memberExpression(_core.types.cloneNode(thisArg), _core.types.cloneNode(targetKey)))]);

@@ -109,3 +106,3 @@ const setterBody = _core.types.blockStatement([_core.types.expressionStatement(_core.types.assignmentExpression("=", _core.types.memberExpression(_core.types.cloneNode(thisArg), _core.types.cloneNode(targetKey)), _core.types.identifier("v")))]);

function extractProxyAccessorsFor(targetKey, version) {
if (version !== "2023-05" && version !== "2023-01") {
if (version !== "2023-11" && version !== "2023-05" && version !== "2023-01") {
return [_core.template.expression.ast`

@@ -136,2 +133,5 @@ function () {

}
function prependExpressionsToStaticBlock(expressions, blockPath) {
blockPath.unshiftContainer("body", _core.types.expressionStatement(maybeSequenceExpression(expressions)));
}
function prependExpressionsToConstructor(expressions, constructorPath) {

@@ -182,2 +182,5 @@ constructorPath.node.body.body.unshift(_core.types.expressionStatement(maybeSequenceExpression(expressions)));

}
function createStaticBlockFromExpressions(expressions) {
return _core.types.staticBlock([_core.types.expressionStatement(maybeSequenceExpression(expressions))]);
}
const FIELD = 0;

@@ -209,15 +212,11 @@ const ACCESSOR = 1;

}
function isDecoratorInfo(info) {
return "decorators" in info;
function toSortedDecoratorInfo(info) {
return [...info.filter(el => el.isStatic && el.kind >= ACCESSOR && el.kind <= SETTER), ...info.filter(el => !el.isStatic && el.kind >= ACCESSOR && el.kind <= SETTER), ...info.filter(el => el.isStatic && el.kind === FIELD), ...info.filter(el => !el.isStatic && el.kind === FIELD)];
}
function filteredOrderedDecoratorInfo(info) {
const filtered = info.filter(isDecoratorInfo);
return [...filtered.filter(el => el.isStatic && el.kind >= ACCESSOR && el.kind <= SETTER), ...filtered.filter(el => !el.isStatic && el.kind >= ACCESSOR && el.kind <= SETTER), ...filtered.filter(el => el.isStatic && el.kind === FIELD), ...filtered.filter(el => !el.isStatic && el.kind === FIELD)];
}
function generateDecorationList(decorators, decoratorsThis, version) {
const decsCount = decorators.length;
const hasOneThis = decoratorsThis.some(Boolean);
const haveOneThis = decoratorsThis.some(Boolean);
const decs = [];
for (let i = 0; i < decsCount; i++) {
if (version === "2023-05" && hasOneThis) {
if ((version === "2023-11" || version === "2023-05") && haveOneThis) {
decs.push(decoratorsThis[i] || _core.types.unaryExpression("void", _core.types.numericLiteral(0)));

@@ -228,18 +227,14 @@ }

return {
hasThis: hasOneThis,
haveThis: haveOneThis,
decs
};
}
function generateDecorationExprs(info, version) {
return _core.types.arrayExpression(filteredOrderedDecoratorInfo(info).map(el => {
const {
decs,
hasThis
} = generateDecorationList(el.decorators, el.decoratorsThis, version);
function generateDecorationExprs(decorationInfo, version) {
return _core.types.arrayExpression(decorationInfo.map(el => {
let flag = el.kind;
if (el.isStatic) {
flag += version === "2023-05" ? STATIC : STATIC_OLD_VERSION;
flag += version === "2023-11" || version === "2023-05" ? STATIC : STATIC_OLD_VERSION;
}
if (hasThis) flag += DECORATORS_HAVE_THIS;
return _core.types.arrayExpression([decs.length === 1 ? decs[0] : _core.types.arrayExpression(decs), _core.types.numericLiteral(flag), el.name, ...(el.privateMethods || [])]);
if (el.decoratorsHaveThis) flag += DECORATORS_HAVE_THIS;
return _core.types.arrayExpression([el.decoratorsArray, _core.types.numericLiteral(flag), el.name, ...(el.privateMethods || [])]);
}));

@@ -249,3 +244,3 @@ }

const localIds = [];
for (const el of filteredOrderedDecoratorInfo(decorationInfo)) {
for (const el of decorationInfo) {
const {

@@ -262,9 +257,6 @@ locals

}
function addCallAccessorsFor(element, key, getId, setId) {
element.insertAfter(_core.types.classPrivateMethod("get", _core.types.cloneNode(key), [], _core.types.blockStatement([_core.types.returnStatement(_core.types.callExpression(_core.types.cloneNode(getId), [_core.types.thisExpression()]))])));
element.insertAfter(_core.types.classPrivateMethod("set", _core.types.cloneNode(key), [_core.types.identifier("v")], _core.types.blockStatement([_core.types.expressionStatement(_core.types.callExpression(_core.types.cloneNode(setId), [_core.types.thisExpression(), _core.types.identifier("v")]))])));
function addCallAccessorsFor(version, element, key, getId, setId, isStatic) {
element.insertAfter(_core.types.classPrivateMethod("get", _core.types.cloneNode(key), [], _core.types.blockStatement([_core.types.returnStatement(_core.types.callExpression(_core.types.cloneNode(getId), version === "2023-11" && isStatic ? [] : [_core.types.thisExpression()]))]), isStatic));
element.insertAfter(_core.types.classPrivateMethod("set", _core.types.cloneNode(key), [_core.types.identifier("v")], _core.types.blockStatement([_core.types.expressionStatement(_core.types.callExpression(_core.types.cloneNode(setId), version === "2023-11" && isStatic ? [_core.types.identifier("v")] : [_core.types.thisExpression(), _core.types.identifier("v")]))]), isStatic));
}
function isNotTsParameter(node) {
return node.type !== "TSParameterProperty";
}
function movePrivateAccessor(element, key, methodLocalVar, isStatic) {

@@ -296,2 +288,11 @@ let params;

}
function createFunctionExpressionFromPrivateMethod(node) {
const {
params,
body,
generator: isGenerator,
async: isAsync
} = node;
return _core.types.functionExpression(undefined, params, body, isGenerator, isAsync);
}
function createSetFunctionNameCall(state, className) {

@@ -303,2 +304,31 @@ return _core.types.callExpression(state.addHelper("setFunctionName"), [_core.types.thisExpression(), className]);

}
function createPrivateBrandCheckClosure(brandName) {
return _core.types.arrowFunctionExpression([_core.types.identifier("_")], _core.types.binaryExpression("in", _core.types.cloneNode(brandName), _core.types.identifier("_")));
}
function usesFunctionContext(expression) {
try {
_core.types.traverseFast(expression, node => {
if (_core.types.isThisExpression(node) || _core.types.isSuper(node) || _core.types.isIdentifier(node, {
name: "arguments"
}) || _core.types.isMetaProperty(node) && node.meta.name !== "import") {
throw null;
}
});
return false;
} catch (_unused) {
return true;
}
}
function usesPrivateField(expression) {
try {
_core.types.traverseFast(expression, node => {
if (_core.types.isPrivateName(node)) {
throw null;
}
});
return false;
} catch (_unused2) {
return true;
}
}
function checkPrivateMethodUpdateError(path, decoratedPrivateMethods) {

@@ -324,5 +354,8 @@ const privateNameVisitor = (0, _fields.privateNameVisitorFactory)({

function transformClass(path, state, constantSuper, version, className, propertyVisitor) {
var _classDecorationsId;
const body = path.get("body.body");
const classDecorators = path.node.decorators;
let hasElementDecorators = false;
let hasComputedKeysSideEffects = false;
let elemDecsUseFnContext = false;
const generateClassPrivateUid = createLazyPrivateUidGeneratorForClass(path);

@@ -352,2 +385,5 @@ const assignments = [];

propertyVisitor.ClassAccessorProperty(element, state);
if (version === "2023-11") {
break;
}
default:

@@ -364,2 +400,3 @@ if (element.node.static) {

hasElementDecorators = true;
elemDecsUseFnContext || (elemDecsUseFnContext = element.node.decorators.some(usesFunctionContext));
} else if (element.node.type === "ClassAccessorProperty") {

@@ -377,4 +414,7 @@ propertyVisitor.ClassAccessorProperty(element, state);

const [newPath] = element.replaceWith(newField);
addProxyAccessorsFor(path.node.id, newPath, computed && !keyPath.isConstantExpression() ? memoiseExpression(createToPropertyKeyCall(state, key), "computedKey") : key, newId, version, computed);
addProxyAccessorsFor(path.node.id, newPath, computed && !keyPath.isConstantExpression() ? memoiseExpression(createToPropertyKeyCall(state, key), "computedKey") : key, newId, version, computed, isStatic);
}
if ("computed" in element.node && element.node.computed) {
hasComputedKeysSideEffects || (hasComputedKeysSideEffects = !scopeParent.isStatic(element.node.key));
}
}

@@ -392,38 +432,32 @@ if (!classDecorators && !hasElementDecorators) {

let classInitLocal, classIdLocal;
const decoratorsThis = new Map();
const maybeExtractDecorators = (decorators, memoiseInPlace) => {
let needMemoise = false;
for (const decorator of decorators) {
const {
expression
} = decorator;
if (version === "2023-05" && _core.types.isMemberExpression(expression)) {
let object;
if (_core.types.isSuper(expression.object) || _core.types.isThisExpression(expression.object)) {
needMemoise = true;
if (memoiseInPlace) {
object = memoiseExpression(_core.types.thisExpression(), "obj");
} else {
object = _core.types.thisExpression();
}
let decoratorReceiverId = null;
function handleDecoratorExpressions(expressions) {
let hasSideEffects = false;
let usesFnContext = false;
const decoratorsThis = [];
for (const expression of expressions) {
let object;
if ((version === "2023-11" || version === "2023-05") && _core.types.isMemberExpression(expression)) {
if (_core.types.isSuper(expression.object)) {
object = _core.types.thisExpression();
} else if (scopeParent.isStatic(expression.object)) {
object = _core.types.cloneNode(expression.object);
} else {
if (!scopeParent.isStatic(expression.object)) {
needMemoise = true;
if (memoiseInPlace) {
expression.object = memoiseExpression(expression.object, "obj");
}
}
object = _core.types.cloneNode(expression.object);
var _decoratorReceiverId;
(_decoratorReceiverId = decoratorReceiverId) != null ? _decoratorReceiverId : decoratorReceiverId = scopeParent.generateDeclaredUidIdentifier("obj");
object = _core.types.assignmentExpression("=", _core.types.cloneNode(decoratorReceiverId), expression.object);
expression.object = _core.types.cloneNode(decoratorReceiverId);
}
decoratorsThis.set(decorator, object);
}
if (!scopeParent.isStatic(expression)) {
needMemoise = true;
if (memoiseInPlace) {
decorator.expression = memoiseExpression(expression, "dec");
}
}
decoratorsThis.push(object);
hasSideEffects || (hasSideEffects = !scopeParent.isStatic(expression));
usesFnContext || (usesFnContext = usesFunctionContext(expression));
}
return needMemoise && !memoiseInPlace;
};
return {
hasSideEffects,
usesFnContext,
decoratorsThis
};
}
const willExtractSomeElemDecs = hasComputedKeysSideEffects || elemDecsUseFnContext || version !== "2023-11";
let needsDeclaraionForClassBinding = false;

@@ -441,10 +475,15 @@ let classDecorationsFlag = 0;

path.node.decorators = null;
const needMemoise = maybeExtractDecorators(classDecorators, false);
const decoratorExpressions = classDecorators.map(el => el.expression);
const classDecsUsePrivateName = decoratorExpressions.some(usesPrivateField);
const {
hasThis,
hasSideEffects,
decoratorsThis
} = handleDecoratorExpressions(decoratorExpressions);
const {
haveThis,
decs
} = generateDecorationList(classDecorators.map(el => el.expression), classDecorators.map(dec => decoratorsThis.get(dec)), version);
classDecorationsFlag = hasThis ? 1 : 0;
} = generateDecorationList(decoratorExpressions, decoratorsThis, version);
classDecorationsFlag = haveThis ? 1 : 0;
classDecorations = decs;
if (needMemoise) {
if (hasSideEffects && willExtractSomeElemDecs || classDecsUsePrivateName) {
classDecorationsId = memoiseExpression(_core.types.arrayExpression(classDecorations), "classDecs");

@@ -460,10 +499,15 @@ }

let needsInstancePrivateBrandCheck = false;
let fieldInitializerAssignments = [];
let fieldInitializerExpressions = [];
let staticFieldInitializerExpressions = [];
if (hasElementDecorators) {
if (protoInitLocal) {
const protoInitCall = _core.types.callExpression(_core.types.cloneNode(protoInitLocal), [_core.types.thisExpression()]);
fieldInitializerAssignments.push(protoInitCall);
fieldInitializerExpressions.push(protoInitCall);
}
for (const element of body) {
if (!isClassDecoratableElementPath(element)) {
if (staticFieldInitializerExpressions.length > 0 && element.isStaticBlock()) {
prependExpressionsToStaticBlock(staticFieldInitializerExpressions, element);
staticFieldInitializerExpressions = [];
}
continue;

@@ -474,8 +518,30 @@ }

} = element;
const decorators = element.node.decorators;
const decorators = node.decorators;
const hasDecorators = !!(decorators != null && decorators.length);
const isComputed = "computed" in node && node.computed;
let name = "computedKey";
if (node.key.type === "PrivateName") {
name = node.key.id.name;
} else if (!isComputed && node.key.type === "Identifier") {
name = node.key.name;
}
let decoratorsArray;
let decoratorsHaveThis;
if (hasDecorators) {
maybeExtractDecorators(decorators, true);
const decoratorExpressions = decorators.map(d => d.expression);
const {
hasSideEffects,
usesFnContext,
decoratorsThis
} = handleDecoratorExpressions(decoratorExpressions);
const {
decs,
haveThis
} = generateDecorationList(decoratorExpressions, decoratorsThis, version);
decoratorsHaveThis = haveThis;
decoratorsArray = decs.length === 1 ? decs[0] : _core.types.arrayExpression(decs);
if (usesFnContext || hasSideEffects && willExtractSomeElemDecs) {
decoratorsArray = memoiseExpression(decoratorsArray, name + "Decs");
}
}
const isComputed = "computed" in element.node && element.node.computed;
if (isComputed) {

@@ -486,14 +552,8 @@ if (!element.get("key").isConstantExpression()) {

}
const kind = getElementKind(element);
const {
key
key,
static: isStatic
} = node;
const isPrivate = key.type === "PrivateName";
const isStatic = element.node.static;
let name = "computedKey";
if (isPrivate) {
name = key.id.name;
} else if (!isComputed && key.type === "Identifier") {
name = key.name;
}
const kind = getElementKind(element);
if (isPrivate && !isStatic) {

@@ -512,4 +572,4 @@ if (hasDecorators) {

}
let locals;
if (hasDecorators) {
let locals;
let privateMethods;

@@ -520,3 +580,3 @@ if (kind === ACCESSOR) {

} = element.node;
const params = [_core.types.thisExpression()];
const params = version === "2023-11" && isStatic ? [] : [_core.types.thisExpression()];
if (value) {

@@ -534,7 +594,7 @@ params.push(_core.types.cloneNode(value));

const setId = newPath.scope.parent.generateDeclaredUidIdentifier(`set_${name}`);
addCallAccessorsFor(newPath, key, getId, setId);
addCallAccessorsFor(version, newPath, key, getId, setId, isStatic);
locals = [newFieldInitId, getId, setId];
} else {
addProxyAccessorsFor(path.node.id, newPath, key, newId, version, isComputed);
locals = newFieldInitId;
addProxyAccessorsFor(path.node.id, newPath, key, newId, version, isComputed, isStatic);
locals = [newFieldInitId];
}

@@ -544,4 +604,6 @@ } else if (kind === FIELD) {

const valuePath = element.get("value");
valuePath.replaceWith(_core.types.callExpression(_core.types.cloneNode(initId), [_core.types.thisExpression(), valuePath.node].filter(v => v)));
locals = initId;
const args = version === "2023-11" && isStatic ? [] : [_core.types.thisExpression()];
if (valuePath.node) args.push(valuePath.node);
valuePath.replaceWith(_core.types.callExpression(_core.types.cloneNode(initId), args));
locals = [initId];
if (isPrivate) {

@@ -551,3 +613,4 @@ privateMethods = extractProxyAccessorsFor(key, version);

} else if (isPrivate) {
locals = element.scope.parent.generateDeclaredUidIdentifier(`call_${name}`);
const callId = element.scope.parent.generateDeclaredUidIdentifier(`call_${name}`);
locals = [callId];
const replaceSupers = new _helperReplaceSupers.default({

@@ -562,13 +625,8 @@ constantSuper,

replaceSupers.replace();
const {
params,
body,
async: isAsync
} = element.node;
privateMethods = [_core.types.functionExpression(undefined, params.filter(isNotTsParameter), body, isAsync)];
privateMethods = [createFunctionExpressionFromPrivateMethod(element.node)];
if (kind === GETTER || kind === SETTER) {
movePrivateAccessor(element, _core.types.cloneNode(key), _core.types.cloneNode(locals), isStatic);
movePrivateAccessor(element, _core.types.cloneNode(key), _core.types.cloneNode(callId), isStatic);
} else {
const node = element.node;
path.node.body.body.unshift(_core.types.classPrivateProperty(key, _core.types.cloneNode(locals), [], node.static));
path.node.body.body.unshift(_core.types.classPrivateProperty(key, _core.types.cloneNode(callId), [], node.static));
decoratedPrivateMethods.add(key.id.name);

@@ -590,4 +648,4 @@ element.remove();

kind,
decorators: decorators.map(d => d.expression),
decoratorsThis: decorators.map(d => decoratorsThis.get(d)),
decoratorsArray,
decoratorsHaveThis,
name: nameExpr,

@@ -602,23 +660,44 @@ isStatic,

}
if (fieldInitializerAssignments.length > 0 && !isStatic && (kind === FIELD || kind === ACCESSOR)) {
prependExpressionsToFieldInitializer(fieldInitializerAssignments, element);
fieldInitializerAssignments = [];
if (fieldInitializerExpressions.length > 0 && !isStatic && (kind === FIELD || kind === ACCESSOR)) {
prependExpressionsToFieldInitializer(fieldInitializerExpressions, element);
fieldInitializerExpressions = [];
}
if (staticFieldInitializerExpressions.length > 0 && isStatic && (kind === FIELD || kind === ACCESSOR)) {
prependExpressionsToFieldInitializer(staticFieldInitializerExpressions, element);
staticFieldInitializerExpressions = [];
}
if (hasDecorators && version === "2023-11") {
if (kind === FIELD || kind === ACCESSOR) {
const initExtraId = scopeParent.generateDeclaredUidIdentifier(`init_extra_${name}`);
locals.push(initExtraId);
const initExtraCall = _core.types.callExpression(_core.types.cloneNode(initExtraId), isStatic ? [] : [_core.types.thisExpression()]);
if (!isStatic) {
fieldInitializerExpressions.push(initExtraCall);
} else {
staticFieldInitializerExpressions.push(initExtraCall);
}
}
}
}
}
if (fieldInitializerAssignments.length > 0) {
if (fieldInitializerExpressions.length > 0) {
const isDerivedClass = !!path.node.superClass;
if (constructorPath) {
if (isDerivedClass) {
insertExpressionsAfterSuperCallAndOptimize(fieldInitializerAssignments, constructorPath, protoInitLocal);
insertExpressionsAfterSuperCallAndOptimize(fieldInitializerExpressions, constructorPath, protoInitLocal);
} else {
prependExpressionsToConstructor(fieldInitializerAssignments, constructorPath);
prependExpressionsToConstructor(fieldInitializerExpressions, constructorPath);
}
} else {
path.node.body.body.unshift(createConstructorFromExpressions(fieldInitializerAssignments, isDerivedClass));
path.node.body.body.unshift(createConstructorFromExpressions(fieldInitializerExpressions, isDerivedClass));
}
fieldInitializerAssignments = [];
fieldInitializerExpressions = [];
}
const elementDecorations = generateDecorationExprs(elementDecoratorInfo, version);
const elementLocals = extractElementLocalAssignments(elementDecoratorInfo);
if (staticFieldInitializerExpressions.length > 0) {
path.node.body.body.push(createStaticBlockFromExpressions(staticFieldInitializerExpressions));
staticFieldInitializerExpressions = [];
}
const sortedElementDecoratorInfo = toSortedDecoratorInfo(elementDecoratorInfo);
const elementDecorations = generateDecorationExprs(version === "2023-11" ? elementDecoratorInfo : sortedElementDecoratorInfo, version);
const elementLocals = extractElementLocalAssignments(sortedElementDecoratorInfo);
if (protoInitLocal) {

@@ -637,6 +716,5 @@ elementLocals.push(protoInitLocal);

const statics = [];
let staticBlocks = [];
path.get("body.body").forEach(element => {
if (element.isStaticBlock()) {
staticBlocks.push(element.node);
staticFieldInitializerExpressions.push(staticBlockToIIFE(element.node));
element.remove();

@@ -647,7 +725,5 @@ return;

if ((isProperty || element.isClassPrivateMethod()) && element.node.static) {
if (isProperty && staticBlocks.length > 0) {
const allValues = staticBlocks.map(staticBlockToIIFE);
if (element.node.value) allValues.push(element.node.value);
element.node.value = maybeSequenceExpression(allValues);
staticBlocks = [];
if (isProperty && staticFieldInitializerExpressions.length > 0) {
prependExpressionsToFieldInitializer(staticFieldInitializerExpressions, element);
staticFieldInitializerExpressions = [];
}

@@ -659,3 +735,3 @@ element.node.static = false;

});
if (statics.length > 0 || staticBlocks.length > 0) {
if (statics.length > 0 || staticFieldInitializerExpressions.length > 0) {
const staticsClass = _core.template.expression.ast`

@@ -667,4 +743,4 @@ class extends ${state.addHelper("identity")} {}

const newExpr = _core.types.newExpression(staticsClass, []);
if (staticBlocks.length > 0) {
constructorBody.push(...staticBlocks.map(staticBlockToIIFE));
if (staticFieldInitializerExpressions.length > 0) {
constructorBody.push(...staticFieldInitializerExpressions);
}

@@ -677,3 +753,3 @@ if (classInitCall) {

constructorBody.unshift(_core.types.callExpression(_core.types.super(), [_core.types.cloneNode(classIdLocal)]));
staticsClass.body.body.push(_core.types.classMethod("constructor", _core.types.identifier("constructor"), [], _core.types.blockStatement([_core.types.expressionStatement(_core.types.sequenceExpression(constructorBody))])));
staticsClass.body.body.push(createConstructorFromExpressions(constructorBody, false));
} else {

@@ -691,3 +767,3 @@ newExpr.arguments.push(_core.types.cloneNode(classIdLocal));

} = originalClass;
if (superClass && version === "2023-05") {
if (superClass && (version === "2023-11" || version === "2023-05")) {
const id = path.scope.maybeGenerateMemoised(superClass);

@@ -699,3 +775,3 @@ if (id) {

}
originalClass.body.body.unshift(_core.types.staticBlock([_core.types.expressionStatement(createLocalsAssignment(elementLocals, classLocals, elementDecorations, classDecorationsId ? _core.types.cloneNode(classDecorationsId) : _core.types.arrayExpression(classDecorations), _core.types.numericLiteral(classDecorationsFlag), needsInstancePrivateBrandCheck ? lastInstancePrivateName : null, typeof className === "object" ? className : undefined, _core.types.cloneNode(superClass), state, version)), staticInitLocal && _core.types.expressionStatement(_core.types.callExpression(_core.types.cloneNode(staticInitLocal), [_core.types.thisExpression()]))].filter(Boolean)));
originalClass.body.body.unshift(_core.types.staticBlock([_core.types.expressionStatement(createLocalsAssignment(elementLocals, classLocals, elementDecorations, (_classDecorationsId = classDecorationsId) != null ? _classDecorationsId : _core.types.arrayExpression(classDecorations), _core.types.numericLiteral(classDecorationsFlag), needsInstancePrivateBrandCheck ? lastInstancePrivateName : null, typeof className === "object" ? className : undefined, _core.types.cloneNode(superClass), state, version)), staticInitLocal && _core.types.expressionStatement(_core.types.callExpression(_core.types.cloneNode(staticInitLocal), [_core.types.thisExpression()]))].filter(Boolean)));
path.insertBefore(assignments.map(expr => _core.types.expressionStatement(expr)));

@@ -711,20 +787,39 @@ if (needsDeclaraionForClassBinding) {

}
function createLocalsAssignment(elementLocals, classLocals, elementDecorations, classDecorations, classDecorationsFlag, maybePrivateBranName, setClassName, superClass, state, version) {
function createLocalsAssignment(elementLocals, classLocals, elementDecorations, classDecorations, classDecorationsFlag, maybePrivateBrandName, setClassName, superClass, state, version) {
let lhs, rhs;
const args = [setClassName ? createSetFunctionNameCall(state, setClassName) : _core.types.thisExpression(), elementDecorations, classDecorations];
const args = [setClassName ? createSetFunctionNameCall(state, setClassName) : _core.types.thisExpression(), classDecorations, elementDecorations];
{
if (version !== "2023-11") {
args.splice(1, 2, elementDecorations, classDecorations);
}
if (version === "2021-12" || version === "2022-03" && !state.availableHelper("applyDecs2203R")) {
const lhs = _core.types.arrayPattern([...elementLocals, ...classLocals]);
const rhs = _core.types.callExpression(state.addHelper(version === "2021-12" ? "applyDecs" : "applyDecs2203"), args);
lhs = _core.types.arrayPattern([...elementLocals, ...classLocals]);
rhs = _core.types.callExpression(state.addHelper(version === "2021-12" ? "applyDecs" : "applyDecs2203"), args);
return _core.types.assignmentExpression("=", lhs, rhs);
} else if (version === "2022-03") {
rhs = _core.types.callExpression(state.addHelper("applyDecs2203R"), args);
} else if (version === "2023-01") {
if (maybePrivateBrandName) {
args.push(createPrivateBrandCheckClosure(maybePrivateBrandName));
}
rhs = _core.types.callExpression(state.addHelper("applyDecs2301"), args);
} else if (version === "2023-05") {
if (maybePrivateBrandName || superClass || classDecorationsFlag.value !== 0) {
args.push(classDecorationsFlag);
}
if (maybePrivateBrandName) {
args.push(createPrivateBrandCheckClosure(maybePrivateBrandName));
} else if (superClass) {
args.push(_core.types.unaryExpression("void", _core.types.numericLiteral(0)));
}
if (superClass) args.push(superClass);
rhs = _core.types.callExpression(state.addHelper("applyDecs2305"), args);
}
}
if (version === "2023-05") {
if (maybePrivateBranName || superClass || classDecorationsFlag.value !== 0) {
if (version === "2023-11") {
if (maybePrivateBrandName || superClass || classDecorationsFlag.value !== 0) {
args.push(classDecorationsFlag);
}
if (maybePrivateBranName) {
args.push(_core.template.expression.ast`
_ => ${_core.types.cloneNode(maybePrivateBranName)} in _
`);
if (maybePrivateBrandName) {
args.push(createPrivateBrandCheckClosure(maybePrivateBrandName));
} else if (superClass) {

@@ -734,12 +829,3 @@ args.push(_core.types.unaryExpression("void", _core.types.numericLiteral(0)));

if (superClass) args.push(superClass);
rhs = _core.types.callExpression(state.addHelper("applyDecs2305"), args);
} else if (version === "2023-01") {
if (maybePrivateBranName) {
args.push(_core.template.expression.ast`
_ => ${_core.types.cloneNode(maybePrivateBranName)} in _
`);
}
rhs = _core.types.callExpression(state.addHelper("applyDecs2301"), args);
} else {
rhs = _core.types.callExpression(state.addHelper("applyDecs2203R"), args);
rhs = _core.types.callExpression(state.addHelper("applyDecs2311"), args);
}

@@ -930,3 +1016,3 @@ if (elementLocals.length > 0) {

{
if (version === "2023-05" || version === "2023-01") {
if (version === "2023-11" || version === "2023-05" || version === "2023-01") {
assertVersion("^7.21.0");

@@ -933,0 +1019,0 @@ } else if (version === "2021-12") {

@@ -50,3 +50,3 @@ "use strict";

if (resolvedLoose === !loose) {
throw new Error("'loose' mode configuration must be the same for @babel/plugin-transform-class-properties, " + "@babel/plugin-transform-private-methods and " + "@babel/plugin-transform-private-property-in-object (when they are enabled).");
throw new Error("'loose' mode configuration must be the same for @babel/plugin-transform-class-properties, " + "@babel/plugin-transform-private-methods and " + "@babel/plugin-transform-private-property-in-object (when they are enabled)." + "\n\n" + getBabelShowConfigForHint(file));
} else {

@@ -63,3 +63,3 @@ resolvedLoose = loose;

setLoose(file, mask, resolvedLoose);
console.warn(`Though the "loose" option was set to "${!resolvedLoose}" in your @babel/preset-env ` + `config, it will not be used for ${name} since the "loose" mode option was set to ` + `"${resolvedLoose}" for ${higherPriorityPluginName}.\nThe "loose" option must be the ` + `same for @babel/plugin-transform-class-properties, @babel/plugin-transform-private-methods ` + `and @babel/plugin-transform-private-property-in-object (when they are enabled): you can ` + `silence this warning by explicitly adding\n` + `\t["${name}", { "loose": ${resolvedLoose} }]\n` + `to the "plugins" section of your Babel config.`);
console.warn(`Though the "loose" option was set to "${!resolvedLoose}" in your @babel/preset-env ` + `config, it will not be used for ${name} since the "loose" mode option was set to ` + `"${resolvedLoose}" for ${higherPriorityPluginName}.\nThe "loose" option must be the ` + `same for @babel/plugin-transform-class-properties, @babel/plugin-transform-private-methods ` + `and @babel/plugin-transform-private-property-in-object (when they are enabled): you can ` + `silence this warning by explicitly adding\n` + `\t["${name}", { "loose": ${resolvedLoose} }]\n` + `to the "plugins" section of your Babel config.` + "\n\n" + getBabelShowConfigForHint(file));
}

@@ -69,2 +69,17 @@ }

}
function getBabelShowConfigForHint(file) {
let {
filename
} = file.opts;
if (!filename || filename === "unknown") {
filename = "[name of the input file]";
}
return `\
If you already set the same 'loose' mode for these plugins in your config, it's possible that they \
are enabled multiple times with different options.
You can re-run Babel with the BABEL_SHOW_CONFIG_FOR environment variable to show the loaded \
configuration:
\tnpx cross-env BABEL_SHOW_CONFIG_FOR=${filename} <your build command>
See https://babeljs.io/docs/configuration#print-effective-configs for more info.`;
}
function hasFeature(file, feature) {

@@ -71,0 +86,0 @@ return !!(file.get(featuresKey) & feature);

@@ -20,4 +20,11 @@ "use strict";

var ts = require("./typescript.js");
function buildPrivateNamesMap(props) {
{
var newHelpers = file => {
;
return file.availableHelper("classPrivateFieldGet2");
};
}
function buildPrivateNamesMap(className, privateFieldsAsSymbolsOrProperties, props, file) {
const privateNamesMap = new Map();
let classBrandId;
for (const prop of props) {

@@ -28,12 +35,52 @@ if (prop.isPrivate()) {

} = prop.node.key.id;
const update = privateNamesMap.has(name) ? privateNamesMap.get(name) : {
id: prop.scope.generateUidIdentifier(name),
static: prop.node.static,
method: !prop.isProperty()
};
let update = privateNamesMap.get(name);
if (!update) {
const isMethod = !prop.isProperty();
const isStatic = prop.node.static;
let initAdded = false;
let id;
if (!privateFieldsAsSymbolsOrProperties && newHelpers(file) && isMethod && !isStatic) {
var _classBrandId;
initAdded = !!classBrandId;
(_classBrandId = classBrandId) != null ? _classBrandId : classBrandId = prop.scope.generateUidIdentifier(`${className}_brand`);
id = classBrandId;
} else {
id = prop.scope.generateUidIdentifier(name);
}
update = {
id,
static: isStatic,
method: isMethod,
initAdded
};
privateNamesMap.set(name, update);
}
if (prop.isClassPrivateMethod()) {
if (prop.node.kind === "get") {
update.getId = prop.scope.generateUidIdentifier(`get_${name}`);
const {
body
} = prop.node.body;
let $;
if (body.length === 1 && _core.types.isReturnStatement($ = body[0]) && _core.types.isCallExpression($ = $.argument) && $.arguments.length === 1 && _core.types.isThisExpression($.arguments[0]) && _core.types.isIdentifier($ = $.callee)) {
update.getId = _core.types.cloneNode($);
update.getterDeclared = true;
} else {
update.getId = prop.scope.generateUidIdentifier(`get_${name}`);
}
} else if (prop.node.kind === "set") {
update.setId = prop.scope.generateUidIdentifier(`set_${name}`);
const {
params
} = prop.node;
const {
body
} = prop.node.body;
let $;
if (body.length === 1 && _core.types.isExpressionStatement($ = body[0]) && _core.types.isCallExpression($ = $.expression) && $.arguments.length === 2 && _core.types.isThisExpression($.arguments[0]) && _core.types.isIdentifier($.arguments[1], {
name: params[0].name
}) && _core.types.isIdentifier($ = $.callee)) {
update.setId = _core.types.cloneNode($);
update.setterDeclared = true;
} else {
update.setId = prop.scope.generateUidIdentifier(`set_${name}`);
}
} else if (prop.node.kind === "method") {

@@ -50,2 +97,3 @@ update.methodId = prop.scope.generateUidIdentifier(name);

const initNodes = [];
const injectedIds = new Set();
for (const [name, value] of privateNamesMap) {

@@ -58,3 +106,3 @@ const {

} = value;
const isAccessor = getId || setId;
const isGetterOrSetter = getId || setId;
const id = _core.types.cloneNode(value.id);

@@ -67,6 +115,10 @@ let init;

} else if (!isStatic) {
init = _core.types.newExpression(_core.types.identifier(!isMethod || isAccessor ? "WeakMap" : "WeakSet"), []);
if (injectedIds.has(id.name)) continue;
injectedIds.add(id.name);
init = _core.types.newExpression(_core.types.identifier(isMethod && (!isGetterOrSetter || newHelpers(state)) ? "WeakSet" : "WeakMap"), []);
}
if (init) {
(0, _helperAnnotateAsPure.default)(init);
if (!privateFieldsAsSymbols) {
(0, _helperAnnotateAsPure.default)(init);
}
initNodes.push(_core.template.statement.ast`var ${id} = ${init}`);

@@ -189,2 +241,16 @@ }

});
function readOnlyError(file, name) {
return _core.types.callExpression(file.addHelper("readOnlyError"), [_core.types.stringLiteral(`#${name}`)]);
}
function writeOnlyError(file, name) {
if (!file.availableHelper("writeOnlyError")) {
console.warn(`@babel/helpers is outdated, update it to silence this warning.`);
return _core.types.buildUndefinedNode();
}
return _core.types.callExpression(file.addHelper("writeOnlyError"), [_core.types.stringLiteral(`#${name}`)]);
}
function buildStaticPrivateFieldAccess(expr, noUninitializedPrivateFieldAccess) {
if (noUninitializedPrivateFieldAccess) return expr;
return _core.types.memberExpression(expr, _core.types.identifier("_"));
}
const privateNameHandlerSpec = {

@@ -218,3 +284,4 @@ memoise(member, count) {

file,
innerBinding
innerBinding,
noUninitializedPrivateFieldAccess
} = this;

@@ -232,20 +299,49 @@ const {

} = privateNamesMap.get(name);
const isAccessor = getId || setId;
const isGetterOrSetter = getId || setId;
if (isStatic) {
const helperName = isMethod && !isAccessor ? "classStaticPrivateMethodGet" : "classStaticPrivateFieldSpecGet";
unshadow(classRef.name, member.scope, innerBinding);
return _core.types.callExpression(file.addHelper(helperName), [this.receiver(member), _core.types.cloneNode(classRef), _core.types.cloneNode(id)]);
if (!newHelpers(file)) {
const helperName = isMethod && !isGetterOrSetter ? "classStaticPrivateMethodGet" : "classStaticPrivateFieldSpecGet";
return _core.types.callExpression(file.addHelper(helperName), [this.receiver(member), _core.types.cloneNode(classRef), _core.types.cloneNode(id)]);
}
const receiver = this.receiver(member);
const skipCheck = _core.types.isIdentifier(receiver) && receiver.name === classRef.name;
if (!isMethod) {
if (skipCheck) {
return buildStaticPrivateFieldAccess(_core.types.cloneNode(id), noUninitializedPrivateFieldAccess);
}
return buildStaticPrivateFieldAccess(_core.types.callExpression(file.addHelper("assertClassBrand"), [_core.types.cloneNode(classRef), receiver, _core.types.cloneNode(id)]), noUninitializedPrivateFieldAccess);
}
if (getId) {
if (skipCheck) {
return _core.types.callExpression(_core.types.cloneNode(getId), [receiver]);
}
return _core.types.callExpression(file.addHelper("classPrivateGetter"), [_core.types.cloneNode(classRef), receiver, _core.types.cloneNode(getId)]);
}
if (setId) {
const err = _core.types.buildUndefinedNode();
if (skipCheck) return err;
return _core.types.sequenceExpression([_core.types.callExpression(file.addHelper("assertClassBrand"), [_core.types.cloneNode(classRef), receiver]), err]);
}
if (skipCheck) return _core.types.cloneNode(id);
return _core.types.callExpression(file.addHelper("assertClassBrand"), [_core.types.cloneNode(classRef), receiver, _core.types.cloneNode(id)]);
}
if (isMethod) {
if (isAccessor) {
if (!getId && setId) {
if (file.availableHelper("writeOnlyError")) {
return _core.types.sequenceExpression([this.receiver(member), _core.types.callExpression(file.addHelper("writeOnlyError"), [_core.types.stringLiteral(`#${name}`)])]);
}
console.warn(`@babel/helpers is outdated, update it to silence this warning.`);
if (isGetterOrSetter) {
if (!getId) {
return _core.types.sequenceExpression([this.receiver(member), writeOnlyError(file, name)]);
}
return _core.types.callExpression(file.addHelper("classPrivateFieldGet"), [this.receiver(member), _core.types.cloneNode(id)]);
if (!newHelpers(file)) {
return _core.types.callExpression(file.addHelper("classPrivateFieldGet"), [this.receiver(member), _core.types.cloneNode(id)]);
}
return _core.types.callExpression(file.addHelper("classPrivateGetter"), [_core.types.cloneNode(id), this.receiver(member), _core.types.cloneNode(getId)]);
}
return _core.types.callExpression(file.addHelper("classPrivateMethodGet"), [this.receiver(member), _core.types.cloneNode(id), _core.types.cloneNode(methodId)]);
if (!newHelpers(file)) {
return _core.types.callExpression(file.addHelper("classPrivateMethodGet"), [this.receiver(member), _core.types.cloneNode(id), _core.types.cloneNode(methodId)]);
}
return _core.types.callExpression(file.addHelper("assertClassBrand"), [_core.types.cloneNode(id), this.receiver(member), _core.types.cloneNode(methodId)]);
}
if (newHelpers(file)) {
return _core.types.callExpression(file.addHelper("classPrivateFieldGet2"), [_core.types.cloneNode(id), this.receiver(member)]);
}
return _core.types.callExpression(file.addHelper("classPrivateFieldGet"), [this.receiver(member), _core.types.cloneNode(id)]);

@@ -261,3 +357,4 @@ },

privateNamesMap,
file
file,
noUninitializedPrivateFieldAccess
} = this;

@@ -274,13 +371,35 @@ const {

} = privateNamesMap.get(name);
const isAccessor = getId || setId;
const isGetterOrSetter = getId || setId;
if (isStatic) {
const helperName = isMethod && !isAccessor ? "classStaticPrivateMethodSet" : "classStaticPrivateFieldSpecSet";
return _core.types.callExpression(file.addHelper(helperName), [this.receiver(member), _core.types.cloneNode(classRef), _core.types.cloneNode(id), value]);
if (!newHelpers(file)) {
const helperName = isMethod && !isGetterOrSetter ? "classStaticPrivateMethodSet" : "classStaticPrivateFieldSpecSet";
return _core.types.callExpression(file.addHelper(helperName), [this.receiver(member), _core.types.cloneNode(classRef), _core.types.cloneNode(id), value]);
}
const receiver = this.receiver(member);
const skipCheck = _core.types.isIdentifier(receiver) && receiver.name === classRef.name;
if (isMethod && !setId) {
const err = readOnlyError(file, name);
if (skipCheck) return _core.types.sequenceExpression([value, err]);
return _core.types.sequenceExpression([value, _core.types.callExpression(file.addHelper("assertClassBrand"), [_core.types.cloneNode(classRef), receiver]), readOnlyError(file, name)]);
}
if (setId) {
if (skipCheck) {
return _core.types.callExpression(_core.types.cloneNode(setId), [receiver, value]);
}
return _core.types.callExpression(file.addHelper("classPrivateSetter"), [_core.types.cloneNode(classRef), _core.types.cloneNode(setId), receiver, value]);
}
return _core.types.assignmentExpression("=", buildStaticPrivateFieldAccess(_core.types.cloneNode(id), noUninitializedPrivateFieldAccess), skipCheck ? value : _core.types.callExpression(file.addHelper("assertClassBrand"), [_core.types.cloneNode(classRef), receiver, value]));
}
if (isMethod) {
if (setId) {
return _core.types.callExpression(file.addHelper("classPrivateFieldSet"), [this.receiver(member), _core.types.cloneNode(id), value]);
if (!newHelpers(file)) {
return _core.types.callExpression(file.addHelper("classPrivateFieldSet"), [this.receiver(member), _core.types.cloneNode(id), value]);
}
return _core.types.callExpression(file.addHelper("classPrivateSetter"), [_core.types.cloneNode(id), _core.types.cloneNode(setId), this.receiver(member), value]);
}
return _core.types.sequenceExpression([this.receiver(member), value, _core.types.callExpression(file.addHelper("readOnlyError"), [_core.types.stringLiteral(`#${name}`)])]);
return _core.types.sequenceExpression([this.receiver(member), value, readOnlyError(file, name)]);
}
if (newHelpers(file)) {
return _core.types.callExpression(file.addHelper("classPrivateFieldSet2"), [_core.types.cloneNode(id), this.receiver(member), value]);
}
return _core.types.callExpression(file.addHelper("classPrivateFieldSet"), [this.receiver(member), _core.types.cloneNode(id), value]);

@@ -292,3 +411,4 @@ },

privateNamesMap,
file
file,
noUninitializedPrivateFieldAccess
} = this;

@@ -300,13 +420,44 @@ const {

id,
static: isStatic
static: isStatic,
method: isMethod,
setId
} = privateNamesMap.get(name);
if (isStatic) {
try {
var helper = file.addHelper("classStaticPrivateFieldDestructureSet");
} catch (_unused) {
throw new Error("Babel can not transpile `[C.#p] = [0]` with @babel/helpers < 7.13.10, \n" + "please update @babel/helpers to the latest version.");
if (!newHelpers(file)) {
if (isStatic) {
try {
var helper = file.addHelper("classStaticPrivateFieldDestructureSet");
} catch (_unused) {
throw new Error("Babel can not transpile `[C.#p] = [0]` with @babel/helpers < 7.13.10, \n" + "please update @babel/helpers to the latest version.");
}
return _core.types.memberExpression(_core.types.callExpression(helper, [this.receiver(member), _core.types.cloneNode(classRef), _core.types.cloneNode(id)]), _core.types.identifier("value"));
}
return _core.types.memberExpression(_core.types.callExpression(helper, [this.receiver(member), _core.types.cloneNode(classRef), _core.types.cloneNode(id)]), _core.types.identifier("value"));
return _core.types.memberExpression(_core.types.callExpression(file.addHelper("classPrivateFieldDestructureSet"), [this.receiver(member), _core.types.cloneNode(id)]), _core.types.identifier("value"));
}
return _core.types.memberExpression(_core.types.callExpression(file.addHelper("classPrivateFieldDestructureSet"), [this.receiver(member), _core.types.cloneNode(id)]), _core.types.identifier("value"));
if (isMethod && !setId) {
return _core.types.memberExpression(_core.types.sequenceExpression([member.node.object, readOnlyError(file, name)]), _core.types.identifier("_"));
}
if (isStatic && !isMethod) {
const getCall = this.get(member);
if (!noUninitializedPrivateFieldAccess || !_core.types.isCallExpression(getCall)) {
return getCall;
}
const ref = getCall.arguments.pop();
getCall.arguments.push(_core.template.expression.ast`(_) => ${ref} = _`);
return _core.types.memberExpression(_core.types.callExpression(file.addHelper("toSetter"), [getCall]), _core.types.identifier("_"));
}
const setCall = this.set(member, _core.types.identifier("_"));
if (!_core.types.isCallExpression(setCall) || !_core.types.isIdentifier(setCall.arguments[setCall.arguments.length - 1], {
name: "_"
})) {
throw member.buildCodeFrameError("Internal Babel error while compiling this code. This is a Babel bug. " + "Please report it at https://github.com/babel/babel/issues.");
}
let args;
if (_core.types.isMemberExpression(setCall.callee, {
computed: false
}) && _core.types.isIdentifier(setCall.callee.property) && setCall.callee.property.name === "call") {
args = [setCall.callee.object, _core.types.arrayExpression(setCall.arguments.slice(1, -1)), setCall.arguments[0]];
} else {
args = [setCall.callee, _core.types.arrayExpression(setCall.arguments.slice(0, -1))];
}
return _core.types.memberExpression(_core.types.callExpression(file.addHelper("toSetter"), args), _core.types.identifier("_"));
},

@@ -367,2 +518,3 @@ call(member, args) {

privateFieldsAsProperties,
noUninitializedPrivateFieldAccess,
noDocumentAll,

@@ -380,2 +532,3 @@ innerBinding

noDocumentAll,
noUninitializedPrivateFieldAccess,
innerBinding

@@ -421,25 +574,37 @@ }));

const helper = state.addHelper("classPrivateFieldInitSpec");
return inheritPropComments(_core.template.statement.ast`${helper}(
${_core.types.thisExpression()},
${_core.types.cloneNode(id)},
{
writable: true,
value: ${value}
},
)`, prop);
return inheritPropComments(_core.types.expressionStatement(_core.types.callExpression(helper, [_core.types.thisExpression(), _core.types.cloneNode(id), newHelpers(state) ? value : _core.template.expression.ast`{ writable: true, value: ${value} }`])), prop);
}
function buildPrivateStaticFieldInitSpec(prop, privateNamesMap) {
function buildPrivateStaticFieldInitSpec(prop, privateNamesMap, noUninitializedPrivateFieldAccess) {
const privateName = privateNamesMap.get(prop.node.key.id.name);
const {
id,
getId,
setId,
initAdded
} = privateName;
const isAccessor = getId || setId;
if (!prop.isProperty() && (initAdded || !isAccessor)) return;
if (isAccessor) {
privateNamesMap.set(prop.node.key.id.name, Object.assign({}, privateName, {
initAdded: true
}));
const value = noUninitializedPrivateFieldAccess ? prop.node.value : _core.template.expression.ast`{
_: ${prop.node.value || _core.types.buildUndefinedNode()}
}`;
return inheritPropComments(_core.types.variableDeclaration("var", [_core.types.variableDeclarator(_core.types.cloneNode(privateName.id), value)]), prop);
}
{
var buildPrivateStaticFieldInitSpecOld = function (prop, privateNamesMap) {
const privateName = privateNamesMap.get(prop.node.key.id.name);
const {
id,
getId,
setId,
initAdded
} = privateName;
const isGetterOrSetter = getId || setId;
if (!prop.isProperty() && (initAdded || !isGetterOrSetter)) return;
if (isGetterOrSetter) {
privateNamesMap.set(prop.node.key.id.name, Object.assign({}, privateName, {
initAdded: true
}));
return inheritPropComments(_core.template.statement.ast`
var ${_core.types.cloneNode(id)} = {
// configurable is false by default
// enumerable is false by default
// writable is false by default
get: ${getId ? getId.name : prop.scope.buildUndefinedNode()},
set: ${setId ? setId.name : prop.scope.buildUndefinedNode()}
}
`, prop);
}
const value = prop.node.value || prop.scope.buildUndefinedNode();
return inheritPropComments(_core.template.statement.ast`

@@ -449,17 +614,7 @@ var ${_core.types.cloneNode(id)} = {

// enumerable is false by default
// writable is false by default
get: ${getId ? getId.name : prop.scope.buildUndefinedNode()},
set: ${setId ? setId.name : prop.scope.buildUndefinedNode()}
}
writable: true,
value: ${value}
};
`, prop);
}
const value = prop.node.value || prop.scope.buildUndefinedNode();
return inheritPropComments(_core.template.statement.ast`
var ${_core.types.cloneNode(id)} = {
// configurable is false by default
// enumerable is false by default
writable: true,
value: ${value}
};
`, prop);
};
}

@@ -486,4 +641,4 @@ function buildPrivateMethodInitLoose(ref, prop, privateNamesMap) {

}
const isAccessor = getId || setId;
if (isAccessor) {
const isGetterOrSetter = getId || setId;
if (isGetterOrSetter) {
privateNamesMap.set(prop.node.key.id.name, Object.assign({}, privateName, {

@@ -505,11 +660,8 @@ initAdded: true

const privateName = privateNamesMap.get(prop.node.key.id.name);
const {
getId,
setId,
initAdded
} = privateName;
if (initAdded) return;
const isAccessor = getId || setId;
if (isAccessor) {
return buildPrivateAccessorInitialization(ref, prop, privateNamesMap, state);
if (privateName.initAdded) return;
if (!newHelpers(state)) {
const isGetterOrSetter = privateName.getId || privateName.setId;
if (isGetterOrSetter) {
return buildPrivateAccessorInitialization(ref, prop, privateNamesMap, state);
}
}

@@ -590,4 +742,4 @@ return buildPrivateInstanceMethodInitialization(ref, prop, privateNamesMap, state);

if (initAdded) return;
const isAccessor = getId || setId;
if (isAccessor) {
const isGetterOrSetter = getId || setId;
if (isGetterOrSetter) {
privateNamesMap.set(prop.node.key.id.name, Object.assign({}, privateName, {

@@ -615,3 +767,3 @@ initAdded: true

}
function buildPrivateMethodDeclaration(prop, privateNamesMap, privateFieldsAsProperties = false) {
function buildPrivateMethodDeclaration(file, prop, privateNamesMap, privateFieldsAsSymbolsOrProperties = false) {
const privateName = privateNamesMap.get(prop.node.key.id.name);

@@ -633,8 +785,35 @@ const {

} = prop.node;
const isGetter = getId && !getterDeclared && params.length === 0;
const isSetter = setId && !setterDeclared && params.length > 0;
const isGetter = getId && params.length === 0;
const isSetter = setId && params.length > 0;
if (isGetter && getterDeclared || isSetter && setterDeclared) {
privateNamesMap.set(prop.node.key.id.name, Object.assign({}, privateName, {
initAdded: true
}));
return null;
}
if (newHelpers(file) && (isGetter || isSetter) && !privateFieldsAsSymbolsOrProperties) {
const scope = prop.get("body").scope;
const thisArg = scope.generateUidIdentifier("this");
const state = {
thisRef: thisArg,
argumentsPath: []
};
prop.traverse(thisContextVisitor, state);
if (state.argumentsPath.length) {
const argumentsId = scope.generateUidIdentifier("arguments");
scope.push({
id: argumentsId,
init: _core.template.expression.ast`[].slice.call(arguments, 1)`
});
for (const path of state.argumentsPath) {
path.replaceWith(_core.types.cloneNode(argumentsId));
}
}
params.unshift(_core.types.cloneNode(thisArg));
}
let declId = methodId;
if (isGetter) {
privateNamesMap.set(prop.node.key.id.name, Object.assign({}, privateName, {
getterDeclared: true
getterDeclared: true,
initAdded: true
}));

@@ -644,6 +823,7 @@ declId = getId;

privateNamesMap.set(prop.node.key.id.name, Object.assign({}, privateName, {
setterDeclared: true
setterDeclared: true,
initAdded: true
}));
declId = setId;
} else if (isStatic && !privateFieldsAsProperties) {
} else if (isStatic && !privateFieldsAsSymbolsOrProperties) {
declId = id;

@@ -654,2 +834,7 @@ }

const thisContextVisitor = _core.traverse.visitors.merge([{
Identifier(path, state) {
if (state.argumentsPath && path.node.name === "arguments") {
state.argumentsPath.push(path);
}
},
UnaryExpression(path) {

@@ -668,3 +853,3 @@ const {

state.needsClassRef = true;
path.replaceWith(_core.types.cloneNode(state.classRef));
path.replaceWith(_core.types.cloneNode(state.thisRef));
},

@@ -685,3 +870,3 @@ MetaProperty(path) {

state.needsClassRef = true;
path.node.name = state.classRef.name;
path.node.name = state.thisRef.name;
}

@@ -691,5 +876,5 @@ }

function replaceThisContext(path, ref, innerBindingRef) {
var _state$classRef;
var _state$thisRef;
const state = {
classRef: ref,
thisRef: ref,
needsClassRef: false,

@@ -701,3 +886,3 @@ innerBinding: innerBindingRef

}
if (innerBindingRef != null && (_state$classRef = state.classRef) != null && _state$classRef.name && state.classRef.name !== innerBindingRef.name) {
if (innerBindingRef != null && (_state$thisRef = state.thisRef) != null && _state$thisRef.name && state.thisRef.name !== innerBindingRef.name) {
path.traverse(innerReferencesVisitor, state);

@@ -724,3 +909,3 @@ }

}
function buildFieldsInitNodes(ref, superRef, props, privateNamesMap, file, setPublicClassFields, privateFieldsAsProperties, constantSuper, innerBindingRef) {
function buildFieldsInitNodes(ref, superRef, props, privateNamesMap, file, setPublicClassFields, privateFieldsAsSymbolsOrProperties, noUninitializedPrivateFieldAccess, constantSuper, innerBindingRef) {
var _ref, _ref2;

@@ -784,7 +969,11 @@ let classRefFlags = 0;

}
case isStatic && isPrivate && isField && privateFieldsAsProperties:
case isStatic && isPrivate && isField && privateFieldsAsSymbolsOrProperties:
staticNodes.push(buildPrivateFieldInitLoose(_core.types.cloneNode(ref), prop, privateNamesMap));
break;
case isStatic && isPrivate && isField && !privateFieldsAsProperties:
staticNodes.push(buildPrivateStaticFieldInitSpec(prop, privateNamesMap));
case isStatic && isPrivate && isField && !privateFieldsAsSymbolsOrProperties:
if (!newHelpers(file)) {
staticNodes.push(buildPrivateStaticFieldInitSpecOld(prop, privateNamesMap));
} else {
staticNodes.push(buildPrivateStaticFieldInitSpec(prop, privateNamesMap, noUninitializedPrivateFieldAccess));
}
break;

@@ -799,23 +988,25 @@ case isStatic && isPublic && isField && setPublicClassFields:

break;
case isInstance && isPrivate && isField && privateFieldsAsProperties:
case isInstance && isPrivate && isField && privateFieldsAsSymbolsOrProperties:
instanceNodes.push(buildPrivateFieldInitLoose(_core.types.thisExpression(), prop, privateNamesMap));
break;
case isInstance && isPrivate && isField && !privateFieldsAsProperties:
case isInstance && isPrivate && isField && !privateFieldsAsSymbolsOrProperties:
instanceNodes.push(buildPrivateInstanceFieldInitSpec(_core.types.thisExpression(), prop, privateNamesMap, file));
break;
case isInstance && isPrivate && isMethod && privateFieldsAsProperties:
case isInstance && isPrivate && isMethod && privateFieldsAsSymbolsOrProperties:
instanceNodes.unshift(buildPrivateMethodInitLoose(_core.types.thisExpression(), prop, privateNamesMap));
pureStaticNodes.push(buildPrivateMethodDeclaration(prop, privateNamesMap, privateFieldsAsProperties));
pureStaticNodes.push(buildPrivateMethodDeclaration(file, prop, privateNamesMap, privateFieldsAsSymbolsOrProperties));
break;
case isInstance && isPrivate && isMethod && !privateFieldsAsProperties:
case isInstance && isPrivate && isMethod && !privateFieldsAsSymbolsOrProperties:
instanceNodes.unshift(buildPrivateInstanceMethodInitSpec(_core.types.thisExpression(), prop, privateNamesMap, file));
pureStaticNodes.push(buildPrivateMethodDeclaration(prop, privateNamesMap, privateFieldsAsProperties));
pureStaticNodes.push(buildPrivateMethodDeclaration(file, prop, privateNamesMap, privateFieldsAsSymbolsOrProperties));
break;
case isStatic && isPrivate && isMethod && !privateFieldsAsProperties:
staticNodes.unshift(buildPrivateStaticFieldInitSpec(prop, privateNamesMap));
pureStaticNodes.push(buildPrivateMethodDeclaration(prop, privateNamesMap, privateFieldsAsProperties));
case isStatic && isPrivate && isMethod && !privateFieldsAsSymbolsOrProperties:
if (!newHelpers(file)) {
staticNodes.unshift(buildPrivateStaticFieldInitSpecOld(prop, privateNamesMap));
}
pureStaticNodes.push(buildPrivateMethodDeclaration(file, prop, privateNamesMap, privateFieldsAsSymbolsOrProperties));
break;
case isStatic && isPrivate && isMethod && privateFieldsAsProperties:
case isStatic && isPrivate && isMethod && privateFieldsAsSymbolsOrProperties:
staticNodes.unshift(buildPrivateStaticMethodInitLoose(_core.types.cloneNode(ref), prop, file, privateNamesMap));
pureStaticNodes.push(buildPrivateMethodDeclaration(prop, privateNamesMap, privateFieldsAsProperties));
pureStaticNodes.push(buildPrivateMethodDeclaration(file, prop, privateNamesMap, privateFieldsAsSymbolsOrProperties));
break;

@@ -822,0 +1013,0 @@ case isInstance && isPublic && isField && setPublicClassFields:

@@ -51,5 +51,6 @@ "use strict";

}) {
var _api$assumption;
if (feature & _features.FEATURES.decorators) {
{
if (decoratorVersion === "2021-12" || decoratorVersion === "2022-03" || decoratorVersion === "2023-01" || decoratorVersion === "2023-05") {
if (decoratorVersion === "2023-11" || decoratorVersion === "2023-05" || decoratorVersion === "2023-01" || decoratorVersion === "2022-03" || decoratorVersion === "2021-12") {
return (0, _decorators.default)(api, {

@@ -70,2 +71,3 @@ loose

const privateFieldsAsProperties = api.assumption("privateFieldsAsProperties");
const noUninitializedPrivateFieldAccess = (_api$assumption = api.assumption("noUninitializedPrivateFieldAccess")) != null ? _api$assumption : false;
const constantSuper = api.assumption("constantSuper");

@@ -100,8 +102,8 @@ const noDocumentAll = api.assumption("noDocumentAll");

if (typeof file.get(versionKey) === "number") {
file.set(versionKey, "7.23.10");
file.set(versionKey, "7.24.0");
return;
}
}
if (!file.get(versionKey) || _semver.lt(file.get(versionKey), "7.23.10")) {
file.set(versionKey, "7.23.10");
if (!file.get(versionKey) || _semver.lt(file.get(versionKey), "7.24.0")) {
file.set(versionKey, "7.24.0");
}

@@ -114,3 +116,3 @@ },

var _ref;
if (file.get(versionKey) !== "7.23.10") return;
if (file.get(versionKey) !== "7.24.0") return;
if (!(0, _features.shouldTransform)(path, file)) return;

@@ -177,6 +179,7 @@ const pathIsClassDeclaration = path.isClassDeclaration();

const classRefForDefine = (_ref = ref) != null ? _ref : _core.types.cloneNode(innerBinding);
const privateNamesMap = (0, _fields.buildPrivateNamesMap)(props);
const privateNamesMap = (0, _fields.buildPrivateNamesMap)(classRefForDefine.name, privateFieldsAsSymbolsOrProperties != null ? privateFieldsAsSymbolsOrProperties : loose, props, file);
const privateNamesNodes = (0, _fields.buildPrivateNamesNodes)(privateNamesMap, privateFieldsAsProperties != null ? privateFieldsAsProperties : loose, privateFieldsAsSymbols != null ? privateFieldsAsSymbols : false, file);
(0, _fields.transformPrivateNamesUsage)(classRefForDefine, path, privateNamesMap, {
privateFieldsAsProperties: privateFieldsAsSymbolsOrProperties != null ? privateFieldsAsSymbolsOrProperties : loose,
noUninitializedPrivateFieldAccess,
noDocumentAll,

@@ -202,3 +205,3 @@ innerBinding

wrapClass
} = (0, _fields.buildFieldsInitNodes)(ref, path.node.superClass, props, privateNamesMap, file, setPublicClassFields != null ? setPublicClassFields : loose, privateFieldsAsSymbolsOrProperties != null ? privateFieldsAsSymbolsOrProperties : loose, constantSuper != null ? constantSuper : loose, innerBinding));
} = (0, _fields.buildFieldsInitNodes)(ref, path.node.superClass, props, privateNamesMap, file, setPublicClassFields != null ? setPublicClassFields : loose, privateFieldsAsSymbolsOrProperties != null ? privateFieldsAsSymbolsOrProperties : loose, noUninitializedPrivateFieldAccess, constantSuper != null ? constantSuper : loose, innerBinding));
}

@@ -233,3 +236,3 @@ }

{
if (file.get(versionKey) !== "7.23.10") return;
if (file.get(versionKey) !== "7.24.0") return;
const decl = path.get("declaration");

@@ -236,0 +239,0 @@ if (decl.isClassDeclaration() && (0, _decorators2.hasDecorators)(decl.node)) {

{
"name": "@babel/helper-create-class-features-plugin",
"version": "7.23.10",
"version": "7.24.0",
"author": "The Babel Team (https://babel.dev/team)",

@@ -35,5 +35,5 @@ "license": "MIT",

"devDependencies": {
"@babel/core": "^7.23.9",
"@babel/core": "^7.24.0",
"@babel/helper-plugin-test-runner": "^7.22.5",
"@babel/preset-env": "^7.23.9",
"@babel/preset-env": "^7.24.0",
"@types/charcodes": "^0.2.0",

@@ -40,0 +40,0 @@ "charcodes": "^0.2.0"

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc