瀏覽代碼

0.14.1 Temporary fix for wrong esprima template-literal parsing

sanex3339 7 年之前
父節點
當前提交
1bb521b773

+ 4 - 0
CHANGELOG.md

@@ -1,5 +1,9 @@
 Change Log
 ===
+v0.14.1
+---
+* Temporary fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/181
+    
 v0.14.0
 ---
 * **New option:** `identifiersPrefix` sets prefix for all generated identifiers.

File diff suppressed because it is too large
+ 0 - 1818
dist/index.js


+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "javascript-obfuscator",
-  "version": "0.14.0",
+  "version": "0.14.1",
   "description": "JavaScript obfuscator",
   "keywords": [
     "obfuscator",

+ 42 - 0
src/node-transformers/converting-transformers/TemplateLiteralTransformer.ts

@@ -1,8 +1,11 @@
 import { inject, injectable, } from 'inversify';
 import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
+import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
+import { TStatement } from '../../types/node/TStatement';
+
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
 import { IVisitor } from '../../interfaces/node-transformers/IVisitor';
@@ -12,6 +15,7 @@ import { TransformationStage } from '../../enums/node-transformers/Transformatio
 import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
 import { NodeGuards } from '../../node/NodeGuards';
 import { Nodes } from '../../node/Nodes';
+import { NodeUtils } from '../../node/NodeUtils';
 
 /**
  * Transform ES2015 template literals to ES5
@@ -47,6 +51,13 @@ export class TemplateLiteralTransformer extends AbstractNodeTransformer {
             case TransformationStage.Converting:
                 return {
                     enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                        if (parentNode
+                            && NodeGuards.isExpressionStatementNode(node)
+                            && NodeGuards.isTemplateLiteralNode(node.expression)
+                        ) {
+                            return this.fixEsprimaReturnStatementTemplateLiteralNode(node, node.expression);
+                        }
+
                         if (parentNode && NodeGuards.isTemplateLiteralNode(node)) {
                             return this.transformNode(node, parentNode);
                         }
@@ -109,4 +120,35 @@ export class TemplateLiteralTransformer extends AbstractNodeTransformer {
 
         return nodes[0];
     }
+
+    /**
+     * @param {ExpressionStatement} expressionStatementNode
+     * @param {TemplateLiteral} templateLiteralNode
+     * @returns {Node | VisitorOption}
+     */
+    private fixEsprimaReturnStatementTemplateLiteralNode (
+        expressionStatementNode: ESTree.ExpressionStatement,
+        templateLiteralNode: ESTree.TemplateLiteral
+    ): ESTree.Node | estraverse.VisitorOption {
+        const previousSiblingStatementNode: TStatement | null = NodeUtils
+            .getPreviousSiblingStatementNode(expressionStatementNode);
+
+        if (
+            !previousSiblingStatementNode
+            || !templateLiteralNode.parentNode
+            || !NodeGuards.isReturnStatementNode(previousSiblingStatementNode)
+            || previousSiblingStatementNode.argument !== null
+        ) {
+            return expressionStatementNode;
+        }
+
+        previousSiblingStatementNode.argument = <ESTree.Expression>this.transformNode(
+            templateLiteralNode,
+            templateLiteralNode.parentNode
+        );
+
+        NodeUtils.parentizeNode(templateLiteralNode, previousSiblingStatementNode);
+
+        return estraverse.VisitorOption.Remove;
+    }
 }

+ 6 - 6
src/node/NodeUtils.ts

@@ -73,17 +73,17 @@ export class NodeUtils {
 
     /**
      * @param {Statement} node
-     * @returns {Node | null}
+     * @returns {TStatement | null}
      */
-    public static getNextSiblingStatementNode (node: ESTree.Statement): ESTree.Node | null {
+    public static getNextSiblingStatementNode (node: ESTree.Statement): TStatement | null {
         return NodeUtils.getSiblingStatementNodeByOffset(node, 1);
     }
 
     /**
      * @param {Statement} node
-     * @returns {Node | null}
+     * @returns {TStatement | null}
      */
-    public static getPreviousSiblingStatementNode (node: ESTree.Statement): ESTree.Node | null {
+    public static getPreviousSiblingStatementNode (node: ESTree.Statement): TStatement | null {
         return NodeUtils.getSiblingStatementNodeByOffset(node, -1);
     }
 
@@ -228,9 +228,9 @@ export class NodeUtils {
     /**
      * @param {Statement} node
      * @param {number} offset
-     * @returns {Node | null}
+     * @returns {TStatement | null}
      */
-    private static getSiblingStatementNodeByOffset (node: ESTree.Statement, offset: number): ESTree.Node | null {
+    private static getSiblingStatementNodeByOffset (node: ESTree.Statement, offset: number): TStatement | null {
         const scopeNode: TNodeWithScope = NodeUtils.getScopeOfNode(node);
         const scopeBody: TStatement[] = !NodeGuards.isSwitchCaseNode(scopeNode)
             ? scopeNode.body

+ 2 - 2
test/functional-tests/node-transformers/converting-transformers/template-literal-transformer/TemplateLiteralTransformer.spec.ts

@@ -48,7 +48,7 @@ describe('TemplateLiteralTransformer', () => {
                 }
             );
 
-            assert.match(obfuscationResult.getObfuscatedCode(),  /return *'foo\\x0abar';$/);
+            assert.match(obfuscationResult.getObfuscatedCode(),  /{ *return *'foo\\x0abar'; *}$/);
         });
 
         it('variant #3: should transform es6 multiline template literal inside return statement', () => {
@@ -61,7 +61,7 @@ describe('TemplateLiteralTransformer', () => {
                 }
             );
 
-            assert.match(obfuscationResult.getObfuscatedCode(),  /return *'foo\\x0abar';$/);
+            assert.match(obfuscationResult.getObfuscatedCode(),  /case *!!\[] *: *return *'foo\\x0abar'; *} *}$/);
         });
     });
 

+ 2 - 2
test/unit-tests/node/node-utils/NodeUtils.spec.ts

@@ -294,7 +294,7 @@ describe('NodeUtils', () => {
         });
     });
 
-    describe('getNextSiblingStatementNode (node: ESTree.Statement): ESTree.Node | null', () => {
+    describe('getNextSiblingStatementNode (node: ESTree.Statement): TStatement | null', () => {
         describe('variant #1: block statement node as scope node', () => {
                 let statementNode1: ESTree.Statement,
                 statementNode2: ESTree.Statement,
@@ -379,7 +379,7 @@ describe('NodeUtils', () => {
         });
     });
 
-    describe('getPreviousSiblingStatementNode (node: ESTree.Statement): ESTree.Node | null', () => {
+    describe('getPreviousSiblingStatementNode (node: ESTree.Statement): TStatement | null', () => {
         describe('variant #1: block statement node as scope node', () => {
             let statementNode1: ESTree.Statement,
                 statementNode2: ESTree.Statement,

Some files were not shown because too many files changed in this diff