ソースを参照

rc4 string literal encoding preparation

sanex3339 8 年 前
コミット
b2b066419a

+ 170 - 172
dist/index.js

@@ -88,7 +88,7 @@ module.exports =
 /******/ 	__webpack_require__.p = "";
 /******/
 /******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 82);
+/******/ 	return __webpack_require__(__webpack_require__.s = 81);
 /******/ })
 /************************************************************************/
 /******/ ([
@@ -102,7 +102,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__(76);
+var chance_1 = __webpack_require__(75);
 var JSFuck_1 = __webpack_require__(19);
 
 var Utils = function () {
@@ -259,7 +259,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
 var escodegen = __webpack_require__(11);
 var esprima = __webpack_require__(22);
 var estraverse = __webpack_require__(3);
-var NodeType_1 = __webpack_require__(6);
+var NodeType_1 = __webpack_require__(5);
 var Nodes_1 = __webpack_require__(2);
 var Utils_1 = __webpack_require__(0);
 
@@ -425,7 +425,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 NodeType_1 = __webpack_require__(6);
+var NodeType_1 = __webpack_require__(5);
 
 var Nodes = function () {
     function Nodes() {
@@ -555,41 +555,6 @@ var AppendState = exports.AppendState;
 
 /***/ },
 /* 5 */
-/***/ function(module, exports) {
-
-"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"); } }
-
-var AbstractCustomNode = function () {
-    function AbstractCustomNode(options) {
-        _classCallCheck(this, AbstractCustomNode);
-
-        this.options = options;
-    }
-
-    _createClass(AbstractCustomNode, [{
-        key: "getAppendState",
-        value: function getAppendState() {
-            return this.appendState;
-        }
-    }, {
-        key: "getNode",
-        value: function getNode() {
-            return this.getNodeStructure();
-        }
-    }]);
-
-    return AbstractCustomNode;
-}();
-
-exports.AbstractCustomNode = AbstractCustomNode;
-
-/***/ },
-/* 6 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -626,6 +591,41 @@ exports.NodeType = Utils_1.Utils.strEnumify({
     WhileStatement: 'WhileStatement'
 });
 
+/***/ },
+/* 6 */
+/***/ function(module, exports) {
+
+"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"); } }
+
+var AbstractCustomNode = function () {
+    function AbstractCustomNode(options) {
+        _classCallCheck(this, AbstractCustomNode);
+
+        this.options = options;
+    }
+
+    _createClass(AbstractCustomNode, [{
+        key: "getAppendState",
+        value: function getAppendState() {
+            return this.appendState;
+        }
+    }, {
+        key: "getNode",
+        value: function getNode() {
+            return this.getNodeStructure();
+        }
+    }]);
+
+    return AbstractCustomNode;
+}();
+
+exports.AbstractCustomNode = AbstractCustomNode;
+
 /***/ },
 /* 7 */
 /***/ function(module, exports) {
@@ -1187,7 +1187,7 @@ var esprima = __webpack_require__(22);
 var escodegen = __webpack_require__(11);
 var ObfuscationResult_1 = __webpack_require__(18);
 var Obfuscator_1 = __webpack_require__(26);
-var Options_1 = __webpack_require__(55);
+var Options_1 = __webpack_require__(54);
 var SourceMapCorrector_1 = __webpack_require__(27);
 
 var JavaScriptObfuscatorInternal = function () {
@@ -1255,23 +1255,23 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
 
 var estraverse = __webpack_require__(3);
 var AppendState_1 = __webpack_require__(4);
-var NodeType_1 = __webpack_require__(6);
-var CatchClauseObfuscator_1 = __webpack_require__(46);
-var ConsoleOutputNodesGroup_1 = __webpack_require__(41);
-var DebugProtectionNodesGroup_1 = __webpack_require__(42);
-var DomainLockNodesGroup_1 = __webpack_require__(43);
-var FunctionDeclarationObfuscator_1 = __webpack_require__(47);
-var FunctionObfuscator_1 = __webpack_require__(48);
-var LiteralObfuscator_1 = __webpack_require__(49);
-var MemberExpressionObfuscator_1 = __webpack_require__(50);
-var MethodDefinitionObfuscator_1 = __webpack_require__(51);
+var NodeType_1 = __webpack_require__(5);
+var CatchClauseObfuscator_1 = __webpack_require__(45);
+var ConsoleOutputNodesGroup_1 = __webpack_require__(40);
+var DebugProtectionNodesGroup_1 = __webpack_require__(41);
+var DomainLockNodesGroup_1 = __webpack_require__(42);
+var FunctionDeclarationObfuscator_1 = __webpack_require__(46);
+var FunctionObfuscator_1 = __webpack_require__(47);
+var LiteralObfuscator_1 = __webpack_require__(48);
+var MemberExpressionObfuscator_1 = __webpack_require__(49);
+var MethodDefinitionObfuscator_1 = __webpack_require__(50);
 var Nodes_1 = __webpack_require__(2);
 var NodeUtils_1 = __webpack_require__(1);
-var ObjectExpressionObfuscator_1 = __webpack_require__(52);
-var SelfDefendingNodesGroup_1 = __webpack_require__(44);
-var UnicodeArrayNodesGroup_1 = __webpack_require__(45);
-var VariableDeclarationObfuscator_1 = __webpack_require__(53);
-var StackTraceAnalyzer_1 = __webpack_require__(58);
+var ObjectExpressionObfuscator_1 = __webpack_require__(51);
+var SelfDefendingNodesGroup_1 = __webpack_require__(43);
+var UnicodeArrayNodesGroup_1 = __webpack_require__(44);
+var VariableDeclarationObfuscator_1 = __webpack_require__(52);
+var StackTraceAnalyzer_1 = __webpack_require__(57);
 
 var Obfuscator = function () {
     function Obfuscator(options) {
@@ -1470,8 +1470,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__(79);
-var mkdirp = __webpack_require__(80);
+var fs = __webpack_require__(78);
+var mkdirp = __webpack_require__(79);
 var path = __webpack_require__(23);
 var Utils_1 = __webpack_require__(0);
 
@@ -1562,7 +1562,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 commander = __webpack_require__(78);
+var commander = __webpack_require__(77);
 var path = __webpack_require__(23);
 var SourceMapMode_1 = __webpack_require__(12);
 var DefaultPreset_1 = __webpack_require__(21);
@@ -1700,8 +1700,8 @@ 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; }
 
 var AppendState_1 = __webpack_require__(4);
-var ConsoleOutputDisableExpressionTemplate_1 = __webpack_require__(63);
-var AbstractCustomNode_1 = __webpack_require__(5);
+var ConsoleOutputDisableExpressionTemplate_1 = __webpack_require__(62);
+var AbstractCustomNode_1 = __webpack_require__(6);
 var CustomNodeAppender_1 = __webpack_require__(15);
 var NodeUtils_1 = __webpack_require__(1);
 
@@ -1751,8 +1751,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 
 __webpack_require__(8);
 var AppendState_1 = __webpack_require__(4);
-var DebufProtectionFunctionCallTemplate_1 = __webpack_require__(64);
-var AbstractCustomNode_1 = __webpack_require__(5);
+var DebufProtectionFunctionCallTemplate_1 = __webpack_require__(63);
+var AbstractCustomNode_1 = __webpack_require__(6);
 var NodeUtils_1 = __webpack_require__(1);
 
 var DebugProtectionFunctionCallNode = function (_AbstractCustomNode_) {
@@ -1804,8 +1804,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 
 __webpack_require__(8);
 var AppendState_1 = __webpack_require__(4);
-var DebugProtectionFunctionIntervalTemplate_1 = __webpack_require__(65);
-var AbstractCustomNode_1 = __webpack_require__(5);
+var DebugProtectionFunctionIntervalTemplate_1 = __webpack_require__(64);
+var AbstractCustomNode_1 = __webpack_require__(6);
 var NodeUtils_1 = __webpack_require__(1);
 
 var DebugProtectionFunctionIntervalNode = function (_AbstractCustomNode_) {
@@ -1857,8 +1857,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 
 __webpack_require__(8);
 var AppendState_1 = __webpack_require__(4);
-var DebugProtectionFunctionTemplate_1 = __webpack_require__(66);
-var AbstractCustomNode_1 = __webpack_require__(5);
+var DebugProtectionFunctionTemplate_1 = __webpack_require__(65);
+var AbstractCustomNode_1 = __webpack_require__(6);
 var NodeUtils_1 = __webpack_require__(1);
 var Utils_1 = __webpack_require__(0);
 
@@ -1923,8 +1923,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 
 __webpack_require__(8);
 var AppendState_1 = __webpack_require__(4);
-var DomainLockNodeTemplate_1 = __webpack_require__(67);
-var AbstractCustomNode_1 = __webpack_require__(5);
+var DomainLockNodeTemplate_1 = __webpack_require__(66);
+var AbstractCustomNode_1 = __webpack_require__(6);
 var CustomNodeAppender_1 = __webpack_require__(15);
 var NodeUtils_1 = __webpack_require__(1);
 var Utils_1 = __webpack_require__(0);
@@ -1986,8 +1986,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 
 var AppendState_1 = __webpack_require__(4);
 var NoCustomNodesPreset_1 = __webpack_require__(17);
-var SelfDefendingTemplate_1 = __webpack_require__(68);
-var AbstractCustomNode_1 = __webpack_require__(5);
+var SelfDefendingTemplate_1 = __webpack_require__(67);
+var AbstractCustomNode_1 = __webpack_require__(6);
 var JavaScriptObfuscator_1 = __webpack_require__(9);
 var NodeUtils_1 = __webpack_require__(1);
 var CustomNodeAppender_1 = __webpack_require__(15);
@@ -2041,13 +2041,13 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 __webpack_require__(8);
 var AppendState_1 = __webpack_require__(4);
 var NoCustomNodesPreset_1 = __webpack_require__(17);
-var AtobTemplate_1 = __webpack_require__(62);
-var SelfDefendingTemplate_1 = __webpack_require__(83);
-var UnicodeArrayCallsWrapperTemplate_1 = __webpack_require__(69);
-var AbstractCustomNode_1 = __webpack_require__(5);
+var AtobTemplate_1 = __webpack_require__(61);
+var SelfDefendingTemplate_1 = __webpack_require__(68);
+var UnicodeArrayAtobDecodeNodeTemplate_1 = __webpack_require__(69);
+var UnicodeArrayCallsWrapperTemplate_1 = __webpack_require__(70);
+var AbstractCustomNode_1 = __webpack_require__(6);
 var JavaScriptObfuscator_1 = __webpack_require__(9);
 var NodeUtils_1 = __webpack_require__(1);
-var UnicodeArrayAtobDecodeNodeTemplate_1 = __webpack_require__(84);
 
 var UnicodeArrayCallsWrapper = function (_AbstractCustomNode_) {
     _inherits(UnicodeArrayCallsWrapper, _AbstractCustomNode_);
@@ -2085,21 +2085,22 @@ var UnicodeArrayCallsWrapper = function (_AbstractCustomNode_) {
     }, {
         key: 'getDecodeUnicodeArrayTemplate',
         value: function getDecodeUnicodeArrayTemplate() {
-            var forLoopFunctionName = 'forLoopFunc';
+            var decodeFunctionName = 'decodeFunction';
             var code = void 0;
             if (this.options.selfDefending) {
                 code = SelfDefendingTemplate_1.SelfDefendingTemplate().formatUnicorn({
-                    forLoopFunctionName: forLoopFunctionName,
+                    decodeFunctionName: decodeFunctionName,
+                    unicodeArrayCallsWrapperName: this.unicodeArrayCallsWrapperName,
                     unicodeArrayName: this.unicodeArrayName
                 });
             } else {
-                code = forLoopFunctionName + '();';
+                code = 'value = ' + decodeFunctionName + '(decodedValues, index, value);';
             }
             return UnicodeArrayAtobDecodeNodeTemplate_1.UnicodeArrayAtobDecodeNodeTemplate().formatUnicorn({
                 atobPolyfill: AtobTemplate_1.AtobTemplate(),
                 code: code,
-                forLoopFunctionName: forLoopFunctionName,
-                unicodeArrayName: this.unicodeArrayName
+                decodeFunctionName: decodeFunctionName,
+                unicodeArrayCallsWrapperName: this.unicodeArrayCallsWrapperName
             });
         }
     }, {
@@ -2120,8 +2121,7 @@ var UnicodeArrayCallsWrapper = function (_AbstractCustomNode_) {
 exports.UnicodeArrayCallsWrapper = UnicodeArrayCallsWrapper;
 
 /***/ },
-/* 38 */,
-/* 39 */
+/* 38 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2139,8 +2139,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 
 __webpack_require__(8);
 var AppendState_1 = __webpack_require__(4);
-var UnicodeArrayTemplate_1 = __webpack_require__(72);
-var AbstractCustomNode_1 = __webpack_require__(5);
+var UnicodeArrayTemplate_1 = __webpack_require__(71);
+var AbstractCustomNode_1 = __webpack_require__(6);
 var NodeUtils_1 = __webpack_require__(1);
 
 var UnicodeArrayNode = function (_AbstractCustomNode_) {
@@ -2207,7 +2207,7 @@ UnicodeArrayNode.UNICODE_ARRAY_RANDOM_LENGTH = 4;
 exports.UnicodeArrayNode = UnicodeArrayNode;
 
 /***/ },
-/* 40 */
+/* 39 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2226,9 +2226,9 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 __webpack_require__(8);
 var AppendState_1 = __webpack_require__(4);
 var NoCustomNodesPreset_1 = __webpack_require__(17);
-var SelfDefendingTemplate_1 = __webpack_require__(73);
-var UnicodeArrayRotateFunctionTemplate_1 = __webpack_require__(74);
-var AbstractCustomNode_1 = __webpack_require__(5);
+var SelfDefendingTemplate_1 = __webpack_require__(72);
+var UnicodeArrayRotateFunctionTemplate_1 = __webpack_require__(73);
+var AbstractCustomNode_1 = __webpack_require__(6);
 var JavaScriptObfuscator_1 = __webpack_require__(9);
 var NodeUtils_1 = __webpack_require__(1);
 var Utils_1 = __webpack_require__(0);
@@ -2291,7 +2291,7 @@ var UnicodeArrayRotateFunctionNode = function (_AbstractCustomNode_) {
 exports.UnicodeArrayRotateFunctionNode = UnicodeArrayRotateFunctionNode;
 
 /***/ },
-/* 41 */
+/* 40 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2327,7 +2327,7 @@ var ConsoleOutputNodesGroup = function (_AbstractNodesGroup_) {
 exports.ConsoleOutputNodesGroup = ConsoleOutputNodesGroup;
 
 /***/ },
-/* 42 */
+/* 41 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2371,7 +2371,7 @@ var DebugProtectionNodesGroup = function (_AbstractNodesGroup_) {
 exports.DebugProtectionNodesGroup = DebugProtectionNodesGroup;
 
 /***/ },
-/* 43 */
+/* 42 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2407,7 +2407,7 @@ var DomainLockNodesGroup = function (_AbstractNodesGroup_) {
 exports.DomainLockNodesGroup = DomainLockNodesGroup;
 
 /***/ },
-/* 44 */
+/* 43 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2443,7 +2443,7 @@ var SelfDefendingNodesGroup = function (_AbstractNodesGroup_) {
 exports.SelfDefendingNodesGroup = SelfDefendingNodesGroup;
 
 /***/ },
-/* 45 */
+/* 44 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2458,8 +2458,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 var AbstractNodesGroup_1 = __webpack_require__(10);
 var UnicodeArray_1 = __webpack_require__(28);
 var UnicodeArrayCallsWrapper_1 = __webpack_require__(37);
-var UnicodeArrayNode_1 = __webpack_require__(39);
-var UnicodeArrayRotateFunctionNode_1 = __webpack_require__(40);
+var UnicodeArrayNode_1 = __webpack_require__(38);
+var UnicodeArrayRotateFunctionNode_1 = __webpack_require__(39);
 var Utils_1 = __webpack_require__(0);
 
 var UnicodeArrayNodesGroup = function (_AbstractNodesGroup_) {
@@ -2499,7 +2499,7 @@ var UnicodeArrayNodesGroup = function (_AbstractNodesGroup_) {
 exports.UnicodeArrayNodesGroup = UnicodeArrayNodesGroup;
 
 /***/ },
