js-confuser 1.7.1 → 1.7.3

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 (153) hide show
  1. package/.github/workflows/node.js.yml +1 -1
  2. package/CHANGELOG.md +73 -0
  3. package/README.md +32 -31
  4. package/dist/compiler.js +2 -8
  5. package/dist/constants.js +22 -10
  6. package/dist/index.js +15 -30
  7. package/dist/obfuscator.js +15 -62
  8. package/dist/options.js +33 -40
  9. package/dist/order.js +4 -7
  10. package/dist/parser.js +5 -13
  11. package/dist/precedence.js +6 -8
  12. package/dist/presets.js +4 -6
  13. package/dist/probability.js +13 -24
  14. package/dist/templates/bufferToString.js +121 -5
  15. package/dist/templates/core.js +35 -0
  16. package/dist/templates/crash.js +22 -11
  17. package/dist/templates/es5.js +125 -6
  18. package/dist/templates/functionLength.js +24 -6
  19. package/dist/templates/globals.js +9 -0
  20. package/dist/templates/template.js +189 -43
  21. package/dist/transforms/antiTooling.js +26 -22
  22. package/dist/transforms/calculator.js +19 -55
  23. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +242 -333
  24. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
  25. package/dist/transforms/deadCode.js +542 -31
  26. package/dist/transforms/dispatcher.js +112 -112
  27. package/dist/transforms/es5/antiClass.js +70 -44
  28. package/dist/transforms/es5/antiDestructuring.js +14 -38
  29. package/dist/transforms/es5/antiES6Object.js +39 -48
  30. package/dist/transforms/es5/antiSpreadOperator.js +5 -14
  31. package/dist/transforms/es5/antiTemplate.js +10 -19
  32. package/dist/transforms/es5/es5.js +7 -40
  33. package/dist/transforms/extraction/classExtraction.js +83 -0
  34. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +41 -80
  35. package/dist/transforms/extraction/objectExtraction.js +24 -56
  36. package/dist/transforms/finalizer.js +6 -20
  37. package/dist/transforms/flatten.js +51 -99
  38. package/dist/transforms/identifier/globalAnalysis.js +21 -26
  39. package/dist/transforms/identifier/globalConcealing.js +72 -56
  40. package/dist/transforms/identifier/movedDeclarations.js +66 -38
  41. package/dist/transforms/identifier/renameVariables.js +36 -68
  42. package/dist/transforms/identifier/variableAnalysis.js +21 -48
  43. package/dist/transforms/lock/antiDebug.js +20 -25
  44. package/dist/transforms/lock/integrity.js +53 -52
  45. package/dist/transforms/lock/lock.js +161 -126
  46. package/dist/transforms/minify.js +77 -108
  47. package/dist/transforms/opaquePredicates.js +12 -49
  48. package/dist/transforms/preparation.js +28 -49
  49. package/dist/transforms/renameLabels.js +5 -22
  50. package/dist/transforms/rgf.js +125 -72
  51. package/dist/transforms/shuffle.js +42 -47
  52. package/dist/transforms/stack.js +41 -98
  53. package/dist/transforms/string/encoding.js +76 -27
  54. package/dist/transforms/string/stringCompression.js +75 -68
  55. package/dist/transforms/string/stringConcealing.js +127 -135
  56. package/dist/transforms/string/stringEncoding.js +6 -26
  57. package/dist/transforms/string/stringSplitting.js +5 -30
  58. package/dist/transforms/transform.js +76 -104
  59. package/dist/traverse.js +11 -18
  60. package/dist/util/compare.js +27 -29
  61. package/dist/util/gen.js +32 -86
  62. package/dist/util/guard.js +5 -1
  63. package/dist/util/identifiers.js +9 -72
  64. package/dist/util/insert.js +27 -77
  65. package/dist/util/math.js +0 -3
  66. package/dist/util/object.js +3 -7
  67. package/dist/util/random.js +31 -36
  68. package/dist/util/scope.js +6 -3
  69. package/docs/Countermeasures.md +13 -6
  70. package/docs/Integrity.md +35 -28
  71. package/docs/RGF.md +6 -1
  72. package/docs/RenameVariables.md +116 -0
  73. package/docs/TamperProtection.md +100 -0
  74. package/docs/Template.md +117 -0
  75. package/package.json +3 -3
  76. package/src/constants.ts +17 -0
  77. package/src/index.ts +7 -5
  78. package/src/options.ts +60 -7
  79. package/src/order.ts +2 -2
  80. package/src/templates/bufferToString.ts +79 -11
  81. package/src/templates/core.ts +29 -0
  82. package/src/templates/crash.ts +6 -38
  83. package/src/templates/es5.ts +1 -1
  84. package/src/templates/functionLength.ts +21 -3
  85. package/src/templates/globals.ts +3 -0
  86. package/src/templates/template.ts +205 -46
  87. package/src/transforms/antiTooling.ts +33 -11
  88. package/src/transforms/calculator.ts +4 -2
  89. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +12 -5
  90. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
  91. package/src/transforms/deadCode.ts +74 -42
  92. package/src/transforms/dispatcher.ts +99 -73
  93. package/src/transforms/es5/antiClass.ts +25 -12
  94. package/src/transforms/es5/antiDestructuring.ts +1 -1
  95. package/src/transforms/es5/antiES6Object.ts +2 -2
  96. package/src/transforms/es5/antiTemplate.ts +1 -1
  97. package/src/transforms/extraction/classExtraction.ts +168 -0
  98. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +11 -16
  99. package/src/transforms/extraction/objectExtraction.ts +4 -15
  100. package/src/transforms/flatten.ts +20 -5
  101. package/src/transforms/identifier/globalAnalysis.ts +18 -1
  102. package/src/transforms/identifier/globalConcealing.ts +119 -72
  103. package/src/transforms/identifier/movedDeclarations.ts +90 -24
  104. package/src/transforms/identifier/renameVariables.ts +16 -1
  105. package/src/transforms/lock/antiDebug.ts +2 -2
  106. package/src/transforms/lock/integrity.ts +13 -11
  107. package/src/transforms/lock/lock.ts +122 -30
  108. package/src/transforms/minify.ts +28 -13
  109. package/src/transforms/opaquePredicates.ts +2 -2
  110. package/src/transforms/preparation.ts +16 -0
  111. package/src/transforms/rgf.ts +139 -12
  112. package/src/transforms/shuffle.ts +3 -3
  113. package/src/transforms/stack.ts +19 -4
  114. package/src/transforms/string/encoding.ts +88 -51
  115. package/src/transforms/string/stringCompression.ts +86 -17
  116. package/src/transforms/string/stringConcealing.ts +148 -118
  117. package/src/transforms/string/stringEncoding.ts +1 -2
  118. package/src/transforms/string/stringSplitting.ts +1 -2
  119. package/src/transforms/transform.ts +63 -46
  120. package/src/types.ts +2 -0
  121. package/src/util/compare.ts +39 -5
  122. package/src/util/gen.ts +10 -3
  123. package/src/util/guard.ts +10 -0
  124. package/src/util/insert.ts +17 -0
  125. package/src/util/random.ts +81 -1
  126. package/src/util/scope.ts +14 -2
  127. package/test/code/Cash.test.ts +94 -5
  128. package/test/code/StrictMode.src.js +65 -0
  129. package/test/code/StrictMode.test.js +37 -0
  130. package/test/compare.test.ts +62 -2
  131. package/test/options.test.ts +129 -55
  132. package/test/templates/template.test.ts +211 -1
  133. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
  134. package/test/transforms/dispatcher.test.ts +55 -0
  135. package/test/transforms/extraction/classExtraction.test.ts +86 -0
  136. package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +8 -0
  137. package/test/transforms/extraction/objectExtraction.test.ts +2 -0
  138. package/test/transforms/identifier/globalConcealing.test.ts +89 -0
  139. package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
  140. package/test/transforms/identifier/renameVariables.test.ts +75 -1
  141. package/test/transforms/lock/tamperProtection.test.ts +336 -0
  142. package/test/transforms/minify.test.ts +37 -0
  143. package/test/transforms/rgf.test.ts +50 -0
  144. package/dist/transforms/controlFlowFlattening/choiceFlowObfuscation.js +0 -62
  145. package/dist/transforms/controlFlowFlattening/controlFlowObfuscation.js +0 -159
  146. package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +0 -106
  147. package/dist/transforms/eval.js +0 -84
  148. package/dist/transforms/hexadecimalNumbers.js +0 -63
  149. package/dist/transforms/hideInitializingCode.js +0 -270
  150. package/dist/transforms/identifier/nameRecycling.js +0 -218
  151. package/dist/transforms/label.js +0 -67
  152. package/dist/transforms/preparation/nameConflicts.js +0 -116
  153. package/dist/transforms/preparation/preparation.js +0 -188
