js-confuser 1.4.3 → 1.5.0

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 (42) hide show
  1. package/CHANGELOG.md +4 -1
  2. package/README.md +5 -2
  3. package/dev.js +4 -5
  4. package/dist/compiler.js +1 -1
  5. package/dist/constants.js +1 -1
  6. package/dist/index.js +5 -5
  7. package/dist/obfuscator.js +11 -3
  8. package/dist/options.js +1 -1
  9. package/dist/parser.js +2 -2
  10. package/dist/precedence.js +1 -1
  11. package/dist/presets.js +3 -3
  12. package/dist/probability.js +7 -1
  13. package/dist/transforms/calculator.js +15 -3
  14. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +79 -17
  15. package/dist/transforms/dispatcher.js +3 -1
  16. package/dist/transforms/flatten.js +2 -2
  17. package/dist/transforms/hideInitializingCode.js +8 -3
  18. package/dist/transforms/identifier/globalConcealing.js +3 -1
  19. package/dist/transforms/identifier/nameRecycling.js +2 -1
  20. package/dist/transforms/lock/integrity.js +2 -1
  21. package/dist/transforms/lock/lock.js +2 -2
  22. package/dist/transforms/rgf.js +11 -8
  23. package/dist/transforms/stack.js +2 -1
  24. package/dist/transforms/string/stringConcealing.js +3 -3
  25. package/dist/transforms/transform.js +32 -8
  26. package/dist/traverse.js +4 -2
  27. package/dist/types.js +5 -1
  28. package/dist/util/compare.js +4 -4
  29. package/dist/util/gen.js +66 -47
  30. package/dist/util/identifiers.js +4 -4
  31. package/dist/util/insert.js +25 -16
  32. package/dist/util/object.js +3 -1
  33. package/dist/util/random.js +5 -5
  34. package/dist/util/scope.js +1 -1
  35. package/package.json +11 -11
  36. package/samples/high.js +1 -198
  37. package/samples/low.js +1 -26
  38. package/samples/medium.js +1 -40
  39. package/src/presets.ts +3 -3
  40. package/src/transforms/calculator.ts +36 -5
  41. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +86 -0
  42. package/src/transforms/transform.ts +10 -2
package/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- <!-- # `1.5.0`
1
+ # `1.5.0`
2
2
  Hexadecimal Numbers
3
3
 
