js-confuser 2.0.0-alpha.5 → 2.0.1
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 +43 -43
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
- package/.github/workflows/node.js.yml +28 -28
- package/.prettierrc +4 -4
- package/CHANGELOG.md +1015 -989
- package/CODE_OF_CONDUCT.md +131 -131
- package/CONTRIBUTING.md +52 -52
- package/LICENSE +21 -21
- package/Migration.md +72 -71
- package/README.md +86 -78
- package/dist/constants.js +43 -43
- package/dist/index.js +14 -23
- package/dist/obfuscator.js +31 -25
- package/dist/order.js +4 -4
- package/dist/presets.js +31 -31
- package/dist/templates/integrityTemplate.js +4 -4
- package/dist/templates/template.js +1 -2
- package/dist/transforms/astScrambler.js +1 -2
- package/dist/transforms/calculator.js +1 -2
- package/dist/transforms/controlFlowFlattening.js +93 -63
- package/dist/transforms/deadCode.js +1 -2
- package/dist/transforms/dispatcher.js +4 -5
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +1 -2
- package/dist/transforms/extraction/objectExtraction.js +1 -2
- package/dist/transforms/finalizer.js +1 -2
- package/dist/transforms/flatten.js +1 -2
- package/dist/transforms/identifier/globalConcealing.js +15 -2
- package/dist/transforms/identifier/movedDeclarations.js +8 -7
- package/dist/transforms/identifier/renameVariables.js +7 -7
- package/dist/transforms/lock/integrity.js +11 -10
- package/dist/transforms/lock/lock.js +2 -3
- package/dist/transforms/minify.js +11 -29
- package/dist/transforms/opaquePredicates.js +1 -2
- package/dist/transforms/pack.js +5 -2
- package/dist/transforms/plugin.js +18 -19
- package/dist/transforms/preparation.js +16 -16
- package/dist/transforms/renameLabels.js +1 -2
- package/dist/transforms/rgf.js +8 -9
- package/dist/transforms/shuffle.js +1 -2
- package/dist/transforms/string/encoding.js +1 -2
- package/dist/transforms/string/stringCompression.js +3 -4
- package/dist/transforms/string/stringConcealing.js +8 -3
- package/dist/transforms/string/stringEncoding.js +1 -2
- package/dist/transforms/variableMasking.js +1 -2
- package/dist/utils/NameGen.js +2 -2
- package/dist/utils/PredicateGen.js +1 -2
- package/dist/utils/ast-utils.js +87 -88
- package/dist/utils/function-utils.js +8 -8
- package/dist/utils/node.js +5 -6
- package/dist/utils/object-utils.js +4 -4
- package/dist/utils/random-utils.js +20 -20
- package/dist/utils/static-utils.js +1 -2
- package/dist/validateOptions.js +4 -7
- package/index.d.ts +17 -17
- package/package.json +61 -59
- package/src/constants.ts +168 -168
- package/src/index.ts +118 -118
- package/src/obfuscationResult.ts +49 -49
- package/src/obfuscator.ts +501 -497
- package/src/options.ts +407 -407
- package/src/order.ts +54 -54
- package/src/presets.ts +125 -125
- package/src/templates/bufferToStringTemplate.ts +57 -57
- package/src/templates/deadCodeTemplates.ts +1185 -1185
- package/src/templates/getGlobalTemplate.ts +76 -76
- package/src/templates/integrityTemplate.ts +64 -64
- package/src/templates/setFunctionLengthTemplate.ts +11 -11
- package/src/templates/stringCompressionTemplate.ts +20 -20
- package/src/templates/tamperProtectionTemplates.ts +120 -120
- package/src/templates/template.ts +224 -224
- package/src/transforms/astScrambler.ts +99 -99
- package/src/transforms/calculator.ts +99 -99
- package/src/transforms/controlFlowFlattening.ts +1716 -1664
- package/src/transforms/deadCode.ts +82 -82
- package/src/transforms/dispatcher.ts +450 -450
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +156 -158
- package/src/transforms/extraction/objectExtraction.ts +186 -186
- package/src/transforms/finalizer.ts +74 -74
- package/src/transforms/flatten.ts +421 -420
- package/src/transforms/identifier/globalConcealing.ts +315 -295
- package/src/transforms/identifier/movedDeclarations.ts +252 -251
- package/src/transforms/identifier/renameVariables.ts +328 -321
- package/src/transforms/lock/integrity.ts +117 -114
- package/src/transforms/lock/lock.ts +418 -425
- package/src/transforms/minify.ts +615 -629
- package/src/transforms/opaquePredicates.ts +100 -100
- package/src/transforms/pack.ts +239 -231
- package/src/transforms/plugin.ts +173 -173
- package/src/transforms/preparation.ts +349 -347
- package/src/transforms/renameLabels.ts +175 -175
- package/src/transforms/rgf.ts +322 -322
- package/src/transforms/shuffle.ts +82 -82
- package/src/transforms/string/encoding.ts +144 -144
- package/src/transforms/string/stringCompression.ts +128 -128
- package/src/transforms/string/stringConcealing.ts +312 -298
- package/src/transforms/string/stringEncoding.ts +80 -80
- package/src/transforms/string/stringSplitting.ts +77 -77
- package/src/transforms/variableMasking.ts +257 -257
- package/src/utils/IntGen.ts +33 -33
- package/src/utils/NameGen.ts +116 -116
- package/src/utils/PredicateGen.ts +61 -61
- package/src/utils/ast-utils.ts +663 -663
- package/src/utils/function-utils.ts +50 -50
- package/src/utils/gen-utils.ts +48 -48
- package/src/utils/node.ts +78 -78
- package/src/utils/object-utils.ts +21 -21
- package/src/utils/random-utils.ts +93 -93
- package/src/utils/static-utils.ts +66 -66
- package/src/validateOptions.ts +256 -259
- package/tsconfig.json +13 -14
- package/dist/probability.js +0 -1
- package/dist/transforms/functionOutlining.js +0 -230
- package/dist/utils/ControlObject.js +0 -125
package/tsconfig.json
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "esnext",
|
|
4
|
+
"module": "nodenext",
|
|
5
|
+
"outDir": "./dist",
|
|
6
|
+
"rootDir": "./",
|
|
7
|
+
"strict": false,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"types": ["node"],
|
|
10
|
+
"allowImportingTsExtensions": true
|
|
11
|
+
},
|
|
12
|
+
"include": ["./src/**/*", "./index.d.ts"]
|
|
13
|
+
}
|
package/dist/probability.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
@@ -1,230 +0,0 @@
|
|
|
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 _order = require("../order");
|
|
9
|
-
var _astUtils = require("../utils/ast-utils");
|
|
10
|
-
var t = _interopRequireWildcard(require("@babel/types"));
|
|
11
|
-
var _randomUtils = require("../utils/random-utils");
|
|
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 _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
16
|
-
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."); }
|
|
17
|
-
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
18
|
-
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
19
|
-
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; } } }; }
|
|
20
|
-
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; } }
|
|
21
|
-
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; }
|
|
22
|
-
function isSafeForOutlining(path) {
|
|
23
|
-
if (path.isIdentifier() || path.isLiteral()) return {
|
|
24
|
-
isSafe: false
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
// Skip direct invocations ('this' will be different)
|
|
28
|
-
if (path.key === "callee" && path.parentPath.isCallExpression()) {
|
|
29
|
-
return {
|
|
30
|
-
isSafe: false
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Skip typeof and delete expressions (identifier behavior is different)
|
|
35
|
-
if (path.key === "argument" && path.parentPath.isUnaryExpression()) {
|
|
36
|
-
return {
|
|
37
|
-
isSafe: false
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
if (path.isReturnStatement() || path.isYieldExpression() || path.isAwaitExpression() || path.isContinueStatement() || path.isBreakStatement() || path.isThrowStatement() || path.isDebuggerStatement() || path.isImportDeclaration() || path.isExportDeclaration()) {
|
|
41
|
-
return {
|
|
42
|
-
isSafe: false
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
var isSafe = true;
|
|
46
|
-
var bindings = [];
|
|
47
|
-
var fnPath = path.getFunctionParent();
|
|
48
|
-
var visitor = {
|
|
49
|
-
ThisExpression: function ThisExpression(path) {
|
|
50
|
-
isSafe = false;
|
|
51
|
-
path.stop();
|
|
52
|
-
},
|
|
53
|
-
Identifier: function Identifier(path) {
|
|
54
|
-
if (["arguments", "eval"].includes(path.node.name)) {
|
|
55
|
-
isSafe = false;
|
|
56
|
-
path.stop();
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
BindingIdentifier: function BindingIdentifier(path) {
|
|
60
|
-
var binding = path.scope.getBinding(path.node.name);
|
|
61
|
-
if (binding) {
|
|
62
|
-
bindings.push(binding);
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
|
-
// Function flow guard
|
|
66
|
-
"ReturnStatement|YieldExpression|AwaitExpression": function ReturnStatementYieldExpressionAwaitExpression(path) {
|
|
67
|
-
if (path.getFunctionParent() === fnPath) {
|
|
68
|
-
isSafe = false;
|
|
69
|
-
path.stop();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
// Exclude 'ThisExpression' and semantic 'Identifier' nodes
|
|
75
|
-
if (visitor[path.type]) return {
|
|
76
|
-
isSafe: false
|
|
77
|
-
};
|
|
78
|
-
path.traverse(visitor);
|
|
79
|
-
return {
|
|
80
|
-
isSafe: isSafe,
|
|
81
|
-
bindings: bindings
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
var _default = exports["default"] = function _default(_ref) {
|
|
85
|
-
var Plugin = _ref.Plugin;
|
|
86
|
-
var me = Plugin(_order.Order.FunctionOutlining, {
|
|
87
|
-
changeData: {
|
|
88
|
-
functionsMade: 0
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
var changesMade = 0;
|
|
92
|
-
function checkProbability() {
|
|
93
|
-
if (!(0, _probability.computeProbabilityMap)(me.options.functionOutlining)) return false;
|
|
94
|
-
if (changesMade > 100 && (0, _randomUtils.chance)(changesMade - 100)) return false;
|
|
95
|
-
return true;
|
|
96
|
-
}
|
|
97
|
-
return {
|
|
98
|
-
visitor: {
|
|
99
|
-
Block: {
|
|
100
|
-
exit: function exit(blockPath) {
|
|
101
|
-
if (blockPath.isProgram()) {
|
|
102
|
-
blockPath.scope.crawl();
|
|
103
|
-
}
|
|
104
|
-
if (blockPath.find(function (p) {
|
|
105
|
-
return me.isSkipped(p);
|
|
106
|
-
})) return;
|
|
107
|
-
if (!checkProbability()) return;
|
|
108
|
-
|
|
109
|
-
// Extract a random number of statements
|
|
110
|
-
|
|
111
|
-
var statements = blockPath.get("body");
|
|
112
|
-
// var startIndex = getRandomInteger(0, statements.length);
|
|
113
|
-
// var endIndex = getRandomInteger(startIndex, statements.length);
|
|
114
|
-
|
|
115
|
-
var startIndex = 0;
|
|
116
|
-
var endIndex = statements.length;
|
|
117
|
-
var extractedStatements = statements.slice(startIndex, endIndex);
|
|
118
|
-
if (!extractedStatements.length) return;
|
|
119
|
-
var bindings = [];
|
|
120
|
-
var _iterator = _createForOfIteratorHelper(extractedStatements),
|
|
121
|
-
_step;
|
|
122
|
-
try {
|
|
123
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
124
|
-
var statement = _step.value;
|
|
125
|
-
// Don't override the control node
|
|
126
|
-
if (me.isSkipped(statement)) return;
|
|
127
|
-
var result = isSafeForOutlining(statement);
|
|
128
|
-
if (!result.isSafe) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
bindings.push.apply(bindings, _toConsumableArray(result.bindings));
|
|
132
|
-
}
|
|
133
|
-
} catch (err) {
|
|
134
|
-
_iterator.e(err);
|
|
135
|
-
} finally {
|
|
136
|
-
_iterator.f();
|
|
137
|
-
}
|
|
138
|
-
var extractedStatementSet = new Set(extractedStatements);
|
|
139
|
-
for (var _i = 0, _bindings = bindings; _i < _bindings.length; _i++) {
|
|
140
|
-
var binding = _bindings[_i];
|
|
141
|
-
var _iterator2 = _createForOfIteratorHelper(binding.referencePaths),
|
|
142
|
-
_step2;
|
|
143
|
-
try {
|
|
144
|
-
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
145
|
-
var referencePath = _step2.value;
|
|
146
|
-
var found = referencePath.find(function (p) {
|
|
147
|
-
return extractedStatementSet.has(p);
|
|
148
|
-
});
|
|
149
|
-
if (!found) {
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
} catch (err) {
|
|
154
|
-
_iterator2.e(err);
|
|
155
|
-
} finally {
|
|
156
|
-
_iterator2.f();
|
|
157
|
-
}
|
|
158
|
-
var _iterator3 = _createForOfIteratorHelper(binding.constantViolations),
|
|
159
|
-
_step3;
|
|
160
|
-
try {
|
|
161
|
-
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
162
|
-
var constantViolation = _step3.value;
|
|
163
|
-
var found = constantViolation.find(function (p) {
|
|
164
|
-
return extractedStatementSet.has(p);
|
|
165
|
-
});
|
|
166
|
-
if (!found) {
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
} catch (err) {
|
|
171
|
-
_iterator3.e(err);
|
|
172
|
-
} finally {
|
|
173
|
-
_iterator3.f();
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
changesMade++;
|
|
177
|
-
var isFirst = true;
|
|
178
|
-
var _iterator4 = _createForOfIteratorHelper(extractedStatements),
|
|
179
|
-
_step4;
|
|
180
|
-
try {
|
|
181
|
-
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
182
|
-
var statement = _step4.value;
|
|
183
|
-
if (isFirst) {
|
|
184
|
-
isFirst = false;
|
|
185
|
-
var memberExpression = me.getControlObject(blockPath).addProperty(t.functionExpression(null, [], t.blockStatement(extractedStatements.map(function (x) {
|
|
186
|
-
return x.node;
|
|
187
|
-
}))));
|
|
188
|
-
me.changeData.functionsMade++;
|
|
189
|
-
var callExpression = t.callExpression(memberExpression, []);
|
|
190
|
-
statement.replaceWith(callExpression);
|
|
191
|
-
continue;
|
|
192
|
-
}
|
|
193
|
-
statement.remove();
|
|
194
|
-
}
|
|
195
|
-
} catch (err) {
|
|
196
|
-
_iterator4.e(err);
|
|
197
|
-
} finally {
|
|
198
|
-
_iterator4.f();
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
},
|
|
202
|
-
Expression: {
|
|
203
|
-
exit: function exit(path) {
|
|
204
|
-
// Skip assignment left
|
|
205
|
-
if (path.find(function (p) {
|
|
206
|
-
var _p$parentPath;
|
|
207
|
-
return p.key === "left" && ((_p$parentPath = p.parentPath) === null || _p$parentPath === void 0 ? void 0 : _p$parentPath.type) === "AssignmentExpression";
|
|
208
|
-
})) {
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
if (!checkProbability()) return;
|
|
212
|
-
if (path.find(function (p) {
|
|
213
|
-
return me.isSkipped(p);
|
|
214
|
-
})) return;
|
|
215
|
-
if (!isSafeForOutlining(path).isSafe) return;
|
|
216
|
-
changesMade++;
|
|
217
|
-
var blockPath = path.find(function (p) {
|
|
218
|
-
return p.isBlock();
|
|
219
|
-
});
|
|
220
|
-
var memberExpression = me.getControlObject(blockPath).addProperty(t.functionExpression(null, [], t.blockStatement([t.returnStatement(t.cloneNode(path.node))])));
|
|
221
|
-
me.changeData.functionsMade++;
|
|
222
|
-
var callExpression = t.callExpression(memberExpression, []);
|
|
223
|
-
(0, _astUtils.ensureComputedExpression)(path);
|
|
224
|
-
path.replaceWith(callExpression);
|
|
225
|
-
me.skip(path);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
};
|
|
230
|
-
};
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports["default"] = void 0;
|
|
7
|
-
var t = _interopRequireWildcard(require("@babel/types"));
|
|
8
|
-
var _NameGen = require("./NameGen");
|
|
9
|
-
var _astUtils = require("./ast-utils");
|
|
10
|
-
var _randomUtils = require("./random-utils");
|
|
11
|
-
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); }
|
|
12
|
-
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; }
|
|
13
|
-
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); }
|
|
14
|
-
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
|
15
|
-
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); } }
|
|
16
|
-
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
|
17
|
-
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; }
|
|
18
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
19
|
-
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); }
|
|
20
|
-
/**
|
|
21
|
-
* A Control Object is an object that is used to store properties that are used in multiple places.
|
|
22
|
-
*/
|
|
23
|
-
var ControlObject = exports["default"] = /*#__PURE__*/function () {
|
|
24
|
-
function ControlObject(me, blockPath) {
|
|
25
|
-
_classCallCheck(this, ControlObject);
|
|
26
|
-
_defineProperty(this, "propertyNames", new Set());
|
|
27
|
-
_defineProperty(this, "objectName", null);
|
|
28
|
-
_defineProperty(this, "objectPath", null);
|
|
29
|
-
_defineProperty(this, "objectExpression", null);
|
|
30
|
-
this.me = me;
|
|
31
|
-
this.blockPath = blockPath;
|
|
32
|
-
this.nameGen = new _NameGen.NameGen(me.options.identifierGenerator, {
|
|
33
|
-
avoidReserved: true,
|
|
34
|
-
avoidObjectPrototype: true
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
return _createClass(ControlObject, [{
|
|
38
|
-
key: "createMemberExpression",
|
|
39
|
-
value: function createMemberExpression(propertyName) {
|
|
40
|
-
return t.memberExpression(t.identifier(this.objectName), t.stringLiteral(propertyName), true);
|
|
41
|
-
}
|
|
42
|
-
}, {
|
|
43
|
-
key: "createPredicate",
|
|
44
|
-
value: function createPredicate() {
|
|
45
|
-
this.ensureCreated();
|
|
46
|
-
var propertyName = (0, _randomUtils.choice)(Array.from(this.propertyNames));
|
|
47
|
-
if (!propertyName || (0, _randomUtils.chance)(50)) {
|
|
48
|
-
propertyName = this.nameGen.generate();
|
|
49
|
-
}
|
|
50
|
-
return {
|
|
51
|
-
node: t.binaryExpression("in", t.stringLiteral(propertyName), t.identifier(this.objectName)),
|
|
52
|
-
value: this.propertyNames.has(propertyName)
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
}, {
|
|
56
|
-
key: "createTruePredicate",
|
|
57
|
-
value: function createTruePredicate() {
|
|
58
|
-
var _this$createPredicate = this.createPredicate(),
|
|
59
|
-
node = _this$createPredicate.node,
|
|
60
|
-
value = _this$createPredicate.value;
|
|
61
|
-
if (value) {
|
|
62
|
-
return node;
|
|
63
|
-
}
|
|
64
|
-
return t.unaryExpression("!", node);
|
|
65
|
-
}
|
|
66
|
-
}, {
|
|
67
|
-
key: "createFalsePredicate",
|
|
68
|
-
value: function createFalsePredicate() {
|
|
69
|
-
var _this$createPredicate2 = this.createPredicate(),
|
|
70
|
-
node = _this$createPredicate2.node,
|
|
71
|
-
value = _this$createPredicate2.value;
|
|
72
|
-
if (!value) {
|
|
73
|
-
return node;
|
|
74
|
-
}
|
|
75
|
-
return t.unaryExpression("!", node);
|
|
76
|
-
}
|
|
77
|
-
}, {
|
|
78
|
-
key: "ensureCreated",
|
|
79
|
-
value: function ensureCreated(node) {
|
|
80
|
-
if (!this.objectName) {
|
|
81
|
-
// Object hasn't been created yet
|
|
82
|
-
this.objectName = this.me.getPlaceholder() + "_controlObject";
|
|
83
|
-
if (node && t.isFunctionExpression(node) && !node.id) {
|
|
84
|
-
// Use function declaration as object
|
|
85
|
-
|
|
86
|
-
var newNode = node;
|
|
87
|
-
newNode.type = "FunctionDeclaration";
|
|
88
|
-
newNode.id = t.identifier(this.objectName);
|
|
89
|
-
var newPath = (0, _astUtils.prepend)(this.blockPath, newNode)[0];
|
|
90
|
-
this.me.skip(newPath);
|
|
91
|
-
this.objectPath = newPath;
|
|
92
|
-
return t.identifier(this.objectName);
|
|
93
|
-
} else {
|
|
94
|
-
// Create plain object
|
|
95
|
-
var _newPath = (0, _astUtils.prepend)(this.blockPath, t.variableDeclaration("var", [t.variableDeclarator(t.identifier(this.objectName), t.objectExpression([]))]))[0];
|
|
96
|
-
this.me.skip(_newPath);
|
|
97
|
-
this.objectPath = _newPath;
|
|
98
|
-
var objectExpression = _newPath.node.declarations[0].init;
|
|
99
|
-
this.objectExpression = objectExpression;
|
|
100
|
-
this.me.skip(this.objectExpression);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}, {
|
|
105
|
-
key: "addProperty",
|
|
106
|
-
value: function addProperty(node) {
|
|
107
|
-
var initialNode = this.ensureCreated(node);
|
|
108
|
-
if (initialNode) return initialNode;
|
|
109
|
-
var propertyName = this.nameGen.generate();
|
|
110
|
-
this.propertyNames.add(propertyName);
|
|
111
|
-
|
|
112
|
-
// Add an initial property
|
|
113
|
-
if (this.objectExpression) {
|
|
114
|
-
this.objectExpression.properties.push(t.objectProperty(t.identifier(propertyName), node));
|
|
115
|
-
} else {
|
|
116
|
-
// Add as assignment expression
|
|
117
|
-
|
|
118
|
-
var assignment = t.assignmentExpression("=", this.createMemberExpression(propertyName), node);
|
|
119
|
-
var newPath = this.objectPath.insertAfter(t.expressionStatement(assignment))[0];
|
|
120
|
-
this.me.skip(newPath);
|
|
121
|
-
}
|
|
122
|
-
return this.createMemberExpression(propertyName);
|
|
123
|
-
}
|
|
124
|
-
}]);
|
|
125
|
-
}();
|