@@ -4,115 +4,88 @@ 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 _gen = require("../util/gen");
11
-
12
9
  var _random = require("../util/random");
13
-
14
10
  var _order = require("../order");
15
-
16
11
  var _insert = require("../util/insert");
17
-
18
12
  var _template = _interopRequireDefault(require("../templates/template"));
19
-
20
13
  var _probability = require("../probability");
21
-
22
14
  var _assert = require("assert");
23
-
24
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
-
26
- 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; }
27
-
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ 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; }
17
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
18
+ 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); }
28
19
  const testTypes = new Set(["ForStatement", "WhileStatement", "DoWhileStatement", "IfStatement", "ConditionExpression"]);
29
-
30
20
  function isTestExpression(object, parents) {
31
21
  if (!object || !parents[0]) {
32
22
  return false;
33
23
  }
34
-
35
24
  if (testTypes.has(parents[0].type) && parents[0].test === object) {
36
25
  return true;
37
26
  }
38
-
39
27
  return false;
40
28
  }
29
+
41
30
  /**
42
31
  * Changes test expression (such as if statements, for loops) to add predicates.
43
32
  *
44
33
  * Predicates are computed at runtime.
45
34
  */
46
-
47
-
48
35
  class OpaquePredicates extends _transform.default {
49
36
  constructor(o) {
50
37
  super(o, _order.ObfuscateOrder.OpaquePredicates);
51
-
52
38
  _defineProperty(this, "undefinedVar", void 0);
53
-
54
39
  _defineProperty(this, "nullVar", void 0);
55
-
56
40
  _defineProperty(this, "numberVar", void 0);
57
-
58
41
  _defineProperty(this, "predicateName", void 0);
59
-
60
42
  _defineProperty(this, "predicate", void 0);
61
-
62
43
  _defineProperty(this, "predicates", void 0);
63
-
64
44
  _defineProperty(this, "gen", void 0);
65
-
66
45
  _defineProperty(this, "made", void 0);
67
-
68
46
  this.predicates = Object.create(null);
69
47
  this.gen = this.getGenerator();
70
48
  this.made = 0;
71
49
  }
72
-
73
50
  match(object, parents) {
74
- return (isTestExpression(object, parents) || object.type == "SwitchCase") && !parents.find(x => x.$dispatcherSkip || x.type == "AwaitExpression");
51
+ return (isTestExpression(object, parents) || object.type == "SwitchCase") && !parents.find(x => x.$multiTransformSkip || x.type == "AwaitExpression");
75
52
  }
76
-
77
53
  transform(object, parents) {
78
54
  return () => {
79
55
  if (!(0, _probability.ComputeProbabilityMap)(this.options.opaquePredicates)) {
80
56
  return;
81
57
  }
82
-
83
58
  this.made++;
84
-
85
59
  if (this.made > 150) {
86
60
  return;
87
61
  }
88
-
89
62
  if (!this.predicate) {
90
63
  this.predicateName = this.getPlaceholder();
91
64
  this.predicate = (0, _gen.ObjectExpression)([]);
92
65
  var tempName = this.getPlaceholder();
93
66
  (0, _insert.prepend)(parents[parents.length - 1] || object, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.predicateName, (0, _gen.CallExpression)((0, _gen.FunctionExpression)([], [(0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(tempName, this.predicate)), (0, _gen.ReturnStatement)((0, _gen.Identifier)(tempName))]), []))));
94
67
  }
95
-
96
68
  var expr = (0, _random.choice)(Object.values(this.predicates));
97
-
98
69
  if (!expr || Math.random() < 0.5 / (Object.keys(this.predicates).length || 1)) {
99
70
  var prop = this.gen.generate();
100
71
  var accessor = (0, _gen.MemberExpression)((0, _gen.Identifier)(this.predicateName), (0, _gen.Identifier)(prop), false);
101
-
102
72
  switch ((0, _random.choice)(["array", "number", "string"])) {
103
73
  case "array":
104
74
  var arrayProp = this.gen.generate();
105
75
  this.predicate.properties.push((0, _gen.Property)((0, _gen.Identifier)(arrayProp), (0, _gen.ArrayExpression)([])));
106
76
  var paramName = this.getPlaceholder();
107
- this.predicate.properties.push((0, _gen.Property)((0, _gen.Identifier)(prop), (0, _gen.FunctionExpression)([(0, _gen.AssignmentPattern)((0, _gen.Identifier)(paramName), (0, _gen.Literal)("length"))], (0, _template.default)("\n if ( !".concat(this.predicateName, ".").concat(arrayProp, "[0] ) {\n ").concat(this.predicateName, ".").concat(arrayProp, ".push(").concat((0, _random.getRandomInteger)(-100, 100), ");\n }\n return ").concat(this.predicateName, ".").concat(arrayProp, "[").concat(paramName, "];\n ")).compile())));
77
+ this.predicate.properties.push((0, _gen.Property)((0, _gen.Identifier)(prop), (0, _gen.FunctionExpression)([(0, _gen.AssignmentPattern)((0, _gen.Identifier)(paramName), (0, _gen.Literal)("length"))], new _template.default(`
78
+ if ( !${this.predicateName}.${arrayProp}[0] ) {
79
+ ${this.predicateName}.${arrayProp}.push(${(0, _random.getRandomInteger)(-100, 100)});
80
+ }
81
+ return ${this.predicateName}.${arrayProp}[${paramName}];
82
+ `).compile())));
108
83
  expr = (0, _gen.CallExpression)(accessor, []);
109
84
  break;
110
-
111
85
  case "number":
112
86
  this.predicate.properties.push((0, _gen.Property)((0, _gen.Identifier)(prop), (0, _gen.Literal)((0, _random.getRandomInteger)(15, 90))));
113
87
  expr = (0, _gen.BinaryExpression)(">", accessor, (0, _gen.Literal)((0, _random.getRandomInteger)(-90, 10)));
114
88
  break;
115
-
116
89
  case "string":
117
90
  var str = this.gen.generate();
118
91
  var index = (0, _random.getRandomInteger)(0, str.length);
@@ -121,21 +94,16 @@ class OpaquePredicates extends _transform.default {
121
94
  expr = (0, _gen.BinaryExpression)("==", (0, _gen.CallExpression)((0, _gen.MemberExpression)(accessor, (0, _gen.Literal)(fn), true), [(0, _gen.Literal)(index)]), (0, _gen.Literal)(str[fn](index)));
122
95
  break;
123
96
  }
124
-
125
97
  (0, _assert.ok)(expr);
126
98
  this.predicates[prop] = expr;
127
-
128
99
  if (Math.random() > 0.8) {
129
100
  (0, _random.shuffle)(this.predicate.properties);
130
101
  }
131
102
  }
132
-
133
103
  var cloned = (0, _insert.clone)(expr);
134
-
135
104
  if (object.type == "SwitchCase" && object.test) {
136
105
  var matching = (0, _gen.Identifier)((0, _random.choice)(["undefined", "null"]));
137
106
  var test = object.test;
138
-
139
107
  if (test.type == "Literal") {
140
108
  if (typeof test.value === "number") {
141
109
  matching = (0, _gen.Literal)((0, _random.getRandomInteger)(-250, 250));
@@ -143,13 +111,10 @@ class OpaquePredicates extends _transform.default {
143
111
  matching = (0, _gen.Literal)((0, _random.getRandomString)(4));
144
112
  }
145
113
  }
146
-
147
114
  var conditionalExpression = (0, _gen.ConditionalExpression)(cloned, (0, _insert.clone)(test), matching);
148
-
149
115
  if (Math.random() > 0.5) {
150
116
  conditionalExpression = (0, _gen.ConditionalExpression)((0, _gen.UnaryExpression)("!", cloned), matching, (0, _insert.clone)(test));
151
117
  }
152
-
153
118
  this.replace(test, conditionalExpression);
154
119
  } else if (isTestExpression(object, parents)) {
155
120
  if (object.type == "Literal" && !object.regex) {
@@ -164,7 +129,5 @@ class OpaquePredicates extends _transform.default {
164
129
  }
165
130
  };
166
131
  }
167
-
168
132
  }
169
-
170
133
  exports.default = OpaquePredicates;
@@ -4,23 +4,15 @@ 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 _gen = require("../util/gen");
11
-
12
9
  var _order = require("../order");
13
-
14
10
  var _insert = require("../util/insert");
15
-
16
11
  var _identifiers = require("../util/identifiers");
17
-
18
12
  var _compare = require("../util/compare");
19
-
20
13
  var _traverse = require("../traverse");
21
-
22
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
-
14
+ var _constants = require("../constants");
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
24
16
  /**
25
17
  * Preparation arranges the user's code into an AST the obfuscator can easily transform.
26
18
  *
@@ -45,23 +37,32 @@ class Preparation extends _transform.default {
45
37
  constructor(o) {
46
38
  super(o, _order.ObfuscateOrder.Preparation);
47
39
  }
48
-
49
40
  match(object, parents) {
50
41
  return !!object.type;
51
42
  }
52
-
53
43
  transform(object, parents) {
54
44
  // ExplicitIdentifiers
55
45
  if (object.type === "Identifier") {
56
46
  return this.transformExplicitIdentifiers(object, parents);
57
- } // ExplicitDeclarations
47
+ }
58
48
 
49
+ // __JS_CONFUSER_VAR__ - Remove when Rename Variables is disabled
50
+ if (object.type === "CallExpression" && object.callee.type === "Identifier" && object.callee.name === _constants.variableFunctionName) {
51
+ if (object.arguments[0].type === "Identifier") {
52
+ if (!this.obfuscator.transforms["RenameVariables"]) {
53
+ return () => {
54
+ this.replace(object, (0, _gen.Literal)(object.arguments[0].name));
55
+ };
56
+ }
57
+ }
58
+ }
59
59
 
60
+ // ExplicitDeclarations
60
61
  if (object.type === "VariableDeclaration") {
61
62
  return this.transformExplicitDeclarations(object, parents);
62
- } // Block
63
-
63
+ }
64
64
 
65
+ // Block
65
66
  switch (object.type) {
66
67
  /**
67
68
  * People use shortcuts and its harder to parse.
@@ -73,13 +74,10 @@ class Preparation extends _transform.default {
73
74
  if (object.consequent.type != "BlockStatement") {
74
75
  object.consequent = (0, _gen.BlockStatement)([(0, _insert.clone)(object.consequent)]);
75
76
  }
76
-
77
77
  if (object.alternate && object.alternate.type != "BlockStatement") {
78
78
  object.alternate = (0, _gen.BlockStatement)([(0, _insert.clone)(object.alternate)]);
79
79
  }
80
-
81
80
  break;
82
-
83
81
  case "WhileStatement":
84
82
  case "WithStatement":
85
83
  case "ForStatement":
@@ -88,31 +86,27 @@ class Preparation extends _transform.default {
88
86
  if (object.body.type != "BlockStatement") {
89
87
  object.body = (0, _gen.BlockStatement)([(0, _insert.clone)(object.body)]);
90
88
  }
91
-
92
89
  break;
93
-
94
90
  case "ArrowFunctionExpression":
95
91
  if (object.body.type !== "BlockStatement" && object.expression) {
96
92
  object.body = (0, _gen.BlockStatement)([(0, _gen.ReturnStatement)((0, _insert.clone)(object.body))]);
97
93
  object.expression = false;
98
94
  }
99
-
100
95
  break;
101
- } // Label
102
-
96
+ }
103
97
 
98
+ // Label
104
99
  if ((0, _compare.isLoop)(object) || object.type == "BlockStatement" && parents[0] && parents[0].type == "LabeledStatement" && parents[0].body === object) {
105
100
  return this.transformLabel(object, parents);
106
101
  }
107
102
  }
103
+
108
104
  /**
109
105
  * Ensures every break; statement has a label to point to.
110
106
  *
111
107
  * This is because Control Flow Flattening adds For Loops which label-less break statements point to the nearest,
112
108
  * when they actually need to point to the original statement.
113
109
  */
114
-
115
-
116
110
  transformLabel(object, parents) {
117
111
  return () => {
118
112
  var currentLabel = parents[0].type == "LabeledStatement" && parents[0].label.name;
@@ -122,98 +116,85 @@ class Preparation extends _transform.default {
122
116
  function isContinuableStatement(x) {
123
117
  return (0, _compare.isLoop)(x) && x.type !== "SwitchStatement";
124
118
  }
125
-
126
119
  function isBreakableStatement(x) {
127
120
  return (0, _compare.isLoop)(x) || o.label && x.type == "BlockStatement";
128
121
  }
129
-
130
122
  var fn = o.type == "ContinueStatement" ? isContinuableStatement : isBreakableStatement;
131
123
  var loop = p.find(fn);
132
-
133
124
  if (object == loop) {
134
125
  if (!o.label) {
135
126
  o.label = (0, _gen.Identifier)(label);
136
127
  }
137
128
  }
138
129
  }
139
- }); // Append label statement as this loop has none
130
+ });
140
131
 
