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,42 +4,28 @@ 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 _random = require("../../util/random");
11
-
12
9
  var _compare = require("../../util/compare");
13
-
14
- var _stringConcealing = require("./stringConcealing");
15
-
16
10
  var _probability = require("../../probability");
17
-
18
11
  var _gen = require("../../util/gen");
19
-
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
-
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
13
  function pad(x, len) {
23
14
  while (x.length < len) {
24
15
  x = "0" + x;
25
16
  }
26
-
27
17
  return x;
28
18
  }
29
-
30
19
  function even(x) {
31
20
  if (x.length % 2 != 0) {
32
21
  return "0" + x;
33
22
  }
34
-
35
23
  return x;
36
24
  }
37
-
38
25
  function toHexRepresentation(str) {
39
26
  var escapedString = "";
40
27
  str.split("").forEach(char => {
41
28
  var code = char.charCodeAt(0);
42
-
43
29
  if (code < 128) {
44
30
  escapedString += "\\x" + even(pad(code.toString(16), 2));
45
31
  } else {
@@ -48,12 +34,10 @@ function toHexRepresentation(str) {
48
34
  });
49
35
  return escapedString;
50
36
  }
51
-
52
37
  function toUnicodeRepresentation(str) {
53
38
  var escapedString = "";
54
39
  str.split("").forEach(char => {
55
40
  var code = char.charCodeAt(0);
56
-
57
41
  if (code < 128) {
58
42
  escapedString += "\\u" + even(pad(code.toString(16), 4));
59
43
  } else {
@@ -62,6 +46,7 @@ function toUnicodeRepresentation(str) {
62
46
  });
63
47
  return escapedString;
64
48
  }
49
+
65
50
  /**
66
51
  * [String Encoding](https://docs.jscrambler.com/code-integrity/documentation/transformations/string-encoding) transforms a string into an encoded representation.
67
52
  *
@@ -69,29 +54,24 @@ function toUnicodeRepresentation(str) {
69
54
  * - Resilience Low
70
55
  * - Cost Low
71
56
  */
72
-
73
-
74
57
  class StringEncoding extends _transform.default {
75
58
  constructor(o) {
76
59
  super(o);
77
60
  }
78
-
79
61
  match(object, parents) {
80
- return object.type == "Literal" && typeof object.value === "string" && object.value.length > 0 && !(0, _stringConcealing.isModuleSource)(object, parents) && !(0, _compare.isDirective)(object, parents);
62
+ return object.type == "Literal" && typeof object.value === "string" && object.value.length > 0 && !(0, _compare.isModuleSource)(object, parents) && !(0, _compare.isDirective)(object, parents);
81
63
  }
82
-
83
64
  transform(object, parents) {
84
65
  // Allow percentages
85
66
  if (!(0, _probability.ComputeProbabilityMap)(this.options.stringEncoding, x => x, object.value)) return;
86
67
  var type = (0, _random.choice)(["hexadecimal", "unicode"]);
87
68
  var escapedString = (type == "hexadecimal" ? toHexRepresentation : toUnicodeRepresentation)(object.value);
88
69
  return () => {
89
- if (object.type !== "Literal") return; // ESCodeGen tries to escape backslashes, here is a work-around
70
+ if (object.type !== "Literal") return;
90
71
 
91
- this.replace(object, (0, _gen.Identifier)("'".concat(escapedString, "'")));
72
+ // ESCodeGen tries to escape backslashes, here is a work-around
73
+ this.replace(object, (0, _gen.Identifier)(`'${escapedString}'`));
92
74
  };
93
75
  }
94
-
95
76
  }
96
-
97
77
  exports.default = StringEncoding;
@@ -4,69 +4,46 @@ 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 _insert = require("../../util/insert");
13
-
14
10
  var _random = require("../../util/random");
15
-
16
11
  var _order = require("../../order");
17
-
18
- var _stringConcealing = require("./stringConcealing");
19
-
20
12
  var _compare = require("../../util/compare");
21
-
22
13
  var _assert = require("assert");
23
-
24
14
  var _probability = require("../../probability");
25
-
26
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
-
28
- 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; }
29
-
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); }
30
19
  class StringSplitting extends _transform.default {
31
20
  constructor(o) {
32
21
  super(o, _order.ObfuscateOrder.StringSplitting);
33
-
34
22
  _defineProperty(this, "joinPrototype", void 0);
35
-
36
23
  _defineProperty(this, "strings", void 0);
37
-
38
24
  _defineProperty(this, "adders", void 0);
39
-
40
25
  _defineProperty(this, "vars", void 0);
41
-
42
26
  this.joinPrototype = null;
43
27
  this.strings = Object.create(null);
44
28
  this.adders = [];
45
29
  this.vars = [];
46
30
  }
47
-
48
31
  match(object, parents) {
49
- return object.type == "Literal" && typeof object.value === "string" && object.value.length >= 8 && !(0, _stringConcealing.isModuleSource)(object, parents) && !(0, _compare.isDirective)(object, parents);
32
+ return object.type == "Literal" && typeof object.value === "string" && object.value.length >= 8 && !(0, _compare.isModuleSource)(object, parents) && !(0, _compare.isDirective)(object, parents);
50
33
  }
51
-
52
34
  transform(object, parents) {
53
35
  return () => {
54
36
  var size = Math.round(Math.max(6, object.value.length / (0, _random.getRandomInteger)(3, 8)));
55
-
56
37
  if (object.value.length <= size) {
57
38
  return;
58
39
  }
59
-
60
40
  var chunks = (0, _random.splitIntoChunks)(object.value, size);
61
-
62
41
  if (!chunks || chunks.length <= 1) {
63
42
  return;
64
43
  }
65
-
66
44
  if (!(0, _probability.ComputeProbabilityMap)(this.options.stringSplitting, x => x, object.value)) {
67
45
  return;
68
46
  }
69
-
70
47
  var binaryExpression;
71
48
  var parent;
72
49
  var last = chunks.pop();
@@ -82,7 +59,5 @@ class StringSplitting extends _transform.default {
82
59
  this.replaceIdentifierOrLiteral(object, parent, parents);
83
60
  };
84
61
  }
85
-
86
62
  }
87
-
88
63
  exports.default = StringSplitting;
@@ -4,27 +4,19 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _traverse = _interopRequireDefault(require("../traverse"));
9
-
10
8
  var _gen = require("../util/gen");
11
-
12
9
  var _random = require("../util/random");
13
-
14
10
  var _assert = require("assert");
15
-
16
11
  var _obfuscator = _interopRequireDefault(require("../obfuscator"));
17
-
18
12
  var _probability = require("../probability");
19
-
20
13
  var _constants = require("../constants");
21
-
22
14
  var _order = require("../order");
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
+ var _insert = require("../util/insert");
16
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
18
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
19
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
28
20
  /**
29
21
  * Base-class for all transformations.
30
22
  * - Transformations can have preparation transformations `.before`
@@ -62,38 +54,42 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
62
54
  * ```
63
55
  */
64
56
  class Transform {
65
- /**
66
- * The obfuscator.
67
- */
68
-
69
- /**
70
- * The user's options.
71
- */
72
-
73
- /**
74
- * Only required for top-level transformations.
75
- */
76
-
77
- /**
78
- * Transforms to run before, such as `Variable Analysis`.
79
- */
80
-
81
- /**
82
- * Transforms to run after.
83
- */
84
57
  constructor(obfuscator) {
85
58
  let priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
86
-
59
+ /**
60
+ * The obfuscator.
61
+ */
87
62
  _defineProperty(this, "obfuscator", void 0);
88
-
63
+ /**
64
+ * The user's options.
65
+ */
89
66
  _defineProperty(this, "options", void 0);
90
-
67
+ /**
68
+ * Only required for top-level transformations.
69
+ */
91
70
  _defineProperty(this, "priority", void 0);
92
-
71
+ /**
72
+ * Transforms to run before, such as `Variable Analysis`.
73
+ */
93
74
  _defineProperty(this, "before", void 0);
94
-
75
+ /**
76
+ * Transforms to run after.
77
+ */
95
78
  _defineProperty(this, "after", void 0);
96
-
79
+ _defineProperty(this, "initVariables", new Map());
80
+ _defineProperty(this, "zeroWidthGenerator", (0, _random.createZeroWidthGenerator)());
81
+ _defineProperty(this, "createInitVariable", (value, parents) => {
82
+ var key = value.templates[0];
83
+ if (this.initVariables.has(key)) {
84
+ return this.initVariables.get(key);
85
+ }
86
+ var root = parents[parents.length - 1];
87
+ (0, _assert.ok)(root.type === "Program");
88
+ var name = this.getPlaceholder();
89
+ this.initVariables.set(key, name);
90
+ (0, _insert.prepend)(root, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(name, value.single().expression)));
91
+ return name;
92
+ });
97
93
  (0, _assert.ok)(obfuscator instanceof _obfuscator.default, "obfuscator should be an Obfuscator");
98
94
  this.obfuscator = obfuscator;
99
95
  this.options = this.obfuscator.options;
@@ -101,20 +97,41 @@ class Transform {
101
97
  this.before = [];
102
98
  this.after = [];
103
99
  }
100
+
104
101
  /**
105
102
  * The transformation name.
106
103
  */
107
-
108
-
109
104
  get className() {
110
105
  return _order.ObfuscateOrder[this.priority] || this.__proto__.constructor.name;
111
106
  }
107
+
112
108
  /**
113
- * Run an AST through the transformation (including `pre` and `post` transforms)
114
- * @param tree
109
+ * Gets the `Lock` transformation.
115
110
  */
111
+ get lockTransform() {
112
+ var transform = this.obfuscator.transforms["Lock"];
113
+ (0, _assert.ok)(transform, "Lock transform not created");
114
+ return transform;
115
+ }
116
116
 
117
+ /**
118
+ * Wraps the given name with the `__JS_CONFUSER_VAR__` function call.
119
+ *
120
+ * If `Rename Variables` is disabled, the name is returned as-is.
121
+ * @param name
122
+ * @returns
123
+ */
124
+ jsConfuserVar(name) {
125
+ if (!this.obfuscator.transforms["RenameVariables"]) {
126
+ return `"${name}"`;
127
+ }
128
+ return `__JS_CONFUSER_VAR__(${name})`;
129
+ }
117
130
 
131
+ /**
132
+ * Run an AST through the transformation (including `pre` and `post` transforms)
133
+ * @param tree
134
+ */
118
135
  apply(tree) {
119
136
  if (tree.type == "Program" && this.options.verbose) {
120
137
  if (this.priority === -1) {
@@ -123,25 +140,25 @@ class Transform {
123
140
  console.log("#", this.priority, this.className);
124
141
  }
125
142
  }
143
+
126
144
  /**
127
145
  * Run through pre-transformations
128
146
  */
129
-
130
-
131
147
  this.before.forEach(x => x.apply(tree));
148
+
132
149
  /**
133
150
  * Run this transformation
134
151
  */
135
-
136
152
  (0, _traverse.default)(tree, (object, parents) => {
137
153
  return this.input(object, parents);
138
154
  });
155
+
139
156
  /**
140
157
  * Cleanup transformations
141
158
  */
142
-
143
159
  this.after.forEach(x => x.apply(tree));
144
160
  }
161
+
145
162
  /**
146
163
  * The `match` function filters for possible candidates.
147
164
  *
@@ -152,11 +169,10 @@ class Transform {
152
169
  * @param parents
153
170
  * @param block
154
171
  */
155
-
156
-
157
172
  match(object, parents) {
158
173
  throw new Error("not implemented");
159
174
  }
175
+
160
176
  /**
161
177
  * Modifies the given node.
162
178
  *
@@ -167,22 +183,20 @@ class Transform {
167
183
  * @param parents - Array of ancestors `[Closest, ..., Root]`
168
184
  * @param block
169
185
  */
170
-
171
-
172
186
  transform(object, parents) {
173
187
  throw new Error("not implemented");
174
188
  }
189
+
175
190
  /**
176
191
  * Calls `.match` with the given parameters, and then `.transform` if satisfied.
177
192
  * @private
178
193
  */
179
-
180
-
181
194
  input(object, parents) {
182
195
  if (this.match(object, parents)) {
183
196
  return this.transform(object, parents);
184
197
  }
185
198
  }
199
+
186
200
  /**
187
201
  * Returns a random string.
188
202
  *
@@ -190,115 +204,88 @@ class Transform {
190
204
  *
191
205
  * These long temp names will be converted to short, mangled names by RenameVariables.
192
206
  */
193
-
194
-
195
207
  getPlaceholder() {
196
208
  const genRanHex = size => [...Array(size)].map(() => Math.floor(Math.random() * 10).toString(10)).join("");
197
-
198
209
  return _constants.placeholderVariablePrefix + genRanHex(10);
199
210
  }
211
+
200
212
  /**
201
213
  * Returns an independent name generator with it's own counter.
202
214
  * @param overrideMode - Override the user's `identifierGenerator` option
203
215
  * @returns
204
216
  */
205
-
206
-
207
217
  getGenerator(overrideMode) {
208
218
  var count = 0;
209
219
  var identifiers = new Set();
210
220
  return {
211
221
  generate: () => {
212
222
  var retValue;
213
-
214
223
  do {
215
224
  count++;
216
225
  retValue = this.generateIdentifier(-1, count, overrideMode);
217
226
  } while (identifiers.has(retValue));
218
-
219
227
  identifiers.add(retValue);
220
228
  return retValue;
221
229
  }
222
230
  };
223
231
  }
232
+
224
233
  /**
225
234
  * Generates a valid variable name.
226
235
  * @param length Default length is 6 to 10 characters.
227
236
  * @returns **`string`**
228
237
  */
229
-
230
-
231
238
  generateIdentifier() {
239
+ var _this = this;
232
240
  let length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : -1;
233
241
  let count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
234
242
  let overrideMode = arguments.length > 2 ? arguments[2] : undefined;
235
-
236
243
  if (length == -1) {
237
244
  length = (0, _random.getRandomInteger)(6, 8);
238
245
  }
239
-
240
246
  var set = new Set();
241
-
242
247
  if (count == -1) {
243
248
  this.obfuscator.varCount++;
244
249
  count = this.obfuscator.varCount;
245
250
  set = this.obfuscator.generated;
246
251
  }
247
-
248
252
  var identifier;
249
-
250
253
  do {
251
254
  identifier = (0, _probability.ComputeProbabilityMap)(overrideMode || this.options.identifierGenerator, function () {
252
255
  let mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "randomized";
253
-
254
256
  switch (mode) {
255
257
  case "randomized":
256
258
  var characters = "_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");
257
259
  var numbers = "0123456789".split("");
258
260
  var combined = [...characters, ...numbers];
259
261
  var result = "";
260
-
261
262
  for (var i = 0; i < length; i++) {
262
263
  result += (0, _random.choice)(i == 0 ? characters : combined);
263
264
  }
264
-
265
265
  return result;
266
-
267
266
  case "hexadecimal":
268
267
  const genRanHex = size => [...Array(size)].map(() => Math.floor(Math.random() * 16).toString(16)).join("");
269
-
270
268
  return "_0x" + genRanHex(length).toUpperCase();
271
-
272
269
  case "mangled":
273
270
  while (1) {
274
271
  var result = (0, _random.alphabeticalGenerator)(count);
275
272
  count++;
276
-
277
273
  if (_constants.reservedKeywords.has(result) || _constants.reservedIdentifiers.has(result)) {} else {
278
274
  return result;
279
275
  }
280
276
  }
281
-
282
277
  throw new Error("impossible but TypeScript insists");
283
-
284
278
  case "number":
285
279
  return "var_" + count;
286
-
287
280
  case "zeroWidth":
288
- var keyWords = ["if", "in", "for", "let", "new", "try", "var", "case", "else", "null", "break", "catch", "class", "const", "super", "throw", "while", "yield", "delete", "export", "import", "public", "return", "switch", "default", "finally", "private", "continue", "debugger", "function", "arguments", "protected", "instanceof", "function", "await", "async"];
289
- var safe = "\u200C".repeat(count + 1);
290
- var base = (0, _random.choice)(keyWords) + safe;
291
- return base;
281
+ return _this.zeroWidthGenerator.generate();
292
282
  }
293
-
294
283
  throw new Error("Invalid 'identifierGenerator' mode: " + mode);
295
284
  });
296
285
  } while (set.has(identifier));
297
-
298
286
  if (!identifier) {
299
287
  throw new Error("identifier null");
300
288
  }
301
-
302
289
  set.add(identifier);
303
290
  return identifier;
304
291
  }
@@ -309,33 +296,27 @@ class Transform {
309
296
  * @param text
310
297
  * @param i
311
298
  */
312
-
313
-
314
299
  addComment(node, text) {
315
300
  if (this.options.debugComments) {
316
- return (0, _gen.AddComment)(node, "[".concat(this.className, "] ").concat(text));
301
+ return (0, _gen.AddComment)(node, `[${this.className}] ${text}`);
317
302
  }
318
-
319
303
  return node;
320
304
  }
321
-
322
305
  replace(node1, node2) {
323
306
  for (var key in node1) {
324
307
  delete node1[key];
325
308
  }
326
-
327
309
  this.objectAssign(node1, node2);
328
310
  }
329
-
330
311
  replaceIdentifierOrLiteral(node1, node2, parents) {
331
312
  // Fix 2. Make parent property key computed
332
313
  if (parents[0] && (parents[0].type == "Property" || parents[0].type == "MethodDefinition") && parents[0].key == node1) {
333
314
  parents[0].computed = true;
334
315
  parents[0].shorthand = false;
335
316
  }
336
-
337
317
  this.replace(node1, node2);
338
318
  }
319
+
339
320
  /**
340
321
  * Smartly merges two Nodes.
341
322
  * - Null checking
@@ -343,8 +324,6 @@ class Transform {
343
324
  * @param node1
344
325
  * @param node2
345
326
  */
346
-
347
-
348
327
  objectAssign(node1, node2) {
349
328
  (0, _assert.ok)(node1);
350
329
  (0, _assert.ok)(node2);
@@ -355,46 +334,39 @@ class Transform {
355
334
  node1._transform = node2._transform = this.className;
356
335
  return Object.assign(node1, node2);
357
336
  }
337
+
358
338
  /**
359
339
  * Verbose logging for this transformation.
360
340
  * @param messages
361
341
  */
362
-
363
-
364
342
  log() {
365
343
  if (this.options.verbose) {
366
344
  for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {
367
345
  messages[_key] = arguments[_key];
368
346
  }
369
-
370
347
  console.log("[" + this.className + "]", ...messages);
371
348
  }
372
349
  }
350
+
373
351
  /**
374
352
  * Verbose logging for warning/important messages.
375
353
  * @param messages
376
354
  */
377
-
378
-
379
355
  warn() {
380
356
  if (this.options.verbose) {
381
357
  for (var _len2 = arguments.length, messages = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
382
358
  messages[_key2] = arguments[_key2];
383
359
  }
384
-
385
360
  console.log("[ WARN " + this.className + " ]", ...messages);
386
361
  }
387
362
  }
363
+
388
364
  /**
389
365
  * Throws an error. Appends the transformation's name to the error's message.
390
366
  * @param error
391
367
  */
392
-
393
-
394
368
  error(error) {
395
- throw new Error("".concat(this.className, " Error: ").concat(error.message));
369
+ throw new Error(`${this.className} Error: ${error.message}`);
396
370
  }
397
-
398
371
  }
399
-
400
372
  exports.default = Transform;