skill-universe 1.1.0

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 (334) hide show
  1. package/README.md +24 -0
  2. package/bin/skillc.mjs +3 -0
  3. package/build/dev/javascript/argv/_gleam_artefacts/argv.cache +0 -0
  4. package/build/dev/javascript/argv/_gleam_artefacts/argv.cache_inline +0 -0
  5. package/build/dev/javascript/argv/_gleam_artefacts/argv.cache_meta +0 -0
  6. package/build/dev/javascript/argv/argv.erl +12 -0
  7. package/build/dev/javascript/argv/argv.mjs +31 -0
  8. package/build/dev/javascript/argv/argv_ffi.erl +27 -0
  9. package/build/dev/javascript/argv/argv_ffi.mjs +20 -0
  10. package/build/dev/javascript/argv/gleam.mjs +1 -0
  11. package/build/dev/javascript/filepath/_gleam_artefacts/filepath.cache +0 -0
  12. package/build/dev/javascript/filepath/_gleam_artefacts/filepath.cache_inline +0 -0
  13. package/build/dev/javascript/filepath/_gleam_artefacts/filepath.cache_meta +0 -0
  14. package/build/dev/javascript/filepath/filepath.erl +425 -0
  15. package/build/dev/javascript/filepath/filepath.mjs +529 -0
  16. package/build/dev/javascript/filepath/filepath_ffi.erl +9 -0
  17. package/build/dev/javascript/filepath/filepath_ffi.mjs +6 -0
  18. package/build/dev/javascript/filepath/gleam.mjs +1 -0
  19. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bit_array.cache +0 -0
  20. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bit_array.cache_inline +0 -0
  21. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bit_array.cache_meta +0 -0
  22. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bool.cache +0 -0
  23. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bool.cache_inline +0 -0
  24. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bool.cache_meta +0 -0
  25. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bytes_tree.cache +0 -0
  26. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bytes_tree.cache_inline +0 -0
  27. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bytes_tree.cache_meta +0 -0
  28. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dict.cache +0 -0
  29. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dict.cache_inline +0 -0
  30. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dict.cache_meta +0 -0
  31. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic.cache +0 -0
  32. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic.cache_inline +0 -0
  33. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic.cache_meta +0 -0
  34. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic@decode.cache +0 -0
  35. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic@decode.cache_inline +0 -0
  36. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic@decode.cache_meta +0 -0
  37. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@float.cache +0 -0
  38. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@float.cache_inline +0 -0
  39. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@float.cache_meta +0 -0
  40. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@function.cache +0 -0
  41. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@function.cache_inline +0 -0
  42. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@function.cache_meta +0 -0
  43. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@int.cache +0 -0
  44. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@int.cache_inline +0 -0
  45. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@int.cache_meta +0 -0
  46. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@io.cache +0 -0
  47. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@io.cache_inline +0 -0
  48. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@io.cache_meta +0 -0
  49. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@list.cache +0 -0
  50. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@list.cache_inline +0 -0
  51. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@list.cache_meta +0 -0
  52. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@option.cache +0 -0
  53. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@option.cache_inline +0 -0
  54. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@option.cache_meta +0 -0
  55. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@order.cache +0 -0
  56. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@order.cache_inline +0 -0
  57. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@order.cache_meta +0 -0
  58. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@pair.cache +0 -0
  59. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@pair.cache_inline +0 -0
  60. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@pair.cache_meta +0 -0
  61. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@result.cache +0 -0
  62. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@result.cache_inline +0 -0
  63. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@result.cache_meta +0 -0
  64. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@set.cache +0 -0
  65. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@set.cache_inline +0 -0
  66. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@set.cache_meta +0 -0
  67. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string.cache +0 -0
  68. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string.cache_inline +0 -0
  69. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string.cache_meta +0 -0
  70. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string_tree.cache +0 -0
  71. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string_tree.cache_inline +0 -0
  72. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string_tree.cache_meta +0 -0
  73. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@uri.cache +0 -0
  74. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@uri.cache_inline +0 -0
  75. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@uri.cache_meta +0 -0
  76. package/build/dev/javascript/gleam_stdlib/dict.mjs +710 -0
  77. package/build/dev/javascript/gleam_stdlib/gleam/bit_array.mjs +285 -0
  78. package/build/dev/javascript/gleam_stdlib/gleam/bool.mjs +313 -0
  79. package/build/dev/javascript/gleam_stdlib/gleam/bytes_tree.mjs +225 -0
  80. package/build/dev/javascript/gleam_stdlib/gleam/dict.mjs +456 -0
  81. package/build/dev/javascript/gleam_stdlib/gleam/dynamic/decode.mjs +985 -0
  82. package/build/dev/javascript/gleam_stdlib/gleam/dynamic.mjs +35 -0
  83. package/build/dev/javascript/gleam_stdlib/gleam/float.mjs +572 -0
  84. package/build/dev/javascript/gleam_stdlib/gleam/function.mjs +6 -0
  85. package/build/dev/javascript/gleam_stdlib/gleam/int.mjs +832 -0
  86. package/build/dev/javascript/gleam_stdlib/gleam/io.mjs +8 -0
  87. package/build/dev/javascript/gleam_stdlib/gleam/list.mjs +3160 -0
  88. package/build/dev/javascript/gleam_stdlib/gleam/option.mjs +418 -0
  89. package/build/dev/javascript/gleam_stdlib/gleam/order.mjs +178 -0
  90. package/build/dev/javascript/gleam_stdlib/gleam/pair.mjs +102 -0
  91. package/build/dev/javascript/gleam_stdlib/gleam/result.mjs +480 -0
  92. package/build/dev/javascript/gleam_stdlib/gleam/set.mjs +416 -0
  93. package/build/dev/javascript/gleam_stdlib/gleam/string.mjs +723 -0
  94. package/build/dev/javascript/gleam_stdlib/gleam/string_tree.mjs +133 -0
  95. package/build/dev/javascript/gleam_stdlib/gleam/uri.mjs +1155 -0
  96. package/build/dev/javascript/gleam_stdlib/gleam.mjs +1 -0
  97. package/build/dev/javascript/gleam_stdlib/gleam@bit_array.erl +347 -0
  98. package/build/dev/javascript/gleam_stdlib/gleam@bool.erl +352 -0
  99. package/build/dev/javascript/gleam_stdlib/gleam@bytes_tree.erl +211 -0
  100. package/build/dev/javascript/gleam_stdlib/gleam@dict.erl +521 -0
  101. package/build/dev/javascript/gleam_stdlib/gleam@dynamic.erl +106 -0
  102. package/build/dev/javascript/gleam_stdlib/gleam@dynamic@decode.erl +1112 -0
  103. package/build/dev/javascript/gleam_stdlib/gleam@float.erl +764 -0
  104. package/build/dev/javascript/gleam_stdlib/gleam@function.erl +18 -0
  105. package/build/dev/javascript/gleam_stdlib/gleam@int.erl +1004 -0
  106. package/build/dev/javascript/gleam_stdlib/gleam@io.erl +80 -0
  107. package/build/dev/javascript/gleam_stdlib/gleam@list.erl +2832 -0
  108. package/build/dev/javascript/gleam_stdlib/gleam@option.erl +413 -0
  109. package/build/dev/javascript/gleam_stdlib/gleam@order.erl +200 -0
  110. package/build/dev/javascript/gleam_stdlib/gleam@pair.erl +110 -0
  111. package/build/dev/javascript/gleam_stdlib/gleam@result.erl +532 -0
  112. package/build/dev/javascript/gleam_stdlib/gleam@set.erl +433 -0
  113. package/build/dev/javascript/gleam_stdlib/gleam@string.erl +1012 -0
  114. package/build/dev/javascript/gleam_stdlib/gleam@string_tree.erl +207 -0
  115. package/build/dev/javascript/gleam_stdlib/gleam@uri.erl +1049 -0
  116. package/build/dev/javascript/gleam_stdlib/gleam_stdlib.erl +529 -0
  117. package/build/dev/javascript/gleam_stdlib/gleam_stdlib.mjs +1050 -0
  118. package/build/dev/javascript/gleam_version +1 -0
  119. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit.cache +0 -0
  120. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit.cache_inline +0 -0
  121. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit.cache_meta +0 -0
  122. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@internal@gleam_panic.cache +0 -0
  123. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@internal@gleam_panic.cache_inline +0 -0
  124. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@internal@gleam_panic.cache_meta +0 -0
  125. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@internal@reporting.cache +0 -0
  126. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@internal@reporting.cache_inline +0 -0
  127. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@internal@reporting.cache_meta +0 -0
  128. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@should.cache +0 -0
  129. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@should.cache_inline +0 -0
  130. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@should.cache_meta +0 -0
  131. package/build/dev/javascript/gleeunit/gleam.mjs +1 -0
  132. package/build/dev/javascript/gleeunit/gleeunit/internal/gleam_panic.mjs +180 -0
  133. package/build/dev/javascript/gleeunit/gleeunit/internal/gleeunit_gleam_panic_ffi.erl +49 -0
  134. package/build/dev/javascript/gleeunit/gleeunit/internal/gleeunit_gleam_panic_ffi.mjs +91 -0
  135. package/build/dev/javascript/gleeunit/gleeunit/internal/reporting.mjs +256 -0
  136. package/build/dev/javascript/gleeunit/gleeunit/should.mjs +135 -0
  137. package/build/dev/javascript/gleeunit/gleeunit.erl +89 -0
  138. package/build/dev/javascript/gleeunit/gleeunit.mjs +62 -0
  139. package/build/dev/javascript/gleeunit/gleeunit@internal@gleam_panic.erl +56 -0
  140. package/build/dev/javascript/gleeunit/gleeunit@internal@reporting.erl +343 -0
  141. package/build/dev/javascript/gleeunit/gleeunit@should.erl +153 -0
  142. package/build/dev/javascript/gleeunit/gleeunit_ffi.erl +21 -0
  143. package/build/dev/javascript/gleeunit/gleeunit_ffi.mjs +100 -0
  144. package/build/dev/javascript/gleeunit/gleeunit_progress.erl +72 -0
  145. package/build/dev/javascript/prelude.mjs +1575 -0
  146. package/build/dev/javascript/simplifile/_gleam_artefacts/simplifile.cache +0 -0
  147. package/build/dev/javascript/simplifile/_gleam_artefacts/simplifile.cache_inline +0 -0
  148. package/build/dev/javascript/simplifile/_gleam_artefacts/simplifile.cache_meta +0 -0
  149. package/build/dev/javascript/simplifile/gleam.mjs +1 -0
  150. package/build/dev/javascript/simplifile/simplifile.erl +893 -0
  151. package/build/dev/javascript/simplifile/simplifile.mjs +893 -0
  152. package/build/dev/javascript/simplifile/simplifile_erl.erl +244 -0
  153. package/build/dev/javascript/simplifile/simplifile_js.mjs +400 -0
  154. package/build/dev/javascript/skillc/_gleam_artefacts/cli_test.cache +0 -0
  155. package/build/dev/javascript/skillc/_gleam_artefacts/cli_test.cache_inline +0 -0
  156. package/build/dev/javascript/skillc/_gleam_artefacts/cli_test.cache_meta +0 -0
  157. package/build/dev/javascript/skillc/_gleam_artefacts/cli_test.cache_warnings +0 -0
  158. package/build/dev/javascript/skillc/_gleam_artefacts/compiler_test.cache +0 -0
  159. package/build/dev/javascript/skillc/_gleam_artefacts/compiler_test.cache_inline +0 -0
  160. package/build/dev/javascript/skillc/_gleam_artefacts/compiler_test.cache_meta +0 -0
  161. package/build/dev/javascript/skillc/_gleam_artefacts/compiler_test.cache_warnings +0 -0
  162. package/build/dev/javascript/skillc/_gleam_artefacts/config_test.cache +0 -0
  163. package/build/dev/javascript/skillc/_gleam_artefacts/config_test.cache_inline +0 -0
  164. package/build/dev/javascript/skillc/_gleam_artefacts/config_test.cache_meta +0 -0
  165. package/build/dev/javascript/skillc/_gleam_artefacts/config_test.cache_warnings +0 -0
  166. package/build/dev/javascript/skillc/_gleam_artefacts/importer_test.cache +0 -0
  167. package/build/dev/javascript/skillc/_gleam_artefacts/importer_test.cache_inline +0 -0
  168. package/build/dev/javascript/skillc/_gleam_artefacts/importer_test.cache_meta +0 -0
  169. package/build/dev/javascript/skillc/_gleam_artefacts/importer_test.cache_warnings +0 -0
  170. package/build/dev/javascript/skillc/_gleam_artefacts/parser_test.cache +0 -0
  171. package/build/dev/javascript/skillc/_gleam_artefacts/parser_test.cache_inline +0 -0
  172. package/build/dev/javascript/skillc/_gleam_artefacts/parser_test.cache_meta +0 -0
  173. package/build/dev/javascript/skillc/_gleam_artefacts/parser_test.cache_warnings +0 -0
  174. package/build/dev/javascript/skillc/_gleam_artefacts/path_test.cache +0 -0
  175. package/build/dev/javascript/skillc/_gleam_artefacts/path_test.cache_inline +0 -0
  176. package/build/dev/javascript/skillc/_gleam_artefacts/path_test.cache_meta +0 -0
  177. package/build/dev/javascript/skillc/_gleam_artefacts/path_test.cache_warnings +0 -0
  178. package/build/dev/javascript/skillc/_gleam_artefacts/provider_test.cache +0 -0
  179. package/build/dev/javascript/skillc/_gleam_artefacts/provider_test.cache_inline +0 -0
  180. package/build/dev/javascript/skillc/_gleam_artefacts/provider_test.cache_meta +0 -0
  181. package/build/dev/javascript/skillc/_gleam_artefacts/provider_test.cache_warnings +0 -0
  182. package/build/dev/javascript/skillc/_gleam_artefacts/registry_test.cache +0 -0
  183. package/build/dev/javascript/skillc/_gleam_artefacts/registry_test.cache_inline +0 -0
  184. package/build/dev/javascript/skillc/_gleam_artefacts/registry_test.cache_meta +0 -0
  185. package/build/dev/javascript/skillc/_gleam_artefacts/registry_test.cache_warnings +0 -0
  186. package/build/dev/javascript/skillc/_gleam_artefacts/scaffold_test.cache +0 -0
  187. package/build/dev/javascript/skillc/_gleam_artefacts/scaffold_test.cache_inline +0 -0
  188. package/build/dev/javascript/skillc/_gleam_artefacts/scaffold_test.cache_meta +0 -0
  189. package/build/dev/javascript/skillc/_gleam_artefacts/scaffold_test.cache_warnings +0 -0
  190. package/build/dev/javascript/skillc/_gleam_artefacts/skillc.cache +0 -0
  191. package/build/dev/javascript/skillc/_gleam_artefacts/skillc.cache_inline +0 -0
  192. package/build/dev/javascript/skillc/_gleam_artefacts/skillc.cache_meta +0 -0
  193. package/build/dev/javascript/skillc/_gleam_artefacts/skillc.cache_warnings +0 -0
  194. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@compiler.cache +0 -0
  195. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@compiler.cache_inline +0 -0
  196. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@compiler.cache_meta +0 -0
  197. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@compiler.cache_warnings +0 -0
  198. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@config.cache +0 -0
  199. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@config.cache_inline +0 -0
  200. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@config.cache_meta +0 -0
  201. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@config.cache_warnings +0 -0
  202. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@error.cache +0 -0
  203. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@error.cache_inline +0 -0
  204. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@error.cache_meta +0 -0
  205. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@error.cache_warnings +0 -0
  206. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@fs.cache +0 -0
  207. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@fs.cache_inline +0 -0
  208. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@fs.cache_meta +0 -0
  209. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@fs.cache_warnings +0 -0
  210. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@importer.cache +0 -0
  211. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@importer.cache_inline +0 -0
  212. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@importer.cache_meta +0 -0
  213. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@importer.cache_warnings +0 -0
  214. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@parser.cache +0 -0
  215. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@parser.cache_inline +0 -0
  216. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@parser.cache_meta +0 -0
  217. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@parser.cache_warnings +0 -0
  218. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@path.cache +0 -0
  219. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@path.cache_inline +0 -0
  220. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@path.cache_meta +0 -0
  221. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@path.cache_warnings +0 -0
  222. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@platform.cache +0 -0
  223. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@platform.cache_inline +0 -0
  224. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@platform.cache_meta +0 -0
  225. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@platform.cache_warnings +0 -0
  226. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@provider.cache +0 -0
  227. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@provider.cache_inline +0 -0
  228. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@provider.cache_meta +0 -0
  229. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@provider.cache_warnings +0 -0
  230. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@registry.cache +0 -0
  231. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@registry.cache_inline +0 -0
  232. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@registry.cache_meta +0 -0
  233. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@registry.cache_warnings +0 -0
  234. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@scaffold.cache +0 -0
  235. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@scaffold.cache_inline +0 -0
  236. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@scaffold.cache_meta +0 -0
  237. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@scaffold.cache_warnings +0 -0
  238. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@semver.cache +0 -0
  239. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@semver.cache_inline +0 -0
  240. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@semver.cache_meta +0 -0
  241. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@semver.cache_warnings +0 -0
  242. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@shell.cache +0 -0
  243. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@shell.cache_inline +0 -0
  244. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@shell.cache_meta +0 -0
  245. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@shell.cache_warnings +0 -0
  246. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@template.cache +0 -0
  247. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@template.cache_inline +0 -0
  248. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@template.cache_meta +0 -0
  249. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@template.cache_warnings +0 -0
  250. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@types.cache +0 -0
  251. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@types.cache_inline +0 -0
  252. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@types.cache_meta +0 -0
  253. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@types.cache_warnings +0 -0
  254. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@version_constraint.cache +0 -0
  255. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@version_constraint.cache_inline +0 -0
  256. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@version_constraint.cache_meta +0 -0
  257. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@version_constraint.cache_warnings +0 -0
  258. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@yaml.cache +0 -0
  259. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@yaml.cache_inline +0 -0
  260. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@yaml.cache_meta +0 -0
  261. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@yaml.cache_warnings +0 -0
  262. package/build/dev/javascript/skillc/_gleam_artefacts/skillc_test.cache +0 -0
  263. package/build/dev/javascript/skillc/_gleam_artefacts/skillc_test.cache_inline +0 -0
  264. package/build/dev/javascript/skillc/_gleam_artefacts/skillc_test.cache_meta +0 -0
  265. package/build/dev/javascript/skillc/_gleam_artefacts/skillc_test.cache_warnings +0 -0
  266. package/build/dev/javascript/skillc/_gleam_artefacts/template_test.cache +0 -0
  267. package/build/dev/javascript/skillc/_gleam_artefacts/template_test.cache_inline +0 -0
  268. package/build/dev/javascript/skillc/_gleam_artefacts/template_test.cache_meta +0 -0
  269. package/build/dev/javascript/skillc/_gleam_artefacts/template_test.cache_warnings +0 -0
  270. package/build/dev/javascript/skillc/_gleam_artefacts/version_constraint_test.cache +0 -0
  271. package/build/dev/javascript/skillc/_gleam_artefacts/version_constraint_test.cache_inline +0 -0
  272. package/build/dev/javascript/skillc/_gleam_artefacts/version_constraint_test.cache_meta +0 -0
  273. package/build/dev/javascript/skillc/_gleam_artefacts/version_constraint_test.cache_warnings +0 -0
  274. package/build/dev/javascript/skillc/cli_test.mjs +461 -0
  275. package/build/dev/javascript/skillc/compiler_test.mjs +3089 -0
  276. package/build/dev/javascript/skillc/config_test.mjs +308 -0
  277. package/build/dev/javascript/skillc/gleam.main.mjs +2 -0
  278. package/build/dev/javascript/skillc/gleam.mjs +1 -0
  279. package/build/dev/javascript/skillc/importer_test.mjs +1643 -0
  280. package/build/dev/javascript/skillc/parser_test.mjs +1601 -0
  281. package/build/dev/javascript/skillc/path_test.mjs +26 -0
  282. package/build/dev/javascript/skillc/provider_test.mjs +221 -0
  283. package/build/dev/javascript/skillc/registry_test.mjs +359 -0
  284. package/build/dev/javascript/skillc/scaffold_test.mjs +405 -0
  285. package/build/dev/javascript/skillc/skillc/compiler.mjs +724 -0
  286. package/build/dev/javascript/skillc/skillc/config.mjs +172 -0
  287. package/build/dev/javascript/skillc/skillc/error.mjs +145 -0
  288. package/build/dev/javascript/skillc/skillc/fs.mjs +40 -0
  289. package/build/dev/javascript/skillc/skillc/importer.mjs +975 -0
  290. package/build/dev/javascript/skillc/skillc/parser.mjs +427 -0
  291. package/build/dev/javascript/skillc/skillc/path.mjs +52 -0
  292. package/build/dev/javascript/skillc/skillc/platform.mjs +44 -0
  293. package/build/dev/javascript/skillc/skillc/provider.mjs +86 -0
  294. package/build/dev/javascript/skillc/skillc/registry.mjs +701 -0
  295. package/build/dev/javascript/skillc/skillc/scaffold.mjs +117 -0
  296. package/build/dev/javascript/skillc/skillc/semver.mjs +293 -0
  297. package/build/dev/javascript/skillc/skillc/shell.mjs +14 -0
  298. package/build/dev/javascript/skillc/skillc/template.mjs +1177 -0
  299. package/build/dev/javascript/skillc/skillc/types.mjs +249 -0
  300. package/build/dev/javascript/skillc/skillc/version_constraint.mjs +290 -0
  301. package/build/dev/javascript/skillc/skillc/yaml.mjs +51 -0
  302. package/build/dev/javascript/skillc/skillc.mjs +873 -0
  303. package/build/dev/javascript/skillc/skillc_ffi.mjs +30 -0
  304. package/build/dev/javascript/skillc/skillc_test.mjs +5 -0
  305. package/build/dev/javascript/skillc/template_test.mjs +1638 -0
  306. package/build/dev/javascript/skillc/version_constraint_test.mjs +1325 -0
  307. package/build/dev/javascript/yay/_gleam_artefacts/yay.cache +0 -0
  308. package/build/dev/javascript/yay/_gleam_artefacts/yay.cache_inline +0 -0
  309. package/build/dev/javascript/yay/_gleam_artefacts/yay.cache_meta +0 -0
  310. package/build/dev/javascript/yay/gleam.mjs +1 -0
  311. package/build/dev/javascript/yay/yaml_ffi.erl +106 -0
  312. package/build/dev/javascript/yay/yaml_ffi.mjs +373 -0
  313. package/build/dev/javascript/yay/yay.erl +1218 -0
  314. package/build/dev/javascript/yay/yay.mjs +1403 -0
  315. package/package.json +28 -0
  316. package/src/skillc/compiler.gleam +561 -0
  317. package/src/skillc/config.gleam +91 -0
  318. package/src/skillc/error.gleam +37 -0
  319. package/src/skillc/fs.gleam +31 -0
  320. package/src/skillc/importer.gleam +709 -0
  321. package/src/skillc/parser.gleam +279 -0
  322. package/src/skillc/path.gleam +30 -0
  323. package/src/skillc/platform.gleam +25 -0
  324. package/src/skillc/provider.gleam +58 -0
  325. package/src/skillc/registry.gleam +472 -0
  326. package/src/skillc/scaffold.gleam +112 -0
  327. package/src/skillc/semver.gleam +165 -0
  328. package/src/skillc/shell.gleam +12 -0
  329. package/src/skillc/template.gleam +885 -0
  330. package/src/skillc/types.gleam +93 -0
  331. package/src/skillc/version_constraint.gleam +163 -0
  332. package/src/skillc/yaml.gleam +27 -0
  333. package/src/skillc.gleam +466 -0
  334. package/src/skillc_ffi.mjs +30 -0
