mirror of
https://github.com/javascript-obfuscator/javascript-obfuscator
synced 2026-08-09 12:42:29 +00:00
0.14.1 Temporary fix for wrong esprima template-literal parsing
This commit is contained in:
@@ -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.
|
||||
|
||||
Vendored
+1
-9544
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "javascript-obfuscator",
|
||||
"version": "0.14.0",
|
||||
"version": "0.14.1",
|
||||
"description": "JavaScript obfuscator",
|
||||
"keywords": [
|
||||
"obfuscator",
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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'; *} *}$/);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user