webfuscator 0.9.4

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 (289) hide show
  1. package/DISCLOSURE +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +83 -0
  4. package/dist/analysis/constant.d.ts +11 -0
  5. package/dist/analysis/constant.d.ts.map +1 -0
  6. package/dist/analysis/constant.js +261 -0
  7. package/dist/analysis/constant.js.map +1 -0
  8. package/dist/analysis/document-order.d.ts +5 -0
  9. package/dist/analysis/document-order.d.ts.map +1 -0
  10. package/dist/analysis/document-order.js +124 -0
  11. package/dist/analysis/document-order.js.map +1 -0
  12. package/dist/analysis/inlineability.d.ts +13 -0
  13. package/dist/analysis/inlineability.d.ts.map +1 -0
  14. package/dist/analysis/inlineability.js +270 -0
  15. package/dist/analysis/inlineability.js.map +1 -0
  16. package/dist/analysis/purity.d.ts +5 -0
  17. package/dist/analysis/purity.d.ts.map +1 -0
  18. package/dist/analysis/purity.js +281 -0
  19. package/dist/analysis/purity.js.map +1 -0
  20. package/dist/index.d.ts +3 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +2 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/obfuscator.d.ts +4 -0
  25. package/dist/obfuscator.d.ts.map +1 -0
  26. package/dist/obfuscator.js +222 -0
  27. package/dist/obfuscator.js.map +1 -0
  28. package/dist/options.d.ts +73 -0
  29. package/dist/options.d.ts.map +1 -0
  30. package/dist/options.js +2 -0
  31. package/dist/options.js.map +1 -0
  32. package/dist/preparation/dot-to-bracket.d.ts +16 -0
  33. package/dist/preparation/dot-to-bracket.d.ts.map +1 -0
  34. package/dist/preparation/dot-to-bracket.js +36 -0
  35. package/dist/preparation/dot-to-bracket.js.map +1 -0
  36. package/dist/preparation/expand-destructuring.d.ts +26 -0
  37. package/dist/preparation/expand-destructuring.d.ts.map +1 -0
  38. package/dist/preparation/expand-destructuring.js +154 -0
  39. package/dist/preparation/expand-destructuring.js.map +1 -0
  40. package/dist/preparation/expand-template-literals.d.ts +23 -0
  41. package/dist/preparation/expand-template-literals.d.ts.map +1 -0
  42. package/dist/preparation/expand-template-literals.js +78 -0
  43. package/dist/preparation/expand-template-literals.js.map +1 -0
  44. package/dist/preparation/rewrite-class-fields.d.ts +43 -0
  45. package/dist/preparation/rewrite-class-fields.d.ts.map +1 -0
  46. package/dist/preparation/rewrite-class-fields.js +270 -0
  47. package/dist/preparation/rewrite-class-fields.js.map +1 -0
  48. package/dist/preparation/split-sequence-expressions.d.ts +15 -0
  49. package/dist/preparation/split-sequence-expressions.d.ts.map +1 -0
  50. package/dist/preparation/split-sequence-expressions.js +36 -0
  51. package/dist/preparation/split-sequence-expressions.js.map +1 -0
  52. package/dist/preparation/split-variable-declarations.d.ts +20 -0
  53. package/dist/preparation/split-variable-declarations.d.ts.map +1 -0
  54. package/dist/preparation/split-variable-declarations.js +36 -0
  55. package/dist/preparation/split-variable-declarations.js.map +1 -0
  56. package/dist/preparation/stringify-object-keys.d.ts +21 -0
  57. package/dist/preparation/stringify-object-keys.d.ts.map +1 -0
  58. package/dist/preparation/stringify-object-keys.js +96 -0
  59. package/dist/preparation/stringify-object-keys.js.map +1 -0
  60. package/dist/preparation/wrap-single-statements.d.ts +24 -0
  61. package/dist/preparation/wrap-single-statements.d.ts.map +1 -0
  62. package/dist/preparation/wrap-single-statements.js +53 -0
  63. package/dist/preparation/wrap-single-statements.js.map +1 -0
  64. package/dist/transforms/arguments-to-parameters.d.ts +20 -0
  65. package/dist/transforms/arguments-to-parameters.d.ts.map +1 -0
  66. package/dist/transforms/arguments-to-parameters.js +162 -0
  67. package/dist/transforms/arguments-to-parameters.js.map +1 -0
  68. package/dist/transforms/arrow-to-function.d.ts +46 -0
  69. package/dist/transforms/arrow-to-function.d.ts.map +1 -0
  70. package/dist/transforms/arrow-to-function.js +203 -0
  71. package/dist/transforms/arrow-to-function.js.map +1 -0
  72. package/dist/transforms/collapse-single-use-temps.d.ts +16 -0
  73. package/dist/transforms/collapse-single-use-temps.d.ts.map +1 -0
  74. package/dist/transforms/collapse-single-use-temps.js +805 -0
  75. package/dist/transforms/collapse-single-use-temps.js.map +1 -0
  76. package/dist/transforms/const-let-to-var.d.ts +21 -0
  77. package/dist/transforms/const-let-to-var.d.ts.map +1 -0
  78. package/dist/transforms/const-let-to-var.js +217 -0
  79. package/dist/transforms/const-let-to-var.js.map +1 -0
  80. package/dist/transforms/const-to-let.d.ts +17 -0
  81. package/dist/transforms/const-to-let.d.ts.map +1 -0
  82. package/dist/transforms/const-to-let.js +33 -0
  83. package/dist/transforms/const-to-let.js.map +1 -0
  84. package/dist/transforms/do-while-to-while.d.ts +26 -0
  85. package/dist/transforms/do-while-to-while.d.ts.map +1 -0
  86. package/dist/transforms/do-while-to-while.js +54 -0
  87. package/dist/transforms/do-while-to-while.js.map +1 -0
  88. package/dist/transforms/drop-console.d.ts +27 -0
  89. package/dist/transforms/drop-console.d.ts.map +1 -0
  90. package/dist/transforms/drop-console.js +107 -0
  91. package/dist/transforms/drop-console.js.map +1 -0
  92. package/dist/transforms/drop-debugger.d.ts +18 -0
  93. package/dist/transforms/drop-debugger.d.ts.map +1 -0
  94. package/dist/transforms/drop-debugger.js +34 -0
  95. package/dist/transforms/drop-debugger.js.map +1 -0
  96. package/dist/transforms/expand-binary-assignment.d.ts +26 -0
  97. package/dist/transforms/expand-binary-assignment.d.ts.map +1 -0
  98. package/dist/transforms/expand-binary-assignment.js +78 -0
  99. package/dist/transforms/expand-binary-assignment.js.map +1 -0
  100. package/dist/transforms/expand-logical-assignment.d.ts +22 -0
  101. package/dist/transforms/expand-logical-assignment.d.ts.map +1 -0
  102. package/dist/transforms/expand-logical-assignment.js +73 -0
  103. package/dist/transforms/expand-logical-assignment.js.map +1 -0
  104. package/dist/transforms/extract-object-properties.d.ts +21 -0
  105. package/dist/transforms/extract-object-properties.d.ts.map +1 -0
  106. package/dist/transforms/extract-object-properties.js +340 -0
  107. package/dist/transforms/extract-object-properties.js.map +1 -0
  108. package/dist/transforms/fold-builtin-methods.d.ts +23 -0
  109. package/dist/transforms/fold-builtin-methods.d.ts.map +1 -0
  110. package/dist/transforms/fold-builtin-methods.js +839 -0
  111. package/dist/transforms/fold-builtin-methods.js.map +1 -0
  112. package/dist/transforms/fold-constants.d.ts +16 -0
  113. package/dist/transforms/fold-constants.d.ts.map +1 -0
  114. package/dist/transforms/fold-constants.js +421 -0
  115. package/dist/transforms/fold-constants.js.map +1 -0
  116. package/dist/transforms/for-to-while.d.ts +29 -0
  117. package/dist/transforms/for-to-while.d.ts.map +1 -0
  118. package/dist/transforms/for-to-while.js +91 -0
  119. package/dist/transforms/for-to-while.js.map +1 -0
  120. package/dist/transforms/function-declaration-to-expression.d.ts +28 -0
  121. package/dist/transforms/function-declaration-to-expression.d.ts.map +1 -0
  122. package/dist/transforms/function-declaration-to-expression.js +95 -0
  123. package/dist/transforms/function-declaration-to-expression.js.map +1 -0
  124. package/dist/transforms/inline-functions.d.ts +16 -0
  125. package/dist/transforms/inline-functions.d.ts.map +1 -0
  126. package/dist/transforms/inline-functions.js +896 -0
  127. package/dist/transforms/inline-functions.js.map +1 -0
  128. package/dist/transforms/logical-to-ternary.d.ts +20 -0
  129. package/dist/transforms/logical-to-ternary.d.ts.map +1 -0
  130. package/dist/transforms/logical-to-ternary.js +78 -0
  131. package/dist/transforms/logical-to-ternary.js.map +1 -0
  132. package/dist/transforms/mangle-properties.d.ts +27 -0
  133. package/dist/transforms/mangle-properties.d.ts.map +1 -0
  134. package/dist/transforms/mangle-properties.js +703 -0
  135. package/dist/transforms/mangle-properties.js.map +1 -0
  136. package/dist/transforms/nullish-coalescing-to-ternary.d.ts +18 -0
  137. package/dist/transforms/nullish-coalescing-to-ternary.d.ts.map +1 -0
  138. package/dist/transforms/nullish-coalescing-to-ternary.js +61 -0
  139. package/dist/transforms/nullish-coalescing-to-ternary.js.map +1 -0
  140. package/dist/transforms/numbers-to-strings.d.ts +19 -0
  141. package/dist/transforms/numbers-to-strings.d.ts.map +1 -0
  142. package/dist/transforms/numbers-to-strings.js +51 -0
  143. package/dist/transforms/numbers-to-strings.js.map +1 -0
  144. package/dist/transforms/object-method-to-property.d.ts +34 -0
  145. package/dist/transforms/object-method-to-property.d.ts.map +1 -0
  146. package/dist/transforms/object-method-to-property.js +78 -0
  147. package/dist/transforms/object-method-to-property.js.map +1 -0
  148. package/dist/transforms/optional-chaining-to-ternary.d.ts +19 -0
  149. package/dist/transforms/optional-chaining-to-ternary.d.ts.map +1 -0
  150. package/dist/transforms/optional-chaining-to-ternary.js +206 -0
  151. package/dist/transforms/optional-chaining-to-ternary.js.map +1 -0
  152. package/dist/transforms/pack-declarations-into-parameters.d.ts +22 -0
  153. package/dist/transforms/pack-declarations-into-parameters.d.ts.map +1 -0
  154. package/dist/transforms/pack-declarations-into-parameters.js +208 -0
  155. package/dist/transforms/pack-declarations-into-parameters.js.map +1 -0
  156. package/dist/transforms/remove-anonymous-function-names.d.ts +17 -0
  157. package/dist/transforms/remove-anonymous-function-names.d.ts.map +1 -0
  158. package/dist/transforms/remove-anonymous-function-names.js +72 -0
  159. package/dist/transforms/remove-anonymous-function-names.js.map +1 -0
  160. package/dist/transforms/remove-unreachable-code.d.ts +21 -0
  161. package/dist/transforms/remove-unreachable-code.d.ts.map +1 -0
  162. package/dist/transforms/remove-unreachable-code.js +103 -0
  163. package/dist/transforms/remove-unreachable-code.js.map +1 -0
  164. package/dist/transforms/remove-unused-code.d.ts +18 -0
  165. package/dist/transforms/remove-unused-code.d.ts.map +1 -0
  166. package/dist/transforms/remove-unused-code.js +249 -0
  167. package/dist/transforms/remove-unused-code.js.map +1 -0
  168. package/dist/transforms/rename-identifiers.d.ts +24 -0
  169. package/dist/transforms/rename-identifiers.d.ts.map +1 -0
  170. package/dist/transforms/rename-identifiers.js +264 -0
  171. package/dist/transforms/rename-identifiers.js.map +1 -0
  172. package/dist/transforms/specials-to-strings.d.ts +30 -0
  173. package/dist/transforms/specials-to-strings.d.ts.map +1 -0
  174. package/dist/transforms/specials-to-strings.js +101 -0
  175. package/dist/transforms/specials-to-strings.js.map +1 -0
  176. package/dist/transforms/switch-to-if.d.ts +28 -0
  177. package/dist/transforms/switch-to-if.d.ts.map +1 -0
  178. package/dist/transforms/switch-to-if.js +279 -0
  179. package/dist/transforms/switch-to-if.js.map +1 -0
  180. package/dist/transforms/ternary-to-if.d.ts +20 -0
  181. package/dist/transforms/ternary-to-if.d.ts.map +1 -0
  182. package/dist/transforms/ternary-to-if.js +315 -0
  183. package/dist/transforms/ternary-to-if.js.map +1 -0
  184. package/dist/transforms/update-to-assignment.d.ts +26 -0
  185. package/dist/transforms/update-to-assignment.d.ts.map +1 -0
  186. package/dist/transforms/update-to-assignment.js +120 -0
  187. package/dist/transforms/update-to-assignment.js.map +1 -0
  188. package/dist/transforms/yodify-conditions.d.ts +22 -0
  189. package/dist/transforms/yodify-conditions.d.ts.map +1 -0
  190. package/dist/transforms/yodify-conditions.js +91 -0
  191. package/dist/transforms/yodify-conditions.js.map +1 -0
  192. package/dist/utils/ast.d.ts +10 -0
  193. package/dist/utils/ast.d.ts.map +1 -0
  194. package/dist/utils/ast.js +112 -0
  195. package/dist/utils/ast.js.map +1 -0
  196. package/dist/utils/change-tracking.d.ts +8 -0
  197. package/dist/utils/change-tracking.d.ts.map +1 -0
  198. package/dist/utils/change-tracking.js +8 -0
  199. package/dist/utils/change-tracking.js.map +1 -0
  200. package/dist/utils/dom-properties.d.ts +2 -0
  201. package/dist/utils/dom-properties.d.ts.map +1 -0
  202. package/dist/utils/dom-properties.js +9252 -0
  203. package/dist/utils/dom-properties.js.map +1 -0
  204. package/dist/utils/evaluation-order.d.ts +4 -0
  205. package/dist/utils/evaluation-order.d.ts.map +1 -0
  206. package/dist/utils/evaluation-order.js +152 -0
  207. package/dist/utils/evaluation-order.js.map +1 -0
  208. package/dist/utils/literal.d.ts +5 -0
  209. package/dist/utils/literal.d.ts.map +1 -0
  210. package/dist/utils/literal.js +90 -0
  211. package/dist/utils/literal.js.map +1 -0
  212. package/dist/utils/logical-lowering.d.ts +4 -0
  213. package/dist/utils/logical-lowering.d.ts.map +1 -0
  214. package/dist/utils/logical-lowering.js +104 -0
  215. package/dist/utils/logical-lowering.js.map +1 -0
  216. package/dist/utils/loop-lowering.d.ts +23 -0
  217. package/dist/utils/loop-lowering.d.ts.map +1 -0
  218. package/dist/utils/loop-lowering.js +88 -0
  219. package/dist/utils/loop-lowering.js.map +1 -0
  220. package/dist/utils/paths.d.ts +9 -0
  221. package/dist/utils/paths.d.ts.map +1 -0
  222. package/dist/utils/paths.js +90 -0
  223. package/dist/utils/paths.js.map +1 -0
  224. package/dist/utils/random.d.ts +3 -0
  225. package/dist/utils/random.d.ts.map +1 -0
  226. package/dist/utils/random.js +22 -0
  227. package/dist/utils/random.js.map +1 -0
  228. package/dist/utils/string-generator.d.ts +37 -0
  229. package/dist/utils/string-generator.d.ts.map +1 -0
  230. package/dist/utils/string-generator.js +175 -0
  231. package/dist/utils/string-generator.js.map +1 -0
  232. package/package.json +76 -0
  233. package/src/analysis/constant.ts +310 -0
  234. package/src/analysis/document-order.ts +141 -0
  235. package/src/analysis/inlineability.ts +336 -0
  236. package/src/analysis/purity.ts +315 -0
  237. package/src/index.ts +2 -0
  238. package/src/obfuscator.ts +271 -0
  239. package/src/options.ts +114 -0
  240. package/src/preparation/dot-to-bracket.ts +41 -0
  241. package/src/preparation/expand-destructuring.ts +211 -0
  242. package/src/preparation/expand-template-literals.ts +92 -0
  243. package/src/preparation/rewrite-class-fields.ts +320 -0
  244. package/src/preparation/split-sequence-expressions.ts +40 -0
  245. package/src/preparation/split-variable-declarations.ts +39 -0
  246. package/src/preparation/stringify-object-keys.ts +107 -0
  247. package/src/preparation/wrap-single-statements.ts +63 -0
  248. package/src/transforms/arguments-to-parameters.ts +187 -0
  249. package/src/transforms/arrow-to-function.ts +225 -0
  250. package/src/transforms/collapse-single-use-temps.ts +957 -0
  251. package/src/transforms/const-let-to-var.ts +246 -0
  252. package/src/transforms/const-to-let.ts +38 -0
  253. package/src/transforms/do-while-to-while.ts +69 -0
  254. package/src/transforms/drop-console.ts +119 -0
  255. package/src/transforms/drop-debugger.ts +38 -0
  256. package/src/transforms/expand-binary-assignment.ts +94 -0
  257. package/src/transforms/expand-logical-assignment.ts +84 -0
  258. package/src/transforms/extract-object-properties.ts +404 -0
  259. package/src/transforms/fold-builtin-methods.ts +949 -0
  260. package/src/transforms/fold-constants.ts +462 -0
  261. package/src/transforms/for-to-while.ts +109 -0
  262. package/src/transforms/function-declaration-to-expression.ts +108 -0
  263. package/src/transforms/inline-functions.ts +1074 -0
  264. package/src/transforms/logical-to-ternary.ts +92 -0
  265. package/src/transforms/mangle-properties.ts +819 -0
  266. package/src/transforms/nullish-coalescing-to-ternary.ts +77 -0
  267. package/src/transforms/numbers-to-strings.ts +61 -0
  268. package/src/transforms/object-method-to-property.ts +86 -0
  269. package/src/transforms/optional-chaining-to-ternary.ts +225 -0
  270. package/src/transforms/pack-declarations-into-parameters.ts +233 -0
  271. package/src/transforms/remove-anonymous-function-names.ts +84 -0
  272. package/src/transforms/remove-unreachable-code.ts +115 -0
  273. package/src/transforms/remove-unused-code.ts +296 -0
  274. package/src/transforms/rename-identifiers.ts +289 -0
  275. package/src/transforms/specials-to-strings.ts +116 -0
  276. package/src/transforms/switch-to-if.ts +339 -0
  277. package/src/transforms/ternary-to-if.ts +387 -0
  278. package/src/transforms/update-to-assignment.ts +132 -0
  279. package/src/transforms/yodify-conditions.ts +103 -0
  280. package/src/utils/ast.ts +129 -0
  281. package/src/utils/change-tracking.ts +15 -0
  282. package/src/utils/dom-properties.ts +9252 -0
  283. package/src/utils/evaluation-order.ts +178 -0
  284. package/src/utils/literal.ts +96 -0
  285. package/src/utils/logical-lowering.ts +132 -0
  286. package/src/utils/loop-lowering.ts +109 -0
  287. package/src/utils/paths.ts +103 -0
  288. package/src/utils/random.ts +22 -0
  289. package/src/utils/string-generator.ts +206 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify-object-keys.js","sourceRoot":"","sources":["../../src/preparation/stringify-object-keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Wraps single-statement bodies of control-flow constructs in BlockStatements,