-/* 46 */
+/* 45 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2514,7 +2514,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; }
 
 var estraverse = __webpack_require__(3);
-var NodeType_1 = __webpack_require__(6);
+var NodeType_1 = __webpack_require__(5);
 var AbstractNodeObfuscator_1 = __webpack_require__(7);
 var IdentifierReplacer_1 = __webpack_require__(14);
 var Nodes_1 = __webpack_require__(2);
@@ -2570,7 +2570,7 @@ var CatchClauseObfuscator = function (_AbstractNodeObfuscat) {
 exports.CatchClauseObfuscator = CatchClauseObfuscator;
 
 /***/ },
-/* 47 */
+/* 46 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2585,7 +2585,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; }
 
 var estraverse = __webpack_require__(3);
-var NodeType_1 = __webpack_require__(6);
+var NodeType_1 = __webpack_require__(5);
 var AbstractNodeObfuscator_1 = __webpack_require__(7);
 var IdentifierReplacer_1 = __webpack_require__(14);
 var Nodes_1 = __webpack_require__(2);
@@ -2645,7 +2645,7 @@ var FunctionDeclarationObfuscator = function (_AbstractNodeObfuscat) {
 exports.FunctionDeclarationObfuscator = FunctionDeclarationObfuscator;
 
 /***/ },
