@ttsc/factory 0.15.9 → 0.15.11

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 (541) hide show
  1. package/README.md +3 -2
  2. package/lib/TsPrinter.d.ts +51 -11
  3. package/lib/TsPrinter.js +555 -70
  4. package/lib/TsPrinter.js.map +1 -1
  5. package/lib/TsPrinter.mjs +1827 -0
  6. package/lib/TsPrinter.mjs.map +1 -0
  7. package/lib/comments.mjs +76 -0
  8. package/lib/comments.mjs.map +1 -0
  9. package/lib/factory/clauses/createHeritageClause.mjs +26 -0
  10. package/lib/factory/clauses/createHeritageClause.mjs.map +1 -0
  11. package/lib/factory/clauses/createParameterDeclaration.mjs +43 -0
  12. package/lib/factory/clauses/createParameterDeclaration.mjs.map +1 -0
  13. package/lib/factory/declarations/createClassDeclaration.mjs +44 -0
  14. package/lib/factory/declarations/createClassDeclaration.mjs.map +1 -0
  15. package/lib/factory/declarations/createClassStaticBlockDeclaration.mjs +25 -0
  16. package/lib/factory/declarations/createClassStaticBlockDeclaration.mjs.map +1 -0
  17. package/lib/factory/declarations/createConstructorDeclaration.mjs +28 -0
  18. package/lib/factory/declarations/createConstructorDeclaration.mjs.map +1 -0
  19. package/lib/factory/declarations/createEnumDeclaration.mjs +31 -0
  20. package/lib/factory/declarations/createEnumDeclaration.mjs.map +1 -0
  21. package/lib/factory/declarations/createEnumMember.mjs +26 -0
  22. package/lib/factory/declarations/createEnumMember.mjs.map +1 -0
  23. package/lib/factory/declarations/createExternalModuleReference.mjs +23 -0
  24. package/lib/factory/declarations/createExternalModuleReference.mjs.map +1 -0
  25. package/lib/factory/declarations/createFunctionDeclaration.mjs +48 -0
  26. package/lib/factory/declarations/createFunctionDeclaration.mjs.map +1 -0
  27. package/lib/factory/declarations/createGetAccessorDeclaration.mjs +39 -0
  28. package/lib/factory/declarations/createGetAccessorDeclaration.mjs.map +1 -0
  29. package/lib/factory/declarations/createImportEqualsDeclaration.mjs +35 -0
  30. package/lib/factory/declarations/createImportEqualsDeclaration.mjs.map +1 -0
  31. package/lib/factory/declarations/createInterfaceDeclaration.mjs +40 -0
  32. package/lib/factory/declarations/createInterfaceDeclaration.mjs.map +1 -0
  33. package/lib/factory/declarations/createMethodDeclaration.mjs +50 -0
  34. package/lib/factory/declarations/createMethodDeclaration.mjs.map +1 -0
  35. package/lib/factory/declarations/createModuleBlock.mjs +25 -0
  36. package/lib/factory/declarations/createModuleBlock.mjs.map +1 -0
  37. package/lib/factory/declarations/createModuleDeclaration.mjs +43 -0
  38. package/lib/factory/declarations/createModuleDeclaration.mjs.map +1 -0
  39. package/lib/factory/declarations/createNamespaceExportDeclaration.mjs +24 -0
  40. package/lib/factory/declarations/createNamespaceExportDeclaration.mjs.map +1 -0
  41. package/lib/factory/declarations/createPropertyDeclaration.mjs +41 -0
  42. package/lib/factory/declarations/createPropertyDeclaration.mjs.map +1 -0
  43. package/lib/factory/declarations/createSemicolonClassElement.mjs +20 -0
  44. package/lib/factory/declarations/createSemicolonClassElement.mjs.map +1 -0
  45. package/lib/factory/declarations/createSetAccessorDeclaration.mjs +37 -0
  46. package/lib/factory/declarations/createSetAccessorDeclaration.mjs.map +1 -0
  47. package/lib/factory/declarations/createTypeAliasDeclaration.mjs +35 -0
  48. package/lib/factory/declarations/createTypeAliasDeclaration.mjs.map +1 -0
  49. package/lib/factory/expressions/createAdd.mjs +26 -0
  50. package/lib/factory/expressions/createAdd.mjs.map +1 -0
  51. package/lib/factory/expressions/createArrayBindingPattern.mjs +23 -0
  52. package/lib/factory/expressions/createArrayBindingPattern.mjs.map +1 -0
  53. package/lib/factory/expressions/createArrayLiteralExpression.mjs +25 -0
  54. package/lib/factory/expressions/createArrayLiteralExpression.mjs.map +1 -0
  55. package/lib/factory/expressions/createArrowFunction.mjs +32 -0
  56. package/lib/factory/expressions/createArrowFunction.mjs.map +1 -0
  57. package/lib/factory/expressions/createAsExpression.mjs +23 -0
  58. package/lib/factory/expressions/createAsExpression.mjs.map +1 -0
  59. package/lib/factory/expressions/createAssignment.mjs +26 -0
  60. package/lib/factory/expressions/createAssignment.mjs.map +1 -0
  61. package/lib/factory/expressions/createAwaitExpression.mjs +22 -0
  62. package/lib/factory/expressions/createAwaitExpression.mjs.map +1 -0
  63. package/lib/factory/expressions/createBinaryExpression.mjs +33 -0
  64. package/lib/factory/expressions/createBinaryExpression.mjs.map +1 -0
  65. package/lib/factory/expressions/createBindingElement.mjs +39 -0
  66. package/lib/factory/expressions/createBindingElement.mjs.map +1 -0
  67. package/lib/factory/expressions/createBitwiseAnd.mjs +26 -0
  68. package/lib/factory/expressions/createBitwiseAnd.mjs.map +1 -0
  69. package/lib/factory/expressions/createBitwiseNot.mjs +25 -0
  70. package/lib/factory/expressions/createBitwiseNot.mjs.map +1 -0
  71. package/lib/factory/expressions/createBitwiseOr.mjs +25 -0
  72. package/lib/factory/expressions/createBitwiseOr.mjs.map +1 -0
  73. package/lib/factory/expressions/createBitwiseXor.mjs +25 -0
  74. package/lib/factory/expressions/createBitwiseXor.mjs.map +1 -0
  75. package/lib/factory/expressions/createCallChain.mjs +35 -0
  76. package/lib/factory/expressions/createCallChain.mjs.map +1 -0
  77. package/lib/factory/expressions/createCallExpression.mjs +29 -0
  78. package/lib/factory/expressions/createCallExpression.mjs.map +1 -0
  79. package/lib/factory/expressions/createClassExpression.mjs +34 -0
  80. package/lib/factory/expressions/createClassExpression.mjs.map +1 -0
  81. package/lib/factory/expressions/createComma.mjs +28 -0
  82. package/lib/factory/expressions/createComma.mjs.map +1 -0
  83. package/lib/factory/expressions/createCommaListExpression.mjs +23 -0
  84. package/lib/factory/expressions/createCommaListExpression.mjs.map +1 -0
  85. package/lib/factory/expressions/createComputedPropertyName.mjs +23 -0
  86. package/lib/factory/expressions/createComputedPropertyName.mjs.map +1 -0
  87. package/lib/factory/expressions/createConditionalExpression.mjs +28 -0
  88. package/lib/factory/expressions/createConditionalExpression.mjs.map +1 -0
  89. package/lib/factory/expressions/createDeleteExpression.mjs +22 -0
  90. package/lib/factory/expressions/createDeleteExpression.mjs.map +1 -0
  91. package/lib/factory/expressions/createDivide.mjs +25 -0
  92. package/lib/factory/expressions/createDivide.mjs.map +1 -0
  93. package/lib/factory/expressions/createElementAccessChain.mjs +32 -0
  94. package/lib/factory/expressions/createElementAccessChain.mjs.map +1 -0
  95. package/lib/factory/expressions/createElementAccessExpression.mjs +28 -0
  96. package/lib/factory/expressions/createElementAccessExpression.mjs.map +1 -0
  97. package/lib/factory/expressions/createEquality.mjs +27 -0
  98. package/lib/factory/expressions/createEquality.mjs.map +1 -0
  99. package/lib/factory/expressions/createExponent.mjs +26 -0
  100. package/lib/factory/expressions/createExponent.mjs.map +1 -0
  101. package/lib/factory/expressions/createFunctionExpression.mjs +38 -0
  102. package/lib/factory/expressions/createFunctionExpression.mjs.map +1 -0
  103. package/lib/factory/expressions/createGreaterThan.mjs +27 -0
  104. package/lib/factory/expressions/createGreaterThan.mjs.map +1 -0
  105. package/lib/factory/expressions/createGreaterThanEquals.mjs +27 -0
  106. package/lib/factory/expressions/createGreaterThanEquals.mjs.map +1 -0
  107. package/lib/factory/expressions/createImmediatelyInvokedArrowFunction.mjs +29 -0
  108. package/lib/factory/expressions/createImmediatelyInvokedArrowFunction.mjs.map +1 -0
  109. package/lib/factory/expressions/createImmediatelyInvokedFunctionExpression.mjs +29 -0
  110. package/lib/factory/expressions/createImmediatelyInvokedFunctionExpression.mjs.map +1 -0
  111. package/lib/factory/expressions/createInequality.mjs +27 -0
  112. package/lib/factory/expressions/createInequality.mjs.map +1 -0
  113. package/lib/factory/expressions/createLeftShift.mjs +26 -0
  114. package/lib/factory/expressions/createLeftShift.mjs.map +1 -0
  115. package/lib/factory/expressions/createLessThan.mjs +26 -0
  116. package/lib/factory/expressions/createLessThan.mjs.map +1 -0
  117. package/lib/factory/expressions/createLessThanEquals.mjs +27 -0
  118. package/lib/factory/expressions/createLessThanEquals.mjs.map +1 -0
  119. package/lib/factory/expressions/createLogicalAnd.mjs +27 -0
  120. package/lib/factory/expressions/createLogicalAnd.mjs.map +1 -0
  121. package/lib/factory/expressions/createLogicalNot.mjs +25 -0
  122. package/lib/factory/expressions/createLogicalNot.mjs.map +1 -0
  123. package/lib/factory/expressions/createLogicalOr.mjs +26 -0
  124. package/lib/factory/expressions/createLogicalOr.mjs.map +1 -0
  125. package/lib/factory/expressions/createMetaProperty.mjs +29 -0
  126. package/lib/factory/expressions/createMetaProperty.mjs.map +1 -0
  127. package/lib/factory/expressions/createModulo.mjs +24 -0
  128. package/lib/factory/expressions/createModulo.mjs.map +1 -0
  129. package/lib/factory/expressions/createMultiply.mjs +24 -0
  130. package/lib/factory/expressions/createMultiply.mjs.map +1 -0
  131. package/lib/factory/expressions/createNewExpression.mjs +30 -0
  132. package/lib/factory/expressions/createNewExpression.mjs.map +1 -0
  133. package/lib/factory/expressions/createNonNullChain.mjs +24 -0
  134. package/lib/factory/expressions/createNonNullChain.mjs.map +1 -0
  135. package/lib/factory/expressions/createNonNullExpression.mjs +24 -0
  136. package/lib/factory/expressions/createNonNullExpression.mjs.map +1 -0
  137. package/lib/factory/expressions/createObjectBindingPattern.mjs +24 -0
  138. package/lib/factory/expressions/createObjectBindingPattern.mjs.map +1 -0
  139. package/lib/factory/expressions/createObjectLiteralExpression.mjs +27 -0
  140. package/lib/factory/expressions/createObjectLiteralExpression.mjs.map +1 -0
  141. package/lib/factory/expressions/createOmittedExpression.mjs +23 -0
  142. package/lib/factory/expressions/createOmittedExpression.mjs.map +1 -0
  143. package/lib/factory/expressions/createParenthesizedExpression.mjs +24 -0
  144. package/lib/factory/expressions/createParenthesizedExpression.mjs.map +1 -0
  145. package/lib/factory/expressions/createPartiallyEmittedExpression.mjs +26 -0
  146. package/lib/factory/expressions/createPartiallyEmittedExpression.mjs.map +1 -0
  147. package/lib/factory/expressions/createPostfixDecrement.mjs +23 -0
  148. package/lib/factory/expressions/createPostfixDecrement.mjs.map +1 -0
  149. package/lib/factory/expressions/createPostfixIncrement.mjs +23 -0
  150. package/lib/factory/expressions/createPostfixIncrement.mjs.map +1 -0
  151. package/lib/factory/expressions/createPostfixUnaryExpression.mjs +25 -0
  152. package/lib/factory/expressions/createPostfixUnaryExpression.mjs.map +1 -0
  153. package/lib/factory/expressions/createPrefixDecrement.mjs +23 -0
  154. package/lib/factory/expressions/createPrefixDecrement.mjs.map +1 -0
  155. package/lib/factory/expressions/createPrefixIncrement.mjs +23 -0
  156. package/lib/factory/expressions/createPrefixIncrement.mjs.map +1 -0
  157. package/lib/factory/expressions/createPrefixMinus.mjs +23 -0
  158. package/lib/factory/expressions/createPrefixMinus.mjs.map +1 -0
  159. package/lib/factory/expressions/createPrefixPlus.mjs +23 -0
  160. package/lib/factory/expressions/createPrefixPlus.mjs.map +1 -0
  161. package/lib/factory/expressions/createPrefixUnaryExpression.mjs +25 -0
  162. package/lib/factory/expressions/createPrefixUnaryExpression.mjs.map +1 -0
  163. package/lib/factory/expressions/createPropertyAccessChain.mjs +32 -0
  164. package/lib/factory/expressions/createPropertyAccessChain.mjs.map +1 -0
  165. package/lib/factory/expressions/createPropertyAccessExpression.mjs +28 -0
  166. package/lib/factory/expressions/createPropertyAccessExpression.mjs.map +1 -0
  167. package/lib/factory/expressions/createPropertyAssignment.mjs +26 -0
  168. package/lib/factory/expressions/createPropertyAssignment.mjs.map +1 -0
  169. package/lib/factory/expressions/createRegularExpressionLiteral.mjs +23 -0
  170. package/lib/factory/expressions/createRegularExpressionLiteral.mjs.map +1 -0
  171. package/lib/factory/expressions/createRightShift.mjs +24 -0
  172. package/lib/factory/expressions/createRightShift.mjs.map +1 -0
  173. package/lib/factory/expressions/createSatisfiesExpression.mjs +25 -0
  174. package/lib/factory/expressions/createSatisfiesExpression.mjs.map +1 -0
  175. package/lib/factory/expressions/createShorthandPropertyAssignment.mjs +31 -0
  176. package/lib/factory/expressions/createShorthandPropertyAssignment.mjs.map +1 -0
  177. package/lib/factory/expressions/createSpreadAssignment.mjs +23 -0
  178. package/lib/factory/expressions/createSpreadAssignment.mjs.map +1 -0
  179. package/lib/factory/expressions/createSpreadElement.mjs +23 -0
  180. package/lib/factory/expressions/createSpreadElement.mjs.map +1 -0
  181. package/lib/factory/expressions/createStrictEquality.mjs +24 -0
  182. package/lib/factory/expressions/createStrictEquality.mjs.map +1 -0
  183. package/lib/factory/expressions/createStrictInequality.mjs +24 -0
  184. package/lib/factory/expressions/createStrictInequality.mjs.map +1 -0
  185. package/lib/factory/expressions/createSubtract.mjs +24 -0
  186. package/lib/factory/expressions/createSubtract.mjs.map +1 -0
  187. package/lib/factory/expressions/createTaggedTemplateExpression.mjs +27 -0
  188. package/lib/factory/expressions/createTaggedTemplateExpression.mjs.map +1 -0
  189. package/lib/factory/expressions/createTemplateExpression.mjs +27 -0
  190. package/lib/factory/expressions/createTemplateExpression.mjs.map +1 -0
  191. package/lib/factory/expressions/createTemplateSpan.mjs +28 -0
  192. package/lib/factory/expressions/createTemplateSpan.mjs.map +1 -0
  193. package/lib/factory/expressions/createTypeAssertion.mjs +25 -0
  194. package/lib/factory/expressions/createTypeAssertion.mjs.map +1 -0
  195. package/lib/factory/expressions/createTypeOfExpression.mjs +22 -0
  196. package/lib/factory/expressions/createTypeOfExpression.mjs.map +1 -0
  197. package/lib/factory/expressions/createUnsignedRightShift.mjs +24 -0
  198. package/lib/factory/expressions/createUnsignedRightShift.mjs.map +1 -0
  199. package/lib/factory/expressions/createVoidExpression.mjs +23 -0
  200. package/lib/factory/expressions/createVoidExpression.mjs.map +1 -0
  201. package/lib/factory/expressions/createVoidZero.mjs +22 -0
  202. package/lib/factory/expressions/createVoidZero.mjs.map +1 -0
  203. package/lib/factory/expressions/createYieldExpression.mjs +26 -0
  204. package/lib/factory/expressions/createYieldExpression.mjs.map +1 -0
  205. package/lib/factory/file/createBundle.mjs +29 -0
  206. package/lib/factory/file/createBundle.mjs.map +1 -0
  207. package/lib/factory/file/createNodeArray.mjs +24 -0
  208. package/lib/factory/file/createNodeArray.mjs.map +1 -0
  209. package/lib/factory/file/createSourceFile.mjs +24 -0
  210. package/lib/factory/file/createSourceFile.mjs.map +1 -0
  211. package/lib/factory/file/updateSourceFile.mjs +14 -0
  212. package/lib/factory/file/updateSourceFile.mjs.map +1 -0
  213. package/lib/factory/imports/createExportAssignment.mjs +27 -0
  214. package/lib/factory/imports/createExportAssignment.mjs.map +1 -0
  215. package/lib/factory/imports/createExportDeclaration.mjs +38 -0
  216. package/lib/factory/imports/createExportDeclaration.mjs.map +1 -0
  217. package/lib/factory/imports/createExportDefault.mjs +23 -0
  218. package/lib/factory/imports/createExportDefault.mjs.map +1 -0
  219. package/lib/factory/imports/createExportSpecifier.mjs +32 -0
  220. package/lib/factory/imports/createExportSpecifier.mjs.map +1 -0
  221. package/lib/factory/imports/createExternalModuleExport.mjs +26 -0
  222. package/lib/factory/imports/createExternalModuleExport.mjs.map +1 -0
  223. package/lib/factory/imports/createImportAttribute.mjs +25 -0
  224. package/lib/factory/imports/createImportAttribute.mjs.map +1 -0
  225. package/lib/factory/imports/createImportAttributes.mjs +30 -0
  226. package/lib/factory/imports/createImportAttributes.mjs.map +1 -0
  227. package/lib/factory/imports/createImportClause.mjs +27 -0
  228. package/lib/factory/imports/createImportClause.mjs.map +1 -0
  229. package/lib/factory/imports/createImportDeclaration.mjs +34 -0
  230. package/lib/factory/imports/createImportDeclaration.mjs.map +1 -0
  231. package/lib/factory/imports/createImportSpecifier.mjs +28 -0
  232. package/lib/factory/imports/createImportSpecifier.mjs.map +1 -0
  233. package/lib/factory/imports/createNamedExports.mjs +25 -0
  234. package/lib/factory/imports/createNamedExports.mjs.map +1 -0
  235. package/lib/factory/imports/createNamedImports.mjs +25 -0
  236. package/lib/factory/imports/createNamedImports.mjs.map +1 -0
  237. package/lib/factory/imports/createNamespaceExport.mjs +25 -0
  238. package/lib/factory/imports/createNamespaceExport.mjs.map +1 -0
  239. package/lib/factory/imports/createNamespaceImport.mjs +24 -0
  240. package/lib/factory/imports/createNamespaceImport.mjs.map +1 -0
  241. package/lib/factory/index.mjs +268 -0
  242. package/lib/factory/index.mjs.map +1 -0
  243. package/lib/factory/internal/asEntityName.mjs +7 -0
  244. package/lib/factory/internal/asEntityName.mjs.map +1 -0
  245. package/lib/factory/internal/asName.mjs +11 -0
  246. package/lib/factory/internal/asName.mjs.map +1 -0
  247. package/lib/factory/internal/asPropertyName.mjs +7 -0
  248. package/lib/factory/internal/asPropertyName.mjs.map +1 -0
  249. package/lib/factory/internal/make.mjs +14 -0
  250. package/lib/factory/internal/make.mjs.map +1 -0
  251. package/lib/factory/jsdoc/createJSDocAllType.mjs +21 -0
  252. package/lib/factory/jsdoc/createJSDocAllType.mjs.map +1 -0
  253. package/lib/factory/jsdoc/createJSDocAugmentsTag.mjs +30 -0
  254. package/lib/factory/jsdoc/createJSDocAugmentsTag.mjs.map +1 -0
  255. package/lib/factory/jsdoc/createJSDocAuthorTag.mjs +27 -0
  256. package/lib/factory/jsdoc/createJSDocAuthorTag.mjs.map +1 -0
  257. package/lib/factory/jsdoc/createJSDocCallbackTag.mjs +37 -0
  258. package/lib/factory/jsdoc/createJSDocCallbackTag.mjs.map +1 -0
  259. package/lib/factory/jsdoc/createJSDocClassTag.mjs +27 -0
  260. package/lib/factory/jsdoc/createJSDocClassTag.mjs.map +1 -0
  261. package/lib/factory/jsdoc/createJSDocComment.mjs +29 -0
  262. package/lib/factory/jsdoc/createJSDocComment.mjs.map +1 -0
  263. package/lib/factory/jsdoc/createJSDocDeprecatedTag.mjs +27 -0
  264. package/lib/factory/jsdoc/createJSDocDeprecatedTag.mjs.map +1 -0
  265. package/lib/factory/jsdoc/createJSDocEnumTag.mjs +31 -0
  266. package/lib/factory/jsdoc/createJSDocEnumTag.mjs.map +1 -0
  267. package/lib/factory/jsdoc/createJSDocFunctionType.mjs +26 -0
  268. package/lib/factory/jsdoc/createJSDocFunctionType.mjs.map +1 -0
  269. package/lib/factory/jsdoc/createJSDocImplementsTag.mjs +30 -0
  270. package/lib/factory/jsdoc/createJSDocImplementsTag.mjs.map +1 -0
  271. package/lib/factory/jsdoc/createJSDocImportTag.mjs +34 -0
  272. package/lib/factory/jsdoc/createJSDocImportTag.mjs.map +1 -0
  273. package/lib/factory/jsdoc/createJSDocLink.mjs +29 -0
  274. package/lib/factory/jsdoc/createJSDocLink.mjs.map +1 -0
  275. package/lib/factory/jsdoc/createJSDocLinkCode.mjs +29 -0
  276. package/lib/factory/jsdoc/createJSDocLinkCode.mjs.map +1 -0
  277. package/lib/factory/jsdoc/createJSDocLinkPlain.mjs +29 -0
  278. package/lib/factory/jsdoc/createJSDocLinkPlain.mjs.map +1 -0
  279. package/lib/factory/jsdoc/createJSDocMemberName.mjs +26 -0
  280. package/lib/factory/jsdoc/createJSDocMemberName.mjs.map +1 -0
  281. package/lib/factory/jsdoc/createJSDocNameReference.mjs +25 -0
  282. package/lib/factory/jsdoc/createJSDocNameReference.mjs.map +1 -0
  283. package/lib/factory/jsdoc/createJSDocNamepathType.mjs +25 -0
  284. package/lib/factory/jsdoc/createJSDocNamepathType.mjs.map +1 -0
  285. package/lib/factory/jsdoc/createJSDocNonNullableType.mjs +33 -0
  286. package/lib/factory/jsdoc/createJSDocNonNullableType.mjs.map +1 -0
  287. package/lib/factory/jsdoc/createJSDocNullableType.mjs +33 -0
  288. package/lib/factory/jsdoc/createJSDocNullableType.mjs.map +1 -0
  289. package/lib/factory/jsdoc/createJSDocOptionalType.mjs +23 -0
  290. package/lib/factory/jsdoc/createJSDocOptionalType.mjs.map +1 -0
  291. package/lib/factory/jsdoc/createJSDocOverloadTag.mjs +35 -0
  292. package/lib/factory/jsdoc/createJSDocOverloadTag.mjs.map +1 -0
  293. package/lib/factory/jsdoc/createJSDocOverrideTag.mjs +27 -0
  294. package/lib/factory/jsdoc/createJSDocOverrideTag.mjs.map +1 -0
  295. package/lib/factory/jsdoc/createJSDocParameterTag.mjs +46 -0
  296. package/lib/factory/jsdoc/createJSDocParameterTag.mjs.map +1 -0
  297. package/lib/factory/jsdoc/createJSDocPrivateTag.mjs +27 -0
  298. package/lib/factory/jsdoc/createJSDocPrivateTag.mjs.map +1 -0
  299. package/lib/factory/jsdoc/createJSDocPropertyTag.mjs +40 -0
  300. package/lib/factory/jsdoc/createJSDocPropertyTag.mjs.map +1 -0
  301. package/lib/factory/jsdoc/createJSDocProtectedTag.mjs +27 -0
  302. package/lib/factory/jsdoc/createJSDocProtectedTag.mjs.map +1 -0
  303. package/lib/factory/jsdoc/createJSDocPublicTag.mjs +27 -0
  304. package/lib/factory/jsdoc/createJSDocPublicTag.mjs.map +1 -0
  305. package/lib/factory/jsdoc/createJSDocReadonlyTag.mjs +27 -0
  306. package/lib/factory/jsdoc/createJSDocReadonlyTag.mjs.map +1 -0
  307. package/lib/factory/jsdoc/createJSDocReturnTag.mjs +32 -0
  308. package/lib/factory/jsdoc/createJSDocReturnTag.mjs.map +1 -0
  309. package/lib/factory/jsdoc/createJSDocSatisfiesTag.mjs +31 -0
  310. package/lib/factory/jsdoc/createJSDocSatisfiesTag.mjs.map +1 -0
  311. package/lib/factory/jsdoc/createJSDocSeeTag.mjs +31 -0
  312. package/lib/factory/jsdoc/createJSDocSeeTag.mjs.map +1 -0
  313. package/lib/factory/jsdoc/createJSDocSignature.mjs +32 -0
  314. package/lib/factory/jsdoc/createJSDocSignature.mjs.map +1 -0
  315. package/lib/factory/jsdoc/createJSDocTemplateTag.mjs +34 -0
  316. package/lib/factory/jsdoc/createJSDocTemplateTag.mjs.map +1 -0
  317. package/lib/factory/jsdoc/createJSDocText.mjs +25 -0
  318. package/lib/factory/jsdoc/createJSDocText.mjs.map +1 -0
  319. package/lib/factory/jsdoc/createJSDocThisTag.mjs +30 -0
  320. package/lib/factory/jsdoc/createJSDocThisTag.mjs.map +1 -0
  321. package/lib/factory/jsdoc/createJSDocThrowsTag.mjs +30 -0
  322. package/lib/factory/jsdoc/createJSDocThrowsTag.mjs.map +1 -0
  323. package/lib/factory/jsdoc/createJSDocTypeExpression.mjs +24 -0
  324. package/lib/factory/jsdoc/createJSDocTypeExpression.mjs.map +1 -0
  325. package/lib/factory/jsdoc/createJSDocTypeLiteral.mjs +29 -0
  326. package/lib/factory/jsdoc/createJSDocTypeLiteral.mjs.map +1 -0
  327. package/lib/factory/jsdoc/createJSDocTypeTag.mjs +31 -0
  328. package/lib/factory/jsdoc/createJSDocTypeTag.mjs.map +1 -0
  329. package/lib/factory/jsdoc/createJSDocTypedefTag.mjs +34 -0
  330. package/lib/factory/jsdoc/createJSDocTypedefTag.mjs.map +1 -0
  331. package/lib/factory/jsdoc/createJSDocUnknownTag.mjs +27 -0
  332. package/lib/factory/jsdoc/createJSDocUnknownTag.mjs.map +1 -0
  333. package/lib/factory/jsdoc/createJSDocUnknownType.mjs +21 -0
  334. package/lib/factory/jsdoc/createJSDocUnknownType.mjs.map +1 -0
  335. package/lib/factory/jsdoc/createJSDocVariadicType.mjs +24 -0
  336. package/lib/factory/jsdoc/createJSDocVariadicType.mjs.map +1 -0
  337. package/lib/factory/jsx/createJsxAttribute.mjs +29 -0
  338. package/lib/factory/jsx/createJsxAttribute.mjs.map +1 -0
  339. package/lib/factory/jsx/createJsxAttributes.mjs +27 -0
  340. package/lib/factory/jsx/createJsxAttributes.mjs.map +1 -0
  341. package/lib/factory/jsx/createJsxClosingElement.mjs +24 -0
  342. package/lib/factory/jsx/createJsxClosingElement.mjs.map +1 -0
  343. package/lib/factory/jsx/createJsxElement.mjs +32 -0
  344. package/lib/factory/jsx/createJsxElement.mjs.map +1 -0
  345. package/lib/factory/jsx/createJsxExpression.mjs +29 -0
  346. package/lib/factory/jsx/createJsxExpression.mjs.map +1 -0
  347. package/lib/factory/jsx/createJsxFragment.mjs +32 -0
  348. package/lib/factory/jsx/createJsxFragment.mjs.map +1 -0
  349. package/lib/factory/jsx/createJsxJsxClosingFragment.mjs +23 -0
  350. package/lib/factory/jsx/createJsxJsxClosingFragment.mjs.map +1 -0
  351. package/lib/factory/jsx/createJsxNamespacedName.mjs +28 -0
  352. package/lib/factory/jsx/createJsxNamespacedName.mjs.map +1 -0
  353. package/lib/factory/jsx/createJsxOpeningElement.mjs +32 -0
  354. package/lib/factory/jsx/createJsxOpeningElement.mjs.map +1 -0
  355. package/lib/factory/jsx/createJsxOpeningFragment.mjs +22 -0
  356. package/lib/factory/jsx/createJsxOpeningFragment.mjs.map +1 -0
  357. package/lib/factory/jsx/createJsxSelfClosingElement.mjs +31 -0
  358. package/lib/factory/jsx/createJsxSelfClosingElement.mjs.map +1 -0
  359. package/lib/factory/jsx/createJsxSpreadAttribute.mjs +24 -0
  360. package/lib/factory/jsx/createJsxSpreadAttribute.mjs.map +1 -0
  361. package/lib/factory/jsx/createJsxText.mjs +31 -0
  362. package/lib/factory/jsx/createJsxText.mjs.map +1 -0
  363. package/lib/factory/literals/createBigIntLiteral.mjs +23 -0
  364. package/lib/factory/literals/createBigIntLiteral.mjs.map +1 -0
  365. package/lib/factory/literals/createNoSubstitutionTemplateLiteral.mjs +24 -0
  366. package/lib/factory/literals/createNoSubstitutionTemplateLiteral.mjs.map +1 -0
  367. package/lib/factory/literals/createNumericLiteral.mjs +23 -0
  368. package/lib/factory/literals/createNumericLiteral.mjs.map +1 -0
  369. package/lib/factory/literals/createStringLiteral.mjs +29 -0
  370. package/lib/factory/literals/createStringLiteral.mjs.map +1 -0
  371. package/lib/factory/literals/createStringLiteralFromNode.mjs +25 -0
  372. package/lib/factory/literals/createStringLiteralFromNode.mjs.map +1 -0
  373. package/lib/factory/literals/createTemplateHead.mjs +27 -0
  374. package/lib/factory/literals/createTemplateHead.mjs.map +1 -0
  375. package/lib/factory/literals/createTemplateMiddle.mjs +25 -0
  376. package/lib/factory/literals/createTemplateMiddle.mjs.map +1 -0
  377. package/lib/factory/literals/createTemplateTail.mjs +25 -0
  378. package/lib/factory/literals/createTemplateTail.mjs.map +1 -0
  379. package/lib/factory/names/createDecorator.mjs +23 -0
  380. package/lib/factory/names/createDecorator.mjs.map +1 -0
  381. package/lib/factory/names/createFalse.mjs +23 -0
  382. package/lib/factory/names/createFalse.mjs.map +1 -0
  383. package/lib/factory/names/createIdentifier.mjs +23 -0
  384. package/lib/factory/names/createIdentifier.mjs.map +1 -0
  385. package/lib/factory/names/createLoopVariable.mjs +28 -0
  386. package/lib/factory/names/createLoopVariable.mjs.map +1 -0
  387. package/lib/factory/names/createModifier.mjs +25 -0
  388. package/lib/factory/names/createModifier.mjs.map +1 -0
  389. package/lib/factory/names/createModifiersFromModifierFlags.mjs +82 -0
  390. package/lib/factory/names/createModifiersFromModifierFlags.mjs.map +1 -0
  391. package/lib/factory/names/createNull.mjs +23 -0
  392. package/lib/factory/names/createNull.mjs.map +1 -0
  393. package/lib/factory/names/createPrivateIdentifier.mjs +23 -0
  394. package/lib/factory/names/createPrivateIdentifier.mjs.map +1 -0
  395. package/lib/factory/names/createQualifiedName.mjs +28 -0
  396. package/lib/factory/names/createQualifiedName.mjs.map +1 -0
  397. package/lib/factory/names/createSuper.mjs +23 -0
  398. package/lib/factory/names/createSuper.mjs.map +1 -0
  399. package/lib/factory/names/createTempVariable.mjs +33 -0
  400. package/lib/factory/names/createTempVariable.mjs.map +1 -0
  401. package/lib/factory/names/createThis.mjs +23 -0
  402. package/lib/factory/names/createThis.mjs.map +1 -0
  403. package/lib/factory/names/createToken.mjs +24 -0
  404. package/lib/factory/names/createToken.mjs.map +1 -0
  405. package/lib/factory/names/createTrue.mjs +23 -0
  406. package/lib/factory/names/createTrue.mjs.map +1 -0
  407. package/lib/factory/names/createUniqueName.mjs +32 -0
  408. package/lib/factory/names/createUniqueName.mjs.map +1 -0
  409. package/lib/factory/names/createUniquePrivateName.mjs +29 -0
  410. package/lib/factory/names/createUniquePrivateName.mjs.map +1 -0
  411. package/lib/factory/statements/createBlock.mjs +29 -0
  412. package/lib/factory/statements/createBlock.mjs.map +1 -0
  413. package/lib/factory/statements/createBreakStatement.mjs +31 -0
  414. package/lib/factory/statements/createBreakStatement.mjs.map +1 -0
  415. package/lib/factory/statements/createCaseBlock.mjs +30 -0
  416. package/lib/factory/statements/createCaseBlock.mjs.map +1 -0
  417. package/lib/factory/statements/createCaseClause.mjs +28 -0
  418. package/lib/factory/statements/createCaseClause.mjs.map +1 -0
  419. package/lib/factory/statements/createCatchClause.mjs +35 -0
  420. package/lib/factory/statements/createCatchClause.mjs.map +1 -0
  421. package/lib/factory/statements/createContinueStatement.mjs +31 -0
  422. package/lib/factory/statements/createContinueStatement.mjs.map +1 -0
  423. package/lib/factory/statements/createDebuggerStatement.mjs +21 -0
  424. package/lib/factory/statements/createDebuggerStatement.mjs.map +1 -0
  425. package/lib/factory/statements/createDefaultClause.mjs +24 -0
  426. package/lib/factory/statements/createDefaultClause.mjs.map +1 -0
  427. package/lib/factory/statements/createDoStatement.mjs +27 -0
  428. package/lib/factory/statements/createDoStatement.mjs.map +1 -0
  429. package/lib/factory/statements/createEmptyStatement.mjs +21 -0
  430. package/lib/factory/statements/createEmptyStatement.mjs.map +1 -0
  431. package/lib/factory/statements/createExpressionStatement.mjs +23 -0
  432. package/lib/factory/statements/createExpressionStatement.mjs.map +1 -0
  433. package/lib/factory/statements/createForInStatement.mjs +29 -0
  434. package/lib/factory/statements/createForInStatement.mjs.map +1 -0
  435. package/lib/factory/statements/createForOfStatement.mjs +39 -0
  436. package/lib/factory/statements/createForOfStatement.mjs.map +1 -0
  437. package/lib/factory/statements/createForStatement.mjs +32 -0
  438. package/lib/factory/statements/createForStatement.mjs.map +1 -0
  439. package/lib/factory/statements/createIfStatement.mjs +31 -0
  440. package/lib/factory/statements/createIfStatement.mjs.map +1 -0
  441. package/lib/factory/statements/createLabeledStatement.mjs +28 -0
  442. package/lib/factory/statements/createLabeledStatement.mjs.map +1 -0
  443. package/lib/factory/statements/createNotEmittedStatement.mjs +20 -0
  444. package/lib/factory/statements/createNotEmittedStatement.mjs.map +1 -0
  445. package/lib/factory/statements/createReturnStatement.mjs +28 -0
  446. package/lib/factory/statements/createReturnStatement.mjs.map +1 -0
  447. package/lib/factory/statements/createSwitchStatement.mjs +31 -0
  448. package/lib/factory/statements/createSwitchStatement.mjs.map +1 -0
  449. package/lib/factory/statements/createThrowStatement.mjs +22 -0
  450. package/lib/factory/statements/createThrowStatement.mjs.map +1 -0
  451. package/lib/factory/statements/createTryStatement.mjs +34 -0
  452. package/lib/factory/statements/createTryStatement.mjs.map +1 -0
  453. package/lib/factory/statements/createVariableDeclaration.mjs +38 -0
  454. package/lib/factory/statements/createVariableDeclaration.mjs.map +1 -0
  455. package/lib/factory/statements/createVariableDeclarationList.mjs +28 -0
  456. package/lib/factory/statements/createVariableDeclarationList.mjs.map +1 -0
  457. package/lib/factory/statements/createVariableStatement.mjs +33 -0
  458. package/lib/factory/statements/createVariableStatement.mjs.map +1 -0
  459. package/lib/factory/statements/createWhileStatement.mjs +27 -0
  460. package/lib/factory/statements/createWhileStatement.mjs.map +1 -0
  461. package/lib/factory/statements/createWithStatement.mjs +27 -0
  462. package/lib/factory/statements/createWithStatement.mjs.map +1 -0
  463. package/lib/factory/types/createArrayTypeNode.mjs +25 -0
  464. package/lib/factory/types/createArrayTypeNode.mjs.map +1 -0
  465. package/lib/factory/types/createCallSignature.mjs +26 -0
  466. package/lib/factory/types/createCallSignature.mjs.map +1 -0
  467. package/lib/factory/types/createConditionalTypeNode.mjs +28 -0
  468. package/lib/factory/types/createConditionalTypeNode.mjs.map +1 -0
  469. package/lib/factory/types/createConstructSignature.mjs +25 -0
  470. package/lib/factory/types/createConstructSignature.mjs.map +1 -0
  471. package/lib/factory/types/createConstructorTypeNode.mjs +27 -0
  472. package/lib/factory/types/createConstructorTypeNode.mjs.map +1 -0
  473. package/lib/factory/types/createExpressionWithTypeArguments.mjs +25 -0
  474. package/lib/factory/types/createExpressionWithTypeArguments.mjs.map +1 -0
  475. package/lib/factory/types/createFunctionTypeNode.mjs +27 -0
  476. package/lib/factory/types/createFunctionTypeNode.mjs.map +1 -0
  477. package/lib/factory/types/createImportTypeNode.mjs +27 -0
  478. package/lib/factory/types/createImportTypeNode.mjs.map +1 -0
  479. package/lib/factory/types/createIndexSignature.mjs +25 -0
  480. package/lib/factory/types/createIndexSignature.mjs.map +1 -0
  481. package/lib/factory/types/createIndexedAccessTypeNode.mjs +25 -0
  482. package/lib/factory/types/createIndexedAccessTypeNode.mjs.map +1 -0
  483. package/lib/factory/types/createInferTypeNode.mjs +24 -0
  484. package/lib/factory/types/createInferTypeNode.mjs.map +1 -0
  485. package/lib/factory/types/createIntersectionTypeNode.mjs +24 -0
  486. package/lib/factory/types/createIntersectionTypeNode.mjs.map +1 -0
  487. package/lib/factory/types/createKeywordTypeNode.mjs +25 -0
  488. package/lib/factory/types/createKeywordTypeNode.mjs.map +1 -0
  489. package/lib/factory/types/createLiteralTypeNode.mjs +26 -0
  490. package/lib/factory/types/createLiteralTypeNode.mjs.map +1 -0
  491. package/lib/factory/types/createMappedTypeNode.mjs +44 -0
  492. package/lib/factory/types/createMappedTypeNode.mjs.map +1 -0
  493. package/lib/factory/types/createMethodSignature.mjs +39 -0
  494. package/lib/factory/types/createMethodSignature.mjs.map +1 -0
  495. package/lib/factory/types/createNamedTupleMember.mjs +33 -0
  496. package/lib/factory/types/createNamedTupleMember.mjs.map +1 -0
  497. package/lib/factory/types/createNotEmittedTypeElement.mjs +17 -0
  498. package/lib/factory/types/createNotEmittedTypeElement.mjs.map +1 -0
  499. package/lib/factory/types/createOptionalTypeNode.mjs +23 -0
  500. package/lib/factory/types/createOptionalTypeNode.mjs.map +1 -0
  501. package/lib/factory/types/createParenthesizedType.mjs +23 -0
  502. package/lib/factory/types/createParenthesizedType.mjs.map +1 -0
  503. package/lib/factory/types/createPropertySignature.mjs +34 -0
  504. package/lib/factory/types/createPropertySignature.mjs.map +1 -0
  505. package/lib/factory/types/createRestTypeNode.mjs +22 -0
  506. package/lib/factory/types/createRestTypeNode.mjs.map +1 -0
  507. package/lib/factory/types/createTemplateLiteralType.mjs +27 -0
  508. package/lib/factory/types/createTemplateLiteralType.mjs.map +1 -0
  509. package/lib/factory/types/createTemplateLiteralTypeSpan.mjs +27 -0
  510. package/lib/factory/types/createTemplateLiteralTypeSpan.mjs.map +1 -0
  511. package/lib/factory/types/createThisTypeNode.mjs +22 -0
  512. package/lib/factory/types/createThisTypeNode.mjs.map +1 -0
  513. package/lib/factory/types/createTupleTypeNode.mjs +24 -0
  514. package/lib/factory/types/createTupleTypeNode.mjs.map +1 -0
  515. package/lib/factory/types/createTypeLiteralNode.mjs +25 -0
  516. package/lib/factory/types/createTypeLiteralNode.mjs.map +1 -0
  517. package/lib/factory/types/createTypeOperatorNode.mjs +26 -0
  518. package/lib/factory/types/createTypeOperatorNode.mjs.map +1 -0
  519. package/lib/factory/types/createTypeParameterDeclaration.mjs +34 -0
  520. package/lib/factory/types/createTypeParameterDeclaration.mjs.map +1 -0
  521. package/lib/factory/types/createTypePredicateNode.mjs +35 -0
  522. package/lib/factory/types/createTypePredicateNode.mjs.map +1 -0
  523. package/lib/factory/types/createTypeQueryNode.mjs +23 -0
  524. package/lib/factory/types/createTypeQueryNode.mjs.map +1 -0
  525. package/lib/factory/types/createTypeReferenceNode.mjs +30 -0
  526. package/lib/factory/types/createTypeReferenceNode.mjs.map +1 -0
  527. package/lib/factory/types/createUnionTypeNode.mjs +24 -0
  528. package/lib/factory/types/createUnionTypeNode.mjs.map +1 -0
  529. package/lib/index.d.ts +0 -1
  530. package/lib/index.js.map +1 -1
  531. package/lib/index.mjs +10 -0
  532. package/lib/index.mjs.map +1 -0
  533. package/lib/internal/doc.mjs +171 -0
  534. package/lib/internal/doc.mjs.map +1 -0
  535. package/lib/syntax/NodeFlags.mjs +23 -0
  536. package/lib/syntax/NodeFlags.mjs.map +1 -0
  537. package/lib/syntax/SyntaxKind.mjs +110 -0
  538. package/lib/syntax/SyntaxKind.mjs.map +1 -0
  539. package/package.json +6 -9
  540. package/src/TsPrinter.ts +702 -88
  541. package/src/index.ts +0 -1
