js-confuser 1.7.0 → 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 (128) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +12 -29
  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 +110 -108
  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 +45 -79
  33. package/dist/transforms/extraction/objectExtraction.js +27 -54
  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 +98 -66
  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 +11 -74
  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/docs/ControlFlowFlattening.md +1 -1
  68. package/docs/ES5.md +197 -0
  69. package/package.json +3 -3
  70. package/src/constants.ts +12 -0
  71. package/src/options.ts +13 -0
  72. package/src/order.ts +2 -2
  73. package/src/templates/bufferToString.ts +49 -11
  74. package/src/templates/functionLength.ts +21 -3
  75. package/src/templates/globals.ts +3 -0
  76. package/src/templates/template.ts +85 -25
  77. package/src/transforms/antiTooling.ts +33 -11
  78. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +2 -2
  79. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
  80. package/src/transforms/deadCode.ts +0 -16
  81. package/src/transforms/dispatcher.ts +101 -69
  82. package/src/transforms/es5/antiClass.ts +10 -1
  83. package/src/transforms/extraction/classExtraction.ts +168 -0
  84. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +13 -10
  85. package/src/transforms/extraction/objectExtraction.ts +7 -14
  86. package/src/transforms/flatten.ts +20 -5
  87. package/src/transforms/identifier/globalConcealing.ts +29 -65
  88. package/src/transforms/identifier/movedDeclarations.ts +90 -24
  89. package/src/transforms/minify.ts +27 -12
  90. package/src/transforms/rgf.ts +103 -5
  91. package/src/transforms/stack.ts +12 -3
  92. package/src/transforms/string/encoding.ts +85 -51
  93. package/src/transforms/string/stringCompression.ts +5 -8
  94. package/src/transforms/string/stringConcealing.ts +139 -113
  95. package/src/transforms/string/stringEncoding.ts +1 -2
  96. package/src/transforms/string/stringSplitting.ts +1 -2
  97. package/src/transforms/transform.ts +30 -1
  98. package/src/util/compare.ts +39 -5
  99. package/src/util/gen.ts +10 -3
  100. package/src/util/identifiers.ts +6 -3
  101. package/src/util/insert.ts +17 -0
  102. package/src/util/scope.ts +14 -2
  103. package/test/code/Cash.test.ts +10 -4
  104. package/test/code/StrictMode.src.js +65 -0
  105. package/test/code/StrictMode.test.js +37 -0
  106. package/test/compare.test.ts +62 -2
  107. package/test/options.test.ts +111 -55
  108. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
  109. package/test/transforms/dispatcher.test.ts +82 -0
  110. package/test/transforms/extraction/classExtraction.test.ts +86 -0
  111. package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +29 -8
  112. package/test/transforms/extraction/objectExtraction.test.ts +37 -15
  113. package/test/transforms/identifier/globalConcealing.test.ts +42 -2
  114. package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
  115. package/test/transforms/lock/integrity.test.ts +24 -0
  116. package/test/transforms/minify.test.ts +37 -0
  117. package/test/transforms/rgf.test.ts +50 -0
  118. package/test/util/identifiers.test.ts +21 -0
  119. package/dist/transforms/controlFlowFlattening/choiceFlowObfuscation.js +0 -62
  120. package/dist/transforms/controlFlowFlattening/controlFlowObfuscation.js +0 -159
  121. package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +0 -106
  122. package/dist/transforms/eval.js +0 -84
  123. package/dist/transforms/hexadecimalNumbers.js +0 -63
  124. package/dist/transforms/hideInitializingCode.js +0 -270
  125. package/dist/transforms/identifier/nameRecycling.js +0 -218
  126. package/dist/transforms/label.js +0 -67
  127. package/dist/transforms/preparation/nameConflicts.js +0 -116
  128. package/dist/transforms/preparation/preparation.js +0 -188