-/* 48 */
+/* 47 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2660,7 +2660,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; }
 
 var estraverse = __webpack_require__(3);
-var NodeType_1 = __webpack_require__(6);
+var NodeType_1 = __webpack_require__(5);
 var AbstractNodeObfuscator_1 = __webpack_require__(7);
 var IdentifierReplacer_1 = __webpack_require__(14);
 var Nodes_1 = __webpack_require__(2);
@@ -2726,7 +2726,7 @@ var FunctionObfuscator = function (_AbstractNodeObfuscat) {
 exports.FunctionObfuscator = FunctionObfuscator;
 
 /***/ },
-/* 49 */
+/* 48 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2744,7 +2744,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 
 var escodegen = __webpack_require__(11);
 var AbstractNodeObfuscator_1 = __webpack_require__(7);
-var BooleanLiteralReplacer_1 = __webpack_require__(54);
+var BooleanLiteralReplacer_1 = __webpack_require__(53);
 var Nodes_1 = __webpack_require__(2);
 var NumberLiteralReplacer_1 = __webpack_require__(20);
 var StringLiteralReplacer_1 = __webpack_require__(16);
@@ -2791,7 +2791,7 @@ var LiteralObfuscator = function (_AbstractNodeObfuscat) {
 exports.LiteralObfuscator = LiteralObfuscator;
 
 /***/ },
