Merge branch 'master' into rotate-string-array-improvements

# Conflicts:
#	CHANGELOG.md
#	dist/index.browser.js
#	dist/index.cli.js
#	dist/index.js
#	package.json
This commit is contained in:
sanex
2020-12-30 00:42:26 +03:00
23 changed files with 365 additions and 38 deletions
@@ -168,7 +168,7 @@ describe('SplitStringTransformer', () => {
describe('Variant #10: string with emoji', () => {
describe('Variant #1: single emoji', () => {
it('should correctly split string with emoji', () => {
const regExp: RegExp = /^'a' *\+ *'b' *\+ *'👋🏼' *\+ *'c' *\+ *'d';$/;
const regExp: RegExp = /^var test *= *'a' *\+ *'b' *\+ *'👋🏼' *\+ *'c' *\+ *'d'; *test;$/;
const code: string = readFileAsString(__dirname + '/fixtures/string-with-emoji-1.js');
@@ -206,7 +206,7 @@ describe('SplitStringTransformer', () => {
describe('Variant #2: multiple emoji', () => {
it('should correctly split string with emoji', () => {
const regExp: RegExp = /^'a' *\+ *'b' *\+ *'😴' *\+ *'😄' *\+ *'c' *\+ *'d';$/;
const regExp: RegExp = /^var test *= *'a' *\+ *'b' *\+ *'😴' *\+ *'😄' *\+ *'c' *\+ *'d'; *test;$/;
const code: string = readFileAsString(__dirname + '/fixtures/string-with-emoji-2.js');
@@ -244,7 +244,7 @@ describe('SplitStringTransformer', () => {
describe('Variant #3: correct split emoji', () => {
it('should correctly split string with emoji', () => {
const regExp: RegExp = /^'ab👋🏼' *\+ *'cd';$/;
const regExp: RegExp = /^var test *= *'ab👋🏼' *\+ *'cd'; *test;$/;
const code: string = readFileAsString(__dirname + '/fixtures/string-with-emoji-1.js');
@@ -1 +1,2 @@
'ab👋🏼cd';
var test = 'ab👋🏼cd';
test;
@@ -1 +1,2 @@
'ab😴😄cd';
var test = 'ab😴😄cd';
test;
@@ -0,0 +1,124 @@
import { assert } from 'chai';
import { NO_ADDITIONAL_NODES_PRESET } from '../../../../../src/options/presets/NoCustomNodes';
import { readFileAsString } from '../../../../helpers/readFileAsString';
import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade';
describe('DirectivePlacementTransformer', function () {
this.timeout(120000);
describe('Program lexical scope', () => {
describe('Variant #1: directive at the top of program scope', () => {
const directiveRegExp: RegExp = /^'use strict'; *var _0x([a-f0-9]){4} *= *\['test'];/;
let obfuscatedCode: string;
before(() => {
const code: string = readFileAsString(__dirname + '/fixtures/top-of-program-scope.js');
obfuscatedCode = JavaScriptObfuscator.obfuscate(
code,
{
...NO_ADDITIONAL_NODES_PRESET,
stringArray: true,
stringArrayThreshold: 1
}
).getObfuscatedCode();
});
it('should keep directive at the top of program scope', () => {
assert.match(obfuscatedCode, directiveRegExp);
});
});
describe('Variant #2: directive-like string literal at the middle of program scope', () => {
const directiveRegExp: RegExp = new RegExp(
'^var _0x([a-f0-9]){4} *= *\\[\'test\', *\'use\\\\x20strict\']; *' +
'.*?' +
'var test *= *_0x([a-f0-9]){4}\\(0x0\\); *' +
'_0x([a-f0-9]){4}\\(0x1\\);'
);
let obfuscatedCode: string;
before(() => {
const code: string = readFileAsString(__dirname + '/fixtures/middle-of-program-scope.js');
obfuscatedCode = JavaScriptObfuscator.obfuscate(
code,
{
...NO_ADDITIONAL_NODES_PRESET,
stringArray: true,
stringArrayThreshold: 1
}
).getObfuscatedCode();
});
it('should keep directive-like string literal at the middle of program scope', () => {
assert.match(obfuscatedCode, directiveRegExp);
});
});
});
describe('Function lexical scope', () => {
describe('Variant #1: directive at the top of function scope', () => {
const directiveRegExp: RegExp = new RegExp(
'function test\\(\\) *{ *' +
'\'use strict\'; *' +
'var _0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4}; *' +
'var _0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\\(0x0\\);'
);
let obfuscatedCode: string;
before(() => {
const code: string = readFileAsString(__dirname + '/fixtures/top-of-function-scope.js');
obfuscatedCode = JavaScriptObfuscator.obfuscate(
code,
{
...NO_ADDITIONAL_NODES_PRESET,
stringArray: true,
stringArrayThreshold: 1,
stringArrayWrappersCount: 1
}
).getObfuscatedCode();
});
it('should keep directive at the top of function scope', () => {
assert.match(obfuscatedCode, directiveRegExp);
});
});
describe('Variant #2: directive-like string literal at the middle of function scope', () => {
const directiveRegExp: RegExp = new RegExp(
'function test\\(\\) *{ *' +
'var _0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4}; *' +
'var _0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\\(0x0\\);' +
'_0x([a-f0-9]){4,6}\\(0x1\\);'
);
let obfuscatedCode: string;
before(() => {
const code: string = readFileAsString(__dirname + '/fixtures/middle-of-function-scope.js');
obfuscatedCode = JavaScriptObfuscator.obfuscate(
code,
{
...NO_ADDITIONAL_NODES_PRESET,
stringArray: true,
stringArrayThreshold: 1,
stringArrayWrappersCount: 1
}
).getObfuscatedCode();
});
it('should keep directive-like string literal at the middle of function scope', () => {
assert.match(obfuscatedCode, directiveRegExp);
});
})
});
});
@@ -0,0 +1,4 @@
function test () {
var test = 'test';
'use strict';
}
@@ -0,0 +1,4 @@
function test () {
'use strict';
var test = 'test';
}
+1
View File
@@ -98,6 +98,7 @@ import './functional-tests/node-transformers/converting-transformers/object-patt
import './functional-tests/node-transformers/converting-transformers/split-string-transformer/SplitStringTransformer.spec';
import './functional-tests/node-transformers/converting-transformers/template-literal-transformer/TemplateLiteralTransformer.spec';
import './functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec';
import './functional-tests/node-transformers/finalizing-transformers/directive-placement-transformer/DirectivePlacementTransformer.spec';
import './functional-tests/node-transformers/finalizing-transformers/escape-sequence-transformer/EscapeSequenceTransformer.spec';
import './functional-tests/node-transformers/initializing-transformers/comments-transformer/CommentsTransformer.spec';
import './functional-tests/node-transformers/preparing-transformers/eval-call-expression-transformer/EvalCallExpressionTransformer.spec';
@@ -39,7 +39,7 @@ describe('NodeMetadata', () => {
node = NodeFactory.literalNode('foo');
node.metadata = {};
node.metadata.replacedLiteral = true;
value = NodeMetadata.get<ESTree.LiteralNodeMetadata>(node, 'replacedLiteral');
value = NodeMetadata.get<ESTree.LiteralNodeMetadata, 'replacedLiteral'>(node, 'replacedLiteral');
});
it('should get metadata value of the node', () => {