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.
Files changed (123) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +12 -27
  3. package/dist/compiler.js +2 -8
  4. package/dist/constants.js +17 -10
  5. package/dist/index.js +7 -30
  6. package/dist/obfuscator.js +15 -62
  7. package/dist/options.js +21 -38
  8. package/dist/order.js +4 -7
  9. package/dist/parser.js +5 -13
  10. package/dist/precedence.js +6 -8
  11. package/dist/presets.js +4 -6
  12. package/dist/probability.js +13 -24
  13. package/dist/templates/bufferToString.js +100 -5
  14. package/dist/templates/crash.js +51 -9
  15. package/dist/templates/es5.js +125 -6
  16. package/dist/templates/functionLength.js +24 -6
  17. package/dist/templates/globals.js +9 -0
  18. package/dist/templates/template.js +71 -30
  19. package/dist/transforms/antiTooling.js +26 -22
  20. package/dist/transforms/calculator.js +18 -54
  21. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +236 -333
  22. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
  23. package/dist/transforms/deadCode.js +528 -27
  24. package/dist/transforms/dispatcher.js +106 -110
  25. package/dist/transforms/es5/antiClass.js +70 -44
  26. package/dist/transforms/es5/antiDestructuring.js +14 -38
  27. package/dist/transforms/es5/antiES6Object.js +39 -48
  28. package/dist/transforms/es5/antiSpreadOperator.js +5 -14
  29. package/dist/transforms/es5/antiTemplate.js +10 -19
  30. package/dist/transforms/es5/es5.js +7 -40
  31. package/dist/transforms/extraction/classExtraction.js +83 -0
  32. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +41 -80
  33. package/dist/transforms/extraction/objectExtraction.js +24 -56
  34. package/dist/transforms/finalizer.js +6 -20
  35. package/dist/transforms/flatten.js +51 -99
  36. package/dist/transforms/identifier/globalAnalysis.js +8 -26
  37. package/dist/transforms/identifier/globalConcealing.js +35 -54
  38. package/dist/transforms/identifier/movedDeclarations.js +66 -38
  39. package/dist/transforms/identifier/renameVariables.js +29 -68
  40. package/dist/transforms/identifier/variableAnalysis.js +21 -48
  41. package/dist/transforms/lock/antiDebug.js +20 -25
  42. package/dist/transforms/lock/integrity.js +48 -47
  43. package/dist/transforms/lock/lock.js +62 -113
  44. package/dist/transforms/minify.js +77 -108
  45. package/dist/transforms/opaquePredicates.js +11 -48
  46. package/dist/transforms/preparation.js +17 -50
  47. package/dist/transforms/renameLabels.js +5 -22
  48. package/dist/transforms/rgf.js +93 -69
  49. package/dist/transforms/shuffle.js +41 -46
  50. package/dist/transforms/stack.js +35 -98
  51. package/dist/transforms/string/encoding.js +73 -27
  52. package/dist/transforms/string/stringCompression.js +44 -68
  53. package/dist/transforms/string/stringConcealing.js +125 -134
  54. package/dist/transforms/string/stringEncoding.js +6 -26
  55. package/dist/transforms/string/stringSplitting.js +5 -30
  56. package/dist/transforms/transform.js +50 -100
  57. package/dist/traverse.js +11 -18
  58. package/dist/util/compare.js +27 -29
  59. package/dist/util/gen.js +32 -86
  60. package/dist/util/guard.js +0 -1
  61. package/dist/util/identifiers.js +9 -72
  62. package/dist/util/insert.js +27 -77
  63. package/dist/util/math.js +0 -3
  64. package/dist/util/object.js +3 -7
  65. package/dist/util/random.js +5 -36
  66. package/dist/util/scope.js +6 -3
  67. package/package.json +3 -3
  68. package/src/constants.ts +12 -0
  69. package/src/options.ts +13 -0
  70. package/src/order.ts +2 -2
  71. package/src/templates/bufferToString.ts +49 -11
  72. package/src/templates/functionLength.ts +21 -3
  73. package/src/templates/globals.ts +3 -0
  74. package/src/templates/template.ts +85 -25
  75. package/src/transforms/antiTooling.ts +33 -11
  76. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +2 -2
  77. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
  78. package/src/transforms/deadCode.ts +0 -16
  79. package/src/transforms/dispatcher.ts +91 -69
  80. package/src/transforms/es5/antiClass.ts +10 -1
  81. package/src/transforms/extraction/classExtraction.ts +168 -0
  82. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +9 -10
  83. package/src/transforms/extraction/objectExtraction.ts +4 -15
  84. package/src/transforms/flatten.ts +20 -5
  85. package/src/transforms/identifier/globalConcealing.ts +29 -65
  86. package/src/transforms/identifier/movedDeclarations.ts +90 -24
  87. package/src/transforms/minify.ts +27 -12
  88. package/src/transforms/rgf.ts +94 -5
  89. package/src/transforms/stack.ts +12 -3
  90. package/src/transforms/string/encoding.ts +85 -51
  91. package/src/transforms/string/stringCompression.ts +5 -8
  92. package/src/transforms/string/stringConcealing.ts +139 -113
  93. package/src/transforms/string/stringEncoding.ts +1 -2
  94. package/src/transforms/string/stringSplitting.ts +1 -2
  95. package/src/transforms/transform.ts +30 -1
  96. package/src/util/compare.ts +39 -5
  97. package/src/util/gen.ts +10 -3
  98. package/src/util/insert.ts +17 -0
  99. package/src/util/scope.ts +14 -2
  100. package/test/code/Cash.test.ts +10 -4
  101. package/test/code/StrictMode.src.js +65 -0
  102. package/test/code/StrictMode.test.js +37 -0
  103. package/test/compare.test.ts +62 -2
  104. package/test/options.test.ts +111 -55
  105. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
  106. package/test/transforms/dispatcher.test.ts +55 -0
  107. package/test/transforms/extraction/classExtraction.test.ts +86 -0
  108. package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +8 -0
  109. package/test/transforms/extraction/objectExtraction.test.ts +2 -0
  110. package/test/transforms/identifier/globalConcealing.test.ts +19 -0
  111. package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
  112. package/test/transforms/minify.test.ts +37 -0
  113. package/test/transforms/rgf.test.ts +50 -0
  114. package/dist/transforms/controlFlowFlattening/choiceFlowObfuscation.js +0 -62
  115. package/dist/transforms/controlFlowFlattening/controlFlowObfuscation.js +0 -159
  116. package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +0 -106
  117. package/dist/transforms/eval.js +0 -84
  118. package/dist/transforms/hexadecimalNumbers.js +0 -63
  119. package/dist/transforms/hideInitializingCode.js +0 -270
  120. package/dist/transforms/identifier/nameRecycling.js +0 -218
  121. package/dist/transforms/label.js +0 -67
  122. package/dist/transforms/preparation/nameConflicts.js +0 -116
  123. 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
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
-
32
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
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
- } // Map of FunctionDeclarations
84
-
78
+ }
85
79
 