-/* 50 */
+/* 49 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2807,7 +2807,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 
 var escodegen = __webpack_require__(11);
 var estraverse = __webpack_require__(3);
-var NodeType_1 = __webpack_require__(6);
+var NodeType_1 = __webpack_require__(5);
 var AbstractNodeObfuscator_1 = __webpack_require__(7);
 var Nodes_1 = __webpack_require__(2);
 var StringLiteralReplacer_1 = __webpack_require__(16);
@@ -2876,7 +2876,7 @@ var MemberExpressionObfuscator = function (_AbstractNodeObfuscat) {
 exports.MemberExpressionObfuscator = MemberExpressionObfuscator;
 
 /***/ },
-/* 51 */
+/* 50 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2937,7 +2937,7 @@ var MethodDefinitionObfuscator = function (_AbstractNodeObfuscat) {
 exports.MethodDefinitionObfuscator = MethodDefinitionObfuscator;
 
 /***/ },
-/* 52 */
+/* 51 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2953,7 +2953,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
 
 var escodegen = __webpack_require__(11);
 var estraverse = __webpack_require__(3);
-var NodeType_1 = __webpack_require__(6);
+var NodeType_1 = __webpack_require__(5);
 var AbstractNodeObfuscator_1 = __webpack_require__(7);
 var Nodes_1 = __webpack_require__(2);
 var Utils_1 = __webpack_require__(0);
@@ -3023,7 +3023,7 @@ var ObjectExpressionObfuscator = function (_AbstractNodeObfuscat) {
 exports.ObjectExpressionObfuscator = ObjectExpressionObfuscator;
 
 /***/ },
-/* 53 */
+/* 52 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -3038,7 +3038,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; }
 
 var estraverse = __webpack_require__(3);
-var NodeType_1 = __webpack_require__(6);
+var NodeType_1 = __webpack_require__(5);
 var AbstractNodeObfuscator_1 = __webpack_require__(7);
 var IdentifierReplacer_1 = __webpack_require__(14);
 var Nodes_1 = __webpack_require__(2);
@@ -3100,7 +3100,7 @@ var VariableDeclarationObfuscator = function (_AbstractNodeObfuscat) {
 exports.VariableDeclarationObfuscator = VariableDeclarationObfuscator;
 
 /***/ },
-/* 54 */
+/* 53 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -3139,7 +3139,7 @@ var BooleanLiteralReplacer = function (_AbstractReplacer_1$A) {
 exports.BooleanLiteralReplacer = BooleanLiteralReplacer;
 
 /***/ },
-/* 55 */
+/* 54 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -3160,11 +3160,11 @@ var __decorate = undefined && undefined.__decorate || function (decorators, targ
 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 class_validator_1 = __webpack_require__(77);
-var TSourceMapMode_1 = __webpack_require__(75);
+var class_validator_1 = __webpack_require__(76);
+var TSourceMapMode_1 = __webpack_require__(74);
 var DefaultPreset_1 = __webpack_require__(21);
-var OptionsNormalizer_1 = __webpack_require__(56);
-var ValidationErrorsFormatter_1 = __webpack_require__(57);
+var OptionsNormalizer_1 = __webpack_require__(55);
+var ValidationErrorsFormatter_1 = __webpack_require__(56);
 
 var Options = function Options(obfuscatorOptions) {
     _classCallCheck(this, Options);
@@ -3210,7 +3210,7 @@ exports.Options = Options;
 var _a;
 
 /***/ },
-/* 56 */
+/* 55 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -3379,7 +3379,7 @@ OptionsNormalizer.normalizerRules = [OptionsNormalizer.domainLockRule, OptionsNo
 exports.OptionsNormalizer = OptionsNormalizer;
 
 /***/ },
