js-confuser 1.2.1 → 1.4.1

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 (94) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/README.md +7 -6
  3. package/dist/options.js +5 -1
  4. package/dist/parser.js +1 -2
  5. package/dist/presets.js +2 -2
  6. package/dist/transforms/calculator.js +48 -60
  7. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +482 -95
  8. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +4 -0
  9. package/dist/transforms/controlFlowFlattening/{switchCaseObfucation.js → switchCaseObfuscation.js} +2 -2
  10. package/dist/transforms/deadCode.js +1 -1
  11. package/dist/transforms/dispatcher.js +14 -13
  12. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +5 -10
  13. package/dist/transforms/flatten.js +5 -1
  14. package/dist/transforms/hideInitializingCode.js +17 -2
  15. package/dist/transforms/identifier/globalConcealing.js +46 -25
  16. package/dist/transforms/identifier/movedDeclarations.js +69 -68
  17. package/dist/transforms/identifier/renameVariables.js +22 -98
  18. package/dist/transforms/identifier/variableAnalysis.js +133 -0
  19. package/dist/transforms/label.js +11 -2
  20. package/dist/transforms/lock/antiDebug.js +32 -13
  21. package/dist/transforms/lock/lock.js +13 -2
  22. package/dist/transforms/minify.js +117 -120
  23. package/dist/transforms/opaquePredicates.js +4 -2
  24. package/dist/transforms/preparation/preparation.js +8 -0
  25. package/dist/transforms/renameLabels.js +17 -3
  26. package/dist/transforms/rgf.js +8 -3
  27. package/dist/transforms/shuffle.js +25 -9
  28. package/dist/transforms/stack.js +5 -9
  29. package/dist/transforms/string/encoding.js +209 -0
  30. package/dist/transforms/string/stringCompression.js +10 -10
  31. package/dist/transforms/string/stringConcealing.js +94 -65
  32. package/dist/transforms/string/stringSplitting.js +7 -7
  33. package/dist/transforms/transform.js +10 -0
  34. package/dist/traverse.js +1 -35
  35. package/dist/util/gen.js +3 -1
  36. package/dist/util/identifiers.js +9 -19
  37. package/dist/util/insert.js +6 -40
  38. package/dist/util/scope.js +17 -0
  39. package/package.json +2 -2
  40. package/src/options.ts +19 -3
  41. package/src/parser.ts +1 -2
  42. package/src/presets.ts +2 -2
  43. package/src/transforms/calculator.ts +87 -91
  44. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +742 -142
  45. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +6 -0
  46. package/src/transforms/controlFlowFlattening/{switchCaseObfucation.ts → switchCaseObfuscation.ts} +6 -2
  47. package/src/transforms/deadCode.ts +8 -0
  48. package/src/transforms/dispatcher.ts +29 -14
  49. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +43 -19
  50. package/src/transforms/flatten.ts +15 -2
  51. package/src/transforms/hideInitializingCode.ts +432 -406
  52. package/src/transforms/identifier/globalConcealing.ts +148 -46
  53. package/src/transforms/identifier/movedDeclarations.ts +78 -101
  54. package/src/transforms/identifier/renameVariables.ts +21 -96
  55. package/src/transforms/identifier/variableAnalysis.ts +124 -0
  56. package/src/transforms/label.ts +20 -2
  57. package/src/transforms/lock/antiDebug.ts +69 -26
  58. package/src/transforms/lock/lock.ts +37 -3
  59. package/src/transforms/minify.ts +154 -130
  60. package/src/transforms/opaquePredicates.ts +25 -3
  61. package/src/transforms/preparation/preparation.ts +8 -1
  62. package/src/transforms/renameLabels.ts +26 -3
  63. package/src/transforms/rgf.ts +6 -1
  64. package/src/transforms/shuffle.ts +87 -29
  65. package/src/transforms/stack.ts +6 -8
  66. package/src/transforms/string/encoding.ts +310 -0
  67. package/src/transforms/string/stringCompression.ts +37 -24
  68. package/src/transforms/string/stringConcealing.ts +157 -160
  69. package/src/transforms/string/stringSplitting.ts +12 -8
  70. package/src/transforms/transform.ts +15 -2
  71. package/src/traverse.ts +1 -31
  72. package/src/util/gen.ts +5 -3
  73. package/src/util/identifiers.ts +20 -20
  74. package/src/util/insert.ts +12 -78
  75. package/src/util/scope.ts +9 -0
  76. package/test/{transforms/compare.test.ts → compare.test.ts} +2 -2
  77. package/test/index.test.ts +109 -1
  78. package/test/templates/template.test.ts +14 -0
  79. package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +392 -10
  80. package/test/transforms/dispatcher.test.ts +30 -0
  81. package/test/transforms/flatten.test.ts +28 -0
  82. package/test/transforms/hideInitializingCode.test.ts +336 -336
  83. package/test/transforms/identifier/globalConcealing.test.ts +1 -2
  84. package/test/transforms/identifier/movedDeclarations.test.ts +137 -112
  85. package/test/transforms/identifier/renameVariables.test.ts +124 -13
  86. package/test/transforms/lock/antiDebug.test.ts +43 -0
  87. package/test/transforms/lock/selfDefending.test.ts +68 -0
  88. package/test/transforms/minify.test.ts +137 -0
  89. package/test/transforms/renameLabels.test.ts +33 -0
  90. package/test/transforms/rgf.test.ts +29 -0
  91. package/test/transforms/string/stringSplitting.test.ts +33 -0
  92. package/test/util/identifiers.test.ts +105 -17
  93. package/dist/util/expr.js +0 -60
  94. package/src/util/expr.ts +0 -56
