jsii-rosetta 1.76.0 → 4.9.0-dev.0

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 (511) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +1 -0
  3. package/README.md +287 -388
  4. package/bin/jsii-rosetta +1 -1
  5. package/lib/ambient/semver-intersect.d.ts +13 -0
  6. package/lib/ambient/semver-intersect.js +2 -0
  7. package/lib/ambient/semver-intersect.js.map +1 -0
  8. package/lib/commands/convert.js.map +1 -0
  9. package/lib/commands/coverage.js.map +1 -0
  10. package/lib/commands/extract.js +2 -2
  11. package/lib/commands/extract.js.map +1 -0
  12. package/lib/commands/infuse.js +2 -2
  13. package/lib/commands/infuse.js.map +1 -0
  14. package/lib/commands/read.js +6 -6
  15. package/lib/commands/read.js.map +1 -0
  16. package/lib/commands/transliterate.js +4 -4
  17. package/lib/commands/transliterate.js.map +1 -0
  18. package/lib/commands/trim-cache.js.map +1 -0
  19. package/lib/find-utils.js +4 -4
  20. package/lib/find-utils.js.map +1 -0
  21. package/lib/fixtures.js +2 -2
  22. package/lib/fixtures.js.map +1 -0
  23. package/lib/index.js.map +1 -0
  24. package/lib/jsii/assemblies.d.ts +1 -1
  25. package/lib/jsii/assemblies.js +14 -11
  26. package/lib/jsii/assemblies.js.map +1 -0
  27. package/lib/jsii/fingerprinting.js +9 -9
  28. package/lib/jsii/fingerprinting.js.map +1 -0
  29. package/lib/jsii/jsii-types.d.ts +4 -4
  30. package/lib/jsii/jsii-types.js +9 -4
  31. package/lib/jsii/jsii-types.js.map +1 -0
  32. package/lib/jsii/jsii-utils.d.ts +1 -1
  33. package/lib/jsii/jsii-utils.js +2 -2
  34. package/lib/jsii/jsii-utils.js.map +1 -0
  35. package/lib/jsii/packages.js.map +1 -0
  36. package/lib/languages/csharp.d.ts +3 -3
  37. package/lib/languages/csharp.js +2 -2
  38. package/lib/languages/csharp.js.map +1 -0
  39. package/lib/languages/default.d.ts +2 -2
  40. package/lib/languages/default.js.map +1 -0
  41. package/lib/languages/go.d.ts +3 -3
  42. package/lib/languages/go.js +20 -16
  43. package/lib/languages/go.js.map +1 -0
  44. package/lib/languages/index.d.ts +1 -1
  45. package/lib/languages/index.js +4 -4
  46. package/lib/languages/index.js.map +1 -0
  47. package/lib/languages/java.d.ts +2 -2
  48. package/lib/languages/java.js +2 -2
  49. package/lib/languages/java.js.map +1 -0
  50. package/lib/languages/python.d.ts +3 -3
  51. package/lib/languages/python.js +1 -1
  52. package/lib/languages/python.js.map +1 -0
  53. package/lib/languages/record-references-version.d.ts +2 -0
  54. package/lib/languages/record-references-version.js +6 -0
  55. package/lib/languages/record-references-version.js.map +1 -0
  56. package/lib/languages/record-references.d.ts +2 -2
  57. package/lib/languages/record-references.js +3 -2
  58. package/lib/languages/record-references.js.map +1 -0
  59. package/lib/languages/target-language.d.ts +0 -2
  60. package/lib/languages/target-language.js +2 -1
  61. package/lib/languages/target-language.js.map +1 -0
  62. package/lib/languages/visualize.d.ts +1 -1
  63. package/lib/languages/visualize.js +1 -1
  64. package/lib/languages/visualize.js.map +1 -0
  65. package/lib/logging.js +1 -1
  66. package/lib/logging.js.map +1 -0
  67. package/lib/main.d.ts +2 -0
  68. package/{bin/jsii-rosetta.js → lib/main.js} +21 -21
  69. package/lib/main.js.map +1 -0
  70. package/lib/markdown/escapes.js.map +1 -0
  71. package/lib/markdown/extract-snippets.d.ts +2 -2
  72. package/lib/markdown/extract-snippets.js +1 -1
  73. package/lib/markdown/extract-snippets.js.map +1 -0
  74. package/lib/markdown/index.js.map +1 -0
  75. package/lib/markdown/javadoc-renderer.js.map +1 -0
  76. package/lib/markdown/markdown-renderer.js.map +1 -0
  77. package/lib/markdown/markdown.js.map +1 -0
  78. package/lib/markdown/replace-code-renderer.d.ts +1 -1
  79. package/lib/markdown/replace-code-renderer.js.map +1 -0
  80. package/lib/markdown/replace-typescript-transform.d.ts +2 -2
  81. package/lib/markdown/replace-typescript-transform.js +1 -1
  82. package/lib/markdown/replace-typescript-transform.js.map +1 -0
  83. package/lib/markdown/structure-renderer.js.map +1 -0
  84. package/lib/markdown/types.js.map +1 -0
  85. package/lib/markdown/xml-comment-renderer.js.map +1 -0
  86. package/lib/o-tree.js +3 -3
  87. package/lib/o-tree.js.map +1 -0
  88. package/lib/renderer.js.map +1 -0
  89. package/lib/rosetta-reader.js.map +1 -0
  90. package/lib/rosetta-translator.d.ts +1 -1
  91. package/lib/rosetta-translator.js +2 -2
  92. package/lib/rosetta-translator.js.map +1 -0
  93. package/lib/snippet-dependencies.js +12 -12
  94. package/lib/snippet-dependencies.js.map +1 -0
  95. package/lib/snippet-selectors.d.ts +1 -1
  96. package/lib/snippet-selectors.js +2 -2
  97. package/lib/snippet-selectors.js.map +1 -0
  98. package/lib/snippet.d.ts +3 -3
  99. package/lib/snippet.js +5 -5
  100. package/lib/snippet.js.map +1 -0
  101. package/lib/strict.js.map +1 -0
  102. package/lib/submodule-reference.d.ts +1 -1
  103. package/lib/submodule-reference.js +11 -11
  104. package/lib/submodule-reference.js.map +1 -0
  105. package/lib/tablets/key.js +3 -3
  106. package/lib/tablets/key.js.map +1 -0
  107. package/lib/tablets/schema.js.map +1 -0
  108. package/lib/tablets/tablets.d.ts +1 -1
  109. package/lib/tablets/tablets.js +13 -13
  110. package/lib/tablets/tablets.js.map +1 -0
  111. package/lib/translate.d.ts +1 -1
  112. package/lib/translate.js +9 -7
  113. package/lib/translate.js.map +1 -0
  114. package/lib/translate_all.js +2 -2
  115. package/lib/translate_all.js.map +1 -0
  116. package/lib/translate_all_worker.js.map +1 -0
  117. package/lib/typescript/ast-utils.d.ts +2 -2
  118. package/lib/typescript/ast-utils.js +2 -4
  119. package/lib/typescript/ast-utils.js.map +1 -0
  120. package/lib/typescript/imports.d.ts +2 -2
  121. package/lib/typescript/imports.js +3 -3
  122. package/lib/typescript/imports.js.map +1 -0
  123. package/lib/typescript/syntax-kind-counter.d.ts +1 -1
  124. package/lib/typescript/syntax-kind-counter.js +1 -2
  125. package/lib/typescript/syntax-kind-counter.js.map +1 -0
  126. package/lib/typescript/ts-compiler.js.map +1 -0
  127. package/lib/typescript/types.d.ts +2 -2
  128. package/lib/typescript/types.js +1 -1
  129. package/lib/typescript/types.js.map +1 -0
  130. package/lib/typescript/visible-spans.js +6 -6
  131. package/lib/typescript/visible-spans.js.map +1 -0
  132. package/lib/util.d.ts +1 -1
  133. package/lib/util.js +2 -2
  134. package/lib/util.js.map +1 -0
  135. package/package.json +68 -37
  136. package/temp.tabl.json +48 -0
  137. package/bin/jsii-rosetta.d.ts +0 -2
  138. package/jest.config.mjs +0 -8
  139. package/jestsetup.js +0 -4
  140. package/test/commands/extract.test.d.ts +0 -2
  141. package/test/commands/extract.test.js +0 -698
  142. package/test/commands/infuse.test.d.ts +0 -2
  143. package/test/commands/infuse.test.js +0 -165
  144. package/test/commands/transliterate.test.d.ts +0 -2
  145. package/test/commands/transliterate.test.js +0 -1636
  146. package/test/commands/trim-cache.test.d.ts +0 -2
  147. package/test/commands/trim-cache.test.js +0 -85
  148. package/test/fixtures.test.d.ts +0 -2
  149. package/test/fixtures.test.js +0 -49
  150. package/test/jsii/assemblies.test.d.ts +0 -2
  151. package/test/jsii/assemblies.test.js +0 -230
  152. package/test/jsii/fake-assembly.d.ts +0 -3
  153. package/test/jsii/fake-assembly.js +0 -21
  154. package/test/jsii/fixtures/rosetta/explicit.ts-fixture +0 -7
  155. package/test/jsii/visible-spans.test.d.ts +0 -2
  156. package/test/jsii/visible-spans.test.js +0 -40
  157. package/test/jsii-imports.test.d.ts +0 -2
  158. package/test/jsii-imports.test.js +0 -438
  159. package/test/markdown/javadoc.test.d.ts +0 -2
  160. package/test/markdown/javadoc.test.js +0 -110
  161. package/test/markdown/roundtrip.test.d.ts +0 -2
  162. package/test/markdown/roundtrip.test.js +0 -126
  163. package/test/markdown/xmldoccomments.test.d.ts +0 -2
  164. package/test/markdown/xmldoccomments.test.js +0 -89
  165. package/test/otree.test.d.ts +0 -2
  166. package/test/otree.test.js +0 -36
  167. package/test/record-references.test.d.ts +0 -2
  168. package/test/record-references.test.js +0 -88
  169. package/test/rosetta/default.ts-fixture +0 -1
  170. package/test/rosetta-translator.test.d.ts +0 -2
  171. package/test/rosetta-translator.test.js +0 -33
  172. package/test/rosetta.test.d.ts +0 -2
  173. package/test/rosetta.test.js +0 -221
  174. package/test/snippet-selectors.test.d.ts +0 -2
  175. package/test/snippet-selectors.test.js +0 -57
  176. package/test/snippet.test.d.ts +0 -2
  177. package/test/snippet.test.js +0 -18
  178. package/test/syntax-counter.test.d.ts +0 -2
  179. package/test/syntax-counter.test.js +0 -60
  180. package/test/testutil.d.ts +0 -64
  181. package/test/testutil.js +0 -104
  182. package/test/translate.test.d.ts +0 -2
  183. package/test/translate.test.js +0 -175
  184. package/test/translations/calls/declaring_default_arguments.cs +0 -4
  185. package/test/translations/calls/declaring_default_arguments.go +0 -6
  186. package/test/translations/calls/declaring_default_arguments.java +0 -11
  187. package/test/translations/calls/declaring_default_arguments.py +0 -2
  188. package/test/translations/calls/default_struct_fields.cs +0 -9
  189. package/test/translations/calls/default_struct_fields.go +0 -7
  190. package/test/translations/calls/default_struct_fields.java +0 -21
  191. package/test/translations/calls/default_struct_fields.py +0 -2
  192. package/test/translations/calls/function_call.cs +0 -1
  193. package/test/translations/calls/function_call.go +0 -1
  194. package/test/translations/calls/function_call.java +0 -1
  195. package/test/translations/calls/function_call.py +0 -1
  196. package/test/translations/calls/list_of_anonymous_structs.cs +0 -9
  197. package/test/translations/calls/list_of_anonymous_structs.go +0 -12
  198. package/test/translations/calls/list_of_anonymous_structs.java +0 -6
  199. package/test/translations/calls/list_of_anonymous_structs.py +0 -9
  200. package/test/translations/calls/literal_map_argument.cs +0 -5
  201. package/test/translations/calls/literal_map_argument.go +0 -7
  202. package/test/translations/calls/literal_map_argument.java +0 -4
  203. package/test/translations/calls/literal_map_argument.py +0 -4
  204. package/test/translations/calls/method_call.cs +0 -1
  205. package/test/translations/calls/method_call.go +0 -1
  206. package/test/translations/calls/method_call.java +0 -1
  207. package/test/translations/calls/method_call.py +0 -1
  208. package/test/translations/calls/self_method_call.cs +0 -1
  209. package/test/translations/calls/self_method_call.go +0 -1
  210. package/test/translations/calls/self_method_call.java +0 -1
  211. package/test/translations/calls/self_method_call.py +0 -1
  212. package/test/translations/calls/shorthand_property.cs +0 -2
  213. package/test/translations/calls/shorthand_property.go +0 -4
  214. package/test/translations/calls/shorthand_property.java +0 -2
  215. package/test/translations/calls/shorthand_property.py +0 -2
  216. package/test/translations/calls/static_function_call.cs +0 -1
  217. package/test/translations/calls/static_function_call.go +0 -1
  218. package/test/translations/calls/static_function_call.java +0 -1
  219. package/test/translations/calls/static_function_call.py +0 -1
  220. package/test/translations/calls/this_argument.cs +0 -1
  221. package/test/translations/calls/this_argument.go +0 -1
  222. package/test/translations/calls/this_argument.java +0 -1
  223. package/test/translations/calls/this_argument.py +0 -1
  224. package/test/translations/calls/translate_object_literals_in_function_call.cs +0 -1
  225. package/test/translations/calls/translate_object_literals_in_function_call.go +0 -4
  226. package/test/translations/calls/translate_object_literals_in_function_call.java +0 -1
  227. package/test/translations/calls/translate_object_literals_in_function_call.py +0 -1
  228. package/test/translations/calls/translate_object_literals_only_one_level_deep.cs +0 -1
  229. package/test/translations/calls/translate_object_literals_only_one_level_deep.go +0 -7
  230. package/test/translations/calls/translate_object_literals_only_one_level_deep.java +0 -1
  231. package/test/translations/calls/translate_object_literals_only_one_level_deep.py +0 -1
  232. package/test/translations/calls/translate_object_literals_second_level_with_newlines.cs +0 -4
  233. package/test/translations/calls/translate_object_literals_second_level_with_newlines.go +0 -7
  234. package/test/translations/calls/translate_object_literals_second_level_with_newlines.java +0 -3
  235. package/test/translations/calls/translate_object_literals_second_level_with_newlines.py +0 -4
  236. package/test/translations/calls/translate_object_literals_with_multiple_newlines.cs +0 -5
  237. package/test/translations/calls/translate_object_literals_with_multiple_newlines.go +0 -5
  238. package/test/translations/calls/translate_object_literals_with_multiple_newlines.java +0 -4
  239. package/test/translations/calls/translate_object_literals_with_multiple_newlines.py +0 -5
  240. package/test/translations/calls/translate_object_literals_with_newlines.cs +0 -4
  241. package/test/translations/calls/translate_object_literals_with_newlines.go +0 -4
  242. package/test/translations/calls/translate_object_literals_with_newlines.java +0 -3
  243. package/test/translations/calls/translate_object_literals_with_newlines.py +0 -4
  244. package/test/translations/calls/will_type_deep_structs_directly_if_type_info_is_available.cs +0 -24
  245. package/test/translations/calls/will_type_deep_structs_directly_if_type_info_is_available.go +0 -24
  246. package/test/translations/calls/will_type_deep_structs_directly_if_type_info_is_available.java +0 -48
  247. package/test/translations/calls/will_type_deep_structs_directly_if_type_info_is_available.py +0 -7
  248. package/test/translations/classes/class_declaration_with_private_fields_and_constructor.cs +0 -9
  249. package/test/translations/classes/class_declaration_with_private_fields_and_constructor.go +0 -9
  250. package/test/translations/classes/class_declaration_with_private_fields_and_constructor.java +0 -7
  251. package/test/translations/classes/class_declaration_with_private_fields_and_constructor.py +0 -4
  252. package/test/translations/classes/class_declaration_with_public_fields_and_constructor.cs +0 -9
  253. package/test/translations/classes/class_declaration_with_public_fields_and_constructor.go +0 -9
  254. package/test/translations/classes/class_declaration_with_public_fields_and_constructor.java +0 -7
  255. package/test/translations/classes/class_declaration_with_public_fields_and_constructor.py +0 -4
  256. package/test/translations/classes/class_implementing_jsii_interface.cs +0 -7
  257. package/test/translations/classes/class_implementing_jsii_interface.go +0 -6
  258. package/test/translations/classes/class_implementing_jsii_interface.java +0 -5
  259. package/test/translations/classes/class_implementing_jsii_interface.py +0 -4
  260. package/test/translations/classes/class_with_different_name.cs +0 -6
  261. package/test/translations/classes/class_with_different_name.go +0 -7
  262. package/test/translations/classes/class_with_different_name.java +0 -4
  263. package/test/translations/classes/class_with_different_name.py +0 -3
  264. package/test/translations/classes/class_with_extends_and_implements.cs +0 -3
  265. package/test/translations/classes/class_with_extends_and_implements.go +0 -3
  266. package/test/translations/classes/class_with_extends_and_implements.java +0 -2
  267. package/test/translations/classes/class_with_inheritance.cs +0 -3
  268. package/test/translations/classes/class_with_inheritance.go +0 -3
  269. package/test/translations/classes/class_with_inheritance.java +0 -2
  270. package/test/translations/classes/class_with_inheritance.py +0 -2
  271. package/test/translations/classes/class_with_inheritance_and_super_class.cs +0 -6
  272. package/test/translations/classes/class_with_inheritance_and_super_class.go +0 -9
  273. package/test/translations/classes/class_with_inheritance_and_super_class.java +0 -5
  274. package/test/translations/classes/class_with_inheritance_and_super_class.py +0 -3
  275. package/test/translations/classes/class_with_method.cs +0 -7
  276. package/test/translations/classes/class_with_method.go +0 -7
  277. package/test/translations/classes/class_with_method.java +0 -5
  278. package/test/translations/classes/class_with_method.py +0 -3
  279. package/test/translations/classes/class_with_props_argument.cs +0 -14
  280. package/test/translations/classes/class_with_props_argument.go +0 -16
  281. package/test/translations/classes/class_with_props_argument.java +0 -26
  282. package/test/translations/classes/class_with_props_argument.py +0 -5
  283. package/test/translations/classes/constructor_with_optional_params.go +0 -10
  284. package/test/translations/classes/constructor_with_optional_params.java +0 -12
  285. package/test/translations/classes/empty_class.cs +0 -3
  286. package/test/translations/classes/empty_class.go +0 -2
  287. package/test/translations/classes/empty_class.java +0 -2
  288. package/test/translations/classes/empty_class.py +0 -2
  289. package/test/translations/classes/invisible_interfaces_do_not_affect_whitespace.cs +0 -11
  290. package/test/translations/classes/invisible_interfaces_do_not_affect_whitespace.go +0 -8
  291. package/test/translations/classes/invisible_interfaces_do_not_affect_whitespace.java +0 -8
  292. package/test/translations/classes/invisible_interfaces_do_not_affect_whitespace.py +0 -5
  293. package/test/translations/classes/whitespace_between_multiple_empty_members.cs +0 -15
  294. package/test/translations/classes/whitespace_between_multiple_empty_members.go +0 -12
  295. package/test/translations/classes/whitespace_between_multiple_empty_members.java +0 -11
  296. package/test/translations/classes/whitespace_between_multiple_empty_members.py +0 -9
  297. package/test/translations/classes/whitespace_between_multiple_members.cs +0 -17
  298. package/test/translations/classes/whitespace_between_multiple_members.go +0 -16
  299. package/test/translations/classes/whitespace_between_multiple_members.java +0 -13
  300. package/test/translations/classes/whitespace_between_multiple_members.py +0 -9
  301. package/test/translations/comments/empty_lines_in_comments.cs +0 -4
  302. package/test/translations/comments/empty_lines_in_comments.go +0 -4
  303. package/test/translations/comments/empty_lines_in_comments.java +0 -4
  304. package/test/translations/comments/empty_lines_in_comments.py +0 -4
  305. package/test/translations/comments/interleave_multiline_comments_with_function_call.cs +0 -7
  306. package/test/translations/comments/interleave_multiline_comments_with_function_call.go +0 -7
  307. package/test/translations/comments/interleave_multiline_comments_with_function_call.java +0 -6
  308. package/test/translations/comments/interleave_multiline_comments_with_function_call.py +0 -7
  309. package/test/translations/comments/interleave_single_line_comments_with_function_call.cs +0 -7
  310. package/test/translations/comments/interleave_single_line_comments_with_function_call.go +0 -7
  311. package/test/translations/comments/interleave_single_line_comments_with_function_call.java +0 -6
  312. package/test/translations/comments/interleave_single_line_comments_with_function_call.py +0 -7
  313. package/test/translations/comments/no_duplication_of_comments.cs +0 -2
  314. package/test/translations/comments/no_duplication_of_comments.go +0 -2
  315. package/test/translations/comments/no_duplication_of_comments.java +0 -2
  316. package/test/translations/comments/no_duplication_of_comments.py +0 -2
  317. package/test/translations/expressions/array_index.cs +0 -3
  318. package/test/translations/expressions/array_index.go +0 -3
  319. package/test/translations/expressions/array_index.java +0 -3
  320. package/test/translations/expressions/array_index.py +0 -3
  321. package/test/translations/expressions/as_expression.cs +0 -1
  322. package/test/translations/expressions/as_expression.go +0 -1
  323. package/test/translations/expressions/as_expression.java +0 -1
  324. package/test/translations/expressions/as_expression.py +0 -1
  325. package/test/translations/expressions/await.cs +0 -1
  326. package/test/translations/expressions/await.go +0 -1
  327. package/test/translations/expressions/await.java +0 -1
  328. package/test/translations/expressions/await.py +0 -1
  329. package/test/translations/expressions/backtick_string_w_o_substitutions.cs +0 -1
  330. package/test/translations/expressions/backtick_string_w_o_substitutions.go +0 -1
  331. package/test/translations/expressions/backtick_string_w_o_substitutions.java +0 -1
  332. package/test/translations/expressions/backtick_string_w_o_substitutions.py +0 -1
  333. package/test/translations/expressions/computed_key.cs +0 -4
  334. package/test/translations/expressions/computed_key.go +0 -8
  335. package/test/translations/expressions/computed_key.java +0 -4
  336. package/test/translations/expressions/computed_key.py +0 -4
  337. package/test/translations/expressions/double_quoted_dict_keys.cs +0 -1
  338. package/test/translations/expressions/double_quoted_dict_keys.go +0 -3
  339. package/test/translations/expressions/double_quoted_dict_keys.java +0 -1
  340. package/test/translations/expressions/double_quoted_dict_keys.py +0 -1
  341. package/test/translations/expressions/ellipsis_at_a_random_place.cs +0 -1
  342. package/test/translations/expressions/ellipsis_at_a_random_place.go +0 -1
  343. package/test/translations/expressions/ellipsis_at_a_random_place.java +0 -1
  344. package/test/translations/expressions/ellipsis_at_a_random_place.py +0 -1
  345. package/test/translations/expressions/enum_access.cs +0 -1
  346. package/test/translations/expressions/enum_access.go +0 -1
  347. package/test/translations/expressions/enum_access.java +0 -1
  348. package/test/translations/expressions/enum_access.py +0 -1
  349. package/test/translations/expressions/enum_like_access.cs +0 -1
  350. package/test/translations/expressions/enum_like_access.go +0 -1
  351. package/test/translations/expressions/enum_like_access.java +0 -1
  352. package/test/translations/expressions/enum_like_access.py +0 -1
  353. package/test/translations/expressions/map-literal.cs +0 -3
  354. package/test/translations/expressions/map-literal.go +0 -3
  355. package/test/translations/expressions/map-literal.java +0 -2
  356. package/test/translations/expressions/map-literal.py +0 -3
  357. package/test/translations/expressions/non_null_expression.cs +0 -1
  358. package/test/translations/expressions/non_null_expression.go +0 -1
  359. package/test/translations/expressions/non_null_expression.java +0 -1
  360. package/test/translations/expressions/non_null_expression.py +0 -1
  361. package/test/translations/expressions/string_interpolation.cs +0 -10
  362. package/test/translations/expressions/string_interpolation.go +0 -6
  363. package/test/translations/expressions/string_interpolation.java +0 -6
  364. package/test/translations/expressions/string_interpolation.py +0 -10
  365. package/test/translations/expressions/string_literal.cs +0 -9
  366. package/test/translations/expressions/string_literal.go +0 -9
  367. package/test/translations/expressions/string_literal.java +0 -1
  368. package/test/translations/expressions/string_literal.py +0 -9
  369. package/test/translations/expressions/struct_assignment.cs +0 -6
  370. package/test/translations/expressions/struct_assignment.go +0 -7
  371. package/test/translations/expressions/struct_assignment.java +0 -12
  372. package/test/translations/expressions/struct_assignment.py +0 -1
  373. package/test/translations/expressions/unary_and_binary_operators.cs +0 -3
  374. package/test/translations/expressions/unary_and_binary_operators.go +0 -3
  375. package/test/translations/expressions/unary_and_binary_operators.java +0 -3
  376. package/test/translations/expressions/unary_and_binary_operators.py +0 -3
  377. package/test/translations/hiding/hide_block_level_statements_using_void_directive.cs +0 -6
  378. package/test/translations/hiding/hide_block_level_statements_using_void_directive.go +0 -5
  379. package/test/translations/hiding/hide_block_level_statements_using_void_directive.java +0 -5
  380. package/test/translations/hiding/hide_block_level_statements_using_void_directive.py +0 -4
  381. package/test/translations/hiding/hide_expression_with_explicit_ellipsis.cs +0 -1
  382. package/test/translations/hiding/hide_expression_with_explicit_ellipsis.go +0 -1
  383. package/test/translations/hiding/hide_expression_with_explicit_ellipsis.java +0 -1
  384. package/test/translations/hiding/hide_expression_with_explicit_ellipsis.py +0 -1
  385. package/test/translations/hiding/hide_halfway_into_class_using_comments.cs +0 -3
  386. package/test/translations/hiding/hide_halfway_into_class_using_comments.go +0 -3
  387. package/test/translations/hiding/hide_halfway_into_class_using_comments.java +0 -3
  388. package/test/translations/hiding/hide_halfway_into_class_using_comments.py +0 -3
  389. package/test/translations/hiding/hide_parameter_sequence.cs +0 -1
  390. package/test/translations/hiding/hide_parameter_sequence.go +0 -1
  391. package/test/translations/hiding/hide_parameter_sequence.java +0 -1
  392. package/test/translations/hiding/hide_parameter_sequence.py +0 -1
  393. package/test/translations/hiding/hide_statements_with_explicit_ellipsis.cs +0 -3
  394. package/test/translations/hiding/hide_statements_with_explicit_ellipsis.go +0 -3
  395. package/test/translations/hiding/hide_statements_with_explicit_ellipsis.java +0 -3
  396. package/test/translations/hiding/hide_statements_with_explicit_ellipsis.py +0 -3
  397. package/test/translations/hiding/hide_top_level_statements_using_void_directive.cs +0 -1
  398. package/test/translations/hiding/hide_top_level_statements_using_void_directive.go +0 -1
  399. package/test/translations/hiding/hide_top_level_statements_using_void_directive.java +0 -1
  400. package/test/translations/hiding/hide_top_level_statements_using_void_directive.py +0 -1
  401. package/test/translations/identifiers/keyword.cs +0 -4
  402. package/test/translations/identifiers/keyword.go +0 -4
  403. package/test/translations/identifiers/keyword.java +0 -4
  404. package/test/translations/identifiers/keyword.py +0 -4
  405. package/test/translations/imports/import_require.cs +0 -2
  406. package/test/translations/imports/import_require.go +0 -2
  407. package/test/translations/imports/import_require.java +0 -2
  408. package/test/translations/imports/import_require.py +0 -2
  409. package/test/translations/imports/import_star_as.cs +0 -2
  410. package/test/translations/imports/import_star_as.go +0 -2
  411. package/test/translations/imports/import_star_as.java +0 -2
  412. package/test/translations/imports/import_star_as.py +0 -2
  413. package/test/translations/imports/multiple-imports.cs +0 -2
  414. package/test/translations/imports/multiple-imports.go +0 -2
  415. package/test/translations/imports/multiple-imports.java +0 -3
  416. package/test/translations/imports/multiple-imports.py +0 -2
  417. package/test/translations/imports/selective_import.cs +0 -4
  418. package/test/translations/imports/selective_import.go +0 -3
  419. package/test/translations/imports/selective_import.java +0 -6
  420. package/test/translations/imports/selective_import.py +0 -3
  421. package/test/translations/imports/submodule-import.cs +0 -15
  422. package/test/translations/imports/submodule-import.go +0 -23
  423. package/test/translations/imports/submodule-import.java +0 -17
  424. package/test/translations/imports/submodule-import.py +0 -15
  425. package/test/translations/interfaces/interface_with_method.cs +0 -4
  426. package/test/translations/interfaces/interface_with_method.go +0 -3
  427. package/test/translations/interfaces/interface_with_method.java +0 -3
  428. package/test/translations/interfaces/interface_with_props.cs +0 -4
  429. package/test/translations/interfaces/interface_with_props.go +0 -3
  430. package/test/translations/interfaces/interface_with_props.java +0 -3
  431. package/test/translations/misc/booleans_render_to_right_primitives.cs +0 -1
  432. package/test/translations/misc/booleans_render_to_right_primitives.go +0 -1
  433. package/test/translations/misc/booleans_render_to_right_primitives.java +0 -1
  434. package/test/translations/misc/booleans_render_to_right_primitives.py +0 -1
  435. package/test/translations/statements/block_without_braces.cs +0 -1
  436. package/test/translations/statements/block_without_braces.go +0 -3
  437. package/test/translations/statements/block_without_braces.java +0 -1
  438. package/test/translations/statements/block_without_braces.py +0 -1
  439. package/test/translations/statements/declare_var.cs +0 -1
  440. package/test/translations/statements/declare_var.go +0 -1
  441. package/test/translations/statements/declare_var.java +0 -1
  442. package/test/translations/statements/declare_var.py +0 -1
  443. package/test/translations/statements/empty_control_block.cs +0 -3
  444. package/test/translations/statements/empty_control_block.go +0 -1
  445. package/test/translations/statements/empty_control_block.java +0 -2
  446. package/test/translations/statements/empty_control_block.py +0 -2
  447. package/test/translations/statements/for_of_loop.cs +0 -4
  448. package/test/translations/statements/for_of_loop.go +0 -3
  449. package/test/translations/statements/for_of_loop.java +0 -3
  450. package/test/translations/statements/for_of_loop.py +0 -2
  451. package/test/translations/statements/if.cs +0 -4
  452. package/test/translations/statements/if.go +0 -3
  453. package/test/translations/statements/if.java +0 -3
  454. package/test/translations/statements/if.py +0 -2
  455. package/test/translations/statements/if_then_else.cs +0 -8
  456. package/test/translations/statements/if_then_else.go +0 -5
  457. package/test/translations/statements/if_then_else.java +0 -5
  458. package/test/translations/statements/if_then_else.py +0 -4
  459. package/test/translations/statements/initialize_object_literal.cs +0 -5
  460. package/test/translations/statements/initialize_object_literal.go +0 -8
  461. package/test/translations/statements/initialize_object_literal.java +0 -4
  462. package/test/translations/statements/initialize_object_literal.py +0 -5
  463. package/test/translations/statements/multiline_if_then_else.cs +0 -9
  464. package/test/translations/statements/multiline_if_then_else.go +0 -6
  465. package/test/translations/statements/multiline_if_then_else.java +0 -6
  466. package/test/translations/statements/multiline_if_then_else.py +0 -5
  467. package/test/translations/statements/statements_and_newlines.cs +0 -26
  468. package/test/translations/statements/statements_and_newlines.go +0 -21
  469. package/test/translations/statements/statements_and_newlines.java +0 -21
  470. package/test/translations/statements/statements_and_newlines.py +0 -16
  471. package/test/translations/statements/vararg_any_call.cs +0 -7
  472. package/test/translations/statements/vararg_any_call.go +0 -13
  473. package/test/translations/statements/vararg_any_call.java +0 -6
  474. package/test/translations/statements/vararg_any_call.py +0 -6
  475. package/test/translations/statements/whitespace_between_statements.cs +0 -3
  476. package/test/translations/statements/whitespace_between_statements.go +0 -3
  477. package/test/translations/statements/whitespace_between_statements.java +0 -3
  478. package/test/translations/statements/whitespace_between_statements.py +0 -3
  479. package/test/translations/statements/whitespace_between_statements_in_a_block.cs +0 -6
  480. package/test/translations/statements/whitespace_between_statements_in_a_block.go +0 -5
  481. package/test/translations/statements/whitespace_between_statements_in_a_block.java +0 -5
  482. package/test/translations/statements/whitespace_between_statements_in_a_block.py +0 -4
  483. package/test/translations/structs/any_type_never_a_struct.cs +0 -3
  484. package/test/translations/structs/any_type_never_a_struct.go +0 -3
  485. package/test/translations/structs/any_type_never_a_struct.java +0 -2
  486. package/test/translations/structs/any_type_never_a_struct.py +0 -3
  487. package/test/translations/structs/infer_struct_from_union.cs +0 -6
  488. package/test/translations/structs/infer_struct_from_union.go +0 -8
  489. package/test/translations/structs/infer_struct_from_union.java +0 -6
  490. package/test/translations/structs/infer_struct_from_union.py +0 -6
  491. package/test/translations/structs/optional_known_struct.cs +0 -3
  492. package/test/translations/structs/optional_known_struct.go +0 -3
  493. package/test/translations/structs/optional_known_struct.java +0 -3
  494. package/test/translations/structs/optional_known_struct.py +0 -3
  495. package/test/translations/structs/struct_starting_with_i.cs +0 -3
  496. package/test/translations/structs/struct_starting_with_i.go +0 -3
  497. package/test/translations/structs/struct_starting_with_i.java +0 -3
  498. package/test/translations/structs/struct_starting_with_i.py +0 -3
  499. package/test/translations/structs/var_new_class_known_struct.cs +0 -3
  500. package/test/translations/structs/var_new_class_known_struct.go +0 -3
  501. package/test/translations/structs/var_new_class_known_struct.java +0 -3
  502. package/test/translations/structs/var_new_class_known_struct.py +0 -3
  503. package/test/translations/structs/var_new_class_unknown_struct.cs +0 -3
  504. package/test/translations/structs/var_new_class_unknown_struct.go +0 -3
  505. package/test/translations/structs/var_new_class_unknown_struct.java +0 -3
  506. package/test/translations/structs/var_new_class_unknown_struct.py +0 -3
  507. package/test/translations.test.d.ts +0 -9
  508. package/test/translations.test.js +0 -112
  509. package/test/util.test.d.ts +0 -2
  510. package/test/util.test.js +0 -25
  511. package/vendor/semver-intersect.d.ts +0 -13
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/tablets/schema.ts"],"names":[],"mappings":";;;AA6Ba,QAAA,oBAAoB,GAAG,GAAG,CAAC","sourcesContent":["import { SnippetLocation } from '../snippet';\n\n/**\n * Tablet file schema\n */\nexport interface TabletSchema {\n /**\n * Schema version\n */\n version: string;\n\n /**\n * What version of the tool this schema was generated with\n *\n * Hashing algorithms may depend on the tool version, and the tool\n * will reject tablets generated by different versions.\n *\n * Since tablets are designed to be used as scratch space during a build, not\n * designed to be stored long-term, this limitation does not impact\n * usability.\n */\n toolVersion: string;\n\n /**\n * All the snippets in the tablet\n */\n snippets: { [key: string]: TranslatedSnippetSchema };\n}\n\nexport const ORIGINAL_SNIPPET_KEY = '$';\n\n/**\n * Schema for a snippet\n */\nexport interface TranslatedSnippetSchema {\n /**\n * Translations for each individual language\n *\n * Since TypeScript is a valid output translation, the original will be\n * listed under the key '$'.\n */\n readonly translations: { [key: string]: TranslationSchema };\n\n /**\n * A description of the location this code snippet was found\n */\n readonly location: SnippetLocation;\n\n /**\n * Whether this was compiled without errors\n *\n * Undefined means compilation was not attempted.\n */\n readonly didCompile?: boolean;\n\n /**\n * FQNs of classes and functions referenced in this snippet.\n */\n readonly fqnsReferenced?: string[];\n\n /**\n * A fingerprint of the types referenced in `fqnsReferenced`.\n *\n * This can be used to validate/invalidate previous compilations of a snippet.\n *\n * A snippet needs to be recompiled if:\n *\n * - Its source text changes: hash will be different\n * - Its fixture changes: fullSource will be different\n * - The referenced types have changed: fingerprint will be different\n */\n readonly fqnsFingerprint?: string;\n\n /**\n * Counts the number of instances each kind of Typescript object shows up in the snippet AST.\n */\n readonly syntaxKindCounter?: { [key: string]: number };\n\n /**\n * The full source (with fixture) that was compiled\n */\n readonly fullSource?: string;\n}\n\n/**\n * A single snippet's translation\n */\nexport interface TranslationSchema {\n /**\n * The source of a single translation\n */\n readonly source: string;\n\n /**\n * The version of the translator used to obtain this translation\n */\n readonly version: string;\n}\n"]}
@@ -1,7 +1,7 @@
1
+ import { TranslatedSnippetSchema } from './schema';
1
2
  import { TargetLanguage } from '../languages';
