webfuscator 1.2.0 → 1.3.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/dist/analysis/constant.js +3 -4
- package/dist/analysis/constant.js.map +1 -1
- package/dist/analysis/inlineability.d.ts.map +1 -1
- package/dist/analysis/inlineability.js +37 -25
- package/dist/analysis/inlineability.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 +24 -4
- package/dist/options.d.ts.map +1 -1
- package/dist/preparation/expand-destructuring.d.ts +3 -3
- package/dist/preparation/expand-destructuring.js +6 -6
- package/dist/preparation/expand-destructuring.js.map +1 -1
- package/dist/transforms/arrow-to-function.js +3 -5
- package/dist/transforms/arrow-to-function.js.map +1 -1
- package/dist/transforms/conceal-strings.d.ts +57 -0
- package/dist/transforms/conceal-strings.d.ts.map +1 -0
- package/dist/transforms/conceal-strings.js +361 -0
- package/dist/transforms/conceal-strings.js.map +1 -0
- package/dist/transforms/const-let-to-var.d.ts +3 -3
- package/dist/transforms/const-let-to-var.d.ts.map +1 -1
- package/dist/transforms/const-let-to-var.js +36 -9
- package/dist/transforms/const-let-to-var.js.map +1 -1
- package/dist/transforms/const-to-let.d.ts +2 -3
- package/dist/transforms/const-to-let.d.ts.map +1 -1
- package/dist/transforms/const-to-let.js +3 -5
- package/dist/transforms/const-to-let.js.map +1 -1
- package/dist/transforms/fold-builtin-methods.d.ts.map +1 -1
- package/dist/transforms/fold-builtin-methods.js +48 -10
- package/dist/transforms/fold-builtin-methods.js.map +1 -1
- package/dist/transforms/fold-constants.js +3 -0
- package/dist/transforms/fold-constants.js.map +1 -1
- package/dist/transforms/hoist-variables.d.ts +30 -0
- package/dist/transforms/hoist-variables.d.ts.map +1 -0
- package/dist/transforms/hoist-variables.js +224 -0
- package/dist/transforms/hoist-variables.js.map +1 -0
- package/dist/transforms/inline-functions.js +3 -4
- package/dist/transforms/inline-functions.js.map +1 -1
- package/dist/transforms/mangle-properties.js +7 -4
- 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/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/pack-declarations-into-parameters.js +1 -5
- package/dist/transforms/pack-declarations-into-parameters.js.map +1 -1
- package/dist/transforms/pack.d.ts +5 -7
- package/dist/transforms/pack.d.ts.map +1 -1
- package/dist/transforms/pack.js +194 -32
- package/dist/transforms/pack.js.map +1 -1
- package/dist/transforms/remove-unused-code.d.ts.map +1 -1
- package/dist/transforms/remove-unused-code.js +7 -39
- package/dist/transforms/remove-unused-code.js.map +1 -1
- package/dist/transforms/rename-identifiers.d.ts.map +1 -1
- package/dist/transforms/rename-identifiers.js +29 -17
- package/dist/transforms/rename-identifiers.js.map +1 -1
- package/dist/transforms/reorder-function-declarations.d.ts +25 -0
- package/dist/transforms/reorder-function-declarations.d.ts.map +1 -0
- package/dist/transforms/reorder-function-declarations.js +64 -0
- package/dist/transforms/reorder-function-declarations.js.map +1 -0
- package/dist/transforms/specials-to-strings.js +4 -3
- package/dist/transforms/specials-to-strings.js.map +1 -1
- package/dist/transforms/update-to-assignment.js +1 -16
- package/dist/transforms/update-to-assignment.js.map +1 -1
- package/dist/utils/ast.d.ts +1 -2
- package/dist/utils/ast.d.ts.map +1 -1
- package/dist/utils/ast.js +12 -42
- package/dist/utils/ast.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/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 +12 -13
- package/src/analysis/constant.ts +3 -6
- package/src/analysis/inlineability.ts +40 -32
- package/src/index.ts +1 -0
- package/src/obfuscator.ts +51 -14
- package/src/options.ts +28 -3
- package/src/preparation/expand-destructuring.ts +6 -6
- package/src/transforms/arrow-to-function.ts +3 -5
- package/src/transforms/conceal-strings.ts +530 -0
- package/src/transforms/const-let-to-var.ts +37 -9
- package/src/transforms/const-to-let.ts +3 -5
- package/src/transforms/fold-builtin-methods.ts +67 -12
- package/src/transforms/fold-constants.ts +3 -0
- package/src/transforms/hoist-variables.ts +272 -0
- package/src/transforms/inline-functions.ts +3 -4
- package/src/transforms/mangle-properties.ts +7 -7
- package/src/transforms/merge-variable-declarations.ts +91 -0
- package/src/transforms/numbers-to-strings.ts +2 -12
- package/src/transforms/pack-declarations-into-parameters.ts +1 -5
- package/src/transforms/pack.ts +202 -35
- package/src/transforms/remove-unused-code.ts +9 -64
- package/src/transforms/rename-identifiers.ts +42 -17
- package/src/transforms/reorder-function-declarations.ts +80 -0
- package/src/transforms/specials-to-strings.ts +4 -3
- package/src/transforms/update-to-assignment.ts +1 -17
- package/src/utils/ast.ts +15 -51
- package/src/utils/literal.ts +91 -2
- package/src/utils/statement-lists.ts +45 -0
- package/DISCLOSURE +0 -9
- package/README.md +0 -62
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { File } from '@babel/types';
|
|
2
|
+
/**
|
|
3
|
+
* Moves hoisted function declarations to the end of each program, block, switch
|
|
4
|
+
* case, or static block. It keeps declaration order, including duplicate names,
|
|
5
|
+
* and leaves sloppy Annex B block functions in place.
|
|
6
|
+
*
|
|
7
|
+
* If moving every declaration would turn a string expression into a directive,
|
|
8
|
+
* one declaration stays before the string. Direct exports stay in place.
|
|
9
|
+
* Indirect exports move with their local declaration.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* // ◀️ before
|
|
13
|
+
* function area(r) {
|
|
14
|
+
* return r * r;
|
|
15
|
+
* }
|
|
16
|
+
* log(area(2));
|
|
17
|
+
*
|
|
18
|
+
* // ▶️ after
|
|
19
|
+
* log(area(2));
|
|
20
|
+
* function area(r) {
|
|
21
|
+
* return r * r;
|
|
22
|
+
* }
|
|
23
|
+
*/
|
|
24
|
+
export declare function reorderFunctionDeclarations(ast: File): boolean;
|
|
25
|
+
//# sourceMappingURL=reorder-function-declarations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reorder-function-declarations.d.ts","sourceRoot":"","sources":["../../src/transforms/reorder-function-declarations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAMxC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAI9D"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { hasAnnexBFunctionAlias } from '../utils/paths.js';
|
|
2
|
+
import { rewriteStatementLists } from '../utils/statement-lists.js';
|
|
3
|
+
/**
|
|
4
|
+
* Moves hoisted function declarations to the end of each program, block, switch
|
|
5
|
+
* case, or static block. It keeps declaration order, including duplicate names,
|
|
6
|
+
* and leaves sloppy Annex B block functions in place.
|
|
7
|
+
*
|
|
8
|
+
* If moving every declaration would turn a string expression into a directive,
|
|
9
|
+
* one declaration stays before the string. Direct exports stay in place.
|
|
10
|
+
* Indirect exports move with their local declaration.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* // ◀️ before
|
|
14
|
+
* function area(r) {
|
|
15
|
+
* return r * r;
|
|
16
|
+
* }
|
|
17
|
+
* log(area(2));
|
|
18
|
+
*
|
|
19
|
+
* // ▶️ after
|
|
20
|
+
* log(area(2));
|
|
21
|
+
* function area(r) {
|
|
22
|
+
* return r * r;
|
|
23
|
+
* }
|
|
24
|
+
*/
|
|
25
|
+
export function reorderFunctionDeclarations(ast) {
|
|
26
|
+
return rewriteStatementLists(ast, (statements, container) => reorderedStatements(statements, containerAllowsDirective(container)));
|
|
27
|
+
}
|
|
28
|
+
// Only programs and function bodies recognize directives, so only they need the guard.
|
|
29
|
+
function containerAllowsDirective(container) {
|
|
30
|
+
if (container.isProgram()) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
return container.isBlockStatement() && container.parentPath.isFunction();
|
|
34
|
+
}
|
|
35
|
+
function reorderedStatements(children, canCreateDirective) {
|
|
36
|
+
const rest = [];
|
|
37
|
+
const moved = [];
|
|
38
|
+
for (const child of children) {
|
|
39
|
+
if (isMovable(child)) {
|
|
40
|
+
moved.push(child.node);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
rest.push(child.node);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (moved.length === 0) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
if (canCreateDirective && createsDirective(rest)) {
|
|
50
|
+
rest.unshift(moved.shift());
|
|
51
|
+
}
|
|
52
|
+
const reordered = [...rest, ...moved];
|
|
53
|
+
return reordered.every((node, index) => node === children[index]?.node) ? null : reordered;
|
|
54
|
+
}
|
|
55
|
+
function createsDirective(statements) {
|
|
56
|
+
const first = statements[0];
|
|
57
|
+
return (first !== undefined &&
|
|
58
|
+
first.type === 'ExpressionStatement' &&
|
|
59
|
+
first.expression.type === 'StringLiteral');
|
|
60
|
+
}
|
|
61
|
+
function isMovable(child) {
|
|
62
|
+
return child.isFunctionDeclaration() && child.node.id !== null && !hasAnnexBFunctionAlias(child);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=reorder-function-declarations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reorder-function-declarations.js","sourceRoot":"","sources":["../../src/transforms/reorder-function-declarations.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAGhE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,2BAA2B,CAAC,GAAS;IACnD,OAAO,qBAAqB,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,CAC1D,mBAAmB,CAAC,UAAU,EAAE,wBAAwB,CAAC,SAAS,CAAC,CAAC,CACrE,CAAA;AACH,CAAC;AAED,uFAAuF;AACvF,SAAS,wBAAwB,CAAC,SAA2C;IAC3E,IAAI,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,SAAS,CAAC,gBAAgB,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,CAAA;AAC1E,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAiC,EACjC,kBAA2B;IAE3B,MAAM,IAAI,GAAkB,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,kBAAkB,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC,CAAA;IAC9B,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,CAAA;IACrC,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;AAC5F,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkC;IAC1D,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;IAC3B,OAAO,CACL,KAAK,KAAK,SAAS;QACnB,KAAK,CAAC,IAAI,KAAK,qBAAqB;QACpC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,eAAe,CAC1C,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAA4B;IAC7C,OAAO,KAAK,CAAC,qBAAqB,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAA;AAClG,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import traverse from '@babel/traverse';
|
|
2
2
|
import * as t from '@babel/types';
|
|
3
|
-
import {
|
|
3
|
+
import { isInsideWith } from '../utils/ast.js';
|
|
4
4
|
import { mulberry32 } from '../utils/random.js';
|
|
5
5
|
import { StringGenerator } from '../utils/string-generator.js';
|
|
6
6
|
/**
|
|
@@ -57,8 +57,9 @@ const visitor = {
|
|
|
57
57
|
if (path.scope.getBinding(name)) {
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
|
-
//
|
|
61
|
-
|
|
60
|
+
// A replacement cannot occupy a write target. `with` may also shadow `NaN`,
|
|
61
|
+
// `Infinity`, or `undefined`.
|
|
62
|
+
if (isWriteTarget(path) || isInsideWith(path)) {
|
|
62
63
|
return;
|
|
63
64
|
}
|
|
64
65
|
const str = t.stringLiteral(state.generator.next());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specials-to-strings.js","sourceRoot":"","sources":["../../src/transforms/specials-to-strings.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AAEtC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAIjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"specials-to-strings.js","sourceRoot":"","sources":["../../src/transforms/specials-to-strings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as t from '@babel/types';
|
|
2
|
-
import {
|
|
2
|
+
import { isInsideWith } from '../utils/ast.js';
|
|
3
3
|
import { traverseForChanges } from '../utils/change-tracking.js';
|
|
4
4
|
/**
|
|
5
5
|
* Rewrites numeric updates as compound assignments for later expansion. Prefix
|
|
@@ -46,10 +46,6 @@ const visitor = {
|
|
|
46
46
|
if (!isNumericBinding(binding)) {
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
|
-
// Direct eval anywhere in the binding's scope can change its type.
|
|
50
|
-
if (bindingScopeReachesDirectEval(binding)) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
49
|
const compound = operator === '++' ? '+=' : '-=';
|
|
54
50
|
path.replaceWith(t.assignmentExpression(compound, argument, t.numericLiteral(1)));
|
|
55
51
|
state.changed = true;
|
|
@@ -86,17 +82,6 @@ function isNumericBinding(binding) {
|
|
|
86
82
|
}
|
|
87
83
|
return binding.constantViolations.every((violation) => keepsNumeric(violation.node));
|
|
88
84
|
}
|
|
89
|
-
// A sibling or nested direct eval can still close over and reassign the binding.
|
|
90
|
-
function bindingScopeReachesDirectEval(binding) {
|
|
91
|
-
let found = false;
|
|
92
|
-
t.traverseFast(binding.scope.block, (node) => {
|
|
93
|
-
if (isDirectEvalCall(node)) {
|
|
94
|
-
found = true;
|
|
95
|
-
}
|
|
96
|
-
return found ? t.traverseFast.stop : undefined;
|
|
97
|
-
});
|
|
98
|
-
return found;
|
|
99
|
-
}
|
|
100
85
|
function isForInOfLoopVariable(binding) {
|
|
101
86
|
const declaration = binding.path.parentPath;
|
|
102
87
|
if (!declaration || !declaration.isVariableDeclaration()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-to-assignment.js","sourceRoot":"","sources":["../../src/transforms/update-to-assignment.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"update-to-assignment.js","sourceRoot":"","sources":["../../src/transforms/update-to-assignment.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/ast.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ export declare function isInDirectivePrologue(path: NodePath): boolean;
|
|
|
4
4
|
export declare function walkOwnFunctionScope(root: t.Node, callback: (node: t.Node) => void): void;
|
|
5
5
|
export declare function hasDuplicateParamNames(params: t.Function['params']): boolean;
|
|
6
6
|
export declare function isProtoKey(key: t.Node): boolean;
|
|
7
|
+
export declare function isNonComputedKey(path: NodePath): boolean;
|
|
7
8
|
export declare function isInsideWith(path: NodePath): boolean;
|
|
8
|
-
export declare function enclosingScopeHasDirectEval(path: NodePath): boolean;
|
|
9
|
-
export declare function isDirectEvalCall(node: t.Node): boolean;
|
|
10
9
|
//# sourceMappingURL=ast.d.ts.map
|
package/dist/utils/ast.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/utils/ast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAuB7D;AAGD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,CAQzF;AAID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAW5E;AAID,wBAAgB,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,GAAG,OAAO,CAK/C;AAGD,wBAAgB,
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/utils/ast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAuB7D;AAGD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,CAQzF;AAID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAW5E;AAID,wBAAgB,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,GAAG,OAAO,CAK/C;AAGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAKxD;AAGD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAKpD"}
|
package/dist/utils/ast.js
CHANGED
|
@@ -53,65 +53,35 @@ export function isProtoKey(key) {
|
|
|
53
53
|
return ((t.isIdentifier(key) && key.name === '__proto__') ||
|
|
54
54
|
(t.isStringLiteral(key) && key.value === '__proto__'));
|
|
55
55
|
}
|
|
56
|
+
// A non-computed key names a property; it is not a runtime value.
|
|
57
|
+
export function isNonComputedKey(path) {
|
|
58
|
+
const parent = path.parent;
|
|
59
|
+
return ('key' in parent && parent.key === path.node && 'computed' in parent && parent.computed === false);
|
|
60
|
+
}
|
|
56
61
|
// `with` can shadow names outside Babel's scope table.
|
|
57
62
|
export function isInsideWith(path) {
|
|
58
|
-
if (!
|
|
63
|
+
if (!programHasWith(path.scope.getProgramParent().block)) {
|
|
59
64
|
return false;
|
|
60
65
|
}
|
|
61
66
|
return path.findParent((ancestor) => ancestor.isWithStatement()) !== null;
|
|
62
67
|
}
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
export function enclosingScopeHasDirectEval(path) {
|
|
66
|
-
if (!programContains(path.scope.getProgramParent().block, programDirectEval, isDirectEvalCall)) {
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
let current = path;
|
|
70
|
-
while (current) {
|
|
71
|
-
if ((current.isFunction() || current.isProgram()) && ownScopeHasDirectEval(current.node)) {
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
current = current.parentPath;
|
|
75
|
-
}
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
// Cache program-wide `eval` and `with` checks to avoid a subtree walk per name.
|
|
79
|
-
// No transform creates either construct, so a negative result stays valid.
|
|
80
|
-
const programDirectEval = new WeakMap();
|
|
68
|
+
// Cache the program-wide scan because `isInsideWith` runs for many identifiers.
|
|
69
|
+
// Transforms never add `with`, so a cached miss remains valid.
|
|
81
70
|
const programWith = new WeakMap();
|
|
82
|
-
function
|
|
83
|
-
const cached =
|
|
71
|
+
function programHasWith(programNode) {
|
|
72
|
+
const cached = programWith.get(programNode);
|
|
84
73
|
if (cached !== undefined) {
|
|
85
74
|
return cached;
|
|
86
75
|
}
|
|
87
76
|
let found = false;
|
|
88
77
|
t.traverseFast(programNode, (node) => {
|
|
89
|
-
if (!
|
|
78
|
+
if (!t.isWithStatement(node)) {
|
|
90
79
|
return;
|
|
91
80
|
}
|
|
92
81
|
found = true;
|
|
93
82
|
return t.traverseFast.stop;
|
|
94
83
|
});
|
|
95
|
-
|
|
84
|
+
programWith.set(programNode, found);
|
|
96
85
|
return found;
|
|
97
86
|
}
|
|
98
|
-
function ownScopeHasDirectEval(owner) {
|
|
99
|
-
let found = false;
|
|
100
|
-
// This walk stops at the first hit, unlike `walkOwnFunctionScope`.
|
|
101
|
-
t.traverseFast(owner, (node) => {
|
|
102
|
-
if (isDirectEvalCall(node)) {
|
|
103
|
-
found = true;
|
|
104
|
-
return t.traverseFast.stop;
|
|
105
|
-
}
|
|
106
|
-
return node !== owner && t.isFunction(node) ? t.traverseFast.skip : undefined;
|
|
107
|
-
});
|
|
108
|
-
return found;
|
|
109
|
-
}
|
|
110
|
-
export function isDirectEvalCall(node) {
|
|
111
|
-
// `eval?.(...)` is an OptionalCallExpression yet still a direct eval, so both
|
|
112
|
-
// call node shapes count.
|
|
113
|
-
return ((t.isCallExpression(node) || t.isOptionalCallExpression(node)) &&
|
|
114
|
-
t.isIdentifier(node.callee) &&
|
|
115
|
-
node.callee.name === 'eval');
|
|
116
|
-
}
|
|
117
87
|
//# sourceMappingURL=ast.js.map
|
package/dist/utils/ast.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/utils/ast.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAEjC,iFAAiF;AACjF,MAAM,UAAU,qBAAqB,CAAC,IAAc;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAA;IAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,MAAM,GACV,MAAM,CAAC,SAAS,EAAE;QAClB,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAA;IAC5F,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAA;IACtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAA;IACd,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAW,CAAA;QACtC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAChF,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,QAAgC;IACjF,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QAC5B,MAAM,UAAU,GAAG,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACtD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC;QACD,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;IACrD,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,4EAA4E;AAC5E,iDAAiD;AACjD,MAAM,UAAU,sBAAsB,CAAC,MAA4B;IACjE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAA;YACb,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,0EAA0E;AAC1E,wBAAwB;AACxB,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,CACL,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC;QACjD,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,WAAW,CAAC,CACtD,CAAA;AACH,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/utils/ast.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../src/utils/literal.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../src/utils/literal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAQjC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,OAAO,CAQxD;AAGD,wBAAgB,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,OAAO,CAErD;AA4BD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,UAAU,GAAG,IAAI,CAMlE"}
|
package/dist/utils/literal.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import generate from '@babel/generator';
|
|
1
2
|
import * as t from '@babel/types';
|
|
3
|
+
const MAX_GENERATED_LITERAL_LENGTH = 8192;
|
|
4
|
+
const MAX_LITERAL_DEPTH = 32;
|
|
5
|
+
const MAX_LITERAL_NODES = 512;
|
|
2
6
|
const MAX_STRING_LITERAL_LENGTH = 4096;
|
|
3
7
|
// RegExp literals allocate mutable objects and are not primitive values.
|
|
4
8
|
export function isPrimitiveLiteral(node) {
|
|
@@ -38,19 +42,45 @@ function literalShapeKind(node) {
|
|
|
38
42
|
return null;
|
|
39
43
|
}
|
|
40
44
|
export function valueToLiteral(value) {
|
|
45
|
+
const literal = buildValueLiteral(value, new Set(), { nodesRemaining: MAX_LITERAL_NODES }, 0);
|
|
46
|
+
if (!literal || generate(literal).code.length > MAX_GENERATED_LITERAL_LENGTH) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
return literal;
|
|
50
|
+
}
|
|
51
|
+
function reserveLiteralNodes(budget, count) {
|
|
52
|
+
if (budget.nodesRemaining < count) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
budget.nodesRemaining -= count;
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
function buildValueLiteral(value, seen, budget, depth) {
|
|
59
|
+
if (depth > MAX_LITERAL_DEPTH) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
41
62
|
if (typeof value === 'string') {
|
|
42
|
-
if (value.length > MAX_STRING_LITERAL_LENGTH) {
|
|
63
|
+
if (value.length > MAX_STRING_LITERAL_LENGTH || !reserveLiteralNodes(budget, 1)) {
|
|
43
64
|
return null;
|
|
44
65
|
}
|
|
45
66
|
return t.stringLiteral(value);
|
|
46
67
|
}
|
|
47
68
|
if (typeof value === 'boolean') {
|
|
69
|
+
if (!reserveLiteralNodes(budget, 1)) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
48
72
|
return t.booleanLiteral(value);
|
|
49
73
|
}
|
|
50
74
|
if (value === null) {
|
|
75
|
+
if (!reserveLiteralNodes(budget, 1)) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
51
78
|
return t.nullLiteral();
|
|
52
79
|
}
|
|
53
80
|
if (value === undefined) {
|
|
81
|
+
if (!reserveLiteralNodes(budget, 2)) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
54
84
|
// `void 0` cannot be shadowed like the identifier `undefined`.
|
|
55
85
|
return t.unaryExpression('void', t.numericLiteral(0));
|
|
56
86
|
}
|
|
@@ -58,8 +88,14 @@ export function valueToLiteral(value) {
|
|
|
58
88
|
// A UnaryExpression lets the generator parenthesize negative BigInt where
|
|
59
89
|
// precedence requires it.
|
|
60
90
|
if (value < 0n) {
|
|
91
|
+
if (!reserveLiteralNodes(budget, 2)) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
61
94
|
return t.unaryExpression('-', t.bigIntLiteral(-value));
|
|
62
95
|
}
|
|
96
|
+
if (!reserveLiteralNodes(budget, 1)) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
63
99
|
return t.bigIntLiteral(value);
|
|
64
100
|
}
|
|
65
101
|
if (typeof value === 'number') {
|
|
@@ -67,17 +103,30 @@ export function valueToLiteral(value) {
|
|
|
67
103
|
return null;
|
|
68
104
|
}
|
|
69
105
|
if (Object.is(value, -0)) {
|
|
106
|
+
if (!reserveLiteralNodes(budget, 2)) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
70
109
|
return t.unaryExpression('-', t.numericLiteral(0));
|
|
71
110
|
}
|
|
72
111
|
if (value < 0) {
|
|
112
|
+
if (!reserveLiteralNodes(budget, 2)) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
73
115
|
return t.unaryExpression('-', t.numericLiteral(-value));
|
|
74
116
|
}
|
|
117
|
+
if (!reserveLiteralNodes(budget, 1)) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
75
120
|
return t.numericLiteral(value);
|
|
76
121
|
}
|
|
77
122
|
if (Array.isArray(value)) {
|
|
123
|
+
if (seen.has(value) || !arrayHasLiteralShape(value) || !reserveLiteralNodes(budget, 1)) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
seen.add(value);
|
|
78
127
|
const elements = [];
|
|
79
128
|
for (const item of value) {
|
|
80
|
-
const lit =
|
|
129
|
+
const lit = buildValueLiteral(item, seen, budget, depth + 1);
|
|
81
130
|
if (!lit) {
|
|
82
131
|
return null;
|
|
83
132
|
}
|
|
@@ -87,4 +136,27 @@ export function valueToLiteral(value) {
|
|
|
87
136
|
}
|
|
88
137
|
return null;
|
|
89
138
|
}
|
|
139
|
+
function arrayHasLiteralShape(value) {
|
|
140
|
+
if (Object.getPrototypeOf(value) !== Array.prototype || !Object.isExtensible(value)) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
const names = Object.getOwnPropertyNames(value);
|
|
144
|
+
if (names.length !== value.length + 1 || names.at(-1) !== 'length') {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
for (let index = 0; index < value.length; index++) {
|
|
148
|
+
if (names[index] !== String(index) ||
|
|
149
|
+
!isOrdinaryDataProperty(Object.getOwnPropertyDescriptor(value, String(index)))) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return Object.getOwnPropertySymbols(value).length === 0;
|
|
154
|
+
}
|
|
155
|
+
function isOrdinaryDataProperty(descriptor) {
|
|
156
|
+
return (descriptor !== undefined &&
|
|
157
|
+
'value' in descriptor &&
|
|
158
|
+
descriptor.configurable === true &&
|
|
159
|
+
descriptor.enumerable === true &&
|
|
160
|
+
descriptor.writable === true);
|
|
161
|
+
}
|
|
90
162
|
//# sourceMappingURL=literal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"literal.js","sourceRoot":"","sources":["../../src/utils/literal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAEjC,MAAM,yBAAyB,GAAG,IAAI,CAAA;AAEtC,yEAAyE;AACzE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,CACL,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC;QACvB,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;QACxB,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;QACxB,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;QACrB,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CACxB,CAAA;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAA;AACxC,CAAC;AAED,wEAAwE;AACxE,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,IAAI,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC7C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YAC1B,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAA;QAC5C,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YACnD,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,yBAAyB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"literal.js","sourceRoot":"","sources":["../../src/utils/literal.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.0",
|
|
4
4
|
"description": "JavaScript obfuscator built on Babel",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"babel",
|
|
@@ -35,19 +35,12 @@
|
|
|
35
35
|
"source": "./src/index.ts",
|
|
36
36
|
"types": "./dist/index.d.ts",
|
|
37
37
|
"default": "./dist/index.js"
|
|
38
|
-
}
|
|
38
|
+
},
|
|
39
|
+
"./package.json": "./package.json"
|
|
39
40
|
},
|
|
40
41
|
"publishConfig": {
|
|
41
42
|
"access": "public"
|
|
42
43
|
},
|
|
43
|
-
"scripts": {
|
|
44
|
-
"prepublishOnly": "pnpm --workspace-root check",
|
|
45
|
-
"prepack": "pnpm run build",
|
|
46
|
-
"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",
|
|
47
|
-
"check": "pnpm run typecheck && pnpm run test",
|
|
48
|
-
"test": "vitest run",
|
|
49
|
-
"typecheck": "tsc --noEmit"
|
|
50
|
-
},
|
|
51
44
|
"dependencies": {
|
|
52
45
|
"@babel/generator": "^8.0.0",
|
|
53
46
|
"@babel/parser": "^8.0.4",
|
|
@@ -55,9 +48,9 @@
|
|
|
55
48
|
"@babel/types": "^8.0.4"
|
|
56
49
|
},
|
|
57
50
|
"devDependencies": {
|
|
58
|
-
"@types/node": "
|
|
51
|
+
"@types/node": "^26.2.0",
|
|
59
52
|
"tsc-alias": "^1.9.2",
|
|
60
|
-
"typescript": "
|
|
53
|
+
"typescript": "^7.0.2",
|
|
61
54
|
"vitest": "^4.1.11"
|
|
62
55
|
},
|
|
63
56
|
"engines": {
|
|
@@ -65,5 +58,11 @@
|
|
|
65
58
|
},
|
|
66
59
|
"contentPolicy": {
|
|
67
60
|
"class": "dual-use"
|
|
61
|
+
},
|
|
62
|
+
"scripts": {
|
|
63
|
+
"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",
|
|
64
|
+
"test": "vitest run",
|
|
65
|
+
"test:watch": "vitest",
|
|
66
|
+
"typecheck": "tsc --noEmit"
|
|
68
67
|
}
|
|
69
|
-
}
|
|
68
|
+
}
|
package/src/analysis/constant.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Binding, NodePath, Scope } from '@babel/traverse'
|
|
2
2
|
import * as t from '@babel/types'
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { isInsideWith } from '../utils/ast'
|
|
5
5
|
import {
|
|
6
6
|
declarationReaches,
|
|
7
7
|
initializerReaches,
|
|
@@ -141,11 +141,8 @@ function evaluateIdentifier(node: t.Node, env: Env): Evaluation {
|
|
|
141
141
|
return UNKNOWN
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
//
|
|
145
|
-
if (
|
|
146
|
-
env.referencePath &&
|
|
147
|
-
(isInsideWith(env.referencePath) || enclosingScopeHasDirectEval(env.referencePath))
|
|
148
|
-
) {
|
|
144
|
+
// Babel's scope table cannot account for properties supplied by `with`.
|
|
145
|
+
if (env.referencePath && isInsideWith(env.referencePath)) {
|
|
149
146
|
return UNKNOWN
|
|
150
147
|
}
|
|
151
148
|
const binding = env.scope.getBinding(identifier.name)
|