Merge branch 'dev' into yarn

Conflicts:
	dist/index.js
	package.json
	scripts/test-coveralls
	scripts/test-full
	scripts/test-mocha
This commit is contained in:
sanex3339
2017-01-20 16:54:57 +03:00
51 changed files with 1388 additions and 457 deletions
@@ -58,8 +58,6 @@ describe('BinaryExpressionControlFlowReplacer', () => {
assert.match(obfuscatedCode, controlFlowStorageCallRegExp1);
assert.match(obfuscatedCode, controlFlowStorageCallRegExp2);
assert.isOk(firstMatch);
assert.isOk(secondMatch);
if (firstMatch === secondMatch) {
equalsValue++;
@@ -67,6 +65,8 @@ describe('BinaryExpressionControlFlowReplacer', () => {
}
assert.closeTo(equalsValue / samplesCount, expectedValue, delta);
console.log(equalsValue / samplesCount);
});
});
});
@@ -58,8 +58,6 @@ describe('CallExpressionControlFlowReplacer', () => {
assert.match(obfuscatedCode, controlFlowStorageCallRegExp1);
assert.match(obfuscatedCode, controlFlowStorageCallRegExp2);
assert.isOk(firstMatch);
assert.isOk(secondMatch);
if (firstMatch === secondMatch) {
equalsValue++;
@@ -67,6 +65,8 @@ describe('CallExpressionControlFlowReplacer', () => {
}
assert.closeTo(equalsValue / samplesCount, expectedValue, delta);
console.log(equalsValue / samplesCount);
});
});
@@ -58,8 +58,6 @@ describe('LogicalExpressionControlFlowReplacer', () => {
assert.match(obfuscatedCode, controlFlowStorageCallRegExp1);
assert.match(obfuscatedCode, controlFlowStorageCallRegExp2);
assert.isOk(firstMatch);
assert.isOk(secondMatch);
if (firstMatch === secondMatch) {
equalsValue++;
@@ -67,6 +65,8 @@ describe('LogicalExpressionControlFlowReplacer', () => {
}
assert.closeTo(equalsValue / samplesCount, expectedValue, delta);
console.log(equalsValue / samplesCount);
});
});
@@ -52,4 +52,124 @@ describe('FunctionTransformer', () => {
assert.match(obfuscatedCode, functionBodyMatch);
});
});
describe('assignment pattern as parameter', () => {
describe('literal as right value', () => {
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
readFileAsString(__dirname + '/fixtures/assignment-pattern-as-parameter-1.js'),
{
...NO_CUSTOM_NODES_PRESET
}
);
const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
it('should transform function parameter assignment pattern identifier', () => {
const functionParameterMatch: RegExp = /function *\(_0x[a-f0-9]{4,6} *= *0x1\) *\{/;
const functionBodyMatch: RegExp = /return *_0x[a-f0-9]{4,6};/;
assert.match(obfuscatedCode, functionParameterMatch);
assert.match(obfuscatedCode, functionBodyMatch);
});
});
describe('identifier as right value', () => {
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
readFileAsString(__dirname + '/fixtures/assignment-pattern-as-parameter-2.js'),
{
...NO_CUSTOM_NODES_PRESET
}
);
const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
const variableDeclarationMatch: RegExp = /var *(_0x[a-f0-9]{4,6}) *= *0x1;/;
const functionParameterMatch: RegExp = /function *\((_0x[a-f0-9]{4,6}) *= *(_0x[a-f0-9]{4,6})\) *\{/;
const functionBodyMatch: RegExp = /return *(_0x[a-f0-9]{4,6});/;
const variableDeclarationIdentifierName: string = obfuscatedCode.match(variableDeclarationMatch)![1];
const functionParameterIdentifierName: string = obfuscatedCode.match(functionParameterMatch)![1];
const functionDefaultParameterIdentifierName: string = obfuscatedCode.match(functionParameterMatch)![2];
const functionBodyIdentifierName: string = obfuscatedCode.match(functionBodyMatch)![1];
it('should transform function parameter assignment pattern identifier', () => {
assert.match(obfuscatedCode, variableDeclarationMatch);
assert.match(obfuscatedCode, functionParameterMatch);
assert.match(obfuscatedCode, functionBodyMatch);
});
it('should keep same names for identifier in variable declaration and default value identifier of function parameter', () => {
assert.equal(variableDeclarationIdentifierName, functionDefaultParameterIdentifierName);
});
it('should keep same names for identifiers in function params and function body', () => {
assert.equal(functionParameterIdentifierName, functionBodyIdentifierName);
});
});
describe('identifier as right value', () => {
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
readFileAsString(__dirname + '/fixtures/assignment-pattern-as-parameter-3.js'),
{
...NO_CUSTOM_NODES_PRESET
}
);
const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
const variableDeclarationMatch: RegExp = /var *(_0x[a-f0-9]{4,6}) *= *0x1;/;
const functionParameterMatch: RegExp = /function *\((_0x[a-f0-9]{4,6}), *(_0x[a-f0-9]{4,6}) *= *(_0x[a-f0-9]{4,6})\) *\{/;
const functionBodyMatch: RegExp = /return *(_0x[a-f0-9]{4,6}) *\+ *(_0x[a-f0-9]{4,6});/;
const variableDeclarationIdentifierName: string = obfuscatedCode.match(variableDeclarationMatch)![1];
const functionParameterIdentifierName: string = obfuscatedCode.match(functionParameterMatch)![1];
const functionDefaultParameterIdentifierName1: string = obfuscatedCode.match(functionParameterMatch)![2];
const functionDefaultParameterIdentifierName2: string = obfuscatedCode.match(functionParameterMatch)![3];
const functionBodyIdentifierName1: string = obfuscatedCode.match(functionBodyMatch)![1];
const functionBodyIdentifierName2: string = obfuscatedCode.match(functionBodyMatch)![2];
it('should transform function parameter assignment pattern identifier', () => {
assert.match(obfuscatedCode, variableDeclarationMatch);
assert.match(obfuscatedCode, functionParameterMatch);
assert.match(obfuscatedCode, functionBodyMatch);
});
it('shouldn\'t keep same names variable declaration identifier and function parameters identifiers', () => {
assert.notEqual(variableDeclarationIdentifierName, functionParameterIdentifierName);
assert.notEqual(variableDeclarationIdentifierName, functionDefaultParameterIdentifierName1);
assert.notEqual(variableDeclarationIdentifierName, functionDefaultParameterIdentifierName2);
});
it('should keep same names for identifier in first function parameter and default value identifier of second function parameter', () => {
assert.equal(functionParameterIdentifierName, functionDefaultParameterIdentifierName2);
});
it('should keep same names for identifiers in function params and function body', () => {
assert.equal(functionParameterIdentifierName, functionBodyIdentifierName1);
assert.equal(functionDefaultParameterIdentifierName1, functionBodyIdentifierName2);
});
});
});
describe('array pattern as parameter', () => {
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
readFileAsString(__dirname + '/fixtures/array-pattern-as-parameter.js'),
{
...NO_CUSTOM_NODES_PRESET
}
);
const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
const functionParameterMatch: RegExp = /function *\(\[(_0x[a-f0-9]{4,6}), *(_0x[a-f0-9]{4,6})\]\) *\{/;
const functionBodyMatch: RegExp = /return *(_0x[a-f0-9]{4,6}) *\+ *(_0x[a-f0-9]{4,6});/;
const arrayPatternIdentifierName1: string = obfuscatedCode.match(functionParameterMatch)![1];
const arrayPatternIdentifierName2: string = obfuscatedCode.match(functionParameterMatch)![2];
const functionBodyIdentifierName1: string = obfuscatedCode.match(functionBodyMatch)![1];
const functionBodyIdentifierName2: string = obfuscatedCode.match(functionBodyMatch)![2];
it('should keep same names for identifiers in function parameter array pattern and function body', () => {
assert.equal(arrayPatternIdentifierName1, functionBodyIdentifierName1);
assert.equal(arrayPatternIdentifierName2, functionBodyIdentifierName2);
});
});
});
@@ -0,0 +1,5 @@
(function () {
var test = function ([foo, bar]) {
return foo + bar;
}
})();
@@ -0,0 +1,5 @@
(function () {
var test = function (bar = 1) {
return bar;
}
})();
@@ -0,0 +1,6 @@
(function () {
var foo = 1;
var test = function (bar = foo) {
return bar;
}
})();
@@ -0,0 +1,6 @@
(function () {
var foo = 1;
var test = function (foo, bar = foo) {
return foo + bar;
}
})();
@@ -200,11 +200,39 @@ describe('VariableDeclarationTransformer', () => {
const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
it('shouldn\'t transform object pattern variable declarator', () => {
const objectPatternVariableDeclarator: RegExp = /var *\{ *bar *\} *= *\{ *'\\x62\\x61\\x72' *: *'\\x66\\x6f\\x6f' *\};/;
const objectPatternVariableDeclaratorMatch: RegExp = /var *\{ *bar *\} *= *\{ *'\\x62\\x61\\x72' *: *'\\x66\\x6f\\x6f' *\};/;
const variableUsageMatch: RegExp = /console\['\\x6c\\x6f\\x67'\]\(bar\);/;
assert.match(obfuscatedCode, objectPatternVariableDeclarator);
assert.match(obfuscatedCode, objectPatternVariableDeclaratorMatch);
assert.match(obfuscatedCode, variableUsageMatch);
});
});
describe('array pattern as variable declarator', () => {
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
readFileAsString(__dirname + '/fixtures/array-pattern.js'),
{
...NO_CUSTOM_NODES_PRESET
}
);
const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
const objectPatternVariableDeclaratorMatch: RegExp = /var *\[ *(_0x([a-f0-9]){4,6}), *(_0x([a-f0-9]){4,6}) *\] *= *\[0x1, *0x2\];/;
const variableUsageMatch: RegExp = /console\['\\x6c\\x6f\\x67'\]\((_0x([a-f0-9]){4,6}), *(_0x([a-f0-9]){4,6})\);/;
const objectPatternIdentifierName1: string = obfuscatedCode.match(objectPatternVariableDeclaratorMatch)![1];
const objectPatternIdentifierName2: string = obfuscatedCode.match(objectPatternVariableDeclaratorMatch)![2];
const identifierName1: string = obfuscatedCode.match(variableUsageMatch)![1];
const identifierName2: string = obfuscatedCode.match(variableUsageMatch)![2];
it('should transform array pattern variable declarator', () => {
assert.match(obfuscatedCode, objectPatternVariableDeclaratorMatch);
assert.match(obfuscatedCode, variableUsageMatch);
});
it('should keep same identifier names same for identifiers in variable declaration and after variable declaration', () => {
assert.equal(objectPatternIdentifierName1, identifierName1);
assert.equal(objectPatternIdentifierName2, identifierName2);
});
});
});
@@ -0,0 +1,5 @@
function foo () {
var [bar, baz] = [1, 2];
console.log(bar, baz);
}
@@ -1,4 +1,5 @@
(function () {
var { bar } = { bar: 'foo' };
console.log(bar);
})();