@teambit/typescript 0.0.0-004aea01bc027e428dfd0f6583f49a1b8286bdd0

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 (309) hide show
  1. package/cmds/check-types.cmd.ts +81 -0
  2. package/dist/cmds/check-types.cmd.d.ts +35 -0
  3. package/dist/cmds/check-types.cmd.js +105 -0
  4. package/dist/cmds/check-types.cmd.js.map +1 -0
  5. package/dist/compiler-options.d.ts +22 -0
  6. package/dist/compiler-options.js +3 -0
  7. package/dist/compiler-options.js.map +1 -0
  8. package/dist/esm.mjs +21 -0
  9. package/dist/exceptions/index.d.ts +1 -0
  10. package/dist/exceptions/index.js +20 -0
  11. package/dist/exceptions/index.js.map +1 -0
  12. package/dist/exceptions/transformer-not-found.d.ts +8 -0
  13. package/dist/exceptions/transformer-not-found.js +26 -0
  14. package/dist/exceptions/transformer-not-found.js.map +1 -0
  15. package/dist/export-identifier.d.ts +6 -0
  16. package/dist/export-identifier.js +29 -0
  17. package/dist/export-identifier.js.map +1 -0
  18. package/dist/extractor-options.d.ts +26 -0
  19. package/dist/extractor-options.js +3 -0
  20. package/dist/extractor-options.js.map +1 -0
  21. package/dist/identifier-list.d.ts +7 -0
  22. package/dist/identifier-list.js +21 -0
  23. package/dist/identifier-list.js.map +1 -0
  24. package/dist/identifier.d.ts +11 -0
  25. package/dist/identifier.js +45 -0
  26. package/dist/identifier.js.map +1 -0
  27. package/dist/index.d.ts +9 -0
  28. package/dist/index.js +91 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/preview-1760469561956.js +7 -0
  31. package/dist/remove-types-task.d.ts +12 -0
  32. package/dist/remove-types-task.js +64 -0
  33. package/dist/remove-types-task.js.map +1 -0
  34. package/dist/schema-extractor-context.d.ts +164 -0
  35. package/dist/schema-extractor-context.js +745 -0
  36. package/dist/schema-extractor-context.js.map +1 -0
  37. package/dist/schema-transformer.d.ts +19 -0
  38. package/dist/schema-transformer.js +3 -0
  39. package/dist/schema-transformer.js.map +1 -0
  40. package/dist/schema-transformer.plugin.d.ts +9 -0
  41. package/dist/schema-transformer.plugin.js +22 -0
  42. package/dist/schema-transformer.plugin.js.map +1 -0
  43. package/dist/sourceFileTransformers/class.d.ts +2 -0
  44. package/dist/sourceFileTransformers/class.js +57 -0
  45. package/dist/sourceFileTransformers/class.js.map +1 -0
  46. package/dist/sourceFileTransformers/empty-line-encoder.d.ts +14 -0
  47. package/dist/sourceFileTransformers/empty-line-encoder.js +62 -0
  48. package/dist/sourceFileTransformers/empty-line-encoder.js.map +1 -0
  49. package/dist/sourceFileTransformers/export.d.ts +2 -0
  50. package/dist/sourceFileTransformers/export.js +58 -0
  51. package/dist/sourceFileTransformers/export.js.map +1 -0
  52. package/dist/sourceFileTransformers/expression-statement.d.ts +2 -0
  53. package/dist/sourceFileTransformers/expression-statement.js +58 -0
  54. package/dist/sourceFileTransformers/expression-statement.js.map +1 -0
  55. package/dist/sourceFileTransformers/function.d.ts +2 -0
  56. package/dist/sourceFileTransformers/function.js +119 -0
  57. package/dist/sourceFileTransformers/function.js.map +1 -0
  58. package/dist/sourceFileTransformers/import.d.ts +2 -0
  59. package/dist/sourceFileTransformers/import.js +71 -0
  60. package/dist/sourceFileTransformers/import.js.map +1 -0
  61. package/dist/sourceFileTransformers/index.d.ts +12 -0
  62. package/dist/sourceFileTransformers/index.js +137 -0
  63. package/dist/sourceFileTransformers/index.js.map +1 -0
  64. package/dist/sourceFileTransformers/interface.d.ts +2 -0
  65. package/dist/sourceFileTransformers/interface.js +50 -0
  66. package/dist/sourceFileTransformers/interface.js.map +1 -0
  67. package/dist/sourceFileTransformers/replaceName.d.ts +1 -0
  68. package/dist/sourceFileTransformers/replaceName.js +19 -0
  69. package/dist/sourceFileTransformers/replaceName.js.map +1 -0
  70. package/dist/sourceFileTransformers/transform.d.ts +12 -0
  71. package/dist/sourceFileTransformers/transform.js +76 -0
  72. package/dist/sourceFileTransformers/transform.js.map +1 -0
  73. package/dist/sourceFileTransformers/type-reference.d.ts +2 -0
  74. package/dist/sourceFileTransformers/type-reference.js +38 -0
  75. package/dist/sourceFileTransformers/type-reference.js.map +1 -0
  76. package/dist/sourceFileTransformers/typeAlias.d.ts +2 -0
  77. package/dist/sourceFileTransformers/typeAlias.js +41 -0
  78. package/dist/sourceFileTransformers/typeAlias.js.map +1 -0
  79. package/dist/sourceFileTransformers/variable.d.ts +2 -0
  80. package/dist/sourceFileTransformers/variable.js +41 -0
  81. package/dist/sourceFileTransformers/variable.js.map +1 -0
  82. package/dist/transform-source-file.spec.d.ts +1 -0
  83. package/dist/transform-source-file.spec.js +182 -0
  84. package/dist/transform-source-file.spec.js.map +1 -0
  85. package/dist/transformers/array-literal-expression.d.ts +10 -0
  86. package/dist/transformers/array-literal-expression.js +51 -0
  87. package/dist/transformers/array-literal-expression.js.map +1 -0
  88. package/dist/transformers/array-type.d.ts +10 -0
  89. package/dist/transformers/array-type.js +37 -0
  90. package/dist/transformers/array-type.js.map +1 -0
  91. package/dist/transformers/binding-element.d.ts +17 -0
  92. package/dist/transformers/binding-element.js +63 -0
  93. package/dist/transformers/binding-element.js.map +1 -0
  94. package/dist/transformers/class-declaration.d.ts +12 -0
  95. package/dist/transformers/class-declaration.js +116 -0
  96. package/dist/transformers/class-declaration.js.map +1 -0
  97. package/dist/transformers/conditional-type.d.ts +10 -0
  98. package/dist/transformers/conditional-type.js +38 -0
  99. package/dist/transformers/conditional-type.js.map +1 -0
  100. package/dist/transformers/constructor.d.ts +10 -0
  101. package/dist/transformers/constructor.js +49 -0
  102. package/dist/transformers/constructor.js.map +1 -0
  103. package/dist/transformers/decorator.d.ts +10 -0
  104. package/dist/transformers/decorator.js +54 -0
  105. package/dist/transformers/decorator.js.map +1 -0
  106. package/dist/transformers/enum-declaration.d.ts +10 -0
  107. package/dist/transformers/enum-declaration.js +60 -0
  108. package/dist/transformers/enum-declaration.js.map +1 -0
  109. package/dist/transformers/export-assignment.d.ts +14 -0
  110. package/dist/transformers/export-assignment.js +54 -0
  111. package/dist/transformers/export-assignment.js.map +1 -0
  112. package/dist/transformers/export-declaration.d.ts +10 -0
  113. package/dist/transformers/export-declaration.js +154 -0
  114. package/dist/transformers/export-declaration.js.map +1 -0
  115. package/dist/transformers/expression-statement.d.ts +10 -0
  116. package/dist/transformers/expression-statement.js +36 -0
  117. package/dist/transformers/expression-statement.js.map +1 -0
  118. package/dist/transformers/function-like.d.ts +11 -0
  119. package/dist/transformers/function-like.js +81 -0
  120. package/dist/transformers/function-like.js.map +1 -0
  121. package/dist/transformers/get-accessor.d.ts +10 -0
  122. package/dist/transformers/get-accessor.js +46 -0
  123. package/dist/transformers/get-accessor.js.map +1 -0
  124. package/dist/transformers/import-declaration.d.ts +10 -0
  125. package/dist/transformers/import-declaration.js +72 -0
  126. package/dist/transformers/import-declaration.js.map +1 -0
  127. package/dist/transformers/index-signature.d.ts +10 -0
  128. package/dist/transformers/index-signature.js +41 -0
  129. package/dist/transformers/index-signature.js.map +1 -0
  130. package/dist/transformers/index.d.ts +43 -0
  131. package/dist/transformers/index.js +566 -0
  132. package/dist/transformers/index.js.map +1 -0
  133. package/dist/transformers/indexed-access-type.d.ts +10 -0
  134. package/dist/transformers/indexed-access-type.js +36 -0
  135. package/dist/transformers/indexed-access-type.js.map +1 -0
  136. package/dist/transformers/interface-declaration.d.ts +11 -0
  137. package/dist/transformers/interface-declaration.js +86 -0
  138. package/dist/transformers/interface-declaration.js.map +1 -0
  139. package/dist/transformers/intersection-type.d.ts +10 -0
  140. package/dist/transformers/intersection-type.js +47 -0
  141. package/dist/transformers/intersection-type.js.map +1 -0
  142. package/dist/transformers/keyword-type.d.ts +13 -0
  143. package/dist/transformers/keyword-type.js +54 -0
  144. package/dist/transformers/keyword-type.js.map +1 -0
  145. package/dist/transformers/literal-type.d.ts +13 -0
  146. package/dist/transformers/literal-type.js +39 -0
  147. package/dist/transformers/literal-type.js.map +1 -0
  148. package/dist/transformers/literal-value.d.ts +12 -0
  149. package/dist/transformers/literal-value.js +35 -0
  150. package/dist/transformers/literal-value.js.map +1 -0
  151. package/dist/transformers/module-declaration.d.ts +10 -0
  152. package/dist/transformers/module-declaration.js +36 -0
  153. package/dist/transformers/module-declaration.js.map +1 -0
  154. package/dist/transformers/named-tuple.d.ts +10 -0
  155. package/dist/transformers/named-tuple.js +37 -0
  156. package/dist/transformers/named-tuple.js.map +1 -0
  157. package/dist/transformers/object-literal-expression.d.ts +9 -0
  158. package/dist/transformers/object-literal-expression.js +51 -0
  159. package/dist/transformers/object-literal-expression.js.map +1 -0
  160. package/dist/transformers/parameter.d.ts +14 -0
  161. package/dist/transformers/parameter.js +109 -0
  162. package/dist/transformers/parameter.js.map +1 -0
  163. package/dist/transformers/parenthesized-type.d.ts +10 -0
  164. package/dist/transformers/parenthesized-type.js +35 -0
  165. package/dist/transformers/parenthesized-type.js.map +1 -0
  166. package/dist/transformers/property-assignment.d.ts +9 -0
  167. package/dist/transformers/property-assignment.js +39 -0
  168. package/dist/transformers/property-assignment.js.map +1 -0
  169. package/dist/transformers/property-declaration.d.ts +11 -0
  170. package/dist/transformers/property-declaration.js +56 -0
  171. package/dist/transformers/property-declaration.js.map +1 -0
  172. package/dist/transformers/set-accessor.d.ts +10 -0
  173. package/dist/transformers/set-accessor.js +44 -0
  174. package/dist/transformers/set-accessor.js.map +1 -0
  175. package/dist/transformers/source-file-transformer.d.ts +15 -0
  176. package/dist/transformers/source-file-transformer.js +108 -0
  177. package/dist/transformers/source-file-transformer.js.map +1 -0
  178. package/dist/transformers/template-literal-type-span.d.ts +10 -0
  179. package/dist/transformers/template-literal-type-span.js +36 -0
  180. package/dist/transformers/template-literal-type-span.js.map +1 -0
  181. package/dist/transformers/template-literal-type.d.ts +10 -0
  182. package/dist/transformers/template-literal-type.js +44 -0
  183. package/dist/transformers/template-literal-type.js.map +1 -0
  184. package/dist/transformers/this-type.d.ts +10 -0
  185. package/dist/transformers/this-type.js +34 -0
  186. package/dist/transformers/this-type.js.map +1 -0
  187. package/dist/transformers/tuple-type.d.ts +10 -0
  188. package/dist/transformers/tuple-type.js +46 -0
  189. package/dist/transformers/tuple-type.js.map +1 -0
  190. package/dist/transformers/type-alias.d.ts +11 -0
  191. package/dist/transformers/type-alias.js +48 -0
  192. package/dist/transformers/type-alias.js.map +1 -0
  193. package/dist/transformers/type-literal.d.ts +14 -0
  194. package/dist/transformers/type-literal.js +48 -0
  195. package/dist/transformers/type-literal.js.map +1 -0
  196. package/dist/transformers/type-operator.d.ts +15 -0
  197. package/dist/transformers/type-operator.js +51 -0
  198. package/dist/transformers/type-operator.js.map +1 -0
  199. package/dist/transformers/type-predicate.d.ts +10 -0
  200. package/dist/transformers/type-predicate.js +37 -0
  201. package/dist/transformers/type-predicate.js.map +1 -0
  202. package/dist/transformers/type-query.d.ts +13 -0
  203. package/dist/transformers/type-query.js +41 -0
  204. package/dist/transformers/type-query.js.map +1 -0
  205. package/dist/transformers/type-reference.d.ts +17 -0
  206. package/dist/transformers/type-reference.js +58 -0
  207. package/dist/transformers/type-reference.js.map +1 -0
  208. package/dist/transformers/union-type.d.ts +10 -0
  209. package/dist/transformers/union-type.js +47 -0
  210. package/dist/transformers/union-type.js.map +1 -0
  211. package/dist/transformers/utils/jsdoc-to-doc-schema.d.ts +5 -0
  212. package/dist/transformers/utils/jsdoc-to-doc-schema.js +114 -0
  213. package/dist/transformers/utils/jsdoc-to-doc-schema.js.map +1 -0
  214. package/dist/transformers/utils/parse-type-from-quick-info.d.ts +36 -0
  215. package/dist/transformers/utils/parse-type-from-quick-info.js +111 -0
  216. package/dist/transformers/utils/parse-type-from-quick-info.js.map +1 -0
  217. package/dist/transformers/variable-declaration.d.ts +11 -0
  218. package/dist/transformers/variable-declaration.js +102 -0
  219. package/dist/transformers/variable-declaration.js.map +1 -0
  220. package/dist/transformers/variable-statement.d.ts +14 -0
  221. package/dist/transformers/variable-statement.js +67 -0
  222. package/dist/transformers/variable-statement.js.map +1 -0
  223. package/dist/tsconfig.default.json +25 -0
  224. package/dist/typescript.aspect.d.ts +2 -0
  225. package/dist/typescript.aspect.js +18 -0
  226. package/dist/typescript.aspect.js.map +1 -0
  227. package/dist/typescript.composition.d.ts +1 -0
  228. package/dist/typescript.composition.js +29 -0
  229. package/dist/typescript.composition.js.map +1 -0
  230. package/dist/typescript.docs.mdx +8 -0
  231. package/dist/typescript.extractor.d.ts +52 -0
  232. package/dist/typescript.extractor.js +254 -0
  233. package/dist/typescript.extractor.js.map +1 -0
  234. package/dist/typescript.main.runtime.d.ts +130 -0
  235. package/dist/typescript.main.runtime.js +400 -0
  236. package/dist/typescript.main.runtime.js.map +1 -0
  237. package/dist/typescript.parser.d.ts +13 -0
  238. package/dist/typescript.parser.js +142 -0
  239. package/dist/typescript.parser.js.map +1 -0
  240. package/dist/typescript.parser.spec.d.ts +1 -0
  241. package/dist/typescript.parser.spec.js +189 -0
  242. package/dist/typescript.parser.spec.js.map +1 -0
  243. package/esm.mjs +21 -0
  244. package/exceptions/index.ts +1 -0
  245. package/exceptions/transformer-not-found.ts +20 -0
  246. package/package.json +86 -0
  247. package/sourceFileTransformers/class.ts +73 -0
  248. package/sourceFileTransformers/empty-line-encoder.ts +56 -0
  249. package/sourceFileTransformers/export.ts +65 -0
  250. package/sourceFileTransformers/expression-statement.ts +48 -0
  251. package/sourceFileTransformers/function.ts +170 -0
  252. package/sourceFileTransformers/import.ts +101 -0
  253. package/sourceFileTransformers/index.ts +14 -0
  254. package/sourceFileTransformers/interface.ts +41 -0
  255. package/sourceFileTransformers/replaceName.ts +11 -0
  256. package/sourceFileTransformers/transform.ts +70 -0
  257. package/sourceFileTransformers/type-reference.ts +19 -0
  258. package/sourceFileTransformers/typeAlias.ts +25 -0
  259. package/sourceFileTransformers/variable.ts +25 -0
  260. package/transformers/array-literal-expression.ts +31 -0
  261. package/transformers/array-type.ts +22 -0
  262. package/transformers/binding-element.ts +35 -0
  263. package/transformers/class-declaration.ts +109 -0
  264. package/transformers/conditional-type.ts +24 -0
  265. package/transformers/constructor.ts +37 -0
  266. package/transformers/decorator.ts +30 -0
  267. package/transformers/enum-declaration.ts +32 -0
  268. package/transformers/export-assignment.ts +48 -0
  269. package/transformers/export-declaration.ts +182 -0
  270. package/transformers/expression-statement.ts +21 -0
  271. package/transformers/function-like.ts +72 -0
  272. package/transformers/get-accessor.ts +25 -0
  273. package/transformers/import-declaration.ts +57 -0
  274. package/transformers/index-signature.ts +27 -0
  275. package/transformers/index.ts +43 -0
  276. package/transformers/indexed-access-type.ts +22 -0
  277. package/transformers/interface-declaration.ts +68 -0
  278. package/transformers/intersection-type.ts +26 -0
  279. package/transformers/keyword-type.ts +40 -0
  280. package/transformers/literal-type.ts +24 -0
  281. package/transformers/literal-value.ts +40 -0
  282. package/transformers/module-declaration.ts +21 -0
  283. package/transformers/named-tuple.ts +23 -0
  284. package/transformers/object-literal-expression.ts +29 -0
  285. package/transformers/parameter.ts +115 -0
  286. package/transformers/parenthesized-type.ts +21 -0
  287. package/transformers/property-assignment.ts +24 -0
  288. package/transformers/property-declaration.ts +35 -0
  289. package/transformers/set-accessor.ts +27 -0
  290. package/transformers/source-file-transformer.ts +95 -0
  291. package/transformers/template-literal-type-span.ts +22 -0
  292. package/transformers/template-literal-type.ts +26 -0
  293. package/transformers/this-type.ts +20 -0
  294. package/transformers/tuple-type.ts +25 -0
  295. package/transformers/type-alias.ts +27 -0
  296. package/transformers/type-literal.ts +27 -0
  297. package/transformers/type-operator.ts +38 -0
  298. package/transformers/type-predicate.ts +23 -0
  299. package/transformers/type-query.ts +26 -0
  300. package/transformers/type-reference.ts +37 -0
  301. package/transformers/union-type.ts +26 -0
  302. package/transformers/utils/jsdoc-to-doc-schema.ts +114 -0
  303. package/transformers/utils/parse-type-from-quick-info.ts +99 -0
  304. package/transformers/variable-declaration.ts +111 -0
  305. package/transformers/variable-statement.ts +34 -0
  306. package/types/asset.d.ts +41 -0
  307. package/types/style.d.ts +42 -0
  308. package/typescript.composition.tsx +7 -0
  309. package/typescript.docs.mdx +8 -0