@@ -0,0 +1,1638 @@
1
+ import * as $option from "../gleam_stdlib/gleam/option.mjs";
2
+ import { None, Some } from "../gleam_stdlib/gleam/option.mjs";
3
+ import * as $string from "../gleam_stdlib/gleam/string.mjs";
4
+ import * as $should from "../gleeunit/gleeunit/should.mjs";
5
+ import * as $yay from "../yay/yay.mjs";
6
+ import { Ok, Error, toList, makeError } from "./gleam.mjs";
7
+ import * as $error from "./skillc/error.mjs";
8
+ import * as $semver from "./skillc/semver.mjs";
9
+ import * as $template from "./skillc/template.mjs";
10
+ import * as $types from "./skillc/types.mjs";
11
+ import { ConfigField, Optional, Required, Skill, SkillMetadata } from "./skillc/types.mjs";
12
+ import * as $version_constraint from "./skillc/version_constraint.mjs";
13
+
14
+ const FILEPATH = "test/template_test.gleam";
15
+
16
+ export function provider_block_included_test() {
17
+ let content = "before\n{{#provider \"openclaw\"}}openclaw content{{/provider}}\nafter";
18
+ let $ = $template.process_provider_blocks(content, new $types.OpenClaw());
19
+ let result;
20
+ if ($ instanceof Ok) {
21
+ result = $[0];
22
+ } else {
23
+ throw makeError(
24
+ "let_assert",
25
+ FILEPATH,
26
+ "template_test",
27
+ 20,
28
+ "provider_block_included_test",
29
+ "Pattern match failed, no pattern matched the value.",
30
+ { value: $, start: 605, end: 686, pattern_start: 616, pattern_end: 626 }
31
+ )
32
+ }
33
+ $should.be_true($string.contains(result, "openclaw content"));
34
+ $should.be_true($string.contains(result, "before"));
35
+ return $should.be_true($string.contains(result, "after"));
36
+ }
37
+
38
+ export function provider_block_excluded_test() {
39
+ let content = "before\n{{#provider \"openclaw\"}}openclaw content{{/provider}}\nafter";
40
+ let $ = $template.process_provider_blocks(content, new $types.ClaudeCode());
41
+ let result;
42
+ if ($ instanceof Ok) {
43
+ result = $[0];
44
+ } else {
45
+ throw makeError(
46
+ "let_assert",
47
+ FILEPATH,
48
+ "template_test",
49
+ 29,
50
+ "provider_block_excluded_test",
51
+ "Pattern match failed, no pattern matched the value.",
52
+ { value: $, start: 990, end: 1077, pattern_start: 1001, pattern_end: 1011 }
53
+ )
54
+ }
55
+ $should.be_false($string.contains(result, "openclaw content"));
56
+ $should.be_true($string.contains(result, "before"));
57
+ return $should.be_true($string.contains(result, "after"));
58
+ }
59
+
60
+ export function multi_provider_block_included_test() {
61
+ let content = "{{#provider \"openclaw\" \"codex\"}}shared content{{/provider}}";
62
+ let $ = $template.process_provider_blocks(content, new $types.OpenClaw());
63
+ let result_openclaw;
64
+ if ($ instanceof Ok) {
65
+ result_openclaw = $[0];
66
+ } else {
67
+ throw makeError(
68
+ "let_assert",
69
+ FILEPATH,
70
+ "template_test",
71
+ 39,
72
+ "multi_provider_block_included_test",
73
+ "Pattern match failed, no pattern matched the value.",
74
+ {
75
+ value: $,
76
+ start: 1381,
77
+ end: 1475,
78
+ pattern_start: 1392,
79
+ pattern_end: 1411
80
+ }
81
+ )
82
+ }
83
+ let $1 = $template.process_provider_blocks(content, new $types.Codex());
84
+ let result_codex;
85
+ if ($1 instanceof Ok) {
86
+ result_codex = $1[0];
87
+ } else {
88
+ throw makeError(
89
+ "let_assert",
90
+ FILEPATH,
91
+ "template_test",
92
+ 41,
93
+ "multi_provider_block_included_test",
94
+ "Pattern match failed, no pattern matched the value.",
95
+ {
96
+ value: $1,
97
+ start: 1478,
98
+ end: 1566,
99
+ pattern_start: 1489,
100
+ pattern_end: 1505
101
+ }
102
+ )
103
+ }
104
+ $should.be_true($string.contains(result_openclaw, "shared content"));
105
+ return $should.be_true($string.contains(result_codex, "shared content"));
106
+ }
107
+
108
+ export function multi_provider_block_excluded_test() {
109
+ let content = "{{#provider \"openclaw\" \"codex\"}}shared content{{/provider}}";
110
+ let $ = $template.process_provider_blocks(content, new $types.ClaudeCode());
111
+ let result;
112
+ if ($ instanceof Ok) {
113
+ result = $[0];
114
+ } else {
115
+ throw makeError(
116
+ "let_assert",
117
+ FILEPATH,
118
+ "template_test",
119
+ 50,
120
+ "multi_provider_block_excluded_test",
121
+ "Pattern match failed, no pattern matched the value.",
122
+ {
123
+ value: $,
124
+ start: 1839,
125
+ end: 1926,
126
+ pattern_start: 1850,
127
+ pattern_end: 1860
128
+ }
129
+ )
130
+ }
131
+ return $should.be_false($string.contains(result, "shared content"));
132
+ }
133
+
134
+ export function empty_provider_block_test() {
135
+ let content = "before{{#provider \"openclaw\"}}{{/provider}}after";
136
+ let $ = $template.process_provider_blocks(content, new $types.OpenClaw());
137
+ let result;
138
+ if ($ instanceof Ok) {
139
+ result = $[0];
140
+ } else {
141
+ throw makeError(
142
+ "let_assert",
143
+ FILEPATH,
144
+ "template_test",
145
+ 57,
146
+ "empty_provider_block_test",
147
+ "Pattern match failed, no pattern matched the value.",
148
+ {
149
+ value: $,
150
+ start: 2099,
151
+ end: 2180,
152
+ pattern_start: 2110,
153
+ pattern_end: 2120
154
+ }
155
+ )
156
+ }
157
+ $should.be_true($string.contains(result, "before"));
158
+ return $should.be_true($string.contains(result, "after"));
159
+ }
160
+
161
+ export function nested_provider_blocks_test() {
162
+ let content = "{{#provider \"openclaw\"}}outer{{#provider \"openclaw\"}}inner{{/provider}}end{{/provider}}";
163
+ let $ = $template.process_provider_blocks(content, new $types.OpenClaw());
164
+ let result;
165
+ if ($ instanceof Ok) {
166
+ result = $[0];
167
+ } else {
168
+ throw makeError(
169
+ "let_assert",
170
+ FILEPATH,
171
+ "template_test",
172
+ 65,
173
+ "nested_provider_blocks_test",
174
+ "Pattern match failed, no pattern matched the value.",
175
+ {
176
+ value: $,
177
+ start: 2442,
178
+ end: 2523,
179
+ pattern_start: 2453,
180
+ pattern_end: 2463
181
+ }
182
+ )
183
+ }
184
+ $should.be_true($string.contains(result, "outer"));
185
+ return $should.be_true($string.contains(result, "inner"));
186
+ }
187
+
188
+ export function unclosed_provider_block_returns_error_test() {
189
+ let content = "before\n{{#provider \"openclaw\"}}no closing tag";
190
+ let result = $template.process_provider_blocks(content, new $types.OpenClaw());
191
+ return $should.be_error(result);
192
+ }
193
+
194
+ export function malformed_provider_tag_returns_error_test() {
195
+ let content = "{{#provider \"openclaw\" some content";
196
+ let result = $template.process_provider_blocks(content, new $types.OpenClaw());
197
+ return $should.be_error(result);
198
+ }
199
+
200
+ export function unclosed_provider_error_has_line_number_test() {
201
+ let content = "line 1\nline 2\n{{#provider \"openclaw\"}}no close";
202
+ let result = $template.process_provider_blocks(content, new $types.OpenClaw());
203
+ $should.be_error(result);
204
+ let line;
205
+ let msg;
206
+ if (result instanceof Error) {
207
+ let $ = result[0];
208
+ if ($ instanceof $error.TemplateError) {
209
+ line = $.line;
210
+ msg = $.message;
211
+ } else {
212
+ throw makeError(
213
+ "let_assert",
214
+ FILEPATH,
215
+ "template_test",
216
+ 628,
217
+ "unclosed_provider_error_has_line_number_test",
218
+ "Pattern match failed, no pattern matched the value.",
219
+ {
220
+ value: result,
221
+ start: 18133,
222
+ end: 18190,
223
+ pattern_start: 18144,
224
+ pattern_end: 18181
225
+ }
226
+ )
227
+ }
228
+ } else {
229
+ throw makeError(
230
+ "let_assert",
231
+ FILEPATH,
232
+ "template_test",
233
+ 628,
234
+ "unclosed_provider_error_has_line_number_test",
235
+ "Pattern match failed, no pattern matched the value.",
236
+ {
237
+ value: result,
238
+ start: 18133,
239
+ end: 18190,
240
+ pattern_start: 18144,
241
+ pattern_end: 18181
242
+ }
243
+ )
244
+ }
245
+ $should.equal(line, 3);
246
+ return $should.be_true($string.contains(msg, "Unclosed"));
247
+ }
248
+
249
+ function test_skill() {
250
+ let $ = $semver.parse("1.0.0");
251
+ let v;
252
+ if ($ instanceof Ok) {
253
+ v = $[0];
254
+ } else {
255
+ throw makeError(
256
+ "let_assert",
257
+ FILEPATH,
258
+ "template_test",
259
+ 715,
260
+ "test_skill",
261
+ "Pattern match failed, no pattern matched the value.",
262
+ {
263
+ value: $,
264
+ start: 20589,
265
+ end: 20629,
266
+ pattern_start: 20600,
267
+ pattern_end: 20605
268
+ }
269
+ )
270
+ }
271
+ return new Skill(
272
+ "test-skill",
273
+ "A test skill",
274
+ v,
275
+ new Some("MIT"),
276
+ new None(),
277
+ new None(),
278
+ new Some(new SkillMetadata(new Some("Test"), new None(), toList([]))),
279
+ toList([]),
280
+ toList([new ConfigField("api_key", "API key", new Required(), true)]),
281
+ );
282
+ }
283
+
284
+ export function if_with_empty_string_is_falsy_test() {
285
+ let meta = new $yay.NodeMap(
286
+ toList([[new $yay.NodeStr("empty_field"), new $yay.NodeStr("")]]),
287
+ );
288
+ let result = $template.render_template(
289
+ "before{{#if meta.empty_field}}hidden{{/if}}after",
290
+ new $types.OpenClaw(),
291
+ test_skill(),
292
+ meta,
293
+ );
294
+ let output;
295
+ if (result instanceof Ok) {
296
+ output = result[0];
297
+ } else {
298
+ throw makeError(
299
+ "let_assert",
300
+ FILEPATH,
301
+ "template_test",
302
+ 659,
303
+ "if_with_empty_string_is_falsy_test",
304
+ "Pattern match failed, no pattern matched the value.",
305
+ {
306
+ value: result,
307
+ start: 19130,
308
+ end: 19160,
309
+ pattern_start: 19141,
310
+ pattern_end: 19151
311
+ }
312
+ )
313
+ }
314
+ return $should.equal(output, "beforeafter");
315
+ }
316
+
317
+ function assert_parse_vc(input) {
318
+ let $ = $version_constraint.parse(input);
319
+ let vc;
320
+ if ($ instanceof Ok) {
321
+ vc = $[0];
322
+ } else {
323
+ throw makeError(
324
+ "let_assert",
325
+ FILEPATH,
326
+ "template_test",
327
+ 739,
328
+ "assert_parse_vc",
329
+ "Pattern match failed, no pattern matched the value.",
330
+ {
331
+ value: $,
332
+ start: 21146,
333
+ end: 21197,
334
+ pattern_start: 21157,
335
+ pattern_end: 21163
336
+ }
337
+ )
338
+ }
339
+ return vc;
340
+ }
341
+
342
+ function test_provider_meta() {
343
+ return new $yay.NodeMap(
344
+ toList([
345
+ [new $yay.NodeStr("emoji"), new $yay.NodeStr("🧪")],
346
+ [
347
+ new $yay.NodeStr("requires"),
348
+ new $yay.NodeMap(
349
+ toList([
350
+ [
351
+ new $yay.NodeStr("bins"),
352
+ new $yay.NodeSeq(
353
+ toList([new $yay.NodeStr("python3"), new $yay.NodeStr("curl")]),
354
+ ),
355
+ ],
356
+ ]),
357
+ ),
358
+ ],
359
+ ]),
360
+ );
361
+ }
362
+
363
+ export function variable_name_test() {
364
+ let result = $template.render_template(
365
+ "Hello {{name}}",
366
+ new $types.OpenClaw(),
367
+ test_skill(),
368
+ test_provider_meta(),
369
+ );
370
+ let output;
371
+ if (result instanceof Ok) {
372
+ output = result[0];
373
+ } else {
374
+ throw makeError(
375
+ "let_assert",
376
+ FILEPATH,
377
+ "template_test",
378
+ 95,
379
+ "variable_name_test",
380
+ "Pattern match failed, no pattern matched the value.",
381
+ {
382
+ value: result,
383
+ start: 3468,
384
+ end: 3498,
385
+ pattern_start: 3479,
386
+ pattern_end: 3489
387
+ }
388
+ )
389
+ }
390
+ return $should.be_true($string.contains(output, "Hello test-skill"));
391
+ }
392
+
393
+ export function variable_version_test() {
394
+ let result = $template.render_template(
395
+ "v{{version}}",
396
+ new $types.OpenClaw(),
397
+ test_skill(),
398
+ test_provider_meta(),
399
+ );
400
+ let output;
401
+ if (result instanceof Ok) {
402
+ output = result[0];
403
+ } else {
404
+ throw makeError(
405
+ "let_assert",
406
+ FILEPATH,
407
+ "template_test",
408
+ 107,
409
+ "variable_version_test",
410
+ "Pattern match failed, no pattern matched the value.",
411
+ {
412
+ value: result,
413
+ start: 3742,
414
+ end: 3772,
415
+ pattern_start: 3753,
416
+ pattern_end: 3763
417
+ }
418
+ )
419
+ }
420
+ return $should.be_true($string.contains(output, "v1.0.0"));
421
+ }
422
+
423
+ export function variable_description_test() {
424
+ let result = $template.render_template(
425
+ "{{description}}",
426
+ new $types.OpenClaw(),
427
+ test_skill(),
428
+ test_provider_meta(),
429
+ );
430
+ let output;
431
+ if (result instanceof Ok) {
432
+ output = result[0];
433
+ } else {
434
+ throw makeError(
435
+ "let_assert",
436
+ FILEPATH,
437
+ "template_test",
438
+ 119,
439
+ "variable_description_test",
440
+ "Pattern match failed, no pattern matched the value.",
441
+ {
442
+ value: result,
443
+ start: 4013,
444
+ end: 4043,
445
+ pattern_start: 4024,
446
+ pattern_end: 4034
447
+ }
448
+ )
449
+ }
450
+ return $should.be_true($string.contains(output, "A test skill"));
451
+ }
452
+
453
+ export function variable_meta_field_test() {
454
+ let result = $template.render_template(
455
+ "Icon: {{meta.emoji}}",
456
+ new $types.OpenClaw(),
457
+ test_skill(),
458
+ test_provider_meta(),
459
+ );
460
+ let output;
461
+ if (result instanceof Ok) {
462
+ output = result[0];
463
+ } else {
464
+ throw makeError(
465
+ "let_assert",
466
+ FILEPATH,
467
+ "template_test",
468
+ 131,
469
+ "variable_meta_field_test",
470
+ "Pattern match failed, no pattern matched the value.",
471
+ {
472
+ value: result,
473
+ start: 4294,
474
+ end: 4324,
475
+ pattern_start: 4305,
476
+ pattern_end: 4315
477
+ }
478
+ )
479
+ }
480
+ return $should.be_true($string.contains(output, "Icon: 🧪"));
481
+ }
482
+
483
+ export function undefined_variable_renders_empty_test() {
484
+ let result = $template.render_template(
485
+ "before{{nonexistent}}after",
486
+ new $types.OpenClaw(),
487
+ test_skill(),
488
+ test_provider_meta(),
489
+ );
490
+ let output;
491
+ if (result instanceof Ok) {
492
+ output = result[0];
493
+ } else {
494
+ throw makeError(
495
+ "let_assert",
496
+ FILEPATH,
497
+ "template_test",
498
+ 143,
499
+ "undefined_variable_renders_empty_test",
500
+ "Pattern match failed, no pattern matched the value.",
501
+ {
502
+ value: result,
503
+ start: 4592,
504
+ end: 4622,
505
+ pattern_start: 4603,
506
+ pattern_end: 4613
507
+ }
508
+ )
509
+ }
510
+ return $should.equal(output, "beforeafter");
511
+ }
512
+
513
+ export function nested_metadata_access_test() {
514
+ let result = $template.render_template(
515
+ "{{#each meta.requires.bins}}{{this}} {{/each}}",
516
+ new $types.OpenClaw(),
517
+ test_skill(),
518
+ test_provider_meta(),
519
+ );
520
+ let output;
521
+ if (result instanceof Ok) {
522
+ output = result[0];
523
+ } else {
524
+ throw makeError(
525
+ "let_assert",
526
+ FILEPATH,
527
+ "template_test",
528
+ 156,
529
+ "nested_metadata_access_test",
530
+ "Pattern match failed, no pattern matched the value.",
531
+ {
532
+ value: result,
533
+ start: 4927,
534
+ end: 4957,
535
+ pattern_start: 4938,
536
+ pattern_end: 4948
537
+ }
538
+ )
539
+ }
540
+ $should.be_true($string.contains(output, "python3"));
541
+ return $should.be_true($string.contains(output, "curl"));
542
+ }
543
+
544
+ export function if_block_truthy_test() {
545
+ let result = $template.render_template(
546
+ "{{#if meta.emoji}}has emoji{{/if}}",
547
+ new $types.OpenClaw(),
548
+ test_skill(),
549
+ test_provider_meta(),
550
+ );
551
+ let output;
552
+ if (result instanceof Ok) {
553
+ output = result[0];
554
+ } else {
555
+ throw makeError(
556
+ "let_assert",
557
+ FILEPATH,
558
+ "template_test",
559
+ 173,
560
+ "if_block_truthy_test",
561
+ "Pattern match failed, no pattern matched the value.",
562
+ {
563
+ value: result,
564
+ start: 5455,
565
+ end: 5485,
566
+ pattern_start: 5466,
567
+ pattern_end: 5476
568
+ }
569
+ )
570
+ }
571
+ return $should.be_true($string.contains(output, "has emoji"));
572
+ }
573
+
574
+ export function unless_block_test() {
575
+ let result = $template.render_template(
576
+ "{{#unless meta.nonexistent}}no field{{/unless}}",
577
+ new $types.OpenClaw(),
578
+ test_skill(),
579
+ test_provider_meta(),
580
+ );
581
+ let output;
582
+ if (result instanceof Ok) {
583
+ output = result[0];
584
+ } else {
585
+ throw makeError(
586
+ "let_assert",
587
+ FILEPATH,
588
+ "template_test",
589
+ 185,
590
+ "unless_block_test",
591
+ "Pattern match failed, no pattern matched the value.",
592
+ {
593
+ value: result,
594
+ start: 5753,
595
+ end: 5783,
596
+ pattern_start: 5764,
597
+ pattern_end: 5774
598
+ }
599
+ )
600
+ }
601
+ return $should.be_true($string.contains(output, "no field"));
602
+ }
603
+
604
+ export function if_block_falsy_path_test() {
605
+ let result = $template.render_template(
606
+ "before{{#if meta.nonexistent}}hidden{{/if}}after",
607
+ new $types.OpenClaw(),
608
+ test_skill(),
609
+ test_provider_meta(),
610
+ );
611
+ let output;
612
+ if (result instanceof Ok) {
613
+ output = result[0];
614
+ } else {
615
+ throw makeError(
616
+ "let_assert",
617
+ FILEPATH,
618
+ "template_test",
619
+ 198,
620
+ "if_block_falsy_path_test",
621
+ "Pattern match failed, no pattern matched the value.",
622
+ {
623
+ value: result,
624
+ start: 6119,
625
+ end: 6149,
626
+ pattern_start: 6130,
627
+ pattern_end: 6140
628
+ }
629
+ )
630
+ }
631
+ return $should.equal(output, "beforeafter");
632
+ }
633
+
634
+ export function if_block_false_bool_test() {
635
+ let _block;
636
+ let _record = test_skill();
637
+ _block = new Skill(
638
+ _record.name,
639
+ _record.description,
640
+ _record.version,
641
+ _record.license,
642
+ _record.homepage,
643
+ _record.repository,
644
+ _record.metadata,
645
+ _record.dependencies,
646
+ toList([new ConfigField("test", "test", new Optional(), false)]),
647
+ );
648
+ let skill = _block;
649
+ let result = $template.render_template(
650
+ "{{#each config}}{{#if this.required}}req{{/if}}{{#unless this.required}}opt{{/unless}}{{/each}}",
651
+ new $types.OpenClaw(),
652
+ skill,
653
+ test_provider_meta(),
654
+ );
655
+ let output;
656
+ if (result instanceof Ok) {
657
+ output = result[0];
658
+ } else {
659
+ throw makeError(
660
+ "let_assert",
661
+ FILEPATH,
662
+ "template_test",
663
+ 220,
664
+ "if_block_false_bool_test",
665
+ "Pattern match failed, no pattern matched the value.",
666
+ {
667
+ value: result,
668
+ start: 6691,
669
+ end: 6721,
670
+ pattern_start: 6702,
671
+ pattern_end: 6712
672
+ }
673
+ )
674
+ }
675
+ $should.be_true($string.contains(output, "opt"));
676
+ return $should.be_false($string.contains(output, "req"));
677
+ }
678
+
679
+ export function each_block_test() {
680
+ let result = $template.render_template(
681
+ "{{#each config}}{{this.name}} {{/each}}",
682
+ new $types.OpenClaw(),
683
+ test_skill(),
684
+ test_provider_meta(),
685
+ );
686
+ let output;
687
+ if (result instanceof Ok) {
688
+ output = result[0];
689
+ } else {
690
+ throw makeError(
691
+ "let_assert",
692
+ FILEPATH,
693
+ "template_test",
694
+ 233,
695
+ "each_block_test",
696
+ "Pattern match failed, no pattern matched the value.",
697
+ {
698
+ value: result,
699
+ start: 7023,
700
+ end: 7053,
701
+ pattern_start: 7034,
702
+ pattern_end: 7044
703
+ }
704
+ )
705
+ }
706
+ return $should.be_true($string.contains(output, "api_key"));
707
+ }
708
+
709
+ export function each_block_at_index_test() {
710
+ let _block;
711
+ let _record = test_skill();
712
+ _block = new Skill(
713
+ _record.name,
714
+ _record.description,
715
+ _record.version,
716
+ _record.license,
717
+ _record.homepage,
718
+ _record.repository,
719
+ _record.metadata,
720
+ _record.dependencies,
721
+ toList([
722
+ new ConfigField("a", "", new Optional(), false),
723
+ new ConfigField("b", "", new Optional(), false),
724
+ ]),
725
+ );
726
+ let skill = _block;
727
+ let result = $template.render_template(
728
+ "{{#each config}}{{@index}}:{{this.name}} {{/each}}",
729
+ new $types.OpenClaw(),
730
+ skill,
731
+ test_provider_meta(),
732
+ );
733
+ let output;
734
+ if (result instanceof Ok) {
735
+ output = result[0];
736
+ } else {
737
+ throw makeError(
738
+ "let_assert",
739
+ FILEPATH,
740
+ "template_test",
741
+ 260,
742
+ "each_block_at_index_test",
743
+ "Pattern match failed, no pattern matched the value.",
744
+ {
745
+ value: result,
746
+ start: 7631,
747
+ end: 7661,
748
+ pattern_start: 7642,
749
+ pattern_end: 7652
750
+ }
751
+ )
752
+ }
753
+ $should.be_true($string.contains(output, "0:a"));
754
+ return $should.be_true($string.contains(output, "1:b"));
755
+ }
756
+
757
+ export function each_block_at_first_last_test() {
758
+ let _block;
759
+ let _record = test_skill();
760
+ _block = new Skill(
761
+ _record.name,
762
+ _record.description,
763
+ _record.version,
764
+ _record.license,
765
+ _record.homepage,
766
+ _record.repository,
767
+ _record.metadata,
768
+ _record.dependencies,
769
+ toList([
770
+ new ConfigField("first", "", new Optional(), false),
771
+ new ConfigField("middle", "", new Optional(), false),
772
+ new ConfigField("last", "", new Optional(), false),
773
+ ]),
774
+ );
775
+ let skill = _block;
776
+ let result = $template.render_template(
777
+ "{{#each config}}{{#if @first}}[FIRST]{{/if}}{{#if @last}}[LAST]{{/if}}{{this.name}} {{/each}}",
778
+ new $types.OpenClaw(),
779
+ skill,
780
+ test_provider_meta(),
781
+ );
782
+ let output;
783
+ if (result instanceof Ok) {
784
+ output = result[0];
785
+ } else {
786
+ throw makeError(
787
+ "let_assert",
788
+ FILEPATH,
789
+ "template_test",
790
+ 294,
791
+ "each_block_at_first_last_test",
792
+ "Pattern match failed, no pattern matched the value.",
793
+ {
794
+ value: result,
795
+ start: 8470,
796
+ end: 8500,
797
+ pattern_start: 8481,
798
+ pattern_end: 8491
799
+ }
800
+ )
801
+ }
802
+ $should.be_true($string.contains(output, "[FIRST]first"));
803
+ $should.be_true($string.contains(output, "[LAST]last"));
804
+ $should.be_false($string.contains(output, "[FIRST]middle"));
805
+ return $should.be_false($string.contains(output, "[LAST]middle"));
806
+ }
807
+
808
+ export function each_empty_list_test() {
809
+ let _block;
810
+ let _record = test_skill();
811
+ _block = new Skill(
812
+ _record.name,
813
+ _record.description,
814
+ _record.version,
815
+ _record.license,
816
+ _record.homepage,
817
+ _record.repository,
818
+ _record.metadata,
819
+ _record.dependencies,
820
+ toList([]),
821
+ );
822
+ let skill = _block;
823
+ let result = $template.render_template(
824
+ "before{{#each config}}item{{/each}}after",
825
+ new $types.OpenClaw(),
826
+ skill,
827
+ test_provider_meta(),
828
+ );
829
+ let output;
830
+ if (result instanceof Ok) {
831
+ output = result[0];
832
+ } else {
833
+ throw makeError(
834
+ "let_assert",
835
+ FILEPATH,
836
+ "template_test",
837
+ 310,
838
+ "each_empty_list_test",
839
+ "Pattern match failed, no pattern matched the value.",
840
+ {
841
+ value: result,
842
+ start: 8983,
843
+ end: 9013,
844
+ pattern_start: 8994,
845
+ pattern_end: 9004
846
+ }
847
+ )
848
+ }
849
+ return $should.equal(output, "beforeafter");
850
+ }
851
+
852
+ export function if_else_truthy_renders_if_branch_test() {
853
+ let result = $template.render_template(
854
+ "{{#if meta.emoji}}has emoji{{else}}no emoji{{/if}}",
855
+ new $types.OpenClaw(),
856
+ test_skill(),
857
+ test_provider_meta(),
858
+ );
859
+ let output;
860
+ if (result instanceof Ok) {
861
+ output = result[0];
862
+ } else {
863
+ throw makeError(
864
+ "let_assert",
865
+ FILEPATH,
866
+ "template_test",
867
+ 326,
868
+ "if_else_truthy_renders_if_branch_test",
869
+ "Pattern match failed, no pattern matched the value.",
870
+ {
871
+ value: result,
872
+ start: 9482,
873
+ end: 9512,
874
+ pattern_start: 9493,
875
+ pattern_end: 9503
876
+ }
877
+ )
878
+ }
879
+ $should.be_true($string.contains(output, "has emoji"));
880
+ return $should.be_false($string.contains(output, "no emoji"));
881
+ }
882
+
883
+ export function if_else_falsy_renders_else_branch_test() {
884
+ let result = $template.render_template(
885
+ "{{#if meta.nonexistent}}yes{{else}}no{{/if}}",
886
+ new $types.OpenClaw(),
887
+ test_skill(),
888
+ test_provider_meta(),
889
+ );
890
+ let output;
891
+ if (result instanceof Ok) {
892
+ output = result[0];
893
+ } else {
894
+ throw makeError(
895
+ "let_assert",
896
+ FILEPATH,
897
+ "template_test",
898
+ 339,
899
+ "if_else_falsy_renders_else_branch_test",
900
+ "Pattern match failed, no pattern matched the value.",
901
+ {
902
+ value: result,
903
+ start: 9853,
904
+ end: 9883,
905
+ pattern_start: 9864,
906
+ pattern_end: 9874
907
+ }
908
+ )
909
+ }
910
+ $should.be_true($string.contains(output, "no"));
911
+ return $should.be_false($string.contains(output, "yes"));
912
+ }
913
+
914
+ export function unless_else_truthy_renders_else_branch_test() {
915
+ let result = $template.render_template(
916
+ "{{#unless meta.emoji}}hidden{{else}}shown{{/unless}}",
917
+ new $types.OpenClaw(),
918
+ test_skill(),
919
+ test_provider_meta(),
920
+ );
921
+ let output;
922
+ if (result instanceof Ok) {
923
+ output = result[0];
924
+ } else {
925
+ throw makeError(
926
+ "let_assert",
927
+ FILEPATH,
928
+ "template_test",
929
+ 352,
930
+ "unless_else_truthy_renders_else_branch_test",
931
+ "Pattern match failed, no pattern matched the value.",
932
+ {
933
+ value: result,
934
+ start: 10225,
935
+ end: 10255,
936
+ pattern_start: 10236,
937
+ pattern_end: 10246
938
+ }
939
+ )
940
+ }
941
+ $should.be_true($string.contains(output, "shown"));
942
+ return $should.be_false($string.contains(output, "hidden"));
943
+ }
944
+
945
+ export function unless_else_falsy_renders_unless_branch_test() {
946
+ let result = $template.render_template(
947
+ "{{#unless meta.nonexistent}}shown{{else}}hidden{{/unless}}",
948
+ new $types.OpenClaw(),
949
+ test_skill(),
950
+ test_provider_meta(),
951
+ );
952
+ let output;
953
+ if (result instanceof Ok) {
954
+ output = result[0];
955
+ } else {
956
+ throw makeError(
957
+ "let_assert",
958
+ FILEPATH,
959
+ "template_test",
960
+ 365,
961
+ "unless_else_falsy_renders_unless_branch_test",
962
+ "Pattern match failed, no pattern matched the value.",
963
+ {
964
+ value: result,
965
+ start: 10610,
966
+ end: 10640,
967
+ pattern_start: 10621,
968
+ pattern_end: 10631
969
+ }
970
+ )
971
+ }
972
+ $should.be_true($string.contains(output, "shown"));
973
+ return $should.be_false($string.contains(output, "hidden"));
974
+ }
975
+
976
+ export function if_else_with_variables_test() {
977
+ let result = $template.render_template(
978
+ "{{#if meta.emoji}}Icon: {{meta.emoji}}{{else}}Name: {{name}}{{/if}}",
979
+ new $types.OpenClaw(),
980
+ test_skill(),
981
+ test_provider_meta(),
982
+ );
983
+ let output;
984
+ if (result instanceof Ok) {
985
+ output = result[0];
986
+ } else {
987
+ throw makeError(
988
+ "let_assert",
989
+ FILEPATH,
990
+ "template_test",
991
+ 378,
992
+ "if_else_with_variables_test",
993
+ "Pattern match failed, no pattern matched the value.",
994
+ {
995
+ value: result,
996
+ start: 10987,
997
+ end: 11017,
998
+ pattern_start: 10998,
999
+ pattern_end: 11008
1000
+ }
1001
+ )
1002
+ }
1003
+ return $should.be_true($string.contains(output, "Icon:"));
1004
+ }
1005
+
1006
+ export function if_else_falsy_with_variables_test() {
1007
+ let result = $template.render_template(
1008
+ "{{#if meta.nonexistent}}hidden{{else}}fallback: {{name}}{{/if}}",
1009
+ new $types.OpenClaw(),
1010
+ test_skill(),
1011
+ test_provider_meta(),
1012
+ );
1013
+ let output;
1014
+ if (result instanceof Ok) {
1015
+ output = result[0];
1016
+ } else {
1017
+ throw makeError(
1018
+ "let_assert",
1019
+ FILEPATH,
1020
+ "template_test",
1021
+ 390,
1022
+ "if_else_falsy_with_variables_test",
1023
+ "Pattern match failed, no pattern matched the value.",
1024
+ {
1025
+ value: result,
1026
+ start: 11313,
1027
+ end: 11343,
1028
+ pattern_start: 11324,
1029
+ pattern_end: 11334
1030
+ }
1031
+ )
1032
+ }
1033
+ return $should.be_true($string.contains(output, "fallback: test-skill"));
1034
+ }
1035
+
1036
+ export function nested_if_else_test() {
1037
+ let result = $template.render_template(
1038
+ "{{#if meta.emoji}}{{#if meta.nonexistent}}inner{{else}}outer else{{/if}}{{else}}top else{{/if}}",
1039
+ new $types.OpenClaw(),
1040
+ test_skill(),
1041
+ test_provider_meta(),
1042
+ );
1043
+ let output;
1044
+ if (result instanceof Ok) {
1045
+ output = result[0];
1046
+ } else {
1047
+ throw makeError(
1048
+ "let_assert",
1049
+ FILEPATH,
1050
+ "template_test",
1051
+ 402,
1052
+ "nested_if_else_test",
1053
+ "Pattern match failed, no pattern matched the value.",
1054
+ {
1055
+ value: result,
1056
+ start: 11672,
1057
+ end: 11702,
1058
+ pattern_start: 11683,
1059
+ pattern_end: 11693
1060
+ }
1061
+ )
1062
+ }
1063
+ $should.be_true($string.contains(output, "outer else"));
1064
+ $should.be_false($string.contains(output, "inner"));
1065
+ return $should.be_false($string.contains(output, "top else"));
1066
+ }
1067
+
1068
+ export function if_else_empty_else_block_test() {
1069
+ let result = $template.render_template(
1070
+ "before{{#if meta.nonexistent}}content{{else}}{{/if}}after",
1071
+ new $types.OpenClaw(),
1072
+ test_skill(),
1073
+ test_provider_meta(),
1074
+ );
1075
+ let output;
1076
+ if (result instanceof Ok) {
1077
+ output = result[0];
1078
+ } else {
1079
+ throw makeError(
1080
+ "let_assert",
1081
+ FILEPATH,
1082
+ "template_test",
1083
+ 416,
1084
+ "if_else_empty_else_block_test",
1085
+ "Pattern match failed, no pattern matched the value.",
1086
+ {
1087
+ value: result,
1088
+ start: 12100,
1089
+ end: 12130,
1090
+ pattern_start: 12111,
1091
+ pattern_end: 12121
1092
+ }
1093
+ )
1094
+ }
1095
+ return $should.equal(output, "beforeafter");
1096
+ }
1097
+
1098
+ export function backslash_escape_test() {
1099
+ let result = $template.render_template(
1100
+ "\\{{not processed}}",
1101
+ new $types.OpenClaw(),
1102
+ test_skill(),
1103
+ test_provider_meta(),
1104
+ );
1105
+ let output;
1106
+ if (result instanceof Ok) {
1107
+ output = result[0];
1108
+ } else {
1109
+ throw makeError(
1110
+ "let_assert",
1111
+ FILEPATH,
1112
+ "template_test",
1113
+ 432,
1114
+ "backslash_escape_test",
1115
+ "Pattern match failed, no pattern matched the value.",
1116
+ {
1117
+ value: result,
1118
+ start: 12536,
1119
+ end: 12566,
1120
+ pattern_start: 12547,
1121
+ pattern_end: 12557
1122
+ }
1123
+ )
1124
+ }
1125
+ return $should.be_true($string.contains(output, "{{not processed}}"));
1126
+ }
1127
+
1128
+ export function raw_block_test() {
1129
+ let result = $template.render_template(
1130
+ "{{{{raw}}}}{{name}} should not be replaced{{{{/raw}}}}",
1131
+ new $types.OpenClaw(),
1132
+ test_skill(),
1133
+ test_provider_meta(),
1134
+ );
1135
+ let output;
1136
+ if (result instanceof Ok) {
1137
+ output = result[0];
1138
+ } else {
1139
+ throw makeError(
1140
+ "let_assert",
1141
+ FILEPATH,
1142
+ "template_test",
1143
+ 444,
1144
+ "raw_block_test",
1145
+ "Pattern match failed, no pattern matched the value.",
1146
+ {
1147
+ value: result,
1148
+ start: 12846,
1149
+ end: 12876,
1150
+ pattern_start: 12857,
1151
+ pattern_end: 12867
1152
+ }
1153
+ )
1154
+ }
1155
+ $should.be_false($string.contains(output, "test-skill"));
1156
+ return $should.be_true($string.contains(output, "{{name}}"));
1157
+ }
1158
+
1159
+ export function context_includes_provider_test() {
1160
+ let result = $template.render_template(
1161
+ "Provider: {{provider}}",
1162
+ new $types.OpenClaw(),
1163
+ test_skill(),
1164
+ test_provider_meta(),
1165
+ );
1166
+ let output;
1167
+ if (result instanceof Ok) {
1168
+ output = result[0];
1169
+ } else {
1170
+ throw makeError(
1171
+ "let_assert",
1172
+ FILEPATH,
1173
+ "template_test",
1174
+ 461,
1175
+ "context_includes_provider_test",
1176
+ "Pattern match failed, no pattern matched the value.",
1177
+ {
1178
+ value: result,
1179
+ start: 13375,
1180
+ end: 13405,
1181
+ pattern_start: 13386,
1182
+ pattern_end: 13396
1183
+ }
1184
+ )
1185
+ }
1186
+ return $should.be_true($string.contains(output, "Provider: openclaw"));
1187
+ }
1188
+
1189
+ export function context_includes_top_level_fields_test() {
1190
+ let result = $template.render_template(
1191
+ "{{name}} {{version}} {{description}}",
1192
+ new $types.OpenClaw(),
1193
+ test_skill(),
1194
+ test_provider_meta(),
1195
+ );
1196
+ let output;
1197
+ if (result instanceof Ok) {
1198
+ output = result[0];
1199
+ } else {
1200
+ throw makeError(
1201
+ "let_assert",
1202
+ FILEPATH,
1203
+ "template_test",
1204
+ 473,
1205
+ "context_includes_top_level_fields_test",
1206
+ "Pattern match failed, no pattern matched the value.",
1207
+ {
1208
+ value: result,
1209
+ start: 13692,
1210
+ end: 13722,
1211
+ pattern_start: 13703,
1212
+ pattern_end: 13713
1213
+ }
1214
+ )
1215
+ }
1216
+ $should.be_true($string.contains(output, "test-skill"));
1217
+ $should.be_true($string.contains(output, "1.0.0"));
1218
+ return $should.be_true($string.contains(output, "A test skill"));
1219
+ }
1220
+
1221
+ export function unclosed_if_block_fails_test() {
1222
+ let result = $template.render_template(
1223
+ "{{#if meta.emoji}}unclosed",
1224
+ new $types.OpenClaw(),
1225
+ test_skill(),
1226
+ test_provider_meta(),
1227
+ );
1228
+ return $should.be_error(result);
1229
+ }
1230
+
1231
+ export function unclosed_provider_block_fails_test() {
1232
+ let result = $template.render_template(
1233
+ "{{#if meta.emoji}}unclosed if and also {{unbalanced",
1234
+ new $types.OpenClaw(),
1235
+ test_skill(),
1236
+ test_provider_meta(),
1237
+ );
1238
+ return $should.be_error(result);
1239
+ }
1240
+
1241
+ export function unclosed_each_block_fails_test() {
1242
+ let result = $template.render_template(
1243
+ "{{#each config}}no closing tag",
1244
+ new $types.OpenClaw(),
1245
+ test_skill(),
1246
+ test_provider_meta(),
1247
+ );
1248
+ return $should.be_error(result);
1249
+ }
1250
+
1251
+ export function unclosed_unless_block_fails_test() {
1252
+ let result = $template.render_template(
1253
+ "{{#unless meta.emoji}}no closing tag",
1254
+ new $types.OpenClaw(),
1255
+ test_skill(),
1256
+ test_provider_meta(),
1257
+ );
1258
+ return $should.be_error(result);
1259
+ }
1260
+
1261
+ export function each_dependencies_test() {
1262
+ let _block;
1263
+ let _record = test_skill();
1264
+ _block = new Skill(
1265
+ _record.name,
1266
+ _record.description,
1267
+ _record.version,
1268
+ _record.license,
1269
+ _record.homepage,
1270
+ _record.repository,
1271
+ _record.metadata,
1272
+ toList([
1273
+ new $types.Dependency("helper-skill", assert_parse_vc("^1.0.0"), false),
1274
+ new $types.Dependency("extra-skill", assert_parse_vc("~2.0.0"), true),
1275
+ ]),
1276
+ _record.config,
1277
+ );
1278
+ let skill = _block;
1279
+ let result = $template.render_template(
1280
+ "{{#each dependencies}}{{this.name}}({{this.version}}) {{/each}}",
1281
+ new $types.OpenClaw(),
1282
+ skill,
1283
+ test_provider_meta(),
1284
+ );
1285
+ let output;
1286
+ if (result instanceof Ok) {
1287
+ output = result[0];
1288
+ } else {
1289
+ throw makeError(
1290
+ "let_assert",
1291
+ FILEPATH,
1292
+ "template_test",
1293
+ 555,
1294
+ "each_dependencies_test",
1295
+ "Pattern match failed, no pattern matched the value.",
1296
+ {
1297
+ value: result,
1298
+ start: 15985,
1299
+ end: 16015,
1300
+ pattern_start: 15996,
1301
+ pattern_end: 16006
1302
+ }
1303
+ )
1304
+ }
1305
+ $should.be_true($string.contains(output, "helper-skill(^1.0.0)"));
1306
+ return $should.be_true($string.contains(output, "extra-skill(~2.0.0)"));
1307
+ }
1308
+
1309
+ export function metadata_author_in_context_test() {
1310
+ let result = $template.render_template(
1311
+ "Author: {{metadata.author}}",
1312
+ new $types.OpenClaw(),
1313
+ test_skill(),
1314
+ test_provider_meta(),
1315
+ );
1316
+ let output;
1317
+ if (result instanceof Ok) {
1318
+ output = result[0];
1319
+ } else {
1320
+ throw makeError(
1321
+ "let_assert",
1322
+ FILEPATH,
1323
+ "template_test",
1324
+ 568,
1325
+ "metadata_author_in_context_test",
1326
+ "Pattern match failed, no pattern matched the value.",
1327
+ {
1328
+ value: result,
1329
+ start: 16353,
1330
+ end: 16383,
1331
+ pattern_start: 16364,
1332
+ pattern_end: 16374
1333
+ }
1334
+ )
1335
+ }
1336
+ return $should.be_true($string.contains(output, "Author: Test"));
1337
+ }
1338
+
1339
+ export function metadata_tags_in_context_test() {
1340
+ let _block;
1341
+ let _record = test_skill();
1342
+ _block = new Skill(
1343
+ _record.name,
1344
+ _record.description,
1345
+ _record.version,
1346
+ _record.license,
1347
+ _record.homepage,
1348
+ _record.repository,
1349
+ new Some(new SkillMetadata(new None(), new None(), toList(["web", "api"]))),
1350
+ _record.dependencies,
1351
+ _record.config,
1352
+ );
1353
+ let skill = _block;
1354
+ let result = $template.render_template(
1355
+ "{{#each metadata.tags}}{{this}} {{/each}}",
1356
+ new $types.OpenClaw(),
1357
+ skill,
1358
+ test_provider_meta(),
1359
+ );
1360
+ let output;
1361
+ if (result instanceof Ok) {
1362
+ output = result[0];
1363
+ } else {
1364
+ throw makeError(
1365
+ "let_assert",
1366
+ FILEPATH,
1367
+ "template_test",
1368
+ 587,
1369
+ "metadata_tags_in_context_test",
1370
+ "Pattern match failed, no pattern matched the value.",
1371
+ {
1372
+ value: result,
1373
+ start: 16816,
1374
+ end: 16846,
1375
+ pattern_start: 16827,
1376
+ pattern_end: 16837
1377
+ }
1378
+ )
1379
+ }
1380
+ $should.be_true($string.contains(output, "web"));
1381
+ return $should.be_true($string.contains(output, "api"));
1382
+ }
1383
+
1384
+ export function template_error_has_line_number_test() {
1385
+ let result = $template.render_template(
1386
+ "line 1\nline 2\n{{#if meta.emoji}}unclosed",
1387
+ new $types.OpenClaw(),
1388
+ test_skill(),
1389
+ test_provider_meta(),
1390
+ );
1391
+ $should.be_error(result);
1392
+ let line;
1393
+ let msg;
1394
+ if (result instanceof Error) {
1395
+ let $ = result[0];
1396
+ if ($ instanceof $error.TemplateError) {
1397
+ line = $.line;
1398
+ msg = $.message;
1399
+ } else {
1400
+ throw makeError(
1401
+ "let_assert",
1402
+ FILEPATH,
1403
+ "template_test",
1404
+ 606,
1405
+ "template_error_has_line_number_test",
1406
+ "Pattern match failed, no pattern matched the value.",
1407
+ {
1408
+ value: result,
1409
+ start: 17437,
1410
+ end: 17494,
1411
+ pattern_start: 17448,
1412
+ pattern_end: 17485
1413
+ }
1414
+ )
1415
+ }
1416
+ } else {
1417
+ throw makeError(
1418
+ "let_assert",
1419
+ FILEPATH,
1420
+ "template_test",
1421
+ 606,
1422
+ "template_error_has_line_number_test",
1423
+ "Pattern match failed, no pattern matched the value.",
1424
+ {
1425
+ value: result,
1426
+ start: 17437,
1427
+ end: 17494,
1428
+ pattern_start: 17448,
1429
+ pattern_end: 17485
1430
+ }
1431
+ )
1432
+ }
1433
+ $should.equal(line, 3);
1434
+ return $should.be_true($string.contains(msg, "Unclosed"));
1435
+ }
1436
+
1437
+ export function unbalanced_tag_error_has_line_number_test() {
1438
+ let result = $template.render_template(
1439
+ "line 1\nline 2\nline 3\n{{unbalanced",
1440
+ new $types.OpenClaw(),
1441
+ test_skill(),
1442
+ test_provider_meta(),
1443
+ );
1444
+ $should.be_error(result);
1445
+ let line;
1446
+ if (result instanceof Error) {
1447
+ let $ = result[0];
1448
+ if ($ instanceof $error.TemplateError) {
1449
+ line = $.line;
1450
+ } else {
1451
+ throw makeError(
1452
+ "let_assert",
1453
+ FILEPATH,
1454
+ "template_test",
1455
+ 620,
1456
+ "unbalanced_tag_error_has_line_number_test",
1457
+ "Pattern match failed, no pattern matched the value.",
1458
+ {
1459
+ value: result,
1460
+ start: 17821,
1461
+ end: 17879,
1462
+ pattern_start: 17832,
1463
+ pattern_end: 17870
1464
+ }
1465
+ )
1466
+ }
1467
+ } else {
1468
+ throw makeError(
1469
+ "let_assert",
1470
+ FILEPATH,
1471
+ "template_test",
1472
+ 620,
1473
+ "unbalanced_tag_error_has_line_number_test",
1474
+ "Pattern match failed, no pattern matched the value.",
1475
+ {
1476
+ value: result,
1477
+ start: 17821,
1478
+ end: 17879,
1479
+ pattern_start: 17832,
1480
+ pattern_end: 17870
1481
+ }
1482
+ )
1483
+ }
1484
+ return $should.equal(line, 4);
1485
+ }
1486
+
1487
+ export function unless_with_truthy_value_excludes_content_test() {
1488
+ let result = $template.render_template(
1489
+ "before{{#unless meta.emoji}}hidden{{/unless}}after",
1490
+ new $types.OpenClaw(),
1491
+ test_skill(),
1492
+ test_provider_meta(),
1493
+ );
1494
+ let output;
1495
+ if (result instanceof Ok) {
1496
+ output = result[0];
1497
+ } else {
1498
+ throw makeError(
1499
+ "let_assert",
1500
+ FILEPATH,
1501
+ "template_test",
1502
+ 645,
1503
+ "unless_with_truthy_value_excludes_content_test",
1504
+ "Pattern match failed, no pattern matched the value.",
1505
+ {
1506
+ value: result,
1507
+ start: 18719,
1508
+ end: 18749,
1509
+ pattern_start: 18730,
1510
+ pattern_end: 18740
1511
+ }
1512
+ )
1513
+ }
1514
+ return $should.equal(output, "beforeafter");
1515
+ }
1516
+
1517
+ export function if_with_empty_list_is_falsy_test() {
1518
+ let _block;
1519
+ let _record = test_skill();
1520
+ _block = new Skill(
1521
+ _record.name,
1522
+ _record.description,
1523
+ _record.version,
1524
+ _record.license,
1525
+ _record.homepage,
1526
+ _record.repository,
1527
+ _record.metadata,
1528
+ toList([]),
1529
+ toList([]),
1530
+ );
1531
+ let skill = _block;
1532
+ let result = $template.render_template(
1533
+ "before{{#if config}}shown{{/if}}after",
1534
+ new $types.OpenClaw(),
1535
+ skill,
1536
+ test_provider_meta(),
1537
+ );
1538
+ let output;
1539
+ if (result instanceof Ok) {
1540
+ output = result[0];
1541
+ } else {
1542
+ throw makeError(
1543
+ "let_assert",
1544
+ FILEPATH,
1545
+ "template_test",
1546
+ 672,
1547
+ "if_with_empty_list_is_falsy_test",
1548
+ "Pattern match failed, no pattern matched the value.",
1549
+ {
1550
+ value: result,
1551
+ start: 19475,
1552
+ end: 19505,
1553
+ pattern_start: 19486,
1554
+ pattern_end: 19496
1555
+ }
1556
+ )
1557
+ }
1558
+ return $should.equal(output, "beforeafter");
1559
+ }
1560
+
1561
+ export function each_with_simple_string_items_test() {
1562
+ let result = $template.render_template(
1563
+ "{{#each metadata.tags}}[{{this}}]{{/each}}",
1564
+ new $types.OpenClaw(),
1565
+ (() => {
1566
+ let _record = test_skill();
1567
+ return new Skill(
1568
+ _record.name,
1569
+ _record.description,
1570
+ _record.version,
1571
+ _record.license,
1572
+ _record.homepage,
1573
+ _record.repository,
1574
+ new Some(
1575
+ new SkillMetadata(
1576
+ new None(),
1577
+ new None(),
1578
+ toList(["web", "api", "test"]),
1579
+ ),
1580
+ ),
1581
+ _record.dependencies,
1582
+ _record.config,
1583
+ );
1584
+ })(),
1585
+ test_provider_meta(),
1586
+ );
1587
+ let output;
1588
+ if (result instanceof Ok) {
1589
+ output = result[0];
1590
+ } else {
1591
+ throw makeError(
1592
+ "let_assert",
1593
+ FILEPATH,
1594
+ "template_test",
1595
+ 694,
1596
+ "each_with_simple_string_items_test",
1597
+ "Pattern match failed, no pattern matched the value.",
1598
+ {
1599
+ value: result,
1600
+ start: 20021,
1601
+ end: 20051,
1602
+ pattern_start: 20032,
1603
+ pattern_end: 20042
1604
+ }
1605
+ )
1606
+ }
1607
+ return $should.equal(output, "[web][api][test]");
1608
+ }
1609
+
1610
+ export function undefined_deep_nested_path_resolves_empty_test() {
1611
+ let result = $template.render_template(
1612
+ "before{{a.b.c.d}}after",
1613
+ new $types.OpenClaw(),
1614
+ test_skill(),
1615
+ test_provider_meta(),
1616
+ );
1617
+ let output;
1618
+ if (result instanceof Ok) {
1619
+ output = result[0];
1620
+ } else {
1621
+ throw makeError(
1622
+ "let_assert",
1623
+ FILEPATH,
1624
+ "template_test",
1625
+ 706,
1626
+ "undefined_deep_nested_path_resolves_empty_test",
1627
+ "Pattern match failed, no pattern matched the value.",
1628
+ {
1629
+ value: result,
1630
+ start: 20311,
1631
+ end: 20341,
1632
+ pattern_start: 20322,
1633
+ pattern_end: 20332
1634
+ }
1635
+ )
1636
+ }
1637
+ return $should.equal(output, "beforeafter");
1638
+ }