webfuscator 1.2.1 → 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.js +1 -1
- 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 +17 -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 +10 -17
- 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 +10 -12
- package/src/analysis/constant.ts +3 -6
- package/src/analysis/inlineability.ts +1 -1
- package/src/index.ts +1 -0
- package/src/obfuscator.ts +51 -14
- package/src/options.ts +21 -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 +10 -18
- 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 -67
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",
|
|
@@ -41,14 +41,6 @@
|
|
|
41
41
|
"publishConfig": {
|
|
42
42
|
"access": "public"
|
|
43
43
|
},
|
|
44
|
-
"scripts": {
|
|
45
|
-
"prepublishOnly": "pnpm --workspace-root check",
|
|
46
|
-
"prepack": "pnpm run build",
|
|
47
|
-
"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",
|
|
48
|
-
"test": "vitest run",
|
|
49
|
-
"test:watch": "vitest",
|
|
50
|
-
"typecheck": "tsc --noEmit"
|
|
51
|
-
},
|
|
52
44
|
"dependencies": {
|
|
53
45
|
"@babel/generator": "^8.0.0",
|
|
54
46
|
"@babel/parser": "^8.0.4",
|
|
@@ -56,9 +48,9 @@
|
|
|
56
48
|
"@babel/types": "^8.0.4"
|
|
57
49
|
},
|
|
58
50
|
"devDependencies": {
|
|
59
|
-
"@types/node": "
|
|
51
|
+
"@types/node": "^26.2.0",
|
|
60
52
|
"tsc-alias": "^1.9.2",
|
|
61
|
-
"typescript": "
|
|
53
|
+
"typescript": "^7.0.2",
|
|
62
54
|
"vitest": "^4.1.11"
|
|
63
55
|
},
|
|
64
56
|
"engines": {
|
|
@@ -66,5 +58,11 @@
|
|
|
66
58
|
},
|
|
67
59
|
"contentPolicy": {
|
|
68
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"
|
|
69
67
|
}
|
|
70
|
-
}
|
|
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)
|
|
@@ -279,7 +279,7 @@ const analyzeBodyVisitor: Visitor<AnalyzeBodyState> = {
|
|
|
279
279
|
},
|
|
280
280
|
Identifier(path, state) {
|
|
281
281
|
const name = path.node.name
|
|
282
|
-
if (state.innerFnDepth === 0 &&
|
|
282
|
+
if (state.innerFnDepth === 0 && name === 'arguments') {
|
|
283
283
|
state.unsafe = true
|
|
284
284
|
path.stop()
|
|
285
285
|
return
|
package/src/index.ts
CHANGED
package/src/obfuscator.ts
CHANGED
|
@@ -14,6 +14,7 @@ import { wrapSingleStatements } from './preparation/wrap-single-statements'
|
|
|
14
14
|
import { argumentsToParameters } from './transforms/arguments-to-parameters'
|
|
15
15
|
import { arrowToFunction } from './transforms/arrow-to-function'
|
|
16
16
|
import { collapseSingleUseTemps } from './transforms/collapse-single-use-temps'
|
|
17
|
+
import { concealStrings } from './transforms/conceal-strings'
|
|
17
18
|
import { constLetToVar } from './transforms/const-let-to-var'
|
|
18
19
|
import { constToLet } from './transforms/const-to-let'
|
|
19
20
|
import { doWhileToWhile } from './transforms/do-while-to-while'
|
|
@@ -26,9 +27,11 @@ import { foldBuiltinMethods } from './transforms/fold-builtin-methods'
|
|
|
26
27
|
import { foldConstants } from './transforms/fold-constants'
|
|
27
28
|
import { forToWhile } from './transforms/for-to-while'
|
|
28
29
|
import { functionDeclarationToExpression } from './transforms/function-declaration-to-expression'
|
|
30
|
+
import { hoistVariables } from './transforms/hoist-variables'
|
|
29
31
|
import { inlineFunctions } from './transforms/inline-functions'
|
|
30
32
|
import { logicalToTernary } from './transforms/logical-to-ternary'
|
|
31
33
|
import { mangleProperties } from './transforms/mangle-properties'
|
|
34
|
+
import { mergeVariableDeclarations } from './transforms/merge-variable-declarations'
|
|
32
35
|
import { nullishCoalescingToTernary } from './transforms/nullish-coalescing-to-ternary'
|
|
33
36
|
import { numbersToStrings } from './transforms/numbers-to-strings'
|
|
34
37
|
import { objectMethodToProperty } from './transforms/object-method-to-property'
|
|
@@ -39,6 +42,7 @@ import { removeAnonymousFunctionNames } from './transforms/remove-anonymous-func
|
|
|
39
42
|
import { removeUnreachableCode } from './transforms/remove-unreachable-code'
|
|
40
43
|
import { removeUnusedCode } from './transforms/remove-unused-code'
|
|
41
44
|
import { renameIdentifiers } from './transforms/rename-identifiers'
|
|
45
|
+
import { reorderFunctionDeclarations } from './transforms/reorder-function-declarations'
|
|
42
46
|
import { specialsToStrings } from './transforms/specials-to-strings'
|
|
43
47
|
import { switchToIf } from './transforms/switch-to-if'
|
|
44
48
|
import { ternaryToIf } from './transforms/ternary-to-if'
|
|
@@ -48,8 +52,6 @@ import type { StringGeneratorModeOption } from './utils/string-generator'
|
|
|
48
52
|
|
|
49
53
|
const parserOptions: ParserOptions = { sourceType: 'unambiguous' }
|
|
50
54
|
|
|
51
|
-
const PRESERVED_COMMENT_RE = /^!|@(?:license|preserve)\b|^#\s*source(?:Mapping)?URL=/iu
|
|
52
|
-
|
|
53
55
|
const DEFAULT_STRING_GENERATOR_MODE: StringGeneratorModeOption = 'mangled'
|
|
54
56
|
const DEFAULT_SEED = 0
|
|
55
57
|
|
|
@@ -76,11 +78,10 @@ const PREPARATION: readonly Phase[] = [
|
|
|
76
78
|
['dotToBracket', asBoolean(dotToBracket)],
|
|
77
79
|
]
|
|
78
80
|
|
|
79
|
-
//
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
// `ObjectMethod` makes extraction refuse the whole literal.
|
|
81
|
+
// `constLetToVar` must precede the fixed point because folds need function-scoped
|
|
82
|
+
// bindings. `argumentsToParameters` must precede parameter renaming.
|
|
83
|
+
// `objectMethodToProperty` must precede extraction because one `ObjectMethod`
|
|
84
|
+
// blocks the whole object literal.
|
|
84
85
|
const PRE_LOOP: readonly ConfigurablePhase[] = [
|
|
85
86
|
['dropDebugger', dropDebugger],
|
|
86
87
|
['dropConsole', dropConsole],
|
|
@@ -124,15 +125,25 @@ const LOWERING: readonly ConfigurablePhase[] = [
|
|
|
124
125
|
['ternaryToIf', ternaryToIf],
|
|
125
126
|
]
|
|
126
127
|
|
|
127
|
-
//
|
|
128
|
-
//
|
|
128
|
+
// `packDeclarationsIntoParameters` must precede declaration motion and merging.
|
|
129
|
+
// `reorderFunctionDeclarations` follows `functionDeclarationToExpression`, so it
|
|
130
|
+
// moves only declarations still needed for hoisting. `hoistVariables` must run
|
|
131
|
+
// before `mergeVariableDeclarations`. `numbersToStrings` follows the fixed point,
|
|
132
|
+
// yodification, and `specialsToStrings` because they need or create numbers.
|
|
129
133
|
const POST_PROCESS: readonly ConfigurablePhase[] = [
|
|
130
134
|
['packDeclarationsIntoParameters', packDeclarationsIntoParameters],
|
|
135
|
+
['reorderFunctionDeclarations', reorderFunctionDeclarations],
|
|
136
|
+
['hoistVariables', hoistVariables],
|
|
137
|
+
['mergeVariableDeclarations', mergeVariableDeclarations],
|
|
131
138
|
['yodifyConditions', yodifyConditions],
|
|
132
139
|
['specialsToStrings', specialsToStrings],
|
|
133
140
|
['numbersToStrings', numbersToStrings],
|
|
134
141
|
]
|
|
135
142
|
|
|
143
|
+
// Conceal strings after every string-producing pass, but before renaming so the
|
|
144
|
+
// generated vault bindings use the caller's name generator.
|
|
145
|
+
const PROTECTION: readonly ConfigurablePhase[] = [['concealStrings', concealStrings]]
|
|
146
|
+
|
|
136
147
|
// Renaming runs last because later transforms depend on recognizable bindings.
|
|
137
148
|
const RENAME: readonly ConfigurablePhase[] = [['renameIdentifiers', renameIdentifiers]]
|
|
138
149
|
|
|
@@ -141,6 +152,19 @@ const RENAME: readonly ConfigurablePhase[] = [['renameIdentifiers', renameIdenti
|
|
|
141
152
|
// every other rewrite, including renaming.
|
|
142
153
|
const PACK: readonly ConfigurablePhase[] = [['pack', pack]]
|
|
143
154
|
|
|
155
|
+
// Tests derive their all-transforms setup from this list. The phase tables remain
|
|
156
|
+
// the only source of pipeline order.
|
|
157
|
+
export const CONFIGURABLE_TRANSFORM_NAMES: readonly TransformName[] = [
|
|
158
|
+
...BEFORE_PREPARATION,
|
|
159
|
+
...PRE_LOOP,
|
|
160
|
+
...FIXED_POINT,
|
|
161
|
+
...LOWERING,
|
|
162
|
+
...POST_PROCESS,
|
|
163
|
+
...PROTECTION,
|
|
164
|
+
...RENAME,
|
|
165
|
+
...PACK,
|
|
166
|
+
].map(([name]) => name)
|
|
167
|
+
|
|
144
168
|
/** Parses, transforms, and prints JavaScript without mutating external state. */
|
|
145
169
|
export function obfuscate(code: string, options: ObfuscatorOptions = {}): string {
|
|
146
170
|
const log = options.verbose ? makeLogger() : null
|
|
@@ -184,6 +208,13 @@ export function obfuscate(code: string, options: ObfuscatorOptions = {}): string
|
|
|
184
208
|
run(log, name, () => fn(ast, ctxFor(name, options, baseCtx)))
|
|
185
209
|
}
|
|
186
210
|
|
|
211
|
+
for (const [name, fn] of PROTECTION) {
|
|
212
|
+
if (!isEnabled(name, options)) {
|
|
213
|
+
continue
|
|
214
|
+
}
|
|
215
|
+
run(log, name, () => fn(ast, ctxFor(name, options, baseCtx)))
|
|
216
|
+
}
|
|
217
|
+
|
|
187
218
|
for (const [name, fn] of RENAME) {
|
|
188
219
|
if (!isEnabled(name, options)) {
|
|
189
220
|
continue
|
|
@@ -201,7 +232,13 @@ export function obfuscate(code: string, options: ObfuscatorOptions = {}): string
|
|
|
201
232
|
return run(
|
|
202
233
|
log,
|
|
203
234
|
'generate',
|
|
204
|
-
() =>
|
|
235
|
+
() =>
|
|
236
|
+
generate(ast, {
|
|
237
|
+
comments: false,
|
|
238
|
+
minified: options.minify ?? false,
|
|
239
|
+
// `comments: false` still allows @license and @preserve.
|
|
240
|
+
shouldPrintComment: () => false,
|
|
241
|
+
}).code,
|
|
205
242
|
)
|
|
206
243
|
}
|
|
207
244
|
|
|
@@ -216,6 +253,10 @@ function ctxFor(
|
|
|
216
253
|
options: ObfuscatorOptions,
|
|
217
254
|
base: TransformContext,
|
|
218
255
|
): TransformContext {
|
|
256
|
+
if (name === 'concealStrings') {
|
|
257
|
+
const entry = options.transforms?.concealStrings
|
|
258
|
+
return entry && typeof entry === 'object' ? { ...base, concealStrings: entry } : base
|
|
259
|
+
}
|
|
219
260
|
const entry = options.transforms?.[name]
|
|
220
261
|
let context = base
|
|
221
262
|
if (entry && typeof entry === 'object' && entry.stringGeneratorMode !== undefined) {
|
|
@@ -261,10 +302,6 @@ function asBoolean(fn: (ast: File) => unknown): TransformFn {
|
|
|
261
302
|
}
|
|
262
303
|
}
|
|
263
304
|
|
|
264
|
-
function shouldPrintComment(value: string): boolean {
|
|
265
|
-
return PRESERVED_COMMENT_RE.test(value)
|
|
266
|
-
}
|
|
267
|
-
|
|
268
305
|
type Logger = <T>(name: string, fn: () => T) => T
|
|
269
306
|
|
|
270
307
|
function run<T>(log: Logger | null, name: string, fn: () => T): T {
|
package/src/options.ts
CHANGED
|
@@ -21,6 +21,9 @@ export type TransformName =
|
|
|
21
21
|
| 'collapseSingleUseTemps'
|
|
22
22
|
| 'arrowToFunction'
|
|
23
23
|
| 'functionDeclarationToExpression'
|
|
24
|
+
| 'reorderFunctionDeclarations'
|
|
25
|
+
| 'hoistVariables'
|
|
26
|
+
| 'mergeVariableDeclarations'
|
|
24
27
|
| 'switchToIf'
|
|
25
28
|
| 'forToWhile'
|
|
26
29
|
| 'doWhileToWhile'
|
|
@@ -35,6 +38,7 @@ export type TransformName =
|
|
|
35
38
|
| 'yodifyConditions'
|
|
36
39
|
| 'specialsToStrings'
|
|
37
40
|
| 'numbersToStrings'
|
|
41
|
+
| 'concealStrings'
|
|
38
42
|
| 'mangleProperties'
|
|
39
43
|
| 'renameIdentifiers'
|
|
40
44
|
| 'pack'
|
|
@@ -61,8 +65,8 @@ export interface ManglePropertiesOptions {
|
|
|
61
65
|
/** Custom property-name generator. It takes precedence over `stringGeneratorMode`. */
|
|
62
66
|
nameGenerator?: PropertyNameGenerator
|
|
63
67
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
68
|
+
* Mangle only names with an exact standalone `/*@__MANGLE_PROP__*\/` or
|
|
69
|
+
* `/*#__MANGLE_PROP__*\/` annotation. Default `false`.
|
|
66
70
|
*/
|
|
67
71
|
onlyAnnotated?: boolean
|
|
68
72
|
/** Only names already present in `cache` may be mangled. Default `false`. */
|
|
@@ -95,12 +99,25 @@ export interface PackOptions {
|
|
|
95
99
|
stringGeneratorMode?: StringGeneratorModeOption
|
|
96
100
|
}
|
|
97
101
|
|
|
102
|
+
/** Options for the string vault generated by `concealStrings`. */
|
|
103
|
+
export interface ConcealStringsOptions {
|
|
104
|
+
/** Cache each decoded string in its vault. Default `true`. */
|
|
105
|
+
cache?: boolean
|
|
106
|
+
/** Choose how much of the UTF-16 range pads each pool. Default `'regional'`. */
|
|
107
|
+
cover?: 'full' | 'regional' | 'used'
|
|
108
|
+
/** Reuse one vault entry for equal strings. Default `true`. */
|
|
109
|
+
deduplicate?: boolean
|
|
110
|
+
/** Use one program vault or a separate vault per function. Default `'program'`. */
|
|
111
|
+
scope?: 'function' | 'program'
|
|
112
|
+
}
|
|
113
|
+
|
|
98
114
|
type SimpleTransform = Exclude<
|
|
99
115
|
TransformName,
|
|
100
|
-
'mangleProperties' | 'pack' | 'renameIdentifiers' | 'specialsToStrings'
|
|
116
|
+
'concealStrings' | 'mangleProperties' | 'pack' | 'renameIdentifiers' | 'specialsToStrings'
|
|
101
117
|
>
|
|
102
118
|
|
|
103
119
|
type TransformsMap = Partial<Record<SimpleTransform, boolean>> & {
|
|
120
|
+
concealStrings?: boolean | ConcealStringsOptions
|
|
104
121
|
mangleProperties?: boolean | ManglePropertiesOptions
|
|
105
122
|
pack?: boolean | PackOptions
|
|
106
123
|
renameIdentifiers?: TransformEntry
|
|
@@ -129,6 +146,7 @@ export interface ObfuscatorOptions {
|
|
|
129
146
|
|
|
130
147
|
// Resolved per-call defaults handed to every transform.
|
|
131
148
|
export interface TransformContext {
|
|
149
|
+
concealStrings?: ConcealStringsOptions
|
|
132
150
|
mangleProperties?: ManglePropertiesOptions
|
|
133
151
|
pack?: PackOptions
|
|
134
152
|
seed: number
|
|
@@ -3,7 +3,7 @@ import type { NodePath, Scope } 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 { isInsideWith } from '../utils/ast'
|
|
7
7
|
|
|
8
8
|
type Kind = t.VariableDeclaration['kind']
|
|
9
9
|
|
|
@@ -18,9 +18,9 @@ type BindingTarget = t.Identifier | t.ObjectPattern | t.ArrayPattern | t.Assignm
|
|
|
18
18
|
* The source, computed keys, and getters keep their original evaluation counts.
|
|
19
19
|
* Defaults compare against `void 0` because `undefined` can be shadowed.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
21
|
+
* Patterns inside `with` stay untouched because an object property can capture
|
|
22
|
+
* a generated temporary. The `RequireObjectCoercible` guard runs before computed
|
|
23
|
+
* keys to preserve ObjectBindingPattern evaluation order.
|
|
24
24
|
*
|
|
25
25
|
* @example
|
|
26
26
|
* // ◀️ before
|
|
@@ -42,8 +42,8 @@ const visitor = {
|
|
|
42
42
|
if (typeof path.listKey !== 'string') {
|
|
43
43
|
return
|
|
44
44
|
}
|
|
45
|
-
//
|
|
46
|
-
if (isInsideWith(path)
|
|
45
|
+
// A `with` property can capture the generated temporary.
|
|
46
|
+
if (isInsideWith(path)) {
|
|
47
47
|
return
|
|
48
48
|
}
|
|
49
49
|
|