4
4
  - The hexadecimal representation can now be used. [#29](https://github.com/MichaelXF/js-confuser/issues/29)
@@ -8,6 +8,9 @@ Hexadecimal Numbers
8
8
 
9
9
  Uses the hexadecimal representation (`50` -> `0x32`) for numbers. (`true/false`) -->
10
10
 
11
+ - Slight improvement to `Control Flow Flattening`
12
+ - Slight improvement to `Calculator`
13
+
11
14
  # `1.4.3`
12
15
  Minify Fix
13
16
 
package/README.md CHANGED
@@ -115,9 +115,9 @@ JsConfuser.obfuscate(`<source code>`, {
115
115
 
116
116
  Remove's whitespace from the final output. Enabled by default. (`true/false`)
117
117
 
118
- <!-- ### `hexadecimalNumbers`
118
+ ### `hexadecimalNumbers`
119
119
 
120
- Uses the hexadecimal representation (`50` -> `0x32`) for numbers. (`true/false`) -->
120
+ Uses the hexadecimal representation (`50` -> `0x32`) for numbers. (`true/false`)
121
121
 
122
122
  ### `minify`
123
123
 
@@ -532,6 +532,7 @@ function iVQoGQD(...iVQoGQD){
532
532
 
533
533
  calculator: true,
534
534
  compact: true,
535
+ hexadecimalNumbers: true,
535
536
  controlFlowFlattening: 0.75,
536
537
  deadCode: 0.2,
537
538
  dispatcher: true,
@@ -566,6 +567,7 @@ function iVQoGQD(...iVQoGQD){
566
567
 
567
568
  calculator: true,
568
569
  compact: true,
570
+ hexadecimalNumbers: true,
569
571
  controlFlowFlattening: 0.5,
570
572
  deadCode: 0.025,
571
573
  dispatcher: 0.75,
@@ -594,6 +596,7 @@ function iVQoGQD(...iVQoGQD){
594
596
 
595
597
  calculator: true,
596
598
  compact: true,
599
+ hexadecimalNumbers: true,
597
600
  controlFlowFlattening: 0.25,
598
601
  deadCode: 0.01,
599
602
  dispatcher: 0.5,
package/dev.js CHANGED
@@ -1,9 +1,8 @@
1
1
  require("@babel/register")({
2
- presets: [
3
- ["@babel/preset-env", { targets: { esmodules: true } }],
4
- "@babel/preset-typescript",
5
- ],
6
- extensions: [".js", ".jsx", ".ts", ".tsx"],
2
+ presets: ["@babel/preset-typescript"],
3
+ extensions: [".js", ".ts"],
4
+ cache: true,
5
+ retainLines: true,
7
6
  });
8
7
 
9
8
  module.exports = require("./dev.ts");
package/dist/compiler.js CHANGED
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = compileJs;
7
6
  exports.compileJsSync = compileJsSync;
7
+ exports.default = compileJs;
8
8
 
9
9
  const escodegen = require("escodegen");
10
10
 
package/dist/constants.js CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.reservedIdentifiers = exports.reservedKeywords = void 0;
6
+ exports.reservedKeywords = exports.reservedIdentifiers = void 0;
7
7
 
8
8
  /**
9
9
  * Keywords disallowed for variable names in ES5 and under.
package/dist/index.js CHANGED
@@ -3,8 +3,6 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.obfuscate = obfuscate;
7
- exports.obfuscateAST = obfuscateAST;
8
6
  Object.defineProperty(exports, "Obfuscator", {
9
7
  enumerable: true,
10
8
  get: function () {
@@ -17,13 +15,15 @@ Object.defineProperty(exports, "Transform", {
17
15
  return _transform.default;
18
16
  }
19
17
  });
18
+ exports.default = exports.debugTransformations = exports.debugObfuscation = void 0;
19
+ exports.obfuscate = obfuscate;
20
+ exports.obfuscateAST = obfuscateAST;
20
21
  Object.defineProperty(exports, "presets", {
21
22
  enumerable: true,
22
23
  get: function () {
23
24
  return _presets.default;
24
25
  }
25
26
  });
26
- exports.default = exports.debugObfuscation = exports.debugTransformations = void 0;
27
27
 
28
28
  var _compiler = _interopRequireWildcard(require("./compiler"));
29
29
 
@@ -43,9 +43,9 @@ var _options = require("./options");
43
43
 
44
44
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
45
45
 
46
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
46
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
47
47
 
48
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
48
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
49
49
 
50
50
  /**
51
51
  * **JsConfuser**: Obfuscates JavaScript.
@@ -78,7 +78,10 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
78
78
  */
79
79
  class Obfuscator extends _events.EventEmitter {
80
80
  constructor(options) {
81
+ var _this;
82
+
81
83
  super();
84
+ _this = this;
82
85
  this.options = options;
83
86
 
84
87
  _defineProperty(this, "varCount", void 0);
@@ -97,10 +100,14 @@ class Obfuscator extends _events.EventEmitter {
97
100
  this.push(new _preparation.default(this));
98
101
  this.push(new _renameLabels.default(this));
99
102
 
100
- const test = (map, ...transformers) => {
103
+ const test = function (map) {
101
104
  if ((0, _probability.isProbabilityMapProbable)(map)) {
105
+ for (var _len = arguments.length, transformers = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
106
+ transformers[_key - 1] = arguments[_key];
107
+ }
108
+
102
109
  // options.verbose && console.log("+ Added " + transformer.name);
103
- transformers.forEach(Transformer => this.push(new Transformer(this)));
110
+ transformers.forEach(Transformer => _this.push(new Transformer(_this)));
104
111
  } else {// options.verbose && console.log("- Skipped adding " + transformer.name);
105
112
  }
106
113
  }; // Optimization: Only add needed transformers. If a probability always return false, no need in running that extra code.
@@ -156,7 +163,8 @@ class Obfuscator extends _events.EventEmitter {
156
163
  this.state = "transform";
157
164
  }
158
165
 
159
- async apply(tree, debugMode = false) {
166
+ async apply(tree) {
167
+ let debugMode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
160
168
  (0, _assert.ok)(tree.type == "Program", "The root node must be type 'Program'");
161
169
  (0, _assert.ok)(Array.isArray(tree.body), "The root's body property must be an array");
162
170
  (0, _assert.ok)(Array.isArray(this.array));
package/dist/options.js CHANGED
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.validateOptions = validateOptions;
7
6
  exports.correctOptions = correctOptions;
7
+ exports.validateOptions = validateOptions;
8
8
 
9
9
  var _assert = require("assert");
10
10
 
package/dist/parser.js CHANGED
@@ -9,9 +9,9 @@ exports.parseSync = parseSync;
9
9
 
10
10
  var assert = _interopRequireWildcard(require("assert"));
11
11
 
12
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
12
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
13
13
 
14
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
14
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
15
15
 
16
16
  const acorn = require("acorn");
17
17
  /**
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.EXPRESSIONS_PRECEDENCE = exports.NEEDS_PARENTHESES = exports.OPERATOR_PRECEDENCE = void 0;
6
+ exports.OPERATOR_PRECEDENCE = exports.NEEDS_PARENTHESES = exports.EXPRESSIONS_PRECEDENCE = void 0;
7
7
  const OPERATOR_PRECEDENCE = {
8
8
  "||": 3,
9
9
  "&&": 4,
package/dist/presets.js CHANGED
@@ -33,7 +33,7 @@ const highPreset = {
33
33
  preset: "high",
34
34
  calculator: true,
35
35
  compact: true,
36
- hexadecimalNumbers: false,
36
+ hexadecimalNumbers: true,
37
37
  controlFlowFlattening: 0.75,
38
38
  deadCode: 0.2,
39
39
  dispatcher: true,
@@ -70,7 +70,7 @@ const mediumPreset = {
70
70
  preset: "medium",
71
71
  calculator: true,
72
72
  compact: true,
73
- hexadecimalNumbers: false,
73
+ hexadecimalNumbers: true,
74
74
  controlFlowFlattening: 0.5,
75
75
  deadCode: 0.025,
76
76
  dispatcher: 0.75,
@@ -98,7 +98,7 @@ const lowPreset = {
98
98
  preset: "low",
99
99
  calculator: true,
100
100
  compact: true,
101
- hexadecimalNumbers: false,
101
+ hexadecimalNumbers: true,
102
102
  controlFlowFlattening: 0.25,
103
103
  deadCode: 0.01,
104
104
  dispatcher: 0.5,
@@ -16,7 +16,9 @@ var _object = require("./util/object");
16
16
  * @param runner Custom function to determine return value
17
17
  * @param customFnArgs Args given to user-implemented function, such as a variable name.
18
18
  */
19
- function ComputeProbabilityMap(map, runner = x => x, ...customFnArgs) {
19
+ function ComputeProbabilityMap(map) {
20
+ let runner = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x => x;
21
+
20
22
  if (!map) {
21
23
  return runner();
22
24
  }
@@ -30,6 +32,10 @@ function ComputeProbabilityMap(map, runner = x => x, ...customFnArgs) {
30
32
  }
31
33
 
32
34
  if (typeof map === "function") {
35
+ for (var _len = arguments.length, customFnArgs = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
36
+ customFnArgs[_key - 2] = arguments[_key];
37
+ }
38
+
33
39
  return map(...customFnArgs);
34
40
  }
35
41
 
@@ -19,6 +19,8 @@ var _assert = require("assert");
19
19
 
20
20
  var _precedence = require("../precedence");
21
21
 
22
+ var _template = _interopRequireDefault(require("../templates/template"));
23
+
22
24
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
25
 
24
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; }
@@ -35,9 +37,15 @@ class Calculator extends _transform.default {
35
37
 
36
38
  _defineProperty(this, "calculatorFn", void 0);
37
39
 
40
+ _defineProperty(this, "calculatorOpVar", void 0);
41
+
42
+ _defineProperty(this, "calculatorSetOpFn", void 0);
43
+
38
44
  this.ops = Object.create(null);
39
45
  this.statesUsed = new Set();
40
46
  this.calculatorFn = this.getPlaceholder();
47
+ this.calculatorOpVar = this.getPlaceholder();
48
+ this.calculatorSetOpFn = this.getPlaceholder();
41
49
  this.gen = this.getGenerator();
42
50
  }
43
51
 
@@ -48,7 +56,6 @@ class Calculator extends _transform.default {
48
56
  return;
49
57
  }
50
58
 
51
- var opArg = this.getPlaceholder();
52
59
  var leftArg = this.getPlaceholder();
53
60
  var rightArg = this.getPlaceholder();
54
61
  var switchCases = [];
@@ -58,7 +65,12 @@ class Calculator extends _transform.default {
58
65
  var body = [(0, _gen.ReturnStatement)(factory(operator, (0, _gen.Identifier)(leftArg), (0, _gen.Identifier)(rightArg)))];
59
66
  switchCases.push((0, _gen.SwitchCase)((0, _gen.Literal)(code), body));
60
67
  });
61
- var func = (0, _gen.FunctionDeclaration)(this.calculatorFn, [opArg, leftArg, rightArg].map(x => (0, _gen.Identifier)(x)), [(0, _gen.SwitchStatement)((0, _gen.Identifier)(opArg), switchCases)]);
68
+ var func = (0, _gen.FunctionDeclaration)(this.calculatorFn, [leftArg, rightArg].map(x => (0, _gen.Identifier)(x)), [(0, _gen.SwitchStatement)((0, _gen.Identifier)(this.calculatorOpVar), switchCases)]);
69
+ (0, _insert.prepend)(tree, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.calculatorOpVar)));
70
+ (0, _insert.prepend)(tree, (0, _template.default)("function {name}(a){\n a = {b} + ({b}=a, 0);\n return a;\n }").single({
71
+ name: this.calculatorSetOpFn,
72
+ b: this.calculatorOpVar
73
+ }));
62
74
  (0, _insert.prepend)(tree, func);
63
75
  }
64
76
 
@@ -99,7 +111,7 @@ class Calculator extends _transform.default {
99
111
  this.log(operator, "calc(".concat(newState, ", left, right)"));
100
112
  }
101
113
 
102
- this.replace(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorFn), [(0, _gen.Literal)(this.ops[operator]), object.left, object.right]));
114
+ this.replace(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorFn), [object.left, object.right, (0, _random.choice)([(0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(this.calculatorOpVar), (0, _gen.Literal)(this.ops[operator])), (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorSetOpFn), [(0, _gen.Literal)(this.ops[operator])])])]));
103
115
  };
104
116
  }
105
117
 
@@ -71,6 +71,8 @@ class ControlFlowFlattening extends _transform.default {
71
71
  }
72
72
 
73
73
  transform(object, parents) {
74
+ var _this = this;
75
+
74
76
  return () => {
75
77
  if (object.body.length < 3) {
76
78
  return;
@@ -194,21 +196,29 @@ class ControlFlowFlattening extends _transform.default {
194
196
  var resultVar = this.getPlaceholder();
195
197
  var argVar = this.getPlaceholder();
196
198
  var testVar = this.getPlaceholder();
199
+ var stringBankVar = this.getPlaceholder();
200
+ var stringBank = Object.create(null);
201
+ var stringBankByLabels = Object.create(null);
202
+ let stringBankGen = this.getGenerator();
197
203
  var needsTestVar = false;
198
204
  var needsResultAndArgVar = false;
205
+ var needsStringBankVar = false;
199
206
  var fnToLabel = Object.create(null);
200
207
  fnNames.forEach(fnName => {
201
208
  fnToLabel[fnName] = this.getPlaceholder();
202
209
  });
203
210
 
204
- const flattenBody = (body, startingLabel = this.getPlaceholder()) => {
211
+ const flattenBody = function (body) {
212
+ let startingLabel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this.getPlaceholder();
205
213
  var chunks = [];
206
214
  var currentBody = [];
207
215
  var currentLabel = startingLabel;
208
216
 
209
- const finishCurrentChunk = (pointingLabel, newLabel, addGotoStatement = true) => {
217
+ const finishCurrentChunk = function (pointingLabel, newLabel) {
218
+ let addGotoStatement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
219
+
210
220
  if (!newLabel) {
211
- newLabel = this.getPlaceholder();
221
+ newLabel = _this.getPlaceholder();
212
222
  }
213
223
 
214
224
  if (!pointingLabel) {
@@ -226,6 +236,25 @@ class ControlFlowFlattening extends _transform.default {
226
236
  label: currentLabel,
227
237
  body: [...currentBody]
228
238
  });
239
+ (0, _traverse.walk)(currentBody, [], (o, p) => {
240
+ if (o.type == "Literal" && typeof o.value == "string" && !o.regex && Math.random() / (Object.keys(stringBank).length / 2 + 1) > 0.5) {
241
+ needsStringBankVar = true;
242
+
243
+ if (!stringBankByLabels[currentLabel]) {
244
+ stringBankByLabels[currentLabel] = new Set();
245
+ }
246
+
247
+ stringBankByLabels[currentLabel].add(o.value);
248
+
249
+ if (typeof stringBank[o.value] === "undefined") {
250
+ stringBank[o.value] = stringBankGen.generate();
251
+ }
252
+
253
+ return () => {
254
+ _this.replaceIdentifierOrLiteral(o, (0, _gen.MemberExpression)((0, _gen.Identifier)(stringBankVar), (0, _gen.Literal)(stringBank[o.value]), true), p);
255
+ };
256
+ }
257
+ });
229
258
  currentLabel = newLabel;
230
259
  currentBody = [];
231
260
  };
@@ -243,7 +272,8 @@ class ControlFlowFlattening extends _transform.default {
243
272
  }
244
273
 
245
274
  if (stmt.$callExpression && fnToLabel[stmt.$fnName]) {
246
- var afterPath = this.getPlaceholder();
275
+ var afterPath = _this.getPlaceholder();
276
+
247
277
  var args = [];
248
278
 
249
279
  switch (stmt.$callExpression) {
@@ -300,10 +330,15 @@ class ControlFlowFlattening extends _transform.default {
300
330
 
301
331
  var isLoop = !isSwitchStatement;
302
332
  var supportContinueStatement = isLoop;
303
- var testPath = this.getPlaceholder();
304
- var updatePath = this.getPlaceholder();
305
- var bodyPath = this.getPlaceholder();
306
- var afterPath = this.getPlaceholder();
333
+
334
+ var testPath = _this.getPlaceholder();
335
+
336
+ var updatePath = _this.getPlaceholder();
337
+
338
+ var bodyPath = _this.getPlaceholder();
339
+
340
+ var afterPath = _this.getPlaceholder();
341
+
307
342
  var possible = true;
308
343
  var toReplace = [];
309
344
  (0, _traverse.walk)(control.body, [], (o, p) => {
@@ -329,15 +364,19 @@ class ControlFlowFlattening extends _transform.default {
329
364
  return;
330
365
  }
331
366
 
332
- toReplace.forEach(v => this.replace(v[0], v[1]));
367
+ toReplace.forEach(v => _this.replace(v[0], v[1]));
333
368
 
334
369
  if (isSwitchStatement) {
335
- var switchVarName = this.getPlaceholder();
370
+ var switchVarName = _this.getPlaceholder();
371
+
336
372
  currentBody.push((0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(switchVarName, control.discriminant)));
337
- var afterPath = this.getPlaceholder();
373
+
374
+ var afterPath = _this.getPlaceholder();
375
+
338
376
  finishCurrentChunk();
339
377
  control.cases.forEach((switchCase, i) => {
340
- var entryPath = this.getPlaceholder();
378
+ var entryPath = _this.getPlaceholder();
379
+
341
380
  currentBody.push((0, _gen.IfStatement)((0, _gen.BinaryExpression)("===", (0, _gen.Identifier)(switchVarName), switchCase.test), [{
342
381
  type: "GotoStatement",
343
382
  label: entryPath
@@ -375,7 +414,9 @@ class ControlFlowFlattening extends _transform.default {
375
414
  }])); // create new label called `bodyPath` and have test body point to afterPath (goto afterPath)
376
415
 
377
416
  finishCurrentChunk(afterPath, bodyPath);
378
- var innerBothPath = this.getPlaceholder();
417
+
418
+ var innerBothPath = _this.getPlaceholder();
419
+
379
420
  chunks.push(...flattenBody([...control.body.body, {
380
421
  type: "GotoStatement",
381
422
  label: updatePath
@@ -399,9 +440,13 @@ class ControlFlowFlattening extends _transform.default {
399
440
  finishCurrentChunk();
400
441
  var hasAlternate = !!stmt.alternate;
401
442
  (0, _assert.ok)(!(hasAlternate && stmt.alternate.type !== "BlockStatement"));
402
- var yesPath = this.getPlaceholder();
403
- var noPath = this.getPlaceholder();
404
- var afterPath = this.getPlaceholder();
443
+
444
+ var yesPath = _this.getPlaceholder();
445
+
446
+ var noPath = _this.getPlaceholder();
447
+
448
+ var afterPath = _this.getPlaceholder();
449
+
405
450
  currentBody.push((0, _gen.IfStatement)((0, _gen.Identifier)(testVar), [{
406
451
  type: "GotoStatement",
407
452
  label: yesPath
@@ -582,6 +627,7 @@ class ControlFlowFlattening extends _transform.default {
582
627
  var made = 1;
583
628
  var breaksInsertion = [];
584
629
  var staticStateValues = [...labelToStates[chunk.label]];
630
+ var potentialBranches = new Set();
585
631
  chunk.body.forEach((stmt, stmtIndex) => {
586
632
  var addBreak = false;
587
633
  (0, _traverse.walk)(stmt, [], (o, p) => {
@@ -611,6 +657,7 @@ class ControlFlowFlattening extends _transform.default {
611
657
  p[blockIndex].body.splice(childIndex + 1, 0, (0, _gen.BreakStatement)(switchLabel));
612
658
  }
613
659
 
660
+ potentialBranches.add(o.label);
614
661
  var mutatingStateValues = [...labelToStates[chunk.label]];
615
662
  var nextStateValues = labelToStates[o.label];
616
663
  (0, _assert.ok)(nextStateValues, o.label);
@@ -630,10 +677,21 @@ class ControlFlowFlattening extends _transform.default {
630
677
  breaksInsertion.reverse();
631
678
  breaksInsertion.forEach(index => {
632
679
  chunk.body.splice(index + 1, 0, (0, _gen.BreakStatement)(switchLabel));
633
- }); // var c = Identifier("undefined");
680
+ });
681
+
682
+ for (var branch of Array.from(potentialBranches)) {
683
+ var strings = stringBankByLabels[branch];
684
+
685
+ if (strings) {
686
+ chunk.body.unshift((0, _gen.ExpressionStatement)((0, _gen.SequenceExpression)(Array.from(strings).map(strValue => {
687
+ return (0, _gen.AssignmentExpression)("=", (0, _gen.MemberExpression)((0, _gen.Identifier)(stringBankVar), (0, _gen.Literal)(stringBank[strValue]), true), (0, _gen.Literal)(strValue));
688
+ }))));
689
+ }
690
+ } // var c = Identifier("undefined");
634
691
  // this.addComment(c, stateValues.join(", "));
635
692
  // transitionStatements.push(c);
636
693
 
694
+
637
695
  var caseObject = {
638
696
  body: chunk.body,
639
697
  state: state,
@@ -675,6 +733,10 @@ class ControlFlowFlattening extends _transform.default {
675
733
  declarations.push((0, _gen.VariableDeclarator)(argVar));
676
734
  }
677
735
 
736
+ if (needsStringBankVar) {
737
+ declarations.push((0, _gen.VariableDeclarator)(stringBankVar, (0, _gen.ObjectExpression)(stringBankByLabels[startLabel] ? Array.from(stringBankByLabels[startLabel]).map(strValue => (0, _gen.Property)((0, _gen.Literal)(stringBank[strValue]), (0, _gen.Literal)(strValue), false)) : [])));
738
+ }
739
+
678
740
  declarations.push(...stateVars.map((stateVar, i) => {
679
741
  return (0, _gen.VariableDeclarator)(stateVar, (0, _gen.Literal)(initStateValues[i]));
680
742
  }));
@@ -255,7 +255,9 @@ class Dispatcher extends _transform.default {
255
255
  (0, _insert.prepend)(object, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(payloadArg, (0, _gen.ArrayExpression)([]))));
256
256
  }
257
257
 
258
- identifiers.forEach(([o, p]) => {
258
+ identifiers.forEach(_ref => {
259
+ let [o, p] = _ref;
260
+
259
261
  if (o.type != "Identifier") {
260
262
  return;
261
263
  }
@@ -21,9 +21,9 @@ var _transform = _interopRequireDefault(require("./transform"));
21
21
 
22
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
23
 
24
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
24
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
25
 
26
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
26
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
27
 
28
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
29
 
@@ -131,14 +131,17 @@ class HideInitializingCode extends _transform.default {
131
131
  var fnsToMake = (0, _random.getRandomInteger)(1, 5);
132
132
  var numberLiteralsMade = 1;
133
133
 
134
- function numberLiteral(num, depth = 1) {
134
+ function numberLiteral(num) {
135
+ let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
136
+
135
137
  if (depth > 6 || Math.random() > 0.8 / depth || Math.random() > 80 / numberLiteralsMade) {
136
138
  return (0, _gen.Literal)(num);
137
139
  }
138
140
 
139
141
  numberLiteralsMade++;
140
142
 
141
- function ternaryCall(name, param = (0, _random.getRandomInteger)(-250, 250)) {
143
+ function ternaryCall(name) {
144
+ let param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _random.getRandomInteger)(-250, 250);
142
145
  return (0, _gen.ConditionalExpression)((0, _gen.BinaryExpression)("==", (0, _gen.UnaryExpression)("typeof", (0, _gen.Identifier)(name)), (0, _gen.Literal)("function")), (0, _gen.CallExpression)((0, _gen.Identifier)(name), [numberLiteral(param, depth + 1)]), (0, _gen.Identifier)(name));
143
146
  }
144
147
 
@@ -232,7 +235,9 @@ class HideInitializingCode extends _transform.default {
232
235
  return (0, _gen.ConditionalExpression)((0, _gen.BinaryExpression)("==", (0, _gen.UnaryExpression)("typeof", (0, _gen.Identifier)(name)), (0, _gen.Literal)("function")), (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(name), (0, _gen.Identifier)("call"), false), [(0, _gen.ThisExpression)(), numberLiteral(param)]), (0, _gen.Identifier)(name));
233
236
  }
234
237
 
235
- function ternaryHell(expr, depth = 1) {
238
+ function ternaryHell(expr) {
239
+ let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
240
+
236
241
  if (!depth || depth > 5 || Math.random() > 0.99 / (depth / 2)) {
237
242
  return expr;
238
243
  }
@@ -155,7 +155,9 @@ class GlobalConcealing extends _transform.default {
155
155
 
156
156
  used.add(state);
157
157
  newNames[name] = state;
158
- locations.forEach(([node, parents]) => {
158
+ locations.forEach(_ref => {
159
+ let [node, parents] = _ref;
160
+
159
161
  if (!parents.find(x => x.$dispatcherSkip)) {
160
162
  // Do not replace
161
163
  if (parents[0]) {
@@ -161,7 +161,8 @@ class NameRecycling extends _transform.default {
161
161
  var newName = newNames[name];
162
162
 
163
163
  if (newName) {
164
- locations.forEach(([object, parents]) => {
164
+ locations.forEach(_ref => {
165
+ let [object, parents] = _ref;
165
166
  object.name = newName;
166
167
  var declaratorIndex = parents.findIndex(p => p.type == "VariableDeclarator");
167
168
 
@@ -28,7 +28,8 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
28
28
  * @param str
29
29
  * @param seed
30
30
  */
31
- function cyrb53(str, seed = 0) {
31
+ function cyrb53(str) {
32
+ let seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
32
33
  let h1 = 0xdeadbeef ^ seed,
33
34
  h2 = 0x41c6ce57 ^ seed;
34
35
 
@@ -31,9 +31,9 @@ var _compare = require("../../util/compare");
31
31
 
32
32
  var _assert = require("assert");
33
33
 
34
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
34
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
35
35
 
36
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
36
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
37
37
 
38
38
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
39