js-confuser 1.7.2 → 2.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +6 -4
- package/.github/workflows/node.js.yml +1 -1
- package/CHANGELOG.md +105 -0
- package/Migration.md +57 -0
- package/README.md +23 -913
- package/dist/constants.js +69 -13
- package/dist/index.js +108 -152
- package/dist/obfuscator.js +316 -118
- package/dist/options.js +1 -109
- package/dist/order.js +30 -30
- package/dist/presets.js +47 -45
- package/dist/probability.js +25 -32
- package/dist/templates/bufferToStringTemplate.js +9 -0
- package/dist/templates/deadCodeTemplates.js +9 -0
- package/dist/templates/getGlobalTemplate.js +19 -0
- package/dist/templates/integrityTemplate.js +30 -0
- package/dist/templates/setFunctionLengthTemplate.js +9 -0
- package/dist/templates/stringCompressionTemplate.js +10 -0
- package/dist/templates/tamperProtectionTemplates.js +21 -0
- package/dist/templates/template.js +213 -93
- package/dist/transforms/astScrambler.js +100 -0
- package/dist/transforms/calculator.js +70 -127
- package/dist/transforms/controlFlowFlattening.js +1182 -0
- package/dist/transforms/deadCode.js +62 -577
- package/dist/transforms/dispatcher.js +300 -309
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +88 -189
- package/dist/transforms/extraction/objectExtraction.js +131 -215
- package/dist/transforms/finalizer.js +56 -59
- package/dist/transforms/flatten.js +275 -276
- package/dist/transforms/functionOutlining.js +230 -0
- package/dist/transforms/identifier/globalConcealing.js +217 -103
- package/dist/transforms/identifier/movedDeclarations.js +167 -91
- package/dist/transforms/identifier/renameVariables.js +240 -187
- package/dist/transforms/lock/integrity.js +61 -184
- package/dist/transforms/lock/lock.js +263 -303
- package/dist/transforms/minify.js +431 -436
- package/dist/transforms/opaquePredicates.js +65 -118
- package/dist/transforms/pack.js +160 -0
- package/dist/transforms/plugin.js +179 -0
- package/dist/transforms/preparation.js +263 -163
- package/dist/transforms/renameLabels.js +132 -56
- package/dist/transforms/rgf.js +142 -240
- package/dist/transforms/shuffle.js +52 -145
- package/dist/transforms/string/encoding.js +45 -173
- package/dist/transforms/string/stringCompression.js +81 -126
- package/dist/transforms/string/stringConcealing.js +189 -224
- package/dist/transforms/string/stringEncoding.js +32 -40
- package/dist/transforms/string/stringSplitting.js +54 -55
- package/dist/transforms/variableMasking.js +232 -0
- package/dist/utils/ControlObject.js +125 -0
- package/dist/utils/IntGen.js +46 -0
- package/dist/utils/NameGen.js +106 -0
- package/dist/utils/ast-utils.js +560 -0
- package/dist/utils/function-utils.js +56 -0
- package/dist/utils/gen-utils.js +48 -0
- package/dist/utils/node.js +77 -0
- package/dist/utils/object-utils.js +21 -0
- package/dist/utils/random-utils.js +91 -0
- package/dist/utils/static-utils.js +64 -0
- package/dist/validateOptions.js +122 -0
- package/index.d.ts +1 -17
- package/package.json +27 -22
- package/src/constants.ts +139 -77
- package/src/index.ts +70 -163
- package/src/obfuscationResult.ts +43 -0
- package/src/obfuscator.ts +328 -135
- package/src/options.ts +154 -623
- package/src/order.ts +14 -14
- package/src/presets.ts +39 -34
- package/src/probability.ts +21 -36
- package/src/templates/{bufferToString.ts → bufferToStringTemplate.ts} +5 -54
- package/src/templates/deadCodeTemplates.ts +1185 -0
- package/src/templates/getGlobalTemplate.ts +72 -0
- package/src/templates/integrityTemplate.ts +69 -0
- package/src/templates/setFunctionLengthTemplate.ts +11 -0
- package/src/templates/stringCompressionTemplate.ts +42 -0
- package/src/templates/tamperProtectionTemplates.ts +116 -0
- package/src/templates/template.ts +183 -92
- package/src/transforms/astScrambler.ts +99 -0
- package/src/transforms/calculator.ts +96 -224
- package/src/transforms/controlFlowFlattening.ts +1594 -0
- package/src/transforms/deadCode.ts +85 -628
- package/src/transforms/dispatcher.ts +431 -636
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -299
- package/src/transforms/extraction/objectExtraction.ts +160 -333
- package/src/transforms/finalizer.ts +63 -64
- package/src/transforms/flatten.ts +439 -557
- package/src/transforms/functionOutlining.ts +225 -0
- package/src/transforms/identifier/globalConcealing.ts +261 -189
- package/src/transforms/identifier/movedDeclarations.ts +228 -142
- package/src/transforms/identifier/renameVariables.ts +252 -258
- package/src/transforms/lock/integrity.ts +84 -260
- package/src/transforms/lock/lock.ts +342 -491
- package/src/transforms/minify.ts +523 -663
- package/src/transforms/opaquePredicates.ts +90 -229
- package/src/transforms/pack.ts +195 -0
- package/src/transforms/plugin.ts +185 -0
- package/src/transforms/preparation.ts +337 -215
- package/src/transforms/renameLabels.ts +176 -77
- package/src/transforms/rgf.ts +293 -386
- package/src/transforms/shuffle.ts +80 -254
- package/src/transforms/string/encoding.ts +26 -129
- package/src/transforms/string/stringCompression.ts +118 -236
- package/src/transforms/string/stringConcealing.ts +255 -339
- package/src/transforms/string/stringEncoding.ts +28 -47
- package/src/transforms/string/stringSplitting.ts +61 -75
- package/src/transforms/variableMasking.ts +257 -0
- package/src/utils/ControlObject.ts +141 -0
- package/src/utils/IntGen.ts +33 -0
- package/src/utils/NameGen.ts +106 -0
- package/src/utils/ast-utils.ts +667 -0
- package/src/utils/function-utils.ts +50 -0
- package/src/utils/gen-utils.ts +48 -0
- package/src/utils/node.ts +78 -0
- package/src/utils/object-utils.ts +21 -0
- package/src/utils/random-utils.ts +79 -0
- package/src/utils/static-utils.ts +66 -0
- package/src/validateOptions.ts +256 -0
- package/tsconfig.json +13 -8
- package/babel.config.js +0 -12
- package/dev.js +0 -8
- package/dist/compiler.js +0 -34
- package/dist/parser.js +0 -59
- package/dist/precedence.js +0 -66
- package/dist/templates/bufferToString.js +0 -108
- package/dist/templates/crash.js +0 -59
- package/dist/templates/es5.js +0 -137
- package/dist/templates/functionLength.js +0 -34
- package/dist/templates/globals.js +0 -9
- package/dist/transforms/antiTooling.js +0 -88
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +0 -1281
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +0 -131
- package/dist/transforms/es5/antiClass.js +0 -164
- package/dist/transforms/es5/antiDestructuring.js +0 -193
- package/dist/transforms/es5/antiES6Object.js +0 -185
- package/dist/transforms/es5/antiSpreadOperator.js +0 -35
- package/dist/transforms/es5/antiTemplate.js +0 -66
- package/dist/transforms/es5/es5.js +0 -123
- package/dist/transforms/extraction/classExtraction.js +0 -83
- package/dist/transforms/identifier/globalAnalysis.js +0 -70
- package/dist/transforms/identifier/variableAnalysis.js +0 -104
- package/dist/transforms/lock/antiDebug.js +0 -76
- package/dist/transforms/stack.js +0 -343
- package/dist/transforms/transform.js +0 -350
- package/dist/traverse.js +0 -110
- package/dist/util/compare.js +0 -145
- package/dist/util/gen.js +0 -564
- package/dist/util/guard.js +0 -9
- package/dist/util/identifiers.js +0 -355
- package/dist/util/insert.js +0 -362
- package/dist/util/math.js +0 -19
- package/dist/util/object.js +0 -40
- package/dist/util/random.js +0 -130
- package/dist/util/scope.js +0 -20
- package/docs/ControlFlowFlattening.md +0 -595
- package/docs/Countermeasures.md +0 -63
- package/docs/ES5.md +0 -197
- package/docs/Integrity.md +0 -75
- package/docs/RGF.md +0 -419
- package/samples/example.js +0 -15
- package/samples/high.js +0 -1
- package/samples/input.js +0 -3
- package/samples/javascriptobfuscator.com.js +0 -8
- package/samples/jscrambler_advanced.js +0 -1894
- package/samples/jscrambler_light.js +0 -1134
- package/samples/low.js +0 -1
- package/samples/medium.js +0 -1
- package/samples/obfuscator.io.js +0 -1686
- package/samples/preemptive.com.js +0 -16
- package/src/compiler.ts +0 -35
- package/src/parser.ts +0 -49
- package/src/precedence.ts +0 -61
- package/src/templates/crash.ts +0 -55
- package/src/templates/es5.ts +0 -131
- package/src/templates/functionLength.ts +0 -32
- package/src/templates/globals.ts +0 -3
- package/src/transforms/antiTooling.ts +0 -102
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +0 -2146
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
- package/src/transforms/es5/antiClass.ts +0 -272
- package/src/transforms/es5/antiDestructuring.ts +0 -294
- package/src/transforms/es5/antiES6Object.ts +0 -267
- package/src/transforms/es5/antiSpreadOperator.ts +0 -56
- package/src/transforms/es5/antiTemplate.ts +0 -98
- package/src/transforms/es5/es5.ts +0 -149
- package/src/transforms/extraction/classExtraction.ts +0 -168
- package/src/transforms/identifier/globalAnalysis.ts +0 -85
- package/src/transforms/identifier/variableAnalysis.ts +0 -118
- package/src/transforms/lock/antiDebug.ts +0 -112
- package/src/transforms/stack.ts +0 -551
- package/src/transforms/transform.ts +0 -453
- package/src/traverse.ts +0 -120
- package/src/types.ts +0 -131
- package/src/util/compare.ts +0 -181
- package/src/util/gen.ts +0 -651
- package/src/util/guard.ts +0 -7
- package/src/util/identifiers.ts +0 -494
- package/src/util/insert.ts +0 -419
- package/src/util/math.ts +0 -15
- package/src/util/object.ts +0 -39
- package/src/util/random.ts +0 -141
- package/src/util/scope.ts +0 -21
- package/test/code/Cash.src.js +0 -1011
- package/test/code/Cash.test.ts +0 -49
- package/test/code/Dynamic.src.js +0 -118
- package/test/code/Dynamic.test.ts +0 -49
- package/test/code/ES6.src.js +0 -235
- package/test/code/ES6.test.ts +0 -42
- package/test/code/NewFeatures.test.ts +0 -19
- package/test/code/StrictMode.src.js +0 -65
- package/test/code/StrictMode.test.js +0 -37
- package/test/compare.test.ts +0 -104
- package/test/index.test.ts +0 -249
- package/test/options.test.ts +0 -132
- package/test/presets.test.ts +0 -22
- package/test/probability.test.ts +0 -44
- package/test/templates/template.test.ts +0 -14
- package/test/transforms/antiTooling.test.ts +0 -52
- package/test/transforms/calculator.test.ts +0 -78
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +0 -1274
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +0 -192
- package/test/transforms/deadCode.test.ts +0 -85
- package/test/transforms/dispatcher.test.ts +0 -457
- package/test/transforms/es5/antiClass.test.ts +0 -427
- package/test/transforms/es5/antiDestructuring.test.ts +0 -157
- package/test/transforms/es5/antiES6Object.test.ts +0 -245
- package/test/transforms/es5/antiTemplate.test.ts +0 -116
- package/test/transforms/es5/es5.test.ts +0 -110
- package/test/transforms/extraction/classExtraction.test.ts +0 -86
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +0 -200
- package/test/transforms/extraction/objectExtraction.test.ts +0 -491
- package/test/transforms/flatten.test.ts +0 -721
- package/test/transforms/hexadecimalNumbers.test.ts +0 -62
- package/test/transforms/identifier/globalConcealing.test.ts +0 -72
- package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
- package/test/transforms/identifier/renameVariables.test.ts +0 -621
- package/test/transforms/lock/antiDebug.test.ts +0 -66
- package/test/transforms/lock/browserLock.test.ts +0 -129
- package/test/transforms/lock/countermeasures.test.ts +0 -100
- package/test/transforms/lock/integrity.test.ts +0 -161
- package/test/transforms/lock/lock.test.ts +0 -204
- package/test/transforms/lock/osLock.test.ts +0 -312
- package/test/transforms/lock/selfDefending.test.ts +0 -68
- package/test/transforms/minify.test.ts +0 -575
- package/test/transforms/opaquePredicates.test.ts +0 -43
- package/test/transforms/preparation.test.ts +0 -157
- package/test/transforms/renameLabels.test.ts +0 -95
- package/test/transforms/rgf.test.ts +0 -378
- package/test/transforms/shuffle.test.ts +0 -135
- package/test/transforms/stack.test.ts +0 -573
- package/test/transforms/string/stringCompression.test.ts +0 -120
- package/test/transforms/string/stringConcealing.test.ts +0 -299
- package/test/transforms/string/stringEncoding.test.ts +0 -95
- package/test/transforms/string/stringSplitting.test.ts +0 -135
- package/test/transforms/transform.test.ts +0 -66
- package/test/traverse.test.ts +0 -139
- package/test/util/compare.test.ts +0 -34
- package/test/util/gen.test.ts +0 -121
- package/test/util/identifiers.test.ts +0 -253
- package/test/util/insert.test.ts +0 -142
- package/test/util/math.test.ts +0 -5
- package/test/util/random.test.ts +0 -71
- /package/dist/{types.js → obfuscationResult.js} +0 -0
package/src/util/insert.ts
DELETED
|
@@ -1,419 +0,0 @@
|
|
|
1
|
-
import { ok } from "assert";
|
|
2
|
-
import { getBlock, isBlock } from "../traverse";
|
|
3
|
-
import { Node } from "./gen";
|
|
4
|
-
import { getIdentifierInfo, validateChain } from "./identifiers";
|
|
5
|
-
|
|
6
|
-
export function isClass(object: Node): boolean {
|
|
7
|
-
return (
|
|
8
|
-
object.type === "ClassDeclaration" || object.type === "ClassExpression"
|
|
9
|
-
);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* - `FunctionDeclaration`
|
|
14
|
-
* - `FunctionExpression`
|
|
15
|
-
* - `ArrowFunctionExpression`
|
|
16
|
-
* @param object
|
|
17
|
-
* @returns
|
|
18
|
-
*/
|
|
19
|
-
export function isFunction(object: Node): boolean {
|
|
20
|
-
return [
|
|
21
|
-
"FunctionDeclaration",
|
|
22
|
-
"FunctionExpression",
|
|
23
|
-
"ArrowFunctionExpression",
|
|
24
|
-
].includes(object && object.type);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function isStrictModeFunction(object: Node): boolean {
|
|
28
|
-
ok(isFunction(object));
|
|
29
|
-
|
|
30
|
-
return (
|
|
31
|
-
object.body.type === "BlockStatement" &&
|
|
32
|
-
object.body.body[0] &&
|
|
33
|
-
object.body.body[0].type === "ExpressionStatement" &&
|
|
34
|
-
object.body.body[0].directive === "use strict"
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* The function context where the object is.
|
|
40
|
-
*
|
|
41
|
-
* - Determines if async context.
|
|
42
|
-
* - Determines variable context.
|
|
43
|
-
*
|
|
44
|
-
* @param object
|
|
45
|
-
* @param parents
|
|
46
|
-
*/
|
|
47
|
-
export function getFunction(object: Node, parents: Node[]): Node {
|
|
48
|
-
return parents.find((x) => isFunction(x));
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Refers to the current function or Root node
|
|
53
|
-
* @param parents
|
|
54
|
-
*/
|
|
55
|
-
export function getVarContext(object: Node, parents: Node[]): Node {
|
|
56
|
-
var fn = getFunction(object, parents);
|
|
57
|
-
if (fn) {
|
|
58
|
-
return fn;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
var top = parents[parents.length - 1] || object;
|
|
62
|
-
|
|
63
|
-
if (top) {
|
|
64
|
-
ok(top.type == "Program", "Root node not program, its " + top.type);
|
|
65
|
-
return top;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
throw new Error("Missing root node");
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* `Function` or root node
|
|
73
|
-
* @param object
|
|
74
|
-
* @returns
|
|
75
|
-
*/
|
|
76
|
-
export function isVarContext(object: Node) {
|
|
77
|
-
return (
|
|
78
|
-
isFunction(object) ||
|
|
79
|
-
object.type == "Program" ||
|
|
80
|
-
object.type == "DoExpression"
|
|
81
|
-
); // Stage 1
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* `Block` or root node
|
|
86
|
-
* @param object
|
|
87
|
-
* @returns
|
|
88
|
-
*/
|
|
89
|
-
export function isLexContext(object: Node): boolean {
|
|
90
|
-
return isBlock(object) || object.type == "Program";
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Either a `var context` or `lex context`
|
|
95
|
-
* @param object
|
|
96
|
-
* @returns
|
|
97
|
-
*/
|
|
98
|
-
export function isContext(object: Node): boolean {
|
|
99
|
-
return isVarContext(object) || isLexContext(object);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export function getContexts(object: Node, parents: Node[]): Node[] {
|
|
103
|
-
return [object, ...parents].filter((x) => isContext(x));
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Refers to the current lexical block or Root node.
|
|
108
|
-
* @param parents
|
|
109
|
-
*/
|
|
110
|
-
export function getLexContext(object: Node, parents: Node[]): Node {
|
|
111
|
-
var block = getBlock(object, parents);
|
|
112
|
-
if (block) {
|
|
113
|
-
return block;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
var top = parents[parents.length - 1];
|
|
117
|
-
if (!top) {
|
|
118
|
-
throw new Error("Missing root node");
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export function getDefiningContext(o: Node, p: Node[]): Node {
|
|
123
|
-
validateChain(o, p);
|
|
124
|
-
ok(o.type == "Identifier");
|
|
125
|
-
var info = getIdentifierInfo(o, p);
|
|
126
|
-
|
|
127
|
-
ok(info.spec.isDefined);
|
|
128
|
-
|
|
129
|
-
if (info.isVariableDeclaration) {
|
|
130
|
-
var variableDeclaration = p.find((x) => x.type == "VariableDeclaration");
|
|
131
|
-
ok(variableDeclaration);
|
|
132
|
-
|
|
133
|
-
if (
|
|
134
|
-
variableDeclaration.kind === "let" ||
|
|
135
|
-
variableDeclaration.kind === "const"
|
|
136
|
-
) {
|
|
137
|
-
var context = getVarContext(o, p);
|
|
138
|
-
if (context && context.type === "Program") {
|
|
139
|
-
return getLexContext(o, p);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
if (info.isFunctionDeclaration) {
|
|
145
|
-
return getVarContext(p[0], p.slice(1));
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return getVarContext(o, p);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* A more accurate context finding function.
|
|
153
|
-
* @param o Object
|
|
154
|
-
* @param p Parents
|
|
155
|
-
* @returns Contexts
|
|
156
|
-
*/
|
|
157
|
-
export function getAllDefiningContexts(o: Node, p: Node[]): Node[] {
|
|
158
|
-
var contexts = [getDefiningContext(o, p)];
|
|
159
|
-
|
|
160
|
-
var info = getIdentifierInfo(o, p);
|
|
161
|
-
if (info.isFunctionParameter) {
|
|
162
|
-
// Get Function
|
|
163
|
-
var fn = getFunction(o, p);
|
|
164
|
-
|
|
165
|
-
// contexts.push(fn.body);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if (info.isClauseParameter) {
|
|
169
|
-
var catchClause = p.find((x) => x.type === "CatchClause");
|
|
170
|
-
if (catchClause) {
|
|
171
|
-
return [catchClause];
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return contexts;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
export function getReferencingContexts(
|
|
179
|
-
o: Node,
|
|
180
|
-
p: Node[],
|
|
181
|
-
info?: ReturnType<typeof getIdentifierInfo>
|
|
182
|
-
): Node[] {
|
|
183
|
-
validateChain(o, p);
|
|
184
|
-
ok(o.type == "Identifier");
|
|
185
|
-
|
|
186
|
-
if (!info) {
|
|
187
|
-
info = getIdentifierInfo(o, p);
|
|
188
|
-
}
|
|
189
|
-
ok(info.spec.isReferenced);
|
|
190
|
-
|
|
191
|
-
return [getVarContext(o, p), getLexContext(o, p)];
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
export function getBlockBody(block: Node): Node[] {
|
|
195
|
-
if (!block) {
|
|
196
|
-
throw new Error("no block body");
|
|
197
|
-
}
|
|
198
|
-
if (Array.isArray(block)) {
|
|
199
|
-
return block;
|
|
200
|
-
}
|
|
201
|
-
return getBlockBody(block.body);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
export function getIndexDirect(object: Node, parent: Node): string {
|
|
205
|
-
return Object.keys(parent).find((x) => parent[x] == object);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Attempts to a delete a variable/functions declaration.
|
|
210
|
-
* @param object
|
|
211
|
-
* @param parents
|
|
212
|
-
*/
|
|
213
|
-
export function deleteDeclaration(object: Node, parents: Node[]) {
|
|
214
|
-
validateChain(object, parents);
|
|
215
|
-
|
|
216
|
-
// variables
|
|
217
|
-
var list = [object, ...parents];
|
|
218
|
-
|
|
219
|
-
var declaratorIndex = list.findIndex((x) => x.type == "VariableDeclarator");
|
|
220
|
-
if (declaratorIndex != -1) {
|
|
221
|
-
var declarator = list[declaratorIndex]; // {type: VariableDeclarator, id: Identifier, init: Literal|Expression...}
|
|
222
|
-
var declarations = list[declaratorIndex + 1]; // declarator[]
|
|
223
|
-
var VariableDeclaration = list[declaratorIndex + 2];
|
|
224
|
-
var body = list[declaratorIndex + 3];
|
|
225
|
-
|
|
226
|
-
deleteDirect(declarator, declarations);
|
|
227
|
-
|
|
228
|
-
if (VariableDeclaration.declarations.length == 0) {
|
|
229
|
-
deleteDirect(VariableDeclaration, body);
|
|
230
|
-
}
|
|
231
|
-
} else {
|
|
232
|
-
if (object.type != "FunctionDeclaration") {
|
|
233
|
-
throw new Error("No method to delete: " + object.type);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
deleteDirect(object, parents[0]);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Object must be directly nested in parent
|
|
242
|
-
*/
|
|
243
|
-
export function deleteDirect(object: Node, parent: Node) {
|
|
244
|
-
if (!object) {
|
|
245
|
-
throw new Error("object undefined");
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
if (!parent) {
|
|
249
|
-
throw new Error("parent undefined");
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
validateChain(object, [parent]);
|
|
253
|
-
|
|
254
|
-
if (typeof parent === "object") {
|
|
255
|
-
if (Array.isArray(parent)) {
|
|
256
|
-
var index = parent.indexOf(object);
|
|
257
|
-
if (index != -1) {
|
|
258
|
-
// delete
|
|
259
|
-
parent.splice(index, 1);
|
|
260
|
-
} else {
|
|
261
|
-
console.log("parent=", parent);
|
|
262
|
-
console.log("object=", object);
|
|
263
|
-
throw new Error("index -1");
|
|
264
|
-
}
|
|
265
|
-
} else {
|
|
266
|
-
var keyName = Object.keys(parent).find((x) => parent[x] == object);
|
|
267
|
-
|
|
268
|
-
if (keyName) {
|
|
269
|
-
delete parent[keyName];
|
|
270
|
-
} else {
|
|
271
|
-
throw new Error("keyName undefined");
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
export function prepend(block: Node, ...nodes: Node[]) {
|
|
278
|
-
ok(!Array.isArray(block), "block should not be array");
|
|
279
|
-
|
|
280
|
-
if (block.type == "Program") {
|
|
281
|
-
var moveBy = 0;
|
|
282
|
-
block.body.forEach((stmt, i) => {
|
|
283
|
-
if (stmt.type == "ImportDeclaration") {
|
|
284
|
-
if (moveBy == i) {
|
|
285
|
-
moveBy++;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
if (
|
|
290
|
-
stmt.type === "ExpressionStatement" &&
|
|
291
|
-
typeof stmt.directive === "string"
|
|
292
|
-
) {
|
|
293
|
-
if (moveBy == i) {
|
|
294
|
-
moveBy++;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
block.body.splice(moveBy, 0, ...nodes);
|
|
300
|
-
} else if (block.type === "SwitchCase") {
|
|
301
|
-
block.consequent.unshift(...nodes);
|
|
302
|
-
} else {
|
|
303
|
-
var bodyArray = getBlockBody(block);
|
|
304
|
-
|
|
305
|
-
// Check for 'use strict'
|
|
306
|
-
if (bodyArray[0] && bodyArray[0].directive) {
|
|
307
|
-
// Insert under 'use strict' directive
|
|
308
|
-
bodyArray.splice(1, 0, ...nodes);
|
|
309
|
-
} else {
|
|
310
|
-
// Prepend at the top of the block
|
|
311
|
-
bodyArray.unshift(...nodes);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
export function append(block: Node, ...nodes: Node[]) {
|
|
317
|
-
ok(!Array.isArray(block), "block should not be array");
|
|
318
|
-
getBlockBody(block).push(...nodes);
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
export function clone<T>(object: T): T {
|
|
322
|
-
if (typeof object === "object" && object) {
|
|
323
|
-
if (Array.isArray(object)) {
|
|
324
|
-
var newArray = [] as unknown as any;
|
|
325
|
-
object.forEach((element) => {
|
|
326
|
-
newArray.push(clone(element));
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
return newArray;
|
|
330
|
-
} else {
|
|
331
|
-
var newObject = {} as T;
|
|
332
|
-
|
|
333
|
-
Object.keys(object).forEach((key) => {
|
|
334
|
-
if (!(key + "").startsWith("$")) {
|
|
335
|
-
newObject[key] = clone(object[key]);
|
|
336
|
-
}
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
return newObject;
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
return object as any;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* | Return Value | Description |
|
|
348
|
-
* | --- | --- |
|
|
349
|
-
* | `"initializer"` | For-statement initializer (`.init`) |
|
|
350
|
-
* | `"left-hand"` | For-In/Of-statement left-hand (`.left`) |
|
|
351
|
-
* | `false` | None of the above |
|
|
352
|
-
*
|
|
353
|
-
* Determines if given node is a for-loop initializer.
|
|
354
|
-
*
|
|
355
|
-
* @param o
|
|
356
|
-
* @param p
|
|
357
|
-
* @returns
|
|
358
|
-
*/
|
|
359
|
-
export function isForInitialize(
|
|
360
|
-
o: Node,
|
|
361
|
-
p: Node[]
|
|
362
|
-
): "initializer" | "left-hand" | false {
|
|
363
|
-
validateChain(o, p);
|
|
364
|
-
|
|
365
|
-
var forIndex = p.findIndex(
|
|
366
|
-
(x) =>
|
|
367
|
-
x.type == "ForStatement" ||
|
|
368
|
-
x.type == "ForInStatement" ||
|
|
369
|
-
x.type == "ForOfStatement"
|
|
370
|
-
);
|
|
371
|
-
|
|
372
|
-
if (
|
|
373
|
-
p
|
|
374
|
-
.slice(0, forIndex)
|
|
375
|
-
.find((x) =>
|
|
376
|
-
["ArrowFunctionExpression", "BlockStatement"].includes(x.type)
|
|
377
|
-
)
|
|
378
|
-
) {
|
|
379
|
-
return false;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
if (forIndex !== -1) {
|
|
383
|
-
if (p[forIndex].type == "ForStatement") {
|
|
384
|
-
if (p[forIndex].init == (p[forIndex - 1] || o)) {
|
|
385
|
-
return "initializer";
|
|
386
|
-
}
|
|
387
|
-
} else {
|
|
388
|
-
if (p[forIndex].left == (p[forIndex - 1] || o)) {
|
|
389
|
-
return "left-hand";
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
return false;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
/**
|
|
398
|
-
* Computes the `function.length` property given the parameter nodes.
|
|
399
|
-
*
|
|
400
|
-
* @param params
|
|
401
|
-
* @returns
|
|
402
|
-
*/
|
|
403
|
-
export function computeFunctionLength(params: Node[]): number {
|
|
404
|
-
var count = 0;
|
|
405
|
-
|
|
406
|
-
for (var parameterNode of params) {
|
|
407
|
-
if (
|
|
408
|
-
parameterNode.type === "Identifier" ||
|
|
409
|
-
parameterNode.type === "ObjectPattern" ||
|
|
410
|
-
parameterNode.type === "ArrayPattern"
|
|
411
|
-
) {
|
|
412
|
-
count++;
|
|
413
|
-
} else {
|
|
414
|
-
break;
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
return count;
|
|
419
|
-
}
|
package/src/util/math.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export function getFactors(num: number) {
|
|
2
|
-
const isEven = num % 2 === 0;
|
|
3
|
-
const max = Math.sqrt(num);
|
|
4
|
-
const inc = isEven ? 1 : 2;
|
|
5
|
-
let factors = [1, num];
|
|
6
|
-
|
|
7
|
-
for (let curFactor = isEven ? 2 : 3; curFactor <= max; curFactor += inc) {
|
|
8
|
-
if (num % curFactor !== 0) continue;
|
|
9
|
-
factors.push(curFactor);
|
|
10
|
-
let compliment = num / curFactor;
|
|
11
|
-
if (compliment !== curFactor) factors.push(compliment);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
return factors;
|
|
15
|
-
}
|
package/src/util/object.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
export function createObject(
|
|
2
|
-
keys: string[],
|
|
3
|
-
values: any[]
|
|
4
|
-
): { [key: string]: any } {
|
|
5
|
-
if (keys.length != values.length) {
|
|
6
|
-
throw new Error("length mismatch");
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
var newObject = {};
|
|
10
|
-
|
|
11
|
-
keys.forEach((x, i) => {
|
|
12
|
-
newObject[x] = values[i];
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
return newObject;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Removes all `$`-prefixed properties on a deeply nested object.
|
|
20
|
-
*
|
|
21
|
-
* - Modifies the object.
|
|
22
|
-
*/
|
|
23
|
-
export function remove$Properties(object: any, seen = new Set<Node>()) {
|
|
24
|
-
if (typeof object === "object" && object) {
|
|
25
|
-
if (seen.has(object)) {
|
|
26
|
-
// console.log(object);
|
|
27
|
-
// throw new Error("Already seen");
|
|
28
|
-
}
|
|
29
|
-
seen.add(object);
|
|
30
|
-
|
|
31
|
-
Object.keys(object).forEach((key) => {
|
|
32
|
-
if (key.charAt(0) == "$") {
|
|
33
|
-
delete object[key];
|
|
34
|
-
} else {
|
|
35
|
-
remove$Properties(object[key], seen);
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
package/src/util/random.ts
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { ok } from "assert";
|
|
2
|
-
import {
|
|
3
|
-
Literal,
|
|
4
|
-
ObjectExpression,
|
|
5
|
-
Identifier,
|
|
6
|
-
Property,
|
|
7
|
-
Node,
|
|
8
|
-
ArrayExpression,
|
|
9
|
-
} from "./gen";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Returns a random element from the given array
|
|
13
|
-
* @param choices Array of items
|
|
14
|
-
* @returns One of the items in the array at random
|
|
15
|
-
*/
|
|
16
|
-
export function choice<T>(choices: T[]): T {
|
|
17
|
-
var index = Math.floor(Math.random() * choices.length);
|
|
18
|
-
return choices[index];
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Returns a true/false based on the percent chance (0%-100%)
|
|
23
|
-
* @param percentChance AS A PERCENTAGE 0 - 100%
|
|
24
|
-
*/
|
|
25
|
-
export function chance(percentChance: number): boolean {
|
|
26
|
-
return Math.random() < percentChance / 100;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* **Mutates the given array**
|
|
31
|
-
* @param array
|
|
32
|
-
*/
|
|
33
|
-
export function shuffle(array: any[]): any[] {
|
|
34
|
-
array.sort(() => Math.random() - 0.5);
|
|
35
|
-
return array;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Returns a random string.
|
|
40
|
-
*/
|
|
41
|
-
export function getRandomString(length: number) {
|
|
42
|
-
var result = "";
|
|
43
|
-
var characters =
|
|
44
|
-
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
45
|
-
var charactersLength = characters.length;
|
|
46
|
-
for (var i = 0; i < length; i++) {
|
|
47
|
-
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
|
48
|
-
}
|
|
49
|
-
return result;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export function getRandom(min, max) {
|
|
53
|
-
return Math.random() * (max - min) + min;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export function getRandomInteger(min, max) {
|
|
57
|
-
return Math.floor(getRandom(min, max));
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function splitIntoChunks(str: string, size: number) {
|
|
61
|
-
ok(typeof str === "string", "str must be typeof string");
|
|
62
|
-
ok(typeof size === "number", "size must be typeof number");
|
|
63
|
-
ok(Math.floor(size) === size, "size must be integer");
|
|
64
|
-
|
|
65
|
-
const numChunks = Math.ceil(str.length / size);
|
|
66
|
-
const chunks = new Array(numChunks);
|
|
67
|
-
|
|
68
|
-
for (let i = 0, o = 0; i < numChunks; ++i, o += size) {
|
|
69
|
-
chunks[i] = str.substr(o, size);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return chunks;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Returns a random expression that will test to `false`.
|
|
77
|
-
*/
|
|
78
|
-
export function getRandomFalseExpression() {
|
|
79
|
-
var type = choice(["0", "false", "null", "undefined", "NaN", "emptyString"]);
|
|
80
|
-
|
|
81
|
-
switch (type) {
|
|
82
|
-
case "0":
|
|
83
|
-
return Literal(0);
|
|
84
|
-
case "false":
|
|
85
|
-
return Literal(false);
|
|
86
|
-
case "null":
|
|
87
|
-
return Identifier("null");
|
|
88
|
-
case "undefined":
|
|
89
|
-
return Identifier("undefined");
|
|
90
|
-
case "NaN":
|
|
91
|
-
return Identifier("NaN");
|
|
92
|
-
default:
|
|
93
|
-
// case "emptyString":
|
|
94
|
-
return Literal("");
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Returns a random expression that will test to `true`
|
|
100
|
-
*/
|
|
101
|
-
export function getRandomTrueExpression() {
|
|
102
|
-
var type = choice([
|
|
103
|
-
"number",
|
|
104
|
-
"true",
|
|
105
|
-
"Infinity",
|
|
106
|
-
"nonEmptyString",
|
|
107
|
-
"array",
|
|
108
|
-
"object",
|
|
109
|
-
]);
|
|
110
|
-
|
|
111
|
-
switch (type) {
|
|
112
|
-
case "number":
|
|
113
|
-
return Literal(getRandomInteger(1, 100));
|
|
114
|
-
case "true":
|
|
115
|
-
return Identifier("true");
|
|
116
|
-
case "Infinity":
|
|
117
|
-
return Identifier("Infinity");
|
|
118
|
-
case "nonEmptyString":
|
|
119
|
-
return Literal(getRandomString(getRandomInteger(3, 9)));
|
|
120
|
-
case "array":
|
|
121
|
-
return ArrayExpression([]);
|
|
122
|
-
default:
|
|
123
|
-
//case "object":
|
|
124
|
-
return ObjectExpression([]);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
export function alphabeticalGenerator(index: number) {
|
|
129
|
-
let name = "";
|
|
130
|
-
while (index > 0) {
|
|
131
|
-
var t = (index - 1) % 52;
|
|
132
|
-
var thisChar =
|
|
133
|
-
t >= 26 ? String.fromCharCode(65 + t - 26) : String.fromCharCode(97 + t);
|
|
134
|
-
name = thisChar + name;
|
|
135
|
-
index = ((index - t) / 52) | 0;
|
|
136
|
-
}
|
|
137
|
-
if (!name) {
|
|
138
|
-
name = "_";
|
|
139
|
-
}
|
|
140
|
-
return name;
|
|
141
|
-
}
|
package/src/util/scope.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { ok } from "assert";
|
|
2
|
-
import { isBlock } from "../traverse";
|
|
3
|
-
import { Node } from "./gen";
|
|
4
|
-
|
|
5
|
-
export function isLexicalScope(object: Node) {
|
|
6
|
-
return isBlock(object) || object.type == "SwitchCase";
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export function getLexicalScope(object: Node, parents: Node[]): Node {
|
|
10
|
-
return [object, ...parents].find((node) => isLexicalScope(node));
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function getLexicalScopeBody(object: Node): Node[] {
|
|
14
|
-
ok(isLexicalScope(object));
|
|
15
|
-
|
|
16
|
-
return isBlock(object)
|
|
17
|
-
? object.body
|
|
18
|
-
: object.type === "SwitchCase"
|
|
19
|
-
? object.consequent
|
|
20
|
-
: ok("Unhandled case");
|
|
21
|
-
}
|