4
+ * and converts concise arrow bodies into block bodies with an explicit `return`.
5
+ * Leaves an `IfStatement` alternate alone so `else if` chains survive.
6
+ *
7
+ * @example
8
+ * // ◀️ before
9
+ * if (x) log(1);
10
+ * else log(2);
11
+ * var fn = x => x + 1;
12
+ *
13
+ * // ▶️ after
14
+ * if (x) {
15
+ * log(1);
16
+ * } else {
17
+ * log(2);
18
+ * }
19
+ * var fn = x => {
20
+ * return x + 1;
21
+ * };
22
+ */
23
+ export declare function wrapSingleStatements(ast: File): void;
24
+ //# sourceMappingURL=wrap-single-statements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-single-statements.d.ts","sourceRoot":"","sources":["../../src/preparation/wrap-single-statements.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AASxC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAEpD"}
@@ -0,0 +1,53 @@
1
+ import traverse from '@babel/traverse';
2
+ import * as t from '@babel/types';
3
+ /**
4
+ * Wraps single-statement bodies of control-flow constructs in BlockStatements,
5
+ * and converts concise arrow bodies into block bodies with an explicit `return`.
6
+ * Leaves an `IfStatement` alternate alone so `else if` chains survive.
7
+ *
8
+ * @example
9
+ * // ◀️ before
10
+ * if (x) log(1);
11
+ * else log(2);
12
+ * var fn = x => x + 1;
13
+ *
14
+ * // ▶️ after
15
+ * if (x) {
16
+ * log(1);
17
+ * } else {
18
+ * log(2);
19
+ * }
20
+ * var fn = x => {
21
+ * return x + 1;
22
+ * };
23
+ */
24
+ export function wrapSingleStatements(ast) {
25
+ traverse(ast, visitor);
26
+ }
27
+ const visitor = {
28
+ IfStatement(path) {
29
+ const { node } = path;
30
+ if (!t.isBlockStatement(node.consequent)) {
31
+ node.consequent = t.blockStatement([node.consequent]);
32
+ }
33
+ if (node.alternate && !t.isBlockStatement(node.alternate) && !t.isIfStatement(node.alternate)) {
34
+ node.alternate = t.blockStatement([node.alternate]);
35
+ }
36
+ },
37
+ Loop(path) {
38
+ wrapLoopBody(path.node);
39
+ },
40
+ ArrowFunctionExpression(path) {
41
+ const { node } = path;
42
+ if (!t.isBlockStatement(node.body)) {
43
+ node.body = t.blockStatement([t.returnStatement(node.body)]);
44
+ node.expression = false;
45
+ }
46
+ },
47
+ };
48
+ function wrapLoopBody(node) {
49
+ if (!t.isBlockStatement(node.body)) {
50
+ node.body = t.blockStatement([node.body]);
51
+ }
52
+ }
53
+ //# sourceMappingURL=wrap-single-statements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-single-statements.js","sourceRoot":"","sources":["../../src/preparation/wrap-single-statements.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AACtC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAUjC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAS;IAC5C,QAAQ,CAAC,GAAG,EAAE,OAAyC,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,OAAO,GAAG;IACd,WAAW,CAAC,IAA6B;QACvC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;QACvD,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9F,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QACrD,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAwB;QAC3B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IACD,uBAAuB,CAAC,IAAyC;QAC/D,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC5D,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;QACzB,CAAC;IACH,CAAC;CACO,CAAA;AAEV,SAAS,YAAY,CAAC,IAAc;IAClC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3C,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Replaces `arguments[i]` reads with their mapped parameter in sloppy functions
4
+ * with simple parameter lists. Writes, deletion, reassigned parameters, and any
5
+ * escape of the arguments object make the mapping unsafe. Missing parameters
6
+ * are never added because that would change `fn.length`.
7
+ *
8
+ * @example
9
+ * // ◀️ before
10
+ * function foo(bar) {
11
+ * log(arguments[0]);
12
+ * }
13
+ *
14
+ * // ▶️ after
15
+ * function foo(bar) {
16
+ * log(bar);
17
+ * }
18
+ */
19
+ export declare function argumentsToParameters(ast: File): boolean;
20
+ //# sourceMappingURL=arguments-to-parameters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arguments-to-parameters.d.ts","sourceRoot":"","sources":["../../src/transforms/arguments-to-parameters.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAOxC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAExD"}
@@ -0,0 +1,162 @@
1
+ import * as t from '@babel/types';
2
+ import { hasDuplicateParamNames } from '../utils/ast.js';
3
+ import { traverseForChanges } from '../utils/change-tracking.js';
4
+ import { isInStrictContext } from '../utils/paths.js';
5
+ /**
6
+ * Replaces `arguments[i]` reads with their mapped parameter in sloppy functions
7
+ * with simple parameter lists. Writes, deletion, reassigned parameters, and any
8
+ * escape of the arguments object make the mapping unsafe. Missing parameters
9
+ * are never added because that would change `fn.length`.
10
+ *
11
+ * @example
12
+ * // ◀️ before
13
+ * function foo(bar) {
14
+ * log(arguments[0]);
15
+ * }
16
+ *
17
+ * // ▶️ after
18
+ * function foo(bar) {
19
+ * log(bar);
20
+ * }
21
+ */
22
+ export function argumentsToParameters(ast) {
23
+ return traverseForChanges(ast, visitor);
24
+ }
25
+ const visitor = {
26
+ Function(path, state) {
27
+ if (processFunction(path)) {
28
+ state.changed = true;
29
+ }
30
+ },
31
+ };
32
+ const collectVisitor = {
33
+ Function(innerPath) {
34
+ if (!innerPath.isArrowFunctionExpression()) {
35
+ innerPath.skip();
36
+ }
37
+ },
38
+ Identifier(path, state) {
39
+ if (path.node.name !== 'arguments' || !path.isReferencedIdentifier()) {
40
+ return;
41
+ }
42
+ if (path.scope.getBinding('arguments')) {
43
+ return;
44
+ }
45
+ const parent = path.parentPath;
46
+ // Any other use can expose or mutate the arguments object.
47
+ if ((parent.isMemberExpression() || parent.isOptionalMemberExpression()) &&
48
+ parent.node.object === path.node) {
49
+ return;
50
+ }
51
+ state.mappingBroken = true;
52
+ },
53
+ AssignmentExpression(assignPath, state) {
54
+ // Reassignment replaces the mapped object.
55
+ if (t.isIdentifier(assignPath.node.left, { name: 'arguments' }) &&
56
+ !assignPath.scope.getBinding('arguments')) {
57
+ state.mappingBroken = true;
58
+ }
59
+ },
60
+ MemberExpression(memPath, state) {
61
+ const obj = memPath.node.object;
62
+ if (!t.isIdentifier(obj) || obj.name !== 'arguments') {
63
+ return;
64
+ }
65
+ if (memPath.scope.getBinding('arguments')) {
66
+ return;
67
+ }
68
+ // Deleting an index breaks its parameter mapping.
69
+ if (memPath.parentPath?.isUnaryExpression({ operator: 'delete' })) {
70
+ state.mappingBroken = true;
71
+ return;
72
+ }
73
+ if (!memPath.node.computed) {
74
+ return;
75
+ }
76
+ const prop = memPath.node.property;
77
+ if (!t.isNumericLiteral(prop)) {
78
+ return;
79
+ }
80
+ const index = prop.value;
81
+ if (!Number.isInteger(index) || index < 0) {
82
+ return;
83
+ }
84
+ if (memberIsWriteTarget(memPath)) {
85
+ state.writtenIndices.add(index);
86
+ return;
87
+ }
88
+ state.reads.push({ memPath, index });
89
+ },
90
+ };
91
+ function processFunction(path) {
92
+ if (path.isArrowFunctionExpression()) {
93
+ return false;
94
+ }
95
+ const { params } = path.node;
96
+ // Rest, defaults, and destructuring make `arguments` unmapped.
97
+ if (!params.every((param) => t.isIdentifier(param))) {
98
+ return false;
99
+ }
100
+ // Duplicate names map only their last index.
101
+ if (hasDuplicateParamNames(params)) {
102
+ return false;
103
+ }
104
+ // Strict-mode `arguments` is not mapped to parameters.
105
+ if (isInStrictContext(path)) {
106
+ return false;
107
+ }
108
+ const state = { reads: [], writtenIndices: new Set(), mappingBroken: false };
109
+ path.traverse(collectVisitor, state);
110
+ if (state.mappingBroken || state.reads.length === 0) {
111
+ return false;
112
+ }
113
+ let changed = false;
114
+ for (const { memPath, index } of state.reads) {
115
+ // A written index and its parameter diverge when the argument was omitted.
116
+ if (state.writtenIndices.has(index)) {
117
+ continue;
118
+ }
119
+ // Adding a parameter would change `fn.length`.
120
+ const param = params[index];
121
+ if (!param || !t.isIdentifier(param)) {
122
+ continue;
123
+ }
124
+ // Reassigned parameters diverge when the argument was omitted.
125
+ const binding = path.scope.getBinding(param.name);
126
+ if (binding && binding.constantViolations.length > 0) {
127
+ continue;
128
+ }
129
+ memPath.replaceWith(t.identifier(param.name));
130
+ changed = true;
131
+ }
132
+ return changed;
133
+ }
134
+ // Treat any occurrence under a write target as written. The conservative member
135
+ // case only skips a safe substitution.
136
+ function memberIsWriteTarget(memPath) {
137
+ const directParent = memPath.parentPath?.node;
138
+ if (directParent &&
139
+ (t.isForInStatement(directParent) || t.isForOfStatement(directParent)) &&
140
+ directParent.left === memPath.node) {
141
+ return true;
142
+ }
143
+ // Writes may reach the member through an enclosing destructuring pattern.
144
+ let currentNode = memPath.node;
145
+ let cursor = memPath.parentPath;
146
+ while (cursor && !cursor.isStatement()) {
147
+ const parent = cursor.node;
148
+ if (t.isUpdateExpression(parent)) {
149
+ return true;
150
+ }
151
+ if (t.isAssignmentExpression(parent)) {
152
+ return parent.left === currentNode;
153
+ }
154
+ if (t.isArrayPattern(parent) || t.isObjectPattern(parent) || t.isRestElement(parent)) {
155
+ return true;
156
+ }
157
+ currentNode = parent;
158
+ cursor = cursor.parentPath;
159
+ }
160
+ return false;
161
+ }
162
+ //# sourceMappingURL=arguments-to-parameters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arguments-to-parameters.js","sourceRoot":"","sources":["../../src/transforms/arguments-to-parameters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Lowers arrows with Babel's capture-aware `arrowFunctionToExpression`. Arrows
4
+ * that reach `super` stay intact. Values that escape visible call positions also
5
+ * stay intact because only the arrow rejects construction with `new`.
6
+ *
7
+ * @example
8
+ * // ◀️ before
9
+ * var fn = x => {
10
+ * return x + 1;
11
+ * };
12
+ * var thisFn = function () {
13
+ * var read = () => {
14
+ * return this.x;
15
+ * };
16
+ * return read();
17
+ * };
18
+ * var escapes = [() => 1];
19
+ * class Sub extends Base {
20
+ * m() {
21
+ * var call = () => super.m();
22
+ * return call();
23
+ * }
24
+ * }
25
+ *
26
+ * // ▶️ after
27
+ * var fn = function (x) {
28
+ * return x + 1;
29
+ * };
30
+ * var thisFn = function () {
31
+ * var _this = this;
32
+ * var read = function () {
33
+ * return _this.x;
34
+ * };
35
+ * return read();
36
+ * };
37
+ * var escapes = [() => 1];
38
+ * class Sub extends Base {
39
+ * m() {
40
+ * var call = () => super.m();
41
+ * return call();
42
+ * }
43
+ * }
44
+ */
45
+ export declare function arrowToFunction(ast: File): boolean;
46
+ //# sourceMappingURL=arrow-to-function.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrow-to-function.d.ts","sourceRoot":"","sources":["../../src/transforms/arrow-to-function.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAMxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAElD"}
@@ -0,0 +1,203 @@
1
+ import * as t from '@babel/types';
2
+ import { enclosingScopeHasDirectEval, isInsideWith } from '../utils/ast.js';
3
+ import { traverseForChanges } from '../utils/change-tracking.js';
4
+ /**
5
+ * Lowers arrows with Babel's capture-aware `arrowFunctionToExpression`. Arrows
6
+ * that reach `super` stay intact. Values that escape visible call positions also
7
+ * stay intact because only the arrow rejects construction with `new`.
8
+ *
9
+ * @example
10
+ * // ◀️ before
11
+ * var fn = x => {
12
+ * return x + 1;
13
+ * };
14
+ * var thisFn = function () {
15
+ * var read = () => {
16
+ * return this.x;
17
+ * };
18
+ * return read();
19
+ * };
20
+ * var escapes = [() => 1];
21
+ * class Sub extends Base {
22
+ * m() {
23
+ * var call = () => super.m();
24
+ * return call();
25
+ * }
26
+ * }
27
+ *
28
+ * // ▶️ after
29
+ * var fn = function (x) {
30
+ * return x + 1;
31
+ * };
32
+ * var thisFn = function () {
33
+ * var _this = this;
34
+ * var read = function () {
35
+ * return _this.x;
36
+ * };
37
+ * return read();
38
+ * };
39
+ * var escapes = [() => 1];
40
+ * class Sub extends Base {
41
+ * m() {
42
+ * var call = () => super.m();
43
+ * return call();
44
+ * }
45
+ * }
46
+ */
47
+ export function arrowToFunction(ast) {
48
+ return traverseForChanges(ast, visitor);
49
+ }
50
+ const visitor = {
51
+ ArrowFunctionExpression(path, state) {
52
+ if (!path.isArrowFunctionExpression()) {
53
+ return;
54
+ }
55
+ if (
56
+ // The lowered function gains construction and `prototype`. Every use must
57
+ // remain visible so those differences cannot be observed.
58
+ !valueStaysInView(path) ||
59
+ arrowReferencesSuper(path) ||
60
+ inUnsafeCaptureContext(path) ||
61
+ usesReassignedArguments(path) ||
62
+ // `with` can shadow capture aliases, and direct eval can inspect the changed
63
+ // runtime meaning of `this` or `arguments`.
64
+ isInsideWith(path) ||
65
+ enclosingScopeHasDirectEval(path)) {
66
+ return;
67
+ }
68
+ path.arrowFunctionToExpression({
69
+ allowInsertArrow: false,
70
+ noNewArrows: true,
71
+ });
72
+ state.changed = true;
73
+ },
74
+ };
75
+ // Babel places captures in the nearest function body. Fields, static blocks,
76
+ // parameter defaults, and computed method keys evaluate in a different scope or
77
+ // at a different time.
78
+ function inUnsafeCaptureContext(path) {
79
+ for (let current = path.parentPath; current; current = current.parentPath) {
80
+ if (current.isStaticBlock() || current.isClassProperty() || current.isClassPrivateProperty()) {
81
+ return true;
82
+ }
83
+ if (current.isFunction()) {
84
+ if (current.isArrowFunctionExpression()) {
85
+ continue;
86
+ }
87
+ return arrowIsOutsideBodyOf(path, current);
88
+ }
89
+ if (current.isProgram()) {
90
+ return false;
91
+ }
92
+ }
93
+ return false;
94
+ }
95
+ // Captures placed in the body cannot serve parameter defaults or computed keys.
96
+ function arrowIsOutsideBodyOf(path, fnPath) {
97
+ let child = path;
98
+ for (;;) {
99
+ const next = child.parentPath;
100
+ if (!next || next === fnPath) {
101
+ break;
102
+ }
103
+ child = next;
104
+ }
105
+ return child.listKey === 'params' || child.key === 'key';
106
+ }
107
+ // A capture snapshots `arguments` before any later reassignment.
108
+ function usesReassignedArguments(path) {
109
+ if (!referencesName(path, 'arguments')) {
110
+ return false;
111
+ }
112
+ const fnPath = nearestNonArrowFunction(path);
113
+ return fnPath != null && reassignsName(fnPath, 'arguments');
114
+ }
115
+ // Immediate calls, discarded values, and bindings used only for immediate calls
116
+ // keep every use visible. Any other escape could expose construction, binding,
117
+ // or `prototype` behavior.
118
+ function valueStaysInView(valuePath) {
119
+ const parent = valuePath.parentPath;
120
+ if (!parent) {
121
+ return false;
122
+ }
123
+ if (isImmediateCallee(valuePath, parent) || parent.isExpressionStatement()) {
124
+ return true;
125
+ }
126
+ if (!parent.isVariableDeclarator() ||
127
+ parent.node.init !== valuePath.node ||
128
+ !t.isIdentifier(parent.node.id)) {
129
+ return false;
130
+ }
131
+ const binding = valuePath.scope.getBinding(parent.node.id.name);
132
+ if (!binding || !binding.constant) {
133
+ return false;
134
+ }
135
+ return binding.referencePaths.every((ref) => ref.parentPath != null && isImmediateCallee(ref, ref.parentPath));
136
+ }
137
+ function isImmediateCallee(valuePath, parent) {
138
+ return ((parent.isCallExpression() || parent.isOptionalCallExpression()) &&
139
+ parent.node.callee === valuePath.node);
140
+ }
141
+ function referencesName(path, name) {
142
+ let found = false;
143
+ path.traverse({
144
+ Function(inner) {
145
+ if (!inner.isArrowFunctionExpression()) {
146
+ inner.skip();
147
+ }
148
+ },
149
+ Identifier(inner) {
150
+ if (inner.node.name === name && inner.isReferencedIdentifier()) {
151
+ found = true;
152
+ }
153
+ },
154
+ });
155
+ return found;
156
+ }
157
+ function reassignsName(fnPath, name) {
158
+ let found = false;
159
+ fnPath.traverse({
160
+ Function(inner) {
161
+ // Nested arrows share this function's `arguments` binding.
162
+ if (!inner.isArrowFunctionExpression()) {
163
+ inner.skip();
164
+ }
165
+ },
166
+ AssignmentExpression(inner) {
167
+ // Destructuring can rebind `arguments`; member writes only mutate it.
168
+ if (Object.hasOwn(t.getBindingIdentifiers(inner.node.left), name)) {
169
+ found = true;
170
+ }
171
+ },
172
+ UpdateExpression(inner) {
173
+ if (t.isIdentifier(inner.node.argument, { name })) {
174
+ found = true;
175
+ }
176
+ },
177
+ });
178
+ return found;
179
+ }
180
+ function nearestNonArrowFunction(path) {
181
+ for (let current = path.parentPath; current; current = current.parentPath) {
182
+ if (current.isFunction() && !current.isArrowFunctionExpression()) {
183
+ return current;
184
+ }
185
+ }
186
+ return null;
187
+ }
188
+ function arrowReferencesSuper(path) {
189
+ const state = { found: false };
190
+ path.traverse(superCheckVisitor, state);
191
+ return state.found;
192
+ }
193
+ const superCheckVisitor = {
194
+ Function(path) {
195
+ if (!path.isArrowFunctionExpression()) {
196
+ path.skip();
197
+ }
198
+ },
199
+ Super(_path, state) {
200
+ state.found = true;
201
+ },
202
+ };
203
+ //# sourceMappingURL=arrow-to-function.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrow-to-function.js","sourceRoot":"","sources":["../../src/transforms/arrow-to-function.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Drops single-use temporaries through substitution, direct branch writes, or
4
+ * constant replacement. Sweeps continue until no shape exposes another.
5
+ *
6
+ * @example
7
+ * // ◀️ before
8
+ * var _t;
9
+ * if (cond) { _t = 1; } else { _t = 2; }
10
+ * return _t;
11
+ *
12
+ * // ▶️ after
13
+ * if (cond) { return 1; } else { return 2; }
14
+ */
15
+ export declare function collapseSingleUseTemps(ast: File): boolean;
16
+ //# sourceMappingURL=collapse-single-use-temps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapse-single-use-temps.d.ts","sourceRoot":"","sources":["../../src/transforms/collapse-single-use-temps.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAcxC;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAiDzD"}