diff --git a/dist/index.js b/dist/index.js index 6d939bfb..3ac86c7e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -143,7 +143,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"); } } var chance_1 = __webpack_require__(114); -var Utils_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); var RandomGeneratorUtils = function () { function RandomGeneratorUtils() { @@ -264,144 +264,6 @@ exports.initializable = initializable; "use strict"; "use strict"; -var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; })(); - -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 JSFuck_1 = __webpack_require__(27); -var isEqual = __webpack_require__(119); - -var Utils = function () { - function Utils() { - _classCallCheck(this, Utils); - } - - _createClass(Utils, null, [{ - key: 'arrayContains', - value: function arrayContains(array, searchElement) { - return array.indexOf(searchElement) >= 0; - } - }, { - key: 'arrayRotate', - value: function arrayRotate(array, times) { - if (!array.length) { - throw new ReferenceError('Cannot rotate empty array.'); - } - if (times <= 0) { - return array; - } - var newArray = array, - temp = void 0; - while (times--) { - temp = newArray.pop(); - newArray.unshift(temp); - } - return newArray; - } - }, { - key: 'decToHex', - value: function decToHex(dec) { - var radix = 16; - return Number(dec).toString(radix); - } - }, { - key: 'extractDomainFromUrl', - value: function extractDomainFromUrl(url) { - var domain = void 0; - if (url.indexOf('://') > -1 || url.indexOf('//') === 0) { - domain = url.split('/')[2]; - } else { - domain = url.split('/')[0]; - } - domain = domain.split(':')[0]; - return domain; - } - }, { - key: 'isInteger', - value: function isInteger(number) { - return number % 1 === 0; - } - }, { - key: 'mapGetFirstKeyOf', - value: function mapGetFirstKeyOf(map, value) { - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = map[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var _step$value = _slicedToArray(_step.value, 2), - key = _step$value[0], - storageValue = _step$value[1]; - - if (isEqual(value, storageValue)) { - return key; - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - return null; - } - }, { - key: 'strEnumify', - value: function strEnumify(obj) { - return obj; - } - }, { - key: 'stringToJSFuck', - value: function stringToJSFuck(string) { - return Array.from(string).map(function (character) { - return JSFuck_1.JSFuck[character] || character; - }).join(' + '); - } - }, { - key: 'stringToUnicodeEscapeSequence', - value: function stringToUnicodeEscapeSequence(string) { - var radix = 16; - var prefix = void 0, - regexp = new RegExp('[\x00-\x7F]'), - template = void 0; - return '' + string.replace(/[\s\S]/g, function (escape) { - if (regexp.test(escape)) { - prefix = '\\x'; - template = '0'.repeat(2); - } else { - prefix = '\\u'; - template = '0'.repeat(4); - } - return '' + prefix + (template + escape.charCodeAt(0).toString(radix)).slice(-template.length); - }); - } - }]); - - return Utils; -}(); - -Utils.hexadecimalPrefix = '0x'; -exports.Utils = Utils; - -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { - -"use strict"; -"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"); } } @@ -544,11 +406,144 @@ var Node = function () { exports.Node = Node; /***/ }, -/* 6 */ +/* 5 */ /***/ function(module, exports) { module.exports = require("estraverse"); +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + +"use strict"; +"use strict"; + +var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; })(); + +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 _ = __webpack_require__(122); +var JSFuck_1 = __webpack_require__(27); + +var Utils = function () { + function Utils() { + _classCallCheck(this, Utils); + } + + _createClass(Utils, null, [{ + key: "arrayRotate", + value: function arrayRotate(array, times) { + if (!array.length) { + throw new ReferenceError("Cannot rotate empty array."); + } + if (times <= 0) { + return array; + } + var newArray = array, + temp = void 0; + while (times--) { + temp = newArray.pop(); + newArray.unshift(temp); + } + return newArray; + } + }, { + key: "decToHex", + value: function decToHex(dec) { + var radix = 16; + return Number(dec).toString(radix); + } + }, { + key: "extractDomainFromUrl", + value: function extractDomainFromUrl(url) { + var domain = void 0; + if (url.indexOf('://') > -1 || url.indexOf('//') === 0) { + domain = url.split('/')[2]; + } else { + domain = url.split('/')[0]; + } + domain = domain.split(':')[0]; + return domain; + } + }, { + key: "isCeilNumber", + value: function isCeilNumber(number) { + return number % 1 === 0; + } + }, { + key: "mapGetFirstKeyOf", + value: function mapGetFirstKeyOf(map, value) { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = map[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _step$value = _slicedToArray(_step.value, 2), + key = _step$value[0], + storageValue = _step$value[1]; + + if (_.isEqual(value, storageValue)) { + return key; + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return null; + } + }, { + key: "strEnumify", + value: function strEnumify(obj) { + return obj; + } + }, { + key: "stringToJSFuck", + value: function stringToJSFuck(string) { + return Array.from(string).map(function (character) { + return JSFuck_1.JSFuck[character] || character; + }).join(' + '); + } + }, { + key: "stringToUnicodeEscapeSequence", + value: function stringToUnicodeEscapeSequence(string) { + var radix = 16; + var prefix = void 0, + regexp = new RegExp('[\x00-\x7F]'), + template = void 0; + return "" + string.replace(/[\s\S]/g, function (escape) { + if (regexp.test(escape)) { + prefix = '\\x'; + template = '0'.repeat(2); + } else { + prefix = "\\u"; + template = '0'.repeat(4); + } + return "" + prefix + (template + escape.charCodeAt(0).toString(radix)).slice(-template.length); + }); + } + }]); + + return Utils; +}(); + +Utils.hexadecimalPrefix = '0x'; +exports.Utils = Utils; + /***/ }, /* 7 */ /***/ function(module, exports, __webpack_require__) { @@ -629,10 +624,9 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var escodegen = __webpack_require__(17); var esprima = __webpack_require__(33); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); var NodeType_1 = __webpack_require__(10); -var Node_1 = __webpack_require__(5); -var Utils_1 = __webpack_require__(4); +var Node_1 = __webpack_require__(4); var NodeUtils = function () { function NodeUtils() { @@ -718,7 +712,7 @@ var NodeUtils = function () { if (!parentNode.parentNode) { throw new ReferenceError('`parentNode` property of `parentNode` of given node is `undefined`'); } - if (!Utils_1.Utils.arrayContains(NodeUtils.nodesWithBlockScope, parentNode.parentNode.type)) { + if (!NodeUtils.nodesWithBlockScope.includes(parentNode.parentNode.type)) { return NodeUtils.getBlockScopeOfNode(parentNode, depth); } else if (depth > 0) { return NodeUtils.getBlockScopeOfNode(parentNode, --depth); @@ -742,7 +736,7 @@ var NodeUtils = function () { if (Node_1.Node.isProgramNode(parentNode)) { return depth; } - if (Node_1.Node.isBlockStatementNode(node) && Utils_1.Utils.arrayContains(NodeUtils.nodesWithBlockScope, parentNode.type)) { + if (Node_1.Node.isBlockStatementNode(node) && NodeUtils.nodesWithBlockScope.includes(parentNode.type)) { return NodeUtils.getNodeBlockScopeDepth(parentNode, ++depth); } return NodeUtils.getNodeBlockScopeDepth(parentNode, depth); @@ -808,7 +802,7 @@ exports.NodeUtils = NodeUtils; "use strict"; "use strict"; -var Utils_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); exports.NodeType = Utils_1.Utils.strEnumify({ ArrayExpression: 'ArrayExpression', ArrowFunctionExpression: 'ArrowFunctionExpression', @@ -943,7 +937,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"); } } -__webpack_require__(121); +__webpack_require__(120); if (!global._babelPolyfill) { __webpack_require__(113); } @@ -1318,7 +1312,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"); } } var RandomGeneratorUtils_1 = __webpack_require__(2); -var Utils_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); var CryptUtils = function () { function CryptUtils() { @@ -1639,6 +1633,8 @@ var _createClass = (function () { function defineProperties(target, props) { for 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; }; +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var __decorate = undefined && undefined.__decorate || function (decorators, target, key, desc) { @@ -1654,7 +1650,7 @@ var __metadata = undefined && undefined.__metadata || function (k, v) { }; var inversify_1 = __webpack_require__(0); var Initializable_1 = __webpack_require__(3); -var Utils_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); var MapStorage = function () { function MapStorage() { _classCallCheck(this, MapStorage); @@ -1689,6 +1685,11 @@ var MapStorage = function () { value: function initialize() { this.storage = new Map(); } + }, { + key: "mergeWith", + value: function mergeWith(storage) { + this.storage = new Map([].concat(_toConsumableArray(this.storage), _toConsumableArray(storage.getStorage()))); + } }, { key: "set", value: function set(key, value) { @@ -1698,8 +1699,8 @@ var MapStorage = function () { return MapStorage; }(); -__decorate([Initializable_1.initializable(), __metadata('design:type', Map)], MapStorage.prototype, "storage", void 0); -MapStorage = __decorate([inversify_1.injectable(), __metadata('design:paramtypes', [])], MapStorage); +__decorate([Initializable_1.initializable(), __metadata("design:type", Map)], MapStorage.prototype, "storage", void 0); +MapStorage = __decorate([inversify_1.injectable(), __metadata("design:paramtypes", [])], MapStorage); exports.MapStorage = MapStorage; /***/ }, @@ -1906,12 +1907,12 @@ var __param = undefined && undefined.__param || function (paramIndex, decorator) }; var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(1); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); var NodeTransformers_1 = __webpack_require__(30); var NodeType_1 = __webpack_require__(10); var ObfuscationEvents_1 = __webpack_require__(14); var VisitorDirection_1 = __webpack_require__(65); -var Node_1 = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(9); var Obfuscator_1 = function () { function Obfuscator(stackTraceAnalyzer, obfuscationEventEmitter, customNodeGroupStorage, nodeTransformersFactory, options) { @@ -2053,9 +2054,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 fs = __webpack_require__(118); -var mkdirp = __webpack_require__(120); +var mkdirp = __webpack_require__(119); var path = __webpack_require__(34); -var Utils_1 = __webpack_require__(4); var CLIUtils = function () { function CLIUtils() { @@ -2063,37 +2063,37 @@ var CLIUtils = function () { } _createClass(CLIUtils, null, [{ - key: 'getOutputCodePath', + key: "getOutputCodePath", value: function getOutputCodePath(outputPath, inputPath) { if (outputPath) { return outputPath; } return inputPath.split('.').map(function (value, index) { - return index === 0 ? value + '-obfuscated' : value; + return index === 0 ? value + "-obfuscated" : value; }).join('.'); } }, { - key: 'getOutputSourceMapPath', + key: "getOutputSourceMapPath", value: function getOutputSourceMapPath(outputCodePath) { var sourceMapFileName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; if (sourceMapFileName) { - outputCodePath = outputCodePath.substr(0, outputCodePath.lastIndexOf('/')) + '/' + sourceMapFileName; + outputCodePath = outputCodePath.substr(0, outputCodePath.lastIndexOf('/')) + "/" + sourceMapFileName; } if (!/\.js\.map$/.test(outputCodePath)) { - outputCodePath = outputCodePath.split('.')[0] + '.js.map'; + outputCodePath = outputCodePath.split('.')[0] + ".js.map"; } else if (/\.js$/.test(outputCodePath)) { outputCodePath += '.map'; } return outputCodePath; } }, { - key: 'getPackageConfig', + key: "getPackageConfig", value: function getPackageConfig() { return JSON.parse(fs.readFileSync(path.join(path.dirname(fs.realpathSync(process.argv[1])), '../package.json'), CLIUtils.encoding)); } }, { - key: 'isFilePath', + key: "isFilePath", value: function isFilePath(filePath) { try { return fs.statSync(filePath).isFile(); @@ -2102,22 +2102,22 @@ var CLIUtils = function () { } } }, { - key: 'readFile', + key: "readFile", value: function readFile(inputPath) { return fs.readFileSync(inputPath, CLIUtils.encoding); } }, { - key: 'validateInputPath', + key: "validateInputPath", value: function validateInputPath(inputPath) { if (!CLIUtils.isFilePath(inputPath)) { - throw new ReferenceError('Given input path must be a valid file path'); + throw new ReferenceError("Given input path must be a valid file path"); } - if (!Utils_1.Utils.arrayContains(CLIUtils.availableInputExtensions, path.extname(inputPath))) { - throw new ReferenceError('Input file must have .js extension'); + if (!CLIUtils.availableInputExtensions.includes(path.extname(inputPath))) { + throw new ReferenceError("Input file must have .js extension"); } } }, { - key: 'writeFile', + key: "writeFile", value: function writeFile(outputPath, data) { mkdirp.sync(path.dirname(outputPath)); fs.writeFileSync(outputPath, data, { @@ -2160,7 +2160,6 @@ var StringArrayEncoding_1 = __webpack_require__(22); var DefaultPreset_1 = __webpack_require__(31); var CLIUtils_1 = __webpack_require__(39); var JavaScriptObfuscator_1 = __webpack_require__(15); -var Utils_1 = __webpack_require__(4); var JavaScriptObfuscatorCLI = function () { function JavaScriptObfuscatorCLI(argv) { @@ -2175,7 +2174,7 @@ var JavaScriptObfuscatorCLI = function () { key: "run", value: function run() { this.configureCommands(); - if (!this.arguments.length || Utils_1.Utils.arrayContains(this.arguments, '--help')) { + if (!this.arguments.length || this.arguments.includes('--help')) { this.commands.outputHelp(); return; } @@ -2193,7 +2192,7 @@ var JavaScriptObfuscatorCLI = function () { if (!this.commands.hasOwnProperty(option)) { continue; } - if (!Utils_1.Utils.arrayContains(availableOptions, option)) { + if (!availableOptions.includes(option)) { continue; } inputOptions[option] = this.commands[option]; @@ -3889,7 +3888,7 @@ var StringArrayRotateFunctionTemplate_1 = __webpack_require__(112); var AbstractCustomNode_1 = __webpack_require__(7); var JavaScriptObfuscator_1 = __webpack_require__(15); var RandomGeneratorUtils_1 = __webpack_require__(2); -var Utils_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); var StringArrayRotateFunctionNode = function (_AbstractCustomNode_) { _inherits(StringArrayRotateFunctionNode, _AbstractCustomNode_); @@ -4054,7 +4053,7 @@ exports.StringArrayCustomNodeGroup = StringArrayCustomNodeGroup; "use strict"; "use strict"; -var Utils_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); exports.VisitorDirection = Utils_1.Utils.strEnumify({ enter: 'enter', leave: 'leave' @@ -4147,11 +4146,12 @@ var __param = undefined && undefined.__param || function (paramIndex, decorator) }; var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(1); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); +var _ = __webpack_require__(122); var CustomNodes_1 = __webpack_require__(12); var NodeType_1 = __webpack_require__(10); var AbstractNodeTransformer_1 = __webpack_require__(11); -var Node_1 = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var NodeAppender_1 = __webpack_require__(16); var NodeControlFlowReplacers_1 = __webpack_require__(29); var NodeUtils_1 = __webpack_require__(9); @@ -4194,44 +4194,13 @@ var FunctionControlFlowTransformer = FunctionControlFlowTransformer_1 = function controlFlowStorageNodeName: controlFlowStorageNodeName }); } else { - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = this.controlFlowNodesList[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var controlFlowNode = _step.value; - - var firstIndexOfNode = hostNode.body.indexOf(controlFlowNode[0]); - if (firstIndexOfNode === -1) { - continue; - } - var statementLength = controlFlowNode.length; - hostNode.body.splice(firstIndexOfNode, statementLength); - break; - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } + hostNode.body = FunctionControlFlowTransformer_1.removeOldControlFlowNodeFromHostNodeBody(hostNode.body, this.controlFlowNodesList); var _controlFlowData$get = this.controlFlowData.get(hostNode), hostControlFlowStorage = _controlFlowData$get.controlFlowStorage, hostControlFlowStorageNodeName = _controlFlowData$get.controlFlowStorageNodeName; - hostControlFlowStorage.getStorage().forEach(function (customNode, key) { - controlFlowStorage.set(key, customNode); - }); + controlFlowStorage.mergeWith(hostControlFlowStorage); controlFlowStorageNodeName = hostControlFlowStorageNodeName; this.controlFlowData.set(hostNode, { controlFlowStorage: controlFlowStorage, @@ -4256,6 +4225,40 @@ var FunctionControlFlowTransformer = FunctionControlFlowTransformer_1 = function this.controlFlowNodesList.push(controlFlowStorageNode); NodeAppender_1.NodeAppender.prependNode(hostNode, controlFlowStorageNode); } + }], [{ + key: "removeOldControlFlowNodeFromHostNodeBody", + value: function removeOldControlFlowNodeFromHostNodeBody(hostNodeBody, controlFlowNodesList) { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = controlFlowNodesList[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var controlFlowNode = _step.value; + + var firstIndexOfNode = hostNodeBody.indexOf(controlFlowNode[0]); + if (firstIndexOfNode === -1) { + continue; + } + return _.difference(hostNodeBody, controlFlowNode); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return hostNodeBody; + } }]); return FunctionControlFlowTransformer; @@ -4357,7 +4360,7 @@ var ServiceIdentifiers_1 = __webpack_require__(1); var escodegen = __webpack_require__(17); var CustomNodes_1 = __webpack_require__(12); var AbstractControlFlowReplacer_1 = __webpack_require__(68); -var Node_1 = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var BinaryExpressionControlFlowReplacer = BinaryExpressionControlFlowReplacer_1 = function (_AbstractControlFlowR) { _inherits(BinaryExpressionControlFlowReplacer, _AbstractControlFlowR); @@ -4435,11 +4438,11 @@ var __param = undefined && undefined.__param || function (paramIndex, decorator) }; var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(1); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); var NodeObfuscatorsReplacers_1 = __webpack_require__(13); var NodeType_1 = __webpack_require__(10); var AbstractNodeTransformer_1 = __webpack_require__(11); -var Node_1 = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(9); var RandomGeneratorUtils_1 = __webpack_require__(2); var CatchClauseObfuscator = function (_AbstractNodeTransfor) { @@ -4527,11 +4530,11 @@ var __param = undefined && undefined.__param || function (paramIndex, decorator) }; var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(1); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); var NodeObfuscatorsReplacers_1 = __webpack_require__(13); var NodeType_1 = __webpack_require__(10); var AbstractNodeTransformer_1 = __webpack_require__(11); -var Node_1 = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(9); var RandomGeneratorUtils_1 = __webpack_require__(2); var FunctionDeclarationObfuscator = function (_AbstractNodeTransfor) { @@ -4623,11 +4626,11 @@ var __param = undefined && undefined.__param || function (paramIndex, decorator) }; var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(1); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); var NodeObfuscatorsReplacers_1 = __webpack_require__(13); var NodeType_1 = __webpack_require__(10); var AbstractNodeTransformer_1 = __webpack_require__(11); -var Node_1 = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(9); var RandomGeneratorUtils_1 = __webpack_require__(2); var FunctionObfuscator = function (_AbstractNodeTransfor) { @@ -4725,11 +4728,11 @@ var __param = undefined && undefined.__param || function (paramIndex, decorator) }; var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(1); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); var NodeObfuscatorsReplacers_1 = __webpack_require__(13); var NodeType_1 = __webpack_require__(10); var AbstractNodeTransformer_1 = __webpack_require__(11); -var Node_1 = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(9); var RandomGeneratorUtils_1 = __webpack_require__(2); var LabeledStatementObfuscator = function (_AbstractNodeTransfor) { @@ -4820,7 +4823,7 @@ var ServiceIdentifiers_1 = __webpack_require__(1); var escodegen = __webpack_require__(17); var NodeObfuscatorsReplacers_1 = __webpack_require__(13); var AbstractNodeTransformer_1 = __webpack_require__(11); -var Node_1 = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var LiteralObfuscator = function (_AbstractNodeTransfor) { _inherits(LiteralObfuscator, _AbstractNodeTransfor); @@ -4901,11 +4904,11 @@ var __param = undefined && undefined.__param || function (paramIndex, decorator) var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(1); var escodegen = __webpack_require__(17); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); var NodeObfuscatorsReplacers_1 = __webpack_require__(13); var NodeType_1 = __webpack_require__(10); var AbstractNodeTransformer_1 = __webpack_require__(11); -var Node_1 = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var MemberExpressionObfuscator = function (_AbstractNodeTransfor) { _inherits(MemberExpressionObfuscator, _AbstractNodeTransfor); @@ -5007,11 +5010,10 @@ var __param = undefined && undefined.__param || function (paramIndex, decorator) }; var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(1); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); var NodeObfuscatorsReplacers_1 = __webpack_require__(13); var AbstractNodeTransformer_1 = __webpack_require__(11); -var Node_1 = __webpack_require__(5); -var Utils_1 = __webpack_require__(4); +var Node_1 = __webpack_require__(4); var MethodDefinitionObfuscator = MethodDefinitionObfuscator_1 = function (_AbstractNodeTransfor) { _inherits(MethodDefinitionObfuscator, _AbstractNodeTransfor); @@ -5036,7 +5038,7 @@ var MethodDefinitionObfuscator = MethodDefinitionObfuscator_1 = function (_Abstr estraverse.replace(methodDefinitionNode.key, { enter: function enter(node) { - if (Node_1.Node.isIdentifierNode(node) && !Utils_1.Utils.arrayContains(MethodDefinitionObfuscator_1.ignoredNames, node.name) && methodDefinitionNode.computed === false) { + if (Node_1.Node.isIdentifierNode(node) && !MethodDefinitionObfuscator_1.ignoredNames.includes(node.name) && methodDefinitionNode.computed === false) { methodDefinitionNode.computed = true; node.name = _this2.stringLiteralReplacer.replace(node.name); return; @@ -5090,11 +5092,11 @@ var __param = undefined && undefined.__param || function (paramIndex, decorator) var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(1); var escodegen = __webpack_require__(17); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); var NodeType_1 = __webpack_require__(10); var AbstractNodeTransformer_1 = __webpack_require__(11); -var Node_1 = __webpack_require__(5); -var Utils_1 = __webpack_require__(4); +var Node_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); var ObjectExpressionObfuscator = function (_AbstractNodeTransfor) { _inherits(ObjectExpressionObfuscator, _AbstractNodeTransfor); @@ -5194,11 +5196,11 @@ var __param = undefined && undefined.__param || function (paramIndex, decorator) }; var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(1); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); var NodeObfuscatorsReplacers_1 = __webpack_require__(13); var NodeType_1 = __webpack_require__(10); var AbstractNodeTransformer_1 = __webpack_require__(11); -var Node_1 = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(9); var RandomGeneratorUtils_1 = __webpack_require__(2); var VariableDeclarationObfuscator = function (_AbstractNodeTransfor) { @@ -5431,7 +5433,7 @@ var __param = undefined && undefined.__param || function (paramIndex, decorator) var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(1); var AbstractReplacer_1 = __webpack_require__(20); -var Utils_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); var NumberLiteralReplacer = function (_AbstractReplacer_1$A) { _inherits(NumberLiteralReplacer, _AbstractReplacer_1$A); @@ -5444,7 +5446,7 @@ var NumberLiteralReplacer = function (_AbstractReplacer_1$A) { _createClass(NumberLiteralReplacer, [{ key: "replace", value: function replace(nodeValue) { - if (!Utils_1.Utils.isInteger(nodeValue)) { + if (!Utils_1.Utils.isCeilNumber(nodeValue)) { return String(nodeValue); } return "" + Utils_1.Utils.hexadecimalPrefix + Utils_1.Utils.decToHex(nodeValue); @@ -5453,7 +5455,7 @@ var NumberLiteralReplacer = function (_AbstractReplacer_1$A) { return NumberLiteralReplacer; }(AbstractReplacer_1.AbstractReplacer); -NumberLiteralReplacer = __decorate([inversify_1.injectable(), __param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IOptions)), __metadata('design:paramtypes', [Object])], NumberLiteralReplacer); +NumberLiteralReplacer = __decorate([inversify_1.injectable(), __param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IOptions)), __metadata("design:paramtypes", [Object])], NumberLiteralReplacer); exports.NumberLiteralReplacer = NumberLiteralReplacer; /***/ }, @@ -5497,7 +5499,7 @@ var CryptUtils_1 = __webpack_require__(25); var CustomNodes_1 = __webpack_require__(12); var CustomNodeGroups_1 = __webpack_require__(23); var RandomGeneratorUtils_1 = __webpack_require__(2); -var Utils_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); var StringLiteralReplacer = StringLiteralReplacer_1 = function (_AbstractReplacer_1$A) { _inherits(StringLiteralReplacer, _AbstractReplacer_1$A); @@ -5658,7 +5660,7 @@ var __assign = undefined && undefined.__assign || Object.assign || function (t) } return t; }; -var Utils_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); var OptionsNormalizer = function () { function OptionsNormalizer() { @@ -5917,9 +5919,9 @@ var __param = undefined && undefined.__param || function (paramIndex, decorator) }; var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(1); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); var CalleeDataExtractors_1 = __webpack_require__(28); -var Node_1 = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(9); var StackTraceAnalyzer = StackTraceAnalyzer_1 = function () { function StackTraceAnalyzer(calleeDataExtractorsFactory) { @@ -6031,9 +6033,9 @@ var __metadata = undefined && undefined.__metadata || function (k, v) { if ((typeof Reflect === "undefined" ? "undefined" : _typeof(Reflect)) === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var inversify_1 = __webpack_require__(0); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); var AbstractCalleeDataExtractor_1 = __webpack_require__(24); -var Node_1 = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(9); var FunctionDeclarationCalleeDataExtractor = function (_AbstractCalleeDataEx) { _inherits(FunctionDeclarationCalleeDataExtractor, _AbstractCalleeDataEx); @@ -6109,9 +6111,9 @@ var __metadata = undefined && undefined.__metadata || function (k, v) { if ((typeof Reflect === "undefined" ? "undefined" : _typeof(Reflect)) === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var inversify_1 = __webpack_require__(0); -var estraverse = __webpack_require__(6); +var estraverse = __webpack_require__(5); var AbstractCalleeDataExtractor_1 = __webpack_require__(24); -var Node_1 = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(9); var FunctionExpressionCalleeDataExtractor = function (_AbstractCalleeDataEx) { _inherits(FunctionExpressionCalleeDataExtractor, _AbstractCalleeDataEx); @@ -6190,8 +6192,8 @@ var __metadata = undefined && undefined.__metadata || function (k, v) { if ((typeof Reflect === "undefined" ? "undefined" : _typeof(Reflect)) === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var inversify_1 = __webpack_require__(0); -var estraverse = __webpack_require__(6); -var Node_1 = __webpack_require__(5); +var estraverse = __webpack_require__(5); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(9); var AbstractCalleeDataExtractor_1 = __webpack_require__(24); var ObjectExpressionCalleeDataExtractor = function (_AbstractCalleeDataEx) { @@ -6323,6 +6325,8 @@ var _createClass = (function () { function defineProperties(target, props) { for 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; }; +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var __decorate = undefined && undefined.__decorate || function (decorators, target, key, desc) { @@ -6372,6 +6376,11 @@ var ArrayStorage = function () { value: function initialize() { this.storage = []; } + }, { + key: "mergeWith", + value: function mergeWith(storage) { + this.storage = [].concat(_toConsumableArray(this.storage), _toConsumableArray(storage.getStorage())); + } }, { key: "set", value: function set(key, value) { @@ -6539,7 +6548,7 @@ var __metadata = undefined && undefined.__metadata || function (k, v) { }; var inversify_1 = __webpack_require__(0); var ArrayStorage_1 = __webpack_require__(90); -var Utils_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); var StringArrayStorage = function (_ArrayStorage_1$Array) { _inherits(StringArrayStorage, _ArrayStorage_1$Array); @@ -6710,7 +6719,7 @@ exports.DomainLockNodeTemplate = DomainLockNodeTemplate; "use strict"; "use strict"; -var Utils_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); 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 "; } @@ -6723,7 +6732,7 @@ exports.SelfDefendingTemplate = SelfDefendingTemplate; "use strict"; "use strict"; -var Utils_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); 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 "; } @@ -6784,7 +6793,7 @@ exports.StringArrayTemplate = StringArrayTemplate; "use strict"; "use strict"; -var Utils_1 = __webpack_require__(4); +var Utils_1 = __webpack_require__(6); 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 "; } @@ -6842,22 +6851,22 @@ module.exports = require("fs"); /* 119 */ /***/ function(module, exports) { -module.exports = require("is-equal"); +module.exports = require("mkdirp"); /***/ }, /* 120 */ /***/ function(module, exports) { -module.exports = require("mkdirp"); - -/***/ }, -/* 121 */ -/***/ function(module, exports) { - module.exports = require("reflect-metadata"); /***/ }, -/* 122 */, +/* 121 */, +/* 122 */ +/***/ function(module, exports) { + +module.exports = require("underscore"); + +/***/ }, /* 123 */ /***/ function(module, exports, __webpack_require__) { diff --git a/package.json b/package.json index 9b7ae646..75ba541d 100644 --- a/package.json +++ b/package.json @@ -28,11 +28,11 @@ "esprima": "3.1.2", "estraverse": "4.2.0", "inversify": "^3.0.0-rc.2", - "is-equal": "^1.5.3", "mkdirp": "0.5.1", "reflect-metadata": "^0.1.8", "source-map-support": "0.4.6", - "string-template": "^1.0.0" + "string-template": "^1.0.0", + "underscore": "^1.8.3" }, "devDependencies": { "@types/chai": "3.4.34", @@ -45,10 +45,11 @@ "@types/joi": "9.0.33", "@types/mkdirp": "0.3.29", "@types/mocha": "2.2.33", - "@types/node": "6.0.51", + "@types/node": "6.0.52", "@types/sinon": "1.16.33", "@types/string-template": "1.0.2", - "awesome-typescript-loader": "3.0.0-beta.14", + "@types/underscore": "^1.7.36", + "awesome-typescript-loader": "3.0.0-beta.17", "babel-cli": "6.18.0", "babel-loader": "6.2.9", "babel-preset-es2015": "6.18.0", diff --git a/src/cli/CLIUtils.ts b/src/cli/CLIUtils.ts index 149f1098..c5a013c4 100644 --- a/src/cli/CLIUtils.ts +++ b/src/cli/CLIUtils.ts @@ -4,8 +4,6 @@ import * as path from 'path'; import { IPackageConfig } from '../interfaces/IPackageConfig'; -import { Utils } from '../utils/Utils'; - export class CLIUtils { /** * @type {string[]} @@ -102,7 +100,7 @@ export class CLIUtils { throw new ReferenceError(`Given input path must be a valid file path`); } - if (!Utils.arrayContains(CLIUtils.availableInputExtensions, path.extname(inputPath))) { + if (!CLIUtils.availableInputExtensions.includes(path.extname(inputPath))) { throw new ReferenceError(`Input file must have .js extension`); } } diff --git a/src/cli/JavaScriptObfuscatorCLI.ts b/src/cli/JavaScriptObfuscatorCLI.ts index 43e27102..3d307248 100644 --- a/src/cli/JavaScriptObfuscatorCLI.ts +++ b/src/cli/JavaScriptObfuscatorCLI.ts @@ -13,7 +13,6 @@ import { DEFAULT_PRESET } from '../preset-options/DefaultPreset'; import { CLIUtils } from './CLIUtils'; import { JavaScriptObfuscator } from '../JavaScriptObfuscator'; -import { Utils } from '../utils/Utils'; export class JavaScriptObfuscatorCLI { /** @@ -104,7 +103,7 @@ export class JavaScriptObfuscatorCLI { public run (): void { this.configureCommands(); - if (!this.arguments.length || Utils.arrayContains(this.arguments, '--help')) { + if (!this.arguments.length || this.arguments.includes('--help')) { this.commands.outputHelp(); return; @@ -129,7 +128,7 @@ export class JavaScriptObfuscatorCLI { continue; } - if (!Utils.arrayContains(availableOptions, option)) { + if (!availableOptions.includes(option)) { continue; } diff --git a/src/interfaces/node-transformers/IControlFlowData.d.ts b/src/interfaces/node-transformers/IControlFlowNodeMetadata.d.ts similarity index 81% rename from src/interfaces/node-transformers/IControlFlowData.d.ts rename to src/interfaces/node-transformers/IControlFlowNodeMetadata.d.ts index 7a15b3a7..56c885c5 100644 --- a/src/interfaces/node-transformers/IControlFlowData.d.ts +++ b/src/interfaces/node-transformers/IControlFlowNodeMetadata.d.ts @@ -1,7 +1,7 @@ import { ICustomNode } from '../custom-nodes/ICustomNode'; import { IStorage } from '../storages/IStorage'; -export interface IControlFlowData { +export interface IControlFlowNodeMetadata { controlFlowStorage: IStorage; controlFlowStorageNodeName: string; } diff --git a/src/interfaces/storages/IStorage.d.ts b/src/interfaces/storages/IStorage.d.ts index 8f63caa9..c909549f 100644 --- a/src/interfaces/storages/IStorage.d.ts +++ b/src/interfaces/storages/IStorage.d.ts @@ -28,6 +28,11 @@ export interface IStorage extends IInitializable { */ initialize (...args: any[]): void; + /** + * @param storage + */ + mergeWith (storage: this): void; + /** * @param key * @param value diff --git a/src/node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer.ts b/src/node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer.ts index b37ad55d..c7b02f58 100644 --- a/src/node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer.ts +++ b/src/node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer.ts @@ -3,6 +3,7 @@ import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; import * as estraverse from 'estraverse'; import * as ESTree from 'estree'; +import * as _ from 'underscore'; import { TControlFlowReplacerFactory } from '../../types/container/TControlFlowReplacerFactory'; import { TControlFlowStorageFactory } from '../../types/container/TControlFlowStorageFactory'; @@ -10,7 +11,7 @@ import { TCustomNodeFactory } from '../../types/container/TCustomNodeFactory'; import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement'; import { TStatement } from '../../types/node/TStatement'; -import { IControlFlowData } from '../../interfaces/node-transformers/IControlFlowData'; +import { IControlFlowNodeMetadata } from '../../interfaces/node-transformers/IControlFlowNodeMetadata'; import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../interfaces/options/IOptions'; import { IStorage } from '../../interfaces/storages/IStorage'; @@ -35,9 +36,9 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { ]); /** - * @type {Map} + * @type {Map} */ - private controlFlowData: Map = new Map (); + private controlFlowData: Map = new Map (); /** * @type {TStatement[][]} @@ -78,6 +79,27 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { this.customNodeFactory = customNodeFactory; } + /** + * @param hostNodeBody + * @param controlFlowNodesList + */ + private static removeOldControlFlowNodeFromHostNodeBody ( + hostNodeBody: TStatement[], + controlFlowNodesList: TStatement[][] + ): TStatement[] { + for (let controlFlowNode of controlFlowNodesList) { + const firstIndexOfNode: number = hostNodeBody.indexOf(controlFlowNode[0]); + + if (firstIndexOfNode === -1) { + continue; + } + + return _.difference(hostNodeBody, controlFlowNode); + } + + return hostNodeBody; + } + /** * @param functionNode */ @@ -107,30 +129,15 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { controlFlowStorageNodeName }); } else { - for (let controlFlowNode of this.controlFlowNodesList) { - const firstIndexOfNode: number = (hostNode.body).indexOf(controlFlowNode[0]); - - if (firstIndexOfNode === -1) { - continue; - } - - const statementLength: number = controlFlowNode.length; - - (hostNode.body).splice(firstIndexOfNode, statementLength); - break; - } + hostNode.body = FunctionControlFlowTransformer + .removeOldControlFlowNodeFromHostNodeBody(hostNode.body, this.controlFlowNodesList); const { controlFlowStorage: hostControlFlowStorage, controlFlowStorageNodeName: hostControlFlowStorageNodeName - } = this.controlFlowData.get(hostNode); - - hostControlFlowStorage - .getStorage() - .forEach((customNode: ICustomNode, key: string) => { - controlFlowStorage.set(key, customNode); - }); + } = this.controlFlowData.get(hostNode); + controlFlowStorage.mergeWith(hostControlFlowStorage); controlFlowStorageNodeName = hostControlFlowStorageNodeName; this.controlFlowData.set(hostNode, { diff --git a/src/node-transformers/node-obfuscators/MethodDefinitionObfuscator.ts b/src/node-transformers/node-obfuscators/MethodDefinitionObfuscator.ts index 7fa254e1..93d4748f 100644 --- a/src/node-transformers/node-obfuscators/MethodDefinitionObfuscator.ts +++ b/src/node-transformers/node-obfuscators/MethodDefinitionObfuscator.ts @@ -11,7 +11,6 @@ import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsR import { AbstractNodeTransformer } from '../AbstractNodeTransformer'; import { Node } from '../../node/Node'; -import { Utils } from '../../utils/Utils'; /** * replaces: @@ -61,7 +60,7 @@ export class MethodDefinitionObfuscator extends AbstractNodeTransformer { enter: (node: ESTree.Node): any => { if ( Node.isIdentifierNode(node) && - !Utils.arrayContains(MethodDefinitionObfuscator.ignoredNames, node.name) && + !MethodDefinitionObfuscator.ignoredNames.includes(node.name) && methodDefinitionNode.computed === false ) { methodDefinitionNode.computed = true; diff --git a/src/node-transformers/node-obfuscators/replacers/NumberLiteralReplacer.ts b/src/node-transformers/node-obfuscators/replacers/NumberLiteralReplacer.ts index 96ba8ed9..96f94ff3 100644 --- a/src/node-transformers/node-obfuscators/replacers/NumberLiteralReplacer.ts +++ b/src/node-transformers/node-obfuscators/replacers/NumberLiteralReplacer.ts @@ -22,7 +22,7 @@ export class NumberLiteralReplacer extends AbstractReplacer { * @returns {string} */ public replace (nodeValue: number): string { - if (!Utils.isInteger(nodeValue)) { + if (!Utils.isCeilNumber(nodeValue)) { return String(nodeValue); } diff --git a/src/node/NodeUtils.ts b/src/node/NodeUtils.ts index 8df8e99e..6865338f 100644 --- a/src/node/NodeUtils.ts +++ b/src/node/NodeUtils.ts @@ -9,7 +9,6 @@ import { TStatement } from '../types/node/TStatement'; import { NodeType } from '../enums/NodeType'; import { Node } from './Node'; -import { Utils } from '../utils/Utils'; export class NodeUtils { /** @@ -100,7 +99,7 @@ export class NodeUtils { throw new ReferenceError('`parentNode` property of `parentNode` of given node is `undefined`'); } - if (!Utils.arrayContains(NodeUtils.nodesWithBlockScope, parentNode.parentNode.type)) { + if (!NodeUtils.nodesWithBlockScope.includes(parentNode.parentNode.type)) { return NodeUtils.getBlockScopeOfNode(parentNode, depth); } else if (depth > 0) { return NodeUtils.getBlockScopeOfNode(parentNode, --depth); @@ -132,7 +131,7 @@ export class NodeUtils { return depth; } - if (Node.isBlockStatementNode(node) && Utils.arrayContains(NodeUtils.nodesWithBlockScope, parentNode.type)) { + if (Node.isBlockStatementNode(node) && NodeUtils.nodesWithBlockScope.includes(parentNode.type)) { return NodeUtils.getNodeBlockScopeDepth(parentNode, ++depth); } diff --git a/src/storages/ArrayStorage.ts b/src/storages/ArrayStorage.ts index 0a2a6650..7922bcf6 100644 --- a/src/storages/ArrayStorage.ts +++ b/src/storages/ArrayStorage.ts @@ -55,6 +55,13 @@ export abstract class ArrayStorage implements IStorage { this.storage = []; } + /** + * @param storage + */ + public mergeWith (storage: this): void { + this.storage = [...this.storage, ...storage.getStorage()]; + } + /** * @param key * @param value diff --git a/src/storages/MapStorage.ts b/src/storages/MapStorage.ts index b8ba7ec7..2f8d8de5 100644 --- a/src/storages/MapStorage.ts +++ b/src/storages/MapStorage.ts @@ -33,7 +33,7 @@ export abstract class MapStorage implements IStorage { * @returns {string | number | null} */ public getKeyOf (value: T): string | number | null { - return Utils.mapGetFirstKeyOf(this.storage, value); + return Utils.mapGetFirstKeyOf (this.storage, value); } /** @@ -57,6 +57,13 @@ export abstract class MapStorage implements IStorage { this.storage = new Map (); } + /** + * @param storage + */ + public mergeWith (storage: this): void { + this.storage = new Map ([...this.storage, ...storage.getStorage()]); + } + /** * @param key * @param value diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index 67aae378..eb2ec3c1 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -1,22 +1,12 @@ +import * as _ from 'underscore'; import { JSFuck } from '../enums/JSFuck'; -const isEqual: any = require('is-equal'); - export class Utils { /** * @type {string} */ public static readonly hexadecimalPrefix: string = '0x'; - /** - * @param array - * @param searchElement - * @returns {boolean} - */ - public static arrayContains (array: any[], searchElement: any): boolean { - return array.indexOf(searchElement) >= 0; - } - /** * @param array * @param times @@ -74,18 +64,18 @@ export class Utils { * @param number * @returns {boolean} */ - public static isInteger (number: number): boolean { + public static isCeilNumber (number: number): boolean { return number % 1 === 0; } /** * @param map * @param value - * @returns {any} + * @returns {T | null} */ - public static mapGetFirstKeyOf(map: Map , value: any): any { + public static mapGetFirstKeyOf (map: Map , value: U): T | null { for (let [key, storageValue] of map) { - if (isEqual(value, storageValue)) { + if (_.isEqual(value, storageValue)) { return key; } } diff --git a/test/fixtures/compile-performance.js b/test/fixtures/compile-performance.js index 4d0218ae..a2b872d5 100644 --- a/test/fixtures/compile-performance.js +++ b/test/fixtures/compile-performance.js @@ -19813,8 +19813,8 @@ else { mergedOutputs = outputs; } - var mergedHost = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__facade_lang__["a" /* isPresent */])(dm.host) ? __WEBPACK_IMPORTED_MODULE_1__facade_collection__["b" /* StringMapWrapper */].merge(dm.host, host) : host; - var mergedQueries = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__facade_lang__["a" /* isPresent */])(dm.queries) ? __WEBPACK_IMPORTED_MODULE_1__facade_collection__["b" /* StringMapWrapper */].merge(dm.queries, queries) : queries; + var mergedHost = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__facade_lang__["a" /* isPresent */])(dm.host) ? __WEBPACK_IMPORTED_MODULE_1__facade_collection__["b" /* StringMapWrapper */].mergeWith(dm.host, host) : host; + var mergedQueries = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__facade_lang__["a" /* isPresent */])(dm.queries) ? __WEBPACK_IMPORTED_MODULE_1__facade_collection__["b" /* StringMapWrapper */].mergeWith(dm.queries, queries) : queries; if (dm instanceof __WEBPACK_IMPORTED_MODULE_0__angular_core__["Component"]) { return new __WEBPACK_IMPORTED_MODULE_0__angular_core__["Component"]({ selector: dm.selector, @@ -25918,7 +25918,7 @@ } function _createRootRenderer(rootRenderer /** TODO #9100 */, extraTokens) { __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__dom_adapter__["a" /* getDOM */])().setGlobalVar(INSPECT_GLOBAL_NAME, inspectNativeElement); - __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__dom_adapter__["a" /* getDOM */])().setGlobalVar(CORE_TOKENS_GLOBAL_NAME, __WEBPACK_IMPORTED_MODULE_1__facade_collection__["a" /* StringMapWrapper */].merge(CORE_TOKENS, _ngProbeTokensToMap(extraTokens || []))); + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__dom_adapter__["a" /* getDOM */])().setGlobalVar(CORE_TOKENS_GLOBAL_NAME, __WEBPACK_IMPORTED_MODULE_1__facade_collection__["a" /* StringMapWrapper */].mergeWith(CORE_TOKENS, _ngProbeTokensToMap(extraTokens || []))); return new __WEBPACK_IMPORTED_MODULE_2__private_import_core__["b" /* DebugDomRootRenderer */](rootRenderer); } function _ngProbeTokensToMap(tokens) { @@ -38913,14 +38913,14 @@ if (!_this._finished) { var responseOptions_1 = new __WEBPACK_IMPORTED_MODULE_2__base_response_options__["a" /* ResponseOptions */]({ body: JSONP_ERR_NO_CALLBACK, type: __WEBPACK_IMPORTED_MODULE_3__enums__["a" /* ResponseType */].Error, url: url }); if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__facade_lang__["a" /* isPresent */])(baseResponseOptions)) { - responseOptions_1 = baseResponseOptions.merge(responseOptions_1); + responseOptions_1 = baseResponseOptions.mergeWith(responseOptions_1); } responseObserver.error(new __WEBPACK_IMPORTED_MODULE_6__static_response__["a" /* Response */](responseOptions_1)); return; } var responseOptions = new __WEBPACK_IMPORTED_MODULE_2__base_response_options__["a" /* ResponseOptions */]({ body: _this._responseData, url: url }); if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__facade_lang__["a" /* isPresent */])(_this.baseResponseOptions)) { - responseOptions = _this.baseResponseOptions.merge(responseOptions); + responseOptions = _this.baseResponseOptions.mergeWith(responseOptions); } responseObserver.next(new __WEBPACK_IMPORTED_MODULE_6__static_response__["a" /* Response */](responseOptions)); responseObserver.complete(); @@ -38932,7 +38932,7 @@ _dom.cleanup(script); var responseOptions = new __WEBPACK_IMPORTED_MODULE_2__base_response_options__["a" /* ResponseOptions */]({ body: error.message, type: __WEBPACK_IMPORTED_MODULE_3__enums__["a" /* ResponseType */].Error }); if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__facade_lang__["a" /* isPresent */])(baseResponseOptions)) { - responseOptions = baseResponseOptions.merge(responseOptions); + responseOptions = baseResponseOptions.mergeWith(responseOptions); } responseObserver.error(new __WEBPACK_IMPORTED_MODULE_6__static_response__["a" /* Response */](responseOptions)); }; @@ -39075,7 +39075,7 @@ var statusText = _xhr.statusText || 'OK'; var responseOptions = new __WEBPACK_IMPORTED_MODULE_3__base_response_options__["a" /* ResponseOptions */]({ body: body, status: status, headers: headers, statusText: statusText, url: url }); if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__facade_lang__["a" /* isPresent */])(baseResponseOptions)) { - responseOptions = baseResponseOptions.merge(responseOptions); + responseOptions = baseResponseOptions.mergeWith(responseOptions); } var response = new __WEBPACK_IMPORTED_MODULE_9__static_response__["a" /* Response */](responseOptions); response.ok = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_7__http_utils__["d" /* isSuccess */])(status); @@ -39096,7 +39096,7 @@ statusText: _xhr.statusText, }); if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__facade_lang__["a" /* isPresent */])(baseResponseOptions)) { - responseOptions = baseResponseOptions.merge(responseOptions); + responseOptions = baseResponseOptions.mergeWith(responseOptions); } responseObserver.error(new __WEBPACK_IMPORTED_MODULE_9__static_response__["a" /* Response */](responseOptions)); }; @@ -39355,7 +39355,7 @@ var newOptions = defaultOpts; if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__src_facade_lang__["a" /* isPresent */])(providedOpts)) { // Hack so Dart can used named parameters - return newOptions.merge(new __WEBPACK_IMPORTED_MODULE_2__base_request_options__["a" /* RequestOptions */]({ + return newOptions.mergeWith(new __WEBPACK_IMPORTED_MODULE_2__base_request_options__["a" /* RequestOptions */]({ method: providedOpts.method || method, url: providedOpts.url || url, search: providedOpts.search, @@ -39366,10 +39366,10 @@ })); } if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__src_facade_lang__["a" /* isPresent */])(method)) { - return newOptions.merge(new __WEBPACK_IMPORTED_MODULE_2__base_request_options__["a" /* RequestOptions */]({ method: method, url: url })); + return newOptions.mergeWith(new __WEBPACK_IMPORTED_MODULE_2__base_request_options__["a" /* RequestOptions */]({ method: method, url: url })); } else { - return newOptions.merge(new __WEBPACK_IMPORTED_MODULE_2__base_request_options__["a" /* RequestOptions */]({ url: url })); + return newOptions.mergeWith(new __WEBPACK_IMPORTED_MODULE_2__base_request_options__["a" /* RequestOptions */]({ url: url })); } } /** @@ -39466,13 +39466,13 @@ * Performs a request with `post` http method. */ Http.prototype.post = function (url, body, options) { - return httpRequest(this._backend, new __WEBPACK_IMPORTED_MODULE_5__static_request__["a" /* Request */](mergeOptions(this._defaultOptions.merge(new __WEBPACK_IMPORTED_MODULE_2__base_request_options__["a" /* RequestOptions */]({ body: body })), options, __WEBPACK_IMPORTED_MODULE_3__enums__["b" /* RequestMethod */].Post, url))); + return httpRequest(this._backend, new __WEBPACK_IMPORTED_MODULE_5__static_request__["a" /* Request */](mergeOptions(this._defaultOptions.mergeWith(new __WEBPACK_IMPORTED_MODULE_2__base_request_options__["a" /* RequestOptions */]({ body: body })), options, __WEBPACK_IMPORTED_MODULE_3__enums__["b" /* RequestMethod */].Post, url))); }; /** * Performs a request with `put` http method. */ Http.prototype.put = function (url, body, options) { - return httpRequest(this._backend, new __WEBPACK_IMPORTED_MODULE_5__static_request__["a" /* Request */](mergeOptions(this._defaultOptions.merge(new __WEBPACK_IMPORTED_MODULE_2__base_request_options__["a" /* RequestOptions */]({ body: body })), options, __WEBPACK_IMPORTED_MODULE_3__enums__["b" /* RequestMethod */].Put, url))); + return httpRequest(this._backend, new __WEBPACK_IMPORTED_MODULE_5__static_request__["a" /* Request */](mergeOptions(this._defaultOptions.mergeWith(new __WEBPACK_IMPORTED_MODULE_2__base_request_options__["a" /* RequestOptions */]({ body: body })), options, __WEBPACK_IMPORTED_MODULE_3__enums__["b" /* RequestMethod */].Put, url))); }; /** * Performs a request with `delete` http method. @@ -39484,7 +39484,7 @@ * Performs a request with `patch` http method. */ Http.prototype.patch = function (url, body, options) { - return httpRequest(this._backend, new __WEBPACK_IMPORTED_MODULE_5__static_request__["a" /* Request */](mergeOptions(this._defaultOptions.merge(new __WEBPACK_IMPORTED_MODULE_2__base_request_options__["a" /* RequestOptions */]({ body: body })), options, __WEBPACK_IMPORTED_MODULE_3__enums__["b" /* RequestMethod */].Patch, url))); + return httpRequest(this._backend, new __WEBPACK_IMPORTED_MODULE_5__static_request__["a" /* Request */](mergeOptions(this._defaultOptions.mergeWith(new __WEBPACK_IMPORTED_MODULE_2__base_request_options__["a" /* RequestOptions */]({ body: body })), options, __WEBPACK_IMPORTED_MODULE_3__enums__["b" /* RequestMethod */].Patch, url))); }; /** * Performs a request with `head` http method. @@ -49300,7 +49300,7 @@ var lastIndex = stylesList.length - 1; var lastItem = stylesList[lastIndex]; if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__facade_lang__["l" /* isStringMap */])(lastItem)) { - stylesList[lastIndex] = __WEBPACK_IMPORTED_MODULE_1__facade_collection__["b" /* StringMapWrapper */].merge(lastItem, newItem); + stylesList[lastIndex] = __WEBPACK_IMPORTED_MODULE_1__facade_collection__["b" /* StringMapWrapper */].mergeWith(lastItem, newItem); return; } } @@ -53616,7 +53616,7 @@ hasExtraFirstStyles = true; } }); - var keyframeCollectedStyles = __WEBPACK_IMPORTED_MODULE_0__facade_collection__["d" /* StringMapWrapper */].merge({}, flatenedFirstKeyframeStyles); + var keyframeCollectedStyles = __WEBPACK_IMPORTED_MODULE_0__facade_collection__["d" /* StringMapWrapper */].mergeWith({}, flatenedFirstKeyframeStyles); // phase 2: normalize the final keyframe var finalKeyframe = keyframes[limit]; __WEBPACK_IMPORTED_MODULE_0__facade_collection__["a" /* ListWrapper */].insert(finalKeyframe.styles.styles, 0, finalStateStyles); @@ -64367,7 +64367,7 @@ "use strict"; var Observable_1 = __webpack_require__(0); var merge_1 = __webpack_require__(857); - Observable_1.Observable.merge = merge_1.merge; + Observable_1.Observable.merge = merge_1.mergeWith; //# sourceMappingURL=merge.js.map /***/ }, @@ -64975,7 +64975,7 @@ "use strict"; var Observable_1 = __webpack_require__(0); var merge_1 = __webpack_require__(404); - Observable_1.Observable.prototype.merge = merge_1.merge; + Observable_1.Observable.prototype.merge = merge_1.mergeWith; //# sourceMappingURL=merge.js.map /***/ }, diff --git a/test/unit-tests/utils/Utils.spec.ts b/test/unit-tests/utils/Utils.spec.ts index 7b673f76..155c06c2 100644 --- a/test/unit-tests/utils/Utils.spec.ts +++ b/test/unit-tests/utils/Utils.spec.ts @@ -5,14 +5,6 @@ import { Utils } from '../../../src/utils/Utils'; import { JSFuck } from '../../../src/enums/JSFuck'; describe('Utils', () => { - describe('arrayContains (array: any[], searchElement: any): boolean', () => { - it('should return boolean depends on condition if array is contains given value or not', () => { - assert.equal(Utils.arrayContains(['1', '2', '3'], '2'), true); - assert.equal(Utils.arrayContains([1, 2, 3], 2), true); - assert.equal(Utils.arrayContains([1, 2, 3], 4), false); - }); - }); - describe('arrayRotate (array: T[], times: number): T[]', () => { let array: number[]; @@ -54,11 +46,10 @@ describe('Utils', () => { }); }); - describe('isInteger (number: number): boolean', () => { - it('should return true if given number or string is integer', () => { - assert.equal(Utils.isInteger(4), true); - assert.equal(Utils.isInteger('4'), true); - assert.equal(Utils.isInteger('a'), false); + describe('isCeilNumber (number: number): boolean', () => { + it('should return true if given number is a ceil', () => { + assert.equal(Utils.isCeilNumber(4), true); + assert.equal(Utils.isCeilNumber(4.5), false); }); }); diff --git a/tsconfig.json b/tsconfig.json index 39076b3d..0181ca9a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,10 @@ { "compilerOptions": { "target": "ES6", + "lib": [ + "es2017", + "DOM" + ], "module": "commonjs", "sourceMap": true, "emitDecoratorMetadata": true,