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,78 @@
1
+ import traverse from '@babel/traverse';
2
+ import * as t from '@babel/types';
3
+ import { isInDirectivePrologue } from '../utils/ast.js';
4
+ /**
5
+ * Rewrites safe template literals as string concatenation. Tagged templates
6
+ * stay intact because the tag receives their quasi structure.
7
+ *
8
+ * Templates use the "string" ToPrimitive hint, while `x + ""` uses "default".
9
+ * Those hints can call object coercion methods in a different order, so only
10
+ * expressions known to produce primitives are expanded.
11
+ *
12
+ * An empty first quasi still matters. It makes `` `${5}` `` produce `"5"`
13
+ * instead of the number `5`.
14
+ *
15
+ * @example
16
+ * // ◀️ before
17
+ * var msg = `sum is ${a + b}`;
18
+ * var raw = `static text`;
19
+ *
20
+ * // ▶️ after
21
+ * var msg = "sum is " + (a + b);
22
+ * var raw = "static text";
23
+ */
24
+ export function expandTemplateLiterals(ast) {
25
+ traverse(ast, visitor);
26
+ }
27
+ const visitor = {
28
+ TemplateLiteral(path) {
29
+ const { parent } = path;
30
+ if (t.isTaggedTemplateExpression(parent) && parent.quasi === path.node) {
31
+ return;
32
+ }
33
+ const { quasis, expressions } = path.node;
34
+ if (expressions.length === 0) {
35
+ // Rewriting a leading template as a string would create a directive.
36
+ if (t.isExpressionStatement(parent) && isInDirectivePrologue(path.parentPath)) {
37
+ return;
38
+ }
39
+ path.replaceWith(t.stringLiteral(quasiValue(quasis[0])));
40
+ return;
41
+ }
42
+ for (const expr of expressions) {
43
+ if (!t.isExpression(expr) || !producesPrimitive(expr)) {
44
+ return;
45
+ }
46
+ }
47
+ let result = t.stringLiteral(quasiValue(quasis[0]));
48
+ for (let i = 0; i < expressions.length; i++) {
49
+ const expr = expressions[i];
50
+ result = t.binaryExpression('+', result, expr);
51
+ const nextQuasi = quasis[i + 1];
52
+ if (nextQuasi) {
53
+ const value = quasiValue(nextQuasi);
54
+ if (value !== '') {
55
+ result = t.binaryExpression('+', result, t.stringLiteral(value));
56
+ }
57
+ }
58
+ }
59
+ path.replaceWith(result);
60
+ },
61
+ };
62
+ // These expression kinds always produce primitives, making the coercion hint
63
+ // irrelevant. Any kind that can produce an object is excluded.
64
+ function producesPrimitive(node) {
65
+ return (t.isStringLiteral(node) ||
66
+ t.isNumericLiteral(node) ||
67
+ t.isBooleanLiteral(node) ||
68
+ t.isNullLiteral(node) ||
69
+ t.isBigIntLiteral(node) ||
70
+ t.isTemplateLiteral(node) ||
71
+ t.isBinaryExpression(node) ||
72
+ t.isUnaryExpression(node) ||
73
+ t.isUpdateExpression(node));
74
+ }
75
+ function quasiValue(quasi) {
76
+ return quasi?.value.cooked ?? quasi?.value.raw ?? '';
77
+ }
78
+ //# sourceMappingURL=expand-template-literals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand-template-literals.js","sourceRoot":"","sources":["../../src/preparation/expand-template-literals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Moves safe instance fields into the constructor and safe static fields into
4
+ * static blocks. The whole class stays intact unless every field can be lowered.
5
+ *
6
+ * `Object.defineProperty` preserves CreateDataProperty semantics. A plain
7
+ * assignment could invoke an inherited setter or fail on an inherited read-only
8
+ * property. Static blocks also preserve the class binding and `this`.
9
+ *
10
+ * Accessor collisions, special keys, inferred names, constructor parameter
11
+ * scope, and relocated `this`, `super`, or `new.target` can all expose a rewrite.
12
+ * Private or computed fields, derived classes, `with`, and a shadowed `Object`
13
+ * are therefore refused.
14
+ *
15
+ * @example
16
+ * // ◀️ before
17
+ * class A {
18
+ * x = 1;
19
+ * static z = 2;
20
+ * }
21
+ *
22
+ * // ▶️ after
23
+ * class A {
24
+ * constructor() {
25
+ * Object.defineProperty(this, "x", {
26
+ * value: 1,
27
+ * writable: true,
28
+ * enumerable: true,
29
+ * configurable: true
30
+ * });
31
+ * }
32
+ * static {
33
+ * Object.defineProperty(this, "z", {
34
+ * value: 2,
35
+ * writable: true,
36
+ * enumerable: true,
37
+ * configurable: true
38
+ * });
39
+ * }
40
+ * }
41
+ */
42
+ export declare function rewriteClassFields(ast: File): void;
43
+ //# sourceMappingURL=rewrite-class-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewrite-class-fields.d.ts","sourceRoot":"","sources":["../../src/preparation/rewrite-class-fields.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAKxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAElD"}
@@ -0,0 +1,270 @@
1
+ import traverse from '@babel/traverse';
2
+ import * as t from '@babel/types';
3
+ import { isInsideWith, isProtoKey } from '../utils/ast.js';
4
+ import { isPrimitiveLiteral } from '../utils/literal.js';
5
+ /**
6
+ * Moves safe instance fields into the constructor and safe static fields into
7
+ * static blocks. The whole class stays intact unless every field can be lowered.
8
+ *
9
+ * `Object.defineProperty` preserves CreateDataProperty semantics. A plain
10
+ * assignment could invoke an inherited setter or fail on an inherited read-only
11
+ * property. Static blocks also preserve the class binding and `this`.
12
+ *
13
+ * Accessor collisions, special keys, inferred names, constructor parameter
14
+ * scope, and relocated `this`, `super`, or `new.target` can all expose a rewrite.
15
+ * Private or computed fields, derived classes, `with`, and a shadowed `Object`
16
+ * are therefore refused.
17
+ *
18
+ * @example
19
+ * // ◀️ before
20
+ * class A {
21
+ * x = 1;
22
+ * static z = 2;
23
+ * }
24
+ *
25
+ * // ▶️ after
26
+ * class A {
27
+ * constructor() {
28
+ * Object.defineProperty(this, "x", {
29
+ * value: 1,
30
+ * writable: true,
31
+ * enumerable: true,
32
+ * configurable: true
33
+ * });
34
+ * }
35
+ * static {
36
+ * Object.defineProperty(this, "z", {
37
+ * value: 2,
38
+ * writable: true,
39
+ * enumerable: true,
40
+ * configurable: true
41
+ * });
42
+ * }
43
+ * }
44
+ */
45
+ export function rewriteClassFields(ast) {
46
+ traverse(ast, visitor);
47
+ }
48
+ const FORBIDDEN_STATIC_KEYS = new Set([
49
+ 'length',
50
+ 'name',
51
+ 'prototype',
52
+ '__proto__',
53
+ 'caller',
54
+ 'arguments',
55
+ ]);
56
+ const visitor = {
57
+ Class(path) {
58
+ const memberPaths = path.get('body.body');
59
+ const instanceFields = [];
60
+ const staticFields = [];
61
+ let hasPrivateField = false;
62
+ let hasComputedAccessor = false;
63
+ const instanceAccessorKeys = new Set();
64
+ const staticAccessorKeys = new Set();
65
+ let ctorPath = null;
66
+ for (const memberPath of memberPaths) {
67
+ const member = memberPath.node;
68
+ if (t.isClassProperty(member)) {
69
+ ;
70
+ (member.static ? staticFields : instanceFields).push(member);
71
+ }
72
+ else if (t.isClassPrivateProperty(member)) {
73
+ hasPrivateField = true;
74
+ }
75
+ else if (t.isClassMethod(member) && member.kind === 'constructor') {
76
+ ctorPath = memberPath;
77
+ }
78
+ else if (t.isClassMethod(member) && (member.kind === 'get' || member.kind === 'set')) {
79
+ const name = plainKeyName(member.key);
80
+ if (member.computed || name === null) {
81
+ hasComputedAccessor = true;
82
+ }
83
+ else {
84
+ ;
85
+ (member.static ? staticAccessorKeys : instanceAccessorKeys).add(name);
86
+ }
87
+ }
88
+ }
89
+ if (instanceFields.length === 0 && staticFields.length === 0) {
90
+ return;
91
+ }
92
+ if (!canDesugar(path, {
93
+ instanceFields,
94
+ staticFields,
95
+ hasPrivateField,
96
+ hasComputedAccessor,
97
+ instanceAccessorKeys,
98
+ staticAccessorKeys,
99
+ ctorPath,
100
+ })) {
101
+ return;
102
+ }
103
+ // Path methods keep Babel's queued sibling paths aligned after each edit.
104
+ for (const memberPath of memberPaths) {
105
+ const member = memberPath.node;
106
+ if (!t.isClassProperty(member)) {
107
+ continue;
108
+ }
109
+ if (member.static) {
110
+ memberPath.replaceWith(t.staticBlock([defineField(t.thisExpression(), member)]));
111
+ }
112
+ else {
113
+ memberPath.remove();
114
+ }
115
+ }
116
+ if (instanceFields.length > 0) {
117
+ const installs = instanceFields.map((field) => defineField(t.thisExpression(), field));
118
+ if (ctorPath) {
119
+ ctorPath.get('body').unshiftContainer('body', installs);
120
+ }
121
+ else {
122
+ path
123
+ .get('body')
124
+ .unshiftContainer('body', t.classMethod('constructor', t.identifier('constructor'), [], t.blockStatement(installs)));
125
+ }
126
+ }
127
+ },
128
+ };
129
+ function canDesugar(path, c) {
130
+ if (c.hasPrivateField || c.hasComputedAccessor || path.node.superClass != null) {
131
+ return false;
132
+ }
133
+ // `with` and outer bindings can redirect the synthesized `Object` reference.
134
+ if (isInsideWith(path) || objectIsShadowed(path, c.ctorPath)) {
135
+ return false;
136
+ }
137
+ if (c.instanceFields.length > 0 && c.ctorPath && !hasSimpleParams(c.ctorPath.node)) {
138
+ return false;
139
+ }
140
+ for (const field of c.instanceFields) {
141
+ if (!instanceFieldIsSafe(field, c.ctorPath != null, c.instanceAccessorKeys)) {
142
+ return false;
143
+ }
144
+ }
145
+ for (const field of c.staticFields) {
146
+ if (!staticFieldIsSafe(field, c.staticAccessorKeys)) {
147
+ return false;
148
+ }
149
+ }
150
+ return true;
151
+ }
152
+ function objectIsShadowed(path, ctorPath) {
153
+ return (path.scope.getBinding('Object') != null ||
154
+ (ctorPath != null && ctorPath.scope.getBinding('Object') != null));
155
+ }
156
+ // ECMA-262 10.2.2 initializes base-class fields before parameter defaults.
157
+ // Moving fields into the body reverses that order for non-simple parameters.
158
+ function hasSimpleParams(ctor) {
159
+ return ctor.params.every((param) => t.isIdentifier(param));
160
+ }
161
+ function instanceFieldIsSafe(field, hasCtor, accessorKeys) {
162
+ if (field.computed || !isPlainKey(field.key) || isProtoKey(field.key)) {
163
+ return false;
164
+ }
165
+ if (shadowsAccessor(field.key, accessorKeys)) {
166
+ return false;
167
+ }
168
+ if (field.value != null && isAnonymousFunctionDefinition(field.value)) {
169
+ return false;
170
+ }
171
+ if (hasCtor) {
172
+ // Only a literal cannot capture a constructor parameter or local.
173
+ return field.value == null || isPrimitiveLiteral(field.value);
174
+ }
175
+ return field.value == null || !initObservesMethodContext(field.value, false);
176
+ }
177
+ function staticFieldIsSafe(field, accessorKeys) {
178
+ if (field.computed || !isPlainKey(field.key) || isForbiddenStaticKey(field.key)) {
179
+ return false;
180
+ }
181
+ if (shadowsAccessor(field.key, accessorKeys)) {
182
+ return false;
183
+ }
184
+ if (field.value == null) {
185
+ return true;
186
+ }
187
+ if (isAnonymousFunctionDefinition(field.value)) {
188
+ return false;
189
+ }
190
+ // Static blocks can change how these context-sensitive forms resolve.
191
+ return !containsPrivateName(field.value) && !initObservesMethodContext(field.value, true);
192
+ }
193
+ // CreateDataProperty ignores a same-named accessor. Lowering could reorder it.
194
+ function shadowsAccessor(key, accessorKeys) {
195
+ const name = plainKeyName(key);
196
+ return name !== null && accessorKeys.has(name);
197
+ }
198
+ function containsPrivateName(node) {
199
+ let found = false;
200
+ t.traverseFast(node, (child) => {
201
+ if (t.isPrivateName(child)) {
202
+ found = true;
203
+ }
204
+ return found ? t.traverseFast.stop : undefined;
205
+ });
206
+ return found;
207
+ }
208
+ // These descriptor flags match CreateDataProperty.
209
+ function defineField(target, field) {
210
+ return t.expressionStatement(t.callExpression(t.memberExpression(t.identifier('Object'), t.identifier('defineProperty')), [
211
+ target,
212
+ t.stringLiteral(plainKeyName(field.key)),
213
+ t.objectExpression([
214
+ t.objectProperty(t.identifier('value'), fieldValue(field)),
215
+ t.objectProperty(t.identifier('writable'), t.booleanLiteral(true)),
216
+ t.objectProperty(t.identifier('enumerable'), t.booleanLiteral(true)),
217
+ t.objectProperty(t.identifier('configurable'), t.booleanLiteral(true)),
218
+ ]),
219
+ ]));
220
+ }
221
+ function fieldValue(field) {
222
+ return field.value ?? t.unaryExpression('void', t.numericLiteral(0));
223
+ }
224
+ // Numeric and BigInt keys both pass through ToPropertyKey, so `1` and `1n`
225
+ // name `"1"`.
226
+ function plainKeyName(key) {
227
+ if (t.isIdentifier(key)) {
228
+ return key.name;
229
+ }
230
+ if (t.isStringLiteral(key)) {
231
+ return key.value;
232
+ }
233
+ if (t.isNumericLiteral(key) || t.isBigIntLiteral(key)) {
234
+ return String(key.value);
235
+ }
236
+ return null;
237
+ }
238
+ function isPlainKey(key) {
239
+ return plainKeyName(key) !== null;
240
+ }
241
+ function isForbiddenStaticKey(key) {
242
+ if (t.isIdentifier(key) || t.isStringLiteral(key)) {
243
+ return FORBIDDEN_STATIC_KEYS.has(plainKeyName(key));
244
+ }
245
+ return false;
246
+ }
247
+ // A descriptor would infer `"value"` instead of the field key as `.name`.
248
+ function isAnonymousFunctionDefinition(node) {
249
+ return (t.isArrowFunctionExpression(node) ||
250
+ (t.isFunctionExpression(node) && node.id == null) ||
251
+ (t.isClassExpression(node) && node.id == null));
252
+ }
253
+ // Relocation changes `new.target`, `super`, and static `this`. Nested non-arrow
254
+ // functions rebind them and do not count.
255
+ function initObservesMethodContext(node, forbidThis) {
256
+ let found = false;
257
+ t.traverseFast(node, (child) => {
258
+ if (t.isFunction(child) && !t.isArrowFunctionExpression(child)) {
259
+ return t.traverseFast.skip;
260
+ }
261
+ if (t.isSuper(child) ||
262
+ (t.isMetaProperty(child) && child.meta.name === 'new' && child.property.name === 'target') ||
263
+ (forbidThis && t.isThisExpression(child))) {
264
+ found = true;
265
+ }
266
+ return found ? t.traverseFast.skip : undefined;
267
+ });
268
+ return found;
269
+ }
270
+ //# sourceMappingURL=rewrite-class-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewrite-class-fields.js","sourceRoot":"","sources":["../../src/preparation/rewrite-class-fields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Splits comma-sequenced expression statements into one statement each.
4
+ *
5
+ * @example
6
+ * // ◀️ before
7
+ * a(), b(), c();
8
+ *
9
+ * // ▶️ after
10
+ * a();
11
+ * b();
12
+ * c();
13
+ */
14
+ export declare function splitSequenceExpressions(ast: File): void;
15
+ //# sourceMappingURL=split-sequence-expressions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split-sequence-expressions.d.ts","sourceRoot":"","sources":["../../src/preparation/split-sequence-expressions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAIxC;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAExD"}
@@ -0,0 +1,36 @@
1
+ import traverse from '@babel/traverse';
2
+ import * as t from '@babel/types';
3
+ import { isInDirectivePrologue } from '../utils/ast.js';
4
+ /**
5
+ * Splits comma-sequenced expression statements into one statement each.
6
+ *
7
+ * @example
8
+ * // ◀️ before
9
+ * a(), b(), c();
10
+ *
11
+ * // ▶️ after
12
+ * a();
13
+ * b();
14
+ * c();
15
+ */
16
+ export function splitSequenceExpressions(ast) {
17
+ traverse(ast, visitor);
18
+ }
19
+ const visitor = {
20
+ ExpressionStatement(path) {
21
+ if (!t.isSequenceExpression(path.node.expression)) {
22
+ return;
23
+ }
24
+ if (typeof path.listKey !== 'string') {
25
+ return;
26
+ }
27
+ // Splitting a leading string out of a sequence could create a directive.
28
+ const [first] = path.node.expression.expressions;
29
+ if (t.isStringLiteral(first) && isInDirectivePrologue(path)) {
30
+ return;
31
+ }
32
+ const statements = path.node.expression.expressions.map((expr) => t.expressionStatement(expr));
33
+ path.replaceWithMultiple(statements);
34
+ },
35
+ };
36
+ //# sourceMappingURL=split-sequence-expressions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split-sequence-expressions.js","sourceRoot":"","sources":["../../src/preparation/split-sequence-expressions.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AAEtC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAS;IAChD,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,OAAO,GAAG;IACd,mBAAmB,CAAC,IAAqC;QACvD,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAClD,OAAM;QACR,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAM;QACR,CAAC;QACD,yEAAyE;QACzE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAA;QAChD,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,OAAM;QACR,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9F,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAA;IACtC,CAAC;CACF,CAAA"}
@@ -0,0 +1,20 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Splits multi-declarator `var`/`let`/`const` into one declarator per statement,
4
+ * preserving the kind. Loop heads and exports stay intact because their parent
5
+ * slots do not accept several statements.
6
+ *
7
+ * @example
8
+ * // ◀️ before
9
+ * var a = 1, b = 2, c;
10
+ * let x = 1, y = 2;
11
+ *
12
+ * // ▶️ after
13
+ * var a = 1;
14
+ * var b = 2;
15
+ * var c;
16
+ * let x = 1;
17
+ * let y = 2;
18
+ */
19
+ export declare function splitVariableDeclarations(ast: File): void;
20
+ //# sourceMappingURL=split-variable-declarations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split-variable-declarations.d.ts","sourceRoot":"","sources":["../../src/preparation/split-variable-declarations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAEzD"}
@@ -0,0 +1,36 @@
1
+ import traverse from '@babel/traverse';
2
+ import * as t from '@babel/types';
3
+ /**
4
+ * Splits multi-declarator `var`/`let`/`const` into one declarator per statement,
5
+ * preserving the kind. Loop heads and exports stay intact because their parent
6
+ * slots do not accept several statements.
7
+ *
8
+ * @example
9
+ * // ◀️ before
10
+ * var a = 1, b = 2, c;
11
+ * let x = 1, y = 2;
12
+ *
13
+ * // ▶️ after
14
+ * var a = 1;
15
+ * var b = 2;
16
+ * var c;
17
+ * let x = 1;
18
+ * let y = 2;
19
+ */
20
+ export function splitVariableDeclarations(ast) {
21
+ traverse(ast, visitor);
22
+ }
23
+ const visitor = {
24
+ VariableDeclaration(path) {
25
+ if (typeof path.listKey !== 'string') {
26
+ return;
27
+ }
28
+ if (path.node.declarations.length <= 1) {
29
+ return;
30
+ }
31
+ const { kind } = path.node;
32
+ const replacements = path.node.declarations.map((decl) => t.variableDeclaration(kind, [decl]));
33
+ path.replaceWithMultiple(replacements);
34
+ },
35
+ };
36
+ //# sourceMappingURL=split-variable-declarations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split-variable-declarations.js","sourceRoot":"","sources":["../../src/preparation/split-variable-declarations.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AAEtC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAS;IACjD,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,OAAO,GAAG;IACd,mBAAmB,CAAC,IAAqC;QACvD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAM;QACR,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvC,OAAM;QACR,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;QAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC9F,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAA;IACxC,CAAC;CACF,CAAA"}
@@ -0,0 +1,21 @@
1
+ import type { File } from '@babel/types';
2
+ /**
3
+ * Rewrites property keys in object literals and classes as computed strings.
4
+ * Already-computed keys, private names, and class constructors stay unchanged.
5
+ * A method named `["constructor"]` is not a constructor and may be rewritten.
6
+ *
7
+ * The ECMA-262 B.3.1 `__proto__` setter form also stays unchanged.
8
+ * `{ __proto__: x }` sets `[[Prototype]]`, while `{ ["__proto__"]: x }` creates
9
+ * an own property.
10
+ *
11
+ * @example
12
+ * // ◀️ before
13
+ * const o = { foo: 1, bar() { return 2; }, [computed]: 3 };
14
+ * class A { m() {} static s() {} }
15
+ *
16
+ * // ▶️ after
17
+ * const o = { ["foo"]: 1, ["bar"]() { return 2; }, [computed]: 3 };
18
+ * class A { ["m"]() {} static ["s"]() {} }
19
+ */
20
+ export declare function stringifyObjectKeys(ast: File): void;
21
+ //# sourceMappingURL=stringify-object-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify-object-keys.d.ts","sourceRoot":"","sources":["../../src/preparation/stringify-object-keys.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAIxC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAEnD"}
@@ -0,0 +1,96 @@
1
+ import traverse from '@babel/traverse';
2
+ import * as t from '@babel/types';
3
+ import { isProtoKey } from '../utils/ast.js';
4
+ /**
5
+ * Rewrites property keys in object literals and classes as computed strings.
6
+ * Already-computed keys, private names, and class constructors stay unchanged.
7
+ * A method named `["constructor"]` is not a constructor and may be rewritten.
8
+ *
9
+ * The ECMA-262 B.3.1 `__proto__` setter form also stays unchanged.
10
+ * `{ __proto__: x }` sets `[[Prototype]]`, while `{ ["__proto__"]: x }` creates
11
+ * an own property.
12
+ *
13
+ * @example
14
+ * // ◀️ before
15
+ * const o = { foo: 1, bar() { return 2; }, [computed]: 3 };
16
+ * class A { m() {} static s() {} }
17
+ *
18
+ * // ▶️ after
19
+ * const o = { ["foo"]: 1, ["bar"]() { return 2; }, [computed]: 3 };
20
+ * class A { ["m"]() {} static ["s"]() {} }
21
+ */
22
+ export function stringifyObjectKeys(ast) {
23
+ traverse(ast, visitor);
24
+ }
25
+ const visitor = {
26
+ ObjectProperty(path) {
27
+ if (isProtoSetter(path.node) || keyOrderIsSpreadSensitive(path)) {
28
+ return;
29
+ }
30
+ if (stringifyKey(path.node)) {
31
+ path.node.shorthand = false;
32
+ }
33
+ },
34
+ ObjectMethod(path) {
35
+ if (keyOrderIsSpreadSensitive(path)) {
36
+ return;
37
+ }
38
+ stringifyKey(path.node);
39
+ },
40
+ ClassMethod(path) {
41
+ if (path.node.kind === 'constructor') {
42
+ return;
43
+ }
44
+ stringifyKey(path.node);
45
+ },
46
+ };
47
+ // With a spread present, V8 moves non-computed accessors after data properties
48
+ // but leaves computed accessors in place. Rewriting would reorder own keys.
49
+ function keyOrderIsSpreadSensitive(path) {
50
+ const object = path.parentPath;
51
+ if (!object || !object.isObjectExpression()) {
52
+ return false;
53
+ }
54
+ const { properties } = object.node;
55
+ const hasSpread = properties.some((prop) => t.isSpreadElement(prop));
56
+ if (!hasSpread) {
57
+ return false;
58
+ }
59
+ return properties.some((prop) => t.isObjectMethod(prop) && (prop.kind === 'get' || prop.kind === 'set') && !prop.computed);
60
+ }
61
+ function isProtoSetter(node) {
62
+ return !node.computed && !node.shorthand && isProtoKey(node.key);
63
+ }
64
+ function stringifyKey(node) {
65
+ if (node.computed) {
66
+ return false;
67
+ }
68
+ if (t.isPrivateName(node.key)) {
69
+ return false;
70
+ }
71
+ const stringKey = keyToString(node.key);
72
+ if (stringKey === null) {
73
+ return false;
74
+ }
75
+ // Babel 8 narrows keyed nodes by `computed`, so both fields need widening.
76
+ const rewritten = node;
77
+ rewritten.key = t.stringLiteral(stringKey);
78
+ rewritten.computed = true;
79
+ return true;
80
+ }
81
+ function keyToString(key) {
82
+ if (t.isIdentifier(key)) {
83
+ return key.name;
84
+ }
85
+ if (t.isStringLiteral(key)) {
86
+ return key.value;
87
+ }
88
+ if (t.isNumericLiteral(key)) {
89
+ return String(key.value);
90
+ }
91
+ if (t.isBigIntLiteral(key)) {
92
+ return key.value.toString();
93
+ }
94
+ return null;
95
+ }
96
+ //# sourceMappingURL=stringify-object-keys.js.map