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,34 @@
1
+ import * as t from '@babel/types';
2
+ import { traverseForChanges } from '../utils/change-tracking.js';
3
+ /**
4
+ * Removes every `debugger` statement.
5
+ *
6
+ * @example
7
+ * // ◀️ before
8
+ * function foo() {
9
+ * debugger;
10
+ * return "bar";
11
+ * }
12
+ *
13
+ * // ▶️ after
14
+ * function foo() {
15
+ * return "bar";
16
+ * }
17
+ */
18
+ export function dropDebugger(ast) {
19
+ return traverseForChanges(ast, visitor);
20
+ }
21
+ const visitor = {
22
+ DebuggerStatement(path, state) {
23
+ // Babel cannot remove a required single-statement child. Keep the slot valid
24
+ // with an empty statement.
25
+ if (Array.isArray(path.container)) {
26
+ path.remove();
27
+ }
28
+ else {
29
+ path.replaceWith(t.emptyStatement());
30
+ }
31
+ state.changed = true;
32
+ },
33
+ };
34
+ //# sourceMappingURL=drop-debugger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drop-debugger.js","sourceRoot":"","sources":["../../src/transforms/drop-debugger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAG9D;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,GAAS;IACpC,OAAO,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,OAAO,GAAyB;IACpC,iBAAiB,CAAC,IAAI,EAAE,KAAK;QAC3B,6EAA6E;QAC7E,2BAA2B;QAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,EAAE,CAAA;QACf,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAA;QACtC,CAAC;QACD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;IACtB,CAAC;CACF,CAAA"}
@@ -0,0 +1,26 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Rewrites arithmetic and bitwise compound assignments as `LHS = LHS op RHS`.
4
+ * Logical compound assignments are handled by `expandLogicalAssignment`.
5
+ *
6
+ * Member objects and computed keys are cached so the read and write use the same
7
+ * evaluated receiver. The cache assignment stays on the outer write target,
8
+ * which evaluates before its right side.
9
+ *
10
+ * Compound and expanded forms use the same operator semantics, including BigInt.
11
+ *
12
+ * @example
13
+ * // ◀️ before
14
+ * a += b;
15
+ * a **= 2;
16
+ * obj.x -= y;
17
+ * arr[idx()] |= v;
18
+ *
19
+ * // ▶️ after
20
+ * a = a + b;
21
+ * a = a ** 2;
22
+ * (_obj = obj).x = _obj.x - y;
23
+ * (_arr = arr)[_idx = idx()] = _arr[_idx] | v;
24
+ */
25
+ export declare function expandBinaryAssignment(ast: File): boolean;
26
+ //# sourceMappingURL=expand-binary-assignment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand-binary-assignment.d.ts","sourceRoot":"","sources":["../../src/transforms/expand-binary-assignment.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAMxC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAEzD"}
@@ -0,0 +1,78 @@
1
+ import * as t from '@babel/types';
2
+ import { isInsideWith } from '../utils/ast.js';
3
+ import { traverseForChanges } from '../utils/change-tracking.js';
4
+ /**
5
+ * Rewrites arithmetic and bitwise compound assignments as `LHS = LHS op RHS`.
6
+ * Logical compound assignments are handled by `expandLogicalAssignment`.
7
+ *
8
+ * Member objects and computed keys are cached so the read and write use the same
9
+ * evaluated receiver. The cache assignment stays on the outer write target,
10
+ * which evaluates before its right side.
11
+ *
12
+ * Compound and expanded forms use the same operator semantics, including BigInt.
13
+ *
14
+ * @example
15
+ * // ◀️ before
16
+ * a += b;
17
+ * a **= 2;
18
+ * obj.x -= y;
19
+ * arr[idx()] |= v;
20
+ *
21
+ * // ▶️ after
22
+ * a = a + b;
23
+ * a = a ** 2;
24
+ * (_obj = obj).x = _obj.x - y;
25
+ * (_arr = arr)[_idx = idx()] = _arr[_idx] | v;
26
+ */
27
+ export function expandBinaryAssignment(ast) {
28
+ return traverseForChanges(ast, visitor);
29
+ }
30
+ const visitor = {
31
+ AssignmentExpression(path, state) {
32
+ if (lowerBinaryAssignment(path)) {
33
+ state.changed = true;
34
+ }
35
+ },
36
+ };
37
+ const LOGICAL_COMPOUND = new Set(['||', '&&', '??']);
38
+ function lowerBinaryAssignment(path) {
39
+ const { operator, left, right } = path.node;
40
+ if (operator === '=' || operator.length < 2) {
41
+ return false;
42
+ }
43
+ const op = operator.slice(0, -1);
44
+ if (LOGICAL_COMPOUND.has(op)) {
45
+ return false;
46
+ }
47
+ const read = t.cloneNode(left, true);
48
+ if (t.isMemberExpression(left) && t.isMemberExpression(read)) {
49
+ // `with` can turn a bare object name into a getter or shadow a memo temp.
50
+ if (isInsideWith(path)) {
51
+ return false;
52
+ }
53
+ const { object } = left;
54
+ if (t.isExpression(object)) {
55
+ const memo = path.scope.maybeGenerateMemoised(object);
56
+ if (memo) {
57
+ read.object = memo;
58
+ left.object = t.assignmentExpression('=', t.cloneNode(memo), object);
59
+ }
60
+ }
61
+ if (left.computed) {
62
+ const { property } = left;
63
+ if (t.isExpression(property)) {
64
+ const memoProp = path.scope.maybeGenerateMemoised(property);
65
+ if (memoProp) {
66
+ read.property = memoProp;
67
+ left.property = t.assignmentExpression('=', t.cloneNode(memoProp), property);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ else if (!t.isIdentifier(left)) {
73
+ return false;
74
+ }
75
+ path.replaceWith(t.assignmentExpression('=', left, t.binaryExpression(op, read, right)));
76
+ return true;
77
+ }
78
+ //# sourceMappingURL=expand-binary-assignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand-binary-assignment.js","sourceRoot":"","sources":["../../src/transforms/expand-binary-assignment.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAG9D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAS;IAC9C,OAAO,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,OAAO,GAAyB;IACpC,oBAAoB,CAAC,IAAI,EAAE,KAAK;QAC9B,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;QACtB,CAAC;IACH,CAAC;CACF,CAAA;AAED,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;AAEpD,SAAS,qBAAqB,CAAC,IAAsC;IACnE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;IAC3C,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAChC,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAEpC,IAAI,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,0EAA0E;QAC1E,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;YACrD,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;gBAClB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;YACtE,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;YACzB,IAAI,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAA;gBAC3D,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;oBACxB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAA;gBAC9E,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,CAAC,WAAW,CACd,CAAC,CAAC,oBAAoB,CACpB,GAAG,EACH,IAAI,EACJ,CAAC,CAAC,gBAAgB,CAAC,EAAoC,EAAE,IAAoB,EAAE,KAAK,CAAC,CACtF,CACF,CAAA;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Rewrites `||=`/`&&=`/`??=` as `LHS op (LHS = RHS)`. Member objects and
4
+ * computed keys are cached so the read and write use the same receiver.
5
+ *
6
+ * @example
7
+ * // ◀️ before
8
+ * a ||= b;
9
+ * a &&= b;
10
+ * a ??= b;
11
+ * obj.x ||= y;
12
+ * arr[idx()] ??= v;
13
+ *
14
+ * // ▶️ after
15
+ * a || (a = b);
16
+ * a && (a = b);
17
+ * a ?? (a = b);
18
+ * (_obj = obj).x || (_obj.x = y);
19
+ * (_arr = arr)[_idx = idx()] ?? (_arr[_idx] = v);
20
+ */
21
+ export declare function expandLogicalAssignment(ast: File): boolean;
22
+ //# sourceMappingURL=expand-logical-assignment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand-logical-assignment.d.ts","sourceRoot":"","sources":["../../src/transforms/expand-logical-assignment.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAMxC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAE1D"}
@@ -0,0 +1,73 @@
1
+ import * as t from '@babel/types';
2
+ import { isInsideWith } from '../utils/ast.js';
3
+ import { traverseForChanges } from '../utils/change-tracking.js';
4
+ /**
5
+ * Rewrites `||=`/`&&=`/`??=` as `LHS op (LHS = RHS)`. Member objects and
6
+ * computed keys are cached so the read and write use the same receiver.
7
+ *
8
+ * @example
9
+ * // ◀️ before
10
+ * a ||= b;
11
+ * a &&= b;
12
+ * a ??= b;
13
+ * obj.x ||= y;
14
+ * arr[idx()] ??= v;
15
+ *
16
+ * // ▶️ after
17
+ * a || (a = b);
18
+ * a && (a = b);
19
+ * a ?? (a = b);
20
+ * (_obj = obj).x || (_obj.x = y);
21
+ * (_arr = arr)[_idx = idx()] ?? (_arr[_idx] = v);
22
+ */
23
+ export function expandLogicalAssignment(ast) {
24
+ return traverseForChanges(ast, visitor);
25
+ }
26
+ const visitor = {
27
+ AssignmentExpression(path, state) {
28
+ if (lowerLogicalAssignment(path)) {
29
+ state.changed = true;
30
+ }
31
+ },
32
+ };
33
+ function lowerLogicalAssignment(path) {
34
+ const { operator, left, right } = path.node;
35
+ if (operator.length < 2) {
36
+ return false;
37
+ }
38
+ const op = operator.slice(0, -1);
39
+ if (op !== '||' && op !== '&&' && op !== '??') {
40
+ return false;
41
+ }
42
+ const lhs = t.cloneNode(left, true);
43
+ if (t.isMemberExpression(left) && t.isMemberExpression(lhs)) {
44
+ // `with` can turn a bare object name into a getter or shadow a memo temp.
45
+ if (isInsideWith(path)) {
46
+ return false;
47
+ }
48
+ const { object } = left;
49
+ if (t.isExpression(object)) {
50
+ const memo = path.scope.maybeGenerateMemoised(object);
51
+ if (memo) {
52
+ left.object = memo;
53
+ lhs.object = t.assignmentExpression('=', t.cloneNode(memo), object);
54
+ }
55
+ }
56
+ if (left.computed) {
57
+ const { property } = left;
58
+ if (t.isExpression(property)) {
59
+ const memoProp = path.scope.maybeGenerateMemoised(property);
60
+ if (memoProp) {
61
+ left.property = memoProp;
62
+ lhs.property = t.assignmentExpression('=', t.cloneNode(memoProp), property);
63
+ }
64
+ }
65
+ }
66
+ }
67
+ else if (!t.isIdentifier(left)) {
68
+ return false;
69
+ }
70
+ path.replaceWith(t.logicalExpression(op, lhs, t.assignmentExpression('=', left, right)));
71
+ return true;
72
+ }
73
+ //# sourceMappingURL=expand-logical-assignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand-logical-assignment.js","sourceRoot":"","sources":["../../src/transforms/expand-logical-assignment.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAG9D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAS;IAC/C,OAAO,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,OAAO,GAAyB;IACpC,oBAAoB,CAAC,IAAI,EAAE,KAAK;QAC9B,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;QACtB,CAAC;IACH,CAAC;CACF,CAAA;AAED,SAAS,sBAAsB,CAAC,IAAsC;IACpE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;IAC3C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAChC,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAEnC,IAAI,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5D,0EAA0E;QAC1E,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;YACrD,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;gBAClB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;YACrE,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;YACzB,IAAI,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAA;gBAC3D,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;oBACxB,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAA;gBAC7E,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,CAAC,WAAW,CACd,CAAC,CAAC,iBAAiB,CAAC,EAAE,EAAE,GAAmB,EAAE,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CACvF,CAAA;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Replaces a constant object or array wrapper with one binding per entry when
4
+ * every reference is a static-key read. The inliner can then see function
5
+ * values directly.
6
+ *
7
+ * @example
8
+ * // ◀️ before
9
+ * var ops = {
10
+ * double: function (x) { return x * 2; },
11
+ * negate: function (x) { return -x; },
12
+ * };
13
+ * log(ops.double(3), ops.negate(7));
14
+ *
15
+ * // ▶️ after
16
+ * var double = function (x) { return x * 2; };
17
+ * var negate = function (x) { return -x; };
18
+ * log(double(3), negate(7));
19
+ */
20
+ export declare function extractObjectProperties(ast: File): boolean;
21
+ //# sourceMappingURL=extract-object-properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-object-properties.d.ts","sourceRoot":"","sources":["../../src/transforms/extract-object-properties.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAQxC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAE1D"}
@@ -0,0 +1,340 @@
1
+ import * as t from '@babel/types';
2
+ import { initializerReaches } from '../analysis/document-order.js';
3
+ import { isInsideWith, isProtoKey } from '../utils/ast.js';
4
+ import { traverseForChanges } from '../utils/change-tracking.js';
5
+ import { isCalleeOrTagOf } from '../utils/paths.js';
6
+ /**
7
+ * Replaces a constant object or array wrapper with one binding per entry when
8
+ * every reference is a static-key read. The inliner can then see function
9
+ * values directly.
10
+ *
11
+ * @example
12
+ * // ◀️ before
13
+ * var ops = {
14
+ * double: function (x) { return x * 2; },
15
+ * negate: function (x) { return -x; },
16
+ * };
17
+ * log(ops.double(3), ops.negate(7));
18
+ *
19
+ * // ▶️ after
20
+ * var double = function (x) { return x * 2; };
21
+ * var negate = function (x) { return -x; };
22
+ * log(double(3), negate(7));
23
+ */
24
+ export function extractObjectProperties(ast) {
25
+ return traverseForChanges(ast, extractVisitor);
26
+ }
27
+ const extractVisitor = {
28
+ VariableDeclaration: {
29
+ exit(path, state) {
30
+ if (tryExtractDeclaration(path)) {
31
+ state.changed = true;
32
+ }
33
+ },
34
+ },
35
+ };
36
+ function tryExtractDeclaration(path) {
37
+ if (path.node.declarations.length !== 1) {
38
+ return false;
39
+ }
40
+ // Babel hides lexical replacements for a `for` initializer inside an IIFE.
41
+ if (path.key === 'init' && path.parentPath?.isForStatement() && path.node.kind !== 'var') {
42
+ return false;
43
+ }
44
+ const [declaratorPath] = path.get('declarations');
45
+ if (!declaratorPath) {
46
+ return false;
47
+ }
48
+ const idPath = declaratorPath.get('id');
49
+ if (!idPath.isIdentifier()) {
50
+ return false;
51
+ }
52
+ const idName = idPath.node.name;
53
+ const initPath = declaratorPath.get('init');
54
+ if (!initPath.node) {
55
+ return false;
56
+ }
57
+ if (initPath.isObjectExpression()) {
58
+ const entries = collectObjectEntries(initPath);
59
+ if (entries === null) {
60
+ return false;
61
+ }
62
+ return performExtraction(path, idName, initPath, entries, false);
63
+ }
64
+ if (initPath.isArrayExpression()) {
65
+ const entries = collectArrayEntries(initPath);
66
+ if (entries === null) {
67
+ return false;
68
+ }
69
+ return performExtraction(path, idName, initPath, entries, true);
70
+ }
71
+ return false;
72
+ }
73
+ function collectObjectEntries(initPath) {
74
+ const entries = [];
75
+ const seen = new Set();
76
+ for (const propPath of initPath.get('properties')) {
77
+ if (!propPath.isObjectProperty()) {
78
+ // Object methods receive the literal as `this`.
79
+ return null;
80
+ }
81
+ // The `__proto__` setter form creates no own property to extract.
82
+ if (isProtoSetter(propPath.node)) {
83
+ return null;
84
+ }
85
+ const key = staticPropertyKey(propPath.node);
86
+ if (key === null) {
87
+ return null;
88
+ }
89
+ if (seen.has(key)) {
90
+ return null;
91
+ }
92
+ seen.add(key);
93
+ const valuePath = propPath.get('value');
94
+ if (Array.isArray(valuePath)) {
95
+ return null;
96
+ }
97
+ if (!valuePath.isExpression()) {
98
+ return null;
99
+ }
100
+ if (functionRefsThis(valuePath)) {
101
+ return null;
102
+ }
103
+ entries.push({ key, value: valuePath.node, callSafe: isCallSafeValue(valuePath.node) });
104
+ }
105
+ return entries;
106
+ }
107
+ function isProtoSetter(node) {
108
+ return !node.computed && !node.shorthand && isProtoKey(node.key);
109
+ }
110
+ function isCallSafeValue(node) {
111
+ // Surviving function values are receiver-independent.
112
+ return t.isArrowFunctionExpression(node) || t.isFunctionExpression(node);
113
+ }
114
+ function collectArrayEntries(initPath) {
115
+ const entries = [];
116
+ const elementPaths = initPath.get('elements');
117
+ for (let i = 0; i < elementPaths.length; i++) {
118
+ const elementPath = elementPaths[i];
119
+ // An array hole has no value node to bind.
120
+ if (!elementPath.node) {
121
+ return null;
122
+ }
123
+ if (elementPath.isSpreadElement()) {
124
+ return null;
125
+ }
126
+ if (!elementPath.isExpression()) {
127
+ return null;
128
+ }
129
+ if (functionRefsThis(elementPath)) {
130
+ return null;
131
+ }
132
+ entries.push({
133
+ key: String(i),
134
+ value: elementPath.node,
135
+ callSafe: isCallSafeValue(elementPath.node),
136
+ });
137
+ }
138
+ return entries;
139
+ }
140
+ function performExtraction(path, idName, initPath, entries, isArray) {
141
+ const binding = path.scope.getBinding(idName);
142
+ if (!binding) {
143
+ return false;
144
+ }
145
+ if (!binding.constant) {
146
+ return false;
147
+ }
148
+ // `with` can shadow a synthesized entry binding.
149
+ if (isInsideWith(path)) {
150
+ return false;
151
+ }
152
+ if (initContainsSelfReference(binding, initPath)) {
153
+ return false;
154
+ }
155
+ const callSafeByKey = new Map(entries.map((entry) => [entry.key, entry.callSafe]));
156
+ const validKeys = new Set(entries.map((entry) => entry.key));
157
+ const replacements = [];
158
+ const seenMembers = new Set();
159
+ for (const ref of binding.referencePaths) {
160
+ // Before initialization, a wrapper read throws while a bare binding may not.
161
+ if (!initializerReaches(path, ref)) {
162
+ return false;
163
+ }
164
+ // `with` can redirect the rewritten reference.
165
+ if (isInsideWith(ref)) {
166
+ return false;
167
+ }
168
+ const parent = ref.parentPath;
169
+ if (!parent || !parent.isMemberExpression()) {
170
+ return false;
171
+ }
172
+ if (parent.node.object !== ref.node) {
173
+ return false;
174
+ }
175
+ const key = staticMemberKey(parent.node);
176
+ if (key === null) {
177
+ return false;
178
+ }
179
+ if (!validKeys.has(key)) {
180
+ return false;
181
+ }
182
+ if (isWriteTargetMember(parent)) {
183
+ return false;
184
+ }
185
+ // Extracting a method call drops its receiver.
186
+ if (isCalleeOrTagOf(parent) && !callSafeByKey.get(key)) {
187
+ return false;
188
+ }
189
+ // Earlier extraction can publish the same member twice. Replace each node
190
+ // once to avoid a detached-path error.
191
+ if (seenMembers.has(parent.node)) {
192
+ continue;
193
+ }
194
+ seenMembers.add(parent.node);
195
+ replacements.push({ memberPath: parent, key });
196
+ }
197
+ const { scope } = path;
198
+ const usedNames = new Set();
199
+ const keyToName = new Map();
200
+ for (const { key } of entries) {
201
+ const baseName = isArray ? `${idName}${key}` : key;
202
+ const baseNameIsFree = t.isValidIdentifier(baseName) &&
203
+ !usedNames.has(baseName) &&
204
+ !scope.hasBinding(baseName) &&
205
+ !scope.hasGlobal(baseName) &&
206
+ !scope.hasReference(baseName);
207
+ const chosen = baseNameIsFree
208
+ ? baseName
209
+ : scope.generateUid(t.isValidIdentifier(baseName) ? baseName : 'property');
210
+ usedNames.add(chosen);
211
+ keyToName.set(key, chosen);
212
+ }
213
+ const newDecls = entries.map(({ key, value }) => t.variableDeclaration(path.node.kind, [
214
+ t.variableDeclarator(t.identifier(keyToName.get(key)), value),
215
+ ]));
216
+ const newPaths = path.replaceWithMultiple(newDecls);
217
+ for (const newPath of newPaths) {
218
+ newPath.scope.registerDeclaration(newPath);
219
+ }
220
+ // Publish rewritten references for the next fixed-point iteration.
221
+ for (const { memberPath, key } of replacements) {
222
+ const name = keyToName.get(key);
223
+ const [newRefPath] = memberPath.replaceWith(t.identifier(name));
224
+ if (newRefPath) {
225
+ const refBinding = newRefPath.scope.getBinding(name);
226
+ if (refBinding) {
227
+ refBinding.referencePaths.push(newRefPath);
228
+ refBinding.references++;
229
+ }
230
+ }
231
+ }
232
+ // Remove the dead wrapper binding before the same name is visited again.
233
+ path.scope.removeBinding(idName);
234
+ return true;
235
+ }
236
+ function staticPropertyKey(prop) {
237
+ const { key } = prop;
238
+ if (!prop.computed && t.isIdentifier(key)) {
239
+ return key.name;
240
+ }
241
+ return literalKeyToString(key);
242
+ }
243
+ function staticMemberKey(node) {
244
+ if (!node.computed) {
245
+ if (t.isIdentifier(node.property)) {
246
+ return node.property.name;
247
+ }
248
+ return null;
249
+ }
250
+ return literalKeyToString(node.property);
251
+ }
252
+ function literalKeyToString(node) {
253
+ if (t.isStringLiteral(node)) {
254
+ return node.value;
255
+ }
256
+ if (t.isNumericLiteral(node)) {
257
+ return String(node.value);
258
+ }
259
+ if (t.isBigIntLiteral(node)) {
260
+ return node.value.toString();
261
+ }
262
+ return null;
263
+ }
264
+ // A member nested inside a destructuring target is still a write.
265
+ function isWriteTargetMember(memberPath) {
266
+ let current = memberPath;
267
+ let parent = current.parentPath;
268
+ while (parent) {
269
+ if (parent.isAssignmentExpression() && parent.node.left === current.node) {
270
+ return true;
271
+ }
272
+ if (parent.isUpdateExpression() && parent.node.argument === current.node) {
273
+ return true;
274
+ }
275
+ if (parent.isUnaryExpression() &&
276
+ parent.node.operator === 'delete' &&
277
+ parent.node.argument === current.node) {
278
+ return true;
279
+ }
280
+ if ((parent.isForInStatement() || parent.isForOfStatement()) &&
281
+ parent.node.left === current.node) {
282
+ return true;
283
+ }
284
+ if (parent.isArrayPattern() ||
285
+ parent.isObjectPattern() ||
286
+ parent.isObjectProperty() ||
287
+ parent.isRestElement() ||
288
+ (parent.isAssignmentPattern() && parent.node.left === current.node)) {
289
+ current = parent;
290
+ parent = current.parentPath;
291
+ continue;
292
+ }
293
+ break;
294
+ }
295
+ return false;
296
+ }
297
+ function functionRefsThis(path) {
298
+ const { node } = path;
299
+ if (!t.isFunctionExpression(node) && !t.isFunctionDeclaration(node)) {
300
+ return false;
301
+ }
302
+ const state = { found: false };
303
+ path.traverse(functionRefsThisVisitor, state);
304
+ return state.found;
305
+ }
306
+ const functionRefsThisVisitor = {
307
+ ThisExpression(_path, state) {
308
+ state.found = true;
309
+ },
310
+ Function(path, state) {
311
+ if (path.isArrowFunctionExpression()) {
312
+ return;
313
+ }
314
+ // Computed method keys use the enclosing `this`. The key node itself needs a
315
+ // separate check because traversal starts below it.
316
+ if ((path.isObjectMethod() || path.isClassMethod()) && path.node.computed) {
317
+ const keyPath = path.get('key');
318
+ if (keyPath.isThisExpression()) {
319
+ state.found = true;
320
+ }
321
+ else {
322
+ keyPath.traverse(functionRefsThisVisitor, state);
323
+ }
324
+ }
325
+ path.skip();
326
+ },
327
+ };
328
+ function initContainsSelfReference(binding, initPath) {
329
+ for (const ref of binding.referencePaths) {
330
+ let ancestor = ref;
331
+ while (ancestor) {
332
+ if (ancestor === initPath) {
333
+ return true;
334
+ }
335
+ ancestor = ancestor.parentPath;
336
+ }
337
+ }
338
+ return false;
339
+ }
340
+ //# sourceMappingURL=extract-object-properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-object-properties.js","sourceRoot":"","sources":["../../src/transforms/extract-object-properties.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Replaces built-in calls and reads with smaller syntax or host-computed
4
+ * constants. Host evaluation requires known arguments and receivers. Shadowed
5
+ * names, optional forms, and regexp methods stay unchanged.
6
+ *
7
+ * @example
8
+ * // ◀️ before
9
+ * Math.pow(2, 3);
10
+ * Array.of(1, 2, 3);
11
+ * "abc".toUpperCase();
12
+ * Math.PI;
13
+ * parseInt("0x1F", 16);
14
+ *
15
+ * // ▶️ after
16
+ * 8;
17
+ * [1, 2, 3];
18
+ * "ABC";
19
+ * 3.141592653589793;
20
+ * 31;
21
+ */
22
+ export declare function foldBuiltinMethods(ast: File): boolean;
23
+ //# sourceMappingURL=fold-builtin-methods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fold-builtin-methods.d.ts","sourceRoot":"","sources":["../../src/transforms/fold-builtin-methods.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAOxC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAIrD"}