@soundscript/soundscript 0.1.13 → 0.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/package.json +15 -6
  2. package/project-transform/index.js +2 -0
  3. package/project-transform/index.ts +8 -0
  4. package/project-transform/src/annotation_syntax.js +948 -0
  5. package/project-transform/src/annotation_syntax.ts +1217 -0
  6. package/project-transform/src/build_package.js +475 -0
  7. package/project-transform/src/build_package.ts +683 -0
  8. package/project-transform/src/bundled/portable-web-globals.d.ts +153 -0
  9. package/project-transform/src/bundled/runtime_externs.js +220 -0
  10. package/project-transform/src/bundled/runtime_externs.ts +237 -0
  11. package/project-transform/src/bundled/sound-libs/lib.decorators.d.ts +385 -0
  12. package/project-transform/src/bundled/sound-libs/lib.decorators.legacy.d.ts +22 -0
  13. package/project-transform/src/bundled/sound-libs/lib.dom.asynciterable.d.ts +42 -0
  14. package/project-transform/src/bundled/sound-libs/lib.dom.d.ts +39440 -0
  15. package/project-transform/src/bundled/sound-libs/lib.es2015.collection.d.ts +149 -0
  16. package/project-transform/src/bundled/sound-libs/lib.es2015.core.d.ts +657 -0
  17. package/project-transform/src/bundled/sound-libs/lib.es2015.d.ts +28 -0
  18. package/project-transform/src/bundled/sound-libs/lib.es2015.generator.d.ts +77 -0
  19. package/project-transform/src/bundled/sound-libs/lib.es2015.iterable.d.ts +616 -0
  20. package/project-transform/src/bundled/sound-libs/lib.es2015.promise.d.ts +80 -0
  21. package/project-transform/src/bundled/sound-libs/lib.es2015.proxy.d.ts +128 -0
  22. package/project-transform/src/bundled/sound-libs/lib.es2015.reflect.d.ts +144 -0
  23. package/project-transform/src/bundled/sound-libs/lib.es2015.symbol.d.ts +46 -0
  24. package/project-transform/src/bundled/sound-libs/lib.es2015.symbol.wellknown.d.ts +170 -0
  25. package/project-transform/src/bundled/sound-libs/lib.es2016.array.include.d.ts +116 -0
  26. package/project-transform/src/bundled/sound-libs/lib.es2016.d.ts +21 -0
  27. package/project-transform/src/bundled/sound-libs/lib.es2017.arraybuffer.d.ts +21 -0
  28. package/project-transform/src/bundled/sound-libs/lib.es2017.d.ts +26 -0
  29. package/project-transform/src/bundled/sound-libs/lib.es2017.date.d.ts +31 -0
  30. package/project-transform/src/bundled/sound-libs/lib.es2017.object.d.ts +49 -0
  31. package/project-transform/src/bundled/sound-libs/lib.es2017.string.d.ts +45 -0
  32. package/project-transform/src/bundled/sound-libs/lib.es2017.typedarrays.d.ts +53 -0
  33. package/project-transform/src/bundled/sound-libs/lib.es2018.asyncgenerator.d.ts +77 -0
  34. package/project-transform/src/bundled/sound-libs/lib.es2018.asynciterable.d.ts +57 -0
  35. package/project-transform/src/bundled/sound-libs/lib.es2018.d.ts +24 -0
  36. package/project-transform/src/bundled/sound-libs/lib.es2018.promise.d.ts +30 -0
  37. package/project-transform/src/bundled/sound-libs/lib.es2018.regexp.d.ts +37 -0
  38. package/project-transform/src/bundled/sound-libs/lib.es2019.array.d.ts +79 -0
  39. package/project-transform/src/bundled/sound-libs/lib.es2019.d.ts +24 -0
  40. package/project-transform/src/bundled/sound-libs/lib.es2019.object.d.ts +47 -0
  41. package/project-transform/src/bundled/sound-libs/lib.es2019.string.d.ts +37 -0
  42. package/project-transform/src/bundled/sound-libs/lib.es2019.symbol.d.ts +24 -0
  43. package/project-transform/src/bundled/sound-libs/lib.es2020.bigint.d.ts +765 -0
  44. package/project-transform/src/bundled/sound-libs/lib.es2020.d.ts +27 -0
  45. package/project-transform/src/bundled/sound-libs/lib.es2020.date.d.ts +42 -0
  46. package/project-transform/src/bundled/sound-libs/lib.es2020.number.d.ts +28 -0
  47. package/project-transform/src/bundled/sound-libs/lib.es2020.promise.d.ts +49 -0
  48. package/project-transform/src/bundled/sound-libs/lib.es2020.string.d.ts +44 -0
  49. package/project-transform/src/bundled/sound-libs/lib.es2020.symbol.wellknown.d.ts +41 -0
  50. package/project-transform/src/bundled/sound-libs/lib.es2021.d.ts +23 -0
  51. package/project-transform/src/bundled/sound-libs/lib.es2021.promise.d.ts +48 -0
  52. package/project-transform/src/bundled/sound-libs/lib.es2021.string.d.ts +33 -0
  53. package/project-transform/src/bundled/sound-libs/lib.es2021.weakref.d.ts +78 -0
  54. package/project-transform/src/bundled/sound-libs/lib.es2022.array.d.ts +121 -0
  55. package/project-transform/src/bundled/sound-libs/lib.es2022.d.ts +25 -0
  56. package/project-transform/src/bundled/sound-libs/lib.es2022.error.d.ts +75 -0
  57. package/project-transform/src/bundled/sound-libs/lib.es2022.object.d.ts +26 -0
  58. package/project-transform/src/bundled/sound-libs/lib.es2022.regexp.d.ts +39 -0
  59. package/project-transform/src/bundled/sound-libs/lib.es2022.string.d.ts +25 -0
  60. package/project-transform/src/bundled/sound-libs/lib.es2023.array.d.ts +924 -0
  61. package/project-transform/src/bundled/sound-libs/lib.es2023.collection.d.ts +21 -0
  62. package/project-transform/src/bundled/sound-libs/lib.es2023.d.ts +22 -0
  63. package/project-transform/src/bundled/sound-libs/lib.es2024.arraybuffer.d.ts +65 -0
  64. package/project-transform/src/bundled/sound-libs/lib.es2024.collection.d.ts +29 -0
  65. package/project-transform/src/bundled/sound-libs/lib.es2024.d.ts +26 -0
  66. package/project-transform/src/bundled/sound-libs/lib.es2024.object.d.ts +33 -0
  67. package/project-transform/src/bundled/sound-libs/lib.es2024.promise.d.ts +35 -0
  68. package/project-transform/src/bundled/sound-libs/lib.es2024.regexp.d.ts +25 -0
  69. package/project-transform/src/bundled/sound-libs/lib.es2024.string.d.ts +29 -0
  70. package/project-transform/src/bundled/sound-libs/lib.es5.d.ts +4924 -0
  71. package/project-transform/src/bundled/sound_stdlib.js +142 -0
  72. package/project-transform/src/bundled/sound_stdlib.ts +180 -0
  73. package/project-transform/src/checker/analyze_project.js +1361 -0
  74. package/project-transform/src/checker/analyze_project.ts +2246 -0
  75. package/project-transform/src/checker/diagnostics.js +112 -0
  76. package/project-transform/src/checker/diagnostics.ts +222 -0
  77. package/project-transform/src/checker/engine/context.js +235 -0
  78. package/project-transform/src/checker/engine/context.ts +340 -0
  79. package/project-transform/src/checker/engine/diagnostic_codes.js +72 -0
  80. package/project-transform/src/checker/engine/diagnostic_codes.ts +95 -0
  81. package/project-transform/src/checker/engine/facts.js +35 -0
  82. package/project-transform/src/checker/engine/facts.ts +48 -0
  83. package/project-transform/src/checker/engine/types.js +1 -0
  84. package/project-transform/src/checker/engine/types.ts +485 -0
  85. package/project-transform/src/checker/proof_escape_hatch_diagnostics.js +104 -0
  86. package/project-transform/src/checker/proof_escape_hatch_diagnostics.ts +173 -0
  87. package/project-transform/src/checker/rules/async_surface.js +231 -0
  88. package/project-transform/src/checker/rules/async_surface.ts +335 -0
  89. package/project-transform/src/checker/rules/class_lifecycle.js +798 -0
  90. package/project-transform/src/checker/rules/class_lifecycle.ts +1276 -0
  91. package/project-transform/src/checker/rules/directive_validation.js +571 -0
  92. package/project-transform/src/checker/rules/directive_validation.ts +938 -0
  93. package/project-transform/src/checker/rules/directives.js +23 -0
  94. package/project-transform/src/checker/rules/directives.ts +25 -0
  95. package/project-transform/src/checker/rules/flow.js +202 -0
  96. package/project-transform/src/checker/rules/flow.ts +333 -0
  97. package/project-transform/src/checker/rules/flow_facts.js +601 -0
  98. package/project-transform/src/checker/rules/flow_facts.ts +978 -0
  99. package/project-transform/src/checker/rules/flow_invalidation.js +1119 -0
  100. package/project-transform/src/checker/rules/flow_invalidation.ts +2150 -0
  101. package/project-transform/src/checker/rules/flow_shared.js +2822 -0
  102. package/project-transform/src/checker/rules/flow_shared.ts +4383 -0
  103. package/project-transform/src/checker/rules/foreign_boundary.js +120 -0
  104. package/project-transform/src/checker/rules/foreign_boundary.ts +196 -0
  105. package/project-transform/src/checker/rules/foreign_projection.js +279 -0
  106. package/project-transform/src/checker/rules/foreign_projection.ts +425 -0
  107. package/project-transform/src/checker/rules/generated_helpers.js +13 -0
  108. package/project-transform/src/checker/rules/generated_helpers.ts +18 -0
  109. package/project-transform/src/checker/rules/index.js +35 -0
  110. package/project-transform/src/checker/rules/index.ts +49 -0
  111. package/project-transform/src/checker/rules/namespace_object.js +845 -0
  112. package/project-transform/src/checker/rules/namespace_object.ts +1224 -0
  113. package/project-transform/src/checker/rules/non_ordinary_recovery.js +1328 -0
  114. package/project-transform/src/checker/rules/non_ordinary_recovery.ts +2391 -0
  115. package/project-transform/src/checker/rules/null_prototype.js +3 -0
  116. package/project-transform/src/checker/rules/null_prototype.ts +6 -0
  117. package/project-transform/src/checker/rules/overloads.js +181 -0
  118. package/project-transform/src/checker/rules/overloads.ts +317 -0
  119. package/project-transform/src/checker/rules/predicate_verification.js +691 -0
  120. package/project-transform/src/checker/rules/predicate_verification.ts +1088 -0
  121. package/project-transform/src/checker/rules/prototype_hardening.js +237 -0
  122. package/project-transform/src/checker/rules/prototype_hardening.ts +343 -0
  123. package/project-transform/src/checker/rules/receiver_discipline.js +263 -0
  124. package/project-transform/src/checker/rules/receiver_discipline.ts +356 -0
  125. package/project-transform/src/checker/rules/relations.js +6861 -0
  126. package/project-transform/src/checker/rules/relations.ts +12158 -0
  127. package/project-transform/src/checker/rules/resolved_builtins.js +274 -0
  128. package/project-transform/src/checker/rules/resolved_builtins.ts +438 -0
  129. package/project-transform/src/checker/rules/trust.js +217 -0
  130. package/project-transform/src/checker/rules/trust.ts +301 -0
  131. package/project-transform/src/checker/rules/type_guards.js +173 -0
  132. package/project-transform/src/checker/rules/type_guards.ts +257 -0
  133. package/project-transform/src/checker/rules/universal.js +17 -0
  134. package/project-transform/src/checker/rules/universal.ts +22 -0
  135. package/project-transform/src/checker/rules/unsafe_value_origin.js +80 -0
  136. package/project-transform/src/checker/rules/unsafe_value_origin.ts +125 -0
  137. package/project-transform/src/checker/rules/unsound_imports.js +218 -0
  138. package/project-transform/src/checker/rules/unsound_imports.ts +301 -0
  139. package/project-transform/src/checker/rules/unsound_syntax.js +1695 -0
  140. package/project-transform/src/checker/rules/unsound_syntax.ts +2540 -0
  141. package/project-transform/src/checker/rules/value_types.js +206 -0
  142. package/project-transform/src/checker/rules/value_types.ts +407 -0
  143. package/project-transform/src/checker/timing.js +43 -0
  144. package/project-transform/src/checker/timing.ts +78 -0
  145. package/project-transform/src/checker/unsupported_feature_messages.js +337 -0
  146. package/project-transform/src/checker/unsupported_feature_messages.ts +531 -0
  147. package/project-transform/src/cli.js +892 -0
  148. package/project-transform/src/cli.ts +1476 -0
  149. package/project-transform/src/compiler/compile_project.js +319 -0
  150. package/project-transform/src/compiler/compile_project.ts +508 -0
  151. package/project-transform/src/compiler/errors.js +10 -0
  152. package/project-transform/src/compiler/errors.ts +29 -0
  153. package/project-transform/src/compiler/ir.js +1 -0
  154. package/project-transform/src/compiler/ir.ts +1526 -0
  155. package/project-transform/src/compiler/lower.js +30550 -0
  156. package/project-transform/src/compiler/lower.ts +43645 -0
  157. package/project-transform/src/compiler/lower_arrays.js +140 -0
  158. package/project-transform/src/compiler/lower_arrays.ts +190 -0
  159. package/project-transform/src/compiler/lower_strings.js +121 -0
  160. package/project-transform/src/compiler/lower_strings.ts +198 -0
  161. package/project-transform/src/compiler/lower_tagged.js +329 -0
  162. package/project-transform/src/compiler/lower_tagged.ts +427 -0
  163. package/project-transform/src/compiler/lower_views.js +171 -0
  164. package/project-transform/src/compiler/lower_views.ts +251 -0
  165. package/project-transform/src/compiler/object_keys.js +25 -0
  166. package/project-transform/src/compiler/object_keys.ts +35 -0
  167. package/project-transform/src/compiler/runtime_ir.js +30 -0
  168. package/project-transform/src/compiler/runtime_ir.ts +727 -0
  169. package/project-transform/src/compiler/tagged_boundary.js +18 -0
  170. package/project-transform/src/compiler/tagged_boundary.ts +37 -0
  171. package/project-transform/src/compiler/toolchain.js +170 -0
  172. package/project-transform/src/compiler/toolchain.ts +229 -0
  173. package/project-transform/src/compiler/unicode_case_data.js +2102 -0
  174. package/project-transform/src/compiler/unicode_case_data.ts +2112 -0
  175. package/project-transform/src/compiler/wasm_js_host_runtime.js +656 -0
  176. package/project-transform/src/compiler/wasm_js_host_runtime.ts +762 -0
  177. package/project-transform/src/compiler/wat_arrays.js +3132 -0
  178. package/project-transform/src/compiler/wat_arrays.ts +3768 -0
  179. package/project-transform/src/compiler/wat_emitter.js +17952 -0
  180. package/project-transform/src/compiler/wat_emitter.ts +22812 -0
  181. package/project-transform/src/compiler/wat_strings.js +129 -0
  182. package/project-transform/src/compiler/wat_strings.ts +187 -0
  183. package/project-transform/src/compiler/wat_tagged.js +548 -0
  184. package/project-transform/src/compiler/wat_tagged.ts +674 -0
  185. package/project-transform/src/compiler_generator_runner.js +153 -0
  186. package/project-transform/src/compiler_generator_runner.ts +171 -0
  187. package/project-transform/src/compiler_object_test_helpers.js +69 -0
  188. package/project-transform/src/compiler_object_test_helpers.ts +96 -0
  189. package/project-transform/src/compiler_promise_runner.js +2116 -0
  190. package/project-transform/src/compiler_promise_runner.ts +2184 -0
  191. package/project-transform/src/compiler_test_helpers.js +854 -0
  192. package/project-transform/src/compiler_test_helpers.ts +1087 -0
  193. package/project-transform/src/config.js +568 -0
  194. package/project-transform/src/config.ts +892 -0
  195. package/project-transform/src/diagnostic_metadata.js +67 -0
  196. package/project-transform/src/diagnostic_metadata.ts +99 -0
  197. package/project-transform/src/diagnostic_reference.js +1368 -0
  198. package/project-transform/src/diagnostic_reference.ts +1523 -0
  199. package/project-transform/src/editor_diagnostics_worker.js +176 -0
  200. package/project-transform/src/editor_diagnostics_worker.ts +250 -0
  201. package/project-transform/src/editor_projection.js +224 -0
  202. package/project-transform/src/editor_projection.ts +421 -0
  203. package/project-transform/src/frontend/builtin_expanded_program_test_cleanup.js +47 -0
  204. package/project-transform/src/frontend/builtin_expanded_program_test_cleanup.ts +72 -0
  205. package/project-transform/src/frontend/builtin_macro_support.js +842 -0
  206. package/project-transform/src/frontend/builtin_macro_support.ts +1386 -0
  207. package/project-transform/src/frontend/builtin_macros.js +409 -0
  208. package/project-transform/src/frontend/builtin_macros.ts +542 -0
  209. package/project-transform/src/frontend/component_poc_runtime.js +279 -0
  210. package/project-transform/src/frontend/component_poc_runtime.ts +372 -0
  211. package/project-transform/src/frontend/css_macro.js +148 -0
  212. package/project-transform/src/frontend/css_macro.ts +222 -0
  213. package/project-transform/src/frontend/derive_macros.js +2072 -0
  214. package/project-transform/src/frontend/derive_macros.ts +3188 -0
  215. package/project-transform/src/frontend/embedded_fragment_support.js +106 -0
  216. package/project-transform/src/frontend/embedded_fragment_support.ts +172 -0
  217. package/project-transform/src/frontend/error_normalization.js +403 -0
  218. package/project-transform/src/frontend/error_normalization.ts +832 -0
  219. package/project-transform/src/frontend/error_stdlib_support.js +1 -0
  220. package/project-transform/src/frontend/error_stdlib_support.ts +6 -0
  221. package/project-transform/src/frontend/expand_project.js +169 -0
  222. package/project-transform/src/frontend/expand_project.ts +248 -0
  223. package/project-transform/src/frontend/format_soundscript.js +297 -0
  224. package/project-transform/src/frontend/format_soundscript.ts +582 -0
  225. package/project-transform/src/frontend/graphql_macro.js +174 -0
  226. package/project-transform/src/frontend/graphql_macro.ts +253 -0
  227. package/project-transform/src/frontend/hash_context.js +83 -0
  228. package/project-transform/src/frontend/hash_context.ts +113 -0
  229. package/project-transform/src/frontend/hkt_macro.js +448 -0
  230. package/project-transform/src/frontend/hkt_macro.ts +897 -0
  231. package/project-transform/src/frontend/import_binding_usage.js +190 -0
  232. package/project-transform/src/frontend/import_binding_usage.ts +277 -0
  233. package/project-transform/src/frontend/macro_advanced_backend_adapter.js +58 -0
  234. package/project-transform/src/frontend/macro_advanced_backend_adapter.ts +123 -0
  235. package/project-transform/src/frontend/macro_advanced_context.js +826 -0
  236. package/project-transform/src/frontend/macro_advanced_context.ts +1102 -0
  237. package/project-transform/src/frontend/macro_advanced_output.js +21 -0
  238. package/project-transform/src/frontend/macro_advanced_output.ts +41 -0
  239. package/project-transform/src/frontend/macro_api.js +353 -0
  240. package/project-transform/src/frontend/macro_api.ts +1722 -0
  241. package/project-transform/src/frontend/macro_api_internal.js +35 -0
  242. package/project-transform/src/frontend/macro_api_internal.ts +80 -0
  243. package/project-transform/src/frontend/macro_api_module_support.js +39 -0
  244. package/project-transform/src/frontend/macro_api_module_support.ts +65 -0
  245. package/project-transform/src/frontend/macro_backend_adapter.js +272 -0
  246. package/project-transform/src/frontend/macro_backend_adapter.ts +420 -0
  247. package/project-transform/src/frontend/macro_context.js +816 -0
  248. package/project-transform/src/frontend/macro_context.ts +1105 -0
  249. package/project-transform/src/frontend/macro_debug.js +99 -0
  250. package/project-transform/src/frontend/macro_debug.ts +157 -0
  251. package/project-transform/src/frontend/macro_definition_support.js +28 -0
  252. package/project-transform/src/frontend/macro_definition_support.ts +73 -0
  253. package/project-transform/src/frontend/macro_errors.js +40 -0
  254. package/project-transform/src/frontend/macro_errors.ts +70 -0
  255. package/project-transform/src/frontend/macro_expander.js +919 -0
  256. package/project-transform/src/frontend/macro_expander.ts +1611 -0
  257. package/project-transform/src/frontend/macro_factory_support.js +176 -0
  258. package/project-transform/src/frontend/macro_factory_support.ts +263 -0
  259. package/project-transform/src/frontend/macro_host_ast_internal.js +64 -0
  260. package/project-transform/src/frontend/macro_host_ast_internal.ts +109 -0
  261. package/project-transform/src/frontend/macro_index.js +27 -0
  262. package/project-transform/src/frontend/macro_index.ts +50 -0
  263. package/project-transform/src/frontend/macro_loader.js +281 -0
  264. package/project-transform/src/frontend/macro_loader.ts +506 -0
  265. package/project-transform/src/frontend/macro_operand_semantics.js +838 -0
  266. package/project-transform/src/frontend/macro_operand_semantics.ts +1489 -0
  267. package/project-transform/src/frontend/macro_output.js +54 -0
  268. package/project-transform/src/frontend/macro_output.ts +123 -0
  269. package/project-transform/src/frontend/macro_parser.js +611 -0
  270. package/project-transform/src/frontend/macro_parser.ts +832 -0
  271. package/project-transform/src/frontend/macro_resolver.js +69 -0
  272. package/project-transform/src/frontend/macro_resolver.ts +125 -0
  273. package/project-transform/src/frontend/macro_rewrite.js +285 -0
  274. package/project-transform/src/frontend/macro_rewrite.ts +442 -0
  275. package/project-transform/src/frontend/macro_runtime_support.js +232 -0
  276. package/project-transform/src/frontend/macro_runtime_support.ts +324 -0
  277. package/project-transform/src/frontend/macro_scanner.js +393 -0
  278. package/project-transform/src/frontend/macro_scanner.ts +455 -0
  279. package/project-transform/src/frontend/macro_semantic_backend_adapter.js +87 -0
  280. package/project-transform/src/frontend/macro_semantic_backend_adapter.ts +166 -0
  281. package/project-transform/src/frontend/macro_semantic_context.js +5 -0
  282. package/project-transform/src/frontend/macro_semantic_context.ts +12 -0
  283. package/project-transform/src/frontend/macro_semantic_output.js +24 -0
  284. package/project-transform/src/frontend/macro_semantic_output.ts +47 -0
  285. package/project-transform/src/frontend/macro_semantic_types.js +1 -0
  286. package/project-transform/src/frontend/macro_semantic_types.ts +98 -0
  287. package/project-transform/src/frontend/macro_semantics.js +1172 -0
  288. package/project-transform/src/frontend/macro_semantics.ts +1502 -0
  289. package/project-transform/src/frontend/macro_site_kind_support.js +164 -0
  290. package/project-transform/src/frontend/macro_site_kind_support.ts +255 -0
  291. package/project-transform/src/frontend/macro_syntax_internal.js +1950 -0
  292. package/project-transform/src/frontend/macro_syntax_internal.ts +3338 -0
  293. package/project-transform/src/frontend/macro_templates.js +57 -0
  294. package/project-transform/src/frontend/macro_templates.ts +143 -0
  295. package/project-transform/src/frontend/macro_test_helpers.js +82 -0
  296. package/project-transform/src/frontend/macro_test_helpers.ts +136 -0
  297. package/project-transform/src/frontend/macro_types.js +1 -0
  298. package/project-transform/src/frontend/macro_types.ts +103 -0
  299. package/project-transform/src/frontend/macro_vm.js +39 -0
  300. package/project-transform/src/frontend/macro_vm.ts +113 -0
  301. package/project-transform/src/frontend/match_macro.js +885 -0
  302. package/project-transform/src/frontend/match_macro.ts +1220 -0
  303. package/project-transform/src/frontend/numeric_normalization.js +824 -0
  304. package/project-transform/src/frontend/numeric_normalization.ts +1380 -0
  305. package/project-transform/src/frontend/numeric_prelude.js +278 -0
  306. package/project-transform/src/frontend/numeric_prelude.ts +370 -0
  307. package/project-transform/src/frontend/project_frontend.js +2396 -0
  308. package/project-transform/src/frontend/project_frontend.ts +3776 -0
  309. package/project-transform/src/frontend/project_macro_support.js +1401 -0
  310. package/project-transform/src/frontend/project_macro_support.ts +2137 -0
  311. package/project-transform/src/frontend/sql_macro.js +175 -0
  312. package/project-transform/src/frontend/sql_macro.ts +254 -0
  313. package/project-transform/src/frontend/sql_stdlib_support.js +1 -0
  314. package/project-transform/src/frontend/sql_stdlib_support.ts +6 -0
  315. package/project-transform/src/frontend/std_package_support.js +228 -0
  316. package/project-transform/src/frontend/std_package_support.ts +400 -0
  317. package/project-transform/src/frontend/value_normalization.js +306 -0
  318. package/project-transform/src/frontend/value_normalization.ts +599 -0
  319. package/project-transform/src/lsp/project_service.js +4771 -0
  320. package/project-transform/src/lsp/project_service.ts +7580 -0
  321. package/project-transform/src/lsp/protocol.js +9 -0
  322. package/project-transform/src/lsp/protocol.ts +38 -0
  323. package/project-transform/src/lsp/server.js +355 -0
  324. package/project-transform/src/lsp/server.ts +671 -0
  325. package/project-transform/src/lsp/session.js +49 -0
  326. package/project-transform/src/lsp/session.ts +48 -0
  327. package/project-transform/src/lsp/timing.js +43 -0
  328. package/project-transform/src/lsp/timing.ts +76 -0
  329. package/project-transform/src/lsp/transport.js +205 -0
  330. package/project-transform/src/lsp/transport.ts +253 -0
  331. package/project-transform/src/lsp_main.js +5 -0
  332. package/project-transform/src/lsp_main.ts +7 -0
  333. package/project-transform/src/macros.d.ts +1 -0
  334. package/project-transform/src/macros.js +1 -0
  335. package/project-transform/src/macros.ts +1 -0
  336. package/project-transform/src/main.js +24 -0
  337. package/project-transform/src/main.ts +28 -0
  338. package/project-transform/src/platform/host.js +264 -0
  339. package/project-transform/src/platform/host.ts +343 -0
  340. package/project-transform/src/platform/path.js +8 -0
  341. package/project-transform/src/platform/path.ts +20 -0
  342. package/project-transform/src/public_macro_api/macro_api.d.ts +1054 -0
  343. package/project-transform/src/public_macro_api/macro_semantic_types.d.ts +66 -0
  344. package/project-transform/src/public_macro_api/macro_types.d.ts +70 -0
  345. package/project-transform/src/run_program.js +14 -0
  346. package/project-transform/src/run_program.ts +33 -0
  347. package/project-transform/src/runtime/materialize.js +371 -0
  348. package/project-transform/src/runtime/materialize.ts +502 -0
  349. package/project-transform/src/runtime/on_demand.js +203 -0
  350. package/project-transform/src/runtime/on_demand.ts +305 -0
  351. package/project-transform/src/runtime/source_maps.js +205 -0
  352. package/project-transform/src/runtime/source_maps.ts +297 -0
  353. package/project-transform/src/runtime/transform.js +148 -0
  354. package/project-transform/src/runtime/transform.ts +295 -0
  355. package/project-transform/src/service/types.js +1 -0
  356. package/project-transform/src/service/types.ts +22 -0
  357. package/project-transform/src/soundscript_packages.js +477 -0
  358. package/project-transform/src/soundscript_packages.ts +754 -0
  359. package/project-transform/src/soundscript_runtime_specifiers.js +88 -0
  360. package/project-transform/src/soundscript_runtime_specifiers.ts +96 -0
  361. package/project-transform/src/stdlib/async.d.ts +81 -0
  362. package/project-transform/src/stdlib/async.js +213 -0
  363. package/project-transform/src/stdlib/async.ts +315 -0
  364. package/project-transform/src/stdlib/codec.d.ts +32 -0
  365. package/project-transform/src/stdlib/codec.js +30 -0
  366. package/project-transform/src/stdlib/codec.ts +76 -0
  367. package/project-transform/src/stdlib/compare.d.ts +28 -0
  368. package/project-transform/src/stdlib/compare.js +115 -0
  369. package/project-transform/src/stdlib/compare.ts +151 -0
  370. package/project-transform/src/stdlib/css.d.ts +16 -0
  371. package/project-transform/src/stdlib/css.js +9 -0
  372. package/project-transform/src/stdlib/css.ts +28 -0
  373. package/project-transform/src/stdlib/debug.d.ts +2 -0
  374. package/project-transform/src/stdlib/debug.js +9 -0
  375. package/project-transform/src/stdlib/debug.ts +10 -0
  376. package/project-transform/src/stdlib/decode.d.ts +86 -0
  377. package/project-transform/src/stdlib/decode.js +254 -0
  378. package/project-transform/src/stdlib/decode.ts +390 -0
  379. package/project-transform/src/stdlib/derive.d.ts +6 -0
  380. package/project-transform/src/stdlib/derive.js +7 -0
  381. package/project-transform/src/stdlib/derive.ts +7 -0
  382. package/project-transform/src/stdlib/encode.d.ts +100 -0
  383. package/project-transform/src/stdlib/encode.js +130 -0
  384. package/project-transform/src/stdlib/encode.ts +259 -0
  385. package/project-transform/src/stdlib/failures.d.ts +23 -0
  386. package/project-transform/src/stdlib/failures.js +41 -0
  387. package/project-transform/src/stdlib/failures.ts +64 -0
  388. package/project-transform/src/stdlib/fetch.d.ts +67 -0
  389. package/project-transform/src/stdlib/fetch.js +5 -0
  390. package/project-transform/src/stdlib/fetch.ts +11 -0
  391. package/project-transform/src/stdlib/graphql.d.ts +16 -0
  392. package/project-transform/src/stdlib/graphql.js +9 -0
  393. package/project-transform/src/stdlib/graphql.ts +28 -0
  394. package/project-transform/src/stdlib/hash.d.ts +34 -0
  395. package/project-transform/src/stdlib/hash.js +110 -0
  396. package/project-transform/src/stdlib/hash.ts +188 -0
  397. package/project-transform/src/stdlib/hkt.d.ts +40 -0
  398. package/project-transform/src/stdlib/hkt.js +3 -0
  399. package/project-transform/src/stdlib/hkt.ts +41 -0
  400. package/project-transform/src/stdlib/index.d.ts +9 -0
  401. package/project-transform/src/stdlib/index.js +15 -0
  402. package/project-transform/src/stdlib/index.ts +23 -0
  403. package/project-transform/src/stdlib/json.d.ts +125 -0
  404. package/project-transform/src/stdlib/json.js +764 -0
  405. package/project-transform/src/stdlib/json.ts +1034 -0
  406. package/project-transform/src/stdlib/match.d.ts +11 -0
  407. package/project-transform/src/stdlib/match.js +13 -0
  408. package/project-transform/src/stdlib/match.ts +26 -0
  409. package/project-transform/src/stdlib/numerics.d.ts +523 -0
  410. package/project-transform/src/stdlib/numerics.js +1356 -0
  411. package/project-transform/src/stdlib/numerics.ts +1937 -0
  412. package/project-transform/src/stdlib/random.d.ts +19 -0
  413. package/project-transform/src/stdlib/random.js +3 -0
  414. package/project-transform/src/stdlib/random.ts +5 -0
  415. package/project-transform/src/stdlib/result.d.ts +68 -0
  416. package/project-transform/src/stdlib/result.js +139 -0
  417. package/project-transform/src/stdlib/result.ts +248 -0
  418. package/project-transform/src/stdlib/sql.d.ts +22 -0
  419. package/project-transform/src/stdlib/sql.js +23 -0
  420. package/project-transform/src/stdlib/sql.ts +53 -0
  421. package/project-transform/src/stdlib/text.d.ts +24 -0
  422. package/project-transform/src/stdlib/text.js +3 -0
  423. package/project-transform/src/stdlib/text.ts +4 -0
  424. package/project-transform/src/stdlib/thunk.d.ts +2 -0
  425. package/project-transform/src/stdlib/thunk.js +9 -0
  426. package/project-transform/src/stdlib/thunk.ts +15 -0
  427. package/project-transform/src/stdlib/typeclasses.d.ts +57 -0
  428. package/project-transform/src/stdlib/typeclasses.js +78 -0
  429. package/project-transform/src/stdlib/typeclasses.ts +173 -0
  430. package/project-transform/src/stdlib/url.d.ts +37 -0
  431. package/project-transform/src/stdlib/url.js +3 -0
  432. package/project-transform/src/stdlib/url.ts +4 -0
  433. package/project-transform/src/stdlib/value.d.ts +9 -0
  434. package/project-transform/src/stdlib/value.js +104 -0
  435. package/project-transform/src/stdlib/value.ts +133 -0
  436. package/project-transform/src/test_installed_stdlib.js +147 -0
  437. package/project-transform/src/test_installed_stdlib.ts +245 -0
  438. package/project-transform/src/test_macro_package_fixture.js +50 -0
  439. package/project-transform/src/test_macro_package_fixture.ts +68 -0
  440. package/project-transform/src/value_deep_safe.js +191 -0
  441. package/project-transform/src/value_deep_safe.ts +273 -0
