Browse Source

Refactoring of mangle properties transformers and replacers

sanex3339 5 năm trước cách đây
mục cha
commit
06176c29a6

+ 18 - 22
dist/index.cli.js

@@ -15982,7 +15982,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
 var __param = (this && this.__param) || function (paramIndex, decorator) {
     return function (target, key) { decorator(target, key, paramIndex); }
 };
-var _a, _b, _c;
+var ManglePropertiesTransformer_1, _a, _b, _c;
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.ManglePropertiesTransformer = void 0;
 const inversify_1 = __webpack_require__(/*! inversify */ "inversify");
@@ -15993,11 +15993,17 @@ const IRandomGenerator_1 = __webpack_require__(/*! ../../interfaces/utils/IRando
 const NodeTransformationStage_1 = __webpack_require__(/*! ../../enums/node-transformers/NodeTransformationStage */ "./src/enums/node-transformers/NodeTransformationStage.ts");
 const AbstractNodeTransformer_1 = __webpack_require__(/*! ../AbstractNodeTransformer */ "./src/node-transformers/AbstractNodeTransformer.ts");
 const NodeGuards_1 = __webpack_require__(/*! ../../node/NodeGuards */ "./src/node/NodeGuards.ts");
-let ManglePropertiesTransformer = class ManglePropertiesTransformer extends AbstractNodeTransformer_1.AbstractNodeTransformer {
+let ManglePropertiesTransformer = ManglePropertiesTransformer_1 = class ManglePropertiesTransformer extends AbstractNodeTransformer_1.AbstractNodeTransformer {
     constructor(manglePropertiesObfuscatingReplacer, randomGenerator, options) {
         super(randomGenerator, options);
         this.manglePropertiesObfuscatingReplacer = manglePropertiesObfuscatingReplacer;
     }
+    static isValidPropertyNode(propertyNode, propertyKeyNode) {
+        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
+            return false;
+        }
+        return NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode);
+    }
     getVisitor(nodeTransformationStage) {
         switch (nodeTransformationStage) {
             case NodeTransformationStage_1.NodeTransformationStage.MangleProperties:
@@ -16027,10 +16033,7 @@ let ManglePropertiesTransformer = class ManglePropertiesTransformer extends Abst
     }
     transformPropertyNode(propertyNode) {
         const propertyKeyNode = propertyNode.key;
-        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
-            return propertyNode;
-        }
-        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode)) {
+        if (ManglePropertiesTransformer_1.isValidPropertyNode(propertyNode, propertyKeyNode)) {
             propertyNode.key = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
             propertyNode.shorthand = false;
         }
@@ -16038,26 +16041,20 @@ let ManglePropertiesTransformer = class ManglePropertiesTransformer extends Abst
     }
     transformMemberExpressionNode(memberExpressionNode) {
         const propertyKeyNode = memberExpressionNode.property;
-        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && memberExpressionNode.computed) {
-            return memberExpressionNode;
-        }
-        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode)) {
+        if (ManglePropertiesTransformer_1.isValidPropertyNode(memberExpressionNode, propertyKeyNode)) {
             memberExpressionNode.property = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
         }
         return memberExpressionNode;
     }
     transformMethodDefinitionNode(methodDefinitionNode) {
         const propertyKeyNode = methodDefinitionNode.key;
-        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && methodDefinitionNode.computed) {
-            return methodDefinitionNode;
-        }
-        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode)) {
+        if (ManglePropertiesTransformer_1.isValidPropertyNode(methodDefinitionNode, propertyKeyNode)) {
             methodDefinitionNode.key = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
         }
         return methodDefinitionNode;
     }
 };
