tsc-ts 0.0.4 → 0.0.5

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 (584) hide show
  1. package/README.md +33 -1
  2. package/dist/api/compiler/ast-utilities.d.ts +82 -0
  3. package/dist/api/compiler/ast-utilities.js +462 -0
  4. package/dist/api/compiler/ast.d.ts +2350 -0
  5. package/dist/api/compiler/ast.js +11206 -0
  6. package/dist/api/compiler/astnav.d.ts +37 -0
  7. package/dist/api/compiler/astnav.js +767 -0
  8. package/dist/api/compiler/binder-utilities.d.ts +182 -0
  9. package/dist/api/compiler/binder-utilities.js +1240 -0
  10. package/dist/api/compiler/binder.d.ts +33 -0
  11. package/dist/api/compiler/binder.js +2358 -0
  12. package/dist/api/compiler/character-codes.d.ts +161 -0
  13. package/dist/api/compiler/character-codes.js +160 -0
  14. package/dist/api/compiler/checker-calls.d.ts +46 -0
  15. package/dist/api/compiler/checker-calls.js +1640 -0
  16. package/dist/api/compiler/checker-classes.d.ts +30 -0
  17. package/dist/api/compiler/checker-classes.js +582 -0
  18. package/dist/api/compiler/checker-contextual.d.ts +77 -0
  19. package/dist/api/compiler/checker-contextual.js +1136 -0
  20. package/dist/api/compiler/checker-declaration-order.d.ts +12 -0
  21. package/dist/api/compiler/checker-declaration-order.js +356 -0
  22. package/dist/api/compiler/checker-declarations.d.ts +33 -0
  23. package/dist/api/compiler/checker-declarations.js +888 -0
  24. package/dist/api/compiler/checker-declared-types.d.ts +48 -0
  25. package/dist/api/compiler/checker-declared-types.js +787 -0
  26. package/dist/api/compiler/checker-decorators.d.ts +26 -0
  27. package/dist/api/compiler/checker-decorators.js +562 -0
  28. package/dist/api/compiler/checker-deprecation.d.ts +33 -0
  29. package/dist/api/compiler/checker-deprecation.js +315 -0
  30. package/dist/api/compiler/checker-destructuring.d.ts +34 -0
  31. package/dist/api/compiler/checker-destructuring.js +584 -0
  32. package/dist/api/compiler/checker-elaboration.d.ts +15 -0
  33. package/dist/api/compiler/checker-elaboration.js +290 -0
  34. package/dist/api/compiler/checker-emit-helpers.d.ts +58 -0
  35. package/dist/api/compiler/checker-emit-helpers.js +154 -0
  36. package/dist/api/compiler/checker-emit-resolver.d.ts +75 -0
  37. package/dist/api/compiler/checker-emit-resolver.js +579 -0
  38. package/dist/api/compiler/checker-evaluator.d.ts +27 -0
  39. package/dist/api/compiler/checker-evaluator.js +188 -0
  40. package/dist/api/compiler/checker-expressions.d.ts +67 -0
  41. package/dist/api/compiler/checker-expressions.js +1351 -0
  42. package/dist/api/compiler/checker-features.d.ts +6 -0
  43. package/dist/api/compiler/checker-features.js +354 -0
  44. package/dist/api/compiler/checker-flow.d.ts +86 -0
  45. package/dist/api/compiler/checker-flow.js +169 -0
  46. package/dist/api/compiler/checker-functions.d.ts +43 -0
  47. package/dist/api/compiler/checker-functions.js +1002 -0
  48. package/dist/api/compiler/checker-generated-code.d.ts +25 -0
  49. package/dist/api/compiler/checker-generated-code.js +168 -0
  50. package/dist/api/compiler/checker-globals.d.ts +14 -0
  51. package/dist/api/compiler/checker-globals.js +37 -0
  52. package/dist/api/compiler/checker-grammar.d.ts +35 -0
  53. package/dist/api/compiler/checker-grammar.js +2573 -0
  54. package/dist/api/compiler/checker-heritage.d.ts +28 -0
  55. package/dist/api/compiler/checker-heritage.js +900 -0
  56. package/dist/api/compiler/checker-inference.d.ts +179 -0
  57. package/dist/api/compiler/checker-inference.js +2105 -0
  58. package/dist/api/compiler/checker-iteration.d.ts +115 -0
  59. package/dist/api/compiler/checker-iteration.js +857 -0
  60. package/dist/api/compiler/checker-javascript.d.ts +42 -0
  61. package/dist/api/compiler/checker-javascript.js +441 -0
  62. package/dist/api/compiler/checker-jsdoc.d.ts +30 -0
  63. package/dist/api/compiler/checker-jsdoc.js +320 -0
  64. package/dist/api/compiler/checker-jsx.d.ts +94 -0
  65. package/dist/api/compiler/checker-jsx.js +1433 -0
  66. package/dist/api/compiler/checker-literals.d.ts +6 -0
  67. package/dist/api/compiler/checker-literals.js +43 -0
  68. package/dist/api/compiler/checker-members.d.ts +198 -0
  69. package/dist/api/compiler/checker-members.js +2126 -0
  70. package/dist/api/compiler/checker-modules.d.ts +85 -0
  71. package/dist/api/compiler/checker-modules.js +2141 -0
  72. package/dist/api/compiler/checker-narrowing.d.ts +120 -0
  73. package/dist/api/compiler/checker-narrowing.js +2797 -0
  74. package/dist/api/compiler/checker-object-literals.d.ts +14 -0
  75. package/dist/api/compiler/checker-object-literals.js +479 -0
  76. package/dist/api/compiler/checker-operators.d.ts +33 -0
  77. package/dist/api/compiler/checker-operators.js +1040 -0
  78. package/dist/api/compiler/checker-overloads.d.ts +7 -0
  79. package/dist/api/compiler/checker-overloads.js +270 -0
  80. package/dist/api/compiler/checker-property-access.d.ts +34 -0
  81. package/dist/api/compiler/checker-property-access.js +672 -0
  82. package/dist/api/compiler/checker-services.d.ts +49 -0
  83. package/dist/api/compiler/checker-services.js +995 -0
  84. package/dist/api/compiler/checker-signatures.d.ts +55 -0
  85. package/dist/api/compiler/checker-signatures.js +788 -0
  86. package/dist/api/compiler/checker-source-file.d.ts +27 -0
  87. package/dist/api/compiler/checker-source-file.js +619 -0
  88. package/dist/api/compiler/checker-statements.d.ts +18 -0
  89. package/dist/api/compiler/checker-statements.js +226 -0
  90. package/dist/api/compiler/checker-super.d.ts +13 -0
  91. package/dist/api/compiler/checker-super.js +241 -0
  92. package/dist/api/compiler/checker-symbol-types.d.ts +67 -0
  93. package/dist/api/compiler/checker-symbol-types.js +1885 -0
  94. package/dist/api/compiler/checker-symbols.d.ts +181 -0
  95. package/dist/api/compiler/checker-symbols.js +1782 -0
  96. package/dist/api/compiler/checker-type-factory.d.ts +142 -0
  97. package/dist/api/compiler/checker-type-factory.js +2501 -0
  98. package/dist/api/compiler/checker-type-nodes.d.ts +26 -0
  99. package/dist/api/compiler/checker-type-nodes.js +828 -0
  100. package/dist/api/compiler/checker-type-operators.d.ts +109 -0
  101. package/dist/api/compiler/checker-type-operators.js +1842 -0
  102. package/dist/api/compiler/checker-types.d.ts +1027 -0
  103. package/dist/api/compiler/checker-types.js +1697 -0
  104. package/dist/api/compiler/checker-unused.d.ts +19 -0
  105. package/dist/api/compiler/checker-unused.js +524 -0
  106. package/dist/api/compiler/checker-utilities.d.ts +33 -0
  107. package/dist/api/compiler/checker-utilities.js +141 -0
  108. package/dist/api/compiler/checker.d.ts +491 -0
  109. package/dist/api/compiler/checker.js +912 -0
  110. package/dist/api/compiler/command-line.d.ts +32 -0
  111. package/dist/api/compiler/command-line.js +383 -0
  112. package/dist/api/compiler/compile-program.d.ts +118 -0
  113. package/dist/api/compiler/compile-program.js +384 -0
  114. package/dist/api/compiler/diagnostic-locales.d.ts +22 -0
  115. package/dist/api/compiler/diagnostic-locales.js +64 -0
  116. package/dist/api/compiler/diagnostic-messages.d.ts +2166 -0
  117. package/dist/api/compiler/diagnostic-messages.js +184 -0
  118. package/dist/api/compiler/diagnostics.d.ts +167 -0
  119. package/dist/api/compiler/diagnostics.js +820 -0
  120. package/dist/api/compiler/emitter.d.ts +71 -0
  121. package/dist/api/compiler/emitter.js +327 -0
  122. package/dist/api/compiler/file-include.d.ts +117 -0
  123. package/dist/api/compiler/file-include.js +536 -0
  124. package/dist/api/compiler/file-loader.d.ts +261 -0
  125. package/dist/api/compiler/file-loader.js +1257 -0
  126. package/dist/api/compiler/file-system.d.ts +51 -0
  127. package/dist/api/compiler/file-system.js +132 -0
  128. package/dist/api/compiler/flow.d.ts +60 -0
  129. package/dist/api/compiler/flow.js +45 -0
  130. package/dist/api/compiler/instantiation.d.ts +74 -0
  131. package/dist/api/compiler/instantiation.js +799 -0
  132. package/dist/api/compiler/jsdoc.d.ts +75 -0
  133. package/dist/api/compiler/jsdoc.js +1229 -0
  134. package/dist/api/compiler/link-tables.d.ts +36 -0
  135. package/dist/api/compiler/link-tables.js +83 -0
  136. package/dist/api/compiler/locale-data.d.ts +24 -0
  137. package/dist/api/compiler/locale-data.js +183 -0
  138. package/dist/api/compiler/locale.d.ts +4 -0
  139. package/dist/api/compiler/locale.js +317 -0
  140. package/dist/api/compiler/locales/cs-CZ.d.ts +2 -0
  141. package/dist/api/compiler/locales/cs-CZ.js +3 -0
  142. package/dist/api/compiler/locales/de-DE.d.ts +2 -0
  143. package/dist/api/compiler/locales/de-DE.js +3 -0
  144. package/dist/api/compiler/locales/es-ES.d.ts +2 -0
  145. package/dist/api/compiler/locales/es-ES.js +3 -0
  146. package/dist/api/compiler/locales/fr-FR.d.ts +2 -0
  147. package/dist/api/compiler/locales/fr-FR.js +3 -0
  148. package/dist/api/compiler/locales/it-IT.d.ts +2 -0
  149. package/dist/api/compiler/locales/it-IT.js +3 -0
  150. package/dist/api/compiler/locales/ja-JP.d.ts +2 -0
  151. package/dist/api/compiler/locales/ja-JP.js +3 -0
  152. package/dist/api/compiler/locales/ko-KR.d.ts +2 -0
  153. package/dist/api/compiler/locales/ko-KR.js +3 -0
  154. package/dist/api/compiler/locales/pl-PL.d.ts +2 -0
  155. package/dist/api/compiler/locales/pl-PL.js +3 -0
  156. package/dist/api/compiler/locales/pt-BR.d.ts +2 -0
  157. package/dist/api/compiler/locales/pt-BR.js +3 -0
  158. package/dist/api/compiler/locales/ru-RU.d.ts +2 -0
  159. package/dist/api/compiler/locales/ru-RU.js +3 -0
  160. package/dist/api/compiler/locales/tr-TR.d.ts +2 -0
  161. package/dist/api/compiler/locales/tr-TR.js +3 -0
  162. package/dist/api/compiler/locales/zh-CN.d.ts +2 -0
  163. package/dist/api/compiler/locales/zh-CN.js +3 -0
  164. package/dist/api/compiler/locales/zh-TW.d.ts +2 -0
  165. package/dist/api/compiler/locales/zh-TW.js +3 -0
  166. package/dist/api/compiler/module-resolution-types.d.ts +83 -0
  167. package/dist/api/compiler/module-resolution-types.js +176 -0
  168. package/dist/api/compiler/module-resolution.d.ts +71 -0
  169. package/dist/api/compiler/module-resolution.js +1598 -0
  170. package/dist/api/compiler/module-specifiers.d.ts +64 -0
  171. package/dist/api/compiler/module-specifiers.js +1101 -0
  172. package/dist/api/compiler/name-resolver.d.ts +43 -0
  173. package/dist/api/compiler/name-resolver.js +509 -0
  174. package/dist/api/compiler/node-builder-names.d.ts +32 -0
  175. package/dist/api/compiler/node-builder-names.js +854 -0
  176. package/dist/api/compiler/node-builder-pseudo.d.ts +36 -0
  177. package/dist/api/compiler/node-builder-pseudo.js +744 -0
  178. package/dist/api/compiler/node-builder-reuse.d.ts +4 -0
  179. package/dist/api/compiler/node-builder-reuse.js +647 -0
  180. package/dist/api/compiler/node-builder.d.ts +270 -0
  181. package/dist/api/compiler/node-builder.js +2645 -0
  182. package/dist/api/compiler/option-declarations.d.ts +90 -0
  183. package/dist/api/compiler/option-declarations.js +1460 -0
  184. package/dist/api/compiler/options.d.ts +289 -0
  185. package/dist/api/compiler/options.js +1197 -0
  186. package/dist/api/compiler/output-paths.d.ts +42 -0
  187. package/dist/api/compiler/output-paths.js +195 -0
  188. package/dist/api/compiler/package-json.d.ts +175 -0
  189. package/dist/api/compiler/package-json.js +1015 -0
  190. package/dist/api/compiler/parallel-parse.d.ts +219 -0
  191. package/dist/api/compiler/parallel-parse.js +537 -0
  192. package/dist/api/compiler/parser.d.ts +587 -0
  193. package/dist/api/compiler/parser.js +6407 -0
  194. package/dist/api/compiler/path.d.ts +91 -0
  195. package/dist/api/compiler/path.js +705 -0
  196. package/dist/api/compiler/printer/async-helpers.d.ts +22 -0
  197. package/dist/api/compiler/printer/async-helpers.js +91 -0
  198. package/dist/api/compiler/printer/auto-generate.d.ts +13 -0
  199. package/dist/api/compiler/printer/auto-generate.js +20 -0
  200. package/dist/api/compiler/printer/decorator-helpers.d.ts +24 -0
  201. package/dist/api/compiler/printer/decorator-helpers.js +118 -0
  202. package/dist/api/compiler/printer/emit-context.d.ts +154 -0
  203. package/dist/api/compiler/printer/emit-context.js +576 -0
  204. package/dist/api/compiler/printer/emit-flags.d.ts +60 -0
  205. package/dist/api/compiler/printer/emit-flags.js +2 -0
  206. package/dist/api/compiler/printer/factory-base.d.ts +171 -0
  207. package/dist/api/compiler/printer/factory-base.js +1505 -0
  208. package/dist/api/compiler/printer/factory.d.ts +147 -0
  209. package/dist/api/compiler/printer/factory.js +542 -0
  210. package/dist/api/compiler/printer/helpers.d.ts +27 -0
  211. package/dist/api/compiler/printer/helpers.js +164 -0
  212. package/dist/api/compiler/printer/name-generator.d.ts +41 -0
  213. package/dist/api/compiler/printer/name-generator.js +283 -0
  214. package/dist/api/compiler/printer/printer.d.ts +411 -0
  215. package/dist/api/compiler/printer/printer.js +4517 -0
  216. package/dist/api/compiler/printer/text-writer.d.ts +46 -0
  217. package/dist/api/compiler/printer/text-writer.js +172 -0
  218. package/dist/api/compiler/printer/utilities.d.ts +82 -0
  219. package/dist/api/compiler/printer/utilities.js +817 -0
  220. package/dist/api/compiler/program-checker.d.ts +156 -0
  221. package/dist/api/compiler/program-checker.js +526 -0
  222. package/dist/api/compiler/program-utilities.d.ts +52 -0
  223. package/dist/api/compiler/program-utilities.js +365 -0
  224. package/dist/api/compiler/program.d.ts +180 -0
  225. package/dist/api/compiler/program.js +1011 -0
  226. package/dist/api/compiler/pseudo-bigint.d.ts +5 -0
  227. package/dist/api/compiler/pseudo-bigint.js +61 -0
  228. package/dist/api/compiler/regexp-checker.d.ts +38 -0
  229. package/dist/api/compiler/regexp-checker.js +942 -0
  230. package/dist/api/compiler/relations.d.ts +263 -0
  231. package/dist/api/compiler/relations.js +4002 -0
  232. package/dist/api/compiler/reparser.d.ts +48 -0
  233. package/dist/api/compiler/reparser.js +1323 -0
  234. package/dist/api/compiler/scanner.d.ts +256 -0
  235. package/dist/api/compiler/scanner.js +2853 -0
  236. package/dist/api/compiler/side-state.d.ts +16 -0
  237. package/dist/api/compiler/side-state.js +89 -0
  238. package/dist/api/compiler/sourcemap.d.ts +55 -0
  239. package/dist/api/compiler/sourcemap.js +340 -0
  240. package/dist/api/compiler/spelling.d.ts +14 -0
  241. package/dist/api/compiler/spelling.js +128 -0
  242. package/dist/api/compiler/symbol-accessibility.d.ts +57 -0
  243. package/dist/api/compiler/symbol-accessibility.js +894 -0
  244. package/dist/api/compiler/symbol.d.ts +240 -0
  245. package/dist/api/compiler/symbol.js +228 -0
  246. package/dist/api/compiler/symlinks.d.ts +32 -0
  247. package/dist/api/compiler/symlinks.js +114 -0
  248. package/dist/api/compiler/syntax-kind.d.ts +389 -0
  249. package/dist/api/compiler/syntax-kind.js +2 -0
  250. package/dist/api/compiler/timeline.d.ts +9 -0
  251. package/dist/api/compiler/timeline.js +54 -0
  252. package/dist/api/compiler/transformers/alias-references.d.ts +39 -0
  253. package/dist/api/compiler/transformers/alias-references.js +676 -0
  254. package/dist/api/compiler/transformers/async-utilities.d.ts +51 -0
  255. package/dist/api/compiler/transformers/async-utilities.js +260 -0
  256. package/dist/api/compiler/transformers/async.d.ts +53 -0
  257. package/dist/api/compiler/transformers/async.js +645 -0
  258. package/dist/api/compiler/transformers/class-fields.d.ts +206 -0
  259. package/dist/api/compiler/transformers/class-fields.js +2418 -0
  260. package/dist/api/compiler/transformers/class-utilities.d.ts +46 -0
  261. package/dist/api/compiler/transformers/class-utilities.js +261 -0
  262. package/dist/api/compiler/transformers/commonjs-module.d.ts +103 -0
  263. package/dist/api/compiler/transformers/commonjs-module.js +1180 -0
  264. package/dist/api/compiler/transformers/const-enum-inliner.d.ts +11 -0
  265. package/dist/api/compiler/transformers/const-enum-inliner.js +36 -0
  266. package/dist/api/compiler/transformers/declarations-diagnostics.d.ts +52 -0
  267. package/dist/api/compiler/transformers/declarations-diagnostics.js +538 -0
  268. package/dist/api/compiler/transformers/declarations-pseudo.d.ts +160 -0
  269. package/dist/api/compiler/transformers/declarations-pseudo.js +797 -0
  270. package/dist/api/compiler/transformers/declarations-resolver.d.ts +152 -0
  271. package/dist/api/compiler/transformers/declarations-resolver.js +35 -0
  272. package/dist/api/compiler/transformers/declarations-syntactic.d.ts +119 -0
  273. package/dist/api/compiler/transformers/declarations-syntactic.js +1582 -0
  274. package/dist/api/compiler/transformers/declarations-tracker.d.ts +46 -0
  275. package/dist/api/compiler/transformers/declarations-tracker.js +197 -0
  276. package/dist/api/compiler/transformers/declarations.d.ts +175 -0
  277. package/dist/api/compiler/transformers/declarations.js +2380 -0
  278. package/dist/api/compiler/transformers/decorator-metadata.d.ts +54 -0
  279. package/dist/api/compiler/transformers/decorator-metadata.js +554 -0
  280. package/dist/api/compiler/transformers/decorator-utilities.d.ts +38 -0
  281. package/dist/api/compiler/transformers/decorator-utilities.js +238 -0
  282. package/dist/api/compiler/transformers/destructuring.d.ts +25 -0
  283. package/dist/api/compiler/transformers/destructuring.js +626 -0
  284. package/dist/api/compiler/transformers/downlevel.d.ts +6 -0
  285. package/dist/api/compiler/transformers/downlevel.js +45 -0
  286. package/dist/api/compiler/transformers/emit-resolver.d.ts +61 -0
  287. package/dist/api/compiler/transformers/emit-resolver.js +197 -0
  288. package/dist/api/compiler/transformers/es-decorators.d.ts +118 -0
  289. package/dist/api/compiler/transformers/es-decorators.js +1901 -0
  290. package/dist/api/compiler/transformers/exponentiation.d.ts +11 -0
  291. package/dist/api/compiler/transformers/exponentiation.js +76 -0
  292. package/dist/api/compiler/transformers/external-module-info.d.ts +35 -0
  293. package/dist/api/compiler/transformers/external-module-info.js +351 -0
  294. package/dist/api/compiler/transformers/for-await.d.ts +43 -0
  295. package/dist/api/compiler/transformers/for-await.js +469 -0
  296. package/dist/api/compiler/transformers/import-elision.d.ts +16 -0
  297. package/dist/api/compiler/transformers/import-elision.js +124 -0
  298. package/dist/api/compiler/transformers/jsx-entities.d.ts +1 -0
  299. package/dist/api/compiler/transformers/jsx-entities.js +256 -0
  300. package/dist/api/compiler/transformers/jsx.d.ts +71 -0
  301. package/dist/api/compiler/transformers/jsx.js +700 -0
  302. package/dist/api/compiler/transformers/legacy-decorators.d.ts +56 -0
  303. package/dist/api/compiler/transformers/legacy-decorators.js +564 -0
  304. package/dist/api/compiler/transformers/logical-assignment.d.ts +14 -0
  305. package/dist/api/compiler/transformers/logical-assignment.js +62 -0
  306. package/dist/api/compiler/transformers/module-utilities.d.ts +9 -0
  307. package/dist/api/compiler/transformers/module-utilities.js +36 -0
  308. package/dist/api/compiler/transformers/module.d.ts +49 -0
  309. package/dist/api/compiler/transformers/module.js +296 -0
  310. package/dist/api/compiler/transformers/named-evaluation.d.ts +26 -0
  311. package/dist/api/compiler/transformers/named-evaluation.js +266 -0
  312. package/dist/api/compiler/transformers/nullish-coalescing.d.ts +9 -0
  313. package/dist/api/compiler/transformers/nullish-coalescing.js +26 -0
  314. package/dist/api/compiler/transformers/object-rest-spread.d.ts +34 -0
  315. package/dist/api/compiler/transformers/object-rest-spread.js +411 -0
  316. package/dist/api/compiler/transformers/optional-catch.d.ts +9 -0
  317. package/dist/api/compiler/transformers/optional-catch.js +20 -0
  318. package/dist/api/compiler/transformers/optional-chain.d.ts +14 -0
  319. package/dist/api/compiler/transformers/optional-chain.js +188 -0
  320. package/dist/api/compiler/transformers/reference-resolver.d.ts +128 -0
  321. package/dist/api/compiler/transformers/reference-resolver.js +1155 -0
  322. package/dist/api/compiler/transformers/runtime-syntax.d.ts +71 -0
  323. package/dist/api/compiler/transformers/runtime-syntax.js +753 -0
  324. package/dist/api/compiler/transformers/subtree-facts.d.ts +9 -0
  325. package/dist/api/compiler/transformers/subtree-facts.js +203 -0
  326. package/dist/api/compiler/transformers/syntax-facts.d.ts +51 -0
  327. package/dist/api/compiler/transformers/syntax-facts.js +254 -0
  328. package/dist/api/compiler/transformers/tagged-template.d.ts +17 -0
  329. package/dist/api/compiler/transformers/tagged-template.js +148 -0
  330. package/dist/api/compiler/transformers/transformer.d.ts +17 -0
  331. package/dist/api/compiler/transformers/transformer.js +54 -0
  332. package/dist/api/compiler/transformers/type-eraser.d.ts +21 -0
  333. package/dist/api/compiler/transformers/type-eraser.js +346 -0
  334. package/dist/api/compiler/transformers/type-serialization.d.ts +20 -0
  335. package/dist/api/compiler/transformers/type-serialization.js +347 -0
  336. package/dist/api/compiler/transformers/using.d.ts +56 -0
  337. package/dist/api/compiler/transformers/using.js +453 -0
  338. package/dist/api/compiler/transformers/utilities.d.ts +50 -0
  339. package/dist/api/compiler/transformers/utilities.js +347 -0
  340. package/dist/api/compiler/transformers/visitor-base.d.ts +6 -0
  341. package/dist/api/compiler/transformers/visitor-base.js +817 -0
  342. package/dist/api/compiler/transformers/visitor-hooks.d.ts +29 -0
  343. package/dist/api/compiler/transformers/visitor-hooks.js +189 -0
  344. package/dist/api/compiler/tsconfig.d.ts +177 -0
  345. package/dist/api/compiler/tsconfig.js +1311 -0
  346. package/dist/api/compiler/type-printer.d.ts +15 -0
  347. package/dist/api/compiler/type-printer.js +74 -0
  348. package/dist/api/compiler/types.d.ts +87 -0
  349. package/dist/api/compiler/types.js +23 -0
  350. package/dist/api/compiler/unicode-identifiers.d.ts +2 -0
  351. package/dist/api/compiler/unicode-identifiers.js +209 -0
  352. package/dist/api/compiler/unicode-properties.d.ts +8 -0
  353. package/dist/api/compiler/unicode-properties.js +531 -0
  354. package/dist/api/compiler/vfs-match.d.ts +24 -0
  355. package/dist/api/compiler/vfs-match.js +587 -0
  356. package/dist/api/library/ast.d.ts +3 -2
  357. package/dist/api/library/ast.generated.d.ts +127 -139
  358. package/dist/api/library/checker.d.ts +51 -0
  359. package/dist/api/library/checker.js +318 -0
  360. package/dist/api/library/diagnostics.d.ts +13 -0
  361. package/dist/api/library/diagnostics.js +50 -0
  362. package/dist/api/library/disk.d.ts +13 -0
  363. package/dist/api/library/disk.js +66 -0
  364. package/dist/api/library/errors.d.ts +13 -0
  365. package/dist/api/library/errors.js +24 -0
  366. package/dist/api/library/host.d.ts +24 -0
  367. package/dist/api/library/host.js +52 -0
  368. package/dist/api/library/index.d.ts +5 -1
  369. package/dist/api/library/index.js +4 -0
  370. package/dist/api/library/nodes.d.ts +51 -0
  371. package/dist/api/library/nodes.js +196 -0
  372. package/dist/api/library/options.d.ts +144 -0
  373. package/dist/api/library/options.js +308 -0
  374. package/dist/api/library/parse.d.ts +19 -0
  375. package/dist/api/library/parse.js +41 -0
  376. package/dist/api/library/program.d.ts +21 -0
  377. package/dist/api/library/program.js +234 -0
  378. package/dist/api/library/types.d.ts +14 -1
  379. package/package.json +12 -8
  380. package/src/compiler/ast-utilities.ts +548 -0
  381. package/src/compiler/ast.ts +12862 -0
  382. package/src/compiler/astnav.ts +799 -0
  383. package/src/compiler/binder-utilities.ts +1392 -0
  384. package/src/compiler/binder.ts +2703 -0
  385. package/src/compiler/build-info.ts +1197 -0
  386. package/src/compiler/character-codes.ts +323 -0
  387. package/src/compiler/checker-calls.ts +2155 -0
  388. package/src/compiler/checker-classes.ts +706 -0
  389. package/src/compiler/checker-contextual.ts +1457 -0
  390. package/src/compiler/checker-declaration-order.ts +438 -0
  391. package/src/compiler/checker-declarations.ts +1194 -0
  392. package/src/compiler/checker-declared-types.ts +919 -0
  393. package/src/compiler/checker-decorators.ts +694 -0
  394. package/src/compiler/checker-deprecation.ts +359 -0
  395. package/src/compiler/checker-destructuring.ts +805 -0
  396. package/src/compiler/checker-elaboration.ts +477 -0
  397. package/src/compiler/checker-emit-helpers.ts +224 -0
  398. package/src/compiler/checker-emit-resolver.ts +769 -0
  399. package/src/compiler/checker-evaluator.ts +243 -0
  400. package/src/compiler/checker-expressions.ts +1831 -0
  401. package/src/compiler/checker-features.ts +361 -0
  402. package/src/compiler/checker-flow.ts +394 -0
  403. package/src/compiler/checker-functions.ts +1296 -0
  404. package/src/compiler/checker-generated-code.ts +227 -0
  405. package/src/compiler/checker-globals.ts +52 -0
  406. package/src/compiler/checker-grammar.ts +3584 -0
  407. package/src/compiler/checker-heritage.ts +1233 -0
  408. package/src/compiler/checker-inference.ts +2576 -0
  409. package/src/compiler/checker-iteration.ts +1206 -0
  410. package/src/compiler/checker-javascript.ts +502 -0
  411. package/src/compiler/checker-jsdoc.ts +360 -0
  412. package/src/compiler/checker-jsx.ts +1924 -0
  413. package/src/compiler/checker-literals.ts +61 -0
  414. package/src/compiler/checker-members.ts +2436 -0
  415. package/src/compiler/checker-modules.ts +2886 -0
  416. package/src/compiler/checker-narrowing.ts +3230 -0
  417. package/src/compiler/checker-object-literals.ts +575 -0
  418. package/src/compiler/checker-operators.ts +1422 -0
  419. package/src/compiler/checker-overloads.ts +328 -0
  420. package/src/compiler/checker-property-access.ts +906 -0
  421. package/src/compiler/checker-services.ts +1149 -0
  422. package/src/compiler/checker-signatures.ts +1032 -0
  423. package/src/compiler/checker-source-file.ts +732 -0
  424. package/src/compiler/checker-statements.ts +292 -0
  425. package/src/compiler/checker-super.ts +261 -0
  426. package/src/compiler/checker-symbol-types.ts +2107 -0
  427. package/src/compiler/checker-symbols.ts +2150 -0
  428. package/src/compiler/checker-type-factory.ts +2579 -0
  429. package/src/compiler/checker-type-nodes.ts +1033 -0
  430. package/src/compiler/checker-type-operators.ts +2502 -0
  431. package/src/compiler/checker-types.ts +2340 -0
  432. package/src/compiler/checker-unused.ts +642 -0
  433. package/src/compiler/checker-utilities.ts +161 -0
  434. package/src/compiler/checker.ts +1116 -0
  435. package/src/compiler/command-line.ts +436 -0
  436. package/src/compiler/compile-program.ts +439 -0
  437. package/src/compiler/decoder.ts +1209 -0
  438. package/src/compiler/diagnostic-locales.ts +86 -0
  439. package/src/compiler/diagnostic-messages.ts +2349 -0
  440. package/src/compiler/diagnostics.ts +897 -0
  441. package/src/compiler/emitter.ts +434 -0
  442. package/src/compiler/encoder.ts +1945 -0
  443. package/src/compiler/file-include.ts +673 -0
  444. package/src/compiler/file-loader.ts +1528 -0
  445. package/src/compiler/file-system.ts +143 -0
  446. package/src/compiler/flow.ts +89 -0
  447. package/src/compiler/help.ts +473 -0
  448. package/src/compiler/incremental.ts +2784 -0
  449. package/src/compiler/init.ts +141 -0
  450. package/src/compiler/instantiation.ts +894 -0
  451. package/src/compiler/jsdoc.ts +1386 -0
  452. package/src/compiler/link-tables.ts +98 -0
  453. package/src/compiler/locale-data.ts +203 -0
  454. package/src/compiler/locale.ts +307 -0
  455. package/src/compiler/locales/cs-CZ.ts +5 -0
  456. package/src/compiler/locales/de-DE.ts +5 -0
  457. package/src/compiler/locales/es-ES.ts +5 -0
  458. package/src/compiler/locales/fr-FR.ts +5 -0
  459. package/src/compiler/locales/it-IT.ts +5 -0
  460. package/src/compiler/locales/ja-JP.ts +5 -0
  461. package/src/compiler/locales/ko-KR.ts +5 -0
  462. package/src/compiler/locales/pl-PL.ts +5 -0
  463. package/src/compiler/locales/pt-BR.ts +5 -0
  464. package/src/compiler/locales/ru-RU.ts +5 -0
  465. package/src/compiler/locales/tr-TR.ts +5 -0
  466. package/src/compiler/locales/zh-CN.ts +5 -0
  467. package/src/compiler/locales/zh-TW.ts +5 -0
  468. package/src/compiler/module-resolution-types.ts +243 -0
  469. package/src/compiler/module-resolution.ts +2072 -0
  470. package/src/compiler/module-specifiers.ts +1491 -0
  471. package/src/compiler/name-resolver.ts +646 -0
  472. package/src/compiler/node-builder-names.ts +1069 -0
  473. package/src/compiler/node-builder-pseudo.ts +892 -0
  474. package/src/compiler/node-builder-reuse.ts +764 -0
  475. package/src/compiler/node-builder.ts +3425 -0
  476. package/src/compiler/option-declarations.ts +1560 -0
  477. package/src/compiler/options.ts +1576 -0
  478. package/src/compiler/output-paths.ts +334 -0
  479. package/src/compiler/package-json.ts +1083 -0
  480. package/src/compiler/parallel-check.ts +1951 -0
  481. package/src/compiler/parallel-parse.ts +590 -0
  482. package/src/compiler/parse-thread.ts +140 -0
  483. package/src/compiler/parser.ts +7716 -0
  484. package/src/compiler/path.ts +717 -0
  485. package/src/compiler/printer/async-helpers.ts +183 -0
  486. package/src/compiler/printer/auto-generate.ts +27 -0
  487. package/src/compiler/printer/decorator-helpers.ts +218 -0
  488. package/src/compiler/printer/emit-context.ts +679 -0
  489. package/src/compiler/printer/emit-flags.ts +64 -0
  490. package/src/compiler/printer/factory-base.ts +2577 -0
  491. package/src/compiler/printer/factory.ts +764 -0
  492. package/src/compiler/printer/helpers.ts +291 -0
  493. package/src/compiler/printer/name-generator.ts +372 -0
  494. package/src/compiler/printer/printer.ts +5072 -0
  495. package/src/compiler/printer/text-writer.ts +183 -0
  496. package/src/compiler/printer/utilities.ts +884 -0
  497. package/src/compiler/program-checker.ts +592 -0
  498. package/src/compiler/program-utilities.ts +435 -0
  499. package/src/compiler/program.ts +1419 -0
  500. package/src/compiler/pseudo-bigint.ts +62 -0
  501. package/src/compiler/regexp-checker.ts +1142 -0
  502. package/src/compiler/relations.ts +5149 -0
  503. package/src/compiler/reparser.ts +1566 -0
  504. package/src/compiler/scanner.ts +2951 -0
  505. package/src/compiler/show-config.ts +239 -0
  506. package/src/compiler/side-state.ts +125 -0
  507. package/src/compiler/sourcemap.ts +366 -0
  508. package/src/compiler/spelling.ts +122 -0
  509. package/src/compiler/symbol-accessibility.ts +1071 -0
  510. package/src/compiler/symbol.ts +439 -0
  511. package/src/compiler/symlinks.ts +137 -0
  512. package/src/compiler/syntax-kind.ts +391 -0
  513. package/src/compiler/thread-entry.ts +191 -0
  514. package/src/compiler/timeline.ts +53 -0
  515. package/src/compiler/transformers/alias-references.ts +757 -0
  516. package/src/compiler/transformers/async-utilities.ts +335 -0
  517. package/src/compiler/transformers/async.ts +838 -0
  518. package/src/compiler/transformers/class-fields.ts +2967 -0
  519. package/src/compiler/transformers/class-utilities.ts +324 -0
  520. package/src/compiler/transformers/commonjs-module.ts +1621 -0
  521. package/src/compiler/transformers/const-enum-inliner.ts +50 -0
  522. package/src/compiler/transformers/declarations-diagnostics.ts +832 -0
  523. package/src/compiler/transformers/declarations-pseudo.ts +966 -0
  524. package/src/compiler/transformers/declarations-resolver.ts +249 -0
  525. package/src/compiler/transformers/declarations-syntactic.ts +1859 -0
  526. package/src/compiler/transformers/declarations-tracker.ts +269 -0
  527. package/src/compiler/transformers/declarations.ts +3120 -0
  528. package/src/compiler/transformers/decorator-metadata.ts +697 -0
  529. package/src/compiler/transformers/decorator-utilities.ts +283 -0
  530. package/src/compiler/transformers/destructuring.ts +708 -0
  531. package/src/compiler/transformers/downlevel.ts +50 -0
  532. package/src/compiler/transformers/emit-resolver.ts +258 -0
  533. package/src/compiler/transformers/es-decorators.ts +2682 -0
  534. package/src/compiler/transformers/exponentiation.ts +80 -0
  535. package/src/compiler/transformers/external-module-info.ts +412 -0
  536. package/src/compiler/transformers/for-await.ts +687 -0
  537. package/src/compiler/transformers/import-elision.ts +152 -0
  538. package/src/compiler/transformers/jsx-entities.ts +256 -0
  539. package/src/compiler/transformers/jsx.ts +824 -0
  540. package/src/compiler/transformers/legacy-decorators.ts +726 -0
  541. package/src/compiler/transformers/logical-assignment.ts +75 -0
  542. package/src/compiler/transformers/module-utilities.ts +42 -0
  543. package/src/compiler/transformers/module.ts +474 -0
  544. package/src/compiler/transformers/named-evaluation.ts +389 -0
  545. package/src/compiler/transformers/nullish-coalescing.ts +35 -0
  546. package/src/compiler/transformers/object-rest-spread.ts +577 -0
  547. package/src/compiler/transformers/optional-catch.ts +29 -0
  548. package/src/compiler/transformers/optional-chain.ts +246 -0
  549. package/src/compiler/transformers/reference-resolver.ts +1201 -0
  550. package/src/compiler/transformers/runtime-syntax.ts +942 -0
  551. package/src/compiler/transformers/subtree-facts.ts +245 -0
  552. package/src/compiler/transformers/syntax-facts.ts +353 -0
  553. package/src/compiler/transformers/tagged-template.ts +167 -0
  554. package/src/compiler/transformers/transformer.ts +56 -0
  555. package/src/compiler/transformers/type-eraser.ts +520 -0
  556. package/src/compiler/transformers/type-serialization.ts +374 -0
  557. package/src/compiler/transformers/using.ts +613 -0
  558. package/src/compiler/transformers/utilities.ts +419 -0
  559. package/src/compiler/transformers/visitor-base.ts +1601 -0
  560. package/src/compiler/transformers/visitor-hooks.ts +252 -0
  561. package/src/compiler/tsc-build.ts +1418 -0
  562. package/src/compiler/tsc-cli.ts +666 -0
  563. package/src/compiler/tsc-compile.ts +437 -0
  564. package/src/compiler/tsc-watch.ts +854 -0
  565. package/src/compiler/tsconfig.ts +1574 -0
  566. package/src/compiler/type-printer.ts +110 -0
  567. package/src/compiler/types.ts +115 -0
  568. package/src/compiler/unicode-identifiers.ts +212 -0
  569. package/src/compiler/unicode-properties.ts +537 -0
  570. package/src/compiler/vfs-match.ts +597 -0
  571. package/src/compiler/xxh3.ts +650 -0
  572. package/src/library/ast.generated.ts +141 -167
  573. package/src/library/ast.ts +4 -1
  574. package/src/library/checker.ts +384 -0
  575. package/src/library/diagnostics.ts +72 -0
  576. package/src/library/disk.ts +73 -0
  577. package/src/library/errors.ts +26 -0
  578. package/src/library/host.ts +63 -0
  579. package/src/library/index.ts +21 -0
  580. package/src/library/nodes.ts +232 -0
  581. package/src/library/options.ts +449 -0
  582. package/src/library/parse.ts +63 -0
  583. package/src/library/program.ts +293 -0
  584. package/src/library/types.ts +14 -1