package/CHANGELOG.md CHANGED
@@ -1,3 +1,174 @@
1
+ # `1.4.1`
2
+ AntiDebug Fix
3
+
4
+ - Fixed [#28](https://github.com/MichaelXF/js-confuser/issues/28)
5
+ - - AntiDebug was causing syntax errors in some scenarios, fixed in this version.
6
+
7
+ # `1.4.0`
8
+ Confusing Control Flow
9
+
10
+ - `Control Flow Flattening` overhaul, now flattens embedded control structures
11
+
12
+ - - `If statements`
13
+ - - `For statements`
14
+ - - `While statements`
15
+ - - `Switch statements`
16
+ - - `Do While statements`
17
+
18
+ - - Certain functions
19
+
20
+ ```js
21
+ // Input
22
+ console.log(1);
23
+ console.log(2);
24
+ console.log(Number("3"));
25
+
26
+ for (var i = 4; i < 6; i++) {
27
+ console.log(i);
28
+ }
29
+
30
+ var i = 0;
31
+ do {
32
+ console.log(i + 6);
33
+ } while (i++ < 4);
34
+
35
+ // Output
36
+ var a = -123, b = 414, c = -191;
37
+ while (a + b + c != 104) {
38
+ var d = (a + b + c) * -28 + 172;
39
+ switch (d) {
40
+ case -276:
41
+ !(a *= 138 > b ? 2 : 158, a -= -5 < c ? -90 : -152, b *= b + 206, b -= a + -539, c += b + -372);
42
+ break;
43
+ case -2628:
44
+ var e = (console['log'](-106 > c ? 1 : 182), console['log'](a + 125), console['log'](Number('3')), -87 < a ? -189 < a ? -133 : 93 : 107 < c ? 227 : 4);
45
+ ~(a *= (-114 > c ? -164 : -107) < c ? -164 : 2, a -= 188 > b ? b + -211 : -369, b += -62 > c ? 168 > c ? -539 : 56 : 26, c += (c + 362 > a ? 73 : -157) < b ? 207 : 341);
46
+ break;
47
+ case -4420:
48
+ +(a *= a + (a + 18), a -= 190 > a ? -344 : 71, b *= -206 < b ? c + -173 : -221, b -= b + 94, c += 89 > b ? -311 : 170);
49
+ break;
50
+ case -3972:
51
+ if (e < c + -144) {
52
+ !(a *= b + 127, a -= b + (b + 671), b += c + 82, c *= 61 < a ? -139 : 2, c -= b + -35);
53
+ break;
54
+ }
55
+ typeof (a *= c + -148, a -= c + 271, b += c + 184, c += -89 < c ? -42 : -114);
56
+ break;
57
+ case -3244:
58
+ +(a += a + 220, b += b + 317, c += b + -218);
59
+ break;
60
+ case -4308:
61
+ !(a += 134 < b ? -233 : 89, b += -79 < b ? -69 : -241, c *= -107 > a ? -97 : 2, c -= (56 < a ? -27 : -184) > c ? -163 : 231);
62
+ break;
63
+ case -3664:
64
+ ~(a += b + -362, b += -87 < b ? -666 : -172, c += c + 710);
65
+ break;
66
+ case -5344:
67
+ +(a *= c + (-165 < a ? -266 : 182) > c ? 124 : 2, a -= -154 > b ? c + 92 : -388, b += c + -193, c *= c + (c + -30), c -= a + -11);
68
+ break;
69
+ case -2572:
70
+ if (e++ < ((-125 < a ? -62 : 87) < c ? -112 : 4)) {
71
+ ~(a += c + -268, b += 215 < b ? 136 : 18 < b ? -233 : 536, c += b + -535);
72
+ break;
73
+ }
74
+ ~(a *= (123 > a ? -105 : 238) < b ? 216 : 2, a -= a + 57, b *= a + 59, b -= a + -369, c *= b + -236, c -= 200 > c ? -288 : -11);
75
+ break;
76
+ case -4784:
77
+ +(console['log'](e), a *= c + -223, a -= 7 > c ? -227 > b ? -4 : 192 : -157, b *= a + (-186 > b ? 211 : 17), b -= -127 > c ? 76 : 280, c *= -63 > c ? a + 264 : 2, c -= (119 < c ? -206 : 85) < a ? 215 : 179);
78
+ break;
79
+ case -724:
80
+ void (console['log'](e + (c + -246)), a *= -177 < c ? 2 : 207, a -= 152 > a ? 122 : -190, b *= c + -250, b -= b + 160, c += -141 < a ? a + 258 : 21);
81
+ break;
82
+ case -3804:
83
+ var e = -143 > a ? 0 : 24;
84
+ typeof (a += c + -9, b += c + 125, c += a + -261);
85
+ break;
86
+ case -1648:
87
+ ~(e++, a += a + 3, b *= c + 68, b -= 89 < b ? -173 > b ? -147 : 267 : -228 > c ? -80 : -216 > b ? 93 : 68, c += 65 > a ? b + 156 : 216);
88
+ break;
89
+ }
90
+ }
91
+ ```
92
+
93
+ - New encoding type `Hex Table`
94
+
95
+ ```js
96
+ "{0x7E494534,0x688,0x7E6D53,0x401,0x7E584D4B,0x688,0x7E775853,0x688,0x7E5333,0x81}"
97
+
98
+ // => "Hello World"
99
+ ```
100
+
101
+ - Improvements to renaming labels
102
+ - Fixed [#24](https://github.com/MichaelXF/js-confuser/issues/24)
103
+ - Fixed [#25](https://github.com/MichaelXF/js-confuser/issues/25)
104
+ - Fixed [#26](https://github.com/MichaelXF/js-confuser/issues/26)
105
+
106
+ # `1.3.0`
107
+ String Splitting Improvement
108
+
109
+ - `String Splitting` now supports percentages and a custom callback. ([#22](https://github.com/MichaelXF/js-confuser/issues/22))
110
+
111
+ ```js
112
+ {
113
+ // percentage
114
+ stringSplitting: 0.75, // = 75%
115
+
116
+ // exclude certain strings
117
+ stringSplitting: (str)=>{
118
+ if ( str == "dont-split-string" ) {
119
+ return false;
120
+ }
121
+
122
+ return true;
123
+ },
124
+ }
125
+ ```
126
+
127
+ # `1.2.2`
128
+ Global name fix
129
+
130
+ - **Bug fix**: `Rename Variables` breaking access to global variables
131
+
132
+ ```js
133
+ // Say `a` is a global library
134
+ // Input
135
+ function myFunction(param1){
136
+ a(param1);
137
+ }
138
+
139
+ // Output on 1.2.1
140
+ function a(a){
141
+ a(a);
142
+ }
143
+
144
+ // Output on 1.2.2
145
+ function b(b){
146
+ a(b);
147
+ }
148
+ ```
149
+
150
+ - **Bug fix**: `Flatten` to not accidentally remove function parameters
151
+ - **Bug fix**: `Dispatcher` on function calls within classes
152
+ - **Bug fix**: `Minify` fixed syntax error
153
+
154
+ ```js
155
+ // Input
156
+ var o = {Infinity: 0};
157
+
158
+ // Output on 1.2.1
159
+ var o = {1/0: 0};
160
+
161
+ // Output on 1.2.2
162
+ var o = {[1/0]: 0};
163
+ ```
164
+
165
+ - Added `base32` encoding to `String Concealing`
166
+ - `Minify` improvements
167
+ - - `true` -> `!0`
168
+ - - `false` -> `!1`
169
+ - Subtle changes to `String Compression`
170
+ - Updated presets
171
+
1
172
  # `1.2.1`
2
173
  Bug fixes
3
174
 
package/README.md CHANGED
@@ -14,6 +14,7 @@ JS-Confuser is a JavaScript obfuscation tool to make your programs _impossible_
14
14
  ## Presets
15
15
 
16
16
  JS-Confuser comes with three presets built into the obfuscator.
17
+
17
18
  | Preset | Transforms | Performance Reduction | Sample |
18
19
  | --- | --- | --- | --- |
19
20
  | High | 21/22 | 98% | [Sample](https://github.com/MichaelXF/js-confuser/blob/master/samples/high.js) |
@@ -254,7 +255,9 @@ Use a number to control the percentage of strings.
254
255
 
255
256
  ### `stringSplitting`
256
257
 
257
- [String Splitting](https://docs.jscrambler.com/code-integrity/documentation/transformations/string-splitting) splits your strings into multiple expressions. (`true/false`)
258
+ [String Splitting](https://docs.jscrambler.com/code-integrity/documentation/transformations/string-splitting) splits your strings into multiple expressions. (`true/false/0-1`)
259
+
260
+ Use a number to control the percentage of strings.
258
261
 
259
262
  `"console"` -> `String.fromCharCode(99) + 'ons' + 'ole'`
260
263
 
@@ -539,11 +542,11 @@ function iVQoGQD(...iVQoGQD){
539
542
  renameVariables: true,
540
543
  renameGlobals: true,
541
544
  shuffle: { hash: 0.5, true: 0.5 },
545
+ stack: true,
542
546
  stringConcealing: true,
543
547
  stringCompression: true,
544
548
  stringEncoding: true,
545
549
  stringSplitting: 0.75,
546
- stack: true,
547
550
 
548
551
  // Use at own risk
549
552
  eval: false,
@@ -563,7 +566,6 @@ function iVQoGQD(...iVQoGQD){
563
566
  deadCode: 0.025,
564
567
  dispatcher: 0.75,
565
568
  duplicateLiteralsRemoval: 0.5,
566
- flatten: true,
567
569
  globalConcealing: true,
568
570
  identifierGenerator: "randomized",
569
571
  minify: true,
@@ -573,6 +575,7 @@ function iVQoGQD(...iVQoGQD){
573
575
  renameVariables: true,
574
576
  renameGlobals: true,
575
577
  shuffle: true,
578
+ stack: 0.5,
576
579
  stringConcealing: true,
577
580
  stringSplitting: 0.25
578
581
  }
@@ -591,8 +594,6 @@ function iVQoGQD(...iVQoGQD){
591
594
  deadCode: 0.01,
592
595
  dispatcher: 0.5,
593
596
  duplicateLiteralsRemoval: true,
594
- flatten: true,
595
- globalConcealing: true,
596
597
  identifierGenerator: "randomized",
597
598
  minify: true,
598
599
  movedDeclarations: true,
@@ -600,7 +601,7 @@ function iVQoGQD(...iVQoGQD){
600
601
  opaquePredicates: 0.1,
601
602
  renameVariables: true,
602
603
  renameGlobals: true,
603
- stringConcealing: 0.25
604
+ stringConcealing: true
604
605
  }
605
606
  ```
606
607
 
package/dist/options.js CHANGED
@@ -12,7 +12,7 @@ var _presets = _interopRequireDefault(require("./presets"));
12
12
 
13
13
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
14
 
15
- const validProperties = new Set(["preset", "target", "indent", "compact", "minify", "es5", "renameVariables", "renameGlobals", "identifierGenerator", "nameRecycling", "controlFlowFlattening", "hideInitializingCode", "globalConcealing", "stringCompression", "stringConcealing", "stringEncoding", "stringSplitting", "duplicateLiteralsRemoval", "dispatcher", "eval", "rgf", "objectExtraction", "flatten", "deadCode", "calculator", "lock", "movedDeclarations", "opaquePredicates", "shuffle", "stack", "verbose", "debugComments"]);
15
+ const validProperties = new Set(["preset", "target", "indent", "compact", "minify", "es5", "renameVariables", "renameGlobals", "identifierGenerator", "nameRecycling", "controlFlowFlattening", "hideInitializingCode", "globalConcealing", "stringCompression", "stringConcealing", "stringEncoding", "stringSplitting", "duplicateLiteralsRemoval", "dispatcher", "eval", "rgf", "objectExtraction", "flatten", "deadCode", "calculator", "lock", "movedDeclarations", "opaquePredicates", "shuffle", "stack", "verbose", "globalVariables", "debugComments"]);
16
16
  const validOses = new Set(["windows", "linux", "osx", "ios", "android"]);
17
17
  const validBrowsers = new Set(["firefox", "chrome", "iexplorer", "edge", "safari", "opera"]);
18
18
 
@@ -105,6 +105,10 @@ async function correctOptions(options) {
105
105
 
106
106
  if (options.globalVariables && !(options.globalVariables instanceof Set)) {
107
107
  options.globalVariables = new Set(Object.keys(options.globalVariables));
108
+ }
109
+
110
+ if (options.lock && options.lock.selfDefending) {
111
+ options.compact = true; // self defending forcibly enables this
108
112
  } // options.globalVariables was never used.
109
113
  // GlobalConcealing implicitly determines a global to be a variable referenced but never defined or modified.
110
114
 
package/dist/parser.js CHANGED
@@ -28,8 +28,7 @@ async function parseJS(code) {
28
28
  var parsed = parseSync(code);
29
29
  return parsed;
30
30
  } catch (e) {
31
- console.error(e);
32
- throw new Error("Failed to parse code.");
31
+ throw e;
33
32
  }
34
33
  }
35
34
  /**
package/dist/presets.js CHANGED
@@ -50,11 +50,11 @@ const highPreset = {
50
50
  hash: 0.5,
51
51
  true: 0.5
52
52
  },
53
+ stack: true,
53
54
  stringConcealing: true,
54
55
  stringCompression: true,
55
56
  stringEncoding: true,
56
57
  stringSplitting: 0.75,
57
- stack: true,
58
58
  // Use at own risk
59
59
  eval: false,
60
60
  rgf: false
@@ -73,7 +73,6 @@ const mediumPreset = {
73
73
  deadCode: 0.025,
74
74
  dispatcher: 0.75,
75
75
  duplicateLiteralsRemoval: 0.5,
76
- flatten: true,
77
76
  globalConcealing: true,
78
77
  identifierGenerator: "randomized",
79
78
  minify: true,
@@ -83,6 +82,7 @@ const mediumPreset = {
83
82
  renameVariables: true,
84
83
  renameGlobals: true,
85
84
  shuffle: true,
85
+ stack: 0.5,
86
86
  stringConcealing: true,
87
87
  stringSplitting: 0.25
88
88
  };
@@ -11,8 +11,6 @@ var _gen = require("../util/gen");
11
11
 
12
12
  var _insert = require("../util/insert");
13
13
 
14
- var _traverse = require("../traverse");
15
-
16
14
  var _random = require("../util/random");
17
15
 
18
16
  var _order = require("../order");
@@ -43,76 +41,66 @@ class Calculator extends _transform.default {
43
41
  this.gen = this.getGenerator();
44
42
  }
45
43
 
44
+ apply(tree) {
45
+ super.apply(tree);
46
+
47
+ if (Object.keys(this.ops).length == 0) {
48
+ return;
49
+ }
50
+
51
+ var opArg = this.getPlaceholder();
52
+ var leftArg = this.getPlaceholder();
53
+ var rightArg = this.getPlaceholder();
54
+ var switchCases = [];
55
+ Object.keys(this.ops).forEach(operator => {
56
+ var code = this.ops[operator];
57
+ var factory = operator == "&&" || operator == "||" ? _gen.LogicalExpression : _gen.BinaryExpression;
58
+ var body = [(0, _gen.ReturnStatement)(factory(operator, (0, _gen.Identifier)(leftArg), (0, _gen.Identifier)(rightArg)))];
59
+ switchCases.push((0, _gen.SwitchCase)((0, _gen.Literal)(code), body));
60
+ });
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)]);
62
+ (0, _insert.prepend)(tree, func);
63
+ }
64
+
46
65
  match(object, parents) {
47
- return object.type == "Program" || object.type == "BinaryExpression";
66
+ return object.type == "BinaryExpression";
48
67
  }
49
68
 
50
69
  transform(object, parents) {
51
- if (object.type == "Program") {
52
- return () => {
53
- var block = (0, _traverse.getBlock)(object, parents);
54
-
55
- if (Object.keys(this.ops).length == 0) {
56
- return;
57
- }
58
-
59
- var opArg = this.getPlaceholder();
60
- var leftArg = this.getPlaceholder();
61
- var rightArg = this.getPlaceholder();
62
- var switchCases = [];
63
- Object.keys(this.ops).forEach(operator => {
64
- var code = this.ops[operator];
65
- var factory = operator == "&&" || operator == "||" ? _gen.LogicalExpression : _gen.BinaryExpression;
66
- var body = [(0, _gen.ReturnStatement)(factory(operator, (0, _gen.Identifier)(leftArg), (0, _gen.Identifier)(rightArg)))];
67
- switchCases.push((0, _gen.SwitchCase)((0, _gen.Literal)(code), body));
68
- });
69
- var func = (0, _gen.FunctionDeclaration)(this.calculatorFn, [opArg, leftArg, rightArg].map(x => (0, _gen.Identifier)(x)), [(0, _gen.SwitchStatement)((0, _gen.Identifier)(opArg), switchCases)]);
70
- (0, _insert.prepend)(block, func);
71
- };
72
- }
73
-
74
- if (object.type == "BinaryExpression") {
75
- var operator = object.operator;
70
+ var operator = object.operator;
71
+ var allowedOperators = new Set(["+", "-", "*", "/"]);
76
72
 
77
- if (!{
78
- "+": 1,
79
- "-": 1,
80
- "*": 1,
81
- "/": 1
82
- }[object.operator]) {
83
- return;
84
- }
73
+ if (!allowedOperators.has(operator)) {
74
+ return;
75
+ }
85
76
 
86
- var myPrecedence = _precedence.OPERATOR_PRECEDENCE[operator] + Object.keys(_precedence.OPERATOR_PRECEDENCE).indexOf(operator) / 100;
87
- var maxParentPrecedence = parents.map(x => x.type == "BinaryExpression" && _precedence.OPERATOR_PRECEDENCE[x.operator] + Object.keys(_precedence.OPERATOR_PRECEDENCE).indexOf(x.operator) / 100).sort().pop(); // corrupt AST
77
+ var myPrecedence = _precedence.OPERATOR_PRECEDENCE[operator] + Object.keys(_precedence.OPERATOR_PRECEDENCE).indexOf(operator) / 100;
78
+ var precedences = parents.map(x => x.type == "BinaryExpression" && _precedence.OPERATOR_PRECEDENCE[x.operator] + Object.keys(_precedence.OPERATOR_PRECEDENCE).indexOf(x.operator) / 100); // corrupt AST
88
79
 
89
- if (maxParentPrecedence && maxParentPrecedence > myPrecedence) {
90
- return;
91
- }
80
+ if (precedences.find(x => x >= myPrecedence)) {
81
+ return;
82
+ }
92
83
 
93
- return () => {
94
- if (parents.find(x => x.$dispatcherSkip)) {
95
- return;
96
- }
84
+ if (parents.find(x => x.$dispatcherSkip || x.type == "BinaryExpression")) {
85
+ return;
86
+ }
97
87
 
98
- if (typeof this.ops[operator] !== "number") {
99
- var newState;
88
+ return () => {
89
+ if (typeof this.ops[operator] !== "number") {
90
+ var newState;
100
91
 
101
- do {
102
- newState = (0, _random.getRandomInteger)(-1000, 1000 + Object.keys(this.ops).length * 5);
103
- } while (this.statesUsed.has(newState));
92
+ do {
93
+ newState = (0, _random.getRandomInteger)(-1000, 1000 + Object.keys(this.ops).length * 5);
94
+ } while (this.statesUsed.has(newState));
104
95
 
105
- (0, _assert.ok)(!isNaN(newState));
106
- this.statesUsed.add(newState);
107
- this.ops[operator] = newState;
108
- this.log(operator, "calc(".concat(newState, ", left, right)"));
109
- }
96
+ (0, _assert.ok)(!isNaN(newState));
97
+ this.statesUsed.add(newState);
98
+ this.ops[operator] = newState;
99
+ this.log(operator, "calc(".concat(newState, ", left, right)"));
100
+ }
110
101
 
111
- this.replace(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorFn), [(0, _gen.Literal)(this.ops[operator]), { ...object.left
112
- }, { ...object.right
113
- }]));
114
- };
115
- }
102
+ this.replace(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorFn), [(0, _gen.Literal)(this.ops[operator]), object.left, object.right]));
103
+ };
116
104
  }
117
105
 
118
106
  }