@soundscript/soundscript 0.1.12 → 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,542 @@
1
+ import type {
2
+ InvocationSyntax,
3
+ MacroContext,
4
+ MacroDefinition,
5
+ MacroFormatContext,
6
+ MacroHoverContext,
7
+ MacroHoverResult,
8
+ MacroSyntaxNode,
9
+ } from './macro_api.ts';
10
+ import { macroSignature } from './macro_api.ts';
11
+ import { attachMacroFactoryMetadata } from './macro_api_internal.ts';
12
+ import { cssFragments, expandCssMacro } from './css_macro.ts';
13
+ import { expandGraphqlMacro, graphqlFragments } from './graphql_macro.ts';
14
+ export { Do, hkt } from './hkt_macro.ts';
15
+ import {
16
+ expandMatchMacro,
17
+ hoverMatchMacro,
18
+ hoverMatchMacroPosition,
19
+ semanticTokensForMatchMacro,
20
+ } from './match_macro.ts';
21
+ import { expandSqlMacro, sqlFragments } from './sql_macro.ts';
22
+ import type { SourceSpan } from './macro_types.ts';
23
+ import { fromFileUrl } from '../platform/path.ts';
24
+
25
+ interface ExprBuiltinMacroSyntaxNode extends MacroSyntaxNode {
26
+ readonly data: {
27
+ readonly details: readonly string[];
28
+ readonly operandSpan: SourceSpan | null;
29
+ };
30
+ readonly kind: 'Try' | 'lazy' | 'log' | 'memo';
31
+ }
32
+
33
+ const EXPR_BUILTIN_SUMMARY_DETAILS: Readonly<
34
+ Record<ExprBuiltinMacroSyntaxNode['kind'], readonly string[]>
35
+ > = {
36
+ Try: [
37
+ 'Unwraps `Result<Ok, Err>`. If the operand is `err`, the enclosing function returns that error immediately.',
38
+ ],
39
+ lazy: ['Wraps the operand in a thunk so it is only evaluated when later invoked.'],
40
+ log: [
41
+ 'Evaluates the operand, logs its source text and value, then yields the original value unchanged.',
42
+ ],
43
+ memo: [
44
+ 'Wraps the operand in a thunk that caches the first computed value and returns it on later calls.',
45
+ ],
46
+ };
47
+
48
+ function containsOffset(span: SourceSpan, position: number): boolean {
49
+ return position >= span.start && position < span.end;
50
+ }
51
+
52
+ function buildExprBuiltinMacroSyntaxNode(
53
+ ctx: MacroContext,
54
+ kind: ExprBuiltinMacroSyntaxNode['kind'],
55
+ details: readonly string[],
56
+ ): ExprBuiltinMacroSyntaxNode {
57
+ return {
58
+ data: {
59
+ details: [...details],
60
+ operandSpan: ctx.invocation.args[0]?.span ?? null,
61
+ },
62
+ kind,
63
+ span: ctx.invocationSpan(),
64
+ };
65
+ }
66
+
67
+ function hoverExprBuiltinMacro(ctx: MacroHoverContext): MacroHoverResult | null {
68
+ const node = ctx.node as MacroSyntaxNode & Partial<ExprBuiltinMacroSyntaxNode> & {
69
+ readonly name?: string;
70
+ };
71
+ const macroKind = (
72
+ node.kind === 'Try' ||
73
+ node.kind === 'lazy' ||
74
+ node.kind === 'log' ||
75
+ node.kind === 'memo'
76
+ ? node.kind
77
+ : node.name
78
+ ) as ExprBuiltinMacroSyntaxNode['kind'] | undefined;
79
+ if (!macroKind) {
80
+ return null;
81
+ }
82
+
83
+ const operandSpan = node.data?.operandSpan ?? null;
84
+ const position = node.span.start + ctx.offset;
85
+ if (operandSpan && containsOffset(operandSpan, position)) {
86
+ return null;
87
+ }
88
+
89
+ const details = node.data?.details ?? EXPR_BUILTIN_SUMMARY_DETAILS[macroKind];
90
+ return {
91
+ contents: [
92
+ `**macro** \`${macroKind}\``,
93
+ '',
94
+ ...details,
95
+ ].join('\n'),
96
+ };
97
+ }
98
+
99
+ function formatMatchBuiltinMacro(ctx: MacroFormatContext): string {
100
+ const node = ctx.node as InvocationSyntax;
101
+ const [value, arms] = node.args;
102
+ if (!value || !arms) {
103
+ return node.text();
104
+ }
105
+
106
+ return `Match(${ctx.formatExpression(value.text())}, ${ctx.formatExpression(arms.text())})`;
107
+ }
108
+
109
+ const SINGLE_EXPR_SIGNATURE = macroSignature.of(macroSignature.expr('value'));
110
+ const OPTIONAL_SINGLE_EXPR_SIGNATURE = macroSignature.of(
111
+ macroSignature.optional(macroSignature.expr('message')),
112
+ );
113
+ const EXPR_CASE = macroSignature.case('expr', macroSignature.expr('value'));
114
+ const BLOCK_CASE = macroSignature.case('block', macroSignature.block('body'));
115
+ const EXPR_OR_BLOCK_SIGNATURE = macroSignature.oneOf(
116
+ EXPR_CASE,
117
+ BLOCK_CASE,
118
+ );
119
+ const BLOCK_SIGNATURE = macroSignature.of(macroSignature.block('body'));
120
+ const DEFER_SIGNATURE = macroSignature.of(macroSignature.functionExpr('cleanup'));
121
+ const MATCH_SIGNATURE = macroSignature.of(
122
+ macroSignature.expr('value'),
123
+ macroSignature.arrayLiteral('arms'),
124
+ );
125
+ const TEMPLATE_SIGNATURE = macroSignature.of(macroSignature.template('template'));
126
+ const BUILTIN_MACRO_FILE_NAME = fromFileUrl(import.meta.url);
127
+
128
+ function attachBuiltinFactory<T extends () => MacroDefinition>(
129
+ factory: T,
130
+ form: 'call' | 'tag',
131
+ ): T {
132
+ return attachMacroFactoryMetadata(factory, {
133
+ form,
134
+ moduleFileName: BUILTIN_MACRO_FILE_NAME,
135
+ }) as T;
136
+ }
137
+
138
+ // #[macro(call)]
139
+ export function log(): MacroDefinition<typeof SINGLE_EXPR_SIGNATURE> {
140
+ return {
141
+ expand(ctx, signature) {
142
+ const expr = signature.args.value;
143
+ const valueName = ctx.fresh.binding('__sts_log_value');
144
+ return ctx.output.expr(
145
+ ctx.quote.expr`
146
+ (() => {
147
+ const ${valueName} = ${expr};
148
+ console.log(${JSON.stringify(expr.text())}, ${valueName});
149
+ return ${valueName};
150
+ })()
151
+ `,
152
+ );
153
+ },
154
+ hover(ctx) {
155
+ return hoverExprBuiltinMacro(ctx);
156
+ },
157
+ parse(ctx) {
158
+ return buildExprBuiltinMacroSyntaxNode(
159
+ ctx,
160
+ 'log',
161
+ ['Evaluates the operand, logs its source text and value, then yields the original value unchanged.'],
162
+ );
163
+ },
164
+ signature: SINGLE_EXPR_SIGNATURE,
165
+ };
166
+ }
167
+ attachBuiltinFactory(log, 'call');
168
+
169
+ function expandedPrimaryExprText(ctx: MacroContext): string {
170
+ return ctx.semantics.primaryExprExpanded()?.text() ?? ctx.syntax.primaryExpr().text();
171
+ }
172
+
173
+ // #[macro(call)]
174
+ export function lazy(): MacroDefinition<typeof EXPR_OR_BLOCK_SIGNATURE> {
175
+ return {
176
+ expand(ctx, signature) {
177
+ if (signature.caseName === 'expr') {
178
+ return ctx.output.expr(ctx.quote.expr`() => (${expandedPrimaryExprText(ctx)})`);
179
+ }
180
+
181
+ return ctx.output.expr(ctx.quote.expr`() => (() => ${signature.args.body})()`);
182
+ },
183
+ hover(ctx) {
184
+ return hoverExprBuiltinMacro(ctx);
185
+ },
186
+ parse(ctx) {
187
+ return buildExprBuiltinMacroSyntaxNode(
188
+ ctx,
189
+ 'lazy',
190
+ ['Wraps the operand in a thunk so it is not evaluated until the thunk is invoked.'],
191
+ );
192
+ },
193
+ signature: EXPR_OR_BLOCK_SIGNATURE,
194
+ };
195
+ }
196
+ attachBuiltinFactory(lazy, 'call');
197
+
198
+ // #[macro(call)]
199
+ export function memo(): MacroDefinition<typeof EXPR_OR_BLOCK_SIGNATURE> {
200
+ return {
201
+ expand(ctx, signature) {
202
+ const readyName = ctx.fresh.binding('__sts_memo_ready');
203
+ const valueName = ctx.fresh.binding('__sts_memo_value');
204
+ const computation = signature.caseName === 'block'
205
+ ? `(() => ${signature.args.body.text()})()`
206
+ : `(${expandedPrimaryExprText(ctx)})`;
207
+
208
+ return ctx.output.expr(ctx.quote.expr`
209
+ (() => {
210
+ let ${readyName} = false;
211
+ let ${valueName};
212
+ return () => {
213
+ if (!${readyName}) {
214
+ ${valueName} = ${computation};
215
+ ${readyName} = true;
216
+ }
217
+ return ${valueName};
218
+ };
219
+ })()
220
+ `);
221
+ },
222
+ hover(ctx) {
223
+ return hoverExprBuiltinMacro(ctx);
224
+ },
225
+ parse(ctx) {
226
+ return buildExprBuiltinMacroSyntaxNode(
227
+ ctx,
228
+ 'memo',
229
+ ['Wraps the operand in a thunk that caches the first computed value and returns it on later calls.'],
230
+ );
231
+ },
232
+ signature: EXPR_OR_BLOCK_SIGNATURE,
233
+ };
234
+ }
235
+ attachBuiltinFactory(memo, 'call');
236
+
237
+ // #[macro(call)]
238
+ export function Try(): MacroDefinition<typeof SINGLE_EXPR_SIGNATURE> {
239
+ return {
240
+ expand(ctx) {
241
+ const placement = ctx.controlFlow.placement();
242
+ if (placement.kind === 'unsupported') {
243
+ if (placement.reason === 'multi-declaration') {
244
+ ctx.error(
245
+ 'Try currently only supports declarations with a single variable declarator.',
246
+ );
247
+ }
248
+ ctx.error(
249
+ 'Try currently only supports expression sites that can be hoisted through the nearest enclosing statement.',
250
+ );
251
+ }
252
+
253
+ const enclosingFunction = ctx.semantics.primaryExprEnclosingFunction() ??
254
+ ctx.semantics.enclosingFunction();
255
+ const activeEnclosingFunction = enclosingFunction ??
256
+ ctx.error('Try can only be used inside a function or method body.');
257
+
258
+ if (activeEnclosingFunction.isGenerator) {
259
+ ctx.error('Try does not yet support generators or yield-based Result flows.');
260
+ }
261
+
262
+ const expandedOperand = ctx.semantics.primaryExprExpanded() ??
263
+ ctx.error(
264
+ 'Try could not resolve the operand expression for semantic analysis.',
265
+ );
266
+ const operandPrelude = ctx.semantics.primaryExprPrelude() ?? [];
267
+ const operandType = ctx.semantics.primaryExprType();
268
+ const activeOperandCarrier = ((): NonNullable<
269
+ ReturnType<typeof ctx.semantics.primaryExprTryCarrier>
270
+ > => {
271
+ const carrier = ctx.semantics.primaryExprTryCarrier();
272
+ if (carrier) {
273
+ return carrier;
274
+ }
275
+ const canonicalCarrier = operandType
276
+ ? ctx.semantics.classifyCanonicalResultCarrierType(operandType)
277
+ : null;
278
+ if (canonicalCarrier?.requiresAwait) {
279
+ return ctx.error(
280
+ 'Try requires a direct Result, Option, or nullish carrier. Await Promises explicitly before calling Try.',
281
+ );
282
+ }
283
+ return ctx.error('Try requires a direct Result, Option, or nullish carrier.');
284
+ })();
285
+
286
+ const temp = ctx.controlFlow.freshBinding('__sts_attempt');
287
+ const expandedOperandText = expandedOperand.text();
288
+
289
+ if (activeOperandCarrier.kind === 'result') {
290
+ const isOptionCarrier = activeOperandCarrier.family === 'option';
291
+ const enclosingResult = ctx.semantics.primaryExprEnclosingFunctionCanonicalResult() ??
292
+ ctx.semantics.enclosingFunctionCanonicalResult();
293
+ const activeEnclosingResult = enclosingResult ??
294
+ ctx.error(
295
+ activeEnclosingFunction.isAsync
296
+ ? 'Try requires async functions to return Promise<soundscript Result<Ok, Err>>.'
297
+ : 'Try requires the enclosing function to return soundscript Result<Ok, Err>.',
298
+ );
299
+
300
+ if (
301
+ activeEnclosingFunction.hasDeclaredReturnType &&
302
+ !ctx.semantics.isAssignable(activeOperandCarrier.errType, activeEnclosingResult.errType)
303
+ ) {
304
+ ctx.error('Try cannot return this error type from the enclosing function.');
305
+ }
306
+
307
+ const isErr = !isOptionCarrier ? ctx.runtime.named('sts:result', 'isErr').text() : null;
308
+ const isNone = isOptionCarrier ? ctx.runtime.named('sts:result', 'isNone').text() : null;
309
+ const errFactory = !isOptionCarrier ? ctx.runtime.named('sts:result', 'err').text() : null;
310
+ const location = ctx.location();
311
+ const traceFrame = [
312
+ `{ file: ${
313
+ JSON.stringify(location.filePath)
314
+ }, line: ${location.line}, column: ${location.column}${
315
+ activeEnclosingFunction.name
316
+ ? `, fn: ${JSON.stringify(activeEnclosingFunction.name)}`
317
+ : ''
318
+ } }`,
319
+ ].join('');
320
+ const tracesFailure = !isOptionCarrier &&
321
+ ctx.semantics.classifyCanonicalFailureType(activeOperandCarrier.errType) !== null;
322
+ const errorReturn = tracesFailure && errFactory
323
+ ? `${errFactory}(${temp}.error.withFrame(${traceFrame}))`
324
+ : temp;
325
+ const failureCheck = isOptionCarrier && isNone ? `${isNone}(${temp})` : `${isErr}(${temp})`;
326
+ return ctx.controlFlow.rewriteWithValue(
327
+ [
328
+ ...operandPrelude,
329
+ ...ctx.quote.stmts`
330
+ const ${temp} = ${expandedOperandText};
331
+ if (${failureCheck}) { return ${errorReturn}; }
332
+ `,
333
+ ],
334
+ ctx.quote.expr`${temp}.value`,
335
+ );
336
+ }
337
+
338
+ const enclosingReturnType = activeEnclosingFunction.isAsync
339
+ ? ctx.semantics.awaitedType(activeEnclosingFunction.returnType)
340
+ : activeEnclosingFunction.returnType;
341
+ for (const nullishKind of activeOperandCarrier.nullishKinds) {
342
+ const nullishType = nullishKind === 'null'
343
+ ? ctx.semantics.nullType()
344
+ : ctx.semantics.undefinedType();
345
+ if (!ctx.semantics.isAssignable(nullishType, enclosingReturnType)) {
346
+ ctx.error('Try cannot return this nullish value from the enclosing function.');
347
+ }
348
+ }
349
+
350
+ const nullishCheck = activeOperandCarrier.nullishKinds.length === 2
351
+ ? `${temp} == null`
352
+ : activeOperandCarrier.nullishKinds[0] === 'null'
353
+ ? `${temp} === null`
354
+ : `${temp} === undefined`;
355
+ return ctx.controlFlow.rewriteWithValue(
356
+ [
357
+ ...operandPrelude,
358
+ ...ctx.quote.stmts`
359
+ const ${temp} = ${expandedOperandText};
360
+ if (${nullishCheck}) { return ${temp}; }
361
+ `,
362
+ ],
363
+ ctx.quote.expr`${temp}`,
364
+ );
365
+ },
366
+ hover(ctx) {
367
+ return hoverExprBuiltinMacro(ctx);
368
+ },
369
+ parse(ctx) {
370
+ const details = [
371
+ 'Unwraps a direct `Result<Ok, Err>`, `Option<T>`, or nullish carrier. Failing carriers return early from the enclosing function.',
372
+ ];
373
+ const tryCarrier = ctx.semantics.primaryExprTryCarrier();
374
+ if (tryCarrier?.kind === 'result') {
375
+ details.push(`operand: \`${tryCarrier.resultType.displayText}\``);
376
+ details.push(`yields: \`${tryCarrier.okType.displayText}\``);
377
+ details.push(
378
+ `returns early on: \`${
379
+ tryCarrier.family === 'option' ? 'None' : tryCarrier.errType.displayText
380
+ }\``,
381
+ );
382
+ } else if (tryCarrier?.kind === 'nullish') {
383
+ details.push(`operand: \`${tryCarrier.carrierType.displayText}\``);
384
+ details.push(`yields: \`${tryCarrier.valueType.displayText}\``);
385
+ details.push(
386
+ `returns early on: \`${tryCarrier.nullishKinds.join(' | ')}\``,
387
+ );
388
+ }
389
+ return buildExprBuiltinMacroSyntaxNode(ctx, 'Try', details);
390
+ },
391
+ signature: SINGLE_EXPR_SIGNATURE,
392
+ };
393
+ }
394
+ attachBuiltinFactory(Try, 'call');
395
+
396
+ // #[macro(call)]
397
+ export function Defer(): MacroDefinition<typeof DEFER_SIGNATURE> {
398
+ return {
399
+ expand(ctx, signature) {
400
+ if (!ctx.semantics.enclosingFunction()) {
401
+ ctx.error('Defer can only be used inside a function or method body.');
402
+ }
403
+
404
+ const cleanupBody = signature.args.cleanup.body() ??
405
+ ctx.error('Defer only supports: Defer(() => { ... }).');
406
+
407
+ return ctx.controlFlow.deferCleanup(cleanupBody);
408
+ },
409
+ signature: DEFER_SIGNATURE,
410
+ };
411
+ }
412
+ attachBuiltinFactory(Defer, 'call');
413
+
414
+ // #[macro(call)]
415
+ export function assert(): MacroDefinition<typeof SINGLE_EXPR_SIGNATURE> {
416
+ return {
417
+ expand(ctx, signature) {
418
+ const operandText = ctx.semantics.argExpanded(0)?.text() ?? signature.args.value.text();
419
+ const message = JSON.stringify(`Assertion failed: ${ctx.syntax.primaryExpr().text()}`);
420
+
421
+ if (ctx.kind === 'stmt') {
422
+ return ctx.output.stmt(
423
+ ctx.quote.stmt`if (!(${operandText})) { throw new Error(${message}); }`,
424
+ );
425
+ }
426
+
427
+ const temp = ctx.fresh.binding('__sts_assert');
428
+ return ctx.output.expr(ctx.quote.expr`
429
+ (() => {
430
+ const ${temp} = (${operandText});
431
+ if (!${temp}) { throw new Error(${message}); }
432
+ return ${temp};
433
+ })()
434
+ `);
435
+ },
436
+ signature: SINGLE_EXPR_SIGNATURE,
437
+ };
438
+ }
439
+ attachBuiltinFactory(assert, 'call');
440
+
441
+ function buildThrowingBuiltinMacro(
442
+ name: 'todo' | 'unreachable',
443
+ prefix: string,
444
+ ): MacroDefinition<typeof OPTIONAL_SINGLE_EXPR_SIGNATURE> {
445
+ return {
446
+ expand(ctx, signature) {
447
+ const messageExpr = signature.args.message === null
448
+ ? null
449
+ : ctx.semantics.argExpanded(0)?.text() ?? signature.args.message.text();
450
+ const messageText = messageExpr === null
451
+ ? JSON.stringify(prefix)
452
+ : `\`${prefix}: \${String(${messageExpr})}\``;
453
+
454
+ if (ctx.kind === 'stmt') {
455
+ return ctx.output.stmt(ctx.quote.stmt`throw new Error(${messageText});`);
456
+ }
457
+
458
+ return ctx.output.expr(ctx.quote.expr`(() => { throw new Error(${messageText}); })()`);
459
+ },
460
+ signature: OPTIONAL_SINGLE_EXPR_SIGNATURE,
461
+ };
462
+ }
463
+
464
+ // #[macro(call)]
465
+ export function todo(): MacroDefinition<typeof OPTIONAL_SINGLE_EXPR_SIGNATURE> {
466
+ return buildThrowingBuiltinMacro('todo', 'TODO');
467
+ }
468
+ attachBuiltinFactory(todo, 'call');
469
+
470
+ // #[macro(call)]
471
+ export function unreachable(): MacroDefinition<typeof OPTIONAL_SINGLE_EXPR_SIGNATURE> {
472
+ return buildThrowingBuiltinMacro('unreachable', 'Unreachable');
473
+ }
474
+ attachBuiltinFactory(unreachable, 'call');
475
+
476
+ // #[macro(call)]
477
+ export function Match(): MacroDefinition<typeof MATCH_SIGNATURE> {
478
+ return {
479
+ expand(ctx, signature) {
480
+ return expandMatchMacro(ctx, signature.args.value, signature.args.arms);
481
+ },
482
+ format(ctx) {
483
+ return formatMatchBuiltinMacro(ctx);
484
+ },
485
+ hover(ctx) {
486
+ return hoverMatchMacro(ctx);
487
+ },
488
+ positionHover(ctx) {
489
+ return hoverMatchMacroPosition(ctx);
490
+ },
491
+ parse(ctx) {
492
+ return ctx.syntax.root();
493
+ },
494
+ semanticTokens(ctx) {
495
+ return semanticTokensForMatchMacro(ctx);
496
+ },
497
+ signature: MATCH_SIGNATURE,
498
+ };
499
+ }
500
+ attachBuiltinFactory(Match, 'call');
501
+
502
+ // #[macro(tag)]
503
+ export function sql(): MacroDefinition<typeof TEMPLATE_SIGNATURE> {
504
+ return {
505
+ expand(ctx) {
506
+ return expandSqlMacro(ctx);
507
+ },
508
+ fragments(ctx) {
509
+ return sqlFragments(ctx);
510
+ },
511
+ signature: TEMPLATE_SIGNATURE,
512
+ };
513
+ }
514
+ attachBuiltinFactory(sql, 'tag');
515
+
516
+ // #[macro(tag)]
517
+ export function css(): MacroDefinition<typeof TEMPLATE_SIGNATURE> {
518
+ return {
519
+ expand(ctx) {
520
+ return expandCssMacro(ctx);
521
+ },
522
+ fragments(ctx) {
523
+ return cssFragments(ctx);
524
+ },
525
+ signature: TEMPLATE_SIGNATURE,
526
+ };
527
+ }
528
+ attachBuiltinFactory(css, 'tag');
529
+
530
+ // #[macro(tag)]
531
+ export function graphql(): MacroDefinition<typeof TEMPLATE_SIGNATURE> {
532
+ return {
533
+ expand(ctx) {
534
+ return expandGraphqlMacro(ctx);
535
+ },
536
+ fragments(ctx) {
537
+ return graphqlFragments(ctx);
538
+ },
539
+ signature: TEMPLATE_SIGNATURE,
540
+ };
541
+ }
542
+ attachBuiltinFactory(graphql, 'tag');