@@ -0,0 +1,1621 @@
1
+ // CommonJS module output: imports become `require` calls, exports assignments to `exports`.
2
+ import {
3
+ ArrowFunction,
4
+ BinaryExpression,
5
+ BindingPattern,
6
+ Block,
7
+ CallExpression,
8
+ CaseBlock,
9
+ CaseOrDefaultClause,
10
+ CatchClause,
11
+ ClassDeclaration,
12
+ ClassExpression,
13
+ DoStatement,
14
+ ExportAssignment,
15
+ ExportDeclaration,
16
+ ExportSpecifier,
17
+ ExpressionStatement,
18
+ ExternalModuleReference,
19
+ ForInOrOfStatement,
20
+ ForStatement,
21
+ FunctionDeclaration,
22
+ FunctionExpression,
23
+ Identifier,
24
+ IfStatement,
25
+ ImportClause,
26
+ ImportDeclaration,
27
+ ImportEqualsDeclaration,
28
+ ImportSpecifier,
29
+ LabeledStatement,
30
+ ModifierFlags,
31
+ NamedExports,
32
+ NamespaceExport,
33
+ type Node,
34
+ NodeFlags,
35
+ NodeList,
36
+ NodeVisitor,
37
+ ObjectLiteralExpression,
38
+ ArrayLiteralExpression,
39
+ ParenthesizedExpression,
40
+ PartiallyEmittedExpression,
41
+ PostfixUnaryExpression,
42
+ PrefixUnaryExpression,
43
+ PropertyAssignment,
44
+ ShorthandPropertyAssignment,
45
+ SourceFile,
46
+ SpreadAssignment,
47
+ SpreadElement,
48
+ StringLiteral,
49
+ SwitchStatement,
50
+ TaggedTemplateExpression,
51
+ TemplateExpression,
52
+ TemplateHead,
53
+ TemplateSpan,
54
+ TemplateTail,
55
+ TryStatement,
56
+ VariableDeclaration,
57
+ VariableDeclarationList,
58
+ VariableStatement,
59
+ VoidExpression,
60
+ WhileStatement,
61
+ WithStatement,
62
+ EmptyStatement,
63
+ ModifierList,
64
+ getElements,
65
+ getName,
66
+ } from '../ast.js';
67
+ import { getExternalModuleName, isImportCall, isInJSFile, isRequireCall } from '../ast-utilities.js';
68
+ import { isAssignmentExpression, isDestructuringAssignment } from '../binder-utilities.js';
69
+ import {
70
+ type CompilerOptions,
71
+ JsxEmit,
72
+ ModuleKind,
73
+ ScriptTarget,
74
+ getEmitModuleKind,
75
+ getEmitScriptTarget,
76
+ } from '../options.js';
77
+ import type { EmitContext } from '../printer/emit-context.js';
78
+ import { EmitFlags, GeneratedIdentifierFlags } from '../printer/emit-flags.js';
79
+ import { NameOptions } from '../printer/factory.js';
80
+ import { isPrologueDirective } from '../printer/utilities.js';
81
+ import { fileExtensionIsOneOf } from '../path.js';
82
+ import { SyntaxKind } from '../syntax-kind.js';
83
+ import { TokenFlags } from '../types.js';
84
+ import {
85
+ AssignmentFactory,
86
+ convertVariableDeclarationToAssignment,
87
+ flattenDestructuringAssignment,
88
+ isSimpleCopiableExpression,
89
+ } from './destructuring.js';
90
+ import type { EmitResolver } from './emit-resolver.js';
91
+ import {
92
+ type ExternalModuleInfo,
93
+ collectExternalModuleInfo,
94
+ createExternalHelpersImportDeclarationIfNeeded,
95
+ getImportNeedsImportDefaultHelper,
96
+ getImportNeedsImportStarHelper,
97
+ getNamespaceDeclarationNode,
98
+ isDefaultImport,
99
+ isEffectiveExternalModule,
100
+ moduleExportNameText,
101
+ } from './external-module-info.js';
102
+ import type { ModuleFormatHost } from './module.js';
103
+ import { Transformer } from './transformer.js';
104
+ import { hasSyntacticModifier, isExternalModule, isIdentifierReference, singleOrMany } from './utilities.js';
105
+ import { VisitorBase } from './visitor-base.js';
106
+ import { createRequireCallArguments, rewriteModuleSpecifier } from './module-utilities.js';
107
+
108
+ const exportDefault = ModifierFlags.Export | ModifierFlags.Default;
109
+ const supportedJSExtensions = ['.js', '.jsx', '.mjs', '.cjs'];
110
+
111
+ const enum VisitMode {
112
+ /** Statements at the top level of the module. */
113
+ TopLevel,
114
+ /** Statements nested in top-level statements, whose `var`s are module scoped. */
115
+ TopLevelNested,
116
+ /** Expressions whose value is unused. */
117
+ DiscardedValue,
118
+ }
119
+
120
+ /** Visits children in one of the transform's modes. */
121
+ class ModeVisitor extends VisitorBase {
122
+ readonly owner: CommonJSModuleTransformer;
123
+ readonly mode: VisitMode;
124
+
125
+ constructor(owner: CommonJSModuleTransformer, mode: VisitMode) {
126
+ super(owner.context);
127
+ this.owner = owner;
128
+ this.mode = mode;
129
+ }
130
+
131
+ visit(node: Node): Node | undefined {
132
+ return this.owner.visitInMode(this.mode, node);
133
+ }
134
+ }
135
+
136
+ /** Assigns flattened destructuring targets that are exported to `exports.x` as well. */
137
+ class ExportAssignments extends AssignmentFactory {
138
+ readonly owner: CommonJSModuleTransformer;
139
+
140
+ constructor(owner: CommonJSModuleTransformer) {
141
+ super();
142
+ this.owner = owner;
143
+ }
144
+
145
+ createAssignment(name: Identifier, value: Node, pos: number, end: number): Node {
146
+ return this.owner.createAllExportExpressions(name, value, pos, end);
147
+ }
148
+ }
149
+
150
+ export class CommonJSModuleTransformer extends Transformer {
151
+ readonly options: CompilerOptions;
152
+ readonly resolver: EmitResolver;
153
+ readonly formats: ModuleFormatHost;
154
+ readonly moduleKind: ModuleKind;
155
+ readonly languageVersion: ScriptTarget;
156
+ private readonly topLevel: ModeVisitor;
157
+ private readonly topLevelNested: ModeVisitor;
158
+ private readonly discarded: ModeVisitor;
159
+ private readonly exportAssignments: ExportAssignments;
160
+ private currentSourceFile: SourceFile | undefined;
161
+ private info: ExternalModuleInfo | undefined;
162
+ private parentNode: Node | undefined;
163
+ private currentNode: Node | undefined;
164
+
165
+ constructor(context: EmitContext, options: CompilerOptions, resolver: EmitResolver, formats: ModuleFormatHost) {
166
+ super(context);
167
+ this.options = options;
168
+ this.resolver = resolver;
169
+ this.formats = formats;
170
+ this.moduleKind = getEmitModuleKind(options);
171
+ this.languageVersion = getEmitScriptTarget(options);
172
+ this.topLevel = new ModeVisitor(this, VisitMode.TopLevel);
173
+ this.topLevelNested = new ModeVisitor(this, VisitMode.TopLevelNested);
174
+ this.discarded = new ModeVisitor(this, VisitMode.DiscardedValue);
175
+ this.exportAssignments = new ExportAssignments(this);
176
+ this.currentSourceFile = undefined;
177
+ this.info = undefined;
178
+ this.parentNode = undefined;
179
+ this.currentNode = undefined;
180
+ }
181
+
182
+ private moduleInfo(): ExternalModuleInfo {
183
+ return this.info!;
184
+ }
185
+
186
+ // Visitors
187
+
188
+ visit(node: Node): Node | undefined {
189
+ const grandparent = this.pushNode(node);
190
+ const result = this.visitNoStack(node, false);
191
+ this.popNode(grandparent);
192
+ return result;
193
+ }
194
+
195
+ visitInMode(mode: VisitMode, node: Node): Node | undefined {
196
+ if (mode === VisitMode.TopLevel) return this.visitTopLevel(node);
197
+ const grandparent = this.pushNode(node);
198
+ const result =
199
+ mode === VisitMode.TopLevelNested ? this.visitTopLevelNestedNoStack(node) : this.visitNoStack(node, true);
200
+ this.popNode(grandparent);
201
+ return result;
202
+ }
203
+
204
+ private pushNode(node: Node): Node | undefined {
205
+ const grandparent = this.parentNode;
206
+ this.parentNode = this.currentNode;
207
+ this.currentNode = node;
208
+ return grandparent;
209
+ }
210
+
211
+ private popNode(grandparent: Node | undefined): boolean {
212
+ this.currentNode = this.parentNode;
213
+ this.parentNode = grandparent;
214
+ return true;
215
+ }
216
+
217
+ private visitTopLevel(node: Node): Node | undefined {
218
+ const grandparent = this.pushNode(node);
219
+ let result: Node | undefined;
220
+ if (node instanceof ImportDeclaration) result = this.visitTopLevelImportDeclaration(node as ImportDeclaration);
221
+ else if (node instanceof ImportEqualsDeclaration)
222
+ result = this.visitTopLevelImportEqualsDeclaration(node as ImportEqualsDeclaration);
223
+ else if (node instanceof ExportDeclaration) result = this.visitTopLevelExportDeclaration(node as ExportDeclaration);
224
+ else if (node instanceof ExportAssignment) result = this.visitTopLevelExportAssignment(node as ExportAssignment);
225
+ else if (node instanceof FunctionDeclaration)
226
+ result = this.visitTopLevelFunctionDeclaration(node as FunctionDeclaration);
227
+ else if (node instanceof ClassDeclaration) result = this.visitTopLevelClassDeclaration(node as ClassDeclaration);
228
+ else if (node instanceof VariableStatement) result = this.visitTopLevelVariableStatement(node as VariableStatement);
229
+ else result = this.visitTopLevelNestedNoStack(node);
230
+ this.popNode(grandparent);
231
+ return result;
232
+ }
233
+
234
+ private visitTopLevelNestedNoStack(node: Node): Node | undefined {
235
+ const factory = this.factory;
236
+ const nested = this.topLevelNested;
237
+ if (node instanceof VariableStatement) return this.visitTopLevelVariableStatement(node as VariableStatement);
238
+ if (node instanceof ForStatement) return this.visitTopLevelNestedForStatement(node as ForStatement);
239
+ if (node instanceof ForInOrOfStatement)
240
+ return this.visitTopLevelNestedForInOrOfStatement(node as ForInOrOfStatement);
241
+ if (node instanceof DoStatement)
242
+ return factory.updateDoStatement(
243
+ node as DoStatement,
244
+ nested.visitIterationBody(node.statement)!,
245
+ this.visitNode(node.expression)!,
246
+ );
247
+ if (node instanceof WhileStatement)
248
+ return factory.updateWhileStatement(
249
+ node as WhileStatement,
250
+ this.visitNode(node.expression)!,
251
+ nested.visitIterationBody(node.statement)!,
252
+ );
253
+ if (node instanceof LabeledStatement) {
254
+ const statement = nested.visitStatement(node.statement);
255
+ return factory.updateLabeledStatement(
256
+ node as LabeledStatement,
257
+ node.label,
258
+ statement !== undefined ? statement : factory.created(new EmptyStatement()),
259
+ );
260
+ }
261
+ if (node instanceof WithStatement)
262
+ return factory.updateWithStatement(
263
+ node as WithStatement,
264
+ this.visitNode(node.expression)!,
265
+ nested.visitStatement(node.statement)!,
266
+ );
267
+ if (node instanceof IfStatement) {
268
+ const thenStatement = nested.visitStatement(node.thenStatement);
269
+ return factory.updateIfStatement(
270
+ node as IfStatement,
271
+ this.visitNode(node.expression)!,
272
+ thenStatement !== undefined ? thenStatement : factory.createBlock([], false),
273
+ nested.visitStatement(node.elseStatement),
274
+ );
275
+ }
276
+ if (node instanceof SwitchStatement) {
277
+ const caseBlock = nested.visitNode(node.caseBlock);
278
+ return factory.updateSwitchStatement(
279
+ node as SwitchStatement,
280
+ this.visitNode(node.expression)!,
281
+ caseBlock instanceof CaseBlock ? (caseBlock as CaseBlock) : node.caseBlock,
282
+ );
283
+ }
284
+ if (node instanceof CaseBlock || node instanceof TryStatement || node instanceof Block)
285
+ return nested.visitEachChild(node);
286
+ if (node instanceof CaseOrDefaultClause)
287
+ return factory.updateCaseOrDefaultClause(
288
+ node as CaseOrDefaultClause,
289
+ this.visitNode(node.expression),
290
+ nested.visitNodes(node.statements)!,
291
+ );
292
+ if (node instanceof CatchClause) {
293
+ const block = nested.visitNode(node.block);
294
+ return factory.updateCatchClause(
295
+ node as CatchClause,
296
+ node.variableDeclaration,
297
+ block instanceof Block ? (block as Block) : node.block,
298
+ );
299
+ }
300
+ return this.visitNoStack(node, false);
301
+ }
302
+
303
+ /** Visits a node other than a top-level statement; `discarded` if its value is unused. */
304
+ private visitNoStack(node: Node, discarded: boolean): Node | undefined {
305
+ if (node instanceof SourceFile) return this.visitSourceFile(node as SourceFile);
306
+ if (node instanceof ForStatement)
307
+ return this.factory.updateForStatement(
308
+ node as ForStatement,
309
+ this.discarded.visitNode(node.initializer),
310
+ this.visitNode(node.condition),
311
+ this.discarded.visitNode(node.incrementor),
312
+ this.topLevelNested.visitIterationBody(node.statement)!,
313
+ );
314
+ if (node instanceof ForInOrOfStatement)
315
+ return this.factory.updateForInOrOfStatement(
316
+ node as ForInOrOfStatement,
317
+ node.awaitModifier,
318
+ this.discarded.visitNode(node.initializer)!,
319
+ this.visitNode(node.expression)!,
320
+ this.topLevelNested.visitIterationBody(node.statement)!,
321
+ );
322
+ if (node instanceof ExpressionStatement || node instanceof VoidExpression)
323
+ return this.discarded.visitEachChild(node);
324
+ if (node instanceof ParenthesizedExpression)
325
+ return this.factory.updateParenthesizedExpression(
326
+ node as ParenthesizedExpression,
327
+ (discarded ? this.discarded.visitNode(node.expression) : this.visitNode(node.expression))!,
328
+ );
329
+ if (node instanceof PartiallyEmittedExpression)
330
+ return this.factory.updatePartiallyEmittedExpression(
331
+ node as PartiallyEmittedExpression,
332
+ (discarded ? this.discarded.visitNode(node.expression) : this.visitNode(node.expression))!,
333
+ );
334
+ if (node instanceof CallExpression) return this.visitCallExpression(node as CallExpression);
335
+ if (node instanceof TaggedTemplateExpression)
336
+ return this.visitTaggedTemplateExpression(node as TaggedTemplateExpression);
337
+ if (node instanceof BinaryExpression) return this.visitBinaryExpression(node as BinaryExpression, discarded);
338
+ if (node instanceof PrefixUnaryExpression) return this.visitPrefixUnaryExpression(node as PrefixUnaryExpression);
339
+ if (node instanceof PostfixUnaryExpression)
340
+ return this.visitPostfixUnaryExpression(node as PostfixUnaryExpression, discarded);
341
+ if (node instanceof ShorthandPropertyAssignment)
342
+ return this.visitShorthandPropertyAssignment(node as ShorthandPropertyAssignment);
343
+ if (node instanceof Identifier)
344
+ return isIdentifierReference(node, this.parentNode) ? this.visitExpressionIdentifier(node as Identifier) : node;
345
+ return this.visitEachChild(node);
346
+ }
347
+
348
+ // Source files
349
+
350
+ private visitSourceFile(node: SourceFile): Node {
351
+ if (node.isDeclarationFile || !(isEffectiveExternalModule(node, this.options) || containsDynamicImport(node)))
352
+ return node;
353
+ this.currentSourceFile = node;
354
+ this.info = collectExternalModuleInfo(node, this.context, this.resolver);
355
+ const updated = this.transformCommonJSModule(node);
356
+ this.currentSourceFile = undefined;
357
+ this.info = undefined;
358
+ return updated;
359
+ }
360
+
361
+ private shouldEmitUnderscoreUnderscoreESModule(file: SourceFile): boolean {
362
+ if (
363
+ fileExtensionIsOneOf(file.fileName, supportedJSExtensions) &&
364
+ file.commonJSModuleIndicator !== undefined &&
365
+ (file.externalModuleIndicator === undefined || file.externalModuleIndicator.kind === SyntaxKind.SourceFile)
366
+ )
367
+ return false;
368
+ return this.moduleInfo().exportEquals === undefined && isExternalModule(file);
369
+ }
370
+
371
+ /** `Object.defineProperty(exports, "__esModule", { value: true });` */
372
+ private createUnderscoreUnderscoreESModule(): Node {
373
+ const factory = this.factory;
374
+ const statement = factory.createExpressionStatement(
375
+ factory.createCallExpression(
376
+ factory.createPropertyAccessExpression(
377
+ factory.createIdentifier('Object'),
378
+ factory.createIdentifier('defineProperty'),
379
+ ),
380
+ [
381
+ factory.createIdentifier('exports'),
382
+ factory.createStringLiteral('__esModule', TokenFlags.None),
383
+ factory.createObjectLiteral(
384
+ [factory.createPropertyAssignment(factory.createIdentifier('value'), factory.createTrue())],
385
+ false,
386
+ ),
387
+ ],
388
+ ),
389
+ );
390
+ this.context.setEmitFlags(statement, EmitFlags.CustomPrologue);
391
+ return statement;
392
+ }
393
+
394
+ private transformCommonJSModule(node: SourceFile): Node {
395
+ const factory = this.factory;
396
+ const context = this.context;
397
+ const info = this.moduleInfo();
398
+ context.startVariableEnvironment();
399
+ const source = node.statements.nodes;
400
+ const prologueEnd = standardPrologueEnd(source);
401
+ const statements: Node[] = source.slice(0, prologueEnd);
402
+ const customEnd = this.customPrologueEnd(source, prologueEnd);
403
+ appendAll(statements, this.topLevel.visitArray(source.slice(prologueEnd, customEnd)));
404
+ if (this.shouldEmitUnderscoreUnderscoreESModule(node)) statements.push(this.createUnderscoreUnderscoreESModule());
405
+ // exports.a = exports.b = void 0;
406
+ const names = info.exportedNames;
407
+ for (let start = 0; start < names.length; start += 50) {
408
+ let right: Node = factory.createVoidZero();
409
+ const end = Math.min(start + 50, names.length);
410
+ for (let i = start; i < end; i++) right = factory.createAssignment(this.createExportsReference(names[i]), right);
411
+ const statement = factory.createExpressionStatement(right);
412
+ context.addEmitFlags(statement, EmitFlags.CustomPrologue);
413
+ statements.push(statement);
414
+ }
415
+ // exports.f = f; ahead of the helpers import, as TypeScript orders them.
416
+ const functionsStart = statements.length;
417
+ for (let i = 0; i < info.exportedFunctions.length; i++)
418
+ this.appendExportsOfClassOrFunctionDeclaration(statements, info.exportedFunctions[i]);
419
+ for (let i = functionsStart; i < statements.length; i++)
420
+ context.addEmitFlags(statements[i], EmitFlags.CustomPrologue);
421
+ appendAll(statements, this.topLevel.visitArray(source.slice(customEnd)));
422
+ this.appendExportEqualsIfNeeded(statements);
423
+ const merged = context.mergeEnvironment(statements, context.endVariableEnvironment());
424
+ let result = factory.updateSourceFile(
425
+ node,
426
+ new NodeList(node.statements.pos, node.statements.end, merged),
427
+ node.endOfFileToken,
428
+ );
429
+ const helpers = context.readEmitHelpers();
430
+ for (let i = 0; i < helpers.length; i++) context.addEmitHelper(result, helpers[i]);
431
+ const helpersImport = createExternalHelpersImportDeclarationIfNeeded(
432
+ context,
433
+ result,
434
+ this.options,
435
+ this.formats.getEmitModuleFormat(node.fileName),
436
+ );
437
+ if (helpersImport !== undefined) {
438
+ const current = result.statements.nodes;
439
+ const standardEnd = standardPrologueEnd(current);
440
+ const end = this.customPrologueEnd(current, standardEnd);
441
+ const withImport = current.slice(0, end);
442
+ const visited = this.topLevel.visitNode(helpersImport);
443
+ if (visited !== undefined) withImport.push(visited);
444
+ appendAll(withImport, current.slice(end));
445
+ result = factory.updateSourceFile(
446
+ result,
447
+ new NodeList(result.statements.pos, result.statements.end, withImport),
448
+ node.endOfFileToken,
449
+ );
450
+ }
451
+ return result;
452
+ }
453
+
454
+ private customPrologueEnd(statements: readonly Node[], start: number): number {
455
+ let i = start;
456
+ while (
457
+ i < statements.length &&
458
+ !isPrologueDirective(statements[i]) &&
459
+ (this.context.getEmitFlags(statements[i]) & EmitFlags.CustomPrologue) !== 0
460
+ )
461
+ i++;
462
+ return i;
463
+ }
464
+
465
+ /** `exports.x` or `exports["x"]` for an export name. */
466
+ private createExportsReference(name: Node): Node {
467
+ const factory = this.factory;
468
+ if (name instanceof StringLiteral)
469
+ return factory.createElementAccessExpression(
470
+ factory.createIdentifier('exports'),
471
+ factory.createStringLiteralFromNode(name),
472
+ );
473
+ const clone = this.cloneName(name);
474
+ this.context.setEmitFlags(clone, EmitFlags.NoSourceMap | EmitFlags.NoComments);
475
+ return factory.createPropertyAccessExpression(factory.createIdentifier('exports'), clone);
476
+ }
477
+
478
+ private cloneName(name: Node): Node {
479
+ return name instanceof Identifier ? this.factory.cloneIdentifier(name as Identifier) : name;
480
+ }
481
+
482
+ /** `module.exports = x;` for `export = x`. */
483
+ private appendExportEqualsIfNeeded(statements: Node[]): boolean {
484
+ const exportEquals = this.moduleInfo().exportEquals;
485
+ if (exportEquals === undefined) return false;
486
+ const grandparent = this.pushNode(exportEquals);
487
+ const expression = this.visitNode(exportEquals.expression);
488
+ this.popNode(grandparent);
489
+ if (expression === undefined) return false;
490
+ const factory = this.factory;
491
+ const statement = factory.createExpressionStatement(
492
+ factory.createAssignment(
493
+ factory.createPropertyAccessExpression(factory.createIdentifier('module'), factory.createIdentifier('exports')),
494
+ expression,
495
+ ),
496
+ );
497
+ this.context.assignCommentAndSourceMapRanges(statement, exportEquals);
498
+ this.context.addEmitFlags(statement, EmitFlags.NoComments);
499
+ statements.push(statement);
500
+ return true;
501
+ }
502
+
503
+ // Exports of declarations
504
+
505
+ private appendExportsOfImportDeclaration(statements: Node[], declaration: ImportDeclaration): boolean {
506
+ if (this.moduleInfo().exportEquals !== undefined) return false;
507
+ const clause = declaration.importClause;
508
+ if (clause === undefined) return false;
509
+ const seen = new Set<string>();
510
+ if (clause.name !== undefined) this.appendExportsOfDeclaration(statements, clause, seen, false);
511
+ const bindings = clause.namedBindings;
512
+ if (bindings !== undefined && bindings.kind === SyntaxKind.NamespaceImport)
513
+ this.appendExportsOfDeclaration(statements, bindings, seen, false);
514
+ else if (bindings !== undefined && bindings.kind === SyntaxKind.NamedImports) {
515
+ const elements = bindingElementsOf(bindings);
516
+ for (let i = 0; i < elements.length; i++) this.appendExportsOfDeclaration(statements, elements[i], seen, true);
517
+ }
518
+ return true;
519
+ }
520
+
521
+ private appendExportsOfVariableDeclarationList(
522
+ statements: Node[],
523
+ list: VariableDeclarationList,
524
+ isForInOrOfInitializer: boolean,
525
+ ): boolean {
526
+ if (this.moduleInfo().exportEquals !== undefined) return false;
527
+ const declarations = list.declarations.nodes;
528
+ for (let i = 0; i < declarations.length; i++)
529
+ this.appendExportsOfBindingElement(statements, declarations[i], isForInOrOfInitializer);
530
+ return true;
531
+ }
532
+
533
+ private appendExportsOfBindingElement(statements: Node[], declaration: Node, isForInOrOfInitializer: boolean) {
534
+ if (this.moduleInfo().exportEquals !== undefined) return false;
535
+ const name = bindingNameOf(declaration);
536
+ if (name === undefined) return false;
537
+ if (name instanceof BindingPattern) {
538
+ const elements = name.elements.nodes;
539
+ for (let i = 0; i < elements.length; i++)
540
+ if (elements[i].kind !== SyntaxKind.OmittedExpression)
541
+ this.appendExportsOfBindingElement(statements, elements[i], isForInOrOfInitializer);
542
+ return true;
543
+ }
544
+ if (
545
+ !this.context.hasAutoGenerateInfo(name) &&
546
+ (!(declaration instanceof VariableDeclaration) || declaration.initializer !== undefined || isForInOrOfInitializer)
547
+ )
548
+ this.appendExportsOfDeclaration(statements, declaration, undefined, false);
549
+ return true;
550
+ }
551
+
552
+ private appendExportsOfClassOrFunctionDeclaration(statements: Node[], declaration: Node): boolean {
553
+ if (this.moduleInfo().exportEquals !== undefined) return false;
554
+ const seen = new Set<string>();
555
+ if (hasSyntacticModifier(declaration, ModifierFlags.Export)) {
556
+ const exportName: Node = hasSyntacticModifier(declaration, ModifierFlags.Default)
557
+ ? this.factory.createIdentifier('default')
558
+ : this.factory.getDeclarationName(declaration, NameOptions.None);
559
+ this.appendExportStatement(
560
+ statements,
561
+ seen,
562
+ exportName,
563
+ this.factory.getLocalName(declaration, NameOptions.None),
564
+ declaration,
565
+ false,
566
+ false,
567
+ );
568
+ }
569
+ if (declarationNameOf(declaration) !== undefined)
570
+ this.appendExportsOfDeclaration(statements, declaration, seen, false);
571
+ return true;
572
+ }
573
+
574
+ private appendExportsOfDeclaration(
575
+ statements: Node[],
576
+ declaration: Node,
577
+ seenNames: Set<string> | undefined,
578
+ liveBinding: boolean,
579
+ ): boolean {
580
+ const info = this.moduleInfo();
581
+ if (info.exportEquals !== undefined) return false;
582
+ const seen = seenNames !== undefined ? seenNames : new Set<string>();
583
+ if (info.exportSpecifiers.size === 0 || !(declarationNameOf(declaration) instanceof Identifier)) return false;
584
+ const name = this.factory.getDeclarationName(declaration, NameOptions.None);
585
+ const specifiers = info.exportSpecifiers.get(name.text);
586
+ if (specifiers === undefined || specifiers.length === 0) return false;
587
+ const value = this.visitExpressionIdentifier(name);
588
+ for (let i = 0; i < specifiers.length; i++)
589
+ this.appendExportStatement(statements, seen, specifiers[i].name, value, specifiers[i].name, false, liveBinding);
590
+ return true;
591
+ }
592
+
593
+ private appendExportStatement(
594
+ statements: Node[],
595
+ seen: Set<string>,
596
+ exportName: Node,
597
+ value: Node,
598
+ location: Node | undefined,
599
+ allowComments: boolean,
600
+ liveBinding: boolean,
601
+ ): boolean {
602
+ if (!(exportName instanceof StringLiteral)) {
603
+ const text = moduleExportNameText(exportName);
604
+ if (seen.has(text)) return false;
605
+ seen.add(text);
606
+ }
607
+ statements.push(this.createExportStatement(exportName, value, location, allowComments, liveBinding));
608
+ return true;
609
+ }
610
+
611
+ private createExportStatement(
612
+ name: Node,
613
+ value: Node,
614
+ location: Node | undefined,
615
+ allowComments: boolean,
616
+ liveBinding: boolean,
617
+ ): Node {
618
+ const statement = this.factory.createExpressionStatement(
619
+ this.createExportExpression(name, value, undefined, liveBinding),
620
+ );
621
+ if (location !== undefined) this.context.setCommentRange(statement, location.pos, location.end);
622
+ this.context.addEmitFlags(statement, EmitFlags.StartOnNewLine);
623
+ if (!allowComments) this.context.addEmitFlags(statement, EmitFlags.NoComments);
624
+ return statement;
625
+ }
626
+
627
+ /** `exports.x = value`, or a getter on `exports` for a live binding. */
628
+ private createExportExpression(name: Node, value: Node, location: Node | undefined, liveBinding: boolean): Node {
629
+ const factory = this.factory;
630
+ let expression: Node;
631
+ if (liveBinding) {
632
+ // Object.defineProperty(exports, "x", { enumerable: true, get: function () { return value; } })
633
+ const getter = factory.createFunctionExpression(
634
+ [],
635
+ factory.createBlock([factory.createReturnStatement(value)], false),
636
+ );
637
+ expression = factory.createCallExpression(
638
+ factory.createPropertyAccessExpression(
639
+ factory.createIdentifier('Object'),
640
+ factory.createIdentifier('defineProperty'),
641
+ ),
642
+ [
643
+ factory.createIdentifier('exports'),
644
+ factory.createStringLiteralFromNode(name),
645
+ factory.createObjectLiteral(
646
+ [
647
+ factory.createPropertyAssignment(factory.createIdentifier('enumerable'), factory.createTrue()),
648
+ factory.createPropertyAssignment(factory.createIdentifier('get'), getter),
649
+ ],
650
+ false,
651
+ ),
652
+ ],
653
+ );
654
+ } else {
655
+ const target =
656
+ name instanceof StringLiteral
657
+ ? factory.createElementAccessExpression(
658
+ factory.createIdentifier('exports'),
659
+ factory.createStringLiteralFromNode(name),
660
+ )
661
+ : factory.createPropertyAccessExpression(factory.createIdentifier('exports'), this.cloneName(name));
662
+ expression = factory.createAssignment(target, value);
663
+ }
664
+ if (location !== undefined) this.context.setCommentRange(expression, location.pos, location.end);
665
+ return expression;
666
+ }
667
+
668
+ /** `require("mod")` */
669
+ private createRequireCall(node: Node): Node {
670
+ const factory = this.factory;
671
+ return factory.createCallExpression(
672
+ factory.createIdentifier('require'),
673
+ createRequireCallArguments(this.context, node, this.options),
674
+ );
675
+ }
676
+
677
+ private getHelperExpressionForImport(node: ImportDeclaration, inner: Node): Node {
678
+ if (getImportNeedsImportStarHelper(node)) return this.visitNode(this.factory.createImportStarHelper(inner))!;
679
+ if (getImportNeedsImportDefaultHelper(node)) return this.visitNode(this.factory.createImportDefaultHelper(inner))!;
680
+ return inner;
681
+ }
682
+
683
+ // Top-level statements
684
+
685
+ private visitTopLevelImportDeclaration(node: ImportDeclaration): Node | undefined {
686
+ const factory = this.factory;
687
+ const context = this.context;
688
+ if (node.importClause === undefined) {
689
+ // import "mod";
690
+ const statement = factory.createExpressionStatement(this.createRequireCall(node));
691
+ context.setOriginal(statement, node);
692
+ context.assignCommentAndSourceMapRanges(statement, node);
693
+ return statement;
694
+ }
695
+ const variables: Node[] = [];
696
+ const namespaceDeclaration = getNamespaceDeclarationNode(node);
697
+ if (namespaceDeclaration !== undefined && !isDefaultImport(node)) {
698
+ // import * as n from "mod";
699
+ variables.push(
700
+ factory.createVariableDeclaration(
701
+ this.cloneName(namespaceNameOf(namespaceDeclaration)),
702
+ undefined,
703
+ undefined,
704
+ this.getHelperExpressionForImport(node, this.createRequireCall(node)),
705
+ ),
706
+ );
707
+ } else {
708
+ // import d, { x } from "mod";
709
+ variables.push(
710
+ factory.createVariableDeclaration(
711
+ factory.createGeneratedNameForNode(node, 0, '', ''),
712
+ undefined,
713
+ undefined,
714
+ this.getHelperExpressionForImport(node, this.createRequireCall(node)),
715
+ ),
716
+ );
717
+ if (namespaceDeclaration !== undefined)
718
+ variables.push(
719
+ factory.createVariableDeclaration(
720
+ this.cloneName(namespaceNameOf(namespaceDeclaration)),
721
+ undefined,
722
+ undefined,
723
+ factory.createGeneratedNameForNode(node, 0, '', ''),
724
+ ),
725
+ );
726
+ }
727
+ const statement = factory.createVariableStatement(
728
+ undefined,
729
+ factory.createVariableDeclarationList(factory.createNodeList(variables), NodeFlags.Const),
730
+ );
731
+ context.setOriginal(statement, node);
732
+ context.assignCommentAndSourceMapRanges(statement, node);
733
+ const statements: Node[] = [statement];
734
+ this.appendExportsOfImportDeclaration(statements, node);
735
+ return singleOrMany(statements, factory);
736
+ }
737
+
738
+ private visitTopLevelImportEqualsDeclaration(node: ImportEqualsDeclaration): Node | undefined {
739
+ const factory = this.factory;
740
+ const context = this.context;
741
+ if (!(node.moduleReference instanceof ExternalModuleReference)) return this.visitEachChild(node);
742
+ let statement: Node;
743
+ if (hasSyntacticModifier(node, ModifierFlags.Export)) {
744
+ // export import m = require("mod");
745
+ statement = factory.createExpressionStatement(
746
+ this.createExportExpression(node.name, this.createRequireCall(node), node, false),
747
+ );
748
+ } else {
749
+ // import m = require("mod");
750
+ statement = factory.createVariableStatement(
751
+ undefined,
752
+ factory.createVariableDeclarationList(
753
+ factory.createNodeList([
754
+ factory.createVariableDeclaration(
755
+ factory.cloneIdentifier(node.name),
756
+ undefined,
757
+ undefined,
758
+ this.createRequireCall(node),
759
+ ),
760
+ ]),
761
+ NodeFlags.Const,
762
+ ),
763
+ );
764
+ }
765
+ context.setOriginal(statement, node);
766
+ context.assignCommentAndSourceMapRanges(statement, node);
767
+ const statements: Node[] = [statement];
768
+ this.appendExportsOfDeclaration(statements, node, undefined, false);
769
+ return singleOrMany(statements, factory);
770
+ }
771
+
772
+ private visitTopLevelExportDeclaration(node: ExportDeclaration): Node | undefined {
773
+ const factory = this.factory;
774
+ const context = this.context;
775
+ // Local `export { x }` is handled with the declarations it exports.
776
+ if (node.moduleSpecifier === undefined) return undefined;
777
+ const generatedName = factory.createGeneratedNameForNode(node, 0, '', '');
778
+ const clause = node.exportClause;
779
+ if (clause instanceof NamedExports) {
780
+ // export { x, y } from "mod";
781
+ const statement = factory.createVariableStatement(
782
+ undefined,
783
+ factory.createVariableDeclarationList(
784
+ factory.createNodeList([
785
+ factory.createVariableDeclaration(generatedName, undefined, undefined, this.createRequireCall(node)),
786
+ ]),
787
+ NodeFlags.None,
788
+ ),
789
+ );
790
+ context.setOriginal(statement, node);
791
+ context.assignCommentAndSourceMapRanges(statement, node);
792
+ const statements: Node[] = [statement];
793
+ const specifiers = clause.elements.nodes;
794
+ for (let i = 0; i < specifiers.length; i++) {
795
+ const specifier = specifiers[i];
796
+ if (!(specifier instanceof ExportSpecifier)) continue;
797
+ const imported = specifier.propertyName !== undefined ? specifier.propertyName : specifier.name;
798
+ const target: Node =
799
+ moduleExportNameText(imported) === 'default'
800
+ ? factory.createImportDefaultHelper(generatedName)
801
+ : generatedName;
802
+ const exportName: Node =
803
+ specifier.name instanceof StringLiteral
804
+ ? factory.createStringLiteralFromNode(specifier.name)
805
+ : factory.getExportName(specifier, NameOptions.None);
806
+ const value =
807
+ imported instanceof StringLiteral
808
+ ? factory.createElementAccessExpression(target, imported)
809
+ : factory.createPropertyAccessExpression(target, imported);
810
+ const exportStatement = factory.createExpressionStatement(
811
+ this.createExportExpression(exportName, value, undefined, true),
812
+ );
813
+ context.setOriginal(exportStatement, specifier);
814
+ context.assignCommentAndSourceMapRanges(exportStatement, specifier);
815
+ statements.push(exportStatement);
816
+ }
817
+ return singleOrMany(statements, factory);
818
+ }
819
+ if (clause instanceof NamespaceExport) {
820
+ // export * as ns from "mod";
821
+ const name = clause.name;
822
+ const exportName: Node =
823
+ name instanceof StringLiteral ? factory.createStringLiteralFromNode(name) : this.cloneName(name);
824
+ const statement = factory.createExpressionStatement(
825
+ this.createExportExpression(
826
+ exportName,
827
+ this.visitNode(factory.createImportStarHelper(this.createRequireCall(node)))!,
828
+ undefined,
829
+ false,
830
+ ),
831
+ );
832
+ context.setOriginal(statement, node);
833
+ context.assignCommentAndSourceMapRanges(statement, node);
834
+ return statement;
835
+ }
836
+ // export * from "mod";
837
+ const statement = factory.createExpressionStatement(
838
+ this.visitNode(
839
+ factory.createExportStarHelper(this.createRequireCall(node), factory.createIdentifier('exports')),
840
+ )!,
841
+ );
842
+ context.setOriginal(statement, node);
843
+ context.assignCommentAndSourceMapRanges(statement, node);
844
+ return statement;
845
+ }
846
+
847
+ private visitTopLevelExportAssignment(node: ExportAssignment): Node | undefined {
848
+ if (node.isExportEquals) return undefined;
849
+ return this.createExportStatement(
850
+ this.factory.createIdentifier('default'),
851
+ this.visitNode(node.expression)!,
852
+ node,
853
+ true,
854
+ false,
855
+ );
856
+ }
857
+
858
+ private visitTopLevelFunctionDeclaration(node: FunctionDeclaration): Node | undefined {
859
+ if (!hasSyntacticModifier(node, ModifierFlags.Export)) return this.visitEachChild(node);
860
+ return this.factory.updateFunctionDeclaration(
861
+ node,
862
+ this.extractModifiers(node.modifiers, ~exportDefault),
863
+ node.asteriskToken,
864
+ this.factory.getDeclarationName(node, NameOptions.None),
865
+ undefined,
866
+ this.visitNodes(node.parameters)!,
867
+ undefined,
868
+ undefined,
869
+ this.visitNode(node.body),
870
+ );
871
+ }
872
+
873
+ private visitTopLevelClassDeclaration(node: ClassDeclaration): Node | undefined {
874
+ const statements: Node[] = [];
875
+ if (hasSyntacticModifier(node, ModifierFlags.Export)) {
876
+ const updated: Node | undefined = this.factory.updateClassDeclaration(
877
+ node,
878
+ this.visitModifiers(this.extractModifiers(node.modifiers, ~exportDefault)),
879
+ this.factory.getDeclarationName(node, NameOptions.None),
880
+ undefined,
881
+ this.visitNodes(node.heritageClauses),
882
+ this.visitNodes(node.members)!,
883
+ );
884
+ if (updated !== undefined) statements.push(updated);
885
+ } else statements.push(this.visitEachChild(node));
886
+ this.appendExportsOfClassOrFunctionDeclaration(statements, node);
887
+ return singleOrMany(statements, this.factory);
888
+ }
889
+
890
+ private visitTopLevelVariableStatement(node: VariableStatement): Node | undefined {
891
+ if (!hasSyntacticModifier(node, ModifierFlags.Export)) {
892
+ // Nested `var`s may still be exported with `export { x }`.
893
+ const statements: Node[] = [this.visitEachChild(node)];
894
+ this.appendExportsOfVariableDeclarationList(statements, node.declarationList, false);
895
+ return singleOrMany(statements, this.factory);
896
+ }
897
+ // export var a = b; becomes exports.a = b;
898
+ const factory = this.factory;
899
+ const context = this.context;
900
+ const splitter = new ExportedVariableSplitter(this, node);
901
+ const declarations = node.declarationList.declarations.nodes;
902
+ for (let i = 0; i < declarations.length; i++) {
903
+ const variable = declarations[i];
904
+ if (!(variable instanceof VariableDeclaration)) continue;
905
+ const name = variable.name;
906
+ const initializer = variable.initializer;
907
+ if (name instanceof Identifier && (context.getEmitFlags(name) & EmitFlags.LocalName) !== 0) {
908
+ // A class or function converted to a variable: references stay local, an `export { x }` follows.
909
+ splitter.ensureModifiers();
910
+ splitter.pushVariable(
911
+ initializer === undefined
912
+ ? variable
913
+ : factory.updateVariableDeclaration(
914
+ variable as VariableDeclaration,
915
+ name,
916
+ undefined,
917
+ undefined,
918
+ this.createExportExpression(name, this.visitNode(initializer)!, undefined, false),
919
+ ),
920
+ );
921
+ } else if (
922
+ initializer !== undefined &&
923
+ !(name instanceof BindingPattern) &&
924
+ (initializer instanceof ArrowFunction ||
925
+ initializer instanceof FunctionExpression ||
926
+ initializer instanceof ClassExpression)
927
+ ) {
928
+ // Variables keep functions and classes named.
929
+ splitter.pushVariable(
930
+ factory.createVariableDeclaration(
931
+ name,
932
+ variable.exclamationToken,
933
+ variable.type,
934
+ this.visitNode(initializer),
935
+ ),
936
+ );
937
+ const access = factory.createPropertyAccessExpression(factory.createIdentifier('exports'), name);
938
+ context.assignCommentAndSourceMapRanges(access, name);
939
+ splitter.pushExpression(factory.createAssignment(access, this.cloneName(name)));
940
+ } else if (name instanceof Identifier) {
941
+ const expression = this.transformInitializedVariable(variable as VariableDeclaration);
942
+ if (expression !== undefined) splitter.pushExpression(this.visitNode(expression)!);
943
+ } else if (name instanceof BindingPattern) {
944
+ const expression = this.transformInitializedVariable(variable as VariableDeclaration);
945
+ if (expression !== undefined) splitter.pushExpression(expression);
946
+ } else {
947
+ const expression = convertVariableDeclarationToAssignment(this, variable as VariableDeclaration);
948
+ if (expression !== undefined) splitter.pushExpression(this.visitNode(expression)!);
949
+ }
950
+ }
951
+ splitter.commitVariables();
952
+ splitter.commitExpressions();
953
+ const statements = splitter.statements;
954
+ this.appendExportsOfVariableDeclarationList(statements, node.declarationList, false);
955
+ return singleOrMany(statements, factory);
956
+ }
957
+
958
+ private transformInitializedVariable(node: VariableDeclaration): Node | undefined {
959
+ const initializer = node.initializer;
960
+ if (initializer === undefined) return undefined;
961
+ const name = node.name;
962
+ if (name instanceof BindingPattern) {
963
+ // Kept as native destructuring unless a target can't be rewritten to `exports.x`.
964
+ const assignment = convertVariableDeclarationToAssignment(this, node)!;
965
+ const grandparent = this.pushNode(assignment);
966
+ const result =
967
+ assignment instanceof BinaryExpression ? this.visitDestructuringAssignment(assignment, true) : assignment;
968
+ this.popNode(grandparent);
969
+ return result;
970
+ }
971
+ const access = this.factory.createPropertyAccessExpression(this.factory.createIdentifier('exports'), name);
972
+ this.context.assignCommentAndSourceMapRanges(access, name);
973
+ return this.factory.createAssignment(access, initializer);
974
+ }
975
+
976
+ private visitTopLevelNestedForStatement(node: ForStatement): Node | undefined {
977
+ const factory = this.factory;
978
+ const initializer = node.initializer;
979
+ if (initializer instanceof VariableDeclarationList && (initializer.flags & NodeFlags.BlockScoped) === 0) {
980
+ const exports: Node[] = [];
981
+ this.appendExportsOfVariableDeclarationList(exports, initializer as VariableDeclarationList, false);
982
+ if (exports.length > 0) {
983
+ // var x = 0; exports.x = x; for (; ;) { }
984
+ const list = this.discarded.visitNode(initializer);
985
+ const statements: Node[] = [
986
+ factory.createVariableStatement(
987
+ undefined,
988
+ list instanceof VariableDeclarationList
989
+ ? (list as VariableDeclarationList)
990
+ : (initializer as VariableDeclarationList),
991
+ ),
992
+ ];
993
+ appendAll(statements, exports);
994
+ const updated: Node | undefined = factory.updateForStatement(
995
+ node,
996
+ undefined,
997
+ this.visitNode(node.condition),
998
+ this.discarded.visitNode(node.incrementor),
999
+ this.topLevelNested.visitIterationBody(node.statement)!,
1000
+ );
1001
+ if (updated !== undefined) statements.push(updated);
1002
+ return singleOrMany(statements, factory);
1003
+ }
1004
+ }
1005
+ return factory.updateForStatement(
1006
+ node,
1007
+ this.discarded.visitNode(initializer),
1008
+ this.visitNode(node.condition),
1009
+ this.discarded.visitNode(node.incrementor),
1010
+ this.topLevelNested.visitIterationBody(node.statement)!,
1011
+ );
1012
+ }
1013
+
1014
+ private visitTopLevelNestedForInOrOfStatement(node: ForInOrOfStatement): Node | undefined {
1015
+ const factory = this.factory;
1016
+ const initializer = node.initializer;
1017
+ if (initializer instanceof VariableDeclarationList && (initializer.flags & NodeFlags.BlockScoped) === 0) {
1018
+ const exports: Node[] = [];
1019
+ this.appendExportsOfVariableDeclarationList(exports, initializer, true);
1020
+ if (exports.length > 0) {
1021
+ // for (var x in y) { exports.x = x; ... }
1022
+ const visitedInitializer = this.discarded.visitNode(initializer)!;
1023
+ const expression = this.visitNode(node.expression)!;
1024
+ const body = this.topLevelNested.visitIterationBody(node.statement)!;
1025
+ let updatedBody: Node;
1026
+ if (body instanceof Block) {
1027
+ const block: Node | undefined = factory.updateBlock(
1028
+ body,
1029
+ new NodeList(body.statements.pos, body.statements.end, exports.concat(body.statements.nodes)),
1030
+ body.multiLine,
1031
+ );
1032
+ updatedBody = block !== undefined ? block : body;
1033
+ } else {
1034
+ exports.push(body);
1035
+ updatedBody = factory.createBlock(exports, true);
1036
+ }
1037
+ return factory.updateForInOrOfStatement(node, node.awaitModifier, visitedInitializer, expression, updatedBody);
1038
+ }
1039
+ }
1040
+ return factory.updateForInOrOfStatement(
1041
+ node,
1042
+ node.awaitModifier,
1043
+ this.discarded.visitNode(initializer)!,
1044
+ this.visitNode(node.expression)!,
1045
+ this.topLevelNested.visitIterationBody(node.statement)!,
1046
+ );
1047
+ }
1048
+
1049
+ // Expressions
1050
+
1051
+ private visitBinaryExpression(node: BinaryExpression, discarded: boolean): Node {
1052
+ if (isDestructuringAssignment(node)) return this.visitDestructuringAssignment(node, discarded);
1053
+ if (isAssignmentExpression(node, false)) return this.visitAssignmentExpression(node);
1054
+ if (node.operatorToken.kind === SyntaxKind.CommaToken)
1055
+ return this.factory.updateBinaryExpression(
1056
+ node,
1057
+ undefined,
1058
+ this.discarded.visitNode(node.left)!,
1059
+ undefined,
1060
+ node.operatorToken,
1061
+ (discarded ? this.discarded.visitNode(node.right) : this.visitNode(node.right))!,
1062
+ );
1063
+ return this.visitEachChild(node);
1064
+ }
1065
+
1066
+ /** Assigning an exported name also assigns each of its exports. */
1067
+ private visitAssignmentExpression(node: BinaryExpression): Node {
1068
+ const left = node.left;
1069
+ if (left instanceof Identifier && this.isSubstitutableName(left)) {
1070
+ const exportedNames = this.getExports(left);
1071
+ if (exportedNames !== undefined && exportedNames.length > 0) {
1072
+ let expression = this.visitEachChild(node);
1073
+ for (let i = 0; i < exportedNames.length; i++)
1074
+ expression = this.createExportExpression(exportedNames[i], expression, node, false);
1075
+ return expression;
1076
+ }
1077
+ }
1078
+ return this.visitEachChild(node);
1079
+ }
1080
+
1081
+ /** Not generated (except file-level reserved names) and not a local name. */
1082
+ private isSubstitutableName(name: Identifier): boolean {
1083
+ const context = this.context;
1084
+ return (
1085
+ (!context.hasAutoGenerateInfo(name) || this.isFileLevelReservedGeneratedIdentifier(name)) &&
1086
+ (context.getEmitFlags(name) & EmitFlags.LocalName) === 0
1087
+ );
1088
+ }
1089
+
1090
+ private visitDestructuringAssignment(node: BinaryExpression, discarded: boolean): Node {
1091
+ if (this.destructuringNeedsFlattening(node.left))
1092
+ return flattenDestructuringAssignment(this, node, !discarded, this.exportAssignments);
1093
+ return this.visitEachChild(node);
1094
+ }
1095
+
1096
+ /** Whether a destructuring target assigns an exported name that native destructuring can't update. */
1097
+ private destructuringNeedsFlattening(node: Node): boolean {
1098
+ if (node instanceof ObjectLiteralExpression) {
1099
+ const properties = node.properties.nodes;
1100
+ for (let i = 0; i < properties.length; i++) {
1101
+ const element = properties[i];
1102
+ if (element instanceof PropertyAssignment) {
1103
+ if (this.destructuringNeedsFlattening(element.initializer)) return true;
1104
+ } else if (element instanceof ShorthandPropertyAssignment) {
1105
+ if (this.destructuringNeedsFlattening(element.name)) return true;
1106
+ } else if (element instanceof SpreadAssignment) {
1107
+ if (this.destructuringNeedsFlattening(element.expression)) return true;
1108
+ } else if (
1109
+ element.kind === SyntaxKind.MethodDeclaration ||
1110
+ element.kind === SyntaxKind.GetAccessor ||
1111
+ element.kind === SyntaxKind.SetAccessor
1112
+ )
1113
+ return false;
1114
+ }
1115
+ return false;
1116
+ }
1117
+ if (node instanceof ArrayLiteralExpression) {
1118
+ const elements = node.elements.nodes;
1119
+ for (let i = 0; i < elements.length; i++) {
1120
+ const element = elements[i];
1121
+ const target = element instanceof SpreadElement ? element.expression : element;
1122
+ if (this.destructuringNeedsFlattening(target)) return true;
1123
+ }
1124
+ return false;
1125
+ }
1126
+ if (node instanceof Identifier) {
1127
+ const exportedNames = this.getExports(node as Identifier);
1128
+ const count = exportedNames === undefined ? 0 : exportedNames.length;
1129
+ if ((this.context.getEmitFlags(node) & EmitFlags.ExportName) !== 0) return count > 1;
1130
+ if (count === 0) return false;
1131
+ // A single direct export of the same name becomes `exports.x` natively.
1132
+ if (
1133
+ count === 1 &&
1134
+ this.isDirectExport(node as Identifier) &&
1135
+ moduleExportNameText(exportedNames![0]) === node.text
1136
+ )
1137
+ return false;
1138
+ return true;
1139
+ }
1140
+ return false;
1141
+ }
1142
+
1143
+ /** The assignment of a flattened destructuring target, assigning its exports too. */
1144
+ createAllExportExpressions(name: Identifier, value: Node, pos: number, end: number): Node {
1145
+ const factory = this.factory;
1146
+ const exportedNames = this.getExports(name);
1147
+ if (exportedNames !== undefined && exportedNames.length > 0) {
1148
+ let expression = this.isDirectExport(name)
1149
+ ? this.createDirectExportAssignment(name, value)
1150
+ : factory.createAssignment(name, value);
1151
+ for (let i = 0; i < exportedNames.length; i++) {
1152
+ expression = this.createExportExpression(exportedNames[i], expression, undefined, false);
1153
+ this.context.setCommentRange(expression, pos, end);
1154
+ }
1155
+ return expression;
1156
+ }
1157
+ if (this.isDirectExport(name)) return this.createDirectExportAssignment(name, value);
1158
+ return factory.createAssignment(name, value);
1159
+ }
1160
+
1161
+ /** `exports.x = value` for a directly exported `x`. */
1162
+ private createDirectExportAssignment(name: Identifier, value: Node): Node {
1163
+ const factory = this.factory;
1164
+ const context = this.context;
1165
+ const exportName = factory.cloneIdentifier(name);
1166
+ context.addEmitFlags(exportName, EmitFlags.NoComments | EmitFlags.NoSourceMap);
1167
+ const access = factory.createPropertyAccessExpression(factory.createIdentifier('exports'), exportName);
1168
+ context.addEmitFlags(access, EmitFlags.NoComments);
1169
+ const assignment = factory.createAssignment(access, value);
1170
+ context.assignCommentAndSourceMapRanges(assignment, name);
1171
+ return assignment;
1172
+ }
1173
+
1174
+ /** Whether `name` refers to a declaration exported by the module itself, like `export let x`. */
1175
+ private isDirectExport(name: Identifier): boolean {
1176
+ const location = this.context.mostOriginal(name);
1177
+ if (!(location instanceof Identifier) || (location.flags & NodeFlags.Synthesized) !== 0) return false;
1178
+ return this.resolver.getReferencedExportContainer(location as Identifier, false) instanceof SourceFile;
1179
+ }
1180
+
1181
+ private visitPrefixUnaryExpression(node: PrefixUnaryExpression): Node {
1182
+ const operand = node.operand;
1183
+ if (
1184
+ (node.operator === SyntaxKind.PlusPlusToken || node.operator === SyntaxKind.MinusMinusToken) &&
1185
+ operand instanceof Identifier &&
1186
+ (this.context.getEmitFlags(operand) & EmitFlags.LocalName) === 0
1187
+ ) {
1188
+ const exportedNames = this.getExports(operand);
1189
+ if (exportedNames !== undefined && exportedNames.length > 0) {
1190
+ // exports.x = ++x;
1191
+ let expression: Node = this.factory.updatePrefixUnaryExpression(node, node.operator, this.visitNode(operand)!);
1192
+ for (let i = 0; i < exportedNames.length; i++) {
1193
+ expression = this.createExportExpression(exportedNames[i], expression, undefined, false);
1194
+ this.context.assignCommentAndSourceMapRanges(expression, node);
1195
+ }
1196
+ return expression;
1197
+ }
1198
+ }
1199
+ return this.visitEachChild(node);
1200
+ }
1201
+
1202
+ private visitPostfixUnaryExpression(node: PostfixUnaryExpression, discarded: boolean): Node {
1203
+ const operand = node.operand;
1204
+ if (
1205
+ (node.operator === SyntaxKind.PlusPlusToken || node.operator === SyntaxKind.MinusMinusToken) &&
1206
+ operand instanceof Identifier &&
1207
+ (this.context.getEmitFlags(operand) & EmitFlags.LocalName) === 0
1208
+ ) {
1209
+ const exportedNames = this.getExports(operand);
1210
+ if (exportedNames !== undefined && exportedNames.length > 0) {
1211
+ // exports.x = (x++, x); or, when the value is used: (exports.x = (_a = x++, x), _a)
1212
+ const factory = this.factory;
1213
+ const context = this.context;
1214
+ let temp: Identifier | undefined = undefined;
1215
+ let expression: Node = factory.updatePostfixUnaryExpression(node, this.visitNode(operand)!, node.operator);
1216
+ if (!discarded) {
1217
+ temp = factory.createTempVariable(0);
1218
+ context.addVariableDeclaration(temp);
1219
+ expression = factory.createAssignment(temp, expression);
1220
+ context.assignCommentAndSourceMapRanges(expression, node);
1221
+ }
1222
+ expression = factory.createCommaExpression(expression, factory.cloneIdentifier(operand));
1223
+ context.assignCommentAndSourceMapRanges(expression, node);
1224
+ for (let i = 0; i < exportedNames.length; i++) {
1225
+ expression = this.createExportExpression(exportedNames[i], expression, undefined, false);
1226
+ context.assignCommentAndSourceMapRanges(expression, node);
1227
+ }
1228
+ if (temp !== undefined) {
1229
+ expression = factory.createCommaExpression(expression, temp);
1230
+ context.assignCommentAndSourceMapRanges(expression, node);
1231
+ }
1232
+ return expression;
1233
+ }
1234
+ }
1235
+ return this.visitEachChild(node);
1236
+ }
1237
+
1238
+ /** `(0, mod_1.f)()` for a call of an import; `import()` becomes a `require` call. */
1239
+ private visitCallExpression(node: CallExpression): Node {
1240
+ const rewrite =
1241
+ this.options.rewriteRelativeImportExtensions === true &&
1242
+ ((isImportCall(node) && node.arguments.nodes.length > 0) || (isInJSFile(node) && isRequireCall(node, false)));
1243
+ if (isImportCall(node) && this.shouldTransformImportCall()) return this.visitImportCallExpression(node, rewrite);
1244
+ if (rewrite) return this.rewriteImportOrRequireCall(node);
1245
+ const callee = node.expression;
1246
+ if (callee instanceof Identifier) {
1247
+ const expression = this.visitExpressionIdentifier(callee);
1248
+ const updated = this.factory.updateCallExpression(
1249
+ node,
1250
+ expression,
1251
+ node.questionDotToken,
1252
+ undefined,
1253
+ this.visitNodes(node.arguments)!,
1254
+ node.flags,
1255
+ );
1256
+ if (!(expression instanceof Identifier) && (this.context.getEmitFlags(callee) & EmitFlags.HelperName) === 0)
1257
+ this.context.addEmitFlags(updated, EmitFlags.IndirectCall);
1258
+ return updated;
1259
+ }
1260
+ return this.visitEachChild(node);
1261
+ }
1262
+
1263
+ private shouldTransformImportCall(): boolean {
1264
+ const kind = this.moduleKind;
1265
+ if ((kind >= ModuleKind.Node16 && kind <= ModuleKind.NodeNext) || kind === ModuleKind.Preserve) return false;
1266
+ return this.formats.getEmitModuleFormat(this.currentSourceFile!.fileName) < ModuleKind.ES2015;
1267
+ }
1268
+
1269
+ private visitImportCallExpression(node: CallExpression, rewrite: boolean): Node {
1270
+ if (this.moduleKind === ModuleKind.None && this.languageVersion >= ScriptTarget.ES2020)
1271
+ return this.visitEachChild(node);
1272
+ const factory = this.factory;
1273
+ const specifier = getExternalModuleName(node);
1274
+ const moduleName =
1275
+ specifier instanceof StringLiteral ? factory.createStringLiteral(specifier.text, TokenFlags.None) : undefined;
1276
+ const args = node.arguments.nodes;
1277
+ const first = args.length > 0 ? this.visitNode(args[0]) : undefined;
1278
+ // The module name only where it differs from the argument, which keeps the argument's quotes.
1279
+ let argument: Node | undefined;
1280
+ if (moduleName !== undefined && (!(first instanceof StringLiteral) || first.text !== moduleName.text))
1281
+ argument = moduleName;
1282
+ else if (first !== undefined && rewrite)
1283
+ argument =
1284
+ first instanceof StringLiteral
1285
+ ? rewriteModuleSpecifier(this.context, first, this.options)
1286
+ : factory.createRewriteRelativeImportExtensionsHelper(first, this.options.jsx === JsxEmit.Preserve);
1287
+ else argument = first;
1288
+ return this.createImportCallExpressionCommonJS(argument);
1289
+ }
1290
+
1291
+ /** `Promise.resolve().then(() => __importStar(require(x)))` */
1292
+ private createImportCallExpressionCommonJS(argument: Node | undefined): Node {
1293
+ const factory = this.factory;
1294
+ // A non-literal argument is converted to a string synchronously, as `import()` does.
1295
+ const needSyncEval = argument !== undefined && !isSimpleInlineableExpression(argument);
1296
+ const resolveArguments: Node[] = [];
1297
+ if (needSyncEval)
1298
+ resolveArguments.push(
1299
+ factory.created(
1300
+ new TemplateExpression(
1301
+ factory.created(new TemplateHead('', '', TokenFlags.None)),
1302
+ factory.createNodeList([
1303
+ factory.created(new TemplateSpan(argument!, factory.created(new TemplateTail('', '', TokenFlags.None)))),
1304
+ ]),
1305
+ ),
1306
+ ),
1307
+ );
1308
+ const promiseResolve = factory.createCallExpression(
1309
+ factory.createPropertyAccessExpression(factory.createIdentifier('Promise'), factory.createIdentifier('resolve')),
1310
+ resolveArguments,
1311
+ );
1312
+ const requireArguments: Node[] = needSyncEval
1313
+ ? [factory.createIdentifier('s')]
1314
+ : argument !== undefined
1315
+ ? [argument]
1316
+ : [];
1317
+ const requireCall = factory.createImportStarHelper(
1318
+ factory.createCallExpression(factory.createIdentifier('require'), requireArguments),
1319
+ );
1320
+ const parameters: Node[] = needSyncEval ? [factory.createParameter(factory.createIdentifier('s'))] : [];
1321
+ return factory.createCallExpression(
1322
+ factory.createPropertyAccessExpression(promiseResolve, factory.createIdentifier('then')),
1323
+ [factory.createArrowFunction(parameters, requireCall)],
1324
+ );
1325
+ }
1326
+
1327
+ private rewriteImportOrRequireCall(node: CallExpression): Node {
1328
+ const factory = this.factory;
1329
+ const expression = this.visitNode(node.expression)!;
1330
+ let args = node.arguments;
1331
+ const nodes = args.nodes;
1332
+ if (nodes.length > 0) {
1333
+ const first = nodes[0];
1334
+ const rewritten =
1335
+ first instanceof StringLiteral || first.kind === SyntaxKind.NoSubstitutionTemplateLiteral
1336
+ ? rewriteModuleSpecifier(this.context, first, this.options)
1337
+ : factory.createRewriteRelativeImportExtensionsHelper(first, this.options.jsx === JsxEmit.Preserve);
1338
+ const rest = nodes.slice(1);
1339
+ const visitedRest = this.visitArray(rest);
1340
+ if (rewritten !== first || visitedRest !== rest)
1341
+ args = new NodeList(args.pos, args.end, [rewritten].concat(visitedRest));
1342
+ }
1343
+ return factory.updateCallExpression(node, expression, node.questionDotToken, undefined, args, node.flags);
1344
+ }
1345
+
1346
+ private visitTaggedTemplateExpression(node: TaggedTemplateExpression): Node {
1347
+ const tag = node.tag;
1348
+ if (!(tag instanceof Identifier)) return this.visitEachChild(node);
1349
+ const expression = this.visitExpressionIdentifier(tag);
1350
+ const updated = this.factory.updateTaggedTemplateExpression(
1351
+ node,
1352
+ expression,
1353
+ undefined,
1354
+ undefined,
1355
+ this.visitNode(node.template)!,
1356
+ node.flags,
1357
+ );
1358
+ if (!(expression instanceof Identifier) && (this.context.getEmitFlags(tag) & EmitFlags.HelperName) === 0)
1359
+ this.context.addEmitFlags(updated, EmitFlags.IndirectCall);
1360
+ return updated;
1361
+ }
1362
+
1363
+ private visitShorthandPropertyAssignment(node: ShorthandPropertyAssignment): Node {
1364
+ const factory = this.factory;
1365
+ const name = node.name;
1366
+ const reference = name instanceof Identifier ? this.visitExpressionIdentifier(name) : name;
1367
+ if (reference !== name) {
1368
+ // `{ x }` becomes `{ x: exports.x }`; with an initializer, it's part of a destructuring assignment.
1369
+ let expression = reference;
1370
+ if (node.objectAssignmentInitializer !== undefined)
1371
+ expression = factory.createAssignment(expression, this.visitNode(node.objectAssignmentInitializer)!);
1372
+ const assignment = factory.createPropertyAssignment(name, expression);
1373
+ assignment.pos = node.pos;
1374
+ assignment.end = node.end;
1375
+ this.context.assignCommentAndSourceMapRanges(assignment, node);
1376
+ return assignment;
1377
+ }
1378
+ return factory.updateShorthandPropertyAssignment(
1379
+ node,
1380
+ undefined,
1381
+ reference,
1382
+ undefined,
1383
+ undefined,
1384
+ node.equalsToken,
1385
+ this.visitNode(node.objectAssignmentInitializer),
1386
+ );
1387
+ }
1388
+
1389
+ /** `exports.x` for an exported name, `mod_1.x` or `mod_1.default` for an import. */
1390
+ private visitExpressionIdentifier(node: Identifier): Node {
1391
+ const context = this.context;
1392
+ const factory = this.factory;
1393
+ const info = context.getAutoGenerateInfo(node);
1394
+ if (
1395
+ (info !== undefined && (info.flags & GeneratedIdentifierFlags.AllowNameSubstitution) === 0) ||
1396
+ (context.getEmitFlags(node) & (EmitFlags.HelperName | EmitFlags.LocalName)) !== 0 ||
1397
+ isDeclarationNameOfEnumOrNamespace(context.mostOriginal(node))
1398
+ )
1399
+ return node;
1400
+ const location = context.mostOriginal(node);
1401
+ if (!(location instanceof Identifier)) return node;
1402
+ // Generated names, such as the JSX transform's `_jsx`, may still refer to an import.
1403
+ const synthesized = (location.flags & NodeFlags.Synthesized) !== 0;
1404
+ const container = synthesized
1405
+ ? undefined
1406
+ : this.resolver.getReferencedExportContainer(
1407
+ location as Identifier,
1408
+ (context.getEmitFlags(node) & EmitFlags.ExportName) !== 0,
1409
+ );
1410
+ if (container instanceof SourceFile) {
1411
+ const reference = factory.createPropertyAccessExpression(
1412
+ factory.createIdentifier('exports'),
1413
+ factory.cloneIdentifier(node),
1414
+ );
1415
+ context.assignCommentAndSourceMapRanges(reference, node);
1416
+ reference.pos = node.pos;
1417
+ reference.end = node.end;
1418
+ return reference;
1419
+ }
1420
+ const declaration = this.resolver.getReferencedImportDeclaration(location as Identifier);
1421
+ if (declaration instanceof ImportClause && declaration.parent !== undefined) {
1422
+ const reference = factory.createPropertyAccessExpression(
1423
+ factory.createGeneratedNameForNode(declaration.parent, 0, '', ''),
1424
+ factory.createIdentifier('default'),
1425
+ );
1426
+ context.assignCommentAndSourceMapRanges(reference, node);
1427
+ reference.pos = node.pos;
1428
+ reference.end = node.end;
1429
+ return reference;
1430
+ }
1431
+ if (declaration instanceof ImportSpecifier) {
1432
+ const imported = declaration.propertyName !== undefined ? declaration.propertyName : declaration.name;
1433
+ const importDeclaration = findImportDeclaration(declaration);
1434
+ const target = factory.createGeneratedNameForNode(
1435
+ importDeclaration !== undefined ? importDeclaration : declaration,
1436
+ 0,
1437
+ '',
1438
+ '',
1439
+ );
1440
+ let reference: Node;
1441
+ if (imported instanceof StringLiteral)
1442
+ reference = factory.createElementAccessExpression(target, factory.createStringLiteralFromNode(imported));
1443
+ else {
1444
+ const name = imported instanceof Identifier ? factory.cloneIdentifier(imported) : imported;
1445
+ context.addEmitFlags(name, EmitFlags.NoSourceMap | EmitFlags.NoComments);
1446
+ reference = factory.createPropertyAccessExpression(target, name);
1447
+ }
1448
+ context.assignCommentAndSourceMapRanges(reference, node);
1449
+ reference.pos = node.pos;
1450
+ reference.end = node.end;
1451
+ return reference;
1452
+ }
1453
+ return node;
1454
+ }
1455
+
1456
+ /** The export names of what `name` refers to. */
1457
+ private getExports(name: Identifier): Node[] | undefined {
1458
+ const context = this.context;
1459
+ const info = this.moduleInfo();
1460
+ if (!context.hasAutoGenerateInfo(name)) {
1461
+ const location = context.mostOriginal(name);
1462
+ if (!(location instanceof Identifier) || (location.flags & NodeFlags.Synthesized) !== 0) return undefined;
1463
+ const importDeclaration = this.resolver.getReferencedImportDeclaration(location as Identifier);
1464
+ if (importDeclaration !== undefined) return info.getExportedBindings(importDeclaration);
1465
+ // An exported namespace or enum may merge with ambient declarations, so all value declarations count.
1466
+ const declarations = this.resolver.getReferencedValueDeclarations(location as Identifier);
1467
+ if (declarations === undefined) return undefined;
1468
+ const bindings: Node[] = [];
1469
+ for (let i = 0; i < declarations.length; i++) {
1470
+ const exported = info.getExportedBindings(declarations[i]);
1471
+ if (exported === undefined) continue;
1472
+ for (let j = 0; j < exported.length; j++) if (bindings.indexOf(exported[j]) < 0) bindings.push(exported[j]);
1473
+ }
1474
+ return bindings;
1475
+ }
1476
+ if (this.isFileLevelReservedGeneratedIdentifier(name)) {
1477
+ const specifiers = info.exportSpecifiers.get(name.text);
1478
+ if (specifiers === undefined) return undefined;
1479
+ const names: Node[] = [];
1480
+ for (let i = 0; i < specifiers.length; i++) names.push(specifiers[i].name);
1481
+ return names;
1482
+ }
1483
+ return undefined;
1484
+ }
1485
+
1486
+ private isFileLevelReservedGeneratedIdentifier(name: Identifier): boolean {
1487
+ const info = this.context.getAutoGenerateInfo(name);
1488
+ const flags =
1489
+ GeneratedIdentifierFlags.FileLevel |
1490
+ GeneratedIdentifierFlags.Optimistic |
1491
+ GeneratedIdentifierFlags.ReservedInNestedScopes;
1492
+ return info !== undefined && (info.flags & flags) === flags;
1493
+ }
1494
+ }
1495
+
1496
+ /** Builds the statements of an exported variable statement, grouping declarations and assignments. */
1497
+ class ExportedVariableSplitter {
1498
+ readonly owner: CommonJSModuleTransformer;
1499
+ readonly node: VariableStatement;
1500
+ readonly statements: Node[];
1501
+ private variables: Node[];
1502
+ private expressions: Node[];
1503
+ private modifiers: ModifierList | undefined;
1504
+ private hasModifiers: boolean;
1505
+
1506
+ constructor(owner: CommonJSModuleTransformer, node: VariableStatement) {
1507
+ this.owner = owner;
1508
+ this.node = node;
1509
+ this.statements = [];
1510
+ this.variables = [];
1511
+ this.expressions = [];
1512
+ this.modifiers = undefined;
1513
+ this.hasModifiers = false;
1514
+ }
1515
+
1516
+ ensureModifiers(): boolean {
1517
+ if (!this.hasModifiers) {
1518
+ this.modifiers = this.owner.extractModifiers(this.node.modifiers, ~exportDefault);
1519
+ this.hasModifiers = true;
1520
+ }
1521
+ return true;
1522
+ }
1523
+
1524
+ pushVariable(variable: Node): boolean {
1525
+ this.commitExpressions();
1526
+ this.variables.push(variable);
1527
+ return true;
1528
+ }
1529
+
1530
+ pushExpression(expression: Node): boolean {
1531
+ this.commitVariables();
1532
+ this.expressions.push(expression);
1533
+ return true;
1534
+ }
1535
+
1536
+ commitVariables(): boolean {
1537
+ if (this.variables.length === 0) return false;
1538
+ const factory = this.owner.factory;
1539
+ const list = this.node.declarationList;
1540
+ const statement = factory.updateVariableStatement(
1541
+ this.node,
1542
+ this.modifiers,
1543
+ factory.updateVariableDeclarationList(list, factory.createNodeList(this.variables), list.flags),
1544
+ );
1545
+ if (this.statements.length > 0) this.owner.context.addEmitFlags(statement, EmitFlags.NoComments);
1546
+ this.statements.push(statement as Node);
1547
+ this.variables = [];
1548
+ return true;
1549
+ }
1550
+
1551
+ commitExpressions(): boolean {
1552
+ if (this.expressions.length === 0) return false;
1553
+ const factory = this.owner.factory;
1554
+ const statement = factory.createExpressionStatement(factory.inlineExpressions(this.expressions)!);
1555
+ this.owner.context.assignCommentAndSourceMapRanges(statement, this.node);
1556
+ if (this.statements.length > 0) this.owner.context.addEmitFlags(statement, EmitFlags.NoComments);
1557
+ this.statements.push(statement);
1558
+ this.expressions = [];
1559
+ return true;
1560
+ }
1561
+ }
1562
+
1563
+ function appendAll(target: Node[], source: readonly Node[]): Node[] {
1564
+ for (let i = 0; i < source.length; i++) target.push(source[i]);
1565
+ return target;
1566
+ }
1567
+
1568
+ function standardPrologueEnd(statements: readonly Node[]): number {
1569
+ let i = 0;
1570
+ while (i < statements.length && isPrologueDirective(statements[i])) i++;
1571
+ return i;
1572
+ }
1573
+
1574
+ function bindingElementsOf(node: Node): Node[] {
1575
+ const elements = getElements(node);
1576
+ return elements === undefined ? [] : elements.nodes;
1577
+ }
1578
+
1579
+ function bindingNameOf(node: Node): Node | undefined {
1580
+ return getName(node);
1581
+ }
1582
+
1583
+ function declarationNameOf(node: Node): Node | undefined {
1584
+ return getName(node);
1585
+ }
1586
+
1587
+ function namespaceNameOf(node: Node): Node {
1588
+ return getName(node)!;
1589
+ }
1590
+
1591
+ function findImportDeclaration(node: Node): ImportDeclaration | undefined {
1592
+ for (let current: Node | undefined = node; current !== undefined; current = current.parent)
1593
+ if (current instanceof ImportDeclaration) return current as ImportDeclaration;
1594
+ return undefined;
1595
+ }
1596
+
1597
+ function isDeclarationNameOfEnumOrNamespace(original: Node): boolean {
1598
+ const parent = original.parent;
1599
+ if (parent === undefined) return false;
1600
+ if (parent.kind !== SyntaxKind.EnumDeclaration && parent.kind !== SyntaxKind.ModuleDeclaration) return false;
1601
+ return getName(parent) === original;
1602
+ }
1603
+
1604
+ /** A literal or keyword: copied into several places without side effects. */
1605
+ function isSimpleInlineableExpression(node: Node): boolean {
1606
+ return !(node instanceof Identifier) && isSimpleCopiableExpression(node);
1607
+ }
1608
+
1609
+ /** Whether a file has `import()` calls. */
1610
+ function containsDynamicImport(file: SourceFile): boolean {
1611
+ const finder = new DynamicImportFinder();
1612
+ return file.forEachChild(finder);
1613
+ }
1614
+
1615
+ class DynamicImportFinder extends NodeVisitor {
1616
+ visitNode(node: Node): boolean {
1617
+ // `import()`, not `import.defer()`.
1618
+ if (node instanceof CallExpression && node.expression.kind === SyntaxKind.ImportKeyword) return true;
1619
+ return node.forEachChild(this);
1620
+ }
1621
+ }