Added ignoring of all object members previous to SpreadElement when transformObjectKeys option is enabled

Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/797
This commit is contained in:
sanex
2020-11-03 11:15:19 +03:00
parent 867c125dab
commit e8517bf770
14 changed files with 252 additions and 112 deletions
+1
View File
@@ -41,6 +41,7 @@ export enum NodeType {
RestElement = 'RestElement',
ReturnStatement = 'ReturnStatement',
SequenceExpression = 'SequenceExpression',
SpreadElement = 'SpreadElement',
Super = 'Super',
SwitchCase = 'SwitchCase',
SwitchStatement = 'SwitchStatement',
@@ -152,11 +152,16 @@ export class BasePropertiesExtractor implements IObjectExpressionExtractor {
const expressionStatements: ESTree.ExpressionStatement[] = [];
const removablePropertyIds: number[] = [];
for (let i: number = 0; i < propertiesLength; i++) {
// have to iterate in the reversed order to fast check spread elements and break iteration on them
for (let i: number = propertiesLength - 1; i >= 0; i--) {
const property: (ESTree.Property | ESTree.SpreadElement) = properties[i];
// invalid property node
if (!NodeGuards.isPropertyNode(property) || BasePropertiesExtractor.isProhibitedPropertyNode(property)) {
// spread element
if (NodeGuards.isSpreadElementNode(property)) {
break;
}
if (BasePropertiesExtractor.isProhibitedPropertyNode(property)) {
continue;
}
@@ -199,8 +204,8 @@ export class BasePropertiesExtractor implements IObjectExpressionExtractor {
/**
* Stage 4: filling arrays
*/
expressionStatements.push(expressionStatementNode);
removablePropertyIds.push(i);
expressionStatements.unshift(expressionStatementNode);
removablePropertyIds.unshift(i);
}
return [expressionStatements, removablePropertyIds];
+8
View File
@@ -374,6 +374,14 @@ export class NodeGuards {
return node.type === NodeType.SequenceExpression;
}
/**
* @param {Node} node
* @returns {boolean}
*/
public static isSpreadElementNode (node: ESTree.Node): node is ESTree.SpreadElement {
return node.type === NodeType.SpreadElement;
}
/**
* @param {Node} node
* @returns {boolean}