webfuscator 1.2.1 → 1.3.1
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/README.md +3 -3
- package/dist/analysis/constant.d.ts.map +1 -1
- package/dist/analysis/constant.js +10 -27
- package/dist/analysis/constant.js.map +1 -1
- package/dist/analysis/inlineability.d.ts.map +1 -1
- package/dist/analysis/inlineability.js +5 -13
- package/dist/analysis/inlineability.js.map +1 -1
- package/dist/analysis/purity.d.ts +3 -3
- package/dist/analysis/purity.d.ts.map +1 -1
- package/dist/analysis/purity.js +28 -75
- package/dist/analysis/purity.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/obfuscator.d.ts +2 -1
- package/dist/obfuscator.d.ts.map +1 -1
- package/dist/obfuscator.js +47 -12
- package/dist/obfuscator.js.map +1 -1
- package/dist/options.d.ts +17 -4
- package/dist/options.d.ts.map +1 -1
- package/dist/preparation/expand-destructuring.d.ts +2 -3
- package/dist/preparation/expand-destructuring.d.ts.map +1 -1
- package/dist/preparation/expand-destructuring.js +2 -8
- package/dist/preparation/expand-destructuring.js.map +1 -1
- package/dist/transforms/arguments-to-parameters.d.ts +5 -4
- package/dist/transforms/arguments-to-parameters.d.ts.map +1 -1
- package/dist/transforms/arguments-to-parameters.js +5 -4
- package/dist/transforms/arguments-to-parameters.js.map +1 -1
- package/dist/transforms/arrow-to-function.d.ts +4 -3
- package/dist/transforms/arrow-to-function.d.ts.map +1 -1
- package/dist/transforms/arrow-to-function.js +6 -10
- package/dist/transforms/arrow-to-function.js.map +1 -1
- package/dist/transforms/collapse-single-use-temps.d.ts +2 -1
- package/dist/transforms/collapse-single-use-temps.d.ts.map +1 -1
- package/dist/transforms/collapse-single-use-temps.js +12 -20
- package/dist/transforms/collapse-single-use-temps.js.map +1 -1
- package/dist/transforms/conceal-strings.d.ts +56 -0
- package/dist/transforms/conceal-strings.d.ts.map +1 -0
- package/dist/transforms/conceal-strings.js +356 -0
- package/dist/transforms/conceal-strings.js.map +1 -0
- package/dist/transforms/const-let-to-var.d.ts +4 -3
- package/dist/transforms/const-let-to-var.d.ts.map +1 -1
- package/dist/transforms/const-let-to-var.js +8 -67
- package/dist/transforms/const-let-to-var.js.map +1 -1
- package/dist/transforms/const-to-let.d.ts +1 -3
- package/dist/transforms/const-to-let.d.ts.map +1 -1
- package/dist/transforms/const-to-let.js +1 -8
- package/dist/transforms/const-to-let.js.map +1 -1
- package/dist/transforms/drop-console.d.ts.map +1 -1
- package/dist/transforms/drop-console.js +3 -5
- package/dist/transforms/drop-console.js.map +1 -1
- package/dist/transforms/expand-binary-assignment.d.ts.map +1 -1
- package/dist/transforms/expand-binary-assignment.js +0 -5
- package/dist/transforms/expand-binary-assignment.js.map +1 -1
- package/dist/transforms/expand-logical-assignment.d.ts.map +1 -1
- package/dist/transforms/expand-logical-assignment.js +0 -5
- package/dist/transforms/expand-logical-assignment.js.map +1 -1
- package/dist/transforms/extract-object-properties.js +5 -12
- package/dist/transforms/extract-object-properties.js.map +1 -1
- package/dist/transforms/fold-builtin-methods.d.ts.map +1 -1
- package/dist/transforms/fold-builtin-methods.js +44 -14
- package/dist/transforms/fold-builtin-methods.js.map +1 -1
- package/dist/transforms/fold-constants.js +5 -2
- package/dist/transforms/fold-constants.js.map +1 -1
- package/dist/transforms/function-declaration-to-expression.d.ts +5 -6
- package/dist/transforms/function-declaration-to-expression.d.ts.map +1 -1
- package/dist/transforms/function-declaration-to-expression.js +5 -6
- package/dist/transforms/function-declaration-to-expression.js.map +1 -1
- package/dist/transforms/hoist-variables.d.ts +29 -0
- package/dist/transforms/hoist-variables.d.ts.map +1 -0
- package/dist/transforms/hoist-variables.js +215 -0
- package/dist/transforms/hoist-variables.js.map +1 -0
- package/dist/transforms/inline-functions.js +11 -40
- package/dist/transforms/inline-functions.js.map +1 -1
- package/dist/transforms/logical-to-ternary.d.ts +1 -1
- package/dist/transforms/logical-to-ternary.js +5 -9
- package/dist/transforms/logical-to-ternary.js.map +1 -1
- package/dist/transforms/mangle-properties.d.ts +2 -5
- package/dist/transforms/mangle-properties.d.ts.map +1 -1
- package/dist/transforms/mangle-properties.js +9 -9
- package/dist/transforms/mangle-properties.js.map +1 -1
- package/dist/transforms/merge-variable-declarations.d.ts +17 -0
- package/dist/transforms/merge-variable-declarations.d.ts.map +1 -0
- package/dist/transforms/merge-variable-declarations.js +68 -0
- package/dist/transforms/merge-variable-declarations.js.map +1 -0
- package/dist/transforms/nullish-coalescing-to-ternary.d.ts +4 -5
- package/dist/transforms/nullish-coalescing-to-ternary.d.ts.map +1 -1
- package/dist/transforms/nullish-coalescing-to-ternary.js +7 -12
- package/dist/transforms/nullish-coalescing-to-ternary.js.map +1 -1
- package/dist/transforms/numbers-to-strings.d.ts.map +1 -1
- package/dist/transforms/numbers-to-strings.js +1 -8
- package/dist/transforms/numbers-to-strings.js.map +1 -1
- package/dist/transforms/object-method-to-property.d.ts +1 -1
- package/dist/transforms/object-method-to-property.js +1 -1
- package/dist/transforms/optional-chaining-to-ternary.d.ts +4 -3
- package/dist/transforms/optional-chaining-to-ternary.d.ts.map +1 -1
- package/dist/transforms/optional-chaining-to-ternary.js +9 -9
- package/dist/transforms/optional-chaining-to-ternary.js.map +1 -1
- package/dist/transforms/pack-declarations-into-parameters.d.ts.map +1 -1
- package/dist/transforms/pack-declarations-into-parameters.js +5 -21
- package/dist/transforms/pack-declarations-into-parameters.js.map +1 -1
- package/dist/transforms/pack.d.ts +4 -13
- package/dist/transforms/pack.d.ts.map +1 -1
- package/dist/transforms/pack.js +9 -29
- package/dist/transforms/pack.js.map +1 -1
- package/dist/transforms/remove-anonymous-function-names.d.ts +2 -4
- package/dist/transforms/remove-anonymous-function-names.d.ts.map +1 -1
- package/dist/transforms/remove-anonymous-function-names.js +2 -40
- package/dist/transforms/remove-anonymous-function-names.js.map +1 -1
- package/dist/transforms/remove-unreachable-code.js +2 -21
- package/dist/transforms/remove-unreachable-code.js.map +1 -1
- package/dist/transforms/remove-unused-code.d.ts.map +1 -1
- package/dist/transforms/remove-unused-code.js +12 -49
- package/dist/transforms/remove-unused-code.js.map +1 -1
- package/dist/transforms/rename-identifiers.d.ts +3 -3
- package/dist/transforms/rename-identifiers.d.ts.map +1 -1
- package/dist/transforms/rename-identifiers.js +31 -35
- package/dist/transforms/rename-identifiers.js.map +1 -1
- package/dist/transforms/reorder-function-declarations.d.ts +24 -0
- package/dist/transforms/reorder-function-declarations.d.ts.map +1 -0
- package/dist/transforms/reorder-function-declarations.js +62 -0
- package/dist/transforms/reorder-function-declarations.js.map +1 -0
- package/dist/transforms/specials-to-strings.d.ts.map +1 -1
- package/dist/transforms/specials-to-strings.js +2 -3
- package/dist/transforms/specials-to-strings.js.map +1 -1
- package/dist/transforms/switch-to-if.js +5 -15
- package/dist/transforms/switch-to-if.js.map +1 -1
- package/dist/transforms/ternary-to-if.d.ts.map +1 -1
- package/dist/transforms/ternary-to-if.js +5 -9
- package/dist/transforms/ternary-to-if.js.map +1 -1
- package/dist/transforms/update-to-assignment.d.ts.map +1 -1
- package/dist/transforms/update-to-assignment.js +6 -23
- package/dist/transforms/update-to-assignment.js.map +1 -1
- package/dist/transforms/yodify-conditions.d.ts +3 -4
- package/dist/transforms/yodify-conditions.d.ts.map +1 -1
- package/dist/transforms/yodify-conditions.js +3 -4
- package/dist/transforms/yodify-conditions.js.map +1 -1
- package/dist/utils/ast.d.ts +1 -3
- package/dist/utils/ast.d.ts.map +1 -1
- package/dist/utils/ast.js +4 -60
- package/dist/utils/ast.js.map +1 -1
- package/dist/utils/evaluation-order.js +1 -1
- package/dist/utils/evaluation-order.js.map +1 -1
- package/dist/utils/literal.d.ts.map +1 -1
- package/dist/utils/literal.js +74 -2
- package/dist/utils/literal.js.map +1 -1
- package/dist/utils/logical-lowering.d.ts.map +1 -1
- package/dist/utils/logical-lowering.js +7 -9
- package/dist/utils/logical-lowering.js.map +1 -1
- package/dist/utils/nullish.d.ts +4 -0
- package/dist/utils/nullish.d.ts.map +1 -0
- package/dist/utils/nullish.js +8 -0
- package/dist/utils/nullish.js.map +1 -0
- package/dist/utils/paths.d.ts +0 -2
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +0 -28
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/statement-lists.d.ts +9 -0
- package/dist/utils/statement-lists.d.ts.map +1 -0
- package/dist/utils/statement-lists.js +27 -0
- package/dist/utils/statement-lists.js.map +1 -0
- package/package.json +6 -2
- package/src/analysis/constant.ts +12 -33
- package/src/analysis/inlineability.ts +5 -13
- package/src/analysis/purity.ts +29 -92
- package/src/index.ts +1 -0
- package/src/obfuscator.ts +51 -14
- package/src/options.ts +21 -3
- package/src/preparation/expand-destructuring.ts +2 -10
- package/src/transforms/arguments-to-parameters.ts +5 -4
- package/src/transforms/arrow-to-function.ts +6 -10
- package/src/transforms/collapse-single-use-temps.ts +12 -23
- package/src/transforms/conceal-strings.ts +525 -0
- package/src/transforms/const-let-to-var.ts +9 -72
- package/src/transforms/const-to-let.ts +1 -8
- package/src/transforms/drop-console.ts +3 -5
- package/src/transforms/expand-binary-assignment.ts +0 -5
- package/src/transforms/expand-logical-assignment.ts +0 -5
- package/src/transforms/extract-object-properties.ts +5 -14
- package/src/transforms/fold-builtin-methods.ts +63 -17
- package/src/transforms/fold-constants.ts +5 -2
- package/src/transforms/function-declaration-to-expression.ts +5 -6
- package/src/transforms/hoist-variables.ts +262 -0
- package/src/transforms/inline-functions.ts +16 -47
- package/src/transforms/logical-to-ternary.ts +5 -10
- package/src/transforms/mangle-properties.ts +9 -12
- package/src/transforms/merge-variable-declarations.ts +91 -0
- package/src/transforms/nullish-coalescing-to-ternary.ts +7 -13
- package/src/transforms/numbers-to-strings.ts +2 -12
- package/src/transforms/object-method-to-property.ts +1 -1
- package/src/transforms/optional-chaining-to-ternary.ts +9 -9
- package/src/transforms/pack-declarations-into-parameters.ts +11 -21
- package/src/transforms/pack.ts +9 -30
- package/src/transforms/remove-anonymous-function-names.ts +3 -46
- package/src/transforms/remove-unreachable-code.ts +2 -22
- package/src/transforms/remove-unused-code.ts +14 -74
- package/src/transforms/rename-identifiers.ts +44 -35
- package/src/transforms/reorder-function-declarations.ts +78 -0
- package/src/transforms/specials-to-strings.ts +2 -3
- package/src/transforms/switch-to-if.ts +5 -22
- package/src/transforms/ternary-to-if.ts +5 -9
- package/src/transforms/update-to-assignment.ts +6 -24
- package/src/transforms/yodify-conditions.ts +3 -4
- package/src/utils/ast.ts +4 -69
- package/src/utils/evaluation-order.ts +1 -1
- package/src/utils/literal.ts +91 -2
- package/src/utils/logical-lowering.ts +7 -11
- package/src/utils/nullish.ts +23 -0
- package/src/utils/paths.ts +0 -32
- package/src/utils/statement-lists.ts +45 -0
|
@@ -6,7 +6,7 @@ import { isStandaloneDeclaration } from './paths.js';
|
|
|
6
6
|
// x = L;
|
|
7
7
|
// if (<fallbackTest(x)>) x = R;
|
|
8
8
|
//
|
|
9
|
-
// `fallbackTest` selects
|
|
9
|
+
// `fallbackTest` selects the short-circuit condition. The parent must accept a
|
|
10
10
|
// multi-statement replacement.
|
|
11
11
|
export function lowerLogicalWriteStatement(path, fallbackTest) {
|
|
12
12
|
const node = path.node;
|
|
@@ -19,20 +19,19 @@ export function lowerLogicalWriteStatement(path, fallbackTest) {
|
|
|
19
19
|
t.isIdentifier(parent.node.id)) {
|
|
20
20
|
const declStmt = parent.parentPath;
|
|
21
21
|
if (!declStmt?.isVariableDeclaration() ||
|
|
22
|
-
// The split would emit illegal `const x;` and then write it.
|
|
23
|
-
declStmt.node.kind === 'const' ||
|
|
24
22
|
declStmt.node.declarations.length !== 1 ||
|
|
25
23
|
!isStandaloneDeclaration(declStmt)) {
|
|
26
24
|
return false;
|
|
27
25
|
}
|
|
28
26
|
const target = parent.node.id;
|
|
29
|
-
//
|
|
30
|
-
// side
|
|
31
|
-
if (rightCanObserveTarget(node.right, target.name)) {
|
|
27
|
+
// A `var` initializer can observe its previous value while evaluating the
|
|
28
|
+
// right side. Reads before lexical initialization are intentionally ignored.
|
|
29
|
+
if (declStmt.node.kind === 'var' && rightCanObserveTarget(node.right, target.name)) {
|
|
32
30
|
return false;
|
|
33
31
|
}
|
|
32
|
+
const declarationKind = declStmt.node.kind === 'const' ? 'let' : declStmt.node.kind;
|
|
34
33
|
declStmt.replaceWithMultiple([
|
|
35
|
-
t.variableDeclaration(
|
|
34
|
+
t.variableDeclaration(declarationKind, [
|
|
36
35
|
t.variableDeclarator(t.cloneNode(target), node.left),
|
|
37
36
|
]),
|
|
38
37
|
guardedReassignment(target, fallbackTest, node.right),
|
|
@@ -54,8 +53,7 @@ export function lowerLogicalWriteStatement(path, fallbackTest) {
|
|
|
54
53
|
return false;
|
|
55
54
|
}
|
|
56
55
|
// Writing first would change `x = 0 || x` before the right side reads `x`.
|
|
57
|
-
if (!isSideEffectFree(node.right, path.scope,
|
|
58
|
-
referencesName(node.right, target.name)) {
|
|
56
|
+
if (!isSideEffectFree(node.right, path.scope) || referencesName(node.right, target.name)) {
|
|
59
57
|
return false;
|
|
60
58
|
}
|
|
61
59
|
exprStmt.replaceWithMultiple([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logical-lowering.js","sourceRoot":"","sources":["../../src/utils/logical-lowering.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAEjD,mEAAmE;AACnE,EAAE;AACF,WAAW;AACX,kCAAkC;AAClC,EAAE;AACF
|
|
1
|
+
{"version":3,"file":"logical-lowering.js","sourceRoot":"","sources":["../../src/utils/logical-lowering.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import * as t from '@babel/types';
|
|
2
|
+
export declare function buildNullishCheck(firstRead: t.Expression, secondRead: t.Expression): t.ConditionalExpression;
|
|
3
|
+
export declare function buildNonNullishCheck(firstRead: t.Expression, secondRead: t.Expression): t.ConditionalExpression;
|
|
4
|
+
//# sourceMappingURL=nullish.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nullish.d.ts","sourceRoot":"","sources":["../../src/utils/nullish.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAEjC,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,CAAC,CAAC,UAAU,EACvB,UAAU,EAAE,CAAC,CAAC,UAAU,GACvB,CAAC,CAAC,qBAAqB,CAMzB;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,CAAC,CAAC,UAAU,EACvB,UAAU,EAAE,CAAC,CAAC,UAAU,GACvB,CAAC,CAAC,qBAAqB,CAMzB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as t from '@babel/types';
|
|
2
|
+
export function buildNullishCheck(firstRead, secondRead) {
|
|
3
|
+
return t.conditionalExpression(t.binaryExpression('===', firstRead, t.nullLiteral()), t.booleanLiteral(true), t.binaryExpression('===', secondRead, t.unaryExpression('void', t.numericLiteral(0))));
|
|
4
|
+
}
|
|
5
|
+
export function buildNonNullishCheck(firstRead, secondRead) {
|
|
6
|
+
return t.conditionalExpression(t.binaryExpression('!==', firstRead, t.nullLiteral()), t.binaryExpression('!==', secondRead, t.unaryExpression('void', t.numericLiteral(0))), t.booleanLiteral(false));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=nullish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nullish.js","sourceRoot":"","sources":["../../src/utils/nullish.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAEjC,MAAM,UAAU,iBAAiB,CAC/B,SAAuB,EACvB,UAAwB;IAExB,OAAO,CAAC,CAAC,qBAAqB,CAC5B,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,EACrD,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,EACtB,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CACtF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAuB,EACvB,UAAwB;IAExB,OAAO,CAAC,CAAC,qBAAqB,CAC5B,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,EACrD,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,EACrF,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CACxB,CAAA;AACH,CAAC"}
|
package/dist/utils/paths.d.ts
CHANGED
|
@@ -4,6 +4,4 @@ export declare function isStandaloneDeclaration(declPath: NodePath<t.VariableDec
|
|
|
4
4
|
export declare function referencesOrWritesVariable(path: NodePath<t.Identifier>): boolean;
|
|
5
5
|
export declare function isCalleeOrTagOf(path: NodePath): boolean;
|
|
6
6
|
export declare function isInStrictContext(path: NodePath): boolean;
|
|
7
|
-
export declare function hasAnnexBFunctionAlias(path: NodePath): boolean;
|
|
8
|
-
export declare function hasConstantViolation(path: NodePath<t.VariableDeclaration>): boolean;
|
|
9
7
|
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAe1F;AAID,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,CAQhF;AAGD,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAYvD;AAGD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAiBzD
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAe1F;AAID,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,CAQhF;AAGD,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAYvD;AAGD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAiBzD"}
|
package/dist/utils/paths.js
CHANGED
|
@@ -59,32 +59,4 @@ export function isInStrictContext(path) {
|
|
|
59
59
|
function hasUseStrictDirective(directives) {
|
|
60
60
|
return directives.some((directive) => directive.value.value === 'use strict');
|
|
61
61
|
}
|
|
62
|
-
// ECMA-262 B.3.3 gives sloppy block-level functions a `var` alias that Babel
|
|
63
|
-
// omits from the enclosing scope. Renaming, moving, or removing one can expose it.
|
|
64
|
-
export function hasAnnexBFunctionAlias(path) {
|
|
65
|
-
if (!path.isFunctionDeclaration()) {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
const parent = path.parentPath;
|
|
69
|
-
if (!parent || parent.isProgram()) {
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
if (parent.isBlockStatement() &&
|
|
73
|
-
parent.key === 'body' &&
|
|
74
|
-
parent.parentPath != null &&
|
|
75
|
-
parent.parentPath.isFunction()) {
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
return !isInStrictContext(parent);
|
|
79
|
-
}
|
|
80
|
-
// A later write to `const` must keep throwing after transformation.
|
|
81
|
-
export function hasConstantViolation(path) {
|
|
82
|
-
for (const name of Object.keys(path.getBindingIdentifiers())) {
|
|
83
|
-
const binding = path.scope.getBinding(name);
|
|
84
|
-
if (binding && binding.constantViolations.length > 0) {
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
62
|
//# sourceMappingURL=paths.js.map
|
package/dist/utils/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { NodePath } from '@babel/traverse';
|
|
2
|
+
import type * as t from '@babel/types';
|
|
3
|
+
import type { File } from '@babel/types';
|
|
4
|
+
export type StatementListContainer = t.Program | t.BlockStatement | t.StaticBlock | t.SwitchCase;
|
|
5
|
+
type Rewrite = (statements: NodePath<t.Statement>[], container: NodePath<StatementListContainer>) => t.Statement[] | null;
|
|
6
|
+
/** Applies a rewrite to every statement-list container in the AST. */
|
|
7
|
+
export declare function rewriteStatementLists(ast: File, rewrite: Rewrite): boolean;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=statement-lists.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statement-lists.d.ts","sourceRoot":"","sources":["../../src/utils/statement-lists.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,KAAK,CAAC,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAKxC,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,UAAU,CAAA;AAEhG,KAAK,OAAO,GAAG,CACb,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EACnC,SAAS,EAAE,QAAQ,CAAC,sBAAsB,CAAC,KACxC,CAAC,CAAC,SAAS,EAAE,GAAG,IAAI,CAAA;AAEzB,sEAAsE;AACtE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAe1E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { traverseForChanges } from './change-tracking.js';
|
|
2
|
+
/** Applies a rewrite to every statement-list container in the AST. */
|
|
3
|
+
export function rewriteStatementLists(ast, rewrite) {
|
|
4
|
+
return traverseForChanges(ast, {
|
|
5
|
+
Program(path, state) {
|
|
6
|
+
apply(path, 'body', rewrite, state);
|
|
7
|
+
},
|
|
8
|
+
BlockStatement(path, state) {
|
|
9
|
+
apply(path, 'body', rewrite, state);
|
|
10
|
+
},
|
|
11
|
+
StaticBlock(path, state) {
|
|
12
|
+
apply(path, 'body', rewrite, state);
|
|
13
|
+
},
|
|
14
|
+
SwitchCase(path, state) {
|
|
15
|
+
apply(path, 'consequent', rewrite, state);
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function apply(container, key, rewrite, state) {
|
|
20
|
+
const statements = container.get(key);
|
|
21
|
+
const replacement = rewrite(statements, container);
|
|
22
|
+
if (replacement) {
|
|
23
|
+
container.set(key, replacement);
|
|
24
|
+
state.changed = true;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=statement-lists.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statement-lists.js","sourceRoot":"","sources":["../../src/utils/statement-lists.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAUtD,sEAAsE;AACtE,MAAM,UAAU,qBAAqB,CAAC,GAAS,EAAE,OAAgB;IAC/D,OAAO,kBAAkB,CAAC,GAAG,EAAE;QAC7B,OAAO,CAAC,IAAI,EAAE,KAAK;YACjB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;QACrC,CAAC;QACD,cAAc,CAAC,IAAI,EAAE,KAAK;YACxB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;QACrC,CAAC;QACD,WAAW,CAAC,IAAI,EAAE,KAAK;YACrB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;QACrC,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,KAAK;YACpB,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;QAC3C,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,KAAK,CACZ,SAA2C,EAC3C,GAA0B,EAC1B,OAAgB,EAChB,KAAkB;IAElB,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAA4B,CAAA;IAChE,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;IAClD,IAAI,WAAW,EAAE,CAAC;QAChB,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;QAC/B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;IACtB,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "webfuscator",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "JavaScript obfuscator built on Babel",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"babel",
|
|
@@ -24,6 +24,8 @@
|
|
|
24
24
|
},
|
|
25
25
|
"files": [
|
|
26
26
|
"DISCLOSURE",
|
|
27
|
+
"LICENSE",
|
|
28
|
+
"README.md",
|
|
27
29
|
"dist",
|
|
28
30
|
"src"
|
|
29
31
|
],
|
|
@@ -43,8 +45,10 @@
|
|
|
43
45
|
},
|
|
44
46
|
"scripts": {
|
|
45
47
|
"prepublishOnly": "pnpm --workspace-root check",
|
|
46
|
-
"prepack": "pnpm run build",
|
|
48
|
+
"prepack": "pnpm run package-files:check && pnpm run build",
|
|
47
49
|
"build": "node --eval \"require('node:fs').rmSync('dist', { force: true, recursive: true })\" && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node scripts/verify-dist.mjs",
|
|
50
|
+
"package-files:check": "node scripts/sync-package-files.mjs --check",
|
|
51
|
+
"package-files:sync": "node scripts/sync-package-files.mjs",
|
|
48
52
|
"test": "vitest run",
|
|
49
53
|
"test:watch": "vitest",
|
|
50
54
|
"typecheck": "tsc --noEmit"
|
package/src/analysis/constant.ts
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import type { Binding, NodePath, Scope } from '@babel/traverse'
|
|
2
2
|
import * as t from '@babel/types'
|
|
3
3
|
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
declarationReaches,
|
|
7
|
-
initializerReaches,
|
|
8
|
-
readCrossesFunctionBoundary,
|
|
9
|
-
} from './document-order'
|
|
4
|
+
import { initializerReaches, readCrossesFunctionBoundary } from './document-order'
|
|
10
5
|
import { isSideEffectFree } from './purity'
|
|
11
6
|
|
|
12
7
|
export type Evaluation = { known: true; value: unknown } | { known: false }
|
|
@@ -24,7 +19,7 @@ export function isOpaque(value: unknown): boolean {
|
|
|
24
19
|
interface Env {
|
|
25
20
|
scope: Scope | undefined
|
|
26
21
|
seen: Set<Binding>
|
|
27
|
-
//
|
|
22
|
+
// Only `var` reads need proof that their initializer ran.
|
|
28
23
|
referencePath: NodePath | undefined
|
|
29
24
|
}
|
|
30
25
|
|
|
@@ -74,9 +69,7 @@ function run(node: t.Node, env: Env): Evaluation {
|
|
|
74
69
|
function evaluateUnary(node: t.Node, env: Env): Evaluation {
|
|
75
70
|
const unary = node as t.UnaryExpression
|
|
76
71
|
if (unary.operator === 'void') {
|
|
77
|
-
return isSideEffectFree(unary.argument, env.scope,
|
|
78
|
-
? { known: true, value: undefined }
|
|
79
|
-
: UNKNOWN
|
|
72
|
+
return isSideEffectFree(unary.argument, env.scope) ? { known: true, value: undefined } : UNKNOWN
|
|
80
73
|
}
|
|
81
74
|
if (unary.operator === 'delete' || unary.operator === 'throw') {
|
|
82
75
|
return UNKNOWN
|
|
@@ -141,13 +134,6 @@ function evaluateIdentifier(node: t.Node, env: Env): Evaluation {
|
|
|
141
134
|
return UNKNOWN
|
|
142
135
|
}
|
|
143
136
|
|
|
144
|
-
// `with` and direct `eval` can redirect names outside Babel's scope table.
|
|
145
|
-
if (
|
|
146
|
-
env.referencePath &&
|
|
147
|
-
(isInsideWith(env.referencePath) || enclosingScopeHasDirectEval(env.referencePath))
|
|
148
|
-
) {
|
|
149
|
-
return UNKNOWN
|
|
150
|
-
}
|
|
151
137
|
const binding = env.scope.getBinding(identifier.name)
|
|
152
138
|
|
|
153
139
|
// Only an unbound `undefined` names the immutable global property.
|
|
@@ -163,16 +149,7 @@ function evaluateIdentifier(node: t.Node, env: Env): Evaluation {
|
|
|
163
149
|
return binding.constant ? { known: true, value: OPAQUE_TRUTHY } : UNKNOWN
|
|
164
150
|
}
|
|
165
151
|
if (t.isClassDeclaration(binding.path.node)) {
|
|
166
|
-
|
|
167
|
-
return UNKNOWN
|
|
168
|
-
}
|
|
169
|
-
// A nested function can read the class before its declaration runs.
|
|
170
|
-
if (readCrossesFunctionBoundary(binding, env.referencePath)) {
|
|
171
|
-
return UNKNOWN
|
|
172
|
-
}
|
|
173
|
-
return declarationReaches(binding.path, env.referencePath)
|
|
174
|
-
? { known: true, value: OPAQUE_TRUTHY }
|
|
175
|
-
: UNKNOWN
|
|
152
|
+
return binding.constant ? { known: true, value: OPAQUE_TRUTHY } : UNKNOWN
|
|
176
153
|
}
|
|
177
154
|
|
|
178
155
|
if (binding.kind === 'var' || binding.kind === 'let' || binding.kind === 'const') {
|
|
@@ -183,16 +160,18 @@ function evaluateIdentifier(node: t.Node, env: Env): Evaluation {
|
|
|
183
160
|
if (!t.isIdentifier(declarator.id) || declarator.id.name !== identifier.name) {
|
|
184
161
|
return UNKNOWN
|
|
185
162
|
}
|
|
186
|
-
// A nested function can
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
163
|
+
// A nested function can run before a `var` initializer, and a conditional
|
|
164
|
+
// initializer may not run at all.
|
|
165
|
+
if (
|
|
166
|
+
binding.kind === 'var' &&
|
|
167
|
+
(readCrossesFunctionBoundary(binding, env.referencePath) ||
|
|
168
|
+
!initializerReaches(binding.path, env.referencePath))
|
|
169
|
+
) {
|
|
192
170
|
return UNKNOWN
|
|
193
171
|
}
|
|
194
172
|
// Babel counts a looped `var` initializer as its own constant violation.
|
|
195
173
|
if (
|
|
174
|
+
binding.kind !== 'const' &&
|
|
196
175
|
!binding.constant &&
|
|
197
176
|
!(
|
|
198
177
|
binding.constantViolations.length === 1 &&
|
|
@@ -3,7 +3,7 @@ import type { Binding, NodePath, Visitor } from '@babel/traverse'
|
|
|
3
3
|
import * as t from '@babel/types'
|
|
4
4
|
import type { File } from '@babel/types'
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { referencesOrWritesVariable } from '../utils/paths'
|
|
7
7
|
|
|
8
8
|
export interface InlineCandidate {
|
|
9
9
|
name: string
|
|
@@ -30,10 +30,6 @@ export function analyzeInlineability(ast: File): Map<string, InlineCandidate> {
|
|
|
30
30
|
if (!path.node.id) {
|
|
31
31
|
return
|
|
32
32
|
}
|
|
33
|
-
// Babel misses the sloppy Annex B `var` alias of a block-level function.
|
|
34
|
-
if (hasAnnexBFunctionAlias(path)) {
|
|
35
|
-
return
|
|
36
|
-
}
|
|
37
33
|
const binding = path.scope.getBinding(path.node.id.name)
|
|
38
34
|
if (!binding) {
|
|
39
35
|
return
|
|
@@ -131,9 +127,9 @@ function checkCandidate(
|
|
|
131
127
|
if (!t.isBlockStatement(fnNode.body)) {
|
|
132
128
|
return null
|
|
133
129
|
}
|
|
134
|
-
// Writes live in `constantViolations`, not
|
|
135
|
-
// make a call resolve to a different function.
|
|
136
|
-
if (binding.constantViolations.length > 0) {
|
|
130
|
+
// Writes to mutable bindings live in `constantViolations`, not
|
|
131
|
+
// `referencePaths`, and can make a call resolve to a different function.
|
|
132
|
+
if (binding.kind !== 'const' && binding.constantViolations.length > 0) {
|
|
137
133
|
return null
|
|
138
134
|
}
|
|
139
135
|
// Splicing loses a named function expression's inner binding.
|
|
@@ -273,13 +269,9 @@ const analyzeBodyVisitor: Visitor<AnalyzeBodyState> = {
|
|
|
273
269
|
path.stop()
|
|
274
270
|
}
|
|
275
271
|
},
|
|
276
|
-
WithStatement(path, state) {
|
|
277
|
-
state.unsafe = true
|
|
278
|
-
path.stop()
|
|
279
|
-
},
|
|
280
272
|
Identifier(path, state) {
|
|
281
273
|
const name = path.node.name
|
|
282
|
-
if (state.innerFnDepth === 0 &&
|
|
274
|
+
if (state.innerFnDepth === 0 && name === 'arguments') {
|
|
283
275
|
state.unsafe = true
|
|
284
276
|
path.stop()
|
|
285
277
|
return
|
package/src/analysis/purity.ts
CHANGED
|
@@ -1,18 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Scope } from '@babel/traverse'
|
|
2
2
|
import * as t from '@babel/types'
|
|
3
3
|
|
|
4
|
-
import { isInsideWith } from '../utils/ast'
|
|
5
4
|
import { isPrimitiveLiteral } from '../utils/literal'
|
|
6
|
-
import {
|
|
7
|
-
declarationReaches,
|
|
8
|
-
initializerReaches,
|
|
9
|
-
readCrossesFunctionBoundary,
|
|
10
|
-
} from './document-order'
|
|
11
5
|
|
|
12
6
|
// Purity also requires deterministic repetition and no throw. Identifier reads
|
|
13
|
-
// need scope
|
|
14
|
-
|
|
15
|
-
export function isPure(node: t.Node, scope?: Scope, referencePath?: NodePath): boolean {
|
|
7
|
+
// need scope to prove resolution.
|
|
8
|
+
export function isPure(node: t.Node, scope?: Scope): boolean {
|
|
16
9
|
if (
|
|
17
10
|
t.isNumericLiteral(node) ||
|
|
18
11
|
t.isStringLiteral(node) ||
|
|
@@ -25,7 +18,7 @@ export function isPure(node: t.Node, scope?: Scope, referencePath?: NodePath): b
|
|
|
25
18
|
return true
|
|
26
19
|
}
|
|
27
20
|
if (t.isIdentifier(node)) {
|
|
28
|
-
return identifierReadIsSafe(node, scope
|
|
21
|
+
return identifierReadIsSafe(node, scope)
|
|
29
22
|
}
|
|
30
23
|
if (t.isTemplateLiteral(node)) {
|
|
31
24
|
// ToString can call object code or throw on Symbol.
|
|
@@ -39,7 +32,7 @@ export function isPure(node: t.Node, scope?: Scope, referencePath?: NodePath): b
|
|
|
39
32
|
if (t.isUnaryExpression(node)) {
|
|
40
33
|
// Numeric unary operators invoke ToPrimitive. `delete` and `throw` act.
|
|
41
34
|
if (node.operator === '!' || node.operator === 'typeof' || node.operator === 'void') {
|
|
42
|
-
return isPure(node.argument, scope
|
|
35
|
+
return isPure(node.argument, scope)
|
|
43
36
|
}
|
|
44
37
|
return false
|
|
45
38
|
}
|
|
@@ -47,7 +40,7 @@ export function isPure(node: t.Node, scope?: Scope, referencePath?: NodePath): b
|
|
|
47
40
|
if (!t.isExpression(node.left)) {
|
|
48
41
|
return false
|
|
49
42
|
}
|
|
50
|
-
if (!isPure(node.left, scope
|
|
43
|
+
if (!isPure(node.left, scope) || !isPure(node.right, scope)) {
|
|
51
44
|
return false
|
|
52
45
|
}
|
|
53
46
|
// Only strict equality avoids coercion. Other operators need safe literals.
|
|
@@ -57,18 +50,16 @@ export function isPure(node: t.Node, scope?: Scope, referencePath?: NodePath): b
|
|
|
57
50
|
return coercesWithoutEffect(node.left, node.right, node.operator)
|
|
58
51
|
}
|
|
59
52
|
if (t.isLogicalExpression(node)) {
|
|
60
|
-
return isPure(node.left, scope
|
|
53
|
+
return isPure(node.left, scope) && isPure(node.right, scope)
|
|
61
54
|
}
|
|
62
55
|
if (t.isConditionalExpression(node)) {
|
|
63
56
|
return (
|
|
64
|
-
isPure(node.test, scope,
|
|
65
|
-
isPure(node.consequent, scope, referencePath) &&
|
|
66
|
-
isPure(node.alternate, scope, referencePath)
|
|
57
|
+
isPure(node.test, scope) && isPure(node.consequent, scope) && isPure(node.alternate, scope)
|
|
67
58
|
)
|
|
68
59
|
}
|
|
69
60
|
if (t.isSequenceExpression(node)) {
|
|
70
61
|
for (const expr of node.expressions) {
|
|
71
|
-
if (!isPure(expr, scope
|
|
62
|
+
if (!isPure(expr, scope)) {
|
|
72
63
|
return false
|
|
73
64
|
}
|
|
74
65
|
}
|
|
@@ -77,8 +68,9 @@ export function isPure(node: t.Node, scope?: Scope, referencePath?: NodePath): b
|
|
|
77
68
|
return false
|
|
78
69
|
}
|
|
79
70
|
|
|
80
|
-
// A droppable identifier read must resolve
|
|
81
|
-
|
|
71
|
+
// A droppable identifier read must resolve to a local binding or immutable
|
|
72
|
+
// global `undefined`.
|
|
73
|
+
export function isSideEffectFree(node: t.Node, scope?: Scope): boolean {
|
|
82
74
|
if (
|
|
83
75
|
t.isNumericLiteral(node) ||
|
|
84
76
|
t.isStringLiteral(node) ||
|
|
@@ -99,7 +91,7 @@ export function isSideEffectFree(node: t.Node, scope?: Scope, referencePath?: No
|
|
|
99
91
|
return true
|
|
100
92
|
}
|
|
101
93
|
if (t.isIdentifier(node)) {
|
|
102
|
-
return identifierReadIsSafe(node, scope
|
|
94
|
+
return identifierReadIsSafe(node, scope)
|
|
103
95
|
}
|
|
104
96
|
if (t.isFunctionExpression(node) || t.isArrowFunctionExpression(node)) {
|
|
105
97
|
return true
|
|
@@ -107,7 +99,7 @@ export function isSideEffectFree(node: t.Node, scope?: Scope, referencePath?: No
|
|
|
107
99
|
if (t.isClassExpression(node)) {
|
|
108
100
|
// `extends` and computed keys run during class definition.
|
|
109
101
|
if (node.superClass) {
|
|
110
|
-
if (!isSideEffectFree(node.superClass, scope
|
|
102
|
+
if (!isSideEffectFree(node.superClass, scope)) {
|
|
111
103
|
return false
|
|
112
104
|
}
|
|
113
105
|
// ClassDefinitionEvaluation accepts only `null` or a constructor.
|
|
@@ -127,7 +119,7 @@ export function isSideEffectFree(node: t.Node, scope?: Scope, referencePath?: No
|
|
|
127
119
|
'computed' in member &&
|
|
128
120
|
member.computed &&
|
|
129
121
|
'key' in member &&
|
|
130
|
-
!isSideEffectFree(member.key, scope
|
|
122
|
+
!isSideEffectFree(member.key, scope)
|
|
131
123
|
) {
|
|
132
124
|
return false
|
|
133
125
|
}
|
|
@@ -142,7 +134,7 @@ export function isSideEffectFree(node: t.Node, scope?: Scope, referencePath?: No
|
|
|
142
134
|
if (t.isSpreadElement(element)) {
|
|
143
135
|
return false
|
|
144
136
|
}
|
|
145
|
-
if (!isSideEffectFree(element, scope
|
|
137
|
+
if (!isSideEffectFree(element, scope)) {
|
|
146
138
|
return false
|
|
147
139
|
}
|
|
148
140
|
}
|
|
@@ -154,7 +146,7 @@ export function isSideEffectFree(node: t.Node, scope?: Scope, referencePath?: No
|
|
|
154
146
|
return false
|
|
155
147
|
}
|
|
156
148
|
if (t.isObjectMethod(prop)) {
|
|
157
|
-
if (prop.computed && !isSideEffectFree(prop.key, scope
|
|
149
|
+
if (prop.computed && !isSideEffectFree(prop.key, scope)) {
|
|
158
150
|
return false
|
|
159
151
|
}
|
|
160
152
|
continue
|
|
@@ -162,13 +154,13 @@ export function isSideEffectFree(node: t.Node, scope?: Scope, referencePath?: No
|
|
|
162
154
|
if (!t.isObjectProperty(prop)) {
|
|
163
155
|
return false
|
|
164
156
|
}
|
|
165
|
-
if (prop.computed && !isSideEffectFree(prop.key, scope
|
|
157
|
+
if (prop.computed && !isSideEffectFree(prop.key, scope)) {
|
|
166
158
|
return false
|
|
167
159
|
}
|
|
168
160
|
if (!t.isExpression(prop.value)) {
|
|
169
161
|
return false
|
|
170
162
|
}
|
|
171
|
-
if (!isSideEffectFree(prop.value, scope
|
|
163
|
+
if (!isSideEffectFree(prop.value, scope)) {
|
|
172
164
|
return false
|
|
173
165
|
}
|
|
174
166
|
}
|
|
@@ -179,7 +171,7 @@ export function isSideEffectFree(node: t.Node, scope?: Scope, referencePath?: No
|
|
|
179
171
|
return false
|
|
180
172
|
}
|
|
181
173
|
if (node.operator === '!' || node.operator === 'typeof' || node.operator === 'void') {
|
|
182
|
-
return isSideEffectFree(node.argument, scope
|
|
174
|
+
return isSideEffectFree(node.argument, scope)
|
|
183
175
|
}
|
|
184
176
|
return false
|
|
185
177
|
}
|
|
@@ -187,10 +179,7 @@ export function isSideEffectFree(node: t.Node, scope?: Scope, referencePath?: No
|
|
|
187
179
|
if (!t.isExpression(node.left)) {
|
|
188
180
|
return false
|
|
189
181
|
}
|
|
190
|
-
if (
|
|
191
|
-
!isSideEffectFree(node.left, scope, referencePath) ||
|
|
192
|
-
!isSideEffectFree(node.right, scope, referencePath)
|
|
193
|
-
) {
|
|
182
|
+
if (!isSideEffectFree(node.left, scope) || !isSideEffectFree(node.right, scope)) {
|
|
194
183
|
return false
|
|
195
184
|
}
|
|
196
185
|
// Coercing operators need compatible literals that cannot throw.
|
|
@@ -200,21 +189,18 @@ export function isSideEffectFree(node: t.Node, scope?: Scope, referencePath?: No
|
|
|
200
189
|
return coercesWithoutEffect(node.left, node.right, node.operator)
|
|
201
190
|
}
|
|
202
191
|
if (t.isLogicalExpression(node)) {
|
|
203
|
-
return (
|
|
204
|
-
isSideEffectFree(node.left, scope, referencePath) &&
|
|
205
|
-
isSideEffectFree(node.right, scope, referencePath)
|
|
206
|
-
)
|
|
192
|
+
return isSideEffectFree(node.left, scope) && isSideEffectFree(node.right, scope)
|
|
207
193
|
}
|
|
208
194
|
if (t.isConditionalExpression(node)) {
|
|
209
195
|
return (
|
|
210
|
-
isSideEffectFree(node.test, scope
|
|
211
|
-
isSideEffectFree(node.consequent, scope
|
|
212
|
-
isSideEffectFree(node.alternate, scope
|
|
196
|
+
isSideEffectFree(node.test, scope) &&
|
|
197
|
+
isSideEffectFree(node.consequent, scope) &&
|
|
198
|
+
isSideEffectFree(node.alternate, scope)
|
|
213
199
|
)
|
|
214
200
|
}
|
|
215
201
|
if (t.isSequenceExpression(node)) {
|
|
216
202
|
for (const expr of node.expressions) {
|
|
217
|
-
if (!isSideEffectFree(expr, scope
|
|
203
|
+
if (!isSideEffectFree(expr, scope)) {
|
|
218
204
|
return false
|
|
219
205
|
}
|
|
220
206
|
}
|
|
@@ -223,43 +209,13 @@ export function isSideEffectFree(node: t.Node, scope?: Scope, referencePath?: No
|
|
|
223
209
|
return false
|
|
224
210
|
}
|
|
225
211
|
|
|
226
|
-
//
|
|
227
|
-
|
|
228
|
-
function identifierReadIsSafe(
|
|
229
|
-
node: t.Identifier,
|
|
230
|
-
scope: Scope | undefined,
|
|
231
|
-
referencePath: NodePath | undefined,
|
|
232
|
-
): boolean {
|
|
233
|
-
// A `with` property can shadow any name, including `undefined`.
|
|
234
|
-
if (referencePath && isInsideWith(referencePath)) {
|
|
235
|
-
return false
|
|
236
|
-
}
|
|
212
|
+
// Unbound `undefined` is safe because the global property is immutable.
|
|
213
|
+
function identifierReadIsSafe(node: t.Identifier, scope: Scope | undefined): boolean {
|
|
237
214
|
const isUndefinedName = node.name === 'undefined'
|
|
238
215
|
if (!scope) {
|
|
239
216
|
return isUndefinedName
|
|
240
217
|
}
|
|
241
|
-
|
|
242
|
-
if (!binding) {
|
|
243
|
-
return isUndefinedName
|
|
244
|
-
}
|
|
245
|
-
if (t.isFunctionDeclaration(binding.path.node) || binding.kind === 'module') {
|
|
246
|
-
return true
|
|
247
|
-
}
|
|
248
|
-
if (binding.kind === 'param') {
|
|
249
|
-
// Earlier parameter defaults can read later parameters in TDZ.
|
|
250
|
-
if (!referencePath || !readIsInOwnParamList(binding, referencePath)) {
|
|
251
|
-
return true
|
|
252
|
-
}
|
|
253
|
-
return declarationReaches(binding.path, referencePath)
|
|
254
|
-
}
|
|
255
|
-
// Lexical reads need an unconditionally reached declaration in the same call.
|
|
256
|
-
if (isLexicalBinding(binding)) {
|
|
257
|
-
if (referencePath && readCrossesFunctionBoundary(binding, referencePath)) {
|
|
258
|
-
return false
|
|
259
|
-
}
|
|
260
|
-
return initializerReaches(binding.path, referencePath)
|
|
261
|
-
}
|
|
262
|
-
return declarationReaches(binding.path, referencePath)
|
|
218
|
+
return scope.getBinding(node.name) !== undefined || isUndefinedName
|
|
263
219
|
}
|
|
264
220
|
|
|
265
221
|
// Only `null` and plain function expressions are known-valid superclass values.
|
|
@@ -294,22 +250,3 @@ function coercesWithoutEffect(left: t.Node, right: t.Node, operator: string): bo
|
|
|
294
250
|
}
|
|
295
251
|
return leftKind !== 'bigint' || !THROWING_BIGINT_OPERATORS.has(operator)
|
|
296
252
|
}
|
|
297
|
-
|
|
298
|
-
function isLexicalBinding(binding: Binding): boolean {
|
|
299
|
-
return (
|
|
300
|
-
binding.kind === 'let' || binding.kind === 'const' || t.isClassDeclaration(binding.path.node)
|
|
301
|
-
)
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
function readIsInOwnParamList(binding: Binding, referencePath: NodePath): boolean {
|
|
305
|
-
const owner = binding.scope.block
|
|
306
|
-
let current: NodePath | null = referencePath
|
|
307
|
-
while (current) {
|
|
308
|
-
const parent: NodePath | null = current.parentPath
|
|
309
|
-
if (parent && parent.node === owner && current.listKey === 'params') {
|
|
310
|
-
return true
|
|
311
|
-
}
|
|
312
|
-
current = parent
|
|
313
|
-
}
|
|
314
|
-
return false
|
|
315
|
-
}
|