|
@@ -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
|
|
|
|
+ );
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+});
|