@@ -0,0 +1,151 @@
1
+ import { isErr, isNone, isOk, isSome, type Option, type Result } from 'sts:result';
2
+
3
+ export type Ordering = -1 | 0 | 1;
4
+
5
+ export interface Eq<T> {
6
+ equals(left: T, right: T): boolean;
7
+ }
8
+
9
+ export interface Order<T> extends Eq<T> {
10
+ compare(left: T, right: T): Ordering;
11
+ }
12
+
13
+ type EqValue<TEq> = TEq extends Eq<infer TValue> ? TValue : never;
14
+
15
+ export const stringEq: Eq<string> = {
16
+ equals(left, right) {
17
+ return left === right;
18
+ },
19
+ };
20
+
21
+ export const numberEq: Eq<number> = {
22
+ equals(left, right) {
23
+ return left === right || (Number.isNaN(left) && Number.isNaN(right));
24
+ },
25
+ };
26
+
27
+ export const booleanEq: Eq<boolean> = {
28
+ equals(left, right) {
29
+ return left === right;
30
+ },
31
+ };
32
+
33
+ export const bigintEq: Eq<bigint> = {
34
+ equals(left, right) {
35
+ return left === right;
36
+ },
37
+ };
38
+
39
+ export function lazyEq<T>(getEq: () => Eq<T>): Eq<T> {
40
+ return {
41
+ equals(left, right) {
42
+ return getEq().equals(left, right);
43
+ },
44
+ };
45
+ }
46
+
47
+ export function arrayEq<T>(itemEq: Eq<T>): Eq<readonly T[]> {
48
+ return {
49
+ equals(left, right) {
50
+ if (left.length !== right.length) {
51
+ return false;
52
+ }
53
+
54
+ for (let index = 0; index < left.length; index += 1) {
55
+ if (!itemEq.equals(left[index]!, right[index]!)) {
56
+ return false;
57
+ }
58
+ }
59
+
60
+ return true;
61
+ },
62
+ };
63
+ }
64
+
65
+ export function tupleEq<const TEqs extends readonly Eq<unknown>[]>(
66
+ ...elements: TEqs
67
+ ): Eq<{ readonly [K in keyof TEqs]: EqValue<TEqs[K]> }> {
68
+ return {
69
+ equals(left, right) {
70
+ const leftValues = left as readonly unknown[];
71
+ const rightValues = right as readonly unknown[];
72
+ if (leftValues.length !== elements.length || rightValues.length !== elements.length) {
73
+ return false;
74
+ }
75
+
76
+ for (let index = 0; index < elements.length; index += 1) {
77
+ const elementEq = elements[index];
78
+ if (!elementEq) {
79
+ continue;
80
+ }
81
+ if (!elementEq.equals(leftValues[index], rightValues[index])) {
82
+ return false;
83
+ }
84
+ }
85
+
86
+ return true;
87
+ },
88
+ };
89
+ }
90
+
91
+ export function optionEq<T>(itemEq: Eq<T>): Eq<Option<T>> {
92
+ return {
93
+ equals(left, right) {
94
+ if (isSome(left) && isSome(right)) {
95
+ return itemEq.equals(left.value, right.value);
96
+ }
97
+
98
+ return isNone(left) && isNone(right);
99
+ },
100
+ };
101
+ }
102
+
103
+ export function resultEq<T, E>(okEq: Eq<T>, errEq: Eq<E>): Eq<Result<T, E>> {
104
+ return {
105
+ equals(left, right) {
106
+ if (isOk(left) && isOk(right)) {
107
+ return okEq.equals(left.value, right.value);
108
+ }
109
+
110
+ if (isErr(left) && isErr(right)) {
111
+ return errEq.equals(left.error, right.error);
112
+ }
113
+
114
+ return false;
115
+ },
116
+ };
117
+ }
118
+
119
+ export function fromCompare<T>(compare: (left: T, right: T) => number): Order<T> {
120
+ return {
121
+ equals(left, right) {
122
+ return normalizeOrdering(compare(left, right)) === 0;
123
+ },
124
+ compare(left, right) {
125
+ return normalizeOrdering(compare(left, right));
126
+ },
127
+ };
128
+ }
129
+
130
+ export function reverse<T>(order: Order<T>): Order<T> {
131
+ return fromCompare((left, right) => order.compare(right, left));
132
+ }
133
+
134
+ export function thenBy<T>(primary: Order<T>, secondary: Order<T>): Order<T> {
135
+ return fromCompare((left, right) => {
136
+ const primaryOrdering = primary.compare(left, right);
137
+ return primaryOrdering !== 0 ? primaryOrdering : secondary.compare(left, right);
138
+ });
139
+ }
140
+
141
+ function normalizeOrdering(value: number): Ordering {
142
+ if (value < 0) {
143
+ return -1;
144
+ }
145
+
146
+ if (value > 0) {
147
+ return 1;
148
+ }
149
+
150
+ return 0;
151
+ }
@@ -0,0 +1,16 @@
1
+ export interface CssRawFragment {
2
+ readonly __cssKind: 'raw';
3
+ readonly text: string;
4
+ }
5
+
6
+ export interface CssTemplate {
7
+ readonly text: string;
8
+ readonly values: readonly unknown[];
9
+ }
10
+
11
+ export interface CssTag {
12
+ (strings: TemplateStringsArray, ...values: readonly unknown[]): CssTemplate;
13
+ raw(text: string): CssRawFragment;
14
+ }
15
+
16
+ export const css: CssTag;
@@ -0,0 +1,9 @@
1
+ const cssTag = Object.assign((strings, ...values) => ({
2
+ text: String.raw({ raw: strings }, ...values.map(String)),
3
+ values: [...values],
4
+ }), {
5
+ raw(text) {
6
+ return { __cssKind: 'raw', text };
7
+ },
8
+ });
9
+ export const css = cssTag;
@@ -0,0 +1,28 @@
1
+ export interface CssRawFragment {
2
+ readonly __cssKind: 'raw';
3
+ readonly text: string;
4
+ }
5
+
6
+ export interface CssTemplate {
7
+ readonly text: string;
8
+ readonly values: readonly unknown[];
9
+ }
10
+
11
+ export interface CssTag {
12
+ (strings: TemplateStringsArray, ...values: readonly unknown[]): CssTemplate;
13
+ raw(text: string): CssRawFragment;
14
+ }
15
+
16
+ const cssTag: CssTag = Object.assign(
17
+ (strings: TemplateStringsArray, ...values: readonly unknown[]): CssTemplate => ({
18
+ text: String.raw({ raw: strings }, ...values.map(String)),
19
+ values: [...values],
20
+ }),
21
+ {
22
+ raw(text: string): CssRawFragment {
23
+ return { __cssKind: 'raw', text };
24
+ },
25
+ },
26
+ );
27
+
28
+ export const css = cssTag;
@@ -0,0 +1,2 @@
1
+ export function assert(condition: unknown, message?: string): asserts condition;
2
+ export function log<T>(value: T): T;
@@ -0,0 +1,9 @@
1
+ export function assert(condition, message = 'Assertion failed.') {
2
+ if (!condition) {
3
+ throw new Error(message);
4
+ }
5
+ }
6
+ export function log(value) {
7
+ console.log(value);
8
+ return value;
9
+ }
@@ -0,0 +1,10 @@
1
+ export function assert(condition: unknown, message = 'Assertion failed.'): asserts condition {
2
+ if (!condition) {
3
+ throw new Error(message);
4
+ }
5
+ }
6
+
7
+ export function log<T>(value: T): T {
8
+ console.log(value);
9
+ return value;
10
+ }
@@ -0,0 +1,86 @@
1
+ import { type ErrorFrame, Failure } from 'sts:failures';
2
+ import type { Option, Result } from 'sts:result';
3
+
4
+ export type DecodePathSegment = string | number;
5
+ export type DecodePath = readonly DecodePathSegment[];
6
+
7
+ export class DecodeFailure extends Failure {
8
+ readonly path: DecodePath;
9
+ constructor(
10
+ message?: string,
11
+ options?: {
12
+ cause?: unknown;
13
+ path?: DecodePath;
14
+ trace?: readonly ErrorFrame[];
15
+ },
16
+ );
17
+ at(segment: DecodePathSegment): this;
18
+ }
19
+
20
+ // #[variance(T: out, E: out)]
21
+ export type Decoder<T, E = DecodeFailure> = {
22
+ decode(value: unknown): Result<T, E>;
23
+ };
24
+
25
+ // #[variance(T: out, E: out)]
26
+ export type OptionalDecoder<T, E = DecodeFailure> = Decoder<T | undefined, E> & {
27
+ readonly __soundscriptOptional: true;
28
+ readonly inner: Decoder<T, E>;
29
+ };
30
+
31
+ type DecoderValue<TDecoder> = TDecoder extends Decoder<infer TValue, unknown> ? TValue : never;
32
+ type DecoderError<TDecoder> = TDecoder extends Decoder<unknown, infer E> ? E : never;
33
+ type ObjectShape = Record<string, Decoder<unknown, unknown>>;
34
+ type TupleShape = readonly Decoder<unknown, unknown>[];
35
+
36
+ export const string: Decoder<string>;
37
+ export const number: Decoder<number>;
38
+ export const boolean: Decoder<boolean>;
39
+ export const bigint: Decoder<bigint>;
40
+ export function lazy<T, E>(getDecoder: () => Decoder<T, E>): Decoder<T, E>;
41
+
42
+ export function optional<T, E>(decoder: Decoder<T, E>): OptionalDecoder<T, E>;
43
+ export function literal<const T extends string | number | boolean | null>(value: T): Decoder<T>;
44
+ export function array<T, E>(item: Decoder<T, E>): Decoder<readonly T[], E | DecodeFailure>;
45
+ export function tuple<const TElements extends TupleShape>(
46
+ ...elements: TElements
47
+ ): Decoder<
48
+ { readonly [K in keyof TElements]: DecoderValue<TElements[K]> },
49
+ DecoderError<TElements[number]> | DecodeFailure
50
+ >;
51
+ export function option<T, E>(item: Decoder<T, E>): Decoder<Option<T>, E | DecodeFailure>;
52
+ export function result<T, EValue, EDecodeValue, EDecodeError>(
53
+ okDecoder: Decoder<T, EDecodeValue>,
54
+ errDecoder: Decoder<EValue, EDecodeError>,
55
+ ): Decoder<Result<T, EValue>, EDecodeValue | EDecodeError | DecodeFailure>;
56
+ export function object<TShape extends ObjectShape>(
57
+ shape: TShape,
58
+ ): Decoder<
59
+ { readonly [K in keyof TShape]: DecoderValue<TShape[K]> },
60
+ DecoderError<TShape[keyof TShape]> | DecodeFailure
61
+ >;
62
+ export function field<K extends string, T, E>(
63
+ key: K,
64
+ decoder: Decoder<T, E>,
65
+ ): Decoder<T, E | DecodeFailure>;
66
+ export function optionalField<K extends string, T, E>(
67
+ key: K,
68
+ decoder: Decoder<T, E>,
69
+ ): Decoder<T | undefined, E | DecodeFailure>;
70
+ export function union<A, B, ELeft, ERight>(
71
+ left: Decoder<A, ELeft>,
72
+ right: Decoder<B, ERight>,
73
+ ): Decoder<A | B, ELeft | ERight | DecodeFailure>;
74
+ export function map<A, B, E>(
75
+ decoder: Decoder<A, E>,
76
+ project: (value: A) => B,
77
+ ): Decoder<B, E>;
78
+ export function andThen<A, B, E>(
79
+ decoder: Decoder<A, E>,
80
+ project: (value: A) => Decoder<B, E>,
81
+ ): Decoder<B, E>;
82
+ export function refine<A, B extends A, E>(
83
+ decoder: Decoder<A, E>,
84
+ predicate: (value: A) => value is B,
85
+ message: string,
86
+ ): Decoder<B, E | DecodeFailure>;
@@ -0,0 +1,254 @@
1
+ import { Failure } from '@soundscript/soundscript/failures';
2
+ import { err, isErr, none, ok, some } from '@soundscript/soundscript/result';
3
+ export class DecodeFailure extends Failure {
4
+ constructor(message = 'Failed to decode value.', options = {}) {
5
+ super(message, {
6
+ ...(options.cause === undefined ? {} : { cause: options.cause }),
7
+ ...(options.trace === undefined ? {} : { trace: options.trace }),
8
+ });
9
+ this.path = options.path ?? [];
10
+ }
11
+ at(segment) {
12
+ const prototype = Object.getPrototypeOf(this);
13
+ const clone = (prototype === null ? Object.create(null) : Object.create(prototype));
14
+ Object.defineProperties(clone, Object.getOwnPropertyDescriptors(this));
15
+ Object.defineProperty(clone, 'path', {
16
+ configurable: true,
17
+ enumerable: true,
18
+ writable: false,
19
+ value: [segment, ...this.path],
20
+ });
21
+ return clone;
22
+ }
23
+ }
24
+ export const string = {
25
+ decode(value) {
26
+ return typeof value === 'string'
27
+ ? ok(value)
28
+ : err(new DecodeFailure('Expected string.', { cause: value }));
29
+ },
30
+ };
31
+ export const number = {
32
+ decode(value) {
33
+ return typeof value === 'number'
34
+ ? ok(value)
35
+ : err(new DecodeFailure('Expected number.', { cause: value }));
36
+ },
37
+ };
38
+ export const boolean = {
39
+ decode(value) {
40
+ return typeof value === 'boolean'
41
+ ? ok(value)
42
+ : err(new DecodeFailure('Expected boolean.', { cause: value }));
43
+ },
44
+ };
45
+ export const bigint = {
46
+ decode(value) {
47
+ if (typeof value === 'bigint') {
48
+ return ok(value);
49
+ }
50
+ if (typeof value === 'number') {
51
+ return Number.isInteger(value) && Number.isSafeInteger(value)
52
+ ? ok(BigInt(value))
53
+ : err(new DecodeFailure('Expected bigint.', { cause: value }));
54
+ }
55
+ if (typeof value === 'string') {
56
+ try {
57
+ return ok(BigInt(value));
58
+ }
59
+ catch {
60
+ return err(new DecodeFailure('Expected bigint.', { cause: value }));
61
+ }
62
+ }
63
+ return err(new DecodeFailure('Expected bigint.', { cause: value }));
64
+ },
65
+ };
66
+ export function lazy(getDecoder) {
67
+ return {
68
+ decode(value) {
69
+ return getDecoder().decode(value);
70
+ },
71
+ };
72
+ }
73
+ export function optional(decoder) {
74
+ return {
75
+ __soundscriptOptional: true,
76
+ inner: decoder,
77
+ decode(value) {
78
+ return value === undefined ? ok(undefined) : decoder.decode(value);
79
+ },
80
+ };
81
+ }
82
+ export function literal(value) {
83
+ return {
84
+ decode(input) {
85
+ return Object.is(input, value)
86
+ ? ok(value)
87
+ : err(new DecodeFailure(`Expected literal ${JSON.stringify(value)}.`, { cause: input }));
88
+ },
89
+ };
90
+ }
91
+ export function array(item) {
92
+ return {
93
+ decode(value) {
94
+ if (!Array.isArray(value)) {
95
+ return err(new DecodeFailure('Expected array.', { cause: value }));
96
+ }
97
+ const decodedValues = [];
98
+ for (let index = 0; index < value.length; index += 1) {
99
+ const decoded = item.decode(value[index]);
100
+ if (isErr(decoded)) {
101
+ return err(prependPathIfPossible(decoded.error, index));
102
+ }
103
+ decodedValues.push(decoded.value);
104
+ }
105
+ return ok(decodedValues);
106
+ },
107
+ };
108
+ }
109
+ export function tuple(...elements) {
110
+ return {
111
+ decode(value) {
112
+ if (!Array.isArray(value)) {
113
+ return err(new DecodeFailure('Expected tuple.', { cause: value }));
114
+ }
115
+ if (value.length !== elements.length) {
116
+ return err(new DecodeFailure(`Expected tuple of length ${elements.length}.`, {
117
+ cause: value,
118
+ }));
119
+ }
120
+ const decodedValues = [];
121
+ for (let index = 0; index < elements.length; index += 1) {
122
+ const elementDecoder = elements[index];
123
+ if (!elementDecoder) {
124
+ continue;
125
+ }
126
+ const decoded = elementDecoder.decode(value[index]);
127
+ if (isErr(decoded)) {
128
+ return err(prependPathIfPossible(decoded.error, index));
129
+ }
130
+ decodedValues.push(decoded.value);
131
+ }
132
+ return ok(decodedValues);
133
+ },
134
+ };
135
+ }
136
+ export function option(item) {
137
+ return union(map(object({
138
+ tag: literal('some'),
139
+ value: item,
140
+ }), (value) => some(value.value)), map(object({
141
+ tag: literal('none'),
142
+ }), () => none()));
143
+ }
144
+ export function result(okDecoder, errDecoder) {
145
+ return union(map(object({
146
+ tag: literal('ok'),
147
+ value: okDecoder,
148
+ }), (value) => ok(value.value)), map(object({
149
+ tag: literal('err'),
150
+ error: errDecoder,
151
+ }), (value) => err(value.error)));
152
+ }
153
+ export function object(shape) {
154
+ return {
155
+ decode(value) {
156
+ if (!isPlainObject(value)) {
157
+ return err(new DecodeFailure('Expected object.', { cause: value }));
158
+ }
159
+ const record = value;
160
+ const decodedObject = {};
161
+ for (const key of Object.keys(shape)) {
162
+ const decoder = shape[key];
163
+ if (!decoder) {
164
+ continue;
165
+ }
166
+ const hasKey = key in record;
167
+ const rawValue = record[key];
168
+ if (!hasKey || rawValue === undefined) {
169
+ if (isOptionalDecoder(decoder)) {
170
+ decodedObject[key] = undefined;
171
+ continue;
172
+ }
173
+ return err(new DecodeFailure(`Missing field "${key}".`, {
174
+ cause: value,
175
+ path: [key],
176
+ }));
177
+ }
178
+ const decoded = decoder.decode(rawValue);
179
+ if (isErr(decoded)) {
180
+ return err(prependPathIfPossible(decoded.error, key));
181
+ }
182
+ decodedObject[key] = decoded.value;
183
+ }
184
+ return ok(decodedObject);
185
+ },
186
+ };
187
+ }
188
+ export function field(key, decoder) {
189
+ const shape = { [key]: decoder };
190
+ return map(object(shape), (value) => value[key]);
191
+ }
192
+ export function optionalField(key, decoder) {
193
+ const shape = { [key]: optional(decoder) };
194
+ return map(object(shape), (value) => value[key]);
195
+ }
196
+ export function union(left, right) {
197
+ return {
198
+ decode(value) {
199
+ const leftDecoded = left.decode(value);
200
+ if (isErr(leftDecoded)) {
201
+ const rightDecoded = right.decode(value);
202
+ if (isErr(rightDecoded)) {
203
+ return err(new DecodeFailure('Expected one of the union members.', {
204
+ cause: value,
205
+ }));
206
+ }
207
+ return rightDecoded;
208
+ }
209
+ return leftDecoded;
210
+ },
211
+ };
212
+ }
213
+ export function map(decoder, project) {
214
+ return {
215
+ decode(value) {
216
+ const decoded = decoder.decode(value);
217
+ return isErr(decoded) ? decoded : ok(project(decoded.value));
218
+ },
219
+ };
220
+ }
221
+ export function andThen(decoder, project) {
222
+ return {
223
+ decode(value) {
224
+ const decoded = decoder.decode(value);
225
+ return isErr(decoded) ? decoded : project(decoded.value).decode(valueOf(decoded));
226
+ },
227
+ };
228
+ }
229
+ export function refine(decoder, predicate, message) {
230
+ return {
231
+ decode(value) {
232
+ const decoded = decoder.decode(value);
233
+ if (isErr(decoded)) {
234
+ return decoded;
235
+ }
236
+ return predicate(decoded.value)
237
+ ? ok(decoded.value)
238
+ : err(new DecodeFailure(message, { cause: value }));
239
+ },
240
+ };
241
+ }
242
+ function prependPathIfPossible(error, segment) {
243
+ return error instanceof DecodeFailure ? error.at(segment) : error;
244
+ }
245
+ function isOptionalDecoder(value) {
246
+ return '__soundscriptOptional' in value &&
247
+ value.__soundscriptOptional === true;
248
+ }
249
+ function isPlainObject(value) {
250
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
251
+ }
252
+ function valueOf(decoded) {
253
+ return decoded.value;
254
+ }