js-confuser 1.7.1 → 1.7.2
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/CHANGELOG.md +38 -0
- package/README.md +12 -27
- package/dist/compiler.js +2 -8
- package/dist/constants.js +17 -10
- package/dist/index.js +7 -30
- package/dist/obfuscator.js +15 -62
- package/dist/options.js +21 -38
- package/dist/order.js +4 -7
- package/dist/parser.js +5 -13
- package/dist/precedence.js +6 -8
- package/dist/presets.js +4 -6
- package/dist/probability.js +13 -24
- package/dist/templates/bufferToString.js +100 -5
- package/dist/templates/crash.js +51 -9
- package/dist/templates/es5.js +125 -6
- package/dist/templates/functionLength.js +24 -6
- package/dist/templates/globals.js +9 -0
- package/dist/templates/template.js +71 -30
- package/dist/transforms/antiTooling.js +26 -22
- package/dist/transforms/calculator.js +18 -54
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +236 -333
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
- package/dist/transforms/deadCode.js +528 -27
- package/dist/transforms/dispatcher.js +106 -110
- package/dist/transforms/es5/antiClass.js +70 -44
- package/dist/transforms/es5/antiDestructuring.js +14 -38
- package/dist/transforms/es5/antiES6Object.js +39 -48
- package/dist/transforms/es5/antiSpreadOperator.js +5 -14
- package/dist/transforms/es5/antiTemplate.js +10 -19
- package/dist/transforms/es5/es5.js +7 -40
- package/dist/transforms/extraction/classExtraction.js +83 -0
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +41 -80
- package/dist/transforms/extraction/objectExtraction.js +24 -56
- package/dist/transforms/finalizer.js +6 -20
- package/dist/transforms/flatten.js +51 -99
- package/dist/transforms/identifier/globalAnalysis.js +8 -26
- package/dist/transforms/identifier/globalConcealing.js +35 -54
- package/dist/transforms/identifier/movedDeclarations.js +66 -38
- package/dist/transforms/identifier/renameVariables.js +29 -68
- package/dist/transforms/identifier/variableAnalysis.js +21 -48
- package/dist/transforms/lock/antiDebug.js +20 -25
- package/dist/transforms/lock/integrity.js +48 -47
- package/dist/transforms/lock/lock.js +62 -113
- package/dist/transforms/minify.js +77 -108
- package/dist/transforms/opaquePredicates.js +11 -48
- package/dist/transforms/preparation.js +17 -50
- package/dist/transforms/renameLabels.js +5 -22
- package/dist/transforms/rgf.js +93 -69
- package/dist/transforms/shuffle.js +41 -46
- package/dist/transforms/stack.js +35 -98
- package/dist/transforms/string/encoding.js +73 -27
- package/dist/transforms/string/stringCompression.js +44 -68
- package/dist/transforms/string/stringConcealing.js +125 -134
- package/dist/transforms/string/stringEncoding.js +6 -26
- package/dist/transforms/string/stringSplitting.js +5 -30
- package/dist/transforms/transform.js +50 -100
- package/dist/traverse.js +11 -18
- package/dist/util/compare.js +27 -29
- package/dist/util/gen.js +32 -86
- package/dist/util/guard.js +0 -1
- package/dist/util/identifiers.js +9 -72
- package/dist/util/insert.js +27 -77
- package/dist/util/math.js +0 -3
- package/dist/util/object.js +3 -7
- package/dist/util/random.js +5 -36
- package/dist/util/scope.js +6 -3
- package/package.json +3 -3
- package/src/constants.ts +12 -0
- package/src/options.ts +13 -0
- package/src/order.ts +2 -2
- package/src/templates/bufferToString.ts +49 -11
- package/src/templates/functionLength.ts +21 -3
- package/src/templates/globals.ts +3 -0
- package/src/templates/template.ts +85 -25
- package/src/transforms/antiTooling.ts +33 -11
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +2 -2
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
- package/src/transforms/deadCode.ts +0 -16
- package/src/transforms/dispatcher.ts +91 -69
- package/src/transforms/es5/antiClass.ts +10 -1
- package/src/transforms/extraction/classExtraction.ts +168 -0
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +9 -10
- package/src/transforms/extraction/objectExtraction.ts +4 -15
- package/src/transforms/flatten.ts +20 -5
- package/src/transforms/identifier/globalConcealing.ts +29 -65
- package/src/transforms/identifier/movedDeclarations.ts +90 -24
- package/src/transforms/minify.ts +27 -12
- package/src/transforms/rgf.ts +94 -5
- package/src/transforms/stack.ts +12 -3
- package/src/transforms/string/encoding.ts +85 -51
- package/src/transforms/string/stringCompression.ts +5 -8
- package/src/transforms/string/stringConcealing.ts +139 -113
- package/src/transforms/string/stringEncoding.ts +1 -2
- package/src/transforms/string/stringSplitting.ts +1 -2
- package/src/transforms/transform.ts +30 -1
- package/src/util/compare.ts +39 -5
- package/src/util/gen.ts +10 -3
- package/src/util/insert.ts +17 -0
- package/src/util/scope.ts +14 -2
- package/test/code/Cash.test.ts +10 -4
- package/test/code/StrictMode.src.js +65 -0
- package/test/code/StrictMode.test.js +37 -0
- package/test/compare.test.ts +62 -2
- package/test/options.test.ts +111 -55
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
- package/test/transforms/dispatcher.test.ts +55 -0
- package/test/transforms/extraction/classExtraction.test.ts +86 -0
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +8 -0
- package/test/transforms/extraction/objectExtraction.test.ts +2 -0
- package/test/transforms/identifier/globalConcealing.test.ts +19 -0
- package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
- package/test/transforms/minify.test.ts +37 -0
- package/test/transforms/rgf.test.ts +50 -0
- package/dist/transforms/controlFlowFlattening/choiceFlowObfuscation.js +0 -62
- package/dist/transforms/controlFlowFlattening/controlFlowObfuscation.js +0 -159
- package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +0 -106
- package/dist/transforms/eval.js +0 -84
- package/dist/transforms/hexadecimalNumbers.js +0 -63
- package/dist/transforms/hideInitializingCode.js +0 -270
- package/dist/transforms/identifier/nameRecycling.js +0 -218
- package/dist/transforms/label.js +0 -67
- package/dist/transforms/preparation/nameConflicts.js +0 -116
- package/dist/transforms/preparation/preparation.js +0 -188
|
@@ -4,33 +4,24 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _traverse = require("../traverse");
|
|
9
|
-
|
|
10
8
|
var _gen = require("../util/gen");
|
|
11
|
-
|
|
12
9
|
var _identifiers = require("../util/identifiers");
|
|
13
|
-
|
|
14
10
|
var _insert = require("../util/insert");
|
|
15
|
-
|
|
16
11
|
var _transform = _interopRequireDefault(require("./transform"));
|
|
17
|
-
|
|
18
12
|
var _compare = require("../util/compare");
|
|
19
|
-
|
|
20
13
|
var _random = require("../util/random");
|
|
21
|
-
|
|
22
14
|
var _probability = require("../probability");
|
|
23
|
-
|
|
24
15
|
var _constants = require("../constants");
|
|
25
|
-
|
|
26
16
|
var _order = require("../order");
|
|
27
|
-
|
|
28
17
|
var _template = _interopRequireDefault(require("../templates/template"));
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
function
|
|
33
|
-
|
|
18
|
+
var _functionLength = require("../templates/functionLength");
|
|
19
|
+
var _globals = require("../templates/globals");
|
|
20
|
+
var _scope = require("../util/scope");
|
|
21
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: 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); }
|
|
34
25
|
/**
|
|
35
26
|
* A Dispatcher processes function calls. All the function declarations are brought into a dictionary.
|
|
36
27
|
*
|
|
@@ -56,76 +47,87 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
|
|
56
47
|
* 3. using `this`
|
|
57
48
|
*/
|
|
58
49
|
class Dispatcher extends _transform.default {
|
|
59
|
-
// Debug mode preserves function names
|
|
60
50
|
constructor(o) {
|
|
61
51
|
super(o, _order.ObfuscateOrder.Dispatcher);
|
|
62
|
-
|
|
52
|
+
// Debug mode preserves function names
|
|
63
53
|
_defineProperty(this, "isDebug", false);
|
|
64
|
-
|
|
65
54
|
_defineProperty(this, "count", void 0);
|
|
66
|
-
|
|
55
|
+
_defineProperty(this, "functionLengthName", void 0);
|
|
67
56
|
this.count = 0;
|
|
68
57
|
}
|
|
69
|
-
|
|
58
|
+
apply(tree) {
|
|
59
|
+
super.apply(tree);
|
|
60
|
+
if (this.options.preserveFunctionLength && this.functionLengthName) {
|
|
61
|
+
(0, _insert.prepend)(tree, _functionLength.FunctionLengthTemplate.single({
|
|
62
|
+
name: this.functionLengthName,
|
|
63
|
+
ObjectDefineProperty: this.createInitVariable(_globals.ObjectDefineProperty, [tree])
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
70
67
|
match(object, parents) {
|
|
71
68
|
if ((0, _compare.isInsideType)("AwaitExpression", object, parents)) {
|
|
72
69
|
return false;
|
|
73
70
|
}
|
|
74
|
-
|
|
75
71
|
return (0, _insert.isVarContext)(object) && object.type !== "ArrowFunctionExpression" && !object.$dispatcherSkip && !parents.find(x => x.$dispatcherSkip);
|
|
76
72
|
}
|
|
77
|
-
|
|
78
73
|
transform(object, parents) {
|
|
79
74
|
return () => {
|
|
80
75
|
if ((0, _probability.ComputeProbabilityMap)(this.options.dispatcher, mode => mode)) {
|
|
81
76
|
if (object.type != "Program" && object.body.type != "BlockStatement") {
|
|
82
77
|
return;
|
|
83
|
-
}
|
|
84
|
-
|
|
78
|
+
}
|
|
85
79
|
|
|
86
|
-
|
|
80
|
+
// Map of FunctionDeclarations
|
|
81
|
+
var functionDeclarations = Object.create(null);
|
|
87
82
|
|
|
83
|
+
// Array of Identifier nodes
|
|
88
84
|
var identifiers = [];
|
|
89
|
-
var illegalFnNames = new Set();
|
|
85
|
+
var illegalFnNames = new Set();
|
|
90
86
|
|
|
87
|
+
// New Names for Functions
|
|
91
88
|
var newFnNames = Object.create(null); // [old name]: randomized name
|
|
92
89
|
|
|
93
90
|
var context = (0, _insert.isVarContext)(object) ? object : (0, _insert.getVarContext)(object, parents);
|
|
91
|
+
var lexicalScope = (0, _insert.isFunction)(context) ? context.body : context;
|
|
94
92
|
(0, _traverse.walk)(object, parents, (o, p) => {
|
|
95
93
|
if (object == o) {
|
|
96
94
|
// Fix 1
|
|
97
95
|
return;
|
|
98
96
|
}
|
|
99
|
-
|
|
100
97
|
var c = (0, _insert.getVarContext)(o, p);
|
|
101
|
-
|
|
102
98
|
if (o.type == "FunctionDeclaration") {
|
|
103
99
|
c = (0, _insert.getVarContext)(p[0], p.slice(1));
|
|
104
100
|
}
|
|
105
|
-
|
|
106
101
|
if (context === c) {
|
|
107
102
|
if (o.type == "FunctionDeclaration" && o.id.name) {
|
|
108
103
|
var name = o.id.name;
|
|
109
|
-
|
|
110
104
|
if (o.$requiresEval || o.async || o.generator || p.find(x => x.$dispatcherSkip || x.type == "MethodDefinition") || o.body.type != "BlockStatement") {
|
|
111
105
|
illegalFnNames.add(name);
|
|
112
|
-
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
113
108
|
|
|
109
|
+
// Must defined in the same block as the current function being scanned
|
|
110
|
+
// Solves 'let' and 'class' declaration issue
|
|
111
|
+
var ls = (0, _scope.getLexicalScope)(o, p);
|
|
112
|
+
if (ls !== lexicalScope) {
|
|
113
|
+
illegalFnNames.add(name);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
114
116
|
|
|
117
|
+
// If dupe, no routing
|
|
115
118
|
if (functionDeclarations[name]) {
|
|
116
119
|
illegalFnNames.add(name);
|
|
117
120
|
return;
|
|
118
121
|
}
|
|
119
|
-
|
|
120
122
|
(0, _traverse.walk)(o, p, (oo, pp) => {
|
|
121
123
|
if (oo.type == "Identifier" && oo.name == "arguments" || oo.type == "ThisExpression" || oo.type == "Super") {
|
|
122
124
|
if ((0, _insert.getVarContext)(oo, pp) === o) {
|
|
123
125
|
illegalFnNames.add(name);
|
|
124
126
|
return "EXIT";
|
|
125
127
|
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
+
}
|
|
128
129
|
|
|
130
|
+
// Avoid functions with function expressions as they have a different scope
|
|
129
131
|
if ((oo.type === "FunctionExpression" || oo.type === "ArrowFunctionExpression") && pp.find(x => x == o.params)) {
|
|
130
132
|
illegalFnNames.add(name);
|
|
131
133
|
return "EXIT";
|
|
@@ -134,18 +136,14 @@ class Dispatcher extends _transform.default {
|
|
|
134
136
|
functionDeclarations[name] = [o, p];
|
|
135
137
|
}
|
|
136
138
|
}
|
|
137
|
-
|
|
138
139
|
if (o.type == "Identifier") {
|
|
139
140
|
if (_constants.reservedIdentifiers.has(o.name)) {
|
|
140
141
|
return;
|
|
141
142
|
}
|
|
142
|
-
|
|
143
143
|
var info = (0, _identifiers.getIdentifierInfo)(o, p);
|
|
144
|
-
|
|
145
144
|
if (!info.spec.isReferenced) {
|
|
146
145
|
return;
|
|
147
146
|
}
|
|
148
|
-
|
|
149
147
|
if (info.spec.isDefined) {
|
|
150
148
|
if (info.isFunctionDeclaration) {
|
|
151
149
|
if (p[0].id && (!functionDeclarations[p[0].id.name] || functionDeclarations[p[0].id.name][0] !== p[0])) {
|
|
@@ -163,18 +161,23 @@ class Dispatcher extends _transform.default {
|
|
|
163
161
|
});
|
|
164
162
|
illegalFnNames.forEach(name => {
|
|
165
163
|
delete functionDeclarations[name];
|
|
166
|
-
});
|
|
164
|
+
});
|
|
167
165
|
|
|
166
|
+
// map original name->new game
|
|
168
167
|
var gen = this.getGenerator();
|
|
169
168
|
Object.keys(functionDeclarations).forEach(name => {
|
|
170
169
|
newFnNames[name] = this.isDebug ? "_dispatcher_" + this.count + "_" + name : gen.generate();
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
var set = new Set(Object.keys(newFnNames));
|
|
170
|
+
});
|
|
171
|
+
// set containing new name
|
|
172
|
+
var set = new Set(Object.keys(newFnNames));
|
|
174
173
|
|
|
174
|
+
// Only make a dispatcher function if it caught any functions
|
|
175
175
|
if (set.size > 0) {
|
|
176
|
+
if (!this.functionLengthName) {
|
|
177
|
+
this.functionLengthName = this.getPlaceholder();
|
|
178
|
+
}
|
|
176
179
|
var payloadArg = this.getPlaceholder() + "_dispatcher_" + this.count + "_payload";
|
|
177
|
-
var dispatcherFnName = this.getPlaceholder() + "_dispatcher_" + this.count;
|
|
180
|
+
var dispatcherFnName = this.getPlaceholder() + "_dispatcher_" + this.count + _constants.predictableFunctionTag;
|
|
178
181
|
this.log(dispatcherFnName, set);
|
|
179
182
|
this.count++;
|
|
180
183
|
var expectedGet = gen.generate();
|
|
@@ -184,56 +187,41 @@ class Dispatcher extends _transform.default {
|
|
|
184
187
|
var newReturnMemberName = gen.generate();
|
|
185
188
|
var shuffledKeys = (0, _random.shuffle)(Object.keys(functionDeclarations));
|
|
186
189
|
var mapName = this.getPlaceholder();
|
|
187
|
-
var cacheName = this.getPlaceholder();
|
|
188
|
-
// 1. create function map
|
|
190
|
+
var cacheName = this.getPlaceholder();
|
|
189
191
|
|
|
192
|
+
// creating the dispatcher function
|
|
193
|
+
// 1. create function map
|
|
190
194
|
var map = (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(mapName, (0, _gen.ObjectExpression)(shuffledKeys.map(name => {
|
|
191
195
|
var [def, defParents] = functionDeclarations[name];
|
|
192
196
|
var body = (0, _insert.getBlockBody)(def.body);
|
|
193
|
-
var functionExpression = {
|
|
197
|
+
var functionExpression = {
|
|
198
|
+
...def,
|
|
194
199
|
expression: false,
|
|
195
200
|
type: "FunctionExpression",
|
|
196
|
-
id: null
|
|
201
|
+
id: null,
|
|
202
|
+
params: [],
|
|
203
|
+
[_constants.predictableFunctionTag]: true
|
|
197
204
|
};
|
|
198
205
|
this.addComment(functionExpression, name);
|
|
199
|
-
|
|
200
206
|
if (def.params.length > 0) {
|
|
201
207
|
const fixParam = param => {
|
|
202
208
|
return param;
|
|
203
209
|
};
|
|
204
|
-
|
|
205
210
|
var variableDeclaration = (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)({
|
|
206
211
|
type: "ArrayPattern",
|
|
207
212
|
elements: def.params.map(fixParam)
|
|
208
213
|
}, (0, _gen.Identifier)(payloadArg)));
|
|
209
|
-
(0, _insert.prepend)(def.body, variableDeclaration);
|
|
210
|
-
|
|
211
|
-
var args = [0, 1, 2].map(x => this.getPlaceholder());
|
|
212
|
-
functionExpression.params = args.map(x => (0, _gen.Identifier)(x));
|
|
213
|
-
var deadCode = (0, _random.choice)(["fakeReturn", "ifStatement"]);
|
|
214
|
-
|
|
215
|
-
switch (deadCode) {
|
|
216
|
-
case "fakeReturn":
|
|
217
|
-
// Dead code...
|
|
218
|
-
var ifStatement = (0, _gen.IfStatement)((0, _gen.UnaryExpression)("!", (0, _gen.Identifier)(args[0])), [(0, _gen.ReturnStatement)((0, _gen.CallExpression)((0, _gen.Identifier)(args[1]), [(0, _gen.ThisExpression)(), (0, _gen.Identifier)(args[2])]))], null);
|
|
219
|
-
body.unshift(ifStatement);
|
|
220
|
-
break;
|
|
221
|
-
|
|
222
|
-
case "ifStatement":
|
|
223
|
-
var test = (0, _gen.LogicalExpression)("||", (0, _gen.Identifier)(args[0]), (0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(args[1]), (0, _gen.CallExpression)((0, _gen.Identifier)(args[2]), [])));
|
|
224
|
-
def.body = (0, _gen.BlockStatement)([(0, _gen.IfStatement)(test, [...body], null), (0, _gen.ReturnStatement)((0, _gen.Identifier)(args[1]))]);
|
|
225
|
-
break;
|
|
226
|
-
}
|
|
227
|
-
} // For logging purposes
|
|
228
|
-
|
|
214
|
+
(0, _insert.prepend)(def.body, variableDeclaration);
|
|
215
|
+
}
|
|
229
216
|
|
|
217
|
+
// For logging purposes
|
|
230
218
|
var signature = name + "(" + def.params.map(x => x.name || "<>").join(",") + ")";
|
|
231
|
-
this.log("Added", signature);
|
|
219
|
+
this.log("Added", signature);
|
|
232
220
|
|
|
221
|
+
// delete ref in block
|
|
233
222
|
if (defParents.length) {
|
|
234
223
|
(0, _insert.deleteDirect)(def, defParents[0]);
|
|
235
224
|
}
|
|
236
|
-
|
|
237
225
|
this.addComment(functionExpression, signature);
|
|
238
226
|
return (0, _gen.Property)((0, _gen.Literal)(newFnNames[name]), functionExpression, false);
|
|
239
227
|
}))));
|
|
@@ -241,113 +229,121 @@ class Dispatcher extends _transform.default {
|
|
|
241
229
|
var x = this.getPlaceholder();
|
|
242
230
|
var y = this.getPlaceholder();
|
|
243
231
|
var z = this.getPlaceholder();
|
|
244
|
-
|
|
245
232
|
function getAccessor() {
|
|
246
233
|
return (0, _gen.MemberExpression)((0, _gen.Identifier)(mapName), (0, _gen.Identifier)(x), true);
|
|
247
|
-
}
|
|
248
|
-
|
|
234
|
+
}
|
|
249
235
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
(0, _gen.
|
|
256
|
-
|
|
257
|
-
(0, _gen.
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
236
|
+
// 2. define it
|
|
237
|
+
var fn = (0, _gen.FunctionDeclaration)(dispatcherFnName, [(0, _gen.Identifier)(x), (0, _gen.Identifier)(y), (0, _gen.Identifier)(z)], [
|
|
238
|
+
// Define map of callable functions
|
|
239
|
+
map,
|
|
240
|
+
// Set returning variable to undefined
|
|
241
|
+
(0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(returnProp)),
|
|
242
|
+
// Arg to clear the payload
|
|
243
|
+
(0, _gen.IfStatement)((0, _gen.BinaryExpression)("==", (0, _gen.Identifier)(y), (0, _gen.Literal)(expectedClearArgs)), [(0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(payloadArg), (0, _gen.ArrayExpression)([])))], null), (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)((0, _gen.Identifier)("lengths"), (0, _gen.ObjectExpression)(!this.options.preserveFunctionLength ? [] : shuffledKeys.map(name => {
|
|
244
|
+
var [def, defParents] = functionDeclarations[name];
|
|
245
|
+
return {
|
|
246
|
+
key: newFnNames[name],
|
|
247
|
+
value: (0, _insert.computeFunctionLength)(def.params)
|
|
248
|
+
};
|
|
249
|
+
}).filter(item => item.value !== 0).map(item => (0, _gen.Property)((0, _gen.Literal)(item.key), (0, _gen.Literal)(item.value)))))), (0, _template.default)(`
|
|
250
|
+
function makeFn${_constants.predictableFunctionTag}(){
|
|
251
|
+
var fn = function(...args){
|
|
252
|
+
${payloadArg} = args;
|
|
253
|
+
return ${mapName}[${x}].call(this)
|
|
254
|
+
}, a = lengths[${x}]
|
|
255
|
+
|
|
256
|
+
${this.options.preserveFunctionLength ? `if(a){
|
|
257
|
+
return ${this.functionLengthName}(fn, a)
|
|
258
|
+
}` : ""}
|
|
259
|
+
|
|
260
|
+
return fn
|
|
261
|
+
}
|
|
262
|
+
`).single(),
|
|
263
|
+
// Arg to get a function reference
|
|
264
|
+
(0, _gen.IfStatement)((0, _gen.BinaryExpression)("==", (0, _gen.Identifier)(y), (0, _gen.Literal)(expectedGet)), [
|
|
265
|
+
// Getter flag: return the function object
|
|
266
|
+
(0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(returnProp), (0, _gen.LogicalExpression)("||", (0, _gen.MemberExpression)((0, _gen.Identifier)(cacheName), (0, _gen.Identifier)(x), true), (0, _gen.AssignmentExpression)("=", (0, _gen.MemberExpression)((0, _gen.Identifier)(cacheName), (0, _gen.Identifier)(x), true), (0, _gen.CallExpression)((0, _gen.Identifier)(`makeFn${_constants.predictableFunctionTag}`), [])))))], [
|
|
267
|
+
// Call the function, return result
|
|
268
|
+
(0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(returnProp), (0, _gen.CallExpression)(getAccessor(), [])))]),
|
|
269
|
+
// Check how the function was invoked (new () vs ())
|
|
270
|
+
(0, _gen.IfStatement)((0, _gen.BinaryExpression)("==", (0, _gen.Identifier)(z), (0, _gen.Literal)(expectedNew)), [
|
|
271
|
+
// Wrap in object
|
|
272
|
+
(0, _gen.ReturnStatement)((0, _gen.ObjectExpression)([(0, _gen.Property)((0, _gen.Identifier)(newReturnMemberName), (0, _gen.Identifier)(returnProp), false)]))], [
|
|
273
|
+
// Return raw result
|
|
261
274
|
(0, _gen.ReturnStatement)((0, _gen.Identifier)(returnProp))])]);
|
|
262
275
|
(0, _insert.append)(object, fn);
|
|
263
|
-
|
|
264
276
|
if (payloadArg) {
|
|
265
277
|
(0, _insert.prepend)(object, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(payloadArg, (0, _gen.ArrayExpression)([]))));
|
|
266
278
|
}
|
|
267
|
-
|
|
268
279
|
identifiers.forEach(_ref => {
|
|
269
280
|
let [o, p] = _ref;
|
|
270
|
-
|
|
271
281
|
if (o.type != "Identifier") {
|
|
272
282
|
return;
|
|
273
283
|
}
|
|
274
|
-
|
|
275
284
|
var newName = newFnNames[o.name];
|
|
276
|
-
|
|
277
285
|
if (!newName || typeof newName !== "string") {
|
|
278
286
|
return;
|
|
279
287
|
}
|
|
280
|
-
|
|
281
288
|
if (!functionDeclarations[o.name]) {
|
|
282
289
|
this.error(new Error("newName, missing function declaration"));
|
|
283
290
|
}
|
|
284
|
-
|
|
285
291
|
var info = (0, _identifiers.getIdentifierInfo)(o, p);
|
|
286
|
-
|
|
287
292
|
if (info.isFunctionCall && p[0].type == "CallExpression" && p[0].callee === o) {
|
|
288
293
|
// Invoking call expression: `a();`
|
|
294
|
+
|
|
289
295
|
if (o.name == dispatcherFnName) {
|
|
290
296
|
return;
|
|
291
297
|
}
|
|
292
|
-
|
|
293
|
-
this.log("".concat(o.name, "(").concat(p[0].arguments.map(_ => "<>").join(","), ") -> ").concat(dispatcherFnName, "('").concat(newName, "')"));
|
|
298
|
+
this.log(`${o.name}(${p[0].arguments.map(_ => "<>").join(",")}) -> ${dispatcherFnName}('${newName}')`);
|
|
294
299
|
var assignmentExpressions = [];
|
|
295
300
|
var dispatcherArgs = [(0, _gen.Literal)(newName)];
|
|
296
|
-
|
|
297
301
|
if (p[0].arguments.length) {
|
|
298
302
|
assignmentExpressions = [(0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(payloadArg), (0, _gen.ArrayExpression)(p[0].arguments))];
|
|
299
303
|
} else {
|
|
300
304
|
dispatcherArgs.push((0, _gen.Literal)(expectedClearArgs));
|
|
301
305
|
}
|
|
302
|
-
|
|
303
306
|
var type = (0, _random.choice)(["CallExpression", "NewExpression"]);
|
|
304
307
|
var callExpression = null;
|
|
305
|
-
|
|
306
308
|
switch (type) {
|
|
307
309
|
case "CallExpression":
|
|
308
310
|
callExpression = (0, _gen.CallExpression)((0, _gen.Identifier)(dispatcherFnName), dispatcherArgs);
|
|
309
311
|
break;
|
|
310
|
-
|
|
311
312
|
case "NewExpression":
|
|
312
313
|
if (dispatcherArgs.length == 1) {
|
|
313
314
|
dispatcherArgs.push((0, _gen.Identifier)("undefined"));
|
|
314
315
|
}
|
|
315
|
-
|
|
316
316
|
callExpression = (0, _gen.MemberExpression)((0, _gen.NewExpression)((0, _gen.Identifier)(dispatcherFnName), [...dispatcherArgs, (0, _gen.Literal)(expectedNew)]), (0, _gen.Identifier)(newReturnMemberName), false);
|
|
317
317
|
break;
|
|
318
318
|
}
|
|
319
|
-
|
|
320
319
|
this.addComment(callExpression, "Calling " + o.name + "(" + p[0].arguments.map(x => x.name).join(", ") + ")");
|
|
321
|
-
var expr = assignmentExpressions.length ? (0, _gen.SequenceExpression)([...assignmentExpressions, callExpression]) : callExpression;
|
|
320
|
+
var expr = assignmentExpressions.length ? (0, _gen.SequenceExpression)([...assignmentExpressions, callExpression]) : callExpression;
|
|
322
321
|
|
|
322
|
+
// Replace the parent call expression
|
|
323
323
|
this.replace(p[0], expr);
|
|
324
324
|
} else {
|
|
325
325
|
// Non-invoking reference: `a`
|
|
326
|
+
|
|
326
327
|
if (info.spec.isDefined) {
|
|
327
328
|
if (info.isFunctionDeclaration) {
|
|
328
329
|
this.log("Skipped getter " + o.name + " (function declaration)");
|
|
329
330
|
} else {
|
|
330
331
|
this.log("Skipped getter " + o.name + " (defined)");
|
|
331
332
|
}
|
|
332
|
-
|
|
333
333
|
return;
|
|
334
334
|
}
|
|
335
|
-
|
|
336
335
|
if (info.spec.isModified) {
|
|
337
336
|
this.log("Skipped getter " + o.name + " (modified)");
|
|
338
337
|
return;
|
|
339
338
|
}
|
|
340
|
-
|
|
341
|
-
this.log("(getter) ".concat(o.name, " -> ").concat(dispatcherFnName, "('").concat(newName, "')"));
|
|
339
|
+
this.log(`(getter) ${o.name} -> ${dispatcherFnName}('${newName}')`);
|
|
342
340
|
this.replace(o, (0, _gen.CallExpression)((0, _gen.Identifier)(dispatcherFnName), [(0, _gen.Literal)(newName), (0, _gen.Literal)(expectedGet)]));
|
|
343
341
|
}
|
|
344
342
|
});
|
|
345
|
-
(0, _insert.prepend)(object, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)((0, _gen.Identifier)(cacheName), (0, _template.default)(
|
|
343
|
+
(0, _insert.prepend)(object, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)((0, _gen.Identifier)(cacheName), (0, _template.default)(`Object.create(null)`).single().expression)));
|
|
346
344
|
}
|
|
347
345
|
}
|
|
348
346
|
};
|
|
349
347
|
}
|
|
350
|
-
|
|
351
348
|
}
|
|
352
|
-
|
|
353
349
|
exports.default = Dispatcher;
|
|
@@ -4,90 +4,81 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _transform = _interopRequireDefault(require("../transform"));
|
|
9
|
-
|
|
10
8
|
var _template = _interopRequireDefault(require("../../templates/template"));
|
|
11
|
-
|
|
12
9
|
var _traverse = require("../../traverse");
|
|
13
|
-
|
|
14
10
|
var _gen = require("../../util/gen");
|
|
15
|
-
|
|
16
11
|
var _assert = require("assert");
|
|
17
|
-
|
|
18
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
-
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
20
13
|
class AntiClass extends _transform.default {
|
|
21
14
|
constructor(o) {
|
|
22
15
|
super(o);
|
|
23
16
|
}
|
|
24
|
-
|
|
25
17
|
match(o, p) {
|
|
26
18
|
return o.type == "ClassDeclaration" || o.type == "ClassExpression";
|
|
27
19
|
}
|
|
28
|
-
|
|
29
20
|
transform(object, parents) {
|
|
30
21
|
return () => {
|
|
31
22
|
var body = object.body;
|
|
32
|
-
|
|
33
23
|
if (body.type !== "ClassBody") {
|
|
34
24
|
return;
|
|
35
25
|
}
|
|
36
|
-
|
|
37
26
|
if (!Array.isArray(body.body)) {
|
|
38
27
|
return;
|
|
39
28
|
}
|
|
40
|
-
|
|
41
29
|
var isDeclaration = object.type == "ClassDeclaration";
|
|
42
30
|
var virtualName = "virtual" + this.getPlaceholder();
|
|
43
31
|
var staticBody = [];
|
|
44
32
|
var virtualBody = [];
|
|
45
33
|
var superName;
|
|
46
|
-
var thisName = "this" + this.getPlaceholder();
|
|
34
|
+
var thisName = "this" + this.getPlaceholder();
|
|
47
35
|
|
|
48
|
-
|
|
49
|
-
virtualBody.push((0, _template.default)(
|
|
36
|
+
// self this
|
|
37
|
+
virtualBody.push((0, _template.default)(`var ${thisName} = this;`).single());
|
|
38
|
+
virtualBody.push((0, _template.default)(`${thisName}["constructor"] = null;`).single());
|
|
50
39
|
var superArguments;
|
|
51
40
|
var superBody = [];
|
|
52
|
-
|
|
53
41
|
if (object.superClass) {
|
|
54
42
|
superName = "super" + this.getPlaceholder();
|
|
55
43
|
}
|
|
56
|
-
|
|
57
44
|
var virtualDescriptorsName = this.getPlaceholder();
|
|
58
|
-
var staticDescriptorsName = this.getPlaceholder();
|
|
45
|
+
var staticDescriptorsName = this.getPlaceholder();
|
|
59
46
|
|
|
60
|
-
|
|
47
|
+
// getters/setters
|
|
48
|
+
virtualBody.push((0, _template.default)(`var ${virtualDescriptorsName} = {getters: {}, setters: {}}`).single());
|
|
61
49
|
|
|
62
|
-
|
|
50
|
+
// getters/setters
|
|
51
|
+
staticBody.push((0, _template.default)(`var ${staticDescriptorsName} = {getters: {}, setters: {}}`).single());
|
|
63
52
|
body.body.forEach(methodDefinition => {
|
|
64
53
|
if (!methodDefinition.key) {
|
|
65
54
|
return;
|
|
66
55
|
}
|
|
67
|
-
|
|
68
56
|
var isStatic = methodDefinition.static;
|
|
69
57
|
var key = (0, _gen.MemberExpression)(isStatic ? (0, _gen.Identifier)(virtualName) : (0, _gen.ThisExpression)(), methodDefinition.key, methodDefinition.computed);
|
|
70
58
|
var value = methodDefinition.value;
|
|
71
59
|
var pushingTo = isStatic ? staticBody : virtualBody;
|
|
72
|
-
|
|
73
60
|
if (superName && value.type == "FunctionExpression") {
|
|
74
61
|
var first = value.body.body[0];
|
|
75
|
-
|
|
76
62
|
if (first.type == "ExpressionStatement" && first.expression.type == "CallExpression") {
|
|
77
63
|
if (first.expression.callee.type == "Super") {
|
|
64
|
+
/// super(...args)
|
|
78
65
|
superArguments = first.expression.arguments;
|
|
79
66
|
value.body.body.shift();
|
|
67
|
+
} else if (
|
|
68
|
+
// F(super(...args))
|
|
69
|
+
first.expression.arguments[0] && first.expression.arguments[0].type === "CallExpression" && first.expression.arguments[0].callee.type === "Super") {
|
|
70
|
+
superArguments = first.expression.arguments[0].arguments;
|
|
71
|
+
first.expression.arguments[0] = (0, _gen.Identifier)("undefined");
|
|
80
72
|
}
|
|
81
73
|
}
|
|
82
|
-
|
|
83
74
|
(0, _traverse.walk)(value.body, [value, methodDefinition, body.body, body, object, ...parents], (o, p) => {
|
|
84
75
|
if (o.type == "Super") {
|
|
85
76
|
this.replace(o, (0, _gen.Identifier)(superName));
|
|
86
77
|
}
|
|
87
78
|
});
|
|
88
|
-
}
|
|
89
|
-
|
|
79
|
+
}
|
|
90
80
|
|
|
81
|
+
// Support class fields
|
|
91
82
|
if (methodDefinition.type === "PropertyDefinition") {
|
|
92
83
|
var assignmentExpression = (0, _gen.AssignmentExpression)("=", key, value || (0, _gen.Identifier)("undefined"));
|
|
93
84
|
pushingTo.push((0, _gen.ExpressionStatement)(assignmentExpression));
|
|
@@ -103,36 +94,71 @@ class AntiClass extends _transform.default {
|
|
|
103
94
|
throw new Error("Unsupported method definition");
|
|
104
95
|
}
|
|
105
96
|
});
|
|
106
|
-
virtualBody.push((0, _template.default)(
|
|
107
|
-
|
|
108
|
-
|
|
97
|
+
virtualBody.push((0, _template.default)(`
|
|
98
|
+
[...Object.keys(${virtualDescriptorsName}.getters), ...Object.keys(${virtualDescriptorsName}.setters)].forEach(key=>{
|
|
99
|
+
|
|
100
|
+
if( !${thisName}.hasOwnProperty(key) ) {
|
|
101
|
+
var getter = ${virtualDescriptorsName}.getters[key];
|
|
102
|
+
var setter = ${virtualDescriptorsName}.setters[key];
|
|
103
|
+
Object.defineProperty(${thisName}, key, {
|
|
104
|
+
get: getter,
|
|
105
|
+
set: setter,
|
|
106
|
+
configurable: true
|
|
107
|
+
})
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
`).single());
|
|
113
|
+
staticBody.push((0, _template.default)(`
|
|
114
|
+
[...Object.keys(${staticDescriptorsName}.getters), ...Object.keys(${staticDescriptorsName}.setters)].forEach(key=>{
|
|
115
|
+
|
|
116
|
+
if( !${virtualName}.hasOwnProperty(key) ) {
|
|
117
|
+
var getter = ${staticDescriptorsName}.getters[key];
|
|
118
|
+
var setter = ${staticDescriptorsName}.setters[key];
|
|
119
|
+
Object.defineProperty(${virtualName}, key, {
|
|
120
|
+
get: getter,
|
|
121
|
+
set: setter,
|
|
122
|
+
configurable: true
|
|
123
|
+
})
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
`).single());
|
|
109
129
|
if (superName) {
|
|
110
|
-
(0, _assert.ok)(superArguments, "
|
|
111
|
-
|
|
112
|
-
|
|
130
|
+
(0, _assert.ok)(superArguments, "Failed to find super() arguments");
|
|
131
|
+
|
|
132
|
+
// save the super state
|
|
133
|
+
virtualBody.unshift((0, _template.default)(`
|
|
134
|
+
Object.keys(this).forEach(key=>{
|
|
135
|
+
var descriptor = Object.getOwnPropertyDescriptor(this, key);
|
|
136
|
+
if ( descriptor) {
|
|
137
|
+
Object.defineProperty(${superName}, key, descriptor)
|
|
138
|
+
} else {
|
|
139
|
+
${superName}[key] = this[key];
|
|
140
|
+
}
|
|
141
|
+
})`).single());
|
|
113
142
|
virtualBody.unshift((0, _gen.ExpressionStatement)((0, _gen.CallExpression)((0, _gen.MemberExpression)(object.superClass, (0, _gen.Identifier)("call"), false), [(0, _gen.ThisExpression)(), ...superArguments])));
|
|
114
|
-
virtualBody.unshift((0, _template.default)(
|
|
143
|
+
virtualBody.unshift((0, _template.default)(`var ${superName} = {}`).single());
|
|
115
144
|
}
|
|
116
|
-
|
|
117
|
-
virtualBody.push((0, _template.default)("if(!this[\"constructor\"]){this[\"constructor\"] = ()=>{}};").single());
|
|
118
|
-
|
|
145
|
+
virtualBody.push((0, _template.default)(`if(!this["constructor"]){this["constructor"] = ()=>{}};`).single());
|
|
119
146
|
if (object.id && object.id.name) {
|
|
120
|
-
virtualBody.push((0, _template.default)(
|
|
147
|
+
virtualBody.push((0, _template.default)(`Object.defineProperty(this["constructor"], 'name', {
|
|
148
|
+
writable: true,
|
|
149
|
+
configurable: true,
|
|
150
|
+
value: '${object.id.name}'
|
|
151
|
+
});`).single());
|
|
121
152
|
}
|
|
122
|
-
|
|
123
|
-
virtualBody.push((0, _template.default)("this[\"constructor\"](...arguments)").single());
|
|
153
|
+
virtualBody.push((0, _template.default)(`this["constructor"](...arguments)`).single());
|
|
124
154
|
var virtualFunction = (0, _gen.FunctionExpression)([], virtualBody);
|
|
125
155
|
var completeBody = [(0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(virtualName, virtualFunction)), ...staticBody, (0, _gen.ReturnStatement)((0, _gen.Identifier)(virtualName))];
|
|
126
156
|
var expr = (0, _gen.CallExpression)((0, _gen.FunctionExpression)([], completeBody), []);
|
|
127
|
-
|
|
128
157
|
if (isDeclaration) {
|
|
129
158
|
expr = (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(object.id, expr));
|
|
130
159
|
}
|
|
131
|
-
|
|
132
160
|
this.replace(object, expr);
|
|
133
161
|
};
|
|
134
162
|
}
|
|
135
|
-
|
|
136
163
|
}
|
|
137
|
-
|
|
138
164
|
exports.default = AntiClass;
|