@soundscript/soundscript 0.1.13 → 0.1.15

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 (441) hide show
  1. package/package.json +15 -6
  2. package/project-transform/index.js +2 -0
  3. package/project-transform/index.ts +8 -0
  4. package/project-transform/src/annotation_syntax.js +948 -0
  5. package/project-transform/src/annotation_syntax.ts +1217 -0
  6. package/project-transform/src/build_package.js +475 -0
  7. package/project-transform/src/build_package.ts +683 -0
  8. package/project-transform/src/bundled/portable-web-globals.d.ts +153 -0
  9. package/project-transform/src/bundled/runtime_externs.js +220 -0
  10. package/project-transform/src/bundled/runtime_externs.ts +237 -0
  11. package/project-transform/src/bundled/sound-libs/lib.decorators.d.ts +385 -0
  12. package/project-transform/src/bundled/sound-libs/lib.decorators.legacy.d.ts +22 -0
  13. package/project-transform/src/bundled/sound-libs/lib.dom.asynciterable.d.ts +42 -0
  14. package/project-transform/src/bundled/sound-libs/lib.dom.d.ts +39440 -0
  15. package/project-transform/src/bundled/sound-libs/lib.es2015.collection.d.ts +149 -0
  16. package/project-transform/src/bundled/sound-libs/lib.es2015.core.d.ts +657 -0
  17. package/project-transform/src/bundled/sound-libs/lib.es2015.d.ts +28 -0
  18. package/project-transform/src/bundled/sound-libs/lib.es2015.generator.d.ts +77 -0
  19. package/project-transform/src/bundled/sound-libs/lib.es2015.iterable.d.ts +616 -0
  20. package/project-transform/src/bundled/sound-libs/lib.es2015.promise.d.ts +80 -0
  21. package/project-transform/src/bundled/sound-libs/lib.es2015.proxy.d.ts +128 -0
  22. package/project-transform/src/bundled/sound-libs/lib.es2015.reflect.d.ts +144 -0
  23. package/project-transform/src/bundled/sound-libs/lib.es2015.symbol.d.ts +46 -0
  24. package/project-transform/src/bundled/sound-libs/lib.es2015.symbol.wellknown.d.ts +170 -0
  25. package/project-transform/src/bundled/sound-libs/lib.es2016.array.include.d.ts +116 -0
  26. package/project-transform/src/bundled/sound-libs/lib.es2016.d.ts +21 -0
  27. package/project-transform/src/bundled/sound-libs/lib.es2017.arraybuffer.d.ts +21 -0
  28. package/project-transform/src/bundled/sound-libs/lib.es2017.d.ts +26 -0
  29. package/project-transform/src/bundled/sound-libs/lib.es2017.date.d.ts +31 -0
  30. package/project-transform/src/bundled/sound-libs/lib.es2017.object.d.ts +49 -0
  31. package/project-transform/src/bundled/sound-libs/lib.es2017.string.d.ts +45 -0
  32. package/project-transform/src/bundled/sound-libs/lib.es2017.typedarrays.d.ts +53 -0
  33. package/project-transform/src/bundled/sound-libs/lib.es2018.asyncgenerator.d.ts +77 -0
  34. package/project-transform/src/bundled/sound-libs/lib.es2018.asynciterable.d.ts +57 -0
  35. package/project-transform/src/bundled/sound-libs/lib.es2018.d.ts +24 -0
  36. package/project-transform/src/bundled/sound-libs/lib.es2018.promise.d.ts +30 -0
  37. package/project-transform/src/bundled/sound-libs/lib.es2018.regexp.d.ts +37 -0
  38. package/project-transform/src/bundled/sound-libs/lib.es2019.array.d.ts +79 -0
  39. package/project-transform/src/bundled/sound-libs/lib.es2019.d.ts +24 -0
  40. package/project-transform/src/bundled/sound-libs/lib.es2019.object.d.ts +47 -0
  41. package/project-transform/src/bundled/sound-libs/lib.es2019.string.d.ts +37 -0
  42. package/project-transform/src/bundled/sound-libs/lib.es2019.symbol.d.ts +24 -0
  43. package/project-transform/src/bundled/sound-libs/lib.es2020.bigint.d.ts +765 -0
  44. package/project-transform/src/bundled/sound-libs/lib.es2020.d.ts +27 -0
  45. package/project-transform/src/bundled/sound-libs/lib.es2020.date.d.ts +42 -0
  46. package/project-transform/src/bundled/sound-libs/lib.es2020.number.d.ts +28 -0
  47. package/project-transform/src/bundled/sound-libs/lib.es2020.promise.d.ts +49 -0
  48. package/project-transform/src/bundled/sound-libs/lib.es2020.string.d.ts +44 -0
  49. package/project-transform/src/bundled/sound-libs/lib.es2020.symbol.wellknown.d.ts +41 -0
  50. package/project-transform/src/bundled/sound-libs/lib.es2021.d.ts +23 -0
  51. package/project-transform/src/bundled/sound-libs/lib.es2021.promise.d.ts +48 -0
  52. package/project-transform/src/bundled/sound-libs/lib.es2021.string.d.ts +33 -0
  53. package/project-transform/src/bundled/sound-libs/lib.es2021.weakref.d.ts +78 -0
  54. package/project-transform/src/bundled/sound-libs/lib.es2022.array.d.ts +121 -0
  55. package/project-transform/src/bundled/sound-libs/lib.es2022.d.ts +25 -0
  56. package/project-transform/src/bundled/sound-libs/lib.es2022.error.d.ts +75 -0
  57. package/project-transform/src/bundled/sound-libs/lib.es2022.object.d.ts +26 -0
  58. package/project-transform/src/bundled/sound-libs/lib.es2022.regexp.d.ts +39 -0
  59. package/project-transform/src/bundled/sound-libs/lib.es2022.string.d.ts +25 -0
  60. package/project-transform/src/bundled/sound-libs/lib.es2023.array.d.ts +924 -0
  61. package/project-transform/src/bundled/sound-libs/lib.es2023.collection.d.ts +21 -0
  62. package/project-transform/src/bundled/sound-libs/lib.es2023.d.ts +22 -0
  63. package/project-transform/src/bundled/sound-libs/lib.es2024.arraybuffer.d.ts +65 -0
  64. package/project-transform/src/bundled/sound-libs/lib.es2024.collection.d.ts +29 -0
  65. package/project-transform/src/bundled/sound-libs/lib.es2024.d.ts +26 -0
  66. package/project-transform/src/bundled/sound-libs/lib.es2024.object.d.ts +33 -0
  67. package/project-transform/src/bundled/sound-libs/lib.es2024.promise.d.ts +35 -0
  68. package/project-transform/src/bundled/sound-libs/lib.es2024.regexp.d.ts +25 -0
  69. package/project-transform/src/bundled/sound-libs/lib.es2024.string.d.ts +29 -0
  70. package/project-transform/src/bundled/sound-libs/lib.es5.d.ts +4924 -0
  71. package/project-transform/src/bundled/sound_stdlib.js +142 -0
  72. package/project-transform/src/bundled/sound_stdlib.ts +180 -0
  73. package/project-transform/src/checker/analyze_project.js +1361 -0
  74. package/project-transform/src/checker/analyze_project.ts +2246 -0
  75. package/project-transform/src/checker/diagnostics.js +112 -0
  76. package/project-transform/src/checker/diagnostics.ts +222 -0
  77. package/project-transform/src/checker/engine/context.js +235 -0
  78. package/project-transform/src/checker/engine/context.ts +340 -0
  79. package/project-transform/src/checker/engine/diagnostic_codes.js +72 -0
  80. package/project-transform/src/checker/engine/diagnostic_codes.ts +95 -0
  81. package/project-transform/src/checker/engine/facts.js +35 -0
  82. package/project-transform/src/checker/engine/facts.ts +48 -0
  83. package/project-transform/src/checker/engine/types.js +1 -0
  84. package/project-transform/src/checker/engine/types.ts +485 -0
  85. package/project-transform/src/checker/proof_escape_hatch_diagnostics.js +104 -0
  86. package/project-transform/src/checker/proof_escape_hatch_diagnostics.ts +173 -0
  87. package/project-transform/src/checker/rules/async_surface.js +231 -0
  88. package/project-transform/src/checker/rules/async_surface.ts +335 -0
  89. package/project-transform/src/checker/rules/class_lifecycle.js +798 -0
  90. package/project-transform/src/checker/rules/class_lifecycle.ts +1276 -0
  91. package/project-transform/src/checker/rules/directive_validation.js +571 -0
  92. package/project-transform/src/checker/rules/directive_validation.ts +938 -0
  93. package/project-transform/src/checker/rules/directives.js +23 -0
  94. package/project-transform/src/checker/rules/directives.ts +25 -0
  95. package/project-transform/src/checker/rules/flow.js +202 -0
  96. package/project-transform/src/checker/rules/flow.ts +333 -0
  97. package/project-transform/src/checker/rules/flow_facts.js +601 -0
  98. package/project-transform/src/checker/rules/flow_facts.ts +978 -0
  99. package/project-transform/src/checker/rules/flow_invalidation.js +1119 -0
  100. package/project-transform/src/checker/rules/flow_invalidation.ts +2150 -0
  101. package/project-transform/src/checker/rules/flow_shared.js +2822 -0
  102. package/project-transform/src/checker/rules/flow_shared.ts +4383 -0
  103. package/project-transform/src/checker/rules/foreign_boundary.js +120 -0
  104. package/project-transform/src/checker/rules/foreign_boundary.ts +196 -0
  105. package/project-transform/src/checker/rules/foreign_projection.js +279 -0
  106. package/project-transform/src/checker/rules/foreign_projection.ts +425 -0
  107. package/project-transform/src/checker/rules/generated_helpers.js +13 -0
  108. package/project-transform/src/checker/rules/generated_helpers.ts +18 -0
  109. package/project-transform/src/checker/rules/index.js +35 -0
  110. package/project-transform/src/checker/rules/index.ts +49 -0
  111. package/project-transform/src/checker/rules/namespace_object.js +845 -0
  112. package/project-transform/src/checker/rules/namespace_object.ts +1224 -0
  113. package/project-transform/src/checker/rules/non_ordinary_recovery.js +1328 -0
  114. package/project-transform/src/checker/rules/non_ordinary_recovery.ts +2391 -0
  115. package/project-transform/src/checker/rules/null_prototype.js +3 -0
  116. package/project-transform/src/checker/rules/null_prototype.ts +6 -0
  117. package/project-transform/src/checker/rules/overloads.js +181 -0
  118. package/project-transform/src/checker/rules/overloads.ts +317 -0
  119. package/project-transform/src/checker/rules/predicate_verification.js +691 -0
  120. package/project-transform/src/checker/rules/predicate_verification.ts +1088 -0
  121. package/project-transform/src/checker/rules/prototype_hardening.js +237 -0
  122. package/project-transform/src/checker/rules/prototype_hardening.ts +343 -0
  123. package/project-transform/src/checker/rules/receiver_discipline.js +263 -0
  124. package/project-transform/src/checker/rules/receiver_discipline.ts +356 -0
  125. package/project-transform/src/checker/rules/relations.js +6861 -0
  126. package/project-transform/src/checker/rules/relations.ts +12158 -0
  127. package/project-transform/src/checker/rules/resolved_builtins.js +274 -0
  128. package/project-transform/src/checker/rules/resolved_builtins.ts +438 -0
  129. package/project-transform/src/checker/rules/trust.js +217 -0
  130. package/project-transform/src/checker/rules/trust.ts +301 -0
  131. package/project-transform/src/checker/rules/type_guards.js +173 -0
  132. package/project-transform/src/checker/rules/type_guards.ts +257 -0
  133. package/project-transform/src/checker/rules/universal.js +17 -0
  134. package/project-transform/src/checker/rules/universal.ts +22 -0
  135. package/project-transform/src/checker/rules/unsafe_value_origin.js +80 -0
  136. package/project-transform/src/checker/rules/unsafe_value_origin.ts +125 -0
  137. package/project-transform/src/checker/rules/unsound_imports.js +218 -0
  138. package/project-transform/src/checker/rules/unsound_imports.ts +301 -0
  139. package/project-transform/src/checker/rules/unsound_syntax.js +1695 -0
  140. package/project-transform/src/checker/rules/unsound_syntax.ts +2540 -0
  141. package/project-transform/src/checker/rules/value_types.js +206 -0
  142. package/project-transform/src/checker/rules/value_types.ts +407 -0
  143. package/project-transform/src/checker/timing.js +43 -0
  144. package/project-transform/src/checker/timing.ts +78 -0
  145. package/project-transform/src/checker/unsupported_feature_messages.js +337 -0
  146. package/project-transform/src/checker/unsupported_feature_messages.ts +531 -0
  147. package/project-transform/src/cli.js +892 -0
  148. package/project-transform/src/cli.ts +1476 -0
  149. package/project-transform/src/compiler/compile_project.js +319 -0
  150. package/project-transform/src/compiler/compile_project.ts +508 -0
  151. package/project-transform/src/compiler/errors.js +10 -0
  152. package/project-transform/src/compiler/errors.ts +29 -0
  153. package/project-transform/src/compiler/ir.js +1 -0
  154. package/project-transform/src/compiler/ir.ts +1526 -0
  155. package/project-transform/src/compiler/lower.js +30550 -0
  156. package/project-transform/src/compiler/lower.ts +43645 -0
  157. package/project-transform/src/compiler/lower_arrays.js +140 -0
  158. package/project-transform/src/compiler/lower_arrays.ts +190 -0
  159. package/project-transform/src/compiler/lower_strings.js +121 -0
  160. package/project-transform/src/compiler/lower_strings.ts +198 -0
  161. package/project-transform/src/compiler/lower_tagged.js +329 -0
  162. package/project-transform/src/compiler/lower_tagged.ts +427 -0
  163. package/project-transform/src/compiler/lower_views.js +171 -0
  164. package/project-transform/src/compiler/lower_views.ts +251 -0
  165. package/project-transform/src/compiler/object_keys.js +25 -0
  166. package/project-transform/src/compiler/object_keys.ts +35 -0
  167. package/project-transform/src/compiler/runtime_ir.js +30 -0
  168. package/project-transform/src/compiler/runtime_ir.ts +727 -0
  169. package/project-transform/src/compiler/tagged_boundary.js +18 -0
  170. package/project-transform/src/compiler/tagged_boundary.ts +37 -0
  171. package/project-transform/src/compiler/toolchain.js +170 -0
  172. package/project-transform/src/compiler/toolchain.ts +229 -0
  173. package/project-transform/src/compiler/unicode_case_data.js +2102 -0
  174. package/project-transform/src/compiler/unicode_case_data.ts +2112 -0
  175. package/project-transform/src/compiler/wasm_js_host_runtime.js +656 -0
  176. package/project-transform/src/compiler/wasm_js_host_runtime.ts +762 -0
  177. package/project-transform/src/compiler/wat_arrays.js +3132 -0
  178. package/project-transform/src/compiler/wat_arrays.ts +3768 -0
  179. package/project-transform/src/compiler/wat_emitter.js +17952 -0
  180. package/project-transform/src/compiler/wat_emitter.ts +22812 -0
  181. package/project-transform/src/compiler/wat_strings.js +129 -0
  182. package/project-transform/src/compiler/wat_strings.ts +187 -0
  183. package/project-transform/src/compiler/wat_tagged.js +548 -0
  184. package/project-transform/src/compiler/wat_tagged.ts +674 -0
  185. package/project-transform/src/compiler_generator_runner.js +153 -0
  186. package/project-transform/src/compiler_generator_runner.ts +171 -0
  187. package/project-transform/src/compiler_object_test_helpers.js +69 -0
  188. package/project-transform/src/compiler_object_test_helpers.ts +96 -0
  189. package/project-transform/src/compiler_promise_runner.js +2116 -0
  190. package/project-transform/src/compiler_promise_runner.ts +2184 -0
  191. package/project-transform/src/compiler_test_helpers.js +854 -0
  192. package/project-transform/src/compiler_test_helpers.ts +1087 -0
  193. package/project-transform/src/config.js +568 -0
  194. package/project-transform/src/config.ts +892 -0
  195. package/project-transform/src/diagnostic_metadata.js +67 -0
  196. package/project-transform/src/diagnostic_metadata.ts +99 -0
  197. package/project-transform/src/diagnostic_reference.js +1368 -0
  198. package/project-transform/src/diagnostic_reference.ts +1523 -0
  199. package/project-transform/src/editor_diagnostics_worker.js +176 -0
  200. package/project-transform/src/editor_diagnostics_worker.ts +250 -0
  201. package/project-transform/src/editor_projection.js +224 -0
  202. package/project-transform/src/editor_projection.ts +421 -0
  203. package/project-transform/src/frontend/builtin_expanded_program_test_cleanup.js +47 -0
  204. package/project-transform/src/frontend/builtin_expanded_program_test_cleanup.ts +72 -0
  205. package/project-transform/src/frontend/builtin_macro_support.js +842 -0
  206. package/project-transform/src/frontend/builtin_macro_support.ts +1386 -0
  207. package/project-transform/src/frontend/builtin_macros.js +409 -0
  208. package/project-transform/src/frontend/builtin_macros.ts +542 -0
  209. package/project-transform/src/frontend/component_poc_runtime.js +279 -0
  210. package/project-transform/src/frontend/component_poc_runtime.ts +372 -0
  211. package/project-transform/src/frontend/css_macro.js +148 -0
  212. package/project-transform/src/frontend/css_macro.ts +222 -0
  213. package/project-transform/src/frontend/derive_macros.js +2072 -0
  214. package/project-transform/src/frontend/derive_macros.ts +3188 -0
  215. package/project-transform/src/frontend/embedded_fragment_support.js +106 -0
  216. package/project-transform/src/frontend/embedded_fragment_support.ts +172 -0
  217. package/project-transform/src/frontend/error_normalization.js +403 -0
  218. package/project-transform/src/frontend/error_normalization.ts +832 -0
  219. package/project-transform/src/frontend/error_stdlib_support.js +1 -0
  220. package/project-transform/src/frontend/error_stdlib_support.ts +6 -0
  221. package/project-transform/src/frontend/expand_project.js +169 -0
  222. package/project-transform/src/frontend/expand_project.ts +248 -0
  223. package/project-transform/src/frontend/format_soundscript.js +297 -0
  224. package/project-transform/src/frontend/format_soundscript.ts +582 -0
  225. package/project-transform/src/frontend/graphql_macro.js +174 -0
  226. package/project-transform/src/frontend/graphql_macro.ts +253 -0
  227. package/project-transform/src/frontend/hash_context.js +83 -0
  228. package/project-transform/src/frontend/hash_context.ts +113 -0
  229. package/project-transform/src/frontend/hkt_macro.js +448 -0
  230. package/project-transform/src/frontend/hkt_macro.ts +897 -0
  231. package/project-transform/src/frontend/import_binding_usage.js +190 -0
  232. package/project-transform/src/frontend/import_binding_usage.ts +277 -0
  233. package/project-transform/src/frontend/macro_advanced_backend_adapter.js +58 -0
  234. package/project-transform/src/frontend/macro_advanced_backend_adapter.ts +123 -0
  235. package/project-transform/src/frontend/macro_advanced_context.js +826 -0
  236. package/project-transform/src/frontend/macro_advanced_context.ts +1102 -0
  237. package/project-transform/src/frontend/macro_advanced_output.js +21 -0
  238. package/project-transform/src/frontend/macro_advanced_output.ts +41 -0
  239. package/project-transform/src/frontend/macro_api.js +353 -0
  240. package/project-transform/src/frontend/macro_api.ts +1722 -0
  241. package/project-transform/src/frontend/macro_api_internal.js +35 -0
  242. package/project-transform/src/frontend/macro_api_internal.ts +80 -0
  243. package/project-transform/src/frontend/macro_api_module_support.js +39 -0
  244. package/project-transform/src/frontend/macro_api_module_support.ts +65 -0
  245. package/project-transform/src/frontend/macro_backend_adapter.js +272 -0
  246. package/project-transform/src/frontend/macro_backend_adapter.ts +420 -0
  247. package/project-transform/src/frontend/macro_context.js +816 -0
  248. package/project-transform/src/frontend/macro_context.ts +1105 -0
  249. package/project-transform/src/frontend/macro_debug.js +99 -0
  250. package/project-transform/src/frontend/macro_debug.ts +157 -0
  251. package/project-transform/src/frontend/macro_definition_support.js +28 -0
  252. package/project-transform/src/frontend/macro_definition_support.ts +73 -0
  253. package/project-transform/src/frontend/macro_errors.js +40 -0
  254. package/project-transform/src/frontend/macro_errors.ts +70 -0
  255. package/project-transform/src/frontend/macro_expander.js +919 -0
  256. package/project-transform/src/frontend/macro_expander.ts +1611 -0
  257. package/project-transform/src/frontend/macro_factory_support.js +176 -0
  258. package/project-transform/src/frontend/macro_factory_support.ts +263 -0
  259. package/project-transform/src/frontend/macro_host_ast_internal.js +64 -0
  260. package/project-transform/src/frontend/macro_host_ast_internal.ts +109 -0
  261. package/project-transform/src/frontend/macro_index.js +27 -0
  262. package/project-transform/src/frontend/macro_index.ts +50 -0
  263. package/project-transform/src/frontend/macro_loader.js +281 -0
  264. package/project-transform/src/frontend/macro_loader.ts +506 -0
  265. package/project-transform/src/frontend/macro_operand_semantics.js +838 -0
  266. package/project-transform/src/frontend/macro_operand_semantics.ts +1489 -0
  267. package/project-transform/src/frontend/macro_output.js +54 -0
  268. package/project-transform/src/frontend/macro_output.ts +123 -0
  269. package/project-transform/src/frontend/macro_parser.js +611 -0
  270. package/project-transform/src/frontend/macro_parser.ts +832 -0
  271. package/project-transform/src/frontend/macro_resolver.js +69 -0
  272. package/project-transform/src/frontend/macro_resolver.ts +125 -0
  273. package/project-transform/src/frontend/macro_rewrite.js +285 -0
  274. package/project-transform/src/frontend/macro_rewrite.ts +442 -0
  275. package/project-transform/src/frontend/macro_runtime_support.js +232 -0
  276. package/project-transform/src/frontend/macro_runtime_support.ts +324 -0
  277. package/project-transform/src/frontend/macro_scanner.js +393 -0
  278. package/project-transform/src/frontend/macro_scanner.ts +455 -0
  279. package/project-transform/src/frontend/macro_semantic_backend_adapter.js +87 -0
  280. package/project-transform/src/frontend/macro_semantic_backend_adapter.ts +166 -0
  281. package/project-transform/src/frontend/macro_semantic_context.js +5 -0
  282. package/project-transform/src/frontend/macro_semantic_context.ts +12 -0
  283. package/project-transform/src/frontend/macro_semantic_output.js +24 -0
  284. package/project-transform/src/frontend/macro_semantic_output.ts +47 -0
  285. package/project-transform/src/frontend/macro_semantic_types.js +1 -0
  286. package/project-transform/src/frontend/macro_semantic_types.ts +98 -0
  287. package/project-transform/src/frontend/macro_semantics.js +1172 -0
  288. package/project-transform/src/frontend/macro_semantics.ts +1502 -0
  289. package/project-transform/src/frontend/macro_site_kind_support.js +164 -0
  290. package/project-transform/src/frontend/macro_site_kind_support.ts +255 -0
  291. package/project-transform/src/frontend/macro_syntax_internal.js +1950 -0
  292. package/project-transform/src/frontend/macro_syntax_internal.ts +3338 -0
  293. package/project-transform/src/frontend/macro_templates.js +57 -0
  294. package/project-transform/src/frontend/macro_templates.ts +143 -0
  295. package/project-transform/src/frontend/macro_test_helpers.js +82 -0
  296. package/project-transform/src/frontend/macro_test_helpers.ts +136 -0
  297. package/project-transform/src/frontend/macro_types.js +1 -0
  298. package/project-transform/src/frontend/macro_types.ts +103 -0
  299. package/project-transform/src/frontend/macro_vm.js +39 -0
  300. package/project-transform/src/frontend/macro_vm.ts +113 -0
  301. package/project-transform/src/frontend/match_macro.js +885 -0
  302. package/project-transform/src/frontend/match_macro.ts +1220 -0
  303. package/project-transform/src/frontend/numeric_normalization.js +824 -0
  304. package/project-transform/src/frontend/numeric_normalization.ts +1380 -0
  305. package/project-transform/src/frontend/numeric_prelude.js +278 -0
  306. package/project-transform/src/frontend/numeric_prelude.ts +370 -0
  307. package/project-transform/src/frontend/project_frontend.js +2396 -0
  308. package/project-transform/src/frontend/project_frontend.ts +3776 -0
  309. package/project-transform/src/frontend/project_macro_support.js +1401 -0
  310. package/project-transform/src/frontend/project_macro_support.ts +2137 -0
  311. package/project-transform/src/frontend/sql_macro.js +175 -0
  312. package/project-transform/src/frontend/sql_macro.ts +254 -0
  313. package/project-transform/src/frontend/sql_stdlib_support.js +1 -0
  314. package/project-transform/src/frontend/sql_stdlib_support.ts +6 -0
  315. package/project-transform/src/frontend/std_package_support.js +228 -0
  316. package/project-transform/src/frontend/std_package_support.ts +400 -0
  317. package/project-transform/src/frontend/value_normalization.js +306 -0
  318. package/project-transform/src/frontend/value_normalization.ts +599 -0
  319. package/project-transform/src/lsp/project_service.js +4771 -0
  320. package/project-transform/src/lsp/project_service.ts +7580 -0
  321. package/project-transform/src/lsp/protocol.js +9 -0
  322. package/project-transform/src/lsp/protocol.ts +38 -0
  323. package/project-transform/src/lsp/server.js +355 -0
  324. package/project-transform/src/lsp/server.ts +671 -0
  325. package/project-transform/src/lsp/session.js +49 -0
  326. package/project-transform/src/lsp/session.ts +48 -0
  327. package/project-transform/src/lsp/timing.js +43 -0
  328. package/project-transform/src/lsp/timing.ts +76 -0
  329. package/project-transform/src/lsp/transport.js +205 -0
  330. package/project-transform/src/lsp/transport.ts +253 -0
  331. package/project-transform/src/lsp_main.js +5 -0
  332. package/project-transform/src/lsp_main.ts +7 -0
  333. package/project-transform/src/macros.d.ts +1 -0
  334. package/project-transform/src/macros.js +1 -0
  335. package/project-transform/src/macros.ts +1 -0
  336. package/project-transform/src/main.js +24 -0
  337. package/project-transform/src/main.ts +28 -0
  338. package/project-transform/src/platform/host.js +264 -0
  339. package/project-transform/src/platform/host.ts +343 -0
  340. package/project-transform/src/platform/path.js +8 -0
  341. package/project-transform/src/platform/path.ts +20 -0
  342. package/project-transform/src/public_macro_api/macro_api.d.ts +1054 -0
  343. package/project-transform/src/public_macro_api/macro_semantic_types.d.ts +66 -0
  344. package/project-transform/src/public_macro_api/macro_types.d.ts +70 -0
  345. package/project-transform/src/run_program.js +14 -0
  346. package/project-transform/src/run_program.ts +33 -0
  347. package/project-transform/src/runtime/materialize.js +371 -0
  348. package/project-transform/src/runtime/materialize.ts +502 -0
  349. package/project-transform/src/runtime/on_demand.js +203 -0
  350. package/project-transform/src/runtime/on_demand.ts +305 -0
  351. package/project-transform/src/runtime/source_maps.js +205 -0
  352. package/project-transform/src/runtime/source_maps.ts +297 -0
  353. package/project-transform/src/runtime/transform.js +148 -0
  354. package/project-transform/src/runtime/transform.ts +295 -0
  355. package/project-transform/src/service/types.js +1 -0
  356. package/project-transform/src/service/types.ts +22 -0
  357. package/project-transform/src/soundscript_packages.js +477 -0
  358. package/project-transform/src/soundscript_packages.ts +754 -0
  359. package/project-transform/src/soundscript_runtime_specifiers.js +88 -0
  360. package/project-transform/src/soundscript_runtime_specifiers.ts +96 -0
  361. package/project-transform/src/stdlib/async.d.ts +81 -0
  362. package/project-transform/src/stdlib/async.js +213 -0
  363. package/project-transform/src/stdlib/async.ts +315 -0
  364. package/project-transform/src/stdlib/codec.d.ts +32 -0
  365. package/project-transform/src/stdlib/codec.js +30 -0
  366. package/project-transform/src/stdlib/codec.ts +76 -0
  367. package/project-transform/src/stdlib/compare.d.ts +28 -0
  368. package/project-transform/src/stdlib/compare.js +115 -0
  369. package/project-transform/src/stdlib/compare.ts +151 -0
  370. package/project-transform/src/stdlib/css.d.ts +16 -0
  371. package/project-transform/src/stdlib/css.js +9 -0
  372. package/project-transform/src/stdlib/css.ts +28 -0
  373. package/project-transform/src/stdlib/debug.d.ts +2 -0
  374. package/project-transform/src/stdlib/debug.js +9 -0
  375. package/project-transform/src/stdlib/debug.ts +10 -0
  376. package/project-transform/src/stdlib/decode.d.ts +86 -0
  377. package/project-transform/src/stdlib/decode.js +254 -0
  378. package/project-transform/src/stdlib/decode.ts +390 -0
  379. package/project-transform/src/stdlib/derive.d.ts +6 -0
  380. package/project-transform/src/stdlib/derive.js +7 -0
  381. package/project-transform/src/stdlib/derive.ts +7 -0
  382. package/project-transform/src/stdlib/encode.d.ts +100 -0
  383. package/project-transform/src/stdlib/encode.js +130 -0
  384. package/project-transform/src/stdlib/encode.ts +259 -0
  385. package/project-transform/src/stdlib/failures.d.ts +23 -0
  386. package/project-transform/src/stdlib/failures.js +41 -0
  387. package/project-transform/src/stdlib/failures.ts +64 -0
  388. package/project-transform/src/stdlib/fetch.d.ts +67 -0
  389. package/project-transform/src/stdlib/fetch.js +5 -0
  390. package/project-transform/src/stdlib/fetch.ts +11 -0
  391. package/project-transform/src/stdlib/graphql.d.ts +16 -0
  392. package/project-transform/src/stdlib/graphql.js +9 -0
  393. package/project-transform/src/stdlib/graphql.ts +28 -0
  394. package/project-transform/src/stdlib/hash.d.ts +34 -0
  395. package/project-transform/src/stdlib/hash.js +110 -0
  396. package/project-transform/src/stdlib/hash.ts +188 -0
  397. package/project-transform/src/stdlib/hkt.d.ts +40 -0
  398. package/project-transform/src/stdlib/hkt.js +3 -0
  399. package/project-transform/src/stdlib/hkt.ts +41 -0
  400. package/project-transform/src/stdlib/index.d.ts +9 -0
  401. package/project-transform/src/stdlib/index.js +15 -0
  402. package/project-transform/src/stdlib/index.ts +23 -0
  403. package/project-transform/src/stdlib/json.d.ts +125 -0
  404. package/project-transform/src/stdlib/json.js +764 -0
  405. package/project-transform/src/stdlib/json.ts +1034 -0
  406. package/project-transform/src/stdlib/match.d.ts +11 -0
  407. package/project-transform/src/stdlib/match.js +13 -0
  408. package/project-transform/src/stdlib/match.ts +26 -0
  409. package/project-transform/src/stdlib/numerics.d.ts +523 -0
  410. package/project-transform/src/stdlib/numerics.js +1356 -0
  411. package/project-transform/src/stdlib/numerics.ts +1937 -0
  412. package/project-transform/src/stdlib/random.d.ts +19 -0
  413. package/project-transform/src/stdlib/random.js +3 -0
  414. package/project-transform/src/stdlib/random.ts +5 -0
  415. package/project-transform/src/stdlib/result.d.ts +68 -0
  416. package/project-transform/src/stdlib/result.js +139 -0
  417. package/project-transform/src/stdlib/result.ts +248 -0
  418. package/project-transform/src/stdlib/sql.d.ts +22 -0
  419. package/project-transform/src/stdlib/sql.js +23 -0
  420. package/project-transform/src/stdlib/sql.ts +53 -0
  421. package/project-transform/src/stdlib/text.d.ts +24 -0
  422. package/project-transform/src/stdlib/text.js +3 -0
  423. package/project-transform/src/stdlib/text.ts +4 -0
  424. package/project-transform/src/stdlib/thunk.d.ts +2 -0
  425. package/project-transform/src/stdlib/thunk.js +9 -0
  426. package/project-transform/src/stdlib/thunk.ts +15 -0
  427. package/project-transform/src/stdlib/typeclasses.d.ts +57 -0
  428. package/project-transform/src/stdlib/typeclasses.js +78 -0
  429. package/project-transform/src/stdlib/typeclasses.ts +173 -0
  430. package/project-transform/src/stdlib/url.d.ts +37 -0
  431. package/project-transform/src/stdlib/url.js +3 -0
  432. package/project-transform/src/stdlib/url.ts +4 -0
  433. package/project-transform/src/stdlib/value.d.ts +9 -0
  434. package/project-transform/src/stdlib/value.js +104 -0
  435. package/project-transform/src/stdlib/value.ts +133 -0
  436. package/project-transform/src/test_installed_stdlib.js +147 -0
  437. package/project-transform/src/test_installed_stdlib.ts +245 -0
  438. package/project-transform/src/test_macro_package_fixture.js +50 -0
  439. package/project-transform/src/test_macro_package_fixture.ts +68 -0
  440. package/project-transform/src/value_deep_safe.js +191 -0
  441. package/project-transform/src/value_deep_safe.ts +273 -0
