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