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
@@ -1,218 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _assert = require("assert");
9
-
10
- var _order = require("../../order");
11
-
12
- var _probability = require("../../probability");
13
-
14
- var _traverse = require("../../traverse");
15
-
16
- var _gen = require("../../util/gen");
17
-
18
- var _identifiers = require("../../util/identifiers");
19
-
20
- var _insert = require("../../util/insert");
21
-
22
- var _transform = _interopRequireDefault(require("../transform"));
23
-
24
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
-
26
- /**
27
- * Statement-based variable recycling.
28
- *
29
- * ```js
30
- * // Input
31
- * function percentage(decimal) {
32
- * var multiplied = x * 100;
33
- * var floored = Math.floor(multiplied);
34
- * var output = floored + "%"
35
- * return output;
36
- * }
37
- *
38
- * // Output
39
- * function percentage(decimal) {
40
- * var multiplied = x * 100;
41
- * var floored = Math.floor(multiplied);
42
- * multiplied = floored + "%";
43
- * return multiplied;
44
- * }
45
- * ```
46
- */
47
- class NameRecycling extends _transform.default {
48
- constructor(o) {
49
- super(o, _order.ObfuscateOrder.NameRecycling);
50
- }
51
-
52
- match(object, parents) {
53
- return (0, _traverse.isBlock)(object);
54
- }
55
-
56
- transform(object, parents) {
57
- return () => {
58
- if ((0, _identifiers.containsLexicallyBoundVariables)(object, parents)) {
59
- return;
60
- }
61
-
62
- var context = (0, _insert.getVarContext)(object, parents);
63
- var stmts = [...object.body];
64
- (0, _assert.ok)(Array.isArray(stmts));
65
- var definedMap = new Map();
66
- var referencedMap = new Map();
67
- var nodeMap = new Map();
68
- var lastReferenceMap = new Map();
69
- var defined = new Set();
70
- var illegal = new Set();
71
- var fn = (0, _insert.isFunction)(parents[0]) ? parents[0] : null;
72
-
73
- if (fn) {
74
- definedMap.set(-1, new Set((0, _identifiers.getFunctionParameters)(fn, parents.slice(1)).map(x => x[0].name)));
75
- }
76
-
77
- stmts.forEach((stmt, i) => {
78
- var definedHere = new Set();
79
- var referencedHere = new Set();
80
- var nodesHere = new Map();
81
- (0, _traverse.walk)(stmt, [object.body, object, ...parents], (o, p) => {
82
- if (o.type == "Identifier") {
83
- return () => {
84
- var info = (0, _identifiers.getIdentifierInfo)(o, p);
85
-
86
- if (!info.spec.isReferenced) {
87
- return;
88
- }
89
-
90
- var comparingContext = info.spec.isDefined ? (0, _insert.getDefiningContext)(o, p) : (0, _insert.getReferencingContexts)(o, p).find(x => (0, _insert.isVarContext)(x));
91
-
92
- if (comparingContext !== context) {
93
- illegal.add(o.name);
94
- this.log(o.name, "is different context");
95
- } else {
96
- if (!nodesHere.has(o.name)) {
97
- nodesHere.set(o.name, [[o, p]]);
98
- } else {
99
- nodesHere.get(o.name).push([o, p]);
100
- }
101
-
102
- if (info.spec.isDefined) {
103
- // Function Declarations can be used before they're defined, if so, don't change this
104
- if (info.isFunctionDeclaration && lastReferenceMap.has(o.name)) {
105
- illegal.add(o.name);
106
- }
107
-
108
- if (defined.has(o.name) || (0, _traverse.getBlock)(o, p) !== object || info.isImportSpecifier) {
109
- illegal.add(o.name);
110
- }
111
-
112
- defined.add(o.name);
113
- definedHere.add(o.name);
114
- } else {
115
- referencedHere.add(o.name);
116
- }
117
- }
118
-
119
- lastReferenceMap.set(o.name, i);
120
- };
121
- }
122
- }); // console.log(i, definedHere);
123
-
124
- definedMap.set(i, definedHere);
125
- referencedMap.set(i, referencedHere);
126
- nodeMap.set(i, nodesHere);
127
- });
128
- this.log(illegal);
129
- illegal.forEach(name => {
130
- nodeMap.forEach(value => {
131
- value.delete(name);
132
- });
133
- });
134
- var available = new Set();
135
- var newNames = Object.create(null);
136
- stmts.forEach((stmt, i) => {
137
- var nodes = nodeMap.get(i);
138
- nodes.forEach((locations, name) => {
139
- var newName = newNames[name];
140
-
141
- if (!newName) {
142
- var canChange = false;
143
-
144
- if (object.type == "Program" && !(0, _probability.ComputeProbabilityMap)(this.options.renameGlobals, x => x, name)) {
145
- return;
146
- }
147
-
148
- if (defined.has(name) && definedMap.get(i).has(name)) {
149
- canChange = true;
150
- }
151
-
152
- if (!canChange) {
153
- return;
154
- }
155
-
156
- if (available.size) {
157
- newName = available.keys().next().value;
158
- available.delete(newName);
159
- (0, _assert.ok)(name !== newName);
160
- newNames[name] = newName;
161
- defined.delete(name);
162
- this.log(name, "->", newName);
163
- }
164
- }
165
- });
166
- nodes.forEach((locations, name) => {
167
- var newName = newNames[name];
168
-
169
- if (newName) {
170
- locations.forEach(_ref => {
171
- let [object, parents] = _ref;
172
- object.name = newName;
173
- var declaratorIndex = parents.findIndex(p => p.type == "VariableDeclarator");
174
-
175
- if (declaratorIndex !== -1 && parents[declaratorIndex].id === (parents[declaratorIndex - 1] || object)) {
176
- var value = parents[declaratorIndex].init || (0, _gen.Identifier)("undefined");
177
- var expr = (0, _gen.AssignmentExpression)("=", parents[declaratorIndex].id, value);
178
-
179
- if (parents[declaratorIndex + 1].length === 1) {
180
- if ((0, _insert.isForInitialize)(parents[declaratorIndex + 2], parents.slice(3))) {
181
- this.replace(parents[declaratorIndex + 2], expr);
182
- } else {
183
- this.replace(parents[declaratorIndex + 2], (0, _gen.ExpressionStatement)(expr));
184
- }
185
- } else {
186
- this.replace(parents[declaratorIndex], (0, _gen.VariableDeclarator)(this.getPlaceholder(), expr));
187
- }
188
- } else {
189
- if (parents[0].type == "FunctionDeclaration") {
190
- this.replace(parents[0], (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(newName), { ...parents[0],
191
- type: "FunctionExpression",
192
- id: null
193
- })));
194
- } else if (parents[0].type == "ClassDeclaration") {
195
- this.replace(parents[0], (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(newName), { ...parents[0],
196
- type: "ClassExpression"
197
- })));
198
- }
199
- }
200
- });
201
- }
202
-
203
- if (defined.has(name)) {
204
- var lastRef = lastReferenceMap.get(name);
205
- var isDecommissioned = lastRef === i;
206
-
207
- if (isDecommissioned) {
208
- available.add(name);
209
- }
210
- }
211
- });
212
- });
213
- };
214
- }
215
-
216
- }
217
-
218
- exports.default = NameRecycling;
@@ -1,67 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _transform = _interopRequireDefault(require("./transform"));
9
-
10
- var _gen = require("../util/gen");
11
-
12
- var _traverse = require("../traverse");
13
-
14
- var _compare = require("../util/compare");
15
-
16
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
18
- /**
19
- * Ensures every break; statement has a label to point to.
20
- *
21
- * This is because Control Flow Flattening adds For Loops which label-less break statements point to the nearest,
22
- * when they actually need to point to the original statement.
23
- */
24
- class Label extends _transform.default {
25
- constructor(o) {
26
- super(o);
27
- }
28
-
29
- match(object, parents) {
30
- return (0, _compare.isLoop)(object) || object.type == "BlockStatement" && parents[0] && parents[0].type == "LabeledStatement" && parents[0].body === object;
31
- }
32
-
33
- transform(object, parents) {
34
- return () => {
35
- var currentLabel = parents[0].type == "LabeledStatement" && parents[0].label.name;
36
- var label = currentLabel || this.getPlaceholder();
37
- (0, _traverse.walk)(object, parents, (o, p) => {
38
- if (o.type == "BreakStatement" || o.type == "ContinueStatement") {
39
- function isContinuableStatement(x) {
40
- return (0, _compare.isLoop)(x) && x.type !== "SwitchStatement";
41
- }
42
-
43
- function isBreakableStatement(x) {
44
- return (0, _compare.isLoop)(x) || o.label && x.type == "BlockStatement";
45
- }
46
-
47
- var fn = o.type == "ContinueStatement" ? isContinuableStatement : isBreakableStatement;
48
- var loop = p.find(fn);
49
-
50
- if (object == loop) {
51
- if (!o.label) {
52
- o.label = (0, _gen.Identifier)(label);
53
- }
54
- }
55
- }
56
- }); // Append label statement as this loop has none
57
-
58
- if (!currentLabel) {
59
- this.replace(object, (0, _gen.LabeledStatement)(label, { ...object
60
- }));
61
- }
62
- };
63
- }
64
-
65
- }
66
-
67
- exports.default = Label;
@@ -1,116 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = exports.NameMappingAnalysis = void 0;
7
-
8
- var _constants = require("../../constants");
9
-
10
- var _identifiers = require("../../util/identifiers");
11
-
12
- var _transform = _interopRequireDefault(require("../transform"));
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
- 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; }
17
-
18
- class NameMappingAnalysis extends _transform.default {
19
- constructor(o) {
20
- super(o);
21
-
22
- _defineProperty(this, "names", void 0);
23
-
24
- this.names = new Map();
25
- }
26
-
27
- match(object, parents) {
28
- return object.type == "Identifier" && !_constants.reservedIdentifiers.has(object.name);
29
- }
30
-
31
- transform(object, parents) {
32
- var info = (0, _identifiers.getIdentifierInfo)(object, parents);
33
-
34
- if (info.spec.isReferenced && !info.spec.isDefined) {
35
- object.$definedAt = (0, _identifiers.getDefiningIdentifier)(object, parents);
36
- }
37
-
38
- if (info.spec.isDefined) {
39
- if (!this.names.has(object.name)) {
40
- this.names.set(object.name, new Set([object]));
41
- } else {
42
- this.names.get(object.name).add(object);
43
- }
44
- }
45
- }
46
-
47
- }
48
- /**
49
- * Renames variables & removes conflicts.
50
- *
51
- * - This helps transformations like `Dispatcher` not replace re-declared identifiers.
52
- */
53
-
54
-
55
- exports.NameMappingAnalysis = NameMappingAnalysis;
56
-
57
- class NameConflicts extends _transform.default {
58
- constructor(o) {
59
- super(o);
60
-
61
- _defineProperty(this, "nameMappingAnalysis", void 0);
62
-
63
- _defineProperty(this, "changes", void 0);
64
-
65
- _defineProperty(this, "references", void 0);
66
-
67
- this.before.push(this.nameMappingAnalysis = new NameMappingAnalysis(o));
68
- this.changes = new Map();
69
- this.references = new Map();
70
- }
71
-
72
- match(object, parents) {
73
- return object.type == "Identifier" && !_constants.reservedIdentifiers.has(object.name) && !this.options.globalVariables.has(object.name);
74
- }
75
-
76
- transform(object, parents) {
77
- var info = (0, _identifiers.getIdentifierInfo)(object, parents);
78
-
79
- if (info.isMethodDefinition) {
80
- return;
81
- }
82
-
83
- if (object.$definedAt) {
84
- object.name = this.changes.get(object.$definedAt[0]) || object.name;
85
-
86
- if (!this.references.has(object.$definedAt[0])) {
87
- this.references.set(object.$definedAt[0], new Set([object]));
88
- } else {
89
- this.references.get(object.$definedAt[0]).add(object);
90
- }
91
- } else if (info.spec.isDefined) {
92
- var set = this.nameMappingAnalysis.names.get(object.name);
93
-
94
- if (set && set.size > 1) {
95
- var index = Array.from(set).indexOf(object);
96
- var newName = "_".repeat(index) + object.name;
97
-
98
- if (index > 4 || this.nameMappingAnalysis.names.has(newName)) {
99
- newName = this.getPlaceholder() + "_" + object.name;
100
- }
101
-
102
- object.name = newName;
103
- this.changes.set(object, newName);
104
-
105
- if (this.references.has(object)) {
106
- this.references.get(object).forEach(ref => {
107
- ref.name = newName;
108
- });
109
- }
110
- }
111
- }
112
- }
113
-
114
- }
115
-
116
- exports.default = NameConflicts;
@@ -1,188 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _transform = _interopRequireDefault(require("../transform"));
9
-
10
- var _gen = require("../../util/gen");
11
-
12
- var _order = require("../../order");
13
-
14
- var _insert = require("../../util/insert");
15
-
16
- var _identifiers = require("../../util/identifiers");
17
-
18
- var _label = _interopRequireDefault(require("../label"));
19
-
20
- var _compare = require("../../util/compare");
21
-
22
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
-
24
- /**
25
- * The file contains all preparation transformations
26
- */
27
-
28
- /**
29
- * People use shortcuts and its harder to parse.
30
- *
31
- * - `if (a) b()` -> `if (a) { b() }`
32
- * - Ensures all bodies are `BlockStatement`, not individual expression statements
33
- */
34
- class Block extends _transform.default {
35
- constructor(o) {
36
- super(o);
37
- }
38
-
39
- match(object, parents) {
40
- return !Array.isArray(object);
41
- }
42
-
43
- transform(object, parents) {
44
- switch (object.type) {
45
- case "IfStatement":
46
- if (object.consequent.type != "BlockStatement") {
47
- object.consequent = (0, _gen.BlockStatement)([(0, _insert.clone)(object.consequent)]);
48
- }
49
-
50
- if (object.alternate && object.alternate.type != "BlockStatement") {
51
- object.alternate = (0, _gen.BlockStatement)([(0, _insert.clone)(object.alternate)]);
52
- }
53
-
54
- break;
55
-
56
- case "WhileStatement":
57
- case "WithStatement":
58
- case "ForStatement":
59
- case "ForOfStatement":
60
- case "ForInStatement":
61
- if (object.body.type != "BlockStatement") {
62
- object.body = (0, _gen.BlockStatement)([(0, _insert.clone)(object.body)]);
63
- }
64
-
65
- break;
66
-
67
- case "ArrowFunctionExpression":
68
- if (object.body.type !== "BlockStatement" && object.expression) {
69
- object.body = (0, _gen.BlockStatement)([(0, _gen.ReturnStatement)((0, _insert.clone)(object.body))]);
70
- object.expression = false;
71
- }
72
-
73
- break;
74
- }
75
- }
76
-
77
- }
78
-
79
- class ExplicitIdentifiers extends _transform.default {
80
- constructor(o) {
81
- super(o);
82
- }
83
-
84
- match(object, parents) {
85
- return object.type == "Identifier";
86
- }
87
-
88
- transform(object, parents) {
89
- if (object.name === "eval") {
90
- var fn = (0, _insert.getFunction)(object, parents);
91
-
92
- if (fn) {
93
- fn.$requiresEval = true;
94
- }
95
- }
96
-
97
- var info = (0, _identifiers.getIdentifierInfo)(object, parents);
98
-
99
- if (info.isPropertyKey || info.isAccessor) {
100
- var propIndex = parents.findIndex(x => x.type == "MethodDefinition" || x.type == "Property");
101
-
102
- if (propIndex !== -1) {
103
- if (parents[propIndex].type == "MethodDefinition" && parents[propIndex].kind == "constructor") {
104
- return;
105
- }
106
- } // this.log(object.name, "->", `'${object.name}'`);
107
-
108
-
109
- this.replace(object, (0, _gen.Literal)(object.name));
110
- parents[0].computed = true;
111
- parents[0].shorthand = false;
112
- }
113
- }
114
-
115
- }
116
-
117
- class ExplicitDeclarations extends _transform.default {
118
- constructor(o) {
119
- super(o);
120
- }
121
-
122
- match(object, parents) {
123
- return object.type == "VariableDeclaration";
124
- }
125
-
126
- transform(object, parents) {
127
- // for ( var x in ... ) {...}
128
- var forIndex = parents.findIndex(x => x.type == "ForInStatement" || x.type == "ForOfStatement");
129
-
130
- if (forIndex != -1 && parents[forIndex].left == (parents[forIndex - 1] || object)) {
131
- object.declarations.forEach(x => {
132
- x.init = null;
133
- });
134
- return;
135
- }
136
-
137
- var body = parents[0];
138
-
139
- if ((0, _compare.isLoop)(body) || body.type == "LabeledStatement") {
140
- return;
141
- }
142
-
143
- if (body.type == "ExportNamedDeclaration") {
144
- return;
145
- }
146
-
147
- if (!Array.isArray(body)) {
148
- this.error(new Error("body is " + body.type));
149
- }
150
-
151
- if (object.declarations.length > 1) {
152
- // Make singular
153
- var index = body.indexOf(object);
154
-
155
- if (index == -1) {
156
- this.error(new Error("index is -1"));
157
- }
158
-
159
- var after = object.declarations.slice(1);
160
- body.splice(index + 1, 0, ...after.map(x => {
161
- return {
162
- type: "VariableDeclaration",
163
- declarations: [(0, _insert.clone)(x)],
164
- kind: object.kind
165
- };
166
- }));
167
- object.declarations.length = 1;
168
- }
169
- }
170
-
171
- }
172
-
173
- class Preparation extends _transform.default {
174
- constructor(o) {
175
- super(o, _order.ObfuscateOrder.Preparation);
176
- this.before.push(new Block(o));
177
- this.before.push(new _label.default(o));
178
- this.before.push(new ExplicitIdentifiers(o));
179
- this.before.push(new ExplicitDeclarations(o));
180
- }
181
-
182
- match() {
183
- return false;
184
- }
185
-
186
- }
187
-
188
- exports.default = Preparation;