132
+ // Append label statement as this loop has none
141
133
  if (!currentLabel) {
142
- this.replace(object, (0, _gen.LabeledStatement)(label, { ...object
134
+ this.replace(object, (0, _gen.LabeledStatement)(label, {
135
+ ...object
143
136
  }));
144
137
  }
145
138
  };
146
139
  }
140
+
147
141
  /**
148
142
  * Transforms Identifiers (a.IDENTIFIER, {IDENTIFIER:...}) into string properties
149
143
  */
150
-
151
-
152
144
  transformExplicitIdentifiers(object, parents) {
153
145
  // Mark functions containing 'eval'
154
146
  // Some transformations avoid functions that have 'eval' to not break them
155
147
  if (object.name === "eval") {
156
148
  var fn = (0, _insert.getFunction)(object, parents);
157
-
158
149
  if (fn) {
159
150
  fn.$requiresEval = true;
160
151
  }
161
152
  }
162
-
163
153
  var info = (0, _identifiers.getIdentifierInfo)(object, parents);
164
-
165
154
  if (info.isPropertyKey || info.isAccessor) {
166
- var propIndex = parents.findIndex(x => x.type == "MethodDefinition" || x.type == "Property"); // Don't change constructor!
155
+ var propIndex = parents.findIndex(x => x.type == "MethodDefinition" || x.type == "Property");
167
156
 
157
+ // Don't change constructor!
168
158
  if (propIndex !== -1) {
169
159
  if (parents[propIndex].type == "MethodDefinition" && parents[propIndex].kind == "constructor") {
170
160
  return;
171
161
  }
172
162
  }
173
-
174
163
  this.replace(object, (0, _gen.Literal)(object.name));
175
164
  parents[0].computed = true;
176
165
  parents[0].shorthand = false;
177
166
  }
178
167
  }
168
+
179
169
  /**
180
170
  * Transforms VariableDeclaration into single declarations.
181
171
  */
182
-
183
-
184
172
  transformExplicitDeclarations(object, parents) {
185
173
  // for ( var x in ... ) {...}
186
174
  var forIndex = parents.findIndex(x => x.type == "ForInStatement" || x.type == "ForOfStatement");
187
-
188
175
  if (forIndex != -1 && parents[forIndex].left == (parents[forIndex - 1] || object)) {
189
176
  object.declarations.forEach(x => {
190
177
  x.init = null;
191
178
  });
192
179
  return;
193
180
  }
194
-
195
181
  var body = parents[0];
196
-
197
182
  if ((0, _compare.isLoop)(body) || body.type == "LabeledStatement") {
198
183
  return;
199
184
  }
200
-
201
185
  if (body.type == "ExportNamedDeclaration") {
202
186
  return;
203
187
  }
204
-
205
188
  if (!Array.isArray(body)) {
206
189
  this.error(new Error("body is " + body.type));
207
190
  }
208
-
209
191
  if (object.declarations.length > 1) {
210
192
  // Make singular
211
- var index = body.indexOf(object);
212
193
 
194
+ var index = body.indexOf(object);
213
195
  if (index == -1) {
214
196
  this.error(new Error("index is -1"));
215
197
  }
216
-
217
198
  var after = object.declarations.slice(1);
218
199
  body.splice(index + 1, 0, ...after.map(x => {
219
200
  return {
@@ -225,7 +206,5 @@ class Preparation extends _transform.default {
225
206
  object.declarations.length = 1;
226
207
  }
227
208
  }
228
-
229
209
  }
230
-
231
210
  exports.default = Preparation;
@@ -4,39 +4,28 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _order = require("../order");
9
-
10
8
  var _traverse = require("../traverse");
11
-
12
9
  var _compare = require("../util/compare");
13
-
14
10
  var _gen = require("../util/gen");
15
-
16
11
  var _insert = require("../util/insert");
17
-
18
12
  var _transform = _interopRequireDefault(require("./transform"));
19
-
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
-
22
- 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; }
23
-
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ 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; }
15
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
16
+ 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); }
24
17
  /**
25
18
  * Renames the labels to shorter names.
26
19
  */
27
20
  class RenameLabels extends _transform.default {
28
21
  constructor(o) {
29
22
  super(o, _order.ObfuscateOrder.RenameLabels);
30
-
31
23
  _defineProperty(this, "gen", void 0);
32
-
33
24
  this.gen = this.getGenerator("randomized");
34
25
  }
35
-
36
26
  match(object, parents) {
37
27
  return object.type == "LabeledStatement";
38
28
  }
39
-
40
29
  transform(object, parents) {
41
30
  return () => {
42
31
  var newName = null;
@@ -47,32 +36,28 @@ class RenameLabels extends _transform.default {
47
36
  function isContinuableStatement(x, stmtParents) {
48
37
  return (0, _compare.isLoop)(x) && x.type !== "SwitchStatement";
49
38
  }
50
-
51
39
  function isBreakableStatement(x, stmtParents) {
52
40
  return (0, _compare.isLoop)(x) || x.type == "BlockStatement" && o.label && stmtParents[0] && stmtParents[0].type == "LabeledStatement";
53
41
  }
54
-
55
42
  var fn = o.type == "ContinueStatement" ? isContinuableStatement : isBreakableStatement;
56
43
  var labelStatement = p.find((node, i) => {
57
44
  return fn(node, p.slice(i + 1));
58
45
  });
59
-
60
46
  if (o.label && o.label.name == object.label.name) {
61
47
  if (object.body == labelStatement && isRemovable) {
62
48
  // In same loop
49
+
63
50
  o.label = null;
64
51
  } else {
65
52
  if (!newName) {
66
53
  newName = this.gen.generate();
67
54
  }
68
-
69
55
  o.label = (0, _gen.Identifier)(newName);
70
56
  labelNeverUsed = false;
71
57
  }
72
58
  }
73
59
  }
74
60
  });
75
-
76
61
  if (newName) {
77
62
  object.label = (0, _gen.Identifier)(newName);
78
63
  } else if (isRemovable || labelNeverUsed) {
@@ -80,7 +65,5 @@ class RenameLabels extends _transform.default {
80
65
  }
81
66
  };
82
67
  }
83
-
84
68
  }
85
-
86
69
  exports.default = RenameLabels;