@shapecraft/core 1.0.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 (584) hide show
  1. package/dist/cjs/common/array.d.ts +3 -0
  2. package/dist/cjs/common/array.d.ts.map +1 -0
  3. package/dist/cjs/common/array.js +17 -0
  4. package/dist/cjs/common/array.js.map +1 -0
  5. package/dist/cjs/common/index.d.ts +6 -0
  6. package/dist/cjs/common/index.d.ts.map +1 -0
  7. package/dist/cjs/common/index.js +22 -0
  8. package/dist/cjs/common/index.js.map +1 -0
  9. package/dist/cjs/common/is.d.ts +5 -0
  10. package/dist/cjs/common/is.d.ts.map +1 -0
  11. package/dist/cjs/common/is.js +36 -0
  12. package/dist/cjs/common/is.js.map +1 -0
  13. package/dist/cjs/common/object.d.ts +4 -0
  14. package/dist/cjs/common/object.d.ts.map +1 -0
  15. package/dist/cjs/common/object.js +20 -0
  16. package/dist/cjs/common/object.js.map +1 -0
  17. package/dist/cjs/common/phantom.d.ts +2 -0
  18. package/dist/cjs/common/phantom.d.ts.map +1 -0
  19. package/dist/cjs/common/phantom.js +3 -0
  20. package/dist/cjs/common/phantom.js.map +1 -0
  21. package/dist/cjs/common/result.d.ts +22 -0
  22. package/dist/cjs/common/result.d.ts.map +1 -0
  23. package/dist/cjs/common/result.js +28 -0
  24. package/dist/cjs/common/result.js.map +1 -0
  25. package/dist/cjs/common/string.d.ts +3 -0
  26. package/dist/cjs/common/string.d.ts.map +1 -0
  27. package/dist/cjs/common/string.js +33 -0
  28. package/dist/cjs/common/string.js.map +1 -0
  29. package/dist/cjs/common/types.d.ts +14 -0
  30. package/dist/cjs/common/types.d.ts.map +1 -0
  31. package/dist/cjs/common/types.js +3 -0
  32. package/dist/cjs/common/types.js.map +1 -0
  33. package/dist/cjs/index.d.ts +2 -0
  34. package/dist/cjs/index.d.ts.map +1 -0
  35. package/dist/cjs/index.js +18 -0
  36. package/dist/cjs/index.js.map +1 -0
  37. package/dist/cjs/shape/annotate.d.ts +57 -0
  38. package/dist/cjs/shape/annotate.d.ts.map +1 -0
  39. package/dist/cjs/shape/annotate.js +37 -0
  40. package/dist/cjs/shape/annotate.js.map +1 -0
  41. package/dist/cjs/shape/annotation.d.ts +39 -0
  42. package/dist/cjs/shape/annotation.d.ts.map +1 -0
  43. package/dist/cjs/shape/annotation.js +3 -0
  44. package/dist/cjs/shape/annotation.js.map +1 -0
  45. package/dist/cjs/shape/base.d.ts +33 -0
  46. package/dist/cjs/shape/base.d.ts.map +1 -0
  47. package/dist/cjs/shape/base.js +26 -0
  48. package/dist/cjs/shape/base.js.map +1 -0
  49. package/dist/cjs/shape/builder.d.ts +168 -0
  50. package/dist/cjs/shape/builder.d.ts.map +1 -0
  51. package/dist/cjs/shape/builder.js +156 -0
  52. package/dist/cjs/shape/builder.js.map +1 -0
  53. package/dist/cjs/shape/error.d.ts +5 -0
  54. package/dist/cjs/shape/error.d.ts.map +1 -0
  55. package/dist/cjs/shape/error.js +3 -0
  56. package/dist/cjs/shape/error.js.map +1 -0
  57. package/dist/cjs/shape/index.d.ts +4 -0
  58. package/dist/cjs/shape/index.d.ts.map +1 -0
  59. package/dist/cjs/shape/index.js +20 -0
  60. package/dist/cjs/shape/index.js.map +1 -0
  61. package/dist/cjs/shape/number.d.ts +8 -0
  62. package/dist/cjs/shape/number.d.ts.map +1 -0
  63. package/dist/cjs/shape/number.js +123 -0
  64. package/dist/cjs/shape/number.js.map +1 -0
  65. package/dist/cjs/shape/shape.d.ts +150 -0
  66. package/dist/cjs/shape/shape.d.ts.map +1 -0
  67. package/dist/cjs/shape/shape.js +158 -0
  68. package/dist/cjs/shape/shape.js.map +1 -0
  69. package/dist/cjs/shape/tags.d.ts +4 -0
  70. package/dist/cjs/shape/tags.d.ts.map +1 -0
  71. package/dist/cjs/shape/tags.js +3 -0
  72. package/dist/cjs/shape/tags.js.map +1 -0
  73. package/dist/cjs/shape/transforms/index.d.ts +4 -0
  74. package/dist/cjs/shape/transforms/index.d.ts.map +1 -0
  75. package/dist/cjs/shape/transforms/index.js +20 -0
  76. package/dist/cjs/shape/transforms/index.js.map +1 -0
  77. package/dist/cjs/shape/transforms/json-schema/index.d.ts +3 -0
  78. package/dist/cjs/shape/transforms/json-schema/index.d.ts.map +1 -0
  79. package/dist/cjs/shape/transforms/json-schema/index.js +19 -0
  80. package/dist/cjs/shape/transforms/json-schema/index.js.map +1 -0
  81. package/dist/cjs/shape/transforms/json-schema/transform.d.ts +5 -0
  82. package/dist/cjs/shape/transforms/json-schema/transform.d.ts.map +1 -0
  83. package/dist/cjs/shape/transforms/json-schema/transform.js +739 -0
  84. package/dist/cjs/shape/transforms/json-schema/transform.js.map +1 -0
  85. package/dist/cjs/shape/transforms/json-schema/types.d.ts +87 -0
  86. package/dist/cjs/shape/transforms/json-schema/types.d.ts.map +1 -0
  87. package/dist/cjs/shape/transforms/json-schema/types.js +3 -0
  88. package/dist/cjs/shape/transforms/json-schema/types.js.map +1 -0
  89. package/dist/cjs/shape/transforms/sql/dialects/dialect.d.ts +51 -0
  90. package/dist/cjs/shape/transforms/sql/dialects/dialect.d.ts.map +1 -0
  91. package/dist/cjs/shape/transforms/sql/dialects/dialect.js +8 -0
  92. package/dist/cjs/shape/transforms/sql/dialects/dialect.js.map +1 -0
  93. package/dist/cjs/shape/transforms/sql/dialects/index.d.ts +7 -0
  94. package/dist/cjs/shape/transforms/sql/dialects/index.d.ts.map +1 -0
  95. package/dist/cjs/shape/transforms/sql/dialects/index.js +19 -0
  96. package/dist/cjs/shape/transforms/sql/dialects/index.js.map +1 -0
  97. package/dist/cjs/shape/transforms/sql/dialects/postgres.d.ts +8 -0
  98. package/dist/cjs/shape/transforms/sql/dialects/postgres.d.ts.map +1 -0
  99. package/dist/cjs/shape/transforms/sql/dialects/postgres.js +374 -0
  100. package/dist/cjs/shape/transforms/sql/dialects/postgres.js.map +1 -0
  101. package/dist/cjs/shape/transforms/sql/dialects/sqlite.d.ts +3 -0
  102. package/dist/cjs/shape/transforms/sql/dialects/sqlite.d.ts.map +1 -0
  103. package/dist/cjs/shape/transforms/sql/dialects/sqlite.js +318 -0
  104. package/dist/cjs/shape/transforms/sql/dialects/sqlite.js.map +1 -0
  105. package/dist/cjs/shape/transforms/sql/from-sql.d.ts +5 -0
  106. package/dist/cjs/shape/transforms/sql/from-sql.d.ts.map +1 -0
  107. package/dist/cjs/shape/transforms/sql/from-sql.js +201 -0
  108. package/dist/cjs/shape/transforms/sql/from-sql.js.map +1 -0
  109. package/dist/cjs/shape/transforms/sql/index.d.ts +4 -0
  110. package/dist/cjs/shape/transforms/sql/index.d.ts.map +1 -0
  111. package/dist/cjs/shape/transforms/sql/index.js +20 -0
  112. package/dist/cjs/shape/transforms/sql/index.js.map +1 -0
  113. package/dist/cjs/shape/transforms/sql/options.d.ts +6 -0
  114. package/dist/cjs/shape/transforms/sql/options.d.ts.map +1 -0
  115. package/dist/cjs/shape/transforms/sql/options.js +6 -0
  116. package/dist/cjs/shape/transforms/sql/options.js.map +1 -0
  117. package/dist/cjs/shape/transforms/sql/parser/check-decoder.d.ts +25 -0
  118. package/dist/cjs/shape/transforms/sql/parser/check-decoder.d.ts.map +1 -0
  119. package/dist/cjs/shape/transforms/sql/parser/check-decoder.js +417 -0
  120. package/dist/cjs/shape/transforms/sql/parser/check-decoder.js.map +1 -0
  121. package/dist/cjs/shape/transforms/sql/parser/create-domain.d.ts +11 -0
  122. package/dist/cjs/shape/transforms/sql/parser/create-domain.d.ts.map +1 -0
  123. package/dist/cjs/shape/transforms/sql/parser/create-domain.js +95 -0
  124. package/dist/cjs/shape/transforms/sql/parser/create-domain.js.map +1 -0
  125. package/dist/cjs/shape/transforms/sql/parser/create-table.d.ts +28 -0
  126. package/dist/cjs/shape/transforms/sql/parser/create-table.d.ts.map +1 -0
  127. package/dist/cjs/shape/transforms/sql/parser/create-table.js +744 -0
  128. package/dist/cjs/shape/transforms/sql/parser/create-table.js.map +1 -0
  129. package/dist/cjs/shape/transforms/sql/parser/create-type.d.ts +23 -0
  130. package/dist/cjs/shape/transforms/sql/parser/create-type.d.ts.map +1 -0
  131. package/dist/cjs/shape/transforms/sql/parser/create-type.js +76 -0
  132. package/dist/cjs/shape/transforms/sql/parser/create-type.js.map +1 -0
  133. package/dist/cjs/shape/transforms/sql/parser/cursor.d.ts +32 -0
  134. package/dist/cjs/shape/transforms/sql/parser/cursor.d.ts.map +1 -0
  135. package/dist/cjs/shape/transforms/sql/parser/cursor.js +168 -0
  136. package/dist/cjs/shape/transforms/sql/parser/cursor.js.map +1 -0
  137. package/dist/cjs/shape/transforms/sql/parser/default-decoder.d.ts +10 -0
  138. package/dist/cjs/shape/transforms/sql/parser/default-decoder.d.ts.map +1 -0
  139. package/dist/cjs/shape/transforms/sql/parser/default-decoder.js +125 -0
  140. package/dist/cjs/shape/transforms/sql/parser/default-decoder.js.map +1 -0
  141. package/dist/cjs/shape/transforms/sql/parser/lexer.d.ts +14 -0
  142. package/dist/cjs/shape/transforms/sql/parser/lexer.d.ts.map +1 -0
  143. package/dist/cjs/shape/transforms/sql/parser/lexer.js +259 -0
  144. package/dist/cjs/shape/transforms/sql/parser/lexer.js.map +1 -0
  145. package/dist/cjs/shape/transforms/sql/parser/pg-types.d.ts +21 -0
  146. package/dist/cjs/shape/transforms/sql/parser/pg-types.d.ts.map +1 -0
  147. package/dist/cjs/shape/transforms/sql/parser/pg-types.js +213 -0
  148. package/dist/cjs/shape/transforms/sql/parser/pg-types.js.map +1 -0
  149. package/dist/cjs/shape/transforms/sql/parser/sqlite-types.d.ts +8 -0
  150. package/dist/cjs/shape/transforms/sql/parser/sqlite-types.d.ts.map +1 -0
  151. package/dist/cjs/shape/transforms/sql/parser/sqlite-types.js +93 -0
  152. package/dist/cjs/shape/transforms/sql/parser/sqlite-types.js.map +1 -0
  153. package/dist/cjs/shape/transforms/sql/parser/statements.d.ts +9 -0
  154. package/dist/cjs/shape/transforms/sql/parser/statements.d.ts.map +1 -0
  155. package/dist/cjs/shape/transforms/sql/parser/statements.js +158 -0
  156. package/dist/cjs/shape/transforms/sql/parser/statements.js.map +1 -0
  157. package/dist/cjs/shape/transforms/sql/parser/type-spec.d.ts +12 -0
  158. package/dist/cjs/shape/transforms/sql/parser/type-spec.d.ts.map +1 -0
  159. package/dist/cjs/shape/transforms/sql/parser/type-spec.js +136 -0
  160. package/dist/cjs/shape/transforms/sql/parser/type-spec.js.map +1 -0
  161. package/dist/cjs/shape/transforms/sql/transform.d.ts +5 -0
  162. package/dist/cjs/shape/transforms/sql/transform.d.ts.map +1 -0
  163. package/dist/cjs/shape/transforms/sql/transform.js +262 -0
  164. package/dist/cjs/shape/transforms/sql/transform.js.map +1 -0
  165. package/dist/cjs/shape/transforms/typescript/index.d.ts +2 -0
  166. package/dist/cjs/shape/transforms/typescript/index.d.ts.map +1 -0
  167. package/dist/cjs/shape/transforms/typescript/index.js +18 -0
  168. package/dist/cjs/shape/transforms/typescript/index.js.map +1 -0
  169. package/dist/cjs/shape/transforms/typescript/transform.d.ts +3 -0
  170. package/dist/cjs/shape/transforms/typescript/transform.d.ts.map +1 -0
  171. package/dist/cjs/shape/transforms/typescript/transform.js +190 -0
  172. package/dist/cjs/shape/transforms/typescript/transform.js.map +1 -0
  173. package/dist/cjs/shape/validate.d.ts +7 -0
  174. package/dist/cjs/shape/validate.d.ts.map +1 -0
  175. package/dist/cjs/shape/validate.js +360 -0
  176. package/dist/cjs/shape/validate.js.map +1 -0
  177. package/dist/esm/common/array.d.ts +3 -0
  178. package/dist/esm/common/array.d.ts.map +1 -0
  179. package/dist/esm/common/array.js +12 -0
  180. package/dist/esm/common/array.js.map +1 -0
  181. package/dist/esm/common/index.d.ts +6 -0
  182. package/dist/esm/common/index.d.ts.map +1 -0
  183. package/dist/esm/common/index.js +6 -0
  184. package/dist/esm/common/index.js.map +1 -0
  185. package/dist/esm/common/is.d.ts +5 -0
  186. package/dist/esm/common/is.d.ts.map +1 -0
  187. package/dist/esm/common/is.js +29 -0
  188. package/dist/esm/common/is.js.map +1 -0
  189. package/dist/esm/common/object.d.ts +4 -0
  190. package/dist/esm/common/object.d.ts.map +1 -0
  191. package/dist/esm/common/object.js +15 -0
  192. package/dist/esm/common/object.js.map +1 -0
  193. package/dist/esm/common/phantom.d.ts +2 -0
  194. package/dist/esm/common/phantom.d.ts.map +1 -0
  195. package/dist/esm/common/phantom.js +2 -0
  196. package/dist/esm/common/phantom.js.map +1 -0
  197. package/dist/esm/common/result.d.ts +22 -0
  198. package/dist/esm/common/result.d.ts.map +1 -0
  199. package/dist/esm/common/result.js +25 -0
  200. package/dist/esm/common/result.js.map +1 -0
  201. package/dist/esm/common/string.d.ts +3 -0
  202. package/dist/esm/common/string.d.ts.map +1 -0
  203. package/dist/esm/common/string.js +28 -0
  204. package/dist/esm/common/string.js.map +1 -0
  205. package/dist/esm/common/types.d.ts +14 -0
  206. package/dist/esm/common/types.d.ts.map +1 -0
  207. package/dist/esm/common/types.js +2 -0
  208. package/dist/esm/common/types.js.map +1 -0
  209. package/dist/esm/index.d.ts +2 -0
  210. package/dist/esm/index.d.ts.map +1 -0
  211. package/dist/esm/index.js +2 -0
  212. package/dist/esm/index.js.map +1 -0
  213. package/dist/esm/shape/annotate.d.ts +57 -0
  214. package/dist/esm/shape/annotate.d.ts.map +1 -0
  215. package/dist/esm/shape/annotate.js +34 -0
  216. package/dist/esm/shape/annotate.js.map +1 -0
  217. package/dist/esm/shape/annotation.d.ts +39 -0
  218. package/dist/esm/shape/annotation.d.ts.map +1 -0
  219. package/dist/esm/shape/annotation.js +2 -0
  220. package/dist/esm/shape/annotation.js.map +1 -0
  221. package/dist/esm/shape/base.d.ts +33 -0
  222. package/dist/esm/shape/base.d.ts.map +1 -0
  223. package/dist/esm/shape/base.js +20 -0
  224. package/dist/esm/shape/base.js.map +1 -0
  225. package/dist/esm/shape/builder.d.ts +168 -0
  226. package/dist/esm/shape/builder.d.ts.map +1 -0
  227. package/dist/esm/shape/builder.js +146 -0
  228. package/dist/esm/shape/builder.js.map +1 -0
  229. package/dist/esm/shape/error.d.ts +5 -0
  230. package/dist/esm/shape/error.d.ts.map +1 -0
  231. package/dist/esm/shape/error.js +2 -0
  232. package/dist/esm/shape/error.js.map +1 -0
  233. package/dist/esm/shape/index.d.ts +4 -0
  234. package/dist/esm/shape/index.d.ts.map +1 -0
  235. package/dist/esm/shape/index.js +4 -0
  236. package/dist/esm/shape/index.js.map +1 -0
  237. package/dist/esm/shape/number.d.ts +8 -0
  238. package/dist/esm/shape/number.d.ts.map +1 -0
  239. package/dist/esm/shape/number.js +114 -0
  240. package/dist/esm/shape/number.js.map +1 -0
  241. package/dist/esm/shape/shape.d.ts +150 -0
  242. package/dist/esm/shape/shape.d.ts.map +1 -0
  243. package/dist/esm/shape/shape.js +121 -0
  244. package/dist/esm/shape/shape.js.map +1 -0
  245. package/dist/esm/shape/tags.d.ts +4 -0
  246. package/dist/esm/shape/tags.d.ts.map +1 -0
  247. package/dist/esm/shape/tags.js +2 -0
  248. package/dist/esm/shape/tags.js.map +1 -0
  249. package/dist/esm/shape/transforms/index.d.ts +4 -0
  250. package/dist/esm/shape/transforms/index.d.ts.map +1 -0
  251. package/dist/esm/shape/transforms/index.js +4 -0
  252. package/dist/esm/shape/transforms/index.js.map +1 -0
  253. package/dist/esm/shape/transforms/json-schema/index.d.ts +3 -0
  254. package/dist/esm/shape/transforms/json-schema/index.d.ts.map +1 -0
  255. package/dist/esm/shape/transforms/json-schema/index.js +3 -0
  256. package/dist/esm/shape/transforms/json-schema/index.js.map +1 -0
  257. package/dist/esm/shape/transforms/json-schema/transform.d.ts +5 -0
  258. package/dist/esm/shape/transforms/json-schema/transform.d.ts.map +1 -0
  259. package/dist/esm/shape/transforms/json-schema/transform.js +734 -0
  260. package/dist/esm/shape/transforms/json-schema/transform.js.map +1 -0
  261. package/dist/esm/shape/transforms/json-schema/types.d.ts +87 -0
  262. package/dist/esm/shape/transforms/json-schema/types.d.ts.map +1 -0
  263. package/dist/esm/shape/transforms/json-schema/types.js +2 -0
  264. package/dist/esm/shape/transforms/json-schema/types.js.map +1 -0
  265. package/dist/esm/shape/transforms/sql/dialects/dialect.d.ts +51 -0
  266. package/dist/esm/shape/transforms/sql/dialects/dialect.d.ts.map +1 -0
  267. package/dist/esm/shape/transforms/sql/dialects/dialect.js +3 -0
  268. package/dist/esm/shape/transforms/sql/dialects/dialect.js.map +1 -0
  269. package/dist/esm/shape/transforms/sql/dialects/index.d.ts +7 -0
  270. package/dist/esm/shape/transforms/sql/dialects/index.d.ts.map +1 -0
  271. package/dist/esm/shape/transforms/sql/dialects/index.js +12 -0
  272. package/dist/esm/shape/transforms/sql/dialects/index.js.map +1 -0
  273. package/dist/esm/shape/transforms/sql/dialects/postgres.d.ts +8 -0
  274. package/dist/esm/shape/transforms/sql/dialects/postgres.d.ts.map +1 -0
  275. package/dist/esm/shape/transforms/sql/dialects/postgres.js +370 -0
  276. package/dist/esm/shape/transforms/sql/dialects/postgres.js.map +1 -0
  277. package/dist/esm/shape/transforms/sql/dialects/sqlite.d.ts +3 -0
  278. package/dist/esm/shape/transforms/sql/dialects/sqlite.d.ts.map +1 -0
  279. package/dist/esm/shape/transforms/sql/dialects/sqlite.js +315 -0
  280. package/dist/esm/shape/transforms/sql/dialects/sqlite.js.map +1 -0
  281. package/dist/esm/shape/transforms/sql/from-sql.d.ts +5 -0
  282. package/dist/esm/shape/transforms/sql/from-sql.d.ts.map +1 -0
  283. package/dist/esm/shape/transforms/sql/from-sql.js +197 -0
  284. package/dist/esm/shape/transforms/sql/from-sql.js.map +1 -0
  285. package/dist/esm/shape/transforms/sql/index.d.ts +4 -0
  286. package/dist/esm/shape/transforms/sql/index.d.ts.map +1 -0
  287. package/dist/esm/shape/transforms/sql/index.js +4 -0
  288. package/dist/esm/shape/transforms/sql/index.js.map +1 -0
  289. package/dist/esm/shape/transforms/sql/options.d.ts +6 -0
  290. package/dist/esm/shape/transforms/sql/options.d.ts.map +1 -0
  291. package/dist/esm/shape/transforms/sql/options.js +2 -0
  292. package/dist/esm/shape/transforms/sql/options.js.map +1 -0
  293. package/dist/esm/shape/transforms/sql/parser/check-decoder.d.ts +25 -0
  294. package/dist/esm/shape/transforms/sql/parser/check-decoder.d.ts.map +1 -0
  295. package/dist/esm/shape/transforms/sql/parser/check-decoder.js +412 -0
  296. package/dist/esm/shape/transforms/sql/parser/check-decoder.js.map +1 -0
  297. package/dist/esm/shape/transforms/sql/parser/create-domain.d.ts +11 -0
  298. package/dist/esm/shape/transforms/sql/parser/create-domain.d.ts.map +1 -0
  299. package/dist/esm/shape/transforms/sql/parser/create-domain.js +91 -0
  300. package/dist/esm/shape/transforms/sql/parser/create-domain.js.map +1 -0
  301. package/dist/esm/shape/transforms/sql/parser/create-table.d.ts +28 -0
  302. package/dist/esm/shape/transforms/sql/parser/create-table.d.ts.map +1 -0
  303. package/dist/esm/shape/transforms/sql/parser/create-table.js +740 -0
  304. package/dist/esm/shape/transforms/sql/parser/create-table.js.map +1 -0
  305. package/dist/esm/shape/transforms/sql/parser/create-type.d.ts +23 -0
  306. package/dist/esm/shape/transforms/sql/parser/create-type.d.ts.map +1 -0
  307. package/dist/esm/shape/transforms/sql/parser/create-type.js +72 -0
  308. package/dist/esm/shape/transforms/sql/parser/create-type.js.map +1 -0
  309. package/dist/esm/shape/transforms/sql/parser/cursor.d.ts +32 -0
  310. package/dist/esm/shape/transforms/sql/parser/cursor.d.ts.map +1 -0
  311. package/dist/esm/shape/transforms/sql/parser/cursor.js +163 -0
  312. package/dist/esm/shape/transforms/sql/parser/cursor.js.map +1 -0
  313. package/dist/esm/shape/transforms/sql/parser/default-decoder.d.ts +10 -0
  314. package/dist/esm/shape/transforms/sql/parser/default-decoder.d.ts.map +1 -0
  315. package/dist/esm/shape/transforms/sql/parser/default-decoder.js +121 -0
  316. package/dist/esm/shape/transforms/sql/parser/default-decoder.js.map +1 -0
  317. package/dist/esm/shape/transforms/sql/parser/lexer.d.ts +14 -0
  318. package/dist/esm/shape/transforms/sql/parser/lexer.d.ts.map +1 -0
  319. package/dist/esm/shape/transforms/sql/parser/lexer.js +253 -0
  320. package/dist/esm/shape/transforms/sql/parser/lexer.js.map +1 -0
  321. package/dist/esm/shape/transforms/sql/parser/pg-types.d.ts +21 -0
  322. package/dist/esm/shape/transforms/sql/parser/pg-types.d.ts.map +1 -0
  323. package/dist/esm/shape/transforms/sql/parser/pg-types.js +208 -0
  324. package/dist/esm/shape/transforms/sql/parser/pg-types.js.map +1 -0
  325. package/dist/esm/shape/transforms/sql/parser/sqlite-types.d.ts +8 -0
  326. package/dist/esm/shape/transforms/sql/parser/sqlite-types.d.ts.map +1 -0
  327. package/dist/esm/shape/transforms/sql/parser/sqlite-types.js +89 -0
  328. package/dist/esm/shape/transforms/sql/parser/sqlite-types.js.map +1 -0
  329. package/dist/esm/shape/transforms/sql/parser/statements.d.ts +9 -0
  330. package/dist/esm/shape/transforms/sql/parser/statements.d.ts.map +1 -0
  331. package/dist/esm/shape/transforms/sql/parser/statements.js +153 -0
  332. package/dist/esm/shape/transforms/sql/parser/statements.js.map +1 -0
  333. package/dist/esm/shape/transforms/sql/parser/type-spec.d.ts +12 -0
  334. package/dist/esm/shape/transforms/sql/parser/type-spec.d.ts.map +1 -0
  335. package/dist/esm/shape/transforms/sql/parser/type-spec.js +130 -0
  336. package/dist/esm/shape/transforms/sql/parser/type-spec.js.map +1 -0
  337. package/dist/esm/shape/transforms/sql/transform.d.ts +5 -0
  338. package/dist/esm/shape/transforms/sql/transform.d.ts.map +1 -0
  339. package/dist/esm/shape/transforms/sql/transform.js +258 -0
  340. package/dist/esm/shape/transforms/sql/transform.js.map +1 -0
  341. package/dist/esm/shape/transforms/typescript/index.d.ts +2 -0
  342. package/dist/esm/shape/transforms/typescript/index.d.ts.map +1 -0
  343. package/dist/esm/shape/transforms/typescript/index.js +2 -0
  344. package/dist/esm/shape/transforms/typescript/index.js.map +1 -0
  345. package/dist/esm/shape/transforms/typescript/transform.d.ts +3 -0
  346. package/dist/esm/shape/transforms/typescript/transform.d.ts.map +1 -0
  347. package/dist/esm/shape/transforms/typescript/transform.js +186 -0
  348. package/dist/esm/shape/transforms/typescript/transform.js.map +1 -0
  349. package/dist/esm/shape/validate.d.ts +7 -0
  350. package/dist/esm/shape/validate.d.ts.map +1 -0
  351. package/dist/esm/shape/validate.js +355 -0
  352. package/dist/esm/shape/validate.js.map +1 -0
  353. package/dist/esm/src/common/array.d.ts +3 -0
  354. package/dist/esm/src/common/array.d.ts.map +1 -0
  355. package/dist/esm/src/common/array.js +12 -0
  356. package/dist/esm/src/common/array.js.map +1 -0
  357. package/dist/esm/src/common/index.d.ts +6 -0
  358. package/dist/esm/src/common/index.d.ts.map +1 -0
  359. package/dist/esm/src/common/index.js +6 -0
  360. package/dist/esm/src/common/index.js.map +1 -0
  361. package/dist/esm/src/common/is.d.ts +5 -0
  362. package/dist/esm/src/common/is.d.ts.map +1 -0
  363. package/dist/esm/src/common/is.js +29 -0
  364. package/dist/esm/src/common/is.js.map +1 -0
  365. package/dist/esm/src/common/object.d.ts +4 -0
  366. package/dist/esm/src/common/object.d.ts.map +1 -0
  367. package/dist/esm/src/common/object.js +15 -0
  368. package/dist/esm/src/common/object.js.map +1 -0
  369. package/dist/esm/src/common/phantom.d.ts +2 -0
  370. package/dist/esm/src/common/phantom.d.ts.map +1 -0
  371. package/dist/esm/src/common/phantom.js +2 -0
  372. package/dist/esm/src/common/phantom.js.map +1 -0
  373. package/dist/esm/src/common/result.d.ts +22 -0
  374. package/dist/esm/src/common/result.d.ts.map +1 -0
  375. package/dist/esm/src/common/result.js +25 -0
  376. package/dist/esm/src/common/result.js.map +1 -0
  377. package/dist/esm/src/common/string.d.ts +3 -0
  378. package/dist/esm/src/common/string.d.ts.map +1 -0
  379. package/dist/esm/src/common/string.js +28 -0
  380. package/dist/esm/src/common/string.js.map +1 -0
  381. package/dist/esm/src/common/types.d.ts +14 -0
  382. package/dist/esm/src/common/types.d.ts.map +1 -0
  383. package/dist/esm/src/common/types.js +2 -0
  384. package/dist/esm/src/common/types.js.map +1 -0
  385. package/dist/esm/src/index.d.ts +2 -0
  386. package/dist/esm/src/index.d.ts.map +1 -0
  387. package/dist/esm/src/index.js +2 -0
  388. package/dist/esm/src/index.js.map +1 -0
  389. package/dist/esm/src/shape/annotate.d.ts +57 -0
  390. package/dist/esm/src/shape/annotate.d.ts.map +1 -0
  391. package/dist/esm/src/shape/annotate.js +34 -0
  392. package/dist/esm/src/shape/annotate.js.map +1 -0
  393. package/dist/esm/src/shape/annotation.d.ts +39 -0
  394. package/dist/esm/src/shape/annotation.d.ts.map +1 -0
  395. package/dist/esm/src/shape/annotation.js +2 -0
  396. package/dist/esm/src/shape/annotation.js.map +1 -0
  397. package/dist/esm/src/shape/base.d.ts +33 -0
  398. package/dist/esm/src/shape/base.d.ts.map +1 -0
  399. package/dist/esm/src/shape/base.js +20 -0
  400. package/dist/esm/src/shape/base.js.map +1 -0
  401. package/dist/esm/src/shape/builder.d.ts +168 -0
  402. package/dist/esm/src/shape/builder.d.ts.map +1 -0
  403. package/dist/esm/src/shape/builder.js +146 -0
  404. package/dist/esm/src/shape/builder.js.map +1 -0
  405. package/dist/esm/src/shape/error.d.ts +5 -0
  406. package/dist/esm/src/shape/error.d.ts.map +1 -0
  407. package/dist/esm/src/shape/error.js +2 -0
  408. package/dist/esm/src/shape/error.js.map +1 -0
  409. package/dist/esm/src/shape/index.d.ts +4 -0
  410. package/dist/esm/src/shape/index.d.ts.map +1 -0
  411. package/dist/esm/src/shape/index.js +4 -0
  412. package/dist/esm/src/shape/index.js.map +1 -0
  413. package/dist/esm/src/shape/number.d.ts +8 -0
  414. package/dist/esm/src/shape/number.d.ts.map +1 -0
  415. package/dist/esm/src/shape/number.js +114 -0
  416. package/dist/esm/src/shape/number.js.map +1 -0
  417. package/dist/esm/src/shape/shape.d.ts +150 -0
  418. package/dist/esm/src/shape/shape.d.ts.map +1 -0
  419. package/dist/esm/src/shape/shape.js +121 -0
  420. package/dist/esm/src/shape/shape.js.map +1 -0
  421. package/dist/esm/src/shape/tags.d.ts +4 -0
  422. package/dist/esm/src/shape/tags.d.ts.map +1 -0
  423. package/dist/esm/src/shape/tags.js +2 -0
  424. package/dist/esm/src/shape/tags.js.map +1 -0
  425. package/dist/esm/src/shape/transforms/index.d.ts +4 -0
  426. package/dist/esm/src/shape/transforms/index.d.ts.map +1 -0
  427. package/dist/esm/src/shape/transforms/index.js +4 -0
  428. package/dist/esm/src/shape/transforms/index.js.map +1 -0
  429. package/dist/esm/src/shape/transforms/json-schema/index.d.ts +3 -0
  430. package/dist/esm/src/shape/transforms/json-schema/index.d.ts.map +1 -0
  431. package/dist/esm/src/shape/transforms/json-schema/index.js +3 -0
  432. package/dist/esm/src/shape/transforms/json-schema/index.js.map +1 -0
  433. package/dist/esm/src/shape/transforms/json-schema/transform.d.ts +5 -0
  434. package/dist/esm/src/shape/transforms/json-schema/transform.d.ts.map +1 -0
  435. package/dist/esm/src/shape/transforms/json-schema/transform.js +734 -0
  436. package/dist/esm/src/shape/transforms/json-schema/transform.js.map +1 -0
  437. package/dist/esm/src/shape/transforms/json-schema/types.d.ts +87 -0
  438. package/dist/esm/src/shape/transforms/json-schema/types.d.ts.map +1 -0
  439. package/dist/esm/src/shape/transforms/json-schema/types.js +2 -0
  440. package/dist/esm/src/shape/transforms/json-schema/types.js.map +1 -0
  441. package/dist/esm/src/shape/transforms/sql/dialects/dialect.d.ts +51 -0
  442. package/dist/esm/src/shape/transforms/sql/dialects/dialect.d.ts.map +1 -0
  443. package/dist/esm/src/shape/transforms/sql/dialects/dialect.js +3 -0
  444. package/dist/esm/src/shape/transforms/sql/dialects/dialect.js.map +1 -0
  445. package/dist/esm/src/shape/transforms/sql/dialects/index.d.ts +7 -0
  446. package/dist/esm/src/shape/transforms/sql/dialects/index.d.ts.map +1 -0
  447. package/dist/esm/src/shape/transforms/sql/dialects/index.js +12 -0
  448. package/dist/esm/src/shape/transforms/sql/dialects/index.js.map +1 -0
  449. package/dist/esm/src/shape/transforms/sql/dialects/postgres.d.ts +8 -0
  450. package/dist/esm/src/shape/transforms/sql/dialects/postgres.d.ts.map +1 -0
  451. package/dist/esm/src/shape/transforms/sql/dialects/postgres.js +370 -0
  452. package/dist/esm/src/shape/transforms/sql/dialects/postgres.js.map +1 -0
  453. package/dist/esm/src/shape/transforms/sql/dialects/sqlite.d.ts +3 -0
  454. package/dist/esm/src/shape/transforms/sql/dialects/sqlite.d.ts.map +1 -0
  455. package/dist/esm/src/shape/transforms/sql/dialects/sqlite.js +315 -0
  456. package/dist/esm/src/shape/transforms/sql/dialects/sqlite.js.map +1 -0
  457. package/dist/esm/src/shape/transforms/sql/from-sql.d.ts +5 -0
  458. package/dist/esm/src/shape/transforms/sql/from-sql.d.ts.map +1 -0
  459. package/dist/esm/src/shape/transforms/sql/from-sql.js +197 -0
  460. package/dist/esm/src/shape/transforms/sql/from-sql.js.map +1 -0
  461. package/dist/esm/src/shape/transforms/sql/index.d.ts +4 -0
  462. package/dist/esm/src/shape/transforms/sql/index.d.ts.map +1 -0
  463. package/dist/esm/src/shape/transforms/sql/index.js +4 -0
  464. package/dist/esm/src/shape/transforms/sql/index.js.map +1 -0
  465. package/dist/esm/src/shape/transforms/sql/options.d.ts +6 -0
  466. package/dist/esm/src/shape/transforms/sql/options.d.ts.map +1 -0
  467. package/dist/esm/src/shape/transforms/sql/options.js +2 -0
  468. package/dist/esm/src/shape/transforms/sql/options.js.map +1 -0
  469. package/dist/esm/src/shape/transforms/sql/parser/check-decoder.d.ts +25 -0
  470. package/dist/esm/src/shape/transforms/sql/parser/check-decoder.d.ts.map +1 -0
  471. package/dist/esm/src/shape/transforms/sql/parser/check-decoder.js +412 -0
  472. package/dist/esm/src/shape/transforms/sql/parser/check-decoder.js.map +1 -0
  473. package/dist/esm/src/shape/transforms/sql/parser/create-domain.d.ts +11 -0
  474. package/dist/esm/src/shape/transforms/sql/parser/create-domain.d.ts.map +1 -0
  475. package/dist/esm/src/shape/transforms/sql/parser/create-domain.js +91 -0
  476. package/dist/esm/src/shape/transforms/sql/parser/create-domain.js.map +1 -0
  477. package/dist/esm/src/shape/transforms/sql/parser/create-table.d.ts +28 -0
  478. package/dist/esm/src/shape/transforms/sql/parser/create-table.d.ts.map +1 -0
  479. package/dist/esm/src/shape/transforms/sql/parser/create-table.js +740 -0
  480. package/dist/esm/src/shape/transforms/sql/parser/create-table.js.map +1 -0
  481. package/dist/esm/src/shape/transforms/sql/parser/create-type.d.ts +23 -0
  482. package/dist/esm/src/shape/transforms/sql/parser/create-type.d.ts.map +1 -0
  483. package/dist/esm/src/shape/transforms/sql/parser/create-type.js +72 -0
  484. package/dist/esm/src/shape/transforms/sql/parser/create-type.js.map +1 -0
  485. package/dist/esm/src/shape/transforms/sql/parser/cursor.d.ts +32 -0
  486. package/dist/esm/src/shape/transforms/sql/parser/cursor.d.ts.map +1 -0
  487. package/dist/esm/src/shape/transforms/sql/parser/cursor.js +163 -0
  488. package/dist/esm/src/shape/transforms/sql/parser/cursor.js.map +1 -0
  489. package/dist/esm/src/shape/transforms/sql/parser/default-decoder.d.ts +10 -0
  490. package/dist/esm/src/shape/transforms/sql/parser/default-decoder.d.ts.map +1 -0
  491. package/dist/esm/src/shape/transforms/sql/parser/default-decoder.js +121 -0
  492. package/dist/esm/src/shape/transforms/sql/parser/default-decoder.js.map +1 -0
  493. package/dist/esm/src/shape/transforms/sql/parser/lexer.d.ts +14 -0
  494. package/dist/esm/src/shape/transforms/sql/parser/lexer.d.ts.map +1 -0
  495. package/dist/esm/src/shape/transforms/sql/parser/lexer.js +253 -0
  496. package/dist/esm/src/shape/transforms/sql/parser/lexer.js.map +1 -0
  497. package/dist/esm/src/shape/transforms/sql/parser/pg-types.d.ts +21 -0
  498. package/dist/esm/src/shape/transforms/sql/parser/pg-types.d.ts.map +1 -0
  499. package/dist/esm/src/shape/transforms/sql/parser/pg-types.js +208 -0
  500. package/dist/esm/src/shape/transforms/sql/parser/pg-types.js.map +1 -0
  501. package/dist/esm/src/shape/transforms/sql/parser/sqlite-types.d.ts +8 -0
  502. package/dist/esm/src/shape/transforms/sql/parser/sqlite-types.d.ts.map +1 -0
  503. package/dist/esm/src/shape/transforms/sql/parser/sqlite-types.js +89 -0
  504. package/dist/esm/src/shape/transforms/sql/parser/sqlite-types.js.map +1 -0
  505. package/dist/esm/src/shape/transforms/sql/parser/statements.d.ts +9 -0
  506. package/dist/esm/src/shape/transforms/sql/parser/statements.d.ts.map +1 -0
  507. package/dist/esm/src/shape/transforms/sql/parser/statements.js +153 -0
  508. package/dist/esm/src/shape/transforms/sql/parser/statements.js.map +1 -0
  509. package/dist/esm/src/shape/transforms/sql/parser/type-spec.d.ts +12 -0
  510. package/dist/esm/src/shape/transforms/sql/parser/type-spec.d.ts.map +1 -0
  511. package/dist/esm/src/shape/transforms/sql/parser/type-spec.js +130 -0
  512. package/dist/esm/src/shape/transforms/sql/parser/type-spec.js.map +1 -0
  513. package/dist/esm/src/shape/transforms/sql/transform.d.ts +5 -0
  514. package/dist/esm/src/shape/transforms/sql/transform.d.ts.map +1 -0
  515. package/dist/esm/src/shape/transforms/sql/transform.js +258 -0
  516. package/dist/esm/src/shape/transforms/sql/transform.js.map +1 -0
  517. package/dist/esm/src/shape/transforms/typescript/index.d.ts +2 -0
  518. package/dist/esm/src/shape/transforms/typescript/index.d.ts.map +1 -0
  519. package/dist/esm/src/shape/transforms/typescript/index.js +2 -0
  520. package/dist/esm/src/shape/transforms/typescript/index.js.map +1 -0
  521. package/dist/esm/src/shape/transforms/typescript/transform.d.ts +3 -0
  522. package/dist/esm/src/shape/transforms/typescript/transform.d.ts.map +1 -0
  523. package/dist/esm/src/shape/transforms/typescript/transform.js +186 -0
  524. package/dist/esm/src/shape/transforms/typescript/transform.js.map +1 -0
  525. package/dist/esm/src/shape/validate.d.ts +7 -0
  526. package/dist/esm/src/shape/validate.d.ts.map +1 -0
  527. package/dist/esm/src/shape/validate.js +355 -0
  528. package/dist/esm/src/shape/validate.js.map +1 -0
  529. package/package.json +40 -0
  530. package/src/common/array.test.ts +19 -0
  531. package/src/common/array.ts +15 -0
  532. package/src/common/index.ts +5 -0
  533. package/src/common/is.ts +23 -0
  534. package/src/common/object.ts +35 -0
  535. package/src/common/phantom.ts +1 -0
  536. package/src/common/result.ts +43 -0
  537. package/src/common/string.ts +28 -0
  538. package/src/common/types.ts +34 -0
  539. package/src/index.ts +1 -0
  540. package/src/shape/annotate.ts +139 -0
  541. package/src/shape/annotation.ts +47 -0
  542. package/src/shape/base.ts +71 -0
  543. package/src/shape/builder.test.ts +728 -0
  544. package/src/shape/builder.ts +475 -0
  545. package/src/shape/error.ts +4 -0
  546. package/src/shape/index.ts +3 -0
  547. package/src/shape/number.ts +118 -0
  548. package/src/shape/shape.test.ts +792 -0
  549. package/src/shape/shape.ts +377 -0
  550. package/src/shape/tags.ts +14 -0
  551. package/src/shape/transforms/index.ts +3 -0
  552. package/src/shape/transforms/json-schema/index.ts +2 -0
  553. package/src/shape/transforms/json-schema/transform.test.ts +850 -0
  554. package/src/shape/transforms/json-schema/transform.ts +882 -0
  555. package/src/shape/transforms/json-schema/types.ts +132 -0
  556. package/src/shape/transforms/sql/dialects/dialect.ts +89 -0
  557. package/src/shape/transforms/sql/dialects/index.ts +14 -0
  558. package/src/shape/transforms/sql/dialects/postgres.ts +392 -0
  559. package/src/shape/transforms/sql/dialects/sqlite.ts +333 -0
  560. package/src/shape/transforms/sql/from-sql.test.ts +704 -0
  561. package/src/shape/transforms/sql/from-sql.ts +210 -0
  562. package/src/shape/transforms/sql/index.ts +3 -0
  563. package/src/shape/transforms/sql/options.ts +6 -0
  564. package/src/shape/transforms/sql/parser/check-decoder.ts +457 -0
  565. package/src/shape/transforms/sql/parser/create-domain.ts +105 -0
  566. package/src/shape/transforms/sql/parser/create-table.ts +809 -0
  567. package/src/shape/transforms/sql/parser/create-type.ts +91 -0
  568. package/src/shape/transforms/sql/parser/cursor.ts +179 -0
  569. package/src/shape/transforms/sql/parser/default-decoder.ts +129 -0
  570. package/src/shape/transforms/sql/parser/lexer.ts +289 -0
  571. package/src/shape/transforms/sql/parser/pg-types.ts +247 -0
  572. package/src/shape/transforms/sql/parser/sqlite-types.ts +103 -0
  573. package/src/shape/transforms/sql/parser/statements.ts +127 -0
  574. package/src/shape/transforms/sql/parser/type-spec.ts +159 -0
  575. package/src/shape/transforms/sql/transform.sqlite.test.ts +448 -0
  576. package/src/shape/transforms/sql/transform.test.ts +880 -0
  577. package/src/shape/transforms/sql/transform.ts +295 -0
  578. package/src/shape/transforms/typescript/index.ts +1 -0
  579. package/src/shape/transforms/typescript/transform.ts +211 -0
  580. package/src/shape/tuple.test.ts +171 -0
  581. package/src/shape/validate.ts +413 -0
  582. package/tsconfig.cjs.json +11 -0
  583. package/tsconfig.esm.json +10 -0
  584. package/tsconfig.json +23 -0