@@ -0,0 +1,170 @@
1
+ import ts from 'typescript';
2
+ import type { SourceFileTransformer } from './index';
3
+ import { replaceName } from './replaceName';
4
+
5
+ export const functionNamesTransformer: SourceFileTransformer = (mapping: Record<string, string>) => {
6
+ return (context) => {
7
+ const updateTypeReference: ts.Visitor = (node) => {
8
+ try {
9
+ if (ts.isTypeReferenceNode(node) && node.typeName) {
10
+ const typeName = node.typeName.getText(node.getSourceFile());
11
+ const newTypeName = replaceName(typeName, mapping);
12
+ if (newTypeName) {
13
+ return ts.factory.updateTypeReferenceNode(
14
+ node,
15
+ ts.factory.createIdentifier(newTypeName),
16
+ node.typeArguments
17
+ );
18
+ }
19
+ }
20
+ return ts.visitEachChild(node, updateTypeReference, context);
21
+ } catch {
22
+ return node;
23
+ }
24
+ };
25
+
26
+ const visit: ts.Visitor = (node) => {
27
+ if (ts.isFunctionDeclaration(node) || ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {
28
+ const functionName = node.name?.getText() ?? '';
29
+ const newName = Object.entries(mapping).find(([key]) => functionName.includes(key))?.[1] ?? functionName;
30
+ const parameters = node.parameters.map((param) => {
31
+ const newParamType = param.type ? (ts.visitNode(param.type, updateTypeReference) as ts.TypeNode) : param.type;
32
+ if (ts.isIdentifier(param.name)) {
33
+ const oldName = param.name.getText();
34
+ const newParamName = Object.keys(mapping).find((key) => oldName.includes(key));
35
+ if (newParamName) {
36
+ return ts.factory.updateParameterDeclaration(
37
+ param,
38
+ param.modifiers,
39
+ param.dotDotDotToken,
40
+ ts.factory.createIdentifier(newParamName),
41
+ param.questionToken,
42
+ newParamType,
43
+ param.initializer
44
+ );
45
+ }
46
+ } else if (ts.isObjectBindingPattern(param.name)) {
47
+ const elements = param.name.elements.map((element) => {
48
+ const newElementName = mapping[element.name.getText()];
49
+ if (newElementName) {
50
+ return ts.factory.updateBindingElement(
51
+ element,
52
+ element.dotDotDotToken,
53
+ element.propertyName,
54
+ ts.factory.createIdentifier(newElementName),
55
+ element.initializer
56
+ );
57
+ }
58
+ return element;
59
+ });
60
+ const newParamName = ts.factory.createObjectBindingPattern(elements);
61
+ return ts.factory.updateParameterDeclaration(
62
+ param,
63
+ param.modifiers,
64
+ param.dotDotDotToken,
65
+ newParamName,
66
+ param.questionToken,
67
+ newParamType,
68
+ param.initializer
69
+ );
70
+ }
71
+ return param;
72
+ });
73
+
74
+ if (ts.isFunctionDeclaration(node)) {
75
+ const updatedBody = node.body && ts.isBlock(node.body) ? updateReturnStatement(node.body) : node.body;
76
+ return ts.factory.updateFunctionDeclaration(
77
+ node,
78
+ node.modifiers,
79
+ node.asteriskToken,
80
+ newName ? ts.factory.createIdentifier(newName) : node.name,
81
+ node.typeParameters,
82
+ parameters,
83
+ node.type,
84
+ updatedBody
85
+ );
86
+ }
87
+ if (ts.isArrowFunction(node)) {
88
+ const updatedBody = node.body && ts.isBlock(node.body) ? updateReturnStatement(node.body) : node.body;
89
+ return ts.factory.updateArrowFunction(
90
+ node,
91
+ node.modifiers,
92
+ node.typeParameters,
93
+ parameters,
94
+ node.type,
95
+ node.equalsGreaterThanToken,
96
+ updatedBody
97
+ );
98
+ }
99
+ if (ts.isFunctionExpression(node)) {
100
+ const updatedBody = node.body && ts.isBlock(node.body) ? updateReturnStatement(node.body) : node.body;
101
+ return ts.factory.updateFunctionExpression(
102
+ node,
103
+ node.modifiers,
104
+ node.asteriskToken,
105
+ newName ? ts.factory.createIdentifier(newName) : node.name,
106
+ node.typeParameters,
107
+ parameters,
108
+ node.type,
109
+ updatedBody
110
+ );
111
+ }
112
+ }
113
+ return ts.visitEachChild(node, visit, context);
114
+ };
115
+
116
+ function updateReturnStatement(body: ts.ConciseBody): ts.Block {
117
+ if (ts.isBlock(body)) {
118
+ const updatedStatements: ts.Statement[] = [];
119
+ for (const statement of body.statements) {
120
+ if (ts.isReturnStatement(statement) && statement.expression && ts.isJsxElement(statement.expression)) {
121
+ const jsxElement = statement.expression;
122
+ const openingElement = jsxElement.openingElement;
123
+ const tagName = openingElement.tagName.getText();
124
+ const newTagName = mapping[tagName];
125
+ if (newTagName) {
126
+ const updatedTagName = ts.factory.createIdentifier(newTagName);
127
+ const updatedOpeningElement = ts.factory.updateJsxOpeningElement(
128
+ openingElement,
129
+ updatedTagName,
130
+ openingElement.typeArguments,
131
+ openingElement.attributes
132
+ );
133
+ const updatedClosingElement = jsxElement.closingElement
134
+ ? ts.factory.updateJsxClosingElement(jsxElement.closingElement, updatedTagName)
135
+ : ts.factory.createJsxClosingElement(updatedTagName);
136
+ const updatedJsxElement = ts.factory.createJsxElement(
137
+ updatedOpeningElement,
138
+ jsxElement.children,
139
+ updatedClosingElement
140
+ );
141
+ const updatedStatement = ts.factory.createReturnStatement(updatedJsxElement);
142
+ updatedStatements.push(updatedStatement);
143
+ } else {
144
+ updatedStatements.push(statement);
145
+ }
146
+ } else {
147
+ updatedStatements.push(statement);
148
+ }
149
+ }
150
+ return ts.factory.updateBlock(body, updatedStatements);
151
+ }
152
+ if (
153
+ ts.isExpressionStatement(body) &&
154
+ ts.isReturnStatement(body.expression) &&
155
+ body.expression.expression &&
156
+ ts.isIdentifier(body.expression.expression)
157
+ ) {
158
+ const oldName = body.expression.expression.text;
159
+ const newName = mapping[oldName];
160
+ if (newName) {
161
+ const updatedExpression = ts.factory.createIdentifier(newName);
162
+ const updatedReturnStatement = ts.factory.createReturnStatement(updatedExpression);
163
+ return ts.factory.createBlock([updatedReturnStatement], true);
164
+ }
165
+ }
166
+ return ts.factory.createBlock([], true);
167
+ }
168
+ return (node) => ts.visitNode(node, visit) as ts.SourceFile;
169
+ };
170
+ };
@@ -0,0 +1,101 @@
1
+ import ts from 'typescript';
2
+ import type { SourceFileTransformer } from './index';
3
+
4
+ export const importTransformer: SourceFileTransformer = (mapping: Record<string, string>) => {
5
+ return (context) => {
6
+ const visit: ts.Visitor = (node) => {
7
+ if (ts.isImportDeclaration(node)) {
8
+ let moduleSpecifier = node.moduleSpecifier.getText().slice(1, -1);
9
+ for (const [oldName, newName] of Object.entries(mapping)) {
10
+ if (moduleSpecifier.includes(oldName)) {
11
+ moduleSpecifier = moduleSpecifier.replace(oldName, newName);
12
+ }
13
+ }
14
+
15
+ if (node.importClause?.namedBindings && ts.isNamedImports(node.importClause.namedBindings)) {
16
+ const transformedBindings = node.importClause.namedBindings.elements.map((element) => {
17
+ let originalName = element.propertyName ? element.propertyName.text : element.name.text;
18
+ const aliasName = element.name.text;
19
+
20
+ for (const [oldName, newName] of Object.entries(mapping)) {
21
+ if (originalName.startsWith(oldName) || originalName.endsWith(oldName)) {
22
+ originalName = originalName.replace(oldName, newName);
23
+ }
24
+ }
25
+
26
+ return ts.factory.updateImportSpecifier(
27
+ element,
28
+ false,
29
+ element.propertyName ? ts.factory.createIdentifier(originalName) : undefined,
30
+ ts.factory.createIdentifier(aliasName)
31
+ );
32
+ });
33
+
34
+ const updatedImportClause = ts.factory.updateImportClause(
35
+ node.importClause,
36
+ node.importClause.isTypeOnly,
37
+ node.importClause.name,
38
+ ts.factory.createNamedImports(transformedBindings)
39
+ );
40
+
41
+ return ts.factory.updateImportDeclaration(
42
+ node,
43
+ node.modifiers,
44
+ updatedImportClause,
45
+ ts.factory.createStringLiteral(moduleSpecifier),
46
+ undefined
47
+ );
48
+ }
49
+
50
+ return ts.factory.updateImportDeclaration(
51
+ node,
52
+ node.modifiers,
53
+ node.importClause,
54
+ ts.factory.createStringLiteral(moduleSpecifier),
55
+ undefined
56
+ );
57
+ }
58
+ if (ts.isImportEqualsDeclaration(node)) {
59
+ let moduleSpecifier = node.moduleReference.getText().slice(1, -1);
60
+ for (const [oldName, newName] of Object.entries(mapping)) {
61
+ if (moduleSpecifier.includes(oldName)) {
62
+ moduleSpecifier = moduleSpecifier.replace(oldName, newName);
63
+ }
64
+ }
65
+
66
+ const updatedImportEqualsDeclaration = ts.factory.updateImportEqualsDeclaration(
67
+ node,
68
+ node.modifiers,
69
+ node.isTypeOnly,
70
+ node.name,
71
+ ts.factory.createExternalModuleReference(ts.factory.createStringLiteral(moduleSpecifier))
72
+ );
73
+
74
+ return updatedImportEqualsDeclaration;
75
+ }
76
+
77
+ if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === 'require') {
78
+ const [firstArg] = node.arguments;
79
+
80
+ if (ts.isStringLiteral(firstArg)) {
81
+ let moduleSpecifier = firstArg.text;
82
+
83
+ for (const [oldName, newName] of Object.entries(mapping)) {
84
+ if (moduleSpecifier.includes(oldName)) {
85
+ moduleSpecifier = moduleSpecifier.replace(oldName, newName);
86
+ }
87
+ }
88
+
89
+ const updatedArg = ts.factory.createStringLiteral(moduleSpecifier);
90
+ return ts.factory.updateCallExpression(node, node.expression, node.typeArguments, [
91
+ updatedArg,
92
+ ...node.arguments.slice(1),
93
+ ]);
94
+ }
95
+ }
96
+
97
+ return ts.visitEachChild(node, visit, context);
98
+ };
99
+ return (node) => ts.visitNode(node, visit) as ts.SourceFile;
100
+ };
101
+ };
@@ -0,0 +1,14 @@
1
+ import type ts from 'typescript';
2
+
3
+ export type SourceFileTransformer = (mapping: Record<string, string>) => ts.TransformerFactory<ts.SourceFile>;
4
+
5
+ export { classNamesTransformer } from './class';
6
+ export { interfaceNamesTransformer } from './interface';
7
+ export { variableNamesTransformer } from './variable';
8
+ export { functionNamesTransformer } from './function';
9
+ export { typeAliasNamesTransformer } from './typeAlias';
10
+ export { importTransformer } from './import';
11
+ export { expressionStatementTransformer } from './expression-statement';
12
+ export { exportTransformer } from './export';
13
+ export { transformSourceFile } from './transform';
14
+ export { typeReferenceTransformer } from './type-reference';
@@ -0,0 +1,41 @@
1
+ import ts from 'typescript';
2
+ import { replaceName } from './replaceName';
3
+
4
+ export function interfaceNamesTransformer(nameMapping: Record<string, string>): ts.TransformerFactory<ts.SourceFile> {
5
+ return (context) => {
6
+ const { factory } = context;
7
+ const visit: ts.Visitor = (node) => {
8
+ if (ts.isInterfaceDeclaration(node)) {
9
+ const oldName = node.name.text;
10
+ const newName = replaceName(oldName, nameMapping);
11
+ if (newName) {
12
+ const newMembers = node.members.map((member) => {
13
+ if (ts.isPropertySignature(member) && ts.isIdentifier(member.name)) {
14
+ const memberName = member.name.text;
15
+ if (nameMapping[memberName]) {
16
+ return factory.updatePropertySignature(
17
+ member,
18
+ member.modifiers,
19
+ factory.createIdentifier(nameMapping[memberName]),
20
+ member.questionToken,
21
+ member.type
22
+ );
23
+ }
24
+ }
25
+ return member;
26
+ });
27
+ return factory.updateInterfaceDeclaration(
28
+ node,
29
+ node.modifiers,
30
+ factory.createIdentifier(newName),
31
+ node.typeParameters,
32
+ node.heritageClauses,
33
+ newMembers
34
+ );
35
+ }
36
+ }
37
+ return ts.visitEachChild(node, (child) => visit(child), context);
38
+ };
39
+ return (node) => ts.visitNode(node, visit) as ts.SourceFile;
40
+ };
41
+ }
@@ -0,0 +1,11 @@
1
+ export function replaceName(oldName: string, nameMapping: Record<string, string>): string | undefined {
2
+ for (const old of Object.keys(nameMapping)) {
3
+ if (oldName.startsWith(old) || oldName === old) {
4
+ return oldName.replace(new RegExp(`^${old}`), nameMapping[old]);
5
+ }
6
+ if (oldName.endsWith(old)) {
7
+ return oldName.replace(new RegExp(`${old}$`), nameMapping[old]);
8
+ }
9
+ }
10
+ return undefined;
11
+ }
@@ -0,0 +1,70 @@
1
+ import type { Formatter } from '@teambit/formatter';
2
+ import ts from 'typescript';
3
+ import * as path from 'path';
4
+ import { EmptyLineEncoder } from './empty-line-encoder';
5
+ /**
6
+ * Transforms a TypeScript source file using the provided transformer.
7
+ *
8
+ * @param sourceFilePath Path to the TypeScript source file.
9
+ * @param sourceFileContent The content of the source file.
10
+ * @param transformers The transformers to be applied on the source file.
11
+ * @param formatter (Optional) An optional formatter to format the transformed code. If no formatter is provided, the function returns the transformed source file as a string without any formatting.
12
+ * @returns A promise that resolves to the transformed source file as a string.
13
+ */
14
+ export async function transformSourceFile(
15
+ sourceFilePath: string,
16
+ sourceFileContent: string,
17
+ transformers: ts.TransformerFactory<ts.SourceFile>[],
18
+ formatter?: Formatter,
19
+ updates?: Record<string, string>
20
+ ): Promise<string> {
21
+ const ext = path.extname(sourceFilePath);
22
+ const compatibleExts = ['.ts', '.tsx', '.js', '.jsx'];
23
+ if (!compatibleExts.includes(ext)) {
24
+ if (!updates) return sourceFileContent;
25
+ let transformed = sourceFileContent;
26
+ Object.entries(updates).forEach(([oldStr, newStr]) => {
27
+ const oldStringRegex = new RegExp(oldStr, 'g');
28
+ transformed = transformed.replace(oldStringRegex, newStr);
29
+ });
30
+ return transformed;
31
+ }
32
+
33
+ const encoder = new EmptyLineEncoder();
34
+ sourceFileContent = encoder.encode(sourceFileContent);
35
+
36
+ const sourceFile = ts.createSourceFile(
37
+ sourceFilePath,
38
+ sourceFileContent,
39
+ ts.ScriptTarget.Latest,
40
+ true,
41
+ ts.ScriptKind.TSX
42
+ );
43
+
44
+ const transformedResult: ts.TransformationResult<ts.SourceFile> = ts.transform<ts.SourceFile>(
45
+ sourceFile,
46
+ transformers
47
+ );
48
+ const transformedSourceFile: ts.SourceFile = transformedResult.transformed[0] as ts.SourceFile;
49
+
50
+ const printer: ts.Printer = ts.createPrinter({
51
+ removeComments: false,
52
+ });
53
+
54
+ let transformedSourceFileStr = printer.printFile(transformedSourceFile);
55
+ transformedSourceFileStr = encoder.decode(transformedSourceFileStr);
56
+ // Remove trailing empty line markers
57
+ const emptyLineComment = `\\s*\\/\\*${encoder.emptyLineMarker}\\*\\/\\s*$`;
58
+ const regex = new RegExp(emptyLineComment, 'g');
59
+ transformedSourceFileStr = transformedSourceFileStr.replace(regex, '');
60
+
61
+ try {
62
+ const formattedSourceFileStr = await formatter?.formatSnippet(transformedSourceFileStr, sourceFilePath);
63
+ return formattedSourceFileStr || transformedSourceFileStr;
64
+ } catch {
65
+ // We can ignore if the formatter fails
66
+ // TODO: log the error
67
+ // ignore
68
+ }
69
+ return transformedSourceFileStr;
70
+ }
@@ -0,0 +1,19 @@
1
+ import ts from 'typescript';
2
+ import { replaceName } from './replaceName';
3
+
4
+ export function typeReferenceTransformer(mapping: Record<string, string>): ts.TransformerFactory<ts.SourceFile> {
5
+ return (context) => {
6
+ const visit: ts.Visitor = (node) => {
7
+ if (ts.isTypeReferenceNode(node)) {
8
+ const oldName = node.typeName.getText();
9
+ const newName = replaceName(oldName, mapping);
10
+ if (newName) {
11
+ return ts.factory.updateTypeReferenceNode(node, ts.factory.createIdentifier(newName), node.typeArguments);
12
+ }
13
+ }
14
+ return ts.visitEachChild(node, visit, context);
15
+ };
16
+
17
+ return (node) => ts.visitNode(node, visit) as ts.SourceFile;
18
+ };
19
+ }
@@ -0,0 +1,25 @@
1
+ import ts from 'typescript';
2
+ import { replaceName } from './replaceName';
3
+
4
+ export function typeAliasNamesTransformer(nameMapping: Record<string, string>): ts.TransformerFactory<ts.SourceFile> {
5
+ return (context) => {
6
+ const { factory } = context;
7
+ const visit: ts.Visitor = (node) => {
8
+ if (ts.isTypeAliasDeclaration(node)) {
9
+ const oldName = node.name.text;
10
+ const newName = replaceName(oldName, nameMapping);
11
+ if (newName) {
12
+ return factory.updateTypeAliasDeclaration(
13
+ node,
14
+ node.modifiers,
15
+ factory.createIdentifier(newName),
16
+ node.typeParameters,
17
+ node.type
18
+ );
19
+ }
20
+ }
21
+ return ts.visitEachChild(node, (child) => visit(child), context);
22
+ };
23
+ return (node) => ts.visitNode(node, visit) as ts.SourceFile;
24
+ };
25
+ }
@@ -0,0 +1,25 @@
1
+ import ts from 'typescript';
2
+ import { replaceName } from './replaceName';
3
+
4
+ export function variableNamesTransformer(nameMapping: Record<string, string>): ts.TransformerFactory<ts.SourceFile> {
5
+ return (context) => {
6
+ const { factory } = context;
7
+ const visit: ts.Visitor = (node) => {
8
+ if (ts.isVariableDeclaration(node) && node.name.kind === ts.SyntaxKind.Identifier) {
9
+ const oldName = node.name.text;
10
+ const newName = replaceName(oldName, nameMapping);
11
+ if (newName) {
12
+ return factory.updateVariableDeclaration(
13
+ node,
14
+ factory.createIdentifier(newName),
15
+ node.exclamationToken,
16
+ node.type,
17
+ node.initializer
18
+ );
19
+ }
20
+ }
21
+ return ts.visitEachChild(node, (child) => visit(child), context);
22
+ };
23
+ return (node) => ts.visitNode(node, visit) as ts.SourceFile;
24
+ };
25
+ }
@@ -0,0 +1,31 @@
1
+ import type { SchemaNode } from '@teambit/semantics.entities.semantic-schema';
2
+ import { ArrayLiteralExpressionSchema, UnImplementedSchema } from '@teambit/semantics.entities.semantic-schema';
3
+ import pMapSeries from 'p-map-series';
4
+ import type { ArrayLiteralExpression, Node } from 'typescript';
5
+ import ts from 'typescript';
6
+ import type { SchemaExtractorContext } from '../schema-extractor-context';
7
+ import type { SchemaTransformer } from '../schema-transformer';
8
+ import type { Identifier } from '../identifier';
9
+
10
+ export class ArrayLiteralExpressionTransformer implements SchemaTransformer {
11
+ predicate(node: Node): boolean {
12
+ return node.kind === ts.SyntaxKind.ArrayLiteralExpression;
13
+ }
14
+
15
+ async getIdentifiers(): Promise<Identifier[]> {
16
+ return [];
17
+ }
18
+
19
+ async transform(node: ArrayLiteralExpression, context: SchemaExtractorContext): Promise<SchemaNode> {
20
+ const members = await pMapSeries(node.elements, async (element) => {
21
+ const schema = await context.computeSchema(element);
22
+ if (schema instanceof UnImplementedSchema) {
23
+ const typeRef = await context.resolveType(element, element.getText());
24
+ return typeRef;
25
+ }
26
+ return schema;
27
+ });
28
+ const location = context.getLocation(node);
29
+ return new ArrayLiteralExpressionSchema(members, location);
30
+ }
31
+ }
@@ -0,0 +1,22 @@
1
+ import type { ArrayTypeNode, Node } from 'typescript';
2
+ import ts from 'typescript';
3
+ import { TypeArraySchema } from '@teambit/semantics.entities.semantic-schema';
4
+ import type { SchemaTransformer } from '../schema-transformer';
5
+ import type { SchemaExtractorContext } from '../schema-extractor-context';
6
+ import type { Identifier } from '../identifier';
7
+
8
+ export class ArrayTypeTransformer implements SchemaTransformer {
9
+ predicate(node: Node) {
10
+ return node.kind === ts.SyntaxKind.ArrayType;
11
+ }
12
+
13
+ async getIdentifiers(): Promise<Identifier[]> {
14
+ return [];
15
+ }
16
+
17
+ async transform(node: ArrayTypeNode, context: SchemaExtractorContext) {
18
+ const type = await context.computeSchema(node.elementType);
19
+ const location = context.getLocation(node);
20
+ return new TypeArraySchema(location, type);
21
+ }
22
+ }
@@ -0,0 +1,35 @@
1
+ import type { BindingElement, Node } from 'typescript';
2
+ import ts from 'typescript';
3
+ import { VariableLikeSchema } from '@teambit/semantics.entities.semantic-schema';
4
+ import type { SchemaTransformer } from '../schema-transformer';
5
+ import type { SchemaExtractorContext } from '../schema-extractor-context';
6
+ import { parseTypeFromQuickInfo } from './utils/parse-type-from-quick-info';
7
+ import { Identifier } from '../identifier';
8
+
9
+ /**
10
+ * for example:
11
+ *
12
+ * const objBindingElem = { elem1: 1, elem2: 2 };
13
+ * const { elem1 } = objBindingElem;
14
+ * export { elem1 };
15
+ */
16
+ export class BindingElementTransformer implements SchemaTransformer {
17
+ predicate(node: Node) {
18
+ return node.kind === ts.SyntaxKind.BindingElement;
19
+ }
20
+
21
+ async getIdentifiers(node: BindingElement) {
22
+ return [new Identifier(node.name.getText(), node.getSourceFile().fileName)];
23
+ }
24
+
25
+ async transform(node: BindingElement, context: SchemaExtractorContext) {
26
+ const name = node.name.getText();
27
+ const info = await context.getQuickInfo(node.name);
28
+ const displaySig = info?.body?.displayString || '';
29
+ const typeStr = parseTypeFromQuickInfo(info);
30
+ const type = await context.resolveType(node, typeStr);
31
+ const doc = await context.jsDocToDocSchema(node);
32
+ const defaultValue = node.initializer ? node.initializer.getText() : undefined;
33
+ return new VariableLikeSchema(context.getLocation(node), name, displaySig, type, false, doc, defaultValue);
34
+ }
35
+ }
@@ -0,0 +1,109 @@
1
+ import pMapSeries from 'p-map-series';
2
+ import { compact } from 'lodash';
3
+ import {
4
+ ClassSchema,
5
+ UnresolvedSchema,
6
+ ExpressionWithTypeArgumentsSchema,
7
+ } from '@teambit/semantics.entities.semantic-schema';
8
+ import type { Node, ClassDeclaration } from 'typescript';
9
+ import ts from 'typescript';
10
+ import type { SchemaTransformer } from '../schema-transformer';
11
+ import type { SchemaExtractorContext } from '../schema-extractor-context';
12
+ import { Identifier } from '../identifier';
13
+
14
+ export class ClassDeclarationTransformer implements SchemaTransformer {
15
+ predicate(node: Node) {
16
+ if (node.kind !== ts.SyntaxKind.ClassDeclaration) {
17
+ return false;
18
+ }
19
+ const classNode = node as ClassDeclaration;
20
+ if (!classNode.members || (classNode.members as any).isMissingList) {
21
+ return false;
22
+ }
23
+ return true;
24
+ }
25
+
26
+ // @todo: in case of `export default class` the class has no name.
27
+ private getName(node: ClassDeclaration) {
28
+ return node.name?.getText() || 'default';
29
+ }
30
+
31
+ async getIdentifiers(node: ClassDeclaration) {
32
+ return [new Identifier(this.getName(node), node.getSourceFile().fileName)];
33
+ }
34
+
35
+ private async getExpressionWithTypeArgs(
36
+ node: ClassDeclaration,
37
+ context: SchemaExtractorContext,
38
+ token: ts.SyntaxKind.ExtendsKeyword | ts.SyntaxKind.ImplementsKeyword
39
+ ) {
40
+ if (!node.heritageClauses) return [];
41
+
42
+ return pMapSeries(
43
+ node.heritageClauses
44
+ .filter((heritageClause: ts.HeritageClause) => heritageClause.token === token)
45
+ .flatMap((h: ts.HeritageClause) => {
46
+ const { types } = h;
47
+ const name = h.getText();
48
+ return types.map((type) => ({ ...type, name }));
49
+ }),
50
+ async (expressionWithTypeArgs: ts.ExpressionWithTypeArguments & { name: string }) => {
51
+ const { typeArguments, expression, name } = expressionWithTypeArgs;
52
+ const typeArgsNodes = typeArguments ? await pMapSeries(typeArguments, (t) => context.computeSchema(t)) : [];
53
+ const location = context.getLocation(expression);
54
+ const expressionNode =
55
+ (await context.visitDefinition(expression)) || new UnresolvedSchema(location, expression.getText());
56
+ return new ExpressionWithTypeArgumentsSchema(typeArgsNodes, expressionNode, name, location);
57
+ }
58
+ );
59
+ }
60
+
61
+ async transform(node: ClassDeclaration, context: SchemaExtractorContext) {
62
+ const nodeDecorators = ts.canHaveDecorators(node) ? ts.getDecorators(node) : undefined;
63
+ const decorators = nodeDecorators?.length
64
+ ? await pMapSeries(nodeDecorators, (decorator) => context.computeSchema(decorator))
65
+ : undefined;
66
+ const className = this.getName(node);
67
+ const extendsExpressionsWithTypeArgs = await this.getExpressionWithTypeArgs(
68
+ node,
69
+ context,
70
+ ts.SyntaxKind.ExtendsKeyword
71
+ );
72
+
73
+ const implementsExpressionsWithTypeArgs = await this.getExpressionWithTypeArgs(
74
+ node,
75
+ context,
76
+ ts.SyntaxKind.ImplementsKeyword
77
+ );
78
+
79
+ const typeParameters = node.typeParameters?.map((typeParam) => {
80
+ return typeParam.name.getText();
81
+ });
82
+ const signature = node.name ? await context.getQuickInfoDisplayString(node.name) : undefined;
83
+ const members = await pMapSeries(node.members, async (member) => {
84
+ const memberModifiers = ts.canHaveModifiers(member) ? ts.getModifiers(member) : undefined;
85
+ const isPrivate = memberModifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.PrivateKeyword);
86
+ if (isPrivate) {
87
+ return null;
88
+ }
89
+ return context.computeSchema(member);
90
+ });
91
+ const doc = await context.jsDocToDocSchema(node);
92
+
93
+ if (!signature) {
94
+ throw Error(`Missing signature for class ${className} declaration`);
95
+ }
96
+
97
+ return new ClassSchema(
98
+ className,
99
+ compact(members),
100
+ context.getLocation(node),
101
+ signature,
102
+ doc,
103
+ typeParameters,
104
+ extendsExpressionsWithTypeArgs,
105
+ implementsExpressionsWithTypeArgs,
106
+ decorators
107
+ );
108
+ }
109
+ }