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/gen.ts
DELETED
|
@@ -1,651 +0,0 @@
|
|
|
1
|
-
import { ok } from "assert";
|
|
2
|
-
import { predictableFunctionTag } from "../constants";
|
|
3
|
-
import { isValidIdentifier } from "./compare";
|
|
4
|
-
|
|
5
|
-
export type Type =
|
|
6
|
-
| "Identifier"
|
|
7
|
-
| "Literal"
|
|
8
|
-
| "VariableDeclaration"
|
|
9
|
-
| "VariableDeclarator"
|
|
10
|
-
| "IfStatement"
|
|
11
|
-
| "SwitchStatement"
|
|
12
|
-
| "SwitchCase"
|
|
13
|
-
| "FunctionDeclaration"
|
|
14
|
-
| "ClassDeclaration"
|
|
15
|
-
| "ClassExpression"
|
|
16
|
-
| "ClassBody"
|
|
17
|
-
| "BlockStatement"
|
|
18
|
-
| "Program"
|
|
19
|
-
| "ThisExpression"
|
|
20
|
-
| "Super"
|
|
21
|
-
| "ForInStatement"
|
|
22
|
-
| "ForOfStatement"
|
|
23
|
-
| "WhileStatement"
|
|
24
|
-
| "DoWhileStatement"
|
|
25
|
-
| "UnaryExpression"
|
|
26
|
-
| "ExpressionStatement"
|
|
27
|
-
| "AssignmentExpression"
|
|
28
|
-
| "NewExpression"
|
|
29
|
-
| "CallExpression"
|
|
30
|
-
| "ArrayPattern"
|
|
31
|
-
| "LogicalExpression"
|
|
32
|
-
| "BinaryExpression"
|
|
33
|
-
| "UpdateExpression"
|
|
34
|
-
| "ThrowStatement"
|
|
35
|
-
| "MethodDefinition"
|
|
36
|
-
| "LabeledStatement";
|
|
37
|
-
|
|
38
|
-
export type Node = { type: string; [key: string]: any };
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* 0. First index is the Node.
|
|
42
|
-
* 1. Second index is the parents as an array.
|
|
43
|
-
*/
|
|
44
|
-
export type Location = [Node, Node[]];
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Eval Callbacks are called once all transformations are done.
|
|
48
|
-
*
|
|
49
|
-
* - Called with object, and parents.
|
|
50
|
-
*/
|
|
51
|
-
export type EvalCallback = {
|
|
52
|
-
$eval: (object: Node, parents: Node[]) => void;
|
|
53
|
-
[key: string]: any;
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* - 0. First index is the Node.
|
|
58
|
-
* - ...1 Parent nodes.
|
|
59
|
-
*/
|
|
60
|
-
export type Chain = Node[];
|
|
61
|
-
|
|
62
|
-
export function Literal(value: string | number | boolean): Node {
|
|
63
|
-
if (typeof value === "undefined") {
|
|
64
|
-
throw new Error("value is undefined");
|
|
65
|
-
}
|
|
66
|
-
if (typeof value == "number" && value < 0) {
|
|
67
|
-
return UnaryExpression("-", Literal(Math.abs(value)));
|
|
68
|
-
}
|
|
69
|
-
ok(value === value, "NaN value is disallowed");
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
type: "Literal",
|
|
73
|
-
value: value,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export function RegexLiteral(pattern: string, flags: string) {
|
|
78
|
-
return {
|
|
79
|
-
type: "Literal",
|
|
80
|
-
regex: {
|
|
81
|
-
pattern,
|
|
82
|
-
flags,
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export function Identifier(name: string) {
|
|
88
|
-
if (!name) {
|
|
89
|
-
throw new Error("name is null/empty");
|
|
90
|
-
}
|
|
91
|
-
if (name == "this") {
|
|
92
|
-
throw new Error("Use ThisExpression");
|
|
93
|
-
}
|
|
94
|
-
if (name == "super") {
|
|
95
|
-
throw new Error("Use Super");
|
|
96
|
-
}
|
|
97
|
-
return {
|
|
98
|
-
type: "Identifier",
|
|
99
|
-
name: name.toString(),
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export function BlockStatement(body: Node[]) {
|
|
104
|
-
if (!Array.isArray(body)) {
|
|
105
|
-
throw new Error("not array");
|
|
106
|
-
}
|
|
107
|
-
return {
|
|
108
|
-
type: "BlockStatement",
|
|
109
|
-
body: body,
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export function LogicalExpression(operator: string, left: Node, right: Node) {
|
|
114
|
-
return {
|
|
115
|
-
type: "LogicalExpression",
|
|
116
|
-
operator,
|
|
117
|
-
left,
|
|
118
|
-
right,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export function BinaryExpression(operator: string, left: Node, right: Node) {
|
|
123
|
-
if (operator == "||" || operator == "&&") {
|
|
124
|
-
throw new Error("invalid operator, use LogicalExpression");
|
|
125
|
-
}
|
|
126
|
-
return {
|
|
127
|
-
type: "BinaryExpression",
|
|
128
|
-
operator,
|
|
129
|
-
left,
|
|
130
|
-
right,
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export function ThisExpression() {
|
|
135
|
-
return { type: "ThisExpression" };
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export function SwitchCase(test: any, consequent: Node[]) {
|
|
139
|
-
ok(test === null || test);
|
|
140
|
-
ok(Array.isArray(consequent));
|
|
141
|
-
return {
|
|
142
|
-
type: "SwitchCase",
|
|
143
|
-
test,
|
|
144
|
-
consequent,
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
export function SwitchDefaultCase(consequent: Node[]) {
|
|
149
|
-
return SwitchCase(null, consequent);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export function LabeledStatement(label: string, body: Node) {
|
|
153
|
-
return {
|
|
154
|
-
type: "LabeledStatement",
|
|
155
|
-
label: Identifier(label),
|
|
156
|
-
body: body,
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
export function SwitchStatement(discriminant: any, cases: Node[]) {
|
|
161
|
-
return {
|
|
162
|
-
type: "SwitchStatement",
|
|
163
|
-
discriminant: discriminant,
|
|
164
|
-
cases: cases,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
export function BreakStatement(label?: string) {
|
|
169
|
-
return {
|
|
170
|
-
type: "BreakStatement",
|
|
171
|
-
label: label ? Identifier(label) : null,
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
export function Property(
|
|
176
|
-
key: Node,
|
|
177
|
-
value: Node,
|
|
178
|
-
computed = false,
|
|
179
|
-
kind: "init" | "set" | "get" = "init"
|
|
180
|
-
) {
|
|
181
|
-
if (!key) {
|
|
182
|
-
throw new Error("key is undefined");
|
|
183
|
-
}
|
|
184
|
-
if (!value) {
|
|
185
|
-
throw new Error("value is undefined");
|
|
186
|
-
}
|
|
187
|
-
return {
|
|
188
|
-
type: "Property",
|
|
189
|
-
key: key,
|
|
190
|
-
computed: computed,
|
|
191
|
-
value: value,
|
|
192
|
-
kind: kind,
|
|
193
|
-
method: false,
|
|
194
|
-
shorthand: false,
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
export function ObjectExpression(properties: Node[]) {
|
|
199
|
-
if (!properties) {
|
|
200
|
-
throw new Error("properties is null");
|
|
201
|
-
}
|
|
202
|
-
return {
|
|
203
|
-
type: "ObjectExpression",
|
|
204
|
-
properties: properties,
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
export function VariableDeclarator(id: string | Node, init: Node = null) {
|
|
209
|
-
if (typeof id === "string") {
|
|
210
|
-
id = Identifier(id);
|
|
211
|
-
}
|
|
212
|
-
return {
|
|
213
|
-
type: "VariableDeclarator",
|
|
214
|
-
id,
|
|
215
|
-
init,
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
export function VariableDeclaration(
|
|
220
|
-
declarations: Node | Node[],
|
|
221
|
-
kind: "var" | "const" | "let" = "var"
|
|
222
|
-
) {
|
|
223
|
-
if (!Array.isArray(declarations)) {
|
|
224
|
-
declarations = [declarations];
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
ok(Array.isArray(declarations));
|
|
228
|
-
ok(declarations.length);
|
|
229
|
-
|
|
230
|
-
ok(!declarations.find((x) => x.type == "ExpressionStatement"));
|
|
231
|
-
|
|
232
|
-
return {
|
|
233
|
-
type: "VariableDeclaration",
|
|
234
|
-
declarations: declarations,
|
|
235
|
-
kind: kind,
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
export function ForStatement(
|
|
240
|
-
variableDeclaration: any,
|
|
241
|
-
test: any,
|
|
242
|
-
update: any,
|
|
243
|
-
body: any[]
|
|
244
|
-
) {
|
|
245
|
-
ok(variableDeclaration);
|
|
246
|
-
ok(test);
|
|
247
|
-
ok(update);
|
|
248
|
-
return {
|
|
249
|
-
type: "ForStatement",
|
|
250
|
-
init: variableDeclaration,
|
|
251
|
-
test: test,
|
|
252
|
-
update: update,
|
|
253
|
-
body: BlockStatement(body),
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
export function WhileStatement(test: any, body: Node[]) {
|
|
258
|
-
ok(test);
|
|
259
|
-
return {
|
|
260
|
-
type: "WhileStatement",
|
|
261
|
-
test,
|
|
262
|
-
body: BlockStatement(body),
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
export function IfStatement(
|
|
267
|
-
test: Node,
|
|
268
|
-
consequent: Node[],
|
|
269
|
-
alternate: Node[] | null = null
|
|
270
|
-
): Node {
|
|
271
|
-
if (!test) {
|
|
272
|
-
throw new Error("test is undefined");
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
if (!consequent) {
|
|
276
|
-
throw new Error("consequent undefined, use empty array instead");
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
if (!Array.isArray(consequent)) {
|
|
280
|
-
throw new Error(
|
|
281
|
-
"consequent needs to be array, found " + (consequent as any).type
|
|
282
|
-
);
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
if (alternate && !Array.isArray(alternate)) {
|
|
286
|
-
throw new Error(
|
|
287
|
-
"alternate needs to be array, found " + (alternate as any).type
|
|
288
|
-
);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
return {
|
|
292
|
-
type: "IfStatement",
|
|
293
|
-
test: test,
|
|
294
|
-
consequent: BlockStatement(consequent),
|
|
295
|
-
alternate: alternate ? BlockStatement(alternate) : null,
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
export function FunctionExpression(params: Node[], body: any[]) {
|
|
300
|
-
ok(Array.isArray(params), "params should be an array");
|
|
301
|
-
|
|
302
|
-
return {
|
|
303
|
-
type: "FunctionExpression",
|
|
304
|
-
id: null,
|
|
305
|
-
params: params,
|
|
306
|
-
body: BlockStatement(body),
|
|
307
|
-
generator: false,
|
|
308
|
-
expression: false,
|
|
309
|
-
async: false,
|
|
310
|
-
[predictableFunctionTag]: true,
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* ```js
|
|
316
|
-
* function name(p[0], p[1], p[2], ...p[4]){
|
|
317
|
-
* body[0];
|
|
318
|
-
* body[1]...
|
|
319
|
-
* }
|
|
320
|
-
* ```
|
|
321
|
-
* @param name
|
|
322
|
-
* @param params
|
|
323
|
-
* @param body
|
|
324
|
-
*/
|
|
325
|
-
export function FunctionDeclaration(
|
|
326
|
-
name: string,
|
|
327
|
-
params: Node[],
|
|
328
|
-
body: Node[]
|
|
329
|
-
) {
|
|
330
|
-
if (!body) {
|
|
331
|
-
throw new Error("undefined body");
|
|
332
|
-
}
|
|
333
|
-
if (body && Array.isArray(body[0])) {
|
|
334
|
-
throw new Error("nested array");
|
|
335
|
-
}
|
|
336
|
-
ok(Array.isArray(params), "params should be an array");
|
|
337
|
-
return {
|
|
338
|
-
type: "FunctionDeclaration",
|
|
339
|
-
id: Identifier(name),
|
|
340
|
-
params: params,
|
|
341
|
-
body: BlockStatement(body),
|
|
342
|
-
generator: false,
|
|
343
|
-
expression: false,
|
|
344
|
-
async: false,
|
|
345
|
-
[predictableFunctionTag]: true,
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
export function DebuggerStatement() {
|
|
350
|
-
return {
|
|
351
|
-
type: "DebuggerStatement",
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
export function ReturnStatement(argument: Node = null) {
|
|
356
|
-
if (argument) {
|
|
357
|
-
ok(argument.type, "Argument should be a node");
|
|
358
|
-
}
|
|
359
|
-
return {
|
|
360
|
-
type: "ReturnStatement",
|
|
361
|
-
argument: argument,
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
export function AwaitExpression(argument: Node) {
|
|
366
|
-
ok(argument.type, "Argument should be a node");
|
|
367
|
-
return {
|
|
368
|
-
type: "AwaitExpression",
|
|
369
|
-
argument,
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
export function ConditionalExpression(
|
|
374
|
-
test: Node,
|
|
375
|
-
consequent: Node,
|
|
376
|
-
alternate: Node
|
|
377
|
-
) {
|
|
378
|
-
ok(test);
|
|
379
|
-
ok(consequent);
|
|
380
|
-
ok(alternate);
|
|
381
|
-
return {
|
|
382
|
-
type: "ConditionalExpression",
|
|
383
|
-
test,
|
|
384
|
-
consequent,
|
|
385
|
-
alternate,
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
export function ExpressionStatement(expression: Node) {
|
|
390
|
-
ok(expression.type);
|
|
391
|
-
return {
|
|
392
|
-
type: "ExpressionStatement",
|
|
393
|
-
expression: expression,
|
|
394
|
-
} as Node;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
export function UnaryExpression(operator: string, argument: Node) {
|
|
398
|
-
ok(typeof operator === "string");
|
|
399
|
-
ok(argument.type);
|
|
400
|
-
|
|
401
|
-
return {
|
|
402
|
-
type: "UnaryExpression",
|
|
403
|
-
operator,
|
|
404
|
-
argument,
|
|
405
|
-
} as Node;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
export function UpdateExpression(
|
|
409
|
-
operator: string,
|
|
410
|
-
argument: Node,
|
|
411
|
-
prefix = false
|
|
412
|
-
) {
|
|
413
|
-
return {
|
|
414
|
-
type: "UpdateExpression",
|
|
415
|
-
operator,
|
|
416
|
-
argument,
|
|
417
|
-
prefix,
|
|
418
|
-
} as Node;
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
export function SequenceExpression(expressions: Node[]) {
|
|
422
|
-
if (!expressions) {
|
|
423
|
-
throw new Error("expressions undefined");
|
|
424
|
-
}
|
|
425
|
-
if (!expressions.length) {
|
|
426
|
-
throw new Error("expressions length = 0");
|
|
427
|
-
}
|
|
428
|
-
return {
|
|
429
|
-
type: "SequenceExpression",
|
|
430
|
-
expressions: expressions,
|
|
431
|
-
};
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
export function MemberExpression(
|
|
435
|
-
object: Node,
|
|
436
|
-
property: Node,
|
|
437
|
-
computed = true
|
|
438
|
-
) {
|
|
439
|
-
if (!object) {
|
|
440
|
-
throw new Error("object undefined");
|
|
441
|
-
}
|
|
442
|
-
if (!property) {
|
|
443
|
-
throw new Error("property undefined");
|
|
444
|
-
}
|
|
445
|
-
if (!computed && property.type == "Literal") {
|
|
446
|
-
throw new Error("literal must be computed property");
|
|
447
|
-
}
|
|
448
|
-
if (object.name == "new" && property.name == "target") {
|
|
449
|
-
throw new Error("new.target is a MetaProperty");
|
|
450
|
-
}
|
|
451
|
-
return {
|
|
452
|
-
type: "MemberExpression",
|
|
453
|
-
computed: computed,
|
|
454
|
-
object: object,
|
|
455
|
-
property: property,
|
|
456
|
-
};
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
export function CallExpression(callee: Node, args: Node[]) {
|
|
460
|
-
ok(Array.isArray(args), "args should be an array");
|
|
461
|
-
return {
|
|
462
|
-
type: "CallExpression",
|
|
463
|
-
callee: callee,
|
|
464
|
-
arguments: args,
|
|
465
|
-
};
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
export function NewExpression(callee: Node, args: Node[]) {
|
|
469
|
-
return {
|
|
470
|
-
type: "NewExpression",
|
|
471
|
-
callee,
|
|
472
|
-
arguments: args,
|
|
473
|
-
};
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
export function AssignmentExpression(
|
|
477
|
-
operator: string,
|
|
478
|
-
left: Node,
|
|
479
|
-
right: Node
|
|
480
|
-
) {
|
|
481
|
-
return {
|
|
482
|
-
type: "AssignmentExpression",
|
|
483
|
-
operator: operator,
|
|
484
|
-
left: left,
|
|
485
|
-
right: right,
|
|
486
|
-
};
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
export function ArrayPattern(elements: Node[]) {
|
|
490
|
-
ok(Array.isArray(elements));
|
|
491
|
-
return {
|
|
492
|
-
type: "ArrayPattern",
|
|
493
|
-
elements: elements,
|
|
494
|
-
};
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
export function ArrayExpression(elements: Node[]) {
|
|
498
|
-
ok(Array.isArray(elements));
|
|
499
|
-
return {
|
|
500
|
-
type: "ArrayExpression",
|
|
501
|
-
elements,
|
|
502
|
-
};
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
export function AssignmentPattern(left: Node, right: Node) {
|
|
506
|
-
ok(left);
|
|
507
|
-
ok(right);
|
|
508
|
-
return {
|
|
509
|
-
type: "AssignmentPattern",
|
|
510
|
-
left: left,
|
|
511
|
-
right: right,
|
|
512
|
-
};
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
export function AddComment(node: Node, text: string) {
|
|
516
|
-
if ((node as any).leadingComments) {
|
|
517
|
-
(node as any).leadingComments.push({
|
|
518
|
-
type: "Block",
|
|
519
|
-
value: text,
|
|
520
|
-
});
|
|
521
|
-
} else {
|
|
522
|
-
Object.assign(node, {
|
|
523
|
-
leadingComments: [
|
|
524
|
-
{
|
|
525
|
-
type: "Block",
|
|
526
|
-
value: text,
|
|
527
|
-
},
|
|
528
|
-
],
|
|
529
|
-
});
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
return node;
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
export function Super() {
|
|
536
|
-
return { type: "Super" };
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
export function MethodDefinition(
|
|
540
|
-
key: Node,
|
|
541
|
-
functionExpression: Node,
|
|
542
|
-
kind: "method" | "constructor" | "get" | "set",
|
|
543
|
-
isStatic = false,
|
|
544
|
-
computed = false
|
|
545
|
-
) {
|
|
546
|
-
return {
|
|
547
|
-
type: "MethodDefinition",
|
|
548
|
-
key: key,
|
|
549
|
-
computed: computed,
|
|
550
|
-
value: functionExpression,
|
|
551
|
-
kind: kind,
|
|
552
|
-
static: isStatic,
|
|
553
|
-
} as Node;
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
export function ClassDeclaration(
|
|
557
|
-
id: Node,
|
|
558
|
-
superClass: Node = null,
|
|
559
|
-
body: Node[] = []
|
|
560
|
-
) {
|
|
561
|
-
return {
|
|
562
|
-
type: "ClassDeclaration",
|
|
563
|
-
id: id,
|
|
564
|
-
superClass: superClass,
|
|
565
|
-
body: {
|
|
566
|
-
type: "ClassBody",
|
|
567
|
-
body: body,
|
|
568
|
-
},
|
|
569
|
-
} as Node;
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
export function ClassExpression(
|
|
573
|
-
id: Node | null,
|
|
574
|
-
superClass: Node = null,
|
|
575
|
-
body: Node[] = []
|
|
576
|
-
) {
|
|
577
|
-
return {
|
|
578
|
-
type: "ClassExpression",
|
|
579
|
-
id: id,
|
|
580
|
-
superClass: superClass,
|
|
581
|
-
body: {
|
|
582
|
-
type: "ClassBody",
|
|
583
|
-
body: body,
|
|
584
|
-
},
|
|
585
|
-
} as Node;
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
export function ThrowStatement(argument: Node) {
|
|
589
|
-
return {
|
|
590
|
-
type: "ThrowStatement",
|
|
591
|
-
argument: argument,
|
|
592
|
-
} as Node;
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
export function WithStatement(object: Node, body: Node[]) {
|
|
596
|
-
ok(object, "object");
|
|
597
|
-
ok(object.type, "object should be node");
|
|
598
|
-
|
|
599
|
-
return {
|
|
600
|
-
type: "WithStatement",
|
|
601
|
-
object,
|
|
602
|
-
body: BlockStatement(body),
|
|
603
|
-
};
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
/**
|
|
607
|
-
* `fn(...args)`
|
|
608
|
-
* @param argument
|
|
609
|
-
* @returns
|
|
610
|
-
*/
|
|
611
|
-
export function SpreadElement(argument: Node) {
|
|
612
|
-
return {
|
|
613
|
-
type: "SpreadElement",
|
|
614
|
-
argument,
|
|
615
|
-
};
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
/**
|
|
619
|
-
* `function fn(...params){}`
|
|
620
|
-
* @param argument
|
|
621
|
-
* @returns
|
|
622
|
-
*/
|
|
623
|
-
export function RestElement(argument: Node) {
|
|
624
|
-
return {
|
|
625
|
-
type: "RestElement",
|
|
626
|
-
argument,
|
|
627
|
-
};
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
export function CatchClause(param: Node = null, body) {
|
|
631
|
-
return {
|
|
632
|
-
type: "CatchClause",
|
|
633
|
-
param: param,
|
|
634
|
-
body: BlockStatement(body),
|
|
635
|
-
};
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
export function TryStatement(
|
|
639
|
-
body: Node[],
|
|
640
|
-
handler: Node,
|
|
641
|
-
finallyBody?: Node[]
|
|
642
|
-
) {
|
|
643
|
-
ok(handler);
|
|
644
|
-
ok(handler.type == "CatchClause");
|
|
645
|
-
return {
|
|
646
|
-
type: "TryStatement",
|
|
647
|
-
block: BlockStatement(body),
|
|
648
|
-
handler: handler,
|
|
649
|
-
finalizer: finallyBody ? BlockStatement(finallyBody) : null,
|
|
650
|
-
};
|
|
651
|
-
}
|