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,133 +1,80 @@
|
|
|
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 _transform = _interopRequireDefault(require("./transform"));
|
|
8
|
-
var _gen = require("../util/gen");
|
|
9
|
-
var _random = require("../util/random");
|
|
7
|
+
exports["default"] = void 0;
|
|
10
8
|
var _order = require("../order");
|
|
11
|
-
var
|
|
12
|
-
var
|
|
9
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
10
|
+
var _astUtils = require("../utils/ast-utils");
|
|
11
|
+
var _randomUtils = require("../utils/random-utils");
|
|
13
12
|
var _probability = require("../probability");
|
|
14
|
-
|
|
15
|
-
function
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
+
var _default = exports["default"] = function _default(_ref) {
|
|
16
|
+
var Plugin = _ref.Plugin;
|
|
17
|
+
var me = Plugin(_order.Order.OpaquePredicates, {
|
|
18
|
+
changeData: {
|
|
19
|
+
opaquePredicates: 0
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
function createTruePredicate(path) {
|
|
23
|
+
var controlObject = me.getControlObject((0, _astUtils.getBlock)(path));
|
|
24
|
+
var trueValue = controlObject.createTruePredicate();
|
|
25
|
+
return trueValue;
|
|
23
26
|
}
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
var active = true;
|
|
28
|
+
var transformCount = 0;
|
|
29
|
+
function shouldTransform(path) {
|
|
30
|
+
if (!active) return false;
|
|
31
|
+
if (path.find(function (p) {
|
|
32
|
+
return me.isSkipped(p);
|
|
33
|
+
})) return false;
|
|
34
|
+
if (!(0, _probability.computeProbabilityMap)(me.options.opaquePredicates)) return false;
|
|
35
|
+
transformCount++;
|
|
36
|
+
var depth = path.getAncestry().length;
|
|
37
|
+
return (0, _randomUtils.chance)(1000 - transformCount - depth * 100);
|
|
26
38
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
* Changes test expression (such as if statements, for loops) to add predicates.
|
|
32
|
-
*
|
|
33
|
-
* Predicates are computed at runtime.
|
|
34
|
-
*/
|
|
35
|
-
class OpaquePredicates extends _transform.default {
|
|
36
|
-
constructor(o) {
|
|
37
|
-
super(o, _order.ObfuscateOrder.OpaquePredicates);
|
|
38
|
-
_defineProperty(this, "undefinedVar", void 0);
|
|
39
|
-
_defineProperty(this, "nullVar", void 0);
|
|
40
|
-
_defineProperty(this, "numberVar", void 0);
|
|
41
|
-
_defineProperty(this, "predicateName", void 0);
|
|
42
|
-
_defineProperty(this, "predicate", void 0);
|
|
43
|
-
_defineProperty(this, "predicates", void 0);
|
|
44
|
-
_defineProperty(this, "gen", void 0);
|
|
45
|
-
_defineProperty(this, "made", void 0);
|
|
46
|
-
this.predicates = Object.create(null);
|
|
47
|
-
this.gen = this.getGenerator();
|
|
48
|
-
this.made = 0;
|
|
49
|
-
}
|
|
50
|
-
match(object, parents) {
|
|
51
|
-
return (isTestExpression(object, parents) || object.type == "SwitchCase") && !parents.find(x => x.$dispatcherSkip || x.type == "AwaitExpression");
|
|
39
|
+
function wrapWithPredicate(path) {
|
|
40
|
+
var newExpression = t.logicalExpression("&&", createTruePredicate(path), path.node);
|
|
41
|
+
me.changeData.opaquePredicates++;
|
|
42
|
+
path.replaceWith(me.skip(newExpression));
|
|
52
43
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if (
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
if (!this.predicate) {
|
|
63
|
-
this.predicateName = this.getPlaceholder();
|
|
64
|
-
this.predicate = (0, _gen.ObjectExpression)([]);
|
|
65
|
-
var tempName = this.getPlaceholder();
|
|
66
|
-
(0, _insert.prepend)(parents[parents.length - 1] || object, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.predicateName, (0, _gen.CallExpression)((0, _gen.FunctionExpression)([], [(0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(tempName, this.predicate)), (0, _gen.ReturnStatement)((0, _gen.Identifier)(tempName))]), []))));
|
|
67
|
-
}
|
|
68
|
-
var expr = (0, _random.choice)(Object.values(this.predicates));
|
|
69
|
-
if (!expr || Math.random() < 0.5 / (Object.keys(this.predicates).length || 1)) {
|
|
70
|
-
var prop = this.gen.generate();
|
|
71
|
-
var accessor = (0, _gen.MemberExpression)((0, _gen.Identifier)(this.predicateName), (0, _gen.Identifier)(prop), false);
|
|
72
|
-
switch ((0, _random.choice)(["array", "number", "string"])) {
|
|
73
|
-
case "array":
|
|
74
|
-
var arrayProp = this.gen.generate();
|
|
75
|
-
this.predicate.properties.push((0, _gen.Property)((0, _gen.Identifier)(arrayProp), (0, _gen.ArrayExpression)([])));
|
|
76
|
-
var paramName = this.getPlaceholder();
|
|
77
|
-
this.predicate.properties.push((0, _gen.Property)((0, _gen.Identifier)(prop), (0, _gen.FunctionExpression)([(0, _gen.AssignmentPattern)((0, _gen.Identifier)(paramName), (0, _gen.Literal)("length"))], (0, _template.default)(`
|
|
78
|
-
if ( !${this.predicateName}.${arrayProp}[0] ) {
|
|
79
|
-
${this.predicateName}.${arrayProp}.push(${(0, _random.getRandomInteger)(-100, 100)});
|
|
80
|
-
}
|
|
81
|
-
return ${this.predicateName}.${arrayProp}[${paramName}];
|
|
82
|
-
`).compile())));
|
|
83
|
-
expr = (0, _gen.CallExpression)(accessor, []);
|
|
84
|
-
break;
|
|
85
|
-
case "number":
|
|
86
|
-
this.predicate.properties.push((0, _gen.Property)((0, _gen.Identifier)(prop), (0, _gen.Literal)((0, _random.getRandomInteger)(15, 90))));
|
|
87
|
-
expr = (0, _gen.BinaryExpression)(">", accessor, (0, _gen.Literal)((0, _random.getRandomInteger)(-90, 10)));
|
|
88
|
-
break;
|
|
89
|
-
case "string":
|
|
90
|
-
var str = this.gen.generate();
|
|
91
|
-
var index = (0, _random.getRandomInteger)(0, str.length);
|
|
92
|
-
var fn = Math.random() > 0.5 ? "charAt" : "charCodeAt";
|
|
93
|
-
this.predicate.properties.push((0, _gen.Property)((0, _gen.Identifier)(prop), (0, _gen.Literal)(str)));
|
|
94
|
-
expr = (0, _gen.BinaryExpression)("==", (0, _gen.CallExpression)((0, _gen.MemberExpression)(accessor, (0, _gen.Literal)(fn), true), [(0, _gen.Literal)(index)]), (0, _gen.Literal)(str[fn](index)));
|
|
95
|
-
break;
|
|
96
|
-
}
|
|
97
|
-
(0, _assert.ok)(expr);
|
|
98
|
-
this.predicates[prop] = expr;
|
|
99
|
-
if (Math.random() > 0.8) {
|
|
100
|
-
(0, _random.shuffle)(this.predicate.properties);
|
|
44
|
+
return {
|
|
45
|
+
visitor: {
|
|
46
|
+
// if (test) -> if (PREDICATE() && test) {}
|
|
47
|
+
IfStatement: {
|
|
48
|
+
exit: function exit(path) {
|
|
49
|
+
if (!shouldTransform(path)) return;
|
|
50
|
+
wrapWithPredicate(path.get("test"));
|
|
101
51
|
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if (typeof test.value === "number") {
|
|
109
|
-
matching = (0, _gen.Literal)((0, _random.getRandomInteger)(-250, 250));
|
|
110
|
-
} else if (typeof test.value === "string") {
|
|
111
|
-
matching = (0, _gen.Literal)((0, _random.getRandomString)(4));
|
|
112
|
-
}
|
|
52
|
+
},
|
|
53
|
+
// test ? a : b -> PREDICATE() && test ? a : b
|
|
54
|
+
ConditionalExpression: {
|
|
55
|
+
exit: function exit(path) {
|
|
56
|
+
if (!shouldTransform(path)) return;
|
|
57
|
+
wrapWithPredicate(path.get("test"));
|
|
113
58
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
59
|
+
},
|
|
60
|
+
// case test: -> case PREDICATE() && test:
|
|
61
|
+
SwitchCase: {
|
|
62
|
+
exit: function exit(path) {
|
|
63
|
+
if (!path.node.test) return;
|
|
64
|
+
if (!shouldTransform(path)) return;
|
|
65
|
+
wrapWithPredicate(path.get("test"));
|
|
117
66
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
this.replace(object, (0, _gen.LogicalExpression)("&&", (0, _insert.clone)(object), cloned));
|
|
67
|
+
},
|
|
68
|
+
// return test -> if (predicate()) { return test } else { return fake }
|
|
69
|
+
ReturnStatement: {
|
|
70
|
+
exit: function exit(path) {
|
|
71
|
+
if (!path.node.argument) return;
|
|
72
|
+
if (!shouldTransform(path)) return;
|
|
73
|
+
me.changeData.opaquePredicates++;
|
|
74
|
+
path.replaceWith(t.ifStatement(createTruePredicate(path), t.blockStatement([t.returnStatement(path.node.argument)]), t.blockStatement([t.returnStatement(t.stringLiteral((0, _randomUtils.getRandomString)(6)))])));
|
|
75
|
+
me.skip(path);
|
|
128
76
|
}
|
|
129
77
|
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
exports.default = OpaquePredicates;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
};
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
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); }
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports["default"] = pack;
|
|
8
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
9
|
+
var _obfuscator = _interopRequireDefault(require("../obfuscator"));
|
|
10
|
+
var _template = _interopRequireDefault(require("../templates/template"));
|
|
11
|
+
var _astUtils = require("../utils/ast-utils");
|
|
12
|
+
var _constants = require("../constants");
|
|
13
|
+
var _order = require("../order");
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
15
|
+
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); }
|
|
16
|
+
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; }
|
|
17
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
18
|
+
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."); }
|
|
19
|
+
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; } }
|
|
20
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
21
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
22
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
23
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
24
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
25
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
26
|
+
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; } } }; }
|
|
27
|
+
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; } }
|
|
28
|
+
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; }
|
|
29
|
+
function pack(_ref) {
|
|
30
|
+
var Plugin = _ref.Plugin;
|
|
31
|
+
var me = Plugin(_order.Order.Pack, {
|
|
32
|
+
changeData: {
|
|
33
|
+
globals: 0
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
var _objectName = me.obfuscator.nameGen.generate();
|
|
37
|
+
var mappings = new Map();
|
|
38
|
+
var setterPropsNeeded = new Set();
|
|
39
|
+
var typeofMappings = new Map();
|
|
40
|
+
var prependNodes = [];
|
|
41
|
+
return {
|
|
42
|
+
// Transform identifiers, preserve import statements
|
|
43
|
+
visitor: {
|
|
44
|
+
ImportDeclaration: function ImportDeclaration(path) {
|
|
45
|
+
prependNodes.push(path.node);
|
|
46
|
+
path.remove();
|
|
47
|
+
|
|
48
|
+
// Ensure bindings are removed -> variable becomes a global -> added to mappings object
|
|
49
|
+
path.scope.crawl();
|
|
50
|
+
},
|
|
51
|
+
Program: function Program(path) {
|
|
52
|
+
path.scope.crawl();
|
|
53
|
+
},
|
|
54
|
+
Identifier: {
|
|
55
|
+
exit: function exit(path) {
|
|
56
|
+
if (!(0, _astUtils.isVariableIdentifier)(path)) return;
|
|
57
|
+
if ((0, _astUtils.isDefiningIdentifier)(path)) return;
|
|
58
|
+
if (path.node[_constants.GEN_NODE]) return;
|
|
59
|
+
if (path.node[_constants.WITH_STATEMENT]) return;
|
|
60
|
+
var identifierName = path.node.name;
|
|
61
|
+
if (_constants.reservedIdentifiers.has(identifierName)) return;
|
|
62
|
+
if (me.obfuscator.options.globalVariables.has(identifierName)) return;
|
|
63
|
+
if (identifierName === _constants.variableFunctionName) return;
|
|
64
|
+
if (!path.scope.hasGlobal(identifierName)) return;
|
|
65
|
+
if (path.key === "argument" && path.parentPath.isUnaryExpression({
|
|
66
|
+
operator: "typeof"
|
|
67
|
+
})) {
|
|
68
|
+
var unaryExpression = path.parentPath;
|
|
69
|
+
var _propertyName = typeofMappings.get(identifierName);
|
|
70
|
+
if (!_propertyName) {
|
|
71
|
+
_propertyName = me.obfuscator.nameGen.generate();
|
|
72
|
+
typeofMappings.set(identifierName, _propertyName);
|
|
73
|
+
}
|
|
74
|
+
unaryExpression.replaceWith(t.memberExpression(t.identifier(_objectName), t.stringLiteral(_propertyName), true));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
var propertyName = mappings.get(identifierName);
|
|
78
|
+
if (!propertyName) {
|
|
79
|
+
propertyName = me.obfuscator.nameGen.generate();
|
|
80
|
+
mappings.set(identifierName, propertyName);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Only add setter if the identifier is modified
|
|
84
|
+
if ((0, _astUtils.isModifiedIdentifier)(path)) {
|
|
85
|
+
setterPropsNeeded.add(identifierName);
|
|
86
|
+
}
|
|
87
|
+
path.replaceWith(t.memberExpression(t.identifier(_objectName), t.stringLiteral(propertyName), true));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
// Final AST handler
|
|
92
|
+
// Very last step in the obfuscation process
|
|
93
|
+
finalASTHandler: function finalASTHandler(ast) {
|
|
94
|
+
// Create object expression
|
|
95
|
+
// Very similar to flatten, maybe refactor to use the same code
|
|
96
|
+
var objectProperties = [];
|
|
97
|
+
me.changeData.globals = mappings.size;
|
|
98
|
+
var _iterator = _createForOfIteratorHelper(mappings),
|
|
99
|
+
_step;
|
|
100
|
+
try {
|
|
101
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
102
|
+
var _step$value = _slicedToArray(_step.value, 2),
|
|
103
|
+
identifierName = _step$value[0],
|
|
104
|
+
propertyName = _step$value[1];
|
|
105
|
+
// get identifier() { return identifier; }
|
|
106
|
+
objectProperties.push(t.objectMethod("get", t.stringLiteral(propertyName), [], t.blockStatement([t.returnStatement(t.identifier(identifierName))])));
|
|
107
|
+
|
|
108
|
+
// Only add setter if the identifier is modified
|
|
109
|
+
if (setterPropsNeeded.has(identifierName)) {
|
|
110
|
+
// set identifier(value) { return identifier = value; }
|
|
111
|
+
objectProperties.push(t.objectMethod("set", t.stringLiteral(propertyName), [t.identifier(_objectName)], t.blockStatement([t.returnStatement(t.assignmentExpression("=", t.identifier(identifierName), t.identifier(_objectName)))])));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Add typeof mappings
|
|
116
|
+
} catch (err) {
|
|
117
|
+
_iterator.e(err);
|
|
118
|
+
} finally {
|
|
119
|
+
_iterator.f();
|
|
120
|
+
}
|
|
121
|
+
var _iterator2 = _createForOfIteratorHelper(typeofMappings),
|
|
122
|
+
_step2;
|
|
123
|
+
try {
|
|
124
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
125
|
+
var _step2$value = _slicedToArray(_step2.value, 2),
|
|
126
|
+
_identifierName = _step2$value[0],
|
|
127
|
+
_propertyName2 = _step2$value[1];
|
|
128
|
+
// get typeof identifier() { return typeof identifier; }
|
|
129
|
+
objectProperties.push(t.objectMethod("get", t.stringLiteral(_propertyName2), [], t.blockStatement([t.returnStatement(t.unaryExpression("typeof", t.identifier(_identifierName)))])));
|
|
130
|
+
}
|
|
131
|
+
} catch (err) {
|
|
132
|
+
_iterator2.e(err);
|
|
133
|
+
} finally {
|
|
134
|
+
_iterator2.f();
|
|
135
|
+
}
|
|
136
|
+
var objectExpression = t.objectExpression(objectProperties);
|
|
137
|
+
|
|
138
|
+
// Convert last expression to return statement
|
|
139
|
+
// This preserves the last expression in the packed code
|
|
140
|
+
var lastStatement = ast.program.body.at(-1);
|
|
141
|
+
if (lastStatement && t.isExpressionStatement(lastStatement)) {
|
|
142
|
+
Object.assign(lastStatement, t.returnStatement(lastStatement.expression));
|
|
143
|
+
}
|
|
144
|
+
var _outputCode = _obfuscator["default"].generateCode(ast, _objectSpread(_objectSpread({}, me.obfuscator.options), {}, {
|
|
145
|
+
compact: true
|
|
146
|
+
}));
|
|
147
|
+
var newAST = new _template["default"]("\n {prependNodes}\n Function({objectName}, {outputCode})({objectExpression});\n ").file({
|
|
148
|
+
objectName: function objectName() {
|
|
149
|
+
return t.stringLiteral(_objectName);
|
|
150
|
+
},
|
|
151
|
+
outputCode: function outputCode() {
|
|
152
|
+
return t.stringLiteral(_outputCode);
|
|
153
|
+
},
|
|
154
|
+
objectExpression: objectExpression,
|
|
155
|
+
prependNodes: prependNodes
|
|
156
|
+
});
|
|
157
|
+
return newAST;
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PluginInstance = void 0;
|
|
7
|
+
var _randomUtils = require("../utils/random-utils");
|
|
8
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
9
|
+
var _constants = require("../constants");
|
|
10
|
+
var _setFunctionLengthTemplate = require("../templates/setFunctionLengthTemplate");
|
|
11
|
+
var _astUtils = require("../utils/ast-utils");
|
|
12
|
+
var _ControlObject = _interopRequireDefault(require("../utils/ControlObject"));
|
|
13
|
+
var _assert = require("assert");
|
|
14
|
+
var _node = require("../utils/node");
|
|
15
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
16
|
+
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); }
|
|
17
|
+
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; }
|
|
18
|
+
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); }
|
|
19
|
+
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
|
20
|
+
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
|
|
21
|
+
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
|
22
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
23
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
24
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
25
|
+
var PluginInstance = exports.PluginInstance = /*#__PURE__*/function () {
|
|
26
|
+
function PluginInstance(pluginOptions, obfuscator) {
|
|
27
|
+
_classCallCheck(this, PluginInstance);
|
|
28
|
+
_defineProperty(this, "changeData", {});
|
|
29
|
+
this.pluginOptions = pluginOptions;
|
|
30
|
+
this.obfuscator = obfuscator;
|
|
31
|
+
}
|
|
32
|
+
return _createClass(PluginInstance, [{
|
|
33
|
+
key: "name",
|
|
34
|
+
get: function get() {
|
|
35
|
+
return this.pluginOptions.name || "unnamed";
|
|
36
|
+
}
|
|
37
|
+
}, {
|
|
38
|
+
key: "order",
|
|
39
|
+
get: function get() {
|
|
40
|
+
return this.pluginOptions.order;
|
|
41
|
+
}
|
|
42
|
+
}, {
|
|
43
|
+
key: "options",
|
|
44
|
+
get: function get() {
|
|
45
|
+
return this.obfuscator.options;
|
|
46
|
+
}
|
|
47
|
+
}, {
|
|
48
|
+
key: "globalState",
|
|
49
|
+
get: function get() {
|
|
50
|
+
return this.obfuscator.globalState;
|
|
51
|
+
}
|
|
52
|
+
}, {
|
|
53
|
+
key: "skip",
|
|
54
|
+
value: function skip(path) {
|
|
55
|
+
var _this = this;
|
|
56
|
+
if (Array.isArray(path)) {
|
|
57
|
+
path.forEach(function (p) {
|
|
58
|
+
return _this.skip(p);
|
|
59
|
+
});
|
|
60
|
+
} else {
|
|
61
|
+
var any = path;
|
|
62
|
+
var node = any.isNodeType ? any.node : any;
|
|
63
|
+
node[_constants.SKIP] = this.order;
|
|
64
|
+
return node;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Returns `true` if the given path has been skipped by this plugin.
|
|
70
|
+
*/
|
|
71
|
+
}, {
|
|
72
|
+
key: "isSkipped",
|
|
73
|
+
value: function isSkipped(path) {
|
|
74
|
+
return path.node[_constants.SKIP] === this.order;
|
|
75
|
+
}
|
|
76
|
+
}, {
|
|
77
|
+
key: "setFunctionLength",
|
|
78
|
+
value: function setFunctionLength(path, originalLength) {
|
|
79
|
+
path.node[_constants.FN_LENGTH] = originalLength;
|
|
80
|
+
|
|
81
|
+
// Function length
|
|
82
|
+
if (this.options.preserveFunctionLength && originalLength > 0) {
|
|
83
|
+
if (!this.setFunctionLengthName) {
|
|
84
|
+
this.setFunctionLengthName = this.getPlaceholder("fnLength");
|
|
85
|
+
this.skip((0, _astUtils.prependProgram)(path, _setFunctionLengthTemplate.SetFunctionLengthTemplate.compile({
|
|
86
|
+
fnName: this.setFunctionLengthName
|
|
87
|
+
})));
|
|
88
|
+
}
|
|
89
|
+
if (t.isFunctionDeclaration(path.node)) {
|
|
90
|
+
(0, _astUtils.prepend)(path.parentPath, t.expressionStatement(t.callExpression(t.identifier(this.setFunctionLengthName), [t.identifier(path.node.id.name), (0, _node.numericLiteral)(originalLength)])));
|
|
91
|
+
} else if (t.isFunctionExpression(path.node) || t.isArrowFunctionExpression(path.node)) {
|
|
92
|
+
path.replaceWith(t.callExpression(t.identifier(this.setFunctionLengthName), [path.node, (0, _node.numericLiteral)(originalLength)]));
|
|
93
|
+
} else {
|
|
94
|
+
// TODO
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Returns a random string.
|
|
101
|
+
*
|
|
102
|
+
* Used for creating temporary variables names, typically before RenameVariables has ran.
|
|
103
|
+
*
|
|
104
|
+
* These long temp names will be converted to short, mangled names by RenameVariables.
|
|
105
|
+
*/
|
|
106
|
+
}, {
|
|
107
|
+
key: "getPlaceholder",
|
|
108
|
+
value: function getPlaceholder() {
|
|
109
|
+
var suffix = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
|
|
110
|
+
return "__p_" + (0, _randomUtils.getRandomString)(4) + (suffix ? "_" + suffix : "");
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Retrieves (or creates) a `ControlObject` for the given `blockPath`.
|
|
115
|
+
*/
|
|
116
|
+
}, {
|
|
117
|
+
key: "getControlObject",
|
|
118
|
+
value: function getControlObject(blockPath) {
|
|
119
|
+
var createMultiple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
120
|
+
(0, _assert.ok)(blockPath.isBlock());
|
|
121
|
+
var controlObjects = blockPath.node[_constants.CONTROL_OBJECTS];
|
|
122
|
+
if (!controlObjects) {
|
|
123
|
+
controlObjects = [];
|
|
124
|
+
}
|
|
125
|
+
if (controlObjects.length === 0 || createMultiple && (0, _randomUtils.chance)(controlObjects[0].propertyNames.size - 15 * controlObjects.length)) {
|
|
126
|
+
var newControlObject = new _ControlObject["default"](this, blockPath);
|
|
127
|
+
controlObjects.push(newControlObject);
|
|
128
|
+
blockPath.node[_constants.CONTROL_OBJECTS] = controlObjects;
|
|
129
|
+
return newControlObject;
|
|
130
|
+
}
|
|
131
|
+
return (0, _randomUtils.choice)(controlObjects);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Logs a message to the console, only if `verbose` is enabled.
|
|
136
|
+
* @param messages
|
|
137
|
+
*/
|
|
138
|
+
}, {
|
|
139
|
+
key: "log",
|
|
140
|
+
value: function log() {
|
|
141
|
+
if (this.options.verbose) {
|
|
142
|
+
var _console;
|
|
143
|
+
for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
144
|
+
messages[_key] = arguments[_key];
|
|
145
|
+
}
|
|
146
|
+
(_console = console).log.apply(_console, ["[".concat(this.name, "]")].concat(messages));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Logs a warning to the console, only if `verbose` is enabled.
|
|
152
|
+
* @param messages
|
|
153
|
+
*/
|
|
154
|
+
}, {
|
|
155
|
+
key: "warn",
|
|
156
|
+
value: function warn() {
|
|
157
|
+
if (this.options.verbose) {
|
|
158
|
+
var _console2;
|
|
159
|
+
for (var _len2 = arguments.length, messages = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
160
|
+
messages[_key2] = arguments[_key2];
|
|
161
|
+
}
|
|
162
|
+
(_console2 = console).log.apply(_console2, ["WARN [".concat(this.name, "]")].concat(messages));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Throws an error with the given message.
|
|
168
|
+
* @param messages
|
|
169
|
+
*/
|
|
170
|
+
}, {
|
|
171
|
+
key: "error",
|
|
172
|
+
value: function error() {
|
|
173
|
+
for (var _len3 = arguments.length, messages = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
|
174
|
+
messages[_key3] = arguments[_key3];
|
|
175
|
+
}
|
|
176
|
+
throw new Error("[".concat(this.name, "] ").concat(messages.join(", ")));
|
|
177
|
+
}
|
|
178
|
+
}]);
|
|
179
|
+
}();
|