@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,704 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { describe, expect } from "vitest";
4
+ import { R } from "../../../common/result";
5
+ import { shapes } from "../../shape";
6
+ import { fromSQL } from "./from-sql";
7
+ import { toSQL } from "./transform";
8
+
9
+ const ok = (res: R.Result<shapes.Shape, string[]>): shapes.Shape => {
10
+ if (!R.isOk(res))
11
+ throw new Error(`expected ok, got err: ${res.error.join("; ")}`);
12
+ return res.value;
13
+ };
14
+
15
+ const err = (res: R.Result<shapes.Shape, string[]>): string[] => {
16
+ if (R.isOk(res))
17
+ throw new Error(`expected err, got ok: ${String(res.value)}`);
18
+ return res.error;
19
+ };
20
+
21
+ const asMapping = (s: shapes.Shape): shapes.ShapeMapping => {
22
+ if (s.type !== "mapping") throw new Error(`expected mapping, got ${s.type}`);
23
+ return s;
24
+ };
25
+
26
+ const asModule = (s: shapes.Shape): shapes.ShapeModule => {
27
+ if (s.type !== "module") throw new Error(`expected module, got ${s.type}`);
28
+ return s;
29
+ };
30
+
31
+ describe("fromSQL — basics", (it) => {
32
+ it("empty / no tables → err", () => {
33
+ expect(err(fromSQL("-- nothing here"))).toEqual([
34
+ "no CREATE TABLE statements found",
35
+ ]);
36
+ });
37
+
38
+ it("minimal table", () => {
39
+ const m = asMapping(
40
+ ok(
41
+ fromSQL(`
42
+ CREATE TABLE t (
43
+ id integer primary key,
44
+ name text not null
45
+ );
46
+ `),
47
+ ),
48
+ );
49
+ expect(m.anno.title).toBe("t");
50
+ expect(Object.keys(m.input)).toEqual(["id", "name"]);
51
+ const id = m.input["id"]!;
52
+ expect(id.type).toBe("number");
53
+ expect(id.anno.primary).toBe(true);
54
+ // primary implies notNull, so no optional
55
+ expect(id.anno.optional).toBeUndefined();
56
+ const name = m.input["name"]!;
57
+ expect(name.type).toBe("string");
58
+ expect(name.anno.optional).toBeUndefined();
59
+ });
60
+
61
+ it("optional column", () => {
62
+ const m = asMapping(ok(fromSQL(`CREATE TABLE t (a integer, b text);`)));
63
+ expect(m.input["a"]!.anno.optional).toBe(true);
64
+ expect(m.input["b"]!.anno.optional).toBe(true);
65
+ });
66
+
67
+ it("scalar pg types map to expected number tags", () => {
68
+ const m = asMapping(
69
+ ok(
70
+ fromSQL(
71
+ `CREATE TABLE t (
72
+ a smallint not null,
73
+ b integer not null,
74
+ c bigint not null,
75
+ d real not null,
76
+ e double precision not null,
77
+ f boolean not null
78
+ );`,
79
+ ),
80
+ ),
81
+ );
82
+ expect((m.input["a"] as shapes.ShapeNumber).tag).toBe("int16");
83
+ expect((m.input["b"] as shapes.ShapeNumber).tag).toBe("int32");
84
+ expect((m.input["c"] as shapes.ShapeNumber).tag).toBe("int64");
85
+ expect((m.input["d"] as shapes.ShapeNumber).tag).toBe("float32");
86
+ expect((m.input["e"] as shapes.ShapeNumber).tag).toBe("float64");
87
+ expect(m.input["f"]!.type).toBe("boolean");
88
+ });
89
+
90
+ it("SERIAL family → autoIncrement", () => {
91
+ const m = asMapping(
92
+ ok(
93
+ fromSQL(
94
+ `CREATE TABLE t (
95
+ a smallserial not null,
96
+ b serial not null,
97
+ c bigserial not null
98
+ );`,
99
+ ),
100
+ ),
101
+ );
102
+ expect((m.input["a"] as shapes.ShapeNumber).tag).toBe("int16");
103
+ expect(m.input["a"]!.anno.autoIncrement).toBe(true);
104
+ expect((m.input["b"] as shapes.ShapeNumber).tag).toBe("int32");
105
+ expect(m.input["b"]!.anno.autoIncrement).toBe(true);
106
+ expect((m.input["c"] as shapes.ShapeNumber).tag).toBe("int64");
107
+ expect(m.input["c"]!.anno.autoIncrement).toBe(true);
108
+ });
109
+
110
+ it("VARCHAR(n) → string with max=n; CHAR(n) → string with min=max=n", () => {
111
+ const m = asMapping(
112
+ ok(
113
+ fromSQL(`CREATE TABLE t (a varchar(50) not null, b char(3) not null);`),
114
+ ),
115
+ );
116
+ expect(m.input["a"]!.anno.max).toBe(50);
117
+ expect(m.input["a"]!.anno.min).toBeUndefined();
118
+ expect(m.input["b"]!.anno.min).toBe(3);
119
+ expect(m.input["b"]!.anno.max).toBe(3);
120
+ });
121
+
122
+ it("NUMERIC(20,0) → uint64; NUMERIC(p,s) → number+format", () => {
123
+ const m = asMapping(
124
+ ok(
125
+ fromSQL(
126
+ `CREATE TABLE t (a numeric(20,0) not null, b numeric(10,2) not null);`,
127
+ ),
128
+ ),
129
+ );
130
+ expect((m.input["a"] as shapes.ShapeNumber).tag).toBe("uint64");
131
+ expect(m.input["b"]!.type).toBe("number");
132
+ expect(m.input["b"]!.anno.format).toBe("pgtype:numeric(10,2)");
133
+ });
134
+
135
+ it("uuid → string + format=uuid + pattern", () => {
136
+ const m = asMapping(ok(fromSQL(`CREATE TABLE t (id uuid not null);`)));
137
+ expect(m.input["id"]!.type).toBe("string");
138
+ expect(m.input["id"]!.anno.format).toBe("uuid");
139
+ expect(m.input["id"]!.anno.pattern).toBeInstanceOf(RegExp);
140
+ });
141
+
142
+ it("text[] / int[] → array shapes", () => {
143
+ const m = asMapping(
144
+ ok(
145
+ fromSQL(`CREATE TABLE t (tags text[] not null, ints int[] not null);`),
146
+ ),
147
+ );
148
+ const tags = m.input["tags"] as shapes.ShapeArray;
149
+ expect(tags.type).toBe("array");
150
+ expect(tags.input.type).toBe("string");
151
+ const ints = m.input["ints"] as shapes.ShapeArray;
152
+ expect(ints.input.type).toBe("number");
153
+ expect((ints.input as shapes.ShapeNumber).tag).toBe("int32");
154
+ });
155
+
156
+ it("vector(N) → vector shape", () => {
157
+ const m = asMapping(
158
+ ok(fromSQL(`CREATE TABLE t (e vector(1536) not null);`)),
159
+ );
160
+ const v = m.input["e"] as shapes.ShapeVector;
161
+ expect(v.type).toBe("vector");
162
+ expect(v.input.dims).toBe(1536);
163
+ });
164
+ });
165
+
166
+ describe("fromSQL — CREATE TYPE / DOMAIN", (it) => {
167
+ it("ENUM resolved to union of literals + title", () => {
168
+ const m = asMapping(
169
+ ok(
170
+ fromSQL(`
171
+ CREATE TYPE color AS ENUM ('red','green','blue');
172
+ CREATE TABLE t (c color not null);
173
+ `),
174
+ ),
175
+ );
176
+ const u = m.input["c"] as shapes.ShapeUnion;
177
+ expect(u.type).toBe("union");
178
+ expect(u.anno.title).toBe("color");
179
+ const vals = (u.input as shapes.Shape[]).map(
180
+ (v) => (v as shapes.ShapeString).input,
181
+ );
182
+ expect(vals).toEqual(["red", "green", "blue"]);
183
+ });
184
+
185
+ it("schema-qualified ENUM", () => {
186
+ const m = asMapping(
187
+ ok(
188
+ fromSQL(`
189
+ CREATE SCHEMA shop;
190
+ CREATE TYPE shop.status AS ENUM ('a','b');
191
+ CREATE TABLE shop.t (s shop.status not null);
192
+ `),
193
+ ),
194
+ );
195
+ expect(m.anno.schema).toBe("shop");
196
+ const u = m.input["s"] as shapes.ShapeUnion;
197
+ expect(u.anno.title).toBe("status");
198
+ expect(u.anno.schema).toBe("shop");
199
+ });
200
+
201
+ it("DOMAIN folds pattern from CHECK", () => {
202
+ const m = asMapping(
203
+ ok(
204
+ fromSQL(`
205
+ CREATE DOMAIN email AS text CHECK (VALUE ~ '^[A-Z]+$');
206
+ CREATE TABLE t (e email not null);
207
+ `),
208
+ ),
209
+ );
210
+ expect(m.input["e"]!.type).toBe("string");
211
+ expect(m.input["e"]!.anno.format).toBe("pgtype:email");
212
+ // Pattern from the domain check (the value~ pattern lands as a pattern)
213
+ expect(m.input["e"]!.anno.pattern).toBe("^[A-Z]+$");
214
+ });
215
+ });
216
+
217
+ describe("fromSQL — constraints", (it) => {
218
+ it("composite primary key (table-level)", () => {
219
+ const m = asMapping(
220
+ ok(
221
+ fromSQL(`
222
+ CREATE TABLE t (
223
+ a integer not null,
224
+ b integer not null,
225
+ primary key (a, b)
226
+ );
227
+ `),
228
+ ),
229
+ );
230
+ expect(m.input["a"]!.anno.primary).toBe(true);
231
+ expect(m.input["b"]!.anno.primary).toBe(true);
232
+ });
233
+
234
+ it("column-level UNIQUE", () => {
235
+ const m = asMapping(
236
+ ok(
237
+ fromSQL(`CREATE TABLE t (id integer primary key, email text unique);`),
238
+ ),
239
+ );
240
+ expect(m.input["email"]!.anno.unique).toBe(true);
241
+ });
242
+
243
+ it("table-level single-col UNIQUE", () => {
244
+ const m = asMapping(
245
+ ok(
246
+ fromSQL(
247
+ `CREATE TABLE t (id integer primary key, email text not null, unique (email));`,
248
+ ),
249
+ ),
250
+ );
251
+ expect(m.input["email"]!.anno.unique).toBe(true);
252
+ });
253
+
254
+ it("multi-col UNIQUE (bare) lands on mapping anno", () => {
255
+ const m = asMapping(
256
+ ok(
257
+ fromSQL(`
258
+ CREATE TABLE t (
259
+ a integer not null,
260
+ b integer not null,
261
+ unique (a, b)
262
+ );
263
+ `),
264
+ ),
265
+ );
266
+ expect(m.anno.uniqueConstraints).toEqual([{ columns: ["a", "b"] }]);
267
+ expect(m.input["a"]!.anno.unique).not.toBe(true);
268
+ expect(m.input["b"]!.anno.unique).not.toBe(true);
269
+ });
270
+
271
+ it("multi-col UNIQUE with named CONSTRAINT preserves name", () => {
272
+ const m = asMapping(
273
+ ok(
274
+ fromSQL(`
275
+ CREATE TABLE t (
276
+ a integer not null,
277
+ b integer not null,
278
+ constraint uniq_ab unique (a, b)
279
+ );
280
+ `),
281
+ ),
282
+ );
283
+ expect(m.anno.uniqueConstraints).toEqual([
284
+ { columns: ["a", "b"], name: "uniq_ab" },
285
+ ]);
286
+ });
287
+
288
+ it("multi-col UNIQUE round-trips through toSQL → fromSQL", () => {
289
+ const m1 = asMapping(
290
+ ok(
291
+ fromSQL(`
292
+ CREATE TABLE t (
293
+ a integer not null,
294
+ b integer not null,
295
+ c integer not null,
296
+ constraint uniq_ab unique (a, b),
297
+ unique (b, c)
298
+ );
299
+ `),
300
+ ),
301
+ );
302
+ const sqlRes = toSQL(m1);
303
+ if (!R.isOk(sqlRes)) throw new Error(sqlRes.error.join("; "));
304
+ const m2 = asMapping(ok(fromSQL(sqlRes.value)));
305
+ expect(m2.anno.uniqueConstraints).toEqual(m1.anno.uniqueConstraints);
306
+ });
307
+ });
308
+
309
+ describe("fromSQL — multi-table", (it) => {
310
+ it("two tables → module", () => {
311
+ const mod = asModule(
312
+ ok(
313
+ fromSQL(`
314
+ CREATE TABLE u (id integer primary key);
315
+ CREATE TABLE t (
316
+ uid integer not null references u(id) on delete cascade
317
+ );
318
+ `),
319
+ ),
320
+ );
321
+ expect(Object.keys(mod.input).sort()).toEqual(["t", "u"]);
322
+ const t = mod.input["t"]!;
323
+ const uid = t.input["uid"]!;
324
+ expect(uid.anno.foreign).toEqual({
325
+ table: "u",
326
+ column: "id",
327
+ onDelete: "cascade",
328
+ });
329
+ });
330
+
331
+ it("multi-col FK decomposes to per-column foreign", () => {
332
+ const mod = asModule(
333
+ ok(
334
+ fromSQL(`
335
+ CREATE TABLE parent (
336
+ id uuid not null,
337
+ created_at timestamptz not null,
338
+ primary key (id, created_at)
339
+ );
340
+ CREATE TABLE child (
341
+ pid uuid not null,
342
+ pcreated timestamptz not null,
343
+ foreign key (pid, pcreated) references parent(id, created_at) on delete cascade
344
+ );
345
+ `),
346
+ ),
347
+ );
348
+ const child = mod.input["child"]!;
349
+ expect(child.input["pid"]!.anno.foreign).toEqual({
350
+ table: "parent",
351
+ column: "id",
352
+ onDelete: "cascade",
353
+ });
354
+ expect(child.input["pcreated"]!.anno.foreign).toEqual({
355
+ table: "parent",
356
+ column: "created_at",
357
+ onDelete: "cascade",
358
+ });
359
+ });
360
+ });
361
+
362
+ describe("fromSQL — defaults", (it) => {
363
+ it("literal defaults are decoded; expressions preserved", () => {
364
+ const m = asMapping(
365
+ ok(
366
+ fromSQL(`
367
+ CREATE TABLE t (
368
+ a text not null default 'hello',
369
+ b integer not null default 42,
370
+ c boolean not null default true,
371
+ d uuid not null default uuid_generate_v4(),
372
+ e timestamptz not null default CURRENT_TIMESTAMP,
373
+ f jsonb not null default '{}'::jsonb
374
+ );
375
+ `),
376
+ ),
377
+ );
378
+ expect(m.input["a"]!.anno.default).toBe("hello");
379
+ expect(m.input["b"]!.anno.default).toBe(42);
380
+ expect(m.input["c"]!.anno.default).toBe(true);
381
+ expect(m.input["d"]!.anno.defaultExpr).toBe("UUID_GENERATE_V4 ( )");
382
+ expect(m.input["e"]!.anno.defaultExpr).toBe("CURRENT_TIMESTAMP");
383
+ expect(m.input["f"]!.anno.default).toEqual({});
384
+ });
385
+ });
386
+
387
+ describe("fromSQL — CHECK decoding", (it) => {
388
+ it("char_length / cardinality / pattern / IN", () => {
389
+ const m = asMapping(
390
+ ok(
391
+ fromSQL(`
392
+ CREATE TABLE t (
393
+ name text not null check (char_length(name) >= 3),
394
+ tags text[] not null check (cardinality(tags) <= 5),
395
+ ssn text not null check (ssn ~ '^[0-9]+$'),
396
+ color text not null check (color in ('red','blue'))
397
+ );
398
+ `),
399
+ ),
400
+ );
401
+ expect(m.input["name"]!.anno.min).toBe(3);
402
+ expect(m.input["tags"]!.anno.max).toBe(5);
403
+ expect(m.input["ssn"]!.anno.pattern).toBe("^[0-9]+$");
404
+ expect(m.input["color"]!.type).toBe("union");
405
+ const u = m.input["color"] as shapes.ShapeUnion;
406
+ expect((u.input as shapes.Shape[]).map((x) => (x as any).input)).toEqual([
407
+ "red",
408
+ "blue",
409
+ ]);
410
+ });
411
+
412
+ it("BETWEEN decoded", () => {
413
+ const m = asMapping(
414
+ ok(
415
+ fromSQL(`
416
+ CREATE TABLE t (
417
+ r integer not null check (r between 1 and 5)
418
+ );
419
+ `),
420
+ ),
421
+ );
422
+ expect(m.input["r"]!.anno.min).toBe(1);
423
+ expect(m.input["r"]!.anno.max).toBe(5);
424
+ });
425
+
426
+ it("opaque CHECK preserved as raw", () => {
427
+ const m = asMapping(
428
+ ok(
429
+ fromSQL(`
430
+ CREATE TABLE t (
431
+ a integer not null,
432
+ b integer not null,
433
+ check (a + b > 0)
434
+ );
435
+ `),
436
+ ),
437
+ );
438
+ expect(m.anno.check).toBeDefined();
439
+ });
440
+
441
+ it("IS NULL OR pattern is peeled", () => {
442
+ const m = asMapping(
443
+ ok(
444
+ fromSQL(`
445
+ CREATE TABLE t (
446
+ dob date,
447
+ phone text check (phone is null or phone ~ '^\\+?[0-9]+$')
448
+ );
449
+ `),
450
+ ),
451
+ );
452
+ expect(m.input["phone"]!.anno.pattern).toBe("^\\+?[0-9]+$");
453
+ });
454
+ });
455
+
456
+ describe("fromSQL — GENERATED columns", (it) => {
457
+ it("GENERATED ALWAYS AS (...) STORED", () => {
458
+ const m = asMapping(
459
+ ok(
460
+ fromSQL(`
461
+ CREATE TABLE t (
462
+ a integer not null,
463
+ b integer not null,
464
+ c integer generated always as (a + b) stored
465
+ );
466
+ `),
467
+ ),
468
+ );
469
+ expect(m.input["c"]!.anno.generated).toEqual({
470
+ expression: "a + b",
471
+ stored: true,
472
+ });
473
+ });
474
+
475
+ it("GENERATED ALWAYS AS IDENTITY → autoIncrement", () => {
476
+ const m = asMapping(
477
+ ok(
478
+ fromSQL(`
479
+ CREATE TABLE t (id integer generated always as identity primary key);
480
+ `),
481
+ ),
482
+ );
483
+ expect(m.input["id"]!.anno.autoIncrement).toBe(true);
484
+ expect(m.input["id"]!.anno.primary).toBe(true);
485
+ });
486
+ });
487
+
488
+ describe("fromSQL — TSTZRANGE", (it) => {
489
+ it("tstzrange → range(date())", () => {
490
+ const m = asMapping(
491
+ ok(fromSQL(`CREATE TABLE t (during tstzrange not null);`)),
492
+ );
493
+ const r = m.input["during"] as shapes.ShapeRange;
494
+ expect(r.type).toBe("range");
495
+ expect(r.input.type).toBe("date");
496
+ expect(r.anno.format).toBe("pgtype:tstzrange");
497
+ });
498
+ });
499
+
500
+ describe("fromSQL — skip-able statements", (it) => {
501
+ it("ignores INDEX / TRIGGER / VIEW / INSERT / EXTENSION / SCHEMA / FUNCTION", () => {
502
+ const m = asMapping(
503
+ ok(
504
+ fromSQL(`
505
+ CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
506
+ CREATE SCHEMA IF NOT EXISTS s;
507
+ CREATE TABLE t (id integer primary key);
508
+ CREATE INDEX t_idx ON t(id);
509
+ CREATE OR REPLACE FUNCTION foo() RETURNS integer LANGUAGE sql AS $$ SELECT 1; $$;
510
+ CREATE TRIGGER tr BEFORE UPDATE ON t FOR EACH ROW EXECUTE FUNCTION foo();
511
+ CREATE VIEW v AS SELECT * FROM t;
512
+ CREATE MATERIALIZED VIEW mv AS SELECT * FROM t WITH NO DATA;
513
+ ALTER TABLE t ENABLE ROW LEVEL SECURITY;
514
+ CREATE POLICY p ON t FOR SELECT USING (true);
515
+ INSERT INTO t (id) VALUES (1);
516
+ `),
517
+ ),
518
+ );
519
+ expect(m.anno.title).toBe("t");
520
+ expect(Object.keys(m.input)).toEqual(["id"]);
521
+ });
522
+
523
+ it("PARTITION OF children skipped; parent with PARTITION BY parsed", () => {
524
+ const mod = asModule(
525
+ ok(
526
+ fromSQL(`
527
+ CREATE TABLE orders (
528
+ id uuid not null,
529
+ created_at timestamptz not null,
530
+ primary key (id, created_at)
531
+ ) PARTITION BY RANGE (created_at);
532
+ CREATE TABLE orders_2025 PARTITION OF orders FOR VALUES FROM ('2025-01-01') TO ('2026-01-01');
533
+ CREATE TABLE other (id integer primary key);
534
+ `),
535
+ ),
536
+ );
537
+ expect(Object.keys(mod.input).sort()).toEqual(["orders", "other"]);
538
+ expect(mod.input["orders"]!.input["id"]!.anno.primary).toBe(true);
539
+ });
540
+ });
541
+
542
+ describe("fromSQL — schema qualifier", (it) => {
543
+ it("CREATE TABLE shop.users → title=users, schema=shop", () => {
544
+ const m = asMapping(
545
+ ok(fromSQL(`CREATE TABLE shop.users (id integer primary key);`)),
546
+ );
547
+ expect(m.anno.title).toBe("users");
548
+ expect(m.anno.schema).toBe("shop");
549
+ });
550
+ });
551
+
552
+ describe("fromSQL — ecommerce.sql fixture", (it) => {
553
+ const fixturePath = join(
554
+ process.cwd(),
555
+ "..",
556
+ "..",
557
+ "test-data",
558
+ "sql",
559
+ "ecommerce.sql",
560
+ );
561
+
562
+ it("parses successfully and produces expected tables", () => {
563
+ const sql = readFileSync(fixturePath, "utf8");
564
+ const result = fromSQL(sql);
565
+ if (!R.isOk(result)) {
566
+ throw new Error(`fromSQL failed: ${result.error.join("\n")}`);
567
+ }
568
+ const mod = asModule(result.value);
569
+ const expected = [
570
+ "users",
571
+ "addresses",
572
+ "vendors",
573
+ "categories",
574
+ "products",
575
+ "product_variants",
576
+ "inventory_movements",
577
+ "carts",
578
+ "cart_items",
579
+ "orders",
580
+ "order_items",
581
+ "payments",
582
+ "reviews",
583
+ "wishlists",
584
+ "coupons",
585
+ "promotions",
586
+ "event_log",
587
+ ];
588
+ for (const name of expected) {
589
+ expect(
590
+ Object.keys(mod.input).includes(name),
591
+ `missing table ${name}`,
592
+ ).toBe(true);
593
+ }
594
+ // orders_2024/5/6 should NOT be present (skipped partition children)
595
+ expect(Object.keys(mod.input).includes("orders_2024")).toBe(false);
596
+
597
+ // Spot-check users
598
+ const users = mod.input["users"]!;
599
+ expect(users.anno.schema).toBe("shop");
600
+ expect(users.input["email"]!.type).toBe("string");
601
+ // email is a domain — pattern from domain CHECK
602
+ expect(users.input["email"]!.anno.format).toBe("pgtype:shop.email");
603
+ // is_active should have default true
604
+ expect(users.input["is_active"]!.anno.default).toBe(true);
605
+
606
+ // FK in addresses with onDelete cascade
607
+ const addrs = mod.input["addresses"]!;
608
+ expect(addrs.input["user_id"]!.anno.foreign).toEqual({
609
+ table: "users",
610
+ column: "id",
611
+ onDelete: "cascade",
612
+ });
613
+
614
+ // products.search_doc should be a generated column
615
+ const products = mod.input["products"]!;
616
+ expect(products.input["search_doc"]!.anno.generated).toBeDefined();
617
+ });
618
+
619
+ it("toSQL round-trip emits something that re-parses to the same table count", () => {
620
+ const sql = readFileSync(fixturePath, "utf8");
621
+ const first = fromSQL(sql);
622
+ if (!R.isOk(first)) throw new Error(first.error.join("; "));
623
+ const emitted = toSQL(first.value);
624
+ if (!R.isOk(emitted))
625
+ throw new Error(`toSQL failed: ${emitted.error.join("; ")}`);
626
+ const second = fromSQL(emitted.value);
627
+ if (!R.isOk(second))
628
+ throw new Error(`re-parse failed: ${second.error.join("; ")}`);
629
+ const a = asModule(first.value);
630
+ const b = asModule(second.value);
631
+ expect(Object.keys(b.input).sort()).toEqual(Object.keys(a.input).sort());
632
+ });
633
+ });
634
+
635
+ describe("toSQL — new annotation emission", (it) => {
636
+ it("ON DELETE CASCADE in REFERENCES", () => {
637
+ const shape = ok(
638
+ fromSQL(`CREATE TABLE u (id integer primary key);
639
+ CREATE TABLE t (uid integer not null references u(id) on delete cascade);
640
+ `),
641
+ );
642
+ const out = toSQL(shape);
643
+ if (!R.isOk(out)) throw new Error(out.error.join("; "));
644
+ expect(out.value).toContain('REFERENCES "u"("id") ON DELETE CASCADE');
645
+ });
646
+
647
+ it("schema prefix on table name + CREATE SCHEMA prelude", () => {
648
+ const out = toSQL(
649
+ ok(
650
+ fromSQL(`
651
+ CREATE TABLE s.t (id integer primary key);
652
+ CREATE TABLE other (id integer primary key);
653
+ `),
654
+ ),
655
+ );
656
+ if (!R.isOk(out)) throw new Error(out.error.join("; "));
657
+ expect(out.value).toContain('CREATE SCHEMA IF NOT EXISTS "s"');
658
+ expect(out.value).toContain('CREATE TABLE IF NOT EXISTS "s"."t"');
659
+ });
660
+
661
+ it("defaultExpr is emitted verbatim", () => {
662
+ const out = toSQL(
663
+ ok(
664
+ fromSQL(
665
+ `CREATE TABLE t (id uuid not null default uuid_generate_v4() primary key);`,
666
+ ),
667
+ ),
668
+ );
669
+ if (!R.isOk(out)) throw new Error(out.error.join("; "));
670
+ expect(out.value).toContain("DEFAULT UUID_GENERATE_V4 ( )");
671
+ });
672
+
673
+ it("raw CHECK at mapping level", () => {
674
+ const out = toSQL(
675
+ ok(
676
+ fromSQL(`
677
+ CREATE TABLE t (
678
+ a integer not null,
679
+ b integer not null,
680
+ check (a + b > 0)
681
+ );
682
+ `),
683
+ ),
684
+ );
685
+ if (!R.isOk(out)) throw new Error(out.error.join("; "));
686
+ expect(out.value).toContain("CHECK (a + b > 0)");
687
+ });
688
+
689
+ it("GENERATED ALWAYS AS (...) STORED is re-emitted", () => {
690
+ const out = toSQL(
691
+ ok(
692
+ fromSQL(`
693
+ CREATE TABLE t (
694
+ a integer not null,
695
+ b integer not null,
696
+ c integer generated always as (a + b) stored
697
+ );
698
+ `),
699
+ ),
700
+ );
701
+ if (!R.isOk(out)) throw new Error(out.error.join("; "));
702
+ expect(out.value).toContain("GENERATED ALWAYS AS (a + b) STORED");
703
+ });
704
+ });