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,69 +1,145 @@
|
|
|
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
|
+
exports["default"] = _default;
|
|
8
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
7
9
|
var _order = require("../order");
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
var
|
|
13
|
-
function
|
|
14
|
-
function
|
|
15
|
-
function
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
10
|
+
var _NameGen = require("../utils/NameGen");
|
|
11
|
+
var _assert = require("assert");
|
|
12
|
+
var _probability = require("../probability");
|
|
13
|
+
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); }
|
|
14
|
+
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; }
|
|
15
|
+
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; } } }; }
|
|
16
|
+
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; } }
|
|
17
|
+
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; }
|
|
18
|
+
var LABEL = Symbol("label");
|
|
19
|
+
function _default(_ref) {
|
|
20
|
+
var Plugin = _ref.Plugin;
|
|
21
|
+
var me = Plugin(_order.Order.RenameLabels, {
|
|
22
|
+
changeData: {
|
|
23
|
+
labelsRenamed: 0,
|
|
24
|
+
labelsRemoved: 0
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
visitor: {
|
|
29
|
+
Program: function Program(path) {
|
|
30
|
+
var allLabelInterfaces = [];
|
|
31
|
+
|
|
32
|
+
// First pass: Collect all label usages
|
|
33
|
+
path.traverse({
|
|
34
|
+
LabeledStatement: function LabeledStatement(labelPath) {
|
|
35
|
+
var labelInterface = {
|
|
36
|
+
label: labelPath.node.label.name,
|
|
37
|
+
removed: false,
|
|
38
|
+
required: false,
|
|
39
|
+
paths: []
|
|
40
|
+
};
|
|
41
|
+
allLabelInterfaces.push(labelInterface);
|
|
42
|
+
labelPath.node[LABEL] = labelInterface;
|
|
43
|
+
},
|
|
44
|
+
"BreakStatement|ContinueStatement": function BreakStatementContinueStatement(_path) {
|
|
45
|
+
var path = _path;
|
|
46
|
+
if (path.node.label) {
|
|
47
|
+
var labelName = path.node.label.name;
|
|
48
|
+
var targets = [];
|
|
49
|
+
var onlySearchLoops = path.isContinueStatement();
|
|
50
|
+
var currentPath = path;
|
|
51
|
+
while (currentPath) {
|
|
52
|
+
if (currentPath.isFor() || currentPath.isWhile() || currentPath.isSwitchStatement()) {
|
|
53
|
+
targets.push(currentPath);
|
|
54
|
+
}
|
|
55
|
+
if (currentPath.isBlockStatement() && currentPath.parentPath.isLabeledStatement()) {
|
|
56
|
+
targets.push(currentPath);
|
|
57
|
+
}
|
|
58
|
+
currentPath = currentPath.parentPath;
|
|
59
|
+
}
|
|
60
|
+
var target = targets.find(function (label) {
|
|
61
|
+
return label.parentPath && label.parentPath.isLabeledStatement() && label.parentPath.node.label.name === labelName;
|
|
62
|
+
});
|
|
63
|
+
if (onlySearchLoops) {
|
|
64
|
+
// Remove BlockStatements and SwitchStatements from the list of targets
|
|
65
|
+
// a continue statement only target loops
|
|
66
|
+
// This helps remove unnecessary labels when a continue is nested with a block statement
|
|
67
|
+
// ex: for-loop with if-statement continue
|
|
68
|
+
targets = targets.filter(function (target) {
|
|
69
|
+
return !target.isBlockStatement() && !target.isSwitchStatement();
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
(0, _assert.ok)(target);
|
|
73
|
+
var isRequired = target.isBlockStatement() || targets[0] !== target;
|
|
74
|
+
var _labelInterface = target.parentPath.node[LABEL];
|
|
75
|
+
if (isRequired) {
|
|
76
|
+
_labelInterface.required = true;
|
|
77
|
+
} else {
|
|
78
|
+
// Label is not required here, remove it for this particular break/continue statement
|
|
79
|
+
path.node.label = null;
|
|
80
|
+
}
|
|
81
|
+
if (!_labelInterface.paths) {
|
|
82
|
+
_labelInterface.paths = [];
|
|
83
|
+
}
|
|
84
|
+
_labelInterface.paths.push(path);
|
|
85
|
+
}
|
|
38
86
|
}
|
|
39
|
-
|
|
40
|
-
|
|
87
|
+
});
|
|
88
|
+
var nameGen = new _NameGen.NameGen(me.options.identifierGenerator);
|
|
89
|
+
for (var _i = 0, _allLabelInterfaces = allLabelInterfaces; _i < _allLabelInterfaces.length; _i++) {
|
|
90
|
+
var labelInterface = _allLabelInterfaces[_i];
|
|
91
|
+
var isRequired = labelInterface.required;
|
|
92
|
+
if (isRequired) {
|
|
93
|
+
var newName = labelInterface.label;
|
|
94
|
+
if ((0, _probability.computeProbabilityMap)(me.options.renameLabels, labelInterface.label)) {
|
|
95
|
+
newName = nameGen.generate();
|
|
96
|
+
}
|
|
97
|
+
labelInterface.renamed = newName;
|
|
98
|
+
me.changeData.labelsRenamed++;
|
|
99
|
+
} else {
|
|
100
|
+
labelInterface.removed = true;
|
|
101
|
+
me.changeData.labelsRemoved++;
|
|
41
102
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Second pass: Rename labels and remove unused ones
|
|
106
|
+
path.traverse({
|
|
107
|
+
LabeledStatement: function LabeledStatement(labelPath) {
|
|
108
|
+
var labelInterface = labelPath.node[LABEL];
|
|
109
|
+
if (labelInterface) {
|
|
110
|
+
// Remove label but replace it with its body
|
|
111
|
+
if (labelInterface.removed) {
|
|
112
|
+
labelPath.replaceWith(labelPath.node.body);
|
|
113
|
+
}
|
|
49
114
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
115
|
+
// Else keep the label but rename it
|
|
116
|
+
if (typeof labelInterface.renamed === "string") {
|
|
117
|
+
labelPath.node.label.name = labelInterface.renamed;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Update all break/continue statements
|
|
121
|
+
var _iterator = _createForOfIteratorHelper(labelInterface.paths),
|
|
122
|
+
_step;
|
|
123
|
+
try {
|
|
124
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
125
|
+
var breakPath = _step.value;
|
|
126
|
+
// Remove label from break/continue statement
|
|
127
|
+
if (labelInterface.removed) {
|
|
128
|
+
breakPath.node.label = null;
|
|
129
|
+
} else {
|
|
130
|
+
// Update label name
|
|
131
|
+
breakPath.node.label = t.identifier(labelInterface.renamed);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
} catch (err) {
|
|
135
|
+
_iterator.e(err);
|
|
136
|
+
} finally {
|
|
137
|
+
_iterator.f();
|
|
54
138
|
}
|
|
55
|
-
o.label = (0, _gen.Identifier)(newName);
|
|
56
|
-
labelNeverUsed = false;
|
|
57
139
|
}
|
|
58
140
|
}
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
if (newName) {
|
|
62
|
-
object.label = (0, _gen.Identifier)(newName);
|
|
63
|
-
} else if (isRemovable || labelNeverUsed) {
|
|
64
|
-
this.replace(object, (0, _insert.clone)(object.body));
|
|
141
|
+
});
|
|
65
142
|
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
exports.default = RenameLabels;
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
package/dist/transforms/rgf.js
CHANGED
|
@@ -1,255 +1,157 @@
|
|
|
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 _compiler = require("../compiler");
|
|
8
|
-
var _constants = require("../constants");
|
|
9
|
-
var _obfuscator = _interopRequireDefault(require("../obfuscator"));
|
|
7
|
+
exports["default"] = void 0;
|
|
10
8
|
var _order = require("../order");
|
|
9
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
10
|
+
var _obfuscator = _interopRequireDefault(require("../obfuscator"));
|
|
11
11
|
var _probability = require("../probability");
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
|
|
19
|
-
var
|
|
20
|
-
function
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* Rigorous checks are in place to only include pure functions.
|
|
30
|
-
*
|
|
31
|
-
* `flatten` can attempt to make function reference-less. Recommended to have flatten enabled with RGF.
|
|
12
|
+
var _astUtils = require("../utils/ast-utils");
|
|
13
|
+
var _constants = require("../constants");
|
|
14
|
+
var _functionUtils = require("../utils/function-utils");
|
|
15
|
+
var _node = require("../utils/node");
|
|
16
|
+
var _template = _interopRequireDefault(require("../templates/template"));
|
|
17
|
+
var _tamperProtectionTemplates = require("../templates/tamperProtectionTemplates");
|
|
18
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
19
|
+
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); }
|
|
20
|
+
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; }
|
|
21
|
+
/**
|
|
22
|
+
* RGF (Runtime-Generated-Function) uses the `new Function("code")` syntax to create executable code from strings.
|
|
23
|
+
*
|
|
24
|
+
* Limitations:
|
|
25
|
+
*
|
|
26
|
+
* 1. Does not apply to async or generator functions
|
|
27
|
+
* 2. Does not apply to functions that reference outside variables
|
|
32
28
|
*/
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
var _default = exports["default"] = function _default(_ref) {
|
|
30
|
+
var Plugin = _ref.Plugin;
|
|
31
|
+
var me = Plugin(_order.Order.RGF, {
|
|
32
|
+
changeData: {
|
|
33
|
+
functions: 0
|
|
37
34
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Check user option
|
|
101
|
-
if (!(0, _probability.ComputeProbabilityMap)(this.options.rgf, x => x, object === null || object === void 0 ? void 0 : (_object$id = object.id) === null || _object$id === void 0 ? void 0 : _object$id.name)) return;
|
|
102
|
-
|
|
103
|
-
// Discard functions that use 'eval' function
|
|
104
|
-
if (object.$requiresEval) return;
|
|
35
|
+
});
|
|
36
|
+
var rgfArrayName = me.getPlaceholder() + "_rgf";
|
|
37
|
+
var rgfEvalName = me.getPlaceholder() + "_rgf_eval";
|
|
38
|
+
var rgfArrayExpression = t.arrayExpression([]);
|
|
39
|
+
var active = true;
|
|
40
|
+
return {
|
|
41
|
+
visitor: {
|
|
42
|
+
Program: {
|
|
43
|
+
enter: function enter(path) {
|
|
44
|
+
path.scope.crawl();
|
|
45
|
+
},
|
|
46
|
+
exit: function exit(path) {
|
|
47
|
+
active = false;
|
|
48
|
+
if (rgfArrayExpression.elements.length === 0) return;
|
|
49
|
+
|
|
50
|
+
// Insert the RGF array at the top of the program
|
|
51
|
+
(0, _astUtils.prepend)(path, t.variableDeclaration("var", [t.variableDeclarator(t.identifier(rgfArrayName), rgfArrayExpression)]));
|
|
52
|
+
var rgfEvalIntegrity = me.getPlaceholder() + "_rgf_eval_integrity";
|
|
53
|
+
(0, _astUtils.prepend)(path, new _template["default"]("\n {EvalIntegrity}\n var ".concat(rgfEvalIntegrity, " = {EvalIntegrityName}();\n ")).compile({
|
|
54
|
+
EvalIntegrity: (0, _tamperProtectionTemplates.createEvalIntegrityTemplate)(me, path),
|
|
55
|
+
EvalIntegrityName: me.getPlaceholder()
|
|
56
|
+
}));
|
|
57
|
+
(0, _astUtils.append)(path, new _template["default"]("\n function ".concat(rgfEvalName, "(code) {\n if (").concat(rgfEvalIntegrity, ") {\n return eval(code);\n }\n }\n ")).addSymbols(_constants.UNSAFE).single());
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"FunctionDeclaration|FunctionExpression": {
|
|
61
|
+
exit: function exit(_path) {
|
|
62
|
+
var _me$options$lock;
|
|
63
|
+
if (!active) return;
|
|
64
|
+
var path = _path;
|
|
65
|
+
if (me.isSkipped(path)) return;
|
|
66
|
+
|
|
67
|
+
// Skip async and generator functions
|
|
68
|
+
if (path.node.async || path.node.generator) return;
|
|
69
|
+
var name = (0, _astUtils.getFunctionName)(path);
|
|
70
|
+
if (name === ((_me$options$lock = me.options.lock) === null || _me$options$lock === void 0 ? void 0 : _me$options$lock.countermeasures)) return;
|
|
71
|
+
if (me.obfuscator.isInternalVariable(name)) return;
|
|
72
|
+
me.log(name);
|
|
73
|
+
if (!(0, _probability.computeProbabilityMap)(me.options.rgf, name, path.getFunctionParent() === null)) return;
|
|
74
|
+
|
|
75
|
+
// Skip functions with references to outside variables
|
|
76
|
+
// Check the scope to see if this function relies on any variables defined outside the function
|
|
77
|
+
var identifierPreventingTransform;
|
|
78
|
+
path.traverse({
|
|
79
|
+
Identifier: function Identifier(idPath) {
|
|
80
|
+
if (!(0, _astUtils.isVariableIdentifier)(idPath)) return;
|
|
81
|
+
if (idPath.isBindingIdentifier() && (0, _astUtils.isDefiningIdentifier)(idPath)) return;
|
|
82
|
+
var name = idPath.node.name;
|
|
83
|
+
// RGF array name is allowed, it is not considered an outside reference
|
|
84
|
+
if (name === rgfArrayName) return;
|
|
85
|
+
if (_constants.reservedIdentifiers.has(name)) return;
|
|
86
|
+
if (me.options.globalVariables.has(name)) return;
|
|
87
|
+
var binding = idPath.scope.getBinding(name);
|
|
88
|
+
if (!binding) {
|
|
89
|
+
identifierPreventingTransform = name;
|
|
90
|
+
idPath.stop();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
105
93
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
isIllegal = true;
|
|
111
|
-
return "EXIT";
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
if (isIllegal) return;
|
|
115
|
-
return () => {
|
|
116
|
-
// Make sure function is 'reference-less'
|
|
117
|
-
var definedMap = new Map();
|
|
118
|
-
var isReferenceLess = true;
|
|
119
|
-
var identifierPreventingTransformation;
|
|
120
|
-
(0, _traverse.walk)(object, parents, (o, p) => {
|
|
121
|
-
if (o.type === "Identifier" && o.name !== this.arrayExpressionName && !_constants.reservedIdentifiers.has(o.name) && !this.options.globalVariables.has(o.name)) {
|
|
122
|
-
var info = (0, _identifiers.getIdentifierInfo)(o, p);
|
|
123
|
-
if (!info.spec.isReferenced) {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
if (info.spec.isDefined) {
|
|
127
|
-
// Add to defined map
|
|
128
|
-
var definingContext = (0, _insert.getDefiningContext)(o, p);
|
|
129
|
-
if (!definedMap.has(definingContext)) {
|
|
130
|
-
definedMap.set(definingContext, new Set([o.name]));
|
|
131
|
-
} else {
|
|
132
|
-
definedMap.get(definingContext).add(o.name);
|
|
133
|
-
}
|
|
134
|
-
} else {
|
|
135
|
-
// This approach is dirty and does not account for hoisted FunctionDeclarations
|
|
136
|
-
var isDefinedAbove = false;
|
|
137
|
-
for (var pNode of p) {
|
|
138
|
-
if (definedMap.has(pNode)) {
|
|
139
|
-
if (definedMap.get(pNode).has(o.name)) {
|
|
140
|
-
isDefinedAbove = true;
|
|
141
|
-
break;
|
|
142
|
-
}
|
|
94
|
+
// If the binding is not in the current scope, it is an outside reference
|
|
95
|
+
if (binding.scope !== path.scope) {
|
|
96
|
+
identifierPreventingTransform = name;
|
|
97
|
+
idPath.stop();
|
|
143
98
|
}
|
|
144
99
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
100
|
+
});
|
|
101
|
+
if (identifierPreventingTransform) {
|
|
102
|
+
me.log("Skipping function " + name + " due to reference to outside variable: " + identifierPreventingTransform);
|
|
103
|
+
return;
|
|
150
104
|
}
|
|
105
|
+
var embeddedName = me.getPlaceholder() + "_embedded";
|
|
106
|
+
var replacementName = me.getPlaceholder() + "_replacement";
|
|
107
|
+
var thisName = me.getPlaceholder() + "_this";
|
|
108
|
+
var lastNode = t.expressionStatement(t.identifier(embeddedName));
|
|
109
|
+
lastNode[_constants.SKIP] = true;
|
|
110
|
+
|
|
111
|
+
// Transform the function
|
|
112
|
+
var evalProgram = t.program([t.functionDeclaration(t.identifier(embeddedName), [], t.blockStatement([t.variableDeclaration("var", [t.variableDeclarator(t.arrayPattern([t.identifier(thisName), t.identifier(rgfArrayName)]), t.thisExpression())]), t.functionDeclaration(t.identifier(replacementName), path.node.params, path.node.body), t.returnStatement(t.callExpression(t.memberExpression(t.identifier(replacementName), t.identifier("apply")), [t.identifier(thisName), t.identifier("arguments")]))])), lastNode]);
|
|
113
|
+
var strictModeEnforcingBlock = path.find(function (p) {
|
|
114
|
+
return (0, _astUtils.isStrictMode)(p);
|
|
115
|
+
});
|
|
116
|
+
if (strictModeEnforcingBlock) {
|
|
117
|
+
// Preserve 'use strict' directive
|
|
118
|
+
// This is necessary to enure subsequent transforms (Control Flow Flattening) are aware of the strict mode directive
|
|
119
|
+
evalProgram.directives.push(t.directive(t.directiveLiteral("use strict")));
|
|
120
|
+
}
|
|
121
|
+
var evalFile = t.file(evalProgram);
|
|
122
|
+
var newObfuscator = new _obfuscator["default"](me.options, me.obfuscator);
|
|
123
|
+
var hasRan = new Set(me.obfuscator.plugins.filter(function (plugin, i) {
|
|
124
|
+
return i <= me.obfuscator.index;
|
|
125
|
+
}).map(function (plugin) {
|
|
126
|
+
return plugin.pluginInstance.order;
|
|
127
|
+
}));
|
|
128
|
+
newObfuscator.plugins = newObfuscator.plugins.filter(function (plugin) {
|
|
129
|
+
return plugin.pluginInstance.order == _order.Order.Preparation || !hasRan.has(plugin.pluginInstance.order);
|
|
130
|
+
});
|
|
131
|
+
newObfuscator.obfuscateAST(evalFile, {
|
|
132
|
+
disablePack: true
|
|
133
|
+
});
|
|
134
|
+
var generated = _obfuscator["default"].generateCode(evalFile);
|
|
135
|
+
var functionExpression = t.callExpression(t.identifier(rgfEvalName), [t.stringLiteral(generated)]);
|
|
136
|
+
var index = rgfArrayExpression.elements.length;
|
|
137
|
+
rgfArrayExpression.elements.push(functionExpression);
|
|
138
|
+
|
|
139
|
+
// Params no longer needed, using 'arguments' instead
|
|
140
|
+
var originalLength = (0, _functionUtils.computeFunctionLength)(path);
|
|
141
|
+
path.node.params = [];
|
|
142
|
+
|
|
143
|
+
// Function is now unsafe
|
|
144
|
+
path.node[_constants.UNSAFE] = true;
|
|
145
|
+
// Params changed and using 'arguments'
|
|
146
|
+
path.node[_constants.PREDICTABLE] = false;
|
|
147
|
+
me.skip(path);
|
|
148
|
+
|
|
149
|
+
// Update body to point to new function
|
|
150
|
+
path.get("body").replaceWith(t.blockStatement([t.returnStatement(t.callExpression(t.memberExpression(t.memberExpression(t.identifier(rgfArrayName), (0, _node.numericLiteral)(index), true), t.stringLiteral("apply"), true), [t.arrayExpression([t.thisExpression(), t.identifier(rgfArrayName)]), t.identifier("arguments")]))]));
|
|
151
|
+
me.setFunctionLength(path, originalLength);
|
|
152
|
+
me.changeData.functions++;
|
|
151
153
|
}
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
// This function is not 'reference-less', cannot be RGF'd
|
|
155
|
-
if (!isReferenceLess) {
|
|
156
|
-
if (object.id) {
|
|
157
|
-
var _object$id2;
|
|
158
|
-
this.log(`${object === null || object === void 0 ? void 0 : (_object$id2 = object.id) === null || _object$id2 === void 0 ? void 0 : _object$id2.name}() cannot be transformed because of ${identifierPreventingTransformation}`);
|
|
159
|
-
}
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Since `new Function` is completely isolated, create an entire new obfuscator and run remaining transformations.
|
|
164
|
-
// RGF runs early and needs completed code before converting to a string.
|
|
165
|
-
// (^ the variables haven't been renamed yet)
|
|
166
|
-
var obfuscator = new _obfuscator.default({
|
|
167
|
-
...this.options,
|
|
168
|
-
stringEncoding: false,
|
|
169
|
-
compact: true
|
|
170
|
-
});
|
|
171
|
-
if (obfuscator.options.lock) {
|
|
172
|
-
delete obfuscator.options.lock.countermeasures;
|
|
173
|
-
|
|
174
|
-
// Integrity will not recursively apply to RGF'd functions. This is intended.
|
|
175
|
-
var lockTransform = obfuscator.transforms["Lock"];
|
|
176
|
-
if (lockTransform) {
|
|
177
|
-
lockTransform.before = lockTransform.before.filter(beforeTransform => !(beforeTransform instanceof _integrity.default));
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
var transforms = obfuscator.array.filter(x => x.priority > this.priority);
|
|
181
|
-
var embeddedFunctionName = this.getPlaceholder();
|
|
182
|
-
var embeddedFunction = {
|
|
183
|
-
type: "FunctionDeclaration",
|
|
184
|
-
id: (0, _gen.Identifier)(embeddedFunctionName),
|
|
185
|
-
body: (0, _gen.BlockStatement)([...object.body.body]),
|
|
186
|
-
params: object.params,
|
|
187
|
-
async: false,
|
|
188
|
-
generator: false
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
// The new program will look like this
|
|
192
|
-
// new Function(`
|
|
193
|
-
// var rgf_array = this[0]
|
|
194
|
-
// function greet(message){
|
|
195
|
-
// console.log(message)
|
|
196
|
-
// }
|
|
197
|
-
// return greet.apply(this[1], arguments)
|
|
198
|
-
// `)
|
|
199
|
-
//
|
|
200
|
-
// And called like
|
|
201
|
-
// f.apply([ rgf_array, this ], arguments)
|
|
202
|
-
var tree = {
|
|
203
|
-
type: "Program",
|
|
204
|
-
body: [(0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.arrayExpressionName, (0, _gen.MemberExpression)((0, _gen.ThisExpression)(), (0, _gen.Literal)(0)))), embeddedFunction, (0, _gen.ReturnStatement)((0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(embeddedFunctionName), (0, _gen.Literal)("apply"), true), [(0, _gen.MemberExpression)((0, _gen.ThisExpression)(), (0, _gen.Literal)(1)), (0, _gen.Identifier)("arguments")]))]
|
|
205
|
-
};
|
|
206
|
-
transforms.forEach(transform => {
|
|
207
|
-
transform.apply(tree);
|
|
208
|
-
});
|
|
209
|
-
var toString = (0, _compiler.compileJsSync)(tree, obfuscator.options);
|
|
210
|
-
|
|
211
|
-
// new Function(code)
|
|
212
|
-
var newFunctionExpression = (0, _gen.NewExpression)((0, _gen.Identifier)("Function"), [(0, _gen.Literal)(toString)]);
|
|
213
|
-
|
|
214
|
-
// The index where this function is placed in the array
|
|
215
|
-
var newFunctionExpressionIndex = this.arrayExpressionElements.length;
|
|
216
|
-
|
|
217
|
-
// Add it to the array
|
|
218
|
-
this.arrayExpressionElements.push(newFunctionExpression);
|
|
219
|
-
|
|
220
|
-
// The member expression to retrieve this function
|
|
221
|
-
var memberExpression = (0, _gen.MemberExpression)((0, _gen.Identifier)(this.arrayExpressionName), (0, _gen.Literal)(newFunctionExpressionIndex), true);
|
|
222
|
-
var originalFunctionLength = (0, _insert.computeFunctionLength)(object.params);
|
|
223
|
-
|
|
224
|
-
// Replace based on type
|
|
225
|
-
|
|
226
|
-
// (1) Function Declaration:
|
|
227
|
-
// - Replace body with call to new function
|
|
228
|
-
if (object.type === "FunctionDeclaration") {
|
|
229
|
-
object.body = (0, _gen.BlockStatement)([(0, _gen.ReturnStatement)((0, _gen.CallExpression)((0, _gen.MemberExpression)(memberExpression, (0, _gen.Literal)("apply"), true), [(0, _gen.ArrayExpression)([(0, _gen.Identifier)(this.arrayExpressionName), (0, _gen.ThisExpression)()]), (0, _gen.Identifier)("arguments")]))]);
|
|
230
|
-
|
|
231
|
-
// The parameters are no longer needed ('arguments' is used to capture them)
|
|
232
|
-
object.params = [];
|
|
233
|
-
|
|
234
|
-
// The function is no longer guaranteed to not have extraneous parameters passed in
|
|
235
|
-
object[_constants.predictableFunctionTag] = false;
|
|
236
|
-
if (this.options.preserveFunctionLength && originalFunctionLength !== 0) {
|
|
237
|
-
var body = parents[0];
|
|
238
|
-
body.splice(body.indexOf(object), 0, (0, _gen.ExpressionStatement)((0, _gen.CallExpression)((0, _gen.Identifier)(this.getFunctionLengthName(parents)), [(0, _gen.Identifier)(object.id.name), (0, _gen.Literal)(originalFunctionLength)])));
|
|
239
|
-
}
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// (2) Function Expression:
|
|
244
|
-
// - Replace expression with member expression pointing to new function
|
|
245
|
-
if (object.type === "FunctionExpression") {
|
|
246
|
-
if (this.options.preserveFunctionLength && originalFunctionLength !== 0) {
|
|
247
|
-
memberExpression = (0, _gen.CallExpression)((0, _gen.Identifier)(this.getFunctionLengthName(parents)), [memberExpression, (0, _gen.Literal)(originalFunctionLength)]);
|
|
248
|
-
}
|
|
249
|
-
this.replace(object, memberExpression);
|
|
250
|
-
return;
|
|
251
154
|
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
exports.default = RGF;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
};
|