js-confuser 1.7.2 → 2.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +6 -4
- package/.github/workflows/node.js.yml +1 -1
- package/CHANGELOG.md +105 -0
- package/Migration.md +57 -0
- package/README.md +23 -913
- package/dist/constants.js +69 -13
- package/dist/index.js +108 -152
- package/dist/obfuscator.js +316 -118
- package/dist/options.js +1 -109
- package/dist/order.js +30 -30
- package/dist/presets.js +47 -45
- package/dist/probability.js +25 -32
- package/dist/templates/bufferToStringTemplate.js +9 -0
- package/dist/templates/deadCodeTemplates.js +9 -0
- package/dist/templates/getGlobalTemplate.js +19 -0
- package/dist/templates/integrityTemplate.js +30 -0
- package/dist/templates/setFunctionLengthTemplate.js +9 -0
- package/dist/templates/stringCompressionTemplate.js +10 -0
- package/dist/templates/tamperProtectionTemplates.js +21 -0
- package/dist/templates/template.js +213 -93
- package/dist/transforms/astScrambler.js +100 -0
- package/dist/transforms/calculator.js +70 -127
- package/dist/transforms/controlFlowFlattening.js +1182 -0
- package/dist/transforms/deadCode.js +62 -577
- package/dist/transforms/dispatcher.js +300 -309
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +88 -189
- package/dist/transforms/extraction/objectExtraction.js +131 -215
- package/dist/transforms/finalizer.js +56 -59
- package/dist/transforms/flatten.js +275 -276
- package/dist/transforms/functionOutlining.js +230 -0
- package/dist/transforms/identifier/globalConcealing.js +217 -103
- package/dist/transforms/identifier/movedDeclarations.js +167 -91
- package/dist/transforms/identifier/renameVariables.js +240 -187
- package/dist/transforms/lock/integrity.js +61 -184
- package/dist/transforms/lock/lock.js +263 -303
- package/dist/transforms/minify.js +431 -436
- package/dist/transforms/opaquePredicates.js +65 -118
- package/dist/transforms/pack.js +160 -0
- package/dist/transforms/plugin.js +179 -0
- package/dist/transforms/preparation.js +263 -163
- package/dist/transforms/renameLabels.js +132 -56
- package/dist/transforms/rgf.js +142 -240
- package/dist/transforms/shuffle.js +52 -145
- package/dist/transforms/string/encoding.js +45 -173
- package/dist/transforms/string/stringCompression.js +81 -126
- package/dist/transforms/string/stringConcealing.js +189 -224
- package/dist/transforms/string/stringEncoding.js +32 -40
- package/dist/transforms/string/stringSplitting.js +54 -55
- package/dist/transforms/variableMasking.js +232 -0
- package/dist/utils/ControlObject.js +125 -0
- package/dist/utils/IntGen.js +46 -0
- package/dist/utils/NameGen.js +106 -0
- package/dist/utils/ast-utils.js +560 -0
- package/dist/utils/function-utils.js +56 -0
- package/dist/utils/gen-utils.js +48 -0
- package/dist/utils/node.js +77 -0
- package/dist/utils/object-utils.js +21 -0
- package/dist/utils/random-utils.js +91 -0
- package/dist/utils/static-utils.js +64 -0
- package/dist/validateOptions.js +122 -0
- package/index.d.ts +1 -17
- package/package.json +27 -22
- package/src/constants.ts +139 -77
- package/src/index.ts +70 -163
- package/src/obfuscationResult.ts +43 -0
- package/src/obfuscator.ts +328 -135
- package/src/options.ts +154 -623
- package/src/order.ts +14 -14
- package/src/presets.ts +39 -34
- package/src/probability.ts +21 -36
- package/src/templates/{bufferToString.ts → bufferToStringTemplate.ts} +5 -54
- package/src/templates/deadCodeTemplates.ts +1185 -0
- package/src/templates/getGlobalTemplate.ts +72 -0
- package/src/templates/integrityTemplate.ts +69 -0
- package/src/templates/setFunctionLengthTemplate.ts +11 -0
- package/src/templates/stringCompressionTemplate.ts +42 -0
- package/src/templates/tamperProtectionTemplates.ts +116 -0
- package/src/templates/template.ts +183 -92
- package/src/transforms/astScrambler.ts +99 -0
- package/src/transforms/calculator.ts +96 -224
- package/src/transforms/controlFlowFlattening.ts +1594 -0
- package/src/transforms/deadCode.ts +85 -628
- package/src/transforms/dispatcher.ts +431 -636
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -299
- package/src/transforms/extraction/objectExtraction.ts +160 -333
- package/src/transforms/finalizer.ts +63 -64
- package/src/transforms/flatten.ts +439 -557
- package/src/transforms/functionOutlining.ts +225 -0
- package/src/transforms/identifier/globalConcealing.ts +261 -189
- package/src/transforms/identifier/movedDeclarations.ts +228 -142
- package/src/transforms/identifier/renameVariables.ts +252 -258
- package/src/transforms/lock/integrity.ts +84 -260
- package/src/transforms/lock/lock.ts +342 -491
- package/src/transforms/minify.ts +523 -663
- package/src/transforms/opaquePredicates.ts +90 -229
- package/src/transforms/pack.ts +195 -0
- package/src/transforms/plugin.ts +185 -0
- package/src/transforms/preparation.ts +337 -215
- package/src/transforms/renameLabels.ts +176 -77
- package/src/transforms/rgf.ts +293 -386
- package/src/transforms/shuffle.ts +80 -254
- package/src/transforms/string/encoding.ts +26 -129
- package/src/transforms/string/stringCompression.ts +118 -236
- package/src/transforms/string/stringConcealing.ts +255 -339
- package/src/transforms/string/stringEncoding.ts +28 -47
- package/src/transforms/string/stringSplitting.ts +61 -75
- package/src/transforms/variableMasking.ts +257 -0
- package/src/utils/ControlObject.ts +141 -0
- package/src/utils/IntGen.ts +33 -0
- package/src/utils/NameGen.ts +106 -0
- package/src/utils/ast-utils.ts +667 -0
- package/src/utils/function-utils.ts +50 -0
- package/src/utils/gen-utils.ts +48 -0
- package/src/utils/node.ts +78 -0
- package/src/utils/object-utils.ts +21 -0
- package/src/utils/random-utils.ts +79 -0
- package/src/utils/static-utils.ts +66 -0
- package/src/validateOptions.ts +256 -0
- package/tsconfig.json +13 -8
- package/babel.config.js +0 -12
- package/dev.js +0 -8
- package/dist/compiler.js +0 -34
- package/dist/parser.js +0 -59
- package/dist/precedence.js +0 -66
- package/dist/templates/bufferToString.js +0 -108
- package/dist/templates/crash.js +0 -59
- package/dist/templates/es5.js +0 -137
- package/dist/templates/functionLength.js +0 -34
- package/dist/templates/globals.js +0 -9
- package/dist/transforms/antiTooling.js +0 -88
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +0 -1281
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +0 -131
- package/dist/transforms/es5/antiClass.js +0 -164
- package/dist/transforms/es5/antiDestructuring.js +0 -193
- package/dist/transforms/es5/antiES6Object.js +0 -185
- package/dist/transforms/es5/antiSpreadOperator.js +0 -35
- package/dist/transforms/es5/antiTemplate.js +0 -66
- package/dist/transforms/es5/es5.js +0 -123
- package/dist/transforms/extraction/classExtraction.js +0 -83
- package/dist/transforms/identifier/globalAnalysis.js +0 -70
- package/dist/transforms/identifier/variableAnalysis.js +0 -104
- package/dist/transforms/lock/antiDebug.js +0 -76
- package/dist/transforms/stack.js +0 -343
- package/dist/transforms/transform.js +0 -350
- package/dist/traverse.js +0 -110
- package/dist/util/compare.js +0 -145
- package/dist/util/gen.js +0 -564
- package/dist/util/guard.js +0 -9
- package/dist/util/identifiers.js +0 -355
- package/dist/util/insert.js +0 -362
- package/dist/util/math.js +0 -19
- package/dist/util/object.js +0 -40
- package/dist/util/random.js +0 -130
- package/dist/util/scope.js +0 -20
- package/docs/ControlFlowFlattening.md +0 -595
- package/docs/Countermeasures.md +0 -63
- package/docs/ES5.md +0 -197
- package/docs/Integrity.md +0 -75
- package/docs/RGF.md +0 -419
- package/samples/example.js +0 -15
- package/samples/high.js +0 -1
- package/samples/input.js +0 -3
- package/samples/javascriptobfuscator.com.js +0 -8
- package/samples/jscrambler_advanced.js +0 -1894
- package/samples/jscrambler_light.js +0 -1134
- package/samples/low.js +0 -1
- package/samples/medium.js +0 -1
- package/samples/obfuscator.io.js +0 -1686
- package/samples/preemptive.com.js +0 -16
- package/src/compiler.ts +0 -35
- package/src/parser.ts +0 -49
- package/src/precedence.ts +0 -61
- package/src/templates/crash.ts +0 -55
- package/src/templates/es5.ts +0 -131
- package/src/templates/functionLength.ts +0 -32
- package/src/templates/globals.ts +0 -3
- package/src/transforms/antiTooling.ts +0 -102
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +0 -2146
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
- package/src/transforms/es5/antiClass.ts +0 -272
- package/src/transforms/es5/antiDestructuring.ts +0 -294
- package/src/transforms/es5/antiES6Object.ts +0 -267
- package/src/transforms/es5/antiSpreadOperator.ts +0 -56
- package/src/transforms/es5/antiTemplate.ts +0 -98
- package/src/transforms/es5/es5.ts +0 -149
- package/src/transforms/extraction/classExtraction.ts +0 -168
- package/src/transforms/identifier/globalAnalysis.ts +0 -85
- package/src/transforms/identifier/variableAnalysis.ts +0 -118
- package/src/transforms/lock/antiDebug.ts +0 -112
- package/src/transforms/stack.ts +0 -551
- package/src/transforms/transform.ts +0 -453
- package/src/traverse.ts +0 -120
- package/src/types.ts +0 -131
- package/src/util/compare.ts +0 -181
- package/src/util/gen.ts +0 -651
- package/src/util/guard.ts +0 -7
- package/src/util/identifiers.ts +0 -494
- package/src/util/insert.ts +0 -419
- package/src/util/math.ts +0 -15
- package/src/util/object.ts +0 -39
- package/src/util/random.ts +0 -141
- package/src/util/scope.ts +0 -21
- package/test/code/Cash.src.js +0 -1011
- package/test/code/Cash.test.ts +0 -49
- package/test/code/Dynamic.src.js +0 -118
- package/test/code/Dynamic.test.ts +0 -49
- package/test/code/ES6.src.js +0 -235
- package/test/code/ES6.test.ts +0 -42
- package/test/code/NewFeatures.test.ts +0 -19
- package/test/code/StrictMode.src.js +0 -65
- package/test/code/StrictMode.test.js +0 -37
- package/test/compare.test.ts +0 -104
- package/test/index.test.ts +0 -249
- package/test/options.test.ts +0 -132
- package/test/presets.test.ts +0 -22
- package/test/probability.test.ts +0 -44
- package/test/templates/template.test.ts +0 -14
- package/test/transforms/antiTooling.test.ts +0 -52
- package/test/transforms/calculator.test.ts +0 -78
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +0 -1274
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +0 -192
- package/test/transforms/deadCode.test.ts +0 -85
- package/test/transforms/dispatcher.test.ts +0 -457
- package/test/transforms/es5/antiClass.test.ts +0 -427
- package/test/transforms/es5/antiDestructuring.test.ts +0 -157
- package/test/transforms/es5/antiES6Object.test.ts +0 -245
- package/test/transforms/es5/antiTemplate.test.ts +0 -116
- package/test/transforms/es5/es5.test.ts +0 -110
- package/test/transforms/extraction/classExtraction.test.ts +0 -86
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +0 -200
- package/test/transforms/extraction/objectExtraction.test.ts +0 -491
- package/test/transforms/flatten.test.ts +0 -721
- package/test/transforms/hexadecimalNumbers.test.ts +0 -62
- package/test/transforms/identifier/globalConcealing.test.ts +0 -72
- package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
- package/test/transforms/identifier/renameVariables.test.ts +0 -621
- package/test/transforms/lock/antiDebug.test.ts +0 -66
- package/test/transforms/lock/browserLock.test.ts +0 -129
- package/test/transforms/lock/countermeasures.test.ts +0 -100
- package/test/transforms/lock/integrity.test.ts +0 -161
- package/test/transforms/lock/lock.test.ts +0 -204
- package/test/transforms/lock/osLock.test.ts +0 -312
- package/test/transforms/lock/selfDefending.test.ts +0 -68
- package/test/transforms/minify.test.ts +0 -575
- package/test/transforms/opaquePredicates.test.ts +0 -43
- package/test/transforms/preparation.test.ts +0 -157
- package/test/transforms/renameLabels.test.ts +0 -95
- package/test/transforms/rgf.test.ts +0 -378
- package/test/transforms/shuffle.test.ts +0 -135
- package/test/transforms/stack.test.ts +0 -573
- package/test/transforms/string/stringCompression.test.ts +0 -120
- package/test/transforms/string/stringConcealing.test.ts +0 -299
- package/test/transforms/string/stringEncoding.test.ts +0 -95
- package/test/transforms/string/stringSplitting.test.ts +0 -135
- package/test/transforms/transform.test.ts +0 -66
- package/test/traverse.test.ts +0 -139
- package/test/util/compare.test.ts +0 -34
- package/test/util/gen.test.ts +0 -121
- package/test/util/identifiers.test.ts +0 -253
- package/test/util/insert.test.ts +0 -142
- package/test/util/math.test.ts +0 -5
- package/test/util/random.test.ts +0 -71
- /package/dist/{types.js → obfuscationResult.js} +0 -0
|
@@ -1,349 +1,340 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var _transform = _interopRequireDefault(require("./transform"));
|
|
12
|
-
var _compare = require("../util/compare");
|
|
13
|
-
var _random = require("../util/random");
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
9
|
+
var _template = _interopRequireDefault(require("../templates/template"));
|
|
10
|
+
var _assert = require("assert");
|
|
11
|
+
var _randomUtils = require("../utils/random-utils");
|
|
14
12
|
var _probability = require("../probability");
|
|
15
|
-
var _constants = require("../constants");
|
|
16
13
|
var _order = require("../order");
|
|
17
|
-
var
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
function
|
|
23
|
-
function
|
|
24
|
-
function
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
* ```
|
|
42
|
-
*
|
|
43
|
-
* Can break code with:
|
|
44
|
-
*
|
|
45
|
-
* 1. testing function equality,
|
|
46
|
-
* 2. using `arguments.callee`,
|
|
47
|
-
* 3. using `this`
|
|
48
|
-
*/
|
|
49
|
-
class Dispatcher extends _transform.default {
|
|
50
|
-
constructor(o) {
|
|
51
|
-
super(o, _order.ObfuscateOrder.Dispatcher);
|
|
52
|
-
// Debug mode preserves function names
|
|
53
|
-
_defineProperty(this, "isDebug", false);
|
|
54
|
-
_defineProperty(this, "count", void 0);
|
|
55
|
-
_defineProperty(this, "functionLengthName", void 0);
|
|
56
|
-
this.count = 0;
|
|
57
|
-
}
|
|
58
|
-
apply(tree) {
|
|
59
|
-
super.apply(tree);
|
|
60
|
-
if (this.options.preserveFunctionLength && this.functionLengthName) {
|
|
61
|
-
(0, _insert.prepend)(tree, _functionLength.FunctionLengthTemplate.single({
|
|
62
|
-
name: this.functionLengthName,
|
|
63
|
-
ObjectDefineProperty: this.createInitVariable(_globals.ObjectDefineProperty, [tree])
|
|
64
|
-
}));
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
match(object, parents) {
|
|
68
|
-
if ((0, _compare.isInsideType)("AwaitExpression", object, parents)) {
|
|
69
|
-
return false;
|
|
14
|
+
var _constants = require("../constants");
|
|
15
|
+
var _functionUtils = require("../utils/function-utils");
|
|
16
|
+
var _setFunctionLengthTemplate = require("../templates/setFunctionLengthTemplate");
|
|
17
|
+
var _node = require("../utils/node");
|
|
18
|
+
var _astUtils = require("../utils/ast-utils");
|
|
19
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
20
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
21
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
22
|
+
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
23
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
24
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
25
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
26
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
27
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
28
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
29
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
30
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
31
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
32
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
33
|
+
var _default = exports["default"] = function _default(_ref) {
|
|
34
|
+
var Plugin = _ref.Plugin;
|
|
35
|
+
var me = Plugin(_order.Order.Dispatcher, {
|
|
36
|
+
changeData: {
|
|
37
|
+
functions: 0
|
|
70
38
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return () => {
|
|
75
|
-
if ((0, _probability.ComputeProbabilityMap)(this.options.dispatcher, mode => mode)) {
|
|
76
|
-
if (object.type != "Program" && object.body.type != "BlockStatement") {
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
39
|
+
});
|
|
40
|
+
var dispatcherCounter = 0;
|
|
41
|
+
var setFunctionLength = me.getPlaceholder("d_fnLength");
|
|
79
42
|
|
|
80
|
-
|
|
81
|
-
|
|
43
|
+
// in Debug mode, function names are preserved
|
|
44
|
+
var isDebug = false;
|
|
45
|
+
return {
|
|
46
|
+
visitor: {
|
|
47
|
+
"Program|Function": {
|
|
48
|
+
exit: function exit(_path) {
|
|
49
|
+
var blockPath = _path;
|
|
50
|
+
if (blockPath.isProgram()) {
|
|
51
|
+
blockPath.scope.crawl();
|
|
82
52
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
53
|
+
// Don't insert function length code when disabled
|
|
54
|
+
// Instead insert empty function as the identifier is still referenced
|
|
55
|
+
var insertNode = t.functionDeclaration(t.identifier(setFunctionLength), [], t.blockStatement([]));
|
|
56
|
+
if (me.options.preserveFunctionLength) {
|
|
57
|
+
// Insert function length code
|
|
58
|
+
insertNode = _setFunctionLengthTemplate.SetFunctionLengthTemplate.single({
|
|
59
|
+
fnName: setFunctionLength
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
me.skip((0, _astUtils.prependProgram)(_path, insertNode));
|
|
63
|
+
}
|
|
64
|
+
if (blockPath.node[_constants.UNSAFE]) return;
|
|
86
65
|
|
|
87
|
-
|
|
88
|
-
|
|
66
|
+
// For testing
|
|
67
|
+
// if (!blockPath.isProgram()) return;
|
|
89
68
|
|
|
90
|
-
|
|
91
|
-
var lexicalScope = (0, _insert.isFunction)(context) ? context.body : context;
|
|
92
|
-
(0, _traverse.walk)(object, parents, (o, p) => {
|
|
93
|
-
if (object == o) {
|
|
94
|
-
// Fix 1
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
var c = (0, _insert.getVarContext)(o, p);
|
|
98
|
-
if (o.type == "FunctionDeclaration") {
|
|
99
|
-
c = (0, _insert.getVarContext)(p[0], p.slice(1));
|
|
100
|
-
}
|
|
101
|
-
if (context === c) {
|
|
102
|
-
if (o.type == "FunctionDeclaration" && o.id.name) {
|
|
103
|
-
var name = o.id.name;
|
|
104
|
-
if (o.$requiresEval || o.async || o.generator || p.find(x => x.$dispatcherSkip || x.type == "MethodDefinition") || o.body.type != "BlockStatement") {
|
|
105
|
-
illegalFnNames.add(name);
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
69
|
+
var blockStatement = blockPath.isProgram() ? blockPath : blockPath.get("body");
|
|
108
70
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
71
|
+
// Track functions and illegal ones
|
|
72
|
+
// A function is illegal if:
|
|
73
|
+
// - the function is async or generator
|
|
74
|
+
// - the function is redefined
|
|
75
|
+
// - the function uses 'this', 'eval', or 'arguments'
|
|
76
|
+
var functionPaths = new Map();
|
|
77
|
+
var illegalNames = new Set();
|
|
116
78
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
79
|
+
// Scan for function declarations
|
|
80
|
+
blockPath.traverse({
|
|
81
|
+
// Check for reassigned / redefined functions
|
|
82
|
+
BindingIdentifier: {
|
|
83
|
+
exit: function exit(path) {
|
|
84
|
+
var _path$parentPath;
|
|
85
|
+
if (!(0, _astUtils.isVariableIdentifier)(path)) return;
|
|
86
|
+
var name = path.node.name;
|
|
87
|
+
if (!((_path$parentPath = path.parentPath) !== null && _path$parentPath !== void 0 && _path$parentPath.isFunctionDeclaration())) {
|
|
88
|
+
illegalNames.add(name);
|
|
89
|
+
}
|
|
121
90
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
91
|
+
},
|
|
92
|
+
// Find functions eligible for dispatching
|
|
93
|
+
FunctionDeclaration: {
|
|
94
|
+
exit: function exit(path) {
|
|
95
|
+
var name = path.node.id.name;
|
|
96
|
+
// If the function is not named, we can't dispatch it
|
|
97
|
+
if (!name) {
|
|
98
|
+
return;
|
|
128
99
|
}
|
|
129
100
|
|
|
130
|
-
//
|
|
131
|
-
if (
|
|
132
|
-
|
|
133
|
-
return "EXIT";
|
|
101
|
+
// Do not apply to async or generator functions
|
|
102
|
+
if (path.node.async || path.node.generator) {
|
|
103
|
+
return;
|
|
134
104
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
if (_constants.reservedIdentifiers.has(o.name)) {
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
var info = (0, _identifiers.getIdentifierInfo)(o, p);
|
|
144
|
-
if (!info.spec.isReferenced) {
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
if (info.spec.isDefined) {
|
|
148
|
-
if (info.isFunctionDeclaration) {
|
|
149
|
-
if (p[0].id && (!functionDeclarations[p[0].id.name] || functionDeclarations[p[0].id.name][0] !== p[0])) {
|
|
150
|
-
illegalFnNames.add(o.name);
|
|
105
|
+
|
|
106
|
+
// Do not apply to functions in nested scopes
|
|
107
|
+
if (path.parentPath !== blockStatement || me.isSkipped(path)) {
|
|
108
|
+
illegalNames.add(name);
|
|
109
|
+
return;
|
|
151
110
|
}
|
|
152
|
-
|
|
153
|
-
|
|
111
|
+
if ((0, _astUtils.isStrictMode)(path)) {
|
|
112
|
+
illegalNames.add(name);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Do not apply to unsafe functions, redefined functions, or internal obfuscator functions
|
|
117
|
+
if (path.node[_constants.UNSAFE] || functionPaths.has(name) || me.obfuscator.isInternalVariable(name)) {
|
|
118
|
+
illegalNames.add(name);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Functions with default parameters are not fully supported
|
|
123
|
+
// (Could be a Function Expression referencing outer scope)
|
|
124
|
+
if (path.node.params.find(function (x) {
|
|
125
|
+
return x.type === "AssignmentPattern";
|
|
126
|
+
})) {
|
|
127
|
+
illegalNames.add(name);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
functionPaths.set(name, path);
|
|
154
131
|
}
|
|
155
|
-
} else if (info.spec.isModified) {
|
|
156
|
-
illegalFnNames.add(o.name);
|
|
157
|
-
} else {
|
|
158
|
-
identifiers.push([o, p]);
|
|
159
132
|
}
|
|
133
|
+
});
|
|
134
|
+
var _iterator = _createForOfIteratorHelper(illegalNames),
|
|
135
|
+
_step;
|
|
136
|
+
try {
|
|
137
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
138
|
+
var _name = _step.value;
|
|
139
|
+
functionPaths["delete"](_name);
|
|
140
|
+
}
|
|
141
|
+
} catch (err) {
|
|
142
|
+
_iterator.e(err);
|
|
143
|
+
} finally {
|
|
144
|
+
_iterator.f();
|
|
160
145
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
});
|
|
171
|
-
// set containing new name
|
|
172
|
-
var set = new Set(Object.keys(newFnNames));
|
|
146
|
+
var _iterator2 = _createForOfIteratorHelper(functionPaths.keys()),
|
|
147
|
+
_step2;
|
|
148
|
+
try {
|
|
149
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
150
|
+
var name = _step2.value;
|
|
151
|
+
if (!(0, _probability.computeProbabilityMap)(me.options.dispatcher, name)) {
|
|
152
|
+
functionPaths["delete"](name);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
173
155
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
156
|
+
// No functions here to change
|
|
157
|
+
} catch (err) {
|
|
158
|
+
_iterator2.e(err);
|
|
159
|
+
} finally {
|
|
160
|
+
_iterator2.f();
|
|
178
161
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
var
|
|
184
|
-
var
|
|
185
|
-
var
|
|
186
|
-
var
|
|
187
|
-
var
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
var
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
type: "FunctionExpression",
|
|
201
|
-
id: null,
|
|
202
|
-
params: [],
|
|
203
|
-
[_constants.predictableFunctionTag]: true
|
|
204
|
-
};
|
|
205
|
-
this.addComment(functionExpression, name);
|
|
206
|
-
if (def.params.length > 0) {
|
|
207
|
-
const fixParam = param => {
|
|
208
|
-
return param;
|
|
209
|
-
};
|
|
210
|
-
var variableDeclaration = (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)({
|
|
211
|
-
type: "ArrayPattern",
|
|
212
|
-
elements: def.params.map(fixParam)
|
|
213
|
-
}, (0, _gen.Identifier)(payloadArg)));
|
|
214
|
-
(0, _insert.prepend)(def.body, variableDeclaration);
|
|
162
|
+
if (functionPaths.size === 0) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
me.changeData.functions += functionPaths.size;
|
|
166
|
+
var dispatcherName = me.getPlaceholder() + "_dispatcher_" + dispatcherCounter++;
|
|
167
|
+
var payloadName = me.getPlaceholder() + "_payload";
|
|
168
|
+
var cacheName = me.getPlaceholder() + "_cache";
|
|
169
|
+
var newNameMapping = new Map();
|
|
170
|
+
var keys = {
|
|
171
|
+
placeholderNoMeaning: isDebug ? "noMeaning" : (0, _randomUtils.getRandomString)(10),
|
|
172
|
+
clearPayload: isDebug ? "clearPayload" : (0, _randomUtils.getRandomString)(10),
|
|
173
|
+
nonCall: isDebug ? "nonCall" : (0, _randomUtils.getRandomString)(10),
|
|
174
|
+
returnAsObject: isDebug ? "returnAsObject" : (0, _randomUtils.getRandomString)(10),
|
|
175
|
+
returnAsObjectProperty: isDebug ? "returnAsObjectProperty" : (0, _randomUtils.getRandomString)(10)
|
|
176
|
+
};
|
|
177
|
+
var _iterator3 = _createForOfIteratorHelper(functionPaths.keys()),
|
|
178
|
+
_step3;
|
|
179
|
+
try {
|
|
180
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
181
|
+
var name = _step3.value;
|
|
182
|
+
newNameMapping.set(name, isDebug ? "_" + name : (0, _randomUtils.getRandomString)(6) /** "_" + name */);
|
|
215
183
|
}
|
|
216
184
|
|
|
217
|
-
//
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
if (defParents.length) {
|
|
223
|
-
(0, _insert.deleteDirect)(def, defParents[0]);
|
|
224
|
-
}
|
|
225
|
-
this.addComment(functionExpression, signature);
|
|
226
|
-
return (0, _gen.Property)((0, _gen.Literal)(newFnNames[name]), functionExpression, false);
|
|
227
|
-
}))));
|
|
228
|
-
var getterArgName = this.getPlaceholder();
|
|
229
|
-
var x = this.getPlaceholder();
|
|
230
|
-
var y = this.getPlaceholder();
|
|
231
|
-
var z = this.getPlaceholder();
|
|
232
|
-
function getAccessor() {
|
|
233
|
-
return (0, _gen.MemberExpression)((0, _gen.Identifier)(mapName), (0, _gen.Identifier)(x), true);
|
|
185
|
+
// Find identifiers calling/referencing the functions
|
|
186
|
+
} catch (err) {
|
|
187
|
+
_iterator3.e(err);
|
|
188
|
+
} finally {
|
|
189
|
+
_iterator3.f();
|
|
234
190
|
}
|
|
191
|
+
blockPath.traverse({
|
|
192
|
+
ReferencedIdentifier: {
|
|
193
|
+
exit: function exit(path) {
|
|
194
|
+
if (path.isJSX()) return;
|
|
195
|
+
if ((0, _functionUtils.isVariableFunctionIdentifier)(path)) return;
|
|
196
|
+
var name = path.node.name;
|
|
197
|
+
var fnPath = functionPaths.get(name);
|
|
198
|
+
if (!fnPath) return;
|
|
199
|
+
var newName = newNameMapping.get(name);
|
|
235
200
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
201
|
+
// Do not replace if not referencing the actual function
|
|
202
|
+
if (path.scope.getBinding(name).path !== fnPath) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
var createDispatcherCall = function createDispatcherCall(name, flagArg) {
|
|
206
|
+
var dispatcherArgs = [t.stringLiteral(name)];
|
|
207
|
+
if (flagArg) {
|
|
208
|
+
dispatcherArgs.push(t.stringLiteral(flagArg));
|
|
209
|
+
}
|
|
210
|
+
var asObject = (0, _randomUtils.chance)(50);
|
|
211
|
+
if (asObject) {
|
|
212
|
+
if (dispatcherArgs.length < 2) {
|
|
213
|
+
dispatcherArgs.push(t.stringLiteral(keys.placeholderNoMeaning));
|
|
214
|
+
}
|
|
215
|
+
dispatcherArgs.push(t.stringLiteral(keys.returnAsObject));
|
|
216
|
+
}
|
|
217
|
+
var callExpression = t.callExpression(t.identifier(dispatcherName), dispatcherArgs);
|
|
218
|
+
if (!asObject) {
|
|
219
|
+
return callExpression;
|
|
220
|
+
}
|
|
221
|
+
if ((0, _randomUtils.chance)(50)) {
|
|
222
|
+
callExpression.type = "NewExpression";
|
|
223
|
+
}
|
|
224
|
+
return t.memberExpression(callExpression, t.stringLiteral(keys.returnAsObjectProperty), true);
|
|
225
|
+
};
|
|
255
226
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
227
|
+
// Replace the identifier with a call to the function
|
|
228
|
+
var parentPath = path.parentPath;
|
|
229
|
+
if (path.key === "callee" && parentPath !== null && parentPath !== void 0 && parentPath.isCallExpression()) {
|
|
230
|
+
var expressions = [];
|
|
231
|
+
var callArguments = parentPath.node.arguments;
|
|
232
|
+
if (callArguments.length === 0) {
|
|
233
|
+
expressions.push(
|
|
234
|
+
// Call the function
|
|
235
|
+
createDispatcherCall(newName, keys.clearPayload));
|
|
236
|
+
} else {
|
|
237
|
+
expressions.push(
|
|
238
|
+
// Prepare the payload arguments
|
|
239
|
+
t.assignmentExpression("=", t.identifier(payloadName), t.arrayExpression(callArguments)),
|
|
240
|
+
// Call the function
|
|
241
|
+
createDispatcherCall(newName));
|
|
242
|
+
}
|
|
243
|
+
var output = expressions.length === 1 ? expressions[0] : t.sequenceExpression(expressions);
|
|
244
|
+
if (!parentPath.container) return;
|
|
245
|
+
parentPath.replaceWith(output);
|
|
246
|
+
} else {
|
|
247
|
+
if (!path.container) return;
|
|
248
|
+
// Replace non-invocation references with a 'cached' version of the function
|
|
249
|
+
path.replaceWith(createDispatcherCall(newName, keys.nonCall));
|
|
250
|
+
}
|
|
261
251
|
}
|
|
262
|
-
`).single(),
|
|
263
|
-
// Arg to get a function reference
|
|
264
|
-
(0, _gen.IfStatement)((0, _gen.BinaryExpression)("==", (0, _gen.Identifier)(y), (0, _gen.Literal)(expectedGet)), [
|
|
265
|
-
// Getter flag: return the function object
|
|
266
|
-
(0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(returnProp), (0, _gen.LogicalExpression)("||", (0, _gen.MemberExpression)((0, _gen.Identifier)(cacheName), (0, _gen.Identifier)(x), true), (0, _gen.AssignmentExpression)("=", (0, _gen.MemberExpression)((0, _gen.Identifier)(cacheName), (0, _gen.Identifier)(x), true), (0, _gen.CallExpression)((0, _gen.Identifier)(`makeFn${_constants.predictableFunctionTag}`), [])))))], [
|
|
267
|
-
// Call the function, return result
|
|
268
|
-
(0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(returnProp), (0, _gen.CallExpression)(getAccessor(), [])))]),
|
|
269
|
-
// Check how the function was invoked (new () vs ())
|
|
270
|
-
(0, _gen.IfStatement)((0, _gen.BinaryExpression)("==", (0, _gen.Identifier)(z), (0, _gen.Literal)(expectedNew)), [
|
|
271
|
-
// Wrap in object
|
|
272
|
-
(0, _gen.ReturnStatement)((0, _gen.ObjectExpression)([(0, _gen.Property)((0, _gen.Identifier)(newReturnMemberName), (0, _gen.Identifier)(returnProp), false)]))], [
|
|
273
|
-
// Return raw result
|
|
274
|
-
(0, _gen.ReturnStatement)((0, _gen.Identifier)(returnProp))])]);
|
|
275
|
-
(0, _insert.append)(object, fn);
|
|
276
|
-
if (payloadArg) {
|
|
277
|
-
(0, _insert.prepend)(object, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(payloadArg, (0, _gen.ArrayExpression)([]))));
|
|
278
|
-
}
|
|
279
|
-
identifiers.forEach(_ref => {
|
|
280
|
-
let [o, p] = _ref;
|
|
281
|
-
if (o.type != "Identifier") {
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
var newName = newFnNames[o.name];
|
|
285
|
-
if (!newName || typeof newName !== "string") {
|
|
286
|
-
return;
|
|
287
252
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
}
|
|
291
|
-
var info = (0, _identifiers.getIdentifierInfo)(o, p);
|
|
292
|
-
if (info.isFunctionCall && p[0].type == "CallExpression" && p[0].callee === o) {
|
|
293
|
-
// Invoking call expression: `a();`
|
|
253
|
+
});
|
|
254
|
+
var fnLengthProperties = [];
|
|
294
255
|
|
|
295
|
-
|
|
296
|
-
|
|
256
|
+
// Create the dispatcher function
|
|
257
|
+
var objectExpression = t.objectExpression(Array.from(newNameMapping).map(function (_ref2) {
|
|
258
|
+
var _ref3 = _slicedToArray(_ref2, 2),
|
|
259
|
+
name = _ref3[0],
|
|
260
|
+
newName = _ref3[1];
|
|
261
|
+
var originalPath = functionPaths.get(name);
|
|
262
|
+
var originalFn = originalPath.node;
|
|
263
|
+
if (me.options.preserveFunctionLength) {
|
|
264
|
+
var fnLength = (0, _functionUtils.computeFunctionLength)(originalPath);
|
|
265
|
+
if (fnLength >= 1) {
|
|
266
|
+
// 0 is already the default
|
|
267
|
+
fnLengthProperties.push(t.objectProperty(t.stringLiteral(newName), (0, _node.numericLiteral)(fnLength)));
|
|
297
268
|
}
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
if (p[0].arguments.length) {
|
|
302
|
-
assignmentExpressions = [(0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(payloadArg), (0, _gen.ArrayExpression)(p[0].arguments))];
|
|
303
|
-
} else {
|
|
304
|
-
dispatcherArgs.push((0, _gen.Literal)(expectedClearArgs));
|
|
305
|
-
}
|
|
306
|
-
var type = (0, _random.choice)(["CallExpression", "NewExpression"]);
|
|
307
|
-
var callExpression = null;
|
|
308
|
-
switch (type) {
|
|
309
|
-
case "CallExpression":
|
|
310
|
-
callExpression = (0, _gen.CallExpression)((0, _gen.Identifier)(dispatcherFnName), dispatcherArgs);
|
|
311
|
-
break;
|
|
312
|
-
case "NewExpression":
|
|
313
|
-
if (dispatcherArgs.length == 1) {
|
|
314
|
-
dispatcherArgs.push((0, _gen.Identifier)("undefined"));
|
|
315
|
-
}
|
|
316
|
-
callExpression = (0, _gen.MemberExpression)((0, _gen.NewExpression)((0, _gen.Identifier)(dispatcherFnName), [...dispatcherArgs, (0, _gen.Literal)(expectedNew)]), (0, _gen.Identifier)(newReturnMemberName), false);
|
|
317
|
-
break;
|
|
318
|
-
}
|
|
319
|
-
this.addComment(callExpression, "Calling " + o.name + "(" + p[0].arguments.map(x => x.name).join(", ") + ")");
|
|
320
|
-
var expr = assignmentExpressions.length ? (0, _gen.SequenceExpression)([...assignmentExpressions, callExpression]) : callExpression;
|
|
269
|
+
}
|
|
270
|
+
var newBody = _toConsumableArray(originalFn.body.body);
|
|
271
|
+
(0, _assert.ok)(Array.isArray(newBody));
|
|
321
272
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
273
|
+
// Unpack parameters
|
|
274
|
+
if (originalFn.params.length > 0) {
|
|
275
|
+
newBody.unshift(t.variableDeclaration("var", [t.variableDeclarator(t.arrayPattern(_toConsumableArray(originalFn.params)), t.identifier(payloadName))]));
|
|
276
|
+
}
|
|
326
277
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
278
|
+
// Add debug label
|
|
279
|
+
if (isDebug) {
|
|
280
|
+
newBody.unshift(t.expressionStatement(t.stringLiteral("Dispatcher: ".concat(name, " -> ").concat(newName))));
|
|
281
|
+
}
|
|
282
|
+
var functionExpression = t.functionExpression(null, [], t.blockStatement(newBody));
|
|
283
|
+
var _iterator4 = _createForOfIteratorHelper(Object.getOwnPropertySymbols(originalFn)),
|
|
284
|
+
_step4;
|
|
285
|
+
try {
|
|
286
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
287
|
+
var symbol = _step4.value;
|
|
288
|
+
functionExpression[symbol] = originalFn[symbol];
|
|
338
289
|
}
|
|
339
|
-
|
|
340
|
-
|
|
290
|
+
} catch (err) {
|
|
291
|
+
_iterator4.e(err);
|
|
292
|
+
} finally {
|
|
293
|
+
_iterator4.f();
|
|
341
294
|
}
|
|
295
|
+
functionExpression[_constants.PREDICTABLE] = true;
|
|
296
|
+
return t.objectProperty(t.stringLiteral(newName), functionExpression);
|
|
297
|
+
}));
|
|
298
|
+
var fnLengths = t.objectExpression(fnLengthProperties);
|
|
299
|
+
var dispatcher = new _template["default"]("\n function ".concat(dispatcherName, "(name, flagArg, returnTypeArg, fnLengths = {fnLengthsObjectExpression}) {\n var output;\n var fns = {objectExpression};\n\n if(flagArg === \"").concat(keys.clearPayload, "\") {\n ").concat(payloadName, " = [];\n }\n if(flagArg === \"").concat(keys.nonCall, "\") {\n function createFunction(){\n var fn = function(...args){ \n ").concat(payloadName, " = args;\n return fns[name].apply(this);\n }\n\n var fnLength = fnLengths[name];\n if(fnLength) {\n ").concat(setFunctionLength, "(fn, fnLength);\n }\n\n return fn;\n }\n output = ").concat(cacheName, "[name] || (").concat(cacheName, "[name] = createFunction());\n } else {\n output = fns[name]();\n }\n\n if(returnTypeArg === \"").concat(keys.returnAsObject, "\") {\n return { \"").concat(keys.returnAsObjectProperty, "\": output };\n } else {\n return output;\n }\n }\n ")).single({
|
|
300
|
+
objectExpression: objectExpression,
|
|
301
|
+
fnLengthsObjectExpression: fnLengths
|
|
342
302
|
});
|
|
343
|
-
|
|
303
|
+
dispatcher[_constants.PREDICTABLE] = true;
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Prepends the node into the block. (And registers the declaration)
|
|
307
|
+
* @param node
|
|
308
|
+
*/
|
|
309
|
+
function prepend(node) {
|
|
310
|
+
var newPath = blockStatement.unshiftContainer("body", node)[0];
|
|
311
|
+
blockStatement.scope.registerDeclaration(newPath);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Insert the dispatcher function
|
|
315
|
+
prepend(dispatcher);
|
|
316
|
+
|
|
317
|
+
// Insert the payload variable
|
|
318
|
+
prepend(t.variableDeclaration("var", [t.variableDeclarator(t.identifier(payloadName))]));
|
|
319
|
+
|
|
320
|
+
// Insert the cache variable
|
|
321
|
+
prepend(t.variableDeclaration("var", [t.variableDeclarator(t.identifier(cacheName), new _template["default"]("Object[\"create\"](null)").expression())]));
|
|
322
|
+
|
|
323
|
+
// Remove original functions
|
|
324
|
+
var _iterator5 = _createForOfIteratorHelper(functionPaths.values()),
|
|
325
|
+
_step5;
|
|
326
|
+
try {
|
|
327
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
328
|
+
var path = _step5.value;
|
|
329
|
+
path.remove();
|
|
330
|
+
}
|
|
331
|
+
} catch (err) {
|
|
332
|
+
_iterator5.e(err);
|
|
333
|
+
} finally {
|
|
334
|
+
_iterator5.f();
|
|
335
|
+
}
|
|
344
336
|
}
|
|
345
337
|
}
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
exports.default = Dispatcher;
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
};
|