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.
Files changed (110) hide show
  1. package/dist/analysis/constant.js +3 -4
  2. package/dist/analysis/constant.js.map +1 -1
  3. package/dist/analysis/inlineability.js +1 -1
  4. package/dist/analysis/inlineability.js.map +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/obfuscator.d.ts +2 -1
  8. package/dist/obfuscator.d.ts.map +1 -1
  9. package/dist/obfuscator.js +47 -12
  10. package/dist/obfuscator.js.map +1 -1
  11. package/dist/options.d.ts +17 -4
  12. package/dist/options.d.ts.map +1 -1
  13. package/dist/preparation/expand-destructuring.d.ts +3 -3
  14. package/dist/preparation/expand-destructuring.js +6 -6
  15. package/dist/preparation/expand-destructuring.js.map +1 -1
  16. package/dist/transforms/arrow-to-function.js +3 -5
  17. package/dist/transforms/arrow-to-function.js.map +1 -1
  18. package/dist/transforms/conceal-strings.d.ts +57 -0
  19. package/dist/transforms/conceal-strings.d.ts.map +1 -0
  20. package/dist/transforms/conceal-strings.js +361 -0
  21. package/dist/transforms/conceal-strings.js.map +1 -0
  22. package/dist/transforms/const-let-to-var.d.ts +3 -3
  23. package/dist/transforms/const-let-to-var.d.ts.map +1 -1
  24. package/dist/transforms/const-let-to-var.js +36 -9
  25. package/dist/transforms/const-let-to-var.js.map +1 -1
  26. package/dist/transforms/const-to-let.d.ts +2 -3
  27. package/dist/transforms/const-to-let.d.ts.map +1 -1
  28. package/dist/transforms/const-to-let.js +3 -5
  29. package/dist/transforms/const-to-let.js.map +1 -1
  30. package/dist/transforms/fold-builtin-methods.d.ts.map +1 -1
  31. package/dist/transforms/fold-builtin-methods.js +48 -10
  32. package/dist/transforms/fold-builtin-methods.js.map +1 -1
  33. package/dist/transforms/fold-constants.js +3 -0
  34. package/dist/transforms/fold-constants.js.map +1 -1
  35. package/dist/transforms/hoist-variables.d.ts +30 -0
  36. package/dist/transforms/hoist-variables.d.ts.map +1 -0
  37. package/dist/transforms/hoist-variables.js +224 -0
  38. package/dist/transforms/hoist-variables.js.map +1 -0
  39. package/dist/transforms/inline-functions.js +3 -4
  40. package/dist/transforms/inline-functions.js.map +1 -1
  41. package/dist/transforms/mangle-properties.js +7 -4
  42. package/dist/transforms/mangle-properties.js.map +1 -1
  43. package/dist/transforms/merge-variable-declarations.d.ts +17 -0
  44. package/dist/transforms/merge-variable-declarations.d.ts.map +1 -0
  45. package/dist/transforms/merge-variable-declarations.js +68 -0
  46. package/dist/transforms/merge-variable-declarations.js.map +1 -0
  47. package/dist/transforms/numbers-to-strings.d.ts.map +1 -1
  48. package/dist/transforms/numbers-to-strings.js +1 -8
  49. package/dist/transforms/numbers-to-strings.js.map +1 -1
  50. package/dist/transforms/pack-declarations-into-parameters.js +1 -5
  51. package/dist/transforms/pack-declarations-into-parameters.js.map +1 -1
  52. package/dist/transforms/pack.d.ts +5 -7
  53. package/dist/transforms/pack.d.ts.map +1 -1
  54. package/dist/transforms/pack.js +10 -17
  55. package/dist/transforms/pack.js.map +1 -1
  56. package/dist/transforms/remove-unused-code.d.ts.map +1 -1
  57. package/dist/transforms/remove-unused-code.js +7 -39
  58. package/dist/transforms/remove-unused-code.js.map +1 -1
  59. package/dist/transforms/rename-identifiers.d.ts.map +1 -1
  60. package/dist/transforms/rename-identifiers.js +29 -17
  61. package/dist/transforms/rename-identifiers.js.map +1 -1
  62. package/dist/transforms/reorder-function-declarations.d.ts +25 -0
  63. package/dist/transforms/reorder-function-declarations.d.ts.map +1 -0
  64. package/dist/transforms/reorder-function-declarations.js +64 -0
  65. package/dist/transforms/reorder-function-declarations.js.map +1 -0
  66. package/dist/transforms/specials-to-strings.js +4 -3
  67. package/dist/transforms/specials-to-strings.js.map +1 -1
  68. package/dist/transforms/update-to-assignment.js +1 -16
  69. package/dist/transforms/update-to-assignment.js.map +1 -1
  70. package/dist/utils/ast.d.ts +1 -2
  71. package/dist/utils/ast.d.ts.map +1 -1
  72. package/dist/utils/ast.js +12 -42
  73. package/dist/utils/ast.js.map +1 -1
  74. package/dist/utils/literal.d.ts.map +1 -1
  75. package/dist/utils/literal.js +74 -2
  76. package/dist/utils/literal.js.map +1 -1
  77. package/dist/utils/statement-lists.d.ts +9 -0
  78. package/dist/utils/statement-lists.d.ts.map +1 -0
  79. package/dist/utils/statement-lists.js +27 -0
  80. package/dist/utils/statement-lists.js.map +1 -0
  81. package/package.json +10 -12
  82. package/src/analysis/constant.ts +3 -6
  83. package/src/analysis/inlineability.ts +1 -1
  84. package/src/index.ts +1 -0
  85. package/src/obfuscator.ts +51 -14
  86. package/src/options.ts +21 -3
  87. package/src/preparation/expand-destructuring.ts +6 -6
  88. package/src/transforms/arrow-to-function.ts +3 -5
  89. package/src/transforms/conceal-strings.ts +530 -0
  90. package/src/transforms/const-let-to-var.ts +37 -9
  91. package/src/transforms/const-to-let.ts +3 -5
  92. package/src/transforms/fold-builtin-methods.ts +67 -12
  93. package/src/transforms/fold-constants.ts +3 -0
  94. package/src/transforms/hoist-variables.ts +272 -0
  95. package/src/transforms/inline-functions.ts +3 -4
  96. package/src/transforms/mangle-properties.ts +7 -7
  97. package/src/transforms/merge-variable-declarations.ts +91 -0
  98. package/src/transforms/numbers-to-strings.ts +2 -12
  99. package/src/transforms/pack-declarations-into-parameters.ts +1 -5
  100. package/src/transforms/pack.ts +10 -18
  101. package/src/transforms/remove-unused-code.ts +9 -64
  102. package/src/transforms/rename-identifiers.ts +42 -17
  103. package/src/transforms/reorder-function-declarations.ts +80 -0
  104. package/src/transforms/specials-to-strings.ts +4 -3
  105. package/src/transforms/update-to-assignment.ts +1 -17
  106. package/src/utils/ast.ts +15 -51
  107. package/src/utils/literal.ts +91 -2
  108. package/src/utils/statement-lists.ts +45 -0
  109. package/DISCLOSURE +0 -9
  110. 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 (!programContains(path.scope.getProgramParent().block, programWith, t.isWithStatement)) {
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
- // Direct eval can access local bindings by name. Indirect eval runs globally and
64
- // does not count.
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 programContains(programNode, cache, matches) {
83
- const cached = cache.get(programNode);
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 (!matches(node)) {
78
+ if (!t.isWithStatement(node)) {
90
79
  return;
91
80
  }
92
81
  found = true;
93
82
  return t.traverseFast.stop;
94
83
  });
95
- cache.set(programNode, found);
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
@@ -1 +1 @@
1
- {"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/utils/ast.ts"],"names":[],"mappings":"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"}
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":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAKjC,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,CAiDlE"}
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"}
@@ -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 = valueToLiteral(item);
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":"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"}
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.2.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": "catalog:",
51
+ "@types/node": "^26.2.0",
60
52
  "tsc-alias": "^1.9.2",