@@ -4,21 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _assert = require("assert");
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 _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
-
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
14
  /**
23
15
  * Removes destructuring from function parameters.
24
16
  *
@@ -45,27 +37,25 @@ class AntiDestructuringParameters extends _transform.default {
45
37
  constructor(o) {
46
38
  super(o);
47
39
  }
48
-
49
40
  match(object, parents) {
50
41
  return (object.param || object.params) && object.body;
51
42
  }
52
-
53
43
  transform(object, parents) {
54
44
  return () => {
55
45
  if (object.param) {
56
46
  // Catch clause
57
47
  if (object.param.type != "Identifier") {
58
48
  var catchName = this.getPlaceholder();
59
- var cloned = { ...object.param
49
+ var cloned = {
50
+ ...object.param
60
51
  };
61
52
  object.param = (0, _gen.Identifier)(catchName);
62
53
  (0, _insert.getBlockBody)(object.body).unshift((0, _gen.VariableDeclaration)([(0, _gen.VariableDeclarator)(cloned, (0, _gen.Identifier)(catchName))]));
63
54
  }
64
-
65
55
  return;
66
- } // For function parameters
67
-
56
+ }
68
57
 
58
+ // For function parameters
69
59
  var isDestructed = false;
70
60
  var parameters = object.params;
71
61
  (0, _traverse.walk)(parameters, [object, ...parents], (o, p) => {
@@ -74,26 +64,27 @@ class AntiDestructuringParameters extends _transform.default {
74
64
  return "EXIT";
75
65
  }
76
66
  });
77
-
78
67
  if (isDestructed) {
79
68
  if (object.expression) {
80
- object.body = (0, _gen.BlockStatement)([(0, _gen.ReturnStatement)({ ...object.body
69
+ object.body = (0, _gen.BlockStatement)([(0, _gen.ReturnStatement)({
70
+ ...object.body
81
71
  })]);
82
72
  } else if (object.body.type != "BlockStatement") {
83
- object.body = (0, _gen.BlockStatement)([{ ...object.body
73
+ object.body = (0, _gen.BlockStatement)([{
74
+ ...object.body
84
75
  }]);
85
76
  }
77
+ var arrayPattern = (0, _gen.ArrayPattern)(parameters);
86
78
 
87
- var arrayPattern = (0, _gen.ArrayPattern)(parameters); // `arguments` is not allowed in arrow functions
88
-
79
+ // `arguments` is not allowed in arrow functions
89
80
  if (object.type == "ArrowFunctionExpression" && !object.params.find(x => x.type == "RestElement")) {
90
81
  // new names
82
+
91
83
  object.params = Array(object.params.length).fill(0).map(() => (0, _gen.Identifier)(this.getPlaceholder()));
92
84
  (0, _insert.getBlockBody)(object.body).unshift((0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(arrayPattern, (0, _gen.ArrayExpression)(object.params))));
93
85
  } else {
94
86
  object.params = [];
95
- (0, _insert.getBlockBody)(object.body).unshift((0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(arrayPattern, (0, _template.default)("Array.prototype.slice.call(arguments)").single().expression)));
96
-
87
+ (0, _insert.getBlockBody)(object.body).unshift((0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(arrayPattern, (0, _template.default)(`Array.prototype.slice.call(arguments)`).single().expression)));
97
88
  if (object.type == "ArrowFunctionExpression") {
98
89
  object.type = "FunctionExpression";
99
90
  object.expression = false;
@@ -103,23 +94,19 @@ class AntiDestructuringParameters extends _transform.default {
103
94
  }
104
95
  };
105
96
  }
106
-
107
97
  }
98
+
108
99
  /**
109
100
  * Removes destructuring so the script can work in ES5 environments.
110
101
  */
