@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,809 @@
1
+ import { ReferentialAction } from "../../../annotation";
2
+ import { annotate, shapes } from "../../../shape";
3
+ import { SQLDialect } from "../options";
4
+ import { checkExprToSql, decodeCheck } from "./check-decoder";
5
+ import { ParseError, TokenCursor } from "./cursor";
6
+ import { decodeDefault } from "./default-decoder";
7
+ import { Token } from "./lexer";
8
+ import { Registries, resolvePgType } from "./pg-types";
9
+ import { resolveSqliteType } from "./sqlite-types";
10
+ import { parseTypeSpec, ParsedTypeSpec } from "./type-spec";
11
+
12
+ export type ParsedTable = {
13
+ schema?: string;
14
+ name: string;
15
+ columns: Array<{ key: string; shape: shapes.Shape }>;
16
+ uniqueConstraints?: Array<{ columns: string[]; name?: string }>;
17
+ mappingAnno: {
18
+ title: string;
19
+ schema?: string;
20
+ check?: string;
21
+ description?: string;
22
+ };
23
+ };
24
+
25
+ export type ParseTableOptions = {
26
+ registries: Registries;
27
+ dialect: SQLDialect;
28
+ };
29
+
30
+ const qualifiedName = (parts: string[]): { schema?: string; name: string } => {
31
+ if (parts.length === 1) return { name: parts[0]! };
32
+ return { schema: parts[0]!, name: parts.slice(1).join(".") };
33
+ };
34
+
35
+ const splitAtTopLevelCommas = (tokens: Token[]): Token[][] => {
36
+ const out: Token[][] = [];
37
+ let buf: Token[] = [];
38
+ let depth = 0;
39
+ for (const t of tokens) {
40
+ if (t.kind === "punct" && t.value === "(") depth += 1;
41
+ else if (t.kind === "punct" && t.value === ")") depth -= 1;
42
+ if (t.kind === "punct" && t.value === "," && depth === 0) {
43
+ if (buf.length > 0) out.push(buf);
44
+ buf = [];
45
+ continue;
46
+ }
47
+ buf.push(t);
48
+ }
49
+ if (buf.length > 0) out.push(buf);
50
+ return out;
51
+ };
52
+
53
+ const REF_ACTION_MAP: Record<string, ReferentialAction> = {
54
+ cascade: "cascade",
55
+ restrict: "restrict",
56
+ // "set null" / "set default" are two-word — handled in parsing
57
+ };
58
+
59
+ const parseReferentialAction = (c: TokenCursor): ReferentialAction | null => {
60
+ if (c.consumeIdent("cascade")) return "cascade";
61
+ if (c.consumeIdent("restrict")) return "restrict";
62
+ if (c.consumeIdent("no")) {
63
+ c.consumeIdent("action");
64
+ return "noAction";
65
+ }
66
+ if (c.consumeIdent("set")) {
67
+ if (c.consumeIdent("null")) return "setNull";
68
+ if (c.consumeIdent("default")) return "setDefault";
69
+ return null;
70
+ }
71
+ return null;
72
+ };
73
+
74
+ // Read the type spec tokens up to where a column constraint keyword begins
75
+ // (or end of column-def). Returns the consumed tokens.
76
+ const readTypeTokens = (c: TokenCursor): Token[] => {
77
+ const out: Token[] = [];
78
+ // first ident (the base type or first part of qualified name)
79
+ if (c.peek().kind !== "ident") {
80
+ // unexpected — caller should error
81
+ return out;
82
+ }
83
+ out.push(c.consume());
84
+ // dotted continuation
85
+ while (c.isPunct(".")) {
86
+ out.push(c.consume()); // '.'
87
+ if (c.peek().kind !== "ident") break;
88
+ out.push(c.consume());
89
+ }
90
+ // multi-word types: peek for known continuations
91
+ const firstTwoExtend = (a: string, b: string): boolean => {
92
+ const combos = [
93
+ "double precision",
94
+ "character varying",
95
+ "bit varying",
96
+ "timestamp with",
97
+ "time with",
98
+ "timestamp without",
99
+ "time without",
100
+ ];
101
+ return combos.includes(`${a} ${b}`);
102
+ };
103
+ const first = out[0]?.value;
104
+ const next = c.peek();
105
+ if (
106
+ typeof first === "string" &&
107
+ next.kind === "ident" &&
108
+ !next.quoted &&
109
+ firstTwoExtend(first, next.value)
110
+ ) {
111
+ out.push(c.consume());
112
+ // possibly "time zone" suffix
113
+ if (c.isIdent("time") && c.peek(1).kind === "ident") {
114
+ const t1 = c.peek(1);
115
+ if (t1.kind === "ident" && t1.value === "zone") {
116
+ out.push(c.consume());
117
+ out.push(c.consume());
118
+ }
119
+ }
120
+ }
121
+ // optional (args)
122
+ if (c.isPunct("(")) {
123
+ out.push(c.consume());
124
+ let depth = 1;
125
+ while (!c.done() && depth > 0) {
126
+ const t = c.peek();
127
+ if (t.kind === "punct" && t.value === "(") depth += 1;
128
+ if (t.kind === "punct" && t.value === ")") depth -= 1;
129
+ out.push(c.consume());
130
+ }
131
+ }
132
+ // optional [] array suffix
133
+ while (
134
+ c.isPunct("[") &&
135
+ c.peek(1).kind === "punct" &&
136
+ c.peek(1).value === "]"
137
+ ) {
138
+ out.push(c.consume());
139
+ out.push(c.consume());
140
+ }
141
+ return out;
142
+ };
143
+
144
+ type ColMeta = {
145
+ notNull: boolean;
146
+ primary: boolean;
147
+ unique: boolean;
148
+ autoIncrement: boolean;
149
+ default?: { kind: "literal"; value: unknown } | { kind: "expr"; sql: string };
150
+ foreign?: {
151
+ table: string;
152
+ column: string;
153
+ onDelete?: ReferentialAction;
154
+ onUpdate?: ReferentialAction;
155
+ };
156
+ generated?: { expression: string; stored: boolean };
157
+ checks: Array<Token[]>;
158
+ };
159
+
160
+ // Convert generated-as-expression tokens to a clean SQL string.
161
+ const tokensToExprSql = (tokens: Token[]): string => checkExprToSql(tokens);
162
+
163
+ const parseColumnConstraints = (c: TokenCursor): ColMeta => {
164
+ const meta: ColMeta = {
165
+ notNull: false,
166
+ primary: false,
167
+ unique: false,
168
+ autoIncrement: false,
169
+ checks: [],
170
+ };
171
+ while (!c.done()) {
172
+ if (c.consumeIdent("constraint")) {
173
+ // anonymous constraint name — consume it
174
+ if (c.peek().kind === "ident") c.consume();
175
+ continue;
176
+ }
177
+ if (c.consumeIdent("not")) {
178
+ if (c.consumeIdent("null")) {
179
+ meta.notNull = true;
180
+ continue;
181
+ }
182
+ // unknown form — bail
183
+ break;
184
+ }
185
+ if (c.consumeIdent("null")) {
186
+ // explicit NULL — nothing to do
187
+ continue;
188
+ }
189
+ if (c.consumeIdent("primary")) {
190
+ c.consumeIdent("key");
191
+ meta.primary = true;
192
+ continue;
193
+ }
194
+ if (c.consumeIdent("autoincrement")) {
195
+ // SQLite-only keyword, but accepting it in any dialect is harmless.
196
+ meta.autoIncrement = true;
197
+ continue;
198
+ }
199
+ if (c.consumeIdent("unique")) {
200
+ meta.unique = true;
201
+ continue;
202
+ }
203
+ if (c.consumeIdent("default")) {
204
+ const defTokens = readDefaultExpr(c);
205
+ meta.default = decodeDefault(defTokens, null);
206
+ continue;
207
+ }
208
+ if (c.consumeIdent("references")) {
209
+ meta.foreign = parseReferencesClause(c);
210
+ continue;
211
+ }
212
+ if (c.consumeIdent("check")) {
213
+ const inner = c.skipParens();
214
+ meta.checks.push(inner);
215
+ continue;
216
+ }
217
+ if (c.consumeIdent("generated")) {
218
+ // GENERATED [ALWAYS|BY DEFAULT] AS (...) STORED
219
+ // GENERATED [ALWAYS|BY DEFAULT] AS IDENTITY [(seq opts)]
220
+ let byDefault = false;
221
+ if (c.consumeIdent("always")) {
222
+ /* */
223
+ } else if (c.consumeIdent("by")) {
224
+ c.consumeIdent("default");
225
+ byDefault = true;
226
+ }
227
+ c.expectIdent("as");
228
+ if (c.consumeIdent("identity")) {
229
+ meta.autoIncrement = true;
230
+ // optional (sequence options)
231
+ if (c.isPunct("(")) c.skipParens();
232
+ continue;
233
+ }
234
+ // expression
235
+ const inner = c.skipParens();
236
+ // STORED keyword (optional but typical)
237
+ let stored = true;
238
+ if (c.consumeIdent("stored")) stored = true;
239
+ if (c.consumeIdent("virtual")) stored = false;
240
+ meta.generated = { expression: tokensToExprSql(inner), stored };
241
+ if (byDefault) {
242
+ // not really meaningful for expression-generated columns; ignore
243
+ }
244
+ continue;
245
+ }
246
+ if (c.consumeIdent("collate")) {
247
+ // collate name — consume one ident
248
+ if (c.peek().kind === "ident") c.consume();
249
+ continue;
250
+ }
251
+ if (c.consumeIdent("deferrable")) continue;
252
+ if (c.consumeIdent("not") && c.consumeIdent("deferrable")) continue;
253
+ if (c.consumeIdent("initially")) {
254
+ if (c.peek().kind === "ident") c.consume();
255
+ continue;
256
+ }
257
+ // Unrecognized constraint — bail
258
+ break;
259
+ }
260
+ return meta;
261
+ };
262
+
263
+ const parseReferencesClause = (
264
+ c: TokenCursor,
265
+ ): {
266
+ table: string;
267
+ column: string;
268
+ onDelete?: ReferentialAction;
269
+ onUpdate?: ReferentialAction;
270
+ } => {
271
+ const parts = c.readDottedName();
272
+ const qn = qualifiedName(parts);
273
+ let column = "id";
274
+ if (c.consumePunct("(")) {
275
+ const colTok = c.expectAnyIdent();
276
+ column = colTok.name;
277
+ c.expectPunct(")");
278
+ }
279
+ const out: {
280
+ table: string;
281
+ column: string;
282
+ onDelete?: ReferentialAction;
283
+ onUpdate?: ReferentialAction;
284
+ } = { table: qn.name, column };
285
+ while (c.consumeIdent("on")) {
286
+ if (c.consumeIdent("delete")) {
287
+ const a = parseReferentialAction(c);
288
+ if (a !== null) out.onDelete = a;
289
+ } else if (c.consumeIdent("update")) {
290
+ const a = parseReferentialAction(c);
291
+ if (a !== null) out.onUpdate = a;
292
+ } else break;
293
+ }
294
+ // MATCH FULL / SIMPLE / PARTIAL — consume
295
+ if (c.consumeIdent("match")) {
296
+ if (c.peek().kind === "ident") c.consume();
297
+ }
298
+ return out;
299
+ };
300
+
301
+ // Read a DEFAULT expression — terminate on a known constraint-start keyword
302
+ // or end of input.
303
+ const readDefaultExpr = (c: TokenCursor): Token[] => {
304
+ const out: Token[] = [];
305
+ let depth = 0;
306
+ const STOP = new Set([
307
+ "not",
308
+ "null",
309
+ "primary",
310
+ "unique",
311
+ "references",
312
+ "check",
313
+ "default",
314
+ "generated",
315
+ "constraint",
316
+ "collate",
317
+ "deferrable",
318
+ "initially",
319
+ ]);
320
+ while (!c.done()) {
321
+ const t = c.peek();
322
+ if (t.kind === "punct" && t.value === "(") depth += 1;
323
+ if (t.kind === "punct" && t.value === ")") depth -= 1;
324
+ if (depth === 0 && t.kind === "ident" && !t.quoted && STOP.has(t.value))
325
+ break;
326
+ out.push(t);
327
+ c.consume();
328
+ }
329
+ return out;
330
+ };
331
+
332
+ // Apply a column shape with the column metadata to produce a final shape with
333
+ // annotations folded in. `ctx.isString/isInteger/isArray` are derived from the
334
+ // resolved base shape.
335
+ const applyColumnMeta = (
336
+ baseShape: shapes.Shape,
337
+ meta: ColMeta,
338
+ pgType: string,
339
+ columnName: string,
340
+ ): shapes.Shape => {
341
+ // First pass: collect all decoded CHECK updates and the leftover raw
342
+ // expressions. Aggregating before applying lets us swap the base shape
343
+ // (e.g. INTEGER → boolean, TEXT → array) based on the union of hints
344
+ // rather than the order they appeared.
345
+ const ctx = {
346
+ columnName,
347
+ isInteger: baseShape.type === "number",
348
+ isString: baseShape.type === "string",
349
+ isArray: baseShape.type === "array",
350
+ };
351
+ const combined: {
352
+ min?: number;
353
+ max?: number;
354
+ pattern?: string;
355
+ uniqueItems?: boolean;
356
+ unionLiterals?: string[];
357
+ isBooleanInt?: boolean;
358
+ isJsonValid?: boolean;
359
+ tupleLength?: number;
360
+ } = {};
361
+ const rawChecks: string[] = [];
362
+ for (const chkTokens of meta.checks) {
363
+ const dec = decodeCheck(chkTokens, ctx);
364
+ if (!dec.fullyDecoded) {
365
+ rawChecks.push(checkExprToSql(chkTokens));
366
+ continue;
367
+ }
368
+ const u = dec.updates;
369
+ if (u.min !== undefined) combined.min = u.min;
370
+ if (u.max !== undefined) combined.max = u.max;
371
+ if (u.pattern !== undefined) combined.pattern = u.pattern;
372
+ if (u.uniqueItems === true) combined.uniqueItems = true;
373
+ if (u.unionLiterals !== undefined) combined.unionLiterals = u.unionLiterals;
374
+ if (u.isBooleanInt === true) combined.isBooleanInt = true;
375
+ if (u.isJsonValid === true) combined.isJsonValid = true;
376
+ if (u.tupleLength !== undefined) combined.tupleLength = u.tupleLength;
377
+ }
378
+
379
+ // Swap the base shape if CHECKs reveal a different underlying type.
380
+ let shape: shapes.Shape = baseShape;
381
+ if (combined.isBooleanInt === true && baseShape.type === "number") {
382
+ shape = shapes.boolean();
383
+ } else if (combined.isJsonValid === true && baseShape.type === "string") {
384
+ if (combined.tupleLength !== undefined) {
385
+ const items: shapes.Shape[] = [];
386
+ for (let i = 0; i < combined.tupleLength; i += 1)
387
+ items.push(shapes.unknown());
388
+ shape = shapes.tuple(...items);
389
+ } else if (
390
+ combined.min !== undefined ||
391
+ combined.max !== undefined ||
392
+ combined.uniqueItems === true
393
+ ) {
394
+ shape = shapes.array(shapes.unknown());
395
+ } else {
396
+ shape = shapes.unknown();
397
+ }
398
+ } else if (
399
+ combined.unionLiterals !== undefined &&
400
+ baseShape.type === "string"
401
+ ) {
402
+ const literals = combined.unionLiterals.map((v) => shapes.literal(v));
403
+ shape = shapes.union(literals);
404
+ }
405
+
406
+ if (!meta.notNull && !meta.primary) {
407
+ shape = annotate.optional(shape);
408
+ }
409
+ if (meta.primary) {
410
+ shape = annotate.primary(shape);
411
+ }
412
+ if (meta.unique) {
413
+ shape = annotate.unique(shape);
414
+ }
415
+ if (meta.autoIncrement) {
416
+ shape = annotate.autoIncremented(shape);
417
+ }
418
+ if (meta.foreign !== undefined) {
419
+ shape = annotate.as(shape, { foreign: meta.foreign });
420
+ }
421
+ if (meta.generated !== undefined) {
422
+ shape = annotate.as(shape, { generated: meta.generated });
423
+ }
424
+ // On a date column, re-interpret a bare string literal as a Date (SQLite
425
+ // emits `DEFAULT '2024-01-01T…'` without a `::timestamptz` cast, so the
426
+ // base decoder leaves it as a string).
427
+ if (
428
+ meta.default !== undefined &&
429
+ meta.default.kind === "literal" &&
430
+ typeof meta.default.value === "string" &&
431
+ baseShape.type === "date"
432
+ ) {
433
+ const d = new Date(meta.default.value);
434
+ const t = d.getTime();
435
+ if (!isNaN(t) && isFinite(t)) {
436
+ meta.default = { kind: "literal", value: d };
437
+ }
438
+ }
439
+ // If the column was swapped to boolean (SQLite INTEGER + IN(0,1)),
440
+ // re-interpret 0/1 numeric defaults as boolean.
441
+ if (
442
+ meta.default !== undefined &&
443
+ meta.default.kind === "literal" &&
444
+ typeof meta.default.value === "number" &&
445
+ shape.type === "boolean" &&
446
+ (meta.default.value === 0 || meta.default.value === 1)
447
+ ) {
448
+ meta.default = { kind: "literal", value: meta.default.value === 1 };
449
+ }
450
+
451
+ if (meta.default !== undefined) {
452
+ if (meta.default.kind === "literal") {
453
+ shape = annotate.as(shape, { default: meta.default.value });
454
+ } else {
455
+ // decode might have given an empty string for malformed input — skip in that case
456
+ if (meta.default.sql.length > 0) {
457
+ shape = annotate.as(shape, { defaultExpr: meta.default.sql });
458
+ }
459
+ }
460
+ }
461
+ // Re-decode defaults that need the pg type context (specifically for `'{}'` on T[])
462
+ if (
463
+ meta.default !== undefined &&
464
+ meta.default.kind === "expr" &&
465
+ pgType.endsWith("[]") &&
466
+ /^'\{}'$/.test(meta.default.sql.trim())
467
+ ) {
468
+ shape = annotate.as(shape, { default: [] });
469
+ }
470
+
471
+ if (combined.min !== undefined) {
472
+ shape = annotate.as(shape, { min: combined.min });
473
+ }
474
+ if (combined.max !== undefined) {
475
+ shape = annotate.as(shape, { max: combined.max });
476
+ }
477
+ if (combined.pattern !== undefined) {
478
+ shape = annotate.as(shape, { pattern: combined.pattern });
479
+ }
480
+ if (combined.uniqueItems === true) {
481
+ shape = annotate.as(shape, { uniqueItems: true });
482
+ }
483
+ for (const raw of rawChecks) {
484
+ shape = annotate.as(shape, { check: raw });
485
+ }
486
+
487
+ return shape;
488
+ };
489
+
490
+ export const parseCreateTable = (
491
+ tokens: Token[],
492
+ opts: ParseTableOptions,
493
+ ): ParsedTable => {
494
+ const c = new TokenCursor(tokens);
495
+ c.expectIdent("create");
496
+ if (c.consumeIdent("or")) c.expectIdent("replace");
497
+ // optional UNLOGGED / TEMPORARY etc.
498
+ c.consumeIdent("global");
499
+ c.consumeIdent("local");
500
+ c.consumeIdent("temporary");
501
+ c.consumeIdent("temp");
502
+ c.consumeIdent("unlogged");
503
+ c.expectIdent("table");
504
+ if (c.consumeIdent("if")) {
505
+ c.expectIdent("not");
506
+ c.expectIdent("exists");
507
+ }
508
+ const nameParts = c.readDottedName();
509
+ const qn = qualifiedName(nameParts);
510
+
511
+ c.expectPunct("(");
512
+ // collect everything inside the outer parens as defs
513
+ const defsTokens: Token[] = [];
514
+ let depth = 1;
515
+ while (!c.done() && depth > 0) {
516
+ const t = c.peek();
517
+ if (t.kind === "punct" && t.value === "(") depth += 1;
518
+ if (t.kind === "punct" && t.value === ")") {
519
+ depth -= 1;
520
+ if (depth === 0) {
521
+ c.consume();
522
+ break;
523
+ }
524
+ }
525
+ defsTokens.push(t);
526
+ c.consume();
527
+ }
528
+ // anything after the closing paren (PARTITION BY, WITH, etc.) is dropped
529
+
530
+ const items = splitAtTopLevelCommas(defsTokens);
531
+
532
+ const columns: Array<{ key: string; shape: shapes.Shape }> = [];
533
+ // Maps to apply table constraints retroactively
534
+ const colIndex = new Map<string, number>();
535
+ const colMetas = new Map<string, ColMeta>();
536
+ const baseShapeByName = new Map<string, shapes.Shape>();
537
+ const pgTypeByName = new Map<string, string>();
538
+ let tableCheck: string | undefined;
539
+ const uniqueConstraints: Array<{ columns: string[]; name?: string }> = [];
540
+
541
+ for (const item of items) {
542
+ if (isTableConstraint(item)) continue; // process in second pass
543
+ const ic = new TokenCursor(item);
544
+ const ident = ic.peek();
545
+ if (ident.kind !== "ident") {
546
+ throw new ParseError(
547
+ `expected column definition but found ${ident.kind}`,
548
+ ident.pos,
549
+ );
550
+ }
551
+ const colTok = ic.expectAnyIdent();
552
+ const typeTokens = readTypeTokens(ic);
553
+ const spec = parseTypeSpec(typeTokens);
554
+ const resolved =
555
+ opts.dialect === "sqlite" ?
556
+ resolveSqliteType(spec)
557
+ : resolvePgType(spec, opts.registries);
558
+ let baseShape = resolved.shape;
559
+ const meta = parseColumnConstraints(ic);
560
+ if (resolved.autoIncrement === true) {
561
+ meta.autoIncrement = true;
562
+ }
563
+ const pgType = typeSpecToString(spec);
564
+ const finalShape = applyColumnMeta(baseShape, meta, pgType, colTok.name);
565
+ columns.push({ key: colTok.name, shape: finalShape });
566
+ colIndex.set(colTok.name, columns.length - 1);
567
+ colMetas.set(colTok.name, meta);
568
+ baseShapeByName.set(colTok.name, baseShape);
569
+ pgTypeByName.set(colTok.name, pgType);
570
+ }
571
+
572
+ // Second pass: table constraints
573
+ for (const item of items) {
574
+ if (!isTableConstraint(item)) continue;
575
+ applyTableConstraint(item, {
576
+ columns,
577
+ colIndex,
578
+ pgTypeByName,
579
+ setTableCheck: (chk) => {
580
+ tableCheck = chk;
581
+ },
582
+ pushUniqueConstraint: (entry) => {
583
+ uniqueConstraints.push(entry);
584
+ },
585
+ });
586
+ }
587
+
588
+ const mappingAnno: ParsedTable["mappingAnno"] = { title: qn.name };
589
+ // In SQLite, a `main.foo`/`temp.foo` prefix is a database alias, not a
590
+ // schema in the PG sense. Drop it so re-emission doesn't try to write a
591
+ // `CREATE SCHEMA` prelude (which SQLite doesn't have).
592
+ if (qn.schema !== undefined && opts.dialect !== "sqlite") {
593
+ mappingAnno.schema = qn.schema;
594
+ }
595
+ if (tableCheck !== undefined) mappingAnno.check = tableCheck;
596
+
597
+ const out: ParsedTable = {
598
+ name: qn.name,
599
+ columns,
600
+ mappingAnno,
601
+ };
602
+ if (qn.schema !== undefined && opts.dialect !== "sqlite") {
603
+ out.schema = qn.schema;
604
+ }
605
+ if (uniqueConstraints.length > 0) out.uniqueConstraints = uniqueConstraints;
606
+ return out;
607
+ };
608
+
609
+ const typeSpecToString = (spec: ParsedTypeSpec): string => {
610
+ const base = spec.qualified ?? spec.baseName;
611
+ const args = spec.args.length > 0 ? `(${spec.args.join(",")})` : "";
612
+ const arr = spec.isArray ? "[]" : "";
613
+ return `${base}${args}${arr}`;
614
+ };
615
+
616
+ const isTableConstraint = (item: Token[]): boolean => {
617
+ const t0 = item[0];
618
+ if (t0 === undefined || t0.kind !== "ident") return false;
619
+ if (t0.value === "constraint") return true;
620
+ if (
621
+ t0.value === "primary" &&
622
+ item[1]?.kind === "ident" &&
623
+ item[1].value === "key" &&
624
+ item[2]?.kind === "punct" &&
625
+ item[2].value === "("
626
+ )
627
+ return true;
628
+ if (
629
+ t0.value === "unique" &&
630
+ item[1]?.kind === "punct" &&
631
+ item[1].value === "("
632
+ )
633
+ return true;
634
+ if (
635
+ t0.value === "foreign" &&
636
+ item[1]?.kind === "ident" &&
637
+ item[1].value === "key"
638
+ )
639
+ return true;
640
+ if (
641
+ t0.value === "check" &&
642
+ item[1]?.kind === "punct" &&
643
+ item[1].value === "("
644
+ )
645
+ return true;
646
+ if (t0.value === "exclude") return true;
647
+ if (t0.value === "like" && item[1]?.kind === "ident") return true;
648
+ return false;
649
+ };
650
+
651
+ type ApplyTableConstraintCtx = {
652
+ columns: Array<{ key: string; shape: shapes.Shape }>;
653
+ colIndex: Map<string, number>;
654
+ pgTypeByName: Map<string, string>;
655
+ setTableCheck: (chk: string) => void;
656
+ pushUniqueConstraint: (entry: { columns: string[]; name?: string }) => void;
657
+ };
658
+
659
+ const applyTableConstraint = (
660
+ item: Token[],
661
+ ctx: ApplyTableConstraintCtx,
662
+ ): void => {
663
+ const c = new TokenCursor(item);
664
+ let constraintName: string | undefined;
665
+ if (c.consumeIdent("constraint")) {
666
+ if (c.peek().kind === "ident") {
667
+ constraintName = c.consume().value;
668
+ }
669
+ }
670
+ if (c.consumeIdent("primary")) {
671
+ c.consumeIdent("key");
672
+ c.expectPunct("(");
673
+ const cols = readColList(c);
674
+ for (const col of cols) {
675
+ const idx = ctx.colIndex.get(col);
676
+ if (idx === undefined) continue;
677
+ const entry = ctx.columns[idx]!;
678
+ entry.shape = annotate.primary(entry.shape);
679
+ // primary implies not-null; remove optional
680
+ entry.shape = { ...entry.shape, anno: stripOptional(entry.shape.anno) };
681
+ }
682
+ return;
683
+ }
684
+ if (c.consumeIdent("unique")) {
685
+ c.expectPunct("(");
686
+ const cols = readColList(c);
687
+ if (cols.length === 1) {
688
+ const col = cols[0]!;
689
+ const idx = ctx.colIndex.get(col);
690
+ if (idx !== undefined) {
691
+ const entry = ctx.columns[idx]!;
692
+ entry.shape = annotate.unique(entry.shape);
693
+ }
694
+ return;
695
+ }
696
+ const entry: { columns: string[]; name?: string } = { columns: cols };
697
+ if (constraintName !== undefined) entry.name = constraintName;
698
+ ctx.pushUniqueConstraint(entry);
699
+ return;
700
+ }
701
+ if (c.consumeIdent("foreign")) {
702
+ c.expectIdent("key");
703
+ c.expectPunct("(");
704
+ const localCols = readColList(c);
705
+ c.expectIdent("references");
706
+ const parts = c.readDottedName();
707
+ const qn = qualifiedName(parts);
708
+ let refCols: string[] = [];
709
+ if (c.consumePunct("(")) {
710
+ refCols = readColList(c);
711
+ }
712
+ if (refCols.length === 0) refCols = ["id"];
713
+ let onDelete: ReferentialAction | undefined;
714
+ let onUpdate: ReferentialAction | undefined;
715
+ while (c.consumeIdent("on")) {
716
+ if (c.consumeIdent("delete")) {
717
+ const a = parseReferentialAction(c);
718
+ if (a !== null) onDelete = a;
719
+ } else if (c.consumeIdent("update")) {
720
+ const a = parseReferentialAction(c);
721
+ if (a !== null) onUpdate = a;
722
+ } else break;
723
+ }
724
+ if (c.consumeIdent("match")) {
725
+ if (c.peek().kind === "ident") c.consume();
726
+ }
727
+ for (let i = 0; i < localCols.length; i += 1) {
728
+ const local = localCols[i]!;
729
+ const ref = refCols[i] ?? refCols[refCols.length - 1]!;
730
+ const idx = ctx.colIndex.get(local);
731
+ if (idx === undefined) continue;
732
+ const entry = ctx.columns[idx]!;
733
+ const foreign: {
734
+ table: string;
735
+ column: string;
736
+ onDelete?: ReferentialAction;
737
+ onUpdate?: ReferentialAction;
738
+ } = {
739
+ table: qn.name,
740
+ column: ref,
741
+ };
742
+ if (onDelete !== undefined) foreign.onDelete = onDelete;
743
+ if (onUpdate !== undefined) foreign.onUpdate = onUpdate;
744
+ entry.shape = annotate.as(entry.shape, { foreign });
745
+ }
746
+ return;
747
+ }
748
+ if (c.consumeIdent("check")) {
749
+ const inner = c.skipParens();
750
+ // Try to decode as a per-column constraint matching any column in this table
751
+ for (const col of ctx.columns) {
752
+ const base = col.shape;
753
+ const dec = decodeCheck(inner, {
754
+ columnName: col.key,
755
+ isInteger: base.type === "number",
756
+ isString: base.type === "string",
757
+ isArray: base.type === "array",
758
+ });
759
+ if (dec.fullyDecoded) {
760
+ const u = dec.updates;
761
+ if (u.min !== undefined)
762
+ col.shape = annotate.as(col.shape, { min: u.min });
763
+ if (u.max !== undefined)
764
+ col.shape = annotate.as(col.shape, { max: u.max });
765
+ if (u.pattern !== undefined)
766
+ col.shape = annotate.as(col.shape, { pattern: u.pattern });
767
+ if (u.uniqueItems === true)
768
+ col.shape = annotate.as(col.shape, { uniqueItems: true });
769
+ if (u.unionLiterals !== undefined && col.shape.type === "string") {
770
+ const preserved = col.shape.anno;
771
+ const literals = u.unionLiterals.map((v) => shapes.literal(v));
772
+ const u2 = shapes.union(literals);
773
+ col.shape = {
774
+ ...u2,
775
+ anno: { ...u2.anno, ...preserved },
776
+ } as shapes.Shape;
777
+ }
778
+ return;
779
+ }
780
+ }
781
+ ctx.setTableCheck(checkExprToSql(inner));
782
+ return;
783
+ }
784
+ // exclude, like — dropped
785
+ };
786
+
787
+ const stripOptional = (anno: shapes.Shape["anno"]): shapes.Shape["anno"] => {
788
+ const out = { ...anno };
789
+ delete out.optional;
790
+ return out;
791
+ };
792
+
793
+ const readColList = (c: TokenCursor): string[] => {
794
+ const out: string[] = [];
795
+ while (!c.isPunct(")")) {
796
+ const t = c.expectAnyIdent();
797
+ out.push(t.name);
798
+ // optional ordering / nulls clauses
799
+ if (c.consumeIdent("asc") || c.consumeIdent("desc")) {
800
+ /* */
801
+ }
802
+ if (c.consumeIdent("nulls")) {
803
+ if (c.peek().kind === "ident") c.consume();
804
+ }
805
+ if (!c.consumePunct(",")) break;
806
+ }
807
+ c.expectPunct(")");
808
+ return out;
809
+ };