-ManglePropertiesTransformer = __decorate([
+ManglePropertiesTransformer = ManglePropertiesTransformer_1 = __decorate([
     inversify_1.injectable(),
     __param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IManglePropertiesObfuscatingReplacer)),
     __param(1, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IRandomGenerator)),
@@ -16117,17 +16114,16 @@ let ManglePropertiesReplacer = class ManglePropertiesReplacer {
         return node;
     }
     replacePropertyName(propertyName) {
+        var _a;
         if (this.isReservedName(propertyName)) {
             return propertyName;
         }
-        let mangledPropertyName;
-        if (this.mangledPropertyNamesMap.has(propertyName)) {
-            mangledPropertyName = this.mangledPropertyNamesMap.get(propertyName);
-        }
-        else {
-            mangledPropertyName = this.identifierNamesGenerator.generateNext();
-            this.mangledPropertyNamesMap.set(propertyName, mangledPropertyName);
+        let mangledPropertyName = (_a = this.mangledPropertyNamesMap.get(propertyName)) !== null && _a !== void 0 ? _a : null;
+        if (mangledPropertyName !== null) {
+            return mangledPropertyName;
         }
+        mangledPropertyName = this.identifierNamesGenerator.generateNext();
+        this.mangledPropertyNamesMap.set(propertyName, mangledPropertyName);
         return mangledPropertyName;
     }
     isReservedName(name) {

+ 18 - 22
dist/index.js

@@ -15309,7 +15309,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
 var __param = (this && this.__param) || function (paramIndex, decorator) {
     return function (target, key) { decorator(target, key, paramIndex); }
 };
-var _a, _b, _c;
+var ManglePropertiesTransformer_1, _a, _b, _c;
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.ManglePropertiesTransformer = void 0;
 const inversify_1 = __webpack_require__(/*! inversify */ "inversify");
@@ -15320,11 +15320,17 @@ const IRandomGenerator_1 = __webpack_require__(/*! ../../interfaces/utils/IRando
 const NodeTransformationStage_1 = __webpack_require__(/*! ../../enums/node-transformers/NodeTransformationStage */ "./src/enums/node-transformers/NodeTransformationStage.ts");
 const AbstractNodeTransformer_1 = __webpack_require__(/*! ../AbstractNodeTransformer */ "./src/node-transformers/AbstractNodeTransformer.ts");
 const NodeGuards_1 = __webpack_require__(/*! ../../node/NodeGuards */ "./src/node/NodeGuards.ts");
-let ManglePropertiesTransformer = class ManglePropertiesTransformer extends AbstractNodeTransformer_1.AbstractNodeTransformer {
+let ManglePropertiesTransformer = ManglePropertiesTransformer_1 = class ManglePropertiesTransformer extends AbstractNodeTransformer_1.AbstractNodeTransformer {
     constructor(manglePropertiesObfuscatingReplacer, randomGenerator, options) {
         super(randomGenerator, options);
         this.manglePropertiesObfuscatingReplacer = manglePropertiesObfuscatingReplacer;
     }
+    static isValidPropertyNode(propertyNode, propertyKeyNode) {
+        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
+            return false;
+        }
+        return NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode);
+    }
     getVisitor(nodeTransformationStage) {
         switch (nodeTransformationStage) {
             case NodeTransformationStage_1.NodeTransformationStage.MangleProperties:
@@ -15354,10 +15360,7 @@ let ManglePropertiesTransformer = class ManglePropertiesTransformer extends Abst
     }
     transformPropertyNode(propertyNode) {
         const propertyKeyNode = propertyNode.key;
-        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
-            return propertyNode;
-        }
-        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode)) {
+        if (ManglePropertiesTransformer_1.isValidPropertyNode(propertyNode, propertyKeyNode)) {
             propertyNode.key = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
             propertyNode.shorthand = false;
         }
@@ -15365,26 +15368,20 @@ let ManglePropertiesTransformer = class ManglePropertiesTransformer extends Abst
     }
     transformMemberExpressionNode(memberExpressionNode) {
         const propertyKeyNode = memberExpressionNode.property;
-        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && memberExpressionNode.computed) {
-            return memberExpressionNode;
-        }
-        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode)) {
+        if (ManglePropertiesTransformer_1.isValidPropertyNode(memberExpressionNode, propertyKeyNode)) {
             memberExpressionNode.property = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
         }
         return memberExpressionNode;
     }
     transformMethodDefinitionNode(methodDefinitionNode) {
         const propertyKeyNode = methodDefinitionNode.key;
-        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && methodDefinitionNode.computed) {
-            return methodDefinitionNode;
-        }
-        if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode)) {
+        if (ManglePropertiesTransformer_1.isValidPropertyNode(methodDefinitionNode, propertyKeyNode)) {
             methodDefinitionNode.key = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
         }
         return methodDefinitionNode;
     }
 };