@@ -0,0 +1,1827 @@
1
+ import { getSyntheticLeadingComments, getSyntheticTrailingComments } from './comments.mjs';
2
+ import { join, hardline, printDocToString, line, softline, group, concat, indent, ifBreak } from './internal/doc.mjs';
3
+ import { SyntaxKind } from './syntax/SyntaxKind.mjs';
4
+ import { NodeFlags } from './syntax/NodeFlags.mjs';
5
+
6
+ /**
7
+ * Printer turning {@link factory} produced AST nodes into TypeScript source
8
+ * text.
9
+ *
10
+ * The printer is a width-aware pretty-printer: it builds a Prettier-style
11
+ * document for the {@link Node} discriminated union and lays it out against
12
+ * {@link TsPrinter.IProps.printWidth}. Lists (arguments, parameters, generic
13
+ * arguments, array / object members, ...) print on one line when they fit and
14
+ * break onto indented lines — with trailing commas — when they do not. Every
15
+ * `node.kind` narrows to its concrete type, so the walk is fully type-checked;
16
+ * no `typescript` module is involved.
17
+ *
18
+ * @author Jeongho Nam - https://github.com/samchon
19
+ * @example
20
+ * ```typescript
21
+ * import factory, { TsPrinter } from "@ttsc/factory";
22
+ *
23
+ * const printer = new TsPrinter({ printWidth: 80, indent: " " });
24
+ * printer.print(factory.createStringLiteral("hello")); // "hello"
25
+ * ```;
26
+ */
27
+ class TsPrinter {
28
+ printWidth_;
29
+ indent_;
30
+ newLine_;
31
+ constructor(options = {}) {
32
+ this.printWidth_ = options.printWidth ?? 80;
33
+ this.indent_ = options.indent ?? " ";
34
+ this.newLine_ = options.newLine ?? "\n";
35
+ }
36
+ /** Print a single node (or a whole {@link SourceFile}) into source text. */
37
+ print(node) {
38
+ return this.layout(this.emit(node));
39
+ }
40
+ /** Print multiple nodes, joining them with new lines. */
41
+ printNodes(nodes) {
42
+ return this.layout(join(hardline, nodes.map((n) => this.emit(n))));
43
+ }
44
+ /**
45
+ * Print an entire source file.
46
+ *
47
+ * @param sourceFile A {@link SourceFile}. When omitted, one is composed from
48
+ * the given `statements`.
49
+ * @param statements Statements to compose a source file from when no
50
+ * `sourceFile` is provided.
51
+ */
52
+ printFile(sourceFile, statements = []) {
53
+ const list = sourceFile
54
+ ? sourceFile.statements
55
+ : statements;
56
+ return (this.layout(join(hardline, list.map((s) => this.emit(s)))) + this.newLine_);
57
+ }
58
+ /* ----------------------------------------------------------------------- */
59
+ /* INTERNAL */
60
+ /* ----------------------------------------------------------------------- */
61
+ layout(doc) {
62
+ return printDocToString(doc, {
63
+ printWidth: this.printWidth_,
64
+ indent: this.indent_,
65
+ newLine: this.newLine_,
66
+ });
67
+ }
68
+ /** Comma-separated, width-aware delimited list (`(...)`, `[...]`, `<...>`). */
69
+ delim(open, items, close, opts = {}) {
70
+ if (items.length === 0)
71
+ return open + close;
72
+ const ln = opts.space ? line : softline;
73
+ return group(concat([
74
+ open,
75
+ indent(concat([ln, join(concat([",", line]), items)])),
76
+ opts.trailingComma ? ifBreak(",") : "",
77
+ ln,
78
+ close,
79
+ ]), opts.forceBreak === true);
80
+ }
81
+ /**
82
+ * Semicolon-separated member block (`{ a; b }`), e.g. interfaces.
83
+ *
84
+ * A bare {@link import("./ast").Identifier} member acts as a blank-line spacer
85
+ * (the legacy `createIdentifier("\n")` codegen idiom): it inserts an empty
86
+ * line between members and carries no `;` terminator, matching the legacy
87
+ * printer.
88
+ */
89
+ memberBlock(members, forceBreak) {
90
+ const inner = [];
91
+ let first = true;
92
+ let blank = false;
93
+ for (const member of members) {
94
+ if (member.kind === "Identifier") {
95
+ blank = true;
96
+ continue;
97
+ }
98
+ if (!first)
99
+ inner.push(";", line);
100
+ if (blank) {
101
+ inner.push(hardline);
102
+ blank = false;
103
+ }
104
+ inner.push(this.emit(member));
105
+ first = false;
106
+ }
107
+ if (inner.length === 0)
108
+ return "{}";
109
+ return group(concat([
110
+ "{",
111
+ indent(concat([line, concat(inner)])),
112
+ ifBreak(";"),
113
+ line,
114
+ "}",
115
+ ]), forceBreak);
116
+ }
117
+ /** Always-broken statement block (`{ ... }`). */
118
+ statementBlock(items) {
119
+ if (items.length === 0)
120
+ return "{}";
121
+ return concat([
122
+ "{",
123
+ indent(concat([hardline, join(hardline, items)])),
124
+ hardline,
125
+ "}",
126
+ ]);
127
+ }
128
+ typeArguments(args) {
129
+ // type-argument / type-parameter lists disallow a trailing comma (TS1009)
130
+ return args && args.length
131
+ ? this.delim("<", args.map((a) => this.emit(a)), ">", {
132
+ trailingComma: false,
133
+ })
134
+ : "";
135
+ }
136
+ params(params) {
137
+ return this.delim("(", params.map((p) => this.emit(p)), ")", {
138
+ trailingComma: true,
139
+ });
140
+ }
141
+ args(args) {
142
+ return this.delim("(", args.map((a) => this.expressionForDisallowedComma(a)), ")", {
143
+ trailingComma: true,
144
+ });
145
+ }
146
+ modifiers(mods, decoratorsOnNewLine) {
147
+ if (!mods || mods.length === 0)
148
+ return "";
149
+ const decorators = mods.filter((m) => m.kind === "Decorator");
150
+ const tokens = mods.filter((m) => m.kind !== "Decorator");
151
+ const parts = [];
152
+ const gap = decoratorsOnNewLine ? hardline : " ";
153
+ if (decorators.length)
154
+ parts.push(join(gap, decorators.map((d) => this.emit(d))), gap);
155
+ if (tokens.length)
156
+ parts.push(join(" ", tokens.map((t) => this.emit(t))), " ");
157
+ return concat(parts);
158
+ }
159
+ heritage(clauses) {
160
+ return clauses && clauses.length
161
+ ? concat([
162
+ " ",
163
+ join(" ", clauses.map((c) => this.emit(c))),
164
+ ])
165
+ : "";
166
+ }
167
+ optType(type) {
168
+ return type ? concat([": ", this.emit(type)]) : "";
169
+ }
170
+ optBody(body) {
171
+ return body ? concat([" ", this.emit(body)]) : ";";
172
+ }
173
+ emit(node) {
174
+ const body = this.emitNode(node);
175
+ const leading = getSyntheticLeadingComments(node);
176
+ const trailing = getSyntheticTrailingComments(node);
177
+ if ((leading === undefined || leading.length === 0) &&
178
+ (trailing === undefined || trailing.length === 0))
179
+ return body;
180
+ const parts = [];
181
+ if (leading !== undefined)
182
+ for (const comment of leading)
183
+ parts.push(this.leadingComment(comment));
184
+ parts.push(body);
185
+ if (trailing !== undefined)
186
+ for (const comment of trailing)
187
+ parts.push(this.trailingComment(comment));
188
+ return concat(parts);
189
+ }
190
+ /** Render a leading comment followed by its node separator. */
191
+ leadingComment(comment) {
192
+ // a `//` comment must terminate the line; a `/* */` honours its own flag
193
+ const newLine = comment.kind === SyntaxKind.SingleLineCommentTrivia ||
194
+ comment.hasTrailingNewLine === true;
195
+ return concat([this.commentBody(comment), newLine ? hardline : " "]);
196
+ }
197
+ /** Render a trailing comment preceded by its node separator. */
198
+ trailingComment(comment) {
199
+ const newLine = comment.kind === SyntaxKind.SingleLineCommentTrivia ||
200
+ comment.hasTrailingNewLine === true;
201
+ return concat([
202
+ comment.hasLeadingNewLine === true ? hardline : " ",
203
+ this.commentBody(comment),
204
+ newLine ? hardline : "",
205
+ ]);
206
+ }
207
+ /** Render the delimited comment body, re-flowing embedded line breaks. */
208
+ commentBody(comment) {
209
+ if (comment.kind === SyntaxKind.SingleLineCommentTrivia)
210
+ return concat(["//", comment.text]);
211
+ // re-emit embedded newlines as hardlines so each line re-indents in place
212
+ return concat([
213
+ "/*",
214
+ join(hardline, comment.text.replace(/\r\n?/g, "\n").split("\n")),
215
+ "*/",
216
+ ]);
217
+ }
218
+ emitNode(node) {
219
+ switch (node.kind) {
220
+ /* names & tokens */
221
+ case "Identifier":
222
+ return node.text;
223
+ case "PrivateIdentifier":
224
+ return node.text;
225
+ case "QualifiedName":
226
+ return concat([this.emit(node.left), ".", this.emit(node.right)]);
227
+ case "Token":
228
+ return node.token;
229
+ case "Decorator":
230
+ return concat(["@", this.leftSideExpression(node.expression)]);
231
+ /* literals */
232
+ case "StringLiteral":
233
+ return escapeString(node.text, node.singleQuote);
234
+ case "NumericLiteral":
235
+ return node.text;
236
+ case "BigIntLiteral":
237
+ return node.text;
238
+ /* expressions */
239
+ case "ArrayLiteralExpression":
240
+ return this.delim("[", node.elements.map((e) => this.expressionForDisallowedComma(e)), "]", { trailingComma: true, forceBreak: node.multiLine === true });
241
+ case "ObjectLiteralExpression":
242
+ return this.delim("{", node.properties.map((p) => this.emit(p)), "}", {
243
+ space: true,
244
+ trailingComma: true,
245
+ forceBreak: node.multiLine === true,
246
+ });
247
+ case "PropertyAssignment":
248
+ return concat([
249
+ this.emit(node.name),
250
+ ": ",
251
+ this.expressionForDisallowedComma(node.initializer),
252
+ ]);
253
+ case "ShorthandPropertyAssignment":
254
+ return concat([
255
+ this.emit(node.name),
256
+ node.objectAssignmentInitializer
257
+ ? concat([
258
+ " = ",
259
+ this.expressionForDisallowedComma(node.objectAssignmentInitializer),
260
+ ])
261
+ : "",
262
+ ]);
263
+ case "SpreadAssignment":
264
+ return concat([
265
+ "...",
266
+ this.expressionForDisallowedComma(node.expression),
267
+ ]);
268
+ case "PropertyAccessExpression":
269
+ return concat([
270
+ this.leftSideExpression(node.expression),
271
+ ".",
272
+ this.emit(node.name),
273
+ ]);
274
+ case "ElementAccessExpression":
275
+ return concat([
276
+ this.leftSideExpression(node.expression),
277
+ "[",
278
+ this.expressionForDisallowedComma(node.argumentExpression),
279
+ "]",
280
+ ]);
281
+ case "CallExpression":
282
+ return concat([
283
+ this.leftSideExpression(node.expression),
284
+ this.typeArguments(node.typeArguments),
285
+ this.args(node.arguments),
286
+ ]);
287
+ case "NewExpression":
288
+ return concat([
289
+ "new ",
290
+ this.newExpressionTarget(node.expression),
291
+ this.typeArguments(node.typeArguments),
292
+ this.args(node.arguments ?? []),
293
+ ]);
294
+ case "ParenthesizedExpression":
295
+ return concat(["(", this.emit(node.expression), ")"]);
296
+ case "BinaryExpression":
297
+ return group(concat([
298
+ this.binaryOperand(node.operator, node.left, true),
299
+ " ",
300
+ node.operator,
301
+ indent(concat([
302
+ line,
303
+ this.binaryOperand(node.operator, node.right, false, node.left),
304
+ ])),
305
+ ]));
306
+ case "PrefixUnaryExpression":
307
+ return concat([
308
+ node.operator,
309
+ this.prefixUnaryOperand(node.operand, node.operator),
310
+ ]);
311
+ case "PostfixUnaryExpression":
312
+ return concat([this.postfixUnaryOperand(node.operand), node.operator]);
313
+ case "ConditionalExpression":
314
+ return group(concat([
315
+ this.conditionalCondition(node.condition),
316
+ indent(concat([
317
+ line,
318
+ "? ",
319
+ this.conditionalBranch(node.whenTrue),
320
+ line,
321
+ ": ",
322
+ this.conditionalBranch(node.whenFalse),
323
+ ])),
324
+ ]));
325
+ case "ArrowFunction":
326
+ return concat([
327
+ this.modifiers(node.modifiers, false),
328
+ this.typeArguments(node.typeParameters),
329
+ this.params(node.parameters),
330
+ this.optType(node.type),
331
+ " => ",
332
+ this.arrowFunctionBody(node.body),
333
+ ]);
334
+ case "FunctionExpression":
335
+ return concat([
336
+ this.modifiers(node.modifiers, false),
337
+ "function",
338
+ node.asteriskToken ? "*" : "",
339
+ node.name ? concat([" ", this.emit(node.name)]) : " ",
340
+ this.typeArguments(node.typeParameters),
341
+ this.params(node.parameters),
342
+ this.optType(node.type),
343
+ " ",
344
+ this.emit(node.body),
345
+ ]);
346
+ case "AsExpression":
347
+ return concat([
348
+ this.assertionExpressionOperand(node.expression),
349
+ " as ",
350
+ this.emit(node.type),
351
+ ]);
352
+ case "SatisfiesExpression":
353
+ return concat([
354
+ this.assertionExpressionOperand(node.expression),
355
+ " satisfies ",
356
+ this.emit(node.type),
357
+ ]);
358
+ case "NonNullExpression":
359
+ return concat([this.leftSideExpression(node.expression), "!"]);
360
+ case "SpreadElement":
361
+ return concat([
362
+ "...",
363
+ this.expressionForDisallowedComma(node.expression),
364
+ ]);
365
+ case "AwaitExpression":
366
+ return concat(["await ", this.prefixUnaryOperand(node.expression)]);
367
+ case "TypeOfExpression":
368
+ return concat(["typeof ", this.prefixUnaryOperand(node.expression)]);
369
+ /* types */
370
+ case "KeywordTypeNode":
371
+ return node.keyword;
372
+ case "TypeReferenceNode":
373
+ return concat([
374
+ this.emit(node.typeName),
375
+ this.typeArguments(node.typeArguments),
376
+ ]);
377
+ case "ArrayTypeNode":
378
+ return concat([this.postfixTypeOperand(node.elementType), "[]"]);
379
+ case "UnionTypeNode":
380
+ return this.binaryType("|", node.types);
381
+ case "IntersectionTypeNode":
382
+ return this.binaryType("&", node.types);
383
+ case "LiteralTypeNode":
384
+ return this.emit(node.literal);
385
+ case "TypeLiteralNode":
386
+ return this.memberBlock(node.members, false);
387
+ case "FunctionTypeNode":
388
+ return concat([
389
+ this.typeArguments(node.typeParameters),
390
+ this.params(node.parameters),
391
+ " => ",
392
+ this.emit(node.type),
393
+ ]);
394
+ case "TupleTypeNode":
395
+ return this.delim("[", node.elements.map((e) => this.emit(e)), "]", {
396
+ trailingComma: true,
397
+ });
398
+ case "ParenthesizedTypeNode":
399
+ return concat(["(", this.emit(node.type), ")"]);
400
+ case "TypeOperatorNode":
401
+ return concat([
402
+ node.operator,
403
+ " ",
404
+ this.typeOperatorOperand(node.type, node.operator),
405
+ ]);
406
+ case "IndexedAccessTypeNode":
407
+ return concat([
408
+ this.postfixTypeOperand(node.objectType),
409
+ "[",
410
+ this.emit(node.indexType),
411
+ "]",
412
+ ]);
413
+ case "TypeQueryNode":
414
+ return concat(["typeof ", this.emit(node.exprName)]);
415
+ case "ExpressionWithTypeArguments":
416
+ return concat([
417
+ this.emit(node.expression),
418
+ this.typeArguments(node.typeArguments),
419
+ ]);
420
+ case "PropertySignature":
421
+ return concat([
422
+ this.modifiers(node.modifiers, false),
423
+ this.emit(node.name),
424
+ node.questionToken ? "?" : "",
425
+ this.optType(node.type),
426
+ ]);
427
+ case "IndexSignature":
428
+ return concat([
429
+ this.modifiers(node.modifiers, false),
430
+ "[",
431
+ join(", ", node.parameters.map((p) => this.emit(p))),
432
+ "]: ",
433
+ this.emit(node.type),
434
+ ]);
435
+ case "MethodSignature":
436
+ return concat([
437
+ this.modifiers(node.modifiers, false),
438
+ this.emit(node.name),
439
+ node.questionToken ? "?" : "",
440
+ this.typeArguments(node.typeParameters),
441
+ this.params(node.parameters),
442
+ this.optType(node.type),
443
+ ]);
444
+ case "TypeParameterDeclaration":
445
+ return concat([
446
+ this.modifiers(node.modifiers, false),
447
+ this.emit(node.name),
448
+ node.constraint
449
+ ? concat([" extends ", this.emit(node.constraint)])
450
+ : "",
451
+ node.default ? concat([" = ", this.emit(node.default)]) : "",
452
+ ]);
453
+ /* support */
454
+ case "ParameterDeclaration":
455
+ return concat([
456
+ this.modifiers(node.modifiers, false),
457
+ node.dotDotDotToken ? "..." : "",
458
+ this.emit(node.name),
459
+ node.questionToken ? "?" : "",
460
+ this.optType(node.type),
461
+ node.initializer
462
+ ? concat([
463
+ " = ",
464
+ this.expressionForDisallowedComma(node.initializer),
465
+ ])
466
+ : "",
467
+ ]);
468
+ case "HeritageClause":
469
+ return concat([
470
+ node.token,
471
+ " ",
472
+ join(", ", node.types.map((t) => this.emit(t))),
473
+ ]);
474
+ /* statements */
475
+ case "VariableStatement":
476
+ return concat([
477
+ this.modifiers(node.modifiers, false),
478
+ this.emit(node.declarationList),
479
+ ";",
480
+ ]);
481
+ case "VariableDeclarationList": {
482
+ const keyword = node.flags === NodeFlags.Const
483
+ ? "const"
484
+ : node.flags === NodeFlags.Let
485
+ ? "let"
486
+ : "var";
487
+ return concat([
488
+ keyword,
489
+ " ",
490
+ join(", ", node.declarations.map((d) => this.emit(d))),
491
+ ]);
492
+ }
493
+ case "VariableDeclaration":
494
+ return concat([
495
+ this.emit(node.name),
496
+ node.exclamationToken ? "!" : "",
497
+ this.optType(node.type),
498
+ node.initializer
499
+ ? concat([
500
+ " = ",
501
+ this.expressionForDisallowedComma(node.initializer),
502
+ ])
503
+ : "",
504
+ ]);
505
+ case "ExpressionStatement":
506
+ return concat([
507
+ this.expressionStatementExpression(node.expression),
508
+ ";",
509
+ ]);
510
+ case "ReturnStatement":
511
+ return node.expression
512
+ ? concat(["return ", this.emit(node.expression), ";"])
513
+ : "return;";
514
+ case "ThrowStatement":
515
+ return concat(["throw ", this.emit(node.expression), ";"]);
516
+ case "IfStatement":
517
+ return concat([
518
+ "if (",
519
+ this.emit(node.expression),
520
+ ") ",
521
+ this.emit(node.thenStatement),
522
+ node.elseStatement
523
+ ? concat([" else ", this.emit(node.elseStatement)])
524
+ : "",
525
+ ]);
526
+ case "Block":
527
+ return this.statementBlock(node.statements.map((s) => this.emit(s)));
528
+ /* declarations */
529
+ case "FunctionDeclaration":
530
+ return concat([
531
+ this.modifiers(node.modifiers, true),
532
+ "function",
533
+ node.asteriskToken ? "*" : "",
534
+ " ",
535
+ node.name ? this.emit(node.name) : "",
536
+ this.typeArguments(node.typeParameters),
537
+ this.params(node.parameters),
538
+ this.optType(node.type),
539
+ this.optBody(node.body),
540
+ ]);
541
+ case "ClassDeclaration":
542
+ return concat([
543
+ this.modifiers(node.modifiers, true),
544
+ "class",
545
+ node.name ? concat([" ", this.emit(node.name)]) : "",
546
+ this.typeArguments(node.typeParameters),
547
+ this.heritage(node.heritageClauses),
548
+ " ",
549
+ this.statementBlock(node.members.map((m) => this.emit(m))),
550
+ ]);
551
+ case "PropertyDeclaration":
552
+ return concat([
553
+ this.modifiers(node.modifiers, true),
554
+ this.emit(node.name),
555
+ node.questionOrExclamationToken
556
+ ? this.emit(node.questionOrExclamationToken)
557
+ : "",
558
+ this.optType(node.type),
559
+ node.initializer
560
+ ? concat([
561
+ " = ",
562
+ this.expressionForDisallowedComma(node.initializer),
563
+ ])
564
+ : "",
565
+ ";",
566
+ ]);
567
+ case "MethodDeclaration":
568
+ return concat([
569
+ this.modifiers(node.modifiers, true),
570
+ node.asteriskToken ? "*" : "",
571
+ this.emit(node.name),
572
+ node.questionToken ? "?" : "",
573
+ this.typeArguments(node.typeParameters),
574
+ this.params(node.parameters),
575
+ this.optType(node.type),
576
+ this.optBody(node.body),
577
+ ]);
578
+ case "ConstructorDeclaration":
579
+ return concat([
580
+ this.modifiers(node.modifiers, true),
581
+ "constructor",
582
+ this.params(node.parameters),
583
+ this.optBody(node.body),
584
+ ]);
585
+ case "GetAccessorDeclaration":
586
+ return concat([
587
+ this.modifiers(node.modifiers, true),
588
+ "get ",
589
+ this.emit(node.name),
590
+ this.params(node.parameters),
591
+ this.optType(node.type),
592
+ this.optBody(node.body),
593
+ ]);
594
+ case "SetAccessorDeclaration":
595
+ return concat([
596
+ this.modifiers(node.modifiers, true),
597
+ "set ",
598
+ this.emit(node.name),
599
+ this.params(node.parameters),
600
+ this.optBody(node.body),
601
+ ]);
602
+ case "InterfaceDeclaration":
603
+ return concat([
604
+ this.modifiers(node.modifiers, true),
605
+ "interface ",
606
+ this.emit(node.name),
607
+ this.typeArguments(node.typeParameters),
608
+ this.heritage(node.heritageClauses),
609
+ " ",
610
+ this.memberBlock(node.members, true),
611
+ ]);
612
+ case "TypeAliasDeclaration":
613
+ return concat([
614
+ this.modifiers(node.modifiers, true),
615
+ "type ",
616
+ this.emit(node.name),
617
+ this.typeArguments(node.typeParameters),
618
+ " = ",
619
+ this.emit(node.type),
620
+ ";",
621
+ ]);
622
+ case "EnumDeclaration":
623
+ return concat([
624
+ this.modifiers(node.modifiers, true),
625
+ "enum ",
626
+ this.emit(node.name),
627
+ " ",
628
+ node.members.length === 0
629
+ ? "{}"
630
+ : concat([
631
+ "{",
632
+ indent(concat([
633
+ hardline,
634
+ join(concat([",", hardline]), node.members.map((m) => this.emit(m))),
635
+ ",",
636
+ ])),
637
+ hardline,
638
+ "}",
639
+ ]),
640
+ ]);
641
+ case "EnumMember":
642
+ return concat([
643
+ this.emit(node.name),
644
+ node.initializer
645
+ ? concat([
646
+ " = ",
647
+ this.expressionForDisallowedComma(node.initializer),
648
+ ])
649
+ : "",
650
+ ]);
651
+ /* imports & exports */
652
+ case "ImportDeclaration":
653
+ return concat([
654
+ this.modifiers(node.modifiers, false),
655
+ "import ",
656
+ node.importClause
657
+ ? concat([this.emit(node.importClause), " from "])
658
+ : "",
659
+ this.emit(node.moduleSpecifier),
660
+ ";",
661
+ ]);
662
+ case "ImportClause": {
663
+ const named = [];
664
+ if (node.name)
665
+ named.push(this.emit(node.name));
666
+ if (node.namedBindings)
667
+ named.push(this.emit(node.namedBindings));
668
+ return concat([node.isTypeOnly ? "type " : "", join(", ", named)]);
669
+ }
670
+ case "NamedImports":
671
+ return this.delim("{", node.elements.map((e) => this.emit(e)), "}", { space: true, trailingComma: true });
672
+ case "ImportSpecifier":
673
+ return concat([
674
+ node.isTypeOnly ? "type " : "",
675
+ node.propertyName
676
+ ? concat([this.emit(node.propertyName), " as "])
677
+ : "",
678
+ this.emit(node.name),
679
+ ]);
680
+ case "NamespaceImport":
681
+ return concat(["* as ", this.emit(node.name)]);
682
+ case "ExportDeclaration":
683
+ return concat([
684
+ this.modifiers(node.modifiers, false),
685
+ "export ",
686
+ node.isTypeOnly ? "type " : "",
687
+ node.exportClause ? this.emit(node.exportClause) : "*",
688
+ node.moduleSpecifier
689
+ ? concat([" from ", this.emit(node.moduleSpecifier)])
690
+ : "",
691
+ ";",
692
+ ]);
693
+ case "NamedExports":
694
+ return this.delim("{", node.elements.map((e) => this.emit(e)), "}", { space: true, trailingComma: true });
695
+ case "ExportSpecifier":
696
+ return concat([
697
+ node.isTypeOnly ? "type " : "",
698
+ node.propertyName
699
+ ? concat([this.emit(node.propertyName), " as "])
700
+ : "",
701
+ this.emit(node.name),
702
+ ]);
703
+ case "ExportAssignment":
704
+ return concat([
705
+ this.modifiers(node.modifiers, false),
706
+ node.isExportEquals ? "export = " : "export default ",
707
+ this.exportAssignmentExpression(node.expression, node.isExportEquals === true),
708
+ ";",
709
+ ]);
710
+ /* source file */
711
+ case "SourceFile":
712
+ return concat([
713
+ join(hardline, node.statements.map((s) => this.emit(s))),
714
+ hardline,
715
+ ]);
716
+ /* loops & flow */
717
+ case "ForStatement":
718
+ return concat([
719
+ "for (",
720
+ node.initializer ? this.emit(node.initializer) : "",
721
+ "; ",
722
+ node.condition ? this.emit(node.condition) : "",
723
+ "; ",
724
+ node.incrementor ? this.emit(node.incrementor) : "",
725
+ ") ",
726
+ this.emit(node.statement),
727
+ ]);
728
+ case "ForInStatement":
729
+ return concat([
730
+ "for (",
731
+ this.emit(node.initializer),
732
+ " in ",
733
+ this.emit(node.expression),
734
+ ") ",
735
+ this.emit(node.statement),
736
+ ]);
737
+ case "ForOfStatement":
738
+ return concat([
739
+ "for ",
740
+ node.awaitModifier ? "await " : "",
741
+ "(",
742
+ this.emit(node.initializer),
743
+ " of ",
744
+ this.emit(node.expression),
745
+ ") ",
746
+ this.emit(node.statement),
747
+ ]);
748
+ case "WhileStatement":
749
+ return concat([
750
+ "while (",
751
+ this.emit(node.expression),
752
+ ") ",
753
+ this.emit(node.statement),
754
+ ]);
755
+ case "DoStatement":
756
+ return concat([
757
+ "do ",
758
+ this.emit(node.statement),
759
+ " while (",
760
+ this.emit(node.expression),
761
+ ");",
762
+ ]);
763
+ case "SwitchStatement":
764
+ return concat([
765
+ "switch (",
766
+ this.emit(node.expression),
767
+ ") ",
768
+ this.emit(node.caseBlock),
769
+ ]);
770
+ case "CaseBlock":
771
+ return node.clauses.length === 0
772
+ ? "{}"
773
+ : concat([
774
+ "{",
775
+ indent(concat([
776
+ hardline,
777
+ join(hardline, node.clauses.map((c) => this.emit(c))),
778
+ ])),
779
+ hardline,
780
+ "}",
781
+ ]);
782
+ case "CaseClause":
783
+ return concat([
784
+ "case ",
785
+ this.emit(node.expression),
786
+ ":",
787
+ node.statements.length
788
+ ? indent(concat([
789
+ hardline,
790
+ join(hardline, node.statements.map((s) => this.emit(s))),
791
+ ]))
792
+ : "",
793
+ ]);
794
+ case "DefaultClause":
795
+ return concat([
796
+ "default:",
797
+ node.statements.length
798
+ ? indent(concat([
799
+ hardline,
800
+ join(hardline, node.statements.map((s) => this.emit(s))),
801
+ ]))
802
+ : "",
803
+ ]);
804
+ case "BreakStatement":
805
+ return node.label
806
+ ? concat(["break ", this.emit(node.label), ";"])
807
+ : "break;";
808
+ case "ContinueStatement":
809
+ return node.label
810
+ ? concat(["continue ", this.emit(node.label), ";"])
811
+ : "continue;";
812
+ case "TryStatement":
813
+ return concat([
814
+ "try ",
815
+ this.emit(node.tryBlock),
816
+ node.catchClause ? concat([" ", this.emit(node.catchClause)]) : "",
817
+ node.finallyBlock
818
+ ? concat([" finally ", this.emit(node.finallyBlock)])
819
+ : "",
820
+ ]);
821
+ case "CatchClause":
822
+ return node.variableDeclaration
823
+ ? concat([
824
+ "catch (",
825
+ this.emit(node.variableDeclaration),
826
+ ") ",
827
+ this.emit(node.block),
828
+ ])
829
+ : concat(["catch ", this.emit(node.block)]);
830
+ case "LabeledStatement":
831
+ return concat([this.emit(node.label), ": ", this.emit(node.statement)]);
832
+ case "WithStatement":
833
+ return concat([
834
+ "with (",
835
+ this.emit(node.expression),
836
+ ") ",
837
+ this.emit(node.statement),
838
+ ]);
839
+ case "DebuggerStatement":
840
+ return "debugger;";
841
+ case "EmptyStatement":
842
+ return ";";
843
+ /* modules & namespaces */
844
+ case "ModuleDeclaration":
845
+ return concat([
846
+ this.modifiers(node.modifiers, true),
847
+ node.name.kind === "StringLiteral" ? "module " : "namespace ",
848
+ this.emit(node.name),
849
+ node.body ? concat([" ", this.emit(node.body)]) : ";",
850
+ ]);
851
+ case "ModuleBlock":
852
+ return this.statementBlock(node.statements.map((s) => this.emit(s)));
853
+ case "ClassStaticBlockDeclaration":
854
+ return concat(["static ", this.emit(node.body)]);
855
+ case "ImportEqualsDeclaration":
856
+ return concat([
857
+ this.modifiers(node.modifiers, false),
858
+ "import ",
859
+ node.isTypeOnly ? "type " : "",
860
+ this.emit(node.name),
861
+ " = ",
862
+ this.emit(node.moduleReference),
863
+ ";",
864
+ ]);
865
+ case "ExternalModuleReference":
866
+ return concat(["require(", this.emit(node.expression), ")"]);
867
+ case "NamespaceExportDeclaration":
868
+ return concat(["export as namespace ", this.emit(node.name), ";"]);
869
+ case "SemicolonClassElement":
870
+ return ";";
871
+ case "NamespaceExport":
872
+ return concat(["* as ", this.emit(node.name)]);
873
+ /* advanced types */
874
+ case "ThisTypeNode":
875
+ return "this";
876
+ case "ConstructorTypeNode":
877
+ return concat([
878
+ this.modifiers(node.modifiers, false),
879
+ "new ",
880
+ this.typeArguments(node.typeParameters),
881
+ this.params(node.parameters),
882
+ " => ",
883
+ this.emit(node.type),
884
+ ]);
885
+ case "TypePredicateNode":
886
+ return concat([
887
+ node.assertsModifier ? "asserts " : "",
888
+ this.emit(node.parameterName),
889
+ node.type ? concat([" is ", this.emit(node.type)]) : "",
890
+ ]);
891
+ case "ConditionalTypeNode":
892
+ return concat([
893
+ this.conditionalTypeCheckOperand(node.checkType),
894
+ " extends ",
895
+ this.conditionalTypeExtendsOperand(node.extendsType),
896
+ " ? ",
897
+ this.emit(node.trueType),
898
+ " : ",
899
+ this.emit(node.falseType),
900
+ ]);
901
+ case "InferTypeNode":
902
+ return concat(["infer ", this.emit(node.typeParameter)]);
903
+ case "MappedTypeNode": {
904
+ const ro = node.readonlyToken
905
+ ? node.readonlyToken.token === "readonly"
906
+ ? "readonly "
907
+ : `${node.readonlyToken.token}readonly `
908
+ : "";
909
+ const q = node.questionToken
910
+ ? node.questionToken.token === "?"
911
+ ? "?"
912
+ : `${node.questionToken.token}?`
913
+ : "";
914
+ return concat([
915
+ "{ ",
916
+ ro,
917
+ "[",
918
+ this.emit(node.typeParameter.name),
919
+ " in ",
920
+ node.typeParameter.constraint
921
+ ? this.emit(node.typeParameter.constraint)
922
+ : "",
923
+ node.nameType ? concat([" as ", this.emit(node.nameType)]) : "",
924
+ "]",
925
+ q,
926
+ node.type ? concat([": ", this.emit(node.type)]) : "",
927
+ " }",
928
+ ]);
929
+ }
930
+ case "TemplateLiteralType":
931
+ return concat([
932
+ this.emit(node.head),
933
+ concat(node.templateSpans.map((s) => this.emit(s))),
934
+ ]);
935
+ case "TemplateLiteralTypeSpan":
936
+ return concat([this.emit(node.type), this.emit(node.literal)]);
937
+ case "NamedTupleMember":
938
+ return concat([
939
+ node.dotDotDotToken ? "..." : "",
940
+ this.emit(node.name),
941
+ node.questionToken ? "?" : "",
942
+ ": ",
943
+ this.emit(node.type),
944
+ ]);
945
+ case "OptionalTypeNode":
946
+ return concat([this.postfixTypeOperand(node.type), "?"]);
947
+ case "RestTypeNode":
948
+ return concat(["...", this.postfixTypeOperand(node.type)]);
949
+ case "ImportTypeNode":
950
+ return concat([
951
+ node.isTypeOf ? "typeof " : "",
952
+ "import(",
953
+ this.emit(node.argument),
954
+ ")",
955
+ node.qualifier ? concat([".", this.emit(node.qualifier)]) : "",
956
+ this.typeArguments(node.typeArguments),
957
+ ]);
958
+ case "CallSignature":
959
+ return concat([
960
+ this.typeArguments(node.typeParameters),
961
+ this.params(node.parameters),
962
+ this.optType(node.type),
963
+ ]);
964
+ case "ConstructSignature":
965
+ return concat([
966
+ "new ",
967
+ this.typeArguments(node.typeParameters),
968
+ this.params(node.parameters),
969
+ this.optType(node.type),
970
+ ]);
971
+ /* template literals */
972
+ case "TemplateHead":
973
+ return concat(["`", node.text, "${"]);
974
+ case "TemplateMiddle":
975
+ return concat(["}", node.text, "${"]);
976
+ case "TemplateTail":
977
+ return concat(["}", node.text, "`"]);
978
+ case "NoSubstitutionTemplateLiteral":
979
+ return concat(["`", node.text, "`"]);
980
+ /* template & misc expressions */
981
+ case "TemplateExpression":
982
+ return concat([
983
+ this.emit(node.head),
984
+ concat(node.templateSpans.map((s) => this.emit(s))),
985
+ ]);
986
+ case "TemplateSpan":
987
+ return concat([
988
+ this.expressionForDisallowedComma(node.expression),
989
+ this.emit(node.literal),
990
+ ]);
991
+ case "TaggedTemplateExpression":
992
+ return concat([
993
+ this.leftSideExpression(node.tag),
994
+ this.typeArguments(node.typeArguments),
995
+ this.emit(node.template),
996
+ ]);
997
+ case "YieldExpression":
998
+ return concat([
999
+ "yield",
1000
+ node.asteriskToken ? "*" : "",
1001
+ node.expression
1002
+ ? concat([" ", this.expressionForDisallowedComma(node.expression)])
1003
+ : "",
1004
+ ]);
1005
+ case "DeleteExpression":
1006
+ return concat(["delete ", this.prefixUnaryOperand(node.expression)]);
1007
+ case "VoidExpression":
1008
+ return concat(["void ", this.prefixUnaryOperand(node.expression)]);
1009
+ case "RegularExpressionLiteral":
1010
+ return node.text;
1011
+ case "ClassExpression":
1012
+ return concat([
1013
+ this.modifiers(node.modifiers, true),
1014
+ "class",
1015
+ node.name ? concat([" ", this.emit(node.name)]) : "",
1016
+ this.typeArguments(node.typeParameters),
1017
+ this.heritage(node.heritageClauses),
1018
+ " ",
1019
+ this.statementBlock(node.members.map((m) => this.emit(m))),
1020
+ ]);
1021
+ case "MetaProperty":
1022
+ return concat([node.keywordToken, ".", this.emit(node.name)]);
1023
+ case "CommaListExpression":
1024
+ return join(", ", node.elements.map((e) => this.emit(e)));
1025
+ case "ComputedPropertyName":
1026
+ return concat([
1027
+ "[",
1028
+ this.expressionForDisallowedComma(node.expression),
1029
+ "]",
1030
+ ]);
1031
+ case "OmittedExpression":
1032
+ return "";
1033
+ case "BindingElement":
1034
+ return concat([
1035
+ node.dotDotDotToken ? "..." : "",
1036
+ node.propertyName ? concat([this.emit(node.propertyName), ": "]) : "",
1037
+ this.emit(node.name),
1038
+ node.initializer
1039
+ ? concat([
1040
+ " = ",
1041
+ this.expressionForDisallowedComma(node.initializer),
1042
+ ])
1043
+ : "",
1044
+ ]);
1045
+ case "ObjectBindingPattern":
1046
+ return this.delim("{", node.elements.map((e) => this.emit(e)), "}", { space: true, trailingComma: true });
1047
+ case "ArrayBindingPattern":
1048
+ return this.delim("[", node.elements.map((e) => this.emit(e)), "]", { trailingComma: true });
1049
+ case "TypeAssertion":
1050
+ return concat([
1051
+ "<",
1052
+ this.emit(node.type),
1053
+ ">",
1054
+ this.prefixUnaryOperand(node.expression),
1055
+ ]);
1056
+ case "PropertyAccessChain":
1057
+ return concat([
1058
+ this.leftSideExpression(node.expression),
1059
+ node.questionDotToken ? "?." : ".",
1060
+ this.emit(node.name),
1061
+ ]);
1062
+ case "ElementAccessChain":
1063
+ return concat([
1064
+ this.leftSideExpression(node.expression),
1065
+ node.questionDotToken ? "?." : "",
1066
+ "[",
1067
+ this.expressionForDisallowedComma(node.argumentExpression),
1068
+ "]",
1069
+ ]);
1070
+ case "CallChain":
1071
+ return concat([
1072
+ this.leftSideExpression(node.expression),
1073
+ node.questionDotToken ? "?." : "",
1074
+ this.typeArguments(node.typeArguments),
1075
+ this.args(node.arguments),
1076
+ ]);
1077
+ case "NonNullChain":
1078
+ return concat([this.leftSideExpression(node.expression), "!"]);
1079
+ /* jsx */
1080
+ case "JsxElement":
1081
+ return group(concat([
1082
+ this.emit(node.openingElement),
1083
+ indent(concat(node.children.map((c) => concat([softline, this.emit(c)])))),
1084
+ softline,
1085
+ this.emit(node.closingElement),
1086
+ ]));
1087
+ case "JsxSelfClosingElement":
1088
+ return concat([
1089
+ "<",
1090
+ this.emit(node.tagName),
1091
+ this.typeArguments(node.typeArguments),
1092
+ this.emit(node.attributes),
1093
+ " />",
1094
+ ]);
1095
+ case "JsxOpeningElement":
1096
+ return concat([
1097
+ "<",
1098
+ this.emit(node.tagName),
1099
+ this.typeArguments(node.typeArguments),
1100
+ this.emit(node.attributes),
1101
+ ">",
1102
+ ]);
1103
+ case "JsxClosingElement":
1104
+ return concat(["</", this.emit(node.tagName), ">"]);
1105
+ case "JsxFragment":
1106
+ return group(concat([
1107
+ this.emit(node.openingFragment),
1108
+ indent(concat(node.children.map((c) => concat([softline, this.emit(c)])))),
1109
+ softline,
1110
+ this.emit(node.closingFragment),
1111
+ ]));
1112
+ case "JsxOpeningFragment":
1113
+ return "<>";
1114
+ case "JsxClosingFragment":
1115
+ return "</>";
1116
+ case "JsxText":
1117
+ return node.text;
1118
+ case "JsxAttribute":
1119
+ return node.initializer === undefined
1120
+ ? this.emit(node.name)
1121
+ : concat([this.emit(node.name), "=", this.emit(node.initializer)]);
1122
+ case "JsxAttributes":
1123
+ return node.properties.length === 0
1124
+ ? ""
1125
+ : concat(node.properties.map((p) => concat([" ", this.emit(p)])));
1126
+ case "JsxSpreadAttribute":
1127
+ return concat(["{...", this.emit(node.expression), "}"]);
1128
+ case "JsxExpression":
1129
+ return concat([
1130
+ "{",
1131
+ node.dotDotDotToken ? "..." : "",
1132
+ node.expression ? this.emit(node.expression) : "",
1133
+ "}",
1134
+ ]);
1135
+ case "JsxNamespacedName":
1136
+ return concat([this.emit(node.namespace), ":", this.emit(node.name)]);
1137
+ /* synthetic / emit-internal */
1138
+ case "Bundle":
1139
+ return join(hardline, node.sourceFiles.map((s) => this.emit(s)));
1140
+ case "PartiallyEmittedExpression":
1141
+ return this.emit(node.expression);
1142
+ case "ImportAttribute":
1143
+ return concat([this.emit(node.name), ": ", this.emit(node.value)]);
1144
+ case "ImportAttributes":
1145
+ return node.elements.length === 0
1146
+ ? concat([node.token, " {}"])
1147
+ : concat([
1148
+ node.token,
1149
+ " { ",
1150
+ join(", ", node.elements.map((e) => this.emit(e))),
1151
+ " }",
1152
+ ]);
1153
+ case "NotEmittedStatement":
1154
+ case "NotEmittedTypeElement":
1155
+ return "";
1156
+ /* jsdoc — types */
1157
+ case "JSDocAllType":
1158
+ return "*";
1159
+ case "JSDocUnknownType":
1160
+ return "?";
1161
+ case "JSDocNonNullableType":
1162
+ return node.postfix
1163
+ ? concat([this.emit(node.type), "!"])
1164
+ : concat(["!", this.emit(node.type)]);
1165
+ case "JSDocNullableType":
1166
+ return node.postfix
1167
+ ? concat([this.emit(node.type), "?"])
1168
+ : concat(["?", this.emit(node.type)]);
1169
+ case "JSDocOptionalType":
1170
+ return concat([this.emit(node.type), "="]);
1171
+ case "JSDocVariadicType":
1172
+ return concat(["...", this.emit(node.type)]);
1173
+ case "JSDocNamepathType":
1174
+ return this.emit(node.type);
1175
+ case "JSDocFunctionType":
1176
+ return concat([
1177
+ "function(",
1178
+ join(", ", node.parameters.map((p) => this.emit(p))),
1179
+ ")",
1180
+ node.type ? concat([": ", this.emit(node.type)]) : "",
1181
+ ]);
1182
+ case "JSDocTypeExpression":
1183
+ return concat(["{", this.emit(node.type), "}"]);
1184
+ case "JSDocNameReference":
1185
+ return this.emit(node.name);
1186
+ case "JSDocMemberName":
1187
+ return concat([this.emit(node.left), "#", this.emit(node.right)]);
1188
+ case "JSDocLink":
1189
+ return concat([
1190
+ "{@link ",
1191
+ node.name ? this.emit(node.name) : "",
1192
+ node.text,
1193
+ "}",
1194
+ ]);
1195
+ case "JSDocLinkCode":
1196
+ return concat([
1197
+ "{@linkcode ",
1198
+ node.name ? this.emit(node.name) : "",
1199
+ node.text,
1200
+ "}",
1201
+ ]);
1202
+ case "JSDocLinkPlain":
1203
+ return concat([
1204
+ "{@linkplain ",
1205
+ node.name ? this.emit(node.name) : "",
1206
+ node.text,
1207
+ "}",
1208
+ ]);
1209
+ case "JSDocText":
1210
+ return node.text;
1211
+ case "JSDocTypeLiteral":
1212
+ return concat([
1213
+ join(hardline, (node.jsDocPropertyTags ?? []).map((t) => this.emit(t))),
1214
+ node.isArrayType ? "[]" : "",
1215
+ ]);
1216
+ case "JSDocSignature":
1217
+ return join(hardline, [
1218
+ ...(node.typeParameters ?? []),
1219
+ ...node.parameters,
1220
+ ...(node.type ? [node.type] : []),
1221
+ ].map((t) => this.emit(t)));
1222
+ case "JSDoc": {
1223
+ const body = node.comment === undefined
1224
+ ? ""
1225
+ : typeof node.comment === "string"
1226
+ ? node.comment
1227
+ : concat(node.comment.map((c) => this.emit(c)));
1228
+ const lines = [concat([" * ", body])];
1229
+ for (const tag of node.tags ?? [])
1230
+ lines.push(concat([" * ", this.emit(tag)]));
1231
+ return concat([
1232
+ "/**",
1233
+ hardline,
1234
+ join(hardline, lines),
1235
+ hardline,
1236
+ " */",
1237
+ ]);
1238
+ }
1239
+ /* jsdoc — tags */
1240
+ case "JSDocTypeTag":
1241
+ case "JSDocThisTag":
1242
+ case "JSDocEnumTag":
1243
+ case "JSDocSatisfiesTag":
1244
+ return concat([
1245
+ "@",
1246
+ this.emit(node.tagName),
1247
+ " ",
1248
+ this.emit(node.typeExpression),
1249
+ this.jsDocComment(node.comment),
1250
+ ]);
1251
+ case "JSDocReturnTag":
1252
+ case "JSDocThrowsTag":
1253
+ return concat([
1254
+ "@",
1255
+ this.emit(node.tagName),
1256
+ node.typeExpression
1257
+ ? concat([" ", this.emit(node.typeExpression)])
1258
+ : "",
1259
+ this.jsDocComment(node.comment),
1260
+ ]);
1261
+ case "JSDocAuthorTag":
1262
+ case "JSDocClassTag":
1263
+ case "JSDocPublicTag":
1264
+ case "JSDocPrivateTag":
1265
+ case "JSDocProtectedTag":
1266
+ case "JSDocReadonlyTag":
1267
+ case "JSDocOverrideTag":
1268
+ case "JSDocDeprecatedTag":
1269
+ case "JSDocUnknownTag":
1270
+ return concat([
1271
+ "@",
1272
+ this.emit(node.tagName),
1273
+ this.jsDocComment(node.comment),
1274
+ ]);
1275
+ case "JSDocAugmentsTag":
1276
+ case "JSDocImplementsTag":
1277
+ return concat([
1278
+ "@",
1279
+ this.emit(node.tagName),
1280
+ " {",
1281
+ this.emit(node.class),
1282
+ "}",
1283
+ this.jsDocComment(node.comment),
1284
+ ]);
1285
+ case "JSDocParameterTag":
1286
+ case "JSDocPropertyTag": {
1287
+ const name = node.isBracketed
1288
+ ? concat(["[", this.emit(node.name), "]"])
1289
+ : this.emit(node.name);
1290
+ const type = node.typeExpression
1291
+ ? this.emit(node.typeExpression)
1292
+ : undefined;
1293
+ const main = node.isNameFirst
1294
+ ? concat([name, type ? concat([" ", type]) : ""])
1295
+ : concat([type ? concat([type, " "]) : "", name]);
1296
+ return concat([
1297
+ "@",
1298
+ this.emit(node.tagName),
1299
+ " ",
1300
+ main,
1301
+ this.jsDocComment(node.comment),
1302
+ ]);
1303
+ }
1304
+ case "JSDocSeeTag":
1305
+ return concat([
1306
+ "@",
1307
+ this.emit(node.tagName),
1308
+ node.name ? concat([" ", this.emit(node.name)]) : "",
1309
+ this.jsDocComment(node.comment),
1310
+ ]);
1311
+ case "JSDocOverloadTag":
1312
+ case "JSDocCallbackTag": {
1313
+ const full = node.kind === "JSDocCallbackTag" && node.fullName
1314
+ ? concat([" ", this.emit(node.fullName)])
1315
+ : "";
1316
+ return concat([
1317
+ "@",
1318
+ this.emit(node.tagName),
1319
+ full,
1320
+ hardline,
1321
+ this.emit(node.typeExpression),
1322
+ this.jsDocComment(node.comment),
1323
+ ]);
1324
+ }
1325
+ case "JSDocImportTag":
1326
+ return concat([
1327
+ "@",
1328
+ this.emit(node.tagName),
1329
+ " ",
1330
+ node.importClause
1331
+ ? concat([this.emit(node.importClause), " from "])
1332
+ : "",
1333
+ this.emit(node.moduleSpecifier),
1334
+ this.jsDocComment(node.comment),
1335
+ ]);
1336
+ case "JSDocTemplateTag":
1337
+ return concat([
1338
+ "@",
1339
+ this.emit(node.tagName),
1340
+ node.constraint ? concat([" ", this.emit(node.constraint)]) : "",
1341
+ " ",
1342
+ join(", ", node.typeParameters.map((t) => this.emit(t))),
1343
+ this.jsDocComment(node.comment),
1344
+ ]);
1345
+ case "JSDocTypedefTag":
1346
+ return concat([
1347
+ "@",
1348
+ this.emit(node.tagName),
1349
+ node.typeExpression
1350
+ ? concat([" ", this.emit(node.typeExpression)])
1351
+ : "",
1352
+ node.fullName ? concat([" ", this.emit(node.fullName)]) : "",
1353
+ this.jsDocComment(node.comment),
1354
+ ]);
1355
+ default:
1356
+ return this.unsupported(node);
1357
+ }
1358
+ }
1359
+ /**
1360
+ * Emit a type in the operand position of a postfix type (`T[]`, `T[K]`),
1361
+ * parenthesizing the lower-precedence type forms that would otherwise
1362
+ * re-associate — matching the legacy printer's parenthesizer rules.
1363
+ */
1364
+ parenthesizedExpression(expression) {
1365
+ return expression.kind === "ParenthesizedExpression"
1366
+ ? this.emit(expression)
1367
+ : concat(["(", this.emit(expression), ")"]);
1368
+ }
1369
+ expressionForDisallowedComma(expression) {
1370
+ return this.expressionPrecedence(expression) > ExpressionPrecedence.Comma
1371
+ ? this.emit(expression)
1372
+ : this.parenthesizedExpression(expression);
1373
+ }
1374
+ leftSideExpression(expression) {
1375
+ return this.isLeftHandSideExpression(expression)
1376
+ ? this.emit(expression)
1377
+ : this.parenthesizedExpression(expression);
1378
+ }
1379
+ newExpressionTarget(expression) {
1380
+ return expression.kind !== "CallExpression" &&
1381
+ expression.kind !== "CallChain" &&
1382
+ (expression.kind !== "NewExpression" ||
1383
+ expression.arguments !== undefined) &&
1384
+ this.isLeftHandSideExpression(expression)
1385
+ ? this.emit(expression)
1386
+ : this.parenthesizedExpression(expression);
1387
+ }
1388
+ prefixUnaryOperand(operand, operator) {
1389
+ const body = this.isUnaryExpression(operand)
1390
+ ? this.emit(operand)
1391
+ : this.parenthesizedExpression(operand);
1392
+ return this.needsPrefixUnaryGap(operator, operand)
1393
+ ? concat([" ", body])
1394
+ : body;
1395
+ }
1396
+ postfixUnaryOperand(operand) {
1397
+ return this.isLeftHandSideExpression(operand)
1398
+ ? this.emit(operand)
1399
+ : this.parenthesizedExpression(operand);
1400
+ }
1401
+ conditionalCondition(condition) {
1402
+ return this.expressionPrecedence(condition) >
1403
+ ExpressionPrecedence.Conditional
1404
+ ? this.emit(condition)
1405
+ : this.parenthesizedExpression(condition);
1406
+ }
1407
+ conditionalBranch(branch) {
1408
+ return this.expressionForDisallowedComma(branch);
1409
+ }
1410
+ arrowFunctionBody(body) {
1411
+ return body.kind === "Block"
1412
+ ? this.emit(body)
1413
+ : this.expressionNeedsConciseBodyParentheses(body)
1414
+ ? this.parenthesizedExpression(body)
1415
+ : this.emit(body);
1416
+ }
1417
+ expressionStatementExpression(expression) {
1418
+ return this.expressionNeedsStatementParentheses(expression)
1419
+ ? this.parenthesizedExpression(expression)
1420
+ : this.emit(expression);
1421
+ }
1422
+ exportAssignmentExpression(expression, isExportEquals) {
1423
+ return isExportEquals
1424
+ ? this.expressionForDisallowedComma(expression)
1425
+ : this.expressionNeedsExportDefaultParentheses(expression)
1426
+ ? this.parenthesizedExpression(expression)
1427
+ : this.emit(expression);
1428
+ }
1429
+ assertionExpressionOperand(expression) {
1430
+ return this.expressionPrecedence(expression) >=
1431
+ ExpressionPrecedence.Relational
1432
+ ? this.expressionForDisallowedComma(expression)
1433
+ : this.parenthesizedExpression(expression);
1434
+ }
1435
+ binaryOperand(operator, operand, isLeftSide, leftOperand) {
1436
+ return this.binaryOperandNeedsParentheses(operator, operand, isLeftSide, leftOperand)
1437
+ ? this.parenthesizedExpression(operand)
1438
+ : this.emit(operand);
1439
+ }
1440
+ binaryOperandNeedsParentheses(operator, operand, isLeftSide, leftOperand) {
1441
+ if (operand.kind === "ParenthesizedExpression")
1442
+ return false;
1443
+ if (operator === SyntaxKind.AsteriskAsteriskToken &&
1444
+ isLeftSide &&
1445
+ this.expressionPrecedence(operand) === ExpressionPrecedence.Unary)
1446
+ return true;
1447
+ if (operand.kind === "BinaryExpression" &&
1448
+ this.mixingBinaryOperatorsRequiresParentheses(operator, operand.operator))
1449
+ return true;
1450
+ const operatorPrecedence = this.binaryOperatorPrecedence(operator);
1451
+ const operandPrecedence = this.expressionPrecedence(operand);
1452
+ if (!isLeftSide &&
1453
+ operand.kind === "ArrowFunction" &&
1454
+ operatorPrecedence > ExpressionPrecedence.Assignment)
1455
+ return true;
1456
+ if (operandPrecedence < operatorPrecedence)
1457
+ return true;
1458
+ if (operandPrecedence > operatorPrecedence)
1459
+ return false;
1460
+ if (isLeftSide)
1461
+ return this.binaryOperatorAssociativity(operator) === Associativity.Right;
1462
+ if (operand.kind === "BinaryExpression" && operand.operator === operator) {
1463
+ if (this.operatorHasAssociativeProperty(operator))
1464
+ return false;
1465
+ if (operator === SyntaxKind.PlusToken &&
1466
+ leftOperand !== undefined &&
1467
+ this.literalKindOfBinaryPlusOperand(leftOperand) !== undefined &&
1468
+ this.literalKindOfBinaryPlusOperand(leftOperand) ===
1469
+ this.literalKindOfBinaryPlusOperand(operand))
1470
+ return false;
1471
+ }
1472
+ return this.expressionAssociativity(operand) === Associativity.Left;
1473
+ }
1474
+ expressionPrecedence(expression) {
1475
+ switch (expression.kind) {
1476
+ case "CommaListExpression":
1477
+ return ExpressionPrecedence.Comma;
1478
+ case "YieldExpression":
1479
+ return ExpressionPrecedence.Yield;
1480
+ case "ConditionalExpression":
1481
+ return ExpressionPrecedence.Conditional;
1482
+ case "BinaryExpression":
1483
+ return this.binaryOperatorPrecedence(expression.operator);
1484
+ case "AsExpression":
1485
+ case "SatisfiesExpression":
1486
+ return ExpressionPrecedence.Relational;
1487
+ case "TypeAssertion":
1488
+ case "PrefixUnaryExpression":
1489
+ case "TypeOfExpression":
1490
+ case "VoidExpression":
1491
+ case "DeleteExpression":
1492
+ case "AwaitExpression":
1493
+ case "NonNullExpression":
1494
+ case "NonNullChain":
1495
+ return ExpressionPrecedence.Unary;
1496
+ case "PostfixUnaryExpression":
1497
+ return ExpressionPrecedence.Update;
1498
+ case "CallExpression":
1499
+ case "CallChain":
1500
+ return ExpressionPrecedence.LeftHandSide;
1501
+ case "NewExpression":
1502
+ case "TaggedTemplateExpression":
1503
+ case "PropertyAccessExpression":
1504
+ case "PropertyAccessChain":
1505
+ case "ElementAccessExpression":
1506
+ case "ElementAccessChain":
1507
+ case "MetaProperty":
1508
+ return ExpressionPrecedence.Member;
1509
+ default:
1510
+ return ExpressionPrecedence.Primary;
1511
+ }
1512
+ }
1513
+ expressionAssociativity(expression) {
1514
+ switch (expression.kind) {
1515
+ case "NewExpression":
1516
+ return expression.arguments === undefined
1517
+ ? Associativity.Right
1518
+ : Associativity.Left;
1519
+ case "PrefixUnaryExpression":
1520
+ case "TypeOfExpression":
1521
+ case "VoidExpression":
1522
+ case "DeleteExpression":
1523
+ case "AwaitExpression":
1524
+ case "ConditionalExpression":
1525
+ case "YieldExpression":
1526
+ return Associativity.Right;
1527
+ case "BinaryExpression":
1528
+ return this.binaryOperatorAssociativity(expression.operator);
1529
+ default:
1530
+ return Associativity.Left;
1531
+ }
1532
+ }
1533
+ binaryOperatorPrecedence(operator) {
1534
+ switch (operator) {
1535
+ case SyntaxKind.CommaToken:
1536
+ return ExpressionPrecedence.Comma;
1537
+ case SyntaxKind.EqualsToken:
1538
+ case SyntaxKind.PlusEqualsToken:
1539
+ case SyntaxKind.MinusEqualsToken:
1540
+ case SyntaxKind.AsteriskEqualsToken:
1541
+ case SyntaxKind.SlashEqualsToken:
1542
+ case SyntaxKind.QuestionQuestionEqualsToken:
1543
+ return ExpressionPrecedence.Assignment;
1544
+ case SyntaxKind.QuestionQuestionToken:
1545
+ case SyntaxKind.BarBarToken:
1546
+ return ExpressionPrecedence.LogicalOR;
1547
+ case SyntaxKind.AmpersandAmpersandToken:
1548
+ return ExpressionPrecedence.LogicalAND;
1549
+ case SyntaxKind.BarToken:
1550
+ return ExpressionPrecedence.BitwiseOR;
1551
+ case SyntaxKind.CaretToken:
1552
+ return ExpressionPrecedence.BitwiseXOR;
1553
+ case SyntaxKind.AmpersandToken:
1554
+ return ExpressionPrecedence.BitwiseAND;
1555
+ case SyntaxKind.EqualsEqualsToken:
1556
+ case SyntaxKind.ExclamationEqualsToken:
1557
+ case SyntaxKind.EqualsEqualsEqualsToken:
1558
+ case SyntaxKind.ExclamationEqualsEqualsToken:
1559
+ return ExpressionPrecedence.Equality;
1560
+ case SyntaxKind.LessThanToken:
1561
+ case SyntaxKind.LessThanEqualsToken:
1562
+ case SyntaxKind.GreaterThanToken:
1563
+ case SyntaxKind.GreaterThanEqualsToken:
1564
+ case SyntaxKind.InstanceOfKeyword:
1565
+ case SyntaxKind.InKeyword:
1566
+ case SyntaxKind.AsKeyword:
1567
+ case SyntaxKind.SatisfiesKeyword:
1568
+ return ExpressionPrecedence.Relational;
1569
+ case SyntaxKind.LessThanLessThanToken:
1570
+ case SyntaxKind.GreaterThanGreaterThanToken:
1571
+ case SyntaxKind.GreaterThanGreaterThanGreaterThanToken:
1572
+ return ExpressionPrecedence.Shift;
1573
+ case SyntaxKind.PlusToken:
1574
+ case SyntaxKind.MinusToken:
1575
+ return ExpressionPrecedence.Additive;
1576
+ case SyntaxKind.AsteriskToken:
1577
+ case SyntaxKind.SlashToken:
1578
+ case SyntaxKind.PercentToken:
1579
+ return ExpressionPrecedence.Multiplicative;
1580
+ case SyntaxKind.AsteriskAsteriskToken:
1581
+ return ExpressionPrecedence.Exponentiation;
1582
+ default:
1583
+ return ExpressionPrecedence.Invalid;
1584
+ }
1585
+ }
1586
+ binaryOperatorAssociativity(operator) {
1587
+ switch (operator) {
1588
+ case SyntaxKind.AsteriskAsteriskToken:
1589
+ case SyntaxKind.EqualsToken:
1590
+ case SyntaxKind.PlusEqualsToken:
1591
+ case SyntaxKind.MinusEqualsToken:
1592
+ case SyntaxKind.AsteriskEqualsToken:
1593
+ case SyntaxKind.SlashEqualsToken:
1594
+ case SyntaxKind.QuestionQuestionEqualsToken:
1595
+ return Associativity.Right;
1596
+ default:
1597
+ return Associativity.Left;
1598
+ }
1599
+ }
1600
+ mixingBinaryOperatorsRequiresParentheses(left, right) {
1601
+ return ((left === SyntaxKind.QuestionQuestionToken &&
1602
+ (right === SyntaxKind.AmpersandAmpersandToken ||
1603
+ right === SyntaxKind.BarBarToken)) ||
1604
+ (right === SyntaxKind.QuestionQuestionToken &&
1605
+ (left === SyntaxKind.AmpersandAmpersandToken ||
1606
+ left === SyntaxKind.BarBarToken)));
1607
+ }
1608
+ operatorHasAssociativeProperty(operator) {
1609
+ return (operator === SyntaxKind.AsteriskToken ||
1610
+ operator === SyntaxKind.BarToken ||
1611
+ operator === SyntaxKind.AmpersandToken ||
1612
+ operator === SyntaxKind.CaretToken ||
1613
+ operator === SyntaxKind.CommaToken);
1614
+ }
1615
+ literalKindOfBinaryPlusOperand(expression) {
1616
+ switch (expression.kind) {
1617
+ case "StringLiteral":
1618
+ case "NumericLiteral":
1619
+ case "BigIntLiteral":
1620
+ return expression.kind;
1621
+ case "BinaryExpression": {
1622
+ if (expression.operator !== SyntaxKind.PlusToken)
1623
+ return undefined;
1624
+ const left = this.literalKindOfBinaryPlusOperand(expression.left);
1625
+ return left !== undefined &&
1626
+ left === this.literalKindOfBinaryPlusOperand(expression.right)
1627
+ ? left
1628
+ : undefined;
1629
+ }
1630
+ default:
1631
+ return undefined;
1632
+ }
1633
+ }
1634
+ isUnaryExpression(expression) {
1635
+ return this.expressionPrecedence(expression) >= ExpressionPrecedence.Unary;
1636
+ }
1637
+ isLeftHandSideExpression(expression) {
1638
+ switch (expression.kind) {
1639
+ case "ArrowFunction":
1640
+ case "ClassExpression":
1641
+ case "FunctionExpression":
1642
+ case "NumericLiteral":
1643
+ case "ObjectLiteralExpression":
1644
+ return false;
1645
+ }
1646
+ return (this.expressionPrecedence(expression) >=
1647
+ ExpressionPrecedence.LeftHandSide ||
1648
+ expression.kind === "NonNullExpression" ||
1649
+ expression.kind === "NonNullChain");
1650
+ }
1651
+ expressionNeedsStatementParentheses(expression) {
1652
+ const leftmost = this.leftmostExpression(expression);
1653
+ return (leftmost.kind === "FunctionExpression" ||
1654
+ leftmost.kind === "ObjectLiteralExpression");
1655
+ }
1656
+ expressionNeedsConciseBodyParentheses(expression) {
1657
+ return (this.expressionPrecedence(expression) <= ExpressionPrecedence.Comma ||
1658
+ this.leftmostExpression(expression).kind === "ObjectLiteralExpression");
1659
+ }
1660
+ expressionNeedsExportDefaultParentheses(expression) {
1661
+ const leftmost = this.leftmostExpression(expression);
1662
+ return (this.expressionPrecedence(expression) <= ExpressionPrecedence.Comma ||
1663
+ leftmost.kind === "ClassExpression" ||
1664
+ leftmost.kind === "FunctionExpression");
1665
+ }
1666
+ leftmostExpression(expression) {
1667
+ switch (expression.kind) {
1668
+ case "AsExpression":
1669
+ case "CallExpression":
1670
+ case "CallChain":
1671
+ case "ElementAccessExpression":
1672
+ case "ElementAccessChain":
1673
+ case "NonNullExpression":
1674
+ case "NonNullChain":
1675
+ case "PropertyAccessExpression":
1676
+ case "PropertyAccessChain":
1677
+ case "SatisfiesExpression":
1678
+ return this.leftmostExpression(expression.expression);
1679
+ case "BinaryExpression":
1680
+ return this.leftmostExpression(expression.left);
1681
+ case "ConditionalExpression":
1682
+ return this.leftmostExpression(expression.condition);
1683
+ case "TaggedTemplateExpression":
1684
+ return this.leftmostExpression(expression.tag);
1685
+ default:
1686
+ return expression;
1687
+ }
1688
+ }
1689
+ needsPrefixUnaryGap(operator, operand) {
1690
+ if (operator === undefined || operand.kind !== "PrefixUnaryExpression")
1691
+ return false;
1692
+ return ((operator === SyntaxKind.PlusToken &&
1693
+ (operand.operator === SyntaxKind.PlusToken ||
1694
+ operand.operator === SyntaxKind.PlusPlusToken)) ||
1695
+ (operator === SyntaxKind.MinusToken &&
1696
+ (operand.operator === SyntaxKind.MinusToken ||
1697
+ operand.operator === SyntaxKind.MinusMinusToken)));
1698
+ }
1699
+ parenthesizedType(type) {
1700
+ return type.kind === "ParenthesizedTypeNode"
1701
+ ? this.emit(type)
1702
+ : concat(["(", this.emit(type), ")"]);
1703
+ }
1704
+ conditionalTypeCheckOperand(type) {
1705
+ return type.kind === "FunctionTypeNode" ||
1706
+ type.kind === "ConstructorTypeNode" ||
1707
+ type.kind === "ConditionalTypeNode"
1708
+ ? this.parenthesizedType(type)
1709
+ : this.emit(type);
1710
+ }
1711
+ conditionalTypeExtendsOperand(type) {
1712
+ return type.kind === "ConditionalTypeNode"
1713
+ ? this.parenthesizedType(type)
1714
+ : this.emit(type);
1715
+ }
1716
+ typeOperatorOperand(type, operator) {
1717
+ return this.typeOperatorOperandNeedsParentheses(type, operator)
1718
+ ? this.parenthesizedType(type)
1719
+ : this.emit(type);
1720
+ }
1721
+ typeOperatorOperandNeedsParentheses(type, operator) {
1722
+ return (type.kind === "UnionTypeNode" ||
1723
+ type.kind === "IntersectionTypeNode" ||
1724
+ type.kind === "FunctionTypeNode" ||
1725
+ type.kind === "ConstructorTypeNode" ||
1726
+ type.kind === "ConditionalTypeNode" ||
1727
+ (operator === SyntaxKind.ReadonlyKeyword &&
1728
+ type.kind === "TypeOperatorNode"));
1729
+ }
1730
+ postfixTypeOperand(type) {
1731
+ return this.postfixTypeOperandNeedsParentheses(type)
1732
+ ? this.parenthesizedType(type)
1733
+ : this.emit(type);
1734
+ }
1735
+ postfixTypeOperandNeedsParentheses(type) {
1736
+ return (type.kind === "InferTypeNode" ||
1737
+ type.kind === "TypeOperatorNode" ||
1738
+ type.kind === "TypeQueryNode" ||
1739
+ this.typeOperatorOperandNeedsParentheses(type));
1740
+ }
1741
+ /** Render a JSDoc tag's trailing comment, prefixed with a space when present. */
1742
+ jsDocComment(comment) {
1743
+ if (comment === undefined)
1744
+ return "";
1745
+ if (typeof comment === "string")
1746
+ return comment.length ? concat([" ", comment]) : "";
1747
+ return comment.length
1748
+ ? concat([" ", concat(comment.map((c) => this.emit(c)))])
1749
+ : "";
1750
+ }
1751
+ /** Width-aware `|` / `&` type list with leading-operator breaks. */
1752
+ binaryType(operator, types) {
1753
+ const parts = this.flattenBinaryTypes(operator, types).map((type) => this.binaryTypeOperand(operator, type));
1754
+ if (parts.length === 1)
1755
+ return parts[0];
1756
+ return group(indent(concat([
1757
+ ifBreak(concat([line, operator, " "])),
1758
+ join(concat([line, operator, " "]), parts),
1759
+ ])));
1760
+ }
1761
+ flattenBinaryTypes(operator, types) {
1762
+ const flattened = [];
1763
+ for (const type of types)
1764
+ if (operator === "|" && type.kind === "UnionTypeNode")
1765
+ flattened.push(...this.flattenBinaryTypes(operator, type.types));
1766
+ else if (operator === "&" && type.kind === "IntersectionTypeNode")
1767
+ flattened.push(...this.flattenBinaryTypes(operator, type.types));
1768
+ else
1769
+ flattened.push(type);
1770
+ return flattened;
1771
+ }
1772
+ binaryTypeOperand(operator, type) {
1773
+ return this.binaryTypeOperandNeedsParentheses(operator, type)
1774
+ ? this.parenthesizedType(type)
1775
+ : this.emit(type);
1776
+ }
1777
+ binaryTypeOperandNeedsParentheses(operator, type) {
1778
+ return (type.kind === "FunctionTypeNode" ||
1779
+ type.kind === "ConstructorTypeNode" ||
1780
+ type.kind === "ConditionalTypeNode" ||
1781
+ type.kind === "UnionTypeNode" ||
1782
+ (operator === "|" && type.kind === "IntersectionTypeNode"));
1783
+ }
1784
+ unsupported(node) {
1785
+ throw new Error(`@ttsc/factory: TsPrinter cannot print node of kind "${node.kind}".`);
1786
+ }
1787
+ }
1788
+ const escapeString = (text, singleQuote) => {
1789
+ const escaped = text
1790
+ .replace(/\\/g, "\\\\")
1791
+ .replace(/\n/g, "\\n")
1792
+ .replace(/\r/g, "\\r")
1793
+ .replace(/\t/g, "\\t");
1794
+ return singleQuote === true
1795
+ ? `'${escaped.replace(/'/g, "\\'")}'`
1796
+ : `"${escaped.replace(/"/g, '\\"')}"`;
1797
+ };
1798
+ const ExpressionPrecedence = {
1799
+ Comma: 0,
1800
+ Yield: 2,
1801
+ Assignment: 3,
1802
+ Conditional: 4,
1803
+ LogicalOR: 5,
1804
+ LogicalAND: 6,
1805
+ BitwiseOR: 7,
1806
+ BitwiseXOR: 8,
1807
+ BitwiseAND: 9,
1808
+ Equality: 10,
1809
+ Relational: 11,
1810
+ Shift: 12,
1811
+ Additive: 13,
1812
+ Multiplicative: 14,
1813
+ Exponentiation: 15,
1814
+ Unary: 16,
1815
+ Update: 17,
1816
+ LeftHandSide: 18,
1817
+ Member: 19,
1818
+ Primary: 20,
1819
+ Invalid: -1,
1820
+ };
1821
+ const Associativity = {
1822
+ Left: "left",
1823
+ Right: "right",
1824
+ };
1825
+
1826
+ export { TsPrinter };
1827
+ //# sourceMappingURL=TsPrinter.mjs.map