2
3
  import { TypeScriptSnippet, SnippetLocation } from '../snippet';
3
4
  import { Mutable } from '../util';
4
- import { TranslatedSnippetSchema } from './schema';
5
5
  /**
6
6
  * The default name of the tablet file
7
7
  */
@@ -1,14 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TranslatedSnippet = exports.LanguageTablet = exports.CURRENT_SCHEMA_VERSION = exports.DEFAULT_TABLET_NAME_COMPRESSED = exports.DEFAULT_TABLET_NAME = void 0;
4
- const fs_1 = require("fs");
5
- const path = require("path");
6
- const zlib = require("zlib");
4
+ const node_fs_1 = require("node:fs");
5
+ const path = require("node:path");
6
+ const zlib = require("node:zlib");
7
+ const key_1 = require("./key");
8
+ const schema_1 = require("./schema");
7
9
  const logging = require("../logging");
8
10
  const snippet_1 = require("../snippet");
9
11
  const util_1 = require("../util");
10
- const key_1 = require("./key");
11
- const schema_1 = require("./schema");
12
12
  // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires
13
13
  const TOOL_VERSION = require('../../package.json').version;
14
14
  /**
@@ -47,7 +47,7 @@ class LanguageTablet {
47
47
  */
48
48
  static async fromOptionalFile(filename) {
49
49
  const ret = new LanguageTablet();
50
- if ((0, fs_1.existsSync)(filename)) {
50
+ if ((0, node_fs_1.existsSync)(filename)) {
51
51
  try {
52
52
  await ret.load(filename);
53
53
  }
@@ -124,7 +124,7 @@ class LanguageTablet {
124
124
  * compressed and decompress accordingly.
125
125
  */
126
126
  async load(filename) {
127
- let data = await fs_1.promises.readFile(filename);
127
+ let data = await node_fs_1.promises.readFile(filename);
128
128
  // Gzip objects start with 1f 8b 08
129
129
  if (data[0] === 0x1f && data[1] === 0x8b && data[2] === 0x08) {
130
130
  // This is a gz object, so we decompress it now...
@@ -153,12 +153,12 @@ class LanguageTablet {
153
153
  * the schema will be gzipped before writing to the file.
154
154
  */
155
155
  async save(filename, compress = false) {
156
- await fs_1.promises.mkdir(path.dirname(filename), { recursive: true });
156
+ await node_fs_1.promises.mkdir(path.dirname(filename), { recursive: true });
157
157
  let schema = Buffer.from(JSON.stringify(this.toSchema(), null, 2));
158
158
  if (compress) {
159
159
  schema = zlib.gzipSync(schema);
160
160
  }
161
- await fs_1.promises.writeFile(filename, schema);
161
+ await node_fs_1.promises.writeFile(filename, schema);
162
162
  }
163
163
  toSchema() {
164
164
  return {
@@ -173,10 +173,6 @@ exports.LanguageTablet = LanguageTablet;
173
173
  * Mutable operations on an underlying TranslatedSnippetSchema
174
174
  */
175
175
  class TranslatedSnippet {
176
- constructor(snippet) {
177
- this._snippet = { ...snippet };
178
- this.snippet = this._snippet;
179
- }
180
176
  static fromSchema(schema) {
181
177
  if (!schema.translations[schema_1.ORIGINAL_SNIPPET_KEY]) {
182
178
  throw new Error(`Input schema must have '${schema_1.ORIGINAL_SNIPPET_KEY}' key set in translations`);
@@ -193,6 +189,10 @@ class TranslatedSnippet {
193
189
  fullSource: (0, snippet_1.completeSource)(original),
194
190
  });
195
191
  }
192
+ constructor(snippet) {
193
+ this._snippet = { ...snippet };
194
+ this.snippet = this._snippet;
195
+ }
196
196
  get key() {
197
197
  if (this._key === undefined) {
198
198
  this._key = (0, key_1.snippetKey)(this.asTypescriptSnippet());
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tablets.js","sourceRoot":"","sources":["../../src/tablets/tablets.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport * as zlib from 'node:zlib';\n\nimport { snippetKey } from './key';\nimport { TabletSchema, TranslatedSnippetSchema, ORIGINAL_SNIPPET_KEY } from './schema';\nimport { TargetLanguage } from '../languages';\nimport * as logging from '../logging';\nimport { TypeScriptSnippet, SnippetLocation, completeSource } from '../snippet';\nimport { mapValues, Mutable } from '../util';\n\n// eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires\nconst TOOL_VERSION = require('../../package.json').version;\n\n/**\n * The default name of the tablet file\n */\nexport const DEFAULT_TABLET_NAME = '.jsii.tabl.json';\n\n/**\n * The default name of the compressed tablet file\n */\nexport const DEFAULT_TABLET_NAME_COMPRESSED = '.jsii.tabl.json.gz';\n\nexport const CURRENT_SCHEMA_VERSION = '2';\n\n/**\n * A tablet containing various snippets in multiple languages\n */\nexport class LanguageTablet {\n /**\n * Load a tablet from a file\n */\n public static async fromFile(filename: string) {\n const ret = new LanguageTablet();\n await ret.load(filename);\n return ret;\n }\n\n /**\n * Load a tablet from a file that may not exist\n *\n * Will return an empty tablet if the file does not exist\n */\n public static async fromOptionalFile(filename: string) {\n const ret = new LanguageTablet();\n if (existsSync(filename)) {\n try {\n await ret.load(filename);\n } catch (e: any) {\n logging.warn(`${filename}: ${e}`);\n }\n }\n return ret;\n }\n\n /**\n * Whether or not the LanguageTablet was loaded with a compressed source.\n * This gets used to determine if it should be compressed when saved.\n */\n public compressedSource = false;\n\n private readonly snippets: Record<string, TranslatedSnippet> = {};\n\n /**\n * Add one or more snippets to this tablet\n */\n public addSnippets(...snippets: TranslatedSnippet[]) {\n for (const snippet of snippets) {\n const existingSnippet = this.snippets[snippet.key];\n this.snippets[snippet.key] = existingSnippet ? existingSnippet.mergeTranslations(snippet) : snippet;\n }\n }\n\n /**\n * Add one snippet to this tablet\n *\n * @deprecated use addSnippets instead\n */\n public addSnippet(snippet: TranslatedSnippet) {\n this.addSnippets(snippet);\n }\n\n public get snippetKeys() {\n return Object.keys(this.snippets);\n }\n\n /**\n * Add all snippets from the given tablets into this one\n */\n public addTablets(...tablets: LanguageTablet[]) {\n for (const tablet of tablets) {\n for (const snippet of Object.values(tablet.snippets)) {\n this.addSnippet(snippet);\n }\n }\n }\n\n /**\n * Add all snippets from the given tablet into this one\n *\n * @deprecated Use `addTablets()` instead.\n */\n public addTablet(tablet: LanguageTablet) {\n this.addTablets(tablet);\n }\n\n public tryGetSnippet(key: string): TranslatedSnippet | undefined {\n return this.snippets[key];\n }\n\n /**\n * Look up a single translation of a source snippet\n *\n * @deprecated Use `lookupTranslationBySource` instead.\n */\n public lookup(typeScriptSource: TypeScriptSnippet, language: TargetLanguage): Translation | undefined {\n return this.lookupTranslationBySource(typeScriptSource, language);\n }\n\n /**\n * Look up a single translation of a source snippet\n */\n public lookupTranslationBySource(\n typeScriptSource: TypeScriptSnippet,\n language: TargetLanguage,\n ): Translation | undefined {\n const snippet = this.snippets[snippetKey(typeScriptSource)];\n return snippet?.get(language);\n }\n\n /**\n * Lookup the translated verion of a TypeScript snippet\n */\n public lookupBySource(typeScriptSource: TypeScriptSnippet): TranslatedSnippet | undefined {\n return this.snippets[snippetKey(typeScriptSource)];\n }\n\n /**\n * Load the tablet from a file. Will automatically detect if the file is\n * compressed and decompress accordingly.\n */\n public async load(filename: string) {\n let data = await fs.readFile(filename);\n // Gzip objects start with 1f 8b 08\n if (data[0] === 0x1f && data[1] === 0x8b && data[2] === 0x08) {\n // This is a gz object, so we decompress it now...\n data = zlib.gunzipSync(data);\n this.compressedSource = true;\n }\n\n const obj: TabletSchema = JSON.parse(data.toString('utf-8'));\n\n if (!obj.toolVersion || !obj.snippets) {\n throw new Error(`File '${filename}' does not seem to be a Tablet file`);\n }\n\n if (obj.version !== CURRENT_SCHEMA_VERSION) {\n // If we're ever changing the schema version in a backwards incompatible way,\n // do upconversion here.\n throw new Error(\n `Tablet file '${filename}' has schema version '${obj.version}', this program expects '${CURRENT_SCHEMA_VERSION}'`,\n );\n }\n\n Object.assign(this.snippets, mapValues(obj.snippets, TranslatedSnippet.fromSchema));\n }\n\n public get count() {\n return Object.keys(this.snippets).length;\n }\n\n public get translatedSnippets() {\n return Object.values(this.snippets);\n }\n\n /**\n * Saves the tablet schema to a file. If the compress option is passed, then\n * the schema will be gzipped before writing to the file.\n */\n public async save(filename: string, compress = false) {\n await fs.mkdir(path.dirname(filename), { recursive: true });\n\n let schema = Buffer.from(JSON.stringify(this.toSchema(), null, 2));\n if (compress) {\n schema = zlib.gzipSync(schema);\n }\n\n await fs.writeFile(filename, schema);\n }\n\n private toSchema(): TabletSchema {\n return {\n version: CURRENT_SCHEMA_VERSION,\n toolVersion: TOOL_VERSION,\n snippets: mapValues(this.snippets, (s) => s.snippet),\n };\n }\n}\n\n/**\n * Mutable operations on an underlying TranslatedSnippetSchema\n */\nexport class TranslatedSnippet {\n public static fromSchema(schema: TranslatedSnippetSchema) {\n if (!schema.translations[ORIGINAL_SNIPPET_KEY]) {\n throw new Error(`Input schema must have '${ORIGINAL_SNIPPET_KEY}' key set in translations`);\n }\n return new TranslatedSnippet(schema);\n }\n\n public static fromTypeScript(original: TypeScriptSnippet, didCompile?: boolean) {\n return new TranslatedSnippet({\n translations: {\n [ORIGINAL_SNIPPET_KEY]: { source: original.visibleSource, version: '0' },\n },\n didCompile: didCompile,\n location: original.location,\n fullSource: completeSource(original),\n });\n }\n\n public readonly snippet: TranslatedSnippetSchema;\n\n private readonly _snippet: Mutable<TranslatedSnippetSchema>;\n private _key?: string;\n\n private constructor(snippet: TranslatedSnippetSchema) {\n this._snippet = { ...snippet };\n this.snippet = this._snippet;\n }\n\n public get key() {\n if (this._key === undefined) {\n this._key = snippetKey(this.asTypescriptSnippet());\n }\n return this._key;\n }\n\n public get originalSource(): Translation {\n return {\n source: this.snippet.translations[ORIGINAL_SNIPPET_KEY].source,\n language: 'typescript',\n didCompile: this.snippet.didCompile,\n };\n }\n\n public addTranslation(language: TargetLanguage, translation: string, version: string): Translation {\n this.snippet.translations[language] = { source: translation, version };\n\n return {\n source: translation,\n language,\n didCompile: this.snippet.didCompile,\n };\n }\n\n public fqnsReferenced() {\n return this._snippet.fqnsReferenced ?? [];\n }\n\n public addSyntaxKindCounter(syntaxKindCounter: Record<string, number>) {\n if (!this._snippet.syntaxKindCounter) {\n this._snippet.syntaxKindCounter = {};\n }\n for (const [key, value] of Object.entries(syntaxKindCounter)) {\n const x = this._snippet.syntaxKindCounter[key] ?? 0;\n this._snippet.syntaxKindCounter[key] = value + x;\n }\n }\n\n public get languages(): TargetLanguage[] {\n return Object.keys(this.snippet.translations).filter((x) => x !== ORIGINAL_SNIPPET_KEY) as TargetLanguage[];\n }\n\n public get(language: TargetLanguage): Translation | undefined {\n const t = this.snippet.translations[language];\n return t && { source: t.source, language, didCompile: this.snippet.didCompile };\n }\n\n public mergeTranslations(other: TranslatedSnippet) {\n return new TranslatedSnippet({\n ...this.snippet,\n translations: { ...this.snippet.translations, ...other.snippet.translations },\n });\n }\n\n public withFingerprint(fp: string) {\n return new TranslatedSnippet({\n ...this.snippet,\n fqnsFingerprint: fp,\n });\n }\n\n public withLocation(location: SnippetLocation) {\n return new TranslatedSnippet({\n ...this.snippet,\n location,\n });\n }\n\n public toJSON() {\n return this._snippet;\n }\n\n private asTypescriptSnippet(): TypeScriptSnippet {\n return {\n visibleSource: this.snippet.translations[ORIGINAL_SNIPPET_KEY].source,\n location: this.snippet.location,\n };\n }\n}\n\nexport interface Translation {\n source: string;\n language: string;\n didCompile?: boolean;\n}\n"]}
@@ -88,7 +88,7 @@ export declare class SnippetTranslator {
88
88
  */
89
89
  get didSuccessfullyCompile(): boolean | undefined;
90
90
  renderUsing(visitor: AstHandler<any>): string;
91
- syntaxKindCounter(): Record<string, number>;
91
+ syntaxKindCounter(): Partial<Record<ts.SyntaxKind, number>>;
92
92
  fqnsReferenced(): string[];
93
93
  get diagnostics(): readonly ts.Diagnostic[];
94
94
  }
package/lib/translate.js CHANGED
@@ -7,8 +7,8 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
7
7
  var _Translator_diagnostics;
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.rosettaDiagFromTypescript = exports.SnippetTranslator = exports.makeRosettaDiagnostic = exports.Translator = exports.translateTypeScript = void 0;
10
+ const node_util_1 = require("node:util");
10
11
  const ts = require("typescript");
11
- const util_1 = require("util");
12
12
  const languages_1 = require("./languages");
13
13
  const record_references_1 = require("./languages/record-references");
14
14
  const target_language_1 = require("./languages/target-language");
@@ -23,7 +23,7 @@ const tablets_1 = require("./tablets/tablets");
23
23
  const syntax_kind_counter_1 = require("./typescript/syntax-kind-counter");
24
24
  const ts_compiler_1 = require("./typescript/ts-compiler");
25
25
  const visible_spans_1 = require("./typescript/visible-spans");
26
- const util_2 = require("./util");
26
+ const util_1 = require("./util");
27
27
  function translateTypeScript(source, visitor, options = {}) {
28
28
  const translator = new SnippetTranslator({ visibleSource: source.contents, location: { api: { api: 'file', fileName: source.fileName } } }, options);
29
29
  const translated = translator.renderUsing(visitor);
@@ -47,10 +47,10 @@ class Translator {
47
47
  _Translator_diagnostics.set(this, []);
48
48
  }
49
49
  translate(snip, languages = Object.values(languages_1.TargetLanguage)) {
50
- logging.debug(`Translating ${(0, key_1.snippetKey)(snip)} ${(0, util_1.inspect)(snip.parameters ?? {})}`);
50
+ logging.debug(`Translating ${(0, key_1.snippetKey)(snip)} ${(0, node_util_1.inspect)(snip.parameters ?? {})}`);
51
51
  const translator = this.translatorFor(snip);
52
- const translations = (0, util_2.mkDict)(languages.flatMap((lang, idx, languages) => {
53
- if (languages.slice(0, idx).includes(lang)) {
52
+ const translations = (0, util_1.mkDict)(languages.flatMap((lang, idx, array) => {
53
+ if (array.slice(0, idx).includes(lang)) {
54
54
  // This language was duplicated in the request... we'll skip that here...
55
55
  return [];
56
56
  }
@@ -126,7 +126,9 @@ class SnippetTranslator {
126
126
  ];
127
127
  if (snippet.strict) {
128
128
  // In a strict assembly, so we'll need to brand all diagnostics here...
129
- diagnostics.forEach(util_2.annotateStrictDiagnostic);
129
+ for (const diag of diagnostics) {
130
+ (0, util_1.annotateStrictDiagnostic)(diag);
131
+ }
130
132
  }
131
133
  this.compileDiagnostics.push(...diagnostics);
132
134
  }
@@ -192,7 +194,7 @@ function filterVisibleDiagnostics(diags, visibleSpans) {
192
194
  function rosettaDiagFromTypescript(diag) {
193
195
  return {
194
196
  isError: diag.category === ts.DiagnosticCategory.Error,
195
- isFromStrictAssembly: (0, util_2.hasStrictBranding)(diag),
197
+ isFromStrictAssembly: (0, util_1.hasStrictBranding)(diag),
196
198
  formattedMessage: ts.formatDiagnosticsWithColorAndContext([diag], DIAG_HOST),
197
199
  };
198
200
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate.js","sourceRoot":"","sources":["../src/translate.ts"],"names":[],"mappings":"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","sourcesContent":["import { inspect } from 'node:util';\nimport * as ts from 'typescript';\n\nimport { TARGET_LANGUAGES, TargetLanguage } from './languages';\nimport { RecordReferencesVisitor } from './languages/record-references';\nimport { supportsTransitiveSubmoduleAccess } from './languages/target-language';\nimport * as logging from './logging';\nimport { renderTree } from './o-tree';\nimport { AstRenderer, AstHandler, AstRendererOptions } from './renderer';\nimport { TypeScriptSnippet, completeSource, SnippetParameters, formatLocation } from './snippet';\nimport { SubmoduleReference, SubmoduleReferenceMap } from './submodule-reference';\nimport { snippetKey } from './tablets/key';\nimport { ORIGINAL_SNIPPET_KEY } from './tablets/schema';\nimport { TranslatedSnippet } from './tablets/tablets';\nimport { SyntaxKindCounter } from './typescript/syntax-kind-counter';\nimport { TypeScriptCompiler, CompilationResult } from './typescript/ts-compiler';\nimport { Spans } from './typescript/visible-spans';\nimport { annotateStrictDiagnostic, File, hasStrictBranding, mkDict } from './util';\n\nexport function translateTypeScript(\n source: File,\n visitor: AstHandler<any>,\n options: SnippetTranslatorOptions = {},\n): TranslateResult {\n const translator = new SnippetTranslator(\n { visibleSource: source.contents, location: { api: { api: 'file', fileName: source.fileName } } },\n options,\n );\n const translated = translator.renderUsing(visitor);\n\n return {\n translation: translated,\n diagnostics: translator.diagnostics.map(rosettaDiagFromTypescript),\n };\n}\n\n/**\n * Translate one or more TypeScript snippets into other languages\n *\n * Can be configured to fully typecheck the samples, or perform only syntactical\n * translation.\n */\nexport class Translator {\n private readonly compiler = new TypeScriptCompiler();\n // eslint-disable-next-line @typescript-eslint/explicit-member-accessibility\n #diagnostics: ts.Diagnostic[] = [];\n\n public constructor(private readonly includeCompilerDiagnostics: boolean) {}\n\n public translate(snip: TypeScriptSnippet, languages: readonly TargetLanguage[] = Object.values(TargetLanguage)) {\n logging.debug(`Translating ${snippetKey(snip)} ${inspect(snip.parameters ?? {})}`);\n const translator = this.translatorFor(snip);\n\n const translations = mkDict(\n languages.flatMap((lang, idx, array) => {\n if (array.slice(0, idx).includes(lang)) {\n // This language was duplicated in the request... we'll skip that here...\n return [];\n }\n const languageConverterFactory = TARGET_LANGUAGES[lang];\n const translated = translator.renderUsing(languageConverterFactory.createVisitor());\n return [[lang, { source: translated, version: languageConverterFactory.version }] as const];\n }),\n );\n\n if (snip.parameters?.infused === undefined) {\n this.#diagnostics.push(...translator.diagnostics);\n }\n\n return TranslatedSnippet.fromSchema({\n translations: {\n ...translations,\n [ORIGINAL_SNIPPET_KEY]: { source: snip.visibleSource, version: '0' },\n },\n location: snip.location,\n didCompile: translator.didSuccessfullyCompile,\n fqnsReferenced: translator.fqnsReferenced(),\n fullSource: completeSource(snip),\n syntaxKindCounter: translator.syntaxKindCounter(),\n });\n }\n\n public get diagnostics(): readonly RosettaDiagnostic[] {\n return ts.sortAndDeduplicateDiagnostics(this.#diagnostics).map(rosettaDiagFromTypescript);\n }\n\n /**\n * Return the snippet translator for the given snippet\n *\n * We used to cache these, but each translator holds on to quite a bit of memory,\n * so we don't do that anymore.\n */\n public translatorFor(snippet: TypeScriptSnippet) {\n const translator = new SnippetTranslator(snippet, {\n compiler: this.compiler,\n includeCompilerDiagnostics: this.includeCompilerDiagnostics,\n });\n return translator;\n }\n}\n\nexport interface SnippetTranslatorOptions extends AstRendererOptions {\n /**\n * Re-use the given compiler if given\n */\n readonly compiler?: TypeScriptCompiler;\n\n /**\n * Include compiler errors in return diagnostics\n *\n * If false, only translation diagnostics will be returned.\n *\n * @default false\n */\n readonly includeCompilerDiagnostics?: boolean;\n}\n\nexport interface TranslateResult {\n translation: string;\n diagnostics: readonly RosettaDiagnostic[];\n}\n\n/**\n * A translation of a TypeScript diagnostic into a data-only representation for Rosetta\n *\n * We cannot use the original `ts.Diagnostic` since it holds on to way too much\n * state (the source file and by extension the entire parse tree), which grows\n * too big to be properly serialized by a worker and also takes too much memory.\n *\n * Reduce it down to only the information we need.\n */\nexport interface RosettaDiagnostic {\n /**\n * If this is an error diagnostic or not\n */\n readonly isError: boolean;\n\n /**\n * If the diagnostic was emitted from an assembly that has its 'strict' flag set\n */\n readonly isFromStrictAssembly: boolean;\n\n /**\n * The formatted message, ready to be printed (will have colors and newlines in it)\n *\n * Ends in a newline.\n */\n readonly formattedMessage: string;\n}\n\nexport function makeRosettaDiagnostic(isError: boolean, formattedMessage: string): RosettaDiagnostic {\n return { isError, formattedMessage, isFromStrictAssembly: false };\n}\n\n/**\n * Translate a single TypeScript snippet\n */\nexport class SnippetTranslator {\n public readonly translateDiagnostics: ts.Diagnostic[] = [];\n public readonly compileDiagnostics: ts.Diagnostic[] = [];\n private readonly visibleSpans: Spans;\n private readonly compilation!: CompilationResult;\n private readonly tryCompile: boolean;\n private readonly submoduleReferences: SubmoduleReferenceMap;\n\n public constructor(snippet: TypeScriptSnippet, private readonly options: SnippetTranslatorOptions = {}) {\n const compiler = options.compiler ?? new TypeScriptCompiler();\n const source = completeSource(snippet);\n const fakeCurrentDirectory =\n snippet.parameters?.[SnippetParameters.$COMPILATION_DIRECTORY] ??\n snippet.parameters?.[SnippetParameters.$PROJECT_DIRECTORY];\n this.compilation = compiler.compileInMemory(\n removeSlashes(formatLocation(snippet.location)),\n source,\n fakeCurrentDirectory,\n );\n\n // Respect '/// !hide' and '/// !show' directives\n this.visibleSpans = Spans.visibleSpansFromSource(source);\n\n // Find submodule references on explicit imports\n this.submoduleReferences = SubmoduleReference.inSourceFile(\n this.compilation.rootFile,\n this.compilation.program.getTypeChecker(),\n );\n\n // This makes it about 5x slower, so only do it on demand\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n this.tryCompile = (options.includeCompilerDiagnostics || snippet.strict) ?? false;\n if (this.tryCompile) {\n const program = this.compilation.program;\n const diagnostics = [\n ...neverThrowing(program.getGlobalDiagnostics)(),\n ...neverThrowing(program.getSyntacticDiagnostics)(this.compilation.rootFile),\n ...neverThrowing(program.getDeclarationDiagnostics)(this.compilation.rootFile),\n ...neverThrowing(program.getSemanticDiagnostics)(this.compilation.rootFile),\n ];\n if (snippet.strict) {\n // In a strict assembly, so we'll need to brand all diagnostics here...\n for (const diag of diagnostics) {\n annotateStrictDiagnostic(diag);\n }\n }\n this.compileDiagnostics.push(...diagnostics);\n }\n\n /**\n * Intercepts all exceptions thrown by the wrapped call, and logs them to\n * console.error instead of re-throwing, then returns an empty array. This\n * is here to avoid compiler crashes due to broken code examples that cause\n * the TypeScript compiler to hit a \"Debug Failure\".\n */\n function neverThrowing<A extends unknown[], R>(call: (...args: A) => readonly R[]): (...args: A) => readonly R[] {\n return (...args: A) => {\n try {\n return call(...args);\n } catch (err: any) {\n const isExpectedTypescriptError = err.message.includes('Debug Failure');\n\n if (!isExpectedTypescriptError) {\n console.error(`Failed to execute ${call.name}: ${err}`);\n }\n\n return [];\n }\n };\n }\n }\n\n /**\n * Returns a boolean if compilation was attempted, and undefined if it was not.\n */\n public get didSuccessfullyCompile() {\n return this.tryCompile ? this.compileDiagnostics.length === 0 : undefined;\n }\n\n public renderUsing(visitor: AstHandler<any>) {\n const converter = new AstRenderer(\n this.compilation.rootFile,\n this.compilation.program.getTypeChecker(),\n visitor,\n this.options,\n // If we support transitive submodule access, don't provide a submodule reference map.\n supportsTransitiveSubmoduleAccess(visitor.language) ? undefined : this.submoduleReferences,\n );\n const converted = converter.convert(this.compilation.rootFile);\n this.translateDiagnostics.push(...filterVisibleDiagnostics(converter.diagnostics, this.visibleSpans));\n return renderTree(converted, { indentChar: visitor.indentChar, visibleSpans: this.visibleSpans });\n }\n\n public syntaxKindCounter(): Partial<Record<ts.SyntaxKind, number>> {\n const kindCounter = new SyntaxKindCounter(this.visibleSpans);\n return kindCounter.countKinds(this.compilation.rootFile);\n }\n\n public fqnsReferenced() {\n const visitor = new RecordReferencesVisitor(this.visibleSpans);\n const converter = new AstRenderer(\n this.compilation.rootFile,\n this.compilation.program.getTypeChecker(),\n visitor,\n this.options,\n this.submoduleReferences,\n );\n converter.convert(this.compilation.rootFile);\n return visitor.fqnsReferenced();\n }\n\n public get diagnostics(): readonly ts.Diagnostic[] {\n return ts.sortAndDeduplicateDiagnostics(this.compileDiagnostics.concat(this.translateDiagnostics));\n }\n}\n\n/**\n * Hide diagnostics that are rosetta-sourced if they are reported against a non-visible span\n */\nfunction filterVisibleDiagnostics(diags: readonly ts.Diagnostic[], visibleSpans: Spans): ts.Diagnostic[] {\n return diags.filter((d) => d.source !== 'rosetta' || d.start === undefined || visibleSpans.containsPosition(d.start));\n}\n\n/**\n * Turn TypeScript diagnostics into Rosetta diagnostics\n */\nexport function rosettaDiagFromTypescript(diag: ts.Diagnostic): RosettaDiagnostic {\n return {\n isError: diag.category === ts.DiagnosticCategory.Error,\n isFromStrictAssembly: hasStrictBranding(diag),\n formattedMessage: ts.formatDiagnosticsWithColorAndContext([diag], DIAG_HOST),\n };\n}\n\nconst DIAG_HOST = {\n getCurrentDirectory() {\n return '.';\n },\n getCanonicalFileName(fileName: string) {\n return fileName;\n },\n getNewLine() {\n return '\\n';\n },\n};\n\n/**\n * Remove slashes from a \"where\" description, as the TS compiler will interpret it as a directory\n * and we can't have that for compiling literate files\n */\nfunction removeSlashes(x: string) {\n return x.replace(/\\/|\\\\/g, '.');\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.translateAll = void 0;
4
- const os = require("os");
5
- const path = require("path");
4
+ const os = require("node:os");
5
+ const path = require("node:path");
6
6
  const workerpool = require("workerpool");
7
7
  const logging = require("./logging");
8
8
  const tablets_1 = require("./tablets/tablets");
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate_all.js","sourceRoot":"","sources":["../src/translate_all.ts"],"names":[],"mappings":";;;AAAA,8BAA8B;AAC9B,kCAAkC;AAClC,yCAAyC;AAEzC,qCAAqC;AAErC,+CAAsD;AAItD;;;;;;;;;GASG;AACI,KAAK,UAAU,YAAY,CAChC,QAA6B,EAC7B,0BAAmC;IAEnC,6EAA6E;IAC7E,6EAA6E;IAC7E,qDAAqD;IACrD,2FAA2F;IAC3F,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,IAAI,CAAC,CAAC;IAC/E,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,eAAe,UAAU,CAAC,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAE7E,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC,EAAE;QAC5E,UAAU,EAAE,CAAC;KACd,CAAC,CAAC;IAEH,IAAI;QACF,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAC;QAEvE,MAAM,SAAS,GAA6B,MAAM,OAAO,CAAC,GAAG,CAC3D,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAClE,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,KAAK,EAAqB,CAAC;QACnD,MAAM,kBAAkB,GAAG,IAAI,KAAK,EAAqB,CAAC;QAE1D,kBAAkB;QAClB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;YAChC,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC1C,kBAAkB,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,2BAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;SAC1F;QACD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;KAC5C;YAAS;QACR,yBAAyB;QACzB,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;KACvB;AACH,CAAC;AArCD,oCAqCC;AAED,SAAS,aAAa,CACpB,QAA6B,EAC7B,0BAAmC,EACnC,SAAS,GAAG,EAAE;IAEd,MAAM,GAAG,GAAG,EAAE,CAAC;IAEf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE;QACnD,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;YAC1C,0BAA0B;SAC3B,CAAC,CAAC;KACJ;IAED,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import * as os from 'node:os';\nimport * as path from 'node:path';\nimport * as workerpool from 'workerpool';\n\nimport * as logging from './logging';\nimport { TypeScriptSnippet } from './snippet';\nimport { TranslatedSnippet } from './tablets/tablets';\nimport { RosettaDiagnostic } from './translate';\nimport type { TranslateBatchRequest, TranslateBatchResponse } from './translate_all_worker';\n\n/**\n * Divide the work evenly over all processors by running 'translate_all_worker' in Worker Threads, then combine results\n *\n * The workers are fed small queues of work each. We used to divide the entire queue into N\n * but since the work is divided unevenly that led to some workers stopping early, idling while\n * waiting for more work.\n *\n * Never include 'translate_all_worker' directly, only do TypeScript type references (so that in\n * the script we may assume that 'worker_threads' successfully imports).\n */\nexport async function translateAll(\n snippets: TypeScriptSnippet[],\n includeCompilerDiagnostics: boolean,\n): Promise<TranslateAllResult> {\n // Use about half the advertised cores because hyperthreading doesn't seem to\n // help that much, or we become I/O-bound at some point. On my machine, using\n // more than half the cores actually makes it slower.\n // Cap to a reasonable top-level limit to prevent thrash on machines with many, many cores.\n const maxWorkers = parseInt(process.env.JSII_ROSETTA_MAX_WORKER_COUNT ?? '16');\n const N = Math.min(maxWorkers, Math.max(1, Math.ceil(os.cpus().length / 2)));\n const snippetArr = Array.from(snippets);\n logging.info(`Translating ${snippetArr.length} snippets using ${N} workers`);\n\n const pool = workerpool.pool(path.join(__dirname, 'translate_all_worker.js'), {\n maxWorkers: N,\n });\n\n try {\n const requests = batchSnippets(snippetArr, includeCompilerDiagnostics);\n\n const responses: TranslateBatchResponse[] = await Promise.all(\n requests.map((request) => pool.exec('translateBatch', [request])),\n );\n\n const diagnostics = new Array<RosettaDiagnostic>();\n const translatedSnippets = new Array<TranslatedSnippet>();\n\n // Combine results\n for (const response of responses) {\n diagnostics.push(...response.diagnostics);\n translatedSnippets.push(...response.translatedSchemas.map(TranslatedSnippet.fromSchema));\n }\n return { diagnostics, translatedSnippets };\n } finally {\n // Not waiting on purpose\n void pool.terminate();\n }\n}\n\nfunction batchSnippets(\n snippets: TypeScriptSnippet[],\n includeCompilerDiagnostics: boolean,\n batchSize = 10,\n): TranslateBatchRequest[] {\n const ret = [];\n\n for (let i = 0; i < snippets.length; i += batchSize) {\n ret.push({\n snippets: snippets.slice(i, i + batchSize),\n includeCompilerDiagnostics,\n });\n }\n\n return ret;\n}\n\nexport interface TranslateAllResult {\n translatedSnippets: TranslatedSnippet[];\n diagnostics: RosettaDiagnostic[];\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate_all_worker.js","sourceRoot":"","sources":["../src/translate_all_worker.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,yCAAyC;AAKzC,2CAAmF;AAcnF,SAAS,cAAc,CAAC,OAA8B;IACpD,MAAM,MAAM,GAAG,0BAA0B,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAEhG,OAAO;QACL,iBAAiB,EAAE,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAClE,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,0BAA0B,CACxC,QAA6B,EAC7B,0BAAmC;IAEnC,MAAM,kBAAkB,GAAG,IAAI,KAAK,EAAqB,CAAC;IAE1D,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAqB,CAAC;IAEhD,MAAM,UAAU,GAAG,IAAI,sBAAU,CAAC,0BAA0B,CAAC,CAAC;IAC9D,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;QAC5B,IAAI;YACF,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;SACtD;QAAC,OAAO,CAAM,EAAE;YACf,QAAQ,CAAC,IAAI,CACX,IAAA,iCAAqB,EAAC,IAAI,EAAE,uCAAuC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,cAAc,EAAE,CAAC,CAC7G,CAAC;SACH;KACF;IAED,OAAO;QACL,kBAAkB;QAClB,WAAW,EAAE,CAAC,GAAG,UAAU,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC;KACtD,CAAC;AACJ,CAAC;AAvBD,gEAuBC;AAED,UAAU,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC","sourcesContent":["/**\n * Pool worker for extract.ts\n */\nimport * as workerpool from 'workerpool';\n\nimport { TypeScriptSnippet } from './snippet';\nimport { TranslatedSnippetSchema } from './tablets/schema';\nimport { TranslatedSnippet } from './tablets/tablets';\nimport { RosettaDiagnostic, Translator, makeRosettaDiagnostic } from './translate';\nimport { TranslateAllResult } from './translate_all';\n\nexport interface TranslateBatchRequest {\n readonly snippets: TypeScriptSnippet[];\n readonly includeCompilerDiagnostics: boolean;\n}\n\nexport interface TranslateBatchResponse {\n // Cannot be 'TranslatedSnippet' because needs to be serializable\n readonly translatedSchemas: TranslatedSnippetSchema[];\n readonly diagnostics: RosettaDiagnostic[];\n}\n\nfunction translateBatch(request: TranslateBatchRequest): TranslateBatchResponse {\n const result = singleThreadedTranslateAll(request.snippets, request.includeCompilerDiagnostics);\n\n return {\n translatedSchemas: result.translatedSnippets.map((s) => s.snippet),\n diagnostics: result.diagnostics,\n };\n}\n\n/**\n * Translate the given snippets using a single compiler\n */\nexport function singleThreadedTranslateAll(\n snippets: TypeScriptSnippet[],\n includeCompilerDiagnostics: boolean,\n): TranslateAllResult {\n const translatedSnippets = new Array<TranslatedSnippet>();\n\n const failures = new Array<RosettaDiagnostic>();\n\n const translator = new Translator(includeCompilerDiagnostics);\n for (const block of snippets) {\n try {\n translatedSnippets.push(translator.translate(block));\n } catch (e: any) {\n failures.push(\n makeRosettaDiagnostic(true, `rosetta: error translating snippet: ${e}\\n${e.stack}\\n${block.completeSource}`),\n );\n }\n }\n\n return {\n translatedSnippets,\n diagnostics: [...translator.diagnostics, ...failures],\n };\n}\n\nworkerpool.worker({ translateBatch });\n"]}
@@ -5,7 +5,7 @@ export declare function stringFromLiteral(expr: ts.Expression): string;
5
5
  /**
6
6
  * All types of nodes that can be captured using `nodeOfType`, and the type of Node they map to
7
7
  */
8
- export declare type CapturableNodes = {
8
+ export type CapturableNodes = {
9
9
  [ts.SyntaxKind.ImportDeclaration]: ts.ImportDeclaration;
10
10
  [ts.SyntaxKind.VariableDeclaration]: ts.VariableDeclaration;
11
11
  [ts.SyntaxKind.ExternalModuleReference]: ts.ExternalModuleReference;
@@ -14,7 +14,7 @@ export declare type CapturableNodes = {
14
14
  [ts.SyntaxKind.ImportSpecifier]: ts.ImportSpecifier;
15
15
  [ts.SyntaxKind.StringLiteral]: ts.StringLiteral;
16
16
  };
17
- export declare type AstMatcher<A> = (nodes?: ts.Node[]) => A | undefined;
17
+ export type AstMatcher<A> = (nodes?: ts.Node[]) => A | undefined;
18
18
  /**
19
19
  * Return AST children of the given node
20
20
  *
@@ -116,9 +116,7 @@ exports.matchAst = matchAst;
116
116
  */
117
117
  function countNakedNewlines(str) {
118
118
  let ret = 0;
119
- scanText(str, 0, str.length)
120
- .filter((s) => s.type === 'other' || s.type === 'blockcomment')
121
- .forEach((s) => {
119
+ for (const s of scanText(str, 0, str.length).filter((r) => r.type === 'other' || r.type === 'blockcomment')) {
122
120
  if (s.type === 'other') {
123
121
  // Count newlines in non-comments
124
122
  for (let i = s.pos; i < s.end; i++) {
@@ -133,7 +131,7 @@ function countNakedNewlines(str) {
133
131
  ret--;
134
132
  }
135
133
  }
136
- });
134
+ }
137
135
  return ret;
138
136
  }
139
137
  exports.countNakedNewlines = countNakedNewlines;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../src/typescript/ast-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\nimport { AstRenderer } from '../renderer';\n\nexport function stripCommentMarkers(comment: string, multiline: boolean) {\n if (multiline) {\n // The text *must* start with '/*' and end with '*/'.\n // Strip leading '*' from every remaining line (first line because of '**',\n // other lines because of continuations.\n return comment\n .substring(2, comment.length - 2)\n .replace(/^[ \\t]+/g, '') // Strip all leading whitepace\n .replace(/[ \\t]+$/g, '') // Strip all trailing whitepace\n .replace(/^[ \\t]*\\*[ \\t]?/gm, ''); // Strip \"* \" from start of line\n }\n // The text *must* start with '//'\n return comment.replace(/^[/]{2}[ \\t]?/gm, '');\n}\n\nexport function stringFromLiteral(expr: ts.Expression) {\n if (ts.isStringLiteral(expr)) {\n return expr.text;\n }\n return '???';\n}\n\n/**\n * All types of nodes that can be captured using `nodeOfType`, and the type of Node they map to\n */\nexport type CapturableNodes = {\n [ts.SyntaxKind.ImportDeclaration]: ts.ImportDeclaration;\n [ts.SyntaxKind.VariableDeclaration]: ts.VariableDeclaration;\n [ts.SyntaxKind.ExternalModuleReference]: ts.ExternalModuleReference;\n [ts.SyntaxKind.NamespaceImport]: ts.NamespaceImport;\n [ts.SyntaxKind.NamedImports]: ts.NamedImports;\n [ts.SyntaxKind.ImportSpecifier]: ts.ImportSpecifier;\n [ts.SyntaxKind.StringLiteral]: ts.StringLiteral;\n};\n\nexport type AstMatcher<A> = (nodes?: ts.Node[]) => A | undefined;\n\n/**\n * Return AST children of the given node\n *\n * Difference with node.getChildren():\n *\n * - node.getChildren() must take a SourceFile (will fail if it doesn't get it)\n * and returns a mix of abstract and concrete syntax nodes.\n * - This function function will ONLY return abstract syntax nodes.\n */\nexport function nodeChildren(node: ts.Node): ts.Node[] {\n const ret = new Array<ts.Node>();\n node.forEachChild((n) => {\n ret.push(n);\n });\n return ret;\n}\n\n/**\n * Match a single node of a given type\n *\n * Capture name is first so that the IDE can detect eagerly that we're falling into\n * that overload and properly autocomplete the recognized node types from CapturableNodes.\n *\n * Looks like SyntaxList nodes appear in the printed AST, but they don't actually appear\n */\nexport function nodeOfType<A>(syntaxKind: ts.SyntaxKind, children?: AstMatcher<A>): AstMatcher<A>;\n// eslint-disable-next-line max-len\nexport function nodeOfType<S extends keyof CapturableNodes, N extends string, A>(\n capture: N,\n capturableNodeType: S,\n children?: AstMatcher<A>,\n): AstMatcher<Omit<A, N> & { [key in N]: CapturableNodes[S] }>;\n// eslint-disable-next-line max-len\nexport function nodeOfType<S extends keyof CapturableNodes, N extends string, A>(\n syntaxKindOrCaptureName: ts.SyntaxKind | N,\n nodeTypeOrChildren?: S | AstMatcher<A>,\n children?: AstMatcher<A>,\n): AstMatcher<A> | AstMatcher<A & { [key in N]: CapturableNodes[S] }> {\n const capturing = typeof syntaxKindOrCaptureName === 'string'; // Determine which overload we're in (SyntaxKind is a number)\n\n const realNext = (capturing ? children : (nodeTypeOrChildren as AstMatcher<A>)) ?? DONE;\n const realCapture = capturing ? syntaxKindOrCaptureName : undefined;\n const realSyntaxKind = capturing ? nodeTypeOrChildren : syntaxKindOrCaptureName;\n\n return (nodes) => {\n for (const node of nodes ?? []) {\n if (node.kind === realSyntaxKind) {\n const ret = realNext(nodeChildren(node));\n if (!ret) {\n continue;\n }\n\n if (realCapture) {\n return Object.assign(ret, {\n [realCapture]: node as CapturableNodes[S],\n }) as any;\n }\n return ret;\n }\n }\n return undefined;\n };\n}\n\nexport function anyNode(): AstMatcher<Record<string, unknown>>;\nexport function anyNode<A>(children: AstMatcher<A>): AstMatcher<A>;\nexport function anyNode<A>(children?: AstMatcher<A>): AstMatcher<A> | AstMatcher<any> {\n const realNext = children ?? DONE;\n return (nodes) => {\n for (const node of nodes ?? []) {\n const m = realNext(nodeChildren(node));\n if (m) {\n return m;\n }\n }\n return undefined;\n };\n}\n\n// Does not capture deeper because how would we even represent that?\nexport function allOfType<S extends keyof CapturableNodes, N extends string, A>(\n s: S,\n name: N,\n children?: AstMatcher<A>,\n): AstMatcher<{ [key in N]: Array<CapturableNodes[S]> }> {\n type ArrayType = Array<CapturableNodes[S]>;\n type ReturnType = { [key in N]: ArrayType };\n const realNext = children ?? DONE;\n\n return (nodes) => {\n let ret: ReturnType | undefined;\n for (const node of nodes ?? []) {\n if (node.kind === s) {\n if (realNext(nodeChildren(node))) {\n if (!ret) {\n ret = { [name]: new Array<CapturableNodes[S]>() } as ReturnType;\n }\n ret[name].push(node as any);\n }\n }\n }\n return ret;\n };\n}\n\nexport const DONE: AstMatcher<Record<string, unknown>> = () => ({});\n\n/**\n * Run a matcher against a node and return (or invoke a callback with) the accumulated bindings\n */\nexport function matchAst<A>(node: ts.Node, matcher: AstMatcher<A>): A | undefined;\nexport function matchAst<A>(node: ts.Node, matcher: AstMatcher<A>, cb: (bindings: A) => void): boolean;\nexport function matchAst<A>(\n node: ts.Node,\n matcher: AstMatcher<A>,\n cb?: (bindings: A) => void,\n): boolean | A | undefined {\n const matched = matcher([node]);\n if (cb) {\n if (matched) {\n cb(matched);\n }\n return !!matched;\n }\n return matched;\n}\n\n/**\n * Count the newlines in a given piece of string that aren't in comment blocks\n */\nexport function countNakedNewlines(str: string) {\n let ret = 0;\n for (const s of scanText(str, 0, str.length).filter((r) => r.type === 'other' || r.type === 'blockcomment')) {\n if (s.type === 'other') {\n // Count newlines in non-comments\n for (let i = s.pos; i < s.end; i++) {\n if (str[i] === '\\n') {\n ret++;\n }\n }\n } else {\n // Discount newlines at the end of block comments\n if (s.hasTrailingNewLine) {\n ret--;\n }\n }\n }\n return ret;\n}\n\nexport function repeatNewlines(str: string) {\n return '\\n'.repeat(Math.min(2, countNakedNewlines(str)));\n}\n\nconst WHITESPACE = [' ', '\\t', '\\r', '\\n'];\n\n/**\n * Extract single-line and multi-line comments from the given string\n *\n * Rewritten because I can't get ts.getLeadingComments and ts.getTrailingComments to do what I want.\n */\nexport function extractComments(text: string, start: number): ts.CommentRange[] {\n return scanText(text, start)\n .filter((s) => s.type === 'blockcomment' || s.type === 'linecomment')\n .map(commentRangeFromTextRange);\n}\n\nexport function commentRangeFromTextRange(rng: TextRange): ts.CommentRange {\n return {\n kind: rng.type === 'blockcomment' ? ts.SyntaxKind.MultiLineCommentTrivia : ts.SyntaxKind.SingleLineCommentTrivia,\n pos: rng.pos,\n end: rng.end,\n hasTrailingNewLine: rng.type !== 'blockcomment' && rng.hasTrailingNewLine,\n };\n}\n\ninterface TextRange {\n pos: number;\n end: number;\n type: 'linecomment' | 'blockcomment' | 'other' | 'directive';\n hasTrailingNewLine: boolean;\n}\n\n/**\n * Extract spans of comments and non-comments out of the string\n *\n * Stop at 'end' when given, or the first non-whitespace character in a\n * non-comment if not given.\n */\nexport function scanText(text: string, start: number, end?: number): TextRange[] {\n const ret: TextRange[] = [];\n\n let pos = start;\n const stopAtCode = end === undefined;\n if (end === undefined) {\n end = text.length;\n }\n while (pos < end) {\n const ch = text[pos];\n\n if (WHITESPACE.includes(ch)) {\n pos++;\n continue;\n }\n\n if (ch === '/' && text[pos + 1] === '/') {\n accumulateTextBlock();\n scanSinglelineComment();\n continue;\n }\n\n if (ch === '/' && text[pos + 1] === '*') {\n accumulateTextBlock();\n scanMultilineComment();\n continue;\n }\n\n // Non-whitespace, non-comment, must be regular token. End if we're not scanning\n // to a particular location, otherwise continue.\n if (stopAtCode) {\n break;\n }\n\n pos++;\n }\n\n accumulateTextBlock();\n\n return ret;\n\n function scanMultilineComment() {\n const endOfComment = findNext('*/', pos + 2);\n ret.push({\n type: 'blockcomment',\n hasTrailingNewLine: ['\\n', '\\r'].includes(text[endOfComment + 2]),\n pos,\n end: endOfComment + 2,\n });\n pos = endOfComment + 2;\n start = pos;\n }\n\n function scanSinglelineComment() {\n const nl = Math.min(findNext('\\r', pos + 2), findNext('\\n', pos + 2));\n\n if (text[pos + 2] === '/') {\n // Special /// comment\n ret.push({\n type: 'directive',\n hasTrailingNewLine: true,\n pos: pos + 1,\n end: nl,\n });\n } else {\n // Regular // comment\n ret.push({\n type: 'linecomment',\n hasTrailingNewLine: true,\n pos,\n end: nl,\n });\n }\n pos = nl + 1;\n start = pos;\n }\n\n function accumulateTextBlock() {\n if (pos - start > 0) {\n ret.push({\n type: 'other',\n hasTrailingNewLine: false,\n pos: start,\n end: pos,\n });\n start = pos;\n }\n }\n\n function findNext(sub: string, startPos: number) {\n const f = text.indexOf(sub, startPos);\n if (f === -1) {\n return text.length;\n }\n return f;\n }\n}\n\nconst VOID_SHOW_KEYWORD = 'show';\n\nexport function extractMaskingVoidExpression(node: ts.Node): ts.VoidExpression | undefined {\n const expr = extractVoidExpression(node);\n if (!expr) {\n return undefined;\n }\n if (ts.isStringLiteral(expr.expression) && expr.expression.text === VOID_SHOW_KEYWORD) {\n return undefined;\n }\n return expr;\n}\n\nexport function extractShowingVoidExpression(node: ts.Node): ts.VoidExpression | undefined {\n const expr = extractVoidExpression(node);\n if (!expr) {\n return undefined;\n }\n if (ts.isStringLiteral(expr.expression) && expr.expression.text === VOID_SHOW_KEYWORD) {\n return expr;\n }\n return undefined;\n}\n\n/**\n * Return the string argument to a void expression if it exists\n */\nexport function voidExpressionString(node: ts.VoidExpression): string | undefined {\n if (ts.isStringLiteral(node.expression)) {\n return node.expression.text;\n }\n return undefined;\n}\n\n/**\n * We use void directives as pragmas. Extract the void directives here\n */\nexport function extractVoidExpression(node: ts.Node): ts.VoidExpression | undefined {\n if (ts.isVoidExpression(node)) {\n return node;\n }\n if (ts.isExpressionStatement(node)) {\n return extractVoidExpression(node.expression);\n }\n if (ts.isParenthesizedExpression(node)) {\n return extractVoidExpression(node.expression);\n }\n if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.CommaToken) {\n return extractVoidExpression(node.left);\n }\n return undefined;\n}\n\nexport function quoteStringLiteral(x: string) {\n return x.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\nexport function visibility(x: ts.PropertyLikeDeclaration | ts.FunctionLikeDeclarationBase) {\n const flags = ts.getCombinedModifierFlags(x);\n if (flags & ts.ModifierFlags.Private) {\n return 'private';\n }\n if (flags & ts.ModifierFlags.Protected) {\n return 'protected';\n }\n return 'public';\n}\n\nfunction hasFlag<T extends ts.Declaration>(flag: ts.ModifierFlags) {\n return (x: T) => {\n const flags = ts.getCombinedModifierFlags(x);\n return (flags & flag) !== 0;\n };\n}\n\nexport const isReadOnly = hasFlag<ts.PropertyLikeDeclaration | ts.FunctionLikeDeclarationBase>(\n ts.ModifierFlags.Readonly,\n);\nexport const isExported = hasFlag(ts.ModifierFlags.Export);\nexport const isPrivate = hasFlag(ts.ModifierFlags.Private);\nexport const isProtected = hasFlag(ts.ModifierFlags.Private);\nexport function isPublic(x: ts.Declaration) {\n // In TypeScript, anything not explicitly marked private or protected is public.\n return !isPrivate(x) && !isProtected(x);\n}\nexport const isStatic = hasFlag(ts.ModifierFlags.Static);\n\n/**\n * Return the super() call from a method body if found\n */\nexport function findSuperCall(\n node: ts.Block | ts.Expression | undefined,\n renderer: AstRenderer<any>,\n): ts.SuperCall | undefined {\n if (node === undefined) {\n return undefined;\n }\n if (ts.isCallExpression(node)) {\n if (renderer.textOf(node.expression) === 'super') {\n return node as unknown as ts.SuperCall;\n }\n }\n if (ts.isExpressionStatement(node)) {\n return findSuperCall(node.expression, renderer);\n }\n if (ts.isBlock(node)) {\n for (const statement of node.statements) {\n if (ts.isExpressionStatement(statement)) {\n const s = findSuperCall(statement.expression, renderer);\n if (s) {\n return s;\n }\n }\n }\n }\n return undefined;\n}\n\n/**\n * Return the names of all private property declarations\n */\nexport function privatePropertyNames(members: readonly ts.ClassElement[], renderer: AstRenderer<any>): string[] {\n const props = members.filter((m) => ts.isPropertyDeclaration(m)) as ts.PropertyDeclaration[];\n return props.filter((m) => visibility(m) === 'private').map((m) => renderer.textOf(m.name));\n}\n\nexport function findEnclosingClassDeclaration(node: ts.Node): ts.ClassDeclaration | undefined {\n while (node && !ts.isClassDeclaration(node)) {\n node = node.parent;\n }\n return node;\n}\n"]}
@@ -11,7 +11,7 @@ export interface ImportStatement {
11
11
  readonly imports: FullImport | SelectiveImport;
12
12
  readonly moduleSymbol?: JsiiSymbol;
13
13
  }
14
- export declare type FullImport = {
14
+ export type FullImport = {
15
15
  readonly import: 'full';
16
16
  /**
17
17
  * The name of the namespace prefix in the source code. Used to strip the
@@ -24,7 +24,7 @@ export declare type FullImport = {
24
24
  */
25
25
  readonly alias?: string;
26
26
  };
27
- export declare type SelectiveImport = {
27
+ export type SelectiveImport = {
28
28
  readonly import: 'selective';
29
29
  readonly elements: ImportBinding[];
30
30
  };
@@ -2,9 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.analyzeImportDeclaration = exports.analyzeImportEquals = void 0;
4
4
  const ts = require("typescript");
5
+ const ast_utils_1 = require("./ast-utils");
5
6
  const jsii_utils_1 = require("../jsii/jsii-utils");
6
7
  const util_1 = require("../util");
7
- const ast_utils_1 = require("./ast-utils");
8
8
  function analyzeImportEquals(node, context) {
9
9
  let moduleName = '???';
10
10
  (0, ast_utils_1.matchAst)(node.moduleReference, (0, ast_utils_1.nodeOfType)('ref', ts.SyntaxKind.ExternalModuleReference), (bindings) => {
@@ -54,7 +54,7 @@ function analyzeImportDeclaration(node, context, submoduleReferences) {
54
54
  return [
55
55
  {
56
56
  node,
57
- packageName: [packageName, ...path.map((node) => context.textOf(node))].join('/'),
57
+ packageName: [packageName, ...path.map((n) => context.textOf(n))].join('/'),
58
58
  moduleSymbol,
59
59
  imports: {
60
60
  import: 'full',
@@ -84,7 +84,7 @@ function analyzeImportDeclaration(node, context, submoduleReferences) {
84
84
  omitDirectBinding = false;
85
85
  continue;
86
86
  }
87
- const subPackageName = [packageName, ...match.path.map((node) => node.getText(node.getSourceFile()))].join('/');
87
+ const subPackageName = [packageName, ...match.path.map((n) => n.getText(n.getSourceFile()))].join('/');
88
88
  const importedSymbol = (0, jsii_utils_1.lookupJsiiSymbolFromNode)(context.typeChecker, match.lastNode);
89
89
  const moduleSymbol = (0, util_1.fmap)(importedSymbol, jsii_utils_1.parentSymbol);
90
90
  const importStatement = extraImports.find((stmt) => {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.js","sourceRoot":"","sources":["../../src/typescript/imports.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\nimport { allOfType, matchAst, nodeOfType, stringFromLiteral } from './ast-utils';\nimport { JsiiSymbol, parentSymbol, lookupJsiiSymbolFromNode } from '../jsii/jsii-utils';\nimport { AstRenderer } from '../renderer';\nimport { SubmoduleReferenceMap } from '../submodule-reference';\nimport { fmap } from '../util';\n\n/**\n * Our own unification of import statements\n */\nexport interface ImportStatement {\n readonly node: ts.Node;\n readonly packageName: string;\n readonly imports: FullImport | SelectiveImport;\n readonly moduleSymbol?: JsiiSymbol;\n}\n\nexport type FullImport = {\n readonly import: 'full';\n /**\n * The name of the namespace prefix in the source code. Used to strip the\n * prefix in certain languages (e.g: Java).\n */\n readonly sourceName: string;\n /**\n * The name under which this module is imported. Undefined if the module is\n * not aliased (could be the case for namepsace/submodule imports).\n */\n readonly alias?: string;\n};\n\nexport type SelectiveImport = {\n readonly import: 'selective';\n readonly elements: ImportBinding[];\n};\n\nexport interface ImportBinding {\n readonly sourceName: string;\n\n readonly alias?: string;\n\n /**\n * The JSII Symbol the import refers to\n */\n readonly importedSymbol?: JsiiSymbol;\n}\n\nexport function analyzeImportEquals(node: ts.ImportEqualsDeclaration, context: AstRenderer<any>): ImportStatement {\n let moduleName = '???';\n matchAst(node.moduleReference, nodeOfType('ref', ts.SyntaxKind.ExternalModuleReference), (bindings) => {\n moduleName = stringFromLiteral(bindings.ref.expression);\n });\n\n const sourceName = context.textOf(node.name);\n\n return {\n node,\n packageName: moduleName,\n moduleSymbol: lookupJsiiSymbolFromNode(context.typeChecker, node.name),\n imports: { import: 'full', alias: sourceName, sourceName },\n };\n}\n\nexport function analyzeImportDeclaration(node: ts.ImportDeclaration, context: AstRenderer<any>): ImportStatement;\nexport function analyzeImportDeclaration(\n node: ts.ImportDeclaration,\n context: AstRenderer<any>,\n submoduleReferences: SubmoduleReferenceMap,\n): ImportStatement[];\nexport function analyzeImportDeclaration(\n node: ts.ImportDeclaration,\n context: AstRenderer<any>,\n submoduleReferences?: SubmoduleReferenceMap,\n): ImportStatement | ImportStatement[] {\n const packageName = stringFromLiteral(node.moduleSpecifier);\n\n const starBindings = matchAst(\n node,\n nodeOfType(\n ts.SyntaxKind.ImportDeclaration,\n nodeOfType(ts.SyntaxKind.ImportClause, nodeOfType('namespace', ts.SyntaxKind.NamespaceImport)),\n ),\n );\n\n if (starBindings) {\n const sourceName = context.textOf(starBindings.namespace.name);\n const bareImport: ImportStatement = {\n node,\n packageName,\n moduleSymbol: lookupJsiiSymbolFromNode(context.typeChecker, starBindings.namespace.name),\n imports: {\n import: 'full',\n alias: sourceName,\n sourceName,\n },\n };\n if (submoduleReferences == null) {\n return bareImport;\n }\n\n const rootSymbol = context.typeChecker.getSymbolAtLocation(starBindings.namespace.name);\n const refs = rootSymbol && Array.from(submoduleReferences.values()).filter((ref) => ref.root === rootSymbol);\n // No submodule reference, or only 1 where the path is empty (this is used to signal the use of the bare import so it's not erased)\n if (refs == null || refs.length === 0 || (refs.length === 1 && refs[0].path.length === 0)) {\n return [bareImport];\n }\n\n return refs.flatMap(({ lastNode, path, root, submoduleChain }, idx, array): ImportStatement[] => {\n if (\n array\n .slice(0, idx)\n .some(\n (other) => other.root === root && context.textOf(other.submoduleChain) === context.textOf(submoduleChain),\n )\n ) {\n // This would be a duplicate, so we're skipping it\n return [];\n }\n\n const moduleSymbol = lookupJsiiSymbolFromNode(context.typeChecker, lastNode);\n return [\n {\n node,\n packageName: [packageName, ...path.map((n) => context.textOf(n))].join('/'),\n moduleSymbol,\n imports: {\n import: 'full',\n alias: undefined, // No alias exists in the source text for this...\n sourceName: context.textOf(submoduleChain),\n },\n },\n ];\n });\n }\n\n const namedBindings = matchAst(\n node,\n nodeOfType(\n ts.SyntaxKind.ImportDeclaration,\n nodeOfType(\n ts.SyntaxKind.ImportClause,\n nodeOfType(ts.SyntaxKind.NamedImports, allOfType(ts.SyntaxKind.ImportSpecifier, 'specifiers')),\n ),\n ),\n );\n\n const extraImports = new Array<ImportStatement>();\n const elements: ImportBinding[] = (namedBindings?.specifiers ?? []).flatMap(\n ({ name, propertyName }): ImportBinding[] => {\n // regular import { name }\n // renamed import { propertyName as name }\n const directBinding = {\n sourceName: context.textOf(propertyName ?? name),\n alias: propertyName && context.textOf(name),\n importedSymbol: lookupJsiiSymbolFromNode(context.typeChecker, propertyName ?? name),\n } as const;\n\n if (submoduleReferences != null) {\n const symbol = context.typeChecker.getSymbolAtLocation(name);\n let omitDirectBinding = false;\n for (const match of Array.from(submoduleReferences.values()).filter((ref) => ref.root === symbol)) {\n if (match.path.length === 0) {\n // This is a namespace binding that is used as-is (not via a transitive path). It needs to be preserved.\n omitDirectBinding = false;\n continue;\n }\n const subPackageName = [packageName, ...match.path.map((n) => n.getText(n.getSourceFile()))].join('/');\n const importedSymbol = lookupJsiiSymbolFromNode(context.typeChecker, match.lastNode);\n const moduleSymbol = fmap(importedSymbol, parentSymbol);\n const importStatement =\n extraImports.find((stmt) => {\n if (moduleSymbol != null) {\n return stmt.moduleSymbol === moduleSymbol;\n }\n return stmt.packageName === subPackageName;\n }) ??\n extraImports[\n extraImports.push({\n moduleSymbol,\n node: match.lastNode,\n packageName: subPackageName,\n imports: { import: 'selective', elements: [] },\n }) - 1\n ];\n\n (importStatement.imports as SelectiveImport).elements.push({\n sourceName: context.textOf(match.submoduleChain),\n importedSymbol,\n });\n }\n if (omitDirectBinding) {\n return [];\n }\n }\n\n return [directBinding];\n },\n );\n\n if (submoduleReferences == null) {\n return {\n node,\n packageName,\n imports: { import: 'selective', elements },\n moduleSymbol: fmap(elements?.[0]?.importedSymbol, parentSymbol),\n };\n }\n\n return [\n {\n node,\n packageName,\n imports: { import: 'selective', elements },\n moduleSymbol: fmap(elements?.[0]?.importedSymbol, parentSymbol),\n },\n ...extraImports,\n ];\n}\n"]}
@@ -4,7 +4,7 @@ export declare class SyntaxKindCounter {
4
4
  private readonly visibleSpans;
5
5
  private readonly counter;
6
6
  constructor(visibleSpans: Spans);
7
- countKinds(sourceFile: ts.SourceFile): Record<string, number>;
7
+ countKinds(sourceFile: ts.SourceFile): Partial<Record<ts.SyntaxKind, number>>;
8
8
  private countNode;
9
9
  }
10
10
  //# sourceMappingURL=syntax-kind-counter.d.ts.map
@@ -13,8 +13,7 @@ class SyntaxKindCounter {
13
13
  }
14
14
  countNode(node) {
15
15
  if (this.visibleSpans.containsStartOfNode(node)) {
16
- const value = node.kind.valueOf();
17
- this.counter[value] = this.counter[value] ? this.counter[value] + 1 : 1;
16
+ this.counter[node.kind] = (this.counter[node.kind] ?? 0) + 1;
18
17
  }
19
18
  // The two recursive options produce differing results. `ts.forEachChild()` ignores some unimportant kinds.
20
19
  // `node.getChildren()` goes through all syntax kinds.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax-kind-counter.js","sourceRoot":"","sources":["../../src/typescript/syntax-kind-counter.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AAIjC,MAAa,iBAAiB;IAG5B,YAAoC,YAAmB;QAAnB,iBAAY,GAAZ,YAAY,CAAO;QACrD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;IAEM,UAAU,CAAC,UAAyB;QACzC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEO,SAAS,CAAC,IAAa;QAC7B,IAAI,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE;YAC/C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;SAC9D;QAED,2GAA2G;QAC3G,sDAAsD;QACtD,2EAA2E;QAC3E,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;CACF;AAtBD,8CAsBC","sourcesContent":["import * as ts from 'typescript';\n\nimport { Spans } from './visible-spans';\n\nexport class SyntaxKindCounter {\n private readonly counter: Partial<Record<ts.SyntaxKind, number>>;\n\n public constructor(private readonly visibleSpans: Spans) {\n this.counter = {};\n }\n\n public countKinds(sourceFile: ts.SourceFile): Partial<Record<ts.SyntaxKind, number>> {\n this.countNode(sourceFile);\n return this.counter;\n }\n\n private countNode(node: ts.Node) {\n if (this.visibleSpans.containsStartOfNode(node)) {\n this.counter[node.kind] = (this.counter[node.kind] ?? 0) + 1;\n }\n\n // The two recursive options produce differing results. `ts.forEachChild()` ignores some unimportant kinds.\n // `node.getChildren()` goes through all syntax kinds.\n // see: https://basarat.gitbook.io/typescript/overview/ast/ast-tip-children\n ts.forEachChild(node, (x) => this.countNode(x));\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ts-compiler.js","sourceRoot":"","sources":["../../src/typescript/ts-compiler.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\nexport class TypeScriptCompiler {\n private readonly realHost = ts.createCompilerHost(STANDARD_COMPILER_OPTIONS, true);\n\n /**\n * A compiler-scoped cache to avoid having to re-parse the same library files for every compilation\n */\n private readonly fileCache = new Map<string, ts.SourceFile | undefined>();\n\n public createInMemoryCompilerHost(\n sourcePath: string,\n sourceContents: string,\n currentDirectory?: string,\n ): ts.CompilerHost {\n const realHost = this.realHost;\n const sourceFile = ts.createSourceFile(sourcePath, sourceContents, ts.ScriptTarget.Latest);\n\n return {\n ...realHost,\n fileExists: (filePath) =>\n filePath === sourcePath || this.fileCache.has(filePath) || realHost.fileExists(filePath),\n getCurrentDirectory: currentDirectory != null ? () => currentDirectory : realHost.getCurrentDirectory,\n getSourceFile: (fileName, languageVersion, onError, shouldCreateNewSourceFile) => {\n if (fileName === sourcePath) {\n return sourceFile;\n }\n\n const existing = this.fileCache.get(fileName);\n if (existing) {\n return existing;\n }\n\n const parsed = realHost.getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile);\n this.fileCache.set(fileName, parsed);\n return parsed;\n },\n readFile: (filePath) => (filePath === sourcePath ? sourceContents : realHost.readFile(filePath)),\n writeFile: () => void undefined,\n };\n }\n\n public compileInMemory(filename: string, contents: string, currentDirectory?: string): CompilationResult {\n if (!filename.endsWith('.ts')) {\n // Necessary or the TypeScript compiler won't compile the file.\n filename += '.ts';\n }\n\n const program = ts.createProgram({\n rootNames: [filename],\n options: STANDARD_COMPILER_OPTIONS,\n host: this.createInMemoryCompilerHost(filename, contents, currentDirectory),\n });\n\n const rootFile = program.getSourceFile(filename);\n if (rootFile == null) {\n throw new Error(`Oopsie -- couldn't find root file back: ${filename}`);\n }\n\n return { program, rootFile };\n }\n}\n\nexport interface CompilationResult {\n program: ts.Program;\n rootFile: ts.SourceFile;\n}\n\nexport const STANDARD_COMPILER_OPTIONS: ts.CompilerOptions = {\n alwaysStrict: true,\n charset: 'utf8',\n declaration: true,\n declarationMap: true,\n experimentalDecorators: true,\n inlineSourceMap: true,\n inlineSources: true,\n lib: ['lib.es2020.d.ts'],\n module: ts.ModuleKind.CommonJS,\n noEmitOnError: true,\n noFallthroughCasesInSwitch: true,\n noImplicitAny: true,\n noImplicitReturns: true,\n noImplicitThis: true,\n noUnusedLocals: false, // Important, becomes super annoying without this\n noUnusedParameters: false, // Important, becomes super annoying without this\n resolveJsonModule: true,\n strict: true,\n strictNullChecks: true,\n strictPropertyInitialization: true,\n stripInternal: true,\n target: ts.ScriptTarget.ES2020,\n // Incremental builds\n incremental: true,\n tsBuildInfoFile: '.tsbuildinfo',\n};\n"]}
@@ -3,7 +3,7 @@ import * as ts from 'typescript';
3
3
  * Return the first non-undefined type from a union
4
4
  */
5
5
  export declare function firstTypeInUnion(typeChecker: ts.TypeChecker, type: ts.Type): ts.Type;
6
- export declare type BuiltInType = 'any' | 'boolean' | 'number' | 'string' | 'void';
6
+ export type BuiltInType = 'any' | 'boolean' | 'number' | 'string' | 'void';
7
7
  export declare function builtInTypeName(type: ts.Type): BuiltInType | undefined;
8
8
  export declare function renderType(type: ts.Type): string;
9
9
  export declare function parameterAcceptsUndefined(param: ts.ParameterDeclaration, type?: ts.Type): boolean;
@@ -12,7 +12,7 @@ export declare function parameterAcceptsUndefined(param: ts.ParameterDeclaration
12
12
  */
13
13
  export declare function typeContainsUndefined(type: ts.Type): boolean;
14
14
  export declare function renderTypeFlags(type: ts.Type): string;
15
- export declare type MapAnalysis = {
15
+ export type MapAnalysis = {
16
16
  result: 'nonMap';
17
17
  } | {
18
18
  result: 'map';
@@ -85,7 +85,7 @@ function mapElementType(type, typeChecker) {
85
85
  // Derived map type from object literal: typeof({ k: "value" })
86
86
  // For every property, get the node that created it (PropertyAssignment), and get the type of the initializer of that node
87
87
  const initializerTypes = type.getProperties().map((p) => {
88
- const expression = p.valueDeclaration;
88
+ const expression = p.valueDeclaration ?? p.declarations[0];
89
89
  return typeOfObjectLiteralProperty(typeChecker, expression);
90
90
  });
91
91
  return {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/typescript/types.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\nimport { hasAllFlags, hasAnyFlag, resolveEnumLiteral, resolvedSymbolAtLocation } from '../jsii/jsii-utils';\nimport { isDefined } from '../util';\n\n/**\n * Return the first non-undefined type from a union\n */\nexport function firstTypeInUnion(typeChecker: ts.TypeChecker, type: ts.Type): ts.Type {\n type = typeChecker.getNonNullableType(type);\n\n if (!type.isUnion()) {\n return type;\n }\n\n return type.types[0];\n}\n\nexport type BuiltInType = 'any' | 'boolean' | 'number' | 'string' | 'void';\nexport function builtInTypeName(type: ts.Type): BuiltInType | undefined {\n if (hasAnyFlag(type.flags, ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {\n return 'any';\n }\n if (hasAnyFlag(type.flags, ts.TypeFlags.BooleanLike)) {\n return 'boolean';\n }\n if (hasAnyFlag(type.flags, ts.TypeFlags.NumberLike)) {\n return 'number';\n }\n if (hasAnyFlag(type.flags, ts.TypeFlags.StringLike)) {\n return 'string';\n }\n return undefined;\n}\n\nexport function renderType(type: ts.Type): string {\n if (type.isClassOrInterface()) {\n return type.symbol.name;\n }\n if (type.isLiteral()) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n return `${type.value}`;\n }\n return renderTypeFlags(type);\n}\n\nexport function parameterAcceptsUndefined(param: ts.ParameterDeclaration, type?: ts.Type): boolean {\n if (param.initializer !== undefined) {\n return true;\n }\n if (param.questionToken !== undefined) {\n return true;\n }\n if (type) {\n return typeContainsUndefined(type);\n }\n return false;\n}\n\n/**\n * This is a simplified check that should be good enough for most purposes\n */\nexport function typeContainsUndefined(type: ts.Type): boolean {\n if (type.getFlags() & ts.TypeFlags.Undefined) {\n return true;\n }\n if (type.isUnion()) {\n return type.types.some(typeContainsUndefined);\n }\n return false;\n}\n\nexport function renderTypeFlags(type: ts.Type): string {\n return renderFlags(type.flags, ts.TypeFlags);\n}\n\nexport type MapAnalysis = { result: 'nonMap' } | { result: 'map'; elementType: ts.Type | undefined };\n\n/**\n * If this is a map type, return the type mapped *to* (key must always be `string` anyway).\n */\nexport function mapElementType(type: ts.Type, typeChecker: ts.TypeChecker): MapAnalysis {\n if (hasAnyFlag(type.flags, ts.TypeFlags.Object) && type.symbol) {\n if (type.symbol.name === '__type') {\n // Declared map type: {[k: string]: A}\n return { result: 'map', elementType: type.getStringIndexType() };\n }\n\n if (type.symbol.name === '__object') {\n // Derived map type from object literal: typeof({ k: \"value\" })\n // For every property, get the node that created it (PropertyAssignment), and get the type of the initializer of that node\n const initializerTypes = type.getProperties().map((p) => {\n const expression = p.valueDeclaration ?? p.declarations![0];\n return typeOfObjectLiteralProperty(typeChecker, expression);\n });\n return {\n result: 'map',\n elementType: typeIfSame([...initializerTypes, type.getStringIndexType()].filter(isDefined)),\n };\n }\n }\n\n return { result: 'nonMap' };\n}\n\n/**\n * Try to infer the map element type from the properties if they're all the same\n */\nexport function inferMapElementType(\n elements: readonly ts.ObjectLiteralElementLike[],\n typeChecker: ts.TypeChecker,\n): ts.Type | undefined {\n const types = elements.map((e) => typeOfObjectLiteralProperty(typeChecker, e)).filter(isDefined);\n\n return types.every((t) => isSameType(types[0], t)) ? types[0] : undefined;\n}\n\nfunction typeOfObjectLiteralProperty(typeChecker: ts.TypeChecker, el: ts.Node): ts.Type | undefined {\n if (ts.isPropertyAssignment(el)) {\n return typeOfExpression(typeChecker, el.initializer);\n }\n if (ts.isShorthandPropertyAssignment(el)) {\n return typeOfExpression(typeChecker, el.name);\n }\n return undefined;\n}\n\nfunction isSameType(a: ts.Type, b: ts.Type) {\n return a.flags === b.flags && a.symbol?.name === b.symbol?.name;\n}\n\nfunction typeIfSame(types: Array<ts.Type | undefined>): ts.Type | undefined {\n const ttypes = types.filter(isDefined);\n if (types.length === 0) {\n return undefined;\n }\n\n return ttypes.every((t) => isSameType(ttypes[0], t)) ? ttypes[0] : undefined;\n}\n\n/**\n * If this is an array type, return the element type of the array\n */\nexport function arrayElementType(type: ts.Type): ts.Type | undefined {\n if (type.symbol && type.symbol.name === 'Array') {\n const tr = type as ts.TypeReference;\n return tr.aliasTypeArguments && tr.aliasTypeArguments[0];\n }\n return undefined;\n}\n\nexport function typeOfExpression(typeChecker: ts.TypeChecker, node: ts.Expression) {\n const t = typeChecker.getContextualType(node) ?? typeChecker.getTypeAtLocation(node);\n return resolveEnumLiteral(typeChecker, t);\n}\n\n/**\n * Infer type of expression by the argument it is assigned to\n *\n * If the type of the expression can include undefined (if the value is\n * optional), `undefined` will be removed from the union.\n *\n * (Will return undefined for object literals not unified with a declared type)\n */\nexport function inferredTypeOfExpression(typeChecker: ts.TypeChecker, node: ts.Expression) {\n const type = typeChecker.getContextualType(node);\n return type ? typeChecker.getNonNullableType(type) : undefined;\n}\n\nexport function isNumber(x: any): x is number {\n return typeof x === 'number';\n}\n\nexport function isEnumAccess(typeChecker: ts.TypeChecker, access: ts.PropertyAccessExpression) {\n const symbol = resolvedSymbolAtLocation(typeChecker, access.expression);\n return symbol ? hasAnyFlag(symbol.flags, ts.SymbolFlags.Enum) : false;\n}\n\nexport function isStaticReadonlyAccess(typeChecker: ts.TypeChecker, access: ts.PropertyAccessExpression) {\n const symbol = resolvedSymbolAtLocation(typeChecker, access);\n const decl = symbol?.getDeclarations();\n if (decl && decl[0] && ts.isPropertyDeclaration(decl[0])) {\n const flags = ts.getCombinedModifierFlags(decl[0]);\n return hasAllFlags(flags, ts.ModifierFlags.Readonly | ts.ModifierFlags.Static);\n }\n return false;\n}\n\nexport function renderFlags(flags: number | undefined, flagObject: Record<string, number | string>) {\n if (flags === undefined) {\n return '';\n }\n\n return Object.values(flagObject)\n .filter(isNumber)\n .filter((f) => hasAllFlags(flags, f))\n .map((f) => flagObject[f])\n .join(',');\n}\n\nexport function determineReturnType(typeChecker: ts.TypeChecker, node: ts.SignatureDeclaration): ts.Type | undefined {\n const signature = typeChecker.getSignatureFromDeclaration(node);\n if (!signature) {\n return undefined;\n }\n return typeChecker.getReturnTypeOfSignature(signature);\n}\n"]}
@@ -5,6 +5,12 @@ exports.spanContains = exports.spanInside = exports.trimCompleteSourceToVisible
5
5
  * A class representing a set of non-overlapping Spans.
6
6
  */
7
7
  class Spans {
8
+ /**
9
+ * Derive visible spans from marked source (`/// !show` and `/// !hide` directives).
10
+ */
11
+ static visibleSpansFromSource(source) {
12
+ return new Spans(calculateMarkedSpans(source).filter((s) => s.visible));
13
+ }
8
14
  constructor(_spans) {
9
15
  this._spans = _spans;
10
16
  _spans.sort((a, b) => a.start - b.start);
@@ -26,12 +32,6 @@ class Spans {
26
32
  }
27
33
  }
28
34
  }
29
- /**
30
- * Derive visible spans from marked source (`/// !show` and `/// !hide` directives).
31
- */
32
- static visibleSpansFromSource(source) {
33
- return new Spans(calculateMarkedSpans(source).filter((s) => s.visible));
34
- }
35
35
  get spans() {
36
36
  return this._spans;
37
37
  }