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,208 @@
1
+ import * as t from '@babel/types';
2
+ import { enclosingScopeHasDirectEval, hasDuplicateParamNames } from '../utils/ast.js';
3
+ import { traverseForChanges } from '../utils/change-tracking.js';
4
+ import { isLiteralShaped } from '../utils/literal.js';
5
+ import { hasAnnexBFunctionAlias } from '../utils/paths.js';
6
+ /**
7
+ * Moves leading literal-valued `var` declarations into trailing default
8
+ * parameters. Arrows, rest parameters, name collisions, and functions with
9
+ * callers that could fill a new slot stay unchanged.
10
+ *
11
+ * Packing also requires unchanged `arguments`, directive, and hoisting behavior.
12
+ *
13
+ * @example
14
+ * // ◀️ before
15
+ * function run() {
16
+ * var x = 1;
17
+ * return x;
18
+ * }
19
+ *
20
+ * // ▶️ after
21
+ * function run(x = 1) {
22
+ * return x;
23
+ * }
24
+ */
25
+ export function packDeclarationsIntoParameters(ast) {
26
+ return traverseForChanges(ast, visitor);
27
+ }
28
+ const visitor = {
29
+ Function(path, state) {
30
+ if (packLeadingIntoParams(path)) {
31
+ state.changed = true;
32
+ }
33
+ },
34
+ };
35
+ function packLeadingIntoParams(path) {
36
+ // Accessors have fixed arity. Method calls are not analyzable, and arrows do
37
+ // not own `arguments`.
38
+ if (path.isArrowFunctionExpression() ||
39
+ path.isObjectMethod() ||
40
+ path.isClassMethod() ||
41
+ path.isClassPrivateMethod()) {
42
+ return false;
43
+ }
44
+ // An Annex B alias splits call sites across bindings Babel does not connect.
45
+ if (hasAnnexBFunctionAlias(path)) {
46
+ return false;
47
+ }
48
+ const { params } = path.node;
49
+ if (params.some((param) => t.isRestElement(param))) {
50
+ return false;
51
+ }
52
+ // Adding a default makes duplicate sloppy parameters a syntax error.
53
+ if (hasDuplicateParamNames(params)) {
54
+ return false;
55
+ }
56
+ const { body } = path.node;
57
+ if (!t.isBlockStatement(body)) {
58
+ return false;
59
+ }
60
+ // A strict directive forbids a non-simple parameter list.
61
+ if (body.directives.length > 0) {
62
+ return false;
63
+ }
64
+ // Defaults make `arguments` unmapped.
65
+ if (referencesArguments(path)) {
66
+ return false;
67
+ }
68
+ // Direct eval can inspect the newly unmapped `arguments` by name.
69
+ if (enclosingScopeHasDirectEval(path)) {
70
+ return false;
71
+ }
72
+ // A caller with extra arguments could fill the new parameter slot.
73
+ if (!allCallSitesRespectArity(path, params.length)) {
74
+ return false;
75
+ }
76
+ const existingNames = collectParamNames(params);
77
+ // FunctionDeclarationInstantiation can replace a packed default with a hoisted
78
+ // same-named function.
79
+ const bodyFunctionNames = functionDeclarationNames(body);
80
+ let packed = false;
81
+ while (body.body.length > 0) {
82
+ const stmt = body.body[0];
83
+ if (!t.isVariableDeclaration(stmt) || stmt.kind !== 'var') {
84
+ break;
85
+ }
86
+ if (stmt.declarations.length !== 1) {
87
+ break;
88
+ }
89
+ const decl = stmt.declarations[0];
90
+ if (!t.isIdentifier(decl.id)) {
91
+ break;
92
+ }
93
+ if (!decl.init) {
94
+ break;
95
+ }
96
+ if (!isLiteralShaped(decl.init)) {
97
+ break;
98
+ }
99
+ if (existingNames.has(decl.id.name) || bodyFunctionNames.has(decl.id.name)) {
100
+ break;
101
+ }
102
+ params.push(t.assignmentPattern(t.cloneNode(decl.id), decl.init));
103
+ existingNames.add(decl.id.name);
104
+ body.body.shift();
105
+ packed = true;
106
+ }
107
+ return packed;
108
+ }
109
+ function referencesArguments(path) {
110
+ let found = false;
111
+ const argumentsVisitor = {
112
+ Function(inner) {
113
+ if (inner.isArrowFunctionExpression()) {
114
+ // Arrows read the enclosing `arguments`.
115
+ return;
116
+ }
117
+ // Non-arrow bodies bind `arguments`, but computed method keys use the
118
+ // enclosing scope.
119
+ const key = methodComputedKey(inner);
120
+ if (key) {
121
+ if (key.isIdentifier() && key.node.name === 'arguments') {
122
+ found = true;
123
+ }
124
+ key.traverse(argumentsVisitor);
125
+ }
126
+ inner.skip();
127
+ },
128
+ Identifier(inner) {
129
+ if (inner.node.name === 'arguments' && inner.isReferencedIdentifier()) {
130
+ found = true;
131
+ }
132
+ },
133
+ };
134
+ path.traverse(argumentsVisitor);
135
+ return found;
136
+ }
137
+ function methodComputedKey(path) {
138
+ if ((path.isObjectMethod() || path.isClassMethod() || path.isClassPrivateMethod()) &&
139
+ path.node.computed) {
140
+ return path.get('key');
141
+ }
142
+ return null;
143
+ }
144
+ // Every outer and recursive reference must be a direct call within the original
145
+ // arity and without spread.
146
+ function allCallSitesRespectArity(path, arity) {
147
+ const external = functionBinding(path);
148
+ if (!external || !external.constant || !bindingCallsRespectArity(external, arity)) {
149
+ return false;
150
+ }
151
+ if (path.isFunctionExpression() && path.node.id) {
152
+ const inner = path.scope.getBinding(path.node.id.name);
153
+ if (inner && (!inner.constant || !bindingCallsRespectArity(inner, arity))) {
154
+ return false;
155
+ }
156
+ }
157
+ return true;
158
+ }
159
+ function bindingCallsRespectArity(binding, arity) {
160
+ for (const ref of binding.referencePaths) {
161
+ const parent = ref.parentPath;
162
+ if (!parent ||
163
+ !(parent.isCallExpression() || parent.isOptionalCallExpression()) ||
164
+ parent.node.callee !== ref.node) {
165
+ return false;
166
+ }
167
+ const args = parent.node.arguments;
168
+ if (args.length > arity || args.some((arg) => t.isSpreadElement(arg))) {
169
+ return false;
170
+ }
171
+ }
172
+ return true;
173
+ }
174
+ // Annex B can hoist function names from nested blocks into this function scope.
175
+ function functionDeclarationNames(body) {
176
+ const names = new Set();
177
+ t.traverseFast(body, (node) => {
178
+ if (t.isFunctionDeclaration(node) && node.id) {
179
+ names.add(node.id.name);
180
+ return t.traverseFast.skip;
181
+ }
182
+ return node !== body && t.isFunction(node) ? t.traverseFast.skip : undefined;
183
+ });
184
+ return names;
185
+ }
186
+ function functionBinding(path) {
187
+ if (path.isFunctionDeclaration() && path.node.id) {
188
+ return path.scope.parent?.getBinding(path.node.id.name) ?? null;
189
+ }
190
+ const parent = path.parentPath;
191
+ if (parent?.isVariableDeclarator() &&
192
+ parent.node.init === path.node &&
193
+ t.isIdentifier(parent.node.id)) {
194
+ return parent.scope.getBinding(parent.node.id.name) ?? null;
195
+ }
196
+ return null;
197
+ }
198
+ // Parameter names inside patterns and defaults also block duplicate packing.
199
+ function collectParamNames(params) {
200
+ const names = new Set();
201
+ for (const param of params) {
202
+ for (const name of Object.keys(t.getBindingIdentifiers(param))) {
203
+ names.add(name);
204
+ }
205
+ }
206
+ return names;
207
+ }
208
+ //# sourceMappingURL=pack-declarations-into-parameters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-declarations-into-parameters.js","sourceRoot":"","sources":["../../src/transforms/pack-declarations-into-parameters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Removes a function expression's name when the body does not use its binding
4
+ * and NamedEvaluation restores the same `.name`. Other positions could infer no
5
+ * name or a different one.
6
+ *
7
+ * @example
8
+ * // ◀️ before
9
+ * var greet = function greet() {};
10
+ * var a = function bar() {};
11
+ *
12
+ * // ▶️ after
13
+ * var greet = function () {};
14
+ * var a = function bar() {};
15
+ */
16
+ export declare function removeAnonymousFunctionNames(ast: File): boolean;
17
+ //# sourceMappingURL=remove-anonymous-function-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-anonymous-function-names.d.ts","sourceRoot":"","sources":["../../src/transforms/remove-anonymous-function-names.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAKxC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAE/D"}
@@ -0,0 +1,72 @@
1
+ import * as t from '@babel/types';
2
+ import { traverseForChanges } from '../utils/change-tracking.js';
3
+ /**
4
+ * Removes a function expression's name when the body does not use its binding
5
+ * and NamedEvaluation restores the same `.name`. Other positions could infer no
6
+ * name or a different one.
7
+ *
8
+ * @example
9
+ * // ◀️ before
10
+ * var greet = function greet() {};
11
+ * var a = function bar() {};
12
+ *
13
+ * // ▶️ after
14
+ * var greet = function () {};
15
+ * var a = function bar() {};
16
+ */
17
+ export function removeAnonymousFunctionNames(ast) {
18
+ return traverseForChanges(ast, visitor);
19
+ }
20
+ const visitor = {
21
+ FunctionExpression(path, state) {
22
+ const { id } = path.node;
23
+ if (!id) {
24
+ return;
25
+ }
26
+ // Reads and writes both observe the expression's immutable inner binding.
27
+ const binding = path.scope.getBinding(id.name);
28
+ if (binding &&
29
+ binding.identifier === id &&
30
+ (binding.references > 0 || binding.constantViolations.length > 0)) {
31
+ return;
32
+ }
33
+ if (inferredName(path) !== id.name) {
34
+ return;
35
+ }
36
+ path.node.id = null;
37
+ state.changed = true;
38
+ },
39
+ };
40
+ // No inferred name means `.name` would become empty.
41
+ function inferredName(path) {
42
+ const { node } = path;
43
+ const { parentPath } = path;
44
+ if (!parentPath) {
45
+ return null;
46
+ }
47
+ const parent = parentPath.node;
48
+ if (t.isVariableDeclarator(parent) && parent.init === node && t.isIdentifier(parent.id)) {
49
+ return parent.id.name;
50
+ }
51
+ if (t.isAssignmentExpression(parent) &&
52
+ parent.operator === '=' &&
53
+ parent.right === node &&
54
+ t.isIdentifier(parent.left)) {
55
+ return parent.left.name;
56
+ }
57
+ if (t.isAssignmentPattern(parent) && parent.right === node && t.isIdentifier(parent.left)) {
58
+ return parent.left.name;
59
+ }
60
+ if ((t.isObjectProperty(parent) || t.isClassProperty(parent)) &&
61
+ parent.value === node &&
62
+ !parent.computed) {
63
+ if (t.isIdentifier(parent.key)) {
64
+ return parent.key.name;
65
+ }
66
+ if (t.isStringLiteral(parent.key)) {
67
+ return parent.key.value;
68
+ }
69
+ }
70
+ return null;
71
+ }
72
+ //# sourceMappingURL=remove-anonymous-function-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-anonymous-function-names.js","sourceRoot":"","sources":["../../src/transforms/remove-anonymous-function-names.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAG9D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,4BAA4B,CAAC,GAAS;IACpD,OAAO,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,OAAO,GAAyB;IACpC,kBAAkB,CAAC,IAAI,EAAE,KAAK;QAC5B,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;QACxB,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAM;QACR,CAAC;QACD,0EAA0E;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QAC9C,IACE,OAAO;YACP,OAAO,CAAC,UAAU,KAAK,EAAE;YACzB,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,IAAI,OAAO,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,EACjE,CAAC;YACD,OAAM;QACR,CAAC;QACD,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;YACnC,OAAM;QACR,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAA;QACnB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;IACtB,CAAC;CACF,CAAA;AAED,qDAAqD;AACrD,SAAS,YAAY,CAAC,IAAoC;IACxD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAA;IAC9B,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QACxF,OAAO,MAAM,CAAC,EAAE,CAAC,IAAI,CAAA;IACvB,CAAC;IACD,IACE,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC;QAChC,MAAM,CAAC,QAAQ,KAAK,GAAG;QACvB,MAAM,CAAC,KAAK,KAAK,IAAI;QACrB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAC3B,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAA;IACzB,CAAC;IACD,IAAI,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1F,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAA;IACzB,CAAC;IACD,IACE,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,KAAK,IAAI;QACrB,CAAC,MAAM,CAAC,QAAQ,EAChB,CAAC;QACD,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAA;QACxB,CAAC;QACD,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAA;QACzB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Removes statements after unconditional control flow in the same statement list.
4
+ *
5
+ * Hoisted function and `var` declarations stay because reachable code may still
6
+ * observe their bindings.
7
+ *
8
+ * @example
9
+ * // ◀️ before
10
+ * function foo() {
11
+ * return "bar";
12
+ * log("baz");
13
+ * }
14
+ *
15
+ * // ▶️ after
16
+ * function foo() {
17
+ * return "bar";
18
+ * }
19
+ */
20
+ export declare function removeUnreachableCode(ast: File): boolean;
21
+ //# sourceMappingURL=remove-unreachable-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-unreachable-code.d.ts","sourceRoot":"","sources":["../../src/transforms/remove-unreachable-code.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAKxC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAExD"}
@@ -0,0 +1,103 @@
1
+ import * as t from '@babel/types';
2
+ import { traverseForChanges } from '../utils/change-tracking.js';
3
+ /**
4
+ * Removes statements after unconditional control flow in the same statement list.
5
+ *
6
+ * Hoisted function and `var` declarations stay because reachable code may still
7
+ * observe their bindings.
8
+ *
9
+ * @example
10
+ * // ◀️ before
11
+ * function foo() {
12
+ * return "bar";
13
+ * log("baz");
14
+ * }
15
+ *
16
+ * // ▶️ after
17
+ * function foo() {
18
+ * return "bar";
19
+ * }
20
+ */
21
+ export function removeUnreachableCode(ast) {
22
+ return traverseForChanges(ast, visitor);
23
+ }
24
+ const visitor = {
25
+ BlockStatement(path, state) {
26
+ if (pruneBody(path.get('body'))) {
27
+ state.changed = true;
28
+ }
29
+ },
30
+ SwitchCase(path, state) {
31
+ if (pruneBody(path.get('consequent'))) {
32
+ state.changed = true;
33
+ }
34
+ },
35
+ };
36
+ function pruneBody(body) {
37
+ let killZone = false;
38
+ const toRemove = [];
39
+ for (const stmt of body) {
40
+ if (killZone) {
41
+ if (isSafeToRemoveAfterCompletion(stmt)) {
42
+ toRemove.push(stmt);
43
+ }
44
+ continue;
45
+ }
46
+ if (isCompletion(stmt.node)) {
47
+ killZone = true;
48
+ }
49
+ }
50
+ for (const removed of toRemove) {
51
+ removed.remove();
52
+ }
53
+ return toRemove.length > 0;
54
+ }
55
+ function isCompletion(node) {
56
+ return (t.isReturnStatement(node) ||
57
+ t.isThrowStatement(node) ||
58
+ t.isBreakStatement(node) ||
59
+ t.isContinueStatement(node));
60
+ }
61
+ // Hoisted bindings and referenced lexical TDZ remain observable from reachable
62
+ // code. An unreferenced lexical declaration is inert.
63
+ function isSafeToRemoveAfterCompletion(path) {
64
+ const { node } = path;
65
+ if (t.isFunctionDeclaration(node) || (t.isVariableDeclaration(node) && node.kind === 'var')) {
66
+ return false;
67
+ }
68
+ if (t.isClassDeclaration(node) || (t.isVariableDeclaration(node) && node.kind !== 'var')) {
69
+ return !declaresReferencedBinding(path);
70
+ }
71
+ return !nestsHoistedDeclaration(node);
72
+ }
73
+ // A write before `let x` also observes its TDZ.
74
+ function declaresReferencedBinding(path) {
75
+ for (const name of Object.keys(path.getBindingIdentifiers())) {
76
+ const binding = path.scope.getBinding(name);
77
+ if (binding && (binding.references > 0 || binding.constantViolations.length > 0)) {
78
+ return true;
79
+ }
80
+ }
81
+ return false;
82
+ }
83
+ function nestsHoistedDeclaration(node) {
84
+ let found = false;
85
+ t.traverseFast(node, (child) => {
86
+ if (found) {
87
+ return t.traverseFast.skip;
88
+ }
89
+ if (child !== node && t.isFunction(child)) {
90
+ // Function declarations may add Annex B aliases. Function bodies do not.
91
+ if (t.isFunctionDeclaration(child)) {
92
+ found = true;
93
+ }
94
+ return t.traverseFast.skip;
95
+ }
96
+ if (t.isVariableDeclaration(child) && child.kind === 'var') {
97
+ found = true;
98
+ }
99
+ return found ? t.traverseFast.skip : undefined;
100
+ });
101
+ return found;
102
+ }
103
+ //# sourceMappingURL=remove-unreachable-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-unreachable-code.js","sourceRoot":"","sources":["../../src/transforms/remove-unreachable-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Removes unused declarations and expression statements that have no effects.
4
+ * Sweeps continue because each removal can strand another binding.
5
+ *
6
+ * @example
7
+ * // ◀️ before
8
+ * function foo() { return "foo"; }
9
+ * function bar() { return "bar"; }
10
+ * var unused = 1;
11
+ * foo();
12
+ *
13
+ * // ▶️ after
14
+ * function foo() { return "foo"; }
15
+ * foo();
16
+ */
17
+ export declare function removeUnusedCode(ast: File): boolean;
18
+ //# sourceMappingURL=remove-unused-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-unused-code.d.ts","sourceRoot":"","sources":["../../src/transforms/remove-unused-code.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAOxC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAiBnD"}