@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,210 @@
1
+ import { R } from "../../../common/result";
2
+ import { annotate, shapes } from "../../shape";
3
+ import { resolveDialect, SQLOptions } from "./options";
4
+ import { decodeCheck } from "./parser/check-decoder";
5
+ import { parseCreateDomain } from "./parser/create-domain";
6
+ import { parseCreateTable, ParsedTable } from "./parser/create-table";
7
+ import { parseCreateType } from "./parser/create-type";
8
+ import { decodeDefault } from "./parser/default-decoder";
9
+ import { LexError, tokenize } from "./parser/lexer";
10
+ import {
11
+ parsePgType,
12
+ Registries,
13
+ resolvePgType,
14
+ ResolvedDomain,
15
+ } from "./parser/pg-types";
16
+ import { classifyStatement, splitStatements } from "./parser/statements";
17
+ import { ParseError } from "./parser/cursor";
18
+
19
+ const newRegistries = (): Registries => ({
20
+ enums: new Map(),
21
+ composites: new Map(),
22
+ domains: new Map(),
23
+ });
24
+
25
+ const registerDomain = (
26
+ registries: Registries,
27
+ raw: ReturnType<typeof parseCreateDomain>,
28
+ ): void => {
29
+ const baseSpec = parsePgType(raw.baseTypeTokens);
30
+ const resolved = resolvePgType(baseSpec, registries);
31
+ let shape = resolved.shape;
32
+ for (const chkTokens of raw.checks) {
33
+ const dec = decodeCheck(chkTokens, {
34
+ columnName: "value",
35
+ isInteger: shape.type === "number",
36
+ isString: shape.type === "string",
37
+ isArray: shape.type === "array",
38
+ });
39
+ if (dec.fullyDecoded) {
40
+ const u = dec.updates;
41
+ if (u.min !== undefined) shape = annotate.as(shape, { min: u.min });
42
+ if (u.max !== undefined) shape = annotate.as(shape, { max: u.max });
43
+ if (u.pattern !== undefined)
44
+ shape = annotate.as(shape, { pattern: u.pattern });
45
+ }
46
+ // undecoded domain checks are dropped — they tend to reference VALUE
47
+ // rather than a specific column, so the column-oriented check-decoder
48
+ // wouldn't be able to round-trip them onto a column anyway.
49
+ }
50
+ // Add domain-name format hint
51
+ const qualified =
52
+ raw.schema !== undefined ? `${raw.schema}.${raw.name}` : raw.name;
53
+ shape = annotate.as(shape, { format: `pgtype:${qualified}` });
54
+ if (raw.defaultTokens !== undefined) {
55
+ const dec = decodeDefault(raw.defaultTokens, null);
56
+ if (dec.kind === "literal") {
57
+ shape = annotate.as(shape, { default: dec.value });
58
+ } else if (dec.sql.length > 0) {
59
+ shape = annotate.as(shape, { defaultExpr: dec.sql });
60
+ }
61
+ }
62
+ if (raw.notNull) {
63
+ // domain says NOT NULL; column nullability is still column-level
64
+ // (the column's NOT NULL applies). We leave the domain's shape alone.
65
+ }
66
+ const def: ResolvedDomain = { name: raw.name, shape };
67
+ if (raw.schema !== undefined) def.schema = raw.schema;
68
+ registries.domains.set(qualified, def);
69
+ registries.domains.set(raw.name, def);
70
+ };
71
+
72
+ const assemble = (
73
+ parsedTables: ParsedTable[],
74
+ ): R.Result<shapes.Shape, string[]> => {
75
+ if (parsedTables.length === 0) {
76
+ return R.err(["no CREATE TABLE statements found"]);
77
+ }
78
+
79
+ // For a single table return the mapping directly
80
+ if (parsedTables.length === 1) {
81
+ const t = parsedTables[0]!;
82
+ return R.ok(makeMapping(t));
83
+ }
84
+
85
+ // For multiple tables, build a module
86
+ const tables: Record<string, shapes.ShapeMapping> = {};
87
+ const usedKeys = new Set<string>();
88
+ for (const t of parsedTables) {
89
+ let key = t.name;
90
+ if (usedKeys.has(key)) {
91
+ key = t.schema !== undefined ? `${t.schema}_${t.name}` : `${t.name}_2`;
92
+ // ensure uniqueness even with the prefix
93
+ let suffix = 2;
94
+ let cand = key;
95
+ while (usedKeys.has(cand)) {
96
+ cand = `${key}_${suffix}`;
97
+ suffix += 1;
98
+ }
99
+ key = cand;
100
+ }
101
+ usedKeys.add(key);
102
+ tables[key] = makeMapping(t);
103
+ }
104
+ return R.ok(shapes.module(tables));
105
+ };
106
+
107
+ const makeMapping = (t: ParsedTable): shapes.ShapeMapping => {
108
+ const rec: Record<string, shapes.Shape> = {};
109
+ for (const c of t.columns) rec[c.key] = c.shape;
110
+ let m: shapes.ShapeMapping = shapes.mapping(rec);
111
+ m = annotate.titled(m, t.mappingAnno.title) as shapes.ShapeMapping;
112
+ if (t.mappingAnno.schema !== undefined) {
113
+ m = annotate.as(m, { schema: t.mappingAnno.schema }) as shapes.ShapeMapping;
114
+ }
115
+ if (t.mappingAnno.check !== undefined) {
116
+ m = annotate.as(m, { check: t.mappingAnno.check }) as shapes.ShapeMapping;
117
+ }
118
+ if (t.mappingAnno.description !== undefined) {
119
+ m = annotate.described(m, t.mappingAnno.description) as shapes.ShapeMapping;
120
+ }
121
+ if (t.uniqueConstraints !== undefined && t.uniqueConstraints.length > 0) {
122
+ m = annotate.as(m, {
123
+ uniqueConstraints: t.uniqueConstraints,
124
+ }) as shapes.ShapeMapping;
125
+ }
126
+ return m;
127
+ };
128
+
129
+ export const fromSQL = (
130
+ sql: string,
131
+ opts?: SQLOptions,
132
+ ): R.Result<shapes.Shape, string[]> => {
133
+ const dialect = resolveDialect(opts);
134
+ let tokens;
135
+ try {
136
+ tokens = tokenize(sql);
137
+ } catch (e) {
138
+ if (e instanceof LexError) return R.err([`lex error: ${e.message}`]);
139
+ return R.err([`lex error: ${String(e)}`]);
140
+ }
141
+
142
+ const stmts = splitStatements(tokens).map(classifyStatement);
143
+ const registries = newRegistries();
144
+ const tableStmts: typeof stmts = [];
145
+ const errors: string[] = [];
146
+
147
+ // First pass: types and domains
148
+ for (const s of stmts) {
149
+ if (s.kind === "createType") {
150
+ try {
151
+ const parsed = parseCreateType(s.tokens);
152
+ if (parsed === null) continue;
153
+ if (parsed.kind === "enum") {
154
+ const def = parsed.def;
155
+ const qualified =
156
+ def.schema !== undefined ? `${def.schema}.${def.name}` : def.name;
157
+ registries.enums.set(qualified, def);
158
+ registries.enums.set(def.name, def);
159
+ } else {
160
+ const def = parsed.def;
161
+ const qualified =
162
+ def.schema !== undefined ? `${def.schema}.${def.name}` : def.name;
163
+ registries.composites.set(qualified, def);
164
+ registries.composites.set(def.name, def);
165
+ }
166
+ } catch (e) {
167
+ errors.push(formatParserError(e, "CREATE TYPE"));
168
+ }
169
+ continue;
170
+ }
171
+ if (s.kind === "createDomain") {
172
+ try {
173
+ const parsed = parseCreateDomain(s.tokens);
174
+ registerDomain(registries, parsed);
175
+ } catch (e) {
176
+ errors.push(formatParserError(e, "CREATE DOMAIN"));
177
+ }
178
+ continue;
179
+ }
180
+ if (s.kind === "createTable") {
181
+ tableStmts.push(s);
182
+ continue;
183
+ }
184
+ // createTablePartitionOf and skip — ignored
185
+ }
186
+
187
+ // Second pass: tables
188
+ const parsedTables: ParsedTable[] = [];
189
+ for (const s of tableStmts) {
190
+ try {
191
+ const parsed = parseCreateTable(s.tokens, { registries, dialect });
192
+ parsedTables.push(parsed);
193
+ } catch (e) {
194
+ errors.push(formatParserError(e, "CREATE TABLE"));
195
+ }
196
+ }
197
+
198
+ if (errors.length > 0 && parsedTables.length === 0) {
199
+ return R.err(errors);
200
+ }
201
+
202
+ return assemble(parsedTables);
203
+ };
204
+
205
+ const formatParserError = (e: unknown, ctx: string): string => {
206
+ if (e instanceof ParseError) return `${ctx}: ${e.message}`;
207
+ if (e instanceof LexError) return `${ctx}: ${e.message}`;
208
+ if (e instanceof Error) return `${ctx}: ${e.message}`;
209
+ return `${ctx}: ${String(e)}`;
210
+ };
@@ -0,0 +1,3 @@
1
+ export * from "./transform";
2
+ export * from "./from-sql";
3
+ export * from "./options";
@@ -0,0 +1,6 @@
1
+ export type SQLDialect = "postgres" | "sqlite";
2
+
3
+ export type SQLOptions = { dialect?: SQLDialect };
4
+
5
+ export const resolveDialect = (opts?: SQLOptions): SQLDialect =>
6
+ opts?.dialect ?? "postgres";
@@ -0,0 +1,457 @@
1
+ import { Token } from "./lexer";
2
+
3
+ export type CheckUpdate = {
4
+ min?: number;
5
+ max?: number;
6
+ pattern?: string;
7
+ uniqueItems?: boolean;
8
+ unionLiterals?: string[];
9
+ // SQLite-specific hints — interpreted by the column-meta applier
10
+ isBooleanInt?: boolean; // `col IN (0, 1)` on an integer column
11
+ isJsonValid?: boolean; // `json_valid(col)` (column is JSON-encoded)
12
+ tupleLength?: number; // `json_array_length(col) = N` together with isJsonValid
13
+ };
14
+
15
+ export type DecodedCheck = {
16
+ updates: CheckUpdate;
17
+ // True if the matcher consumed the whole expression. False means we couldn't
18
+ // fully decode and the caller should keep the raw text on `anno.check`.
19
+ fullyDecoded: boolean;
20
+ };
21
+
22
+ // Re-emit a token stream back to readable SQL. Used when we couldn't decode
23
+ // and want to preserve the raw expression on `anno.check`.
24
+ export const checkExprToSql = (tokens: Token[]): string => {
25
+ const parts: string[] = [];
26
+ let prev: Token | undefined;
27
+ for (const t of tokens) {
28
+ let s: string;
29
+ if (t.kind === "string") s = `'${t.value.replace(/'/g, "''")}'`;
30
+ else if (t.kind === "ident" && t.quoted)
31
+ s = `"${t.value.replace(/"/g, '""')}"`;
32
+ else s = t.value;
33
+ const needsSpace =
34
+ prev !== undefined &&
35
+ !(t.kind === "punct" && (t.value === "," || t.value === ")")) &&
36
+ !(prev.kind === "punct" && prev.value === "(") &&
37
+ !(t.kind === "punct" && t.value === "(" && prev.kind === "ident") &&
38
+ !(prev.kind === "punct" && prev.value === ".") &&
39
+ !(t.kind === "punct" && t.value === ".");
40
+ parts.push(needsSpace ? " " + s : s);
41
+ prev = t;
42
+ }
43
+ return parts.join("");
44
+ };
45
+
46
+ const isColRef = (t: Token | undefined, col: string): boolean =>
47
+ t !== undefined &&
48
+ t.kind === "ident" &&
49
+ ((!t.quoted && t.value === col.toLowerCase()) ||
50
+ (t.quoted === true && t.value === col));
51
+
52
+ const numLit = (t: Token | undefined): number | null => {
53
+ if (t === undefined) return null;
54
+ if (t.kind === "number") {
55
+ const n = Number(t.value);
56
+ if (isFinite(n)) return n;
57
+ return null;
58
+ }
59
+ return null;
60
+ };
61
+
62
+ // Try to extract a numeric literal possibly with a leading sign
63
+ const numLitWithSign = (
64
+ tokens: Token[],
65
+ start: number,
66
+ ): { value: number; consumed: number } | null => {
67
+ const t = tokens[start];
68
+ if (t === undefined) return null;
69
+ if (
70
+ t.kind === "op" &&
71
+ (t.value === "-" || t.value === "+") &&
72
+ tokens[start + 1]?.kind === "number"
73
+ ) {
74
+ const n = Number(`${t.value}${tokens[start + 1]!.value}`);
75
+ if (isFinite(n)) return { value: n, consumed: 2 };
76
+ return null;
77
+ }
78
+ const n = numLit(t);
79
+ if (n !== null) return { value: n, consumed: 1 };
80
+ return null;
81
+ };
82
+
83
+ // Strip wrapping parens until the body no longer starts with them
84
+ const stripParens = (tokens: Token[]): Token[] => {
85
+ let body = tokens;
86
+ while (
87
+ body.length >= 2 &&
88
+ body[0]?.kind === "punct" &&
89
+ body[0]?.value === "(" &&
90
+ body[body.length - 1]?.kind === "punct" &&
91
+ body[body.length - 1]?.value === ")"
92
+ ) {
93
+ // ensure these are matched
94
+ let depth = 0;
95
+ let balanced = true;
96
+ for (let i = 0; i < body.length; i += 1) {
97
+ const t = body[i]!;
98
+ if (t.kind === "punct" && t.value === "(") depth += 1;
99
+ else if (t.kind === "punct" && t.value === ")") {
100
+ depth -= 1;
101
+ if (depth === 0 && i !== body.length - 1) {
102
+ balanced = false;
103
+ break;
104
+ }
105
+ }
106
+ }
107
+ if (!balanced) break;
108
+ body = body.slice(1, -1);
109
+ }
110
+ return body;
111
+ };
112
+
113
+ type CheckCtx = {
114
+ columnName: string;
115
+ // Hint for how to interpret bounds (e.g. integer columns can decode `> N` → min=N+1)
116
+ isInteger: boolean;
117
+ // Whether the column is a string-typed column eligible for `IN ('...')` → union conversion
118
+ isString: boolean;
119
+ // Whether the column is an array-typed column eligible for cardinality/uniqueItems
120
+ isArray: boolean;
121
+ };
122
+
123
+ // Some pg checks wrap a real predicate in `<col> IS NULL OR <real>`. That
124
+ // pattern lets a CHECK on a nullable column not fail when the value is NULL.
125
+ // We peel that off and decode the real predicate.
126
+ const peelIsNullOr = (tokens: Token[], ctx: CheckCtx): Token[] | null => {
127
+ // Look for: <col> IS NULL OR <rest>
128
+ if (tokens.length < 5) return null;
129
+ if (!isColRef(tokens[0], ctx.columnName)) return null;
130
+ if (tokens[1]?.kind !== "ident" || tokens[1].value !== "is") return null;
131
+ if (tokens[2]?.kind !== "ident" || tokens[2].value !== "null") return null;
132
+ if (tokens[3]?.kind !== "ident" || tokens[3].value !== "or") return null;
133
+ return stripParens(tokens.slice(4));
134
+ };
135
+
136
+ const tryDecode = (tokens: Token[], ctx: CheckCtx): CheckUpdate | null => {
137
+ if (tokens.length === 0) return null;
138
+
139
+ // <col> <op> <num>
140
+ if (isColRef(tokens[0], ctx.columnName)) {
141
+ const opTok = tokens[1];
142
+ const op = opTok?.kind === "op" ? opTok.value : null;
143
+ if (op === ">=") {
144
+ const n = numLitWithSign(tokens, 2);
145
+ if (n !== null && n.consumed === tokens.length - 2)
146
+ return { min: n.value };
147
+ }
148
+ if (op === ">") {
149
+ const n = numLitWithSign(tokens, 2);
150
+ if (n !== null && n.consumed === tokens.length - 2 && ctx.isInteger)
151
+ return { min: n.value + 1 };
152
+ }
153
+ if (op === "<=") {
154
+ const n = numLitWithSign(tokens, 2);
155
+ if (n !== null && n.consumed === tokens.length - 2)
156
+ return { max: n.value };
157
+ }
158
+ if (op === "<") {
159
+ const n = numLitWithSign(tokens, 2);
160
+ if (n !== null && n.consumed === tokens.length - 2 && ctx.isInteger)
161
+ return { max: n.value - 1 };
162
+ }
163
+ if (op === "~") {
164
+ const next = tokens[2];
165
+ if (next?.kind === "string" && tokens.length === 3) {
166
+ return { pattern: next.value };
167
+ }
168
+ }
169
+
170
+ // <col> REGEXP '<pat>' (SQLite). REGEXP is parsed as an ident keyword.
171
+ if (
172
+ tokens[1]?.kind === "ident" &&
173
+ tokens[1].value === "regexp" &&
174
+ tokens[2]?.kind === "string" &&
175
+ tokens.length === 3
176
+ ) {
177
+ return { pattern: tokens[2].value };
178
+ }
179
+
180
+ // <col> BETWEEN <num> AND <num>
181
+ if (tokens[1]?.kind === "ident" && tokens[1].value === "between") {
182
+ const lo = numLitWithSign(tokens, 2);
183
+ if (lo !== null) {
184
+ const andIdx = 2 + lo.consumed;
185
+ if (
186
+ tokens[andIdx]?.kind === "ident" &&
187
+ tokens[andIdx].value === "and"
188
+ ) {
189
+ const hi = numLitWithSign(tokens, andIdx + 1);
190
+ if (hi !== null && andIdx + 1 + hi.consumed === tokens.length)
191
+ return { min: lo.value, max: hi.value };
192
+ }
193
+ }
194
+ }
195
+
196
+ // <col> IN (0, 1) → boolean hint (SQLite encodes booleans as INTEGER).
197
+ if (
198
+ ctx.isInteger &&
199
+ tokens[1]?.kind === "ident" &&
200
+ tokens[1].value === "in" &&
201
+ tokens[2]?.kind === "punct" &&
202
+ tokens[2].value === "(" &&
203
+ tokens.length === 7 &&
204
+ tokens[6]?.kind === "punct" &&
205
+ tokens[6].value === ")"
206
+ ) {
207
+ const a = numLitWithSign(tokens, 3);
208
+ const comma = tokens[3 + (a?.consumed ?? 0)];
209
+ const b = numLitWithSign(tokens, 3 + (a?.consumed ?? 0) + 1);
210
+ if (
211
+ a !== null &&
212
+ b !== null &&
213
+ comma?.kind === "punct" &&
214
+ comma.value === "," &&
215
+ ((a.value === 0 && b.value === 1) || (a.value === 1 && b.value === 0))
216
+ ) {
217
+ return { isBooleanInt: true };
218
+ }
219
+ }
220
+
221
+ // <col> IN ('a', 'b', ...) → union of string literals
222
+ if (
223
+ ctx.isString &&
224
+ tokens[1]?.kind === "ident" &&
225
+ tokens[1].value === "in" &&
226
+ tokens[2]?.kind === "punct" &&
227
+ tokens[2].value === "("
228
+ ) {
229
+ const lits: string[] = [];
230
+ let i = 3;
231
+ let ok = true;
232
+ while (i < tokens.length) {
233
+ const t = tokens[i]!;
234
+ if (t.kind === "punct" && t.value === ")") {
235
+ i += 1;
236
+ break;
237
+ }
238
+ if (t.kind !== "string") {
239
+ ok = false;
240
+ break;
241
+ }
242
+ lits.push(t.value);
243
+ i += 1;
244
+ const nxt = tokens[i];
245
+ if (nxt?.kind === "punct" && nxt.value === ",") {
246
+ i += 1;
247
+ continue;
248
+ }
249
+ if (nxt?.kind === "punct" && nxt.value === ")") {
250
+ i += 1;
251
+ break;
252
+ }
253
+ ok = false;
254
+ break;
255
+ }
256
+ if (ok && i === tokens.length && lits.length > 0)
257
+ return { unionLiterals: lits };
258
+ }
259
+ }
260
+
261
+ // char_length(<col>) >= N / length(<col>) >= N → string min
262
+ // char_length(<col>) <= N → string max
263
+ if (
264
+ tokens[0]?.kind === "ident" &&
265
+ (tokens[0].value === "char_length" || tokens[0].value === "length") &&
266
+ tokens[1]?.kind === "punct" &&
267
+ tokens[1].value === "(" &&
268
+ isColRef(tokens[2], ctx.columnName) &&
269
+ tokens[3]?.kind === "punct" &&
270
+ tokens[3].value === ")"
271
+ ) {
272
+ const op = tokens[4]?.kind === "op" ? tokens[4].value : null;
273
+ if (op === ">=") {
274
+ const n = numLitWithSign(tokens, 5);
275
+ if (n !== null && 5 + n.consumed === tokens.length)
276
+ return { min: n.value };
277
+ }
278
+ if (op === "<=") {
279
+ const n = numLitWithSign(tokens, 5);
280
+ if (n !== null && 5 + n.consumed === tokens.length)
281
+ return { max: n.value };
282
+ }
283
+ }
284
+
285
+ // cardinality(<col>) >= N / <= N → array min/max (postgres)
286
+ // json_array_length(<col>) >= N / <= N → array min/max (sqlite)
287
+ if (
288
+ tokens[0]?.kind === "ident" &&
289
+ (tokens[0].value === "cardinality" ||
290
+ tokens[0].value === "json_array_length") &&
291
+ tokens[1]?.kind === "punct" &&
292
+ tokens[1].value === "(" &&
293
+ isColRef(tokens[2], ctx.columnName) &&
294
+ tokens[3]?.kind === "punct" &&
295
+ tokens[3].value === ")"
296
+ ) {
297
+ const op = tokens[4]?.kind === "op" ? tokens[4].value : null;
298
+ if (op === ">=") {
299
+ const n = numLitWithSign(tokens, 5);
300
+ if (n !== null && 5 + n.consumed === tokens.length)
301
+ return { min: n.value };
302
+ }
303
+ if (op === "<=") {
304
+ const n = numLitWithSign(tokens, 5);
305
+ if (n !== null && 5 + n.consumed === tokens.length)
306
+ return { max: n.value };
307
+ }
308
+ }
309
+
310
+ // json_valid(<col>) → isJsonValid (SQLite JSON-encoded column).
311
+ if (
312
+ tokens[0]?.kind === "ident" &&
313
+ tokens[0].value === "json_valid" &&
314
+ tokens[1]?.kind === "punct" &&
315
+ tokens[1].value === "(" &&
316
+ isColRef(tokens[2], ctx.columnName) &&
317
+ tokens[3]?.kind === "punct" &&
318
+ tokens[3].value === ")" &&
319
+ tokens.length === 4
320
+ ) {
321
+ return { isJsonValid: true };
322
+ }
323
+
324
+ // json_valid(<col>) AND json_array_length(<col>) = N → tuple of length N.
325
+ if (
326
+ tokens[0]?.kind === "ident" &&
327
+ tokens[0].value === "json_valid" &&
328
+ tokens[1]?.kind === "punct" &&
329
+ tokens[1].value === "(" &&
330
+ isColRef(tokens[2], ctx.columnName) &&
331
+ tokens[3]?.kind === "punct" &&
332
+ tokens[3].value === ")" &&
333
+ tokens[4]?.kind === "ident" &&
334
+ tokens[4].value === "and" &&
335
+ tokens[5]?.kind === "ident" &&
336
+ tokens[5].value === "json_array_length" &&
337
+ tokens[6]?.kind === "punct" &&
338
+ tokens[6].value === "(" &&
339
+ isColRef(tokens[7], ctx.columnName) &&
340
+ tokens[8]?.kind === "punct" &&
341
+ tokens[8].value === ")" &&
342
+ tokens[9]?.kind === "op" &&
343
+ tokens[9].value === "="
344
+ ) {
345
+ const n = numLitWithSign(tokens, 10);
346
+ if (n !== null && 10 + n.consumed === tokens.length) {
347
+ return { isJsonValid: true, tupleLength: n.value };
348
+ }
349
+ }
350
+
351
+ // shapecraft_array_is_unique(<col>) → uniqueItems
352
+ if (
353
+ tokens[0]?.kind === "ident" &&
354
+ tokens[0].value === "shapecraft_array_is_unique" &&
355
+ tokens[1]?.kind === "punct" &&
356
+ tokens[1].value === "(" &&
357
+ isColRef(tokens[2], ctx.columnName) &&
358
+ tokens[3]?.kind === "punct" &&
359
+ tokens[3].value === ")" &&
360
+ tokens.length === 4
361
+ ) {
362
+ return { uniqueItems: true };
363
+ }
364
+
365
+ // SQLite uniqueItems pattern:
366
+ // (SELECT COUNT(*) FROM json_each(<col>))
367
+ // = (SELECT COUNT(DISTINCT value) FROM json_each(<col>))
368
+ if (matchSqliteUniqueItems(tokens, ctx)) {
369
+ return { uniqueItems: true };
370
+ }
371
+
372
+ return null;
373
+ };
374
+
375
+ // Match the exact token shape:
376
+ // ( SELECT COUNT ( * ) FROM json_each ( <col> ) )
377
+ // = ( SELECT COUNT ( DISTINCT value ) FROM json_each ( <col> ) )
378
+ const matchSqliteUniqueItems = (tokens: Token[], ctx: CheckCtx): boolean => {
379
+ const isIdent = (t: Token | undefined, v: string): boolean =>
380
+ t !== undefined && t.kind === "ident" && t.value === v;
381
+ const isPunct = (t: Token | undefined, v: string): boolean =>
382
+ t !== undefined && t.kind === "punct" && t.value === v;
383
+ const isOp = (t: Token | undefined, v: string): boolean =>
384
+ t !== undefined && t.kind === "op" && t.value === v;
385
+
386
+ // Skim past wrapping parens (peeled by stripParens already, but the
387
+ // body itself is two paren-wrapped subqueries joined by `=`).
388
+ let i = 0;
389
+ if (!isPunct(tokens[i], "(")) return false;
390
+ i += 1;
391
+ if (!isIdent(tokens[i], "select")) return false;
392
+ i += 1;
393
+ if (!isIdent(tokens[i], "count")) return false;
394
+ i += 1;
395
+ if (!isPunct(tokens[i], "(")) return false;
396
+ i += 1;
397
+ if (!isOp(tokens[i], "*")) return false;
398
+ i += 1;
399
+ if (!isPunct(tokens[i], ")")) return false;
400
+ i += 1;
401
+ if (!isIdent(tokens[i], "from")) return false;
402
+ i += 1;
403
+ if (!isIdent(tokens[i], "json_each")) return false;
404
+ i += 1;
405
+ if (!isPunct(tokens[i], "(")) return false;
406
+ i += 1;
407
+ if (!isColRef(tokens[i], ctx.columnName)) return false;
408
+ i += 1;
409
+ if (!isPunct(tokens[i], ")")) return false;
410
+ i += 1;
411
+ if (!isPunct(tokens[i], ")")) return false;
412
+ i += 1;
413
+ if (!isOp(tokens[i], "=")) return false;
414
+ i += 1;
415
+ if (!isPunct(tokens[i], "(")) return false;
416
+ i += 1;
417
+ if (!isIdent(tokens[i], "select")) return false;
418
+ i += 1;
419
+ if (!isIdent(tokens[i], "count")) return false;
420
+ i += 1;
421
+ if (!isPunct(tokens[i], "(")) return false;
422
+ i += 1;
423
+ if (!isIdent(tokens[i], "distinct")) return false;
424
+ i += 1;
425
+ if (!isIdent(tokens[i], "value")) return false;
426
+ i += 1;
427
+ if (!isPunct(tokens[i], ")")) return false;
428
+ i += 1;
429
+ if (!isIdent(tokens[i], "from")) return false;
430
+ i += 1;
431
+ if (!isIdent(tokens[i], "json_each")) return false;
432
+ i += 1;
433
+ if (!isPunct(tokens[i], "(")) return false;
434
+ i += 1;
435
+ if (!isColRef(tokens[i], ctx.columnName)) return false;
436
+ i += 1;
437
+ if (!isPunct(tokens[i], ")")) return false;
438
+ i += 1;
439
+ if (!isPunct(tokens[i], ")")) return false;
440
+ i += 1;
441
+ return i === tokens.length;
442
+ };
443
+
444
+ export const decodeCheck = (
445
+ rawTokens: Token[],
446
+ ctx: CheckCtx,
447
+ ): DecodedCheck => {
448
+ let body = stripParens(rawTokens);
449
+
450
+ // try peel IS NULL OR …
451
+ const peeled = peelIsNullOr(body, ctx);
452
+ if (peeled !== null) body = peeled;
453
+
454
+ const updates = tryDecode(body, ctx);
455
+ if (updates !== null) return { updates, fullyDecoded: true };
456
+ return { updates: {}, fullyDecoded: false };
457
+ };