jsii-rosetta 1.76.0 → 4.9.0-dev.1

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 +33 -23
  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
package/bin/jsii-rosetta CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- require('./jsii-rosetta.js');
2
+ require('../lib/main.js');
@@ -0,0 +1,13 @@
1
+ declare module 'semver-intersect' {
2
+ /**
3
+ * Computes the intersection between multiple semver ranges.
4
+ *
5
+ * @param ranges the ranges for which the intersection is requested.
6
+ *
7
+ * @returns the intersection of `ranges`.
8
+ *
9
+ * @throws Error if the intersection is empty.
10
+ */
11
+ function intersect(...ranges: string[]): string;
12
+ }
13
+ //# sourceMappingURL=semver-intersect.d.ts.map
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=semver-intersect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver-intersect.js","sourceRoot":"","sources":["../../src/ambient/semver-intersect.ts"],"names":[],"mappings":"","sourcesContent":["/// Hand-written declaration for the semver-intersect module\ndeclare module 'semver-intersect' {\n /**\n * Computes the intersection between multiple semver ranges.\n *\n * @param ranges the ranges for which the intersection is requested.\n *\n * @returns the intersection of `ranges`.\n *\n * @throws Error if the intersection is empty.\n */\n function intersect(...ranges: string[]): string;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":";;;AAAA,mDAAyD;AACzD,qEAAiE;AACjE,2FAAsF;AAEtF,4CAA2D;AAe3D,SAAgB,iBAAiB,CAC/B,QAAc,EACd,OAAwB,EACxB,OAAiC,EAAE;IAEnC,MAAM,UAAU,GAAG,IAAI,sBAAU,CAAC,KAAK,CAAC,CAAC;IAEzC,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAW,CAAC;IAEvE,MAAM,kBAAkB,GAAG,IAAA,4BAAiB,EAC1C,QAAQ,CAAC,QAAQ,EACjB,IAAI,oCAAgB,EAAE,EACtB,IAAI,yDAA0B,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,SAAS,EAAE,EAAE;QAC3E,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5E,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,kBAAkB,IAAI,EAAE;YACvC,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE,UAAU,CAAC,WAAW;KACpC,CAAC;AACJ,CAAC;AAzBD,8CAyBC","sourcesContent":["import { transformMarkdown } from '../markdown/markdown';\nimport { MarkdownRenderer } from '../markdown/markdown-renderer';\nimport { ReplaceTypeScriptTransform } from '../markdown/replace-typescript-transform';\nimport { AstHandler, AstRendererOptions } from '../renderer';\nimport { TranslateResult, Translator } from '../translate';\nimport { File } from '../util';\n\nexport interface TranslateMarkdownOptions extends AstRendererOptions {\n /**\n * What language to put in the returned markdown blocks\n */\n languageIdentifier?: string;\n\n /**\n * Whether to operate in `strict` mode or not.\n */\n strict?: boolean;\n}\n\nexport function translateMarkdown(\n markdown: File,\n visitor: AstHandler<any>,\n opts: TranslateMarkdownOptions = {},\n): TranslateResult {\n const translator = new Translator(false);\n\n const location = { api: 'file', fileName: markdown.fileName } as const;\n\n const translatedMarkdown = transformMarkdown(\n markdown.contents,\n new MarkdownRenderer(),\n new ReplaceTypeScriptTransform(location, opts.strict ?? false, (tsSnippet) => {\n const translated = translator.translatorFor(tsSnippet).renderUsing(visitor);\n return {\n language: opts.languageIdentifier ?? '',\n source: translated,\n };\n }),\n );\n\n return {\n translation: translatedMarkdown,\n diagnostics: translator.diagnostics,\n };\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/commands/coverage.ts"],"names":[],"mappings":";;;AAAA,mDAAkG;AAClG,sCAAsC;AACtC,8DAA0D;AAC1D,wCAA4C;AAErC,KAAK,UAAU,aAAa,CAAC,iBAAoC;IACtE,OAAO,CAAC,IAAI,CAAC,WAAW,iBAAiB,CAAC,MAAM,aAAa,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,IAAA,2BAAc,EAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,IAAA,kCAAqB,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IAE3E,MAAM,UAAU,GAAG,IAAI,sCAAiB,CAAC;QACvC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC7C,sBAAsB,EAAE,IAAI;KAC7B,CAAC,CAAC;IACH,UAAU,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAA,kCAAqB,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAExF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,MAAM,oBAAoB,CAAC,CAAC;IAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,KAAK,2BAA2B,CAAC,CAAC;IAC7E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3B,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,OAAO,CAAC,UAAU,2BAA2B,CAAC,CAAC;IACvG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,OAAO,CAAC,YAAY,aAAa,CAAC,CAAC;IAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,UAAU,mEAAmE,CAAC,CAAC;IACjH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,OAAO,CAAC,gBAAgB,0BAA0B,CAAC,CAAC;IACjF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,OAAO,CAAC,oBAAoB,4BAA4B,CAAC,CAAC;IACvF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,OAAO,CAAC,eAAe,wBAAwB,CAAC,CAAC;IAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,OAAO,CAAC,iBAAiB,kCAAkC,CAAC,CAAC;IAC1F,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,MAAM,2BAA2B,CAAC,CAAC;IAE/E,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAA,wBAAc,EAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;KACtE;AACH,CAAC;AA7BD,sCA6BC","sourcesContent":["import { loadAssemblies, allTypeScriptSnippets, loadAllDefaultTablets } from '../jsii/assemblies';\nimport * as logging from '../logging';\nimport { RosettaTranslator } from '../rosetta-translator';\nimport { formatLocation } from '../snippet';\n\nexport async function checkCoverage(assemblyLocations: readonly string[]): Promise<void> {\n logging.info(`Loading ${assemblyLocations.length} assemblies`);\n const assemblies = loadAssemblies(assemblyLocations, false);\n\n const snippets = Array.from(await allTypeScriptSnippets(assemblies, true));\n\n const translator = new RosettaTranslator({\n assemblies: assemblies.map((a) => a.assembly),\n allowDirtyTranslations: true,\n });\n translator.addTabletsToCache(...Object.values(await loadAllDefaultTablets(assemblies)));\n\n process.stdout.write(`- ${snippets.length} total snippets.\\n`);\n process.stdout.write(`- ${translator.cache.count} translations in cache.\\n`);\n process.stdout.write('\\n');\n\n const results = translator.readFromCache(snippets, true, true);\n process.stdout.write(`- ${results.translations.length - results.dirtyCount} successful cache hits.\\n`);\n process.stdout.write(` ${results.infusedCount} infused.\\n`);\n process.stdout.write(`- ${results.dirtyCount} translations in cache but dirty (ok for pacmak, transliterate)\\n`);\n process.stdout.write(` ${results.dirtySourceCount} sources have changed.\\n`);\n process.stdout.write(` ${results.dirtyTranslatorCount} translator has changed.\\n`);\n process.stdout.write(` ${results.dirtyTypesCount} types have changed.\\n`);\n process.stdout.write(` ${results.dirtyDidntCompile} did not successfully compile.\\n`);\n process.stdout.write(`- ${results.remaining.length} snippets untranslated.\\n`);\n\n for (const remaining of results.remaining) {\n process.stdout.write(` ${formatLocation(remaining.location)}\\n`);\n }\n}\n"]}
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.extractSnippets = exports.extractAndInfuse = void 0;
4
- const path = require("path");
4
+ const path = require("node:path");
5
+ const infuse_1 = require("./infuse");
5
6
  const assemblies_1 = require("../jsii/assemblies");
6
7
  const logging = require("../logging");
7
8
  const rosetta_translator_1 = require("../rosetta-translator");
@@ -9,7 +10,6 @@ const snippet_1 = require("../snippet");
9
10
  const key_1 = require("../tablets/key");
10
11
  const tablets_1 = require("../tablets/tablets");
11
12
  const util_1 = require("../util");