-/* 57 */
+/* 56 */
 /***/ function(module, exports) {
 
 "use strict";
@@ -3446,7 +3446,7 @@ var ValidationErrorsFormatter = function () {
 exports.ValidationErrorsFormatter = ValidationErrorsFormatter;
 
 /***/ },
-/* 58 */
+/* 57 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -3457,10 +3457,10 @@ 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 estraverse = __webpack_require__(3);
-var NodeType_1 = __webpack_require__(6);
-var FunctionDeclarationCalleeDataExtractor_1 = __webpack_require__(59);
-var FunctionExpressionCalleeDataExtractor_1 = __webpack_require__(60);
-var ObjectExpressionCalleeDataExtractor_1 = __webpack_require__(61);
+var NodeType_1 = __webpack_require__(5);
+var FunctionDeclarationCalleeDataExtractor_1 = __webpack_require__(58);
+var FunctionExpressionCalleeDataExtractor_1 = __webpack_require__(59);
+var ObjectExpressionCalleeDataExtractor_1 = __webpack_require__(60);
 var Nodes_1 = __webpack_require__(2);
 var NodeUtils_1 = __webpack_require__(1);
 
@@ -3537,7 +3537,7 @@ var StackTraceAnalyzer = function () {
 exports.StackTraceAnalyzer = StackTraceAnalyzer;
 
 /***/ },
-/* 59 */
+/* 58 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -3596,7 +3596,7 @@ var FunctionDeclarationCalleeDataExtractor = function () {
 exports.FunctionDeclarationCalleeDataExtractor = FunctionDeclarationCalleeDataExtractor;
 
 /***/ },
-/* 60 */
+/* 59 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -3658,7 +3658,7 @@ var FunctionExpressionCalleeDataExtractor = function () {
 exports.FunctionExpressionCalleeDataExtractor = FunctionExpressionCalleeDataExtractor;
 
 /***/ },
-/* 61 */
+/* 60 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -3789,7 +3789,7 @@ var ObjectExpressionCalleeDataExtractor = function () {
 exports.ObjectExpressionCalleeDataExtractor = ObjectExpressionCalleeDataExtractor;
 
 /***/ },