111
-
112
-
113
102
  class AntiDestructuring extends _transform.default {
114
103
  constructor(o) {
115
104
  super(o);
116
105
  this.before.push(new AntiDestructuringParameters(o));
117
106
  }
118
-
119
107
  match(object, parents) {
120
108
  return object.type == "AssignmentExpression" || object.type == "VariableDeclarator";
121
109
  }
122
-
123
110
  transform(object, parents) {
124
111
  var block = (0, _traverse.getBlock)(object, parents);
125
112
  var body = (0, _insert.getBlockBody)(block);
@@ -128,9 +115,7 @@ class AntiDestructuring extends _transform.default {
128
115
  var names = new Set();
129
116
  var operator = "=";
130
117
  var id = null; // The object being set
131
-
132
118
  var extracting = null; // The object being extracted from
133
-
134
119
  if (object.type == "AssignmentExpression") {
135
120
  id = object.left;
136
121
  extracting = object.right;
@@ -141,20 +126,16 @@ class AntiDestructuring extends _transform.default {
141
126
  } else {
142
127
  (0, _assert.ok)(false);
143
128
  }
144
-
145
129
  var should = false;
146
130
  (0, _traverse.walk)(id, [], (o, p) => {
147
131
  if (o.type && o.type.includes("Pattern")) {
148
132
  should = true;
149
133
  }
150
134
  });
151
-
152
135
  if (should) {
153
136
  (0, _insert.prepend)(block, (0, _gen.VariableDeclaration)([(0, _gen.VariableDeclarator)((0, _gen.Identifier)(temp))]));
154
-
155
137
  const recursive = (x, realm) => {
156
138
  realm = (0, _insert.clone)(realm);
157
-
158
139
  if (x.type == "Identifier") {
159
140
  exprs.push((0, _gen.AssignmentExpression)(operator, (0, _insert.clone)(x), realm));
160
141
  names.add(x.name);
@@ -171,7 +152,6 @@ class AntiDestructuring extends _transform.default {
171
152
  if (i != x.elements.length - 1) {
172
153
  this.error(new Error("Uncaught SyntaxError: Rest element must be last element"));
173
154
  }
174
-
175
155
  recursive(element.argument, (0, _gen.CallExpression)((0, _gen.MemberExpression)(realm, (0, _gen.Identifier)("slice"), false), [(0, _gen.Literal)(i)]));
176
156
  } else {
177
157
  recursive(element, (0, _gen.MemberExpression)(realm, (0, _gen.Literal)(i), true));
@@ -185,11 +165,9 @@ class AntiDestructuring extends _transform.default {
185
165
  throw new Error("unknown type: " + x.type);
186
166
  }
187
167
  };
188
-
189
168
  recursive(id, (0, _gen.Identifier)(temp));
190
169
  return () => {
191
170
  var seq = (0, _gen.SequenceExpression)([(0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(temp), (0, _insert.clone)(extracting) || (0, _gen.Identifier)("undefined")), ...exprs]);
192
-
193
171
  if (object.type == "VariableDeclarator") {
194
172
  var i = (0, _insert.getIndexDirect)(object, parents[0]);
195
173
  var extra = Array.from(names).map(x => {
@@ -211,7 +189,5 @@ class AntiDestructuring extends _transform.default {
211
189
  };
212
190
  }
213
191
  }
214
-
215
192
  }
216
-
217
193
  exports.default = AntiDestructuring;
@@ -4,41 +4,35 @@ 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 _traverse = require("../../traverse");
15
-
16
11
  var _template = _interopRequireDefault(require("../../templates/template"));
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ 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; }
14
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
15
+ 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); }
16
+ var HelperFunctions = (0, _template.default)(`
17
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
17
18
 
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
19
20
 
20
21
  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; }
21
-
22
- var HelperFunctions = (0, _template.default)("\n function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _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; }\n ");
23
-
22
+ `);
24
23
  class AntiSpread extends _transform.default {
25
24
  constructor(o) {
26
25
  super(o);
27
-
28
26
  _defineProperty(this, "helper", void 0);
29
-
30
27
  this.helper = false;
31
28
  }
32
-
33
29
  match(object, parents) {
34
30
  return object.type == "ObjectExpression" || object.type == "ArrayExpression";
35
31
  }
36
-
37
32
  transform(object, parents) {
38
33
  return () => {
39
34
  if (object.type == "ArrayExpression") {
40
35
  var spreadIndex = object.elements.findIndex(x => x.type == "SpreadElement");
41
-
42
36
  if (spreadIndex !== -1) {
43
37
  var after = object.elements.slice(spreadIndex);
44
38
  var groups = [];
@@ -49,11 +43,9 @@ class AntiSpread extends _transform.default {
49
43
  if (!groups.length) {
50
44
  groups.push((0, _gen.ArrayExpression)([]));
51
45
  }
52
-
53
46
  if (groups[groups.length - 1].type != "ArrayExpression") {
54
47
  groups.push((0, _gen.ArrayExpression)([]));
55
48
  }
56
-
57
49
  groups[groups.length - 1].elements.push(element);
58
50
  }
59
51
  });
@@ -64,24 +56,20 @@ class AntiSpread extends _transform.default {
64
56
  }
65
57
  } else if (object.type == "ObjectExpression") {
66
58
  var spreadIndex;
67
-
68
59
  while (true) {
69
60
  spreadIndex = object.properties.findIndex(x => x.type == "SpreadElement");
70
-
71
61
  if (spreadIndex === -1) {
72
62
  break;
73
- } // add helper functions only once
74
-
63
+ }
75
64
 
65
+ // add helper functions only once
76
66
  if (!this.helper) {
77
67
  this.helper = true;
78
68
  (0, _insert.prepend)(parents[parents.length - 1], ...HelperFunctions.compile());
79
69
  }
80
-
81
70
  var before = object.properties.slice(0, spreadIndex);
82
71
  var after = object.properties.slice(spreadIndex + 1);
83
72
  var call = (0, _gen.CallExpression)((0, _gen.Identifier)("_objectSpread"), [(0, _gen.ObjectExpression)(before), object.properties[spreadIndex].argument]);
84
-
85
73
  if (after.length) {
86
74
  var newObject = (0, _gen.ObjectExpression)(after);
87
75
  this.replace(object, (0, _gen.CallExpression)((0, _gen.Identifier)("_objectSpread"), [call, newObject]));
@@ -94,23 +82,17 @@ class AntiSpread extends _transform.default {
94
82
  }
95
83
  };
96
84
  }
97
-
98
85
  }
99
-
100
86
  class AntiES6Object extends _transform.default {
101
87
  constructor(o) {
102
88
  super(o);
103
-
104
89
  _defineProperty(this, "makerFn", void 0);
105
-
106
90
  this.makerFn = null;
107
91
  this.after.push(new AntiSpread(o));
108
92
  }
109
-
110
93
  match(object, parents) {
111
94
  return object.type == "ObjectExpression";
112
95
  }
113
-
114
96
  transform(object, parents) {
115
97
  return () => {
116
98
  var block = (0, _traverse.getBlock)(object, parents);
@@ -119,54 +101,66 @@ class AntiES6Object extends _transform.default {
119
101
  if (property.type == "SpreadElement") {
120
102
  needsChanging = true;
121
103
  return;
122
- } // AntiShorthand
123
-
104
+ }
124
105
 
106
+ // AntiShorthand
125
107
  object.shorthand = false;
126
-
127
108
  if (!property.key) {
128
109
  this.error(new Error("Property missing key"));
129
110
  }
130
-
131
111
  if (!["Literal", "Identifier"].includes(property.key.type)) {
132
112
  property.computed = true;
133
113
  }
134
-
135
114
  if (property.computed && property.key.type == "Literal") {
136
115
  property.computed = false;
137
116
  }
138
-
139
117
  if (property.kind != "init" || property.method || property.computed) {
140
118
  needsChanging = true;
141
119
  }
142
120
  });
143
-
144
121
  if (needsChanging) {
145
122
  if (!this.makerFn) {
146
123
  this.makerFn = this.getPlaceholder();
147
- (0, _insert.prepend)(parents[parents.length - 1] || block, (0, _template.default)("\n function {name}(base, computedProps, getters, setters){\n\n for ( var i = 0; i < computedProps.length; i++ ) {\n base[computedProps[i][0]] = computedProps[i][1];\n }\n\n var keys=Object.create(null);\n Object.keys(getters).forEach(key=>(keys[key] = 1))\n Object.keys(setters).forEach(key=>(keys[key] = 1))\n\n Object.keys(keys).forEach(key=>{\n Object.defineProperty(base, key, {\n set: setters[key],\n get: getters[key],\n configurable: true\n });\n })\n return base; \n }\n ").single({
148
- name: this.makerFn
149
- }));
150
- } // {a: 1} Es5 compliant properties
151
-
124
+ (0, _insert.prepend)(parents[parents.length - 1] || block, (0, _template.default)(`
125
+ function {name}(base, computedProps, getters, setters){
152
126
 
153
- var baseProps = []; // {[a]: 1} -> Computed props to array [a, 1]
127
+ for ( var i = 0; i < computedProps.length; i++ ) {
128
+ base[computedProps[i][0]] = computedProps[i][1];
129
+ }
154
130
 
155
- var computedProps = []; // {get a(){}} -> Property descriptors
131
+ var keys=Object.create(null);
132
+ Object.keys(getters).forEach(key=>(keys[key] = 1))
133
+ Object.keys(setters).forEach(key=>(keys[key] = 1))
134
+
135
+ Object.keys(keys).forEach(key=>{
136
+ Object.defineProperty(base, key, {
137
+ set: setters[key],
138
+ get: getters[key],
139
+ configurable: true
140
+ });
141
+ })
142
+ return base;
143
+ }
144
+ `).single({
145
+ name: this.makerFn
146
+ }));
147
+ }
156
148
 
149
+ // {a: 1} Es5 compliant properties
150
+ var baseProps = [];
151
+ // {[a]: 1} -> Computed props to array [a, 1]
152
+ var computedProps = [];
153
+ // {get a(){}} -> Property descriptors
157
154
  var getters = (0, _gen.ObjectExpression)([]);
158
155
  var setters = (0, _gen.ObjectExpression)([]);
159
156
  object.properties.forEach(prop => {
160
157
  var key = prop.key;
161
-
162
158
  if (!key) {
163
159
  return;
164
160
  }
165
-
166
161
  if (key.type == "Identifier" && !prop.computed) {
167
162
  key = (0, _gen.Literal)(key.name);
168
163
  }
169
-
170
164
  if (prop.computed) {
171
165
  var array = [prop.key, prop.value];
172
166
  computedProps.push((0, _gen.ArrayExpression)(array));
@@ -181,14 +175,11 @@ class AntiES6Object extends _transform.default {
181
175
  baseProps.push(prop);
182
176
  }
183
177
  });
184
-
185
178
  if (setters.properties.length || getters.properties.length || computedProps.length) {
186
179
  this.objectAssign(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.makerFn), [(0, _gen.ObjectExpression)(baseProps), (0, _gen.ArrayExpression)(computedProps), getters, setters]));
187
180
  }
188
181
  }
189
182
  };
190
183
  }
191
-
192
184
  }
193
-
194
185
  exports.default = AntiES6Object;
@@ -4,41 +4,32 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _gen = require("../../util/gen");
9
-
10
8
  var _insert = require("../../util/insert");
11
-
12
9
  var _transform = _interopRequireDefault(require("../transform"));
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
11
  // fn(...args) -> fn.apply(this, [...args])
17
12
  class AntiSpreadOperator extends _transform.default {
18
13
  constructor(o) {
19
14
  super(o);
20
15
  }
21
-
22
16
  match(object, parents) {
23
17
  return object.type == "CallExpression" && object.arguments.find(x => x.type == "SpreadElement");
24
18
  }
25
-
26
19
  transform(object, parents) {
27
20
  return () => {
28
21
  var ref;
29
-
30
22
  if (object.callee.type == "MemberExpression") {
31
23
  ref = this.getPlaceholder();
32
- object.callee.object = (0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(ref), { ...object.callee.object
24
+ object.callee.object = (0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(ref), {
25
+ ...object.callee.object
33
26
  });
34
27
  (0, _insert.prepend)(parents[parents.length - 1], (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(ref)));
35
28
  }
36
-
37
- this.replace(object, (0, _gen.CallExpression)((0, _gen.MemberExpression)({ ...object.callee
29
+ this.replace(object, (0, _gen.CallExpression)((0, _gen.MemberExpression)({
30
+ ...object.callee
38
31
  }, (0, _gen.Identifier)("apply"), false), [ref ? (0, _gen.Identifier)(ref) : (0, _gen.ThisExpression)(), (0, _gen.ArrayExpression)(object.arguments)]));
39
32
  };
40
33
  }
41
-
42
34
  }
43
-
44
35
  exports.default = AntiSpreadOperator;
@@ -4,37 +4,28 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _template = _interopRequireDefault(require("../../templates/template"));
9
-
10
8
  var _gen = require("../../util/gen");
11
-
12
9
  var _insert = require("../../util/insert");
13
-
14
10
  var _transform = _interopRequireDefault(require("../transform"));
15
-
16
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
18
- 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; }
19
-
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ 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; }
13
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
14
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
20
15
  class AntiTemplate extends _transform.default {
21
16
  constructor(o) {
22
17
  super(o);
23
-
24
18
  _defineProperty(this, "makerFn", void 0);
25
19
  }
26
-
27
20
  match(object, parents) {
28
21
  return object.type == "TemplateLiteral" || object.type == "TaggedTemplateExpression";
29
22
  }
30
-
31
23
  transform(object, parents) {
32
24
  return () => {
33
25
  if (object.type == "TemplateLiteral") {
34
26
  if (parents[0].type == "TaggedTemplateExpression" && parents[0].quasi == object) {
35
27
  return;
36
28
  }
37
-
38
29
  if (object.quasis.length == 1 && object.expressions.length == 0) {
39
30
  this.replace(object, (0, _gen.Literal)(object.quasis[0].value.cooked));
40
31
  } else {
@@ -42,7 +33,6 @@ class AntiTemplate extends _transform.default {
42
33
  object.quasis.forEach((q, i) => {
43
34
  var expr = object.expressions[i];
44
35
  var str = (0, _gen.Literal)(q.value.cooked);
45
-
46
36
  if (!binaryExpression) {
47
37
  binaryExpression = (0, _gen.BinaryExpression)("+", str, expr);
48
38
  } else {
@@ -57,19 +47,20 @@ class AntiTemplate extends _transform.default {
57
47
  }
58
48
  } else if (object.type == "TaggedTemplateExpression") {
59
49
  var literal = object.quasi;
60
-
61
50
  if (!this.makerFn) {
62
51
  this.makerFn = "es6_template" + this.getPlaceholder();
63
- (0, _insert.prepend)(parents[parents.length - 1], (0, _template.default)("\n function {name}(arr, raw){\n arr.raw = raw;\n return arr;\n }\n ").single({
52
+ (0, _insert.prepend)(parents[parents.length - 1], (0, _template.default)(`
53
+ function {name}(arr, raw){
54
+ arr.raw = raw;
55
+ return arr;
56
+ }
57
+ `).single({
64
58
  name: this.makerFn
65
59
  }));
66
60
  }
67
-
68
61
  this.replace(object, (0, _gen.CallExpression)(object.tag, [(0, _gen.CallExpression)((0, _gen.Identifier)(this.makerFn), [(0, _gen.ArrayExpression)(literal.quasis.map(x => (0, _gen.Literal)(x.value.cooked))), (0, _gen.ArrayExpression)(literal.quasis.map(x => (0, _gen.Literal)(x.value.raw)))]), ...literal.expressions]));
69
62
  }
70
63
  };
71
64
  }
72
-
73
65
  }
74
-
75
66
  exports.default = AntiTemplate;
@@ -4,35 +4,20 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.AntiArrowFunction = 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 _traverse = require("../../traverse");
15
-
16
11
  var _order = require("../../order");
17
-
18
12
  var _assert = require("assert");
19
-
20
13
  var _constants = require("../../constants");
21
-
22
14
  var _antiDestructuring = _interopRequireDefault(require("./antiDestructuring"));
23
-
24
15
  var _antiTemplate = _interopRequireDefault(require("./antiTemplate"));
25
-
26
16
  var _antiClass = _interopRequireDefault(require("./antiClass"));
27
-
28
17
  var _antiES6Object = _interopRequireDefault(require("./antiES6Object"));
29
-
30
18
  var _antiSpreadOperator = _interopRequireDefault(require("./antiSpreadOperator"));
31
-
32
19
  var _es = require("../../templates/es5");
33
-
34
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
35
-
20
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
36
21
  /**
37
22
  * `Const` and `Let` are not allowed in ES5.
38
23
  */
@@ -40,39 +25,31 @@ class AntiConstLet extends _transform.default {
40
25
  constructor(o) {
41
26
  super(o);
42
27
  }
43
-
44
28
  match(object, parents) {
45
29
  return object.type == "VariableDeclaration" && object.kind != "var";
46
30
  }
47
-
48
31
  transform(object) {
49
32
  object.kind = "var";
50
33
  }
51
-
52
34
  }
35
+
53
36
  /**
54
37
  * Converts arrow functions
55
38
  */
56
-
57
-
58
39
  class AntiArrowFunction extends _transform.default {
59
40
  constructor(o) {
60
41
  super(o);
61
42
  }
62
-
63
43
  match(object, parents) {
64
44
  return object.type == "ArrowFunctionExpression";
65
45
  }
66
-
67
46
  transform(object, parents) {
68
47
  return () => {
69
48
  var usesThis = false;
70
-
71
49
  if (object.body.type != "BlockStatement" && object.expression) {
72
50
  object.body = (0, _gen.BlockStatement)([(0, _gen.ReturnStatement)((0, _insert.clone)(object.body))]);
73
51
  object.expression = false;
74
52
  }
75
-
76
53
  (0, _traverse.walk)(object.body, [object, ...parents], (o, p) => {
77
54
  if (p.filter(x => (0, _traverse.isBlock)(x))[0] == object.body) {
78
55
  if (o.type == "ThisExpression" || o.type == "Identifier" && o.name == "this") {
@@ -85,24 +62,20 @@ class AntiArrowFunction extends _transform.default {
85
62
  (0, _assert.ok)(!object.body.body.find(x => Array.isArray(x)), "All elements should be statements");
86
63
  object.type = "FunctionExpression";
87
64
  object.expression = false;
88
-
89
65
  if (usesThis) {
90
66
  this.objectAssign(object, (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _insert.clone)(object), (0, _gen.Identifier)("bind"), false), [(0, _gen.ThisExpression)()]));
91
67
  }
92
68
  };
93
69
  }
94
-
95
70
  }
71
+
96
72
  /**
97
73
  * The ES5 options aims to convert ES6 and up features down to ES5-compatible code.
98
74
  *
99
75
  * The obfuscator regularly adds ES6 code (variable destructuring, spread element, etc.)
100
76
  * This transformations goal is undo only these things.
101
77
  */
102
-
103
-
104
78
  exports.AntiArrowFunction = AntiArrowFunction;
105
-
106
79
  class ES5 extends _transform.default {
107
80
  constructor(o) {
108
81
  super(o, _order.ObfuscateOrder.ES5);
@@ -114,20 +87,16 @@ class ES5 extends _transform.default {
114
87
  this.before.push(new _antiDestructuring.default(o));
115
88
  this.before.push(new AntiConstLet(o));
116
89
  }
117
-
118
90
  apply(tree) {
119
91
  super.apply(tree);
120
-
121
92
  var nodesToAdd = _es.ES5Template.compile();
122
-
123
93
  (0, _insert.prepend)(tree, ...nodesToAdd);
124
- } // FixedExpressions
125
-
94
+ }
126
95
 
96
+ // FixedExpressions
127
97
  match(object, parents) {
128
98
  return !!object.type;
129
99
  }
130
-
131
100
  transform(object, parents) {
132
101
  return () => {
133
102
  // Object.keyword -> Object["keyword"]
@@ -138,9 +107,9 @@ class ES5 extends _transform.default {
138
107
  object.computed = true;
139
108
  }
140
109
  }
141
- } // { keyword: ... } -> { "keyword": ... }
142
-
110
+ }
143
111
 
112
+ // { keyword: ... } -> { "keyword": ... }
144
113
  if (object.type == "Property") {
145
114
  if (!object.computed && object.key.type == "Identifier") {
146
115
  if (_constants.reservedKeywords.has(object.key.name)) {
@@ -150,7 +119,5 @@ class ES5 extends _transform.default {
150
119
  }
151
120
  };
152
121
  }
153
-
154
122
  }
155
-
156
123
  exports.default = ES5;