12
- const infuse_1 = require("./infuse");
13
13
  async function extractAndInfuse(assemblyLocations, options) {
14
14
  const result = await extractSnippets(assemblyLocations, options);
15
15
  await (0, infuse_1.infuse)(assemblyLocations, {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'node:path';\n\nimport { infuse } from './infuse';\nimport {\n loadAssemblies,\n allTypeScriptSnippets,\n loadAllDefaultTablets,\n compressedTabletExists,\n} from '../jsii/assemblies';\nimport * as logging from '../logging';\nimport { RosettaTranslator, RosettaTranslatorOptions } from '../rosetta-translator';\nimport { TypeScriptSnippet, SnippetParameters } from '../snippet';\nimport { snippetKey } from '../tablets/key';\nimport { LanguageTablet, DEFAULT_TABLET_NAME, DEFAULT_TABLET_NAME_COMPRESSED } from '../tablets/tablets';\nimport { RosettaDiagnostic } from '../translate';\nimport { groupBy, isDefined } from '../util';\n\nexport interface ExtractResult {\n diagnostics: RosettaDiagnostic[];\n tablet: LanguageTablet;\n}\n\nexport interface ExtractOptions {\n readonly includeCompilerDiagnostics?: boolean;\n readonly validateAssemblies?: boolean;\n readonly only?: string[];\n\n /**\n * A tablet file to be loaded and used as a source for caching\n */\n readonly cacheFromFile?: string;\n\n /**\n * A tablet file to append translated snippets to\n */\n readonly cacheToFile?: string;\n\n /**\n * Trim cache to only contain translations found in the current assemblies\n *\n * @default false\n */\n readonly trimCache?: boolean;\n\n /**\n * Write translations to implicit tablets (`.jsii.tabl.json`)\n *\n * @default true\n */\n readonly writeToImplicitTablets?: boolean;\n\n /**\n * What directory to compile the samples in\n *\n * @default - Rosetta manages the compilation directory\n * @deprecated Samples declare their own dependencies instead\n */\n readonly compilationDirectory?: string;\n\n /**\n * Make a translator (just for testing)\n */\n readonly translatorFactory?: (opts: RosettaTranslatorOptions) => RosettaTranslator;\n\n /**\n * Turn on 'loose mode' or not\n *\n * Loose mode ignores failures during fixturizing, and undoes 'strict mode' for\n * diagnostics.\n *\n * @default false\n */\n readonly loose?: boolean;\n\n /**\n * Accept dirty translations from the cache\n *\n * @default false\n */\n readonly allowDirtyTranslations?: boolean;\n\n /**\n * Compress the implicit tablet files.\n *\n * @default - preserves the original compression status of each individual implicit tablet file.\n */\n readonly compressTablet?: boolean;\n\n /**\n * Compress the cacheToFile tablet.\n *\n * @default false\n */\n readonly compressCacheToFile?: boolean;\n}\n\nexport async function extractAndInfuse(assemblyLocations: string[], options: ExtractOptions): Promise<ExtractResult> {\n const result = await extractSnippets(assemblyLocations, options);\n await infuse(assemblyLocations, {\n cacheFromFile: options.cacheFromFile,\n cacheToFile: options.cacheToFile,\n compressCacheToFile: options.compressCacheToFile,\n });\n return result;\n}\n\n/**\n * Extract all samples from the given assemblies into a tablet\n */\nexport async function extractSnippets(\n assemblyLocations: readonly string[],\n options: ExtractOptions = {},\n): Promise<ExtractResult> {\n const only = options.only ?? [];\n\n logging.info(`Loading ${assemblyLocations.length} assemblies`);\n const assemblies = loadAssemblies(assemblyLocations, options.validateAssemblies ?? false);\n\n let snippets = Array.from(await allTypeScriptSnippets(assemblies, options.loose));\n if (only.length > 0) {\n snippets = filterSnippets(snippets, only);\n }\n\n // Map every assembly to a list of snippets, so that we know what implicit\n // tablet to write the translations to later on.\n const snippetsPerAssembly = groupBy(\n snippets.map((s) => ({ key: snippetKey(s), location: projectDirectory(s) })),\n (x) => x.location,\n );\n\n const translatorOptions: RosettaTranslatorOptions = {\n includeCompilerDiagnostics: options.includeCompilerDiagnostics ?? false,\n assemblies: assemblies.map((a) => a.assembly),\n allowDirtyTranslations: options.allowDirtyTranslations,\n };\n\n const translator = options.translatorFactory\n ? options.translatorFactory(translatorOptions)\n : new RosettaTranslator(translatorOptions);\n\n // Prime the snippet cache with:\n // - Cache source file\n // - Default tablets found next to each assembly\n if (options.cacheFromFile) {\n await translator.addToCache(options.cacheFromFile);\n }\n translator.addTabletsToCache(...Object.values(await loadAllDefaultTablets(assemblies)));\n\n if (translator.hasCache()) {\n const { translations, remaining } = translator.readFromCache(snippets, true, options.includeCompilerDiagnostics);\n logging.info(`Reused ${translations.length} translations from cache`);\n snippets = remaining;\n }\n\n const diagnostics = [];\n if (snippets.length > 0) {\n logging.info('Translating');\n const startTime = Date.now();\n\n const result = await translator.translateAll(snippets);\n\n const delta = (Date.now() - startTime) / 1000;\n logging.info(\n `Translated ${snippets.length} snippets in ${delta} seconds (${(delta / snippets.length).toPrecision(\n 3,\n )}s/snippet)`,\n );\n diagnostics.push(...result.diagnostics);\n } else {\n logging.info('Nothing left to translate');\n }\n\n // Save to individual tablet files\n if (options.writeToImplicitTablets ?? true) {\n await Promise.all(\n Object.entries(snippetsPerAssembly).map(async ([location, snips]) => {\n // Compress the implicit tablet if explicitly asked to, otherwise compress only if the original tablet was compressed.\n const compressedTablet = options.compressTablet ?? compressedTabletExists(location);\n\n const asmTabletFile = path.join(\n location,\n compressedTablet ? DEFAULT_TABLET_NAME_COMPRESSED : DEFAULT_TABLET_NAME,\n );\n logging.debug(`Writing ${snips.length} translations to ${asmTabletFile}`);\n const translations = snips.map(({ key }) => translator.tablet.tryGetSnippet(key)).filter(isDefined);\n\n const asmTablet = new LanguageTablet();\n asmTablet.addSnippets(...translations);\n await asmTablet.save(asmTabletFile, compressedTablet);\n }),\n );\n }\n\n // optionally append to the output file\n if (options.cacheToFile) {\n logging.info(`Adding translations to ${options.cacheToFile}`);\n const output = options.trimCache\n ? new LanguageTablet()\n : await LanguageTablet.fromOptionalFile(options.cacheToFile);\n output.addTablets(translator.tablet);\n await output.save(options.cacheToFile, options.compressCacheToFile);\n }\n\n return { diagnostics, tablet: translator.tablet };\n}\n\n/**\n * Only yield the snippets whose id exists in a whitelist\n */\nfunction filterSnippets(ts: TypeScriptSnippet[], includeIds: string[]) {\n return ts.filter((t) => includeIds.includes(snippetKey(t)));\n}\n\nfunction projectDirectory(ts: TypeScriptSnippet) {\n const dir = ts.parameters?.[SnippetParameters.$PROJECT_DIRECTORY];\n if (!dir) {\n throw new Error(`Snippet does not have associated project directory: ${JSON.stringify(ts.location)}`);\n }\n return dir;\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.infuse = exports.DEFAULT_INFUSION_RESULTS_NAME = void 0;
4
+ const fs = require("node:fs");
5
+ const path = require("node:path");
4
6
  const spec = require("@jsii/spec");
5
7
  const spec_1 = require("@jsii/spec");
6
- const fs = require("fs");
7
- const path = require("path");
8
8
  const assemblies_1 = require("../jsii/assemblies");
9
9
  const snippet_1 = require("../snippet");
10
10
  const snippet_selectors_1 = require("../snippet-selectors");
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infuse.js","sourceRoot":"","sources":["../../src/commands/infuse.ts"],"names":[],"mappings":";;;AAAA,8BAA8B;AAC9B,kCAAkC;AAClC,mCAAmC;AACnC,qCAA6C;AAE7C,mDAAkH;AAClH,wCAAmE;AACnE,4DAA4F;AAC5F,wCAA4C;AAC5C,gDAK4B;AAC5B,kCAAqD;AA8BxC,QAAA,6BAA6B,GAAG,uBAAuB,CAAC;AAErE,MAAM,oBAAoB,GAAoC,EAAE,UAAU,EAAV,8BAAU,EAAE,QAAQ,EAAR,4BAAQ,EAAE,OAAO,EAAP,2BAAO,EAAE,CAAC;AAEhG,MAAM,aAAa;IAAnB;QACkB,UAAK,GAAwB,EAAE,CAAC;IAQlD,CAAC;IANQ,GAAG,CAAC,GAAW,EAAE,KAAQ;QAC9B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;SACtB;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AAED;;;GAGG;AACI,KAAK,UAAU,MAAM,CAAC,iBAA2B,EAAE,OAAuB;IAC/E,IAAI,MAAM,GAA+B,SAAS,CAAC;IACnD,IAAI,OAAO,EAAE,OAAO,EAAE;QACpB,sDAAsD;QACtD,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACtE,SAAS,CAAC,MAAM,CAAC,CAAC;KACnB;IAED,kCAAkC;IAClC,MAAM,UAAU,GAAG,IAAA,2BAAc,EAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG,MAAM,IAAA,kCAAqB,EAAC,UAAU,CAAC,CAAC;IAE/D,MAAM,qBAAqB,GAAG,IAAI,wBAAc,EAAE,CAAC;IACnD,IAAI,OAAO,EAAE,aAAa,EAAE;QAC1B,qBAAqB,CAAC,SAAS,CAAC,MAAM,wBAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;KAC/F;IACD,qBAAqB,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IAEnE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,GAAG,MAAM,uBAAuB,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IAE/G,MAAM,sBAAsB,GAAG,OAAO,EAAE,WAAW;QACjD,CAAC,CAAC,MAAM,wBAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC;QAC7D,CAAC,CAAC,IAAI,wBAAc,EAAE,CAAC;IAEzB,MAAM,eAAe,GAAG,IAAA,aAAM,EAC5B,MAAM,OAAO,CAAC,GAAG,CACf,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;QAC/C,MAAM,EAAE,KAAK,CAAC,OAAO,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC;QAE7C,MAAM,cAAc,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAClC,SAAS,EACT,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,wCAA8B,CAAC,CAAC,CAAC,6BAAmB,CACvF,CAAC;QACF,IAAI,CAAC,cAAc,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;SACrD;QAED,IAAI,gBAAgB,GAAG,CAAC,CAAC;QACzB,MAAM,aAAa,GAAG,6BAA6B,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC1E,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;YAC3D,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,SAAS,EAAE;gBACd,SAAS;aACV;YAED,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7C,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAC,CAAC;YACjF,gBAAgB,EAAE,CAAC;SACpB;QAED,IAAI,gBAAgB,GAAG,CAAC,EAAE;YACxB,iDAAiD;YACjD,4CAA4C;YAC5C,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChB,IAAA,sBAAe,EAAC,QAAQ,EAAE,SAAS,CAAC;gBACpC,cAAc,CAAC,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC,gBAAgB,CAAC;aACzE,CAAC,CAAC;SACJ;QAED,OAAO;YACL,SAAS;YACT;gBACE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM;gBACxC,yBAAyB,EAAE,gBAAgB;aAC7B;SACR,CAAC;IACb,CAAC,CAAC,CACH,CACF,CAAC;IAEF,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB,oFAAoF;IACpF,uFAAuF;IACvF,IAAI,OAAO,EAAE,WAAW,EAAE;QACxB,MAAM,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;KACrF;IAED,OAAO;QACL,eAAe,EAAE,eAAe;KACjC,CAAC;AACJ,CAAC;AAnFD,wBAmFC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,OAA4B,EAAE,SAA0B;IAChG,MAAM,UAAU,GAAG,IAAA,wBAAI,EAAC,OAAO,CAAC,CAAC;IACjC,IAAI,SAAS,EAAE;QACb,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,CAAU,CAAC,CAAC;QACxG,MAAM,oBAAoB,GAAG;YAC3B,GAAG,QAAQ,CAAC,QAAQ,CAAC;YACrB,IAAI,EAAE,UAAU;SACjB,CAAC;QACF,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC;KACtE;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,SAAS,CAAC,MAAsB;IACvC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1B,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CACV,wGAAwG,CACzG,CAAC;IACF,MAAM,CAAC,KAAK,CACV,2GAA2G,CAC5G,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,eAAe,CAAC,OAA0C;IACjE,MAAM,KAAK,GAAG,IAAI,aAAa,EAAU,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAClD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC7C;IACD,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC;AAED,SAAS,SAAS,CAAC,MAAkC,EAAE,OAAe,EAAE,YAAsC;IAC5G,MAAM,EAAE,KAAK,CAAC,OAAO,OAAO,SAAS,CAAC,CAAC;IACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;QACvD,MAAM,EAAE,KAAK,CAAC,4BAA4B,KAAK,CAAC,QAAQ,EAAE,eAAe,GAAG,kBAAkB,CAAC,CAAC;KACjG;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC7D,MAAM,EAAE,KAAK,CAAC,+BAA+B,CAAC,CAAC;KAChD;AACH,CAAC;AAED,SAAS,6BAA6B,CAAC,KAAmC;IACxE,MAAM,aAAa,GAA8B,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACnD,iDAAiD;QACjD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC3D,SAAS;SACV;QACD,sBAAsB;QACtB,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,KAAK,SAAS,EAAE;YACpC,SAAS;SACV;QACD,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;KAC/B;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CACpB,OAA0B,EAC1B,QAAuC,EACvC,IAAe,EACf,OAAyB;IAEzB,MAAM,UAAU,GAAG;QACjB,GAAG,QAAQ,EAAE,UAAU;QACvB,OAAO,EAAE,EAAE;KACZ,CAAC;IACF,8EAA8E;IAC9E,MAAM,eAAe,GAAG,IAAA,4BAAkB,EAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAE7D,IAAI,IAAI,CAAC,IAAI,EAAE;QACb,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC;KAC7D;SAAM;QACL,IAAI,CAAC,IAAI,GAAG;YACV,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM;YACtC,MAAM,EAAE,EAAE,eAAe,EAAE;SAC5B,CAAC;KACH;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,MAAM,CAAC,UAAU,CACf,OAAO,CAAC,YAAY,CAAC;YACnB,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;YACnC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;SAC5B,CAAC,CACH,CAAC;KACH;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,uBAAuB,CAAC,IAA+B,EAAE,kBAAkC;IACxG,MAAM,GAAG,GAAG,IAAI,aAAa,EAAqB,CAAC;IAEnD,MAAM,cAAc,GAAG,IAAA,cAAO,EAAC,MAAM,IAAA,kCAAqB,EAAC,IAAI,CAAC,EAAE,gBAAU,CAAC,CAAC;IAE9E,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;SAC7C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;SACnD,MAAM,CAAC,gBAAS,CAAC,CAAC;IAErB,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE;QAChC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,EAAE;YACpD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SACrB;KACF;IAED,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,QAAQ,CAAI,EAA+B;IAClD,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KACd;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as spec from '@jsii/spec';\nimport { replaceAssembly } from '@jsii/spec';\n\nimport { loadAssemblies, loadAllDefaultTablets, LoadedAssembly, allTypeScriptSnippets } from '../jsii/assemblies';\nimport { renderMetadataline, TypeScriptSnippet } from '../snippet';\nimport { SnippetSelector, mean, meanLength, shortest, longest } from '../snippet-selectors';\nimport { snippetKey } from '../tablets/key';\nimport {\n LanguageTablet,\n TranslatedSnippet,\n DEFAULT_TABLET_NAME,\n DEFAULT_TABLET_NAME_COMPRESSED,\n} from '../tablets/tablets';\nimport { isDefined, mkDict, indexBy } from '../util';\n\nexport interface InfuseResult {\n readonly coverageResults: Record<string, InfuseTypes>;\n}\n\nexport interface InfuseTypes {\n readonly types: number;\n readonly typesWithInsertedExamples: number;\n}\n\nexport interface InfuseOptions {\n readonly logFile?: string;\n\n /**\n * Where to read additional translations\n */\n readonly cacheFromFile?: string;\n\n /**\n * In addition to the implicit tablets, also write all added examples to this additional output tablet\n */\n readonly cacheToFile?: string;\n\n /**\n * Compress the cacheToFile\n */\n readonly compressCacheToFile?: boolean;\n}\n\nexport const DEFAULT_INFUSION_RESULTS_NAME = 'infusion-results.html';\n\nconst ADDITIONAL_SELECTORS: Record<string, SnippetSelector> = { meanLength, shortest, longest };\n\nclass DefaultRecord<A> {\n public readonly index: Record<string, A[]> = {};\n\n public add(key: string, value: A) {\n if (!this.index[key]) {\n this.index[key] = [];\n }\n this.index[key].push(value);\n }\n}\n\n/**\n * Infuse will analyze the snippets in a set of tablets, and update the assembly to add\n * examples to types that don't have any yet, based on snippets that use the given type.\n */\nexport async function infuse(assemblyLocations: string[], options?: InfuseOptions): Promise<InfuseResult> {\n let stream: fs.WriteStream | undefined = undefined;\n if (options?.logFile) {\n // Create stream for html file and insert some styling\n stream = fs.createWriteStream(options.logFile, { encoding: 'utf-8' });\n startFile(stream);\n }\n\n // Load tablet file and assemblies\n const assemblies = loadAssemblies(assemblyLocations, false);\n const defaultTablets = await loadAllDefaultTablets(assemblies);\n\n const availableTranslations = new LanguageTablet();\n if (options?.cacheFromFile) {\n availableTranslations.addTablet(await LanguageTablet.fromOptionalFile(options.cacheFromFile));\n }\n availableTranslations.addTablets(...Object.values(defaultTablets));\n\n const { translationsByFqn, originalsByKey } = await availableSnippetsPerFqn(assemblies, availableTranslations);\n\n const additionalOutputTablet = options?.cacheToFile\n ? await LanguageTablet.fromOptionalFile(options?.cacheToFile)\n : new LanguageTablet();\n\n const coverageResults = mkDict(\n await Promise.all(\n assemblies.map(async ({ assembly, directory }) => {\n stream?.write(`<h1>${assembly.name}</h1>\\n`);\n\n const implicitTablet = defaultTablets[directory];\n const implicitTabletFile = path.join(\n directory,\n implicitTablet.compressedSource ? DEFAULT_TABLET_NAME_COMPRESSED : DEFAULT_TABLET_NAME,\n );\n if (!implicitTablet) {\n throw new Error(`No tablet found for ${directory}`);\n }\n\n let insertedExamples = 0;\n const filteredTypes = filterForTypesWithoutExamples(assembly.types ?? {});\n for (const [typeFqn, type] of Object.entries(filteredTypes)) {\n const available = translationsByFqn[typeFqn];\n if (!available) {\n continue;\n }\n\n const example = pickBestExample(typeFqn, available, stream);\n const original = originalsByKey[example.key];\n insertExample(example, original, type, [implicitTablet, additionalOutputTablet]);\n insertedExamples++;\n }\n\n if (insertedExamples > 0) {\n // Save the updated assembly and implicit tablets\n // eslint-disable-next-line no-await-in-loop\n await Promise.all([\n replaceAssembly(assembly, directory),\n implicitTablet.save(implicitTabletFile, implicitTablet.compressedSource),\n ]);\n }\n\n return [\n directory,\n {\n types: Object.keys(filteredTypes).length,\n typesWithInsertedExamples: insertedExamples,\n } as InfuseTypes,\n ] as const;\n }),\n ),\n );\n\n stream?.close();\n\n // If we copied examples onto different types, we'll also have inserted new snippets\n // with different keys into the tablet. We must now write the updated tablet somewhere.\n if (options?.cacheToFile) {\n await additionalOutputTablet.save(options.cacheToFile, options.compressCacheToFile);\n }\n\n return {\n coverageResults: coverageResults,\n };\n}\n\nfunction pickBestExample(typeFqn: string, choices: TranslatedSnippet[], logStream?: fs.WriteStream) {\n const meanResult = mean(choices);\n if (logStream) {\n const selected = Object.entries(ADDITIONAL_SELECTORS).map(([name, fn]) => [name, fn(choices)] as const);\n const selectedFromSelector = {\n ...makeDict(selected),\n mean: meanResult,\n };\n logOutput(logStream, typeFqn, createHtmlEntry(selectedFromSelector));\n }\n return meanResult;\n}\n\nfunction startFile(stream: fs.WriteStream) {\n stream.write('<style>\\n');\n stream.write('h2 { color: blue; clear: both; }\\n');\n stream.write('h1 { color: red; clear: both; }\\n');\n stream.write(\n 'div { float: left; height: 31em; width: 22em; overflow: auto; margin: 1em; background-color: #ddd; }\\n',\n );\n stream.write(\n 'pre { float: left; height: 30em; width: 25em; overflow: auto; padding: 0.5em; background-color: #ddd; }\\n',\n );\n stream.write('</style>\\n');\n}\n\nfunction createHtmlEntry(results: Record<string, TranslatedSnippet>): Record<string, string[]> {\n const entry = new DefaultRecord<string>();\n for (const [key, value] of Object.entries(results)) {\n entry.add(value.originalSource.source, key);\n }\n return entry.index;\n}\n\nfunction logOutput(stream: fs.WriteStream | undefined, typeFqn: string, algorithmMap: Record<string, string[]>) {\n stream?.write(`<h2>${typeFqn}</h2>\\n`);\n for (const [key, value] of Object.entries(algorithmMap)) {\n stream?.write(`<div class=\"snippet\"><h3>${value.toString()}</h3>\\n<pre>${key}</pre>\\n</div>\\n`);\n }\n for (let i = 0; i < 4 - Object.keys(algorithmMap).length; i++) {\n stream?.write('<div class=\"padding\"></div>\\n');\n }\n}\n\nfunction filterForTypesWithoutExamples(types: { [fqn: string]: spec.Type }): Record<string, spec.Type> {\n const filteredTypes: Record<string, spec.Type> = {};\n for (const [typeFqn, type] of Object.entries(types)) {\n // Ignore Interfaces that contain only properties\n if (type.kind === spec.TypeKind.Interface && !type.datatype) {\n continue;\n }\n // Already has example\n if (type.docs?.example !== undefined) {\n continue;\n }\n filteredTypes[typeFqn] = type;\n }\n return filteredTypes;\n}\n\n/**\n * Insert an example into the docs of a type, and insert it back into the tablet under a new key\n */\nfunction insertExample(\n example: TranslatedSnippet,\n original: TypeScriptSnippet | undefined,\n type: spec.Type,\n tablets: LanguageTablet[],\n): void {\n const parameters = {\n ...original?.parameters,\n infused: '',\n };\n // exampleMetadata should always be nonempty since we always have a parameter.\n const exampleMetadata = renderMetadataline(parameters) ?? '';\n\n if (type.docs) {\n type.docs.example = example.originalSource.source;\n type.docs.custom = { ...type.docs.custom, exampleMetadata };\n } else {\n type.docs = {\n example: example.originalSource.source,\n custom: { exampleMetadata },\n };\n }\n\n for (const tablet of tablets) {\n tablet.addSnippet(\n example.withLocation({\n api: { api: 'type', fqn: type.fqn },\n field: { field: 'example' },\n }),\n );\n }\n}\n\n/**\n * Return a map of FQN -> snippet keys that exercise that FQN.\n *\n * For a snippet to qualify, it must both:\n *\n * a) be current (i.e.: exist in the input assemblies)\n * b) have been analyzed (i.e.: exist in one of the translated tablets)\n *\n * Returns a map of fqns to a list of keys that represent snippets that include the fqn.\n */\nasync function availableSnippetsPerFqn(asms: readonly LoadedAssembly[], translationsTablet: LanguageTablet) {\n const ret = new DefaultRecord<TranslatedSnippet>();\n\n const originalsByKey = indexBy(await allTypeScriptSnippets(asms), snippetKey);\n\n const translations = Object.keys(originalsByKey)\n .map((key) => translationsTablet.tryGetSnippet(key))\n .filter(isDefined);\n\n for (const trans of translations) {\n for (const fqn of trans.snippet.fqnsReferenced ?? []) {\n ret.add(fqn, trans);\n }\n }\n\n return { originalsByKey, translationsByFqn: ret.index };\n}\n\nfunction makeDict<A>(xs: Array<readonly [string, A]>): Record<string, A> {\n const ret: Record<string, A> = {};\n for (const [str, a] of xs) {\n ret[str] = a;\n }\n return ret;\n}\n"]}
@@ -16,9 +16,9 @@ async function readTablet(tabletFile, key, lang) {
16
16
  listSnippets();
17
17
  }
18
18
  function listSnippets() {
19
- for (const key of tab.snippetKeys) {
20
- process.stdout.write(`${snippetHeader(key)}\n`);
21
- displaySnippet(tab.tryGetSnippet(key));
19
+ for (const k of tab.snippetKeys) {
20
+ process.stdout.write(`${snippetHeader(k)}\n`);
21
+ displaySnippet(tab.tryGetSnippet(k));
22
22
  process.stdout.write('\n');
23
23
  }
24
24
  }
@@ -42,9 +42,9 @@ async function readTablet(tabletFile, key, lang) {
42
42
  if (original !== undefined) {
43
43
  displayTranslation(original);
44
44
  }
45
- for (const lang of snippet.languages) {
46
- process.stdout.write(`${languageHeader(lang)}\n`);
47
- displayTranslation(snippet.get(lang));
45
+ for (const l of snippet.languages) {
46
+ process.stdout.write(`${languageHeader(l)}\n`);
47
+ displayTranslation(snippet.get(l));
48
48
  }
49
49
  }
50
50
  function displayTranslation(translation) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/commands/read.ts"],"names":[],"mappings":"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","sourcesContent":["import { TargetLanguage } from '../languages';\nimport { LanguageTablet, TranslatedSnippet, Translation } from '../tablets/tablets';\n\nexport async function readTablet(tabletFile: string, key?: string, lang?: string) {\n const tab = new LanguageTablet();\n await tab.load(tabletFile);\n\n if (key !== undefined) {\n const snippet = tab.tryGetSnippet(key);\n if (snippet === undefined) {\n throw new Error(`No such snippet: ${key}`);\n }\n displaySnippet(snippet);\n } else {\n listSnippets();\n }\n\n function listSnippets() {\n for (const k of tab.snippetKeys) {\n process.stdout.write(`${snippetHeader(k)}\\n`);\n displaySnippet(tab.tryGetSnippet(k)!);\n process.stdout.write('\\n');\n }\n }\n\n function displaySnippet(snippet: TranslatedSnippet) {\n if (snippet.snippet.didCompile !== undefined) {\n process.stdout.write(`Compiled: ${snippet.snippet.didCompile}\\n`);\n }\n\n if (lang !== undefined) {\n const translation = snippet.get(lang as TargetLanguage);\n if (translation === undefined) {\n throw new Error(`No translation for ${lang} in snippet ${snippet.key}`);\n }\n displayTranslation(translation);\n } else {\n listTranslations(snippet);\n }\n }\n\n function listTranslations(snippet: TranslatedSnippet) {\n const original = snippet.originalSource;\n if (original !== undefined) {\n displayTranslation(original);\n }\n\n for (const l of snippet.languages) {\n process.stdout.write(`${languageHeader(l)}\\n`);\n displayTranslation(snippet.get(l)!);\n }\n }\n\n function displayTranslation(translation: Translation) {\n process.stdout.write(`${translation.source}\\n`);\n }\n}\n\nfunction snippetHeader(key: string) {\n return center(` ${key} `, 100, '=');\n}\n\nfunction languageHeader(key: string) {\n return center(` ${key} `, 30, '-');\n}\n\nfunction center(str: string, n: number, fill: string) {\n const before = Math.floor((n - str.length) / 2);\n const after = Math.ceil((n - str.length) / 2);\n\n return fill.repeat(Math.max(before, 0)) + str + fill.repeat(Math.max(after, 0));\n}\n"]}
@@ -1,14 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.transliterateAssembly = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
4
6
  const spec_1 = require("@jsii/spec");
5
- const fs_1 = require("fs");
6
- const path_1 = require("path");
7
+ const extract_1 = require("./extract");
7
8
  const target_language_1 = require("../languages/target-language");
8
9
  const logging_1 = require("../logging");
9
10
  const rosetta_reader_1 = require("../rosetta-reader");
10
11
  const snippet_1 = require("../snippet");
11
- const extract_1 = require("./extract");
12
12
  /**
13
13
  * Prepares transliterated versions of the designated assemblies into the
14
14
  * selected taregt languages.
@@ -63,7 +63,7 @@ async function transliterateAssembly(assemblyLocations, targetLanguages, options
63
63
  transliterateType(type, rosetta, language);
64
64
  }
65
65
  // eslint-disable-next-line no-await-in-loop
66
- await fs_1.promises.writeFile((0, path_1.resolve)(options?.outdir ?? location, `${spec_1.SPEC_FILE_NAME}.${language}`), JSON.stringify(result, null, 2));
66
+ await node_fs_1.promises.writeFile((0, node_path_1.resolve)(options?.outdir ?? location, `${spec_1.SPEC_FILE_NAME}.${language}`), JSON.stringify(result, null, 2));
67
67
  const then = new Date().getTime();
68
68
  (0, logging_1.debug)(`Done transliterating ${result.name}@${result.version} to ${language} after ${then - now} milliseconds`);
69
69
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transliterate.js","sourceRoot":"","sources":["../../src/commands/transliterate.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Assembly, Docs, SPEC_FILE_NAME, Type, TypeKind, loadAssemblyFromPath } from '@jsii/spec';\n\nimport { extractSnippets } from './extract';\nimport { TargetLanguage } from '../languages';\nimport { targetName } from '../languages/target-language';\nimport { debug } from '../logging';\nimport { RosettaTabletReader, UnknownSnippetMode } from '../rosetta-reader';\nimport { typeScriptSnippetFromVisibleSource, ApiLocation } from '../snippet';\nimport { Mutable } from '../util';\n\nexport interface TransliterateAssemblyOptions {\n /**\n * Whether to ignore any missing fixture files or literate markdown documents\n * referenced by the assembly, instead of failing.\n *\n * @default false\n */\n readonly loose?: boolean;\n\n /**\n * Whether transliteration should fail upon failing to compile an example that\n * required live transliteration.\n *\n * @default false\n */\n readonly strict?: boolean;\n\n /**\n * A pre-build translation tablet (as produced by `jsii-rosetta extract`).\n *\n * @default - Only the default tablet (`.jsii.tabl.json`) files will be used.\n */\n readonly tablet?: string;\n\n /**\n * A directory to output translated assemblies to\n *\n * @default - assembly location\n */\n readonly outdir?: string;\n\n /**\n * Whether or not to live-convert samples\n *\n * @default UnknownSnippetMode.FAIL\n */\n readonly unknownSnippets?: UnknownSnippetMode;\n}\n\n/**\n * Prepares transliterated versions of the designated assemblies into the\n * selected taregt languages.\n *\n * @param assemblyLocations the directories which contain assemblies to\n * transliterate.\n * @param targetLanguages the languages into which to transliterate.\n * @param tabletLocation an optional Rosetta tablet file to source\n * pre-transliterated snippets from.\n *\n * @experimental\n */\nexport async function transliterateAssembly(\n assemblyLocations: readonly string[],\n targetLanguages: readonly TargetLanguage[],\n options: TransliterateAssemblyOptions = {},\n): Promise<void> {\n // Start by doing an 'extract' for all these assemblies\n //\n // This will locate all examples that haven't been translated yet and translate\n // them. Importantly: it will translate them in parallel, which is going to improve\n // performance a lot. We ignore diagnostics.\n const { tablet } = await extractSnippets(assemblyLocations, {\n includeCompilerDiagnostics: true,\n loose: options.loose,\n cacheFromFile: options.tablet,\n writeToImplicitTablets: false,\n allowDirtyTranslations: true,\n });\n\n // Now do a regular \"tablet reader\" cycle, expecting everything to be translated already,\n // and therefore it doesn't matter that we do this all in a single-threaded loop.\n const rosetta = new RosettaTabletReader({\n unknownSnippets: options?.unknownSnippets ?? UnknownSnippetMode.FAIL,\n targetLanguages,\n prefixDisclaimer: true,\n });\n // Put in the same caching tablet here\n if (options.tablet) {\n await rosetta.loadTabletFromFile(options.tablet);\n }\n // Any fresh translations we just came up with\n rosetta.addTablet(tablet);\n\n const assemblies = await loadAssemblies(assemblyLocations, rosetta);\n\n for (const [location, loadAssembly] of assemblies.entries()) {\n for (const language of targetLanguages) {\n const now = new Date().getTime();\n const result = loadAssembly();\n\n if (result.targets?.[targetName(language)] == null) {\n // This language is not supported by the assembly, so we skip it...\n continue;\n }\n\n if (result.readme?.markdown) {\n result.readme.markdown = rosetta.translateSnippetsInMarkdown(\n { api: 'moduleReadme', moduleFqn: result.name },\n result.readme.markdown,\n language,\n true /* strict */,\n );\n }\n for (const type of Object.values(result.types ?? {})) {\n transliterateType(type, rosetta, language);\n }\n // eslint-disable-next-line no-await-in-loop\n await fs.writeFile(\n resolve(options?.outdir ?? location, `${SPEC_FILE_NAME}.${language}`),\n JSON.stringify(result, null, 2),\n );\n const then = new Date().getTime();\n debug(`Done transliterating ${result.name}@${result.version} to ${language} after ${then - now} milliseconds`);\n }\n }\n\n rosetta.printDiagnostics(process.stderr);\n if (rosetta.hasErrors && options.strict) {\n throw new Error('Strict mode is enabled and some examples failed compilation!');\n }\n}\n\n/**\n * Given a set of directories containing `.jsii` assemblies, load all the\n * assemblies into the provided `Rosetta` instance and return a map of\n * directories to assembly-loading functions (the function re-loads the original\n * assembly from disk on each invocation).\n *\n * @param directories the assembly-containing directories to traverse.\n * @param rosetta the `Rosetta` instance in which to load assemblies.\n *\n * @returns a map of directories to a function that loads the `.jsii` assembly\n * contained therein from disk.\n */\nasync function loadAssemblies(\n directories: readonly string[],\n rosetta: RosettaTabletReader,\n): Promise<ReadonlyMap<string, AssemblyLoader>> {\n const result = new Map<string, AssemblyLoader>();\n\n for (const directory of directories) {\n const loader = () => loadAssemblyFromPath(directory);\n // eslint-disable-next-line no-await-in-loop\n await rosetta.addAssembly(loader(), directory);\n result.set(directory, loader);\n }\n\n return result;\n}\n\ntype AssemblyLoader = () => Mutable<Assembly>;\n\nfunction transliterateType(type: Type, rosetta: RosettaTabletReader, language: TargetLanguage): void {\n transliterateDocs({ api: 'type', fqn: type.fqn }, type.docs);\n switch (type.kind) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore 7029\n case TypeKind.Class:\n if (type.initializer) {\n transliterateDocs({ api: 'initializer', fqn: type.fqn }, type.initializer.docs);\n }\n\n // fallthrough\n case TypeKind.Interface:\n for (const method of type.methods ?? []) {\n transliterateDocs({ api: 'member', fqn: type.fqn, memberName: method.name }, method.docs);\n for (const parameter of method.parameters ?? []) {\n transliterateDocs(\n { api: 'parameter', fqn: type.fqn, methodName: method.name, parameterName: parameter.name },\n parameter.docs,\n );\n }\n }\n for (const property of type.properties ?? []) {\n transliterateDocs({ api: 'member', fqn: type.fqn, memberName: property.name }, property.docs);\n }\n break;\n\n case TypeKind.Enum:\n for (const member of type.members) {\n transliterateDocs({ api: 'member', fqn: type.fqn, memberName: member.name }, member.docs);\n }\n break;\n\n default:\n throw new Error(`Unsupported type kind: ${(type as any).kind}`);\n }\n\n function transliterateDocs(api: ApiLocation, docs: Docs | undefined) {\n if (docs?.remarks) {\n docs.remarks = rosetta.translateSnippetsInMarkdown(api, docs.remarks, language, true /* strict */);\n }\n\n if (docs?.example) {\n const location = { api, field: { field: 'example' } } as const;\n const snippet = typeScriptSnippetFromVisibleSource(docs.example, location, true /* strict */);\n const translation = rosetta.translateSnippet(snippet, language);\n if (translation != null) {\n docs.example = translation.source;\n }\n }\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trim-cache.js","sourceRoot":"","sources":["../../src/commands/trim-cache.ts"],"names":[],"mappings":";;;AAAA,mDAA2E;AAC3E,sCAAsC;AACtC,wCAA4C;AAC5C,gDAAoD;AACpD,kCAAoC;AAc7B,KAAK,UAAU,SAAS,CAAC,OAAyB;IACvD,OAAO,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,iBAAiB,CAAC,MAAM,aAAa,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,IAAA,2BAAc,EAAC,OAAO,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAEpE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,IAAA,kCAAqB,EAAC,UAAU,CAAC,CAAC,CAAC;IAErE,MAAM,QAAQ,GAAG,MAAM,wBAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,IAAI,wBAAc,EAAE,CAAC;IACrC,OAAO,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAA,gBAAU,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAS,CAAC,CAAC,CAAC;IAC3G,0EAA0E;IAC1E,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAEjE,6CAA6C;IAC7C,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,KAAK,wBAAwB,QAAQ,CAAC,KAAK,MAAM,OAAO,CAAC,KAAK,WAAW,CAAC,CAAC;AAC3H,CAAC;AAdD,8BAcC","sourcesContent":["import { loadAssemblies, allTypeScriptSnippets } from '../jsii/assemblies';\nimport * as logging from '../logging';\nimport { snippetKey } from '../tablets/key';\nimport { LanguageTablet } from '../tablets/tablets';\nimport { isDefined } from '../util';\n\nexport interface TrimCacheOptions {\n /**\n * Locations of assemblies to search for snippets\n */\n readonly assemblyLocations: string[];\n\n /**\n * Cache to trim\n */\n readonly cacheFile: string;\n}\n\nexport async function trimCache(options: TrimCacheOptions): Promise<void> {\n logging.info(`Loading ${options.assemblyLocations.length} assemblies`);\n const assemblies = loadAssemblies(options.assemblyLocations, false);\n\n const snippets = Array.from(await allTypeScriptSnippets(assemblies));\n\n const original = await LanguageTablet.fromFile(options.cacheFile);\n const updated = new LanguageTablet();\n updated.addSnippets(...snippets.map((snip) => original.tryGetSnippet(snippetKey(snip))).filter(isDefined));\n // if the original file was compressed, then compress the updated file too\n await updated.save(options.cacheFile, original.compressedSource);\n\n // eslint-disable-next-line prettier/prettier\n logging.info(`${options.cacheFile}: ${updated.count} snippets remaining (${original.count} - ${updated.count} trimmed)`);\n}\n"]}
package/lib/find-utils.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isBuiltinModule = exports.findUp = exports.findPackageJsonUp = exports.findDependencyDirectory = void 0;
4
- const fs_1 = require("fs");
5
- const path = require("path");
4
+ const node_fs_1 = require("node:fs");
5
+ const path = require("node:path");
6
6
  const util_1 = require("./util");
7
7
  /**
8
8
  * Find the directory that contains a given dependency, identified by its 'package.json', from a starting search directory
@@ -34,7 +34,7 @@ exports.findDependencyDirectory = findDependencyDirectory;
34
34
  async function findPackageJsonUp(packageName, directory) {
35
35
  return findUp(directory, async (dir) => {
36
36
  const pjFile = path.join(dir, 'package.json');
37
- return (await (0, util_1.pathExists)(pjFile)) && JSON.parse(await fs_1.promises.readFile(pjFile, 'utf-8')).name === packageName;
37
+ return (await (0, util_1.pathExists)(pjFile)) && JSON.parse(await node_fs_1.promises.readFile(pjFile, 'utf-8')).name === packageName;
38
38
  });
39
39
  }
40
40
  exports.findPackageJsonUp = findPackageJsonUp;
@@ -62,7 +62,7 @@ exports.findUp = findUp;
62
62
  */
63
63
  function isBuiltinModule(depName) {
64
64
  // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires
65
- const { builtinModules } = require('module');
65
+ const { builtinModules } = require('node:module');
66
66
  return (builtinModules ?? []).includes(depName);
67
67
  }
68
68
  exports.isBuiltinModule = isBuiltinModule;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-utils.js","sourceRoot":"","sources":["../src/find-utils.ts"],"names":[],"mappings":";;;AAAA,qCAAyC;AACzC,kCAAkC;AAElC,iCAAoC;AAEpC;;;;;GAKG;AACI,KAAK,UAAU,uBAAuB,CAAC,cAAsB,EAAE,WAAmB;IACvF,oFAAoF;IACpF,gDAAgD;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE;QACjD,KAAK,EAAE,CAAC,WAAW,CAAC;KACrB,CAAC,CAAC;IAEH,8EAA8E;IAC9E,6EAA6E;IAC7E,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAEzF,IAAI,CAAC,cAAc,EAAE;QACnB,MAAM,IAAI,KAAK,CAAC,8BAA8B,cAAc,WAAW,WAAW,GAAG,CAAC,CAAC;KACxF;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAhBD,0DAgBC;AAED;;;;;GAKG;AACI,KAAK,UAAU,iBAAiB,CAAC,WAAmB,EAAE,SAAiB;IAC5E,OAAO,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC9C,OAAO,CAAC,MAAM,IAAA,iBAAU,EAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,kBAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;IAC3G,CAAC,CAAC,CAAC;AACL,CAAC;AALD,8CAKC;AAYD,qEAAqE;AACrE,SAAgB,MAAM,CACpB,SAAiB,EACjB,IAAiD;IAEjD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,MAAM,YAAY,OAAO,EAAE;QAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;KAChF;IAED,OAAO,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAEtC,SAAS,OAAO;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS,EAAE;YACxB,OAAO,SAAS,CAAC;SAClB;QACD,OAAO,MAAM,CAAC,MAAM,EAAE,IAAW,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAlBD,wBAkBC;AAED;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,OAAe;IAC7C,oGAAoG;IACpG,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAClD,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC;AAJD,0CAIC","sourcesContent":["import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\n\nimport { pathExists } from './util';\n\n/**\n * Find the directory that contains a given dependency, identified by its 'package.json', from a starting search directory\n *\n * (This code is duplicated among jsii/jsii-pacmak/jsii-reflect. Changes should be done in all\n * 3 locations, and we should unify these at some point: https://github.com/aws/jsii/issues/3236)\n */\nexport async function findDependencyDirectory(dependencyName: string, searchStart: string) {\n // Explicitly do not use 'require(\"dep/package.json\")' because that will fail if the\n // package does not export that particular file.\n const entryPoint = require.resolve(dependencyName, {\n paths: [searchStart],\n });\n\n // Search up from the given directory, looking for a package.json that matches\n // the dependency name (so we don't accidentally find stray 'package.jsons').\n const depPkgJsonPath = await findPackageJsonUp(dependencyName, path.dirname(entryPoint));\n\n if (!depPkgJsonPath) {\n throw new Error(`Could not find dependency '${dependencyName}' from '${searchStart}'`);\n }\n\n return depPkgJsonPath;\n}\n\n/**\n * Find the package.json for a given package upwards from the given directory\n *\n * (This code is duplicated among jsii/jsii-pacmak/jsii-reflect. Changes should be done in all\n * 3 locations, and we should unify these at some point: https://github.com/aws/jsii/issues/3236)\n */\nexport async function findPackageJsonUp(packageName: string, directory: string) {\n return findUp(directory, async (dir) => {\n const pjFile = path.join(dir, 'package.json');\n return (await pathExists(pjFile)) && JSON.parse(await fs.readFile(pjFile, 'utf-8')).name === packageName;\n });\n}\n\n/**\n * Find a directory up the tree from a starting directory matching a condition\n *\n * Will return `undefined` if no directory matches\n *\n * (This code is duplicated among jsii/jsii-pacmak/jsii-reflect. Changes should be done in all\n * 3 locations, and we should unify these at some point: https://github.com/aws/jsii/issues/3236)\n */\nexport function findUp(directory: string, pred: (dir: string) => Promise<boolean>): Promise<string | undefined>;\nexport function findUp(directory: string, pred: (dir: string) => boolean): string | undefined;\n// eslint-disable-next-line @typescript-eslint/promise-function-async\nexport function findUp(\n directory: string,\n pred: (dir: string) => boolean | Promise<boolean>,\n): Promise<string | undefined> | string | undefined {\n const result = pred(directory);\n if (result instanceof Promise) {\n return result.then((thisDirectory) => (thisDirectory ? directory : recurse()));\n }\n\n return result ? directory : recurse();\n\n function recurse() {\n const parent = path.dirname(directory);\n if (parent === directory) {\n return undefined;\n }\n return findUp(parent, pred as any);\n }\n}\n\n/**\n * Whether the given dependency is a built-in\n *\n * Some dependencies that occur in `package.json` are also built-ins in modern Node\n * versions (most egregious example: 'punycode'). Detect those and filter them out.\n */\nexport function isBuiltinModule(depName: string) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires\n const { builtinModules } = require('node:module');\n return (builtinModules ?? []).includes(depName);\n}\n"]}
package/lib/fixtures.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.fixturize = void 0;
4
- const fs = require("fs");
5
- const path = require("path");
4
+ const fs = require("node:fs");
5
+ const path = require("node:path");
6
6
  const typescript_1 = require("typescript");
7
7
  const snippet_1 = require("./snippet");
8
8
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { createSourceFile, ScriptKind, ScriptTarget, SyntaxKind } from 'typescript';\n\nimport { TypeScriptSnippet, SnippetParameters, ApiLocation } from './snippet';\n\n/**\n * Complete snippets with fixtures, if required\n */\nexport function fixturize(snippet: TypeScriptSnippet, loose = false): TypeScriptSnippet {\n let source = snippet.visibleSource;\n const parameters = snippet.parameters ?? {};\n\n const directory = parameters[SnippetParameters.$PROJECT_DIRECTORY];\n if (!directory) {\n return snippet;\n }\n\n const literateSource = parameters[SnippetParameters.LITERATE_SOURCE];\n if (literateSource) {\n // Compatibility with the \"old school\" example inclusion mechanism.\n // Completely load this file and attach a parameter with its directory.\n try {\n source = loadLiterateSource(directory, literateSource);\n } catch (ex) {\n // In loose mode, we ignore this failure and stick to the visible source.\n if (!loose) {\n throw ex;\n }\n }\n parameters[SnippetParameters.$COMPILATION_DIRECTORY] = path.join(directory, path.dirname(literateSource));\n } else if (parameters[SnippetParameters.FIXTURE]) {\n // Explicitly requested fixture must exist, unless we are operating in loose mode\n source = loadAndSubFixture(directory, snippet.location.api, parameters.fixture, source, !loose);\n } else if (parameters[SnippetParameters.NO_FIXTURE] === undefined) {\n // Don't explicitly request no fixture, load the default.\n source = loadAndSubFixture(directory, snippet.location.api, 'default', source, false);\n }\n\n return {\n ...snippet,\n completeSource: source,\n parameters,\n };\n}\n\nfunction loadLiterateSource(directory: string, literateFileName: string) {\n const fullPath = path.join(directory, literateFileName);\n const exists = fs.existsSync(fullPath);\n if (!exists) {\n // This couldn't really happen in practice, but do the check anyway\n throw new Error(`Sample uses literate source ${literateFileName}, but not found: ${fullPath}`);\n }\n return fs.readFileSync(fullPath, { encoding: 'utf-8' });\n}\n\n/**\n * Load the fixture with the given name, and substitute the source into it\n *\n * If no fixture could be found and `mustExist` is true, and error will be thrown.\n *\n * In principle, the fixture we're looking for is `rosetta/FIXTURE.ts-fixture`.\n * However, we want to support an automatic transform of many small packages\n * combined into a single large package, perhaps into submodules (i.e., we want\n * to support monocdk), and in those cases the names of fixtures might conflict.\n * For example, all of them will have a `default.ts-fixture`, and there won't be\n * any explicit reference to that file anywhere... yet in the combined\n * monopackage we have to distinguish those fixtures.\n *\n * Therefore, we will consider submodule names as subdirectories, based on the\n * API location of the snippet we're fixturizing.\n *\n * (For example, the fixtures for a type called `monocdk.aws_s3.Bucket` will be\n * searched both in `rosetta/aws_s3/default.ts-fixture` as well as\n * `rosetta/default.ts-fixture`).\n */\nfunction loadAndSubFixture(\n directory: string,\n location: ApiLocation,\n fixtureName: string,\n source: string,\n mustExist: boolean,\n) {\n const candidates = fixtureCandidates(directory, fixtureName, location);\n const fixtureFileName = candidates.find((n) => fs.existsSync(n));\n\n if (!fixtureFileName) {\n if (mustExist) {\n throw new Error(`Sample uses fixture ${fixtureName}, but not found: ${JSON.stringify(candidates)}`);\n }\n return source;\n }\n\n const fixtureContents = fs.readFileSync(fixtureFileName, {\n encoding: 'utf-8',\n });\n\n const subRegex = /[/]{3}[ \\t]*here[ \\t]*$/im;\n if (!subRegex.test(fixtureContents)) {\n throw new Error(`Fixture does not contain '/// here': ${fixtureFileName}`);\n }\n\n const { imports, statements } = sidelineImports(source);\n const show = '/// !show';\n const hide = '/// !hide';\n\n const result = fixtureContents.replace(\n subRegex,\n [\n '// Code snippet begins after !show marker below',\n show,\n statements,\n hide,\n '// Code snippet ended before !hide marker above',\n ].join('\\n'),\n );\n\n return imports\n ? [\n '// Hoisted imports begin after !show marker below',\n show,\n imports,\n hide,\n '// Hoisted imports ended before !hide marker above',\n result,\n ].join('\\n')\n : result;\n}\n\nfunction fixtureCandidates(directory: string, fixtureName: string, location: ApiLocation): string[] {\n const ret = new Array<string>();\n const fileName = `${fixtureName}.ts-fixture`;\n const mods = submodules(location);\n\n ret.push(path.join(directory, 'rosetta', fileName));\n for (let i = 0; i < mods.length; i++) {\n ret.push(path.join(directory, 'rosetta', ...mods.slice(0, i + 1), fileName));\n }\n\n // Most specific one up front\n ret.reverse();\n return ret;\n}\n\n/**\n * Return the submodule parts from a given ApiLocation\n */\nfunction submodules(location: ApiLocation): string[] {\n switch (location.api) {\n case 'file':\n return [];\n case 'initializer':\n case 'member':\n case 'type':\n case 'parameter':\n return middle(location.fqn.split('.'));\n case 'moduleReadme':\n return location.moduleFqn.split('.').slice(1);\n }\n\n function middle(xs: string[]) {\n return xs.slice(1, xs.length - 1);\n }\n}\n\n/**\n * When embedding code fragments in a fixture, \"import\" statements must be\n * hoisted up to the top of the resulting document, as TypeScript only allows\n * those to be present in the top-level context of an ESM.\n *\n * @param source a block of TypeScript source\n *\n * @returns an object containing the import statements on one end, and the rest\n * on the other hand.\n */\nfunction sidelineImports(source: string): {\n imports: string;\n statements: string;\n} {\n let imports = '';\n let statements = '';\n\n const sourceFile = createSourceFile('index.ts', source, ScriptTarget.Latest, true, ScriptKind.TS);\n for (const statement of sourceFile.statements) {\n if (\n statement.kind === SyntaxKind.ImportDeclaration ||\n statement.kind === SyntaxKind.ImportEqualsDeclaration ||\n (statement.kind === SyntaxKind.VariableStatement &&\n statement.getChildAt(0).getChildAt(0).kind === SyntaxKind.DeclareKeyword)\n ) {\n imports += statement.getFullText(sourceFile);\n } else {\n statements += statement.getFullText(sourceFile);\n }\n }\n\n return { imports, statements };\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,+DAA6D;AAApD,iHAAA,cAAc,OAAA;AACvB,6CAAmD;AAA1C,uGAAA,aAAa,OAAA;AACtB,yCAA+C;AAAtC,mGAAA,WAAW,OAAA;AACpB,6CAAmD;AAA1C,uGAAA,aAAa,OAAA;AACtB,qCAA2C;AAAlC,+FAAA,SAAS,OAAA;AAClB,oDAAkC;AAClC,mDAAiC;AACjC,uDAAqC;AACrC,4CAA0B;AAC1B,6CAA2B;AAC3B,2CAAyB","sourcesContent":["export * from './translate';\nexport { renderTree } from './o-tree';\nexport { TargetLanguage } from './languages/target-language';\nexport { CSharpVisitor } from './languages/csharp';\nexport { JavaVisitor } from './languages/java';\nexport { PythonVisitor } from './languages/python';\nexport { GoVisitor } from './languages/go';\nexport * from './tablets/tablets';\nexport * from './rosetta-reader';\nexport * from './rosetta-translator';\nexport * from './snippet';\nexport * from './markdown';\nexport * from './strict';\n"]}
@@ -44,7 +44,7 @@ export declare function loadAllDefaultTablets(asms: readonly LoadedAssembly[]):
44
44
  */
45
45
  export declare function guessTabletLocation(directory: string): string;
46
46
  export declare function compressedTabletExists(directory: string): boolean;
47
- export declare type AssemblySnippetSource = {
47
+ export type AssemblySnippetSource = {
48
48
  type: 'markdown';
49
49
  markdown: string;
50
50
  location: ApiLocation;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.findContainingSubmodule = exports.findTypeLookupAssembly = exports.allTypeScriptSnippets = exports.allSnippetSources = exports.compressedTabletExists = exports.guessTabletLocation = exports.loadAllDefaultTablets = exports.loadAssemblies = exports.EXAMPLE_METADATA_JSDOCTAG = void 0;
4
- const spec = require("@jsii/spec");
4
+ const node_fs_1 = require("node:fs");
5
+ const fs = require("node:fs");
6
+ const path = require("node:path");
5
7
  const spec_1 = require("@jsii/spec");
6
- const fs_1 = require("fs");
7
- const fs = require("fs");
8
- const path = require("path");
8
+ const spec = require("@jsii/spec");
9
9
  const find_utils_1 = require("../find-utils");
10
10
  const fixtures_1 = require("../fixtures");
11
11
  const extract_snippets_1 = require("../markdown/extract-snippets");
@@ -92,19 +92,22 @@ function allSnippetSources(assembly) {
92
92
  }
93
93
  }
94
94
  if (assembly.types) {
95
- Object.values(assembly.types).forEach((type) => {
95
+ for (const type of Object.values(assembly.types)) {
96
96
  emitDocs(type.docs, { api: 'type', fqn: type.fqn });
97
97
  if (spec.isEnumType(type)) {
98
- type.members.forEach((m) => emitDocs(m.docs, { api: 'member', fqn: type.fqn, memberName: m.name }));
98
+ for (const m of type.members)
99
+ emitDocs(m.docs, { api: 'member', fqn: type.fqn, memberName: m.name });
99
100
  }
100
101
  if (spec.isClassType(type)) {
101
102
  emitDocsForCallable(type.initializer, type.fqn);
102
103
  }
103
104
  if (spec.isClassOrInterfaceType(type)) {
104
- (type.methods ?? []).forEach((m) => emitDocsForCallable(m, type.fqn, m.name));
105
- (type.properties ?? []).forEach((m) => emitDocs(m.docs, { api: 'member', fqn: type.fqn, memberName: m.name }));
105
+ for (const m of type.methods ?? [])
106
+ emitDocsForCallable(m, type.fqn, m.name);
107
+ for (const m of type.properties ?? [])
108
+ emitDocs(m.docs, { api: 'member', fqn: type.fqn, memberName: m.name });
106
109
  }
107
- });
110
+ }
108
111
  }
109
112
  return ret;
110
113
  function emitDocsForCallable(callable, fqn, memberName) {
@@ -268,7 +271,7 @@ async function withDependencies(asm, snippet) {
268
271
  const compilationDependencies = {};
269
272
  compilationDependencies[asm.assembly.name] = {
270
273
  type: 'concrete',
271
- resolvedDirectory: await fs_1.promises.realpath(asm.directory),
274
+ resolvedDirectory: await node_fs_1.promises.realpath(asm.directory),
272
275
  };
273
276
  Object.assign(compilationDependencies, (0, util_1.mkDict)(await Promise.all(Object.keys({ ...asm.packageJson?.dependencies, ...asm.packageJson?.peerDependencies })
274
277
  .filter((name) => !(0, find_utils_1.isBuiltinModule)(name))
@@ -278,7 +281,7 @@ async function withDependencies(asm, snippet) {
278
281
  name,
279
282
  {
280
283
  type: 'concrete',
281
- resolvedDirectory: await fs_1.promises.realpath(await (0, find_utils_1.findDependencyDirectory)(name, asm.directory)),
284
+ resolvedDirectory: await node_fs_1.promises.realpath(await (0, find_utils_1.findDependencyDirectory)(name, asm.directory)),
282
285
  },
283
286
  ]))));
284
287
  Object.assign(compilationDependencies, (0, util_1.mkDict)(Object.entries(asm.packageJson?.jsiiRosetta?.exampleDependencies ?? {}).map(([name, versionRange]) => [name, { type: 'symbolic', versionRange }])));
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assemblies.js","sourceRoot":"","sources":["../../src/jsii/assemblies.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fsPromises } from 'node:fs';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { loadAssemblyFromFile, loadAssemblyFromPath, findAssemblyFile } from '@jsii/spec';\nimport * as spec from '@jsii/spec';\n\nimport { findDependencyDirectory, isBuiltinModule } from '../find-utils';\nimport { fixturize } from '../fixtures';\nimport { extractTypescriptSnippetsFromMarkdown } from '../markdown/extract-snippets';\nimport {\n TypeScriptSnippet,\n typeScriptSnippetFromSource,\n updateParameters,\n SnippetParameters,\n ApiLocation,\n parseMetadataLine,\n CompilationDependency,\n INITIALIZER_METHOD_NAME,\n} from '../snippet';\nimport { enforcesStrictMode } from '../strict';\nimport { LanguageTablet, DEFAULT_TABLET_NAME, DEFAULT_TABLET_NAME_COMPRESSED } from '../tablets/tablets';\nimport { fmap, mkDict, sortBy } from '../util';\n\n/**\n * The JSDoc tag users can use to associate non-visible metadata with an example\n *\n * In a Markdown section, metadata goes after the code block fence, where it will\n * be attached to the example but invisible.\n *\n * ```ts metadata=goes here\n *\n * But in doc comments, '@example' already delineates the example, and any metadata\n * in there added by the '///' tags becomes part of the visible code (there is no\n * place to put hidden information).\n *\n * We introduce the '@exampleMetadata' tag to put that additional information.\n */\nexport const EXAMPLE_METADATA_JSDOCTAG = 'exampleMetadata';\n\ninterface RosettaPackageJson extends spec.PackageJson {\n readonly jsiiRosetta?: {\n readonly strict?: boolean;\n readonly exampleDependencies?: Record<string, string>;\n };\n}\n\nexport interface LoadedAssembly {\n readonly assembly: spec.Assembly;\n readonly directory: string;\n readonly packageJson?: RosettaPackageJson;\n}\n\n/**\n * Load assemblies by filename or directory\n */\nexport function loadAssemblies(\n assemblyLocations: readonly string[],\n validateAssemblies: boolean,\n): readonly LoadedAssembly[] {\n return assemblyLocations.map(loadAssembly);\n\n function loadAssembly(location: string): LoadedAssembly {\n const stat = fs.statSync(location);\n if (stat.isDirectory()) {\n return loadAssembly(findAssemblyFile(location));\n }\n\n const directory = path.dirname(location);\n const pjLocation = path.join(directory, 'package.json');\n\n const assembly = loadAssemblyFromFile(location, validateAssemblies);\n const packageJson = fs.existsSync(pjLocation) ? JSON.parse(fs.readFileSync(pjLocation, 'utf-8')) : undefined;\n\n return { assembly, directory, packageJson };\n }\n}\n\n/**\n * Load the default tablets for every assembly, if available\n *\n * Returns a map of { directory -> tablet }.\n */\nexport async function loadAllDefaultTablets(asms: readonly LoadedAssembly[]): Promise<Record<string, LanguageTablet>> {\n return mkDict(\n await Promise.all(\n asms.map(\n async (a) => [a.directory, await LanguageTablet.fromOptionalFile(guessTabletLocation(a.directory))] as const,\n ),\n ),\n );\n}\n\n/**\n * Returns the location of the tablet file, either .jsii.tabl.json or .jsii.tabl.json.gz.\n * Assumes that a tablet exists in the directory and if not, the ensuing behavior is\n * handled by the caller of this function.\n */\nexport function guessTabletLocation(directory: string) {\n return compressedTabletExists(directory)\n ? path.join(directory, DEFAULT_TABLET_NAME_COMPRESSED)\n : path.join(directory, DEFAULT_TABLET_NAME);\n}\n\nexport function compressedTabletExists(directory: string) {\n return fs.existsSync(path.join(directory, DEFAULT_TABLET_NAME_COMPRESSED));\n}\n\nexport type AssemblySnippetSource =\n | { type: 'markdown'; markdown: string; location: ApiLocation }\n | { type: 'example'; source: string; metadata?: { [key: string]: string }; location: ApiLocation };\n\n/**\n * Return all markdown and example snippets from the given assembly\n */\nexport function allSnippetSources(assembly: spec.Assembly): AssemblySnippetSource[] {\n const ret: AssemblySnippetSource[] = [];\n\n if (assembly.readme) {\n ret.push({\n type: 'markdown',\n markdown: assembly.readme.markdown,\n location: { api: 'moduleReadme', moduleFqn: assembly.name },\n });\n }\n\n for (const [submoduleFqn, submodule] of Object.entries(assembly.submodules ?? {})) {\n if (submodule.readme) {\n ret.push({\n type: 'markdown',\n markdown: submodule.readme.markdown,\n location: { api: 'moduleReadme', moduleFqn: submoduleFqn },\n });\n }\n }\n\n if (assembly.types) {\n for (const type of Object.values(assembly.types)) {\n emitDocs(type.docs, { api: 'type', fqn: type.fqn });\n\n if (spec.isEnumType(type)) {\n for (const m of type.members) emitDocs(m.docs, { api: 'member', fqn: type.fqn, memberName: m.name });\n }\n if (spec.isClassType(type)) {\n emitDocsForCallable(type.initializer, type.fqn);\n }\n if (spec.isClassOrInterfaceType(type)) {\n for (const m of type.methods ?? []) emitDocsForCallable(m, type.fqn, m.name);\n for (const m of type.properties ?? []) emitDocs(m.docs, { api: 'member', fqn: type.fqn, memberName: m.name });\n }\n }\n }\n\n return ret;\n\n function emitDocsForCallable(callable: spec.Callable | undefined, fqn: string, memberName?: string) {\n if (!callable) {\n return;\n }\n emitDocs(callable.docs, memberName ? { api: 'member', fqn, memberName } : { api: 'initializer', fqn });\n\n for (const parameter of callable.parameters ?? []) {\n emitDocs(parameter.docs, {\n api: 'parameter',\n fqn: fqn,\n methodName: memberName ?? INITIALIZER_METHOD_NAME,\n parameterName: parameter.name,\n });\n }\n }\n\n function emitDocs(docs: spec.Docs | undefined, location: ApiLocation) {\n if (!docs) {\n return;\n }\n\n if (docs.remarks) {\n ret.push({\n type: 'markdown',\n markdown: docs.remarks,\n location,\n });\n }\n if (docs.example) {\n ret.push({\n type: 'example',\n source: docs.example,\n metadata: fmap(docs.custom?.[EXAMPLE_METADATA_JSDOCTAG], parseMetadataLine),\n location,\n });\n }\n }\n}\n\nexport async function allTypeScriptSnippets(\n assemblies: readonly LoadedAssembly[],\n loose = false,\n): Promise<TypeScriptSnippet[]> {\n return Promise.all(\n assemblies\n .flatMap((loaded) => allSnippetSources(loaded.assembly).map((source) => ({ source, loaded })))\n .flatMap(({ source, loaded }) => {\n switch (source.type) {\n case 'example':\n return [\n {\n snippet: updateParameters(\n typeScriptSnippetFromSource(\n source.source,\n { api: source.location, field: { field: 'example' } },\n isStrict(loaded),\n ),\n source.metadata ?? {},\n ),\n loaded,\n },\n ];\n case 'markdown':\n return extractTypescriptSnippetsFromMarkdown(source.markdown, source.location, isStrict(loaded)).map(\n (snippet) => ({ snippet, loaded }),\n );\n }\n })\n .map(async ({ snippet, loaded }) => {\n const isInfused = snippet.parameters?.infused != null;\n\n // Ignore fixturization errors if requested on this command, or if the snippet was infused\n const ignoreFixtureErrors = loose || isInfused;\n\n // Also if the snippet was infused: switch off 'strict' mode if it was set\n if (isInfused) {\n snippet = { ...snippet, strict: false };\n }\n\n snippet = await withDependencies(loaded, withProjectDirectory(loaded.directory, snippet));\n return fixturize(snippet, ignoreFixtureErrors);\n }),\n );\n}\n\nexport interface TypeLookupAssembly {\n readonly packageJson: any;\n readonly assembly: spec.Assembly;\n readonly directory: string;\n readonly symbolIdMap: Record<string, string>;\n}\n\nconst MAX_ASM_CACHE = 3;\nconst ASM_CACHE: TypeLookupAssembly[] = [];\n\n/**\n * Recursively searches for a .jsii file in the directory.\n * When file is found, checks cache to see if we already\n * stored the assembly in memory. If not, we synchronously\n * load the assembly into memory.\n */\nexport function findTypeLookupAssembly(startingDirectory: string): TypeLookupAssembly | undefined {\n const pjLocation = findPackageJsonLocation(path.resolve(startingDirectory));\n if (!pjLocation) {\n return undefined;\n }\n const directory = path.dirname(pjLocation);\n\n const fromCache = ASM_CACHE.find((c) => c.directory === directory);\n if (fromCache) {\n return fromCache;\n }\n\n const loaded = loadLookupAssembly(directory);\n if (!loaded) {\n return undefined;\n }\n\n while (ASM_CACHE.length >= MAX_ASM_CACHE) {\n ASM_CACHE.pop();\n }\n ASM_CACHE.unshift(loaded);\n return loaded;\n}\n\nfunction loadLookupAssembly(directory: string): TypeLookupAssembly | undefined {\n try {\n const packageJson = JSON.parse(fs.readFileSync(path.join(directory, 'package.json'), 'utf-8'));\n const assembly: spec.Assembly = loadAssemblyFromPath(directory);\n const symbolIdMap = mkDict([\n ...Object.values(assembly.types ?? {}).map((type) => [type.symbolId ?? '', type.fqn] as const),\n ...Object.entries(assembly.submodules ?? {}).map(([fqn, mod]) => [mod.symbolId ?? '', fqn] as const),\n ]);\n\n return {\n packageJson,\n assembly,\n directory,\n symbolIdMap,\n };\n } catch {\n return undefined;\n }\n}\n\nfunction findPackageJsonLocation(currentPath: string): string | undefined {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const candidate = path.join(currentPath, 'package.json');\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n\n const parentPath = path.resolve(currentPath, '..');\n if (parentPath === currentPath) {\n return undefined;\n }\n currentPath = parentPath;\n }\n}\n\n/**\n * Find the jsii [sub]module that contains the given FQN\n *\n * @returns `undefined` if the type is a member of the assembly root.\n */\nexport function findContainingSubmodule(assembly: spec.Assembly, fqn: string): string | undefined {\n const submoduleNames = Object.keys(assembly.submodules ?? {});\n sortBy(submoduleNames, (s) => [-s.length]); // Longest first\n for (const s of submoduleNames) {\n if (fqn.startsWith(`${s}.`)) {\n return s;\n }\n }\n return undefined;\n}\n\nfunction withProjectDirectory(dir: string, snippet: TypeScriptSnippet) {\n return updateParameters(snippet, {\n [SnippetParameters.$PROJECT_DIRECTORY]: dir,\n });\n}\n\n/**\n * Return a TypeScript snippet with dependencies added\n *\n * The dependencies will be taken from the package.json, and will consist of:\n *\n * - The package itself\n * - The package's dependencies and peerDependencies\n * - Any additional dependencies declared in `jsiiRosetta.exampleDependencies`.\n */\nasync function withDependencies(asm: LoadedAssembly, snippet: TypeScriptSnippet): Promise<TypeScriptSnippet> {\n const compilationDependencies: Record<string, CompilationDependency> = {};\n\n compilationDependencies[asm.assembly.name] = {\n type: 'concrete',\n resolvedDirectory: await fsPromises.realpath(asm.directory),\n };\n\n Object.assign(\n compilationDependencies,\n mkDict(\n await Promise.all(\n Object.keys({ ...asm.packageJson?.dependencies, ...asm.packageJson?.peerDependencies })\n .filter((name) => !isBuiltinModule(name))\n .filter(\n (name) =>\n !asm.packageJson?.bundledDependencies?.includes(name) &&\n !asm.packageJson?.bundleDependencies?.includes(name),\n )\n .map(\n async (name) =>\n [\n name,\n {\n type: 'concrete',\n resolvedDirectory: await fsPromises.realpath(await findDependencyDirectory(name, asm.directory)),\n },\n ] as const,\n ),\n ),\n ),\n );\n\n Object.assign(\n compilationDependencies,\n mkDict(\n Object.entries(asm.packageJson?.jsiiRosetta?.exampleDependencies ?? {}).map(\n ([name, versionRange]) => [name, { type: 'symbolic', versionRange }] as const,\n ),\n ),\n );\n\n return {\n ...snippet,\n compilationDependencies,\n };\n}\n\n/**\n * Whether samples in the assembly should be treated as strict\n *\n * True if the strict flag is found in the package.json (modern) or the assembly itself (legacy).\n */\nfunction isStrict(loaded: LoadedAssembly) {\n return loaded.packageJson?.jsiiRosetta?.strict ?? enforcesStrictMode(loaded.assembly);\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TypeFingerprinter = void 0;
4
+ const crypto = require("node:crypto");
4
5
  const spec = require("@jsii/spec");
5
- const crypto = require("crypto");
6
6
  /**
7
7
  * Return a fingerprint for a type.
8
8
  *
@@ -83,17 +83,17 @@ class TypeFingerprinter {
83
83
  const ret = hash.digest('hex');
84
84
  this.cache.set(fqn, ret);
85
85
  return ret;
86
- function visitType(fqn) {
87
- if (!fqn) {
86
+ function visitType(fqnStr) {
87
+ if (!fqnStr) {
88
88
  return;
89
89
  }
90
- if (recursionBreaker.has(fqn)) {
90
+ if (recursionBreaker.has(fqnStr)) {
91
91
  hash.update('$RECURSION$');
92
92
  return;
93
93
  }
94
- recursionBreaker.add(fqn);
95
- hash.update(self.doFingerprint(fqn, recursionBreaker));
96
- recursionBreaker.delete(fqn);
94
+ recursionBreaker.add(fqnStr);
95
+ hash.update(self.doFingerprint(fqnStr, recursionBreaker));
96
+ recursionBreaker.delete(fqnStr);
97
97
  }
98
98
  function visitCallable(callable) {
99
99
  if (!callable) {
@@ -120,8 +120,8 @@ class TypeFingerprinter {
120
120
  visitTypeReference(typeRef.collection.elementtype);
121
121
  }
122
122
  if (spec.isUnionTypeReference(typeRef)) {
123
- for (const type of typeRef.union.types) {
124
- visitTypeReference(type);
123
+ for (const t of typeRef.union.types) {
124
+ visitTypeReference(t);
125
125
  }
126
126
  }
127
127
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprinting.js","sourceRoot":"","sources":["../../src/jsii/fingerprinting.ts"],"names":[],"mappings":"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","sourcesContent":["import * as crypto from 'node:crypto';\nimport * as spec from '@jsii/spec';\n\n/**\n * Return a fingerprint for a type.\n *\n * The fingerprint will change if the API of the given type changes.\n *\n * The fingerprint is an approximation, it's not exhaustive. It will not trace\n * into types from assemblies it can't see, for example. For the purposes of Rosetta,\n * we'll assume this is Good Enough™.\n */\nexport class TypeFingerprinter {\n private readonly cache = new Map<string, string>();\n private readonly assemblies = new Map<string, spec.Assembly>();\n\n public constructor(assemblies: spec.Assembly[]) {\n for (const assembly of assemblies) {\n this.assemblies.set(assembly.name, assembly);\n }\n }\n\n /**\n * Return a single fingerprint that encompasses all fqns in the list\n */\n public fingerprintAll(fqns: string[]) {\n const hash = crypto.createHash('sha256');\n for (const fqn of fqns) {\n hash.update(this.fingerprintType(fqn));\n }\n return hash.digest('hex');\n }\n\n /**\n * Return the fingerprint for the given FQN in the assembly of this fingerprinter\n *\n * The fingerprint is always going to contain the FQN, even if the type doesn't exist\n * in this assembly.\n */\n public fingerprintType(fqn: string) {\n return this.doFingerprint(fqn, new Set([fqn]));\n }\n\n private doFingerprint(fqn: string, recursionBreaker: Set<string>) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n const existing = this.cache.get(fqn);\n if (existing) {\n return existing;\n }\n\n const hash = crypto.createHash('sha256');\n hash.update(fqn);\n\n const type = this.findType(fqn);\n if (type) {\n hash.update(type.kind);\n switch (type.kind) {\n case spec.TypeKind.Enum:\n for (const member of sortedByName(type.members)) {\n hash.update(member.name);\n }\n break;\n case spec.TypeKind.Class:\n case spec.TypeKind.Interface:\n if (type.kind === spec.TypeKind.Class) {\n visitType(type.base);\n visitCallable(type.initializer);\n }\n\n for (const prop of sortedByName(type.properties ?? [])) {\n hash.update(prop.name);\n visitBools(prop.immutable, prop.static, prop.optional, prop.protected);\n visitTypeReference(prop.type);\n }\n for (const method of sortedByName(type.methods ?? [])) {\n hash.update(method.name);\n visitCallable(method);\n visitBools(method.returns?.optional);\n visitTypeReference(method.returns?.type);\n }\n for (const implint of type.interfaces ?? []) {\n visitType(implint);\n }\n\n break;\n }\n }\n\n const ret = hash.digest('hex');\n this.cache.set(fqn, ret);\n return ret;\n\n function visitType(fqnStr?: string) {\n if (!fqnStr) {\n return;\n }\n\n if (recursionBreaker.has(fqnStr)) {\n hash.update('$RECURSION$');\n return;\n }\n\n recursionBreaker.add(fqnStr);\n hash.update(self.doFingerprint(fqnStr, recursionBreaker));\n recursionBreaker.delete(fqnStr);\n }\n\n function visitCallable(callable?: spec.Callable) {\n if (!callable) {\n return;\n }\n\n visitBools(callable.protected);\n for (const param of callable.parameters ?? []) {\n visitBools(param.optional, param.variadic);\n visitTypeReference(param.type);\n }\n }\n\n function visitTypeReference(typeRef?: spec.TypeReference) {\n if (!typeRef) {\n return;\n }\n\n if (spec.isPrimitiveTypeReference(typeRef)) {\n hash.update(typeRef.primitive);\n }\n if (spec.isNamedTypeReference(typeRef)) {\n visitType(typeRef.fqn);\n }\n if (spec.isCollectionTypeReference(typeRef)) {\n hash.update(typeRef.collection.kind);\n visitTypeReference(typeRef.collection.elementtype);\n }\n if (spec.isUnionTypeReference(typeRef)) {\n for (const t of typeRef.union.types) {\n visitTypeReference(t);\n }\n }\n }\n\n function visitBools(...vs: Array<boolean | undefined>) {\n hash.update(vs.map((v) => (v ? '1' : '0')).join(''));\n }\n }\n\n private findType(fqn: string) {\n const assemblyName = fqn.split('.')[0];\n return this.assemblies.get(assemblyName)?.types?.[fqn];\n }\n}\n\nfunction sortedByName<A extends { name: string }>(xs: A[]): A[] {\n xs.sort((a, b) => a.name.localeCompare(b.name));\n return xs;\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import * as ts from 'typescript';
2
- import { BuiltInType } from '../typescript/types';
3
2
  import { JsiiSymbol } from './jsii-utils';
4
- export declare type JsiiType = {
3
+ import { BuiltInType } from '../typescript/types';
4
+ export type JsiiType = {
5
5
  kind: 'unknown';
6
6
  } | {
7
7
  kind: 'error';
@@ -18,12 +18,12 @@ export declare type JsiiType = {
18
18
  builtIn: BuiltInType;
19
19
  };
20
20
  export declare function determineJsiiType(typeChecker: ts.TypeChecker, type: ts.Type): JsiiType;
21
- export declare type ObjectLiteralAnalysis = ObjectLiteralStruct | {
21
+ export type ObjectLiteralAnalysis = ObjectLiteralStruct | {
22
22
  readonly kind: 'map';
23
23
  } | {
24
24
  readonly kind: 'unknown';
25
25
  };
26
- export declare type ObjectLiteralStruct = {
26
+ export type ObjectLiteralStruct = {
27
27
  readonly kind: 'struct';
28
28
  readonly type: ts.Type;
29
29
  readonly jsiiSym: JsiiSymbol;
@@ -2,14 +2,22 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.analyzeObjectLiteral = exports.determineJsiiType = void 0;
4
4
  const ts = require("typescript");
5
- const types_1 = require("../typescript/types");
6
5
  const jsii_utils_1 = require("./jsii-utils");
6
+ const types_1 = require("../typescript/types");
7
7
  function determineJsiiType(typeChecker, type) {
8
8
  // this means the snippet didn't have enough info for the TypeScript compiler to figure out the type -
9
9
  // so, just render the fallback
10
10
  if (type.intrinsicName === 'error') {
11
11
  return { kind: 'unknown' };
12
12
  }
13
+ // The non-nullable version of `void` is `never`, so check first...
14
+ if ((type.flags & (ts.TypeFlags.Void | ts.TypeFlags.VoidLike)) !== 0) {
15
+ return { kind: 'builtIn', builtIn: 'void' };
16
+ }
17
+ // The non-nullable version of `unknown` is some ObjectType, so check first...
18
+ if ((type.flags & (ts.TypeFlags.Unknown | ts.TypeFlags.Any)) !== 0) {
19
+ return { kind: 'builtIn', builtIn: 'any' };
20
+ }
13
21
  type = type.getNonNullableType();
14
22
  const mapValuesType = (0, types_1.mapElementType)(type, typeChecker);
15
23
  if (mapValuesType.result === 'map') {
@@ -53,9 +61,6 @@ function determineJsiiType(typeChecker, type) {
53
61
  message: `Type unions or intersections are not supported in examples, got: ${typeChecker.typeToString(type)}`,
54
62
  };
55
63
  }
56
- if ((type.flags & (ts.TypeFlags.Void | ts.TypeFlags.VoidLike)) !== 0) {
57
- return { kind: 'builtIn', builtIn: 'void' };
58
- }
59
64
  return { kind: 'unknown' };
60
65
  }
61
66
  exports.determineJsiiType = determineJsiiType;