86
- var functionDeclarations = Object.create(null); // Array of Identifier nodes
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(); // New Names for Functions
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
- } // If dupe, no routing
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
- } // Avoid functions with function expressions as they have a different scope
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
- }); // map original name->new game
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
- }); // set containing new name
172
-
173
- var set = new Set(Object.keys(newFnNames)); // Only make a dispatcher function if it caught any functions
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(); // creating the dispatcher function
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 = { ...def,
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); // replace params with random identifiers
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); // delete ref in block
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
- } // 2. define it
248
-
234
+ }
249
235
 
250
- var fn = (0, _gen.FunctionDeclaration)(dispatcherFnName, [(0, _gen.Identifier)(x), (0, _gen.Identifier)(y), (0, _gen.Identifier)(z)], [// Define map of callable functions
251
- map, // Set returning variable to undefined
252
- (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(returnProp)), // Arg to clear the payload
253
- (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), // Arg to get a function reference
254
- (0, _gen.IfStatement)((0, _gen.BinaryExpression)("==", (0, _gen.Identifier)(y), (0, _gen.Literal)(expectedGet)), [// Getter flag: return the function object
255
- (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.FunctionExpression)([(0, _gen.RestElement)((0, _gen.Identifier)(getterArgName))], [// Arg setter
256
- (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(payloadArg), (0, _gen.Identifier)(getterArgName))), // Call fn & return
257
- (0, _gen.ReturnStatement)((0, _gen.CallExpression)((0, _gen.MemberExpression)(getAccessor(), (0, _gen.Identifier)("call"), false), [(0, _gen.ThisExpression)(), (0, _gen.Literal)(gen.generate())]))])))))], [// Call the function, return result
258
- (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(returnProp), (0, _gen.CallExpression)(getAccessor(), [(0, _gen.Literal)(gen.generate())])))]), // Check how the function was invoked (new () vs ())
259
- (0, _gen.IfStatement)((0, _gen.BinaryExpression)("==", (0, _gen.Identifier)(z), (0, _gen.Literal)(expectedNew)), [// Wrap in object
260
- (0, _gen.ReturnStatement)((0, _gen.ObjectExpression)([(0, _gen.Property)((0, _gen.Identifier)(newReturnMemberName), (0, _gen.Identifier)(returnProp), false)]))], [// Return raw result
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; // Replace the parent call expression
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)("Object.create(null)").single().expression)));
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(); // self this
34
+ var thisName = "this" + this.getPlaceholder();
47
35
 
