diff --git a/src/JavaScriptObfuscator.ts b/src/JavaScriptObfuscator.ts index a2ea456a..e529b9a0 100644 --- a/src/JavaScriptObfuscator.ts +++ b/src/JavaScriptObfuscator.ts @@ -23,10 +23,7 @@ export class JavaScriptObfuscator { * @param options * @returns {string} */ - public static obfuscateWithSourceMap ( - sourceCode: string, - options: IOptionsPreset = {} - ): IObfuscationResult { + public static obfuscateWithSourceMap (sourceCode: string, options: IOptionsPreset = {}): IObfuscationResult { let javaScriptObfuscator: JavaScriptObfuscatorInternal = new JavaScriptObfuscatorInternal(sourceCode, options); javaScriptObfuscator.obfuscate(); diff --git a/test/JavaScriptObfuscator.spec.ts b/test/JavaScriptObfuscator.spec.ts deleted file mode 100644 index fdb5a288..00000000 --- a/test/JavaScriptObfuscator.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { JavaScriptObfuscator } from "../src/JavaScriptObfuscator"; - -import { NO_CUSTOM_NODES_PRESET } from "../src/preset-options/NoCustomNodesPreset"; - -const assert: Chai.AssertStatic = require('chai').assert; - -describe('JavaScriptObfuscator', () => { - describe('obfuscate (sourceCode: string, customOptions?: IOptionsPreset): string', () => { - it('should obfuscate simple code with variable inside global scope', () => { - assert.match( - JavaScriptObfuscator.obfuscate( - `var test = 1;`, - Object.assign({}, NO_CUSTOM_NODES_PRESET) - ), - /^var *test *= *0x\d+;$/ - ); - }); - - it('should obfuscate simple code with variable inside block-scope', () => { - assert.match( - JavaScriptObfuscator.obfuscate( - `(function () {var test = 1;})()`, - Object.assign({}, NO_CUSTOM_NODES_PRESET) - ), - /^\(function *\(\) *\{ *var *_0x[\w]+ *= *0x\d+; *\}(\(\)\)|\)\(\));?$/ - ); - }); - - it('should obfuscate simple code with literal variable value', () => { - let pattern: RegExp = /^var _0x(\w){4} *= *\['(\\[x|u]\d+)+'\]; *var *test *= *_0x(\w){4}\[0x0\];$/; - - assert.match( - JavaScriptObfuscator.obfuscate( - `var test = 'abc';`, - Object.assign({}, NO_CUSTOM_NODES_PRESET, { - unicodeArray: true, - unicodeArrayThreshold: 1 - }) - ), - pattern - ); - - assert.match( - JavaScriptObfuscator.obfuscate( - `var test = 'абц';`, - Object.assign({}, NO_CUSTOM_NODES_PRESET, { - unicodeArray: true, - unicodeArrayThreshold: 1 - }) - ), - pattern - ); - }); - }); -}); diff --git a/test/functional-tests/JavaScriptObfuscator.spec.ts b/test/functional-tests/JavaScriptObfuscator.spec.ts new file mode 100644 index 00000000..bb0108e3 --- /dev/null +++ b/test/functional-tests/JavaScriptObfuscator.spec.ts @@ -0,0 +1,165 @@ +import { JavaScriptObfuscator } from "../../src/JavaScriptObfuscator"; + +import { NO_CUSTOM_NODES_PRESET } from "../../src/preset-options/NoCustomNodesPreset"; +import {IObfuscationResult} from "../../src/interfaces/IObfuscationResult"; + +const assert: Chai.AssertStatic = require('chai').assert; + +describe('JavaScriptObfuscator', () => { + describe('obfuscate (sourceCode: string, customOptions?: IOptionsPreset): string', () => { + it('should returns empty string if source code is empty', () => { + assert.isNotOk(JavaScriptObfuscator.obfuscate('', Object.assign({}, NO_CUSTOM_NODES_PRESET))); + }); + + it('should obfuscate simple code with variable inside global scope', () => { + assert.match( + JavaScriptObfuscator.obfuscate( + `var test = 1;`, + Object.assign({}, NO_CUSTOM_NODES_PRESET) + ), + /^var *test *= *0x\d+;$/ + ); + }); + + it('should obfuscate simple code with variable inside block-scope', () => { + assert.match( + JavaScriptObfuscator.obfuscate( + `(function () {var test = 1;})()`, + Object.assign({}, NO_CUSTOM_NODES_PRESET) + ), + /^\(function *\(\) *\{ *var *_0x[\w]+ *= *0x\d+; *\}(\(\)\)|\)\(\));?$/ + ); + }); + + it('should obfuscate simple code with literal variable value', () => { + let pattern: RegExp = /^var _0x(\w){4} *= *\['(\\[x|u]\d+)+'\]; *var *test *= *_0x(\w){4}\[0x0\];$/; + + assert.match( + JavaScriptObfuscator.obfuscate( + `var test = 'abc';`, + Object.assign({}, NO_CUSTOM_NODES_PRESET, { + unicodeArray: true, + unicodeArrayThreshold: 1 + }) + ), + pattern + ); + + assert.match( + JavaScriptObfuscator.obfuscate( + `var test = 'абц';`, + Object.assign({}, NO_CUSTOM_NODES_PRESET, { + unicodeArray: true, + unicodeArrayThreshold: 1 + }) + ), + pattern + ); + }); + }); + + describe('obfuscateWithSourceMap (sourceCode: string, customOptions?: IOptionsPreset): string', () => { + describe('if `sourceMap` option is `false`', () => { + it('should returns object with obfuscated code and empty source map', () => { + let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscateWithSourceMap( + `var test = 1;`, + Object.assign({}, NO_CUSTOM_NODES_PRESET) + ); + + assert.isOk(obfuscationResult.obfuscatedCode); + assert.isNotOk(obfuscationResult.sourceMap); + }); + }); + + describe('if `sourceMap` option is `true`', () => { + it('should returns object with obfuscated code and source map', () => { + let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscateWithSourceMap( + `var test = 1;`, + Object.assign({}, NO_CUSTOM_NODES_PRESET, { + sourceMap: true + }) + ); + + assert.isOk(obfuscationResult.obfuscatedCode); + assert.isOk(JSON.parse(obfuscationResult.sourceMap).mappings); + }); + + it('should returns object with obfuscated code and empty source map if `sourceMapMode` is `inline', () => { + let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscateWithSourceMap( + `var test = 1;`, + Object.assign({}, NO_CUSTOM_NODES_PRESET, { + sourceMapMode: 'inline' + }) + ); + + assert.isOk(obfuscationResult.obfuscatedCode); + assert.isNotOk(obfuscationResult.sourceMap); + }); + + it('should returns object with empty obfuscated code and empty source map if source code is empty', () => { + let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscateWithSourceMap( + '', + Object.assign({}, NO_CUSTOM_NODES_PRESET) + ); + + assert.isNotOk(obfuscationResult.obfuscatedCode); + assert.isNotOk(obfuscationResult.sourceMap); + }); + }); + + it('should returns empty string if source code is empty', () => { + assert.isNotOk( + JavaScriptObfuscator.obfuscateWithSourceMap( + '', + Object.assign({}, NO_CUSTOM_NODES_PRESET) + ).obfuscatedCode + ); + }); + + it('should obfuscate simple code with variable inside global scope', () => { + assert.match( + JavaScriptObfuscator.obfuscateWithSourceMap( + `var test = 1;`, + Object.assign({}, NO_CUSTOM_NODES_PRESET) + ).obfuscatedCode, + /^var *test *= *0x\d+;$/ + ); + }); + + it('should obfuscate simple code with variable inside block-scope', () => { + assert.match( + JavaScriptObfuscator.obfuscateWithSourceMap( + `(function () {var test = 1;})()`, + Object.assign({}, NO_CUSTOM_NODES_PRESET) + ).obfuscatedCode, + /^\(function *\(\) *\{ *var *_0x[\w]+ *= *0x\d+; *\}(\(\)\)|\)\(\));?$/ + ); + }); + + it('should obfuscate simple code with literal variable value', () => { + let pattern: RegExp = /^var _0x(\w){4} *= *\['(\\[x|u]\d+)+'\]; *var *test *= *_0x(\w){4}\[0x0\];$/; + + assert.match( + JavaScriptObfuscator.obfuscateWithSourceMap( + `var test = 'abc';`, + Object.assign({}, NO_CUSTOM_NODES_PRESET, { + unicodeArray: true, + unicodeArrayThreshold: 1 + }) + ).obfuscatedCode, + pattern + ); + + assert.match( + JavaScriptObfuscator.obfuscateWithSourceMap( + `var test = 'абц';`, + Object.assign({}, NO_CUSTOM_NODES_PRESET, { + unicodeArray: true, + unicodeArrayThreshold: 1 + }) + ).obfuscatedCode, + pattern + ); + }); + }); +}); diff --git a/test/JavaScriptObfuscatorCLI.spec.ts b/test/functional-tests/JavaScriptObfuscatorCLI.spec.ts similarity index 97% rename from test/JavaScriptObfuscatorCLI.spec.ts rename to test/functional-tests/JavaScriptObfuscatorCLI.spec.ts index 9b455c07..3e9a1dca 100644 --- a/test/JavaScriptObfuscatorCLI.spec.ts +++ b/test/functional-tests/JavaScriptObfuscatorCLI.spec.ts @@ -2,9 +2,9 @@ import * as fs from 'fs'; import * as mkdirp from 'mkdirp'; import * as sinon from 'sinon'; -import { StdoutWriteMock } from "../test/mocks/StdoutWriteMock"; +import { StdoutWriteMock } from "../mocks/StdoutWriteMock"; -import { JavaScriptObfuscator } from "../src/JavaScriptObfuscator"; +import { JavaScriptObfuscator } from "../../src/JavaScriptObfuscator"; const assert: Chai.AssertStatic = require('chai').assert; diff --git a/test/NodeUtils.spec.ts b/test/unit-tests/NodeUtils.spec.ts similarity index 93% rename from test/NodeUtils.spec.ts rename to test/unit-tests/NodeUtils.spec.ts index 31c0a9d1..b0acac07 100644 --- a/test/NodeUtils.spec.ts +++ b/test/unit-tests/NodeUtils.spec.ts @@ -1,18 +1,18 @@ import * as chai from 'chai'; -import { IBlockStatementNode } from "../src/interfaces/nodes/IBlockStatementNode"; -import { IExpressionStatementNode } from "../src/interfaces/nodes/IExpressionStatementNode"; -import { IFunctionDeclarationNode } from "../src/interfaces/nodes/IFunctionDeclarationNode"; -import { IIdentifierNode } from "../src/interfaces/nodes/IIdentifierNode"; -import { IIfStatementNode } from "../src/interfaces/nodes/IIfStatementNode"; -import { ILiteralNode } from "../src/interfaces/nodes/ILiteralNode"; -import { INode } from "../src/interfaces/nodes/INode"; -import { IProgramNode } from "../src/interfaces/nodes/IProgramNode"; -import { IVariableDeclarationNode } from "../src/interfaces/nodes/IVariableDeclarationNode"; -import { IVariableDeclaratorNode } from "../src/interfaces/nodes/IVariableDeclaratorNode"; +import { IBlockStatementNode } from "../../src/interfaces/nodes/IBlockStatementNode"; +import { IExpressionStatementNode } from "../../src/interfaces/nodes/IExpressionStatementNode"; +import { IFunctionDeclarationNode } from "../../src/interfaces/nodes/IFunctionDeclarationNode"; +import { IIdentifierNode } from "../../src/interfaces/nodes/IIdentifierNode"; +import { IIfStatementNode } from "../../src/interfaces/nodes/IIfStatementNode"; +import { ILiteralNode } from "../../src/interfaces/nodes/ILiteralNode"; +import { INode } from "../../src/interfaces/nodes/INode"; +import { IProgramNode } from "../../src/interfaces/nodes/IProgramNode"; +import { IVariableDeclarationNode } from "../../src/interfaces/nodes/IVariableDeclarationNode"; +import { IVariableDeclaratorNode } from "../../src/interfaces/nodes/IVariableDeclaratorNode"; -import { NodeMocks } from './mocks/NodeMocks'; -import { NodeUtils } from '../src/NodeUtils'; +import { NodeMocks } from '../mocks/NodeMocks'; +import { NodeUtils } from '../../src/NodeUtils'; chai.use(require('chai-members-deep')); diff --git a/test/OptionsNormalizer.spec.ts b/test/unit-tests/OptionsNormalizer.spec.ts similarity index 87% rename from test/OptionsNormalizer.spec.ts rename to test/unit-tests/OptionsNormalizer.spec.ts index 194d7946..826c7384 100644 --- a/test/OptionsNormalizer.spec.ts +++ b/test/unit-tests/OptionsNormalizer.spec.ts @@ -1,8 +1,8 @@ -import { IOptionsPreset } from "../src/interfaces/IOptionsPreset"; +import { IOptionsPreset } from "../../src/interfaces/IOptionsPreset"; -import { OptionsNormalizer } from '../src/OptionsNormalizer'; +import { OptionsNormalizer } from '../../src/OptionsNormalizer'; -import { DEFAULT_PRESET } from '../src/preset-options/DefaultPreset'; +import { DEFAULT_PRESET } from '../../src/preset-options/DefaultPreset'; const assert: Chai.AssertStatic = require('chai').assert; diff --git a/test/Utils.spec.ts b/test/unit-tests/Utils.spec.ts similarity index 97% rename from test/Utils.spec.ts rename to test/unit-tests/Utils.spec.ts index 4b182c43..49a3f405 100644 --- a/test/Utils.spec.ts +++ b/test/unit-tests/Utils.spec.ts @@ -1,6 +1,6 @@ -import { Utils } from '../src/Utils'; +import { Utils } from '../../src/Utils'; -import { JSFuck } from '../src/enums/JSFuck'; +import { JSFuck } from '../../src/enums/JSFuck'; const assert: Chai.AssertStatic = require('chai').assert; diff --git a/test/node-obfuscators/CatchClauseObfuscator.spec.ts b/test/unit-tests/node-obfuscators/CatchClauseObfuscator.spec.ts similarity index 78% rename from test/node-obfuscators/CatchClauseObfuscator.spec.ts rename to test/unit-tests/node-obfuscators/CatchClauseObfuscator.spec.ts index 2766a225..e1b1c79e 100644 --- a/test/node-obfuscators/CatchClauseObfuscator.spec.ts +++ b/test/unit-tests/node-obfuscators/CatchClauseObfuscator.spec.ts @@ -1,14 +1,14 @@ -import { ICatchClauseNode } from "../../src/interfaces/nodes/ICatchClauseNode"; -import { ICustomNode } from "../../src/interfaces/ICustomNode"; -import { IExpressionStatementNode } from "../../src/interfaces/nodes/IExpressionStatementNode"; +import { ICatchClauseNode } from "../../../src/interfaces/nodes/ICatchClauseNode"; +import { ICustomNode } from "../../../src/interfaces/ICustomNode"; +import { IExpressionStatementNode } from "../../../src/interfaces/nodes/IExpressionStatementNode"; -import { DEFAULT_PRESET } from "../../src/preset-options/DefaultPreset"; +import { DEFAULT_PRESET } from "../../../src/preset-options/DefaultPreset"; -import { NodeType } from "../../src/enums/NodeType"; +import { NodeType } from "../../../src/enums/NodeType"; -import { CatchClauseObfuscator } from '../../src/node-obfuscators/CatchClauseObfuscator'; -import { NodeMocks } from "../mocks/NodeMocks"; -import { Options } from "../../src/Options"; +import { CatchClauseObfuscator } from '../../../src/node-obfuscators/CatchClauseObfuscator'; +import { NodeMocks } from "../../mocks/NodeMocks"; +import { Options } from "../../../src/Options"; const assert: Chai.AssertStatic = require('chai').assert; diff --git a/test/node-obfuscators/FunctionDeclarationObfuscator.spec.ts b/test/unit-tests/node-obfuscators/FunctionDeclarationObfuscator.spec.ts similarity index 84% rename from test/node-obfuscators/FunctionDeclarationObfuscator.spec.ts rename to test/unit-tests/node-obfuscators/FunctionDeclarationObfuscator.spec.ts index 0ea558fc..91610a4f 100644 --- a/test/node-obfuscators/FunctionDeclarationObfuscator.spec.ts +++ b/test/unit-tests/node-obfuscators/FunctionDeclarationObfuscator.spec.ts @@ -1,14 +1,14 @@ -import { IBlockStatementNode } from "../../src/interfaces/nodes/IBlockStatementNode"; -import { ICustomNode } from "../../src/interfaces/ICustomNode"; -import { IExpressionStatementNode } from "../../src/interfaces/nodes/IExpressionStatementNode"; -import { IFunctionDeclarationNode } from "../../src/interfaces/nodes/IFunctionDeclarationNode"; -import { IProgramNode } from "../../src/interfaces/nodes/IProgramNode"; +import { IBlockStatementNode } from "../../../src/interfaces/nodes/IBlockStatementNode"; +import { ICustomNode } from "../../../src/interfaces/ICustomNode"; +import { IExpressionStatementNode } from "../../../src/interfaces/nodes/IExpressionStatementNode"; +import { IFunctionDeclarationNode } from "../../../src/interfaces/nodes/IFunctionDeclarationNode"; +import { IProgramNode } from "../../../src/interfaces/nodes/IProgramNode"; -import { DEFAULT_PRESET } from "../../src/preset-options/DefaultPreset"; +import { DEFAULT_PRESET } from "../../../src/preset-options/DefaultPreset"; -import { FunctionDeclarationObfuscator } from '../../src/node-obfuscators/FunctionDeclarationObfuscator'; -import { NodeMocks } from "../mocks/NodeMocks"; -import { Options } from "../../src/Options"; +import { FunctionDeclarationObfuscator } from '../../../src/node-obfuscators/FunctionDeclarationObfuscator'; +import { NodeMocks } from "../../mocks/NodeMocks"; +import { Options } from "../../../src/Options"; const assert: Chai.AssertStatic = require('chai').assert; diff --git a/test/node-obfuscators/FunctionObfuscator.spec.ts b/test/unit-tests/node-obfuscators/FunctionObfuscator.spec.ts similarity index 79% rename from test/node-obfuscators/FunctionObfuscator.spec.ts rename to test/unit-tests/node-obfuscators/FunctionObfuscator.spec.ts index 9900709a..7acad476 100644 --- a/test/node-obfuscators/FunctionObfuscator.spec.ts +++ b/test/unit-tests/node-obfuscators/FunctionObfuscator.spec.ts @@ -1,15 +1,15 @@ -import { IBlockStatementNode } from "../../src/interfaces/nodes/IBlockStatementNode"; -import { ICustomNode } from "../../src/interfaces/ICustomNode"; -import { IExpressionStatementNode } from "../../src/interfaces/nodes/IExpressionStatementNode"; -import { IFunctionDeclarationNode } from "../../src/interfaces/nodes/IFunctionDeclarationNode"; -import { IIdentifierNode } from "../../src/interfaces/nodes/IIdentifierNode"; -import { IProgramNode } from "../../src/interfaces/nodes/IProgramNode"; +import { IBlockStatementNode } from "../../../src/interfaces/nodes/IBlockStatementNode"; +import { ICustomNode } from "../../../src/interfaces/ICustomNode"; +import { IExpressionStatementNode } from "../../../src/interfaces/nodes/IExpressionStatementNode"; +import { IFunctionDeclarationNode } from "../../../src/interfaces/nodes/IFunctionDeclarationNode"; +import { IIdentifierNode } from "../../../src/interfaces/nodes/IIdentifierNode"; +import { IProgramNode } from "../../../src/interfaces/nodes/IProgramNode"; -import { DEFAULT_PRESET } from "../../src/preset-options/DefaultPreset"; +import { DEFAULT_PRESET } from "../../../src/preset-options/DefaultPreset"; -import { FunctionObfuscator } from "../../src/node-obfuscators/FunctionObfuscator"; -import { NodeMocks } from "../mocks/NodeMocks"; -import { Options } from "../../src/Options"; +import { FunctionObfuscator } from "../../../src/node-obfuscators/FunctionObfuscator"; +import { NodeMocks } from "../../mocks/NodeMocks"; +import { Options } from "../../../src/Options"; const assert: Chai.AssertStatic = require('chai').assert;