-/* 62 */
+/* 61 */
 /***/ function(module, exports) {
 
 "use strict";
@@ -3801,7 +3801,7 @@ function AtobTemplate() {
 exports.AtobTemplate = AtobTemplate;
 
 /***/ },
-/* 63 */
+/* 62 */
 /***/ function(module, exports) {
 
 "use strict";
@@ -3813,7 +3813,7 @@ function ConsoleOutputDisableExpressionTemplate() {
 exports.ConsoleOutputDisableExpressionTemplate = ConsoleOutputDisableExpressionTemplate;
 
 /***/ },
-/* 64 */
+/* 63 */
 /***/ function(module, exports) {
 
 "use strict";
@@ -3825,7 +3825,7 @@ function DebugProtectionFunctionCallTemplate() {
 exports.DebugProtectionFunctionCallTemplate = DebugProtectionFunctionCallTemplate;
 
 /***/ },
-/* 65 */
+/* 64 */
 /***/ function(module, exports) {
 
 "use strict";
@@ -3837,7 +3837,7 @@ function DebugProtectionFunctionIntervalTemplate() {
 exports.DebugProtectionFunctionIntervalTemplate = DebugProtectionFunctionIntervalTemplate;
 
 /***/ },
-/* 66 */
+/* 65 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -3850,7 +3850,7 @@ function DebugProtectionFunctionTemplate() {
 exports.DebugProtectionFunctionTemplate = DebugProtectionFunctionTemplate;
 
 /***/ },
-/* 67 */
+/* 66 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -3863,7 +3863,7 @@ function DomainLockNodeTemplate() {
 exports.DomainLockNodeTemplate = DomainLockNodeTemplate;
 
 /***/ },
-/* 68 */
+/* 67 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -3875,6 +3875,19 @@ function SelfDefendingTemplate() {
 }
 exports.SelfDefendingTemplate = SelfDefendingTemplate;
 
+/***/ },
+/* 68 */
+/***/ function(module, exports, __webpack_require__) {
+
+"use strict";
+"use strict";
+
+var Utils_1 = __webpack_require__(0);
+function SelfDefendingTemplate() {
+    return '\n        var func = function(){return \'dev\';};\n                           \n        !{unicodeArrayCallsWrapperName}.flag ? ({unicodeArrayCallsWrapperName}.flag = true, Function(' + Utils_1.Utils.stringToUnicode('return/\\w+ *\\(\\) *{\\w+ *[\'|"].+[\'|"];? *}/') + ')()[\'test\'](func[\'toString\']()) !== true && !{unicodeArrayName}++ ? [][\'filter\'][\'constructor\'](' + Utils_1.Utils.stringToJSFuck('while') + ' + \'(true){}\')() : (value = Function(\'a\', \'b\', \'c\', \'d\', \'return a.call(null, b, c, d)\')({decodeFunctionName}, decodedValues, index, value)) ? [][\'filter\'][\'constructor\'](' + Utils_1.Utils.stringToJSFuck('while') + ' + \'(false){}\')() : [][\'filter\'][\'constructor\'](' + Utils_1.Utils.stringToJSFuck('while') + ' + \'(false){}\')()) : (value = Function(\'a\', \'b\', \'c\', \'d\', \'return a.call(null, b, c, d)\')({decodeFunctionName}, decodedValues, index, value));\n    ';
+}
+exports.SelfDefendingTemplate = SelfDefendingTemplate;
+
 /***/ },
 /* 69 */
 /***/ function(module, exports) {
@@ -3882,15 +3895,25 @@ exports.SelfDefendingTemplate = SelfDefendingTemplate;
 "use strict";
 "use strict";
 
+function UnicodeArrayAtobDecodeNodeTemplate() {
+    return "        \n        {atobPolyfill}\n                \n        var decodedValues = {unicodeArrayCallsWrapperName}.data || {};\n        \n        var {decodeFunctionName} = function (decodedValues, index, value) {\n            if (!decodedValues[index]) {\n                value = decodeURI(atob(value));\n                decodedValues[index] = value;\n            } else {\n                value = decodedValues[index];\n            }  \n            \n            {unicodeArrayCallsWrapperName}.data = decodedValues;\n                                    \n            return value;\n        }\n        \n        {code}\n    ";
+}
+exports.UnicodeArrayAtobDecodeNodeTemplate = UnicodeArrayAtobDecodeNodeTemplate;
+
+/***/ },
+/* 70 */
+/***/ function(module, exports) {
+
+"use strict";
+"use strict";
+
 function UnicodeArrayCallsWrapperTemplate() {
-    return "\n        var {unicodeArrayCallsWrapperName} = function (index, key) {\n            var value = {unicodeArrayName}[parseInt(index, 0x010)]\n            \n            {decodeNodeTemplate}\n        \n            return value;\n        };\n    ";
+    return "\n        var {unicodeArrayCallsWrapperName} = function (index, key) {\n            var index = parseInt(index, 0x010);\n            var value = {unicodeArrayName}[index];\n            \n            {decodeNodeTemplate}\n        \n            return value;\n        };\n    ";
 }
 exports.UnicodeArrayCallsWrapperTemplate = UnicodeArrayCallsWrapperTemplate;
 
 /***/ },
-/* 70 */,
-/* 71 */,
-/* 72 */
+/* 71 */
 /***/ function(module, exports) {
 
 "use strict";
@@ -3902,7 +3925,7 @@ function UnicodeArrayTemplate() {
 exports.UnicodeArrayTemplate = UnicodeArrayTemplate;
 
 /***/ },
-/* 73 */
+/* 72 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -3915,7 +3938,7 @@ function SelfDefendingTemplate() {
 exports.SelfDefendingTemplate = SelfDefendingTemplate;
 
 /***/ },
-/* 74 */
+/* 73 */
 /***/ function(module, exports) {
 
 "use strict";
@@ -3927,45 +3950,45 @@ function UnicodeArrayRotateFunctionTemplate() {
 exports.UnicodeArrayRotateFunctionTemplate = UnicodeArrayRotateFunctionTemplate;
 
 /***/ },
-/* 75 */
+/* 74 */
 /***/ function(module, exports) {
 
 "use strict";
 "use strict";
 
 /***/ },
-/* 76 */
+/* 75 */
 /***/ function(module, exports) {
 
 module.exports = require("chance");
 
 /***/ },
-/* 77 */
+/* 76 */
 /***/ function(module, exports) {
 
 module.exports = require("class-validator");
 
 /***/ },
-/* 78 */
+/* 77 */
 /***/ function(module, exports) {
 
 module.exports = require("commander");
 
 /***/ },
-/* 79 */
+/* 78 */
 /***/ function(module, exports) {
 
 module.exports = require("fs");
 
 /***/ },
-/* 80 */
+/* 79 */
 /***/ function(module, exports) {
 
 module.exports = require("mkdirp");
 
 /***/ },
-/* 81 */,
-/* 82 */
+/* 80 */,
+/* 81 */
 /***/ function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -3977,31 +4000,6 @@ if (!global._babelPolyfill) {
 }
 module.exports = JavaScriptObfuscator_1.JavaScriptObfuscator;
 
-/***/ },
-/* 83 */
-/***/ function(module, exports, __webpack_require__) {
-
-"use strict";
-"use strict";
-
-var Utils_1 = __webpack_require__(0);
-function SelfDefendingTemplate() {
-    return '\n        var func = function(){return \'dev\';};\n           \n        Function(' + Utils_1.Utils.stringToUnicode('return/\\w+ *\\(\\) *{\\w+ *[\'|"].+[\'|"];? *}/') + ')()[\'test\'](func[\'toString\']()) !== true && !{unicodeArrayName}++ ? [][\'filter\'][\'constructor\'](' + Utils_1.Utils.stringToJSFuck('while') + ' + \'(true){}\')() : Function(\'a\', atob(' + Utils_1.Utils.stringToUnicode(Utils_1.Utils.btoa('a.call()')) + '))({forLoopFunctionName}) ? [][\'filter\'][\'constructor\'](' + Utils_1.Utils.stringToJSFuck('while') + ' + \'(false){}\')() : [][\'filter\'][\'constructor\'](' + Utils_1.Utils.stringToJSFuck('while') + ' + \'(false){}\')();\n    ';
-}
-exports.SelfDefendingTemplate = SelfDefendingTemplate;
-
-/***/ },
-/* 84 */
-/***/ function(module, exports) {
-
-"use strict";
-"use strict";
-
-function UnicodeArrayAtobDecodeNodeTemplate() {
-    return "\n        var decodedIndices = [];\n    \n        if (decodedIndices.indexOf(index) === -1) {\n            value = atob(value);\n        }\n    ";
-}
-exports.UnicodeArrayAtobDecodeNodeTemplate = UnicodeArrayAtobDecodeNodeTemplate;
-
 /***/ }
 /******/ ]);
 //# sourceMappingURL=index.js.map

+ 12 - 9
src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.ts

@@ -12,13 +12,13 @@ import { NO_CUSTOM_NODES_PRESET } from '../../preset-options/NoCustomNodesPreset
 
 import { AtobTemplate } from '../../templates/custom-nodes/AtobTemplate';
 import { SelfDefendingTemplate } from '../../templates/custom-nodes/unicode-array-nodes/unicode-array-calls-wrapper/SelfDefendingTemplate';
+import { UnicodeArrayAtobDecodeNodeTemplate } from '../../templates/custom-nodes/unicode-array-nodes/unicode-array-calls-wrapper/UnicodeArrayAtobDecodeNodeTemplate';
 import { UnicodeArrayCallsWrapperTemplate } from '../../templates/custom-nodes/unicode-array-nodes/unicode-array-calls-wrapper/UnicodeArrayCallsWrapperTemplate';
 
 import { AbstractCustomNode } from '../AbstractCustomNode';
 import { JavaScriptObfuscator } from '../../JavaScriptObfuscator';
 import { NodeUtils } from '../../NodeUtils';
 import { UnicodeArray } from '../../UnicodeArray';
