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.
- package/CHANGELOG.md +38 -0
- package/README.md +12 -27
- package/dist/compiler.js +2 -8
- package/dist/constants.js +17 -10
- package/dist/index.js +7 -30
- package/dist/obfuscator.js +15 -62
- package/dist/options.js +21 -38
- package/dist/order.js +4 -7
- package/dist/parser.js +5 -13
- package/dist/precedence.js +6 -8
- package/dist/presets.js +4 -6
- package/dist/probability.js +13 -24
- package/dist/templates/bufferToString.js +100 -5
- package/dist/templates/crash.js +51 -9
- package/dist/templates/es5.js +125 -6
- package/dist/templates/functionLength.js +24 -6
- package/dist/templates/globals.js +9 -0
- package/dist/templates/template.js +71 -30
- package/dist/transforms/antiTooling.js +26 -22
- package/dist/transforms/calculator.js +18 -54
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +236 -333
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
- package/dist/transforms/deadCode.js +528 -27
- package/dist/transforms/dispatcher.js +106 -110
- package/dist/transforms/es5/antiClass.js +70 -44
- package/dist/transforms/es5/antiDestructuring.js +14 -38
- package/dist/transforms/es5/antiES6Object.js +39 -48
- package/dist/transforms/es5/antiSpreadOperator.js +5 -14
- package/dist/transforms/es5/antiTemplate.js +10 -19
- package/dist/transforms/es5/es5.js +7 -40
- package/dist/transforms/extraction/classExtraction.js +83 -0
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +41 -80
- package/dist/transforms/extraction/objectExtraction.js +24 -56
- package/dist/transforms/finalizer.js +6 -20
- package/dist/transforms/flatten.js +51 -99
- package/dist/transforms/identifier/globalAnalysis.js +8 -26
- package/dist/transforms/identifier/globalConcealing.js +35 -54
- package/dist/transforms/identifier/movedDeclarations.js +66 -38
- package/dist/transforms/identifier/renameVariables.js +29 -68
- package/dist/transforms/identifier/variableAnalysis.js +21 -48
- package/dist/transforms/lock/antiDebug.js +20 -25
- package/dist/transforms/lock/integrity.js +48 -47
- package/dist/transforms/lock/lock.js +62 -113
- package/dist/transforms/minify.js +77 -108
- package/dist/transforms/opaquePredicates.js +11 -48
- package/dist/transforms/preparation.js +17 -50
- package/dist/transforms/renameLabels.js +5 -22
- package/dist/transforms/rgf.js +93 -69
- package/dist/transforms/shuffle.js +41 -46
- package/dist/transforms/stack.js +35 -98
- package/dist/transforms/string/encoding.js +73 -27
- package/dist/transforms/string/stringCompression.js +44 -68
- package/dist/transforms/string/stringConcealing.js +125 -134
- package/dist/transforms/string/stringEncoding.js +6 -26
- package/dist/transforms/string/stringSplitting.js +5 -30
- package/dist/transforms/transform.js +50 -100
- package/dist/traverse.js +11 -18
- package/dist/util/compare.js +27 -29
- package/dist/util/gen.js +32 -86
- package/dist/util/guard.js +0 -1
- package/dist/util/identifiers.js +9 -72
- package/dist/util/insert.js +27 -77
- package/dist/util/math.js +0 -3
- package/dist/util/object.js +3 -7
- package/dist/util/random.js +5 -36
- package/dist/util/scope.js +6 -3
- package/package.json +3 -3
- package/src/constants.ts +12 -0
- package/src/options.ts +13 -0
- package/src/order.ts +2 -2
- package/src/templates/bufferToString.ts +49 -11
- package/src/templates/functionLength.ts +21 -3
- package/src/templates/globals.ts +3 -0
- package/src/templates/template.ts +85 -25
- package/src/transforms/antiTooling.ts +33 -11
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +2 -2
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
- package/src/transforms/deadCode.ts +0 -16
- package/src/transforms/dispatcher.ts +91 -69
- package/src/transforms/es5/antiClass.ts +10 -1
- package/src/transforms/extraction/classExtraction.ts +168 -0
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +9 -10
- package/src/transforms/extraction/objectExtraction.ts +4 -15
- package/src/transforms/flatten.ts +20 -5
- package/src/transforms/identifier/globalConcealing.ts +29 -65
- package/src/transforms/identifier/movedDeclarations.ts +90 -24
- package/src/transforms/minify.ts +27 -12
- package/src/transforms/rgf.ts +94 -5
- package/src/transforms/stack.ts +12 -3
- package/src/transforms/string/encoding.ts +85 -51
- package/src/transforms/string/stringCompression.ts +5 -8
- package/src/transforms/string/stringConcealing.ts +139 -113
- package/src/transforms/string/stringEncoding.ts +1 -2
- package/src/transforms/string/stringSplitting.ts +1 -2
- package/src/transforms/transform.ts +30 -1
- package/src/util/compare.ts +39 -5
- package/src/util/gen.ts +10 -3
- package/src/util/insert.ts +17 -0
- package/src/util/scope.ts +14 -2
- package/test/code/Cash.test.ts +10 -4
- package/test/code/StrictMode.src.js +65 -0
- package/test/code/StrictMode.test.js +37 -0
- package/test/compare.test.ts +62 -2
- package/test/options.test.ts +111 -55
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
- package/test/transforms/dispatcher.test.ts +55 -0
- package/test/transforms/extraction/classExtraction.test.ts +86 -0
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +8 -0
- package/test/transforms/extraction/objectExtraction.test.ts +2 -0
- package/test/transforms/identifier/globalConcealing.test.ts +19 -0
- package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
- package/test/transforms/minify.test.ts +37 -0
- package/test/transforms/rgf.test.ts +50 -0
- package/dist/transforms/controlFlowFlattening/choiceFlowObfuscation.js +0 -62
- package/dist/transforms/controlFlowFlattening/controlFlowObfuscation.js +0 -159
- package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +0 -106
- package/dist/transforms/eval.js +0 -84
- package/dist/transforms/hexadecimalNumbers.js +0 -63
- package/dist/transforms/hideInitializingCode.js +0 -270
- package/dist/transforms/identifier/nameRecycling.js +0 -218
- package/dist/transforms/label.js +0 -67
- package/dist/transforms/preparation/nameConflicts.js +0 -116
- 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
|
|
27
|
-
|
|
28
|
-
function
|
|
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,
|
|
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(
|
|
25
|
-
|
|
26
|
-
function
|
|
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,
|
|
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(
|
|
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];
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
});
|