diff --git a/CHANGELOG.md b/CHANGELOG.md index ad3345cc..aa82e496 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,12 @@ Change Log === -v0.9.4 +v0.10.0 --- +* **New option:** `deadCodeInjection`. With this option random blocks of dead code will add to the obfuscated code. +* **New option:** `deadCodeInjectionThreshold` allows to set percentage of nodes that will affected by `deadCodeInjection`. +* **New option:** `mangle` enables mangling of variable names. +* `escapeUnicodeSequence` option now disabled by default. +* `controlFlowFlattening` now affects string literal nodes. * increased runtime performance with `rc4` `stringArrayEncoding`. v0.9.3 @@ -10,11 +15,11 @@ v0.9.3 v0.9.2 --- -* fixed https://github.com/javascript-obfuscator/javascript-obfuscator/pull/42 +* Removed coverage dir from npm package v0.9.1 --- -* fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/37 +* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/37 v0.9.0 --- diff --git a/README.md b/README.md index f72ae238..a77f7be8 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # JavaScript obfuscator for Node.js -JavaScript obfuscator for Node.js is a free obfuscator with a wide number of features which provides protection for your source code. +JavaScript obfuscator is a powerful free obfuscator for JavaScript and Node.js with a wide number of features which provides protection for your source code. * has no limits or restrictions * runs on your local machine - does not send data to a server; @@ -29,7 +29,7 @@ Example of obfuscated code: [gist.github.com](https://gist.github.com/sanex3339/ *NOTE! the README on the master branch might not match that of the latest stable release!* ## :warning: Important -#####Obfuscate only the code that belongs to you. +##### Obfuscate only the code that belongs to you. It is not recommended to obfuscate vendor scripts and polyfills, since the obfuscated code is 15-80% slower (depends on options) and the files are significantly larger. @@ -176,9 +176,12 @@ Following options are available for the JS Obfuscator: compact: true, controlFlowFlattening: false, controlFlowFlatteningThreshold: 0.75, + deadCodeInjection: false, + deadCodeInjectionThreshold: 0.4, debugProtection: false, debugProtectionInterval: false, disableConsoleOutput: true, + mangle: false, reservedNames: [], rotateStringArray: true, seed: 0, @@ -189,8 +192,8 @@ Following options are available for the JS Obfuscator: sourceMapMode: 'separate', stringArray: true, stringArrayEncoding: false, - stringArrayThreshold: 0.8, - unicodeEscapeSequence: true + stringArrayThreshold: 0.75, + unicodeEscapeSequence: false } ``` @@ -204,9 +207,12 @@ Following options are available for the JS Obfuscator: --compact --controlFlowFlattening --controlFlowFlatteningThreshold + --deadCodeInjection + --deadCodeInjectionThreshold --debugProtection --debugProtectionInterval --disableConsoleOutput + --mangle --reservedNames (comma separated) --rotateStringArray --seed @@ -300,6 +306,116 @@ This setting is especially useful for large code size because large amounts of c `controlFlowFlatteningThreshold: 0` equals to `controlFlowFlattening: false`. +### `deadCodeInjection` +Type: `boolean` Default: `false` + +##### :warning: Dramatically increases size of obfuscated code (up to 200%), use only if size of obfuscated code doesn't matter. Use [`deadCodeInjectionThreshold`](#deadcodeinjectionthreshold) to set percentage of nodes that will affected by dead code injection. +##### :warning: This option forcibly enables `stringArray` option. + +With this option random blocks of dead code will add to the obfuscated code. + +Example: +```ts +// input +(function(){ + if (true) { + var foo = function () { + console.log('abc'); + console.log('cde'); + console.log('efg'); + console.log('hij'); + }; + + var bar = function () { + console.log('klm'); + console.log('nop'); + console.log('qrs'); + }; + + var baz = function () { + console.log('tuv'); + console.log('wxy'); + console.log('z'); + }; + + foo(); + bar(); + baz(); + } +})(); + +// output +var _0x5024 = [ + 'zaU', + 'log', + 'tuv', + 'wxy', + 'abc', + 'cde', + 'efg', + 'hij', + 'QhG', + 'TeI', + 'klm', + 'nop', + 'qrs', + 'bZd', + 'HMx' +]; +var _0x4502 = function (_0x1254b1, _0x583689) { + _0x1254b1 = _0x1254b1 - 0x0; + var _0x529b49 = _0x5024[_0x1254b1]; + return _0x529b49; +}; +(function () { + if (!![]) { + var _0x16c18d = function () { + if (_0x4502('0x0') !== _0x4502('0x0')) { + console[_0x4502('0x1')](_0x4502('0x2')); + console[_0x4502('0x1')](_0x4502('0x3')); + console[_0x4502('0x1')]('z'); + } else { + console[_0x4502('0x1')](_0x4502('0x4')); + console[_0x4502('0x1')](_0x4502('0x5')); + console[_0x4502('0x1')](_0x4502('0x6')); + console[_0x4502('0x1')](_0x4502('0x7')); + } + }; + var _0x1f7292 = function () { + if (_0x4502('0x8') === _0x4502('0x9')) { + console[_0x4502('0x1')](_0x4502('0xa')); + console[_0x4502('0x1')](_0x4502('0xb')); + console[_0x4502('0x1')](_0x4502('0xc')); + } else { + console[_0x4502('0x1')](_0x4502('0xa')); + console[_0x4502('0x1')](_0x4502('0xb')); + console[_0x4502('0x1')](_0x4502('0xc')); + } + }; + var _0x33b212 = function () { + if (_0x4502('0xd') !== _0x4502('0xe')) { + console[_0x4502('0x1')](_0x4502('0x2')); + console[_0x4502('0x1')](_0x4502('0x3')); + console[_0x4502('0x1')]('z'); + } else { + console[_0x4502('0x1')](_0x4502('0x4')); + console[_0x4502('0x1')](_0x4502('0x5')); + console[_0x4502('0x1')](_0x4502('0x6')); + console[_0x4502('0x1')](_0x4502('0x7')); + } + }; + _0x16c18d(); + _0x1f7292(); + _0x33b212(); + } +}()); +``` + +### `deadCodeInjectionThreshold` +Type: `number` Default: `0.4` Min: `0` Max: `1` + +Allows to set percentage of nodes that will affected by `deadCodeInjection`. + ### `debugProtection` Type: `boolean` Default: `false` @@ -330,6 +446,11 @@ Locks the obfuscated source code so it only runs on specific domains and/or sub- ##### Multiple domains and sub-domains It's possible to lock your code to more than one domain or sub-domain. For instance, to lock it so the code only runs on **www.example.com** add `www.example.com`, to make it work on any sub-domain from example.com, use `.example.com`. +### `mangle` +Type: `boolean` Default: `false` + +Enables mangling of variable names. + ### `reservedNames` Type: `string[]` Default: `[]` @@ -445,11 +566,11 @@ This setting is especially useful for large code size because it repeatedly call `stringArrayThreshold: 0` equals to `stringArray: false`. ### `unicodeEscapeSequence` -Type: `boolean` Default: `true` +Type: `boolean` Default: `false` Allows to enable/disable string conversion to unicode escape sequence. -Unicode escape sequence increases code size greatly. It is recommended to disable this option when using [`stringArrayEncoding`](#stringarrayencoding) (especially with `rc4` encoding). +Unicode escape sequence increases code size greatly and strings easily can be reverted to their original view. Recommended to enable this option only for small source code. ## Preset Options ### High obfuscation, low performance @@ -458,18 +579,21 @@ Performance will 50-100% slower than without obfuscation ```javascript { - compact: true, - controlFlowFlattening: true, - controlFlowFlatteningThreshold: 1, - debugProtection: true, - debugProtectionInterval: true, - disableConsoleOutput: true, - rotateStringArray: true, - selfDefending: true, - stringArray: true, - stringArrayEncoding: 'rc4', - stringArrayThreshold: 1, - unicodeEscapeSequence: false + compact: true, + controlFlowFlattening: true, + controlFlowFlatteningThreshold: 1, + deadCodeInjection: true, + deadCodeInjectionThreshold: 1, + debugProtection: true, + debugProtectionInterval: true, + disableConsoleOutput: true, + mangle: false, + rotateStringArray: true, + selfDefending: true, + stringArray: true, + stringArrayEncoding: 'rc4', + stringArrayThreshold: 1, + unicodeEscapeSequence: false } ``` @@ -479,18 +603,21 @@ Performance will 30-35% slower than without obfuscation ```javascript { - compact: true, - controlFlowFlattening: true, - controlFlowFlatteningThreshold: 0.75, - debugProtection: false, - debugProtectionInterval: false, - disableConsoleOutput: true, - rotateStringArray: true, - selfDefending: true, - stringArray: true, - stringArrayEncoding: 'base64', - stringArrayThreshold: 0.75, - unicodeEscapeSequence: false + compact: true, + controlFlowFlattening: true, + controlFlowFlatteningThreshold: 0.75, + deadCodeInjection: true, + deadCodeInjectionThreshold: 0.4, + debugProtection: false, + debugProtectionInterval: false, + disableConsoleOutput: true, + mangle: false, + rotateStringArray: true, + selfDefending: true, + stringArray: true, + stringArrayEncoding: 'base64', + stringArrayThreshold: 0.75, + unicodeEscapeSequence: false } ``` @@ -500,17 +627,19 @@ Performance will slightly slower than without obfuscation ```javascript { - compact: true, - controlFlowFlattening: false, - debugProtection: false, - debugProtectionInterval: false, - disableConsoleOutput: true, - rotateStringArray: true, - selfDefending: true, - stringArray: true, - stringArrayEncoding: false, - stringArrayThreshold: 0.75, - unicodeEscapeSequence: true + compact: true, + controlFlowFlattening: false, + deadCodeInjection: false, + debugProtection: false, + debugProtectionInterval: false, + disableConsoleOutput: true, + mangle: true, + rotateStringArray: true, + selfDefending: true, + stringArray: true, + stringArrayEncoding: false, + stringArrayThreshold: 0.75, + unicodeEscapeSequence: false } ``` diff --git a/dist/index.js b/dist/index.js index 4bbe1d6b..11623328 100644 --- a/dist/index.js +++ b/dist/index.js @@ -33,9 +33,9 @@ module.exports = /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) +/******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; -/******/ +/******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, @@ -90,7 +90,7 @@ module.exports = /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 128); +/******/ return __webpack_require__(__webpack_require__.s = 38); /******/ }) /************************************************************************/ /******/ ([ @@ -112,6 +112,7 @@ module.exports = require("tslib"); "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); exports.ServiceIdentifiers = { Factory__ICalleeDataExtractor: Symbol('Factory'), Factory__IControlFlowReplacer: Symbol('Factory'), @@ -124,6 +125,7 @@ exports.ServiceIdentifiers = { ICalleeDataExtractor: Symbol('ICalleeDataExtractor'), ICustomNodeGroup: Symbol('ICustomNodeGroup'), IControlFlowReplacer: Symbol('IControlFlowReplacer'), + IDeadCodeInjectionReplacer: Symbol('IDeadCodeInjectionReplacer'), IJavaScriptObfuscator: Symbol('IJavaScriptObfuscator'), INodeTransformer: Symbol('INodeTransformer'), IObfuscationEventEmitter: Symbol('IObfuscationEventEmitter'), @@ -146,16 +148,19 @@ exports.ServiceIdentifiers = { "use strict"; +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var escodegen = __webpack_require__(20); +Object.defineProperty(exports, "__esModule", { value: true }); +var escodegen = __webpack_require__(23); var esprima = __webpack_require__(36); var estraverse = __webpack_require__(11); -var NodeType_1 = __webpack_require__(13); +var NodeType_1 = __webpack_require__(14); var Node_1 = __webpack_require__(6); -var Nodes_1 = __webpack_require__(14); +var Nodes_1 = __webpack_require__(12); var NodeUtils = function () { function NodeUtils() { @@ -175,6 +180,31 @@ var NodeUtils = function () { }); return astTree; } + }, { + key: "clone", + value: function clone(astTree) { + var cloneRecursive = function cloneRecursive(node) { + var copy = {}; + Object.keys(node).filter(function (property) { + return property !== 'parentNode'; + }).forEach(function (property) { + var value = node[property]; + var clonedValue = void 0; + if (value === null || value instanceof RegExp) { + clonedValue = value; + } else if (Array.isArray(value)) { + clonedValue = value.map(cloneRecursive); + } else if ((typeof value === "undefined" ? "undefined" : _typeof(value)) === 'object') { + clonedValue = cloneRecursive(value); + } else { + clonedValue = value; + } + copy[property] = clonedValue; + }); + return copy; + }; + return NodeUtils.parentize(cloneRecursive(astTree)); + } }, { key: "convertCodeToStructure", value: function convertCodeToStructure(code) { @@ -321,7 +351,8 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var chance_1 = __webpack_require__(121); +Object.defineProperty(exports, "__esModule", { value: true }); +var chance_1 = __webpack_require__(139); var Utils_1 = __webpack_require__(8); var RandomGeneratorUtils = function () { @@ -413,6 +444,7 @@ exports.RandomGeneratorUtils = RandomGeneratorUtils; "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); function initializable() { var initializeMethodKey = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'initialize'; @@ -424,15 +456,15 @@ function initializable() { }; var initializeMethod = target[initializeMethodKey]; if (!initializeMethod || typeof initializeMethod !== 'function') { - throw new Error('`' + initializeMethodKey + '` method with initialization logic not found. `@' + decoratorName + '` decorator requires `' + initializeMethodKey + '` method'); + throw new Error("`" + initializeMethodKey + "` method with initialization logic not found. `@" + decoratorName + "` decorator requires `" + initializeMethodKey + "` method"); } - var metadataPropertyKey = '_' + propertyKey; + var metadataPropertyKey = "_" + propertyKey; var propertyDescriptor = Object.getOwnPropertyDescriptor(target, metadataPropertyKey) || descriptor; var methodDescriptor = Object.getOwnPropertyDescriptor(target, initializeMethodKey) || descriptor; var originalMethod = methodDescriptor.value; Object.defineProperty(target, propertyKey, Object.assign({}, propertyDescriptor, { get: function get() { if (this[metadataPropertyKey] === undefined) { - throw new Error('Property `' + propertyKey + '` is not initialized! Initialize it first!'); + throw new Error("Property `" + propertyKey + "` is not initialized! Initialize it first!"); } return this[metadataPropertyKey]; }, set: function set(newVal) { @@ -458,7 +490,8 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var NodeType_1 = __webpack_require__(13); +Object.defineProperty(exports, "__esModule", { value: true }); +var NodeType_1 = __webpack_require__(14); var Node = function () { function Node() { @@ -626,6 +659,7 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); @@ -673,7 +707,8 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var JSFuck_1 = __webpack_require__(27); +Object.defineProperty(exports, "__esModule", { value: true }); +var JSFuck_1 = __webpack_require__(29); var RandomGeneratorUtils_1 = __webpack_require__(4); var Utils = function () { @@ -812,6 +847,7 @@ exports.Utils = Utils; "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var CustomNodes; (function (CustomNodes) { CustomNodes[CustomNodes["BinaryExpressionFunctionNode"] = 0] = "BinaryExpressionFunctionNode"; @@ -831,6 +867,8 @@ var CustomNodes; CustomNodes[CustomNodes["StringArrayCallsWrapper"] = 14] = "StringArrayCallsWrapper"; CustomNodes[CustomNodes["StringArrayNode"] = 15] = "StringArrayNode"; CustomNodes[CustomNodes["StringArrayRotateFunctionNode"] = 16] = "StringArrayRotateFunctionNode"; + CustomNodes[CustomNodes["StringLiteralControlFlowStorageCallNode"] = 17] = "StringLiteralControlFlowStorageCallNode"; + CustomNodes[CustomNodes["StringLiteralNode"] = 18] = "StringLiteralNode"; })(CustomNodes = exports.CustomNodes || (exports.CustomNodes = {})); /***/ }), @@ -842,6 +880,7 @@ var CustomNodes; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); @@ -863,58 +902,6 @@ module.exports = require("estraverse"); /***/ }), /* 12 */ -/***/ (function(module, exports) { - -module.exports = require("string-template"); - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var Utils_1 = __webpack_require__(8); -exports.NodeType = Utils_1.Utils.strEnumify({ - ArrayExpression: 'ArrayExpression', - ArrowFunctionExpression: 'ArrowFunctionExpression', - AssignmentExpression: 'AssignmentExpression', - AssignmentPattern: 'AssignmentPattern', - BinaryExpression: 'BinaryExpression', - BlockStatement: 'BlockStatement', - BreakStatement: 'BreakStatement', - CallExpression: 'CallExpression', - CatchClause: 'CatchClause', - ClassDeclaration: 'ClassDeclaration', - ContinueStatement: 'ContinueStatement', - ExpressionStatement: 'ExpressionStatement', - FunctionDeclaration: 'FunctionDeclaration', - FunctionExpression: 'FunctionExpression', - Identifier: 'Identifier', - IfStatement: 'IfStatement', - LabeledStatement: 'LabeledStatement', - Literal: 'Literal', - LogicalExpression: 'LogicalExpression', - MemberExpression: 'MemberExpression', - MethodDefinition: 'MethodDefinition', - ObjectExpression: 'ObjectExpression', - ObjectPattern: 'ObjectPattern', - Program: 'Program', - Property: 'Property', - ReturnStatement: 'ReturnStatement', - SwitchCase: 'SwitchCase', - SwitchStatement: 'SwitchStatement', - TemplateLiteral: 'TemplateLiteral', - TryStatement: 'TryStatement', - UnaryExpression: 'UnaryExpression', - UpdateExpression: 'UpdateExpression', - VariableDeclaration: 'VariableDeclaration', - VariableDeclarator: 'VariableDeclarator', - WhileStatement: 'WhileStatement' -}); - -/***/ }), -/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -924,8 +911,9 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var escodegen = __webpack_require__(20); -var NodeType_1 = __webpack_require__(13); +Object.defineProperty(exports, "__esModule", { value: true }); +var escodegen = __webpack_require__(23); +var NodeType_1 = __webpack_require__(14); var Nodes = function () { function Nodes() { @@ -1059,13 +1047,9 @@ var Nodes = function () { } }, { key: "getIfStatementNode", - value: function getIfStatementNode(test, consequent) { - return { - type: NodeType_1.NodeType.IfStatement, - test: test, - consequent: consequent, - obfuscatedNode: false - }; + value: function getIfStatementNode(test, consequent, alternate) { + return Object.assign({ type: NodeType_1.NodeType.IfStatement, test: test, + consequent: consequent }, alternate && { alternate: alternate }, { obfuscatedNode: false }); } }, { key: "getIdentifierNode", @@ -1242,6 +1226,59 @@ var Nodes = function () { exports.Nodes = Nodes; +/***/ }), +/* 13 */ +/***/ (function(module, exports) { + +module.exports = require("string-template"); + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var Utils_1 = __webpack_require__(8); +exports.NodeType = Utils_1.Utils.strEnumify({ + ArrayExpression: 'ArrayExpression', + ArrowFunctionExpression: 'ArrowFunctionExpression', + AssignmentExpression: 'AssignmentExpression', + AssignmentPattern: 'AssignmentPattern', + BinaryExpression: 'BinaryExpression', + BlockStatement: 'BlockStatement', + BreakStatement: 'BreakStatement', + CallExpression: 'CallExpression', + CatchClause: 'CatchClause', + ClassDeclaration: 'ClassDeclaration', + ContinueStatement: 'ContinueStatement', + ExpressionStatement: 'ExpressionStatement', + FunctionDeclaration: 'FunctionDeclaration', + FunctionExpression: 'FunctionExpression', + Identifier: 'Identifier', + IfStatement: 'IfStatement', + LabeledStatement: 'LabeledStatement', + Literal: 'Literal', + LogicalExpression: 'LogicalExpression', + MemberExpression: 'MemberExpression', + MethodDefinition: 'MethodDefinition', + ObjectExpression: 'ObjectExpression', + ObjectPattern: 'ObjectPattern', + Program: 'Program', + Property: 'Property', + ReturnStatement: 'ReturnStatement', + SwitchCase: 'SwitchCase', + SwitchStatement: 'SwitchStatement', + TemplateLiteral: 'TemplateLiteral', + TryStatement: 'TryStatement', + UnaryExpression: 'UnaryExpression', + UpdateExpression: 'UpdateExpression', + VariableDeclaration: 'VariableDeclaration', + VariableDeclarator: 'VariableDeclarator', + WhileStatement: 'WhileStatement' +}); + /***/ }), /* 15 */ /***/ (function(module, exports, __webpack_require__) { @@ -1249,6 +1286,7 @@ exports.Nodes = Nodes; "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); exports.ObfuscationEvents = { AfterObfuscation: 'afterObfuscation', BeforeObfuscation: 'beforeObfuscation' @@ -1261,6 +1299,7 @@ exports.ObfuscationEvents = { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var ObfuscationReplacers; (function (ObfuscationReplacers) { ObfuscationReplacers[ObfuscationReplacers["BooleanReplacer"] = 0] = "BooleanReplacer"; @@ -1280,10 +1319,11 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -__webpack_require__(127); +Object.defineProperty(exports, "__esModule", { value: true }); +__webpack_require__(146); var ServiceIdentifiers_1 = __webpack_require__(2); -var InversifyContainerFacade_1 = __webpack_require__(44); -var JavaScriptObfuscatorCLI_1 = __webpack_require__(43); +var InversifyContainerFacade_1 = __webpack_require__(48); +var JavaScriptObfuscatorCLI_1 = __webpack_require__(44); var RandomGeneratorUtils_1 = __webpack_require__(4); var JavaScriptObfuscator = function () { @@ -1329,6 +1369,7 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var RandomGeneratorUtils_1 = __webpack_require__(4); var NodeAppender = function () { @@ -1429,6 +1470,7 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); @@ -1467,9 +1509,16 @@ exports.AbstractCustomNodeGroup = AbstractCustomNodeGroup; /***/ }), /* 20 */ -/***/ (function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { -module.exports = require("escodegen-wallaby"); +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SourceMapMode = { + Inline: 'inline', + Separate: 'separate' +}; /***/ }), /* 21 */ @@ -1478,20 +1527,9 @@ module.exports = require("escodegen-wallaby"); "use strict"; -exports.SourceMapMode = { - Inline: 'inline', - Separate: 'separate' -}; - -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); @@ -1504,21 +1542,25 @@ AbstractReplacer = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__param exports.AbstractReplacer = AbstractReplacer; /***/ }), -/* 23 */ +/* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var SourceMapMode_1 = __webpack_require__(21); +Object.defineProperty(exports, "__esModule", { value: true }); +var SourceMapMode_1 = __webpack_require__(20); exports.NO_CUSTOM_NODES_PRESET = Object.freeze({ compact: true, controlFlowFlattening: false, controlFlowFlatteningThreshold: 0, + deadCodeInjection: false, + deadCodeInjectionThreshold: 0, debugProtection: false, debugProtectionInterval: false, disableConsoleOutput: false, domainLock: [], + mangle: false, reservedNames: [], rotateStringArray: false, seed: 0, @@ -1530,9 +1572,15 @@ exports.NO_CUSTOM_NODES_PRESET = Object.freeze({ stringArray: false, stringArrayEncoding: false, stringArrayThreshold: 0, - unicodeEscapeSequence: true + unicodeEscapeSequence: false }); +/***/ }), +/* 23 */ +/***/ (function(module, exports) { + +module.exports = require("escodegen-wallaby"); + /***/ }), /* 24 */ /***/ (function(module, exports, __webpack_require__) { @@ -1540,6 +1588,7 @@ exports.NO_CUSTOM_NODES_PRESET = Object.freeze({ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); exports.StringArrayEncoding = { base64: 'base64', rc4: 'rc4' @@ -1552,8 +1601,109 @@ exports.StringArrayEncoding = { "use strict"; +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(1); +var inversify_1 = __webpack_require__(0); +var ServiceIdentifiers_1 = __webpack_require__(2); +var RandomGeneratorUtils_1 = __webpack_require__(4); +var AbstractControlFlowReplacer = AbstractControlFlowReplacer_1 = function () { + function AbstractControlFlowReplacer(customNodeFactory, options) { + _classCallCheck(this, AbstractControlFlowReplacer); + + this.replacerDataByControlFlowStorageId = new Map(); + this.customNodeFactory = customNodeFactory; + this.options = options; + } + + _createClass(AbstractControlFlowReplacer, [{ + key: "insertCustomNodeToControlFlowStorage", + value: function insertCustomNodeToControlFlowStorage(customNode, controlFlowStorage, replacerId, usingExistingIdentifierChance) { + var controlFlowStorageId = controlFlowStorage.getStorageId(); + var storageKeysById = AbstractControlFlowReplacer_1.getStorageKeysByIdForCurrentStorage(this.replacerDataByControlFlowStorageId, controlFlowStorageId); + var storageKeysForCurrentId = storageKeysById.get(replacerId); + if (RandomGeneratorUtils_1.RandomGeneratorUtils.getMathRandom() < usingExistingIdentifierChance && storageKeysForCurrentId && storageKeysForCurrentId.length) { + return RandomGeneratorUtils_1.RandomGeneratorUtils.getRandomGenerator().pickone(storageKeysForCurrentId); + } + var generateStorageKey = function generateStorageKey(length) { + var storageKey = RandomGeneratorUtils_1.RandomGeneratorUtils.getRandomString(length); + if (controlFlowStorage.getStorage().has(storageKey)) { + return generateStorageKey(length); + } + return storageKey; + }; + var storageKey = generateStorageKey(3); + storageKeysById.set(replacerId, [storageKey]); + this.replacerDataByControlFlowStorageId.set(controlFlowStorageId, storageKeysById); + controlFlowStorage.set(storageKey, customNode); + return storageKey; + } + }], [{ + key: "getStorageKeysByIdForCurrentStorage", + value: function getStorageKeysByIdForCurrentStorage(identifierDataByControlFlowStorageId, controlFlowStorageId) { + var storageKeysById = void 0; + if (identifierDataByControlFlowStorageId.has(controlFlowStorageId)) { + storageKeysById = identifierDataByControlFlowStorageId.get(controlFlowStorageId); + } else { + storageKeysById = new Map(); + } + return storageKeysById; + } + }]); + + return AbstractControlFlowReplacer; +}(); +AbstractControlFlowReplacer = AbstractControlFlowReplacer_1 = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.Factory__ICustomNode)), tslib_1.__param(1, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IOptions)), tslib_1.__metadata("design:paramtypes", [Function, Object])], AbstractControlFlowReplacer); +exports.AbstractControlFlowReplacer = AbstractControlFlowReplacer; +var AbstractControlFlowReplacer_1; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var SourceMapMode_1 = __webpack_require__(20); +exports.DEFAULT_PRESET = Object.freeze({ + compact: true, + controlFlowFlattening: false, + controlFlowFlatteningThreshold: 0.75, + deadCodeInjection: false, + deadCodeInjectionThreshold: 0.4, + debugProtection: false, + debugProtectionInterval: false, + disableConsoleOutput: true, + domainLock: [], + mangle: false, + reservedNames: [], + rotateStringArray: true, + seed: 0, + selfDefending: false, + sourceMap: false, + sourceMapBaseUrl: '', + sourceMapFileName: '', + sourceMapMode: SourceMapMode_1.SourceMapMode.Separate, + stringArray: true, + stringArrayEncoding: false, + stringArrayThreshold: 0.75, + unicodeEscapeSequence: false +}); + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var AbstractCalleeDataExtractor = function AbstractCalleeDataExtractor() { @@ -1563,7 +1713,7 @@ AbstractCalleeDataExtractor = tslib_1.__decorate([inversify_1.injectable()], Abs exports.AbstractCalleeDataExtractor = AbstractCalleeDataExtractor; /***/ }), -/* 26 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1573,6 +1723,7 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var RandomGeneratorUtils_1 = __webpack_require__(4); var Utils_1 = __webpack_require__(8); @@ -1621,7 +1772,7 @@ var CryptUtils = function () { length: length, pool: RandomGeneratorUtils_1.RandomGeneratorUtils.randomGeneratorPool }); - var randomStringDiff = randomString.replace(new RegExp('[' + escapeRegExp(str) + ']', 'g'), ''); + var randomStringDiff = randomString.replace(new RegExp("[" + escapeRegExp(str) + "]", 'g'), ''); var randomStringDiffArray = randomStringDiff.split(''); RandomGeneratorUtils_1.RandomGeneratorUtils.getRandomGenerator().shuffle(randomStringDiffArray); randomStringDiff = randomStringDiffArray.join(''); @@ -1663,12 +1814,13 @@ var CryptUtils = function () { exports.CryptUtils = CryptUtils; /***/ }), -/* 27 */ +/* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); exports.JSFuck = { False: '![]', True: '!![]', @@ -1705,55 +1857,27 @@ exports.JSFuck = { E: '(RegExp+"")[12]', F: '(+[]+Function)[10]', G: '(false+Function("return Date")()())[30]', - H: '\'H\'', + H: "'H'", I: '(Infinity+"")[0]', - J: '\'J\'', - K: '\'K\'', - L: '\'L\'', + J: "'J'", + K: "'K'", + L: "'L'", M: '(true+Function("return Date")()())[30]', N: '(NaN+"")[0]', O: '(NaN+Function("return{}")())[11]', - P: '\'P\'', - Q: '\'Q\'', + P: "'P'", + Q: "'Q'", R: '(+[]+RegExp)[10]', S: '(+[]+String)[10]', T: '(NaN+Function("return Date")()())[30]', U: '(NaN+Function("return{}")()["toString"]["call"]())[11]', - V: '\'V\'', - W: '\'W\'', - X: '\'X\'', - Y: '\'Y\'', - Z: '\'Z\'' + V: "'V'", + W: "'W'", + X: "'X'", + Y: "'Y'", + Z: "'Z'" }; -/***/ }), -/* 28 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var CalleeDataExtractors; -(function (CalleeDataExtractors) { - CalleeDataExtractors[CalleeDataExtractors["FunctionDeclarationCalleeDataExtractor"] = 0] = "FunctionDeclarationCalleeDataExtractor"; - CalleeDataExtractors[CalleeDataExtractors["FunctionExpressionCalleeDataExtractor"] = 1] = "FunctionExpressionCalleeDataExtractor"; - CalleeDataExtractors[CalleeDataExtractors["ObjectExpressionCalleeDataExtractor"] = 2] = "ObjectExpressionCalleeDataExtractor"; -})(CalleeDataExtractors = exports.CalleeDataExtractors || (exports.CalleeDataExtractors = {})); - -/***/ }), -/* 29 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var ControlFlowReplacers; -(function (ControlFlowReplacers) { - ControlFlowReplacers[ControlFlowReplacers["BinaryExpressionControlFlowReplacer"] = 0] = "BinaryExpressionControlFlowReplacer"; - ControlFlowReplacers[ControlFlowReplacers["CallExpressionControlFlowReplacer"] = 1] = "CallExpressionControlFlowReplacer"; - ControlFlowReplacers[ControlFlowReplacers["LogicalExpressionControlFlowReplacer"] = 2] = "LogicalExpressionControlFlowReplacer"; -})(ControlFlowReplacers = exports.ControlFlowReplacers || (exports.ControlFlowReplacers = {})); - /***/ }), /* 30 */ /***/ (function(module, exports, __webpack_require__) { @@ -1761,6 +1885,38 @@ var ControlFlowReplacers; "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var CalleeDataExtractors; +(function (CalleeDataExtractors) { + CalleeDataExtractors[CalleeDataExtractors["FunctionDeclarationCalleeDataExtractor"] = 0] = "FunctionDeclarationCalleeDataExtractor"; + CalleeDataExtractors[CalleeDataExtractors["FunctionExpressionCalleeDataExtractor"] = 1] = "FunctionExpressionCalleeDataExtractor"; + CalleeDataExtractors[CalleeDataExtractors["ObjectExpressionCalleeDataExtractor"] = 2] = "ObjectExpressionCalleeDataExtractor"; +})(CalleeDataExtractors = exports.CalleeDataExtractors || (exports.CalleeDataExtractors = {})); + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var ControlFlowReplacers; +(function (ControlFlowReplacers) { + ControlFlowReplacers[ControlFlowReplacers["BinaryExpressionControlFlowReplacer"] = 0] = "BinaryExpressionControlFlowReplacer"; + ControlFlowReplacers[ControlFlowReplacers["CallExpressionControlFlowReplacer"] = 1] = "CallExpressionControlFlowReplacer"; + ControlFlowReplacers[ControlFlowReplacers["LogicalExpressionControlFlowReplacer"] = 2] = "LogicalExpressionControlFlowReplacer"; + ControlFlowReplacers[ControlFlowReplacers["StringLiteralControlFlowReplacer"] = 3] = "StringLiteralControlFlowReplacer"; +})(ControlFlowReplacers = exports.ControlFlowReplacers || (exports.ControlFlowReplacers = {})); + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); var CustomNodeGroups; (function (CustomNodeGroups) { CustomNodeGroups[CustomNodeGroups["ConsoleOutputCustomNodeGroup"] = 0] = "ConsoleOutputCustomNodeGroup"; @@ -1771,95 +1927,32 @@ var CustomNodeGroups; })(CustomNodeGroups = exports.CustomNodeGroups || (exports.CustomNodeGroups = {})); /***/ }), -/* 31 */ +/* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var NodeTransformers; (function (NodeTransformers) { NodeTransformers[NodeTransformers["BlockStatementControlFlowTransformer"] = 0] = "BlockStatementControlFlowTransformer"; - NodeTransformers[NodeTransformers["FunctionControlFlowTransformer"] = 1] = "FunctionControlFlowTransformer"; - NodeTransformers[NodeTransformers["CatchClauseTransformer"] = 2] = "CatchClauseTransformer"; - NodeTransformers[NodeTransformers["FunctionDeclarationTransformer"] = 3] = "FunctionDeclarationTransformer"; - NodeTransformers[NodeTransformers["FunctionTransformer"] = 4] = "FunctionTransformer"; - NodeTransformers[NodeTransformers["LabeledStatementTransformer"] = 5] = "LabeledStatementTransformer"; - NodeTransformers[NodeTransformers["LiteralTransformer"] = 6] = "LiteralTransformer"; - NodeTransformers[NodeTransformers["MemberExpressionTransformer"] = 7] = "MemberExpressionTransformer"; - NodeTransformers[NodeTransformers["MethodDefinitionTransformer"] = 8] = "MethodDefinitionTransformer"; - NodeTransformers[NodeTransformers["ObjectExpressionTransformer"] = 9] = "ObjectExpressionTransformer"; - NodeTransformers[NodeTransformers["TemplateLiteralTransformer"] = 10] = "TemplateLiteralTransformer"; - NodeTransformers[NodeTransformers["VariableDeclarationTransformer"] = 11] = "VariableDeclarationTransformer"; + NodeTransformers[NodeTransformers["DeadCodeInjectionTransformer"] = 1] = "DeadCodeInjectionTransformer"; + NodeTransformers[NodeTransformers["FunctionControlFlowTransformer"] = 2] = "FunctionControlFlowTransformer"; + NodeTransformers[NodeTransformers["CatchClauseTransformer"] = 3] = "CatchClauseTransformer"; + NodeTransformers[NodeTransformers["FunctionDeclarationTransformer"] = 4] = "FunctionDeclarationTransformer"; + NodeTransformers[NodeTransformers["FunctionTransformer"] = 5] = "FunctionTransformer"; + NodeTransformers[NodeTransformers["LabeledStatementTransformer"] = 6] = "LabeledStatementTransformer"; + NodeTransformers[NodeTransformers["LiteralTransformer"] = 7] = "LiteralTransformer"; + NodeTransformers[NodeTransformers["MemberExpressionTransformer"] = 8] = "MemberExpressionTransformer"; + NodeTransformers[NodeTransformers["MethodDefinitionTransformer"] = 9] = "MethodDefinitionTransformer"; + NodeTransformers[NodeTransformers["ObjectExpressionTransformer"] = 10] = "ObjectExpressionTransformer"; + NodeTransformers[NodeTransformers["TemplateLiteralTransformer"] = 11] = "TemplateLiteralTransformer"; + NodeTransformers[NodeTransformers["VariableDeclarationTransformer"] = 12] = "VariableDeclarationTransformer"; })(NodeTransformers = exports.NodeTransformers || (exports.NodeTransformers = {})); /***/ }), -/* 32 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var tslib_1 = __webpack_require__(1); -var inversify_1 = __webpack_require__(0); -var ServiceIdentifiers_1 = __webpack_require__(2); -var RandomGeneratorUtils_1 = __webpack_require__(4); -var AbstractControlFlowReplacer = AbstractControlFlowReplacer_1 = function () { - function AbstractControlFlowReplacer(customNodeFactory, options) { - _classCallCheck(this, AbstractControlFlowReplacer); - - this.replacerDataByControlFlowStorageId = new Map(); - this.customNodeFactory = customNodeFactory; - this.options = options; - } - - _createClass(AbstractControlFlowReplacer, [{ - key: "insertCustomNodeToControlFlowStorage", - value: function insertCustomNodeToControlFlowStorage(customNode, controlFlowStorage, replacerId, usingExistingIdentifierChance) { - var controlFlowStorageId = controlFlowStorage.getStorageId(); - var storageKeysById = AbstractControlFlowReplacer_1.getStorageKeysByIdForCurrentStorage(this.replacerDataByControlFlowStorageId, controlFlowStorageId); - var storageKeysForCurrentId = storageKeysById.get(replacerId); - if (RandomGeneratorUtils_1.RandomGeneratorUtils.getMathRandom() > usingExistingIdentifierChance && storageKeysForCurrentId && storageKeysForCurrentId.length) { - return RandomGeneratorUtils_1.RandomGeneratorUtils.getRandomGenerator().pickone(storageKeysForCurrentId); - } - var generateStorageKey = function generateStorageKey(length) { - var storageKey = RandomGeneratorUtils_1.RandomGeneratorUtils.getRandomString(length); - if (controlFlowStorage.getStorage().has(storageKey)) { - return generateStorageKey(length); - } - return storageKey; - }; - var storageKey = generateStorageKey(3); - storageKeysById.set(replacerId, [storageKey]); - this.replacerDataByControlFlowStorageId.set(controlFlowStorageId, storageKeysById); - controlFlowStorage.set(storageKey, customNode); - return storageKey; - } - }], [{ - key: "getStorageKeysByIdForCurrentStorage", - value: function getStorageKeysByIdForCurrentStorage(identifierDataByControlFlowStorageId, controlFlowStorageId) { - var storageKeysById = void 0; - if (identifierDataByControlFlowStorageId.has(controlFlowStorageId)) { - storageKeysById = identifierDataByControlFlowStorageId.get(controlFlowStorageId); - } else { - storageKeysById = new Map(); - } - return storageKeysById; - } - }]); - - return AbstractControlFlowReplacer; -}(); -AbstractControlFlowReplacer = AbstractControlFlowReplacer_1 = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.Factory__ICustomNode)), tslib_1.__param(1, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IOptions)), tslib_1.__metadata("design:paramtypes", [Function, Object])], AbstractControlFlowReplacer); -exports.AbstractControlFlowReplacer = AbstractControlFlowReplacer; -var AbstractControlFlowReplacer_1; - -/***/ }), -/* 33 */ +/* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1873,10 +1966,11 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var AbstractControlFlowReplacer_1 = __webpack_require__(32); +var AbstractControlFlowReplacer_1 = __webpack_require__(25); var CustomNodes_1 = __webpack_require__(9); var Node_1 = __webpack_require__(6); var ExpressionWithOperatorControlFlowReplacer = function (_AbstractControlFlowR) { @@ -1909,36 +2003,6 @@ var ExpressionWithOperatorControlFlowReplacer = function (_AbstractControlFlowR) ExpressionWithOperatorControlFlowReplacer = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.Factory__ICustomNode)), tslib_1.__param(1, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IOptions)), tslib_1.__metadata("design:paramtypes", [Function, Object])], ExpressionWithOperatorControlFlowReplacer); exports.ExpressionWithOperatorControlFlowReplacer = ExpressionWithOperatorControlFlowReplacer; -/***/ }), -/* 34 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var SourceMapMode_1 = __webpack_require__(21); -exports.DEFAULT_PRESET = Object.freeze({ - compact: true, - controlFlowFlattening: false, - controlFlowFlatteningThreshold: 0.75, - debugProtection: false, - debugProtectionInterval: false, - disableConsoleOutput: true, - domainLock: [], - reservedNames: [], - rotateStringArray: true, - seed: 0, - selfDefending: false, - sourceMap: false, - sourceMapBaseUrl: '', - sourceMapFileName: '', - sourceMapMode: SourceMapMode_1.SourceMapMode.Separate, - stringArray: true, - stringArrayEncoding: false, - stringArrayThreshold: 0.8, - unicodeEscapeSequence: true -}); - /***/ }), /* 35 */ /***/ (function(module, exports, __webpack_require__) { @@ -1954,6 +2018,7 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var Initializable_1 = __webpack_require__(5); @@ -2070,15 +2135,28 @@ module.exports = require("path"); "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var JavaScriptObfuscator_1 = __webpack_require__(17); +module.exports = JavaScriptObfuscator_1.JavaScriptObfuscator; + +/***/ }), +/* 39 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var esprima = __webpack_require__(36); -var escodegen = __webpack_require__(20); +var escodegen = __webpack_require__(23); +var esmangle = __webpack_require__(142); var JavaScriptObfuscatorInternal = JavaScriptObfuscatorInternal_1 = function () { function JavaScriptObfuscatorInternal(obfuscator, sourceMapCorrector, options) { _classCallCheck(this, JavaScriptObfuscatorInternal); @@ -2104,10 +2182,12 @@ var JavaScriptObfuscatorInternal = JavaScriptObfuscatorInternal_1 = function () escodegenParams.sourceMap = 'sourceMap'; escodegenParams.sourceContent = sourceCode; } - escodegenParams.format = { - compact: this.options.compact - }; - var generatorOutput = escodegen.generate(astTree, escodegenParams); + if (this.options.mangle) { + astTree = esmangle.mangle(astTree); + } + var generatorOutput = escodegen.generate(astTree, Object.assign({}, escodegenParams, { format: { + compact: this.options.compact + } })); generatorOutput.map = generatorOutput.map ? generatorOutput.map.toString() : ''; return generatorOutput; } @@ -2129,7 +2209,7 @@ exports.JavaScriptObfuscatorInternal = JavaScriptObfuscatorInternal; var JavaScriptObfuscatorInternal_1; /***/ }), -/* 39 */ +/* 40 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2139,6 +2219,7 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var Initializable_1 = __webpack_require__(5); @@ -2178,7 +2259,7 @@ ObfuscationResult = tslib_1.__decorate([inversify_1.injectable()], ObfuscationRe exports.ObfuscationResult = ObfuscationResult; /***/ }), -/* 40 */ +/* 41 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2190,13 +2271,14 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var estraverse = __webpack_require__(11); -var NodeTransformers_1 = __webpack_require__(31); +var NodeTransformers_1 = __webpack_require__(33); var ObfuscationEvents_1 = __webpack_require__(15); -var VisitorDirection_1 = __webpack_require__(73); +var VisitorDirection_1 = __webpack_require__(79); var Node_1 = __webpack_require__(6); var NodeUtils_1 = __webpack_require__(3); var Obfuscator = Obfuscator_1 = function () { @@ -2225,9 +2307,8 @@ var Obfuscator = Obfuscator_1 = function () { _this.obfuscationEventEmitter.once(customNodeGroup.getAppendEvent(), customNodeGroup.appendCustomNodes.bind(customNodeGroup)); }); this.obfuscationEventEmitter.emit(ObfuscationEvents_1.ObfuscationEvents.BeforeObfuscation, astTree, stackTraceData); - if (this.options.controlFlowFlattening) { - astTree = this.transformAstTree(astTree, Obfuscator_1.controlFlowTransformersList); - } + astTree = this.transformAstTree(astTree, [].concat(_toConsumableArray(this.options.deadCodeInjection ? Obfuscator_1.deadCodeInjectionTransformersList : []))); + astTree = this.transformAstTree(astTree, [].concat(_toConsumableArray(this.options.controlFlowFlattening ? Obfuscator_1.controlFlowTransformersList : []))); astTree = this.transformAstTree(astTree, [].concat(_toConsumableArray(Obfuscator_1.convertingTransformersList), _toConsumableArray(Obfuscator_1.obfuscatingTransformersList))); this.obfuscationEventEmitter.emit(ObfuscationEvents_1.ObfuscationEvents.AfterObfuscation, astTree, stackTraceData); return astTree; @@ -2235,6 +2316,9 @@ var Obfuscator = Obfuscator_1 = function () { }, { key: "transformAstTree", value: function transformAstTree(astTree, nodeTransformers) { + if (!nodeTransformers.length) { + return astTree; + } var enterVisitors = []; var leaveVisitors = []; var nodeTransformersLength = nodeTransformers.length; @@ -2286,13 +2370,14 @@ var Obfuscator = Obfuscator_1 = function () { }(); Obfuscator.controlFlowTransformersList = [NodeTransformers_1.NodeTransformers.BlockStatementControlFlowTransformer, NodeTransformers_1.NodeTransformers.FunctionControlFlowTransformer]; Obfuscator.convertingTransformersList = [NodeTransformers_1.NodeTransformers.MemberExpressionTransformer, NodeTransformers_1.NodeTransformers.MethodDefinitionTransformer, NodeTransformers_1.NodeTransformers.TemplateLiteralTransformer]; +Obfuscator.deadCodeInjectionTransformersList = [NodeTransformers_1.NodeTransformers.DeadCodeInjectionTransformer]; Obfuscator.obfuscatingTransformersList = [NodeTransformers_1.NodeTransformers.CatchClauseTransformer, NodeTransformers_1.NodeTransformers.FunctionDeclarationTransformer, NodeTransformers_1.NodeTransformers.FunctionTransformer, NodeTransformers_1.NodeTransformers.LabeledStatementTransformer, NodeTransformers_1.NodeTransformers.LiteralTransformer, NodeTransformers_1.NodeTransformers.ObjectExpressionTransformer, NodeTransformers_1.NodeTransformers.VariableDeclarationTransformer]; Obfuscator = Obfuscator_1 = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IStackTraceAnalyzer)), tslib_1.__param(1, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IObfuscationEventEmitter)), tslib_1.__param(2, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.TCustomNodeGroupStorage)), tslib_1.__param(3, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.Factory__INodeTransformer)), tslib_1.__param(4, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IOptions)), tslib_1.__metadata("design:paramtypes", [Object, Object, Object, Function, Object])], Obfuscator); exports.Obfuscator = Obfuscator; var Obfuscator_1; /***/ }), -/* 41 */ +/* 42 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2302,11 +2387,12 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var SourceMapMode_1 = __webpack_require__(21); -var CryptUtils_1 = __webpack_require__(26); +var SourceMapMode_1 = __webpack_require__(20); +var CryptUtils_1 = __webpack_require__(28); var SourceMapCorrector = function () { function SourceMapCorrector(obfuscationResultFactory, options) { _classCallCheck(this, SourceMapCorrector); @@ -2350,7 +2436,7 @@ SourceMapCorrector = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__par exports.SourceMapCorrector = SourceMapCorrector; /***/ }), -/* 42 */ +/* 43 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2360,8 +2446,9 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var fs = __webpack_require__(125); -var mkdirp = __webpack_require__(126); +Object.defineProperty(exports, "__esModule", { value: true }); +var fs = __webpack_require__(144); +var mkdirp = __webpack_require__(145); var path = __webpack_require__(37); var CLIUtils = function () { @@ -2441,7 +2528,7 @@ CLIUtils.encoding = 'utf8'; exports.CLIUtils = CLIUtils; /***/ }), -/* 43 */ +/* 44 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2451,12 +2538,14 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var commander = __webpack_require__(123); +Object.defineProperty(exports, "__esModule", { value: true }); +var commander = __webpack_require__(141); var path = __webpack_require__(37); -var SourceMapMode_1 = __webpack_require__(21); -var StringArrayEncoding_1 = __webpack_require__(24); -var Default_1 = __webpack_require__(34); -var CLIUtils_1 = __webpack_require__(42); +var Default_1 = __webpack_require__(26); +var BooleanSanitizer_1 = __webpack_require__(45); +var SourceMapModeSanitizer_1 = __webpack_require__(46); +var StringArrayEncodingSanitizer_1 = __webpack_require__(47); +var CLIUtils_1 = __webpack_require__(43); var JavaScriptObfuscator_1 = __webpack_require__(17); var JavaScriptObfuscatorCLI = function () { @@ -2500,11 +2589,11 @@ var JavaScriptObfuscatorCLI = function () { }, { key: "configureCommands", value: function configureCommands() { - this.commands = new commander.Command().version(JavaScriptObfuscatorCLI.getBuildVersion(), '-v, --version').usage(' [options]').option('-o, --output ', 'Output path for obfuscated code').option('--compact ', 'Disable one line output code compacting', JavaScriptObfuscatorCLI.parseBoolean).option('--controlFlowFlattening ', 'Enables control flow flattening', JavaScriptObfuscatorCLI.parseBoolean).option('--controlFlowFlatteningThreshold ', 'The probability that the control flow flattening transformation will be applied to the node', parseFloat).option('--debugProtection ', 'Disable browser Debug panel (can cause DevTools enabled browser freeze)', JavaScriptObfuscatorCLI.parseBoolean).option('--debugProtectionInterval ', 'Disable browser Debug panel even after page was loaded (can cause DevTools enabled browser freeze)', JavaScriptObfuscatorCLI.parseBoolean).option('--disableConsoleOutput ', 'Allow console.log, console.info, console.error and console.warn messages output into browser console', JavaScriptObfuscatorCLI.parseBoolean).option('--domainLock ', 'Blocks the execution of the code in domains that do not match the passed RegExp patterns (comma separated)', function (value) { + this.commands = new commander.Command().version(JavaScriptObfuscatorCLI.getBuildVersion(), '-v, --version').usage(' [options]').option('-o, --output ', 'Output path for obfuscated code').option('--compact ', 'Disable one line output code compacting', BooleanSanitizer_1.BooleanSanitizer).option('--controlFlowFlattening ', 'Enables control flow flattening', BooleanSanitizer_1.BooleanSanitizer).option('--controlFlowFlatteningThreshold ', 'The probability that the control flow flattening transformation will be applied to the node', parseFloat).option('--deadCodeInjection ', 'Enables dead code injection', BooleanSanitizer_1.BooleanSanitizer).option('--deadCodeInjectionThreshold ', 'The probability that the dead code injection transformation will be applied to the node', parseFloat).option('--debugProtection ', 'Disable browser Debug panel (can cause DevTools enabled browser freeze)', BooleanSanitizer_1.BooleanSanitizer).option('--debugProtectionInterval ', 'Disable browser Debug panel even after page was loaded (can cause DevTools enabled browser freeze)', BooleanSanitizer_1.BooleanSanitizer).option('--disableConsoleOutput ', 'Allow console.log, console.info, console.error and console.warn messages output into browser console', BooleanSanitizer_1.BooleanSanitizer).option('--domainLock ', 'Blocks the execution of the code in domains that do not match the passed RegExp patterns (comma separated)', function (value) { return value.split(','); - }).option('--reservedNames ', 'Disable obfuscation of variable names, function names and names of function parameters that match the passed RegExp patterns (comma separated)', function (value) { + }).option('--mangle ', 'Enables mangling of variable names', BooleanSanitizer_1.BooleanSanitizer).option('--reservedNames ', 'Disable obfuscation of variable names, function names and names of function parameters that match the passed RegExp patterns (comma separated)', function (value) { return value.split(','); - }).option('--rotateStringArray ', 'Disable rotation of unicode array values during obfuscation', JavaScriptObfuscatorCLI.parseBoolean).option('--seed ', 'Sets seed for random generator. This is useful for creating repeatable results.', parseFloat).option('--selfDefending ', 'Disables self-defending for obfuscated code', JavaScriptObfuscatorCLI.parseBoolean).option('--sourceMap ', 'Enables source map generation', JavaScriptObfuscatorCLI.parseBoolean).option('--sourceMapBaseUrl ', 'Sets base url to the source map import url when `--sourceMapMode=separate`').option('--sourceMapFileName ', 'Sets file name for output source map when `--sourceMapMode=separate`').option('--sourceMapMode [inline, separate]', 'Specify source map output mode', JavaScriptObfuscatorCLI.parseSourceMapMode).option('--stringArray ', 'Disables gathering of all literal strings into an array and replacing every literal string with an array call', JavaScriptObfuscatorCLI.parseBoolean).option('--stringArrayEncoding [true, false, base64, rc4]', 'Encodes all strings in strings array using base64 or rc4 (this option can slow down your code speed', JavaScriptObfuscatorCLI.parseStringArrayEncoding).option('--stringArrayThreshold ', 'The probability that the literal string will be inserted into stringArray (Default: 0.8, Min: 0, Max: 1)', parseFloat).option('--unicodeEscapeSequence ', 'Allows to enable/disable string conversion to unicode escape sequence', JavaScriptObfuscatorCLI.parseBoolean).parse(this.rawArguments); + }).option('--rotateStringArray ', 'Disable rotation of unicode array values during obfuscation', BooleanSanitizer_1.BooleanSanitizer).option('--seed ', 'Sets seed for random generator. This is useful for creating repeatable results.', parseFloat).option('--selfDefending ', 'Disables self-defending for obfuscated code', BooleanSanitizer_1.BooleanSanitizer).option('--sourceMap ', 'Enables source map generation', BooleanSanitizer_1.BooleanSanitizer).option('--sourceMapBaseUrl ', 'Sets base url to the source map import url when `--sourceMapMode=separate`').option('--sourceMapFileName ', 'Sets file name for output source map when `--sourceMapMode=separate`').option('--sourceMapMode [inline, separate]', 'Specify source map output mode', SourceMapModeSanitizer_1.SourceMapModeSanitizer).option('--stringArray ', 'Disables gathering of all literal strings into an array and replacing every literal string with an array call', BooleanSanitizer_1.BooleanSanitizer).option('--stringArrayEncoding [true, false, base64, rc4]', 'Encodes all strings in strings array using base64 or rc4 (this option can slow down your code speed', StringArrayEncodingSanitizer_1.StringArrayEncodingSanitizer).option('--stringArrayThreshold ', 'The probability that the literal string will be inserted into stringArray (Default: 0.8, Min: 0, Max: 1)', parseFloat).option('--unicodeEscapeSequence ', 'Allows to enable/disable string conversion to unicode escape sequence', BooleanSanitizer_1.BooleanSanitizer).parse(this.rawArguments); this.commands.on('--help', function () { console.log(' Examples:\n'); console.log(' %> javascript-obfuscator in.js --compact true --selfDefending false'); @@ -2550,36 +2639,6 @@ var JavaScriptObfuscatorCLI = function () { value: function getBuildVersion() { return CLIUtils_1.CLIUtils.getPackageConfig().version; } - }, { - key: "parseBoolean", - value: function parseBoolean(value) { - return value === 'true' || value === '1'; - } - }, { - key: "parseSourceMapMode", - value: function parseSourceMapMode(value) { - var availableMode = Object.keys(SourceMapMode_1.SourceMapMode).some(function (key) { - return SourceMapMode_1.SourceMapMode[key] === value; - }); - if (!availableMode) { - throw new ReferenceError('Invalid value of `--sourceMapMode` option'); - } - return value; - } - }, { - key: "parseStringArrayEncoding", - value: function parseStringArrayEncoding(value) { - switch (value) { - case 'true': - case '1': - case StringArrayEncoding_1.StringArrayEncoding.base64: - return true; - case StringArrayEncoding_1.StringArrayEncoding.rc4: - return StringArrayEncoding_1.StringArrayEncoding.rc4; - default: - return false; - } - } }]); return JavaScriptObfuscatorCLI; @@ -2588,7 +2647,60 @@ var JavaScriptObfuscatorCLI = function () { exports.JavaScriptObfuscatorCLI = JavaScriptObfuscatorCLI; /***/ }), -/* 44 */ +/* 45 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BooleanSanitizer = function (value) { + return value === 'true' || value === '1'; +}; + +/***/ }), +/* 46 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var SourceMapMode_1 = __webpack_require__(20); +exports.SourceMapModeSanitizer = function (value) { + var availableMode = Object.keys(SourceMapMode_1.SourceMapMode).some(function (key) { + return SourceMapMode_1.SourceMapMode[key] === value; + }); + if (!availableMode) { + throw new ReferenceError('Invalid value of `--sourceMapMode` option'); + } + return value; +}; + +/***/ }), +/* 47 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var StringArrayEncoding_1 = __webpack_require__(24); +exports.StringArrayEncodingSanitizer = function (value) { + switch (value) { + case 'true': + case '1': + case StringArrayEncoding_1.StringArrayEncoding.base64: + return true; + case StringArrayEncoding_1.StringArrayEncoding.rc4: + return StringArrayEncoding_1.StringArrayEncoding.rc4; + default: + return false; + } +}; + +/***/ }), +/* 48 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2598,20 +2710,21 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var ControlFlowTransformersModule_1 = __webpack_require__(46); -var CustomNodesModule_1 = __webpack_require__(45); -var ObfuscatingTransformersModule_1 = __webpack_require__(48); -var NodeTransformersModule_1 = __webpack_require__(47); -var StackTraceAnalyzerModule_1 = __webpack_require__(49); -var StoragesModule_1 = __webpack_require__(50); -var JavaScriptObfuscatorInternal_1 = __webpack_require__(38); -var ObfuscationEventEmitter_1 = __webpack_require__(74); -var ObfuscationResult_1 = __webpack_require__(39); -var Obfuscator_1 = __webpack_require__(40); -var Options_1 = __webpack_require__(94); -var SourceMapCorrector_1 = __webpack_require__(41); +var ControlFlowTransformersModule_1 = __webpack_require__(50); +var CustomNodesModule_1 = __webpack_require__(49); +var ObfuscatingTransformersModule_1 = __webpack_require__(52); +var NodeTransformersModule_1 = __webpack_require__(51); +var StackTraceAnalyzerModule_1 = __webpack_require__(53); +var StoragesModule_1 = __webpack_require__(54); +var JavaScriptObfuscatorInternal_1 = __webpack_require__(39); +var ObfuscationEventEmitter_1 = __webpack_require__(80); +var ObfuscationResult_1 = __webpack_require__(40); +var Obfuscator_1 = __webpack_require__(41); +var Options_1 = __webpack_require__(102); +var SourceMapCorrector_1 = __webpack_require__(42); var InversifyContainerFacade = function () { function InversifyContainerFacade(options) { @@ -2659,38 +2772,41 @@ var InversifyContainerFacade = function () { exports.InversifyContainerFacade = InversifyContainerFacade; /***/ }), -/* 45 */ +/* 49 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var CustomNodes_1 = __webpack_require__(9); -var CustomNodeGroups_1 = __webpack_require__(30); -var ConsoleOutputCustomNodeGroup_1 = __webpack_require__(52); -var DebugProtectionCustomNodeGroup_1 = __webpack_require__(63); -var DomainLockCustomNodeGroup_1 = __webpack_require__(65); -var SelfDefendingCustomNodeGroup_1 = __webpack_require__(68); -var StringArrayCustomNodeGroup_1 = __webpack_require__(72); -var BinaryExpressionFunctionNode_1 = __webpack_require__(53); -var BlockStatementControlFlowFlatteningNode_1 = __webpack_require__(54); -var CallExpressionControlFlowStorageCallNode_1 = __webpack_require__(57); -var CallExpressionFunctionNode_1 = __webpack_require__(55); -var ControlFlowStorageNode_1 = __webpack_require__(58); -var ConsoleOutputDisableExpressionNode_1 = __webpack_require__(51); -var DebugProtectionFunctionCallNode_1 = __webpack_require__(60); -var DebugProtectionFunctionIntervalNode_1 = __webpack_require__(61); -var DebugProtectionFunctionNode_1 = __webpack_require__(62); -var DomainLockNode_1 = __webpack_require__(64); -var ExpressionWithOperatorControlFlowStorageCallNode_1 = __webpack_require__(59); -var LogicalExpressionFunctionNode_1 = __webpack_require__(56); -var NodeCallsControllerFunctionNode_1 = __webpack_require__(66); -var SelfDefendingUnicodeNode_1 = __webpack_require__(67); -var StringArrayCallsWrapper_1 = __webpack_require__(69); -var StringArrayNode_1 = __webpack_require__(70); -var StringArrayRotateFunctionNode_1 = __webpack_require__(71); +var CustomNodeGroups_1 = __webpack_require__(32); +var ConsoleOutputCustomNodeGroup_1 = __webpack_require__(56); +var DebugProtectionCustomNodeGroup_1 = __webpack_require__(69); +var DomainLockCustomNodeGroup_1 = __webpack_require__(71); +var SelfDefendingCustomNodeGroup_1 = __webpack_require__(74); +var StringArrayCustomNodeGroup_1 = __webpack_require__(78); +var BinaryExpressionFunctionNode_1 = __webpack_require__(57); +var BlockStatementControlFlowFlatteningNode_1 = __webpack_require__(58); +var CallExpressionControlFlowStorageCallNode_1 = __webpack_require__(62); +var CallExpressionFunctionNode_1 = __webpack_require__(59); +var ControlFlowStorageNode_1 = __webpack_require__(63); +var ConsoleOutputDisableExpressionNode_1 = __webpack_require__(55); +var DebugProtectionFunctionCallNode_1 = __webpack_require__(66); +var DebugProtectionFunctionIntervalNode_1 = __webpack_require__(67); +var DebugProtectionFunctionNode_1 = __webpack_require__(68); +var DomainLockNode_1 = __webpack_require__(70); +var ExpressionWithOperatorControlFlowStorageCallNode_1 = __webpack_require__(64); +var LogicalExpressionFunctionNode_1 = __webpack_require__(60); +var NodeCallsControllerFunctionNode_1 = __webpack_require__(72); +var SelfDefendingUnicodeNode_1 = __webpack_require__(73); +var StringArrayCallsWrapper_1 = __webpack_require__(75); +var StringArrayNode_1 = __webpack_require__(76); +var StringArrayRotateFunctionNode_1 = __webpack_require__(77); +var StringLiteralControlFlowStorageCallNode_1 = __webpack_require__(65); +var StringLiteralNode_1 = __webpack_require__(61); exports.customNodesModule = new inversify_1.ContainerModule(function (bind) { bind(ServiceIdentifiers_1.ServiceIdentifiers.Newable__ICustomNode).toConstructor(BinaryExpressionFunctionNode_1.BinaryExpressionFunctionNode).whenTargetNamed(CustomNodes_1.CustomNodes.BinaryExpressionFunctionNode); bind(ServiceIdentifiers_1.ServiceIdentifiers.Newable__ICustomNode).toConstructor(BlockStatementControlFlowFlatteningNode_1.BlockStatementControlFlowFlatteningNode).whenTargetNamed(CustomNodes_1.CustomNodes.BlockStatementControlFlowFlatteningNode); @@ -2709,6 +2825,8 @@ exports.customNodesModule = new inversify_1.ContainerModule(function (bind) { bind(ServiceIdentifiers_1.ServiceIdentifiers.Newable__ICustomNode).toConstructor(StringArrayCallsWrapper_1.StringArrayCallsWrapper).whenTargetNamed(CustomNodes_1.CustomNodes.StringArrayCallsWrapper); bind(ServiceIdentifiers_1.ServiceIdentifiers.Newable__ICustomNode).toConstructor(StringArrayNode_1.StringArrayNode).whenTargetNamed(CustomNodes_1.CustomNodes.StringArrayNode); bind(ServiceIdentifiers_1.ServiceIdentifiers.Newable__ICustomNode).toConstructor(StringArrayRotateFunctionNode_1.StringArrayRotateFunctionNode).whenTargetNamed(CustomNodes_1.CustomNodes.StringArrayRotateFunctionNode); + bind(ServiceIdentifiers_1.ServiceIdentifiers.Newable__ICustomNode).toConstructor(StringLiteralControlFlowStorageCallNode_1.StringLiteralControlFlowStorageCallNode).whenTargetNamed(CustomNodes_1.CustomNodes.StringLiteralControlFlowStorageCallNode); + bind(ServiceIdentifiers_1.ServiceIdentifiers.Newable__ICustomNode).toConstructor(StringLiteralNode_1.StringLiteralNode).whenTargetNamed(CustomNodes_1.CustomNodes.StringLiteralNode); bind(ServiceIdentifiers_1.ServiceIdentifiers.ICustomNodeGroup).to(ConsoleOutputCustomNodeGroup_1.ConsoleOutputCustomNodeGroup).whenTargetNamed(CustomNodeGroups_1.CustomNodeGroups.ConsoleOutputCustomNodeGroup); bind(ServiceIdentifiers_1.ServiceIdentifiers.ICustomNodeGroup).to(DebugProtectionCustomNodeGroup_1.DebugProtectionCustomNodeGroup).whenTargetNamed(CustomNodeGroups_1.CustomNodeGroups.DebugProtectionCustomNodeGroup); bind(ServiceIdentifiers_1.ServiceIdentifiers.ICustomNodeGroup).to(DomainLockCustomNodeGroup_1.DomainLockCustomNodeGroup).whenTargetNamed(CustomNodeGroups_1.CustomNodeGroups.DomainLockCustomNodeGroup); @@ -2737,22 +2855,25 @@ exports.customNodesModule = new inversify_1.ContainerModule(function (bind) { }); /***/ }), -/* 46 */ +/* 50 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var ControlFlowReplacers_1 = __webpack_require__(29); -var BinaryExpressionControlFlowReplacer_1 = __webpack_require__(77); -var CallExpressionControlFlowReplacer_1 = __webpack_require__(78); -var LogicalExpressionControlFlowReplacer_1 = __webpack_require__(79); +var ControlFlowReplacers_1 = __webpack_require__(31); +var BinaryExpressionControlFlowReplacer_1 = __webpack_require__(83); +var CallExpressionControlFlowReplacer_1 = __webpack_require__(84); +var LogicalExpressionControlFlowReplacer_1 = __webpack_require__(85); +var StringLiteralControlFlowReplacer_1 = __webpack_require__(86); exports.controlFlowTransformersModule = new inversify_1.ContainerModule(function (bind) { bind(ServiceIdentifiers_1.ServiceIdentifiers.IControlFlowReplacer).to(BinaryExpressionControlFlowReplacer_1.BinaryExpressionControlFlowReplacer).whenTargetNamed(ControlFlowReplacers_1.ControlFlowReplacers.BinaryExpressionControlFlowReplacer); bind(ServiceIdentifiers_1.ServiceIdentifiers.IControlFlowReplacer).to(CallExpressionControlFlowReplacer_1.CallExpressionControlFlowReplacer).whenTargetNamed(ControlFlowReplacers_1.ControlFlowReplacers.CallExpressionControlFlowReplacer); bind(ServiceIdentifiers_1.ServiceIdentifiers.IControlFlowReplacer).to(LogicalExpressionControlFlowReplacer_1.LogicalExpressionControlFlowReplacer).whenTargetNamed(ControlFlowReplacers_1.ControlFlowReplacers.LogicalExpressionControlFlowReplacer); + bind(ServiceIdentifiers_1.ServiceIdentifiers.IControlFlowReplacer).to(StringLiteralControlFlowReplacer_1.StringLiteralControlFlowReplacer).whenTargetNamed(ControlFlowReplacers_1.ControlFlowReplacers.StringLiteralControlFlowReplacer); bind(ServiceIdentifiers_1.ServiceIdentifiers.Factory__IControlFlowReplacer).toFactory(function (context) { var cache = new Map(); return function (replacerName) { @@ -2767,29 +2888,32 @@ exports.controlFlowTransformersModule = new inversify_1.ContainerModule(function }); /***/ }), -/* 47 */ +/* 51 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var NodeTransformers_1 = __webpack_require__(31); -var FunctionControlFlowTransformer_1 = __webpack_require__(76); -var BlockStatementControlFlowTransformer_1 = __webpack_require__(75); -var CatchClauseTransformer_1 = __webpack_require__(83); -var FunctionDeclarationTransformer_1 = __webpack_require__(84); -var FunctionTransformer_1 = __webpack_require__(85); -var LabeledStatementTransformer_1 = __webpack_require__(86); -var LiteralTransformer_1 = __webpack_require__(87); -var MemberExpressionTransformer_1 = __webpack_require__(80); -var MethodDefinitionTransformer_1 = __webpack_require__(81); -var ObjectExpressionTransformer_1 = __webpack_require__(88); -var TemplateLiteralTransformer_1 = __webpack_require__(82); -var VariableDeclarationTransformer_1 = __webpack_require__(89); +var NodeTransformers_1 = __webpack_require__(33); +var FunctionControlFlowTransformer_1 = __webpack_require__(82); +var BlockStatementControlFlowTransformer_1 = __webpack_require__(81); +var DeadCodeInjectionTransformer_1 = __webpack_require__(90); +var CatchClauseTransformer_1 = __webpack_require__(91); +var FunctionDeclarationTransformer_1 = __webpack_require__(92); +var FunctionTransformer_1 = __webpack_require__(93); +var LabeledStatementTransformer_1 = __webpack_require__(94); +var LiteralTransformer_1 = __webpack_require__(95); +var MemberExpressionTransformer_1 = __webpack_require__(87); +var MethodDefinitionTransformer_1 = __webpack_require__(88); +var ObjectExpressionTransformer_1 = __webpack_require__(96); +var TemplateLiteralTransformer_1 = __webpack_require__(89); +var VariableDeclarationTransformer_1 = __webpack_require__(97); exports.nodeTransformersModule = new inversify_1.ContainerModule(function (bind) { bind(ServiceIdentifiers_1.ServiceIdentifiers.INodeTransformer).to(BlockStatementControlFlowTransformer_1.BlockStatementControlFlowTransformer).whenTargetNamed(NodeTransformers_1.NodeTransformers.BlockStatementControlFlowTransformer); + bind(ServiceIdentifiers_1.ServiceIdentifiers.INodeTransformer).to(DeadCodeInjectionTransformer_1.DeadCodeInjectionTransformer).whenTargetNamed(NodeTransformers_1.NodeTransformers.DeadCodeInjectionTransformer); bind(ServiceIdentifiers_1.ServiceIdentifiers.INodeTransformer).to(FunctionControlFlowTransformer_1.FunctionControlFlowTransformer).whenTargetNamed(NodeTransformers_1.NodeTransformers.FunctionControlFlowTransformer); bind(ServiceIdentifiers_1.ServiceIdentifiers.INodeTransformer).to(MemberExpressionTransformer_1.MemberExpressionTransformer).whenTargetNamed(NodeTransformers_1.NodeTransformers.MemberExpressionTransformer); bind(ServiceIdentifiers_1.ServiceIdentifiers.INodeTransformer).to(MethodDefinitionTransformer_1.MethodDefinitionTransformer).whenTargetNamed(NodeTransformers_1.NodeTransformers.MethodDefinitionTransformer); @@ -2815,19 +2939,20 @@ exports.nodeTransformersModule = new inversify_1.ContainerModule(function (bind) }); /***/ }), -/* 48 */ +/* 52 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var ObfuscationReplacers_1 = __webpack_require__(16); -var BooleanLiteralReplacer_1 = __webpack_require__(90); -var IdentifierReplacer_1 = __webpack_require__(91); -var NumberLiteralReplacer_1 = __webpack_require__(92); -var StringLiteralReplacer_1 = __webpack_require__(93); +var BooleanLiteralReplacer_1 = __webpack_require__(98); +var IdentifierReplacer_1 = __webpack_require__(99); +var NumberLiteralReplacer_1 = __webpack_require__(100); +var StringLiteralReplacer_1 = __webpack_require__(101); exports.obfuscatingTransformersModule = new inversify_1.ContainerModule(function (bind) { bind(ServiceIdentifiers_1.ServiceIdentifiers.IObfuscationReplacer).to(BooleanLiteralReplacer_1.BooleanLiteralReplacer).whenTargetNamed(ObfuscationReplacers_1.ObfuscationReplacers.BooleanReplacer); bind(ServiceIdentifiers_1.ServiceIdentifiers.IObfuscationReplacer).to(IdentifierReplacer_1.IdentifierReplacer).whenTargetNamed(ObfuscationReplacers_1.ObfuscationReplacers.IdentifierReplacer); @@ -2847,19 +2972,20 @@ exports.obfuscatingTransformersModule = new inversify_1.ContainerModule(function }); /***/ }), -/* 49 */ +/* 53 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var CalleeDataExtractors_1 = __webpack_require__(28); -var FunctionDeclarationCalleeDataExtractor_1 = __webpack_require__(98); -var FunctionExpressionCalleeDataExtractor_1 = __webpack_require__(99); -var ObjectExpressionCalleeDataExtractor_1 = __webpack_require__(100); -var StackTraceAnalyzer_1 = __webpack_require__(97); +var CalleeDataExtractors_1 = __webpack_require__(30); +var FunctionDeclarationCalleeDataExtractor_1 = __webpack_require__(116); +var FunctionExpressionCalleeDataExtractor_1 = __webpack_require__(117); +var ObjectExpressionCalleeDataExtractor_1 = __webpack_require__(118); +var StackTraceAnalyzer_1 = __webpack_require__(115); exports.stackTraceAnalyzerModule = new inversify_1.ContainerModule(function (bind) { bind(ServiceIdentifiers_1.ServiceIdentifiers.IStackTraceAnalyzer).to(StackTraceAnalyzer_1.StackTraceAnalyzer).inSingletonScope(); bind(ServiceIdentifiers_1.ServiceIdentifiers.ICalleeDataExtractor).to(FunctionDeclarationCalleeDataExtractor_1.FunctionDeclarationCalleeDataExtractor).whenTargetNamed(CalleeDataExtractors_1.CalleeDataExtractors.FunctionDeclarationCalleeDataExtractor); @@ -2879,17 +3005,18 @@ exports.stackTraceAnalyzerModule = new inversify_1.ContainerModule(function (bin }); /***/ }), -/* 50 */ +/* 54 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var ControlFlowStorage_1 = __webpack_require__(102); -var CustomNodeGroupStorage_1 = __webpack_require__(103); -var StringArrayStorage_1 = __webpack_require__(104); +var ControlFlowStorage_1 = __webpack_require__(120); +var CustomNodeGroupStorage_1 = __webpack_require__(121); +var StringArrayStorage_1 = __webpack_require__(122); exports.storagesModule = new inversify_1.ContainerModule(function (bind) { bind(ServiceIdentifiers_1.ServiceIdentifiers.TCustomNodeGroupStorage).to(CustomNodeGroupStorage_1.CustomNodeGroupStorage).inSingletonScope(); bind(ServiceIdentifiers_1.ServiceIdentifiers.TStringArrayStorage).to(StringArrayStorage_1.StringArrayStorage).inSingletonScope(); @@ -2903,7 +3030,7 @@ exports.storagesModule = new inversify_1.ContainerModule(function (bind) { }); /***/ }), -/* 51 */ +/* 55 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2917,11 +3044,12 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var format = __webpack_require__(12); -var ConsoleOutputDisableExpressionTemplate_1 = __webpack_require__(108); +var format = __webpack_require__(13); +var ConsoleOutputDisableExpressionTemplate_1 = __webpack_require__(126); var Initializable_1 = __webpack_require__(5); var AbstractCustomNode_1 = __webpack_require__(7); var NodeUtils_1 = __webpack_require__(3); @@ -2962,7 +3090,7 @@ ConsoleOutputDisableExpressionNode = tslib_1.__decorate([inversify_1.injectable( exports.ConsoleOutputDisableExpressionNode = ConsoleOutputDisableExpressionNode; /***/ }), -/* 52 */ +/* 56 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2976,6 +3104,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); @@ -3040,7 +3169,7 @@ ConsoleOutputCustomNodeGroup = tslib_1.__decorate([inversify_1.injectable(), tsl exports.ConsoleOutputCustomNodeGroup = ConsoleOutputCustomNodeGroup; /***/ }), -/* 53 */ +/* 57 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3054,12 +3183,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var Initializable_1 = __webpack_require__(5); var AbstractCustomNode_1 = __webpack_require__(7); -var Nodes_1 = __webpack_require__(14); +var Nodes_1 = __webpack_require__(12); var NodeUtils_1 = __webpack_require__(3); var RandomGeneratorUtils_1 = __webpack_require__(4); var BinaryExpressionFunctionNode = function (_AbstractCustomNode_) { @@ -3092,7 +3222,7 @@ BinaryExpressionFunctionNode = tslib_1.__decorate([inversify_1.injectable(), tsl exports.BinaryExpressionFunctionNode = BinaryExpressionFunctionNode; /***/ }), -/* 54 */ +/* 58 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3106,12 +3236,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var Initializable_1 = __webpack_require__(5); var AbstractCustomNode_1 = __webpack_require__(7); -var Nodes_1 = __webpack_require__(14); +var Nodes_1 = __webpack_require__(12); var NodeUtils_1 = __webpack_require__(3); var RandomGeneratorUtils_1 = __webpack_require__(4); var BlockStatementControlFlowFlatteningNode = function (_AbstractCustomNode_) { @@ -3154,7 +3285,7 @@ BlockStatementControlFlowFlatteningNode = tslib_1.__decorate([inversify_1.inject exports.BlockStatementControlFlowFlatteningNode = BlockStatementControlFlowFlatteningNode; /***/ }), -/* 55 */ +/* 59 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3168,12 +3299,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var Initializable_1 = __webpack_require__(5); var AbstractCustomNode_1 = __webpack_require__(7); -var Nodes_1 = __webpack_require__(14); +var Nodes_1 = __webpack_require__(12); var NodeUtils_1 = __webpack_require__(3); var RandomGeneratorUtils_1 = __webpack_require__(4); var CallExpressionFunctionNode = function (_AbstractCustomNode_) { @@ -3212,7 +3344,7 @@ CallExpressionFunctionNode = tslib_1.__decorate([inversify_1.injectable(), tslib exports.CallExpressionFunctionNode = CallExpressionFunctionNode; /***/ }), -/* 56 */ +/* 60 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3226,12 +3358,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var Initializable_1 = __webpack_require__(5); var AbstractCustomNode_1 = __webpack_require__(7); -var Nodes_1 = __webpack_require__(14); +var Nodes_1 = __webpack_require__(12); var RandomGeneratorUtils_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(3); var LogicalExpressionFunctionNode = function (_AbstractCustomNode_) { @@ -3264,7 +3397,57 @@ LogicalExpressionFunctionNode = tslib_1.__decorate([inversify_1.injectable(), ts exports.LogicalExpressionFunctionNode = LogicalExpressionFunctionNode; /***/ }), -/* 57 */ +/* 61 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(1); +var inversify_1 = __webpack_require__(0); +var ServiceIdentifiers_1 = __webpack_require__(2); +var Initializable_1 = __webpack_require__(5); +var AbstractCustomNode_1 = __webpack_require__(7); +var Nodes_1 = __webpack_require__(12); +var StringLiteralNode = function (_AbstractCustomNode_) { + _inherits(StringLiteralNode, _AbstractCustomNode_); + + function StringLiteralNode(options) { + _classCallCheck(this, StringLiteralNode); + + return _possibleConstructorReturn(this, (StringLiteralNode.__proto__ || Object.getPrototypeOf(StringLiteralNode)).call(this, options)); + } + + _createClass(StringLiteralNode, [{ + key: "initialize", + value: function initialize(literalValue) { + this.literalValue = literalValue; + } + }, { + key: "getNodeStructure", + value: function getNodeStructure() { + var structure = Nodes_1.Nodes.getLiteralNode(this.literalValue); + return [structure]; + } + }]); + + return StringLiteralNode; +}(AbstractCustomNode_1.AbstractCustomNode); +tslib_1.__decorate([Initializable_1.initializable(), tslib_1.__metadata("design:type", String)], StringLiteralNode.prototype, "literalValue", void 0); +StringLiteralNode = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IOptions)), tslib_1.__metadata("design:paramtypes", [Object])], StringLiteralNode); +exports.StringLiteralNode = StringLiteralNode; + +/***/ }), +/* 62 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3280,12 +3463,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var Initializable_1 = __webpack_require__(5); var AbstractCustomNode_1 = __webpack_require__(7); -var Nodes_1 = __webpack_require__(14); +var Nodes_1 = __webpack_require__(12); var NodeUtils_1 = __webpack_require__(3); var CallExpressionControlFlowStorageCallNode = function (_AbstractCustomNode_) { _inherits(CallExpressionControlFlowStorageCallNode, _AbstractCustomNode_); @@ -3323,7 +3507,7 @@ CallExpressionControlFlowStorageCallNode = tslib_1.__decorate([inversify_1.injec exports.CallExpressionControlFlowStorageCallNode = CallExpressionControlFlowStorageCallNode; /***/ }), -/* 58 */ +/* 63 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3339,12 +3523,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var Initializable_1 = __webpack_require__(5); var AbstractCustomNode_1 = __webpack_require__(7); -var Nodes_1 = __webpack_require__(14); +var Nodes_1 = __webpack_require__(12); var NodeUtils_1 = __webpack_require__(3); var ControlFlowStorageNode = function (_AbstractCustomNode_) { _inherits(ControlFlowStorageNode, _AbstractCustomNode_); @@ -3382,7 +3567,7 @@ ControlFlowStorageNode = tslib_1.__decorate([inversify_1.injectable(), tslib_1._ exports.ControlFlowStorageNode = ControlFlowStorageNode; /***/ }), -/* 59 */ +/* 64 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3396,12 +3581,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var Initializable_1 = __webpack_require__(5); var AbstractCustomNode_1 = __webpack_require__(7); -var Nodes_1 = __webpack_require__(14); +var Nodes_1 = __webpack_require__(12); var NodeUtils_1 = __webpack_require__(3); var ExpressionWithOperatorControlFlowStorageCallNode = function (_AbstractCustomNode_) { _inherits(ExpressionWithOperatorControlFlowStorageCallNode, _AbstractCustomNode_); @@ -3439,7 +3625,7 @@ ExpressionWithOperatorControlFlowStorageCallNode = tslib_1.__decorate([inversify exports.ExpressionWithOperatorControlFlowStorageCallNode = ExpressionWithOperatorControlFlowStorageCallNode; /***/ }), -/* 60 */ +/* 65 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3453,12 +3639,67 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var format = __webpack_require__(12); var Initializable_1 = __webpack_require__(5); -var DebufProtectionFunctionCallTemplate_1 = __webpack_require__(109); +var AbstractCustomNode_1 = __webpack_require__(7); +var Nodes_1 = __webpack_require__(12); +var NodeUtils_1 = __webpack_require__(3); +var StringLiteralControlFlowStorageCallNode = function (_AbstractCustomNode_) { + _inherits(StringLiteralControlFlowStorageCallNode, _AbstractCustomNode_); + + function StringLiteralControlFlowStorageCallNode(options) { + _classCallCheck(this, StringLiteralControlFlowStorageCallNode); + + return _possibleConstructorReturn(this, (StringLiteralControlFlowStorageCallNode.__proto__ || Object.getPrototypeOf(StringLiteralControlFlowStorageCallNode)).call(this, options)); + } + + _createClass(StringLiteralControlFlowStorageCallNode, [{ + key: "initialize", + value: function initialize(controlFlowStorageName, controlFlowStorageKey) { + this.controlFlowStorageName = controlFlowStorageName; + this.controlFlowStorageKey = controlFlowStorageKey; + } + }, { + key: "getNodeStructure", + value: function getNodeStructure() { + var structure = Nodes_1.Nodes.getExpressionStatementNode(Nodes_1.Nodes.getMemberExpressionNode(Nodes_1.Nodes.getIdentifierNode(this.controlFlowStorageName), Nodes_1.Nodes.getIdentifierNode(this.controlFlowStorageKey))); + NodeUtils_1.NodeUtils.parentize(structure); + return [structure]; + } + }]); + + return StringLiteralControlFlowStorageCallNode; +}(AbstractCustomNode_1.AbstractCustomNode); +tslib_1.__decorate([Initializable_1.initializable(), tslib_1.__metadata("design:type", String)], StringLiteralControlFlowStorageCallNode.prototype, "controlFlowStorageKey", void 0); +tslib_1.__decorate([Initializable_1.initializable(), tslib_1.__metadata("design:type", String)], StringLiteralControlFlowStorageCallNode.prototype, "controlFlowStorageName", void 0); +StringLiteralControlFlowStorageCallNode = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IOptions)), tslib_1.__metadata("design:paramtypes", [Object])], StringLiteralControlFlowStorageCallNode); +exports.StringLiteralControlFlowStorageCallNode = StringLiteralControlFlowStorageCallNode; + +/***/ }), +/* 66 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(1); +var inversify_1 = __webpack_require__(0); +var ServiceIdentifiers_1 = __webpack_require__(2); +var format = __webpack_require__(13); +var Initializable_1 = __webpack_require__(5); +var DebufProtectionFunctionCallTemplate_1 = __webpack_require__(127); var AbstractCustomNode_1 = __webpack_require__(7); var NodeUtils_1 = __webpack_require__(3); var DebugProtectionFunctionCallNode = function (_AbstractCustomNode_) { @@ -3496,7 +3737,7 @@ DebugProtectionFunctionCallNode = tslib_1.__decorate([inversify_1.injectable(), exports.DebugProtectionFunctionCallNode = DebugProtectionFunctionCallNode; /***/ }), -/* 61 */ +/* 67 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3510,12 +3751,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var format = __webpack_require__(12); +var format = __webpack_require__(13); var Initializable_1 = __webpack_require__(5); -var DebugProtectionFunctionIntervalTemplate_1 = __webpack_require__(110); +var DebugProtectionFunctionIntervalTemplate_1 = __webpack_require__(128); var AbstractCustomNode_1 = __webpack_require__(7); var NodeUtils_1 = __webpack_require__(3); var DebugProtectionFunctionIntervalNode = function (_AbstractCustomNode_) { @@ -3553,7 +3795,7 @@ DebugProtectionFunctionIntervalNode = tslib_1.__decorate([inversify_1.injectable exports.DebugProtectionFunctionIntervalNode = DebugProtectionFunctionIntervalNode; /***/ }), -/* 62 */ +/* 68 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3567,12 +3809,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var format = __webpack_require__(12); +var format = __webpack_require__(13); var Initializable_1 = __webpack_require__(5); -var DebugProtectionFunctionTemplate_1 = __webpack_require__(111); +var DebugProtectionFunctionTemplate_1 = __webpack_require__(129); var AbstractCustomNode_1 = __webpack_require__(7); var NodeUtils_1 = __webpack_require__(3); var DebugProtectionFunctionNode = function (_AbstractCustomNode_) { @@ -3610,7 +3853,7 @@ DebugProtectionFunctionNode = tslib_1.__decorate([inversify_1.injectable(), tsli exports.DebugProtectionFunctionNode = DebugProtectionFunctionNode; /***/ }), -/* 63 */ +/* 69 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3624,6 +3867,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); @@ -3691,7 +3935,7 @@ DebugProtectionCustomNodeGroup = tslib_1.__decorate([inversify_1.injectable(), t exports.DebugProtectionCustomNodeGroup = DebugProtectionCustomNodeGroup; /***/ }), -/* 64 */ +/* 70 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3707,14 +3951,15 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var format = __webpack_require__(12); +var format = __webpack_require__(13); var Initializable_1 = __webpack_require__(5); -var DomainLockNodeTemplate_1 = __webpack_require__(112); +var DomainLockNodeTemplate_1 = __webpack_require__(130); var AbstractCustomNode_1 = __webpack_require__(7); -var CryptUtils_1 = __webpack_require__(26); +var CryptUtils_1 = __webpack_require__(28); var NodeUtils_1 = __webpack_require__(3); var RandomGeneratorUtils_1 = __webpack_require__(4); var DomainLockNode = function (_AbstractCustomNode_) { @@ -3762,7 +4007,7 @@ DomainLockNode = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__param(0 exports.DomainLockNode = DomainLockNode; /***/ }), -/* 65 */ +/* 71 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3776,6 +4021,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); @@ -3840,7 +4086,7 @@ DomainLockCustomNodeGroup = tslib_1.__decorate([inversify_1.injectable(), tslib_ exports.DomainLockCustomNodeGroup = DomainLockCustomNodeGroup; /***/ }), -/* 66 */ +/* 72 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3854,14 +4100,15 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var format = __webpack_require__(12); +var format = __webpack_require__(13); var ObfuscationEvents_1 = __webpack_require__(15); var Initializable_1 = __webpack_require__(5); -var SingleNodeCallControllerTemplate_1 = __webpack_require__(107); -var NoCustomNodes_1 = __webpack_require__(23); +var SingleNodeCallControllerTemplate_1 = __webpack_require__(125); +var NoCustomNodes_1 = __webpack_require__(22); var AbstractCustomNode_1 = __webpack_require__(7); var JavaScriptObfuscator_1 = __webpack_require__(17); var NodeUtils_1 = __webpack_require__(3); @@ -3907,7 +4154,7 @@ NodeCallsControllerFunctionNode = tslib_1.__decorate([inversify_1.injectable(), exports.NodeCallsControllerFunctionNode = NodeCallsControllerFunctionNode; /***/ }), -/* 67 */ +/* 73 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3921,13 +4168,14 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var format = __webpack_require__(12); +var format = __webpack_require__(13); var Initializable_1 = __webpack_require__(5); -var NoCustomNodes_1 = __webpack_require__(23); -var SelfDefendingTemplate_1 = __webpack_require__(113); +var NoCustomNodes_1 = __webpack_require__(22); +var SelfDefendingTemplate_1 = __webpack_require__(131); var AbstractCustomNode_1 = __webpack_require__(7); var JavaScriptObfuscator_1 = __webpack_require__(17); var NodeUtils_1 = __webpack_require__(3); @@ -3957,7 +4205,7 @@ var SelfDefendingUnicodeNode = function (_AbstractCustomNode_) { return JavaScriptObfuscator_1.JavaScriptObfuscator.obfuscate(format(SelfDefendingTemplate_1.SelfDefendingTemplate(), { selfDefendingFunctionName: RandomGeneratorUtils_1.RandomGeneratorUtils.getRandomVariableName(6), singleNodeCallControllerFunctionName: this.callsControllerFunctionName - }), Object.assign({}, NoCustomNodes_1.NO_CUSTOM_NODES_PRESET, { seed: this.options.seed })).getObfuscatedCode(); + }), Object.assign({}, NoCustomNodes_1.NO_CUSTOM_NODES_PRESET, { seed: this.options.seed, unicodeEscapeSequence: true })).getObfuscatedCode(); } }]); @@ -3968,7 +4216,7 @@ SelfDefendingUnicodeNode = tslib_1.__decorate([inversify_1.injectable(), tslib_1 exports.SelfDefendingUnicodeNode = SelfDefendingUnicodeNode; /***/ }), -/* 68 */ +/* 74 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3982,6 +4230,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); @@ -4046,7 +4295,7 @@ SelfDefendingCustomNodeGroup = tslib_1.__decorate([inversify_1.injectable(), tsl exports.SelfDefendingCustomNodeGroup = SelfDefendingCustomNodeGroup; /***/ }), -/* 69 */ +/* 75 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4060,19 +4309,20 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var format = __webpack_require__(12); +var format = __webpack_require__(13); var StringArrayEncoding_1 = __webpack_require__(24); var Initializable_1 = __webpack_require__(5); -var NoCustomNodes_1 = __webpack_require__(23); -var AtobTemplate_1 = __webpack_require__(105); -var Rc4Template_1 = __webpack_require__(106); -var SelfDefendingTemplate_1 = __webpack_require__(114); -var StringArrayBase64DecodeNodeTemplate_1 = __webpack_require__(115); -var StringArrayCallsWrapperTemplate_1 = __webpack_require__(116); -var StringArrayRC4DecodeNodeTemplate_1 = __webpack_require__(117); +var NoCustomNodes_1 = __webpack_require__(22); +var AtobTemplate_1 = __webpack_require__(123); +var Rc4Template_1 = __webpack_require__(124); +var SelfDefendingTemplate_1 = __webpack_require__(132); +var StringArrayBase64DecodeNodeTemplate_1 = __webpack_require__(133); +var StringArrayCallsWrapperTemplate_1 = __webpack_require__(134); +var StringArrayRC4DecodeNodeTemplate_1 = __webpack_require__(135); var AbstractCustomNode_1 = __webpack_require__(7); var JavaScriptObfuscator_1 = __webpack_require__(17); var NodeUtils_1 = __webpack_require__(3); @@ -4148,7 +4398,7 @@ StringArrayCallsWrapper = tslib_1.__decorate([inversify_1.injectable(), tslib_1. exports.StringArrayCallsWrapper = StringArrayCallsWrapper; /***/ }), -/* 70 */ +/* 76 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4164,12 +4414,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var format = __webpack_require__(12); +var format = __webpack_require__(13); var Initializable_1 = __webpack_require__(5); -var StringArrayTemplate_1 = __webpack_require__(118); +var StringArrayTemplate_1 = __webpack_require__(136); var AbstractCustomNode_1 = __webpack_require__(7); var NodeUtils_1 = __webpack_require__(3); var StringArrayNode = function (_AbstractCustomNode_) { @@ -4218,7 +4469,7 @@ StringArrayNode = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__param( exports.StringArrayNode = StringArrayNode; /***/ }), -/* 71 */ +/* 77 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4232,14 +4483,15 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var format = __webpack_require__(12); +var format = __webpack_require__(13); var Initializable_1 = __webpack_require__(5); -var NoCustomNodes_1 = __webpack_require__(23); -var SelfDefendingTemplate_1 = __webpack_require__(119); -var StringArrayRotateFunctionTemplate_1 = __webpack_require__(120); +var NoCustomNodes_1 = __webpack_require__(22); +var SelfDefendingTemplate_1 = __webpack_require__(137); +var StringArrayRotateFunctionTemplate_1 = __webpack_require__(138); var AbstractCustomNode_1 = __webpack_require__(7); var JavaScriptObfuscator_1 = __webpack_require__(17); var NodeUtils_1 = __webpack_require__(3); @@ -4299,7 +4551,7 @@ StringArrayRotateFunctionNode = tslib_1.__decorate([inversify_1.injectable(), ts exports.StringArrayRotateFunctionNode = StringArrayRotateFunctionNode; /***/ }), -/* 72 */ +/* 78 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4313,6 +4565,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); @@ -4392,12 +4645,13 @@ StringArrayCustomNodeGroup = tslib_1.__decorate([inversify_1.injectable(), tslib exports.StringArrayCustomNodeGroup = StringArrayCustomNodeGroup; /***/ }), -/* 73 */ +/* 79 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Utils_1 = __webpack_require__(8); exports.VisitorDirection = Utils_1.Utils.strEnumify({ enter: 'enter', @@ -4405,7 +4659,7 @@ exports.VisitorDirection = Utils_1.Utils.strEnumify({ }); /***/ }), -/* 74 */ +/* 80 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4417,9 +4671,10 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); -var events_1 = __webpack_require__(124); +var events_1 = __webpack_require__(143); inversify_1.decorate(inversify_1.injectable(), events_1.EventEmitter); var ObfuscationEventEmitter = function (_events_1$EventEmitte) { _inherits(ObfuscationEventEmitter, _events_1$EventEmitte); @@ -4436,7 +4691,7 @@ ObfuscationEventEmitter = tslib_1.__decorate([inversify_1.injectable()], Obfusca exports.ObfuscationEventEmitter = ObfuscationEventEmitter; /***/ }), -/* 75 */ +/* 81 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4450,6 +4705,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); @@ -4520,7 +4776,7 @@ exports.BlockStatementControlFlowTransformer = BlockStatementControlFlowTransfor var BlockStatementControlFlowTransformer_1; /***/ }), -/* 76 */ +/* 82 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4534,16 +4790,17 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var estraverse = __webpack_require__(11); var CustomNodes_1 = __webpack_require__(9); -var NodeType_1 = __webpack_require__(13); +var NodeType_1 = __webpack_require__(14); var AbstractNodeTransformer_1 = __webpack_require__(10); var Node_1 = __webpack_require__(6); var NodeAppender_1 = __webpack_require__(18); -var ControlFlowReplacers_1 = __webpack_require__(29); +var ControlFlowReplacers_1 = __webpack_require__(31); var NodeUtils_1 = __webpack_require__(3); var RandomGeneratorUtils_1 = __webpack_require__(4); var FunctionControlFlowTransformer = FunctionControlFlowTransformer_1 = function (_AbstractNodeTransfor) { @@ -4631,6 +4888,9 @@ var FunctionControlFlowTransformer = FunctionControlFlowTransformer_1 = function return node; } var controlFlowReplacerName = FunctionControlFlowTransformer_1.controlFlowReplacersMap.get(node.type); + if (controlFlowReplacerName === undefined) { + return node; + } return Object.assign({}, _this3.controlFlowReplacerFactory(controlFlowReplacerName).replace(node, parentNode, controlFlowStorage), { parentNode: parentNode }); } }); @@ -4656,7 +4916,7 @@ var FunctionControlFlowTransformer = FunctionControlFlowTransformer_1 = function return FunctionControlFlowTransformer; }(AbstractNodeTransformer_1.AbstractNodeTransformer); -FunctionControlFlowTransformer.controlFlowReplacersMap = new Map([[NodeType_1.NodeType.BinaryExpression, ControlFlowReplacers_1.ControlFlowReplacers.BinaryExpressionControlFlowReplacer], [NodeType_1.NodeType.CallExpression, ControlFlowReplacers_1.ControlFlowReplacers.CallExpressionControlFlowReplacer], [NodeType_1.NodeType.LogicalExpression, ControlFlowReplacers_1.ControlFlowReplacers.LogicalExpressionControlFlowReplacer]]); +FunctionControlFlowTransformer.controlFlowReplacersMap = new Map([[NodeType_1.NodeType.BinaryExpression, ControlFlowReplacers_1.ControlFlowReplacers.BinaryExpressionControlFlowReplacer], [NodeType_1.NodeType.CallExpression, ControlFlowReplacers_1.ControlFlowReplacers.CallExpressionControlFlowReplacer], [NodeType_1.NodeType.LogicalExpression, ControlFlowReplacers_1.ControlFlowReplacers.LogicalExpressionControlFlowReplacer], [NodeType_1.NodeType.Literal, ControlFlowReplacers_1.ControlFlowReplacers.StringLiteralControlFlowReplacer]]); FunctionControlFlowTransformer.hostNodeSearchMinDepth = 0; FunctionControlFlowTransformer.hostNodeSearchMaxDepth = 2; FunctionControlFlowTransformer = FunctionControlFlowTransformer_1 = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.Factory__TControlFlowStorage)), tslib_1.__param(1, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.Factory__IControlFlowReplacer)), tslib_1.__param(2, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.Factory__ICustomNode)), tslib_1.__param(3, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IOptions)), tslib_1.__metadata("design:paramtypes", [Function, Function, Function, Object])], FunctionControlFlowTransformer); @@ -4664,7 +4924,7 @@ exports.FunctionControlFlowTransformer = FunctionControlFlowTransformer; var FunctionControlFlowTransformer_1; /***/ }), -/* 77 */ +/* 83 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4678,11 +4938,12 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var CustomNodes_1 = __webpack_require__(9); -var ExpressionWithOperatorControlFlowReplacer_1 = __webpack_require__(33); +var ExpressionWithOperatorControlFlowReplacer_1 = __webpack_require__(34); var BinaryExpressionControlFlowReplacer = BinaryExpressionControlFlowReplacer_1 = function (_ExpressionWithOperat) { _inherits(BinaryExpressionControlFlowReplacer, _ExpressionWithOperat); @@ -4711,7 +4972,7 @@ exports.BinaryExpressionControlFlowReplacer = BinaryExpressionControlFlowReplace var BinaryExpressionControlFlowReplacer_1; /***/ }), -/* 78 */ +/* 84 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4725,11 +4986,12 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var CustomNodes_1 = __webpack_require__(9); -var AbstractControlFlowReplacer_1 = __webpack_require__(32); +var AbstractControlFlowReplacer_1 = __webpack_require__(25); var Node_1 = __webpack_require__(6); var CallExpressionControlFlowReplacer = CallExpressionControlFlowReplacer_1 = function (_AbstractControlFlowR) { _inherits(CallExpressionControlFlowReplacer, _AbstractControlFlowR); @@ -4775,7 +5037,7 @@ exports.CallExpressionControlFlowReplacer = CallExpressionControlFlowReplacer; var CallExpressionControlFlowReplacer_1; /***/ }), -/* 79 */ +/* 85 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4789,11 +5051,12 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var CustomNodes_1 = __webpack_require__(9); -var ExpressionWithOperatorControlFlowReplacer_1 = __webpack_require__(33); +var ExpressionWithOperatorControlFlowReplacer_1 = __webpack_require__(34); var Node_1 = __webpack_require__(6); var NodeUtils_1 = __webpack_require__(3); var LogicalExpressionControlFlowReplacer = LogicalExpressionControlFlowReplacer_1 = function (_ExpressionWithOperat) { @@ -4840,7 +5103,7 @@ exports.LogicalExpressionControlFlowReplacer = LogicalExpressionControlFlowRepla var LogicalExpressionControlFlowReplacer_1; /***/ }), -/* 80 */ +/* 86 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4854,10 +5117,77 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var NodeType_1 = __webpack_require__(13); +var CustomNodes_1 = __webpack_require__(9); +var AbstractControlFlowReplacer_1 = __webpack_require__(25); +var Node_1 = __webpack_require__(6); +var StringLiteralControlFlowReplacer = StringLiteralControlFlowReplacer_1 = function (_AbstractControlFlowR) { + _inherits(StringLiteralControlFlowReplacer, _AbstractControlFlowR); + + function StringLiteralControlFlowReplacer(customNodeFactory, options) { + _classCallCheck(this, StringLiteralControlFlowReplacer); + + return _possibleConstructorReturn(this, (StringLiteralControlFlowReplacer.__proto__ || Object.getPrototypeOf(StringLiteralControlFlowReplacer)).call(this, customNodeFactory, options)); + } + + _createClass(StringLiteralControlFlowReplacer, [{ + key: "replace", + value: function replace(literalNode, parentNode, controlFlowStorage) { + if (Node_1.Node.isPropertyNode(parentNode) && parentNode.key === literalNode) { + return literalNode; + } + if (typeof literalNode.value !== 'string' || literalNode.value.length < 3) { + return literalNode; + } + var replacerId = String(literalNode.value); + var literalFunctionCustomNode = this.customNodeFactory(CustomNodes_1.CustomNodes.StringLiteralNode); + literalFunctionCustomNode.initialize(literalNode.value); + var storageKey = this.insertCustomNodeToControlFlowStorage(literalFunctionCustomNode, controlFlowStorage, replacerId, StringLiteralControlFlowReplacer_1.usingExistingIdentifierChance); + return this.getControlFlowStorageCallNode(controlFlowStorage.getStorageId(), storageKey); + } + }, { + key: "getControlFlowStorageCallNode", + value: function getControlFlowStorageCallNode(controlFlowStorageId, storageKey) { + var controlFlowStorageCallCustomNode = this.customNodeFactory(CustomNodes_1.CustomNodes.StringLiteralControlFlowStorageCallNode); + controlFlowStorageCallCustomNode.initialize(controlFlowStorageId, storageKey); + var statementNode = controlFlowStorageCallCustomNode.getNode()[0]; + if (!statementNode || !Node_1.Node.isExpressionStatementNode(statementNode)) { + throw new Error("`controlFlowStorageCallCustomNode.getNode()[0]` should returns array with `ExpressionStatement` node"); + } + return statementNode.expression; + } + }]); + + return StringLiteralControlFlowReplacer; +}(AbstractControlFlowReplacer_1.AbstractControlFlowReplacer); +StringLiteralControlFlowReplacer.usingExistingIdentifierChance = 1; +StringLiteralControlFlowReplacer = StringLiteralControlFlowReplacer_1 = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.Factory__ICustomNode)), tslib_1.__param(1, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IOptions)), tslib_1.__metadata("design:paramtypes", [Function, Object])], StringLiteralControlFlowReplacer); +exports.StringLiteralControlFlowReplacer = StringLiteralControlFlowReplacer; +var StringLiteralControlFlowReplacer_1; + +/***/ }), +/* 87 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(1); +var inversify_1 = __webpack_require__(0); +var ServiceIdentifiers_1 = __webpack_require__(2); +var NodeType_1 = __webpack_require__(14); var AbstractNodeTransformer_1 = __webpack_require__(10); var Node_1 = __webpack_require__(6); var MemberExpressionTransformer = function (_AbstractNodeTransfor) { @@ -4906,7 +5236,7 @@ MemberExpressionTransformer = tslib_1.__decorate([inversify_1.injectable(), tsli exports.MemberExpressionTransformer = MemberExpressionTransformer; /***/ }), -/* 81 */ +/* 88 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4920,10 +5250,11 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var NodeType_1 = __webpack_require__(13); +var NodeType_1 = __webpack_require__(14); var AbstractNodeTransformer_1 = __webpack_require__(10); var Node_1 = __webpack_require__(6); var MethodDefinitionTransformer = MethodDefinitionTransformer_1 = function (_AbstractNodeTransfor) { @@ -4971,7 +5302,7 @@ exports.MethodDefinitionTransformer = MethodDefinitionTransformer; var MethodDefinitionTransformer_1; /***/ }), -/* 82 */ +/* 89 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4985,12 +5316,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var AbstractNodeTransformer_1 = __webpack_require__(10); var Node_1 = __webpack_require__(6); -var Nodes_1 = __webpack_require__(14); +var Nodes_1 = __webpack_require__(12); var TemplateLiteralTransformer = TemplateLiteralTransformer_1 = function (_AbstractNodeTransfor) { _inherits(TemplateLiteralTransformer, _AbstractNodeTransfor); @@ -5055,7 +5387,7 @@ exports.TemplateLiteralTransformer = TemplateLiteralTransformer; var TemplateLiteralTransformer_1; /***/ }), -/* 83 */ +/* 90 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5069,6 +5401,153 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(1); +var inversify_1 = __webpack_require__(0); +var ServiceIdentifiers_1 = __webpack_require__(2); +var estraverse = __webpack_require__(11); +var AbstractNodeTransformer_1 = __webpack_require__(10); +var Node_1 = __webpack_require__(6); +var Nodes_1 = __webpack_require__(12); +var NodeUtils_1 = __webpack_require__(3); +var RandomGeneratorUtils_1 = __webpack_require__(4); +var DeadCodeInjectionTransformer = DeadCodeInjectionTransformer_1 = function (_AbstractNodeTransfor) { + _inherits(DeadCodeInjectionTransformer, _AbstractNodeTransfor); + + function DeadCodeInjectionTransformer(options) { + _classCallCheck(this, DeadCodeInjectionTransformer); + + var _this = _possibleConstructorReturn(this, (DeadCodeInjectionTransformer.__proto__ || Object.getPrototypeOf(DeadCodeInjectionTransformer)).call(this, options)); + + _this.collectedBlockStatements = []; + return _this; + } + + _createClass(DeadCodeInjectionTransformer, [{ + key: "getVisitor", + value: function getVisitor() { + var _this2 = this; + + return { + leave: function leave(node, parentNode) { + if (Node_1.Node.isProgramNode(node)) { + return _this2.transformNode(node, parentNode); + } + } + }; + } + }, { + key: "transformNode", + value: function transformNode(programNode, parentNode) { + this.transformProgramNode(programNode); + return programNode; + } + }, { + key: "transformProgramNode", + value: function transformProgramNode(programNode) { + var _this3 = this; + + estraverse.traverse(programNode, { + enter: function enter(node, parentNode) { + if (!Node_1.Node.isBlockStatementNode(node)) { + return; + } + DeadCodeInjectionTransformer_1.collectBlockStatementNodes(node, _this3.collectedBlockStatements); + } + }); + if (this.collectedBlockStatements.length < DeadCodeInjectionTransformer_1.minCollectedBlockStatementsCount) { + return; + } + estraverse.replace(programNode, { + leave: function leave(node, parentNode) { + if (!_this3.collectedBlockStatements.length) { + return estraverse.VisitorOption.Break; + } + if (!Node_1.Node.isBlockStatementNode(node) || RandomGeneratorUtils_1.RandomGeneratorUtils.getMathRandom() > _this3.options.deadCodeInjectionThreshold) { + return node; + } + var randomIndex = RandomGeneratorUtils_1.RandomGeneratorUtils.getRandomInteger(0, _this3.collectedBlockStatements.length - 1); + var randomBlockStatementNode = _this3.collectedBlockStatements.splice(randomIndex, 1)[0]; + if (randomBlockStatementNode === node) { + return node; + } + return DeadCodeInjectionTransformer_1.replaceBlockStatementNode(node, randomBlockStatementNode); + } + }); + } + }], [{ + key: "collectBlockStatementNodes", + value: function collectBlockStatementNodes(blockStatementNode, collectedBlockStatements) { + var clonedBlockStatementNode = NodeUtils_1.NodeUtils.clone(blockStatementNode); + var nestedBlockStatementsCount = 0, + isValidBlockStatementNode = true; + estraverse.replace(clonedBlockStatementNode, { + enter: function enter(node, parentNode) { + if (Node_1.Node.isBlockStatementNode(node)) { + nestedBlockStatementsCount++; + } + if (nestedBlockStatementsCount > DeadCodeInjectionTransformer_1.maxNestedBlockStatementsCount || Node_1.Node.isBreakStatementNode(node) || Node_1.Node.isContinueStatementNode(node)) { + isValidBlockStatementNode = false; + return estraverse.VisitorOption.Break; + } + if (Node_1.Node.isIdentifierNode(node) && !Node_1.Node.isMemberExpressionNode(parentNode)) { + node.name = RandomGeneratorUtils_1.RandomGeneratorUtils.getRandomVariableName(6); + } + return node; + } + }); + if (!isValidBlockStatementNode) { + return; + } + collectedBlockStatements.push(clonedBlockStatementNode); + } + }, { + key: "replaceBlockStatementNode", + value: function replaceBlockStatementNode(blockStatementNode, randomBlockStatementNode) { + var random1 = RandomGeneratorUtils_1.RandomGeneratorUtils.getMathRandom() > 0.5; + var random2 = RandomGeneratorUtils_1.RandomGeneratorUtils.getMathRandom() > 0.5; + var operator = random1 ? '===' : '!=='; + var leftString = RandomGeneratorUtils_1.RandomGeneratorUtils.getRandomString(3); + var rightString = random2 ? leftString : RandomGeneratorUtils_1.RandomGeneratorUtils.getRandomString(3); + var consequent = void 0, + alternate = void 0; + if (random1 && random2 || !random1 && !random2) { + consequent = blockStatementNode; + alternate = randomBlockStatementNode; + } else { + consequent = randomBlockStatementNode; + alternate = blockStatementNode; + } + var newBlockStatementNode = Nodes_1.Nodes.getBlockStatementNode([Nodes_1.Nodes.getIfStatementNode(Nodes_1.Nodes.getBinaryExpressionNode(operator, Nodes_1.Nodes.getLiteralNode(leftString), Nodes_1.Nodes.getLiteralNode(rightString)), consequent, alternate)]); + newBlockStatementNode = NodeUtils_1.NodeUtils.parentize(newBlockStatementNode); + return newBlockStatementNode; + } + }]); + + return DeadCodeInjectionTransformer; +}(AbstractNodeTransformer_1.AbstractNodeTransformer); +DeadCodeInjectionTransformer.maxNestedBlockStatementsCount = 4; +DeadCodeInjectionTransformer.minCollectedBlockStatementsCount = 5; +DeadCodeInjectionTransformer = DeadCodeInjectionTransformer_1 = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IOptions)), tslib_1.__metadata("design:paramtypes", [Object])], DeadCodeInjectionTransformer); +exports.DeadCodeInjectionTransformer = DeadCodeInjectionTransformer; +var DeadCodeInjectionTransformer_1; + +/***/ }), +/* 91 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); @@ -5141,7 +5620,7 @@ CatchClauseTransformer = tslib_1.__decorate([inversify_1.injectable(), tslib_1._ exports.CatchClauseTransformer = CatchClauseTransformer; /***/ }), -/* 84 */ +/* 92 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5155,12 +5634,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var estraverse = __webpack_require__(11); var ObfuscationReplacers_1 = __webpack_require__(16); -var NodeType_1 = __webpack_require__(13); +var NodeType_1 = __webpack_require__(14); var AbstractNodeTransformer_1 = __webpack_require__(10); var Node_1 = __webpack_require__(6); var NodeUtils_1 = __webpack_require__(3); @@ -5249,7 +5729,7 @@ FunctionDeclarationTransformer = tslib_1.__decorate([inversify_1.injectable(), t exports.FunctionDeclarationTransformer = FunctionDeclarationTransformer; /***/ }), -/* 85 */ +/* 93 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5263,6 +5743,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); @@ -5354,7 +5835,7 @@ FunctionTransformer = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__pa exports.FunctionTransformer = FunctionTransformer; /***/ }), -/* 86 */ +/* 94 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5368,6 +5849,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); @@ -5434,7 +5916,7 @@ LabeledStatementTransformer = tslib_1.__decorate([inversify_1.injectable(), tsli exports.LabeledStatementTransformer = LabeledStatementTransformer; /***/ }), -/* 87 */ +/* 95 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5453,7 +5935,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var escodegen = __webpack_require__(20); +var escodegen = __webpack_require__(23); var ObfuscationReplacers_1 = __webpack_require__(16); var AbstractNodeTransformer_1 = __webpack_require__(10); var Node_1 = __webpack_require__(6); @@ -5516,7 +5998,7 @@ LiteralTransformer = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__par exports.LiteralTransformer = LiteralTransformer; /***/ }), -/* 88 */ +/* 96 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5530,14 +6012,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var escodegen = __webpack_require__(20); -var NodeType_1 = __webpack_require__(13); +var NodeType_1 = __webpack_require__(14); var AbstractNodeTransformer_1 = __webpack_require__(10); var Node_1 = __webpack_require__(6); -var Utils_1 = __webpack_require__(8); var ObjectExpressionTransformer = ObjectExpressionTransformer_1 = function (_AbstractNodeTransfor) { _inherits(ObjectExpressionTransformer, _AbstractNodeTransfor); @@ -5567,36 +6048,19 @@ var ObjectExpressionTransformer = ObjectExpressionTransformer_1 = function (_Abs if (property.shorthand) { property.shorthand = false; } - if (Node_1.Node.isLiteralNode(property.key)) { - property.key = ObjectExpressionTransformer_1.transformLiteralPropertyKey(property.key); - } else if (Node_1.Node.isIdentifierNode(property.key)) { + if (Node_1.Node.isIdentifierNode(property.key)) { property.key = ObjectExpressionTransformer_1.transformIdentifierPropertyKey(property.key); } }); return objectExpressionNode; } }], [{ - key: "transformLiteralPropertyKey", - value: function transformLiteralPropertyKey(node) { - if (typeof node.value === 'string' && !node['x-verbatim-property']) { - node['x-verbatim-property'] = { - content: "'" + Utils_1.Utils.stringToUnicodeEscapeSequence(node.value) + "'", - precedence: escodegen.Precedence.Primary - }; - } - return node; - } - }, { key: "transformIdentifierPropertyKey", value: function transformIdentifierPropertyKey(node) { return { type: NodeType_1.NodeType.Literal, value: node.name, - raw: "'" + node.name + "'", - 'x-verbatim-property': { - content: "'" + Utils_1.Utils.stringToUnicodeEscapeSequence(node.name) + "'", - precedence: escodegen.Precedence.Primary - } + raw: "'" + node.name + "'" }; } }]); @@ -5608,7 +6072,7 @@ exports.ObjectExpressionTransformer = ObjectExpressionTransformer; var ObjectExpressionTransformer_1; /***/ }), -/* 89 */ +/* 97 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5622,12 +6086,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var estraverse = __webpack_require__(11); var ObfuscationReplacers_1 = __webpack_require__(16); -var NodeType_1 = __webpack_require__(13); +var NodeType_1 = __webpack_require__(14); var AbstractNodeTransformer_1 = __webpack_require__(10); var Node_1 = __webpack_require__(6); var NodeUtils_1 = __webpack_require__(3); @@ -5728,7 +6193,7 @@ VariableDeclarationTransformer = tslib_1.__decorate([inversify_1.injectable(), t exports.VariableDeclarationTransformer = VariableDeclarationTransformer; /***/ }), -/* 90 */ +/* 98 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5742,11 +6207,12 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var JSFuck_1 = __webpack_require__(27); -var AbstractReplacer_1 = __webpack_require__(22); +var JSFuck_1 = __webpack_require__(29); +var AbstractReplacer_1 = __webpack_require__(21); var BooleanLiteralReplacer = function (_AbstractReplacer_1$A) { _inherits(BooleanLiteralReplacer, _AbstractReplacer_1$A); @@ -5769,7 +6235,7 @@ BooleanLiteralReplacer = tslib_1.__decorate([inversify_1.injectable(), tslib_1._ exports.BooleanLiteralReplacer = BooleanLiteralReplacer; /***/ }), -/* 91 */ +/* 99 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5783,10 +6249,11 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var AbstractReplacer_1 = __webpack_require__(22); +var AbstractReplacer_1 = __webpack_require__(21); var RandomGeneratorUtils_1 = __webpack_require__(4); var IdentifierReplacer = function (_AbstractReplacer_1$A) { _inherits(IdentifierReplacer, _AbstractReplacer_1$A); @@ -5831,7 +6298,7 @@ IdentifierReplacer = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__par exports.IdentifierReplacer = IdentifierReplacer; /***/ }), -/* 92 */ +/* 100 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5845,10 +6312,11 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var AbstractReplacer_1 = __webpack_require__(22); +var AbstractReplacer_1 = __webpack_require__(21); var Utils_1 = __webpack_require__(8); var NumberLiteralReplacer = function (_AbstractReplacer_1$A) { _inherits(NumberLiteralReplacer, _AbstractReplacer_1$A); @@ -5885,7 +6353,7 @@ NumberLiteralReplacer = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__ exports.NumberLiteralReplacer = NumberLiteralReplacer; /***/ }), -/* 93 */ +/* 101 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5899,12 +6367,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var StringArrayEncoding_1 = __webpack_require__(24); -var AbstractReplacer_1 = __webpack_require__(22); -var CryptUtils_1 = __webpack_require__(26); +var AbstractReplacer_1 = __webpack_require__(21); +var CryptUtils_1 = __webpack_require__(28); var RandomGeneratorUtils_1 = __webpack_require__(4); var Utils_1 = __webpack_require__(8); var StringLiteralReplacer = StringLiteralReplacer_1 = function (_AbstractReplacer_1$A) { @@ -5998,7 +6467,7 @@ exports.StringLiteralReplacer = StringLiteralReplacer; var StringLiteralReplacer_1; /***/ }), -/* 94 */ +/* 102 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6006,12 +6475,13 @@ var StringLiteralReplacer_1; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); -var class_validator_1 = __webpack_require__(122); -var Default_1 = __webpack_require__(34); -var OptionsNormalizer_1 = __webpack_require__(95); -var ValidationErrorsFormatter_1 = __webpack_require__(96); +var class_validator_1 = __webpack_require__(140); +var Default_1 = __webpack_require__(26); +var OptionsNormalizer_1 = __webpack_require__(103); +var ValidationErrorsFormatter_1 = __webpack_require__(104); var Options = Options_1 = function Options(inputOptions) { _classCallCheck(this, Options); @@ -6030,12 +6500,15 @@ Options.validatorOptions = { tslib_1.__decorate([class_validator_1.IsBoolean(), tslib_1.__metadata("design:type", Boolean)], Options.prototype, "compact", void 0); tslib_1.__decorate([class_validator_1.IsBoolean(), tslib_1.__metadata("design:type", Boolean)], Options.prototype, "controlFlowFlattening", void 0); tslib_1.__decorate([class_validator_1.IsNumber(), class_validator_1.Min(0), class_validator_1.Max(1), tslib_1.__metadata("design:type", Number)], Options.prototype, "controlFlowFlatteningThreshold", void 0); +tslib_1.__decorate([class_validator_1.IsBoolean(), tslib_1.__metadata("design:type", Boolean)], Options.prototype, "deadCodeInjection", void 0); +tslib_1.__decorate([class_validator_1.IsNumber(), tslib_1.__metadata("design:type", Number)], Options.prototype, "deadCodeInjectionThreshold", void 0); tslib_1.__decorate([class_validator_1.IsBoolean(), tslib_1.__metadata("design:type", Boolean)], Options.prototype, "debugProtection", void 0); tslib_1.__decorate([class_validator_1.IsBoolean(), tslib_1.__metadata("design:type", Boolean)], Options.prototype, "debugProtectionInterval", void 0); tslib_1.__decorate([class_validator_1.IsBoolean(), tslib_1.__metadata("design:type", Boolean)], Options.prototype, "disableConsoleOutput", void 0); tslib_1.__decorate([class_validator_1.IsArray(), class_validator_1.ArrayUnique(), class_validator_1.IsString({ each: true }), tslib_1.__metadata("design:type", Array)], Options.prototype, "domainLock", void 0); +tslib_1.__decorate([class_validator_1.IsBoolean(), tslib_1.__metadata("design:type", Boolean)], Options.prototype, "mangle", void 0); tslib_1.__decorate([class_validator_1.IsArray(), class_validator_1.ArrayUnique(), class_validator_1.IsString({ each: true }), tslib_1.__metadata("design:type", Array)], Options.prototype, "reservedNames", void 0); @@ -6060,7 +6533,7 @@ exports.Options = Options; var Options_1; /***/ }), -/* 95 */ +/* 103 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6070,7 +6543,17 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var Utils_1 = __webpack_require__(8); +Object.defineProperty(exports, "__esModule", { value: true }); +var ControlFlowFlatteningThresholdRule_1 = __webpack_require__(105); +var DeadCodeInjectionRule_1 = __webpack_require__(106); +var DeadCodeInjectionThresholdRule_1 = __webpack_require__(107); +var DomainLockRule_1 = __webpack_require__(108); +var SelfDefendingRule_1 = __webpack_require__(109); +var SourceMapBaseUrlRule_1 = __webpack_require__(110); +var SourceMapFileNameRule_1 = __webpack_require__(111); +var StringArrayRule_1 = __webpack_require__(113); +var StringArrayEncodingRule_1 = __webpack_require__(112); +var StringArrayThresholdRule_1 = __webpack_require__(114); var OptionsNormalizer = function () { function OptionsNormalizer() { @@ -6108,134 +6591,16 @@ var OptionsNormalizer = function () { return normalizedOptions; } - }, { - key: "controlFlowFlatteningThresholdRule", - value: function controlFlowFlatteningThresholdRule(options) { - if (options.controlFlowFlatteningThreshold === 0) { - options = Object.assign({}, options, OptionsNormalizer.DISABLED_CONTROL_FLOW_FLATTENING_OPTIONS); - } - return options; - } - }, { - key: "domainLockRule", - value: function domainLockRule(options) { - if (options.domainLock.length) { - var normalizedDomains = []; - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = options.domainLock[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var domain = _step2.value; - - normalizedDomains.push(Utils_1.Utils.extractDomainFromUrl(domain)); - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2.return) { - _iterator2.return(); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - - options = Object.assign({}, options, { domainLock: normalizedDomains }); - } - return options; - } - }, { - key: "selfDefendingRule", - value: function selfDefendingRule(options) { - if (options.selfDefending) { - options = Object.assign({}, options, OptionsNormalizer.SELF_DEFENDING_OPTIONS); - } - return options; - } - }, { - key: "sourceMapBaseUrlRule", - value: function sourceMapBaseUrlRule(options) { - var _options = options, - sourceMapBaseUrl = _options.sourceMapBaseUrl; - - if (!options.sourceMapFileName) { - options = Object.assign({}, options, { sourceMapBaseUrl: '' }); - return options; - } - if (sourceMapBaseUrl && !sourceMapBaseUrl.endsWith('/')) { - options = Object.assign({}, options, { sourceMapBaseUrl: sourceMapBaseUrl + "/" }); - } - return options; - } - }, { - key: "sourceMapFileNameRule", - value: function sourceMapFileNameRule(options) { - var _options2 = options, - sourceMapFileName = _options2.sourceMapFileName; - - if (sourceMapFileName) { - sourceMapFileName = sourceMapFileName.replace(/^\/+/, '').split('.')[0]; - options = Object.assign({}, options, { sourceMapFileName: sourceMapFileName + ".js.map" }); - } - return options; - } - }, { - key: "stringArrayRule", - value: function stringArrayRule(options) { - if (!options.stringArray) { - options = Object.assign({}, options, OptionsNormalizer.DISABLED_STRING_ARRAY_OPTIONS); - } - return options; - } - }, { - key: "stringArrayEncodingRule", - value: function stringArrayEncodingRule(options) { - if (options.stringArrayEncoding === true) { - options = Object.assign({}, options, OptionsNormalizer.STRING_ARRAY_ENCODING_OPTIONS); - } - return options; - } - }, { - key: "stringArrayThresholdRule", - value: function stringArrayThresholdRule(options) { - if (options.stringArrayThreshold === 0) { - options = Object.assign({}, options, OptionsNormalizer.DISABLED_STRING_ARRAY_OPTIONS); - } - return options; - } }]); return OptionsNormalizer; }(); -OptionsNormalizer.DISABLED_CONTROL_FLOW_FLATTENING_OPTIONS = { - controlFlowFlattening: false, - controlFlowFlatteningThreshold: 0 -}; -OptionsNormalizer.DISABLED_STRING_ARRAY_OPTIONS = { - rotateStringArray: false, - stringArray: false, - stringArrayEncoding: false, - stringArrayThreshold: 0 -}; -OptionsNormalizer.SELF_DEFENDING_OPTIONS = { - compact: true, - selfDefending: true -}; -OptionsNormalizer.STRING_ARRAY_ENCODING_OPTIONS = { - stringArrayEncoding: 'base64' -}; -OptionsNormalizer.normalizerRules = [OptionsNormalizer.controlFlowFlatteningThresholdRule, OptionsNormalizer.domainLockRule, OptionsNormalizer.selfDefendingRule, OptionsNormalizer.sourceMapBaseUrlRule, OptionsNormalizer.sourceMapFileNameRule, OptionsNormalizer.stringArrayRule, OptionsNormalizer.stringArrayEncodingRule, OptionsNormalizer.stringArrayThresholdRule]; +OptionsNormalizer.normalizerRules = [ControlFlowFlatteningThresholdRule_1.ControlFlowFlatteningThresholdRule, DeadCodeInjectionRule_1.DeadCodeInjectionRule, DeadCodeInjectionThresholdRule_1.DeadCodeInjectionThresholdRule, DomainLockRule_1.DomainLockRule, SelfDefendingRule_1.SelfDefendingRule, SourceMapBaseUrlRule_1.SourceMapBaseUrlRule, SourceMapFileNameRule_1.SourceMapFileNameRule, StringArrayRule_1.StringArrayRule, StringArrayEncodingRule_1.StringArrayEncodingRule, StringArrayThresholdRule_1.StringArrayThresholdRule]; exports.OptionsNormalizer = OptionsNormalizer; /***/ }), -/* 96 */ +/* 104 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6245,6 +6610,8 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); + var ValidationErrorsFormatter = function () { function ValidationErrorsFormatter() { _classCallCheck(this, ValidationErrorsFormatter); @@ -6302,7 +6669,234 @@ var ValidationErrorsFormatter = function () { exports.ValidationErrorsFormatter = ValidationErrorsFormatter; /***/ }), -/* 97 */ +/* 105 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var DISABLED_CONTROL_FLOW_FLATTENING_OPTIONS = { + controlFlowFlattening: false, + controlFlowFlatteningThreshold: 0 +}; +exports.ControlFlowFlatteningThresholdRule = function (options) { + if (options.controlFlowFlatteningThreshold === 0) { + options = Object.assign({}, options, DISABLED_CONTROL_FLOW_FLATTENING_OPTIONS); + } + return options; +}; + +/***/ }), +/* 106 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var Default_1 = __webpack_require__(26); +var ENABLED_DEAD_CODE_INJECTION_OPTIONS = { + deadCodeInjection: true, + stringArray: true +}; +var ENABLED_STRING_ARRAY_THRESHOLD_OPTIONS = { + stringArray: true, + stringArrayThreshold: Default_1.DEFAULT_PRESET.stringArrayThreshold +}; +exports.DeadCodeInjectionRule = function (options) { + if (options.deadCodeInjection) { + options = Object.assign({}, options, ENABLED_DEAD_CODE_INJECTION_OPTIONS); + if (!options.stringArrayThreshold) { + options = Object.assign({}, options, ENABLED_STRING_ARRAY_THRESHOLD_OPTIONS); + } + } + return options; +}; + +/***/ }), +/* 107 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var DISABLED_DEAD_CODE_INJECTION_OPTIONS = { + deadCodeInjection: false, + deadCodeInjectionThreshold: 0 +}; +exports.DeadCodeInjectionThresholdRule = function (options) { + if (options.deadCodeInjectionThreshold === 0) { + options = Object.assign({}, options, DISABLED_DEAD_CODE_INJECTION_OPTIONS); + } + return options; +}; + +/***/ }), +/* 108 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var Utils_1 = __webpack_require__(8); +exports.DomainLockRule = function (options) { + if (options.domainLock.length) { + var normalizedDomains = []; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = options.domainLock[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var domain = _step.value; + + normalizedDomains.push(Utils_1.Utils.extractDomainFromUrl(domain)); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + options = Object.assign({}, options, { domainLock: normalizedDomains }); + } + return options; +}; + +/***/ }), +/* 109 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var SELF_DEFENDING_OPTIONS = { + compact: true, + selfDefending: true +}; +exports.SelfDefendingRule = function (options) { + if (options.selfDefending) { + options = Object.assign({}, options, SELF_DEFENDING_OPTIONS); + } + return options; +}; + +/***/ }), +/* 110 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SourceMapBaseUrlRule = function (options) { + var _options = options, + sourceMapBaseUrl = _options.sourceMapBaseUrl; + + if (!options.sourceMapFileName) { + options = Object.assign({}, options, { sourceMapBaseUrl: '' }); + return options; + } + if (sourceMapBaseUrl && !sourceMapBaseUrl.endsWith('/')) { + options = Object.assign({}, options, { sourceMapBaseUrl: sourceMapBaseUrl + "/" }); + } + return options; +}; + +/***/ }), +/* 111 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SourceMapFileNameRule = function (options) { + var _options = options, + sourceMapFileName = _options.sourceMapFileName; + + if (sourceMapFileName) { + sourceMapFileName = sourceMapFileName.replace(/^\/+/, '').split('.')[0]; + options = Object.assign({}, options, { sourceMapFileName: sourceMapFileName + ".js.map" }); + } + return options; +}; + +/***/ }), +/* 112 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var STRING_ARRAY_ENCODING_OPTIONS = { + stringArrayEncoding: 'base64' +}; +exports.StringArrayEncodingRule = function (options) { + if (options.stringArrayEncoding === true) { + options = Object.assign({}, options, STRING_ARRAY_ENCODING_OPTIONS); + } + return options; +}; + +/***/ }), +/* 113 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var DISABLED_STRING_ARRAY_OPTIONS = { + rotateStringArray: false, + stringArray: false, + stringArrayEncoding: false, + stringArrayThreshold: 0 +}; +exports.StringArrayRule = function (options) { + if (!options.stringArray) { + options = Object.assign({}, options, DISABLED_STRING_ARRAY_OPTIONS); + } + return options; +}; + +/***/ }), +/* 114 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var DISABLED_STRING_ARRAY_OPTIONS = { + rotateStringArray: false, + stringArray: false, + stringArrayEncoding: false, + stringArrayThreshold: 0 +}; +exports.StringArrayThresholdRule = function (options) { + if (options.stringArrayThreshold === 0) { + options = Object.assign({}, options, DISABLED_STRING_ARRAY_OPTIONS); + } + return options; +}; + +/***/ }), +/* 115 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6312,11 +6906,12 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); var estraverse = __webpack_require__(11); -var CalleeDataExtractors_1 = __webpack_require__(28); +var CalleeDataExtractors_1 = __webpack_require__(30); var Node_1 = __webpack_require__(6); var NodeUtils_1 = __webpack_require__(3); var StackTraceAnalyzer = StackTraceAnalyzer_1 = function () { @@ -6404,7 +6999,7 @@ exports.StackTraceAnalyzer = StackTraceAnalyzer; var StackTraceAnalyzer_1; /***/ }), -/* 98 */ +/* 116 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6418,10 +7013,11 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var estraverse = __webpack_require__(11); -var AbstractCalleeDataExtractor_1 = __webpack_require__(25); +var AbstractCalleeDataExtractor_1 = __webpack_require__(27); var Node_1 = __webpack_require__(6); var NodeUtils_1 = __webpack_require__(3); var FunctionDeclarationCalleeDataExtractor = function (_AbstractCalleeDataEx) { @@ -6470,7 +7066,7 @@ FunctionDeclarationCalleeDataExtractor = tslib_1.__decorate([inversify_1.injecta exports.FunctionDeclarationCalleeDataExtractor = FunctionDeclarationCalleeDataExtractor; /***/ }), -/* 99 */ +/* 117 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6484,10 +7080,11 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var estraverse = __webpack_require__(11); -var AbstractCalleeDataExtractor_1 = __webpack_require__(25); +var AbstractCalleeDataExtractor_1 = __webpack_require__(27); var Node_1 = __webpack_require__(6); var NodeUtils_1 = __webpack_require__(3); var FunctionExpressionCalleeDataExtractor = function (_AbstractCalleeDataEx) { @@ -6539,7 +7136,7 @@ FunctionExpressionCalleeDataExtractor = tslib_1.__decorate([inversify_1.injectab exports.FunctionExpressionCalleeDataExtractor = FunctionExpressionCalleeDataExtractor; /***/ }), -/* 100 */ +/* 118 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6553,12 +7150,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var estraverse = __webpack_require__(11); var Node_1 = __webpack_require__(6); var NodeUtils_1 = __webpack_require__(3); -var AbstractCalleeDataExtractor_1 = __webpack_require__(25); +var AbstractCalleeDataExtractor_1 = __webpack_require__(27); var ObjectExpressionCalleeDataExtractor = function (_AbstractCalleeDataEx) { _inherits(ObjectExpressionCalleeDataExtractor, _AbstractCalleeDataEx); @@ -6678,7 +7276,7 @@ ObjectExpressionCalleeDataExtractor = tslib_1.__decorate([inversify_1.injectable exports.ObjectExpressionCalleeDataExtractor = ObjectExpressionCalleeDataExtractor; /***/ }), -/* 101 */ +/* 119 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6690,6 +7288,7 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var Initializable_1 = __webpack_require__(5); @@ -6767,7 +7366,7 @@ ArrayStorage = tslib_1.__decorate([inversify_1.injectable()], ArrayStorage); exports.ArrayStorage = ArrayStorage; /***/ }), -/* 102 */ +/* 120 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6779,6 +7378,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var MapStorage_1 = __webpack_require__(35); var ControlFlowStorage = function (_MapStorage_1$MapStor) { @@ -6799,7 +7399,7 @@ var ControlFlowStorage = function (_MapStorage_1$MapStor) { exports.ControlFlowStorage = ControlFlowStorage; /***/ }), -/* 103 */ +/* 121 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6813,10 +7413,11 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(2); -var CustomNodeGroups_1 = __webpack_require__(30); +var CustomNodeGroups_1 = __webpack_require__(32); var MapStorage_1 = __webpack_require__(35); var RandomGeneratorUtils_1 = __webpack_require__(4); var CustomNodeGroupStorage = CustomNodeGroupStorage_1 = function (_MapStorage_1$MapStor) { @@ -6858,7 +7459,7 @@ exports.CustomNodeGroupStorage = CustomNodeGroupStorage; var CustomNodeGroupStorage_1; /***/ }), -/* 104 */ +/* 122 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6874,9 +7475,10 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__(1); var inversify_1 = __webpack_require__(0); -var ArrayStorage_1 = __webpack_require__(101); +var ArrayStorage_1 = __webpack_require__(119); var RandomGeneratorUtils_1 = __webpack_require__(4); var Utils_1 = __webpack_require__(8); var StringArrayStorage = function (_ArrayStorage_1$Array) { @@ -6921,242 +7523,70 @@ StringArrayStorage = tslib_1.__decorate([inversify_1.injectable(), tslib_1.__met exports.StringArrayStorage = StringArrayStorage; /***/ }), -/* 105 */ +/* 123 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); function AtobTemplate() { return "\n (function () {\n var getGlobal = Function('return (function () ' + '{}.constructor(\"return this\")()' + ');');\n\n var object = getGlobal();\n var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\n object.atob || (\n object.atob = function(input) {\n var str = String(input).replace(/=+$/, '');\n for (\n var bc = 0, bs, buffer, idx = 0, output = '';\n buffer = str.charAt(idx++);\n ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,\n bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0\n ) {\n buffer = chars.indexOf(buffer);\n }\n return output;\n });\n })();\n "; } exports.AtobTemplate = AtobTemplate; /***/ }), -/* 106 */ +/* 124 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); function Rc4Template() { return "\n var rc4 = function (str, key) {\n var s = [], j = 0, x, res = '', newStr = '';\n \n str = atob(str);\n \n for (var k = 0, length = str.length; k < length; k++) {\n newStr += '%' + ('00' + str.charCodeAt(k).toString(16)).slice(-2);\n }\n \n str = decodeURIComponent(newStr);\n \t \n\t for (var i = 0; i < 256; i++) {\n s[i] = i;\n }\n \n for (i = 0; i < 256; i++) {\n j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;\n x = s[i];\n s[i] = s[j];\n s[j] = x;\n }\n \n i = 0;\n j = 0;\n \n for (var y = 0; y < str.length; y++) {\n i = (i + 1) % 256;\n j = (j + s[i]) % 256;\n x = s[i];\n s[i] = s[j];\n s[j] = x;\n res += String.fromCharCode(str.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]);\n }\n \n return res;\n }\n "; } exports.Rc4Template = Rc4Template; /***/ }), -/* 107 */ +/* 125 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); function SingleNodeCallControllerTemplate() { return "\n var {singleNodeCallControllerFunctionName} = (function(){\n var firstCall = true;\n \n return function (context, fn){\t\n var rfn = firstCall ? function(){\n if(fn){\n var res = fn.apply(context, arguments);\n fn = null;\n return res;\n }\n } : function(){}\n \n firstCall = false;\n \n return rfn;\n }\n })();\n "; } exports.SingleNodeCallControllerTemplate = SingleNodeCallControllerTemplate; /***/ }), -/* 108 */ +/* 126 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); function ConsoleOutputDisableExpressionTemplate() { return "\n var {consoleLogDisableFunctionName} = {singleNodeCallControllerFunctionName}(this, function () {\n var getGlobal = Function('return (function() ' + '{}.constructor(\"return this\")( )' + ');');\n \n var func = function () {};\n var that = getGlobal();\n \n if (!that.console) {\n that.console = (function (func){ \n var c = {}; \n \n c.log = func;\n c.warn = func; \n c.debug = func;\n c.info = func;\n c.error = func;\n c.exception = func;\n c.trace = func;\n \n return c; \n })(func);\n } else {\n that.console.log = func;\n that.console.warn = func; \n that.console.debug = func;\n that.console.info = func;\n that.console.error = func;\n that.console.exception = func;\n that.console.trace = func;\n }\n });\n \n {consoleLogDisableFunctionName}();\n "; } exports.ConsoleOutputDisableExpressionTemplate = ConsoleOutputDisableExpressionTemplate; /***/ }), -/* 109 */ +/* 127 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); function DebugProtectionFunctionCallTemplate() { return "{debugProtectionFunctionName}();"; } exports.DebugProtectionFunctionCallTemplate = DebugProtectionFunctionCallTemplate; -/***/ }), -/* 110 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function DebugProtectionFunctionIntervalTemplate() { - return "\n setInterval(function () {\n {debugProtectionFunctionName}();\n }, 4000);\n "; -} -exports.DebugProtectionFunctionIntervalTemplate = DebugProtectionFunctionIntervalTemplate; - -/***/ }), -/* 111 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function DebugProtectionFunctionTemplate() { - return "\n var {debugProtectionFunctionName} = function () {\n function debuggerProtection (counter) {\n if (('' + counter / counter)['length'] !== 1 || counter % 20 === 0) {\n (function () {}.constructor('debugger')());\n } else {\n (function () {}.constructor('debugger')());\n }\n \n debuggerProtection(++counter);\n }\n \n try {\n debuggerProtection(0);\n } catch (y) {}\n };\n "; -} -exports.DebugProtectionFunctionTemplate = DebugProtectionFunctionTemplate; - -/***/ }), -/* 112 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function DomainLockNodeTemplate() { - return "\n var {domainLockFunctionName} = {singleNodeCallControllerFunctionName}(this, function () {\n var getGlobal = Function('return (function () ' + '{}.constructor(\"return this\")()' + ');');\n\n var func = function () { \n return {\n key: 'item',\n value: 'attribute',\n getAttribute: function () {\n getGlobal()['eval']('while(true){}')();\n }()\n };\n };\n \n var regExp = new RegExp(\"[{diff}]\", \"g\");\n var domains = \"{domains}\".replace(regExp, \"\").split(\";\");\n var eval = [][\"forEach\"][\"constructor\"];\n var windowObject = eval(\"return this\")();\n var document;\n var domain;\n \n for (var d in windowObject) {\n if (d.length == 8 && d.charCodeAt(7) == 116 && d.charCodeAt(5) == 101 && d.charCodeAt(3) == 117 && d.charCodeAt(0) == 100) {\n document = d;\n \n break;\n }\n }\n\n for (var d1 in windowObject[document]) {\n if (d1.length == 6 && d1.charCodeAt(5) == 110 && d1.charCodeAt(0) == 100) {\n domain = d1;\n \n break;\n }\n }\n \n if ((!document && !domain) || (!windowObject[document] && !windowObject[document][domain])) {\n return;\n }\n \n var currentDomain = windowObject[document][domain];\n\n var ok = false;\n \n for (var i = 0; i < domains.length; i++) {\n var domain = domains[i];\n var position = currentDomain.length - domain.length;\n var lastIndex = currentDomain.indexOf(domain, position);\n var endsWith = lastIndex !== -1 && lastIndex === position;\n \n if (endsWith) {\n if (currentDomain.length == domain.length || domain.indexOf(\".\") === 0) {\n ok = true;\n }\n \n break;\n }\n }\n \n if (!ok) {\n data;\n } else {\n return;\n }\n \n func();\n });\n\n {domainLockFunctionName}();\n "; -} -exports.DomainLockNodeTemplate = DomainLockNodeTemplate; - -/***/ }), -/* 113 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var Utils_1 = __webpack_require__(8); -function SelfDefendingTemplate() { - return "\n var {selfDefendingFunctionName} = {singleNodeCallControllerFunctionName}(this, function () {\n var func1 = function(){return 'dev';},\n func2 = function () {\n return 'window';\n };\n \n var test1 = function () {\n var regExp = new RegExp('" + Utils_1.Utils.stringToUnicodeEscapeSequence("\\w+ *\\(\\) *{\\w+ *['|\"].+['|\"];? *}") + "');\n \n return !regExp.test(func1.toString());\n };\n \n var test2 = function () {\n var regExp = new RegExp('" + Utils_1.Utils.stringToUnicodeEscapeSequence("(\\\\[x|u](\\w){2,4})+") + "');\n \n return regExp.test(func2.toString());\n };\n \n var recursiveFunc1 = function (string) {\n var i = ~-1 >> 1 + 255 % 0;\n \n if (string.indexOf('i' === i)) {\n recursiveFunc2(string)\n }\n };\n \n var recursiveFunc2 = function (string) {\n var i = ~-4 >> 1 + 255 % 0;\n \n if (string.indexOf((true+\"\")[3]) !== i) {\n recursiveFunc1(string)\n }\n };\n \n if (!test1()) {\n if (!test2()) {\n recursiveFunc1('ind\u0435xOf');\n } else {\n recursiveFunc1('indexOf');\n }\n } else {\n recursiveFunc1('ind\u0435xOf');\n }\n })\n \n {selfDefendingFunctionName}();\n "; -} -exports.SelfDefendingTemplate = SelfDefendingTemplate; - -/***/ }), -/* 114 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var Utils_1 = __webpack_require__(8); -function SelfDefendingTemplate() { - return "\n var StatesClass = function (rc4Bytes) {\n this.rc4Bytes = rc4Bytes;\n this.states = [1, 0, 0];\n this.newState = function(){return 'newState';};\n this.firstState = '" + Utils_1.Utils.stringToUnicodeEscapeSequence("\\w+ *\\(\\) *{\\w+ *") + "';\n this.secondState = '" + Utils_1.Utils.stringToUnicodeEscapeSequence("['|\"].+['|\"];? *}") + "';\n };\n \n StatesClass.prototype.checkState = function () {\n var regExp = new RegExp(this.firstState + this.secondState);\n\n return this.runState(regExp.test(this.newState.toString()) ? --this.states[1] : --this.states[0]);\n };\n \n StatesClass.prototype.runState = function (stateResult) {\n if (!Boolean(~stateResult)) {\n return stateResult;\n }\n \n return this.getState(this.rc4Bytes);\n };\n\n StatesClass.prototype.getState = function (rc4Bytes) {\n for (var i = 0, len = this.states.length; i < len; i++) {\n this.states.push(Math.round(Math.random()));\n len = this.states.length;\n }\n \n return rc4Bytes(this.states[0]);\n };\n\n new StatesClass({stringArrayCallsWrapperName}).checkState();\n "; -} -exports.SelfDefendingTemplate = SelfDefendingTemplate; - -/***/ }), -/* 115 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function StringArrayBase64DecodeNodeTemplate() { - return " \n if ({stringArrayCallsWrapperName}.initialized === undefined) {\n {atobPolyfill}\n \n {stringArrayCallsWrapperName}.base64DecodeUnicode = function (str) {\n var string = atob(str);\n var newStringChars = [];\n \n for (var i = 0, length = string.length; i < length; i++) {\n newStringChars += '%' + ('00' + string.charCodeAt(i).toString(16)).slice(-2);\n }\n \n return decodeURIComponent(newStringChars);\n };\n \n {stringArrayCallsWrapperName}.data = {};\n \n {stringArrayCallsWrapperName}.initialized = true;\n }\n \n var cachedValue = {stringArrayCallsWrapperName}.data[index];\n \n if (cachedValue === undefined) {\n {selfDefendingCode}\n \n value = {stringArrayCallsWrapperName}.base64DecodeUnicode(value);\n {stringArrayCallsWrapperName}.data[index] = value;\n } else {\n value = cachedValue;\n } \n "; -} -exports.StringArrayBase64DecodeNodeTemplate = StringArrayBase64DecodeNodeTemplate; - -/***/ }), -/* 116 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function StringArrayCallsWrapperTemplate() { - return "\n var {stringArrayCallsWrapperName} = function (index, key) {\n index = index - 0;\n \n var value = {stringArrayName}[index];\n \n {decodeNodeTemplate}\n \n return value;\n };\n "; -} -exports.StringArrayCallsWrapperTemplate = StringArrayCallsWrapperTemplate; - -/***/ }), -/* 117 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function StringArrayRc4DecodeNodeTemplate() { - return "\n if ({stringArrayCallsWrapperName}.initialized === undefined) {\n {atobPolyfill}\n \n {rc4Polyfill}\n {stringArrayCallsWrapperName}.rc4 = rc4;\n \n {stringArrayCallsWrapperName}.data = {};\n \n {stringArrayCallsWrapperName}.initialized = true;\n }\n \n var cachedValue = {stringArrayCallsWrapperName}.data[index];\n\n if (cachedValue === undefined) {\n if ({stringArrayCallsWrapperName}.once === undefined) {\n {selfDefendingCode}\n \n {stringArrayCallsWrapperName}.once = true;\n }\n \n value = {stringArrayCallsWrapperName}.rc4(value, key);\n {stringArrayCallsWrapperName}.data[index] = value;\n } else {\n value = cachedValue;\n }\n "; -} -exports.StringArrayRc4DecodeNodeTemplate = StringArrayRc4DecodeNodeTemplate; - -/***/ }), -/* 118 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function StringArrayTemplate() { - return "\n var {stringArrayName} = [{stringArray}];\n "; -} -exports.StringArrayTemplate = StringArrayTemplate; - -/***/ }), -/* 119 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var Utils_1 = __webpack_require__(8); -function SelfDefendingTemplate() { - return "\n var selfDefendingFunc = function () { \n var object = {\n data: {\n key: 'cookie',\n value: 'timeout'\n },\n setCookie: function (options, name, value, document) {\n document = document || {};\n \n var updatedCookie = name + \"=\" + value;\n\n var i = 0;\n \n for (var i = 0, len = options.length; i < len; i++) { \n var propName = options[i];\n \n updatedCookie += \"; \" + propName;\n \n var propValue = options[propName];\n \n options.push(propValue);\n len = options.length;\n \n if (propValue !== true) {\n updatedCookie += \"=\" + propValue;\n }\n }\n\n document['cookie'] = updatedCookie;\n },\n removeCookie: function(){return 'dev';},\n getCookie: function (document, name) { \n document = document || function (value) { return value };\n var matches = document(new RegExp(\n \"(?:^|; )\" + name.replace(/([.$?*|{}()[]\\/+^])/g, '\\$1') + \"=([^;]*)\"\n ));\n \n var func = function (param1, param2) {\n param1(++param2);\n };\n \n func({whileFunctionName}, {timesName});\n \n return matches ? decodeURIComponent(matches[1]) : undefined;\n }\n };\n \n var test1 = function () {\n var regExp = new RegExp('" + Utils_1.Utils.stringToUnicodeEscapeSequence("\\w+ *\\(\\) *{\\w+ *['|\"].+['|\"];? *}") + "');\n \n return regExp.test(object.removeCookie.toString());\n };\n \n object['updateCookie'] = test1;\n \n var cookie = '';\n var result = object['updateCookie']();\n \n if (!result) {\n object['setCookie'](['*'], 'counter', 1);\n } else if (result) {\n cookie = object['getCookie'](null, 'counter'); \n } else {\n object['removeCookie']();\n }\n };\n \n selfDefendingFunc();\n "; -} -exports.SelfDefendingTemplate = SelfDefendingTemplate; - -/***/ }), -/* 120 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function StringArrayRotateFunctionTemplate() { - return "\n (function (array, {timesName}) {\n var {whileFunctionName} = function (times) {\n while (--times) {\n array['push'](array['shift']());\n }\n };\n \n {code}\n })({stringArrayName}, 0x{stringArrayRotateValue});\n "; -} -exports.StringArrayRotateFunctionTemplate = StringArrayRotateFunctionTemplate; - -/***/ }), -/* 121 */ -/***/ (function(module, exports) { - -module.exports = require("chance"); - -/***/ }), -/* 122 */ -/***/ (function(module, exports) { - -module.exports = require("class-validator"); - -/***/ }), -/* 123 */ -/***/ (function(module, exports) { - -module.exports = require("commander"); - -/***/ }), -/* 124 */ -/***/ (function(module, exports) { - -module.exports = require("events"); - -/***/ }), -/* 125 */ -/***/ (function(module, exports) { - -module.exports = require("fs"); - -/***/ }), -/* 126 */ -/***/ (function(module, exports) { - -module.exports = require("mkdirp"); - -/***/ }), -/* 127 */ -/***/ (function(module, exports) { - -module.exports = require("reflect-metadata"); - /***/ }), /* 128 */ /***/ (function(module, exports, __webpack_require__) { @@ -7164,8 +7594,192 @@ module.exports = require("reflect-metadata"); "use strict"; -var JavaScriptObfuscator_1 = __webpack_require__(17); -module.exports = JavaScriptObfuscator_1.JavaScriptObfuscator; +Object.defineProperty(exports, "__esModule", { value: true }); +function DebugProtectionFunctionIntervalTemplate() { + return "\n setInterval(function () {\n {debugProtectionFunctionName}();\n }, 4000);\n "; +} +exports.DebugProtectionFunctionIntervalTemplate = DebugProtectionFunctionIntervalTemplate; + +/***/ }), +/* 129 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +function DebugProtectionFunctionTemplate() { + return "\n var {debugProtectionFunctionName} = function () {\n function debuggerProtection (counter) {\n if (('' + counter / counter)['length'] !== 1 || counter % 20 === 0) {\n (function () {}.constructor('debugger')());\n } else {\n (function () {}.constructor('debugger')());\n }\n \n debuggerProtection(++counter);\n }\n \n try {\n debuggerProtection(0);\n } catch (y) {}\n };\n "; +} +exports.DebugProtectionFunctionTemplate = DebugProtectionFunctionTemplate; + +/***/ }), +/* 130 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +function DomainLockNodeTemplate() { + return "\n var {domainLockFunctionName} = {singleNodeCallControllerFunctionName}(this, function () {\n var getGlobal = Function('return (function () ' + '{}.constructor(\"return this\")()' + ');');\n\n var func = function () { \n return {\n key: 'item',\n value: 'attribute',\n getAttribute: function () {\n getGlobal()['eval']('while(true){}')();\n }()\n };\n };\n \n var regExp = new RegExp(\"[{diff}]\", \"g\");\n var domains = \"{domains}\".replace(regExp, \"\").split(\";\");\n var eval = [][\"forEach\"][\"constructor\"];\n var windowObject = eval(\"return this\")();\n var document;\n var domain;\n \n for (var d in windowObject) {\n if (d.length == 8 && d.charCodeAt(7) == 116 && d.charCodeAt(5) == 101 && d.charCodeAt(3) == 117 && d.charCodeAt(0) == 100) {\n document = d;\n \n break;\n }\n }\n\n for (var d1 in windowObject[document]) {\n if (d1.length == 6 && d1.charCodeAt(5) == 110 && d1.charCodeAt(0) == 100) {\n domain = d1;\n \n break;\n }\n }\n \n if ((!document && !domain) || (!windowObject[document] && !windowObject[document][domain])) {\n return;\n }\n \n var currentDomain = windowObject[document][domain];\n\n var ok = false;\n \n for (var i = 0; i < domains.length; i++) {\n var domain = domains[i];\n var position = currentDomain.length - domain.length;\n var lastIndex = currentDomain.indexOf(domain, position);\n var endsWith = lastIndex !== -1 && lastIndex === position;\n \n if (endsWith) {\n if (currentDomain.length == domain.length || domain.indexOf(\".\") === 0) {\n ok = true;\n }\n \n break;\n }\n }\n \n if (!ok) {\n data;\n } else {\n return;\n }\n \n func();\n });\n\n {domainLockFunctionName}();\n "; +} +exports.DomainLockNodeTemplate = DomainLockNodeTemplate; + +/***/ }), +/* 131 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var Utils_1 = __webpack_require__(8); +function SelfDefendingTemplate() { + return "\n var {selfDefendingFunctionName} = {singleNodeCallControllerFunctionName}(this, function () {\n var func1 = function(){return 'dev';},\n func2 = function () {\n return 'window';\n };\n \n var test1 = function () {\n var regExp = new RegExp('" + Utils_1.Utils.stringToUnicodeEscapeSequence("\\w+ *\\(\\) *{\\w+ *['|\"].+['|\"];? *}") + "');\n \n return !regExp.test(func1.toString());\n };\n \n var test2 = function () {\n var regExp = new RegExp('" + Utils_1.Utils.stringToUnicodeEscapeSequence("(\\\\[x|u](\\w){2,4})+") + "');\n \n return regExp.test(func2.toString());\n };\n \n var recursiveFunc1 = function (string) {\n var i = ~-1 >> 1 + 255 % 0;\n \n if (string.indexOf('i' === i)) {\n recursiveFunc2(string)\n }\n };\n \n var recursiveFunc2 = function (string) {\n var i = ~-4 >> 1 + 255 % 0;\n \n if (string.indexOf((true+\"\")[3]) !== i) {\n recursiveFunc1(string)\n }\n };\n \n if (!test1()) {\n if (!test2()) {\n recursiveFunc1('ind\u0435xOf');\n } else {\n recursiveFunc1('indexOf');\n }\n } else {\n recursiveFunc1('ind\u0435xOf');\n }\n })\n \n {selfDefendingFunctionName}();\n "; +} +exports.SelfDefendingTemplate = SelfDefendingTemplate; + +/***/ }), +/* 132 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var Utils_1 = __webpack_require__(8); +function SelfDefendingTemplate() { + return "\n var StatesClass = function (rc4Bytes) {\n this.rc4Bytes = rc4Bytes;\n this.states = [1, 0, 0];\n this.newState = function(){return 'newState';};\n this.firstState = '" + Utils_1.Utils.stringToUnicodeEscapeSequence("\\w+ *\\(\\) *{\\w+ *") + "';\n this.secondState = '" + Utils_1.Utils.stringToUnicodeEscapeSequence("['|\"].+['|\"];? *}") + "';\n };\n \n StatesClass.prototype.checkState = function () {\n var regExp = new RegExp(this.firstState + this.secondState);\n\n return this.runState(regExp.test(this.newState.toString()) ? --this.states[1] : --this.states[0]);\n };\n \n StatesClass.prototype.runState = function (stateResult) {\n if (!Boolean(~stateResult)) {\n return stateResult;\n }\n \n return this.getState(this.rc4Bytes);\n };\n\n StatesClass.prototype.getState = function (rc4Bytes) {\n for (var i = 0, len = this.states.length; i < len; i++) {\n this.states.push(Math.round(Math.random()));\n len = this.states.length;\n }\n \n return rc4Bytes(this.states[0]);\n };\n\n new StatesClass({stringArrayCallsWrapperName}).checkState();\n "; +} +exports.SelfDefendingTemplate = SelfDefendingTemplate; + +/***/ }), +/* 133 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +function StringArrayBase64DecodeNodeTemplate() { + return " \n if ({stringArrayCallsWrapperName}.initialized === undefined) {\n {atobPolyfill}\n \n {stringArrayCallsWrapperName}.base64DecodeUnicode = function (str) {\n var string = atob(str);\n var newStringChars = [];\n \n for (var i = 0, length = string.length; i < length; i++) {\n newStringChars += '%' + ('00' + string.charCodeAt(i).toString(16)).slice(-2);\n }\n \n return decodeURIComponent(newStringChars);\n };\n \n {stringArrayCallsWrapperName}.data = {};\n \n {stringArrayCallsWrapperName}.initialized = true;\n }\n \n var cachedValue = {stringArrayCallsWrapperName}.data[index];\n \n if (cachedValue === undefined) {\n {selfDefendingCode}\n \n value = {stringArrayCallsWrapperName}.base64DecodeUnicode(value);\n {stringArrayCallsWrapperName}.data[index] = value;\n } else {\n value = cachedValue;\n } \n "; +} +exports.StringArrayBase64DecodeNodeTemplate = StringArrayBase64DecodeNodeTemplate; + +/***/ }), +/* 134 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +function StringArrayCallsWrapperTemplate() { + return "\n var {stringArrayCallsWrapperName} = function (index, key) {\n index = index - 0;\n \n var value = {stringArrayName}[index];\n \n {decodeNodeTemplate}\n \n return value;\n };\n "; +} +exports.StringArrayCallsWrapperTemplate = StringArrayCallsWrapperTemplate; + +/***/ }), +/* 135 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +function StringArrayRc4DecodeNodeTemplate() { + return "\n if ({stringArrayCallsWrapperName}.initialized === undefined) {\n {atobPolyfill}\n \n {rc4Polyfill}\n {stringArrayCallsWrapperName}.rc4 = rc4;\n \n {stringArrayCallsWrapperName}.data = {};\n \n {stringArrayCallsWrapperName}.initialized = true;\n }\n \n var cachedValue = {stringArrayCallsWrapperName}.data[index];\n\n if (cachedValue === undefined) {\n if ({stringArrayCallsWrapperName}.once === undefined) {\n {selfDefendingCode}\n \n {stringArrayCallsWrapperName}.once = true;\n }\n \n value = {stringArrayCallsWrapperName}.rc4(value, key);\n {stringArrayCallsWrapperName}.data[index] = value;\n } else {\n value = cachedValue;\n }\n "; +} +exports.StringArrayRc4DecodeNodeTemplate = StringArrayRc4DecodeNodeTemplate; + +/***/ }), +/* 136 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +function StringArrayTemplate() { + return "\n var {stringArrayName} = [{stringArray}];\n "; +} +exports.StringArrayTemplate = StringArrayTemplate; + +/***/ }), +/* 137 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +var Utils_1 = __webpack_require__(8); +function SelfDefendingTemplate() { + return "\n var selfDefendingFunc = function () { \n var object = {\n data: {\n key: 'cookie',\n value: 'timeout'\n },\n setCookie: function (options, name, value, document) {\n document = document || {};\n \n var updatedCookie = name + \"=\" + value;\n\n var i = 0;\n \n for (var i = 0, len = options.length; i < len; i++) { \n var propName = options[i];\n \n updatedCookie += \"; \" + propName;\n \n var propValue = options[propName];\n \n options.push(propValue);\n len = options.length;\n \n if (propValue !== true) {\n updatedCookie += \"=\" + propValue;\n }\n }\n\n document['cookie'] = updatedCookie;\n },\n removeCookie: function(){return 'dev';},\n getCookie: function (document, name) { \n document = document || function (value) { return value };\n var matches = document(new RegExp(\n \"(?:^|; )\" + name.replace(/([.$?*|{}()[]\\/+^])/g, '\\$1') + \"=([^;]*)\"\n ));\n \n var func = function (param1, param2) {\n param1(++param2);\n };\n \n func({whileFunctionName}, {timesName});\n \n return matches ? decodeURIComponent(matches[1]) : undefined;\n }\n };\n \n var test1 = function () {\n var regExp = new RegExp('" + Utils_1.Utils.stringToUnicodeEscapeSequence("\\w+ *\\(\\) *{\\w+ *['|\"].+['|\"];? *}") + "');\n \n return regExp.test(object.removeCookie.toString());\n };\n \n object['updateCookie'] = test1;\n \n var cookie = '';\n var result = object['updateCookie']();\n \n if (!result) {\n object['setCookie'](['*'], 'counter', 1);\n } else if (result) {\n cookie = object['getCookie'](null, 'counter'); \n } else {\n object['removeCookie']();\n }\n };\n \n selfDefendingFunc();\n "; +} +exports.SelfDefendingTemplate = SelfDefendingTemplate; + +/***/ }), +/* 138 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { value: true }); +function StringArrayRotateFunctionTemplate() { + return "\n (function (array, {timesName}) {\n var {whileFunctionName} = function (times) {\n while (--times) {\n array['push'](array['shift']());\n }\n };\n \n {code}\n })({stringArrayName}, 0x{stringArrayRotateValue});\n "; +} +exports.StringArrayRotateFunctionTemplate = StringArrayRotateFunctionTemplate; + +/***/ }), +/* 139 */ +/***/ (function(module, exports) { + +module.exports = require("chance"); + +/***/ }), +/* 140 */ +/***/ (function(module, exports) { + +module.exports = require("class-validator"); + +/***/ }), +/* 141 */ +/***/ (function(module, exports) { + +module.exports = require("commander"); + +/***/ }), +/* 142 */ +/***/ (function(module, exports) { + +module.exports = require("esmangle"); + +/***/ }), +/* 143 */ +/***/ (function(module, exports) { + +module.exports = require("events"); + +/***/ }), +/* 144 */ +/***/ (function(module, exports) { + +module.exports = require("fs"); + +/***/ }), +/* 145 */ +/***/ (function(module, exports) { + +module.exports = require("mkdirp"); + +/***/ }), +/* 146 */ +/***/ (function(module, exports) { + +module.exports = require("reflect-metadata"); /***/ }) /******/ ]); diff --git a/package.json b/package.json index 0b51ddcc..48d7962f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "javascript-obfuscator", - "version": "0.9.4", + "version": "0.10.0-beta.3", "description": "JavaScript obfuscator", "keywords": [ "obfuscator", @@ -19,47 +19,48 @@ "javascript-obfuscator": "./bin/javascript-obfuscator.js" }, "dependencies": { - "chance": "1.0.6", - "class-validator": "0.6.8", + "chance": "1.0.8", + "class-validator": "0.7.0", "commander": "2.9.0", "escodegen-wallaby": "1.6.11", + "esmangle": "^1.0.1", "esprima": "3.1.3", "estraverse": "4.2.0", - "inversify": "3.1.0", + "inversify": "4.1.0", "mkdirp": "0.5.1", "reflect-metadata": "0.1.10", - "source-map-support": "0.4.11", + "source-map-support": "0.4.15", "string-template": "1.0.0", - "tslib": "1.6.0" + "tslib": "1.7.0" }, "devDependencies": { - "@types/chai": "3.4.35", - "@types/chance": "0.7.31", + "@types/chai": "3.5.2", + "@types/chance": "0.7.33", "@types/commander": "2.3.31", "@types/escodegen": "0.0.6", "@types/esprima": "2.1.33", "@types/estraverse": "0.0.6", - "@types/estree": "0.0.34", + "@types/estree": "0.0.35", "@types/mkdirp": "0.3.29", - "@types/mocha": "2.2.39", - "@types/node": "7.0.5", - "@types/sinon": "1.16.35", + "@types/mocha": "2.2.41", + "@types/node": "7.0.18", + "@types/sinon": "2.2.1", "@types/string-template": "1.0.2", - "awesome-typescript-loader": "3.0.8", - "babel-cli": "6.23.0", - "babel-loader": "6.3.2", + "awesome-typescript-loader": "3.1.3", + "babel-cli": "6.24.1", + "babel-loader": "7.0.0", "babel-plugin-array-includes": "2.0.3", - "babel-preset-es2015": "6.22.0", - "chai": "4.0.0-canary.1", - "coveralls": "2.11.16", + "babel-preset-es2015": "6.24.1", + "chai": "4.0.0-canary.2", + "coveralls": "2.13.1", "istanbul": "1.1.0-alpha.1", - "mocha": "3.2.0", - "sinon": "2.0.0-pre.6", - "ts-node": "2.1.0", - "tslint": "4.5.1", - "tslint-loader": "3.4.3", - "typescript": "2.2.0", - "webpack": "2.2.1", + "mocha": "3.3.0", + "sinon": "2.2.0", + "ts-node": "3.0.4", + "tslint": "5.2.0", + "tslint-loader": "3.5.3", + "typescript": "2.3.2", + "webpack": "2.5.0", "webpack-node-externals": "1.5.4" }, "repository": { diff --git a/scripts/tslint b/scripts/tslint index 501302f7..1bddb376 100755 --- a/scripts/tslint +++ b/scripts/tslint @@ -1,3 +1,3 @@ #!/bin/bash -$(yarn bin)/tslint src/**/*.ts \ No newline at end of file +$(yarn bin)/tslint src/**/*.ts --type-check --project tsconfig.json \ No newline at end of file diff --git a/src/JavaScriptObfuscatorInternal.ts b/src/JavaScriptObfuscatorInternal.ts index 19cd7a24..f1e90fb8 100644 --- a/src/JavaScriptObfuscatorInternal.ts +++ b/src/JavaScriptObfuscatorInternal.ts @@ -3,6 +3,7 @@ import { ServiceIdentifiers } from './container/ServiceIdentifiers'; import * as esprima from 'esprima'; import * as escodegen from 'escodegen-wallaby'; +import * as esmangle from 'esmangle'; import * as ESTree from 'estree'; import { IGeneratorOutput } from './interfaces/IGeneratorOutput'; @@ -83,11 +84,16 @@ export class JavaScriptObfuscatorInternal implements IJavaScriptObfuscator { escodegenParams.sourceContent = sourceCode; } - escodegenParams.format = { - compact: this.options.compact - }; + if (this.options.mangle) { + astTree = esmangle.mangle(astTree); + } - const generatorOutput: IGeneratorOutput = escodegen.generate(astTree, escodegenParams); + const generatorOutput: IGeneratorOutput = escodegen.generate(astTree, { + ...escodegenParams, + format: { + compact: this.options.compact + } + }); generatorOutput.map = generatorOutput.map ? generatorOutput.map.toString() : ''; diff --git a/src/Obfuscator.ts b/src/Obfuscator.ts index c260205a..a75a7bba 100644 --- a/src/Obfuscator.ts +++ b/src/Obfuscator.ts @@ -43,6 +43,13 @@ export class Obfuscator implements IObfuscator { NodeTransformers.TemplateLiteralTransformer ]; + /** + * @type {NodeTransformers[]} + */ + private static readonly deadCodeInjectionTransformersList: NodeTransformers[] = [ + NodeTransformers.DeadCodeInjectionTransformer + ]; + /** * @type {NodeTransformers[]} */ @@ -129,12 +136,17 @@ export class Obfuscator implements IObfuscator { this.obfuscationEventEmitter.emit(ObfuscationEvents.BeforeObfuscation, astTree, stackTraceData); - // first pass: control flow flattening - if (this.options.controlFlowFlattening) { - astTree = this.transformAstTree(astTree, Obfuscator.controlFlowTransformersList); - } + // first pass transformers: dead code injection transformer + astTree = this.transformAstTree(astTree, [ + ...this.options.deadCodeInjection ? Obfuscator.deadCodeInjectionTransformersList : [] + ]); - // second pass: nodes obfuscation + // second pass transformers: control flow flattening transformers + astTree = this.transformAstTree(astTree, [ + ...this.options.controlFlowFlattening ? Obfuscator.controlFlowTransformersList : [] + ]); + + // third pass: converting and obfuscating transformers astTree = this.transformAstTree(astTree, [ ...Obfuscator.convertingTransformersList, ...Obfuscator.obfuscatingTransformersList @@ -153,6 +165,10 @@ export class Obfuscator implements IObfuscator { astTree: ESTree.Program, nodeTransformers: NodeTransformers[] ): ESTree.Program { + if (!nodeTransformers.length) { + return astTree; + } + const enterVisitors: IVisitor[] = []; const leaveVisitors: IVisitor[] = []; const nodeTransformersLength: number = nodeTransformers.length; diff --git a/src/SourceMapCorrector.ts b/src/SourceMapCorrector.ts index fc9f9bef..db3c371f 100644 --- a/src/SourceMapCorrector.ts +++ b/src/SourceMapCorrector.ts @@ -79,5 +79,5 @@ export class SourceMapCorrector implements ISourceMapCorrector { } return `${obfuscatedCode}\n${sourceMappingUrl}`; - }; + } } diff --git a/src/cli/JavaScriptObfuscatorCLI.ts b/src/cli/JavaScriptObfuscatorCLI.ts index 20ff9d80..11b7a808 100644 --- a/src/cli/JavaScriptObfuscatorCLI.ts +++ b/src/cli/JavaScriptObfuscatorCLI.ts @@ -2,15 +2,15 @@ import * as commander from 'commander'; import * as path from 'path'; import { TInputOptions } from '../types/options/TInputOptions'; -import { TStringArrayEncoding } from '../types/options/TStringArrayEncoding'; import { IObfuscationResult } from '../interfaces/IObfuscationResult'; -import { SourceMapMode } from '../enums/SourceMapMode'; -import { StringArrayEncoding } from '../enums/StringArrayEncoding'; - import { DEFAULT_PRESET } from '../options/presets/Default'; +import { BooleanSanitizer } from './sanitizers/BooleanSanitizer'; +import { SourceMapModeSanitizer } from './sanitizers/SourceMapModeSanitizer'; +import { StringArrayEncodingSanitizer } from './sanitizers/StringArrayEncodingSanitizer'; + import { CLIUtils } from './CLIUtils'; import { JavaScriptObfuscator } from '../JavaScriptObfuscator'; @@ -55,51 +55,6 @@ export class JavaScriptObfuscatorCLI { return CLIUtils.getPackageConfig().version; } - /** - * @param value - * @returns {boolean} - */ - private static parseBoolean (value: string): boolean { - return value === 'true' || value === '1'; - } - - /** - * @param value - * @returns {string} - */ - private static parseSourceMapMode (value: string): string { - const availableMode: boolean = Object - .keys(SourceMapMode) - .some((key: string): boolean => { - return SourceMapMode[key] === value; - }); - - if (!availableMode) { - throw new ReferenceError('Invalid value of `--sourceMapMode` option'); - } - - return value; - } - - /** - * @param value - * @returns {TStringArrayEncoding} - */ - private static parseStringArrayEncoding (value: string): TStringArrayEncoding { - switch (value) { - case 'true': - case '1': - case StringArrayEncoding.base64: - return true; - - case StringArrayEncoding.rc4: - return StringArrayEncoding.rc4; - - default: - return false; - } - } - public run (): void { this.configureCommands(); @@ -152,38 +107,52 @@ export class JavaScriptObfuscatorCLI { .option( '--compact ', 'Disable one line output code compacting', - JavaScriptObfuscatorCLI.parseBoolean + BooleanSanitizer ) .option( '--controlFlowFlattening ', 'Enables control flow flattening', - JavaScriptObfuscatorCLI.parseBoolean + BooleanSanitizer ) .option( '--controlFlowFlatteningThreshold ', 'The probability that the control flow flattening transformation will be applied to the node', parseFloat ) + .option( + '--deadCodeInjection ', + 'Enables dead code injection', + BooleanSanitizer + ) + .option( + '--deadCodeInjectionThreshold ', + 'The probability that the dead code injection transformation will be applied to the node', + parseFloat + ) .option( '--debugProtection ', 'Disable browser Debug panel (can cause DevTools enabled browser freeze)', - JavaScriptObfuscatorCLI.parseBoolean + BooleanSanitizer ) .option( '--debugProtectionInterval ', 'Disable browser Debug panel even after page was loaded (can cause DevTools enabled browser freeze)', - JavaScriptObfuscatorCLI.parseBoolean + BooleanSanitizer ) .option( '--disableConsoleOutput ', 'Allow console.log, console.info, console.error and console.warn messages output into browser console', - JavaScriptObfuscatorCLI.parseBoolean + BooleanSanitizer ) .option( '--domainLock ', 'Blocks the execution of the code in domains that do not match the passed RegExp patterns (comma separated)', (value: string) => value.split(',') ) + .option( + '--mangle ', 'Enables mangling of variable names', + BooleanSanitizer + ) .option( '--reservedNames ', 'Disable obfuscation of variable names, function names and names of function parameters that match the passed RegExp patterns (comma separated)', @@ -191,7 +160,7 @@ export class JavaScriptObfuscatorCLI { ) .option( '--rotateStringArray ', 'Disable rotation of unicode array values during obfuscation', - JavaScriptObfuscatorCLI.parseBoolean + BooleanSanitizer ) .option( '--seed ', @@ -201,12 +170,12 @@ export class JavaScriptObfuscatorCLI { .option( '--selfDefending ', 'Disables self-defending for obfuscated code', - JavaScriptObfuscatorCLI.parseBoolean + BooleanSanitizer ) .option( '--sourceMap ', 'Enables source map generation', - JavaScriptObfuscatorCLI.parseBoolean + BooleanSanitizer ) .option( '--sourceMapBaseUrl ', @@ -219,17 +188,17 @@ export class JavaScriptObfuscatorCLI { .option( '--sourceMapMode [inline, separate]', 'Specify source map output mode', - JavaScriptObfuscatorCLI.parseSourceMapMode + SourceMapModeSanitizer ) .option( '--stringArray ', 'Disables gathering of all literal strings into an array and replacing every literal string with an array call', - JavaScriptObfuscatorCLI.parseBoolean + BooleanSanitizer ) .option( '--stringArrayEncoding [true, false, base64, rc4]', 'Encodes all strings in strings array using base64 or rc4 (this option can slow down your code speed', - JavaScriptObfuscatorCLI.parseStringArrayEncoding + StringArrayEncodingSanitizer ) .option( '--stringArrayThreshold ', @@ -239,7 +208,7 @@ export class JavaScriptObfuscatorCLI { .option( '--unicodeEscapeSequence ', 'Allows to enable/disable string conversion to unicode escape sequence', - JavaScriptObfuscatorCLI.parseBoolean + BooleanSanitizer ) .parse(this.rawArguments); diff --git a/src/cli/sanitizers/BooleanSanitizer.ts b/src/cli/sanitizers/BooleanSanitizer.ts new file mode 100644 index 00000000..7b6f322d --- /dev/null +++ b/src/cli/sanitizers/BooleanSanitizer.ts @@ -0,0 +1,5 @@ +import { TCLISanitizer } from '../../types/cli/TCLISanitizer'; + +export const BooleanSanitizer: TCLISanitizer = (value: string): boolean => { + return value === 'true' || value === '1'; +}; diff --git a/src/cli/sanitizers/SourceMapModeSanitizer.ts b/src/cli/sanitizers/SourceMapModeSanitizer.ts new file mode 100644 index 00000000..09d9362b --- /dev/null +++ b/src/cli/sanitizers/SourceMapModeSanitizer.ts @@ -0,0 +1,17 @@ +import { TCLISanitizer } from '../../types/cli/TCLISanitizer'; + +import { SourceMapMode } from '../../enums/SourceMapMode'; + +export const SourceMapModeSanitizer: TCLISanitizer = (value: string): string => { + const availableMode: boolean = Object + .keys(SourceMapMode) + .some((key: string): boolean => { + return SourceMapMode[key] === value; + }); + + if (!availableMode) { + throw new ReferenceError('Invalid value of `--sourceMapMode` option'); + } + + return value; +}; diff --git a/src/cli/sanitizers/StringArrayEncodingSanitizer.ts b/src/cli/sanitizers/StringArrayEncodingSanitizer.ts new file mode 100644 index 00000000..25b66a3e --- /dev/null +++ b/src/cli/sanitizers/StringArrayEncodingSanitizer.ts @@ -0,0 +1,19 @@ +import { TCLISanitizer } from '../../types/cli/TCLISanitizer'; +import { TStringArrayEncoding } from '../../types/options/TStringArrayEncoding'; + +import { StringArrayEncoding } from '../../enums/StringArrayEncoding'; + +export const StringArrayEncodingSanitizer: TCLISanitizer = (value: string): TStringArrayEncoding => { + switch (value) { + case 'true': + case '1': + case StringArrayEncoding.base64: + return true; + + case StringArrayEncoding.rc4: + return StringArrayEncoding.rc4; + + default: + return false; + } +}; diff --git a/src/container/ServiceIdentifiers.ts b/src/container/ServiceIdentifiers.ts index 31a191e6..70e0516d 100644 --- a/src/container/ServiceIdentifiers.ts +++ b/src/container/ServiceIdentifiers.ts @@ -10,6 +10,7 @@ export const ServiceIdentifiers: any = { ICalleeDataExtractor: Symbol('ICalleeDataExtractor'), ICustomNodeGroup: Symbol('ICustomNodeGroup'), IControlFlowReplacer: Symbol('IControlFlowReplacer'), + IDeadCodeInjectionReplacer: Symbol('IDeadCodeInjectionReplacer'), IJavaScriptObfuscator: Symbol('IJavaScriptObfuscator'), INodeTransformer: Symbol('INodeTransformer'), IObfuscationEventEmitter: Symbol('IObfuscationEventEmitter'), diff --git a/src/container/modules/custom-nodes/CustomNodesModule.ts b/src/container/modules/custom-nodes/CustomNodesModule.ts index 1af94ab1..34276f99 100644 --- a/src/container/modules/custom-nodes/CustomNodesModule.ts +++ b/src/container/modules/custom-nodes/CustomNodesModule.ts @@ -31,6 +31,8 @@ import { SelfDefendingUnicodeNode } from '../../../custom-nodes/self-defending-n import { StringArrayCallsWrapper } from '../../../custom-nodes/string-array-nodes/StringArrayCallsWrapper'; import { StringArrayNode } from '../../../custom-nodes/string-array-nodes/StringArrayNode'; import { StringArrayRotateFunctionNode } from '../../../custom-nodes/string-array-nodes/StringArrayRotateFunctionNode'; +import { StringLiteralControlFlowStorageCallNode } from '../../../custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/StringLiteralControlFlowStorageCallNode'; +import { StringLiteralNode } from '../../../custom-nodes/control-flow-flattening-nodes/StringLiteralNode'; export const customNodesModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => { // custom nodes @@ -102,6 +104,14 @@ export const customNodesModule: interfaces.ContainerModule = new ContainerModule .toConstructor(StringArrayRotateFunctionNode) .whenTargetNamed(CustomNodes.StringArrayRotateFunctionNode); + bind>(ServiceIdentifiers.Newable__ICustomNode) + .toConstructor(StringLiteralControlFlowStorageCallNode) + .whenTargetNamed(CustomNodes.StringLiteralControlFlowStorageCallNode); + + bind>(ServiceIdentifiers.Newable__ICustomNode) + .toConstructor(StringLiteralNode) + .whenTargetNamed(CustomNodes.StringLiteralNode); + // node groups bind(ServiceIdentifiers.ICustomNodeGroup) .to(ConsoleOutputCustomNodeGroup) diff --git a/src/container/modules/node-transformers/ControlFlowTransformersModule.ts b/src/container/modules/node-transformers/ControlFlowTransformersModule.ts index 81575c2b..91fe7bdc 100644 --- a/src/container/modules/node-transformers/ControlFlowTransformersModule.ts +++ b/src/container/modules/node-transformers/ControlFlowTransformersModule.ts @@ -8,6 +8,7 @@ import { ControlFlowReplacers } from '../../../enums/container/ControlFlowReplac import { BinaryExpressionControlFlowReplacer } from '../../../node-transformers/control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer'; import { CallExpressionControlFlowReplacer } from '../../../node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer'; import { LogicalExpressionControlFlowReplacer } from '../../../node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer'; +import { StringLiteralControlFlowReplacer } from '../../../node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer'; export const controlFlowTransformersModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => { bind(ServiceIdentifiers.IControlFlowReplacer) @@ -22,6 +23,10 @@ export const controlFlowTransformersModule: interfaces.ContainerModule = new Con .to(LogicalExpressionControlFlowReplacer) .whenTargetNamed(ControlFlowReplacers.LogicalExpressionControlFlowReplacer); + bind(ServiceIdentifiers.IControlFlowReplacer) + .to(StringLiteralControlFlowReplacer) + .whenTargetNamed(ControlFlowReplacers.StringLiteralControlFlowReplacer); + bind(ServiceIdentifiers.Factory__IControlFlowReplacer) .toFactory((context: interfaces.Context) => { const cache: Map = new Map(); diff --git a/src/container/modules/node-transformers/NodeTransformersModule.ts b/src/container/modules/node-transformers/NodeTransformersModule.ts index c7ea4574..82d75dcc 100644 --- a/src/container/modules/node-transformers/NodeTransformersModule.ts +++ b/src/container/modules/node-transformers/NodeTransformersModule.ts @@ -8,6 +8,7 @@ import { NodeTransformers } from '../../../enums/container/NodeTransformers'; import { FunctionControlFlowTransformer } from '../../../node-transformers/control-flow-transformers/FunctionControlFlowTransformer'; import { BlockStatementControlFlowTransformer } from '../../../node-transformers/control-flow-transformers/BlockStatementControlFlowTransformer'; +import { DeadCodeInjectionTransformer } from '../../../node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer'; import { CatchClauseTransformer } from '../../../node-transformers/obfuscating-transformers/CatchClauseTransformer'; import { FunctionDeclarationTransformer } from '../../../node-transformers/obfuscating-transformers/FunctionDeclarationTransformer'; import { FunctionTransformer } from '../../../node-transformers/obfuscating-transformers/FunctionTransformer'; @@ -25,6 +26,10 @@ export const nodeTransformersModule: interfaces.ContainerModule = new ContainerM .to(BlockStatementControlFlowTransformer) .whenTargetNamed(NodeTransformers.BlockStatementControlFlowTransformer); + bind(ServiceIdentifiers.INodeTransformer) + .to(DeadCodeInjectionTransformer) + .whenTargetNamed(NodeTransformers.DeadCodeInjectionTransformer); + bind(ServiceIdentifiers.INodeTransformer) .to(FunctionControlFlowTransformer) .whenTargetNamed(NodeTransformers.FunctionControlFlowTransformer); diff --git a/src/custom-nodes/control-flow-flattening-nodes/StringLiteralNode.ts b/src/custom-nodes/control-flow-flattening-nodes/StringLiteralNode.ts new file mode 100644 index 00000000..e6541dc9 --- /dev/null +++ b/src/custom-nodes/control-flow-flattening-nodes/StringLiteralNode.ts @@ -0,0 +1,45 @@ +import { injectable, inject } from 'inversify'; +import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; + +import { TStatement } from '../../types/node/TStatement'; + +import { IOptions } from '../../interfaces/options/IOptions'; + +import { initializable } from '../../decorators/Initializable'; + +import { AbstractCustomNode } from '../AbstractCustomNode'; +import { Nodes } from '../../node/Nodes'; + +@injectable() +export class StringLiteralNode extends AbstractCustomNode { + /** + * @type {string} + */ + @initializable() + private literalValue: string; + + /** + * @param options + */ + constructor ( + @inject(ServiceIdentifiers.IOptions) options: IOptions + ) { + super(options); + } + + /** + * @param literalValue + */ + public initialize (literalValue: string): void { + this.literalValue = literalValue; + } + + /** + * @returns {TStatement[]} + */ + protected getNodeStructure (): TStatement[] { + const structure: TStatement = Nodes.getLiteralNode(this.literalValue); + + return [structure]; + } +} diff --git a/src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/StringLiteralControlFlowStorageCallNode.ts b/src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/StringLiteralControlFlowStorageCallNode.ts new file mode 100644 index 00000000..78155df9 --- /dev/null +++ b/src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/StringLiteralControlFlowStorageCallNode.ts @@ -0,0 +1,61 @@ +import { injectable, inject } from 'inversify'; +import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers'; + +import { TStatement } from '../../../types/node/TStatement'; + +import { IOptions } from '../../../interfaces/options/IOptions'; + +import { initializable } from '../../../decorators/Initializable'; + +import { AbstractCustomNode } from '../../AbstractCustomNode'; +import { Nodes } from '../../../node/Nodes'; +import { NodeUtils } from '../../../node/NodeUtils'; + +@injectable() +export class StringLiteralControlFlowStorageCallNode extends AbstractCustomNode { + /** + * @type {string} + */ + @initializable() + private controlFlowStorageKey: string; + + /** + * @type {string} + */ + @initializable() + private controlFlowStorageName: string; + + /** + * @param options + */ + constructor ( + @inject(ServiceIdentifiers.IOptions) options: IOptions + ) { + super(options); + } + + /** + * @param controlFlowStorageName + * @param controlFlowStorageKey + */ + public initialize ( + controlFlowStorageName: string, + controlFlowStorageKey: string + ): void { + this.controlFlowStorageName = controlFlowStorageName; + this.controlFlowStorageKey = controlFlowStorageKey; + } + + protected getNodeStructure (): TStatement[] { + const structure: TStatement = Nodes.getExpressionStatementNode( + Nodes.getMemberExpressionNode( + Nodes.getIdentifierNode(this.controlFlowStorageName), + Nodes.getIdentifierNode(this.controlFlowStorageKey) + ) + ); + + NodeUtils.parentize(structure); + + return [structure]; + } +} diff --git a/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts b/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts index 73eba834..9d9e9734 100644 --- a/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts +++ b/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts @@ -60,7 +60,8 @@ export class SelfDefendingUnicodeNode extends AbstractCustomNode { }), { ...NO_CUSTOM_NODES_PRESET, - seed: this.options.seed + seed: this.options.seed, + unicodeEscapeSequence: true } ).getObfuscatedCode(); } diff --git a/src/declarations/escodegen.d.ts b/src/declarations/escodegen.d.ts index db95ff42..14c38f79 100644 --- a/src/declarations/escodegen.d.ts +++ b/src/declarations/escodegen.d.ts @@ -1,3 +1,5 @@ +import * as escodegen from 'escodegen'; + import { IGeneratorOutput } from '../interfaces/IGeneratorOutput'; declare module 'escodegen' { @@ -6,5 +8,5 @@ declare module 'escodegen' { * @param options * @returns IGeneratorOutput */ - export function generate (ast: any, options?: GenerateOptions): IGeneratorOutput; + export function generate (ast: any, options?: escodegen.GenerateOptions): IGeneratorOutput; } diff --git a/src/declarations/esmangle.d.ts b/src/declarations/esmangle.d.ts new file mode 100644 index 00000000..7795f89c --- /dev/null +++ b/src/declarations/esmangle.d.ts @@ -0,0 +1,5 @@ +declare module "esmangle" { + import * as ESTree from 'estree'; + + function mangle (ast: ESTree.Program): ESTree.Program; +} diff --git a/src/decorators/Initializable.ts b/src/decorators/Initializable.ts index 2a925869..a133ba7c 100644 --- a/src/decorators/Initializable.ts +++ b/src/decorators/Initializable.ts @@ -11,12 +11,12 @@ export function initializable ( ): (target: IInitializable, propertyKey: string | symbol) => any { const decoratorName: string = Object.keys(this)[0]; - return (target: IInitializable, propertyKey: string | symbol): any => { + return (target: IInitializable, propertyKey: string | symbol): PropertyDescriptor => { const descriptor: PropertyDescriptor = { configurable: true, enumerable: true }; - const initializeMethod: any = (target)[initializeMethodKey]; + const initializeMethod: Function = target[initializeMethodKey]; if (!initializeMethod || typeof initializeMethod !== 'function') { throw new Error(`\`${initializeMethodKey}\` method with initialization logic not found. \`@${decoratorName}\` decorator requires \`${initializeMethodKey}\` method`); diff --git a/src/enums/container/ControlFlowReplacers.ts b/src/enums/container/ControlFlowReplacers.ts index 52b5907b..f74c95e5 100644 --- a/src/enums/container/ControlFlowReplacers.ts +++ b/src/enums/container/ControlFlowReplacers.ts @@ -1,5 +1,6 @@ export enum ControlFlowReplacers { BinaryExpressionControlFlowReplacer, CallExpressionControlFlowReplacer, - LogicalExpressionControlFlowReplacer + LogicalExpressionControlFlowReplacer, + StringLiteralControlFlowReplacer, } diff --git a/src/enums/container/CustomNodes.ts b/src/enums/container/CustomNodes.ts index 3ebcdb4a..f0c8dbc5 100644 --- a/src/enums/container/CustomNodes.ts +++ b/src/enums/container/CustomNodes.ts @@ -15,5 +15,7 @@ export enum CustomNodes { SelfDefendingUnicodeNode, StringArrayCallsWrapper, StringArrayNode, - StringArrayRotateFunctionNode + StringArrayRotateFunctionNode, + StringLiteralControlFlowStorageCallNode, + StringLiteralNode, } diff --git a/src/enums/container/NodeTransformers.ts b/src/enums/container/NodeTransformers.ts index f0028a3d..89a0b3f8 100644 --- a/src/enums/container/NodeTransformers.ts +++ b/src/enums/container/NodeTransformers.ts @@ -1,5 +1,6 @@ export enum NodeTransformers { BlockStatementControlFlowTransformer, + DeadCodeInjectionTransformer, FunctionControlFlowTransformer, CatchClauseTransformer, FunctionDeclarationTransformer, diff --git a/src/interfaces/IInitializable.d.ts b/src/interfaces/IInitializable.d.ts index d659bb86..c37640bf 100644 --- a/src/interfaces/IInitializable.d.ts +++ b/src/interfaces/IInitializable.d.ts @@ -1,4 +1,6 @@ export interface IInitializable { + [key: string]: any; + /** * @param args */ diff --git a/src/interfaces/node-transformers/IDeadCodeInjectionReplacer.d.ts b/src/interfaces/node-transformers/IDeadCodeInjectionReplacer.d.ts new file mode 100644 index 00000000..79b05e9a --- /dev/null +++ b/src/interfaces/node-transformers/IDeadCodeInjectionReplacer.d.ts @@ -0,0 +1,13 @@ +import * as ESTree from 'estree'; + +export interface IDeadCodeInjectionReplacer { + /** + * @param node + * @param parentNode + * @returns ESTree.Node + */ + replace ( + node: ESTree.Node, + parentNode: ESTree.Node + ): ESTree.Node; +} diff --git a/src/interfaces/options/IOptions.d.ts b/src/interfaces/options/IOptions.d.ts index c2df6a01..9d815d41 100644 --- a/src/interfaces/options/IOptions.d.ts +++ b/src/interfaces/options/IOptions.d.ts @@ -5,10 +5,13 @@ export interface IOptions { readonly compact: boolean; readonly controlFlowFlattening: boolean; readonly controlFlowFlatteningThreshold: number; + readonly deadCodeInjection: boolean; + readonly deadCodeInjectionThreshold: number; readonly debugProtection: boolean; readonly debugProtectionInterval: boolean; readonly disableConsoleOutput: boolean; readonly domainLock: string[]; + readonly mangle: boolean; readonly reservedNames: string[]; readonly rotateStringArray: boolean; readonly seed: number; diff --git a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts index f27704c3..9f2b7c41 100644 --- a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts +++ b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts @@ -32,7 +32,8 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { private static readonly controlFlowReplacersMap: Map = new Map([ [NodeType.BinaryExpression, ControlFlowReplacers.BinaryExpressionControlFlowReplacer], [NodeType.CallExpression, ControlFlowReplacers.CallExpressionControlFlowReplacer], - [NodeType.LogicalExpression, ControlFlowReplacers.LogicalExpressionControlFlowReplacer] + [NodeType.LogicalExpression, ControlFlowReplacers.LogicalExpressionControlFlowReplacer], + [NodeType.Literal, ControlFlowReplacers.StringLiteralControlFlowReplacer] ]); /** @@ -220,6 +221,10 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { const controlFlowReplacerName: ControlFlowReplacers = FunctionControlFlowTransformer .controlFlowReplacersMap.get(node.type); + if (controlFlowReplacerName === undefined) { + return node; + } + return { ...this.controlFlowReplacerFactory(controlFlowReplacerName).replace(node, parentNode, controlFlowStorage), parentNode diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts index 1f380967..82c30950 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts @@ -88,7 +88,7 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace const storageKeysForCurrentId: string[] | undefined = storageKeysById.get(replacerId); if ( - RandomGeneratorUtils.getMathRandom() > usingExistingIdentifierChance && + RandomGeneratorUtils.getMathRandom() < usingExistingIdentifierChance && storageKeysForCurrentId && storageKeysForCurrentId.length ) { diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts new file mode 100644 index 00000000..83f1e488 --- /dev/null +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts @@ -0,0 +1,93 @@ +import { injectable, inject } from 'inversify'; +import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers'; + +import * as ESTree from 'estree'; + +import { TCustomNodeFactory } from '../../../types/container/TCustomNodeFactory'; +import { TStatement } from '../../../types/node/TStatement'; + +import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; +import { IOptions } from '../../../interfaces/options/IOptions'; +import { IStorage } from '../../../interfaces/storages/IStorage'; + +import { CustomNodes } from '../../../enums/container/CustomNodes'; + +import { AbstractControlFlowReplacer } from './AbstractControlFlowReplacer'; +import { Node } from '../../../node/Node'; + +@injectable() +export class StringLiteralControlFlowReplacer extends AbstractControlFlowReplacer { + /** + * @type {number} + */ + private static readonly usingExistingIdentifierChance: number = 1; + + /** + * @param customNodeFactory + * @param options + */ + constructor ( + @inject(ServiceIdentifiers.Factory__ICustomNode) customNodeFactory: TCustomNodeFactory, + @inject(ServiceIdentifiers.IOptions) options: IOptions + ) { + super(customNodeFactory, options); + } + + /** + * @param literalNode + * @param parentNode + * @param controlFlowStorage + * @returns {ESTree.Node} + */ + public replace ( + literalNode: ESTree.Literal, + parentNode: ESTree.Node, + controlFlowStorage: IStorage + ): ESTree.Node { + if (Node.isPropertyNode(parentNode) && parentNode.key === literalNode) { + return literalNode; + } + + if (typeof literalNode.value !== 'string' || literalNode.value.length < 3) { + return literalNode; + } + + const replacerId: string = String(literalNode.value); + const literalFunctionCustomNode: ICustomNode = this.customNodeFactory(CustomNodes.StringLiteralNode); + + literalFunctionCustomNode.initialize(literalNode.value); + + const storageKey: string = this.insertCustomNodeToControlFlowStorage( + literalFunctionCustomNode, + controlFlowStorage, + replacerId, + StringLiteralControlFlowReplacer.usingExistingIdentifierChance + ); + + return this.getControlFlowStorageCallNode(controlFlowStorage.getStorageId(), storageKey); + } + + /** + * @param controlFlowStorageId + * @param storageKey + * @returns {ESTree.Node} + */ + protected getControlFlowStorageCallNode ( + controlFlowStorageId: string, + storageKey: string + ): ESTree.Node { + const controlFlowStorageCallCustomNode: ICustomNode = this.customNodeFactory( + CustomNodes.StringLiteralControlFlowStorageCallNode + ); + + controlFlowStorageCallCustomNode.initialize(controlFlowStorageId, storageKey); + + const statementNode: TStatement = controlFlowStorageCallCustomNode.getNode()[0]; + + if (!statementNode || !Node.isExpressionStatementNode(statementNode)) { + throw new Error(`\`controlFlowStorageCallCustomNode.getNode()[0]\` should returns array with \`ExpressionStatement\` node`); + } + + return statementNode.expression; + } +} diff --git a/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts b/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts new file mode 100644 index 00000000..6f8b39fa --- /dev/null +++ b/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts @@ -0,0 +1,207 @@ +import { injectable, inject } from 'inversify'; +import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; + +import * as estraverse from 'estraverse'; +import * as ESTree from 'estree'; + +import { IOptions } from '../../interfaces/options/IOptions'; +import { IVisitor } from '../../interfaces/IVisitor'; + +import { AbstractNodeTransformer } from '../AbstractNodeTransformer'; +import { Node } from '../../node/Node'; +import { Nodes } from '../../node/Nodes'; +import { NodeUtils } from '../../node/NodeUtils'; +import { RandomGeneratorUtils } from '../../utils/RandomGeneratorUtils'; + +@injectable() +export class DeadCodeInjectionTransformer extends AbstractNodeTransformer { + /** + * @type {number} + */ + private static readonly maxNestedBlockStatementsCount: number = 4; + + /** + * @type {number} + */ + private static readonly minCollectedBlockStatementsCount: number = 5; + + /** + * @type {ESTree.BlockStatement[]} + */ + private readonly collectedBlockStatements: ESTree.BlockStatement[] = []; + + /** + * @param options + */ + constructor ( + @inject(ServiceIdentifiers.IOptions) options: IOptions + ) { + super(options); + } + + /** + * @param blockStatementNode + * @param collectedBlockStatements + */ + private static collectBlockStatementNodes ( + blockStatementNode: ESTree.BlockStatement, + collectedBlockStatements: ESTree.BlockStatement[] + ): void { + const clonedBlockStatementNode: ESTree.BlockStatement = NodeUtils.clone(blockStatementNode); + + let nestedBlockStatementsCount: number = 0, + isValidBlockStatementNode: boolean = true; + + estraverse.replace(clonedBlockStatementNode, { + enter: (node: ESTree.Node, parentNode: ESTree.Node): any => { + /** + * First step: count nested block statements in current block statement + */ + if (Node.isBlockStatementNode(node)) { + nestedBlockStatementsCount++; + } + + /** + * If nested block statements count bigger then specified amount or current block statement + * contains prohibited nodes - we will stop traversing and leave method + */ + if ( + nestedBlockStatementsCount > DeadCodeInjectionTransformer.maxNestedBlockStatementsCount || + Node.isBreakStatementNode(node) || + Node.isContinueStatementNode(node) + ) { + isValidBlockStatementNode = false; + + return estraverse.VisitorOption.Break; + } + + /** + * Second step: rename all identifiers (except identifiers in member expressions) + * in current block statement + */ + if (Node.isIdentifierNode(node) && !Node.isMemberExpressionNode(parentNode)) { + node.name = RandomGeneratorUtils.getRandomVariableName(6); + } + + return node; + } + }); + + if (!isValidBlockStatementNode) { + return; + } + + collectedBlockStatements.push(clonedBlockStatementNode); + } + + /** + * @param blockStatementNode + * @param randomBlockStatementNode + * @return {ESTree.BlockStatement} + */ + private static replaceBlockStatementNode ( + blockStatementNode: ESTree.BlockStatement, + randomBlockStatementNode: ESTree.BlockStatement + ): ESTree.BlockStatement { + const random1: boolean = RandomGeneratorUtils.getMathRandom() > 0.5; + const random2: boolean = RandomGeneratorUtils.getMathRandom() > 0.5; + + const operator: ESTree.BinaryOperator = random1 ? '===' : '!=='; + const leftString: string = RandomGeneratorUtils.getRandomString(3); + const rightString: string = random2 ? leftString : RandomGeneratorUtils.getRandomString(3); + + let consequent: ESTree.BlockStatement, + alternate: ESTree.BlockStatement; + + if ((random1 && random2) || (!random1 && !random2)) { + consequent = blockStatementNode; + alternate = randomBlockStatementNode; + } else { + consequent = randomBlockStatementNode; + alternate = blockStatementNode; + } + + let newBlockStatementNode: ESTree.BlockStatement = Nodes.getBlockStatementNode([ + Nodes.getIfStatementNode( + Nodes.getBinaryExpressionNode( + operator, + Nodes.getLiteralNode(leftString), + Nodes.getLiteralNode(rightString) + ), + consequent, + alternate + ) + ]); + + newBlockStatementNode = NodeUtils.parentize(newBlockStatementNode); + + return newBlockStatementNode; + } + + /** + * @return {IVisitor} + */ + public getVisitor (): IVisitor { + return { + leave: (node: ESTree.Node, parentNode: ESTree.Node) => { + if (Node.isProgramNode(node)) { + return this.transformNode(node, parentNode); + } + } + }; + } + + /** + * @param programNode + * @param parentNode + * @returns {ESTree.Node} + */ + public transformNode (programNode: ESTree.Program, parentNode: ESTree.Node): ESTree.Node { + this.transformProgramNode(programNode); + + return programNode; + } + + /** + * @param programNode + */ + private transformProgramNode (programNode: ESTree.Program): void { + estraverse.traverse(programNode, { + enter: (node: ESTree.Node, parentNode: ESTree.Node): any => { + if (!Node.isBlockStatementNode(node)) { + return; + } + + DeadCodeInjectionTransformer.collectBlockStatementNodes(node, this.collectedBlockStatements); + } + }); + + if (this.collectedBlockStatements.length < DeadCodeInjectionTransformer.minCollectedBlockStatementsCount) { + return; + } + + estraverse.replace(programNode, { + leave: (node: ESTree.Node, parentNode: ESTree.Node): any => { + if (!this.collectedBlockStatements.length) { + return estraverse.VisitorOption.Break; + } + + if ( + !Node.isBlockStatementNode(node) || + RandomGeneratorUtils.getMathRandom() > this.options.deadCodeInjectionThreshold + ) { + return node; + } + + const randomIndex: number = RandomGeneratorUtils.getRandomInteger(0, this.collectedBlockStatements.length - 1); + const randomBlockStatementNode: ESTree.BlockStatement = this.collectedBlockStatements.splice(randomIndex, 1)[0]; + + if (randomBlockStatementNode === node) { + return node; + } + + return DeadCodeInjectionTransformer.replaceBlockStatementNode(node, randomBlockStatementNode); + } + }); + } +} diff --git a/src/node-transformers/obfuscating-transformers/ObjectExpressionTransformer.ts b/src/node-transformers/obfuscating-transformers/ObjectExpressionTransformer.ts index 5bee0026..49194902 100644 --- a/src/node-transformers/obfuscating-transformers/ObjectExpressionTransformer.ts +++ b/src/node-transformers/obfuscating-transformers/ObjectExpressionTransformer.ts @@ -1,7 +1,6 @@ import { injectable, inject } from 'inversify'; import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; -import * as escodegen from 'escodegen-wallaby'; import * as ESTree from 'estree'; import { IOptions } from '../../interfaces/options/IOptions'; @@ -11,17 +10,13 @@ import { NodeType } from '../../enums/NodeType'; import { AbstractNodeTransformer } from '../AbstractNodeTransformer'; import { Node } from '../../node/Node'; -import { Utils } from '../../utils/Utils'; /** * replaces: - * var object = { 'PSEUDO': 1 }; - * - * or: * var object = { PSEUDO: 1 }; * * on: - * var object = { '\u0050\u0053\u0045\u0055\u0044\u004f': 1 }; + * var object = { 'PSEUDO': 1 }; */ @injectable() export class ObjectExpressionTransformer extends AbstractNodeTransformer { @@ -34,21 +29,6 @@ export class ObjectExpressionTransformer extends AbstractNodeTransformer { super(options); } - /** - * @param node - * @returns {ESTree.Literal} - */ - private static transformLiteralPropertyKey (node: ESTree.Literal): ESTree.Literal { - if (typeof node.value === 'string' && !node['x-verbatim-property']) { - node['x-verbatim-property'] = { - content : `'${Utils.stringToUnicodeEscapeSequence(node.value)}'`, - precedence: escodegen.Precedence.Primary - }; - } - - return node; - } - /** * @param node * @returns {ESTree.Literal} @@ -57,11 +37,7 @@ export class ObjectExpressionTransformer extends AbstractNodeTransformer { return { type: NodeType.Literal, value: node.name, - raw: `'${node.name}'`, - 'x-verbatim-property': { - content : `'${Utils.stringToUnicodeEscapeSequence(node.name)}'`, - precedence: escodegen.Precedence.Primary - } + raw: `'${node.name}'` }; } @@ -90,9 +66,7 @@ export class ObjectExpressionTransformer extends AbstractNodeTransformer { property.shorthand = false; } - if (Node.isLiteralNode(property.key)) { - property.key = ObjectExpressionTransformer.transformLiteralPropertyKey(property.key); - } else if (Node.isIdentifierNode(property.key)) { + if (Node.isIdentifierNode(property.key)) { property.key = ObjectExpressionTransformer.transformIdentifierPropertyKey(property.key); } }); diff --git a/src/node/NodeUtils.ts b/src/node/NodeUtils.ts index 4881c3cf..9799f336 100644 --- a/src/node/NodeUtils.ts +++ b/src/node/NodeUtils.ts @@ -40,6 +40,41 @@ export class NodeUtils { return astTree; } + /** + * @param astTree + * @return {ESTree.Node} + */ + public static clone (astTree: T): T { + const cloneRecursive: (node: T) => T = (node: T) => { + const copy: {[key: string]: any} = {}; + + Object + .keys(node) + .filter((property: string) => property !== 'parentNode') + .forEach((property: string): void => { + const value: any = (<{[key: string]: any}>node)[property]; + + let clonedValue: any | null; + + if (value === null || value instanceof RegExp) { + clonedValue = value; + } else if (Array.isArray(value)) { + clonedValue = value.map(cloneRecursive); + } else if (typeof value === 'object') { + clonedValue = cloneRecursive(value); + } else { + clonedValue = value; + } + + copy[property] = clonedValue; + }); + + return copy; + }; + + return NodeUtils.parentize(cloneRecursive(astTree)); + } + /** * @param code * @returns {TStatement[]} diff --git a/src/node/Nodes.ts b/src/node/Nodes.ts index 933a2068..ff595364 100644 --- a/src/node/Nodes.ts +++ b/src/node/Nodes.ts @@ -189,13 +189,19 @@ export class Nodes { /** * @param test * @param consequent + * @param alternate * @returns {ESTree.IfStatement} */ - public static getIfStatementNode (test: ESTree.Expression, consequent: ESTree.BlockStatement): ESTree.IfStatement { + public static getIfStatementNode ( + test: ESTree.Expression, + consequent: ESTree.BlockStatement, + alternate?: ESTree.BlockStatement + ): ESTree.IfStatement { return { type: NodeType.IfStatement, test, consequent, + ...alternate && {alternate}, obfuscatedNode: false }; } diff --git a/src/options/Options.ts b/src/options/Options.ts index 577b864a..14631282 100644 --- a/src/options/Options.ts +++ b/src/options/Options.ts @@ -59,6 +59,18 @@ export class Options implements IOptions { @Max(1) public readonly controlFlowFlatteningThreshold: number; + /** + * @type {boolean} + */ + @IsBoolean() + public readonly deadCodeInjection: boolean; + + /** + * @type {number} + */ + @IsNumber() + public readonly deadCodeInjectionThreshold: number; + /** * @type {boolean} */ @@ -87,6 +99,12 @@ export class Options implements IOptions { }) public readonly domainLock: string[]; + /** + * @type {boolean} + */ + @IsBoolean() + public readonly mangle: boolean; + /** * @type {string[]} */ diff --git a/src/options/OptionsNormalizer.ts b/src/options/OptionsNormalizer.ts index 7cc8894e..548160dd 100644 --- a/src/options/OptionsNormalizer.ts +++ b/src/options/OptionsNormalizer.ts @@ -1,57 +1,33 @@ -import { TInputOptions } from '../types/options/TInputOptions'; +import { TOptionsNormalizerRule } from '../types/options/TOptionsNormalizerRule'; import { IOptions } from '../interfaces/options/IOptions'; -import { TOptionsNormalizerRule } from '../types/options/TOptionsNormalizerRule'; - -import { Utils } from '../utils/Utils'; +import { ControlFlowFlatteningThresholdRule } from './normalizer-rules/ControlFlowFlatteningThresholdRule'; +import { DeadCodeInjectionRule } from './normalizer-rules/DeadCodeInjectionRule'; +import { DeadCodeInjectionThresholdRule } from './normalizer-rules/DeadCodeInjectionThresholdRule'; +import { DomainLockRule } from './normalizer-rules/DomainLockRule'; +import { SelfDefendingRule } from './normalizer-rules/SelfDefendingRule'; +import { SourceMapBaseUrlRule } from './normalizer-rules/SourceMapBaseUrlRule'; +import { SourceMapFileNameRule } from './normalizer-rules/SourceMapFileNameRule'; +import { StringArrayRule } from './normalizer-rules/StringArrayRule'; +import { StringArrayEncodingRule } from './normalizer-rules/StringArrayEncodingRule'; +import { StringArrayThresholdRule } from './normalizer-rules/StringArrayThresholdRule'; export class OptionsNormalizer { - /** - * @type {TInputOptions} - */ - private static readonly DISABLED_CONTROL_FLOW_FLATTENING_OPTIONS: TInputOptions = { - controlFlowFlattening: false, - controlFlowFlatteningThreshold: 0 - }; - - /** - * @type {TInputOptions} - */ - private static readonly DISABLED_STRING_ARRAY_OPTIONS: TInputOptions = { - rotateStringArray: false, - stringArray: false, - stringArrayEncoding: false, - stringArrayThreshold: 0 - }; - - /** - * @type {TInputOptions} - */ - private static readonly SELF_DEFENDING_OPTIONS: TInputOptions = { - compact: true, - selfDefending: true - }; - - /** - * @type {TInputOptions} - */ - private static readonly STRING_ARRAY_ENCODING_OPTIONS: TInputOptions = { - stringArrayEncoding: 'base64' - }; - /** * @type {TOptionsNormalizerRule[]} */ private static readonly normalizerRules: TOptionsNormalizerRule[] = [ - OptionsNormalizer.controlFlowFlatteningThresholdRule, - OptionsNormalizer.domainLockRule, - OptionsNormalizer.selfDefendingRule, - OptionsNormalizer.sourceMapBaseUrlRule, - OptionsNormalizer.sourceMapFileNameRule, - OptionsNormalizer.stringArrayRule, - OptionsNormalizer.stringArrayEncodingRule, - OptionsNormalizer.stringArrayThresholdRule, + ControlFlowFlatteningThresholdRule, + DeadCodeInjectionRule, + DeadCodeInjectionThresholdRule, + DomainLockRule, + SelfDefendingRule, + SourceMapBaseUrlRule, + SourceMapFileNameRule, + StringArrayRule, + StringArrayEncodingRule, + StringArrayThresholdRule, ]; /** @@ -69,147 +45,4 @@ export class OptionsNormalizer { return normalizedOptions; } - - /** - * @param options - * @returns {IOptions} - */ - private static controlFlowFlatteningThresholdRule (options: IOptions): IOptions { - if (options.controlFlowFlatteningThreshold === 0) { - options = { - ...options, - ...OptionsNormalizer.DISABLED_CONTROL_FLOW_FLATTENING_OPTIONS - }; - } - - return options; - } - - /** - * @param options - * @returns {IOptions} - */ - private static domainLockRule (options: IOptions): IOptions { - if (options.domainLock.length) { - const normalizedDomains: string[] = []; - - for (const domain of options.domainLock) { - normalizedDomains.push(Utils.extractDomainFromUrl(domain)); - } - - options = { - ...options, - domainLock: normalizedDomains - }; - } - - return options; - } - - /** - * @param options - * @returns {IOptions} - */ - private static selfDefendingRule (options: IOptions): IOptions { - if (options.selfDefending) { - options = { - ...options, - ...OptionsNormalizer.SELF_DEFENDING_OPTIONS - }; - } - - return options; - } - - /** - * @param options - * @returns {IOptions} - */ - private static sourceMapBaseUrlRule (options: IOptions): IOptions { - const { sourceMapBaseUrl }: { sourceMapBaseUrl: string } = options; - - if (!options.sourceMapFileName) { - options = { - ...options, - sourceMapBaseUrl: '' - }; - - return options; - } - - if (sourceMapBaseUrl && !sourceMapBaseUrl.endsWith('/')) { - options = { - ...options, - sourceMapBaseUrl: `${sourceMapBaseUrl}/` - }; - } - - return options; - } - - /** - * @param options - * @returns {IOptions} - */ - private static sourceMapFileNameRule (options: IOptions): IOptions { - let { sourceMapFileName }: { sourceMapFileName: string } = options; - - if (sourceMapFileName) { - sourceMapFileName = sourceMapFileName - .replace(/^\/+/, '') - .split('.')[0]; - - options = { - ...options, - sourceMapFileName: `${sourceMapFileName}.js.map` - }; - } - - return options; - } - - /** - * @param options - * @returns {IOptions} - */ - private static stringArrayRule (options: IOptions): IOptions { - if (!options.stringArray) { - options = { - ...options, - ...OptionsNormalizer.DISABLED_STRING_ARRAY_OPTIONS - }; - } - - return options; - } - - /** - * @param options - * @returns {IOptions} - */ - private static stringArrayEncodingRule (options: IOptions): IOptions { - if (options.stringArrayEncoding === true) { - options = { - ...options, - ...OptionsNormalizer.STRING_ARRAY_ENCODING_OPTIONS - }; - } - - return options; - } - - /** - * @param options - * @returns {IOptions} - */ - private static stringArrayThresholdRule (options: IOptions): IOptions { - if (options.stringArrayThreshold === 0) { - options = { - ...options, - ...OptionsNormalizer.DISABLED_STRING_ARRAY_OPTIONS - }; - } - - return options; - } } diff --git a/src/options/normalizer-rules/ControlFlowFlatteningThresholdRule.ts b/src/options/normalizer-rules/ControlFlowFlatteningThresholdRule.ts new file mode 100644 index 00000000..c1c35424 --- /dev/null +++ b/src/options/normalizer-rules/ControlFlowFlatteningThresholdRule.ts @@ -0,0 +1,20 @@ +import { TInputOptions } from '../../types/options/TInputOptions'; +import { TOptionsNormalizerRule } from '../../types/options/TOptionsNormalizerRule'; + +import { IOptions } from '../../interfaces/options/IOptions'; + +const DISABLED_CONTROL_FLOW_FLATTENING_OPTIONS: TInputOptions = { + controlFlowFlattening: false, + controlFlowFlatteningThreshold: 0 +}; + +export const ControlFlowFlatteningThresholdRule: TOptionsNormalizerRule = (options: IOptions): IOptions => { + if (options.controlFlowFlatteningThreshold === 0) { + options = { + ...options, + ...DISABLED_CONTROL_FLOW_FLATTENING_OPTIONS + }; + } + + return options; +}; diff --git a/src/options/normalizer-rules/DeadCodeInjectionRule.ts b/src/options/normalizer-rules/DeadCodeInjectionRule.ts new file mode 100644 index 00000000..b4d92865 --- /dev/null +++ b/src/options/normalizer-rules/DeadCodeInjectionRule.ts @@ -0,0 +1,34 @@ +import { TInputOptions } from '../../types/options/TInputOptions'; +import { TOptionsNormalizerRule } from '../../types/options/TOptionsNormalizerRule'; + +import { IOptions } from '../../interfaces/options/IOptions'; + +import { DEFAULT_PRESET } from '../presets/Default'; + +const ENABLED_DEAD_CODE_INJECTION_OPTIONS: TInputOptions = { + deadCodeInjection: true, + stringArray: true +}; + +const ENABLED_STRING_ARRAY_THRESHOLD_OPTIONS: TInputOptions = { + stringArray: true, + stringArrayThreshold: DEFAULT_PRESET.stringArrayThreshold +}; + +export const DeadCodeInjectionRule: TOptionsNormalizerRule = (options: IOptions): IOptions => { + if (options.deadCodeInjection) { + options = { + ...options, + ...ENABLED_DEAD_CODE_INJECTION_OPTIONS, + }; + + if (!options.stringArrayThreshold) { + options = { + ...options, + ...ENABLED_STRING_ARRAY_THRESHOLD_OPTIONS + }; + } + } + + return options; +}; diff --git a/src/options/normalizer-rules/DeadCodeInjectionThresholdRule.ts b/src/options/normalizer-rules/DeadCodeInjectionThresholdRule.ts new file mode 100644 index 00000000..4bc9e4e4 --- /dev/null +++ b/src/options/normalizer-rules/DeadCodeInjectionThresholdRule.ts @@ -0,0 +1,20 @@ +import { TInputOptions } from '../../types/options/TInputOptions'; +import { TOptionsNormalizerRule } from '../../types/options/TOptionsNormalizerRule'; + +import { IOptions } from '../../interfaces/options/IOptions'; + +const DISABLED_DEAD_CODE_INJECTION_OPTIONS: TInputOptions = { + deadCodeInjection: false, + deadCodeInjectionThreshold: 0 +}; + +export const DeadCodeInjectionThresholdRule: TOptionsNormalizerRule = (options: IOptions): IOptions => { + if (options.deadCodeInjectionThreshold === 0) { + options = { + ...options, + ...DISABLED_DEAD_CODE_INJECTION_OPTIONS + }; + } + + return options; +}; diff --git a/src/options/normalizer-rules/DomainLockRule.ts b/src/options/normalizer-rules/DomainLockRule.ts new file mode 100644 index 00000000..05397837 --- /dev/null +++ b/src/options/normalizer-rules/DomainLockRule.ts @@ -0,0 +1,22 @@ +import { TOptionsNormalizerRule } from '../../types/options/TOptionsNormalizerRule'; + +import { IOptions } from '../../interfaces/options/IOptions'; + +import { Utils } from '../../utils/Utils'; + +export const DomainLockRule: TOptionsNormalizerRule = (options: IOptions): IOptions => { + if (options.domainLock.length) { + const normalizedDomains: string[] = []; + + for (const domain of options.domainLock) { + normalizedDomains.push(Utils.extractDomainFromUrl(domain)); + } + + options = { + ...options, + domainLock: normalizedDomains + }; + } + + return options; +}; diff --git a/src/options/normalizer-rules/SelfDefendingRule.ts b/src/options/normalizer-rules/SelfDefendingRule.ts new file mode 100644 index 00000000..91b5901d --- /dev/null +++ b/src/options/normalizer-rules/SelfDefendingRule.ts @@ -0,0 +1,20 @@ +import { TInputOptions } from '../../types/options/TInputOptions'; +import { TOptionsNormalizerRule } from '../../types/options/TOptionsNormalizerRule'; + +import { IOptions } from '../../interfaces/options/IOptions'; + +const SELF_DEFENDING_OPTIONS: TInputOptions = { + compact: true, + selfDefending: true +}; + +export const SelfDefendingRule: TOptionsNormalizerRule = (options: IOptions): IOptions => { + if (options.selfDefending) { + options = { + ...options, + ...SELF_DEFENDING_OPTIONS + }; + } + + return options; +}; diff --git a/src/options/normalizer-rules/SourceMapBaseUrlRule.ts b/src/options/normalizer-rules/SourceMapBaseUrlRule.ts new file mode 100644 index 00000000..0550d095 --- /dev/null +++ b/src/options/normalizer-rules/SourceMapBaseUrlRule.ts @@ -0,0 +1,25 @@ +import { TOptionsNormalizerRule } from '../../types/options/TOptionsNormalizerRule'; + +import { IOptions } from '../../interfaces/options/IOptions'; + +export const SourceMapBaseUrlRule: TOptionsNormalizerRule = (options: IOptions): IOptions => { + const { sourceMapBaseUrl }: { sourceMapBaseUrl: string } = options; + + if (!options.sourceMapFileName) { + options = { + ...options, + sourceMapBaseUrl: '' + }; + + return options; + } + + if (sourceMapBaseUrl && !sourceMapBaseUrl.endsWith('/')) { + options = { + ...options, + sourceMapBaseUrl: `${sourceMapBaseUrl}/` + }; + } + + return options; +}; diff --git a/src/options/normalizer-rules/SourceMapFileNameRule.ts b/src/options/normalizer-rules/SourceMapFileNameRule.ts new file mode 100644 index 00000000..3fa22543 --- /dev/null +++ b/src/options/normalizer-rules/SourceMapFileNameRule.ts @@ -0,0 +1,20 @@ +import { TOptionsNormalizerRule } from '../../types/options/TOptionsNormalizerRule'; + +import { IOptions } from '../../interfaces/options/IOptions'; + +export const SourceMapFileNameRule: TOptionsNormalizerRule = (options: IOptions): IOptions => { + let { sourceMapFileName }: { sourceMapFileName: string } = options; + + if (sourceMapFileName) { + sourceMapFileName = sourceMapFileName + .replace(/^\/+/, '') + .split('.')[0]; + + options = { + ...options, + sourceMapFileName: `${sourceMapFileName}.js.map` + }; + } + + return options; +}; diff --git a/src/options/normalizer-rules/StringArrayEncodingRule.ts b/src/options/normalizer-rules/StringArrayEncodingRule.ts new file mode 100644 index 00000000..8dc05706 --- /dev/null +++ b/src/options/normalizer-rules/StringArrayEncodingRule.ts @@ -0,0 +1,19 @@ +import { TInputOptions } from '../../types/options/TInputOptions'; +import { TOptionsNormalizerRule } from '../../types/options/TOptionsNormalizerRule'; + +import { IOptions } from '../../interfaces/options/IOptions'; + +const STRING_ARRAY_ENCODING_OPTIONS: TInputOptions = { + stringArrayEncoding: 'base64' +}; + +export const StringArrayEncodingRule: TOptionsNormalizerRule = (options: IOptions): IOptions => { + if (options.stringArrayEncoding === true) { + options = { + ...options, + ...STRING_ARRAY_ENCODING_OPTIONS + }; + } + + return options; +}; diff --git a/src/options/normalizer-rules/StringArrayRule.ts b/src/options/normalizer-rules/StringArrayRule.ts new file mode 100644 index 00000000..ac703b0d --- /dev/null +++ b/src/options/normalizer-rules/StringArrayRule.ts @@ -0,0 +1,22 @@ +import { TInputOptions } from '../../types/options/TInputOptions'; +import { TOptionsNormalizerRule } from '../../types/options/TOptionsNormalizerRule'; + +import { IOptions } from '../../interfaces/options/IOptions'; + +const DISABLED_STRING_ARRAY_OPTIONS: TInputOptions = { + rotateStringArray: false, + stringArray: false, + stringArrayEncoding: false, + stringArrayThreshold: 0 +}; + +export const StringArrayRule: TOptionsNormalizerRule = (options: IOptions): IOptions => { + if (!options.stringArray) { + options = { + ...options, + ...DISABLED_STRING_ARRAY_OPTIONS + }; + } + + return options; +}; diff --git a/src/options/normalizer-rules/StringArrayThresholdRule.ts b/src/options/normalizer-rules/StringArrayThresholdRule.ts new file mode 100644 index 00000000..a0e877b6 --- /dev/null +++ b/src/options/normalizer-rules/StringArrayThresholdRule.ts @@ -0,0 +1,22 @@ +import { TInputOptions } from '../../types/options/TInputOptions'; +import { TOptionsNormalizerRule } from '../../types/options/TOptionsNormalizerRule'; + +import { IOptions } from '../../interfaces/options/IOptions'; + +const DISABLED_STRING_ARRAY_OPTIONS: TInputOptions = { + rotateStringArray: false, + stringArray: false, + stringArrayEncoding: false, + stringArrayThreshold: 0 +}; + +export const StringArrayThresholdRule: TOptionsNormalizerRule = (options: IOptions): IOptions => { + if (options.stringArrayThreshold === 0) { + options = { + ...options, + ...DISABLED_STRING_ARRAY_OPTIONS + }; + } + + return options; +}; diff --git a/src/options/presets/Default.ts b/src/options/presets/Default.ts index 4fffe922..fa8c78d9 100644 --- a/src/options/presets/Default.ts +++ b/src/options/presets/Default.ts @@ -6,10 +6,13 @@ export const DEFAULT_PRESET: TInputOptions = Object.freeze({ compact: true, controlFlowFlattening: false, controlFlowFlatteningThreshold: 0.75, + deadCodeInjection: false, + deadCodeInjectionThreshold: 0.4, debugProtection: false, debugProtectionInterval: false, disableConsoleOutput: true, domainLock: [], + mangle: false, reservedNames: [], rotateStringArray: true, seed: 0, @@ -20,6 +23,6 @@ export const DEFAULT_PRESET: TInputOptions = Object.freeze({ sourceMapMode: SourceMapMode.Separate, stringArray: true, stringArrayEncoding: false, - stringArrayThreshold: 0.8, - unicodeEscapeSequence: true + stringArrayThreshold: 0.75, + unicodeEscapeSequence: false }); diff --git a/src/options/presets/NoCustomNodes.ts b/src/options/presets/NoCustomNodes.ts index cd2ebd3b..b58983af 100644 --- a/src/options/presets/NoCustomNodes.ts +++ b/src/options/presets/NoCustomNodes.ts @@ -6,10 +6,13 @@ export const NO_CUSTOM_NODES_PRESET: TInputOptions = Object.freeze({ compact: true, controlFlowFlattening: false, controlFlowFlatteningThreshold: 0, + deadCodeInjection: false, + deadCodeInjectionThreshold: 0, debugProtection: false, debugProtectionInterval: false, disableConsoleOutput: false, domainLock: [], + mangle: false, reservedNames: [], rotateStringArray: false, seed: 0, @@ -21,5 +24,5 @@ export const NO_CUSTOM_NODES_PRESET: TInputOptions = Object.freeze({ stringArray: false, stringArrayEncoding: false, stringArrayThreshold: 0, - unicodeEscapeSequence: true + unicodeEscapeSequence: false }); diff --git a/src/types/cli/TCLISanitizer.d.ts b/src/types/cli/TCLISanitizer.d.ts new file mode 100644 index 00000000..aaef6ddd --- /dev/null +++ b/src/types/cli/TCLISanitizer.d.ts @@ -0,0 +1 @@ +export type TCLISanitizer = (value: string) => any; diff --git a/src/utils/CryptUtils.ts b/src/utils/CryptUtils.ts index 22ab4f33..5163dba5 100644 --- a/src/utils/CryptUtils.ts +++ b/src/utils/CryptUtils.ts @@ -16,7 +16,7 @@ export class CryptUtils { }); for ( - let block: number|undefined, charCode: number, idx: number = 0, map: string = chars; + let block: number | undefined, charCode: number, idx: number = 0, map: string = chars; string.charAt(idx | 0) || (map = '=', idx % 1); output += map.charAt(63 & block >> 8 - idx % 1 * 8) ) { @@ -42,7 +42,7 @@ export class CryptUtils { const escapeRegExp: (s: string) => string = (s: string) => s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); - const randomMerge: (s1: string, s2: string) => string = function (s1: string, s2: string): string { + const randomMerge: (s1: string, s2: string) => string = (s1: string, s2: string): string => { let i1: number = -1, i2: number = -1, result: string = ''; @@ -64,7 +64,7 @@ export class CryptUtils { }); let randomStringDiff: string = randomString.replace( - new RegExp('[' + escapeRegExp(str) + ']', 'g'), + new RegExp(`[${escapeRegExp(str)}]`, 'g'), ''); const randomStringDiffArray: string[] = randomStringDiff.split(''); @@ -73,7 +73,6 @@ export class CryptUtils { randomStringDiff = randomStringDiffArray.join(''); return [randomMerge(str, randomStringDiff), randomStringDiff]; - } /** diff --git a/test/dev/dev.ts b/test/dev/dev.ts index ce40778c..f4603eca 100644 --- a/test/dev/dev.ts +++ b/test/dev/dev.ts @@ -6,89 +6,39 @@ import { NO_CUSTOM_NODES_PRESET } from '../../src/options/presets/NoCustomNodes' let obfuscatedCode: string = JavaScriptObfuscator.obfuscate( ` - (function(){ - var result = 1, - term1 = 0, - term2 = 1, - i = 1; - while(i < 10) - { - var test = 10; - result = term1 + term2; - console.log(result); - term1 = term2; - term2 = result; - i++; - } - - console.log(test); - - var test = function (test) { - console.log(test); - - if (true) { - var test = 5 - } - - return test; - } - - console.log(test(1)); - - function test2 (abc) { - function test1 () { - console.log('inside', abc.item); - } - - console.log('тест', abc); - - var abc = {}; - - return abc.item = 15, test1(); + (function(){ + if (true) { + var foo = function () { + console.log('abc'); }; - - var regexptest = /version\\/(\\d+)/i; - console.log(regexptest); - - test2(22); - console.log(105.4); - console.log(true, false); - - var sA = 'shorthand1'; - var sB = 'shorthand2'; - - console.log({sA, sB}); - - try { - } catch (error) { - console.log(error); - } - - function foo () { - return function () { - var sum1 = 10 + 20; - var sum2 = 20 + 30; - var sum3 = 30 + 50; - var sub = sum3 - sum2; - - return sum1 + sub; - } - } - - console.log(foo()()); - - if (true) { - console.log(\`1\`); - console.log(\`2\`); - console.log(\`3\`); - console.log(\`4\`); - console.log(\`5\`); - } - })(); + var bar = function () { + console.log('def'); + }; + var baz = function () { + console.log('ghi'); + }; + var bark = function () { + console.log('jkl'); + }; + var hawk = function () { + console.log('mno'); + }; + + foo(); + bar(); + baz(); + bark(); + hawk(); + } + })(); `, { ...NO_CUSTOM_NODES_PRESET, - compact: false + compact: false, + stringArray: false, + stringArrayThreshold: 1, + deadCodeInjection: true, + deadCodeInjectionThreshold: 1 } ).getObfuscatedCode(); diff --git a/test/functional-tests/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.spec.ts b/test/functional-tests/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.spec.ts index c456d844..4224af9c 100644 --- a/test/functional-tests/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.spec.ts +++ b/test/functional-tests/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.spec.ts @@ -9,7 +9,9 @@ import { readFileAsString } from '../../../helpers/readFileAsString'; import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; describe('ConsoleOutputDisableExpressionNode', () => { - const regExp = /(_0x([a-f0-9]){4,6}\['(\\x[a-f0-9]*)*'\]\['(\\x[a-f0-9]*)*'\] *= *_0x([a-f0-9]){4,6};){7}/u; + const consoleLogRegExp: RegExp = /_0x([a-f0-9]){4,6}\['console'\]\['log'\] *= *_0x([a-f0-9]){4,6};/u; + const consoleErrorRegExp: RegExp = /_0x([a-f0-9]){4,6}\['console'\]\['error'\] *= *_0x([a-f0-9]){4,6};/u; + const consoleWarnRegExp: RegExp = /_0x([a-f0-9]){4,6}\['console'\]\['warn'\] *= *_0x([a-f0-9]){4,6};/u; it('should correctly append `ConsoleOutputDisableExpressionNode` custom node into the obfuscated code if `disableConsoleOutput` option is set', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( @@ -20,7 +22,9 @@ describe('ConsoleOutputDisableExpressionNode', () => { } ); - assert.match(obfuscationResult.getObfuscatedCode(), regExp); + assert.match(obfuscationResult.getObfuscatedCode(), consoleLogRegExp); + assert.match(obfuscationResult.getObfuscatedCode(), consoleErrorRegExp); + assert.match(obfuscationResult.getObfuscatedCode(), consoleWarnRegExp); }); it('should\'t append `ConsoleOutputDisableExpressionNode` custom node into the obfuscated code if `disableConsoleOutput` option is not set', () => { @@ -33,6 +37,8 @@ describe('ConsoleOutputDisableExpressionNode', () => { } ); - assert.notMatch(obfuscationResult.getObfuscatedCode(), regExp); + assert.notMatch(obfuscationResult.getObfuscatedCode(), consoleLogRegExp); + assert.notMatch(obfuscationResult.getObfuscatedCode(), consoleErrorRegExp); + assert.notMatch(obfuscationResult.getObfuscatedCode(), consoleWarnRegExp); }); }); diff --git a/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts b/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts index 12cf6c79..ff51c4cf 100644 --- a/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts +++ b/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts @@ -117,9 +117,9 @@ describe('JavaScriptObfuscator', () => { ); }); - it('should obfuscate simple code with literal variable value', () => { - let pattern1: RegExp = /^var _0x(\w){4} *= *\['(\\[x|u]\d+)+'\];/, - pattern2: RegExp = /var *test *= *_0x(\w){4}\('0x0'\);$/, + it('should obfuscate simple code with latin literal variable value', () => { + let stringArrayLatinRegExp: RegExp = /^var _0x(\w){4} *= *\['abc'\];/, + stringArrayCallRegExp: RegExp = /var *test *= *_0x(\w){4}\('0x0'\);$/, obfuscatedCode1: string = JavaScriptObfuscator.obfuscate( readFileAsString(__dirname + '/fixtures/simple-input-2.js'), { @@ -127,7 +127,15 @@ describe('JavaScriptObfuscator', () => { stringArray: true, stringArrayThreshold: 1 } - ).getObfuscatedCode(), + ).getObfuscatedCode(); + + assert.match(obfuscatedCode1, stringArrayLatinRegExp); + assert.match(obfuscatedCode1, stringArrayCallRegExp); + }); + + it('should obfuscate simple code with cyrillic literal variable value', () => { + let stringArrayCyrillicRegExp: RegExp = /^var _0x(\w){4} *= *\['(\\u\d+)+'\];/, + stringArrayCallRegExp: RegExp = /var *test *= *_0x(\w){4}\('0x0'\);$/, obfuscatedCode2: string = JavaScriptObfuscator.obfuscate( readFileAsString(__dirname + '/fixtures/simple-input-cyrillic.js'), { @@ -137,11 +145,8 @@ describe('JavaScriptObfuscator', () => { } ).getObfuscatedCode(); - assert.match(obfuscatedCode1, pattern1); - assert.match(obfuscatedCode1, pattern2); - - assert.match(obfuscatedCode2, pattern1); - assert.match(obfuscatedCode2, pattern2); + assert.match(obfuscatedCode2, stringArrayCyrillicRegExp); + assert.match(obfuscatedCode2, stringArrayCallRegExp); }); it('should returns same code every time with same `seed`', function () { @@ -206,6 +211,17 @@ describe('JavaScriptObfuscator', () => { ); }); + it('should mangle obfuscated code', () => { + const code: string = readFileAsString(__dirname + '/fixtures/mangle.js'); + + const obfuscationResult1: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, { mangle: true } + ); + const mangleMatch: RegExp = /var *a *= *0x1/; + + assert.match(obfuscationResult1.getObfuscatedCode(), mangleMatch); + }); + afterEach(() => { RandomGeneratorUtils.initializeRandomGenerator(0); }); diff --git a/test/functional-tests/javascript-obfuscator/fixtures/mangle.js b/test/functional-tests/javascript-obfuscator/fixtures/mangle.js new file mode 100644 index 00000000..adf47add --- /dev/null +++ b/test/functional-tests/javascript-obfuscator/fixtures/mangle.js @@ -0,0 +1,3 @@ +var foo = function () { + var test = 1; +}; \ No newline at end of file diff --git a/test/functional-tests/node-transformers/control-flow-transformers/block-statement-control-flow-transformer/BlockStatementControlFlowTransformer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/block-statement-control-flow-transformer/BlockStatementControlFlowTransformer.spec.ts index 28b67d17..ea9512f6 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/block-statement-control-flow-transformer/BlockStatementControlFlowTransformer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/block-statement-control-flow-transformer/BlockStatementControlFlowTransformer.spec.ts @@ -10,14 +10,16 @@ import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; describe('BlockStatementControlFlowTransformer', () => { describe('transformNode (blockStatementNode: ESTree.BlockStatement): ESTree.Node', () => { + const switchCaseMapStringRegExp: RegExp = /var *_0x(?:[a-f0-9]){4,6} *= *\{'.*' *: *'(.*)'\};/; + const switchCaseMapVariableRegExp: RegExp = /var *_0x(?:[a-f0-9]){4,6} *= *_0x(?:[a-f0-9]){4,6}\['.*'\]\['split'\]\('\\x7c'\)/; + describe('variant #1: 5 simple statements', () => { const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( readFileAsString(__dirname + '/fixtures/input-1.js'), { ...NO_CUSTOM_NODES_PRESET, controlFlowFlattening: true, - controlFlowFlatteningThreshold: 1, - unicodeEscapeSequence: false + controlFlowFlatteningThreshold: 1 } ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); @@ -32,9 +34,8 @@ describe('BlockStatementControlFlowTransformer', () => { const switchCaseLengthRegExp: RegExp = /case *'[0-5]': *console\['log'\]\(0x[0-6]\);/g; const switchCaseLength: number = obfuscatedCode.match(switchCaseLengthRegExp)!.length; - const switchCaseMapRegExp: RegExp = /var *_0x(?:[a-f0-9]){4,6} *= *'(.*?)'/; - const switchCaseMapMatches: RegExpMatchArray = obfuscatedCode.match(switchCaseMapRegExp); - const switchCaseMapMatch: string = switchCaseMapMatches[1]; + const switchCaseMapStringMatches: RegExpMatchArray = obfuscatedCode.match(switchCaseMapStringRegExp); + const switchCaseMapMatch: string = switchCaseMapStringMatches[1]; const switchCaseMap: string[] = switchCaseMapMatch.replace(/\\x7c/g, '|').split('|').sort(); it('should save all statements', () => { @@ -52,6 +53,7 @@ describe('BlockStatementControlFlowTransformer', () => { it('should create variable with order of switch cases sequence', () => { assert.deepEqual(switchCaseMap, ['0', '1', '2', '3', '4']); + assert.match(obfuscatedCode, switchCaseMapVariableRegExp); }); }); @@ -77,9 +79,8 @@ describe('BlockStatementControlFlowTransformer', () => { const switchCaseLengthRegExp: RegExp = /case *'[0-5]': *console\['log'\]\(0x[0-6]\);/g; const switchCaseLength: number = obfuscatedCode.match(switchCaseLengthRegExp)!.length; - const switchCaseMapRegExp: RegExp = /var *_0x(?:[a-f0-9]){4,6} *= *'(.*?)'/; - const switchCaseMapMatches: RegExpMatchArray = obfuscatedCode.match(switchCaseMapRegExp); - const switchCaseMapMatch: string = switchCaseMapMatches[1]; + const switchCaseMapStringMatches: RegExpMatchArray = obfuscatedCode.match(switchCaseMapStringRegExp); + const switchCaseMapMatch: string = switchCaseMapStringMatches[1]; const switchCaseMap: string[] = switchCaseMapMatch.replace(/\\x7c/g, '|').split('|').sort(); it('should save all statements', () => { @@ -97,6 +98,7 @@ describe('BlockStatementControlFlowTransformer', () => { it('should create variable with order of switch cases sequence', () => { assert.deepEqual(switchCaseMap, ['0', '1', '2', '3', '4']); + assert.match(obfuscatedCode, switchCaseMapVariableRegExp); }); }); @@ -111,7 +113,7 @@ describe('BlockStatementControlFlowTransformer', () => { ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const statementRegExp: RegExp = /^\(function *\( *\) *\{ *console\['(\\x[a-f0-9]*){3}'\]\(0x1\); *\} *\( *\) *\);$/; + const statementRegExp: RegExp = /^\(function *\( *\) *\{ *console\['log'\]\(0x1\); *\} *\( *\) *\);$/; it('shouldn\'t transform block statement if statements length less than 5', () => { assert.match(obfuscatedCode, statementRegExp); @@ -129,7 +131,7 @@ describe('BlockStatementControlFlowTransformer', () => { ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const statementRegExp: RegExp = /^\(function *\( *\) *\{ *const *_0x([a-f0-9]){4,6} *= *0x1; *console\['(\\x[a-f0-9]*){3}'\]\(0x1\);/; + const statementRegExp: RegExp = /^\(function *\( *\) *\{ *const *_0x([a-f0-9]){4,6} *= *0x1; *console\['log'\]\(0x1\);/; it('shouldn\'t transform block statement if block statement contain variable declaration with `const` kind', () => { assert.match(obfuscatedCode, statementRegExp); @@ -147,7 +149,7 @@ describe('BlockStatementControlFlowTransformer', () => { ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const statementRegExp: RegExp = /^\(function *\( *\) *\{ *let *_0x([a-f0-9]){4,6} *= *0x1; *console\['(\\x[a-f0-9]*){3}'\]\(0x1\);/; + const statementRegExp: RegExp = /^\(function *\( *\) *\{ *let *_0x([a-f0-9]){4,6} *= *0x1; *console\['log'\]\(0x1\);/; it('shouldn\'t transform block statement if block statement contain variable declaration with `let` kind', () => { assert.match(obfuscatedCode, statementRegExp); @@ -165,7 +167,7 @@ describe('BlockStatementControlFlowTransformer', () => { ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const statementRegExp: RegExp = /^\(function *\( *\) *\{ *while *\(!!\[\]\) *\{ *break; *console\['(\\x[a-f0-9]*){3}'\]\(0x1\);/; + const statementRegExp: RegExp = /^\(function *\( *\) *\{ *while *\(!!\[\]\) *\{ *break; *console\['log'\]\(0x1\);/; it('shouldn\'t transform block statement if block statement contain break statement', () => { assert.match(obfuscatedCode, statementRegExp); @@ -183,7 +185,7 @@ describe('BlockStatementControlFlowTransformer', () => { ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const statementRegExp: RegExp = /^\(function *\( *\) *\{ *while *\(!!\[\]\) *\{ *continue; *console\['(\\x[a-f0-9]*){3}'\]\(0x1\);/; + const statementRegExp: RegExp = /^\(function *\( *\) *\{ *while *\(!!\[\]\) *\{ *continue; *console\['log'\]\(0x1\);/; it('shouldn\'t transform block statement if block statement contain continue statement', () => { assert.match(obfuscatedCode, statementRegExp); @@ -201,7 +203,7 @@ describe('BlockStatementControlFlowTransformer', () => { ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const statementRegExp: RegExp = /^\(function *\( *\) *\{ *function *_0x([a-f0-9]){4,6} *\( *\) *\{ *\} *console\['(\\x[a-f0-9]*){3}'\]\(0x1\);/; + const statementRegExp: RegExp = /^\(function *\( *\) *\{ *function *_0x([a-f0-9]){4,6} *\( *\) *\{ *\} *console\['log'\]\(0x1\);/; it('shouldn\'t transform block statement if block statement contain function declaration', () => { assert.match(obfuscatedCode, statementRegExp); @@ -222,7 +224,7 @@ describe('BlockStatementControlFlowTransformer', () => { ); const regExp1: RegExp = /switch *\(_0x([a-f0-9]){4,6}\[_0x([a-f0-9]){4,6}\+\+\]\) *\{/g; - const regExp2: RegExp = /\(function *\( *\) *\{ *console\['(\\x[a-f0-9]*){3}'\]\(0x1\);/g; + const regExp2: RegExp = /\(function *\( *\) *\{ *console\['log'\]\(0x1\);/g; const transformedStatementMatchesLength = obfuscationResult.getObfuscatedCode().match(regExp1)!.length; const untouchedStatementMatchesLength = obfuscationResult.getObfuscatedCode().match(regExp2)!.length; diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts index 1d3529e8..1ec93446 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts @@ -20,7 +20,7 @@ describe('BinaryExpressionControlFlowReplacer', () => { } ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const controlFlowStorageCallRegExp: RegExp = /var *_0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['(\\x[a-f0-9]*){3}'\]\(0x1, *0x2\);/; + const controlFlowStorageCallRegExp: RegExp = /var *_0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['\w{3}'\]\(0x1, *0x2\);/; it('should replace binary expression node by call to control flow storage node', () => { assert.match(obfuscatedCode, controlFlowStorageCallRegExp); @@ -47,8 +47,8 @@ describe('BinaryExpressionControlFlowReplacer', () => { } ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const controlFlowStorageCallRegExp1: RegExp = /var *_0x([a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['(\\x[a-f0-9]*){3}'\])\(0x1, *0x2\);/; - const controlFlowStorageCallRegExp2: RegExp = /var *_0x([a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['(\\x[a-f0-9]*){3}'\])\(0x2, *0x3\);/; + const controlFlowStorageCallRegExp1: RegExp = /var *_0x([a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['\w{3}'\])\(0x1, *0x2\);/; + const controlFlowStorageCallRegExp2: RegExp = /var *_0x([a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['\w{3}'\])\(0x2, *0x3\);/; const firstMatchArray: RegExpMatchArray | null = obfuscatedCode.match(controlFlowStorageCallRegExp1); const secondMatchArray: RegExpMatchArray | null = obfuscatedCode.match(controlFlowStorageCallRegExp2); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts index 98f43daf..e1cad533 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts @@ -20,7 +20,7 @@ describe('CallExpressionControlFlowReplacer', () => { } ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const controlFlowStorageCallRegExp: RegExp = /var *_0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['(\\x[a-f0-9]*){3}'\]\(_0x([a-f0-9]){4,6}, *0x1, *0x2\);/; + const controlFlowStorageCallRegExp: RegExp = /var *_0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['\w{3}'\]\(_0x([a-f0-9]){4,6}, *0x1, *0x2\);/; it('should replace call expression node by call to control flow storage node', () => { assert.match(obfuscatedCode, controlFlowStorageCallRegExp); @@ -47,8 +47,8 @@ describe('CallExpressionControlFlowReplacer', () => { } ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const controlFlowStorageCallRegExp1: RegExp = /var *_0x([a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['(\\x[a-f0-9]*){3}'\])\(_0x([a-f0-9]){4,6}, *0x1, *0x2\);/; - const controlFlowStorageCallRegExp2: RegExp = /var *_0x([a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['(\\x[a-f0-9]*){3}'\])\(_0x([a-f0-9]){4,6}, *0x2, *0x3\);/; + const controlFlowStorageCallRegExp1: RegExp = /var *_0x([a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['\w{3}'\])\(_0x([a-f0-9]){4,6}, *0x1, *0x2\);/; + const controlFlowStorageCallRegExp2: RegExp = /var *_0x([a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['\w{3}'\])\(_0x([a-f0-9]){4,6}, *0x2, *0x3\);/; const firstMatchArray: RegExpMatchArray | null = obfuscatedCode.match(controlFlowStorageCallRegExp1); const secondMatchArray: RegExpMatchArray | null = obfuscatedCode.match(controlFlowStorageCallRegExp2); @@ -78,7 +78,7 @@ describe('CallExpressionControlFlowReplacer', () => { } ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const controlFlowStorageCallRegExp: RegExp = /var *_0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['\\x73\\x75\\x6d'\]\(0x1, *0x2\);/; + const controlFlowStorageCallRegExp: RegExp = /var *_0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['sum'\]\(0x1, *0x2\);/; it('shouldn\'t replace call expression node by call to control flow storage node if call expression callee is member expression node', () => { assert.match(obfuscatedCode, controlFlowStorageCallRegExp); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts index 57bf32a7..f81a8658 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts @@ -20,7 +20,7 @@ describe('LogicalExpressionControlFlowReplacer', () => { } ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const controlFlowStorageCallRegExp: RegExp = /var *_0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['(\\x[a-f0-9]*){3}'\]\(!!\[\], *!\[\]\);/; + const controlFlowStorageCallRegExp: RegExp = /var *_0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['\w{3}'\]\(!!\[\], *!\[\]\);/; it('should replace logical expression node by call to control flow storage node', () => { assert.match(obfuscatedCode, controlFlowStorageCallRegExp); @@ -47,8 +47,8 @@ describe('LogicalExpressionControlFlowReplacer', () => { } ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const controlFlowStorageCallRegExp1: RegExp = /var *_0x([a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['(\\x[a-f0-9]*){3}'\])\(!!\[\], *!\[\]\);/; - const controlFlowStorageCallRegExp2: RegExp = /var *_0x([a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['(\\x[a-f0-9]*){3}'\])\(!\[\], *!!\[\]\);/; + const controlFlowStorageCallRegExp1: RegExp = /var *_0x([a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['\w{3}'\])\(!!\[\], *!\[\]\);/; + const controlFlowStorageCallRegExp2: RegExp = /var *_0x([a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['\w{3}'\])\(!\[\], *!!\[\]\);/; const firstMatchArray: RegExpMatchArray | null = obfuscatedCode.match(controlFlowStorageCallRegExp1); const secondMatchArray: RegExpMatchArray | null = obfuscatedCode.match(controlFlowStorageCallRegExp2); @@ -78,7 +78,7 @@ describe('LogicalExpressionControlFlowReplacer', () => { } ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - const controlFlowStorageCallRegExp: RegExp = /var *_0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['(\\x[a-f0-9]*){3}'\]\(!_0x([a-f0-9]){4,6}, *!_0x([a-f0-9]){4,6}\);/; + const controlFlowStorageCallRegExp: RegExp = /var *_0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['\w{3}'\]\(!_0x([a-f0-9]){4,6}, *!_0x([a-f0-9]){4,6}\);/; it('should replace logical expression node with unary expression by call to control flow storage node', () => { assert.match(obfuscatedCode, controlFlowStorageCallRegExp); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts new file mode 100644 index 00000000..1264afda --- /dev/null +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts @@ -0,0 +1,33 @@ +import { assert } from 'chai'; + +import { IObfuscationResult } from '../../../../../../src/interfaces/IObfuscationResult'; + +import { NO_CUSTOM_NODES_PRESET } from '../../../../../../src/options/presets/NoCustomNodes'; + +import { readFileAsString } from '../../../../../helpers/readFileAsString'; + +import { JavaScriptObfuscator } from '../../../../../../src/JavaScriptObfuscator'; + +describe('StringLiteralControlFlowReplacer', () => { + describe('replace (literalNode: ESTree.Literal,parentNode: ESTree.Node,controlFlowStorage: IStorage )', () => { + const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + readFileAsString(__dirname + '/fixtures/input-1.js'), + { + ...NO_CUSTOM_NODES_PRESET, + controlFlowFlattening: true, + controlFlowFlatteningThreshold: 1 + } + ); + const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); + const controlFlowStorageStringLiteralRegExp: RegExp = /var *_0x([a-f0-9]){4,6} *= *\{'\w{3}' *: *'test'\};/; + const controlFlowStorageCallRegExp: RegExp = /var *_0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['\w{3}'\];/; + + it('should add string literal node as property of control flow storage node', () => { + assert.match(obfuscatedCode, controlFlowStorageStringLiteralRegExp); + }); + + it('should replace string literal node by call to control flow storage node', () => { + assert.match(obfuscatedCode, controlFlowStorageCallRegExp); + }); + }); +}); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/fixtures/input-1.js b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/fixtures/input-1.js new file mode 100644 index 00000000..17c4da5a --- /dev/null +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/fixtures/input-1.js @@ -0,0 +1,3 @@ +(function () { + var variable = 'test'; +})(); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts index 25f9bdd6..4b609f31 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts @@ -12,15 +12,15 @@ describe('FunctionControlFlowTransformer', () => { const variableMatch: string = '_0x([a-f0-9]){4,6}'; const rootControlFlowStorageNodeMatch: string = `` + `var *${variableMatch} *= *\\{` + - `'(\\\\x[a-f0-9]*){3}' *: *function *${variableMatch} *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'\\w{3}' *: *function *${variableMatch} *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *\\+ *${variableMatch};` + `\\}` + `\\};` + ``; const innerControlFlowStorageNodeMatch: string = `` + `var *${variableMatch} *= *\\{` + - `'(\\\\x[a-f0-9]*){3}' *: *function *${variableMatch} *\\(${variableMatch}, *${variableMatch}\\) *\\{` + - `return *${variableMatch}\\['(\\\\x[a-f0-9]*){3}'\\]\\(${variableMatch}, *${variableMatch}\\);` + + `'\\w{3}' *: *function *${variableMatch} *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `return *${variableMatch}\\['\\w{3}'\\]\\(${variableMatch}, *${variableMatch}\\);` + `\\}` + `\\};` + ``; @@ -95,10 +95,10 @@ describe('FunctionControlFlowTransformer', () => { const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); const regexp: RegExp = new RegExp( `var *${variableMatch} *= *\\{` + - `'(\\\\x[a-f0-9]*){3}' *: *function *${variableMatch} *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'\\w{3}' *: *function *${variableMatch} *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *\\+ *${variableMatch};` + `\\}, *` + - `'(\\\\x[a-f0-9]*){3}' *: *function *${variableMatch} *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'\\w{3}' *: *function *${variableMatch} *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *- *${variableMatch};` + `\\}` + `\\};` @@ -130,7 +130,7 @@ describe('FunctionControlFlowTransformer', () => { const expectedValue: number = 0; const regExp: RegExp = new RegExp( `var *[a-zA-Z]{6} *= *\\{` + - `'(\\\\x[a-f0-9]*){3}' *: *function *_0x[0-9] *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'\\w{3}' *: *function *_0x[0-9] *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *\\+ *${variableMatch};` + `\\}` + `\\};` diff --git a/test/functional-tests/node-transformers/converting-transformers/member-expression-transformer/MemberExpressionTransformer.spec.ts b/test/functional-tests/node-transformers/converting-transformers/member-expression-transformer/MemberExpressionTransformer.spec.ts index 7a396186..31c118dd 100644 --- a/test/functional-tests/node-transformers/converting-transformers/member-expression-transformer/MemberExpressionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/converting-transformers/member-expression-transformer/MemberExpressionTransformer.spec.ts @@ -18,7 +18,7 @@ describe('MemberExpressionTransformer', () => { } ); - assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *console\['\\x6c\\x6f\\x67'\];/); + assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *console\['log'\];/); }); it('should replace member expression dot notation call by square brackets call to unicode array', () => { @@ -31,7 +31,7 @@ describe('MemberExpressionTransformer', () => { } ); - assert.match(obfuscationResult.getObfuscatedCode(), /var *_0x([a-f0-9]){4} *= *\['\\x6c\\x6f\\x67'\];/); + assert.match(obfuscationResult.getObfuscatedCode(), /var *_0x([a-f0-9]){4} *= *\['log'\];/); assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *console\[_0x([a-f0-9]){4}\('0x0'\)\];/); }); }); @@ -47,7 +47,7 @@ describe('MemberExpressionTransformer', () => { } ); - assert.match(obfuscationResult.getObfuscatedCode(), /var *_0x([a-f0-9]){4} *= *\['\\x6c\\x6f\\x67'\];/); + assert.match(obfuscationResult.getObfuscatedCode(), /var *_0x([a-f0-9]){4} *= *\['log'\];/); assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *console\[_0x([a-f0-9]){4}\('0x0'\)\];/); }); diff --git a/test/functional-tests/node-transformers/converting-transformers/method-definition-transformer/MethodDefinitionTransformer.spec.ts b/test/functional-tests/node-transformers/converting-transformers/method-definition-transformer/MethodDefinitionTransformer.spec.ts index 95a06efc..be6d0028 100644 --- a/test/functional-tests/node-transformers/converting-transformers/method-definition-transformer/MethodDefinitionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/converting-transformers/method-definition-transformer/MethodDefinitionTransformer.spec.ts @@ -19,7 +19,7 @@ describe('MethodDefinitionTransformer', () => { } ); - assert.match(obfuscationResult.getObfuscatedCode(), /\['\\x62\\x61\\x72'\]\(\)\{\}/); + assert.match(obfuscationResult.getObfuscatedCode(), /\['bar'\]\(\)\{\}/); }); it('should replace method definition node `key` property with unicode array call', () => { @@ -32,7 +32,7 @@ describe('MethodDefinitionTransformer', () => { } ); - assert.match(obfuscationResult.getObfuscatedCode(), /var *_0x([a-f0-9]){4} *= *\['\\x62\\x61\\x72'\];/); + assert.match(obfuscationResult.getObfuscatedCode(), /var *_0x([a-f0-9]){4} *= *\['bar'\];/); assert.match(obfuscationResult.getObfuscatedCode(), /\[_0x([a-f0-9]){4}\('0x0'\)\]\(\)\{\}/); }); diff --git a/test/functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec.ts b/test/functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec.ts new file mode 100644 index 00000000..d6cd8b04 --- /dev/null +++ b/test/functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec.ts @@ -0,0 +1,214 @@ +import { assert } from 'chai'; + +import { IObfuscationResult } from '../../../../src/interfaces/IObfuscationResult'; + +import { NO_CUSTOM_NODES_PRESET } from '../../../../src/options/presets/NoCustomNodes'; + +import { readFileAsString } from '../../../helpers/readFileAsString'; + +import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; + +describe('DeadCodeInjectionTransformer', () => { + const variableMatch: string = '_0x([a-f0-9]){4,6}'; + const hexMatch: string = '0x[a-f0-9]'; + + describe('transformNode (programNode: ESTree.Program, parentNode: ESTree.Node): ESTree.Node', () => { + describe('variant #1 - 5 simple block statements', () => { + const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + readFileAsString(__dirname + '/fixtures/input-1.js'), + { + ...NO_CUSTOM_NODES_PRESET, + deadCodeInjection: true, + deadCodeInjectionThreshold: 1, + stringArray: true, + stringArrayThreshold: 1 + } + ); + const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); + const deadCodeMatch: string = `` + + `if *\\(${variableMatch}\\('${hexMatch}'\\) *[=|!]== *${variableMatch}\\('${hexMatch}'\\)\\) *\\{`+ + `console\\[${variableMatch}\\('${hexMatch}'\\)\\]\\(${variableMatch}\\('${hexMatch}'\\)\\);` + + `\\} *else *\\{`+ + `console\\[${variableMatch}\\('${hexMatch}'\\)\\]\\(${variableMatch}\\('${hexMatch}'\\)\\);` + + `\\}` + + ``; + const regexp: RegExp = new RegExp(deadCodeMatch, 'g'); + const matches: RegExpMatchArray = obfuscatedCode.match(regexp); + + it('should replace block statements with condition with original block statements and dead code', () => { + assert.isNotNull(matches); + assert.equal(matches.length, 5); + }); + }); + + describe('variant #2 - 4 simple block statements', () => { + const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + readFileAsString(__dirname + '/fixtures/block-statements-min-count.js'), + { + ...NO_CUSTOM_NODES_PRESET, + deadCodeInjection: true, + deadCodeInjectionThreshold: 1, + stringArray: true, + stringArrayThreshold: 1 + } + ); + const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); + const codeMatch: string = `` + + `var *${variableMatch} *= *function *\\(\\) *\\{` + + `console\\[${variableMatch}\\('${hexMatch}'\\)\\]\\(${variableMatch}\\('${hexMatch}'\\)\\);` + + `\\};` + + ``; + const regexp: RegExp = new RegExp(codeMatch, 'g'); + const matches: RegExpMatchArray = obfuscatedCode.match(regexp); + + it('shouldn\'t add dead code if block statements count is less than 5', () => { + assert.isNotNull(matches); + assert.equal(matches.length, 4); + }); + }); + + describe('variant #3 - deadCodeInjectionThreshold: 0', () => { + const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + readFileAsString(__dirname + '/fixtures/input-1.js'), + { + ...NO_CUSTOM_NODES_PRESET, + deadCodeInjection: true, + deadCodeInjectionThreshold: 0, + stringArray: true, + stringArrayThreshold: 1 + } + ); + const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); + const codeMatch: string = `` + + `var *${variableMatch} *= *function *\\(\\) *\\{` + + `console\\[${variableMatch}\\('${hexMatch}'\\)\\]\\(${variableMatch}\\('${hexMatch}'\\)\\);` + + `\\};` + + ``; + const regexp: RegExp = new RegExp(codeMatch, 'g'); + const matches: RegExpMatchArray = obfuscatedCode.match(regexp); + + it('shouldn\'t add dead code if `deadCodeInjectionThreshold` option value is `0`', () => { + assert.isNotNull(matches); + assert.equal(matches.length, 5); + }); + }); + + describe('variant #4 - break or continue statement in block statement', () => { + const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + readFileAsString(__dirname + '/fixtures/break-continue-statement.js'), + { + ...NO_CUSTOM_NODES_PRESET, + deadCodeInjection: true, + deadCodeInjectionThreshold: 1, + stringArray: true, + stringArrayThreshold: 1 + } + ); + const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); + + const functionMatch: string = `` + + `var *${variableMatch} *= *function *\\(\\) *\\{` + + `console\\[${variableMatch}\\('${hexMatch}'\\)\\]\\(${variableMatch}\\('${hexMatch}'\\)\\);` + + `\\};` + + ``; + const loopMatch: string = `` + + `for *\\(var *${variableMatch} *= *${hexMatch}; *${variableMatch} *< *${hexMatch}; *${variableMatch}\\+\\+\\) *\\{` + + `(?:continue|break);` + + `\\}` + + ``; + + const functionRegExp: RegExp = new RegExp(functionMatch, 'g'); + const loopRegExp: RegExp = new RegExp(loopMatch, 'g'); + + const functionMatches: RegExpMatchArray = obfuscatedCode.match(functionRegExp); + const loopMatches: RegExpMatchArray = obfuscatedCode.match(loopRegExp); + + it('shouldn\'t add dead code if block statement contains `continue` or `break` statements', () => { + assert.isNotNull(functionMatches); + assert.isNotNull(loopMatches); + + assert.equal(functionMatches.length, 4); + assert.equal(loopMatches.length, 2); + }); + }); + + describe('variant #5 - chance of `IfStatement` variant', () => { + const samplesCount: number = 1000; + const delta: number = 0.1; + const expectedValue: number = 0.25; + + const ifMatch: string = `if *\\(!!\\[\\]\\) *\\{`; + const functionMatch: string = `var *${variableMatch} *= *function *\\(\\) *\\{`; + + const match1: string = `` + + `if *\\(${variableMatch}\\('${hexMatch}'\\) *=== *${variableMatch}\\('${hexMatch}'\\)\\) *\\{` + + `console.*` + + `\\} *else *\\{` + + `${variableMatch}.*` + + `\\}` + + ``; + const match2: string = `` + + `if *\\(${variableMatch}\\('${hexMatch}'\\) *!== *${variableMatch}\\('${hexMatch}'\\)\\) *\\{` + + `console.*` + + `\\} *else *\\{` + + `${variableMatch}.*` + + `\\}` + + ``; + const match3: string = `` + + `if *\\(${variableMatch}\\('${hexMatch}'\\) *=== *${variableMatch}\\('${hexMatch}'\\)\\) *\\{` + + `${variableMatch}.*` + + `\\} *else *\\{` + + `console.*` + + `\\}` + + ``; + const match4: string = `` + + `if *\\(${variableMatch}\\('${hexMatch}'\\) *!== *${variableMatch}\\('${hexMatch}'\\)\\) *\\{` + + `${variableMatch}.*` + + `\\} *else *\\{` + + `console.*` + + `\\}` + + ``; + + const regExp1: RegExp = new RegExp(`${ifMatch}${functionMatch}${match1}`); + const regExp2: RegExp = new RegExp(`${ifMatch}${functionMatch}${match2}`); + const regExp3: RegExp = new RegExp(`${ifMatch}${functionMatch}${match3}`); + const regExp4: RegExp = new RegExp(`${ifMatch}${functionMatch}${match4}`); + + let count1: number = 0; + let count2: number = 0; + let count3: number = 0; + let count4: number = 0; + + for (let i = 0; i < samplesCount; i++) { + const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + readFileAsString(__dirname + '/fixtures/if-statement-variants-distribution.js'), + { + ...NO_CUSTOM_NODES_PRESET, + deadCodeInjection: true, + deadCodeInjectionThreshold: 1, + stringArray: true, + stringArrayThreshold: 1 + } + ); + const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); + + if (regExp1.test(obfuscatedCode)) { + count1++; + } else if (regExp2.test(obfuscatedCode)) { + count2++; + } else if (regExp3.test(obfuscatedCode)) { + count3++; + } else if (regExp4.test(obfuscatedCode)) { + count4++; + } + } + + it('each of four `IfStatement` variant should have distribution close to `0.25`', () => { + assert.closeTo(count1 / samplesCount, expectedValue, delta); + assert.closeTo(count2 / samplesCount, expectedValue, delta); + assert.closeTo(count3 / samplesCount, expectedValue, delta); + assert.closeTo(count4 / samplesCount, expectedValue, delta); + }); + }); + }); +}); diff --git a/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/block-statements-min-count.js b/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/block-statements-min-count.js new file mode 100644 index 00000000..dc40f792 --- /dev/null +++ b/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/block-statements-min-count.js @@ -0,0 +1,21 @@ +(function(){ + if (true) { + var foo = function () { + console.log('abc'); + }; + var bar = function () { + console.log('def'); + }; + var baz = function () { + console.log('ghi'); + }; + var bark = function () { + console.log('jkl'); + }; + + foo(); + bar(); + baz(); + bark(); + } +})(); \ No newline at end of file diff --git a/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/break-continue-statement.js b/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/break-continue-statement.js new file mode 100644 index 00000000..8f5e2d00 --- /dev/null +++ b/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/break-continue-statement.js @@ -0,0 +1,29 @@ +(function(){ + if (true) { + var foo = function () { + console.log('abc'); + }; + var bar = function () { + console.log('def'); + }; + var baz = function () { + console.log('ghi'); + }; + var bark = function () { + console.log('jkl'); + }; + + for (var i = 0; i < 1; i++) { + continue; + } + + for (var i = 0; i < 1; i++) { + break; + } + + foo(); + bar(); + baz(); + bark(); + } +})(); \ No newline at end of file diff --git a/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/if-statement-variants-distribution.js b/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/if-statement-variants-distribution.js new file mode 100644 index 00000000..576e6f4a --- /dev/null +++ b/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/if-statement-variants-distribution.js @@ -0,0 +1,25 @@ +(function(){ + if (true) { + var foo = function () { + console.log('abc'); + }; + var bar = function () { + alert('def'); + }; + var baz = function () { + alert('ghi'); + }; + var bark = function () { + alert('jkl'); + }; + var hawk = function () { + alert('mno'); + }; + + foo(); + bar(); + baz(); + bark(); + hawk(); + } +})(); \ No newline at end of file diff --git a/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/input-1.js b/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/input-1.js new file mode 100644 index 00000000..550a7f7c --- /dev/null +++ b/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/input-1.js @@ -0,0 +1,25 @@ +(function(){ + if (true) { + var foo = function () { + console.log('abc'); + }; + var bar = function () { + console.log('def'); + }; + var baz = function () { + console.log('ghi'); + }; + var bark = function () { + console.log('jkl'); + }; + var hawk = function () { + console.log('mno'); + }; + + foo(); + bar(); + baz(); + bark(); + hawk(); + } +})(); \ No newline at end of file diff --git a/test/functional-tests/node-transformers/obfuscating-transformers/catch-clause-transformer/CatchClauseTransformer.spec.ts b/test/functional-tests/node-transformers/obfuscating-transformers/catch-clause-transformer/CatchClauseTransformer.spec.ts index d1d8e1db..827efe9f 100644 --- a/test/functional-tests/node-transformers/obfuscating-transformers/catch-clause-transformer/CatchClauseTransformer.spec.ts +++ b/test/functional-tests/node-transformers/obfuscating-transformers/catch-clause-transformer/CatchClauseTransformer.spec.ts @@ -18,7 +18,7 @@ describe('CatchClauseTransformer', () => { ); const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); const paramNameRegExp: RegExp = /catch *\((_0x([a-f0-9]){4,6})\) *\{/; - const bodyParamNameRegExp: RegExp = /console\['\\x6c\\x6f\\x67'\]\((_0x([a-f0-9]){4,6})\);/; + const bodyParamNameRegExp: RegExp = /console\['log'\]\((_0x([a-f0-9]){4,6})\);/; it('should transform catch clause node', () => { assert.match(obfuscatedCode, paramNameRegExp); diff --git a/test/functional-tests/node-transformers/obfuscating-transformers/function-transformer/FunctionTransformer.spec.ts b/test/functional-tests/node-transformers/obfuscating-transformers/function-transformer/FunctionTransformer.spec.ts index 9b8903f8..77383098 100644 --- a/test/functional-tests/node-transformers/obfuscating-transformers/function-transformer/FunctionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/obfuscating-transformers/function-transformer/FunctionTransformer.spec.ts @@ -22,7 +22,7 @@ describe('FunctionTransformer', () => { const functionParamIdentifierMatch: RegExpMatchArray|null = obfuscatedCode .match(/var _0x[a-f0-9]{4,6} *= *function *\((_0x[a-f0-9]{4,6})\) *\{/); const functionBodyIdentifierMatch: RegExpMatchArray|null = obfuscatedCode - .match(/console\['\\x6c\\x6f\\x67'\]\((_0x[a-f0-9]{4,6})\)/); + .match(/console\['log'\]\((_0x[a-f0-9]{4,6})\)/); const functionParamIdentifierName: string = (functionParamIdentifierMatch)[1]; const functionBodyIdentifierName: string = (functionBodyIdentifierMatch)[1]; diff --git a/test/functional-tests/node-transformers/obfuscating-transformers/literal-transformer/LiteralTransformer.spec.ts b/test/functional-tests/node-transformers/obfuscating-transformers/literal-transformer/LiteralTransformer.spec.ts index 95a6f6ef..a791113a 100644 --- a/test/functional-tests/node-transformers/obfuscating-transformers/literal-transformer/LiteralTransformer.spec.ts +++ b/test/functional-tests/node-transformers/obfuscating-transformers/literal-transformer/LiteralTransformer.spec.ts @@ -10,18 +10,7 @@ import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; describe('LiteralTransformer', () => { describe('transformation of literal node with string value', () => { - it('should replace literal node value with unicode escape sequence', () => { - let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( - readFileAsString(__dirname + '/fixtures/simple-input.js'), - { - ...NO_CUSTOM_NODES_PRESET - } - ); - - assert.match(obfuscationResult.getObfuscatedCode(), /^var *test *= *'\\x74\\x65\\x73\\x74';$/); - }); - - it('should replace literal node value with unicode escape sequence from string array', () => { + it('should replace literal node value with value from string array', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( readFileAsString(__dirname + '/fixtures/simple-input.js'), { @@ -31,41 +20,6 @@ describe('LiteralTransformer', () => { } ); - assert.match( - obfuscationResult.getObfuscatedCode(), - /^var *_0x([a-f0-9]){4} *= *\['\\x74\\x65\\x73\\x74'\];/ - ); - assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *_0x([a-f0-9]){4}\('0x0'\);/); - }); - - it('should create only one item in string array for same literal node values', () => { - let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( - readFileAsString(__dirname + '/fixtures/same-literal-values.js'), - { - ...NO_CUSTOM_NODES_PRESET, - stringArray: true, - stringArrayThreshold: 1 - } - ); - - assert.match( - obfuscationResult.getObfuscatedCode(), - /^var *_0x([a-f0-9]){4} *= *\['\\x74\\x65\\x73\\x74'\];/ - ); - assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *_0x([a-f0-9]){4}\('0x0'\);/); - }); - - it('should replace literal node value with raw value from string array if `unicodeEscapeSequence` is disabled', () => { - let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( - readFileAsString(__dirname + '/fixtures/simple-input.js'), - { - ...NO_CUSTOM_NODES_PRESET, - stringArray: true, - stringArrayThreshold: 1, - unicodeEscapeSequence: false - } - ); - assert.match( obfuscationResult.getObfuscatedCode(), /^var *_0x([a-f0-9]){4} *= *\['test'\];/ @@ -73,12 +27,11 @@ describe('LiteralTransformer', () => { assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *_0x([a-f0-9]){4}\('0x0'\);/); }); - it('should replace literal node value with raw value from string array if `unicodeEscapeSequence` and `stringArray` are disabled', () => { + it('shouldn\'t replace literal node value with value from string array if `stringArray` option is disabled', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( readFileAsString(__dirname + '/fixtures/simple-input.js'), { - ...NO_CUSTOM_NODES_PRESET, - unicodeEscapeSequence: false + ...NO_CUSTOM_NODES_PRESET } ); @@ -94,12 +47,59 @@ describe('LiteralTransformer', () => { { ...NO_CUSTOM_NODES_PRESET, stringArray: true, - stringArrayThreshold: 1, - unicodeEscapeSequence: false + stringArrayThreshold: 1 } )); }); + it('should create only one item in string array for same literal node values', () => { + let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + readFileAsString(__dirname + '/fixtures/same-literal-values.js'), + { + ...NO_CUSTOM_NODES_PRESET, + stringArray: true, + stringArrayThreshold: 1 + } + ); + + assert.match( + obfuscationResult.getObfuscatedCode(), + /^var *_0x([a-f0-9]){4} *= *\['test'\];/ + ); + assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *_0x([a-f0-9]){4}\('0x0'\);/); + }); + + it('should replace literal node value with unicode escape sequence if `unicodeEscapeSequence` is enabled', () => { + let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + readFileAsString(__dirname + '/fixtures/simple-input.js'), + { + ...NO_CUSTOM_NODES_PRESET, + unicodeEscapeSequence: true + + } + ); + + assert.match(obfuscationResult.getObfuscatedCode(), /^var *test *= *'\\x74\\x65\\x73\\x74';$/); + }); + + it('should replace literal node value with unicode escape sequence from string array if `unicodeEscapeSequence` is enabled', () => { + let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + readFileAsString(__dirname + '/fixtures/simple-input.js'), + { + ...NO_CUSTOM_NODES_PRESET, + stringArray: true, + stringArrayThreshold: 1, + unicodeEscapeSequence: true + } + ); + + assert.match( + obfuscationResult.getObfuscatedCode(), + /^var *_0x([a-f0-9]){4} *= *\['\\x74\\x65\\x73\\x74'\];/ + ); + assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *_0x([a-f0-9]){4}\('0x0'\);/); + }); + it('shouldn\'t replace short literal node value with value from string array', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( readFileAsString(__dirname + '/fixtures/short-literal-value.js'), @@ -110,7 +110,7 @@ describe('LiteralTransformer', () => { } ); - assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *'\\x74\\x65';/); + assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *'te';/); }); it('should replace literal node value with value from string array encoded using base64', () => { @@ -126,7 +126,7 @@ describe('LiteralTransformer', () => { assert.match( obfuscationResult.getObfuscatedCode(), - /^var *_0x([a-f0-9]){4} *= *\['\\x64\\x47\\x56\\x7a\\x64\\x41\\x3d\\x3d'\];/ + /^var *_0x([a-f0-9]){4} *= *\['dGVzdA\\x3d\\x3d'\];/ ); assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *_0x([a-f0-9]){4}\('0x0'\);/); }); @@ -144,7 +144,7 @@ describe('LiteralTransformer', () => { assert.match( obfuscationResult.getObfuscatedCode(), - /var *test *= *_0x([a-f0-9]){4}\('0x0', '(\\x[a-f0-9]*){4}'\);/ + /var *test *= *_0x([a-f0-9]){4}\('0x0', '(?:\w|(?:\\x[a-f0-9]*)){4}'\);/ ); }); @@ -162,7 +162,7 @@ describe('LiteralTransformer', () => { ); const regExp1: RegExp = /var *test *= *_0x([a-f0-9]){4}\('0x0'\);/g; - const regExp2: RegExp = /var *test *= *'\\x74\\x65\\x73\\x74';/g; + const regExp2: RegExp = /var *test *= *'test';/g; const stringArrayMatchesLength = obfuscationResult.getObfuscatedCode().match(regExp1)!.length; const noStringArrayMatchesLength = obfuscationResult.getObfuscatedCode().match(regExp2)!.length; diff --git a/test/functional-tests/node-transformers/obfuscating-transformers/object-expression-transformer/ObjectExpressionTransformer.spec.ts b/test/functional-tests/node-transformers/obfuscating-transformers/object-expression-transformer/ObjectExpressionTransformer.spec.ts index 14062ed4..6c633ed4 100644 --- a/test/functional-tests/node-transformers/obfuscating-transformers/object-expression-transformer/ObjectExpressionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/obfuscating-transformers/object-expression-transformer/ObjectExpressionTransformer.spec.ts @@ -9,18 +9,7 @@ import { readFileAsString } from '../../../../helpers/readFileAsString'; import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; describe('ObjectExpressionTransformer', () => { - it('should replace object expression node `key` property with literal value by unicode value', () => { - let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( - readFileAsString(__dirname + '/fixtures/property-with-literal-value.js'), - { - ...NO_CUSTOM_NODES_PRESET - } - ); - - assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *\{'\\x66\\x6f\\x6f':0x0\};/); - }); - - it('should replace object expression node `key` property with identifier value by unicode value', () => { + it('should replace object expression node `key` property with identifier value by property with literal value', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( readFileAsString(__dirname + '/fixtures/property-with-identifier-value.js'), { @@ -28,7 +17,7 @@ describe('ObjectExpressionTransformer', () => { } ); - assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *\{'\\x66\\x6f\\x6f':0x0\};/); + assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *\{'foo':0x0\};/); }); it('should correct convert shorthand ES6 object expression to non-shorthand object expression', () => { @@ -41,7 +30,7 @@ describe('ObjectExpressionTransformer', () => { assert.match( obfuscationResult.getObfuscatedCode(), - /var *_0x[a-f0-9]{4,6} *= *\{'\\x61': *_0x[a-f0-9]{4,6}\, *'\\x62': *_0x[a-f0-9]{4,6}\};/ + /var *_0x[a-f0-9]{4,6} *= *\{'a': *_0x[a-f0-9]{4,6}\, *'b': *_0x[a-f0-9]{4,6}\};/ ); }); }); diff --git a/test/functional-tests/node-transformers/obfuscating-transformers/variable-declaration-transformer/VariableDeclarationTransformer.spec.ts b/test/functional-tests/node-transformers/obfuscating-transformers/variable-declaration-transformer/VariableDeclarationTransformer.spec.ts index bac583c1..4d3d6f94 100644 --- a/test/functional-tests/node-transformers/obfuscating-transformers/variable-declaration-transformer/VariableDeclarationTransformer.spec.ts +++ b/test/functional-tests/node-transformers/obfuscating-transformers/variable-declaration-transformer/VariableDeclarationTransformer.spec.ts @@ -17,8 +17,8 @@ describe('VariableDeclarationTransformer', () => { } ); - assert.match(obfuscationResult.getObfuscatedCode(), /var *_0x([a-f0-9]){4,6} *= *'\\x61\\x62\\x63';/); - assert.match(obfuscationResult.getObfuscatedCode(), /console\['\\x6c\\x6f\\x67'\]\(_0x([a-f0-9]){4,6}\);/); + assert.match(obfuscationResult.getObfuscatedCode(), /var *_0x([a-f0-9]){4,6} *= *'abc';/); + assert.match(obfuscationResult.getObfuscatedCode(), /console\['log'\]\(_0x([a-f0-9]){4,6}\);/); }); it('should not transform `variableDeclaration` node if parent block scope node is `Program` node', () => { @@ -30,7 +30,7 @@ describe('VariableDeclarationTransformer', () => { ); assert.match(obfuscationResult.getObfuscatedCode(), /var *test *= *0xa;/); - assert.match(obfuscationResult.getObfuscatedCode(), /console\['\\x6c\\x6f\\x67'\]\(test\);/); + assert.match(obfuscationResult.getObfuscatedCode(), /console\['log'\]\(test\);/); }); it('should transform variable call (`identifier` node) outside of block scope of node in which this variable was declared with `var` kind', () => { @@ -41,7 +41,7 @@ describe('VariableDeclarationTransformer', () => { } ); - assert.match(obfuscationResult.getObfuscatedCode(), /console\['\\x6c\\x6f\\x67'\]\(_0x([a-f0-9]){4,6}\);/); + assert.match(obfuscationResult.getObfuscatedCode(), /console\['log'\]\(_0x([a-f0-9]){4,6}\);/); }); it('should not transform variable call (`identifier` node) outside of block scope of node in which this variable was declared with `let` kind', () => { @@ -52,7 +52,7 @@ describe('VariableDeclarationTransformer', () => { } ); - assert.match(obfuscationResult.getObfuscatedCode(), /console\['\\x6c\\x6f\\x67'\]\(test\);/); + assert.match(obfuscationResult.getObfuscatedCode(), /console\['log'\]\(test\);/); }); describe(`variable calls before variable declaration`, () => { @@ -68,11 +68,11 @@ describe('VariableDeclarationTransformer', () => { }); it('should transform variable call (`identifier` node name) before variable declaration if this call is inside function body', () => { - assert.match(obfuscationResult.getObfuscatedCode(), /console\['\\x6c\\x6f\\x67'\]\(_0x([a-f0-9]){4,6}\['\\x69\\x74\\x65\\x6d'\]\);/); + assert.match(obfuscationResult.getObfuscatedCode(), /console\['log'\]\(_0x([a-f0-9]){4,6}\['item'\]\);/); }); it('should transform variable call (`identifier` node name) before variable declaration', () => { - assert.match(obfuscationResult.getObfuscatedCode(), /console\['\\x6c\\x6f\\x67'\]\(_0x([a-f0-9]){4,6}\);/); + assert.match(obfuscationResult.getObfuscatedCode(), /console\['log'\]\(_0x([a-f0-9]){4,6}\);/); }); }); @@ -90,9 +90,9 @@ describe('VariableDeclarationTransformer', () => { const innerFunctionParamIdentifierMatch: RegExpMatchArray|null = obfuscatedCode .match(/function _0x[a-f0-9]{4,6} *\((_0x[a-f0-9]{4,6})\) *\{/); const constructorIdentifierMatch: RegExpMatchArray|null = obfuscatedCode - .match(/console\['\\x6c\\x6f\\x67'\]\((_0x[a-f0-9]{4,6})\)/); + .match(/console\['log'\]\((_0x[a-f0-9]{4,6})\)/); const objectIdentifierMatch: RegExpMatchArray|null = obfuscatedCode - .match(/return\{'\\x74':(_0x[a-f0-9]{4,6})\}/); + .match(/return\{'t':(_0x[a-f0-9]{4,6})\}/); const variableDeclarationIdentifierMatch: RegExpMatchArray|null = obfuscatedCode .match(/var *(_0x[a-f0-9]{4,6});/); @@ -135,9 +135,9 @@ describe('VariableDeclarationTransformer', () => { const innerFunctionParamIdentifierMatch: RegExpMatchArray|null = obfuscatedCode .match(/function _0x[a-f0-9]{4,6} *\((_0x[a-f0-9]{4,6})\) *\{/); const constructorIdentifierMatch: RegExpMatchArray|null = obfuscatedCode - .match(/console\['\\x6c\\x6f\\x67'\]\((_0x[a-f0-9]{4,6})\)/); + .match(/console\['log'\]\((_0x[a-f0-9]{4,6})\)/); const objectIdentifierMatch: RegExpMatchArray|null = obfuscatedCode - .match(/return\{'\\x74':(_0x[a-f0-9]{4,6})\}/); + .match(/return\{'t':(_0x[a-f0-9]{4,6})\}/); const variableDeclarationIdentifierMatch: RegExpMatchArray|null = obfuscatedCode .match(/var *(_0x[a-f0-9]{4,6});/); @@ -175,7 +175,7 @@ describe('VariableDeclarationTransformer', () => { } ); - assert.match(obfuscationResult.getObfuscatedCode(), /var _0x([a-f0-9]){4,6} *= *\{'\\x74\\x65\\x73\\x74/); + assert.match(obfuscationResult.getObfuscatedCode(), /var _0x([a-f0-9]){4,6} *= *\{'test/); }); it('shouldn\'t replace computed member expression identifier', () => { @@ -186,7 +186,7 @@ describe('VariableDeclarationTransformer', () => { } ); - assert.match(obfuscationResult.getObfuscatedCode(), /_0x([a-f0-9]){4,6}\['\\x74\\x65\\x73\\x74'\]/); + assert.match(obfuscationResult.getObfuscatedCode(), /_0x([a-f0-9]){4,6}\['test'\]/); }); }); @@ -200,8 +200,8 @@ describe('VariableDeclarationTransformer', () => { const obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); it('shouldn\'t transform object pattern variable declarator', () => { - const objectPatternVariableDeclaratorMatch: RegExp = /var *\{ *bar *\} *= *\{ *'\\x62\\x61\\x72' *: *'\\x66\\x6f\\x6f' *\};/; - const variableUsageMatch: RegExp = /console\['\\x6c\\x6f\\x67'\]\(bar\);/; + const objectPatternVariableDeclaratorMatch: RegExp = /var *\{ *bar *\} *= *\{ *'bar' *: *'foo' *\};/; + const variableUsageMatch: RegExp = /console\['log'\]\(bar\);/; assert.match(obfuscatedCode, objectPatternVariableDeclaratorMatch); assert.match(obfuscatedCode, variableUsageMatch); @@ -218,7 +218,7 @@ describe('VariableDeclarationTransformer', () => { 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 variableUsageMatch: RegExp = /console\['log'\]\((_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]; diff --git a/test/index.spec.ts b/test/index.spec.ts index a6dab7f4..b731534c 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -35,9 +35,11 @@ import './functional-tests/node-transformers/control-flow-transformers/function- import './functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec'; import './functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec'; import './functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec'; +import './functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec'; import './functional-tests/node-transformers/converting-transformers/member-expression-transformer/MemberExpressionTransformer.spec'; import './functional-tests/node-transformers/converting-transformers/method-definition-transformer/MethodDefinitionTransformer.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/obfuscating-transformers/catch-clause-transformer/CatchClauseTransformer.spec'; import './functional-tests/node-transformers/obfuscating-transformers/function-declaration-transformer/FunctionDeclarationTransformer.spec'; import './functional-tests/node-transformers/obfuscating-transformers/function-transformer/FunctionTransformer.spec'; diff --git a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts b/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts index 5f7d7db4..b4f38865 100644 --- a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts +++ b/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts @@ -13,10 +13,11 @@ describe('JavaScriptObfuscator runtime eval', () => { const obfuscationResult1: IObfuscationResult = JavaScriptObfuscator.obfuscate( code, { - selfDefending: true, + controlFlowFlattening: true, + deadCodeInjection: true, debugProtection: true, - stringArrayEncoding: 'rc4', - controlFlowFlattening: true + selfDefending: true, + stringArrayEncoding: 'rc4' } ); diff --git a/test/unit-tests/node/node-utils/NodeUtils.spec.ts b/test/unit-tests/node/node-utils/NodeUtils.spec.ts index e30b26a4..06698ba4 100644 --- a/test/unit-tests/node/node-utils/NodeUtils.spec.ts +++ b/test/unit-tests/node/node-utils/NodeUtils.spec.ts @@ -24,6 +24,63 @@ describe('NodeUtils', () => { }); }); + describe('clone (astTree: T): T', () => { + let ifStatementNode1: ESTree.IfStatement, + ifStatementNode2: ESTree.IfStatement, + ifStatementBlockStatementNode1: ESTree.BlockStatement, + ifStatementBlockStatementNode2: ESTree.BlockStatement, + expressionStatementNode1: ESTree.ExpressionStatement, + expressionStatementNode2: ESTree.ExpressionStatement, + expressionStatementNode3: ESTree.ExpressionStatement, + expressionStatementNode4: ESTree.ExpressionStatement, + programNode1: ESTree.Program, + programNode2: ESTree.Program; + + beforeEach(() => { + // actual AST tree + expressionStatementNode1 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier')); + expressionStatementNode2 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier')); + + ifStatementBlockStatementNode1 = Nodes.getBlockStatementNode([ + expressionStatementNode1, + expressionStatementNode2 + ]); + + ifStatementNode1 = Nodes.getIfStatementNode( + Nodes.getLiteralNode(true), + ifStatementBlockStatementNode1 + ); + + programNode1 = Nodes.getProgramNode([ + ifStatementNode1 + ]); + + // expected AST tree + expressionStatementNode3 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier')); + expressionStatementNode4 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier')); + + ifStatementBlockStatementNode2 = Nodes.getBlockStatementNode([ + expressionStatementNode3, + expressionStatementNode4 + ]); + + ifStatementNode2 = Nodes.getIfStatementNode( + Nodes.getLiteralNode(true), + ifStatementBlockStatementNode2 + ); + + programNode2 = Nodes.getProgramNode([ + ifStatementNode2 + ]); + + programNode2 = NodeUtils.parentize(programNode2); + }); + + it('should clone given AST-tree', () => { + assert.deepEqual(NodeUtils.clone(programNode1), programNode2); + }); + }); + describe('convertCodeToStructure (code: string): ESTree.Node[]', () => { let code: string, identifierNode: ESTree.Identifier, @@ -309,7 +366,7 @@ describe('NodeUtils', () => { }); }); - describe('parentize (node: ESTree.Node): void', () => { + describe('parentize (astTree: T): T', () => { let ifStatementNode: ESTree.IfStatement, ifStatementBlockStatementNode: ESTree.BlockStatement, expressionStatementNode1: ESTree.ExpressionStatement, diff --git a/test/unit-tests/options/options-normalizer/OptionsNormalizer.spec.ts b/test/unit-tests/options/options-normalizer/OptionsNormalizer.spec.ts index d1605db4..4d605c4f 100644 --- a/test/unit-tests/options/options-normalizer/OptionsNormalizer.spec.ts +++ b/test/unit-tests/options/options-normalizer/OptionsNormalizer.spec.ts @@ -40,6 +40,62 @@ describe('OptionsNormalizer', () => { assert.deepEqual(getNormalizedOptions(optionsPreset), expectedOptionsPreset); }); + it('should normalize options preset: deadCodeInjectionRule', () => { + optionsPreset = { + ...DEFAULT_PRESET, + deadCodeInjection: true, + deadCodeInjectionThreshold: 0.4, + stringArray: false, + stringArrayThreshold: 0 + }; + + expectedOptionsPreset = { + ...DEFAULT_PRESET, + deadCodeInjection: true, + deadCodeInjectionThreshold: 0.4, + stringArray: true, + stringArrayThreshold: 0.75 + }; + + assert.deepEqual(getNormalizedOptions(optionsPreset), expectedOptionsPreset); + }); + + it('should normalize options preset: deadCodeInjectionRule. `stringArrayThreshold` option is not empty', () => { + optionsPreset = { + ...DEFAULT_PRESET, + deadCodeInjection: true, + deadCodeInjectionThreshold: 0.4, + stringArray: false, + stringArrayThreshold: 0.5 + }; + + expectedOptionsPreset = { + ...DEFAULT_PRESET, + deadCodeInjection: true, + deadCodeInjectionThreshold: 0.4, + stringArray: true, + stringArrayThreshold: 0.5 + }; + + assert.deepEqual(getNormalizedOptions(optionsPreset), expectedOptionsPreset); + }); + + it('should normalize options preset: deadCodeInjectionThresholdRule', () => { + optionsPreset = { + ...DEFAULT_PRESET, + deadCodeInjection: true, + deadCodeInjectionThreshold: 0 + }; + + expectedOptionsPreset = { + ...DEFAULT_PRESET, + deadCodeInjection: false, + deadCodeInjectionThreshold: 0 + }; + + assert.deepEqual(getNormalizedOptions(optionsPreset), expectedOptionsPreset); + }); + it('should normalize options preset: domainLockRule', () => { optionsPreset = { ...DEFAULT_PRESET, diff --git a/tsconfig.json b/tsconfig.json index e214bc82..e3afddb6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,19 +1,19 @@ { "compilerOptions": { - "target": "ES6", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, "lib": [ "es2017", "DOM" ], - "noEmitHelpers": true, - "importHelpers": true, "module": "commonjs", - "sourceMap": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, + "noEmitHelpers": true, + "noImplicitThis": false, + "noUnusedLocals": true, "removeComments": true, - "noImplicitAny": true, - "strictNullChecks": true, - "noUnusedLocals": true + "sourceMap": true, + "strict": true, + "target": "ES6" } } \ No newline at end of file diff --git a/tslint.json b/tslint.json index 4fff2ded..f4e4eac0 100644 --- a/tslint.json +++ b/tslint.json @@ -63,15 +63,18 @@ "no-inferrable-types": false, "no-internal-module": true, "no-invalid-this": true, + "no-misused-new": true, "no-null-keyword": false, "no-parameter-properties": true, "no-reference": true, + "no-reference-import": true, "no-require-imports": false, "no-shadowed-variable": true, "no-string-literal": true, "no-string-throw": true, "no-switch-case-fall-through": false, "no-trailing-whitespace": false, + "no-unnecessary-callback-wrapper": true, "no-unused-expression": true, "no-use-before-declare": true, "no-var-keyword": true, @@ -86,7 +89,9 @@ "check-whitespace" ], "one-variable-per-declaration": false, + "only-arrow-functions": [true, "allow-declarations"], "prefer-const": true, + "prefer-template": true, "quotemark": false, "radix": true, "semicolon": [true, "always"], diff --git a/webpack.config.js b/webpack.config.js index 2b198e89..84d20b8c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -23,7 +23,7 @@ module.exports = { enforce: 'pre', test: /\.ts$/, loader: 'tslint-loader', - exclude: /(node_modules)/, + exclude: /(node_modules)/ }, { test: /\.ts(x?)$/, @@ -49,7 +49,7 @@ module.exports = { new CheckerPlugin() ], output: { - path: './dist', + path: __dirname + '/dist', filename: '[name].js', libraryTarget: "commonjs2", library: "JavaScriptObfuscator" diff --git a/yarn.lock b/yarn.lock index 3576d3ce..77cfcc66 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,13 +2,13 @@ # yarn lockfile v1 -"@types/chai@3.4.35": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-3.4.35.tgz#e8d65f83492d2944f816fc620741821c28a8c900" +"@types/chai@3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-3.5.2.tgz#c11cd2817d3a401b7ba0f5a420f35c56139b1c1e" -"@types/chance@0.7.31": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/chance/-/chance-0.7.31.tgz#8dcd812456a261bb4d832243b85ebc5c68e28c80" +"@types/chance@0.7.33": + version "0.7.33" + resolved "https://registry.yarnpkg.com/@types/chance/-/chance-0.7.33.tgz#9666ae5c8f602a14a67e5b608dabf1a7853a1e28" "@types/commander@2.3.31": version "2.3.31" @@ -32,25 +32,29 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@0.0.34": - version "0.0.34" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.34.tgz#aa7af69a3a91922171ee411b3c9d8f6beb4af321" +"@types/estree@*", "@types/estree@0.0.35": + version "0.0.35" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.35.tgz#8999974b34028686a8d61a719e61c138d3755107" "@types/mkdirp@0.3.29": version "0.3.29" resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.3.29.tgz#7f2ad7ec55f914482fc9b1ec4bb1ae6028d46066" -"@types/mocha@2.2.39": - version "2.2.39" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.39.tgz#f68d63db8b69c38e9558b4073525cf96c4f7a829" +"@types/mocha@2.2.41": + version "2.2.41" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.41.tgz#e27cf0817153eb9f2713b2d3f6c68f1e1c3ca608" -"@types/node@*", "@types/node@7.0.5": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.5.tgz#96a0f0a618b7b606f1ec547403c00650210bfbb7" +"@types/node@*": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.15.tgz#628429289604c5f7e56c13f3a0422f3e59df1a17" -"@types/sinon@1.16.35": - version "1.16.35" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-1.16.35.tgz#ee687cc42d1a79448256f1c012a33a0840e85c5c" +"@types/node@7.0.16": + version "7.0.16" + resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.16.tgz#e3440e3ce4d4931616ac418cc4dc16cd94b80092" + +"@types/sinon@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-2.2.1.tgz#93d8e623c3fafc08d5cddb990c4f14e8040cbbc9" "@types/string-template@1.0.2": version "1.0.2" @@ -66,10 +70,14 @@ acorn-dynamic-import@^2.0.0: dependencies: acorn "^4.0.3" -acorn@^4.0.3, acorn@^4.0.4: +acorn@^4.0.3: version "4.0.11" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" +acorn@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" + ajv-keywords@^1.1.1: version "1.5.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" @@ -93,12 +101,6 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" -ansi-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" - dependencies: - string-width "^1.0.1" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -107,10 +109,6 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -any-promise@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - anymatch@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" @@ -203,25 +201,21 @@ async@^2.1.2, async@^2.1.4: dependencies: lodash "^4.14.0" -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" -awesome-typescript-loader@3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/awesome-typescript-loader/-/awesome-typescript-loader-3.0.8.tgz#1cd13f3cfd7c0a23c7226c629b1a3b818b9e4bb1" +awesome-typescript-loader@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/awesome-typescript-loader/-/awesome-typescript-loader-3.1.3.tgz#7eb41dfb136c2ea0e099bef038dc70c45f810223" dependencies: colors "^1.1.2" enhanced-resolve "^3.1.0" - loader-utils "^1.0.2" + loader-utils "^1.1.0" lodash "^4.17.4" mkdirp "^0.5.1" object-assign "^4.1.1" - source-map-support "^0.4.11" + source-map-support "^0.4.15" aws-sign2@~0.6.0: version "0.6.0" @@ -231,13 +225,13 @@ aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-cli@6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.23.0.tgz#52ff946a2b0f64645c35e7bd5eea267aa0948c0f" +babel-cli@6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" dependencies: - babel-core "^6.23.0" + babel-core "^6.24.1" babel-polyfill "^6.23.0" - babel-register "^6.23.0" + babel-register "^6.24.1" babel-runtime "^6.22.0" commander "^2.8.1" convert-source-map "^1.1.0" @@ -252,7 +246,7 @@ babel-cli@6.23.0: optionalDependencies: chokidar "^1.6.1" -babel-code-frame@^6.20.0, babel-code-frame@^6.22.0: +babel-code-frame@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" dependencies: @@ -260,19 +254,19 @@ babel-code-frame@^6.20.0, babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.0" -babel-core@^6.23.0: - version "6.23.1" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.23.1.tgz#c143cb621bb2f621710c220c5d579d15b8a442df" +babel-core@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" dependencies: babel-code-frame "^6.22.0" - babel-generator "^6.23.0" - babel-helpers "^6.23.0" + babel-generator "^6.24.1" + babel-helpers "^6.24.1" babel-messages "^6.23.0" - babel-register "^6.23.0" + babel-register "^6.24.1" babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.1" - babel-types "^6.23.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" babylon "^6.11.0" convert-source-map "^1.1.0" debug "^2.1.1" @@ -284,102 +278,101 @@ babel-core@^6.23.0: slash "^1.0.0" source-map "^0.5.0" -babel-generator@^6.18.0, babel-generator@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.23.0.tgz#6b8edab956ef3116f79d8c84c5a3c05f32a74bc5" +babel-generator@^6.18.0, babel-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" dependencies: babel-messages "^6.23.0" babel-runtime "^6.22.0" - babel-types "^6.23.0" + babel-types "^6.24.1" detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.2.0" source-map "^0.5.0" trim-right "^1.0.1" -babel-helper-call-delegate@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz#119921b56120f17e9dae3f74b4f5cc7bcc1b37ef" +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" dependencies: - babel-helper-hoist-variables "^6.22.0" + babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" - babel-traverse "^6.22.0" - babel-types "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-define-map@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz#1444f960c9691d69a2ced6a205315f8fd00804e7" +babel-helper-define-map@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" dependencies: - babel-helper-function-name "^6.23.0" + babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" - babel-types "^6.23.0" + babel-types "^6.24.1" lodash "^4.2.0" -babel-helper-function-name@^6.22.0, babel-helper-function-name@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz#25742d67175c8903dbe4b6cb9d9e1fcb8dcf23a6" +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" dependencies: - babel-helper-get-function-arity "^6.22.0" + babel-helper-get-function-arity "^6.24.1" babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-get-function-arity@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz#0beb464ad69dc7347410ac6ade9f03a50634f5ce" +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" dependencies: babel-runtime "^6.22.0" - babel-types "^6.22.0" + babel-types "^6.24.1" -babel-helper-hoist-variables@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz#3eacbf731d80705845dd2e9718f600cfb9b4ba72" +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" dependencies: babel-runtime "^6.22.0" - babel-types "^6.22.0" + babel-types "^6.24.1" -babel-helper-optimise-call-expression@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz#f3ee7eed355b4282138b33d02b78369e470622f5" +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" dependencies: babel-runtime "^6.22.0" - babel-types "^6.23.0" + babel-types "^6.24.1" -babel-helper-regex@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz#79f532be1647b1f0ee3474b5f5c3da58001d247d" +babel-helper-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" dependencies: babel-runtime "^6.22.0" - babel-types "^6.22.0" + babel-types "^6.24.1" lodash "^4.2.0" -babel-helper-replace-supers@^6.22.0, babel-helper-replace-supers@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz#eeaf8ad9b58ec4337ca94223bacdca1f8d9b4bfd" +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" dependencies: - babel-helper-optimise-call-expression "^6.23.0" + babel-helper-optimise-call-expression "^6.24.1" babel-messages "^6.23.0" babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helpers@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.23.0.tgz#4f8f2e092d0b6a8808a4bde79c27f1e2ecf0d992" +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" dependencies: babel-runtime "^6.22.0" - babel-template "^6.23.0" + babel-template "^6.24.1" -babel-loader@6.3.2: - version "6.3.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.3.2.tgz#18de4566385578c1b4f8ffe6cbc668f5e2a5ef03" +babel-loader@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.0.0.tgz#2e43a66bee1fff4470533d0402c8a4532fafbaf7" dependencies: find-cache-dir "^0.1.1" - loader-utils "^0.2.16" + loader-utils "^1.0.2" mkdirp "^0.5.1" - object-assign "^4.0.1" babel-messages@^6.23.0: version "6.23.0" @@ -409,36 +402,36 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-block-scoping@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz#e48895cf0b375be148cd7c8879b422707a053b51" +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" dependencies: babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" lodash "^4.2.0" -babel-plugin-transform-es2015-classes@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz#49b53f326202a2fd1b3bbaa5e2edd8a4f78643c1" +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" dependencies: - babel-helper-define-map "^6.23.0" - babel-helper-function-name "^6.23.0" - babel-helper-optimise-call-expression "^6.23.0" - babel-helper-replace-supers "^6.23.0" + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" babel-messages "^6.23.0" babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz#7c383e9629bba4820c11b0425bdd6290f7f057e7" +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" dependencies: babel-runtime "^6.22.0" - babel-template "^6.22.0" + babel-template "^6.24.1" babel-plugin-transform-es2015-destructuring@^6.22.0: version "6.23.0" @@ -446,12 +439,12 @@ babel-plugin-transform-es2015-destructuring@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz#672397031c21610d72dd2bbb0ba9fb6277e1c36b" +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" dependencies: babel-runtime "^6.22.0" - babel-types "^6.22.0" + babel-types "^6.24.1" babel-plugin-transform-es2015-for-of@^6.22.0: version "6.23.0" @@ -459,13 +452,13 @@ babel-plugin-transform-es2015-for-of@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.22.0.tgz#f5fcc8b09093f9a23c76ac3d9e392c3ec4b77104" +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" dependencies: - babel-helper-function-name "^6.22.0" + babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" - babel-types "^6.22.0" + babel-types "^6.24.1" babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" @@ -473,63 +466,63 @@ babel-plugin-transform-es2015-literals@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-modules-amd@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.22.0.tgz#bf69cd34889a41c33d90dfb740e0091ccff52f21" +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" babel-runtime "^6.22.0" - babel-template "^6.22.0" + babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-commonjs@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.23.0.tgz#cba7aa6379fb7ec99250e6d46de2973aaffa7b92" +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" dependencies: - babel-plugin-transform-strict-mode "^6.22.0" + babel-plugin-transform-strict-mode "^6.24.1" babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-types "^6.23.0" + babel-template "^6.24.1" + babel-types "^6.24.1" -babel-plugin-transform-es2015-modules-systemjs@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz#ae3469227ffac39b0310d90fec73bfdc4f6317b0" +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" dependencies: - babel-helper-hoist-variables "^6.22.0" + babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" - babel-template "^6.23.0" + babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-umd@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.23.0.tgz#8d284ae2e19ed8fe21d2b1b26d6e7e0fcd94f0f1" +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" dependencies: - babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" babel-runtime "^6.22.0" - babel-template "^6.23.0" + babel-template "^6.24.1" -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz#daa60e114a042ea769dd53fe528fc82311eb98fc" +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" dependencies: - babel-helper-replace-supers "^6.22.0" + babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" -babel-plugin-transform-es2015-parameters@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz#3a2aabb70c8af945d5ce386f1a4250625a83ae3b" +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" dependencies: - babel-helper-call-delegate "^6.22.0" - babel-helper-get-function-arity "^6.22.0" + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz#8ba776e0affaa60bff21e921403b8a652a2ff723" +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" dependencies: babel-runtime "^6.22.0" - babel-types "^6.22.0" + babel-types "^6.24.1" babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" @@ -537,13 +530,13 @@ babel-plugin-transform-es2015-spread@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz#ab316829e866ee3f4b9eb96939757d19a5bc4593" +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" dependencies: - babel-helper-regex "^6.22.0" + babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" - babel-types "^6.22.0" + babel-types "^6.24.1" babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" @@ -557,26 +550,26 @@ babel-plugin-transform-es2015-typeof-symbol@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz#8d9cc27e7ee1decfe65454fb986452a04a613d20" +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" dependencies: - babel-helper-regex "^6.22.0" + babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" regexpu-core "^2.0.0" -babel-plugin-transform-regenerator@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz#65740593a319c44522157538d690b84094617ea6" +babel-plugin-transform-regenerator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" dependencies: - regenerator-transform "0.9.8" + regenerator-transform "0.9.11" -babel-plugin-transform-strict-mode@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz#e008df01340fdc87e959da65991b7e05970c8c7c" +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" dependencies: babel-runtime "^6.22.0" - babel-types "^6.22.0" + babel-types "^6.24.1" babel-polyfill@^6.23.0: version "6.23.0" @@ -586,40 +579,40 @@ babel-polyfill@^6.23.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" -babel-preset-es2015@6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.22.0.tgz#af5a98ecb35eb8af764ad8a5a05eb36dc4386835" +babel-preset-es2015@6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-transform-es2015-arrow-functions "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.22.0" - babel-plugin-transform-es2015-classes "^6.22.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" babel-plugin-transform-es2015-destructuring "^6.22.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" babel-plugin-transform-es2015-for-of "^6.22.0" - babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.22.0" - babel-plugin-transform-es2015-modules-systemjs "^6.22.0" - babel-plugin-transform-es2015-modules-umd "^6.22.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.22.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" babel-plugin-transform-es2015-template-literals "^6.22.0" babel-plugin-transform-es2015-typeof-symbol "^6.22.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" -babel-register@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.23.0.tgz#c9aa3d4cca94b51da34826c4a0f9e08145d74ff3" +babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" dependencies: - babel-core "^6.23.0" + babel-core "^6.24.1" babel-runtime "^6.22.0" core-js "^2.4.0" home-or-tmp "^2.0.0" @@ -634,33 +627,33 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" -babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638" +babel-template@^6.16.0, babel-template@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" dependencies: babel-runtime "^6.22.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" babylon "^6.11.0" lodash "^4.2.0" -babel-traverse@^6.18.0, babel-traverse@^6.22.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1: - version "6.23.1" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48" +babel-traverse@^6.18.0, babel-traverse@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" dependencies: babel-code-frame "^6.22.0" babel-messages "^6.23.0" babel-runtime "^6.22.0" - babel-types "^6.23.0" + babel-types "^6.24.1" babylon "^6.15.0" debug "^2.2.0" globals "^9.0.0" invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" +babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" dependencies: babel-runtime "^6.22.0" esutils "^2.0.2" @@ -709,18 +702,6 @@ boom@2.x.x: dependencies: hoek "2.x.x" -boxen@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.0.0.tgz#b2694baf1f605f708ff0177c12193b22f29aaaab" - dependencies: - ansi-align "^1.1.0" - camelcase "^4.0.0" - chalk "^1.1.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^0.1.0" - widest-line "^1.0.0" - brace-expansion@^1.0.0: version "1.1.6" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" @@ -827,14 +808,6 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" -camelcase@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.0.0.tgz#8b0f90d44be5e281b903b9887349b92595ef07f2" - -capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" - caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" @@ -846,18 +819,18 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chai@4.0.0-canary.1: - version "4.0.0-canary.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.0.0-canary.1.tgz#f4b5f24a4064795c4efac271bc85ce9f69c9f467" +chai@4.0.0-canary.2: + version "4.0.0-canary.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.0.0-canary.2.tgz#a017f59d3ed2d64795c91a51b5034e41b873da87" dependencies: assertion-error "^1.0.1" check-error "^1.0.1" - deep-eql "^1.0.3" - get-func-name "^1.0.0" + deep-eql "^2.0.1" + get-func-name "^2.0.0" pathval "^1.0.0" type-detect "^4.0.0" -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1: +chalk@^1.1.0, chalk@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -867,9 +840,9 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" -chance@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/chance/-/chance-1.0.6.tgz#4734f62d02b738cdc2882d8b5d41f89af49e7bfd" +chance@1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/chance/-/chance-1.0.8.tgz#201af737c757ef049346ca7ed6a64cdfbd217e41" check-error@^1.0.1: version "1.0.2" @@ -896,15 +869,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1: dependencies: inherits "^2.0.1" -class-validator@0.6.8: - version "0.6.8" - resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.6.8.tgz#af34fa10f99ecb86679d291d73ef8076d9ab8b95" +class-validator@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.7.0.tgz#a45b96aaa2154d06efda1cac1061b0adf69ea55e" dependencies: - validator ">=5.0.0" - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + validator "^7.0.0" cliui@^2.1.0: version "2.1.0" @@ -954,17 +923,6 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -configstore@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.0.0.tgz#e1b8669c1803ccc50b545e92f8e6e79aa80e0196" - dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - unique-string "^1.0.0" - write-file-atomic "^1.1.2" - xdg-basedir "^3.0.0" - console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" @@ -991,9 +949,9 @@ core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" -coveralls@2.11.16: - version "2.11.16" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.11.16.tgz#da9061265142ddee954f68379122be97be8ab4b1" +coveralls@2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.13.1.tgz#d70bb9acc1835ec4f063ff9dac5423c17b11f178" dependencies: js-yaml "3.6.1" lcov-parse "0.0.10" @@ -1008,12 +966,6 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - dependencies: - capture-stack-trace "^1.0.0" - create-hash@^1.1.0, create-hash@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.2.tgz#51210062d7bb7479f6c65bb41a92208b1d61abad" @@ -1030,13 +982,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.2: create-hash "^1.1.0" inherits "^2.0.1" -cross-spawn-async@^2.1.1: - version "2.2.5" - resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" - dependencies: - lru-cache "^4.0.0" - which "^1.2.8" - cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -1058,10 +1003,6 @@ crypto-browserify@^3.11.0: public-encrypt "^4.0.0" randombytes "^2.0.0" -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -1072,7 +1013,13 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@2.2.0, debug@^2.1.1, debug@^2.2.0, debug@~2.2.0: +debug@2.6.0, debug@^2.1.1, debug@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" + dependencies: + ms "0.7.2" + +debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: @@ -1082,9 +1029,9 @@ decamelize@^1.0.0, decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" -deep-eql@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-1.0.3.tgz#8030fe56a2b0e62ebb9217cc23d095c656915b08" +deep-eql@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-2.0.1.tgz#2d5e54d261d24672a2bcedc9b6f1937fba258bc2" dependencies: type-detect "^3.0.0" @@ -1092,7 +1039,7 @@ deep-extend@~0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" -deep-is@~0.1.3: +deep-is@~0.1.2, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -1123,11 +1070,7 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -diff@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" - -diff@^3.0.1, diff@^3.1.0: +diff@3.2.0, diff@^3.1.0, diff@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" @@ -1143,16 +1086,6 @@ domain-browser@^1.1.1: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" -dot-prop@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" - dependencies: - is-obj "^1.0.0" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -1211,6 +1144,35 @@ escodegen-wallaby@1.6.11: optionalDependencies: source-map "~0.2.0" +escodegen@~1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.3.3.tgz#f024016f5a88e046fd12005055e939802e6c5f23" + dependencies: + esprima "~1.1.1" + estraverse "~1.5.0" + esutils "~1.0.0" + optionalDependencies: + source-map "~0.1.33" + +escope@~1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escope/-/escope-1.0.3.tgz#759dce8496c4248fec2d0caaf4108bcf3f1a7f5d" + dependencies: + estraverse "^2.0.0" + +esmangle@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esmangle/-/esmangle-1.0.1.tgz#d9bb37b8f8eafbf4e6d4ed6b7aa2956abbd3c4c2" + dependencies: + escodegen "~1.3.2" + escope "~1.0.1" + esprima "~1.1.1" + esshorten "~1.1.0" + estraverse "~1.5.0" + esutils "~ 1.0.0" + optionator "~0.3.0" + source-map "~0.1.33" + esprima@3.1.3, esprima@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -1219,6 +1181,18 @@ esprima@^2.6.0, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" +esprima@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.1.1.tgz#5b6f1547f4d102e670e140c509be6771d6aeb549" + +esshorten@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/esshorten/-/esshorten-1.1.1.tgz#174f96b7cc267e46872d814e7db7c290bdff61a9" + dependencies: + escope "~1.0.1" + estraverse "~4.1.1" + esutils "~2.0.2" + estraverse@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -1227,10 +1201,26 @@ estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" -esutils@^2.0.2: +estraverse@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-2.0.0.tgz#5ae46963243600206674ccb24a09e16674fcdca1" + +estraverse@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71" + +estraverse@~4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" + +esutils@^2.0.2, esutils@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" +"esutils@~ 1.0.0", esutils@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.0.0.tgz#8151d358e20c8acc7fb745e7472c0025fe496570" + events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -1241,17 +1231,6 @@ evp_bytestokey@^1.0.0: dependencies: create-hash "^1.1.1" -execa@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" - dependencies: - cross-spawn-async "^2.1.1" - is-stream "^1.1.0" - npm-run-path "^1.0.0" - object-assign "^4.0.1" - path-key "^1.0.0" - strip-eof "^1.0.0" - expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -1278,6 +1257,10 @@ extsprintf@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" +fast-levenshtein@~1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz#0178dcdee023b92905193af0959e8a7639cfdcb9" + fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" @@ -1411,13 +1394,9 @@ get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" -get-func-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-1.0.0.tgz#d64e38da8e45acb746726049f36bef89ebfa91c2" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" getpass@^0.1.1: version "0.1.6" @@ -1438,9 +1417,9 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" +glob@7.1.1, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1449,9 +1428,9 @@ glob@7.0.5: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" +glob@^7.0.0: + version "7.0.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1474,23 +1453,7 @@ globals@^9.0.0: version "9.16.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.16.0.tgz#63e903658171ec2d9f51b1d31de5e2b8dc01fb80" -got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: +graceful-fs@^4.1.2, graceful-fs@^4.1.4: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -1589,10 +1552,6 @@ ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -1626,9 +1585,9 @@ invariant@^2.2.0: dependencies: loose-envify "^1.0.0" -inversify@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/inversify/-/inversify-3.1.0.tgz#820571ddf52e7d8f875a5de15de3468319b86f80" +inversify@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/inversify/-/inversify-4.1.0.tgz#e2fef98ebd7c754846d419857f412432125b4ee9" invert-kv@^1.0.0: version "1.0.0" @@ -1684,10 +1643,6 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -1703,20 +1658,12 @@ is-my-json-valid@^2.12.4: jsonpointer "^4.0.0" xtend "^4.0.0" -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - is-number@^2.0.2, is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" dependencies: kind-of "^3.0.2" -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -1729,18 +1676,6 @@ is-property@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - -is-retry-allowed@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - -is-stream@^1.0.0, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -1906,7 +1841,7 @@ json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^0.5.0: +json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -1932,20 +1867,10 @@ kind-of@^3.0.2: dependencies: is-buffer "^1.0.2" -latest-version@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.0.0.tgz#3104f008c0c391084107f85a344bc61e38970649" - dependencies: - package-json "^3.0.0" - lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" -lazy-req@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4" - lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -1956,6 +1881,13 @@ lcov-parse@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" +levn@~0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.2.5.tgz#ba8d339d0ca4a610e3a3f145b9caf48807155054" + dependencies: + prelude-ls "~1.1.0" + type-check "~0.3.1" + levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -1986,9 +1918,9 @@ loader-utils@^0.2.16: json5 "^0.5.0" object-assign "^4.0.1" -loader-utils@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.0.2.tgz#a9f923c865a974623391a8602d031137fad74830" +loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" dependencies: big.js "^3.1.3" emojis-list "^2.0.0" @@ -2063,17 +1995,6 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0" -lowercase-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - -lru-cache@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" - dependencies: - pseudomap "^1.0.1" - yallist "^2.0.0" - make-error@^1.1.1: version "1.2.2" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.2.2.tgz#e4e270e474f642cca20fa126fe441163957832ef" @@ -2142,22 +2063,22 @@ minimist@1.2.0, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" -mocha@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" +mocha@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.3.0.tgz#d29b7428d3f52c82e2e65df1ecb7064e1aabbfb5" dependencies: browser-stdout "1.3.0" commander "2.9.0" - debug "2.2.0" - diff "1.4.0" + debug "2.6.0" + diff "3.2.0" escape-string-regexp "1.0.5" - glob "7.0.5" + glob "7.1.1" growl "1.9.2" json3 "3.3.2" lodash.create "3.1.1" @@ -2168,6 +2089,10 @@ ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + nan@^2.3.0: version "2.5.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2" @@ -2237,12 +2162,6 @@ normalize-path@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" -npm-run-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" - dependencies: - path-key "^1.0.0" - npmlog@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" @@ -2301,6 +2220,17 @@ optionator@^0.8.1: type-check "~0.3.2" wordwrap "~1.0.0" +optionator@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.3.0.tgz#9715a8b5f5e7586cff06c8249e039cd7364d3f54" + dependencies: + deep-is "~0.1.2" + fast-levenshtein "~1.0.0" + levn "~0.2.4" + prelude-ls "~1.1.0" + type-check "~0.3.1" + wordwrap "~0.0.2" + os-browserify@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" @@ -2327,15 +2257,6 @@ output-file-sync@^1.1.0: mkdirp "^0.5.1" object-assign "^4.1.0" -package-json@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-3.1.0.tgz#ce281900fe8052150cc6709c6c006c18fdb2f379" - dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -2379,10 +2300,6 @@ path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-key@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" - path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" @@ -2421,7 +2338,7 @@ pinkie-promise@^2.0.0: dependencies: pinkie "^2.0.0" -pinkie@^2.0.0, pinkie@^2.0.4: +pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" @@ -2431,14 +2348,10 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" -prelude-ls@~1.1.2: +prelude-ls@~1.1.0, prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" @@ -2459,10 +2372,6 @@ prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" -pseudomap@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - public-encrypt@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" @@ -2504,7 +2413,7 @@ randombytes@^2.0.0, randombytes@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec" -rc@^1.0.1, rc@^1.1.6, rc@~1.1.6: +rc@~1.1.6: version "1.1.7" resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.7.tgz#c5ea564bb07aff9fd3a5b32e906c1d3a65940fea" dependencies: @@ -2573,9 +2482,9 @@ regenerator-runtime@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e" -regenerator-transform@0.9.8: - version "0.9.8" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c" +regenerator-transform@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" dependencies: babel-runtime "^6.18.0" babel-types "^6.19.0" @@ -2596,18 +2505,6 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -registry-auth-token@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.1.0.tgz#997c08256e0c7999837b90e944db39d8a790276b" - dependencies: - rc "^1.1.6" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - dependencies: - rc "^1.0.1" - regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -2665,9 +2562,9 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" -resolve@^1.1.7: - version "1.3.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.2.tgz#1f0442c9e0cbb8136e87b9305f932f46c7f28235" +resolve@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" dependencies: path-parse "^1.0.5" @@ -2693,21 +2590,11 @@ ripemd160@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e" -safe-buffer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" - samsam@1.x, samsam@^1.1.3: version "1.2.1" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.2.1.tgz#edd39093a3184370cb859243b2bdf255e7d8ea67" -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - dependencies: - semver "^5.0.3" - -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -2733,9 +2620,9 @@ signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" -sinon@2.0.0-pre.6: - version "2.0.0-pre.6" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.0.0-pre.6.tgz#77f81af452b9fa1ddb296aa799c98bb11852e2db" +sinon@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.2.0.tgz#3b1b42ff5defcbf51a52a62aca6d61171b9fd262" dependencies: diff "^3.1.0" formatio "1.2.0" @@ -2750,25 +2637,21 @@ slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" dependencies: hoek "2.x.x" -source-list-map@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" +source-list-map@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.1.tgz#1a33ac210ca144d1e561f906ebccab5669ff4cb4" -source-map-support@0.4.11, source-map-support@^0.4.0, source-map-support@^0.4.11, source-map-support@^0.4.2: - version "0.4.11" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.11.tgz#647f939978b38535909530885303daf23279f322" +source-map-support@0.4.15, source-map-support@^0.4.0, source-map-support@^0.4.15, source-map-support@^0.4.2: + version "0.4.15" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" dependencies: - source-map "^0.5.3" + source-map "^0.5.6" source-map@^0.4.4: version "0.4.4" @@ -2776,10 +2659,16 @@ source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1, source-map@~0.5.3: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@~0.1.33: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" @@ -2848,13 +2737,6 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" - string_decoder@^0.10.25, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -2875,9 +2757,9 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: version "2.0.1" @@ -2918,20 +2800,10 @@ tar@~2.2.1: fstream "^1.0.2" inherits "2" -term-size@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" - dependencies: - execa "^0.4.0" - text-encoding@0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" -timed-out@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - timers-browserify@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" @@ -2956,9 +2828,9 @@ trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" -ts-node@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-2.1.0.tgz#aa2bf4b2e25c5fb6a7c54701edc3666d3a9db25d" +ts-node@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-3.0.3.tgz#2ffa0f371915cc8aa13b78ea42b4c0de42aeb0d5" dependencies: arrify "^1.0.0" chalk "^1.1.1" @@ -2966,29 +2838,25 @@ ts-node@2.1.0: make-error "^1.1.1" minimist "^1.2.0" mkdirp "^0.5.1" - pinkie "^2.0.4" source-map-support "^0.4.0" - tsconfig "^5.0.2" + tsconfig "^6.0.0" v8flags "^2.0.11" - xtend "^4.0.0" yn "^1.2.0" -tsconfig@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-5.0.3.tgz#5f4278e701800967a8fc383fd19648878f2a6e3a" +tsconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-6.0.0.tgz#6b0e8376003d7af1864f8df8f89dd0059ffcd032" dependencies: - any-promise "^1.3.0" - parse-json "^2.2.0" - strip-bom "^2.0.0" + strip-bom "^3.0.0" strip-json-comments "^2.0.0" -tslib@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.6.0.tgz#cf36c93e02ae86a20fc131eae511162b869a6652" +tslib@1.6.1, tslib@^1.6.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.6.1.tgz#b77b09abc5fa4935e157d838b80e36dad47152c4" -tslint-loader@3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/tslint-loader/-/tslint-loader-3.4.3.tgz#ac1eaf57d35eff383d0b008fa67b0813e8b51c54" +tslint-loader@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/tslint-loader/-/tslint-loader-3.5.3.tgz#343f74122d94f356b689457d3f59f64a69ab606f" dependencies: loader-utils "^1.0.2" mkdirp "^0.5.1" @@ -2996,23 +2864,24 @@ tslint-loader@3.4.3: rimraf "^2.4.4" semver "^5.3.0" -tslint@4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-4.5.1.tgz#05356871bef23a434906734006fc188336ba824b" +tslint@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.2.0.tgz#16a2addf20cb748385f544e9a0edab086bc34114" dependencies: - babel-code-frame "^6.20.0" + babel-code-frame "^6.22.0" colors "^1.1.2" - diff "^3.0.1" + diff "^3.2.0" findup-sync "~0.3.0" glob "^7.1.1" optimist "~0.6.0" - resolve "^1.1.7" - tsutils "^1.1.0" - update-notifier "^2.0.0" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.6.0" + tsutils "^1.8.0" -tsutils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.1.0.tgz#94e0c267624eeb1b63561ba8ec0bcff71b4e2872" +tsutils@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.8.0.tgz#bf8118ed8e80cd5c9fc7d75728c7963d44ed2f52" tty-browserify@0.0.0: version "0.0.0" @@ -3026,7 +2895,7 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" -type-check@~0.3.2: +type-check@~0.3.1, type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" dependencies: @@ -3040,18 +2909,18 @@ type-detect@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.0.tgz#62053883542a321f2f7b25746dc696478b18ff6b" -typescript@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.2.0.tgz#626f2fc70087d2480f21ebb12c1888288c8614e3" +typescript@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.2.tgz#f0f045e196f69a72f06b25fd3bd39d01c3ce9984" -uglify-js@^2.6, uglify-js@^2.7.5: - version "2.8.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.4.tgz#5aeb6fd6f1f0a672dea63795016590502c290513" +uglify-js@^2.6, uglify-js@^2.8.5: + version "2.8.15" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.15.tgz#835dd4cd5872554756e6874508d0d0561704d94d" dependencies: - async "~0.2.6" source-map "~0.5.1" - uglify-to-browserify "~1.0.0" yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" uglify-to-browserify@~1.0.0: version "1.0.2" @@ -3061,35 +2930,6 @@ uid-number@~0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - dependencies: - crypto-random-string "^1.0.0" - -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - -update-notifier@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" - dependencies: - boxen "^1.0.0" - chalk "^1.0.0" - configstore "^3.0.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - lazy-req "^2.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - dependencies: - prepend-http "^1.0.1" - url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -3128,7 +2968,7 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" -validator@>=5.0.0: +validator@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/validator/-/validator-7.0.0.tgz#c74deb8063512fac35547938e6f0b1504a282fd2" @@ -3144,7 +2984,7 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" -watchpack@^1.2.0: +watchpack@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87" dependencies: @@ -3156,18 +2996,18 @@ webpack-node-externals@1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-1.5.4.tgz#ea05ba17108a23e776c35c42e7bb0e86c225be00" -webpack-sources@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.4.tgz#ccc2c817e08e5fa393239412690bb481821393cd" +webpack-sources@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb" dependencies: - source-list-map "~0.1.7" + source-list-map "^1.1.1" source-map "~0.5.3" -webpack@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.2.1.tgz#7bb1d72ae2087dd1a4af526afec15eed17dda475" +webpack@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.5.0.tgz#5a17089f8d0e43442e606d6cf9b2a146c8ed9911" dependencies: - acorn "^4.0.4" + acorn "^5.0.0" acorn-dynamic-import "^2.0.0" ajv "^4.7.0" ajv-keywords "^1.1.1" @@ -3175,6 +3015,7 @@ webpack@2.2.1: enhanced-resolve "^3.0.0" interpret "^1.0.0" json-loader "^0.5.4" + json5 "^0.5.1" loader-runner "^2.3.0" loader-utils "^0.2.16" memory-fs "~0.4.1" @@ -3183,16 +3024,16 @@ webpack@2.2.1: source-map "^0.5.3" supports-color "^3.1.0" tapable "~0.2.5" - uglify-js "^2.7.5" - watchpack "^1.2.0" - webpack-sources "^0.1.4" + uglify-js "^2.8.5" + watchpack "^1.3.1" + webpack-sources "^0.2.3" yargs "^6.0.0" which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" -which@^1.1.1, which@^1.2.8: +which@^1.1.1: version "1.2.12" resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" dependencies: @@ -3204,12 +3045,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.1" -widest-line@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" - dependencies: - string-width "^1.0.1" - window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" @@ -3237,18 +3072,6 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -write-file-atomic@^1.1.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - xtend@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -3257,10 +3080,6 @@ y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" -yallist@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" - yargs-parser@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"