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
|
@@ -3,104 +3,224 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
6
|
+
exports["default"] = void 0;
|
|
7
|
+
var babelTypes = _interopRequireWildcard(require("@babel/types"));
|
|
8
|
+
var _parser = require("@babel/parser");
|
|
9
|
+
var _traverse = _interopRequireDefault(require("@babel/traverse"));
|
|
8
10
|
var _assert = require("assert");
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
var _randomUtils = require("../utils/random-utils");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
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 _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); }
|
|
16
|
+
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; } } }; }
|
|
17
|
+
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; } }
|
|
18
|
+
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; }
|
|
19
|
+
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; }
|
|
20
|
+
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; }
|
|
21
|
+
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
|
22
|
+
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); } }
|
|
23
|
+
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
|
24
|
+
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; }
|
|
25
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
26
|
+
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); }
|
|
27
|
+
// Create a union type of the symbol keys in NodeSymbol
|
|
28
|
+
var Template = exports["default"] = /*#__PURE__*/function () {
|
|
29
|
+
function Template() {
|
|
30
|
+
_classCallCheck(this, Template);
|
|
31
|
+
_defineProperty(this, "astIdentifierPrefix", "__t_" + (0, _randomUtils.getRandomString)(6));
|
|
32
|
+
_defineProperty(this, "symbols", []);
|
|
33
|
+
for (var _len = arguments.length, templates = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
34
|
+
templates[_key] = arguments[_key];
|
|
35
|
+
}
|
|
36
|
+
this.templates = templates;
|
|
37
|
+
this.defaultVariables = Object.create(null);
|
|
38
|
+
this.requiredVariables = new Set();
|
|
39
|
+
this.findRequiredVariables();
|
|
14
40
|
}
|
|
15
|
-
(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
41
|
+
return _createClass(Template, [{
|
|
42
|
+
key: "addSymbols",
|
|
43
|
+
value: function addSymbols() {
|
|
44
|
+
var _this$symbols;
|
|
45
|
+
(_this$symbols = this.symbols).push.apply(_this$symbols, arguments);
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
}, {
|
|
49
|
+
key: "setDefaultVariables",
|
|
50
|
+
value: function setDefaultVariables(defaultVariables) {
|
|
51
|
+
this.defaultVariables = defaultVariables;
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
}, {
|
|
55
|
+
key: "findRequiredVariables",
|
|
56
|
+
value: function findRequiredVariables() {
|
|
57
|
+
var _this = this;
|
|
58
|
+
var matches = this.templates[0].match(/{[$A-Za-z0-9_]+}/g);
|
|
59
|
+
if (matches !== null) {
|
|
60
|
+
matches.forEach(function (variable) {
|
|
61
|
+
var name = variable.slice(1, -1);
|
|
62
|
+
_this.requiredVariables.add(name);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}, {
|
|
67
|
+
key: "interpolateTemplate",
|
|
68
|
+
value: function interpolateTemplate(variables) {
|
|
69
|
+
var _this2 = this;
|
|
70
|
+
var allVariables = _objectSpread(_objectSpread({}, this.defaultVariables), variables);
|
|
71
|
+
var _iterator = _createForOfIteratorHelper(this.requiredVariables),
|
|
72
|
+
_step;
|
|
73
|
+
try {
|
|
74
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
75
|
+
var requiredVariable = _step.value;
|
|
76
|
+
if (typeof allVariables[requiredVariable] === "undefined") {
|
|
77
|
+
throw new Error("".concat(this.templates[0], " missing variable: ").concat(requiredVariable, " from ").concat(JSON.stringify(allVariables)));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
} catch (err) {
|
|
81
|
+
_iterator.e(err);
|
|
82
|
+
} finally {
|
|
83
|
+
_iterator.f();
|
|
84
|
+
}
|
|
85
|
+
var template = this.templates[Math.floor(Math.random() * this.templates.length)];
|
|
86
|
+
var output = template;
|
|
87
|
+
this.astVariableMappings = new Map();
|
|
88
|
+
Object.keys(allVariables).forEach(function (name) {
|
|
89
|
+
var bracketName = "{".concat(name.replace("$", "\\$"), "}");
|
|
90
|
+
var value = allVariables[name];
|
|
91
|
+
if (_this2.isASTVariable(value)) {
|
|
92
|
+
var astIdentifierName = _this2.astIdentifierPrefix + name;
|
|
93
|
+
_this2.astVariableMappings.set(name, astIdentifierName);
|
|
94
|
+
value = astIdentifierName;
|
|
95
|
+
}
|
|
96
|
+
var reg = new RegExp(bracketName, "g");
|
|
97
|
+
output = output.replace(reg, value);
|
|
98
|
+
});
|
|
99
|
+
return {
|
|
100
|
+
output: output,
|
|
101
|
+
template: template
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}, {
|
|
105
|
+
key: "isASTVariable",
|
|
106
|
+
value: function isASTVariable(variable) {
|
|
107
|
+
return typeof variable !== "string" && typeof variable !== "number";
|
|
108
|
+
}
|
|
109
|
+
}, {
|
|
110
|
+
key: "interpolateAST",
|
|
111
|
+
value: function interpolateAST(ast, variables) {
|
|
112
|
+
if (this.astVariableMappings.size === 0) return;
|
|
113
|
+
var allVariables = _objectSpread(_objectSpread({}, this.defaultVariables), variables);
|
|
114
|
+
var template = this;
|
|
19
115
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
116
|
+
// Reverse the lookup map
|
|
117
|
+
// Before {name -> __t_m4H6nk_name}
|
|
118
|
+
// After {__t_m4H6nk_name -> name}
|
|
119
|
+
var reverseMappings = new Map();
|
|
120
|
+
this.astVariableMappings.forEach(function (value, key) {
|
|
121
|
+
reverseMappings.set(value, key);
|
|
122
|
+
});
|
|
123
|
+
var insertedVariables = new Set();
|
|
124
|
+
(0, _traverse["default"])(ast, {
|
|
125
|
+
Identifier: function Identifier(path) {
|
|
126
|
+
var idName = path.node.name;
|
|
127
|
+
if (!idName.startsWith(template.astIdentifierPrefix)) return;
|
|
128
|
+
var variableName = reverseMappings.get(idName);
|
|
129
|
+
(0, _assert.ok)(variableName, "Variable ".concat(idName, " not found in mappings"));
|
|
130
|
+
var value = allVariables[variableName];
|
|
131
|
+
var isSingleUse = true; // Hard-coded nodes are deemed 'single use'
|
|
132
|
+
if (typeof value === "function") {
|
|
133
|
+
value = value();
|
|
134
|
+
isSingleUse = false;
|
|
135
|
+
}
|
|
136
|
+
if (value instanceof Template) {
|
|
137
|
+
value = value.compile(allVariables);
|
|
138
|
+
isSingleUse = false;
|
|
139
|
+
}
|
|
26
140
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
function fill() {
|
|
36
|
-
let variables = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Object.create(null);
|
|
37
|
-
var userVariables = {
|
|
38
|
-
...providedVariables,
|
|
39
|
-
...variables
|
|
40
|
-
};
|
|
141
|
+
// Duplicate node check
|
|
142
|
+
if (isSingleUse) {
|
|
143
|
+
if (insertedVariables.has(variableName)) {
|
|
144
|
+
(0, _assert.ok)(false, "Duplicate node inserted for variable: " + variableName);
|
|
145
|
+
}
|
|
146
|
+
insertedVariables.add(variableName);
|
|
147
|
+
}
|
|
41
148
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
149
|
+
// Insert new nodes
|
|
150
|
+
if (!Array.isArray(value)) {
|
|
151
|
+
path.replaceWith(value);
|
|
152
|
+
} else {
|
|
153
|
+
path.replaceWithMultiple(value);
|
|
154
|
+
}
|
|
155
|
+
path.skip();
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}, {
|
|
160
|
+
key: "file",
|
|
161
|
+
value: function file() {
|
|
162
|
+
var _this3 = this;
|
|
163
|
+
var variables = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
164
|
+
var _this$interpolateTemp = this.interpolateTemplate(variables),
|
|
165
|
+
output = _this$interpolateTemp.output;
|
|
166
|
+
var file;
|
|
167
|
+
try {
|
|
168
|
+
file = (0, _parser.parse)(output, {
|
|
169
|
+
sourceType: "module",
|
|
170
|
+
allowReturnOutsideFunction: true
|
|
171
|
+
});
|
|
172
|
+
} catch (e) {
|
|
173
|
+
throw new Error(output + "\n" + "Template failed to parse: " + e.message);
|
|
174
|
+
}
|
|
175
|
+
this.interpolateAST(file, variables);
|
|
176
|
+
if (this.symbols.length > 0) {
|
|
177
|
+
file.program.body.forEach(function (node) {
|
|
178
|
+
var _iterator2 = _createForOfIteratorHelper(_this3.symbols),
|
|
179
|
+
_step2;
|
|
180
|
+
try {
|
|
181
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
182
|
+
var symbol = _step2.value;
|
|
183
|
+
node[symbol] = true;
|
|
184
|
+
}
|
|
185
|
+
} catch (err) {
|
|
186
|
+
_iterator2.e(err);
|
|
187
|
+
} finally {
|
|
188
|
+
_iterator2.f();
|
|
189
|
+
}
|
|
190
|
+
});
|
|
46
191
|
}
|
|
192
|
+
return file;
|
|
47
193
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
Object.keys(allVariables).forEach(name => {
|
|
55
|
-
var bracketName = "{" + name.replace("$", "\\$") + "}";
|
|
56
|
-
var value = allVariables[name] + "";
|
|
57
|
-
var reg = new RegExp(bracketName, "g");
|
|
58
|
-
output = output.replace(reg, value);
|
|
59
|
-
});
|
|
60
|
-
return {
|
|
61
|
-
output,
|
|
62
|
-
template
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
function compile(variables) {
|
|
66
|
-
var {
|
|
67
|
-
output,
|
|
68
|
-
template
|
|
69
|
-
} = fill(variables);
|
|
70
|
-
try {
|
|
71
|
-
var program = (0, _parser.parseSnippet)(output);
|
|
72
|
-
return program.body;
|
|
73
|
-
} catch (e) {
|
|
74
|
-
console.error(e);
|
|
75
|
-
console.error(template);
|
|
76
|
-
console.error({
|
|
77
|
-
...providedVariables,
|
|
78
|
-
...variables
|
|
79
|
-
});
|
|
80
|
-
throw new Error("Template failed to parse: OUTPUT= " + output + " SOURCE= " + template);
|
|
194
|
+
}, {
|
|
195
|
+
key: "compile",
|
|
196
|
+
value: function compile() {
|
|
197
|
+
var variables = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
198
|
+
var file = this.file(variables);
|
|
199
|
+
return file.program.body;
|
|
81
200
|
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
201
|
+
}, {
|
|
202
|
+
key: "single",
|
|
203
|
+
value: function single() {
|
|
204
|
+
var variables = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
205
|
+
var nodes = this.compile(variables);
|
|
206
|
+
if (nodes.length !== 1) {
|
|
207
|
+
var filteredNodes = nodes.filter(function (node) {
|
|
208
|
+
return node.type !== "EmptyStatement";
|
|
209
|
+
});
|
|
210
|
+
(0, _assert.ok)(filteredNodes.length === 1, "Expected single node, got ".concat(filteredNodes.map(function (node) {
|
|
211
|
+
return node.type;
|
|
212
|
+
}).join(", ")));
|
|
213
|
+
return filteredNodes[0];
|
|
214
|
+
}
|
|
215
|
+
return nodes[0];
|
|
216
|
+
}
|
|
217
|
+
}, {
|
|
218
|
+
key: "expression",
|
|
219
|
+
value: function expression() {
|
|
220
|
+
var variables = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
221
|
+
var statement = this.single(variables);
|
|
222
|
+
babelTypes.assertExpressionStatement(statement);
|
|
223
|
+
return statement.expression;
|
|
224
|
+
}
|
|
225
|
+
}]);
|
|
226
|
+
}();
|
|
@@ -0,0 +1,100 @@
|
|
|
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"] = void 0;
|
|
8
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
9
|
+
var _assert = require("assert");
|
|
10
|
+
var _order = require("../order");
|
|
11
|
+
var _constants = require("../constants");
|
|
12
|
+
var _template = _interopRequireDefault(require("../templates/template"));
|
|
13
|
+
var _astUtils = require("../utils/ast-utils");
|
|
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 _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
18
|
+
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."); }
|
|
19
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
20
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
21
|
+
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; } } }; }
|
|
22
|
+
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; } }
|
|
23
|
+
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; }
|
|
24
|
+
var _default = exports["default"] = function _default(_ref) {
|
|
25
|
+
var Plugin = _ref.Plugin;
|
|
26
|
+
var me = Plugin(_order.Order.AstScrambler, {
|
|
27
|
+
changeData: {
|
|
28
|
+
expressions: 0
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
var callExprName;
|
|
32
|
+
return {
|
|
33
|
+
visitor: {
|
|
34
|
+
"Block|SwitchCase": {
|
|
35
|
+
exit: function exit(_path) {
|
|
36
|
+
var path = _path;
|
|
37
|
+
var isProgram = path.isProgram();
|
|
38
|
+
var containerKey;
|
|
39
|
+
if (path.isSwitchCase()) {
|
|
40
|
+
containerKey = "consequent";
|
|
41
|
+
} else if (path.isBlock()) {
|
|
42
|
+
containerKey = "body";
|
|
43
|
+
}
|
|
44
|
+
var container = path.node[containerKey];
|
|
45
|
+
var newContainer = [];
|
|
46
|
+
(0, _assert.ok)(Array.isArray(container));
|
|
47
|
+
var expressions = [];
|
|
48
|
+
var flushExpressions = function flushExpressions() {
|
|
49
|
+
if (!expressions.length) return;
|
|
50
|
+
|
|
51
|
+
// Not enough expressions to require a call expression
|
|
52
|
+
if (expressions.length === 1) {
|
|
53
|
+
newContainer.push(t.expressionStatement(expressions[0]));
|
|
54
|
+
expressions = [];
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (!callExprName) {
|
|
58
|
+
callExprName = me.getPlaceholder() + "_ast";
|
|
59
|
+
}
|
|
60
|
+
me.changeData.expressions += expressions.length;
|
|
61
|
+
newContainer.push(t.expressionStatement(t.callExpression(t.identifier(callExprName), expressions)));
|
|
62
|
+
expressions = [];
|
|
63
|
+
};
|
|
64
|
+
var _iterator = _createForOfIteratorHelper(container),
|
|
65
|
+
_step;
|
|
66
|
+
try {
|
|
67
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
68
|
+
var statement = _step.value;
|
|
69
|
+
if (
|
|
70
|
+
// Preserve last expression at the top level
|
|
71
|
+
(isProgram ? statement !== container.at(-1) : true) && t.isExpressionStatement(statement) && !statement[_constants.SKIP]) {
|
|
72
|
+
if (t.isSequenceExpression(statement.expression)) {
|
|
73
|
+
var _expressions;
|
|
74
|
+
(_expressions = expressions).push.apply(_expressions, _toConsumableArray(statement.expression.expressions));
|
|
75
|
+
} else {
|
|
76
|
+
expressions.push(statement.expression);
|
|
77
|
+
}
|
|
78
|
+
} else {
|
|
79
|
+
flushExpressions();
|
|
80
|
+
newContainer.push(statement);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
} catch (err) {
|
|
84
|
+
_iterator.e(err);
|
|
85
|
+
} finally {
|
|
86
|
+
_iterator.f();
|
|
87
|
+
}
|
|
88
|
+
flushExpressions();
|
|
89
|
+
path.node[containerKey] = newContainer;
|
|
90
|
+
if (path.isProgram()) {
|
|
91
|
+
if (callExprName) {
|
|
92
|
+
var functionDeclaration = new _template["default"]("\n function ".concat(callExprName, "(){\n ").concat(callExprName, " = function(){};\n }\n ")).single();
|
|
93
|
+
(0, _astUtils.append)(path, functionDeclaration);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
};
|
|
@@ -1,140 +1,83 @@
|
|
|
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 _gen = require("../util/gen");
|
|
9
|
-
var _insert = require("../util/insert");
|
|
10
|
-
var _random = require("../util/random");
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
11
9
|
var _order = require("../order");
|
|
12
10
|
var _assert = require("assert");
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
function
|
|
17
|
-
function
|
|
18
|
-
function
|
|
19
|
-
function
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
_defineProperty(this, "calculatorFn", void 0);
|
|
29
|
-
_defineProperty(this, "calculatorOpVar", void 0);
|
|
30
|
-
_defineProperty(this, "calculatorSetOpFn", void 0);
|
|
31
|
-
this.ops = Object.create(null);
|
|
32
|
-
this.statesUsed = new Set();
|
|
33
|
-
this.calculatorFn = this.getPlaceholder() + "_calc";
|
|
34
|
-
this.calculatorOpVar = this.getPlaceholder();
|
|
35
|
-
this.calculatorSetOpFn = this.getPlaceholder();
|
|
36
|
-
this.gen = this.getGenerator();
|
|
37
|
-
}
|
|
38
|
-
apply(tree) {
|
|
39
|
-
super.apply(tree);
|
|
40
|
-
if (Object.keys(this.ops).length == 0) {
|
|
41
|
-
return;
|
|
11
|
+
var _NameGen = require("../utils/NameGen");
|
|
12
|
+
var _astUtils = require("../utils/ast-utils");
|
|
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 _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
16
|
+
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."); }
|
|
17
|
+
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; } }
|
|
18
|
+
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; }
|
|
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
|
+
var _default = exports["default"] = function _default(_ref) {
|
|
22
|
+
var Plugin = _ref.Plugin;
|
|
23
|
+
var me = Plugin(_order.Order.Calculator, {
|
|
24
|
+
changeData: {
|
|
25
|
+
expressions: 0
|
|
42
26
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
switchCases.push((0, _gen.SwitchCase)((0, _gen.Literal)(code), body));
|
|
58
|
-
});
|
|
59
|
-
var func = (0, _gen.FunctionDeclaration)(this.calculatorFn, [leftArg, rightArg].map(x => (0, _gen.Identifier)(x)), [(0, _gen.SwitchStatement)((0, _gen.Identifier)(this.calculatorOpVar), switchCases)]);
|
|
60
|
-
(0, _insert.prepend)(tree, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.calculatorOpVar)));
|
|
61
|
-
(0, _insert.prepend)(tree, (0, _template.default)(`function {name}(a){
|
|
62
|
-
a = {b} + ({b}=a, 0);
|
|
63
|
-
return a;
|
|
64
|
-
}`).single({
|
|
65
|
-
name: this.calculatorSetOpFn,
|
|
66
|
-
b: this.calculatorOpVar
|
|
67
|
-
}));
|
|
68
|
-
(0, _insert.prepend)(tree, func);
|
|
69
|
-
}
|
|
70
|
-
match(object, parents) {
|
|
71
|
-
return object.type === "BinaryExpression" || object.type === "UnaryExpression";
|
|
72
|
-
}
|
|
73
|
-
transform(object, parents) {
|
|
74
|
-
// Allow percentage
|
|
75
|
-
if (!(0, _probability.ComputeProbabilityMap)(this.options.calculator)) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
var operator = object.operator;
|
|
79
|
-
var type;
|
|
80
|
-
if (object.type === "BinaryExpression") {
|
|
81
|
-
type = "Binary";
|
|
82
|
-
if (!allowedBinaryOperators.has(operator)) {
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
27
|
+
});
|
|
28
|
+
var nameGen = new _NameGen.NameGen(me.options.identifierGenerator);
|
|
29
|
+
return {
|
|
30
|
+
visitor: {
|
|
31
|
+
Program: {
|
|
32
|
+
exit: function exit(programPath) {
|
|
33
|
+
var allowedBinaryOperators = new Set(["+", "-", "*", "/"]);
|
|
34
|
+
var operatorsMap = new Map();
|
|
35
|
+
var calculatorFnName = me.getPlaceholder() + "_calc";
|
|
36
|
+
programPath.traverse({
|
|
37
|
+
BinaryExpression: {
|
|
38
|
+
exit: function exit(path) {
|
|
39
|
+
var operator = path.node.operator;
|
|
40
|
+
if (t.isPrivate(path.node.left)) return;
|
|
85
41
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
42
|
+
// TODO: Improve precedence handling or remove this transformation entirely
|
|
43
|
+
if (!t.isNumericLiteral(path.node.right)) return;
|
|
44
|
+
if (!t.isNumericLiteral(path.node.left)) return;
|
|
45
|
+
if (!allowedBinaryOperators.has(operator)) return;
|
|
46
|
+
var mapKey = "binaryExpression_" + operator;
|
|
47
|
+
var operatorKey = operatorsMap.get(mapKey);
|
|
89
48
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
49
|
+
// Add binary operator to the map if it doesn't exist
|
|
50
|
+
if (typeof operatorKey === "undefined") {
|
|
51
|
+
operatorKey = nameGen.generate();
|
|
52
|
+
operatorsMap.set(mapKey, operatorKey);
|
|
53
|
+
}
|
|
54
|
+
(0, _assert.ok)(operatorKey);
|
|
55
|
+
me.changeData.expressions++;
|
|
56
|
+
path.replaceWith(t.callExpression(t.identifier(calculatorFnName), [t.stringLiteral(operatorKey), path.node.left, path.node.right]));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
103
60
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return () => {
|
|
112
|
-
const opKey = type + "_" + operator;
|
|
113
|
-
if (typeof this.ops[opKey] !== "number") {
|
|
114
|
-
var newState;
|
|
115
|
-
do {
|
|
116
|
-
newState = (0, _random.getRandomInteger)(-50, 50 + Object.keys(this.ops).length * 5);
|
|
117
|
-
} while (this.statesUsed.has(newState));
|
|
118
|
-
(0, _assert.ok)(!isNaN(newState));
|
|
119
|
-
this.statesUsed.add(newState);
|
|
120
|
-
this.ops[opKey] = newState;
|
|
121
|
-
if (type === "Binary") {
|
|
122
|
-
this.log(`left ${operator} right ->`, `${this.calculatorFn}((${newState}, left, right)`);
|
|
123
|
-
} else if (type === "Unary") {
|
|
124
|
-
this.log(`${operator}(argument) ->`, `${this.calculatorFn}(${newState}, argument)`);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
61
|
+
// No operators created
|
|
62
|
+
if (operatorsMap.size < 1) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
127
65
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
66
|
+
// Create the calculator function and insert into program path
|
|
67
|
+
var switchCases = Array.from(operatorsMap.entries()).map(function (_ref2) {
|
|
68
|
+
var _ref3 = _slicedToArray(_ref2, 2),
|
|
69
|
+
mapKey = _ref3[0],
|
|
70
|
+
key = _ref3[1];
|
|
71
|
+
var _mapKey$split = mapKey.split("_"),
|
|
72
|
+
_mapKey$split2 = _slicedToArray(_mapKey$split, 2),
|
|
73
|
+
type = _mapKey$split2[0],
|
|
74
|
+
operator = _mapKey$split2[1];
|
|
75
|
+
var expression = t.binaryExpression(operator, t.identifier("a"), t.identifier("b"));
|
|
76
|
+
return t.switchCase(t.stringLiteral(key), [t.returnStatement(expression)]);
|
|
77
|
+
});
|
|
78
|
+
(0, _astUtils.prependProgram)(programPath, t.functionDeclaration(t.identifier(calculatorFnName), [t.identifier("operator"), t.identifier("a"), t.identifier("b")], t.blockStatement([t.switchStatement(t.identifier("operator"), switchCases)])));
|
|
79
|
+
}
|
|
135
80
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
exports.default = Calculator;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
};
|