@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,390 @@
1
+ import { type ErrorFrame, Failure } from 'sts:failures';
2
+ import { err, isErr, none, ok, some, type Option, type 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
+
10
+ constructor(
11
+ message = 'Failed to decode value.',
12
+ options: {
13
+ cause?: unknown;
14
+ path?: DecodePath;
15
+ trace?: readonly ErrorFrame[];
16
+ } = {},
17
+ ) {
18
+ super(message, {
19
+ ...(options.cause === undefined ? {} : { cause: options.cause }),
20
+ ...(options.trace === undefined ? {} : { trace: options.trace }),
21
+ });
22
+ this.path = options.path ?? [];
23
+ }
24
+
25
+ at(segment: DecodePathSegment): this {
26
+ const prototype = Object.getPrototypeOf(this as object);
27
+ const clone = (prototype === null ? Object.create(null) : Object.create(prototype)) as this;
28
+ Object.defineProperties(clone, Object.getOwnPropertyDescriptors(this));
29
+ Object.defineProperty(clone, 'path', {
30
+ configurable: true,
31
+ enumerable: true,
32
+ writable: false,
33
+ value: [segment, ...this.path],
34
+ });
35
+ return clone;
36
+ }
37
+ }
38
+
39
+ // #[variance(T: out, E: out)]
40
+ export type Decoder<T, E = DecodeFailure> = {
41
+ decode(value: unknown): Result<T, E>;
42
+ };
43
+
44
+ // #[variance(T: out, E: out)]
45
+ export type OptionalDecoder<T, E = DecodeFailure> = Decoder<T | undefined, E> & {
46
+ readonly __soundscriptOptional: true;
47
+ readonly inner: Decoder<T, E>;
48
+ };
49
+
50
+ type DecoderValue<TDecoder> = TDecoder extends Decoder<infer TValue, unknown> ? TValue : never;
51
+ type DecoderError<TDecoder> = TDecoder extends Decoder<unknown, infer E> ? E : never;
52
+
53
+ type ObjectShape = Record<string, Decoder<unknown, unknown>>;
54
+ type TupleShape = readonly Decoder<unknown, unknown>[];
55
+
56
+ export const string: Decoder<string> = {
57
+ decode(value): Result<string, DecodeFailure> {
58
+ return typeof value === 'string'
59
+ ? ok(value)
60
+ : err(new DecodeFailure('Expected string.', { cause: value }));
61
+ },
62
+ };
63
+
64
+ export const number: Decoder<number> = {
65
+ decode(value): Result<number, DecodeFailure> {
66
+ return typeof value === 'number'
67
+ ? ok(value)
68
+ : err(new DecodeFailure('Expected number.', { cause: value }));
69
+ },
70
+ };
71
+
72
+ export const boolean: Decoder<boolean> = {
73
+ decode(value): Result<boolean, DecodeFailure> {
74
+ return typeof value === 'boolean'
75
+ ? ok(value)
76
+ : err(new DecodeFailure('Expected boolean.', { cause: value }));
77
+ },
78
+ };
79
+
80
+ export const bigint: Decoder<bigint> = {
81
+ decode(value): Result<bigint, DecodeFailure> {
82
+ if (typeof value === 'bigint') {
83
+ return ok(value);
84
+ }
85
+
86
+ if (typeof value === 'number') {
87
+ return Number.isInteger(value) && Number.isSafeInteger(value)
88
+ ? ok(BigInt(value))
89
+ : err(new DecodeFailure('Expected bigint.', { cause: value }));
90
+ }
91
+
92
+ if (typeof value === 'string') {
93
+ try {
94
+ return ok(BigInt(value));
95
+ } catch {
96
+ return err(new DecodeFailure('Expected bigint.', { cause: value }));
97
+ }
98
+ }
99
+
100
+ return err(new DecodeFailure('Expected bigint.', { cause: value }));
101
+ },
102
+ };
103
+
104
+ export function lazy<T, E>(getDecoder: () => Decoder<T, E>): Decoder<T, E> {
105
+ return {
106
+ decode(value) {
107
+ return getDecoder().decode(value);
108
+ },
109
+ };
110
+ }
111
+
112
+ export function optional<T, E>(decoder: Decoder<T, E>): OptionalDecoder<T, E> {
113
+ return {
114
+ __soundscriptOptional: true,
115
+ inner: decoder,
116
+ decode(value) {
117
+ return value === undefined ? ok(undefined) : decoder.decode(value);
118
+ },
119
+ };
120
+ }
121
+
122
+ export function literal<const T extends string | number | boolean | null>(value: T): Decoder<T> {
123
+ return {
124
+ decode(input) {
125
+ return Object.is(input, value)
126
+ ? ok(value)
127
+ : err(new DecodeFailure(`Expected literal ${JSON.stringify(value)}.`, { cause: input }));
128
+ },
129
+ };
130
+ }
131
+
132
+ export function array<T, E>(item: Decoder<T, E>): Decoder<readonly T[], E | DecodeFailure> {
133
+ return {
134
+ decode(value) {
135
+ if (!Array.isArray(value)) {
136
+ return err(new DecodeFailure('Expected array.', { cause: value }));
137
+ }
138
+
139
+ const decodedValues: T[] = [];
140
+ for (let index = 0; index < value.length; index += 1) {
141
+ const decoded = item.decode(value[index]);
142
+ if (isErr(decoded)) {
143
+ return err(prependPathIfPossible(decoded.error, index));
144
+ }
145
+ decodedValues.push(decoded.value);
146
+ }
147
+
148
+ return ok(decodedValues);
149
+ },
150
+ };
151
+ }
152
+
153
+ export function tuple<const TElements extends TupleShape>(
154
+ ...elements: TElements
155
+ ): Decoder<
156
+ { readonly [K in keyof TElements]: DecoderValue<TElements[K]> },
157
+ DecoderError<TElements[number]> | DecodeFailure
158
+ > {
159
+ return {
160
+ decode(value) {
161
+ if (!Array.isArray(value)) {
162
+ return err(new DecodeFailure('Expected tuple.', { cause: value }));
163
+ }
164
+
165
+ if (value.length !== elements.length) {
166
+ return err(
167
+ new DecodeFailure(`Expected tuple of length ${elements.length}.`, {
168
+ cause: value,
169
+ }),
170
+ );
171
+ }
172
+
173
+ const decodedValues: unknown[] = [];
174
+ for (let index = 0; index < elements.length; index += 1) {
175
+ const elementDecoder = elements[index];
176
+ if (!elementDecoder) {
177
+ continue;
178
+ }
179
+ const decoded = elementDecoder.decode(value[index]);
180
+ if (isErr(decoded)) {
181
+ return err(
182
+ prependPathIfPossible(decoded.error, index) as
183
+ | DecoderError<TElements[number]>
184
+ | DecodeFailure,
185
+ );
186
+ }
187
+ decodedValues.push(decoded.value);
188
+ }
189
+
190
+ return ok(decodedValues as { readonly [K in keyof TElements]: DecoderValue<TElements[K]> });
191
+ },
192
+ };
193
+ }
194
+
195
+ export function option<T, E>(item: Decoder<T, E>): Decoder<Option<T>, E | DecodeFailure> {
196
+ return union(
197
+ map(
198
+ object({
199
+ tag: literal('some'),
200
+ value: item,
201
+ }),
202
+ (value) => some(value.value) as Option<T>,
203
+ ),
204
+ map(
205
+ object({
206
+ tag: literal('none'),
207
+ }),
208
+ () => none() as Option<T>,
209
+ ),
210
+ );
211
+ }
212
+
213
+ export function result<T, EValue, EDecodeValue, EDecodeError>(
214
+ okDecoder: Decoder<T, EDecodeValue>,
215
+ errDecoder: Decoder<EValue, EDecodeError>,
216
+ ): Decoder<Result<T, EValue>, EDecodeValue | EDecodeError | DecodeFailure> {
217
+ return union(
218
+ map(
219
+ object({
220
+ tag: literal('ok'),
221
+ value: okDecoder,
222
+ }),
223
+ (value) => ok(value.value) as Result<T, EValue>,
224
+ ),
225
+ map(
226
+ object({
227
+ tag: literal('err'),
228
+ error: errDecoder,
229
+ }),
230
+ (value) => err(value.error) as Result<T, EValue>,
231
+ ),
232
+ );
233
+ }
234
+
235
+ export function object<TShape extends ObjectShape>(
236
+ shape: TShape,
237
+ ): Decoder<
238
+ { readonly [K in keyof TShape]: DecoderValue<TShape[K]> },
239
+ DecoderError<TShape[keyof TShape]> | DecodeFailure
240
+ > {
241
+ return {
242
+ decode(value) {
243
+ if (!isPlainObject(value)) {
244
+ return err(new DecodeFailure('Expected object.', { cause: value }));
245
+ }
246
+
247
+ const record = value as Record<string, unknown>;
248
+ const decodedObject: Record<string, unknown> = {};
249
+
250
+ for (const key of Object.keys(shape)) {
251
+ const decoder = shape[key];
252
+ if (!decoder) {
253
+ continue;
254
+ }
255
+ const hasKey = key in record;
256
+ const rawValue = record[key];
257
+
258
+ if (!hasKey || rawValue === undefined) {
259
+ if (isOptionalDecoder(decoder)) {
260
+ decodedObject[key] = undefined;
261
+ continue;
262
+ }
263
+
264
+ return err(
265
+ new DecodeFailure(`Missing field "${key}".`, {
266
+ cause: value,
267
+ path: [key],
268
+ }),
269
+ );
270
+ }
271
+
272
+ const decoded = decoder.decode(rawValue);
273
+ if (isErr(decoded)) {
274
+ return err(
275
+ prependPathIfPossible(decoded.error, key) as
276
+ | DecoderError<TShape[keyof TShape]>
277
+ | DecodeFailure,
278
+ );
279
+ }
280
+
281
+ decodedObject[key] = decoded.value;
282
+ }
283
+
284
+ return ok(decodedObject as { readonly [K in keyof TShape]: DecoderValue<TShape[K]> });
285
+ },
286
+ };
287
+ }
288
+
289
+ export function field<K extends string, T, E>(
290
+ key: K,
291
+ decoder: Decoder<T, E>,
292
+ ): Decoder<T, E | DecodeFailure> {
293
+ const shape = { [key]: decoder } as { readonly [P in K]: Decoder<T, E> };
294
+ return map(object(shape), (value) => value[key]);
295
+ }
296
+
297
+ export function optionalField<K extends string, T, E>(
298
+ key: K,
299
+ decoder: Decoder<T, E>,
300
+ ): Decoder<T | undefined, E | DecodeFailure> {
301
+ const shape = { [key]: optional(decoder) } as {
302
+ readonly [P in K]: OptionalDecoder<T, E>;
303
+ };
304
+ return map(object(shape), (value) => value[key]);
305
+ }
306
+
307
+ export function union<A, B, ELeft, ERight>(
308
+ left: Decoder<A, ELeft>,
309
+ right: Decoder<B, ERight>,
310
+ ): Decoder<A | B, ELeft | ERight | DecodeFailure> {
311
+ return {
312
+ decode(value) {
313
+ const leftDecoded = left.decode(value);
314
+ if (isErr(leftDecoded)) {
315
+ const rightDecoded = right.decode(value);
316
+ if (isErr(rightDecoded)) {
317
+ return err(
318
+ new DecodeFailure('Expected one of the union members.', {
319
+ cause: value,
320
+ }),
321
+ );
322
+ }
323
+ return rightDecoded;
324
+ }
325
+ return leftDecoded;
326
+ },
327
+ };
328
+ }
329
+
330
+ export function map<A, B, E>(
331
+ decoder: Decoder<A, E>,
332
+ project: (value: A) => B,
333
+ ): Decoder<B, E> {
334
+ return {
335
+ decode(value) {
336
+ const decoded = decoder.decode(value);
337
+ return isErr(decoded) ? decoded : ok(project(decoded.value));
338
+ },
339
+ };
340
+ }
341
+
342
+ export function andThen<A, B, E>(
343
+ decoder: Decoder<A, E>,
344
+ project: (value: A) => Decoder<B, E>,
345
+ ): Decoder<B, E> {
346
+ return {
347
+ decode(value) {
348
+ const decoded = decoder.decode(value);
349
+ return isErr(decoded) ? decoded : project(decoded.value).decode(valueOf(decoded));
350
+ },
351
+ };
352
+ }
353
+
354
+ export function refine<A, B extends A, E>(
355
+ decoder: Decoder<A, E>,
356
+ predicate: (value: A) => value is B,
357
+ message: string,
358
+ ): Decoder<B, E | DecodeFailure> {
359
+ return {
360
+ decode(value) {
361
+ const decoded = decoder.decode(value);
362
+ if (isErr(decoded)) {
363
+ return decoded;
364
+ }
365
+
366
+ return predicate(decoded.value)
367
+ ? ok(decoded.value)
368
+ : err(new DecodeFailure(message, { cause: value }));
369
+ },
370
+ };
371
+ }
372
+
373
+ function prependPathIfPossible<E>(error: E, segment: DecodePathSegment): E | DecodeFailure {
374
+ return error instanceof DecodeFailure ? error.at(segment) : error;
375
+ }
376
+
377
+ function isOptionalDecoder(
378
+ value: Decoder<unknown, unknown>,
379
+ ): value is OptionalDecoder<unknown, unknown> {
380
+ return '__soundscriptOptional' in value &&
381
+ value.__soundscriptOptional === true;
382
+ }
383
+
384
+ function isPlainObject(value: unknown): value is Record<string, unknown> {
385
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
386
+ }
387
+
388
+ function valueOf<T>(decoded: { readonly value: T }): T {
389
+ return decoded.value;
390
+ }
@@ -0,0 +1,6 @@
1
+ export const eq: unknown;
2
+ export const hash: unknown;
3
+ export const decode: unknown;
4
+ export const encode: unknown;
5
+ export const codec: unknown;
6
+ export const tagged: unknown;
@@ -0,0 +1,7 @@
1
+ // Macro binding placeholders. The compiler-owned macro pipeline consumes these symbols.
2
+ export const eq = undefined;
3
+ export const hash = undefined;
4
+ export const decode = undefined;
5
+ export const encode = undefined;
6
+ export const codec = undefined;
7
+ export const tagged = undefined;
@@ -0,0 +1,7 @@
1
+ // Macro binding placeholders. The compiler-owned macro pipeline consumes these symbols.
2
+ export const eq: unknown = undefined;
3
+ export const hash: unknown = undefined;
4
+ export const decode: unknown = undefined;
5
+ export const encode: unknown = undefined;
6
+ export const codec: unknown = undefined;
7
+ export const tagged: unknown = undefined;
@@ -0,0 +1,100 @@
1
+ import type { Bind, Kind3, TypeLambda } from 'sts:hkt';
2
+ import { Failure } from 'sts:failures';
3
+ import type { Option, Result } from 'sts:result';
4
+ import type { Contravariant } from 'sts:typeclasses';
5
+
6
+ export class EncodeFailure extends Failure {
7
+ constructor(message?: string, cause?: unknown);
8
+ }
9
+
10
+ // #[variance(T: in, TEncoded: out, E: out)]
11
+ export type Encoder<T, TEncoded = unknown, E = EncodeFailure> = {
12
+ encode(value: T): Result<TEncoded, E>;
13
+ };
14
+
15
+ // #[variance(T: in, TEncoded: out, E: out)]
16
+ export type OptionalEncoder<T, TEncoded = T, E = EncodeFailure> =
17
+ Encoder<T | undefined, TEncoded | undefined, E> & {
18
+ readonly __soundscriptOptional: true;
19
+ readonly inner: Encoder<T, TEncoded, E>;
20
+ };
21
+
22
+ type EncoderInput<TEncoder> = TEncoder extends Encoder<infer TValue, unknown, unknown> ? TValue
23
+ : never;
24
+ type EncoderOutput<TEncoder> = TEncoder extends Encoder<unknown, infer TEncoded, unknown>
25
+ ? TEncoded
26
+ : never;
27
+ type EncoderError<TEncoder> = TEncoder extends Encoder<unknown, unknown, infer E> ? E : never;
28
+ type ObjectShape = Record<string, Encoder<unknown, unknown, unknown>>;
29
+ type TupleShape = readonly Encoder<unknown, unknown, unknown>[];
30
+
31
+ export interface EncoderF extends TypeLambda {
32
+ readonly type: Encoder<this['Args'][2], this['Args'][1], this['Args'][0]>;
33
+ }
34
+
35
+ export type EncoderKind<E, TEncoded, T> = Kind3<EncoderF, E, TEncoded, T>;
36
+
37
+ export function fromEncode<T, TEncoded, E>(
38
+ encode: (value: T) => Result<TEncoded, E>,
39
+ ): Encoder<T, TEncoded, E>;
40
+ export function contramap<A, B, TEncoded, E>(
41
+ encoder: Encoder<A, TEncoded, E>,
42
+ project: (value: B) => A,
43
+ ): Encoder<B, TEncoded, E>;
44
+ export function encoderContravariant<TEncoded, E = EncodeFailure>(): Contravariant<
45
+ Bind<Bind<EncoderF, [E]>, [TEncoded]>
46
+ >;
47
+
48
+ export const stringEncoder: Encoder<string, string>;
49
+ export const numberEncoder: Encoder<number, number>;
50
+ export const booleanEncoder: Encoder<boolean, boolean>;
51
+ export const bigintEncoder: Encoder<bigint, bigint>;
52
+
53
+ export function optional<T, TEncoded, E>(
54
+ encoder: Encoder<T, TEncoded, E>,
55
+ ): OptionalEncoder<T, TEncoded, E>;
56
+ export function lazy<T, TEncoded, E>(
57
+ getEncoder: () => Encoder<T, TEncoded, E>,
58
+ ): Encoder<T, TEncoded, E>;
59
+ export function nullable<T, TEncoded, E>(
60
+ encoder: Encoder<T, TEncoded, E>,
61
+ ): Encoder<T | null, TEncoded | null, E>;
62
+ export function literal<const T extends string | number | boolean | null>(value: T): Encoder<T, T>;
63
+ export function array<T, TEncoded, E>(
64
+ item: Encoder<T, TEncoded, E>,
65
+ ): Encoder<readonly T[], readonly TEncoded[], E | EncodeFailure>;
66
+ export function tuple<const TElements extends TupleShape>(
67
+ ...elements: TElements
68
+ ): Encoder<
69
+ { readonly [K in keyof TElements]: EncoderInput<TElements[K]> },
70
+ { readonly [K in keyof TElements]: EncoderOutput<TElements[K]> },
71
+ EncoderError<TElements[number]>
72
+ >;
73
+ export function option<T, TEncoded, E>(
74
+ item: Encoder<T, TEncoded, E>,
75
+ ): Encoder<
76
+ Option<T>,
77
+ { readonly tag: 'none' } | {
78
+ readonly tag: 'some';
79
+ readonly value: TEncoded;
80
+ },
81
+ E
82
+ >;
83
+ export function result<T, EValue, TEncoded, EEncoded, EOk, EErr>(
84
+ okEncoder: Encoder<T, TEncoded, EOk>,
85
+ errEncoder: Encoder<EValue, EEncoded, EErr>,
86
+ ): Encoder<
87
+ Result<T, EValue>,
88
+ { readonly tag: 'ok'; readonly value: TEncoded } | {
89
+ readonly error: EEncoded;
90
+ readonly tag: 'err';
91
+ },
92
+ EOk | EErr
93
+ >;
94
+ export function object<TShape extends ObjectShape>(
95
+ shape: TShape,
96
+ ): Encoder<
97
+ { readonly [K in keyof TShape]: EncoderInput<TShape[K]> },
98
+ { readonly [K in keyof TShape]: EncoderOutput<TShape[K]> },
99
+ EncoderError<TShape[keyof TShape]> | EncodeFailure
100
+ >;
@@ -0,0 +1,130 @@
1
+ import { Failure } from '@soundscript/soundscript/failures';
2
+ import { err, isErr, isOk, isSome, ok } from '@soundscript/soundscript/result';
3
+ export class EncodeFailure extends Failure {
4
+ constructor(message = 'Failed to encode value.', cause) {
5
+ super(message, { cause });
6
+ }
7
+ }
8
+ export function fromEncode(encode) {
9
+ return {
10
+ encode,
11
+ };
12
+ }
13
+ export function contramap(encoder, project) {
14
+ return fromEncode((value) => encoder.encode(project(value)));
15
+ }
16
+ export function encoderContravariant() {
17
+ return {
18
+ contramap,
19
+ };
20
+ }
21
+ export const stringEncoder = fromEncode((value) => ok(value));
22
+ export const numberEncoder = fromEncode((value) => ok(value));
23
+ export const booleanEncoder = fromEncode((value) => ok(value));
24
+ export const bigintEncoder = fromEncode((value) => ok(value));
25
+ export function optional(encoder) {
26
+ return {
27
+ __soundscriptOptional: true,
28
+ inner: encoder,
29
+ encode(value) {
30
+ return value === undefined ? ok(undefined) : encoder.encode(value);
31
+ },
32
+ };
33
+ }
34
+ export function lazy(getEncoder) {
35
+ return fromEncode((value) => getEncoder().encode(value));
36
+ }
37
+ export function nullable(encoder) {
38
+ return fromEncode((value) => value === null ? ok(null) : encoder.encode(value));
39
+ }
40
+ export function literal(value) {
41
+ return fromEncode((input) => Object.is(input, value)
42
+ ? ok(value)
43
+ : err(new EncodeFailure(`Expected literal ${JSON.stringify(value)}.`, input)));
44
+ }
45
+ export function array(item) {
46
+ return fromEncode((value) => {
47
+ const encodedValues = [];
48
+ for (const entry of value) {
49
+ const encoded = item.encode(entry);
50
+ if (isErr(encoded)) {
51
+ return encoded;
52
+ }
53
+ encodedValues.push(encoded.value);
54
+ }
55
+ return ok(encodedValues);
56
+ });
57
+ }
58
+ export function tuple(...elements) {
59
+ return fromEncode((value) => {
60
+ const values = value;
61
+ const encodedValues = [];
62
+ for (let index = 0; index < elements.length; index += 1) {
63
+ const elementEncoder = elements[index];
64
+ if (!elementEncoder) {
65
+ continue;
66
+ }
67
+ const encoded = elementEncoder.encode(values[index]);
68
+ if (isErr(encoded)) {
69
+ return encoded;
70
+ }
71
+ encodedValues.push(encoded.value);
72
+ }
73
+ return ok(encodedValues);
74
+ });
75
+ }
76
+ export function option(item) {
77
+ return fromEncode((value) => {
78
+ if (isSome(value)) {
79
+ const encoded = item.encode(value.value);
80
+ return isErr(encoded) ? encoded : ok({ tag: 'some', value: encoded.value });
81
+ }
82
+ return ok({ tag: 'none' });
83
+ });
84
+ }
85
+ export function result(okEncoder, errEncoder) {
86
+ return fromEncode((value) => {
87
+ if (isOk(value)) {
88
+ const encoded = okEncoder.encode(value.value);
89
+ return isErr(encoded) ? encoded : ok({ tag: 'ok', value: encoded.value });
90
+ }
91
+ const encoded = errEncoder.encode(value.error);
92
+ return isErr(encoded) ? encoded : ok({ tag: 'err', error: encoded.value });
93
+ });
94
+ }
95
+ export function object(shape) {
96
+ return fromEncode((value) => {
97
+ if (!isPlainObject(value)) {
98
+ return err(new EncodeFailure('Expected object.', value));
99
+ }
100
+ const record = value;
101
+ const encodedObject = {};
102
+ for (const key of Object.keys(shape)) {
103
+ const encoder = shape[key];
104
+ if (!encoder) {
105
+ continue;
106
+ }
107
+ const hasKey = key in record;
108
+ const rawValue = record[key];
109
+ if (!hasKey || rawValue === undefined) {
110
+ if (isOptionalEncoder(encoder)) {
111
+ encodedObject[key] = undefined;
112
+ continue;
113
+ }
114
+ return err(new EncodeFailure(`Missing field "${key}".`, value));
115
+ }
116
+ const encoded = encoder.encode(rawValue);
117
+ if (isErr(encoded)) {
118
+ return encoded;
119
+ }
120
+ encodedObject[key] = encoded.value;
121
+ }
122
+ return ok(encodedObject);
123
+ });
124
+ }
125
+ function isOptionalEncoder(value) {
126
+ return '__soundscriptOptional' in value && value.__soundscriptOptional === true;
127
+ }
128
+ function isPlainObject(value) {
129
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
130
+ }