48
- virtualBody.push((0, _template.default)("var ".concat(thisName, " = this;")).single());
49
- virtualBody.push((0, _template.default)("".concat(thisName, "[\"constructor\"] = null;")).single());
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(); // getters/setters
45
+ var staticDescriptorsName = this.getPlaceholder();
59
46
 
60
- virtualBody.push((0, _template.default)("var ".concat(virtualDescriptorsName, " = {getters: {}, setters: {}}")).single()); // getters/setters
47
+ // getters/setters
48
+ virtualBody.push((0, _template.default)(`var ${virtualDescriptorsName} = {getters: {}, setters: {}}`).single());
61
49
 
62
- staticBody.push((0, _template.default)("var ".concat(staticDescriptorsName, " = {getters: {}, setters: {}}")).single());
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
- } // Support class fields
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)("\n [...Object.keys(".concat(virtualDescriptorsName, ".getters), ...Object.keys(").concat(virtualDescriptorsName, ".setters)].forEach(key=>{\n \n if( !").concat(thisName, ".hasOwnProperty(key) ) {\n var getter = ").concat(virtualDescriptorsName, ".getters[key];\n var setter = ").concat(virtualDescriptorsName, ".setters[key];\n Object.defineProperty(").concat(thisName, ", key, {\n get: getter,\n set: setter,\n configurable: true\n })\n }\n \n })\n \n ")).single());
107
- staticBody.push((0, _template.default)("\n [...Object.keys(".concat(staticDescriptorsName, ".getters), ...Object.keys(").concat(staticDescriptorsName, ".setters)].forEach(key=>{\n \n if( !").concat(virtualName, ".hasOwnProperty(key) ) {\n var getter = ").concat(staticDescriptorsName, ".getters[key];\n var setter = ").concat(staticDescriptorsName, ".setters[key];\n Object.defineProperty(").concat(virtualName, ", key, {\n get: getter,\n set: setter,\n configurable: true\n })\n }\n \n })\n \n ")).single());
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, "Super class with no super arguments"); // save the super state
111
-
112
- virtualBody.unshift((0, _template.default)("\n Object.keys(this).forEach(key=>{\n var descriptor = Object.getOwnPropertyDescriptor(this, key);\n if ( descriptor) {\n Object.defineProperty(".concat(superName, ", key, descriptor)\n } else {\n ").concat(superName, "[key] = this[key];\n }\n })")).single());
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)("var ".concat(superName, " = {}")).single());
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)("Object.defineProperty(this[\"constructor\"], 'name', {\n writable: true,\n configurable: true,\n value: '".concat(object.id.name, "'\n });")).single());
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;