@@ -0,0 +1,173 @@
1
+ import ts from 'typescript';
2
+
3
+ import { SOUND_DIAGNOSTIC_CODES, SOUND_DIAGNOSTIC_MESSAGES } from './engine/diagnostic_codes.ts';
4
+ import type { AnalysisContext } from './engine/types.ts';
5
+ import { getNodeDiagnosticRange, type SoundDiagnostic } from './diagnostics.ts';
6
+
7
+ const ANY_TYPE_EXAMPLE =
8
+ 'Replace `any` with `unknown`, then narrow or validate before use, or spell the precise type you expect.';
9
+ const TYPE_ASSERTION_EXAMPLE =
10
+ 'Replace the assertion with a real runtime check, a validated interop boundary, or a helper that already returns the target type honestly.';
11
+ const NON_NULL_ASSERTION_EXAMPLE =
12
+ 'Check the value first, or normalize it with a real fallback before using it as present.';
13
+ const DEFINITE_ASSIGNMENT_ASSERTION_EXAMPLE =
14
+ 'Initialize the declaration directly, widen it to include `undefined`, or move the unchecked assumption to a local `// #[unsafe] let x!: T` site that the backend can still represent honestly.';
15
+
16
+ function createDiagnostic(
17
+ node: ts.Node,
18
+ code:
19
+ | typeof SOUND_DIAGNOSTIC_CODES.anyType
20
+ | typeof SOUND_DIAGNOSTIC_CODES.definiteAssignmentAssertion
21
+ | typeof SOUND_DIAGNOSTIC_CODES.nonNullAssertion
22
+ | typeof SOUND_DIAGNOSTIC_CODES.typeAssertion,
23
+ message: string,
24
+ options?: {
25
+ hint?: string;
26
+ metadata?: SoundDiagnostic['metadata'];
27
+ notes?: string[];
28
+ },
29
+ ): SoundDiagnostic {
30
+ return {
31
+ source: 'sound',
32
+ code,
33
+ category: 'error',
34
+ message,
35
+ metadata: options?.metadata,
36
+ notes: options?.notes,
37
+ hint: options?.hint,
38
+ ...getNodeDiagnosticRange(node),
39
+ };
40
+ }
41
+
42
+ export function createAnyTypeDiagnostic(node: ts.Node): SoundDiagnostic {
43
+ return createDiagnostic(
44
+ node,
45
+ SOUND_DIAGNOSTIC_CODES.anyType,
46
+ SOUND_DIAGNOSTIC_MESSAGES.anyType,
47
+ {
48
+ metadata: {
49
+ rule: 'any_type',
50
+ fixability: 'local_rewrite',
51
+ invariant:
52
+ 'Checked soundscript code must preserve honest type information instead of erasing it to `any`.',
53
+ replacementFamily: 'unknown_plus_validation',
54
+ counterexample:
55
+ 'Using `any` lets unchecked assumptions flow outward and disables the proof obligations soundscript relies on.',
56
+ example: ANY_TYPE_EXAMPLE,
57
+ },
58
+ notes: [
59
+ '`any` erases the type information that checked soundscript code relies on.',
60
+ `Example: ${ANY_TYPE_EXAMPLE}`,
61
+ ],
62
+ hint:
63
+ 'Replace `any` with `unknown` plus validation, or write the precise type directly.',
64
+ },
65
+ );
66
+ }
67
+
68
+ export function createTypeAssertionDiagnostic(
69
+ context: AnalysisContext,
70
+ node: ts.TypeAssertion | ts.AsExpression,
71
+ ): SoundDiagnostic {
72
+ const expressionType = context.checker.typeToString(context.checker.getTypeAtLocation(node.expression));
73
+ const assertedType = context.checker.typeToString(context.checker.getTypeFromTypeNode(node.type));
74
+
75
+ return createDiagnostic(
76
+ node,
77
+ SOUND_DIAGNOSTIC_CODES.typeAssertion,
78
+ SOUND_DIAGNOSTIC_MESSAGES.typeAssertion,
79
+ {
80
+ metadata: {
81
+ rule: 'unchecked_type_assertion',
82
+ fixability: 'local_rewrite',
83
+ invariant:
84
+ 'Checked soundscript code must prove the target type instead of asserting it without evidence.',
85
+ replacementFamily: 'control_flow_narrowing_or_boundary_validation',
86
+ evidence: [
87
+ { label: 'expressionType', value: expressionType },
88
+ { label: 'assertedType', value: assertedType },
89
+ ],
90
+ counterexample:
91
+ 'A type assertion can claim a value has structure or variants that the checker never proved.',
92
+ example: TYPE_ASSERTION_EXAMPLE,
93
+ },
94
+ notes: [
95
+ `This assertion changes the type from '${expressionType}' to '${assertedType}' without a checked proof.`,
96
+ `Example: ${TYPE_ASSERTION_EXAMPLE}`,
97
+ ],
98
+ hint:
99
+ 'Use narrowing, validation, or an interop boundary instead of asserting the target type.',
100
+ },
101
+ );
102
+ }
103
+
104
+ export function createNonNullAssertionDiagnostic(
105
+ context: AnalysisContext,
106
+ node: ts.NonNullExpression,
107
+ ): SoundDiagnostic {
108
+ const expressionType = context.checker.typeToString(context.checker.getTypeAtLocation(node.expression));
109
+
110
+ return createDiagnostic(
111
+ node,
112
+ SOUND_DIAGNOSTIC_CODES.nonNullAssertion,
113
+ SOUND_DIAGNOSTIC_MESSAGES.nonNullAssertion,
114
+ {
115
+ metadata: {
116
+ rule: 'unchecked_non_null_assertion',
117
+ fixability: 'local_rewrite',
118
+ invariant:
119
+ 'Checked soundscript code must prove that maybe-null values are present before using them as non-null.',
120
+ replacementFamily: 'explicit_null_check',
121
+ evidence: [{ label: 'expressionType', value: expressionType }],
122
+ counterexample:
123
+ 'A non-null assertion can pretend a maybe-null value is present even though another path still allows `null` or `undefined`.',
124
+ example: NON_NULL_ASSERTION_EXAMPLE,
125
+ },
126
+ notes: [
127
+ `This expression has type '${expressionType}', but \`!\` skips the proof that it is present.`,
128
+ `Example: ${NON_NULL_ASSERTION_EXAMPLE}`,
129
+ ],
130
+ hint:
131
+ 'Re-check the value or provide an explicit fallback before using it as non-null.',
132
+ },
133
+ );
134
+ }
135
+
136
+ export function createDefiniteAssignmentAssertionDiagnostic(
137
+ context: AnalysisContext,
138
+ node: ts.VariableDeclaration | ts.PropertyDeclaration,
139
+ ): SoundDiagnostic {
140
+ const typeText = node.type
141
+ ? context.checker.typeToString(context.checker.getTypeFromTypeNode(node.type))
142
+ : context.checker.typeToString(context.checker.getTypeAtLocation(node.name));
143
+ const targetText = ts.isIdentifier(node.name) ? node.name.text : node.name.getText();
144
+ const diagnosticNode = node.exclamationToken ?? node.name;
145
+
146
+ return createDiagnostic(
147
+ diagnosticNode,
148
+ SOUND_DIAGNOSTIC_CODES.definiteAssignmentAssertion,
149
+ SOUND_DIAGNOSTIC_MESSAGES.definiteAssignmentAssertion,
150
+ {
151
+ metadata: {
152
+ rule: 'unchecked_definite_assignment_assertion',
153
+ fixability: 'local_rewrite',
154
+ invariant:
155
+ 'Checked soundscript code must not claim that storage is initialized before the checker can prove that write happened.',
156
+ replacementFamily: 'initializer_or_explicit_optional_state',
157
+ evidence: [
158
+ { label: 'target', value: targetText },
159
+ { label: 'assertedType', value: typeText },
160
+ ],
161
+ counterexample:
162
+ 'A definite-assignment assertion can let code read an uninitialized local or field as if the promised value already existed.',
163
+ example: DEFINITE_ASSIGNMENT_ASSERTION_EXAMPLE,
164
+ },
165
+ notes: [
166
+ `This declaration claims '${targetText}' is definitely assigned as '${typeText}' without a checked proof.`,
167
+ `Example: ${DEFINITE_ASSIGNMENT_ASSERTION_EXAMPLE}`,
168
+ ],
169
+ hint:
170
+ 'Add an initializer, widen the type to include absence, or move the unchecked claim to a supported local unsafe site.',
171
+ },
172
+ );
173
+ }
@@ -0,0 +1,231 @@
1
+ import ts from 'typescript';
2
+ import { SOUND_DIAGNOSTIC_CODES, SOUND_DIAGNOSTIC_MESSAGES } from '../engine/diagnostic_codes.js';
3
+ import { getNodeDiagnosticRange } from '../diagnostics.js';
4
+ import { isForeignSourceFile } from '../../soundscript_packages.js';
5
+ import { matchesResolvedBuiltinCallableValue, matchesResolvedBuiltinSignature, } from './resolved_builtins.js';
6
+ function describeSurfaceKind(surfaceKind) {
7
+ switch (surfaceKind) {
8
+ case 'thenable surface':
9
+ return 'structural thenable';
10
+ case 'awaited thenable':
11
+ return 'thenable awaited through `await`';
12
+ case 'promise resolve thenable':
13
+ return 'thenable normalized through `Promise.resolve`';
14
+ case 'promise subclass':
15
+ return 'Promise subclass';
16
+ }
17
+ }
18
+ function createDiagnostic(info) {
19
+ return {
20
+ source: 'sound',
21
+ code: SOUND_DIAGNOSTIC_CODES.unsupportedAsyncSurface,
22
+ category: 'error',
23
+ message: SOUND_DIAGNOSTIC_MESSAGES.unsupportedAsyncSurface,
24
+ metadata: {
25
+ rule: 'unsupported_async_surface',
26
+ primarySymbol: info.primarySymbol,
27
+ fixability: 'api_redesign',
28
+ invariant: 'soundscript only models compiler-owned Promise semantics, not structural thenables or Promise subclass behavior.',
29
+ replacementFamily: 'builtin_promise_surface',
30
+ evidence: [
31
+ { label: 'surfaceKind', value: info.surfaceKind },
32
+ { label: 'surfaceText', value: info.surfaceText },
33
+ ],
34
+ counterexample: 'Structural thenables can run arbitrary fulfillment behavior outside the compiler-owned Promise semantics soundscript models.',
35
+ example: `Replace \`${info.surfaceText}\` with \`Promise<number>\`, or normalize the foreign thenable at a boundary before it reaches checked soundscript code.`,
36
+ },
37
+ notes: [
38
+ `This async surface uses \`${info.surfaceText}\`, which is a ${describeSurfaceKind(info.surfaceKind)} rather than a builtin \`Promise<T>\` surface.`,
39
+ `Example: Replace \`${info.surfaceText}\` with \`Promise<number>\`, or normalize the foreign thenable at a boundary before it reaches checked soundscript code.`,
40
+ ],
41
+ hint: 'Use plain `Promise<T>` surfaces in soundscript, and normalize foreign thenables at the boundary.',
42
+ ...getNodeDiagnosticRange(info.node),
43
+ };
44
+ }
45
+ function resolveAliasedSymbol(checker, symbol) {
46
+ let current = symbol;
47
+ while ((current.flags & ts.SymbolFlags.Alias) !== 0) {
48
+ const aliased = checker.getAliasedSymbol(current);
49
+ if (aliased === current) {
50
+ break;
51
+ }
52
+ current = aliased;
53
+ }
54
+ return current;
55
+ }
56
+ function isDeclarationBackedBuiltinSymbolNamed(checker, symbol, name) {
57
+ if (!symbol) {
58
+ return false;
59
+ }
60
+ const resolved = resolveAliasedSymbol(checker, symbol);
61
+ if (resolved.getName() !== name) {
62
+ return false;
63
+ }
64
+ const declarations = resolved.declarations ?? [];
65
+ return declarations.length > 0 &&
66
+ declarations.every((declaration) => declaration.getSourceFile().isDeclarationFile);
67
+ }
68
+ function getPromisedType(checker, type) {
69
+ return checker.getPromisedTypeOfPromise(type);
70
+ }
71
+ function getSurfaceText(context, node) {
72
+ if (ts.isTypeReferenceNode(node) ||
73
+ ts.isImportTypeNode(node) ||
74
+ ts.isTypeLiteralNode(node)) {
75
+ return node.getText();
76
+ }
77
+ if ((ts.isInterfaceDeclaration(node) || ts.isClassDeclaration(node) || ts.isClassExpression(node)) && node.name) {
78
+ const declaredType = getSurfaceType(context, node);
79
+ if (declaredType) {
80
+ return context.checker.typeToString(declaredType);
81
+ }
82
+ return node.name.text;
83
+ }
84
+ return context.checker.typeToString(context.checker.getTypeAtLocation(node));
85
+ }
86
+ function getSurfacePrimarySymbol(node) {
87
+ if (ts.isTypeReferenceNode(node) && ts.isIdentifier(node.typeName)) {
88
+ return node.typeName.text;
89
+ }
90
+ if ((ts.isInterfaceDeclaration(node) || ts.isClassDeclaration(node) || ts.isClassExpression(node)) && node.name) {
91
+ return node.name.text;
92
+ }
93
+ return undefined;
94
+ }
95
+ function isBuiltinPromiseType(checker, type) {
96
+ return isDeclarationBackedBuiltinSymbolNamed(checker, type.aliasSymbol, 'Promise') ||
97
+ isDeclarationBackedBuiltinSymbolNamed(checker, type.getSymbol(), 'Promise');
98
+ }
99
+ function hasUnsupportedThenableBranch(context, type, seen) {
100
+ if (seen.has(type)) {
101
+ return false;
102
+ }
103
+ seen.add(type);
104
+ if (type.isUnionOrIntersection()) {
105
+ return type.types.some((part) => hasUnsupportedThenableBranch(context, part, seen));
106
+ }
107
+ const promisedType = getPromisedType(context.checker, type);
108
+ if (!promisedType) {
109
+ return false;
110
+ }
111
+ return !isBuiltinPromiseType(context.checker, type);
112
+ }
113
+ function isUnsupportedThenableType(context, type) {
114
+ return hasUnsupportedThenableBranch(context, type, new Set());
115
+ }
116
+ function getSurfaceType(context, node) {
117
+ if ((ts.isClassDeclaration(node) || ts.isClassExpression(node) || ts.isInterfaceDeclaration(node)) &&
118
+ node.name) {
119
+ const symbol = context.checker.getSymbolAtLocation(node.name);
120
+ return symbol ? context.checker.getDeclaredTypeOfSymbol(symbol) : undefined;
121
+ }
122
+ return context.checker.getTypeAtLocation(node);
123
+ }
124
+ function getPromiseSubclassDiagnosticInfo(context, node) {
125
+ if (!ts.isClassDeclaration(node) && !ts.isClassExpression(node)) {
126
+ return undefined;
127
+ }
128
+ for (const heritageClause of node.heritageClauses ?? []) {
129
+ if (heritageClause.token !== ts.SyntaxKind.ExtendsKeyword) {
130
+ continue;
131
+ }
132
+ for (const heritageType of heritageClause.types) {
133
+ const heritageSymbol = context.checker.getSymbolAtLocation(heritageType.expression);
134
+ const heritageValueType = context.checker.getTypeAtLocation(heritageType.expression);
135
+ if (isDeclarationBackedBuiltinSymbolNamed(context.checker, heritageSymbol, 'Promise') ||
136
+ isDeclarationBackedBuiltinSymbolNamed(context.checker, heritageValueType.aliasSymbol, 'PromiseConstructor') ||
137
+ isDeclarationBackedBuiltinSymbolNamed(context.checker, heritageValueType.getSymbol(), 'PromiseConstructor')) {
138
+ return {
139
+ node: heritageType.expression,
140
+ primarySymbol: node.name?.text ?? 'Promise',
141
+ surfaceKind: 'promise subclass',
142
+ surfaceText: node.name?.text ?? heritageType.getText(),
143
+ };
144
+ }
145
+ }
146
+ }
147
+ return undefined;
148
+ }
149
+ function getThenableSurfaceDiagnosticInfo(context, node) {
150
+ if (!ts.isTypeReferenceNode(node) &&
151
+ !ts.isImportTypeNode(node) &&
152
+ !ts.isTypeLiteralNode(node) &&
153
+ !ts.isInterfaceDeclaration(node) &&
154
+ !ts.isClassDeclaration(node) &&
155
+ !ts.isClassExpression(node) &&
156
+ !ts.isObjectLiteralExpression(node)) {
157
+ return undefined;
158
+ }
159
+ const type = getSurfaceType(context, node);
160
+ return type && isUnsupportedThenableType(context, type)
161
+ ? {
162
+ node,
163
+ primarySymbol: getSurfacePrimarySymbol(node),
164
+ surfaceKind: 'thenable surface',
165
+ surfaceText: getSurfaceText(context, node),
166
+ }
167
+ : undefined;
168
+ }
169
+ function getAwaitDiagnosticInfo(context, node) {
170
+ if (!ts.isAwaitExpression(node)) {
171
+ return undefined;
172
+ }
173
+ return isUnsupportedThenableType(context, context.checker.getTypeAtLocation(node.expression))
174
+ ? {
175
+ node: node.expression,
176
+ primarySymbol: getSurfacePrimarySymbol(node.expression),
177
+ surfaceKind: 'awaited thenable',
178
+ surfaceText: getSurfaceText(context, node.expression),
179
+ }
180
+ : undefined;
181
+ }
182
+ function getPromiseResolveDiagnosticInfo(context, node) {
183
+ if (!ts.isCallExpression(node) ||
184
+ node.arguments.length === 0 ||
185
+ !(matchesResolvedBuiltinSignature(context, node, {
186
+ ownerNames: ['PromiseConstructor'],
187
+ memberNames: ['resolve'],
188
+ }) ||
189
+ matchesResolvedBuiltinCallableValue(context, node.expression, {
190
+ ownerNames: ['PromiseConstructor'],
191
+ memberNames: ['resolve'],
192
+ }))) {
193
+ return undefined;
194
+ }
195
+ return isUnsupportedThenableType(context, context.checker.getTypeAtLocation(node.arguments[0]))
196
+ ? {
197
+ node: node.arguments[0],
198
+ primarySymbol: getSurfacePrimarySymbol(node.arguments[0]),
199
+ surfaceKind: 'promise resolve thenable',
200
+ surfaceText: getSurfaceText(context, node.arguments[0]),
201
+ }
202
+ : undefined;
203
+ }
204
+ export function runAsyncSurfaceRules(context) {
205
+ const diagnostics = [];
206
+ const seen = new Set();
207
+ function pushDiagnostic(info) {
208
+ if (!info) {
209
+ return;
210
+ }
211
+ const range = getNodeDiagnosticRange(info.node);
212
+ const key = `${range.filePath}:${range.line}:${range.column}:${range.endLine}:${range.endColumn}`;
213
+ if (seen.has(key)) {
214
+ return;
215
+ }
216
+ seen.add(key);
217
+ diagnostics.push(createDiagnostic(info));
218
+ }
219
+ context.forEachSourceFile((sourceFile) => {
220
+ if (isForeignSourceFile(sourceFile.fileName, ts.sys)) {
221
+ return;
222
+ }
223
+ context.traverse(sourceFile, (node) => {
224
+ pushDiagnostic(getPromiseSubclassDiagnosticInfo(context, node));
225
+ pushDiagnostic(getThenableSurfaceDiagnosticInfo(context, node));
226
+ pushDiagnostic(getAwaitDiagnosticInfo(context, node));
227
+ pushDiagnostic(getPromiseResolveDiagnosticInfo(context, node));
228
+ });
229
+ });
230
+ return diagnostics;
231
+ }