-import { UnicodeArrayAtobDecodeNodeTemplate } from '../../templates/custom-nodes/unicode-array-nodes/unicode-array-calls-wrapper/UnicodeArrayAtobDecodeNodeTemplate';
 
 export class UnicodeArrayCallsWrapper extends AbstractCustomNode {
     /**
@@ -86,27 +86,28 @@ export class UnicodeArrayCallsWrapper extends AbstractCustomNode {
     }
 
     /**
-     * @returns {any}
+     * @returns {string}
      */
     protected getDecodeUnicodeArrayTemplate (): string {
-        const forLoopFunctionName: string = 'forLoopFunc';
+        const decodeFunctionName: string = 'decodeFunction';
 
         let code: string;
 
         if (this.options.selfDefending) {
             code = SelfDefendingTemplate().formatUnicorn({
-                forLoopFunctionName,
+                decodeFunctionName,
+                unicodeArrayCallsWrapperName: this.unicodeArrayCallsWrapperName,
                 unicodeArrayName: this.unicodeArrayName
             });
         } else {
-            code = `${forLoopFunctionName}();`;
+            code = `value = ${decodeFunctionName}(decodedValues, index, value);`;
         }
 
         return UnicodeArrayAtobDecodeNodeTemplate().formatUnicorn({
             atobPolyfill: AtobTemplate(),
             code,
-            forLoopFunctionName,
-            unicodeArrayName: this.unicodeArrayName
+            decodeFunctionName,
+            unicodeArrayCallsWrapperName: this.unicodeArrayCallsWrapperName
         })
     }
 
@@ -114,12 +115,14 @@ export class UnicodeArrayCallsWrapper extends AbstractCustomNode {
      * @returns {ESTree.Node}
      */
     protected getNodeStructure (): ESTree.Node {
-        let decodeNodeTemplate: string = this.options.encodeUnicodeLiterals ? this.getDecodeUnicodeArrayTemplate() : '';
+        const decodeNodeTemplate: string = this.options.encodeUnicodeLiterals ?
+            this.getDecodeUnicodeArrayTemplate() :
+            '';
 
         return NodeUtils.convertCodeToStructure(
             JavaScriptObfuscator.obfuscate(
                 UnicodeArrayCallsWrapperTemplate().formatUnicorn({
-                    decodeNodeTemplate: decodeNodeTemplate,
+                    decodeNodeTemplate,
                     unicodeArrayCallsWrapperName: this.unicodeArrayCallsWrapperName,
                     unicodeArrayName: this.unicodeArrayName
                 }),

+ 2 - 2
src/templates/custom-nodes/unicode-array-nodes/unicode-array-calls-wrapper/SelfDefendingTemplate.ts

@@ -6,7 +6,7 @@ import { Utils } from '../../../../Utils';
 export function SelfDefendingTemplate (): string {
     return `
         var func = function(){return 'dev';};
-           
-        Function(${Utils.stringToUnicode(`return/\\w+ *\\(\\) *{\\w+ *['|"].+['|"];? *}/`)})()['test'](func['toString']()) !== true && !{unicodeArrayName}++ ? []['filter']['constructor'](${Utils.stringToJSFuck('while')} + '(true){}')() : Function('a', atob(${Utils.stringToUnicode(Utils.btoa('a.call()'))}))({forLoopFunctionName}) ? []['filter']['constructor'](${Utils.stringToJSFuck('while')} + '(false){}')() : []['filter']['constructor'](${Utils.stringToJSFuck('while')} + '(false){}')();
+                           
+        !{unicodeArrayCallsWrapperName}.flag ? ({unicodeArrayCallsWrapperName}.flag = true, Function(${Utils.stringToUnicode(`return/\\w+ *\\(\\) *{\\w+ *['|"].+['|"];? *}/`)})()['test'](func['toString']()) !== true && !{unicodeArrayName}++ ? []['filter']['constructor'](${Utils.stringToJSFuck('while')} + '(true){}')() : (value = Function('a', 'b', 'c', 'd', 'return a.call(null, b, c, d)')({decodeFunctionName}, decodedValues, index, value)) ? []['filter']['constructor'](${Utils.stringToJSFuck('while')} + '(false){}')() : []['filter']['constructor'](${Utils.stringToJSFuck('while')} + '(false){}')()) : (value = Function('a', 'b', 'c', 'd', 'return a.call(null, b, c, d)')({decodeFunctionName}, decodedValues, index, value));
     `;
 }

+ 18 - 5
src/templates/custom-nodes/unicode-array-nodes/unicode-array-calls-wrapper/UnicodeArrayAtobDecodeNodeTemplate.ts

@@ -2,11 +2,24 @@
  * @returns {string}
  */
 export function UnicodeArrayAtobDecodeNodeTemplate (): string {
-    return `
-        var decodedIndices = [];
-    
-        if (decodedIndices.indexOf(index) === -1) {
-            value = atob(value);
+    return `        
+        {atobPolyfill}
+                
+        var decodedValues = {unicodeArrayCallsWrapperName}.data || {};
+        
+        var {decodeFunctionName} = function (decodedValues, index, value) {
+            if (!decodedValues[index]) {
+                value = decodeURI(atob(value));
+                decodedValues[index] = value;
+            } else {
+                value = decodedValues[index];
+            }  
+            
+            {unicodeArrayCallsWrapperName}.data = decodedValues;
+                                    
+            return value;
         }
+        
+        {code}
     `;
 }

+ 2 - 1
src/templates/custom-nodes/unicode-array-nodes/unicode-array-calls-wrapper/UnicodeArrayCallsWrapperTemplate.ts

@@ -4,7 +4,8 @@
 export function UnicodeArrayCallsWrapperTemplate (): string {
     return `
         var {unicodeArrayCallsWrapperName} = function (index, key) {
-            var value = {unicodeArrayName}[parseInt(index, 0x010)]
+            var index = parseInt(index, 0x010);
+            var value = {unicodeArrayName}[index];
             
             {decodeNodeTemplate}
         

+ 1 - 1
test/functional-tests/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.spec.ts

@@ -15,7 +15,7 @@ describe('UnicodeArrayCallsWrapper', () => {
 
         assert.match(
             obfuscationResult.getObfuscatedCode(),
-            /var *_0x([a-z0-9]){4,6} *= *_0x([a-z0-9]){4}\[parseInt\(_0x([a-z0-9]){4,6}, *0x10\)\];/
+            /var *_0x([a-z0-9]){4,6} *= *parseInt\(_0x([a-z0-9]){4,6}, *0x10\);/
         );
     });
 });

+ 54 - 0
test/functional-tests/templates/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapperNodeTemplate.spec.ts

@@ -0,0 +1,54 @@
+import 'format-unicorn';
+
+import { AtobTemplate } from '../../../../../src/templates/custom-nodes/AtobTemplate';
+import { UnicodeArrayAtobDecodeNodeTemplate } from '../../../../../src/templates/custom-nodes/unicode-array-nodes/unicode-array-calls-wrapper/UnicodeArrayAtobDecodeNodeTemplate';
+import { UnicodeArrayCallsWrapperTemplate } from '../../../../../src/templates/custom-nodes/unicode-array-nodes/unicode-array-calls-wrapper/UnicodeArrayCallsWrapperTemplate';
+
+import { Utils } from '../../../../../src/Utils';
+
+const assert: Chai.AssertStatic = require('chai').assert;
+
+/**
+ * @param templateData
+ * @param unicodeArrayName
+ * @param unicodeArrayCallsWrapperName
+ * @param index
+ * @returns {Function}
+ */
+function getFunctionFromTemplate (
+    templateData: any,
+    unicodeArrayName: string,
+    unicodeArrayCallsWrapperName: string,
+    index: string
+) {
+    let unicodeArrayCallsWrapperTemplate: string = UnicodeArrayCallsWrapperTemplate().formatUnicorn(templateData);
+
+    return Function(`
+        var ${unicodeArrayName} = ['${Utils.btoa('test1')}'];
+    
+        ${unicodeArrayCallsWrapperTemplate}
+        
+        return ${unicodeArrayCallsWrapperName}(${index});
+    `)();
+}
+
+describe('UnicodeArrayCallsWrapperNodeTemplate (): string', () => {
+    let decodeFunctionName: string = 'decodeFunction',
+        unicodeArrayName: string = 'unicodeArrayName',
+        unicodeArrayCallsWrapperName: string = 'unicodeArrayCallsWrapperName',
+        atobDecodeNodeTemplate: string = UnicodeArrayAtobDecodeNodeTemplate().formatUnicorn({
+            atobPolyfill: AtobTemplate(),
+            code: `value = ${decodeFunctionName}(decodedValues, index, value);`,
+            decodeFunctionName,
+            unicodeArrayCallsWrapperName
+        });
+
+    it('should correctly returns decoded value with atob encoding', () => {
+        assert.deepEqual(getFunctionFromTemplate({
+            decodeNodeTemplate: atobDecodeNodeTemplate,
+            unicodeArrayCallsWrapperName,
+            unicodeArrayName
+        }, unicodeArrayName, unicodeArrayCallsWrapperName, '0x0'), 'test1');
+    });
+
+});

+ 0 - 41
test/functional-tests/templates/custom-nodes/unicode-array-nodes/UnicodeArrayDecodeNodeTemplate.spec.ts

@@ -1,41 +0,0 @@
-import 'format-unicorn';
-
-import { AtobTemplate } from '../../../../../src/templates/custom-nodes/AtobTemplate';
-import { UnicodeArrayAtobDecodeNodeTemplate } from '../../../../../src/templates/custom-nodes/unicode-array-nodes/unicode-array-calls-wrapper/UnicodeArrayAtobDecodeNodeTemplate';
-
-import { Utils } from '../../../../../src/Utils';
-
-const assert: Chai.AssertStatic = require('chai').assert;
-
-/**
- * @param templateData
- * @param unicodeArrayName
- * @returns {Function}
- */
-function getFunctionFromTemplate (templateData: any, unicodeArrayName: string) {
-    let domainLockTemplate: string = UnicodeArrayAtobDecodeNodeTemplate().formatUnicorn(templateData);
-
-    return Function(`
-        var ${unicodeArrayName} = ['${Utils.btoa('test1')}', '${Utils.btoa('test2')}'];
-    
-        ${domainLockTemplate}
-        
-        return ${unicodeArrayName};
-    `)();
-}
-
-describe('UnicodeArrayAtobDecodeNodeTemplate (): string', () => {
-    let forLoopFunctionName: string = 'forLoop',
-        code: string = `${forLoopFunctionName}();`,
-        unicodeArrayName: string = 'unicodeArray';
-
-    it('should correctly decode unicode array items from Base64', () => {
-        assert.deepEqual(getFunctionFromTemplate({
-            atobPolyfill: AtobTemplate(),
-            code,
-            forLoopFunctionName,
-            unicodeArrayName: unicodeArrayName
-        }, unicodeArrayName), ['test1', 'test2']);
-    });
-
-});

+ 1 - 1
test/index.spec.ts

@@ -37,7 +37,7 @@ import './functional-tests/node-obfuscators/ObjectExpressionObfuscator.spec';
 import './functional-tests/node-obfuscators/VariableDeclarationObfuscator.spec';
 import './functional-tests/stack-trace-analyzer/StackTraceAnalyzer.spec';
 import './functional-tests/templates/custom-nodes/domain-lock-nodes/DomainLockNodeTemplate.spec';
-import './functional-tests/templates/custom-nodes/unicode-array-nodes/UnicodeArrayDecodeNodeTemplate.spec';
+import './functional-tests/templates/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapperNodeTemplate.spec';
 
 /**
  * Performance tests