61
- "typescript": "catalog:",
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
+ }
@@ -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 { enclosingScopeHasDirectEval, isInsideWith } from '../utils/ast'
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
- // `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
- ) {
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 && (name === 'arguments' || name === 'eval')) {
282
+ if (state.innerFnDepth === 0 && name === 'arguments') {
283
283
  state.unsafe = true
284
284
  path.stop()
285
285
  return
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { obfuscate } from './obfuscator'
2
2
  export type {
3
+ ConcealStringsOptions,
3
4
  ManglePropertiesOptions,
4
5
  ObfuscatorOptions,
5
6
  PackOptions,
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
- // These one-shot passes prepare the fixed point. Lexical declarations become
80
- // foldable function-scoped bindings, except at script top level where `var`
81
- // would create a global property. `argumentsToParameters` precedes parameter
82
- // renaming. Method demotion precedes extraction because any surviving
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
- // Yodification and folding need raw numeric literals. Special-value lowering
128
- // comes next, then number lowering also handles the `1` created for `Infinity`.
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
- () => generate(ast, { minified: options.minify ?? false, shouldPrintComment }).code,
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
- * Only names carrying `/*@__MANGLE_PROP__*\/` or `/*#__MANGLE_PROP__*\/` may
65
- * be mangled. Default `false`.
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 { enclosingScopeHasDirectEval, isInsideWith } from '../utils/ast'
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
- * `with` and direct `eval` can expose synthesized names that Babel cannot see, so
22
- * those scopes are skipped. A `RequireObjectCoercible` guard runs before any
23
- * computed key, matching ObjectBindingPattern evaluation order.
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
- // Babel cannot prove a generated name hidden from `with` or direct `eval`.
46
- if (isInsideWith(path) || enclosingScopeHasDirectEval(path)) {
45
+ // A `with` property can capture the generated temporary.
46
+ if (isInsideWith(path)) {
47
47
  return
48
48
  }
49
49