webfuscator 1.2.1 → 1.3.1

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