Socket
Socket
Sign inDemoInstall

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

Package Overview
Dependencies
Maintainers
4
Versions
107
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.24.0 to 7.24.1

374

lib/decorators.js

@@ -12,2 +12,3 @@ "use strict";

var _fields = require("./fields.js");
var _misc = require("./misc.js");
function incrementId(id, idx = id.length - 1) {

@@ -55,8 +56,9 @@ if (idx === -1) {

function replaceClassWithVar(path, className) {
const id = path.node.id;
const scope = path.scope;
if (path.type === "ClassDeclaration") {
const id = path.node.id;
const className = id.name;
const varId = path.scope.generateUidIdentifierBasedOnNode(id);
const varId = scope.generateUidIdentifierBasedOnNode(id);
const classId = _core.types.identifier(className);
path.scope.rename(className, varId.name);
scope.rename(className, varId.name);
path.get("id").replaceWith(classId);

@@ -69,8 +71,8 @@ return {

let varId;
if (path.node.id) {
className = path.node.id.name;
varId = path.scope.parent.generateDeclaredUidIdentifier(className);
path.scope.rename(className, varId.name);
if (id) {
className = id.name;
varId = generateLetUidIdentifier(scope.parent, className);
scope.rename(className, varId.name);
} else {
varId = path.scope.parent.generateDeclaredUidIdentifier(typeof className === "string" ? className : "decorated_class");
varId = generateLetUidIdentifier(scope.parent, typeof className === "string" ? className : "decorated_class");
}

@@ -92,3 +94,3 @@ const newClassExpr = _core.types.classExpression(typeof className === "string" ? _core.types.identifier(className) : null, path.node.superClass, path.node.body);

}
function addProxyAccessorsFor(className, element, originalKey, targetKey, version, isComputed, isStatic) {
function addProxyAccessorsFor(className, element, getterKey, setterKey, targetKey, isComputed, isStatic, version) {
const thisArg = (version === "2023-11" || version === "2023-05") && isStatic ? className : _core.types.thisExpression();

@@ -98,8 +100,8 @@ const getterBody = _core.types.blockStatement([_core.types.returnStatement(_core.types.memberExpression(_core.types.cloneNode(thisArg), _core.types.cloneNode(targetKey)))]);

let getter, setter;
if (originalKey.type === "PrivateName") {
getter = _core.types.classPrivateMethod("get", _core.types.cloneNode(originalKey), [], getterBody, isStatic);
setter = _core.types.classPrivateMethod("set", _core.types.cloneNode(originalKey), [_core.types.identifier("v")], setterBody, isStatic);
if (getterKey.type === "PrivateName") {
getter = _core.types.classPrivateMethod("get", getterKey, [], getterBody, isStatic);
setter = _core.types.classPrivateMethod("set", setterKey, [_core.types.identifier("v")], setterBody, isStatic);
} else {
getter = _core.types.classMethod("get", _core.types.cloneNode(originalKey), [], getterBody, isComputed, isStatic);
setter = _core.types.classMethod("set", _core.types.cloneNode(originalKey), [_core.types.identifier("v")], setterBody, isComputed, isStatic);
getter = _core.types.classMethod("get", getterKey, [], getterBody, isComputed, isStatic);
setter = _core.types.classMethod("set", setterKey, [_core.types.identifier("v")], setterBody, isComputed, isStatic);
}

@@ -127,2 +129,52 @@ element.insertAfter(setter);

}
function getComputedKeyLastElement(path) {
path = (0, _helperSkipTransparentExpressionWrappers.skipTransparentExprWrappers)(path);
if (path.isSequenceExpression()) {
const expressions = path.get("expressions");
return getComputedKeyLastElement(expressions[expressions.length - 1]);
}
return path;
}
function getComputedKeyMemoiser(path) {
const element = getComputedKeyLastElement(path);
if (element.isConstantExpression()) {
return _core.types.cloneNode(path.node);
} else if (element.isIdentifier() && path.scope.hasUid(element.node.name)) {
return _core.types.cloneNode(path.node);
} else if (element.isAssignmentExpression() && element.get("left").isIdentifier()) {
return _core.types.cloneNode(element.node.left);
} else {
throw new Error(`Internal Error: the computed key ${path.toString()} has not yet been memoised.`);
}
}
function prependExpressionsToComputedKey(expressions, fieldPath) {
const key = fieldPath.get("key");
if (key.isSequenceExpression()) {
expressions.push(...key.node.expressions);
} else {
expressions.push(key.node);
}
key.replaceWith(maybeSequenceExpression(expressions));
}
function appendExpressionsToComputedKey(expressions, fieldPath) {
const key = fieldPath.get("key");
const completion = getComputedKeyLastElement(key);
if (completion.isConstantExpression()) {
prependExpressionsToComputedKey(expressions, fieldPath);
} else {
const scopeParent = key.scope.parent;
const maybeAssignment = (0, _misc.memoiseComputedKey)(completion.node, scopeParent, scopeParent.generateUid("computedKey"));
if (!maybeAssignment) {
prependExpressionsToComputedKey(expressions, fieldPath);
} else {
const expressionSequence = [...expressions, _core.types.cloneNode(maybeAssignment.left)];
const completionParent = completion.parentPath;
if (completionParent.isSequenceExpression()) {
completionParent.pushContainer("expressions", expressionSequence);
} else {
completion.replaceWith(maybeSequenceExpression([_core.types.cloneNode(maybeAssignment), ...expressionSequence]));
}
}
}
}
function prependExpressionsToFieldInitializer(expressions, fieldPath) {

@@ -281,2 +333,8 @@ const initializer = fieldPath.get("value");

}
function staticBlockToFunctionClosure(block) {
return _core.types.functionExpression(null, [], _core.types.blockStatement(block.body));
}
function fieldInitializerToClosure(value) {
return _core.types.functionExpression(null, [], _core.types.blockStatement([_core.types.returnStatement(value)]));
}
function maybeSequenceExpression(exprs) {

@@ -305,6 +363,6 @@ if (exprs.length === 0) return _core.types.unaryExpression("void", _core.types.numericLiteral(0));

}
function usesFunctionContext(expression) {
function usesFunctionContextOrYieldAwait(expression) {
try {
_core.types.traverseFast(expression, node => {
if (_core.types.isThisExpression(node) || _core.types.isSuper(node) || _core.types.isIdentifier(node, {
if (_core.types.isThisExpression(node) || _core.types.isSuper(node) || _core.types.isYieldExpression(node) || _core.types.isAwaitExpression(node) || _core.types.isIdentifier(node, {
name: "arguments"

@@ -332,2 +390,32 @@ }) || _core.types.isMetaProperty(node) && node.meta.name !== "import") {

}
function convertToComputedKey(path) {
const {
node
} = path;
node.computed = true;
if (_core.types.isIdentifier(node.key)) {
node.key = _core.types.stringLiteral(node.key.name);
}
}
function hasInstancePrivateAccess(path, privateNames) {
let containsInstancePrivateAccess = false;
if (privateNames.length > 0) {
const privateNameVisitor = (0, _fields.privateNameVisitorFactory)({
PrivateName(path, state) {
if (state.privateNamesMap.has(path.node.id.name)) {
containsInstancePrivateAccess = true;
path.stop();
}
}
});
const privateNamesMap = new Map();
for (const name of privateNames) {
privateNamesMap.set(name, null);
}
path.traverse(privateNameVisitor, {
privateNamesMap: privateNamesMap
});
}
return containsInstancePrivateAccess;
}
function checkPrivateMethodUpdateError(path, decoratedPrivateMethods) {

@@ -352,3 +440,3 @@ const privateNameVisitor = (0, _fields.privateNameVisitorFactory)({

}
function transformClass(path, state, constantSuper, version, className, propertyVisitor) {
function transformClass(path, state, constantSuper, ignoreFunctionLength, className, propertyVisitor, version) {
var _classDecorationsId;

@@ -361,6 +449,6 @@ const body = path.get("body.body");

const generateClassPrivateUid = createLazyPrivateUidGeneratorForClass(path);
const assignments = [];
const classAssignments = [];
const scopeParent = path.scope.parent;
const memoiseExpression = (expression, hint) => {
const localEvaluatedId = scopeParent.generateDeclaredUidIdentifier(hint);
const memoiseExpression = (expression, hint, assignments) => {
const localEvaluatedId = generateLetUidIdentifier(scopeParent, hint);
assignments.push(_core.types.assignmentExpression("=", localEvaluatedId, expression));

@@ -371,2 +459,3 @@ return _core.types.cloneNode(localEvaluatedId);

let staticInitLocal;
const instancePrivateNames = [];
for (const element of body) {

@@ -376,4 +465,8 @@ if (!isClassDecoratableElementPath(element)) {

}
if (isDecorated(element.node)) {
switch (element.node.type) {
const elementNode = element.node;
if (!elementNode.static && _core.types.isPrivateName(elementNode.key)) {
instancePrivateNames.push(elementNode.key.id.name);
}
if (isDecorated(elementNode)) {
switch (elementNode.type) {
case "ClassProperty":

@@ -391,8 +484,8 @@ propertyVisitor.ClassProperty(element, state);

default:
if (element.node.static) {
if (elementNode.static) {
var _staticInitLocal;
(_staticInitLocal = staticInitLocal) != null ? _staticInitLocal : staticInitLocal = scopeParent.generateDeclaredUidIdentifier("initStatic");
(_staticInitLocal = staticInitLocal) != null ? _staticInitLocal : staticInitLocal = generateLetUidIdentifier(scopeParent, "initStatic");
} else {
var _protoInitLocal;
(_protoInitLocal = protoInitLocal) != null ? _protoInitLocal : protoInitLocal = scopeParent.generateDeclaredUidIdentifier("initProto");
(_protoInitLocal = protoInitLocal) != null ? _protoInitLocal : protoInitLocal = generateLetUidIdentifier(scopeParent, "initProto");
}

@@ -402,4 +495,4 @@ break;

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

@@ -411,3 +504,3 @@ const {

computed
} = element.node;
} = elementNode;
const newId = generateClassPrivateUid();

@@ -417,3 +510,11 @@ const newField = generateClassProperty(newId, value, isStatic);

const [newPath] = element.replaceWith(newField);
addProxyAccessorsFor(path.node.id, newPath, computed && !keyPath.isConstantExpression() ? memoiseExpression(createToPropertyKeyCall(state, key), "computedKey") : key, newId, version, computed, isStatic);
let getterKey, setterKey;
if (computed && !keyPath.isConstantExpression()) {
getterKey = (0, _misc.memoiseComputedKey)(createToPropertyKeyCall(state, key), scopeParent, scopeParent.generateUid("computedKey"));
setterKey = _core.types.cloneNode(getterKey.left);
} else {
getterKey = _core.types.cloneNode(key);
setterKey = _core.types.cloneNode(key);
}
addProxyAccessorsFor(path.node.id, newPath, getterKey, setterKey, newId, computed, isStatic, version);
}

@@ -425,6 +526,2 @@ if ("computed" in element.node && element.node.computed) {

if (!classDecorators && !hasElementDecorators) {
if (assignments.length > 0) {
path.insertBefore(assignments.map(expr => _core.types.expressionStatement(expr)));
path.scope.crawl();
}
return;

@@ -450,3 +547,3 @@ }

var _decoratorReceiverId;
(_decoratorReceiverId = decoratorReceiverId) != null ? _decoratorReceiverId : decoratorReceiverId = scopeParent.generateDeclaredUidIdentifier("obj");
(_decoratorReceiverId = decoratorReceiverId) != null ? _decoratorReceiverId : decoratorReceiverId = generateLetUidIdentifier(scopeParent, "obj");
object = _core.types.assignmentExpression("=", _core.types.cloneNode(decoratorReceiverId), expression.object);

@@ -458,3 +555,3 @@ expression.object = _core.types.cloneNode(decoratorReceiverId);

hasSideEffects || (hasSideEffects = !scopeParent.isStatic(expression));
usesFnContext || (usesFnContext = usesFunctionContext(expression));
usesFnContext || (usesFnContext = usesFunctionContextOrYieldAwait(expression));
}

@@ -472,4 +569,5 @@ return {

let classDecorationsId;
let computedKeyAssignments = [];
if (classDecorators) {
classInitLocal = scopeParent.generateDeclaredUidIdentifier("initClass");
classInitLocal = generateLetUidIdentifier(scopeParent, "initClass");
needsDeclaraionForClassBinding = path.isClassDeclaration();

@@ -494,4 +592,29 @@ ({

if (hasSideEffects && willExtractSomeElemDecs || classDecsUsePrivateName) {
classDecorationsId = memoiseExpression(_core.types.arrayExpression(classDecorations), "classDecs");
classDecorationsId = memoiseExpression(_core.types.arrayExpression(classDecorations), "classDecs", classAssignments);
}
if (!hasElementDecorators) {
for (const element of path.get("body.body")) {
const {
node
} = element;
const isComputed = "computed" in node && node.computed;
if (isComputed) {
if (element.isClassProperty({
static: true
})) {
if (!element.get("key").isConstantExpression()) {
const key = node.key;
const maybeAssignment = (0, _misc.memoiseComputedKey)(key, scopeParent, scopeParent.generateUid("computedKey"));
if (maybeAssignment != null) {
node.key = _core.types.cloneNode(maybeAssignment.left);
computedKeyAssignments.push(maybeAssignment);
}
}
} else if (computedKeyAssignments.length > 0) {
prependExpressionsToComputedKey(computedKeyAssignments, element);
computedKeyAssignments = [];
}
}
}
}
} else {

@@ -548,3 +671,3 @@ if (!path.node.id) {

if (usesFnContext || hasSideEffects && willExtractSomeElemDecs) {
decoratorsArray = memoiseExpression(decoratorsArray, name + "Decs");
decoratorsArray = memoiseExpression(decoratorsArray, name + "Decs", computedKeyAssignments);
}

@@ -554,3 +677,14 @@ }

if (!element.get("key").isConstantExpression()) {
node.key = memoiseExpression(createToPropertyKeyCall(state, node.key), "computedKey");
const key = node.key;
const maybeAssignment = (0, _misc.memoiseComputedKey)(hasDecorators ? createToPropertyKeyCall(state, key) : key, scopeParent, scopeParent.generateUid("computedKey"));
if (maybeAssignment != null) {
if (classDecorators && element.isClassProperty({
static: true
})) {
node.key = _core.types.cloneNode(maybeAssignment.left);
computedKeyAssignments.push(maybeAssignment);
} else {
node.key = maybeAssignment;
}
}
}

@@ -580,2 +714,12 @@ }

let privateMethods;
let nameExpr;
if (isComputed) {
nameExpr = getComputedKeyMemoiser(element.get("key"));
} else if (key.type === "PrivateName") {
nameExpr = _core.types.stringLiteral(key.id.name);
} else if (key.type === "Identifier") {
nameExpr = _core.types.stringLiteral(key.name);
} else {
nameExpr = _core.types.cloneNode(key);
}
if (kind === ACCESSOR) {

@@ -590,3 +734,3 @@ const {

const newId = generateClassPrivateUid();
const newFieldInitId = element.scope.parent.generateDeclaredUidIdentifier(`init_${name}`);
const newFieldInitId = generateLetUidIdentifier(scopeParent, `init_${name}`);
const newValue = _core.types.callExpression(_core.types.cloneNode(newFieldInitId), params);

@@ -597,12 +741,12 @@ const newField = generateClassProperty(newId, newValue, isStatic);

privateMethods = extractProxyAccessorsFor(newId, version);
const getId = newPath.scope.parent.generateDeclaredUidIdentifier(`get_${name}`);
const setId = newPath.scope.parent.generateDeclaredUidIdentifier(`set_${name}`);
const getId = generateLetUidIdentifier(scopeParent, `get_${name}`);
const setId = generateLetUidIdentifier(scopeParent, `set_${name}`);
addCallAccessorsFor(version, newPath, key, getId, setId, isStatic);
locals = [newFieldInitId, getId, setId];
} else {
addProxyAccessorsFor(path.node.id, newPath, key, newId, version, isComputed, isStatic);
addProxyAccessorsFor(path.node.id, newPath, _core.types.cloneNode(key), _core.types.isAssignmentExpression(key) ? _core.types.cloneNode(key.left) : _core.types.cloneNode(key), newId, isComputed, isStatic, version);
locals = [newFieldInitId];
}
} else if (kind === FIELD) {
const initId = element.scope.parent.generateDeclaredUidIdentifier(`init_${name}`);
const initId = generateLetUidIdentifier(scopeParent, `init_${name}`);
const valuePath = element.get("value");

@@ -617,3 +761,3 @@ const args = version === "2023-11" && isStatic ? [] : [_core.types.thisExpression()];

} else if (isPrivate) {
const callId = element.scope.parent.generateDeclaredUidIdentifier(`call_${name}`);
const callId = generateLetUidIdentifier(scopeParent, `call_${name}`);
locals = [callId];

@@ -639,12 +783,2 @@ const replaceSupers = new _helperReplaceSupers.default({

}
let nameExpr;
if (isComputed) {
nameExpr = _core.types.cloneNode(key);
} else if (key.type === "PrivateName") {
nameExpr = _core.types.stringLiteral(key.id.name);
} else if (key.type === "Identifier") {
nameExpr = _core.types.stringLiteral(key.name);
} else {
nameExpr = _core.types.cloneNode(key);
}
elementDecoratorInfo.push({

@@ -663,2 +797,10 @@ kind,

}
if (isComputed && computedKeyAssignments.length > 0) {
if (classDecorators && element.isClassProperty({
static: true
})) {} else {
prependExpressionsToComputedKey(computedKeyAssignments, kind === ACCESSOR ? element.getNextSibling() : element);
computedKeyAssignments = [];
}
}
if (fieldInitializerExpressions.length > 0 && !isStatic && (kind === FIELD || kind === ACCESSOR)) {

@@ -674,3 +816,3 @@ prependExpressionsToFieldInitializer(fieldInitializerExpressions, element);

if (kind === FIELD || kind === ACCESSOR) {
const initExtraId = scopeParent.generateDeclaredUidIdentifier(`init_extra_${name}`);
const initExtraId = generateLetUidIdentifier(scopeParent, `init_extra_${name}`);
locals.push(initExtraId);

@@ -687,2 +829,23 @@ const initExtraCall = _core.types.callExpression(_core.types.cloneNode(initExtraId), isStatic ? [] : [_core.types.thisExpression()]);

}
if (computedKeyAssignments.length > 0) {
const elements = path.get("body.body");
let lastComputedElement;
for (let i = elements.length - 1; i >= 0; i--) {
const path = elements[i];
const node = path.node;
if (node.computed) {
if (classDecorators && _core.types.isClassProperty(node, {
static: true
})) {
continue;
}
lastComputedElement = path;
break;
}
}
if (lastComputedElement != null) {
appendExpressionsToComputedKey(computedKeyAssignments, lastComputedElement);
computedKeyAssignments = [];
} else {}
}
if (fieldInitializerExpressions.length > 0) {

@@ -717,3 +880,5 @@ const isDerivedClass = !!path.node.superClass;

const classInitCall = classInitLocal && _core.types.callExpression(_core.types.cloneNode(classInitLocal), []);
let originalClassPath = path;
const originalClass = path.node;
const staticClosures = [];
if (classDecorators) {

@@ -724,9 +889,18 @@ classLocals.push(classIdLocal, classInitLocal);

if (element.isStaticBlock()) {
staticFieldInitializerExpressions.push(staticBlockToIIFE(element.node));
if (hasInstancePrivateAccess(element, instancePrivateNames)) {
const staticBlockClosureId = memoiseExpression(staticBlockToFunctionClosure(element.node), "staticBlock", staticClosures);
staticFieldInitializerExpressions.push(_core.types.callExpression(_core.types.memberExpression(staticBlockClosureId, _core.types.identifier("call")), [_core.types.thisExpression()]));
} else {
staticFieldInitializerExpressions.push(staticBlockToIIFE(element.node));
}
element.remove();
return;
}
const isProperty = element.isClassProperty() || element.isClassPrivateProperty();
if ((isProperty || element.isClassPrivateMethod()) && element.node.static) {
if (isProperty && staticFieldInitializerExpressions.length > 0) {
if ((element.isClassProperty() || element.isClassPrivateProperty()) && element.node.static) {
const valuePath = element.get("value");
if (hasInstancePrivateAccess(valuePath, instancePrivateNames)) {
const fieldValueClosureId = memoiseExpression(fieldInitializerToClosure(valuePath.node), "fieldValue", staticClosures);
valuePath.replaceWith(_core.types.callExpression(_core.types.memberExpression(fieldValueClosureId, _core.types.identifier("call")), [_core.types.thisExpression()]));
}
if (staticFieldInitializerExpressions.length > 0) {
prependExpressionsToFieldInitializer(staticFieldInitializerExpressions, element);

@@ -738,2 +912,33 @@ staticFieldInitializerExpressions = [];

element.remove();
} else if (element.isClassPrivateMethod({
static: true
})) {
if (hasInstancePrivateAccess(element, instancePrivateNames)) {
const replaceSupers = new _helperReplaceSupers.default({
constantSuper,
methodPath: element,
objectRef: classIdLocal,
superRef: path.node.superClass,
file: state.file,
refToPreserve: classIdLocal
});
replaceSupers.replace();
const privateMethodDelegateId = memoiseExpression(createFunctionExpressionFromPrivateMethod(element.node), element.get("key.id").node.name, staticClosures);
if (ignoreFunctionLength) {
element.node.params = [_core.types.restElement(_core.types.identifier("arg"))];
element.node.body = _core.types.blockStatement([_core.types.returnStatement(_core.types.callExpression(_core.types.memberExpression(privateMethodDelegateId, _core.types.identifier("apply")), [_core.types.thisExpression(), _core.types.identifier("arg")]))]);
} else {
element.node.params = element.node.params.map((p, i) => {
if (_core.types.isRestElement(p)) {
return _core.types.restElement(_core.types.identifier("arg"));
} else {
return _core.types.identifier("_" + i);
}
});
element.node.body = _core.types.blockStatement([_core.types.returnStatement(_core.types.callExpression(_core.types.memberExpression(privateMethodDelegateId, _core.types.identifier("apply")), [_core.types.thisExpression(), _core.types.identifier("arguments")]))]);
}
}
element.node.static = false;
statics.push(element.node);
element.remove();
}

@@ -745,3 +950,3 @@ });

`;
staticsClass.body.body = [_core.types.staticBlock([_core.types.toStatement(originalClass, true) || _core.types.expressionStatement(originalClass)]), ...statics];
staticsClass.body.body = [_core.types.classProperty(_core.types.toExpression(originalClass), undefined, undefined, undefined, true, true), ...statics];
const constructorBody = [];

@@ -762,3 +967,4 @@ const newExpr = _core.types.newExpression(staticsClass, []);

}
path.replaceWith(newExpr);
const [newPath] = path.replaceWith(newExpr);
originalClassPath = newPath.get("callee").get("body").get("body")[0].get("key");
}

@@ -779,4 +985,31 @@ }

}
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)));
const applyDecoratorWrapper = _core.types.staticBlock([]);
originalClass.body.body.unshift(applyDecoratorWrapper);
const applyDecsBody = applyDecoratorWrapper.body;
if (computedKeyAssignments.length > 0) {
const elements = originalClassPath.get("body.body");
let firstPublicElement;
for (const path of elements) {
if ((path.isClassProperty() || path.isClassMethod()) && path.node.kind !== "constructor") {
firstPublicElement = path;
break;
}
}
if (firstPublicElement != null) {
convertToComputedKey(firstPublicElement);
prependExpressionsToComputedKey(computedKeyAssignments, firstPublicElement);
} else {
originalClass.body.body.unshift(_core.types.classProperty(_core.types.sequenceExpression([...computedKeyAssignments, _core.types.stringLiteral("_")]), undefined, undefined, undefined, true, true));
applyDecsBody.push(_core.types.expressionStatement(_core.types.unaryExpression("delete", _core.types.memberExpression(_core.types.thisExpression(), _core.types.identifier("_")))));
}
computedKeyAssignments = [];
}
applyDecsBody.push(_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)));
if (staticInitLocal) {
applyDecsBody.push(_core.types.expressionStatement(_core.types.callExpression(_core.types.cloneNode(staticInitLocal), [_core.types.thisExpression()])));
}
if (staticClosures.length > 0) {
applyDecsBody.push(...staticClosures.map(expr => _core.types.expressionStatement(expr)));
}
path.insertBefore(classAssignments.map(expr => _core.types.expressionStatement(expr)));
if (needsDeclaraionForClassBinding) {

@@ -1010,2 +1243,10 @@ path.insertBefore(_core.types.variableDeclaration("let", [_core.types.variableDeclarator(_core.types.cloneNode(classIdLocal))]));

}
function generateLetUidIdentifier(scope, name) {
const id = scope.generateUidIdentifier(name);
scope.push({
id,
kind: "let"
});
return _core.types.cloneNode(id);
}
function _default({

@@ -1017,3 +1258,3 @@ assertVersion,

}, version, inherits) {
var _assumption;
var _assumption, _assumption2;
{

@@ -1030,2 +1271,3 @@ if (version === "2023-11" || version === "2023-05" || version === "2023-01") {

const constantSuper = (_assumption = assumption("constantSuper")) != null ? _assumption : loose;
const ignoreFunctionLength = (_assumption2 = assumption("ignoreFunctionLength")) != null ? _assumption2 : loose;
const namedEvaluationVisitor = NamedEvaluationVisitoryFactory(isDecoratedAnonymousClassExpression, visitClass);

@@ -1039,3 +1281,3 @@ function visitClass(path, state, className) {

(_className = className) != null ? _className : className = (_node$id = node.id) == null ? void 0 : _node$id.name;
const newPath = transformClass(path, state, constantSuper, version, className, namedEvaluationVisitor);
const newPath = transformClass(path, state, constantSuper, ignoreFunctionLength, className, namedEvaluationVisitor, version);
if (newPath) {

@@ -1042,0 +1284,0 @@ VISITED.add(newPath);

10

lib/index.js

@@ -100,8 +100,8 @@ "use strict";

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

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

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

@@ -232,3 +232,3 @@ const pathIsClassDeclaration = path.isClassDeclaration();

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

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

@@ -8,2 +8,3 @@ "use strict";

exports.injectInitialization = injectInitialization;
exports.memoiseComputedKey = memoiseComputedKey;
var _core = require("@babel/core");

@@ -86,6 +87,28 @@ var _helperEnvironmentVisitor = require("@babel/helper-environment-visitor");

}
function memoiseComputedKey(keyNode, scope, hint) {
const isUidReference = _core.types.isIdentifier(keyNode) && scope.hasUid(keyNode.name);
if (isUidReference) {
return;
}
const isMemoiseAssignment = _core.types.isAssignmentExpression(keyNode, {
operator: "="
}) && _core.types.isIdentifier(keyNode.left) && scope.hasUid(keyNode.left.name);
if (isMemoiseAssignment) {
return _core.types.cloneNode(keyNode);
} else {
const ident = _core.types.identifier(hint);
scope.push({
id: ident,
kind: "let"
});
return _core.types.assignmentExpression("=", _core.types.cloneNode(ident), keyNode);
}
}
function extractComputedKeys(path, computedPaths, file) {
const {
scope
} = path;
const declarations = [];
const state = {
classBinding: path.node.id && path.scope.getBinding(path.node.id.name),
classBinding: path.node.id && scope.getBinding(path.node.id.name),
file

@@ -102,20 +125,6 @@ };

if (!computedKey.isConstantExpression()) {
const scope = path.scope;
const isUidReference = _core.types.isIdentifier(computedKey.node) && scope.hasUid(computedKey.node.name);
const isMemoiseAssignment = computedKey.isAssignmentExpression({
operator: "="
}) && _core.types.isIdentifier(computedKey.node.left) && scope.hasUid(computedKey.node.left.name);
if (isUidReference) {
continue;
} else if (isMemoiseAssignment) {
declarations.push(_core.types.expressionStatement(_core.types.cloneNode(computedNode.key)));
computedNode.key = _core.types.cloneNode(computedNode.key.left);
} else {
const ident = path.scope.generateUidIdentifierBasedOnNode(computedNode.key);
scope.push({
id: ident,
kind: "let"
});
declarations.push(_core.types.expressionStatement(_core.types.assignmentExpression("=", _core.types.cloneNode(ident), computedNode.key)));
computedNode.key = _core.types.cloneNode(ident);
const assignment = memoiseComputedKey(computedKey.node, scope, scope.generateUidBasedOnNode(computedKey.node));
if (assignment) {
declarations.push(_core.types.expressionStatement(assignment));
computedNode.key = _core.types.cloneNode(assignment.left);
}

@@ -122,0 +131,0 @@ }

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

@@ -26,3 +26,3 @@ "license": "MIT",

"@babel/helper-optimise-call-expression": "^7.22.5",
"@babel/helper-replace-supers": "^7.22.20",
"@babel/helper-replace-supers": "^7.24.1",
"@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",

@@ -36,5 +36,5 @@ "@babel/helper-split-export-declaration": "^7.22.6",

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

@@ -41,0 +41,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

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