@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,502 @@
1
+ import { dirname, extname, join, relative } from '../platform/path.ts';
2
+ import ts from 'typescript';
3
+
4
+ import { createSoundStdlibCompilerHost } from '../bundled/sound_stdlib.ts';
5
+ import {
6
+ formatDiagnostics,
7
+ hasErrorDiagnostics,
8
+ type MergedDiagnostic,
9
+ toMergedDiagnostic,
10
+ } from '../checker/diagnostics.ts';
11
+ import { analyzeProject } from '../checker/analyze_project.ts';
12
+ import {
13
+ collectSoundscriptRootNames,
14
+ getConfigFileParsingDiagnostics,
15
+ loadConfig,
16
+ } from '../config.ts';
17
+ import { createBuiltinExpandedProgram } from '../frontend/builtin_macro_support.ts';
18
+ import { MacroError } from '../frontend/macro_errors.ts';
19
+ import { isSoundscriptSourceFile } from '../frontend/project_frontend.ts';
20
+ import {
21
+ copyFile,
22
+ createSymlink,
23
+ directoryExistsSync,
24
+ fileExistsSync,
25
+ makeDirectory,
26
+ readDirectory,
27
+ readLink,
28
+ readTextFileSync,
29
+ removePath,
30
+ writeTextFile,
31
+ } from '../platform/host.ts';
32
+ import { inlineSourceMapComment, stripTrailingSourceMapComment } from './source_maps.ts';
33
+ import { type RuntimeTransformArtifact, transpileTypeScriptModuleToEsm } from './transform.ts';
34
+
35
+ const PROJECT_CONFIG_CANDIDATES = ['tsconfig.soundscript.json', 'tsconfig.json'] as const;
36
+ const LOCAL_CODE_EXTENSIONS = [
37
+ '.sts',
38
+ '.ts',
39
+ '.tsx',
40
+ '.mts',
41
+ '.cts',
42
+ '.js',
43
+ '.jsx',
44
+ '.mjs',
45
+ '.cjs',
46
+ ] as const;
47
+ const LOCAL_ASSET_EXTENSIONS = ['.json', '.css', '.wasm'] as const;
48
+
49
+ export interface MaterializeRuntimeGraphOptions {
50
+ entryPaths: readonly string[];
51
+ outDir: string;
52
+ projectPath?: string;
53
+ workingDirectory: string;
54
+ }
55
+
56
+ export interface MaterializeRuntimeGraphArtifacts {
57
+ emittedFiles: string[];
58
+ entryOutputPaths: string[];
59
+ outDir: string;
60
+ projectPath: string;
61
+ }
62
+
63
+ export interface MaterializeRuntimeGraphResult {
64
+ artifacts?: MaterializeRuntimeGraphArtifacts;
65
+ diagnostics: MergedDiagnostic[];
66
+ exitCode: number;
67
+ output: string;
68
+ }
69
+
70
+ async function copyDirectory(sourcePath: string, destinationPath: string): Promise<void> {
71
+ await makeDirectory(destinationPath);
72
+
73
+ for (const entry of await readDirectory(sourcePath)) {
74
+ const sourceEntryPath = join(sourcePath, entry.name);
75
+ const destinationEntryPath = join(destinationPath, entry.name);
76
+
77
+ if (entry.isDirectory) {
78
+ await copyDirectory(sourceEntryPath, destinationEntryPath);
79
+ } else if (entry.isFile) {
80
+ await copyFile(sourceEntryPath, destinationEntryPath);
81
+ } else if (entry.isSymlink) {
82
+ const targetPath = await readLink(sourceEntryPath);
83
+ await createSymlink(targetPath, destinationEntryPath, 'dir');
84
+ }
85
+ }
86
+ }
87
+
88
+ async function ensureRuntimePackageBoundary(outDir: string): Promise<void> {
89
+ await writeTextFile(
90
+ join(outDir, 'package.json'),
91
+ `${JSON.stringify({ private: true, type: 'module' }, null, 2)}\n`,
92
+ );
93
+ }
94
+
95
+ function findNearestRuntimeNodeModules(projectRoot: string): string | undefined {
96
+ let currentDirectory = projectRoot;
97
+
98
+ while (true) {
99
+ const sourceNodeModules = join(currentDirectory, 'node_modules');
100
+ if (fileExistsSync(join(sourceNodeModules, '@soundscript', 'soundscript', 'package.json'))) {
101
+ return sourceNodeModules;
102
+ }
103
+
104
+ const parentDirectory = dirname(currentDirectory);
105
+ if (parentDirectory === currentDirectory) {
106
+ return undefined;
107
+ }
108
+ currentDirectory = parentDirectory;
109
+ }
110
+ }
111
+
112
+ async function ensureRuntimeNodeModules(
113
+ projectRoot: string,
114
+ outDir: string,
115
+ ): Promise<MergedDiagnostic | null> {
116
+ const sourceNodeModules = findNearestRuntimeNodeModules(projectRoot);
117
+ if (!sourceNodeModules) {
118
+ return {
119
+ source: 'cli',
120
+ code: 'SOUNDSCRIPT_RUNTIME_PACKAGE_MISSING',
121
+ category: 'error',
122
+ message: 'Could not find @soundscript/soundscript in node_modules for runtime execution.',
123
+ filePath: projectRoot,
124
+ line: 1,
125
+ column: 1,
126
+ endLine: 1,
127
+ endColumn: 1,
128
+ hint:
129
+ 'Install @soundscript/soundscript in this project or an ancestor workspace before using soundscript node or soundscript deno.',
130
+ };
131
+ }
132
+
133
+ const targetNodeModules = join(outDir, 'node_modules');
134
+ try {
135
+ await createSymlink(sourceNodeModules, targetNodeModules, 'dir');
136
+ } catch {
137
+ await copyDirectory(sourceNodeModules, targetNodeModules);
138
+ }
139
+
140
+ return null;
141
+ }
142
+
143
+ function findNearestProjectPath(startPath: string): string | undefined {
144
+ const initialDirectory = fileExistsSync(startPath) ? dirname(startPath) : startPath;
145
+ let currentDirectory = initialDirectory;
146
+
147
+ while (true) {
148
+ for (const candidate of PROJECT_CONFIG_CANDIDATES) {
149
+ const projectPath = join(currentDirectory, candidate);
150
+ if (fileExistsSync(projectPath)) {
151
+ return projectPath;
152
+ }
153
+ }
154
+
155
+ const parentDirectory = dirname(currentDirectory);
156
+ if (parentDirectory === currentDirectory) {
157
+ return undefined;
158
+ }
159
+ currentDirectory = parentDirectory;
160
+ }
161
+ }
162
+
163
+ function isRelativeOrAbsoluteSpecifier(specifier: string): boolean {
164
+ return specifier.startsWith('./') || specifier.startsWith('../') || specifier.startsWith('/');
165
+ }
166
+
167
+ function normalizeLocalSpecifierPath(path: string): string {
168
+ return path.replaceAll('\\', '/');
169
+ }
170
+
171
+ function toRuntimeCodeOutputPath(
172
+ projectRoot: string,
173
+ sourceFileName: string,
174
+ outDir: string,
175
+ ): string {
176
+ const relativePath = normalizeLocalSpecifierPath(relative(projectRoot, sourceFileName));
177
+ const safeRelativePath = relativePath.startsWith('..')
178
+ ? sourceFileName.split(/[\\/]/u).at(-1) ?? sourceFileName
179
+ : relativePath;
180
+ const extension = extname(safeRelativePath);
181
+ return join(
182
+ outDir,
183
+ extension.length > 0
184
+ ? `${safeRelativePath.slice(0, -extension.length)}.js`
185
+ : `${safeRelativePath}.js`,
186
+ );
187
+ }
188
+
189
+ function toRuntimeAssetOutputPath(
190
+ projectRoot: string,
191
+ sourceFileName: string,
192
+ outDir: string,
193
+ ): string {
194
+ const relativePath = normalizeLocalSpecifierPath(relative(projectRoot, sourceFileName));
195
+ const safeRelativePath = relativePath.startsWith('..')
196
+ ? sourceFileName.split(/[\\/]/u).at(-1) ?? sourceFileName
197
+ : relativePath;
198
+ return join(outDir, safeRelativePath);
199
+ }
200
+
201
+ function collectModuleSpecifiers(sourceText: string, fileName: string): string[] {
202
+ const sourceFile = ts.createSourceFile(fileName, sourceText, ts.ScriptTarget.Latest, true);
203
+ const specifiers: string[] = [];
204
+
205
+ function pushSpecifier(specifier: ts.StringLiteralLike): void {
206
+ specifiers.push(specifier.text);
207
+ }
208
+
209
+ function visit(node: ts.Node): void {
210
+ if (
211
+ (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) &&
212
+ node.moduleSpecifier &&
213
+ ts.isStringLiteralLike(node.moduleSpecifier)
214
+ ) {
215
+ pushSpecifier(node.moduleSpecifier);
216
+ } else if (
217
+ ts.isCallExpression(node) &&
218
+ node.expression.kind === ts.SyntaxKind.ImportKeyword &&
219
+ node.arguments.length >= 1 &&
220
+ ts.isStringLiteralLike(node.arguments[0]!)
221
+ ) {
222
+ pushSpecifier(node.arguments[0]!);
223
+ }
224
+
225
+ ts.forEachChild(node, visit);
226
+ }
227
+
228
+ visit(sourceFile);
229
+ return specifiers;
230
+ }
231
+
232
+ function resolvePathWithExtensions(basePath: string): string | undefined {
233
+ for (const extension of LOCAL_CODE_EXTENSIONS) {
234
+ const candidate = `${basePath}${extension}`;
235
+ if (fileExistsSync(candidate)) {
236
+ return candidate;
237
+ }
238
+ }
239
+ for (const extension of LOCAL_ASSET_EXTENSIONS) {
240
+ const candidate = `${basePath}${extension}`;
241
+ if (fileExistsSync(candidate)) {
242
+ return candidate;
243
+ }
244
+ }
245
+ return undefined;
246
+ }
247
+
248
+ function resolveLocalDependency(containingFileName: string, specifier: string): string | undefined {
249
+ if (!isRelativeOrAbsoluteSpecifier(specifier)) {
250
+ return undefined;
251
+ }
252
+
253
+ const containingDirectory = dirname(containingFileName);
254
+ const candidateBase = specifier.startsWith('/')
255
+ ? specifier
256
+ : join(containingDirectory, specifier);
257
+ if (fileExistsSync(candidateBase)) {
258
+ return candidateBase;
259
+ }
260
+
261
+ const directMatch = resolvePathWithExtensions(candidateBase);
262
+ if (directMatch) {
263
+ return directMatch;
264
+ }
265
+
266
+ if (directoryExistsSync(candidateBase)) {
267
+ const indexMatch = resolvePathWithExtensions(join(candidateBase, 'index'));
268
+ if (indexMatch) {
269
+ return indexMatch;
270
+ }
271
+ }
272
+
273
+ return undefined;
274
+ }
275
+
276
+ function isRuntimeCodeFile(fileName: string): boolean {
277
+ return LOCAL_CODE_EXTENSIONS.some((extension) => fileName.endsWith(extension));
278
+ }
279
+
280
+ function isRuntimeAssetFile(fileName: string): boolean {
281
+ return LOCAL_ASSET_EXTENSIONS.some((extension) => fileName.endsWith(extension));
282
+ }
283
+
284
+ function createRuntimeMacroDiagnostic(error: MacroError): MergedDiagnostic {
285
+ return {
286
+ source: 'cli',
287
+ code: error.code,
288
+ category: 'error',
289
+ message: error.message,
290
+ filePath: error.filePath,
291
+ line: error.line,
292
+ column: error.column,
293
+ endLine: error.endLine,
294
+ endColumn: error.endColumn,
295
+ };
296
+ }
297
+
298
+ function createExpandedProgram(projectPath: string) {
299
+ const loadedConfig = loadConfig(projectPath);
300
+ const soundscriptRootNames = collectSoundscriptRootNames(projectPath, loadedConfig);
301
+ return createBuiltinExpandedProgram({
302
+ baseHost: createSoundStdlibCompilerHost(
303
+ loadedConfig.commandLine.options,
304
+ dirname(projectPath),
305
+ ),
306
+ configFileParsingDiagnostics: getConfigFileParsingDiagnostics(
307
+ loadedConfig.diagnostics,
308
+ soundscriptRootNames,
309
+ ),
310
+ options: loadedConfig.commandLine.options,
311
+ projectReferences: loadedConfig.commandLine.projectReferences,
312
+ rootNames: [...new Set([...loadedConfig.commandLine.fileNames, ...soundscriptRootNames])],
313
+ });
314
+ }
315
+
316
+ function transpileExpandedSoundscriptModuleToEsm(
317
+ expandedProgram: ReturnType<typeof createExpandedProgram>,
318
+ sourceFileName: string,
319
+ outputPath: string,
320
+ ): RuntimeTransformArtifact {
321
+ const programFileName = expandedProgram.preparedProgram.toProgramFileName(sourceFileName);
322
+ const expandedSourceFile = expandedProgram.program.getSourceFile(programFileName);
323
+ if (!expandedSourceFile) {
324
+ throw new Error(`Missing expanded source file for ${sourceFileName}.`);
325
+ }
326
+
327
+ const printer = ts.createPrinter();
328
+ return transpileTypeScriptModuleToEsm(
329
+ sourceFileName,
330
+ outputPath,
331
+ printer.printFile(expandedSourceFile),
332
+ {
333
+ module: ts.ModuleKind.ES2022,
334
+ target: ts.ScriptTarget.ES2022,
335
+ },
336
+ );
337
+ }
338
+
339
+ export async function materializeRuntimeGraph(
340
+ options: MaterializeRuntimeGraphOptions,
341
+ ): Promise<MaterializeRuntimeGraphResult> {
342
+ if (options.entryPaths.length === 0) {
343
+ const diagnostics: MergedDiagnostic[] = [{
344
+ source: 'cli',
345
+ code: 'SOUNDSCRIPT_RUNTIME_NO_ENTRY',
346
+ category: 'error',
347
+ message: 'No entry file was provided for runtime materialization.',
348
+ filePath: options.workingDirectory,
349
+ line: 1,
350
+ column: 1,
351
+ endLine: 1,
352
+ endColumn: 1,
353
+ }];
354
+ return {
355
+ diagnostics,
356
+ exitCode: 1,
357
+ output: formatDiagnostics(diagnostics, options.workingDirectory),
358
+ };
359
+ }
360
+
361
+ const entryProjectPath = options.projectPath ??
362
+ findNearestProjectPath(options.entryPaths[0]!);
363
+ if (!entryProjectPath) {
364
+ const diagnostics: MergedDiagnostic[] = [{
365
+ source: 'cli',
366
+ code: 'SOUNDSCRIPT_RUNTIME_NO_PROJECT',
367
+ category: 'error',
368
+ message: 'Could not find a tsconfig.soundscript.json or tsconfig.json for the runtime entry.',
369
+ filePath: options.entryPaths[0]!,
370
+ line: 1,
371
+ column: 1,
372
+ endLine: 1,
373
+ endColumn: 1,
374
+ }];
375
+ return {
376
+ diagnostics,
377
+ exitCode: 1,
378
+ output: formatDiagnostics(diagnostics, options.workingDirectory),
379
+ };
380
+ }
381
+
382
+ const analysis = analyzeProject({
383
+ projectPath: entryProjectPath,
384
+ workingDirectory: options.workingDirectory,
385
+ });
386
+ if (hasErrorDiagnostics(analysis.diagnostics)) {
387
+ return {
388
+ diagnostics: analysis.diagnostics,
389
+ exitCode: 1,
390
+ output: formatDiagnostics(analysis.diagnostics, options.workingDirectory),
391
+ };
392
+ }
393
+
394
+ const expandedProgram = createExpandedProgram(entryProjectPath);
395
+ const frontendDiagnostics: MergedDiagnostic[] = [
396
+ ...expandedProgram.frontendDiagnostics(),
397
+ ...ts.getPreEmitDiagnostics(expandedProgram.program).map(toMergedDiagnostic),
398
+ ];
399
+ if (hasErrorDiagnostics(frontendDiagnostics)) {
400
+ return {
401
+ diagnostics: frontendDiagnostics,
402
+ exitCode: 1,
403
+ output: formatDiagnostics(frontendDiagnostics, options.workingDirectory),
404
+ };
405
+ }
406
+
407
+ try {
408
+ void expandedProgram.program.getTypeChecker();
409
+ } catch (error) {
410
+ const diagnostics = error instanceof MacroError ? [createRuntimeMacroDiagnostic(error)] : [];
411
+ return {
412
+ diagnostics,
413
+ exitCode: 1,
414
+ output: error instanceof MacroError
415
+ ? formatDiagnostics(diagnostics, options.workingDirectory)
416
+ : String(error),
417
+ };
418
+ }
419
+
420
+ await removePath(options.outDir);
421
+ await makeDirectory(options.outDir);
422
+
423
+ const emittedFiles: string[] = [];
424
+ const writtenSourceFiles = new Set<string>();
425
+ const projectRoot = dirname(entryProjectPath);
426
+ await ensureRuntimePackageBoundary(options.outDir);
427
+ emittedFiles.push(join(options.outDir, 'package.json'));
428
+ const runtimePackageDiagnostic = await ensureRuntimeNodeModules(projectRoot, options.outDir);
429
+ if (runtimePackageDiagnostic) {
430
+ return {
431
+ diagnostics: [runtimePackageDiagnostic],
432
+ exitCode: 1,
433
+ output: formatDiagnostics([runtimePackageDiagnostic], options.workingDirectory),
434
+ };
435
+ }
436
+ const queue = [...options.entryPaths];
437
+ const visited = new Set<string>();
438
+ const entryOutputPaths: string[] = [];
439
+
440
+ while (queue.length > 0) {
441
+ const sourceFileName = queue.shift()!;
442
+ if (visited.has(sourceFileName)) {
443
+ continue;
444
+ }
445
+ visited.add(sourceFileName);
446
+
447
+ if (isRuntimeAssetFile(sourceFileName)) {
448
+ const outputPath = toRuntimeAssetOutputPath(projectRoot, sourceFileName, options.outDir);
449
+ await makeDirectory(dirname(outputPath));
450
+ await copyFile(sourceFileName, outputPath);
451
+ emittedFiles.push(outputPath);
452
+ continue;
453
+ }
454
+
455
+ if (!isRuntimeCodeFile(sourceFileName)) {
456
+ continue;
457
+ }
458
+
459
+ const sourceText = readTextFileSync(sourceFileName);
460
+ const outputPath = toRuntimeCodeOutputPath(projectRoot, sourceFileName, options.outDir);
461
+ const artifact = isSoundscriptSourceFile(sourceFileName)
462
+ ? transpileExpandedSoundscriptModuleToEsm(expandedProgram, sourceFileName, outputPath)
463
+ : transpileTypeScriptModuleToEsm(sourceFileName, outputPath, sourceText, {
464
+ module: ts.ModuleKind.ES2022,
465
+ target: ts.ScriptTarget.ES2022,
466
+ });
467
+
468
+ await makeDirectory(dirname(outputPath));
469
+ await writeTextFile(
470
+ outputPath,
471
+ `${stripTrailingSourceMapComment(artifact.code)}\n${
472
+ inlineSourceMapComment(artifact.mapText)
473
+ }\n`,
474
+ );
475
+ emittedFiles.push(outputPath);
476
+ writtenSourceFiles.add(sourceFileName);
477
+
478
+ if (options.entryPaths.includes(sourceFileName)) {
479
+ entryOutputPaths.push(outputPath);
480
+ }
481
+
482
+ for (const specifier of collectModuleSpecifiers(sourceText, sourceFileName)) {
483
+ const dependencyPath = resolveLocalDependency(sourceFileName, specifier);
484
+ if (!dependencyPath || writtenSourceFiles.has(dependencyPath)) {
485
+ continue;
486
+ }
487
+ queue.push(dependencyPath);
488
+ }
489
+ }
490
+
491
+ return {
492
+ artifacts: {
493
+ emittedFiles,
494
+ entryOutputPaths,
495
+ outDir: options.outDir,
496
+ projectPath: entryProjectPath,
497
+ },
498
+ diagnostics: [],
499
+ exitCode: 0,
500
+ output: '',
501
+ };
502
+ }
@@ -0,0 +1,203 @@
1
+ import ts from 'typescript';
2
+ import { createSoundStdlibCompilerHost } from '../bundled/sound_stdlib.js';
3
+ import { collectSoundscriptRootNames, getConfigFileParsingDiagnostics, loadConfig, } from '../config.js';
4
+ import { dirname, join } from '../platform/path.js';
5
+ import { createBuiltinExpandedProgram } from '../frontend/builtin_macro_support.js';
6
+ import { isSoundscriptSourceFile, toSourceFileName } from '../frontend/project_frontend.js';
7
+ import { resolveSoundScriptAwareModule } from '../soundscript_packages.js';
8
+ import { transpileTypeScriptModuleToEsm } from './transform.js';
9
+ const PROJECT_CONFIG_CANDIDATES = ['tsconfig.soundscript.json', 'tsconfig.json'];
10
+ const LOCAL_CODE_EXTENSIONS = ['.sts', '.ts', '.tsx', '.mts', '.cts', '.jsx'];
11
+ function fileExists(path) {
12
+ return ts.sys.fileExists(path);
13
+ }
14
+ function directoryExists(path) {
15
+ return ts.sys.directoryExists?.(path) === true;
16
+ }
17
+ function isRelativeOrAbsoluteSpecifier(specifier) {
18
+ return specifier.startsWith('./') || specifier.startsWith('../') || specifier.startsWith('/');
19
+ }
20
+ function isTypeScriptLikeFile(fileName) {
21
+ const lowered = fileName.toLowerCase();
22
+ return (lowered.endsWith('.ts') ||
23
+ lowered.endsWith('.tsx') ||
24
+ lowered.endsWith('.mts') ||
25
+ lowered.endsWith('.cts') ||
26
+ lowered.endsWith('.jsx')) && !(lowered.endsWith('.d.ts') ||
27
+ lowered.endsWith('.d.mts') ||
28
+ lowered.endsWith('.d.cts'));
29
+ }
30
+ function isTransformableRuntimeFile(fileName) {
31
+ return isSoundscriptSourceFile(fileName) || isTypeScriptLikeFile(fileName);
32
+ }
33
+ function resolvePathWithExtensions(basePath) {
34
+ for (const extension of LOCAL_CODE_EXTENSIONS) {
35
+ const candidate = `${basePath}${extension}`;
36
+ if (fileExists(candidate)) {
37
+ return candidate;
38
+ }
39
+ }
40
+ return undefined;
41
+ }
42
+ function resolveLocalDependency(containingFileName, specifier) {
43
+ if (!isRelativeOrAbsoluteSpecifier(specifier)) {
44
+ return undefined;
45
+ }
46
+ const containingDirectory = dirname(containingFileName);
47
+ const candidateBase = specifier.startsWith('/')
48
+ ? specifier
49
+ : join(containingDirectory, specifier);
50
+ if (fileExists(candidateBase)) {
51
+ return candidateBase;
52
+ }
53
+ const directMatch = resolvePathWithExtensions(candidateBase);
54
+ if (directMatch) {
55
+ return directMatch;
56
+ }
57
+ if (directoryExists(candidateBase)) {
58
+ const indexMatch = resolvePathWithExtensions(join(candidateBase, 'index'));
59
+ if (indexMatch) {
60
+ return indexMatch;
61
+ }
62
+ }
63
+ return undefined;
64
+ }
65
+ function findNearestProjectPath(startPath) {
66
+ const initialDirectory = fileExists(startPath) ? dirname(startPath) : startPath;
67
+ let currentDirectory = initialDirectory;
68
+ while (true) {
69
+ for (const candidate of PROJECT_CONFIG_CANDIDATES) {
70
+ const projectPath = join(currentDirectory, candidate);
71
+ if (fileExists(projectPath)) {
72
+ return projectPath;
73
+ }
74
+ }
75
+ const parentDirectory = dirname(currentDirectory);
76
+ if (parentDirectory === currentDirectory) {
77
+ return undefined;
78
+ }
79
+ currentDirectory = parentDirectory;
80
+ }
81
+ }
82
+ function createExpandedProgram(projectPath, extraRootNames = []) {
83
+ const loadedConfig = loadConfig(projectPath);
84
+ const soundscriptRootNames = collectSoundscriptRootNames(projectPath, loadedConfig);
85
+ return createBuiltinExpandedProgram({
86
+ baseHost: createSoundStdlibCompilerHost(loadedConfig.commandLine.options, dirname(projectPath)),
87
+ configFileParsingDiagnostics: getConfigFileParsingDiagnostics(loadedConfig.diagnostics, soundscriptRootNames),
88
+ options: loadedConfig.commandLine.options,
89
+ projectReferences: loadedConfig.commandLine.projectReferences,
90
+ rootNames: [
91
+ ...new Set([
92
+ ...loadedConfig.commandLine.fileNames,
93
+ ...soundscriptRootNames,
94
+ ...extraRootNames,
95
+ ]),
96
+ ],
97
+ });
98
+ }
99
+ function getProjectContext(fileName, explicitProjectPath) {
100
+ const projectPath = explicitProjectPath ?? findNearestProjectPath(fileName);
101
+ if (!projectPath) {
102
+ return undefined;
103
+ }
104
+ const loadedConfig = loadConfig(projectPath);
105
+ return {
106
+ compilerOptions: loadedConfig.commandLine.options,
107
+ projectPath,
108
+ };
109
+ }
110
+ function getExpandedProgramForSourceFile(sourceFileName, explicitProjectPath) {
111
+ const projectPath = explicitProjectPath ?? findNearestProjectPath(sourceFileName);
112
+ if (!projectPath) {
113
+ throw new Error(`Could not find a tsconfig.soundscript.json or tsconfig.json for ${sourceFileName}.`);
114
+ }
115
+ const expandedProgram = createExpandedProgram(projectPath, [sourceFileName]);
116
+ const programFileName = expandedProgram.preparedProgram.toProgramFileName(sourceFileName);
117
+ const sourceFile = expandedProgram.program.getSourceFile(programFileName);
118
+ if (!sourceFile) {
119
+ throw new Error(`Missing expanded source file for ${sourceFileName}.`);
120
+ }
121
+ return { expandedProgram, projectPath };
122
+ }
123
+ export function createOnDemandTransformer(options = {}) {
124
+ const typeScriptCache = new Map();
125
+ function transformModuleSync(fileName) {
126
+ if (isSoundscriptSourceFile(fileName)) {
127
+ const { expandedProgram, projectPath } = getExpandedProgramForSourceFile(fileName, options.projectPath);
128
+ try {
129
+ const programFileName = expandedProgram.preparedProgram.toProgramFileName(fileName);
130
+ const sourceFile = expandedProgram.program.getSourceFile(programFileName);
131
+ if (!sourceFile) {
132
+ throw new Error(`Missing expanded source file for ${fileName}.`);
133
+ }
134
+ const artifact = transpileTypeScriptModuleToEsm(fileName, `${fileName}.js`, ts.createPrinter().printFile(sourceFile), {
135
+ module: ts.ModuleKind.ES2022,
136
+ moduleSpecifierMode: 'preserve',
137
+ target: ts.ScriptTarget.ES2022,
138
+ });
139
+ return {
140
+ ...artifact,
141
+ projectPath,
142
+ };
143
+ }
144
+ finally {
145
+ expandedProgram.dispose();
146
+ }
147
+ }
148
+ if (!isTypeScriptLikeFile(fileName)) {
149
+ throw new Error(`Only local .sts/.ts sources can be transformed on demand: ${fileName}`);
150
+ }
151
+ const sourceText = ts.sys.readFile(fileName);
152
+ if (sourceText === undefined) {
153
+ throw new Error(`Could not read source file ${fileName}.`);
154
+ }
155
+ const projectPath = getProjectContext(fileName, options.projectPath)?.projectPath ??
156
+ options.projectPath ??
157
+ findNearestProjectPath(fileName) ??
158
+ (options.workingDirectory ? join(options.workingDirectory, 'tsconfig.json') : fileName);
159
+ const sourceHash = ts.sys.createHash?.(sourceText) ?? sourceText;
160
+ const cacheKey = `${projectPath}\u0000${fileName}\u0000${sourceHash}`;
161
+ const cached = typeScriptCache.get(cacheKey);
162
+ if (cached) {
163
+ return cached;
164
+ }
165
+ const artifact = transpileTypeScriptModuleToEsm(fileName, `${fileName}.js`, sourceText, {
166
+ module: ts.ModuleKind.ES2022,
167
+ moduleSpecifierMode: 'preserve',
168
+ target: ts.ScriptTarget.ES2022,
169
+ });
170
+ const result = {
171
+ ...artifact,
172
+ projectPath,
173
+ };
174
+ typeScriptCache.set(cacheKey, result);
175
+ return result;
176
+ }
177
+ return {
178
+ resolveImportSpecifier(specifier, importer) {
179
+ const localResolved = resolveLocalDependency(importer, specifier);
180
+ if (localResolved) {
181
+ return localResolved;
182
+ }
183
+ if (isRelativeOrAbsoluteSpecifier(specifier)) {
184
+ return undefined;
185
+ }
186
+ const projectContext = getProjectContext(importer, options.projectPath);
187
+ if (!projectContext) {
188
+ return undefined;
189
+ }
190
+ const resolved = resolveSoundScriptAwareModule(specifier, importer, projectContext.compilerOptions, ts.sys);
191
+ return resolved && isTransformableRuntimeFile(resolved.resolvedFileName)
192
+ ? toSourceFileName(resolved.resolvedFileName)
193
+ : undefined;
194
+ },
195
+ shouldTransformFile(fileName) {
196
+ return isTransformableRuntimeFile(fileName);
197
+ },
198
+ transformModule(fileName) {
199
+ return Promise.resolve(transformModuleSync(fileName));
200
+ },
201
+ transformModuleSync,
202
+ };
203
+ }