@@ -0,0 +1,728 @@
1
+ import { describe, expect } from "vitest";
2
+ import { R } from "../common";
3
+ import { B } from "./builder";
4
+ import { ValidationError } from "./error";
5
+
6
+ function expectToBe<Input, Value extends Input>(
7
+ input: Input,
8
+ value: Value,
9
+ ): asserts input is Value {
10
+ return expect(input).toBe(value);
11
+ }
12
+
13
+ function expectOk<T>(
14
+ res: R.Result<T, ValidationError[]>,
15
+ ): asserts res is R.ResultOk<T> {
16
+ if (!res.ok) {
17
+ throw new Error(`expected ok, got err: ${JSON.stringify(res.error)}`);
18
+ }
19
+ }
20
+
21
+ function expectErr<T>(
22
+ res: R.Result<T, ValidationError[]>,
23
+ ): asserts res is R.ResultErr<ValidationError[]> {
24
+ if (res.ok) {
25
+ throw new Error(
26
+ `expected err, got ok with value: ${JSON.stringify(res.value)}`,
27
+ );
28
+ }
29
+ }
30
+
31
+ describe("B scalar constructors", (it) => {
32
+ it("builds primitive shapes with the correct type tag", () => {
33
+ expectToBe(B.string().shape.type, "string");
34
+ expectToBe(B.boolean().shape.type, "boolean");
35
+ expectToBe(B.notDefined().shape.type, "undefined");
36
+ expectToBe(B.date().shape.type, "date");
37
+ expectToBe(B.nil().shape.type, "nil");
38
+ expectToBe(B.unknown().shape.type, "unknown");
39
+ expectToBe(B.binary().shape.type, "binary");
40
+ });
41
+
42
+ it("exposes the shape type via the builder's `type` field", () => {
43
+ expectToBe(B.string().type, "string");
44
+ expectToBe(B.boolean().type, "boolean");
45
+ expectToBe(B.binary().type, "binary");
46
+ });
47
+
48
+ it("marks shapes as shape values with empty default annotations", () => {
49
+ const b = B.string();
50
+ expect(b.shape._shape).toBe(true);
51
+ expect(b.shape.anno).toEqual({});
52
+ });
53
+
54
+ it("attaches the matching number tag for each numeric builder", () => {
55
+ expectToBe(B.number().shape.tag, "number");
56
+ expectToBe(B.int().shape.tag, "int");
57
+ expectToBe(B.int8().shape.tag, "int8");
58
+ expectToBe(B.uint8().shape.tag, "uint8");
59
+ expectToBe(B.int16().shape.tag, "int16");
60
+ expectToBe(B.uint16().shape.tag, "uint16");
61
+ expectToBe(B.int32().shape.tag, "int32");
62
+ expectToBe(B.uint32().shape.tag, "uint32");
63
+ expectToBe(B.int64().shape.tag, "int64");
64
+ expectToBe(B.uint64().shape.tag, "uint64");
65
+ expectToBe(B.float().shape.tag, "float");
66
+ expectToBe(B.float32().shape.tag, "float32");
67
+ expectToBe(B.float64().shape.tag, "float64");
68
+ });
69
+ });
70
+
71
+ describe("B.literal", (it) => {
72
+ it("creates a literal string shape carrying its input value", () => {
73
+ const s = B.literal("foo").shape;
74
+ expectToBe(s.type, "string");
75
+ if (s.type !== "string") return;
76
+ expect(s.literal).toBe(true);
77
+ expect(s.input).toBe("foo");
78
+ });
79
+
80
+ it("creates a literal number shape carrying its input value", () => {
81
+ const s = B.literal(123).shape;
82
+ expectToBe(s.type, "number");
83
+ if (s.type !== "number") return;
84
+ expect(s.literal).toBe(true);
85
+ expect(s.input).toBe(123);
86
+ });
87
+
88
+ it("creates a literal boolean shape carrying its input value", () => {
89
+ const s = B.literal(true).shape;
90
+ expectToBe(s.type, "boolean");
91
+ if (s.type !== "boolean") return;
92
+ expect(s.literal).toBe(true);
93
+ expect(s.input).toBe(true);
94
+ });
95
+
96
+ it("throws when given a non-literal-eligible value", () => {
97
+ expect(() => B.literal(null as any)).toThrow();
98
+ });
99
+ });
100
+
101
+ describe("B container constructors", (it) => {
102
+ it("array stores the item shape on input", () => {
103
+ const item = B.string();
104
+ const s = B.array(item).shape;
105
+ expectToBe(s.type, "array");
106
+ expect(s.input).toBe(item.shape);
107
+ });
108
+
109
+ it("mapping stores the record of shapes on input", () => {
110
+ const a = B.number();
111
+ const b = B.string();
112
+ const s = B.mapping({ a, b }).shape;
113
+ expectToBe(s.type, "mapping");
114
+ expect(Object.keys(s.input).sort()).toEqual(["a", "b"]);
115
+ expect(s.input.a).toBe(a.shape);
116
+ expect(s.input.b).toBe(b.shape);
117
+ });
118
+
119
+ it("record stores its key/value shapes as a tuple on input", () => {
120
+ const k = B.string();
121
+ const v = B.number();
122
+ const s = B.record(k, v).shape;
123
+ expectToBe(s.type, "record");
124
+ expect(s.input[0]).toBe(k.shape);
125
+ expect(s.input[1]).toBe(v.shape);
126
+ });
127
+
128
+ it("vector defaults its format to a generic number shape", () => {
129
+ const s = B.vector(3).shape;
130
+ expectToBe(s.type, "vector");
131
+ expect(s.input.dims).toBe(3);
132
+ expectToBe(s.input.format.type, "number");
133
+ expectToBe(s.input.format.tag, "number");
134
+ });
135
+
136
+ it("vector accepts an explicit numeric format", () => {
137
+ const s = B.vector(4, B.float32()).shape;
138
+ expectToBe(s.type, "vector");
139
+ expect(s.input.dims).toBe(4);
140
+ expectToBe(s.input.format.tag, "float32");
141
+ });
142
+ });
143
+
144
+ describe("B.union", (it) => {
145
+ it("accepts variadic arguments", () => {
146
+ const a = B.string();
147
+ const b = B.number();
148
+ const s = B.union(a, b).shape;
149
+ expectToBe(s.type, "union");
150
+ expect(s.input).toEqual([a.shape, b.shape]);
151
+ });
152
+
153
+ it("supports a literal-string discriminator across variants", () => {
154
+ const s = B.union(B.literal("a"), B.literal("b")).shape;
155
+ expectToBe(s.type, "union");
156
+ expect(s.input).toHaveLength(2);
157
+ });
158
+ });
159
+
160
+ describe("builder annotation methods", (it) => {
161
+ it("optional() returns a new builder with anno.optional=true", () => {
162
+ const base = B.string();
163
+ const opt = base.optional();
164
+ expect(opt.shape.anno.optional).toBe(true);
165
+ expect(base.shape.anno).toEqual({});
166
+ expect(opt).not.toBe(base);
167
+ });
168
+
169
+ it("unique() returns a new builder with anno.unique=true", () => {
170
+ const base = B.string();
171
+ const uniq = base.unique();
172
+ expect(uniq.shape.anno.unique).toBe(true);
173
+ expect(base.shape.anno).toEqual({});
174
+ });
175
+
176
+ it("uniqueItems() on array builder sets anno.uniqueItems=true", () => {
177
+ const base = B.array(B.string());
178
+ const uniq = base.uniqueItems();
179
+ expect(uniq.shape.anno.uniqueItems).toBe(true);
180
+ expect(base.shape.anno).toEqual({});
181
+ });
182
+
183
+ it("primary() returns a new builder with anno.primary=true", () => {
184
+ const base = B.string();
185
+ const prim = base.primary();
186
+ expect(prim.shape.anno.primary).toBe(true);
187
+ expect(base.shape.anno).toEqual({});
188
+ });
189
+
190
+ it("chains optional + unique + primary into the same anno", () => {
191
+ const b = B.string().optional().unique().primary();
192
+ expect(b.shape.anno.optional).toBe(true);
193
+ expect(b.shape.anno.unique).toBe(true);
194
+ expect(b.shape.anno.primary).toBe(true);
195
+ });
196
+
197
+ it("preserves the underlying shape type after annotation", () => {
198
+ const item = B.string();
199
+ const arr = B.array(item).optional();
200
+ expectToBe(arr.shape.type, "array");
201
+ expect(arr.shape.input).toBe(item.shape);
202
+ });
203
+ });
204
+
205
+ describe("builder bound methods", (it) => {
206
+ it("min/max on a string builder set the annotation values", () => {
207
+ const b = B.string().min(2).max(4);
208
+ expect(b.shape.anno.min).toBe(2);
209
+ expect(b.shape.anno.max).toBe(4);
210
+ });
211
+
212
+ it("min/max on a number builder set the annotation values", () => {
213
+ const b = B.number().min(0).max(10);
214
+ expect(b.shape.anno.min).toBe(0);
215
+ expect(b.shape.anno.max).toBe(10);
216
+ });
217
+
218
+ it("min/max on an array builder set the annotation values", () => {
219
+ const b = B.array(B.string()).min(1).max(3);
220
+ expect(b.shape.anno.min).toBe(1);
221
+ expect(b.shape.anno.max).toBe(3);
222
+ });
223
+
224
+ it("regex() stores a RegExp pattern on the string anno", () => {
225
+ const pat = /^[a-z]+$/;
226
+ const b = B.string().regex(pat);
227
+ expect(b.shape.anno.pattern).toBe(pat);
228
+ });
229
+
230
+ it("regex() stores a string-source pattern on the string anno", () => {
231
+ const b = B.string().regex("^[A-Z]{3}$");
232
+ expect(b.shape.anno.pattern).toBe("^[A-Z]{3}$");
233
+ });
234
+ });
235
+
236
+ describe("builder.parse — scalars", (it) => {
237
+ it("accepts a string against a string builder", () => {
238
+ const res = B.string().parse("hello");
239
+ expectOk(res);
240
+ expect(res.value).toBe("hello");
241
+ });
242
+
243
+ it("rejects a non-string against a string builder", () => {
244
+ const res = B.string().parse(42);
245
+ expectErr(res);
246
+ expect(res.error).toHaveLength(1);
247
+ expect(res.error[0]!.path).toEqual([]);
248
+ expect(res.error[0]!.message).toMatch(/string/);
249
+ });
250
+
251
+ it("accepts boolean values against a boolean builder", () => {
252
+ expectOk(B.boolean().parse(true));
253
+ expectOk(B.boolean().parse(false));
254
+ });
255
+
256
+ it("rejects a non-castable non-boolean against a boolean builder", () => {
257
+ const res = B.boolean().parse("not-a-bool");
258
+ expectErr(res);
259
+ expect(res.error).toHaveLength(1);
260
+ expect(res.error[0]!.message).toMatch(/boolean/);
261
+ });
262
+
263
+ it("accepts null against a nil builder", () => {
264
+ expectOk(B.nil().parse(null));
265
+ });
266
+
267
+ it("rejects a non-null value against a nil builder", () => {
268
+ const res = B.nil().parse(0);
269
+ expectErr(res);
270
+ expect(res.error).toHaveLength(1);
271
+ expect(res.error[0]!.message).toMatch(/nil/);
272
+ });
273
+
274
+ it("accepts undefined against a notDefined builder", () => {
275
+ expectOk(B.notDefined().parse(undefined));
276
+ });
277
+
278
+ it("rejects a defined value against a notDefined builder", () => {
279
+ const res = B.notDefined().parse(null);
280
+ expectErr(res);
281
+ expect(res.error).toHaveLength(1);
282
+ });
283
+
284
+ it("accepts a Date against a date builder", () => {
285
+ expectOk(B.date().parse(new Date()));
286
+ });
287
+
288
+ it("rejects a non-Date against a date builder", () => {
289
+ const res = B.date().parse(true);
290
+ expectErr(res);
291
+ expect(res.error).toHaveLength(1);
292
+ expect(res.error[0]!.message).toMatch(/date/);
293
+ });
294
+
295
+ it("accepts any value against an unknown builder", () => {
296
+ expectOk(B.unknown().parse(1));
297
+ expectOk(B.unknown().parse("x"));
298
+ expectOk(B.unknown().parse(null));
299
+ expectOk(B.unknown().parse({ a: 1 }));
300
+ });
301
+ });
302
+
303
+ describe("builder.parse — numbers", (it) => {
304
+ it("accepts a number against a generic number builder", () => {
305
+ expectOk(B.number().parse(42));
306
+ expectOk(B.number().parse(-1.5));
307
+ });
308
+
309
+ it("rejects a non-numeric value against a number builder", () => {
310
+ const res = B.number().parse("foo");
311
+ expectErr(res);
312
+ expect(res.error).toHaveLength(1);
313
+ expect(res.error[0]!.message).toMatch(/number/);
314
+ });
315
+
316
+ it("auto-casts a numeric string against a number builder", () => {
317
+ const res = B.number().parse("42");
318
+ expectOk(res);
319
+ expect(res.value).toBe(42);
320
+ });
321
+
322
+ it("accepts a value that fits the requested integer tag", () => {
323
+ expectOk(B.uint8().parse(200));
324
+ expectOk(B.int16().parse(-1000));
325
+ });
326
+
327
+ it("rejects a value that exceeds the requested integer tag's range", () => {
328
+ const res = B.uint8().parse(0xffff);
329
+ expectErr(res);
330
+ expect(res.error).toHaveLength(1);
331
+ expect(res.error[0]!.message).toMatch(/format/);
332
+ });
333
+
334
+ it("rejects a float when an integer tag is required", () => {
335
+ const res = B.uint8().parse(0.5);
336
+ expectErr(res);
337
+ expect(res.error).toHaveLength(1);
338
+ expect(res.error[0]!.message).toMatch(/format/);
339
+ });
340
+
341
+ it("rejects an int against a float32 tag", () => {
342
+ const res = B.float32().parse(1);
343
+ expectErr(res);
344
+ expect(res.error).toHaveLength(1);
345
+ });
346
+
347
+ it("accepts a float that fits inside float32", () => {
348
+ expectOk(B.float32().parse(0.5));
349
+ });
350
+ });
351
+
352
+ describe("builder.parse — literals", (it) => {
353
+ it("accepts the matching literal string", () => {
354
+ expectOk(B.literal("foo").parse("foo"));
355
+ });
356
+
357
+ it("rejects a non-matching literal string", () => {
358
+ const res = B.literal("foo").parse("bar");
359
+ expectErr(res);
360
+ expect(res.error).toHaveLength(1);
361
+ expect(res.error[0]!.message).toMatch(/literal/);
362
+ });
363
+
364
+ it("accepts the matching literal number", () => {
365
+ expectOk(B.literal(7).parse(7));
366
+ });
367
+
368
+ it("rejects a non-matching literal number", () => {
369
+ const res = B.literal(7).parse(8);
370
+ expectErr(res);
371
+ expect(res.error).toHaveLength(1);
372
+ expect(res.error[0]!.message).toMatch(/literal/);
373
+ });
374
+
375
+ it("accepts the matching literal boolean", () => {
376
+ expectOk(B.literal(true).parse(true));
377
+ });
378
+
379
+ it("rejects a non-matching literal boolean", () => {
380
+ const res = B.literal(true).parse(false);
381
+ expectErr(res);
382
+ expect(res.error).toHaveLength(1);
383
+ expect(res.error[0]!.message).toMatch(/literal/);
384
+ });
385
+ });
386
+
387
+ describe("builder.parse — binary", (it) => {
388
+ it("accepts a Uint8Array against a binary builder", () => {
389
+ expectOk(B.binary().parse(new Uint8Array([1, 2, 3])));
390
+ });
391
+
392
+ it("accepts an array of uint8-fitting numbers against a binary builder", () => {
393
+ expectOk(B.binary().parse([0, 127, 255]));
394
+ });
395
+
396
+ it("rejects an array containing a non-uint8 value against a binary builder", () => {
397
+ const res = B.binary().parse([0, 256]);
398
+ expectErr(res);
399
+ expect(res.error.length).toBeGreaterThan(0);
400
+ expect(res.error[0]!.path).toEqual([1]);
401
+ });
402
+
403
+ it("rejects a non-array, non-Uint8Array against a binary builder", () => {
404
+ const res = B.binary().parse("not binary");
405
+ expectErr(res);
406
+ expect(res.error).toHaveLength(1);
407
+ expect(res.error[0]!.message).toMatch(/binary/);
408
+ });
409
+ });
410
+
411
+ describe("builder.parse — array", (it) => {
412
+ it("accepts an array whose items all match the item builder", () => {
413
+ expectOk(B.array(B.string()).parse(["a", "b"]));
414
+ });
415
+
416
+ it("accepts an empty array regardless of item builder", () => {
417
+ expectOk(B.array(B.string()).parse([]));
418
+ });
419
+
420
+ it("rejects a non-array, non-castable input", () => {
421
+ const res = B.array(B.string()).parse(42);
422
+ expectErr(res);
423
+ expect(res.error).toHaveLength(1);
424
+ expect(res.error[0]!.message).toMatch(/array/);
425
+ });
426
+
427
+ it("reports the index of an invalid item in the path", () => {
428
+ const res = B.array(B.string()).parse(["a", 1, "c"]);
429
+ expectErr(res);
430
+ expect(res.error.length).toBeGreaterThan(0);
431
+ expect(res.error[0]!.path).toEqual([1]);
432
+ });
433
+ });
434
+
435
+ describe("builder.parse — vector", (it) => {
436
+ it("accepts an array whose length matches dims and items fit the format", () => {
437
+ expectOk(B.vector(3, B.uint8()).parse([1, 2, 3]));
438
+ });
439
+
440
+ it("rejects a non-array input", () => {
441
+ const res = B.vector(3).parse(42);
442
+ expectErr(res);
443
+ expect(res.error).toHaveLength(1);
444
+ expect(res.error[0]!.message).toMatch(/vector/);
445
+ });
446
+
447
+ it("rejects a length mismatch", () => {
448
+ const res = B.vector(3).parse([1, 2]);
449
+ expectErr(res);
450
+ expect(res.error).toHaveLength(1);
451
+ expect(res.error[0]!.message).toMatch(/dimensions/);
452
+ });
453
+
454
+ it("reports the index of a format-mismatched item", () => {
455
+ const res = B.vector(3, B.uint8()).parse([1, 999, 3]);
456
+ expectErr(res);
457
+ expect(res.error.length).toBeGreaterThan(0);
458
+ expect(res.error[0]!.path).toEqual([1]);
459
+ });
460
+ });
461
+
462
+ describe("builder.parse — mapping", (it) => {
463
+ it("accepts an object where every required key validates", () => {
464
+ const b = B.mapping({ a: B.string(), b: B.number() });
465
+ expectOk(b.parse({ a: "x", b: 1 }));
466
+ });
467
+
468
+ it("rejects a non-object input", () => {
469
+ const b = B.mapping({ a: B.string() });
470
+ const res = b.parse(42);
471
+ expectErr(res);
472
+ expect(res.error).toHaveLength(1);
473
+ expect(res.error[0]!.message).toMatch(/mapping/);
474
+ });
475
+
476
+ it("rejects null against a mapping builder", () => {
477
+ const b = B.mapping({ a: B.string() });
478
+ const res = b.parse(null);
479
+ expectErr(res);
480
+ expect(res.error).toHaveLength(1);
481
+ expect(res.error[0]!.message).toMatch(/mapping/);
482
+ });
483
+
484
+ it("reports a missing required key with the key in the path", () => {
485
+ const b = B.mapping({ a: B.string(), b: B.number() });
486
+ const res = b.parse({ a: "x" });
487
+ expectErr(res);
488
+ expect(res.error).toHaveLength(1);
489
+ expect(res.error[0]!.path).toEqual(["b"]);
490
+ expect(res.error[0]!.message).toMatch(/Missing required key/);
491
+ });
492
+
493
+ it("allows a missing optional key", () => {
494
+ const b = B.mapping({ a: B.string(), b: B.number().optional() });
495
+ expectOk(b.parse({ a: "x" }));
496
+ });
497
+
498
+ it("reports value-shape errors with the key in the path", () => {
499
+ const b = B.mapping({ a: B.string(), b: B.number() });
500
+ const res = b.parse({ a: "x", b: true });
501
+ expectErr(res);
502
+ expect(res.error).toHaveLength(1);
503
+ expect(res.error[0]!.path).toEqual(["b"]);
504
+ });
505
+
506
+ it("walks the path into nested mappings", () => {
507
+ const b = B.mapping({
508
+ outer: B.mapping({ inner: B.number() }),
509
+ });
510
+ const res = b.parse({ outer: { inner: true } });
511
+ expectErr(res);
512
+ expect(res.error).toHaveLength(1);
513
+ expect(res.error[0]!.path).toEqual(["outer", "inner"]);
514
+ });
515
+ });
516
+
517
+ describe("builder.parse — record", (it) => {
518
+ it("accepts an object whose keys and values all validate", () => {
519
+ const b = B.record(B.string(), B.number());
520
+ expectOk(b.parse({ a: 1, b: 2 }));
521
+ });
522
+
523
+ it("rejects a non-object input", () => {
524
+ const b = B.record(B.string(), B.number());
525
+ const res = b.parse(1);
526
+ expectErr(res);
527
+ expect(res.error).toHaveLength(1);
528
+ expect(res.error[0]!.message).toMatch(/record/);
529
+ });
530
+
531
+ it("rejects null against a record builder", () => {
532
+ const b = B.record(B.string(), B.number());
533
+ const res = b.parse(null);
534
+ expectErr(res);
535
+ expect(res.error).toHaveLength(1);
536
+ });
537
+
538
+ it("reports a value-shape error with the key in the path", () => {
539
+ const b = B.record(B.string(), B.number());
540
+ const res = b.parse({ a: 1, b: true });
541
+ expectErr(res);
542
+ expect(res.error.length).toBeGreaterThan(0);
543
+ expect(res.error[0]!.path).toEqual(["b"]);
544
+ });
545
+
546
+ it("accepts an empty object", () => {
547
+ const b = B.record(B.string(), B.number());
548
+ expectOk(b.parse({}));
549
+ });
550
+ });
551
+
552
+ describe("builder.parse — union", (it) => {
553
+ it("accepts a value matching any variant", () => {
554
+ const b = B.union(B.string(), B.number());
555
+ expectOk(b.parse("hi"));
556
+ expectOk(b.parse(1));
557
+ });
558
+
559
+ it("rejects a value matching no variant and collects errors from each", () => {
560
+ const b = B.union(B.string(), B.number());
561
+ const res = b.parse(true);
562
+ expectErr(res);
563
+ expect(res.error.length).toBeGreaterThanOrEqual(2);
564
+ });
565
+ });
566
+
567
+ describe("builder.parse — min/max", (it) => {
568
+ it("accepts a number within [min, max]", () => {
569
+ const b = B.number().min(0).max(10);
570
+ expectOk(b.parse(0));
571
+ expectOk(b.parse(5));
572
+ expectOk(b.parse(10));
573
+ });
574
+
575
+ it("rejects a number below min", () => {
576
+ const b = B.number().min(0);
577
+ const res = b.parse(-1);
578
+ expectErr(res);
579
+ expect(res.error).toHaveLength(1);
580
+ expect(res.error[0]!.message).toMatch(/>= 0/);
581
+ });
582
+
583
+ it("rejects a number above max", () => {
584
+ const b = B.number().max(10);
585
+ const res = b.parse(11);
586
+ expectErr(res);
587
+ expect(res.error).toHaveLength(1);
588
+ expect(res.error[0]!.message).toMatch(/<= 10/);
589
+ });
590
+
591
+ it("checks the number format before applying bounds", () => {
592
+ const b = B.number().min(0).max(10);
593
+ const res = b.parse("foo");
594
+ expectErr(res);
595
+ expect(res.error).toHaveLength(1);
596
+ expect(res.error[0]!.message).toMatch(/number/);
597
+ });
598
+
599
+ it("accepts a string whose length is within [min, max]", () => {
600
+ const b = B.string().min(2).max(4);
601
+ expectOk(b.parse("ab"));
602
+ expectOk(b.parse("abc"));
603
+ expectOk(b.parse("abcd"));
604
+ });
605
+
606
+ it("rejects a string shorter than min", () => {
607
+ const b = B.string().min(2);
608
+ const res = b.parse("a");
609
+ expectErr(res);
610
+ expect(res.error).toHaveLength(1);
611
+ expect(res.error[0]!.message).toMatch(/string length/);
612
+ expect(res.error[0]!.message).toMatch(/>= 2/);
613
+ });
614
+
615
+ it("rejects a string longer than max", () => {
616
+ const b = B.string().max(3);
617
+ const res = b.parse("abcd");
618
+ expectErr(res);
619
+ expect(res.error).toHaveLength(1);
620
+ expect(res.error[0]!.message).toMatch(/string length/);
621
+ expect(res.error[0]!.message).toMatch(/<= 3/);
622
+ });
623
+
624
+ it("accepts an array whose length is within [min, max]", () => {
625
+ const b = B.array(B.number()).min(1).max(3);
626
+ expectOk(b.parse([1]));
627
+ expectOk(b.parse([1, 2]));
628
+ expectOk(b.parse([1, 2, 3]));
629
+ });
630
+
631
+ it("rejects an array shorter than min", () => {
632
+ const b = B.array(B.number()).min(2);
633
+ const res = b.parse([1]);
634
+ expectErr(res);
635
+ expect(res.error).toHaveLength(1);
636
+ expect(res.error[0]!.message).toMatch(/array length/);
637
+ expect(res.error[0]!.message).toMatch(/>= 2/);
638
+ });
639
+
640
+ it("rejects an array longer than max", () => {
641
+ const b = B.array(B.number()).max(2);
642
+ const res = b.parse([1, 2, 3]);
643
+ expectErr(res);
644
+ expect(res.error).toHaveLength(1);
645
+ expect(res.error[0]!.message).toMatch(/array length/);
646
+ expect(res.error[0]!.message).toMatch(/<= 2/);
647
+ });
648
+
649
+ it("reports bounds errors at the shape's path inside a nested mapping", () => {
650
+ const b = B.mapping({ name: B.string().min(3) });
651
+ const res = b.parse({ name: "no" });
652
+ expectErr(res);
653
+ expect(res.error).toHaveLength(1);
654
+ expect(res.error[0]!.path).toEqual(["name"]);
655
+ });
656
+ });
657
+
658
+ describe("builder.parse — pattern", (it) => {
659
+ it("accepts a string matching a RegExp pattern", () => {
660
+ const b = B.string().regex(/^[a-z]+$/);
661
+ expectOk(b.parse("abc"));
662
+ });
663
+
664
+ it("rejects a string not matching a RegExp pattern", () => {
665
+ const b = B.string().regex(/^[a-z]+$/);
666
+ const res = b.parse("abc123");
667
+ expectErr(res);
668
+ expect(res.error).toHaveLength(1);
669
+ expect(res.error[0]!.message).toMatch(/pattern/);
670
+ });
671
+
672
+ it("accepts a string matching a string-source pattern", () => {
673
+ const b = B.string().regex("^[A-Z]{3}$");
674
+ expectOk(b.parse("USD"));
675
+ });
676
+
677
+ it("rejects a string not matching a string-source pattern", () => {
678
+ const b = B.string().regex("^[A-Z]{3}$");
679
+ const res = b.parse("usd");
680
+ expectErr(res);
681
+ expect(res.error).toHaveLength(1);
682
+ expect(res.error[0]!.message).toMatch(/pattern/);
683
+ });
684
+
685
+ it("checks type before pattern", () => {
686
+ const b = B.string().regex(/^[a-z]+$/);
687
+ const res = b.parse(5);
688
+ expectErr(res);
689
+ expect(res.error).toHaveLength(1);
690
+ expect(res.error[0]!.message).toMatch(/string/);
691
+ });
692
+
693
+ it("reports pattern errors at the shape's path inside a nested mapping", () => {
694
+ const b = B.mapping({ slug: B.string().regex(/^[a-z-]+$/) });
695
+ const res = b.parse({ slug: "Bad Slug" });
696
+ expectErr(res);
697
+ expect(res.error).toHaveLength(1);
698
+ expect(res.error[0]!.path).toEqual(["slug"]);
699
+ });
700
+
701
+ it("composes with min/max — bounds error takes precedence", () => {
702
+ const b = B.string()
703
+ .min(3)
704
+ .regex(/^[a-z]+$/);
705
+ const res = b.parse("a");
706
+ expectErr(res);
707
+ expect(res.error).toHaveLength(1);
708
+ expect(res.error[0]!.message).toMatch(/string length/);
709
+ });
710
+ });
711
+
712
+ describe("builder.parse — paths", (it) => {
713
+ it("uses [] as the path for a top-level scalar mismatch", () => {
714
+ const res = B.string().parse(1);
715
+ expectErr(res);
716
+ expect(res.error[0]!.path).toEqual([]);
717
+ });
718
+
719
+ it("threads indices and keys through nested arrays and mappings", () => {
720
+ const b = B.mapping({
721
+ items: B.array(B.mapping({ name: B.string() })),
722
+ });
723
+ const res = b.parse({ items: [{ name: "ok" }, { name: 5 }] });
724
+ expectErr(res);
725
+ expect(res.error).toHaveLength(1);
726
+ expect(res.error[0]!.path).toEqual(["items", 1, "name"]);
727
+ });
728
+ });