-ManglePropertiesTransformer = __decorate([
+ManglePropertiesTransformer = ManglePropertiesTransformer_1 = __decorate([
     inversify_1.injectable(),
     __param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IManglePropertiesObfuscatingReplacer)),
     __param(1, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IRandomGenerator)),
@@ -15444,17 +15441,16 @@ let ManglePropertiesReplacer = class ManglePropertiesReplacer {
         return node;
     }
     replacePropertyName(propertyName) {
+        var _a;
         if (this.isReservedName(propertyName)) {
             return propertyName;
         }
-        let mangledPropertyName;
-        if (this.mangledPropertyNamesMap.has(propertyName)) {
-            mangledPropertyName = this.mangledPropertyNamesMap.get(propertyName);
-        }
-        else {
-            mangledPropertyName = this.identifierNamesGenerator.generateNext();
-            this.mangledPropertyNamesMap.set(propertyName, mangledPropertyName);
+        let mangledPropertyName = (_a = this.mangledPropertyNamesMap.get(propertyName)) !== null && _a !== void 0 ? _a : null;
+        if (mangledPropertyName !== null) {
+            return mangledPropertyName;
         }
+        mangledPropertyName = this.identifierNamesGenerator.generateNext();
+        this.mangledPropertyNamesMap.set(propertyName, mangledPropertyName);
         return mangledPropertyName;
     }
     isReservedName(name) {

+ 3 - 3
src/interfaces/node-transformers/mangle-properties-transformers/replacer/IManglePropertiesReplacer.ts

@@ -2,8 +2,8 @@ import * as ESTree from 'estree';
 
 export interface IManglePropertiesReplacer {
     /**
-     * @param {TNode} node
-     * @returns {TNode}
+     * @param {ESTree.Identifier | ESTree.Literal} node
+     * @returns {ESTree.Identifier | ESTree.Literal}
      */
-    replace <TNode extends ESTree.Identifier | ESTree.Literal> (node: TNode): TNode;
+    replace (node: ESTree.Identifier | ESTree.Literal): ESTree.Identifier | ESTree.Literal;
 }

+ 21 - 15
src/node-transformers/mangle-properties-transformers/ManglePropertiesTransformer.ts

@@ -36,6 +36,24 @@ export class ManglePropertiesTransformer extends AbstractNodeTransformer {
         this.manglePropertiesObfuscatingReplacer = manglePropertiesObfuscatingReplacer;
     }
 
+    /**
+     * @param {TNode} propertyNode
+     * @param {ESTree.Expression} propertyKeyNode
+     * @returns {boolean}
+     */
+    private static isValidPropertyNode<
+        TNode extends ESTree.Property | ESTree.MemberExpression | ESTree.MethodDefinition
+    >(
+        propertyNode: TNode,
+        propertyKeyNode: ESTree.Expression
+    ): propertyKeyNode is ESTree.Identifier | ESTree.Literal {
+        if (NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
+            return false;
+        }
+
+        return NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards.isLiteralNode(propertyKeyNode);
+    }
+
     /**
      * @param {NodeTransformationStage} nodeTransformationStage
      * @returns {IVisitor | null}
@@ -86,11 +104,7 @@ export class ManglePropertiesTransformer extends AbstractNodeTransformer {
     private transformPropertyNode (propertyNode: ESTree.Property): ESTree.Property {
         const propertyKeyNode: ESTree.Expression = propertyNode.key;
 
-        if (NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
-            return propertyNode;
-        }
-
-        if (NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards.isLiteralNode(propertyKeyNode)) {
+        if (ManglePropertiesTransformer.isValidPropertyNode(propertyNode, propertyKeyNode)) {
             propertyNode.key = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
             propertyNode.shorthand = false;
         }
@@ -105,11 +119,7 @@ export class ManglePropertiesTransformer extends AbstractNodeTransformer {
     private transformMemberExpressionNode (memberExpressionNode: ESTree.MemberExpression): ESTree.MemberExpression {
         const propertyKeyNode: ESTree.Expression = memberExpressionNode.property;
 
-        if (NodeGuards.isIdentifierNode(propertyKeyNode) && memberExpressionNode.computed) {
-            return memberExpressionNode;
-        }
-
-        if (NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards.isLiteralNode(propertyKeyNode)) {
+        if (ManglePropertiesTransformer.isValidPropertyNode(memberExpressionNode, propertyKeyNode)) {
             memberExpressionNode.property = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
         }
 
@@ -123,11 +133,7 @@ export class ManglePropertiesTransformer extends AbstractNodeTransformer {
     private transformMethodDefinitionNode (methodDefinitionNode: ESTree.MethodDefinition): ESTree.MethodDefinition {
         const propertyKeyNode: ESTree.Expression = methodDefinitionNode.key;
 
-        if (NodeGuards.isIdentifierNode(propertyKeyNode) && methodDefinitionNode.computed) {
-            return methodDefinitionNode;
-        }
-
-        if (NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards.isLiteralNode(propertyKeyNode)) {
+        if (ManglePropertiesTransformer.isValidPropertyNode(methodDefinitionNode, propertyKeyNode)) {
             methodDefinitionNode.key = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
         }
 

+ 11 - 11
src/node-transformers/mangle-properties-transformers/replacer/ManglePropertiesReplacer.ts

@@ -52,18 +52,18 @@ export class ManglePropertiesReplacer implements IManglePropertiesReplacer {
     }
 
     /**
-     * @param {string} node
-     * @returns {string}
+     * @param {ESTree.Identifier | ESTree.Literal} node
+     * @returns {ESTree.Identifier | ESTree.Literal}
      */
-    public replace <TNode extends ESTree.Identifier | ESTree.Literal> (node: TNode): TNode {
+    public replace (node: ESTree.Identifier | ESTree.Literal): ESTree.Identifier | ESTree.Literal {
         if (NodeGuards.isIdentifierNode(node)) {
-            return <TNode>NodeFactory.identifierNode(
+            return NodeFactory.identifierNode(
                 this.replacePropertyName(node.name)
             );
         }
 
         if (NodeGuards.isLiteralNode(node) && typeof node.value === 'string') {
-            return <TNode>NodeFactory.literalNode(
+            return NodeFactory.literalNode(
                 this.replacePropertyName(node.value)
             );
         }
@@ -81,15 +81,15 @@ export class ManglePropertiesReplacer implements IManglePropertiesReplacer {
             return propertyName;
         }
 
-        let mangledPropertyName: string;
+        let mangledPropertyName: string | null = this.mangledPropertyNamesMap.get(propertyName) ?? null;
 
-        if (this.mangledPropertyNamesMap.has(propertyName)) {
-            mangledPropertyName = <string>this.mangledPropertyNamesMap.get(propertyName);
-        } else {
-            mangledPropertyName = this.identifierNamesGenerator.generateNext();
-            this.mangledPropertyNamesMap.set(propertyName, mangledPropertyName);
+        if (mangledPropertyName !== null) {
+            return mangledPropertyName;
         }
 
+        mangledPropertyName = this.identifierNamesGenerator.generateNext();
+        this.mangledPropertyNamesMap.set(propertyName, mangledPropertyName);
+
         return mangledPropertyName;
     }
 

+ 13 - 17
test/dev/dev.ts

@@ -7,31 +7,27 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNo
 
     let obfuscatedCode: string = JavaScriptObfuscator.obfuscate(
         `
-            const foo = {
-                prop1: {
-                    prop2: 'bar'
+            var x = {
+                baz_: 0,
+                foo_: 1,
+                calc: function() {
+                    return this.foo_ + this.baz_;
                 }
             };
-            
-            foo.prop1.prop2;
-            
-            const {prop1} = foo;
-            console.log(prop1.prop2);
-            
-            class Foo {
-                prop1 () {}
-            }
-            
-            const s = new Foo();
-
-            s.prop1();
+            x.bar_ = 2;
+            x["baz_"] = 3;
+            console.log(x.calc());
         `,
         {
             ...NO_ADDITIONAL_NODES_PRESET,
             compact: false,
+            log: true,
             identifierNamesGenerator: 'mangled',
+            renameGlobals: true,
             splitStrings: true,
-            splitStringsChunkLength: 3
+            splitStringsChunkLength: 3,
+            stringArray: true,
+            stringArrayThreshold: 1
         }
     ).getObfuscatedCode();