equipped 5.2.9 → 5.3.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 (781) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/README.md +362 -34
  3. package/dist/cjs/cache/adapters/in-memory/index.cjs +824 -0
  4. package/dist/cjs/cache/adapters/in-memory/index.cjs.map +1 -0
  5. package/dist/cjs/cache/adapters/in-memory/index.min.cjs +4 -0
  6. package/dist/cjs/cache/adapters/in-memory/index.min.cjs.map +1 -0
  7. package/dist/cjs/cache/adapters/redis/index.cjs +844 -0
  8. package/dist/cjs/cache/adapters/redis/index.cjs.map +1 -0
  9. package/dist/cjs/cache/adapters/redis/index.min.cjs +4 -0
  10. package/dist/cjs/cache/adapters/redis/index.min.cjs.map +1 -0
  11. package/dist/cjs/cache/index.cjs +602 -4
  12. package/dist/cjs/cache/index.cjs.map +1 -1
  13. package/dist/cjs/cache/index.min.cjs +3 -1
  14. package/dist/cjs/cache/index.min.cjs.map +1 -1
  15. package/dist/cjs/dbs/adapters/mongodb/index.cjs +1314 -0
  16. package/dist/cjs/dbs/adapters/mongodb/index.cjs.map +1 -0
  17. package/dist/cjs/dbs/adapters/mongodb/index.min.cjs +4 -0
  18. package/dist/cjs/dbs/adapters/mongodb/index.min.cjs.map +1 -0
  19. package/dist/cjs/dbs/index.cjs +965 -6
  20. package/dist/cjs/dbs/index.cjs.map +1 -1
  21. package/dist/cjs/dbs/index.min.cjs +3 -1
  22. package/dist/cjs/dbs/index.min.cjs.map +1 -1
  23. package/dist/cjs/errors/index.cjs +127 -8
  24. package/dist/cjs/errors/index.cjs.map +1 -1
  25. package/dist/cjs/errors/index.min.cjs +1 -1
  26. package/dist/cjs/errors/index.min.cjs.map +1 -1
  27. package/dist/cjs/events/adapters/kafka/index.cjs +845 -0
  28. package/dist/cjs/events/adapters/kafka/index.cjs.map +1 -0
  29. package/dist/cjs/events/adapters/kafka/index.min.cjs +4 -0
  30. package/dist/cjs/events/adapters/kafka/index.min.cjs.map +1 -0
  31. package/dist/cjs/events/adapters/rabbitmq/index.cjs +836 -0
  32. package/dist/cjs/events/adapters/rabbitmq/index.cjs.map +1 -0
  33. package/dist/cjs/events/adapters/rabbitmq/index.min.cjs +4 -0
  34. package/dist/cjs/events/adapters/rabbitmq/index.min.cjs.map +1 -0
  35. package/dist/cjs/events/index.cjs +33 -4
  36. package/dist/cjs/events/index.cjs.map +1 -1
  37. package/dist/cjs/events/index.min.cjs +1 -1
  38. package/dist/cjs/events/index.min.cjs.map +1 -1
  39. package/dist/cjs/index.cjs +588 -1
  40. package/dist/cjs/index.cjs.map +1 -1
  41. package/dist/cjs/index.min.cjs +3 -1
  42. package/dist/cjs/index.min.cjs.map +1 -1
  43. package/dist/cjs/instance/index.cjs +514 -64
  44. package/dist/cjs/instance/index.cjs.map +1 -1
  45. package/dist/cjs/instance/index.min.cjs +3 -3
  46. package/dist/cjs/instance/index.min.cjs.map +1 -1
  47. package/dist/cjs/jobs/adapters/redis/index.cjs +979 -0
  48. package/dist/cjs/jobs/adapters/redis/index.cjs.map +1 -0
  49. package/dist/cjs/jobs/adapters/redis/index.min.cjs +4 -0
  50. package/dist/cjs/jobs/adapters/redis/index.min.cjs.map +1 -0
  51. package/dist/cjs/jobs/index.cjs +55 -2
  52. package/dist/cjs/jobs/index.cjs.map +1 -1
  53. package/dist/cjs/jobs/index.min.cjs +1 -1
  54. package/dist/cjs/jobs/index.min.cjs.map +1 -1
  55. package/dist/cjs/orm/adapters/in-memory/index.cjs +2551 -0
  56. package/dist/cjs/orm/adapters/in-memory/index.cjs.map +1 -0
  57. package/dist/cjs/orm/adapters/in-memory/index.min.cjs +4 -0
  58. package/dist/cjs/orm/adapters/in-memory/index.min.cjs.map +1 -0
  59. package/dist/cjs/orm/adapters/json/index.cjs +3518 -0
  60. package/dist/cjs/orm/adapters/json/index.cjs.map +1 -0
  61. package/dist/cjs/orm/adapters/json/index.min.cjs +4 -0
  62. package/dist/cjs/orm/adapters/json/index.min.cjs.map +1 -0
  63. package/dist/cjs/orm/adapters/mongodb/index.cjs +3299 -0
  64. package/dist/cjs/orm/adapters/mongodb/index.cjs.map +1 -0
  65. package/dist/cjs/orm/adapters/mongodb/index.min.cjs +4 -0
  66. package/dist/cjs/orm/adapters/mongodb/index.min.cjs.map +1 -0
  67. package/dist/cjs/orm/adapters/postgresql/index.cjs +4114 -0
  68. package/dist/cjs/orm/adapters/postgresql/index.cjs.map +1 -0
  69. package/dist/cjs/orm/adapters/postgresql/index.min.cjs +49 -0
  70. package/dist/cjs/orm/adapters/postgresql/index.min.cjs.map +1 -0
  71. package/dist/cjs/orm/index.cjs +9216 -0
  72. package/dist/cjs/orm/index.cjs.map +1 -0
  73. package/dist/cjs/orm/index.min.cjs +4 -0
  74. package/dist/cjs/orm/index.min.cjs.map +1 -0
  75. package/dist/cjs/server/adapters/express/index.cjs +1967 -0
  76. package/dist/cjs/server/adapters/express/index.cjs.map +1 -0
  77. package/dist/cjs/server/adapters/express/index.min.cjs +32 -0
  78. package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -0
  79. package/dist/cjs/server/adapters/fastify/index.cjs +1974 -0
  80. package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -0
  81. package/dist/cjs/server/adapters/fastify/index.min.cjs +32 -0
  82. package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -0
  83. package/dist/cjs/server/index.cjs +1811 -9
  84. package/dist/cjs/server/index.cjs.map +1 -1
  85. package/dist/cjs/server/index.min.cjs +31 -1
  86. package/dist/cjs/server/index.min.cjs.map +1 -1
  87. package/dist/cjs/types/index.cjs +18 -1
  88. package/dist/cjs/types/index.cjs.map +1 -1
  89. package/dist/cjs/types/index.min.cjs +1 -1
  90. package/dist/cjs/types/index.min.cjs.map +1 -1
  91. package/dist/cjs/utilities/index.cjs +862 -7
  92. package/dist/cjs/utilities/index.cjs.map +1 -1
  93. package/dist/cjs/utilities/index.min.cjs +3 -1
  94. package/dist/cjs/utilities/index.min.cjs.map +1 -1
  95. package/dist/cjs/validations/index.cjs +679 -10
  96. package/dist/cjs/validations/index.cjs.map +1 -1
  97. package/dist/cjs/validations/index.min.cjs +3 -1
  98. package/dist/cjs/validations/index.min.cjs.map +1 -1
  99. package/dist/esm/cache/adapters/in-memory/index.min.mjs +2 -0
  100. package/dist/esm/cache/adapters/in-memory/index.min.mjs.map +1 -0
  101. package/dist/esm/cache/adapters/in-memory/index.mjs +93 -0
  102. package/dist/esm/cache/adapters/in-memory/index.mjs.map +1 -0
  103. package/dist/esm/cache/adapters/redis/index.min.mjs +2 -0
  104. package/dist/esm/cache/adapters/redis/index.mjs +13 -0
  105. package/dist/esm/cache/index.min.mjs +1 -1
  106. package/dist/esm/cache/index.min.mjs.map +1 -1
  107. package/dist/esm/cache/index.mjs +9 -4
  108. package/dist/esm/cache/index.mjs.map +1 -1
  109. package/dist/esm/chunk-4JLDXF7T.min.mjs +2 -0
  110. package/dist/esm/chunk-4JLDXF7T.min.mjs.map +1 -0
  111. package/dist/{types/events/types/kafka.js → esm/chunk-4MXYZS5R.mjs} +60 -37
  112. package/dist/esm/chunk-4MXYZS5R.mjs.map +1 -0
  113. package/dist/esm/chunk-5VW3JAFR.min.mjs +2 -0
  114. package/dist/esm/chunk-5VW3JAFR.min.mjs.map +1 -0
  115. package/dist/esm/chunk-AKQBDYUO.mjs +126 -0
  116. package/dist/esm/chunk-AKQBDYUO.mjs.map +1 -0
  117. package/dist/esm/chunk-AQY7QVYI.min.mjs +2 -0
  118. package/dist/esm/chunk-B5QQ32YY.min.mjs +2 -0
  119. package/dist/esm/chunk-B5QQ32YY.min.mjs.map +1 -0
  120. package/dist/esm/chunk-BJNIUCPT.min.mjs +2 -0
  121. package/dist/esm/chunk-BJNIUCPT.min.mjs.map +1 -0
  122. package/dist/esm/chunk-DKPZJIIR.mjs +29 -0
  123. package/dist/esm/chunk-DKPZJIIR.mjs.map +1 -0
  124. package/dist/esm/chunk-DSUJ5FUL.min.mjs +2 -0
  125. package/dist/esm/chunk-DSUJ5FUL.min.mjs.map +1 -0
  126. package/dist/esm/chunk-FLAPYQUT.min.mjs +32 -0
  127. package/dist/esm/chunk-FLAPYQUT.min.mjs.map +1 -0
  128. package/dist/esm/chunk-J5LGTIGS.mjs +10 -0
  129. package/dist/esm/chunk-JH6EBXY4.mjs +53 -0
  130. package/dist/esm/chunk-JH6EBXY4.mjs.map +1 -0
  131. package/dist/esm/chunk-MDQKODYQ.mjs +2035 -0
  132. package/dist/esm/chunk-MDQKODYQ.mjs.map +1 -0
  133. package/dist/esm/chunk-PCAUXBAG.min.mjs +2 -0
  134. package/dist/esm/chunk-PCAUXBAG.min.mjs.map +1 -0
  135. package/dist/esm/chunk-PNZNNUMN.mjs +113 -0
  136. package/dist/esm/chunk-PNZNNUMN.mjs.map +1 -0
  137. package/dist/esm/chunk-PQCBVQL6.mjs +1280 -0
  138. package/dist/esm/chunk-PQCBVQL6.mjs.map +1 -0
  139. package/dist/esm/chunk-QHLKB47N.min.mjs +2 -0
  140. package/dist/esm/chunk-QHLKB47N.min.mjs.map +1 -0
  141. package/dist/esm/chunk-SGZNOYC3.min.mjs +2 -0
  142. package/dist/esm/chunk-SGZNOYC3.min.mjs.map +1 -0
  143. package/dist/esm/chunk-TVTYDU2D.mjs +795 -0
  144. package/dist/esm/chunk-TVTYDU2D.mjs.map +1 -0
  145. package/dist/esm/chunk-VCCS7CAI.mjs +8 -0
  146. package/dist/esm/chunk-VCCS7CAI.mjs.map +1 -0
  147. package/dist/esm/chunk-Z2TZ3KR7.mjs +22 -0
  148. package/dist/esm/chunk-Z2TZ3KR7.mjs.map +1 -0
  149. package/dist/esm/chunk-ZGMFFK6Y.min.mjs +2 -0
  150. package/dist/esm/chunk-ZGMFFK6Y.min.mjs.map +1 -0
  151. package/dist/esm/dbs/adapters/mongodb/index.min.mjs +2 -0
  152. package/dist/esm/dbs/adapters/mongodb/index.min.mjs.map +1 -0
  153. package/dist/esm/dbs/adapters/mongodb/index.mjs +419 -0
  154. package/dist/esm/dbs/adapters/mongodb/index.mjs.map +1 -0
  155. package/dist/esm/dbs/index.min.mjs +1 -1
  156. package/dist/esm/dbs/index.min.mjs.map +1 -1
  157. package/dist/esm/dbs/index.mjs +22 -6
  158. package/dist/esm/dbs/index.mjs.map +1 -1
  159. package/dist/esm/errors/index.min.mjs +1 -1
  160. package/dist/esm/errors/index.min.mjs.map +1 -1
  161. package/dist/esm/errors/index.mjs +22 -8
  162. package/dist/esm/errors/index.mjs.map +1 -1
  163. package/dist/esm/events/adapters/kafka/index.min.mjs +2 -0
  164. package/dist/esm/events/adapters/kafka/index.min.mjs.map +1 -0
  165. package/dist/esm/events/adapters/kafka/index.mjs +12 -0
  166. package/dist/esm/events/adapters/kafka/index.mjs.map +1 -0
  167. package/dist/esm/events/adapters/rabbitmq/index.min.mjs +2 -0
  168. package/dist/esm/events/adapters/rabbitmq/index.min.mjs.map +1 -0
  169. package/dist/esm/events/adapters/rabbitmq/index.mjs +92 -0
  170. package/dist/esm/events/adapters/rabbitmq/index.mjs.map +1 -0
  171. package/dist/esm/events/index.min.mjs +1 -1
  172. package/dist/esm/events/index.min.mjs.map +1 -1
  173. package/dist/esm/events/index.mjs +7 -4
  174. package/dist/esm/events/index.mjs.map +1 -1
  175. package/dist/esm/index.min.mjs +1 -1
  176. package/dist/esm/index.min.mjs.map +1 -1
  177. package/dist/esm/index.mjs +8 -1
  178. package/dist/esm/index.mjs.map +1 -1
  179. package/dist/esm/instance/index.min.mjs +1 -3
  180. package/dist/esm/instance/index.min.mjs.map +1 -1
  181. package/dist/esm/instance/index.mjs +4 -132
  182. package/dist/esm/instance/index.mjs.map +1 -1
  183. package/dist/esm/introspection-32BRYKYY.mjs +10 -0
  184. package/dist/esm/introspection-32BRYKYY.mjs.map +1 -0
  185. package/dist/esm/introspection-A72WMWE3.min.mjs +2 -0
  186. package/dist/esm/introspection-A72WMWE3.min.mjs.map +1 -0
  187. package/dist/esm/jobs/adapters/redis/index.min.mjs +2 -0
  188. package/dist/esm/jobs/adapters/redis/index.min.mjs.map +1 -0
  189. package/dist/esm/jobs/{types/redis.mjs → adapters/redis/index.mjs} +71 -56
  190. package/dist/esm/jobs/adapters/redis/index.mjs.map +1 -0
  191. package/dist/esm/jobs/index.min.mjs +1 -1
  192. package/dist/esm/jobs/index.min.mjs.map +1 -1
  193. package/dist/esm/jobs/index.mjs +9 -2
  194. package/dist/esm/jobs/index.mjs.map +1 -1
  195. package/dist/esm/orm/adapters/in-memory/index.min.mjs +2 -0
  196. package/dist/esm/orm/adapters/in-memory/index.min.mjs.map +1 -0
  197. package/dist/esm/orm/adapters/in-memory/index.mjs +11 -0
  198. package/dist/esm/orm/adapters/in-memory/index.mjs.map +1 -0
  199. package/dist/esm/orm/adapters/json/index.min.mjs +2 -0
  200. package/dist/esm/orm/adapters/json/index.min.mjs.map +1 -0
  201. package/dist/esm/orm/adapters/json/index.mjs +980 -0
  202. package/dist/esm/orm/adapters/json/index.mjs.map +1 -0
  203. package/dist/esm/orm/adapters/mongodb/index.min.mjs +2 -0
  204. package/dist/esm/orm/adapters/mongodb/index.min.mjs.map +1 -0
  205. package/dist/esm/orm/adapters/mongodb/index.mjs +1539 -0
  206. package/dist/esm/orm/adapters/mongodb/index.mjs.map +1 -0
  207. package/dist/esm/orm/adapters/postgresql/index.min.mjs +47 -0
  208. package/dist/esm/orm/adapters/postgresql/index.min.mjs.map +1 -0
  209. package/dist/esm/orm/adapters/postgresql/index.mjs +2070 -0
  210. package/dist/esm/orm/adapters/postgresql/index.mjs.map +1 -0
  211. package/dist/esm/orm/index.min.mjs +2 -0
  212. package/dist/esm/orm/index.min.mjs.map +1 -0
  213. package/dist/esm/orm/index.mjs +7326 -0
  214. package/dist/esm/orm/index.mjs.map +1 -0
  215. package/dist/esm/server/adapters/express/index.min.mjs +2 -0
  216. package/dist/esm/server/adapters/express/index.min.mjs.map +1 -0
  217. package/dist/esm/server/adapters/express/index.mjs +177 -0
  218. package/dist/esm/server/adapters/express/index.mjs.map +1 -0
  219. package/dist/esm/server/adapters/fastify/index.min.mjs +2 -0
  220. package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -0
  221. package/dist/esm/server/adapters/fastify/index.mjs +185 -0
  222. package/dist/esm/server/adapters/fastify/index.mjs.map +1 -0
  223. package/dist/esm/server/index.min.mjs +1 -1
  224. package/dist/esm/server/index.min.mjs.map +1 -1
  225. package/dist/esm/server/index.mjs +38 -9
  226. package/dist/esm/server/index.mjs.map +1 -1
  227. package/dist/esm/types/index.min.mjs +0 -1
  228. package/dist/esm/types/index.min.mjs.map +1 -1
  229. package/dist/esm/types/index.mjs +0 -1
  230. package/dist/esm/types/index.mjs.map +1 -1
  231. package/dist/esm/utilities/index.min.mjs +1 -1
  232. package/dist/esm/utilities/index.min.mjs.map +1 -1
  233. package/dist/esm/utilities/index.mjs +22 -9
  234. package/dist/esm/utilities/index.mjs.map +1 -1
  235. package/dist/esm/validations/index.min.mjs +1 -1
  236. package/dist/esm/validations/index.min.mjs.map +1 -1
  237. package/dist/esm/validations/index.mjs +8 -18
  238. package/dist/esm/validations/index.mjs.map +1 -1
  239. package/dist/types/adapter-Coap9ISX.d.ts +1435 -0
  240. package/dist/types/{fastify-DLPUK3vD.d.ts → base-DVr0fHil.d.ts} +76 -143
  241. package/dist/types/cache/adapters/in-memory/index.d.ts +21 -0
  242. package/dist/types/cache/adapters/in-memory/index.js +92 -0
  243. package/dist/types/cache/adapters/redis/index.d.ts +73 -0
  244. package/dist/types/cache/adapters/redis/index.js +12 -0
  245. package/dist/types/cache/index.d.ts +2 -42
  246. package/dist/types/cache/index.js +9 -4
  247. package/dist/types/chunk-3M4PBZAQ.js +125 -0
  248. package/dist/types/chunk-3TKJGSCZ.js +21 -0
  249. package/dist/types/chunk-65EHKCDZ.js +112 -0
  250. package/dist/types/chunk-JQ2FWX4W.js +1279 -0
  251. package/dist/types/chunk-KZKFYO4V.js +7 -0
  252. package/dist/types/chunk-LN3A6R4Y.js +28 -0
  253. package/dist/types/chunk-MLKGABMK.js +9 -0
  254. package/dist/types/chunk-NJ2FHI3U.js +794 -0
  255. package/dist/types/chunk-OHFTQGQG.js +52 -0
  256. package/dist/{esm/events/types/kafka.mjs → types/chunk-XGGGAEET.js} +59 -38
  257. package/dist/types/chunk-YTY3EFNB.js +2034 -0
  258. package/dist/types/{core-BrkNSwvc.d.ts → core-tNlIMH9Y.d.ts} +48 -38
  259. package/dist/types/dbs/adapters/mongodb/index.d.ts +43 -0
  260. package/dist/types/dbs/adapters/mongodb/index.js +418 -0
  261. package/dist/types/dbs/index.d.ts +14 -12
  262. package/dist/types/dbs/index.js +22 -6
  263. package/dist/types/equippedError-Cmo60Kn-.d.ts +8 -0
  264. package/dist/types/errors/index.d.ts +3 -3
  265. package/dist/types/errors/index.js +22 -8
  266. package/dist/types/events/adapters/kafka/index.d.ts +83 -0
  267. package/dist/types/events/adapters/kafka/index.js +11 -0
  268. package/dist/types/events/adapters/rabbitmq/index.d.ts +41 -0
  269. package/dist/types/events/adapters/rabbitmq/index.js +91 -0
  270. package/dist/types/events/index.d.ts +11 -11
  271. package/dist/types/events/index.js +7 -4
  272. package/dist/types/index.d.ts +2 -25
  273. package/dist/types/index.js +8 -1
  274. package/dist/types/instance/index.d.ts +12 -179
  275. package/dist/types/instance/index.js +4 -132
  276. package/dist/types/introspection-VOIU3XE6.js +9 -0
  277. package/dist/types/jobs/adapters/redis/index.d.ts +93 -0
  278. package/dist/types/jobs/{types/redis.js → adapters/redis/index.js} +70 -55
  279. package/dist/types/jobs/index.d.ts +19 -35
  280. package/dist/types/jobs/index.js +9 -2
  281. package/dist/types/orm/adapters/in-memory/index.d.ts +92 -0
  282. package/dist/types/orm/adapters/in-memory/index.js +10 -0
  283. package/dist/types/orm/adapters/json/index.d.ts +72 -0
  284. package/dist/types/orm/adapters/json/index.js +979 -0
  285. package/dist/types/orm/adapters/mongodb/index.d.ts +74 -0
  286. package/dist/types/orm/adapters/mongodb/index.js +1538 -0
  287. package/dist/types/orm/adapters/postgresql/index.d.ts +112 -0
  288. package/dist/types/orm/adapters/postgresql/index.js +2069 -0
  289. package/dist/types/orm/index.d.ts +160 -0
  290. package/dist/types/orm/index.js +7325 -0
  291. package/dist/types/{requestError-C2PNWUrt.d.ts → requestError-DdaL8hc3.d.ts} +2 -8
  292. package/dist/types/server/adapters/express/index.d.ts +196 -0
  293. package/dist/types/server/adapters/express/index.js +176 -0
  294. package/dist/types/server/adapters/fastify/index.d.ts +221 -0
  295. package/dist/types/server/adapters/fastify/index.js +184 -0
  296. package/dist/types/server/index.d.ts +10 -11
  297. package/dist/types/server/index.js +38 -9
  298. package/dist/types/types/index.js +0 -1
  299. package/dist/types/utilities/index.d.ts +22 -9
  300. package/dist/types/utilities/index.js +22 -9
  301. package/dist/types/{validationError-Bw8OYv5s.d.ts → validationError-oigtHqBi.d.ts} +1 -1
  302. package/dist/types/validations/index.d.ts +3 -2
  303. package/dist/types/validations/index.js +8 -18
  304. package/package.json +155 -18
  305. package/dist/cjs/audit/events.cjs +0 -101
  306. package/dist/cjs/audit/events.cjs.map +0 -1
  307. package/dist/cjs/audit/events.min.cjs +0 -2
  308. package/dist/cjs/audit/events.min.cjs.map +0 -1
  309. package/dist/cjs/audit/index.cjs +0 -2
  310. package/dist/cjs/audit/index.cjs.map +0 -1
  311. package/dist/cjs/audit/index.min.cjs +0 -2
  312. package/dist/cjs/audit/index.min.cjs.map +0 -1
  313. package/dist/cjs/cache/base.cjs +0 -6
  314. package/dist/cjs/cache/base.cjs.map +0 -1
  315. package/dist/cjs/cache/base.min.cjs +0 -2
  316. package/dist/cjs/cache/base.min.cjs.map +0 -1
  317. package/dist/cjs/cache/pipes.cjs +0 -16
  318. package/dist/cjs/cache/pipes.cjs.map +0 -1
  319. package/dist/cjs/cache/pipes.min.cjs +0 -2
  320. package/dist/cjs/cache/pipes.min.cjs.map +0 -1
  321. package/dist/cjs/cache/types/in-memory.cjs +0 -47
  322. package/dist/cjs/cache/types/in-memory.cjs.map +0 -1
  323. package/dist/cjs/cache/types/in-memory.min.cjs +0 -2
  324. package/dist/cjs/cache/types/in-memory.min.cjs.map +0 -1
  325. package/dist/cjs/cache/types/redis.cjs +0 -55
  326. package/dist/cjs/cache/types/redis.cjs.map +0 -1
  327. package/dist/cjs/cache/types/redis.min.cjs +0 -2
  328. package/dist/cjs/cache/types/redis.min.cjs.map +0 -1
  329. package/dist/cjs/dbs/base/changes.cjs +0 -36
  330. package/dist/cjs/dbs/base/changes.cjs.map +0 -1
  331. package/dist/cjs/dbs/base/changes.min.cjs +0 -2
  332. package/dist/cjs/dbs/base/changes.min.cjs.map +0 -1
  333. package/dist/cjs/dbs/base/core.cjs +0 -1
  334. package/dist/cjs/dbs/base/core.cjs.map +0 -1
  335. package/dist/cjs/dbs/base/core.min.cjs +0 -1
  336. package/dist/cjs/dbs/base/core.min.cjs.map +0 -1
  337. package/dist/cjs/dbs/base/db.cjs +0 -14
  338. package/dist/cjs/dbs/base/db.cjs.map +0 -1
  339. package/dist/cjs/dbs/base/db.min.cjs +0 -2
  340. package/dist/cjs/dbs/base/db.min.cjs.map +0 -1
  341. package/dist/cjs/dbs/base/types.cjs +0 -2
  342. package/dist/cjs/dbs/base/types.cjs.map +0 -1
  343. package/dist/cjs/dbs/base/types.min.cjs +0 -2
  344. package/dist/cjs/dbs/base/types.min.cjs.map +0 -1
  345. package/dist/cjs/dbs/mongo/changes.cjs +0 -81
  346. package/dist/cjs/dbs/mongo/changes.cjs.map +0 -1
  347. package/dist/cjs/dbs/mongo/changes.min.cjs +0 -2
  348. package/dist/cjs/dbs/mongo/changes.min.cjs.map +0 -1
  349. package/dist/cjs/dbs/mongo/db.cjs +0 -225
  350. package/dist/cjs/dbs/mongo/db.cjs.map +0 -1
  351. package/dist/cjs/dbs/mongo/db.min.cjs +0 -2
  352. package/dist/cjs/dbs/mongo/db.min.cjs.map +0 -1
  353. package/dist/cjs/dbs/mongo/query.cjs +0 -66
  354. package/dist/cjs/dbs/mongo/query.cjs.map +0 -1
  355. package/dist/cjs/dbs/mongo/query.min.cjs +0 -2
  356. package/dist/cjs/dbs/mongo/query.min.cjs.map +0 -1
  357. package/dist/cjs/dbs/pipes.cjs +0 -104
  358. package/dist/cjs/dbs/pipes.cjs.map +0 -1
  359. package/dist/cjs/dbs/pipes.min.cjs +0 -2
  360. package/dist/cjs/dbs/pipes.min.cjs.map +0 -1
  361. package/dist/cjs/errors/equippedError.cjs +0 -12
  362. package/dist/cjs/errors/equippedError.cjs.map +0 -1
  363. package/dist/cjs/errors/equippedError.min.cjs +0 -2
  364. package/dist/cjs/errors/equippedError.min.cjs.map +0 -1
  365. package/dist/cjs/errors/requestError.cjs +0 -12
  366. package/dist/cjs/errors/requestError.cjs.map +0 -1
  367. package/dist/cjs/errors/requestError.min.cjs +0 -2
  368. package/dist/cjs/errors/requestError.min.cjs.map +0 -1
  369. package/dist/cjs/errors/types/badRequestError.cjs +0 -12
  370. package/dist/cjs/errors/types/badRequestError.cjs.map +0 -1
  371. package/dist/cjs/errors/types/badRequestError.min.cjs +0 -2
  372. package/dist/cjs/errors/types/badRequestError.min.cjs.map +0 -1
  373. package/dist/cjs/errors/types/notAuthenticatedError.cjs +0 -12
  374. package/dist/cjs/errors/types/notAuthenticatedError.cjs.map +0 -1
  375. package/dist/cjs/errors/types/notAuthenticatedError.min.cjs +0 -2
  376. package/dist/cjs/errors/types/notAuthenticatedError.min.cjs.map +0 -1
  377. package/dist/cjs/errors/types/notAuthorizedError.cjs +0 -12
  378. package/dist/cjs/errors/types/notAuthorizedError.cjs.map +0 -1
  379. package/dist/cjs/errors/types/notAuthorizedError.min.cjs +0 -2
  380. package/dist/cjs/errors/types/notAuthorizedError.min.cjs.map +0 -1
  381. package/dist/cjs/errors/types/notFoundError.cjs +0 -12
  382. package/dist/cjs/errors/types/notFoundError.cjs.map +0 -1
  383. package/dist/cjs/errors/types/notFoundError.min.cjs +0 -2
  384. package/dist/cjs/errors/types/notFoundError.min.cjs.map +0 -1
  385. package/dist/cjs/errors/types/tokenExpired.cjs +0 -12
  386. package/dist/cjs/errors/types/tokenExpired.cjs.map +0 -1
  387. package/dist/cjs/errors/types/tokenExpired.min.cjs +0 -2
  388. package/dist/cjs/errors/types/tokenExpired.min.cjs.map +0 -1
  389. package/dist/cjs/errors/types/validationError.cjs +0 -16
  390. package/dist/cjs/errors/types/validationError.cjs.map +0 -1
  391. package/dist/cjs/errors/types/validationError.min.cjs +0 -2
  392. package/dist/cjs/errors/types/validationError.min.cjs.map +0 -1
  393. package/dist/cjs/events/base.cjs +0 -6
  394. package/dist/cjs/events/base.cjs.map +0 -1
  395. package/dist/cjs/events/base.min.cjs +0 -2
  396. package/dist/cjs/events/base.min.cjs.map +0 -1
  397. package/dist/cjs/events/pipes.cjs +0 -28
  398. package/dist/cjs/events/pipes.cjs.map +0 -1
  399. package/dist/cjs/events/pipes.min.cjs +0 -2
  400. package/dist/cjs/events/pipes.min.cjs.map +0 -1
  401. package/dist/cjs/events/types/kafka.cjs +0 -80
  402. package/dist/cjs/events/types/kafka.cjs.map +0 -1
  403. package/dist/cjs/events/types/kafka.min.cjs +0 -2
  404. package/dist/cjs/events/types/kafka.min.cjs.map +0 -1
  405. package/dist/cjs/events/types/rabbitmq.cjs +0 -54
  406. package/dist/cjs/events/types/rabbitmq.cjs.map +0 -1
  407. package/dist/cjs/events/types/rabbitmq.min.cjs +0 -2
  408. package/dist/cjs/events/types/rabbitmq.min.cjs.map +0 -1
  409. package/dist/cjs/instance/hooks.cjs +0 -26
  410. package/dist/cjs/instance/hooks.cjs.map +0 -1
  411. package/dist/cjs/instance/hooks.min.cjs +0 -2
  412. package/dist/cjs/instance/hooks.min.cjs.map +0 -1
  413. package/dist/cjs/instance/settings.cjs +0 -57
  414. package/dist/cjs/instance/settings.cjs.map +0 -1
  415. package/dist/cjs/instance/settings.min.cjs +0 -2
  416. package/dist/cjs/instance/settings.min.cjs.map +0 -1
  417. package/dist/cjs/jobs/pipes.cjs +0 -13
  418. package/dist/cjs/jobs/pipes.cjs.map +0 -1
  419. package/dist/cjs/jobs/pipes.min.cjs +0 -2
  420. package/dist/cjs/jobs/pipes.min.cjs.map +0 -1
  421. package/dist/cjs/jobs/types/redis.cjs +0 -106
  422. package/dist/cjs/jobs/types/redis.cjs.map +0 -1
  423. package/dist/cjs/jobs/types/redis.min.cjs +0 -2
  424. package/dist/cjs/jobs/types/redis.min.cjs.map +0 -1
  425. package/dist/cjs/server/impls/base.cjs +0 -211
  426. package/dist/cjs/server/impls/base.cjs.map +0 -1
  427. package/dist/cjs/server/impls/base.min.cjs +0 -2
  428. package/dist/cjs/server/impls/base.min.cjs.map +0 -1
  429. package/dist/cjs/server/impls/express.cjs +0 -111
  430. package/dist/cjs/server/impls/express.cjs.map +0 -1
  431. package/dist/cjs/server/impls/express.min.cjs +0 -2
  432. package/dist/cjs/server/impls/express.min.cjs.map +0 -1
  433. package/dist/cjs/server/impls/fastify.cjs +0 -121
  434. package/dist/cjs/server/impls/fastify.cjs.map +0 -1
  435. package/dist/cjs/server/impls/fastify.min.cjs +0 -2
  436. package/dist/cjs/server/impls/fastify.min.cjs.map +0 -1
  437. package/dist/cjs/server/middlewares/index.cjs +0 -2
  438. package/dist/cjs/server/middlewares/index.cjs.map +0 -1
  439. package/dist/cjs/server/middlewares/index.min.cjs +0 -2
  440. package/dist/cjs/server/middlewares/index.min.cjs.map +0 -1
  441. package/dist/cjs/server/middlewares/requireAuthUser.cjs +0 -22
  442. package/dist/cjs/server/middlewares/requireAuthUser.cjs.map +0 -1
  443. package/dist/cjs/server/middlewares/requireAuthUser.min.cjs +0 -2
  444. package/dist/cjs/server/middlewares/requireAuthUser.min.cjs.map +0 -1
  445. package/dist/cjs/server/openapi.cjs +0 -191
  446. package/dist/cjs/server/openapi.cjs.map +0 -1
  447. package/dist/cjs/server/openapi.min.cjs +0 -30
  448. package/dist/cjs/server/openapi.min.cjs.map +0 -1
  449. package/dist/cjs/server/pipes.cjs +0 -67
  450. package/dist/cjs/server/pipes.cjs.map +0 -1
  451. package/dist/cjs/server/pipes.min.cjs +0 -2
  452. package/dist/cjs/server/pipes.min.cjs.map +0 -1
  453. package/dist/cjs/server/requests-auth-methods/apiKeys.cjs +0 -21
  454. package/dist/cjs/server/requests-auth-methods/apiKeys.cjs.map +0 -1
  455. package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs +0 -2
  456. package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs.map +0 -1
  457. package/dist/cjs/server/requests-auth-methods/base.cjs +0 -20
  458. package/dist/cjs/server/requests-auth-methods/base.cjs.map +0 -1
  459. package/dist/cjs/server/requests-auth-methods/base.min.cjs +0 -2
  460. package/dist/cjs/server/requests-auth-methods/base.min.cjs.map +0 -1
  461. package/dist/cjs/server/requests-auth-methods/index.cjs +0 -4
  462. package/dist/cjs/server/requests-auth-methods/index.cjs.map +0 -1
  463. package/dist/cjs/server/requests-auth-methods/index.min.cjs +0 -2
  464. package/dist/cjs/server/requests-auth-methods/index.min.cjs.map +0 -1
  465. package/dist/cjs/server/requests-auth-methods/jwt.cjs +0 -78
  466. package/dist/cjs/server/requests-auth-methods/jwt.cjs.map +0 -1
  467. package/dist/cjs/server/requests-auth-methods/jwt.min.cjs +0 -2
  468. package/dist/cjs/server/requests-auth-methods/jwt.min.cjs.map +0 -1
  469. package/dist/cjs/server/requests.cjs +0 -80
  470. package/dist/cjs/server/requests.cjs.map +0 -1
  471. package/dist/cjs/server/requests.min.cjs +0 -2
  472. package/dist/cjs/server/requests.min.cjs.map +0 -1
  473. package/dist/cjs/server/routes.cjs +0 -74
  474. package/dist/cjs/server/routes.cjs.map +0 -1
  475. package/dist/cjs/server/routes.min.cjs +0 -2
  476. package/dist/cjs/server/routes.min.cjs.map +0 -1
  477. package/dist/cjs/server/sockets.cjs +0 -126
  478. package/dist/cjs/server/sockets.cjs.map +0 -1
  479. package/dist/cjs/server/sockets.min.cjs +0 -2
  480. package/dist/cjs/server/sockets.min.cjs.map +0 -1
  481. package/dist/cjs/server/types.cjs +0 -34
  482. package/dist/cjs/server/types.cjs.map +0 -1
  483. package/dist/cjs/server/types.min.cjs +0 -2
  484. package/dist/cjs/server/types.min.cjs.map +0 -1
  485. package/dist/cjs/types/overrides.cjs +0 -1
  486. package/dist/cjs/types/overrides.cjs.map +0 -1
  487. package/dist/cjs/types/overrides.min.cjs +0 -1
  488. package/dist/cjs/types/overrides.min.cjs.map +0 -1
  489. package/dist/cjs/utilities/authProviders.cjs +0 -53
  490. package/dist/cjs/utilities/authProviders.cjs.map +0 -1
  491. package/dist/cjs/utilities/authProviders.min.cjs +0 -2
  492. package/dist/cjs/utilities/authProviders.min.cjs.map +0 -1
  493. package/dist/cjs/utilities/hash.cjs +0 -17
  494. package/dist/cjs/utilities/hash.cjs.map +0 -1
  495. package/dist/cjs/utilities/hash.min.cjs +0 -2
  496. package/dist/cjs/utilities/hash.min.cjs.map +0 -1
  497. package/dist/cjs/utilities/json.cjs +0 -16
  498. package/dist/cjs/utilities/json.cjs.map +0 -1
  499. package/dist/cjs/utilities/json.min.cjs +0 -2
  500. package/dist/cjs/utilities/json.min.cjs.map +0 -1
  501. package/dist/cjs/utilities/media.cjs +0 -13
  502. package/dist/cjs/utilities/media.cjs.map +0 -1
  503. package/dist/cjs/utilities/media.min.cjs +0 -2
  504. package/dist/cjs/utilities/media.min.cjs.map +0 -1
  505. package/dist/cjs/utilities/random.cjs +0 -12
  506. package/dist/cjs/utilities/random.cjs.map +0 -1
  507. package/dist/cjs/utilities/random.min.cjs +0 -2
  508. package/dist/cjs/utilities/random.min.cjs.map +0 -1
  509. package/dist/cjs/utilities/retry.cjs +0 -14
  510. package/dist/cjs/utilities/retry.cjs.map +0 -1
  511. package/dist/cjs/utilities/retry.min.cjs +0 -2
  512. package/dist/cjs/utilities/retry.min.cjs.map +0 -1
  513. package/dist/cjs/validations/valleyed.cjs +0 -43
  514. package/dist/cjs/validations/valleyed.cjs.map +0 -1
  515. package/dist/cjs/validations/valleyed.min.cjs +0 -2
  516. package/dist/cjs/validations/valleyed.min.cjs.map +0 -1
  517. package/dist/esm/audit/events.min.mjs +0 -2
  518. package/dist/esm/audit/events.min.mjs.map +0 -1
  519. package/dist/esm/audit/events.mjs +0 -101
  520. package/dist/esm/audit/events.mjs.map +0 -1
  521. package/dist/esm/audit/index.min.mjs +0 -2
  522. package/dist/esm/audit/index.min.mjs.map +0 -1
  523. package/dist/esm/audit/index.mjs +0 -2
  524. package/dist/esm/audit/index.mjs.map +0 -1
  525. package/dist/esm/cache/base.min.mjs +0 -2
  526. package/dist/esm/cache/base.min.mjs.map +0 -1
  527. package/dist/esm/cache/base.mjs +0 -6
  528. package/dist/esm/cache/base.mjs.map +0 -1
  529. package/dist/esm/cache/pipes.min.mjs +0 -2
  530. package/dist/esm/cache/pipes.min.mjs.map +0 -1
  531. package/dist/esm/cache/pipes.mjs +0 -16
  532. package/dist/esm/cache/pipes.mjs.map +0 -1
  533. package/dist/esm/cache/types/in-memory.min.mjs +0 -2
  534. package/dist/esm/cache/types/in-memory.min.mjs.map +0 -1
  535. package/dist/esm/cache/types/in-memory.mjs +0 -47
  536. package/dist/esm/cache/types/in-memory.mjs.map +0 -1
  537. package/dist/esm/cache/types/redis.min.mjs +0 -2
  538. package/dist/esm/cache/types/redis.min.mjs.map +0 -1
  539. package/dist/esm/cache/types/redis.mjs +0 -55
  540. package/dist/esm/cache/types/redis.mjs.map +0 -1
  541. package/dist/esm/dbs/base/changes.min.mjs +0 -2
  542. package/dist/esm/dbs/base/changes.min.mjs.map +0 -1
  543. package/dist/esm/dbs/base/changes.mjs +0 -36
  544. package/dist/esm/dbs/base/changes.mjs.map +0 -1
  545. package/dist/esm/dbs/base/core.min.mjs +0 -1
  546. package/dist/esm/dbs/base/core.mjs +0 -1
  547. package/dist/esm/dbs/base/db.min.mjs +0 -2
  548. package/dist/esm/dbs/base/db.min.mjs.map +0 -1
  549. package/dist/esm/dbs/base/db.mjs +0 -14
  550. package/dist/esm/dbs/base/db.mjs.map +0 -1
  551. package/dist/esm/dbs/base/types.min.mjs +0 -2
  552. package/dist/esm/dbs/base/types.min.mjs.map +0 -1
  553. package/dist/esm/dbs/base/types.mjs +0 -2
  554. package/dist/esm/dbs/base/types.mjs.map +0 -1
  555. package/dist/esm/dbs/mongo/changes.min.mjs +0 -2
  556. package/dist/esm/dbs/mongo/changes.min.mjs.map +0 -1
  557. package/dist/esm/dbs/mongo/changes.mjs +0 -81
  558. package/dist/esm/dbs/mongo/changes.mjs.map +0 -1
  559. package/dist/esm/dbs/mongo/db.min.mjs +0 -2
  560. package/dist/esm/dbs/mongo/db.min.mjs.map +0 -1
  561. package/dist/esm/dbs/mongo/db.mjs +0 -225
  562. package/dist/esm/dbs/mongo/db.mjs.map +0 -1
  563. package/dist/esm/dbs/mongo/query.min.mjs +0 -2
  564. package/dist/esm/dbs/mongo/query.min.mjs.map +0 -1
  565. package/dist/esm/dbs/mongo/query.mjs +0 -66
  566. package/dist/esm/dbs/mongo/query.mjs.map +0 -1
  567. package/dist/esm/dbs/pipes.min.mjs +0 -2
  568. package/dist/esm/dbs/pipes.min.mjs.map +0 -1
  569. package/dist/esm/dbs/pipes.mjs +0 -104
  570. package/dist/esm/dbs/pipes.mjs.map +0 -1
  571. package/dist/esm/errors/equippedError.min.mjs +0 -2
  572. package/dist/esm/errors/equippedError.min.mjs.map +0 -1
  573. package/dist/esm/errors/equippedError.mjs +0 -12
  574. package/dist/esm/errors/equippedError.mjs.map +0 -1
  575. package/dist/esm/errors/requestError.min.mjs +0 -2
  576. package/dist/esm/errors/requestError.min.mjs.map +0 -1
  577. package/dist/esm/errors/requestError.mjs +0 -12
  578. package/dist/esm/errors/requestError.mjs.map +0 -1
  579. package/dist/esm/errors/types/badRequestError.min.mjs +0 -2
  580. package/dist/esm/errors/types/badRequestError.min.mjs.map +0 -1
  581. package/dist/esm/errors/types/badRequestError.mjs +0 -12
  582. package/dist/esm/errors/types/badRequestError.mjs.map +0 -1
  583. package/dist/esm/errors/types/notAuthenticatedError.min.mjs +0 -2
  584. package/dist/esm/errors/types/notAuthenticatedError.min.mjs.map +0 -1
  585. package/dist/esm/errors/types/notAuthenticatedError.mjs +0 -12
  586. package/dist/esm/errors/types/notAuthenticatedError.mjs.map +0 -1
  587. package/dist/esm/errors/types/notAuthorizedError.min.mjs +0 -2
  588. package/dist/esm/errors/types/notAuthorizedError.min.mjs.map +0 -1
  589. package/dist/esm/errors/types/notAuthorizedError.mjs +0 -12
  590. package/dist/esm/errors/types/notAuthorizedError.mjs.map +0 -1
  591. package/dist/esm/errors/types/notFoundError.min.mjs +0 -2
  592. package/dist/esm/errors/types/notFoundError.min.mjs.map +0 -1
  593. package/dist/esm/errors/types/notFoundError.mjs +0 -12
  594. package/dist/esm/errors/types/notFoundError.mjs.map +0 -1
  595. package/dist/esm/errors/types/tokenExpired.min.mjs +0 -2
  596. package/dist/esm/errors/types/tokenExpired.min.mjs.map +0 -1
  597. package/dist/esm/errors/types/tokenExpired.mjs +0 -12
  598. package/dist/esm/errors/types/tokenExpired.mjs.map +0 -1
  599. package/dist/esm/errors/types/validationError.min.mjs +0 -2
  600. package/dist/esm/errors/types/validationError.min.mjs.map +0 -1
  601. package/dist/esm/errors/types/validationError.mjs +0 -16
  602. package/dist/esm/errors/types/validationError.mjs.map +0 -1
  603. package/dist/esm/events/base.min.mjs +0 -2
  604. package/dist/esm/events/base.min.mjs.map +0 -1
  605. package/dist/esm/events/base.mjs +0 -6
  606. package/dist/esm/events/base.mjs.map +0 -1
  607. package/dist/esm/events/pipes.min.mjs +0 -2
  608. package/dist/esm/events/pipes.min.mjs.map +0 -1
  609. package/dist/esm/events/pipes.mjs +0 -28
  610. package/dist/esm/events/pipes.mjs.map +0 -1
  611. package/dist/esm/events/types/kafka.min.mjs +0 -2
  612. package/dist/esm/events/types/kafka.min.mjs.map +0 -1
  613. package/dist/esm/events/types/kafka.mjs.map +0 -1
  614. package/dist/esm/events/types/rabbitmq.min.mjs +0 -2
  615. package/dist/esm/events/types/rabbitmq.min.mjs.map +0 -1
  616. package/dist/esm/events/types/rabbitmq.mjs +0 -54
  617. package/dist/esm/events/types/rabbitmq.mjs.map +0 -1
  618. package/dist/esm/instance/hooks.min.mjs +0 -2
  619. package/dist/esm/instance/hooks.min.mjs.map +0 -1
  620. package/dist/esm/instance/hooks.mjs +0 -26
  621. package/dist/esm/instance/hooks.mjs.map +0 -1
  622. package/dist/esm/instance/settings.min.mjs +0 -2
  623. package/dist/esm/instance/settings.min.mjs.map +0 -1
  624. package/dist/esm/instance/settings.mjs +0 -57
  625. package/dist/esm/instance/settings.mjs.map +0 -1
  626. package/dist/esm/jobs/pipes.min.mjs +0 -2
  627. package/dist/esm/jobs/pipes.min.mjs.map +0 -1
  628. package/dist/esm/jobs/pipes.mjs +0 -13
  629. package/dist/esm/jobs/pipes.mjs.map +0 -1
  630. package/dist/esm/jobs/types/redis.min.mjs +0 -2
  631. package/dist/esm/jobs/types/redis.min.mjs.map +0 -1
  632. package/dist/esm/jobs/types/redis.mjs.map +0 -1
  633. package/dist/esm/server/impls/base.min.mjs +0 -2
  634. package/dist/esm/server/impls/base.min.mjs.map +0 -1
  635. package/dist/esm/server/impls/base.mjs +0 -211
  636. package/dist/esm/server/impls/base.mjs.map +0 -1
  637. package/dist/esm/server/impls/express.min.mjs +0 -2
  638. package/dist/esm/server/impls/express.min.mjs.map +0 -1
  639. package/dist/esm/server/impls/express.mjs +0 -111
  640. package/dist/esm/server/impls/express.mjs.map +0 -1
  641. package/dist/esm/server/impls/fastify.min.mjs +0 -2
  642. package/dist/esm/server/impls/fastify.min.mjs.map +0 -1
  643. package/dist/esm/server/impls/fastify.mjs +0 -121
  644. package/dist/esm/server/impls/fastify.mjs.map +0 -1
  645. package/dist/esm/server/middlewares/index.min.mjs +0 -2
  646. package/dist/esm/server/middlewares/index.min.mjs.map +0 -1
  647. package/dist/esm/server/middlewares/index.mjs +0 -2
  648. package/dist/esm/server/middlewares/index.mjs.map +0 -1
  649. package/dist/esm/server/middlewares/requireAuthUser.min.mjs +0 -2
  650. package/dist/esm/server/middlewares/requireAuthUser.min.mjs.map +0 -1
  651. package/dist/esm/server/middlewares/requireAuthUser.mjs +0 -22
  652. package/dist/esm/server/middlewares/requireAuthUser.mjs.map +0 -1
  653. package/dist/esm/server/openapi.min.mjs +0 -30
  654. package/dist/esm/server/openapi.min.mjs.map +0 -1
  655. package/dist/esm/server/openapi.mjs +0 -191
  656. package/dist/esm/server/openapi.mjs.map +0 -1
  657. package/dist/esm/server/pipes.min.mjs +0 -2
  658. package/dist/esm/server/pipes.min.mjs.map +0 -1
  659. package/dist/esm/server/pipes.mjs +0 -67
  660. package/dist/esm/server/pipes.mjs.map +0 -1
  661. package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs +0 -2
  662. package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs.map +0 -1
  663. package/dist/esm/server/requests-auth-methods/apiKeys.mjs +0 -21
  664. package/dist/esm/server/requests-auth-methods/apiKeys.mjs.map +0 -1
  665. package/dist/esm/server/requests-auth-methods/base.min.mjs +0 -2
  666. package/dist/esm/server/requests-auth-methods/base.min.mjs.map +0 -1
  667. package/dist/esm/server/requests-auth-methods/base.mjs +0 -20
  668. package/dist/esm/server/requests-auth-methods/base.mjs.map +0 -1
  669. package/dist/esm/server/requests-auth-methods/index.min.mjs +0 -2
  670. package/dist/esm/server/requests-auth-methods/index.min.mjs.map +0 -1
  671. package/dist/esm/server/requests-auth-methods/index.mjs +0 -4
  672. package/dist/esm/server/requests-auth-methods/index.mjs.map +0 -1
  673. package/dist/esm/server/requests-auth-methods/jwt.min.mjs +0 -2
  674. package/dist/esm/server/requests-auth-methods/jwt.min.mjs.map +0 -1
  675. package/dist/esm/server/requests-auth-methods/jwt.mjs +0 -78
  676. package/dist/esm/server/requests-auth-methods/jwt.mjs.map +0 -1
  677. package/dist/esm/server/requests.min.mjs +0 -2
  678. package/dist/esm/server/requests.min.mjs.map +0 -1
  679. package/dist/esm/server/requests.mjs +0 -80
  680. package/dist/esm/server/requests.mjs.map +0 -1
  681. package/dist/esm/server/routes.min.mjs +0 -2
  682. package/dist/esm/server/routes.min.mjs.map +0 -1
  683. package/dist/esm/server/routes.mjs +0 -74
  684. package/dist/esm/server/routes.mjs.map +0 -1
  685. package/dist/esm/server/sockets.min.mjs +0 -2
  686. package/dist/esm/server/sockets.min.mjs.map +0 -1
  687. package/dist/esm/server/sockets.mjs +0 -126
  688. package/dist/esm/server/sockets.mjs.map +0 -1
  689. package/dist/esm/server/types.min.mjs +0 -2
  690. package/dist/esm/server/types.min.mjs.map +0 -1
  691. package/dist/esm/server/types.mjs +0 -34
  692. package/dist/esm/server/types.mjs.map +0 -1
  693. package/dist/esm/types/overrides.min.mjs +0 -1
  694. package/dist/esm/types/overrides.mjs +0 -1
  695. package/dist/esm/utilities/authProviders.min.mjs +0 -2
  696. package/dist/esm/utilities/authProviders.min.mjs.map +0 -1
  697. package/dist/esm/utilities/authProviders.mjs +0 -53
  698. package/dist/esm/utilities/authProviders.mjs.map +0 -1
  699. package/dist/esm/utilities/hash.min.mjs +0 -2
  700. package/dist/esm/utilities/hash.min.mjs.map +0 -1
  701. package/dist/esm/utilities/hash.mjs +0 -17
  702. package/dist/esm/utilities/hash.mjs.map +0 -1
  703. package/dist/esm/utilities/json.min.mjs +0 -2
  704. package/dist/esm/utilities/json.min.mjs.map +0 -1
  705. package/dist/esm/utilities/json.mjs +0 -16
  706. package/dist/esm/utilities/json.mjs.map +0 -1
  707. package/dist/esm/utilities/media.min.mjs +0 -2
  708. package/dist/esm/utilities/media.min.mjs.map +0 -1
  709. package/dist/esm/utilities/media.mjs +0 -13
  710. package/dist/esm/utilities/media.mjs.map +0 -1
  711. package/dist/esm/utilities/random.min.mjs +0 -2
  712. package/dist/esm/utilities/random.min.mjs.map +0 -1
  713. package/dist/esm/utilities/random.mjs +0 -12
  714. package/dist/esm/utilities/random.mjs.map +0 -1
  715. package/dist/esm/utilities/retry.min.mjs +0 -2
  716. package/dist/esm/utilities/retry.min.mjs.map +0 -1
  717. package/dist/esm/utilities/retry.mjs +0 -14
  718. package/dist/esm/utilities/retry.mjs.map +0 -1
  719. package/dist/esm/validations/valleyed.min.mjs +0 -2
  720. package/dist/esm/validations/valleyed.min.mjs.map +0 -1
  721. package/dist/esm/validations/valleyed.mjs +0 -43
  722. package/dist/esm/validations/valleyed.mjs.map +0 -1
  723. package/dist/types/audit/events.js +0 -100
  724. package/dist/types/audit/index.d.ts +0 -44
  725. package/dist/types/audit/index.js +0 -1
  726. package/dist/types/cache/base.js +0 -5
  727. package/dist/types/cache/pipes.js +0 -15
  728. package/dist/types/cache/types/in-memory.js +0 -46
  729. package/dist/types/cache/types/redis.js +0 -54
  730. package/dist/types/db-C8YY1yTO.d.ts +0 -14
  731. package/dist/types/db-Dj1SGto0.d.ts +0 -24
  732. package/dist/types/dbs/base/changes.js +0 -35
  733. package/dist/types/dbs/base/core.js +0 -0
  734. package/dist/types/dbs/base/db.js +0 -13
  735. package/dist/types/dbs/base/types.js +0 -1
  736. package/dist/types/dbs/mongo/changes.js +0 -80
  737. package/dist/types/dbs/mongo/db.js +0 -224
  738. package/dist/types/dbs/mongo/query.js +0 -65
  739. package/dist/types/dbs/pipes.js +0 -103
  740. package/dist/types/errors/equippedError.js +0 -11
  741. package/dist/types/errors/requestError.js +0 -11
  742. package/dist/types/errors/types/badRequestError.js +0 -11
  743. package/dist/types/errors/types/notAuthenticatedError.js +0 -11
  744. package/dist/types/errors/types/notAuthorizedError.js +0 -11
  745. package/dist/types/errors/types/notFoundError.js +0 -11
  746. package/dist/types/errors/types/tokenExpired.js +0 -11
  747. package/dist/types/errors/types/validationError.js +0 -15
  748. package/dist/types/events/base.js +0 -5
  749. package/dist/types/events/pipes.js +0 -27
  750. package/dist/types/events/types/rabbitmq.js +0 -53
  751. package/dist/types/instance/hooks.js +0 -25
  752. package/dist/types/instance/settings.js +0 -56
  753. package/dist/types/jobs/pipes.js +0 -12
  754. package/dist/types/kafka-Cf-TUJgv.d.ts +0 -54
  755. package/dist/types/server/impls/base.js +0 -210
  756. package/dist/types/server/impls/express.js +0 -110
  757. package/dist/types/server/impls/fastify.js +0 -120
  758. package/dist/types/server/middlewares/index.js +0 -1
  759. package/dist/types/server/middlewares/requireAuthUser.js +0 -21
  760. package/dist/types/server/openapi.js +0 -190
  761. package/dist/types/server/pipes.js +0 -66
  762. package/dist/types/server/requests-auth-methods/apiKeys.js +0 -20
  763. package/dist/types/server/requests-auth-methods/base.js +0 -19
  764. package/dist/types/server/requests-auth-methods/index.js +0 -3
  765. package/dist/types/server/requests-auth-methods/jwt.js +0 -77
  766. package/dist/types/server/requests.js +0 -79
  767. package/dist/types/server/routes.js +0 -73
  768. package/dist/types/server/sockets.js +0 -125
  769. package/dist/types/server/types.js +0 -33
  770. package/dist/types/types/overrides.js +0 -0
  771. package/dist/types/utilities/authProviders.js +0 -52
  772. package/dist/types/utilities/hash.js +0 -16
  773. package/dist/types/utilities/json.js +0 -15
  774. package/dist/types/utilities/media.js +0 -12
  775. package/dist/types/utilities/random.js +0 -11
  776. package/dist/types/utilities/retry.js +0 -13
  777. package/dist/types/validations/valleyed.js +0 -42
  778. /package/dist/esm/{dbs/base/core.min.mjs.map → cache/adapters/redis/index.min.mjs.map} +0 -0
  779. /package/dist/esm/{dbs/base/core.mjs.map → cache/adapters/redis/index.mjs.map} +0 -0
  780. /package/dist/esm/{types/overrides.min.mjs.map → chunk-AQY7QVYI.min.mjs.map} +0 -0
  781. /package/dist/esm/{types/overrides.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
@@ -0,0 +1,2069 @@
1
+ import {
2
+ Filter,
3
+ FilterGroup,
4
+ IncOp,
5
+ MaxOp,
6
+ MinOp,
7
+ MulOp,
8
+ OrmAdapter,
9
+ OrmValidationError,
10
+ PatchOp,
11
+ PullOp,
12
+ PushOp,
13
+ UnsetOp,
14
+ flattenOps
15
+ } from "../../../chunk-JQ2FWX4W.js";
16
+ import {
17
+ EquippedError,
18
+ configurable
19
+ } from "../../../chunk-YTY3EFNB.js";
20
+ import "../../../chunk-KZKFYO4V.js";
21
+ import "../../../chunk-MLKGABMK.js";
22
+
23
+ // src/orm/adapters/postgresql/index.ts
24
+ import { AsyncLocalStorage } from "async_hooks";
25
+ import { Pool } from "pg";
26
+ import Cursor from "pg-cursor";
27
+ import { v } from "valleyed";
28
+
29
+ // src/orm/adapters/postgresql/query.ts
30
+ function mapField(field, primaryKey) {
31
+ if (field === "id" && primaryKey !== "id") return primaryKey;
32
+ return field;
33
+ }
34
+ function compileOps(f, field, nextParam) {
35
+ switch (f.op) {
36
+ case "eq":
37
+ return f.value === null ? `${field} IS NULL` : `${field} = ${nextParam(f.value)}`;
38
+ case "ne":
39
+ return f.value === null ? `${field} IS NOT NULL` : `${field} != ${nextParam(f.value)}`;
40
+ case "gt":
41
+ return `${field} > ${nextParam(f.value)}`;
42
+ case "gte":
43
+ return `${field} >= ${nextParam(f.value)}`;
44
+ case "lt":
45
+ return `${field} < ${nextParam(f.value)}`;
46
+ case "lte":
47
+ return `${field} <= ${nextParam(f.value)}`;
48
+ case "in":
49
+ return `${field} = ANY(${nextParam(f.value)})`;
50
+ case "notIn":
51
+ return `NOT (${field} = ANY(${nextParam(f.value)}))`;
52
+ case "like":
53
+ return `${field} ILIKE ${nextParam(`%${f.value}%`)}`;
54
+ case "exists":
55
+ return `${field} IS NOT NULL`;
56
+ case "notExists":
57
+ return `${field} IS NULL`;
58
+ case "contains":
59
+ return `${field} @> ${nextParam(JSON.stringify(f.value))}::jsonb`;
60
+ case "notContains":
61
+ return `NOT (${field} @> ${nextParam(JSON.stringify(f.value))}::jsonb)`;
62
+ default:
63
+ return `${field} = ${nextParam(f.value)}`;
64
+ }
65
+ }
66
+ function compileFilter(f, primaryKey, nextParam) {
67
+ return compileOps(f, `"${mapField(f.field, primaryKey)}"`, nextParam);
68
+ }
69
+ function compileChildren(group, compileLeaf) {
70
+ return group.children.map((c) => compileChild(c, compileLeaf)).filter((c) => c !== null);
71
+ }
72
+ function compileGroup(group, compileLeaf) {
73
+ const parts = compileChildren(group, compileLeaf);
74
+ if (parts.length === 0) return null;
75
+ if (parts.length === 1) return parts[0];
76
+ return `(${parts.join(group.op === "or" ? " OR " : " AND ")})`;
77
+ }
78
+ function compileChild(child, compileLeaf) {
79
+ if (child instanceof Filter) return compileLeaf(child);
80
+ if (child instanceof FilterGroup) return compileGroup(child, compileLeaf);
81
+ return null;
82
+ }
83
+ function compilePgFilter(group, primaryKey, startIndex = 1) {
84
+ const params = [];
85
+ let paramIndex = startIndex;
86
+ function nextParam(value) {
87
+ params.push(value);
88
+ return `$${paramIndex++}`;
89
+ }
90
+ const leaf = (f) => compileFilter(f, primaryKey, nextParam);
91
+ const whereParts = compileChildren(group, leaf);
92
+ const whereClause = whereParts.length > 0 ? `WHERE ${whereParts.join(" AND ")}` : "";
93
+ return { whereClause, params, nextParamIndex: paramIndex };
94
+ }
95
+ function buildSetParts(data, startIndex) {
96
+ const params = [];
97
+ let paramIndex = startIndex;
98
+ const setParts = Object.entries(data).map(([key, value]) => {
99
+ const col = `"${key}"`;
100
+ if (value instanceof IncOp) {
101
+ params.push(value.value);
102
+ return `${col} = ${col} + $${paramIndex++}`;
103
+ }
104
+ if (value instanceof MulOp) {
105
+ params.push(value.value);
106
+ return `${col} = ${col} * $${paramIndex++}`;
107
+ }
108
+ if (value instanceof MinOp) {
109
+ params.push(value.value);
110
+ return `${col} = LEAST(${col}, $${paramIndex++})`;
111
+ }
112
+ if (value instanceof MaxOp) {
113
+ params.push(value.value);
114
+ return `${col} = GREATEST(${col}, $${paramIndex++})`;
115
+ }
116
+ if (value instanceof UnsetOp) {
117
+ return `${col} = NULL`;
118
+ }
119
+ if (value instanceof PushOp) {
120
+ params.push(JSON.stringify(value.value));
121
+ return `${col} = ${col} || jsonb_build_array($${paramIndex++}::jsonb)`;
122
+ }
123
+ if (value instanceof PullOp) {
124
+ params.push(JSON.stringify(value.value));
125
+ return `${col} = (SELECT COALESCE(jsonb_agg(e), '[]'::jsonb) FROM jsonb_array_elements(${col}) e WHERE e <> $${paramIndex++}::jsonb)`;
126
+ }
127
+ if (value instanceof PatchOp) {
128
+ params.push(JSON.stringify(value.value));
129
+ return `${col} = ${col} || $${paramIndex++}::jsonb`;
130
+ }
131
+ params.push(value);
132
+ return `${col} = $${paramIndex++}`;
133
+ });
134
+ return { setParts, params, nextParamIndex: paramIndex };
135
+ }
136
+ function buildSelectQuery(group, options, tableName, primaryKey) {
137
+ const { whereClause, params, nextParamIndex } = compilePgFilter(group, primaryKey);
138
+ let i = nextParamIndex;
139
+ const orderParts = (options?.orderBy ?? []).map((o) => `"${mapField(o.field, primaryKey)}" ${o.direction.toUpperCase()}`);
140
+ const orderClause = orderParts.length > 0 ? `ORDER BY ${orderParts.join(", ")}` : "";
141
+ let limitClause = "";
142
+ if (options?.limit != null) {
143
+ params.push(options.limit);
144
+ limitClause = `LIMIT $${i++}`;
145
+ }
146
+ let offsetClause = "";
147
+ if (options?.offset != null) {
148
+ params.push(options.offset);
149
+ offsetClause = `OFFSET $${i++}`;
150
+ }
151
+ const selectClause = options?.select?.length ? options.select.map((f) => `"${mapField(f, primaryKey)}"`).join(", ") : "*";
152
+ const sql = `SELECT ${selectClause} FROM "${tableName}" ${whereClause} ${orderClause} ${limitClause} ${offsetClause}`.trim().replace(/\s+/g, " ");
153
+ return { sql, params };
154
+ }
155
+ function buildCountQuery(group, tableName, primaryKey) {
156
+ const { whereClause, params } = compilePgFilter(group, primaryKey);
157
+ const sql = `SELECT COUNT(*) as count FROM "${tableName}" ${whereClause}`.trim().replace(/\s+/g, " ");
158
+ return { sql, params };
159
+ }
160
+ function buildCreateQuery(tableName, data) {
161
+ const keys = Object.keys(data);
162
+ const params = Object.values(data);
163
+ const placeholders = keys.map((_, i) => `$${i + 1}`);
164
+ const columns = keys.map((k) => `"${k}"`).join(", ");
165
+ const sql = `INSERT INTO "${tableName}" (${columns}) VALUES (${placeholders.join(", ")}) RETURNING *`;
166
+ return { sql, params };
167
+ }
168
+ function buildUpdateQuery(group, tableName, primaryKey, data) {
169
+ const { setParts, params: setParams, nextParamIndex } = buildSetParts(data, 1);
170
+ const { whereClause, params: whereParams } = compilePgFilter(group, primaryKey, nextParamIndex);
171
+ const params = [...setParams, ...whereParams];
172
+ const sql = `UPDATE "${tableName}" SET ${setParts.join(", ")} ${whereClause} RETURNING *`.trim().replace(/\s+/g, " ");
173
+ return { sql, params };
174
+ }
175
+ function buildPkUpdateQuery(tableName, primaryKey, pk, data) {
176
+ const { setParts, params: setParams, nextParamIndex } = buildSetParts(data, 1);
177
+ setParams.push(pk);
178
+ const sql = `UPDATE "${tableName}" SET ${setParts.join(", ")} WHERE "${primaryKey}" = $${nextParamIndex} RETURNING *`.replace(
179
+ /\s+/g,
180
+ " "
181
+ );
182
+ return { sql, params: setParams };
183
+ }
184
+ function buildDeleteQuery(group, tableName, primaryKey) {
185
+ const { whereClause, params } = compilePgFilter(group, primaryKey);
186
+ const sql = `DELETE FROM "${tableName}" ${whereClause} RETURNING *`.trim().replace(/\s+/g, " ");
187
+ return { sql, params };
188
+ }
189
+ function buildUpsertQuery(tableName, conflictColumn, primaryKey, create, data) {
190
+ const columns = Object.keys(create);
191
+ const createParams = Object.values(create);
192
+ const placeholders = columns.map((_, i) => `$${i + 1}`);
193
+ const pgConflictCol = mapField(conflictColumn, primaryKey);
194
+ let setClause;
195
+ const allParams = [...createParams];
196
+ if (Object.keys(data).length > 0) {
197
+ const { setParts, params: setParams } = buildSetParts(data, columns.length + 1);
198
+ setClause = setParts.join(", ");
199
+ allParams.push(...setParams);
200
+ } else {
201
+ setClause = `"${pgConflictCol}" = EXCLUDED."${pgConflictCol}"`;
202
+ }
203
+ const sql = `INSERT INTO "${tableName}" (${columns.map((c) => `"${c}"`).join(", ")}) VALUES (${placeholders.join(", ")}) ON CONFLICT ("${pgConflictCol}") DO UPDATE SET ${setClause} RETURNING *`.replace(
204
+ /\s+/g,
205
+ " "
206
+ );
207
+ return { sql, params: allParams };
208
+ }
209
+ function extractUpsertConflictColumn(filter, schemaName) {
210
+ if (filter.children.length === 1 && filter.children[0] instanceof Filter && filter.children[0].op === "eq") {
211
+ return filter.children[0].field;
212
+ }
213
+ let description;
214
+ if (filter.children.length === 0) {
215
+ description = "empty filter";
216
+ } else if (filter.children.length === 1) {
217
+ const child = filter.children[0];
218
+ const opDesc = child instanceof Filter ? child.op : "group";
219
+ description = `single non-eq filter (op: ${opDesc})`;
220
+ } else {
221
+ description = `${filter.children.length} filter clauses`;
222
+ }
223
+ throw new OrmValidationError("upsert-filter-incompatible", schemaName, "upsertOne", [
224
+ {
225
+ cause: `PostgreSQL upsert requires a single eq filter on a UNIQUE-indexed column; received ${description}`
226
+ }
227
+ ]);
228
+ }
229
+ function aggFnToSql(fn, field, primaryKey) {
230
+ if (fn === "count") return "COUNT(*)";
231
+ const col = `"${mapField(field, primaryKey)}"`;
232
+ switch (fn) {
233
+ case "countDistinct":
234
+ return `COUNT(DISTINCT ${col})`;
235
+ case "sum":
236
+ return `SUM(${col})`;
237
+ case "avg":
238
+ return `AVG(${col})`;
239
+ case "min":
240
+ return `MIN(${col})`;
241
+ case "max":
242
+ return `MAX(${col})`;
243
+ }
244
+ }
245
+ function resolveHavingField(field, primaryKey, aliasToExpr, groupBySet) {
246
+ if (aliasToExpr.has(field)) return aliasToExpr.get(field);
247
+ if (groupBySet.has(field)) return `"${mapField(field, primaryKey)}"`;
248
+ return `"${field}"`;
249
+ }
250
+ function buildAggregateQuery(spec, tableName, primaryKey) {
251
+ const params = [];
252
+ let paramIndex = 1;
253
+ function nextParam(value) {
254
+ params.push(value);
255
+ return `$${paramIndex++}`;
256
+ }
257
+ const selectParts = [];
258
+ const aliasToExpr = /* @__PURE__ */ new Map();
259
+ for (const agg of spec.aggregates) {
260
+ const expr = aggFnToSql(agg.fn, agg.field, primaryKey);
261
+ aliasToExpr.set(agg.alias, expr);
262
+ selectParts.push(`${expr} AS "${agg.alias}"`);
263
+ }
264
+ const groupByFields = [];
265
+ for (const f of spec.groupBy) {
266
+ const col = `"${mapField(f, primaryKey)}"`;
267
+ groupByFields.push(col);
268
+ selectParts.push(`${col} AS "${f}"`);
269
+ }
270
+ let whereClause = "";
271
+ if (spec.where) {
272
+ const whereLeaf = (f) => compileFilter(f, primaryKey, nextParam);
273
+ const whereParts = compileChildren(spec.where, whereLeaf);
274
+ if (whereParts.length > 0) whereClause = `WHERE ${whereParts.join(" AND ")}`;
275
+ }
276
+ const groupByClause = groupByFields.length > 0 ? `GROUP BY ${groupByFields.join(", ")}` : "";
277
+ let havingClause = "";
278
+ if (spec.having) {
279
+ const groupBySet = new Set(spec.groupBy);
280
+ const havingLeaf = (f) => compileOps(f, resolveHavingField(f.field, primaryKey, aliasToExpr, groupBySet), nextParam);
281
+ const havingParts = compileChildren(spec.having, havingLeaf);
282
+ if (havingParts.length > 0) havingClause = `HAVING ${havingParts.join(" AND ")}`;
283
+ }
284
+ const sql = `SELECT ${selectParts.join(", ")} FROM "${tableName}" ${whereClause} ${groupByClause} ${havingClause}`.trim().replace(/\s+/g, " ");
285
+ return { sql, params };
286
+ }
287
+ if (void 0) {
288
+ const { describe, test, expect } = void 0;
289
+ const { FilterGroup: FilterGroup2 } = await null;
290
+ const { OrderBy } = await null;
291
+ const { IncOp: IncOp2, MulOp: MulOp2, MinOp: MinOp2, MaxOp: MaxOp2, UnsetOp: UnsetOp2, PushOp: PushOp2, PullOp: PullOp2, PatchOp: PatchOp2, SetOp, flattenOps: flattenOps2 } = await null;
292
+ const { OrmValidationError: OrmValidationError2 } = await null;
293
+ describe("compilePgFilter", () => {
294
+ test("empty filter group compiles to empty WHERE clause", () => {
295
+ const group = FilterGroup2.create();
296
+ const { sql } = buildSelectQuery(group, void 0, "users", "id");
297
+ expect(sql).toBe('SELECT * FROM "users"');
298
+ });
299
+ test("single eq filter compiles to WHERE field = $1", () => {
300
+ const group = FilterGroup2.create().eq("name", "Alice");
301
+ const { sql, params } = buildSelectQuery(group, void 0, "users", "id");
302
+ expect(sql).toBe('SELECT * FROM "users" WHERE "name" = $1');
303
+ expect(params).toEqual(["Alice"]);
304
+ });
305
+ test("eq with null compiles to IS NULL", () => {
306
+ const group = FilterGroup2.create().eq("name", null);
307
+ const { sql, params } = buildSelectQuery(group, void 0, "users", "id");
308
+ expect(sql).toBe('SELECT * FROM "users" WHERE "name" IS NULL');
309
+ expect(params).toEqual([]);
310
+ });
311
+ test("ne compiles to != (or IS NOT NULL for null)", () => {
312
+ const group = FilterGroup2.create().ne("age", 5);
313
+ const { sql, params } = buildSelectQuery(group, void 0, "users", "id");
314
+ expect(sql).toBe('SELECT * FROM "users" WHERE "age" != $1');
315
+ expect(params).toEqual([5]);
316
+ const nullGroup = FilterGroup2.create().ne("age", null);
317
+ const { sql: nullSql } = buildSelectQuery(nullGroup, void 0, "users", "id");
318
+ expect(nullSql).toBe('SELECT * FROM "users" WHERE "age" IS NOT NULL');
319
+ });
320
+ test("gt, gte, lt, lte compile to >, >=, <, <=", () => {
321
+ expect(buildSelectQuery(FilterGroup2.create().gt("age", 10), void 0, "t", "id").sql).toContain('"age" > $1');
322
+ expect(buildSelectQuery(FilterGroup2.create().gte("age", 20), void 0, "t", "id").sql).toContain('"age" >= $1');
323
+ expect(buildSelectQuery(FilterGroup2.create().lt("age", 30), void 0, "t", "id").sql).toContain('"age" < $1');
324
+ expect(buildSelectQuery(FilterGroup2.create().lte("age", 40), void 0, "t", "id").sql).toContain('"age" <= $1');
325
+ });
326
+ test("in compiles to = ANY($N)", () => {
327
+ const group = FilterGroup2.create().in("status", ["a", "b"]);
328
+ const { sql, params } = buildSelectQuery(group, void 0, "users", "id");
329
+ expect(sql).toContain('"status" = ANY($1)');
330
+ expect(params).toEqual([["a", "b"]]);
331
+ });
332
+ test("notIn compiles to NOT (field = ANY($N)) \u2014 canonical name notIn", () => {
333
+ const group = FilterGroup2.create().notIn("status", ["x", "y"]);
334
+ const { sql, params } = buildSelectQuery(group, void 0, "users", "id");
335
+ expect(sql).toContain('NOT ("status" = ANY($1))');
336
+ expect(params).toEqual([["x", "y"]]);
337
+ });
338
+ test("like compiles to ILIKE with % wrapping", () => {
339
+ const group = FilterGroup2.create().like("name", "ali");
340
+ const { sql, params } = buildSelectQuery(group, void 0, "users", "id");
341
+ expect(sql).toContain('"name" ILIKE $1');
342
+ expect(params).toEqual(["%ali%"]);
343
+ });
344
+ test("exists compiles to IS NOT NULL (own op, not boolean form)", () => {
345
+ const group = FilterGroup2.create().exists("val");
346
+ const { sql, params } = buildSelectQuery(group, void 0, "users", "id");
347
+ expect(sql).toContain('"val" IS NOT NULL');
348
+ expect(params).toEqual([]);
349
+ });
350
+ test("notExists is its own op \u2014 compiles to IS NULL", () => {
351
+ const group = FilterGroup2.create().notExists("val");
352
+ const { sql, params } = buildSelectQuery(group, void 0, "users", "id");
353
+ expect(sql).toContain('"val" IS NULL');
354
+ expect(params).toEqual([]);
355
+ });
356
+ test("contains compiles to @> jsonb", () => {
357
+ const group = FilterGroup2.create().contains("tags", ["a", "b"]);
358
+ const { sql, params } = buildSelectQuery(group, void 0, "users", "id");
359
+ expect(sql).toContain('"tags" @> $1::jsonb');
360
+ expect(params).toEqual([JSON.stringify(["a", "b"])]);
361
+ });
362
+ test("notContains compiles to NOT (@> jsonb)", () => {
363
+ const group = FilterGroup2.create().notContains("tags", ["x"]);
364
+ const { sql, params } = buildSelectQuery(group, void 0, "users", "id");
365
+ expect(sql).toContain('NOT ("tags" @> $1::jsonb)');
366
+ expect(params).toEqual([JSON.stringify(["x"])]);
367
+ });
368
+ test("multiple clauses produce AND-joined WHERE", () => {
369
+ const group = FilterGroup2.create().eq("a", 1).gt("b", 2);
370
+ const { sql } = buildSelectQuery(group, void 0, "t", "id");
371
+ expect(sql).toContain('WHERE "a" = $1 AND "b" > $2');
372
+ });
373
+ test("nested and/or groups compile correctly", () => {
374
+ const group = FilterGroup2.create().and([
375
+ (q) => q.eq("a", 1),
376
+ (q) => q.or([(g) => g.eq("b", 2), (g) => g.eq("c", 3)])
377
+ ]);
378
+ const { sql, params } = buildSelectQuery(group, void 0, "t", "id");
379
+ expect(sql).toContain('("a" = $1 AND ("b" = $2 OR "c" = $3))');
380
+ expect(params).toEqual([1, 2, 3]);
381
+ });
382
+ test("maps id field to primaryKey when primaryKey differs", () => {
383
+ const group = FilterGroup2.create().eq("id", "abc");
384
+ const { sql } = buildSelectQuery(group, void 0, "users", "user_id");
385
+ expect(sql).toContain('"user_id" = $1');
386
+ });
387
+ });
388
+ describe("buildSelectQuery", () => {
389
+ test("options: sort, limit, offset, select", () => {
390
+ const group = FilterGroup2.create().eq("active", true);
391
+ const options = {
392
+ orderBy: [new OrderBy("name", "asc"), new OrderBy("age", "desc")],
393
+ limit: 10,
394
+ offset: 5,
395
+ select: ["name", "age"]
396
+ };
397
+ const { sql, params } = buildSelectQuery(group, options, "users", "id");
398
+ expect(sql).toContain('SELECT "name", "age"');
399
+ expect(sql).toContain('ORDER BY "name" ASC, "age" DESC');
400
+ expect(sql).toContain("LIMIT $2");
401
+ expect(sql).toContain("OFFSET $3");
402
+ expect(params).toEqual([true, 10, 5]);
403
+ });
404
+ test("undefined options returns basic SELECT *", () => {
405
+ const group = FilterGroup2.create().eq("x", 1);
406
+ const { sql } = buildSelectQuery(group, void 0, "users", "id");
407
+ expect(sql).toBe('SELECT * FROM "users" WHERE "x" = $1');
408
+ });
409
+ });
410
+ describe("buildCreateQuery", () => {
411
+ test("produces INSERT with RETURNING *", () => {
412
+ const { sql, params } = buildCreateQuery("users", { name: "Alice", age: 30 });
413
+ expect(sql).toBe('INSERT INTO "users" ("name", "age") VALUES ($1, $2) RETURNING *');
414
+ expect(params).toEqual(["Alice", 30]);
415
+ });
416
+ });
417
+ describe("buildUpdateQuery", () => {
418
+ test("plain values produce SET col = $N", () => {
419
+ const group = FilterGroup2.create().eq("id", "u1");
420
+ const { sql, params } = buildUpdateQuery(group, "users", "id", { name: "Bob", age: 25 });
421
+ expect(sql).toBe('UPDATE "users" SET "name" = $1, "age" = $2 WHERE "id" = $3 RETURNING *');
422
+ expect(params).toEqual(["Bob", 25, "u1"]);
423
+ });
424
+ test("IncOp produces col = col + $N", () => {
425
+ const group = FilterGroup2.create().eq("id", "u1");
426
+ const { sql, params } = buildUpdateQuery(group, "users", "id", { count: new IncOp2("count", 5) });
427
+ expect(sql).toContain('"count" = "count" + $1');
428
+ expect(params[0]).toBe(5);
429
+ });
430
+ test("MulOp produces col = col * $N", () => {
431
+ const group = FilterGroup2.create().eq("id", "u1");
432
+ const { sql } = buildUpdateQuery(group, "users", "id", { score: new MulOp2("score", 2) });
433
+ expect(sql).toContain('"score" = "score" * $1');
434
+ });
435
+ test("MinOp/MaxOp produce LEAST/GREATEST", () => {
436
+ const group = FilterGroup2.create().eq("id", "u1");
437
+ const { sql } = buildUpdateQuery(group, "users", "id", {
438
+ lo: new MinOp2("lo", 1),
439
+ hi: new MaxOp2("hi", 99)
440
+ });
441
+ expect(sql).toContain('LEAST("lo", $1)');
442
+ expect(sql).toContain('GREATEST("hi", $2)');
443
+ });
444
+ test("UnsetOp produces col = NULL", () => {
445
+ const group = FilterGroup2.create().eq("id", "u1");
446
+ const { sql } = buildUpdateQuery(group, "users", "id", { old: new UnsetOp2("old") });
447
+ expect(sql).toContain('"old" = NULL');
448
+ });
449
+ test("PushOp produces jsonb array append", () => {
450
+ const group = FilterGroup2.create().eq("id", "u1");
451
+ const { sql } = buildUpdateQuery(group, "users", "id", { tags: new PushOp2("tags", "new") });
452
+ expect(sql).toContain("jsonb_build_array($1::jsonb)");
453
+ });
454
+ test("PullOp produces jsonb array removal", () => {
455
+ const group = FilterGroup2.create().eq("id", "u1");
456
+ const { sql } = buildUpdateQuery(group, "users", "id", { tags: new PullOp2("tags", "old") });
457
+ expect(sql).toContain("jsonb_array_elements");
458
+ });
459
+ test("PatchOp produces jsonb merge", () => {
460
+ const group = FilterGroup2.create().eq("id", "u1");
461
+ const { sql } = buildUpdateQuery(group, "users", "id", { meta: new PatchOp2("meta", { a: 1 }) });
462
+ expect(sql).toContain("|| $1::jsonb");
463
+ });
464
+ });
465
+ describe("buildPkUpdateQuery", () => {
466
+ test("builds UPDATE with PK WHERE clause", () => {
467
+ const { sql, params } = buildPkUpdateQuery("users", "id", "u1", { name: "Bob" });
468
+ expect(sql).toBe('UPDATE "users" SET "name" = $1 WHERE "id" = $2 RETURNING *');
469
+ expect(params).toEqual(["Bob", "u1"]);
470
+ });
471
+ test("handles ops in PK update", () => {
472
+ const { sql, params } = buildPkUpdateQuery("users", "id", "u1", { count: new IncOp2("count", 3) });
473
+ expect(sql).toContain('"count" = "count" + $1');
474
+ expect(sql).toContain('WHERE "id" = $2');
475
+ expect(params).toEqual([3, "u1"]);
476
+ });
477
+ });
478
+ describe("buildDeleteQuery", () => {
479
+ test("produces DELETE with RETURNING *", () => {
480
+ const group = FilterGroup2.create().eq("id", "u1");
481
+ const { sql, params } = buildDeleteQuery(group, "users", "id");
482
+ expect(sql).toBe('DELETE FROM "users" WHERE "id" = $1 RETURNING *');
483
+ expect(params).toEqual(["u1"]);
484
+ });
485
+ });
486
+ describe("buildUpsertQuery", () => {
487
+ test("produces INSERT ON CONFLICT with SET parts from data", () => {
488
+ const data = flattenOps2([new SetOp({ name: "Updated" })]);
489
+ const { sql, params } = buildUpsertQuery("users", "email", "id", { id: "u1", email: "a@b.com", name: "Alice" }, data);
490
+ expect(sql).toContain('INSERT INTO "users"');
491
+ expect(sql).toContain('ON CONFLICT ("email") DO UPDATE SET');
492
+ expect(sql).toContain('"name" = $4');
493
+ expect(sql).toContain("RETURNING *");
494
+ expect(params).toEqual(["u1", "a@b.com", "Alice", "Updated"]);
495
+ });
496
+ test("empty data produces no-op SET on conflict column", () => {
497
+ const { sql, params } = buildUpsertQuery("users", "email", "id", { id: "u1", email: "a@b.com" }, {});
498
+ expect(sql).toContain('ON CONFLICT ("email") DO UPDATE SET "email" = EXCLUDED."email"');
499
+ expect(params).toEqual(["u1", "a@b.com"]);
500
+ });
501
+ test("maps conflict column via mapField when primaryKey differs", () => {
502
+ const { sql } = buildUpsertQuery("users", "id", "user_id", { user_id: "u1", name: "A" }, {});
503
+ expect(sql).toContain('ON CONFLICT ("user_id")');
504
+ });
505
+ test("handles ops in upsert SET clause", () => {
506
+ const data = flattenOps2([new IncOp2("views", 1)]);
507
+ const { sql, params } = buildUpsertQuery("posts", "slug", "id", { id: "p1", slug: "hello", views: 0 }, data);
508
+ expect(sql).toContain('"views" = "views" + $4');
509
+ expect(params).toEqual(["p1", "hello", 0, 1]);
510
+ });
511
+ });
512
+ describe("extractUpsertConflictColumn", () => {
513
+ test("extracts field from single eq filter", () => {
514
+ const filter = FilterGroup2.create().eq("email", "a@b.com");
515
+ expect(extractUpsertConflictColumn(filter, "users")).toBe("email");
516
+ });
517
+ test("throws upsert-filter-incompatible on empty filter", () => {
518
+ const filter = FilterGroup2.create();
519
+ expect(() => extractUpsertConflictColumn(filter, "users")).toThrow(OrmValidationError2);
520
+ try {
521
+ extractUpsertConflictColumn(filter, "users");
522
+ } catch (e) {
523
+ const err = e;
524
+ expect(err.kind).toBe("upsert-filter-incompatible");
525
+ expect(err.schema).toBe("users");
526
+ expect(err.operation).toBe("upsertOne");
527
+ expect(err.failures[0].cause).toContain("empty filter");
528
+ }
529
+ });
530
+ test("throws upsert-filter-incompatible on multiple filters", () => {
531
+ const filter = FilterGroup2.create().eq("a", 1).eq("b", 2);
532
+ expect(() => extractUpsertConflictColumn(filter, "users")).toThrow(OrmValidationError2);
533
+ try {
534
+ extractUpsertConflictColumn(filter, "users");
535
+ } catch (e) {
536
+ const err = e;
537
+ expect(err.kind).toBe("upsert-filter-incompatible");
538
+ expect(err.failures[0].cause).toContain("2 filter clauses");
539
+ }
540
+ });
541
+ test("throws upsert-filter-incompatible on non-eq filter", () => {
542
+ const filter = FilterGroup2.create().gt("age", 10);
543
+ expect(() => extractUpsertConflictColumn(filter, "users")).toThrow(OrmValidationError2);
544
+ try {
545
+ extractUpsertConflictColumn(filter, "users");
546
+ } catch (e) {
547
+ const err = e;
548
+ expect(err.kind).toBe("upsert-filter-incompatible");
549
+ expect(err.failures[0].cause).toContain("non-eq filter");
550
+ }
551
+ });
552
+ test("throws with clear message naming received filter shape", () => {
553
+ const filter = FilterGroup2.create().in("status", ["a", "b"]);
554
+ try {
555
+ extractUpsertConflictColumn(filter, "test");
556
+ expect.unreachable();
557
+ } catch (e) {
558
+ const err = e;
559
+ expect(err.kind).toBe("upsert-filter-incompatible");
560
+ expect(err.failures[0].cause).toContain("single eq filter");
561
+ expect(err.failures[0].cause).toContain("UNIQUE-indexed column");
562
+ }
563
+ });
564
+ });
565
+ describe("buildAggregateQuery", () => {
566
+ test("bare count produces SELECT COUNT(*) AS alias", () => {
567
+ const { sql, params } = buildAggregateQuery(
568
+ { aggregates: [{ fn: "count", alias: "total" }], groupBy: [] },
569
+ "orders",
570
+ "id"
571
+ );
572
+ expect(sql).toBe('SELECT COUNT(*) AS "total" FROM "orders"');
573
+ expect(params).toEqual([]);
574
+ });
575
+ test("multi-aggregator produces all functions", () => {
576
+ const { sql, params } = buildAggregateQuery(
577
+ {
578
+ aggregates: [
579
+ { fn: "count", alias: "cnt" },
580
+ { fn: "sum", field: "amount", alias: "revenue" },
581
+ { fn: "avg", field: "amount", alias: "avgAmt" },
582
+ { fn: "min", field: "amount", alias: "lo" },
583
+ { fn: "max", field: "amount", alias: "hi" }
584
+ ],
585
+ groupBy: []
586
+ },
587
+ "orders",
588
+ "id"
589
+ );
590
+ expect(sql).toBe(
591
+ 'SELECT COUNT(*) AS "cnt", SUM("amount") AS "revenue", AVG("amount") AS "avgAmt", MIN("amount") AS "lo", MAX("amount") AS "hi" FROM "orders"'
592
+ );
593
+ expect(params).toEqual([]);
594
+ });
595
+ test("countDistinct produces COUNT(DISTINCT col)", () => {
596
+ const { sql } = buildAggregateQuery(
597
+ { aggregates: [{ fn: "countDistinct", field: "category", alias: "unique" }], groupBy: [] },
598
+ "items",
599
+ "id"
600
+ );
601
+ expect(sql).toBe('SELECT COUNT(DISTINCT "category") AS "unique" FROM "items"');
602
+ });
603
+ test("single-column groupBy produces GROUP BY clause", () => {
604
+ const { sql } = buildAggregateQuery(
605
+ {
606
+ aggregates: [{ fn: "count", alias: "cnt" }],
607
+ groupBy: ["region"]
608
+ },
609
+ "orders",
610
+ "id"
611
+ );
612
+ expect(sql).toBe('SELECT COUNT(*) AS "cnt", "region" AS "region" FROM "orders" GROUP BY "region"');
613
+ });
614
+ test("multi-column groupBy produces all GROUP BY columns", () => {
615
+ const { sql } = buildAggregateQuery(
616
+ {
617
+ aggregates: [{ fn: "count", alias: "cnt" }],
618
+ groupBy: ["region", "product"]
619
+ },
620
+ "orders",
621
+ "id"
622
+ );
623
+ expect(sql).toBe(
624
+ 'SELECT COUNT(*) AS "cnt", "region" AS "region", "product" AS "product" FROM "orders" GROUP BY "region", "product"'
625
+ );
626
+ });
627
+ test("where-only produces WHERE clause with params", () => {
628
+ const where = FilterGroup2.create().eq("status", "active");
629
+ const { sql, params } = buildAggregateQuery(
630
+ { aggregates: [{ fn: "count", alias: "total" }], groupBy: [], where },
631
+ "orders",
632
+ "id"
633
+ );
634
+ expect(sql).toBe('SELECT COUNT(*) AS "total" FROM "orders" WHERE "status" = $1');
635
+ expect(params).toEqual(["active"]);
636
+ });
637
+ test("having-only filters on aggregate alias via repeated expression", () => {
638
+ const having = FilterGroup2.create().gt("total", 10);
639
+ const { sql, params } = buildAggregateQuery(
640
+ {
641
+ aggregates: [{ fn: "count", alias: "total" }],
642
+ groupBy: ["region"],
643
+ having
644
+ },
645
+ "orders",
646
+ "id"
647
+ );
648
+ expect(sql).toBe(
649
+ 'SELECT COUNT(*) AS "total", "region" AS "region" FROM "orders" GROUP BY "region" HAVING COUNT(*) > $1'
650
+ );
651
+ expect(params).toEqual([10]);
652
+ });
653
+ test("where + having both produce correct param ordering", () => {
654
+ const where = FilterGroup2.create().eq("status", "active");
655
+ const having = FilterGroup2.create().gte("revenue", 1e3);
656
+ const { sql, params } = buildAggregateQuery(
657
+ {
658
+ aggregates: [{ fn: "sum", field: "amount", alias: "revenue" }],
659
+ groupBy: ["region"],
660
+ where,
661
+ having
662
+ },
663
+ "orders",
664
+ "id"
665
+ );
666
+ expect(sql).toBe(
667
+ 'SELECT SUM("amount") AS "revenue", "region" AS "region" FROM "orders" WHERE "status" = $1 GROUP BY "region" HAVING SUM("amount") >= $2'
668
+ );
669
+ expect(params).toEqual(["active", 1e3]);
670
+ });
671
+ test("having on groupBy field uses column name directly", () => {
672
+ const having = FilterGroup2.create().eq("region", "US");
673
+ const { sql, params } = buildAggregateQuery(
674
+ {
675
+ aggregates: [{ fn: "count", alias: "cnt" }],
676
+ groupBy: ["region"],
677
+ having
678
+ },
679
+ "orders",
680
+ "id"
681
+ );
682
+ expect(sql).toBe(
683
+ 'SELECT COUNT(*) AS "cnt", "region" AS "region" FROM "orders" GROUP BY "region" HAVING "region" = $1'
684
+ );
685
+ expect(params).toEqual(["US"]);
686
+ });
687
+ test("field-name mapping: id maps to primaryKey when primaryKey differs", () => {
688
+ const { sql } = buildAggregateQuery(
689
+ {
690
+ aggregates: [{ fn: "countDistinct", field: "id", alias: "uniqueIds" }],
691
+ groupBy: []
692
+ },
693
+ "users",
694
+ "user_id"
695
+ );
696
+ expect(sql).toBe('SELECT COUNT(DISTINCT "user_id") AS "uniqueIds" FROM "users"');
697
+ });
698
+ test("groupBy with id field maps to primaryKey", () => {
699
+ const { sql } = buildAggregateQuery(
700
+ {
701
+ aggregates: [{ fn: "count", alias: "cnt" }],
702
+ groupBy: ["id"]
703
+ },
704
+ "users",
705
+ "user_id"
706
+ );
707
+ expect(sql).toContain('GROUP BY "user_id"');
708
+ expect(sql).toContain('"user_id" AS "id"');
709
+ });
710
+ test("complex having with AND/OR groups", () => {
711
+ const having = FilterGroup2.create().and([
712
+ (q) => q.gt("cnt", 5),
713
+ (q) => q.or([(g) => g.eq("region", "US"), (g) => g.eq("region", "EU")])
714
+ ]);
715
+ const { sql, params } = buildAggregateQuery(
716
+ {
717
+ aggregates: [{ fn: "count", alias: "cnt" }],
718
+ groupBy: ["region"],
719
+ having
720
+ },
721
+ "orders",
722
+ "id"
723
+ );
724
+ expect(sql).toContain('HAVING (COUNT(*) > $1 AND ("region" = $2 OR "region" = $3))');
725
+ expect(params).toEqual([5, "US", "EU"]);
726
+ });
727
+ });
728
+ }
729
+
730
+ // src/orm/adapters/postgresql/index.ts
731
+ var postgresqlConnectionPipe = () => v.object({
732
+ host: v.string(),
733
+ port: v.number(),
734
+ username: v.string(),
735
+ password: v.string(),
736
+ database: v.string(),
737
+ ssl: v.defaults(v.boolean(), false)
738
+ });
739
+ var TRACKER_TABLE = "equipped_migrations";
740
+ var ADVISORY_LOCK_KEY = 3735928559;
741
+ var DEFAULT_CURSOR_BATCH_SIZE = 1e3;
742
+ var FIELD_TYPE_TO_PG = {
743
+ string: "text",
744
+ number: "double precision",
745
+ boolean: "boolean",
746
+ date: "timestamptz",
747
+ null: "text",
748
+ object: "jsonb",
749
+ array: "jsonb"
750
+ };
751
+ var PG_TO_FIELD_TYPE = {
752
+ text: "string",
753
+ "character varying": "string",
754
+ varchar: "string",
755
+ char: "string",
756
+ character: "string",
757
+ "double precision": "number",
758
+ real: "number",
759
+ integer: "number",
760
+ smallint: "number",
761
+ numeric: "number",
762
+ decimal: "number",
763
+ boolean: "boolean",
764
+ "timestamp with time zone": "date",
765
+ "timestamp without time zone": "date",
766
+ timestamptz: "date",
767
+ timestamp: "date",
768
+ date: "date",
769
+ jsonb: "object",
770
+ json: "object"
771
+ };
772
+ var PostgresAdapter = class extends configurable(postgresqlConnectionPipe, OrmAdapter) {
773
+ schemaConfigPipe = v.object({
774
+ schema: v.optional(v.string()),
775
+ table: v.string()
776
+ });
777
+ supportedFieldTypes = ["string", "number", "boolean", "null", "object", "array", "date"];
778
+ queryableOps = [
779
+ "eq",
780
+ "ne",
781
+ "gt",
782
+ "gte",
783
+ "lt",
784
+ "lte",
785
+ "in",
786
+ "notIn",
787
+ "like",
788
+ "exists",
789
+ "notExists",
790
+ "contains",
791
+ "notContains"
792
+ ];
793
+ updateOps = ["set", "inc", "mul", "min", "max", "unset", "push", "pull", "patch"];
794
+ aggregateOps = ["count", "countDistinct", "sum", "avg", "min", "max"];
795
+ pool;
796
+ #sessionStore = new AsyncLocalStorage();
797
+ constructor(config) {
798
+ super(config);
799
+ this.pool = new Pool({
800
+ host: config.host,
801
+ port: config.port,
802
+ user: config.username,
803
+ password: config.password,
804
+ database: config.database,
805
+ ssl: config.ssl ? { rejectUnauthorized: false } : false
806
+ });
807
+ }
808
+ #getClient() {
809
+ return this.#sessionStore.getStore() ?? this.pool;
810
+ }
811
+ #resolveTableName(config) {
812
+ return config.schema && config.schema !== "public" ? `${config.schema}.${config.table}` : config.table;
813
+ }
814
+ async connect() {
815
+ }
816
+ async disconnect() {
817
+ try {
818
+ await this.pool.end();
819
+ } catch (error) {
820
+ throw new EquippedError("Failed to disconnect PostgreSQL pool", { adapter: "postgresql" }, error);
821
+ }
822
+ }
823
+ async findByPk(schema, config, pk) {
824
+ const c = config;
825
+ try {
826
+ const tableName = this.#resolveTableName(c);
827
+ const pkName = schema.pkField.name;
828
+ const result = await this.#getClient().query(`SELECT * FROM "${tableName}" WHERE "${pkName}" = $1`, [pk]);
829
+ return result.rows[0] ?? null;
830
+ } catch (error) {
831
+ throw new EquippedError("PostgreSQL findByPk failed", { adapter: "postgresql", operation: "findByPk", table: c.table }, error);
832
+ }
833
+ }
834
+ async createMany(_schema, config, data) {
835
+ const c = config;
836
+ try {
837
+ const tableName = this.#resolveTableName(c);
838
+ const client = this.#getClient();
839
+ const results = [];
840
+ for (const doc of data) {
841
+ const { sql, params } = buildCreateQuery(tableName, doc);
842
+ const result = await client.query(sql, params);
843
+ results.push(result.rows[0]);
844
+ }
845
+ return results;
846
+ } catch (error) {
847
+ throw new EquippedError(
848
+ "PostgreSQL createMany failed",
849
+ { adapter: "postgresql", operation: "createMany", table: c.table },
850
+ error
851
+ );
852
+ }
853
+ }
854
+ async updateByPk(schema, config, pk, ops) {
855
+ const c = config;
856
+ try {
857
+ const tableName = this.#resolveTableName(c);
858
+ const pkName = schema.pkField.name;
859
+ const data = flattenOps(ops);
860
+ if (Object.keys(data).length === 0) {
861
+ const result2 = await this.#getClient().query(`SELECT * FROM "${tableName}" WHERE "${pkName}" = $1`, [pk]);
862
+ return result2.rows[0] ?? null;
863
+ }
864
+ const { sql, params } = buildPkUpdateQuery(tableName, pkName, pk, data);
865
+ const result = await this.#getClient().query(sql, params);
866
+ return result.rows[0] ?? null;
867
+ } catch (error) {
868
+ throw new EquippedError(
869
+ "PostgreSQL updateByPk failed",
870
+ { adapter: "postgresql", operation: "updateByPk", table: c.table },
871
+ error
872
+ );
873
+ }
874
+ }
875
+ async deleteByPk(schema, config, pk) {
876
+ const c = config;
877
+ try {
878
+ const tableName = this.#resolveTableName(c);
879
+ const pkName = schema.pkField.name;
880
+ const result = await this.#getClient().query(`DELETE FROM "${tableName}" WHERE "${pkName}" = $1 RETURNING *`, [pk]);
881
+ return result.rows[0] ?? null;
882
+ } catch (error) {
883
+ throw new EquippedError(
884
+ "PostgreSQL deleteByPk failed",
885
+ { adapter: "postgresql", operation: "deleteByPk", table: c.table },
886
+ error
887
+ );
888
+ }
889
+ }
890
+ async raw(_schema, config, command, params = []) {
891
+ const c = config;
892
+ try {
893
+ const result = await this.#getClient().query(command, params);
894
+ return result;
895
+ } catch (error) {
896
+ if (error instanceof EquippedError) throw error;
897
+ throw new EquippedError("PostgreSQL raw failed", { adapter: "postgresql", operation: "raw", table: c.table }, error);
898
+ }
899
+ }
900
+ async findMany(schema, config, filter, options) {
901
+ const c = config;
902
+ try {
903
+ const tableName = this.#resolveTableName(c);
904
+ const { sql, params } = buildSelectQuery(filter, options, tableName, schema.pkField.name);
905
+ const result = await this.#getClient().query(sql, params);
906
+ return result.rows;
907
+ } catch (error) {
908
+ throw new EquippedError("PostgreSQL findMany failed", { adapter: "postgresql", operation: "findMany", table: c.table }, error);
909
+ }
910
+ }
911
+ async count(schema, config, filter) {
912
+ const c = config;
913
+ try {
914
+ const tableName = this.#resolveTableName(c);
915
+ const { sql, params } = buildCountQuery(filter, tableName, schema.pkField.name);
916
+ const result = await this.#getClient().query(sql, params);
917
+ return Number(result.rows[0]?.count ?? 0);
918
+ } catch (error) {
919
+ throw new EquippedError("PostgreSQL count failed", { adapter: "postgresql", operation: "count", table: c.table }, error);
920
+ }
921
+ }
922
+ async *iterateMany(schema, config, filter, options) {
923
+ const c = config;
924
+ let client;
925
+ let releaseClient = false;
926
+ let cursor;
927
+ try {
928
+ const tableName = this.#resolveTableName(c);
929
+ const { sql, params } = buildSelectQuery(filter, options, tableName, schema.pkField.name);
930
+ const sessionClient = this.#sessionStore.getStore();
931
+ if (sessionClient) {
932
+ client = sessionClient;
933
+ } else {
934
+ client = await this.pool.connect();
935
+ releaseClient = true;
936
+ }
937
+ cursor = client.query(new Cursor(sql, params));
938
+ const batchSize = options?.batchSize ?? DEFAULT_CURSOR_BATCH_SIZE;
939
+ while (true) {
940
+ const rows = await cursor.read(batchSize);
941
+ if (rows.length === 0) break;
942
+ for (const row of rows) yield row;
943
+ }
944
+ } catch (error) {
945
+ throw new EquippedError("PostgreSQL iterateMany failed", { adapter: "postgresql", operation: "iterateMany", table: c.table }, error);
946
+ } finally {
947
+ try {
948
+ await cursor?.close();
949
+ } finally {
950
+ if (releaseClient) client?.release();
951
+ }
952
+ }
953
+ }
954
+ async updateMany(schema, config, filter, data) {
955
+ const c = config;
956
+ try {
957
+ const tableName = this.#resolveTableName(c);
958
+ const { sql, params } = buildUpdateQuery(filter, tableName, schema.pkField.name, data);
959
+ const result = await this.#getClient().query(sql, params);
960
+ return result.rows;
961
+ } catch (error) {
962
+ throw new EquippedError(
963
+ "PostgreSQL updateMany failed",
964
+ { adapter: "postgresql", operation: "updateMany", table: c.table },
965
+ error
966
+ );
967
+ }
968
+ }
969
+ async deleteMany(schema, config, filter) {
970
+ const c = config;
971
+ try {
972
+ const tableName = this.#resolveTableName(c);
973
+ const { sql, params } = buildDeleteQuery(filter, tableName, schema.pkField.name);
974
+ const result = await this.#getClient().query(sql, params);
975
+ return result.rows;
976
+ } catch (error) {
977
+ throw new EquippedError(
978
+ "PostgreSQL deleteMany failed",
979
+ { adapter: "postgresql", operation: "deleteMany", table: c.table },
980
+ error
981
+ );
982
+ }
983
+ }
984
+ async upsertOne(schema, config, filter, create, ops) {
985
+ const c = config;
986
+ try {
987
+ const tableName = this.#resolveTableName(c);
988
+ const conflictColumn = extractUpsertConflictColumn(filter, schema.name);
989
+ const data = ops.length > 0 ? flattenOps(ops) : {};
990
+ const { sql, params } = buildUpsertQuery(tableName, conflictColumn, schema.pkField.name, create, data);
991
+ const result = await this.#getClient().query(sql, params);
992
+ return result.rows[0];
993
+ } catch (error) {
994
+ if (error instanceof EquippedError) throw error;
995
+ throw new EquippedError("PostgreSQL upsertOne failed", { adapter: "postgresql", operation: "upsertOne", table: c.table }, error);
996
+ }
997
+ }
998
+ async aggregate(schema, config, spec) {
999
+ const c = config;
1000
+ try {
1001
+ const tableName = this.#resolveTableName(c);
1002
+ const { sql, params } = buildAggregateQuery(spec, tableName, schema.pkField.name);
1003
+ const result = await this.#getClient().query(sql, params);
1004
+ return result.rows.map((row) => {
1005
+ const mapped = {};
1006
+ for (const agg of spec.aggregates) {
1007
+ const val = row[agg.alias];
1008
+ if (agg.fn === "min" || agg.fn === "max") {
1009
+ mapped[agg.alias] = val;
1010
+ } else {
1011
+ mapped[agg.alias] = typeof val === "string" ? Number(val) : Number(val ?? 0);
1012
+ }
1013
+ }
1014
+ for (const field of spec.groupBy) {
1015
+ mapped[field] = row[field];
1016
+ }
1017
+ return mapped;
1018
+ });
1019
+ } catch (error) {
1020
+ if (error instanceof EquippedError) throw error;
1021
+ throw new EquippedError("PostgreSQL aggregate failed", { adapter: "postgresql", operation: "aggregate", table: c.table }, error);
1022
+ }
1023
+ }
1024
+ async loadMigrations() {
1025
+ const client = this.#getClient();
1026
+ await client.query(`
1027
+ CREATE TABLE IF NOT EXISTS "${TRACKER_TABLE}" (
1028
+ id text PRIMARY KEY,
1029
+ applied_at bigint NOT NULL
1030
+ )
1031
+ `);
1032
+ const result = await client.query(`SELECT id, applied_at FROM "${TRACKER_TABLE}"`);
1033
+ return result.rows.map((row) => ({ id: row.id, appliedAt: Number(row.applied_at) }));
1034
+ }
1035
+ async recordMigration(id, appliedAt) {
1036
+ const client = this.#getClient();
1037
+ await client.query(`INSERT INTO "${TRACKER_TABLE}" (id, applied_at) VALUES ($1, $2)`, [id, appliedAt]);
1038
+ }
1039
+ async acquireMigrationLock(fn) {
1040
+ const client = this.#getClient();
1041
+ await client.query(`SELECT pg_advisory_lock($1)`, [ADVISORY_LOCK_KEY]);
1042
+ try {
1043
+ return await fn();
1044
+ } finally {
1045
+ await client.query(`SELECT pg_advisory_unlock($1)`, [ADVISORY_LOCK_KEY]);
1046
+ }
1047
+ }
1048
+ async applyCreateTable(change) {
1049
+ const pkType = FIELD_TYPE_TO_PG[change.pk.type] ?? "text";
1050
+ const cols = [`"${change.pk.name}" ${pkType} PRIMARY KEY`];
1051
+ for (const f of change.fields) {
1052
+ cols.push(this.#renderColumnDef(f));
1053
+ }
1054
+ await this.#getClient().query(`CREATE TABLE "${change.name}" (${cols.join(", ")})`);
1055
+ }
1056
+ async applyDropTable(change) {
1057
+ await this.#getClient().query(`DROP TABLE "${change.name}"`);
1058
+ }
1059
+ async applyAddField(change) {
1060
+ const colDef = this.#renderColumnDef(change.field);
1061
+ await this.#getClient().query(`ALTER TABLE "${change.table}" ADD COLUMN ${colDef}`);
1062
+ }
1063
+ async applyDropField(change) {
1064
+ await this.#getClient().query(`ALTER TABLE "${change.table}" DROP COLUMN "${change.name}"`);
1065
+ }
1066
+ async applyModifyField(change) {
1067
+ const client = this.#getClient();
1068
+ const table = `"${change.table}"`;
1069
+ const col = `"${change.name}"`;
1070
+ const newType = FIELD_TYPE_TO_PG[change.to.type] ?? "text";
1071
+ await client.query(`ALTER TABLE ${table} ALTER COLUMN ${col} TYPE ${newType} USING ${col}::${newType}`);
1072
+ if (change.to.nullable) {
1073
+ await client.query(`ALTER TABLE ${table} ALTER COLUMN ${col} DROP NOT NULL`);
1074
+ } else {
1075
+ await client.query(`ALTER TABLE ${table} ALTER COLUMN ${col} SET NOT NULL`);
1076
+ }
1077
+ if (change.to.default !== void 0) {
1078
+ await client.query(`ALTER TABLE ${table} ALTER COLUMN ${col} SET DEFAULT ${this.#renderDefault(change.to.default)}`);
1079
+ } else {
1080
+ await client.query(`ALTER TABLE ${table} ALTER COLUMN ${col} DROP DEFAULT`);
1081
+ }
1082
+ if (change.to.name !== change.name) {
1083
+ await client.query(`ALTER TABLE ${table} RENAME COLUMN ${col} TO "${change.to.name}"`);
1084
+ }
1085
+ }
1086
+ async applyRenameTable(change) {
1087
+ await this.#getClient().query(`ALTER TABLE "${change.from}" RENAME TO "${change.to}"`);
1088
+ }
1089
+ async applyRenameField(change) {
1090
+ await this.#getClient().query(`ALTER TABLE "${change.table}" RENAME COLUMN "${change.from}" TO "${change.to}"`);
1091
+ }
1092
+ async applyAddIndex(change) {
1093
+ const name = change.name ?? this.#deriveIndexName(change.table, change.on, change.unique);
1094
+ const unique = change.unique ? "UNIQUE " : "";
1095
+ const cols = change.on.map((c) => `"${c}"`).join(", ");
1096
+ await this.#getClient().query(`CREATE ${unique}INDEX "${name}" ON "${change.table}" (${cols})`);
1097
+ }
1098
+ async applyDropIndex(change) {
1099
+ await this.#getClient().query(`DROP INDEX "${change.name}"`);
1100
+ }
1101
+ async applyAddForeignKey(change) {
1102
+ const name = change.name ?? `fk_${change.table}_${change.on}`;
1103
+ let sql = `ALTER TABLE "${change.table}" ADD CONSTRAINT "${name}" FOREIGN KEY ("${change.on}") REFERENCES "${change.references.table}" ("${change.references.column}")`;
1104
+ if (change.onDelete) sql += ` ON DELETE ${this.#renderFkAction(change.onDelete)}`;
1105
+ if (change.onUpdate) sql += ` ON UPDATE ${this.#renderFkAction(change.onUpdate)}`;
1106
+ await this.#getClient().query(sql);
1107
+ }
1108
+ async applyDropForeignKey(change) {
1109
+ await this.#getClient().query(`ALTER TABLE "${change.table}" DROP CONSTRAINT "${change.name}"`);
1110
+ }
1111
+ async introspect() {
1112
+ const { OrmIntrospectionError } = await import("../../../introspection-VOIU3XE6.js");
1113
+ const client = this.#getClient();
1114
+ const tablesResult = await client.query(`
1115
+ SELECT table_name FROM information_schema.tables
1116
+ WHERE table_schema = 'public' AND table_type = 'BASE TABLE' AND table_name != $1
1117
+ `, [TRACKER_TABLE]);
1118
+ const schemas = [];
1119
+ for (const tableRow of tablesResult.rows) {
1120
+ const tableName = tableRow.table_name;
1121
+ const colsResult = await client.query(`
1122
+ SELECT column_name, data_type, is_nullable, column_default
1123
+ FROM information_schema.columns
1124
+ WHERE table_schema = 'public' AND table_name = $1
1125
+ ORDER BY ordinal_position
1126
+ `, [tableName]);
1127
+ const pkResult = await client.query(`
1128
+ SELECT kcu.column_name
1129
+ FROM information_schema.table_constraints tc
1130
+ JOIN information_schema.key_column_usage kcu
1131
+ ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
1132
+ WHERE tc.table_schema = 'public' AND tc.table_name = $1 AND tc.constraint_type = 'PRIMARY KEY'
1133
+ `, [tableName]);
1134
+ const pkColName = pkResult.rows[0]?.column_name;
1135
+ const uniqueResult = await client.query(`
1136
+ SELECT kcu.column_name
1137
+ FROM information_schema.table_constraints tc
1138
+ JOIN information_schema.key_column_usage kcu
1139
+ ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
1140
+ WHERE tc.table_schema = 'public' AND tc.table_name = $1 AND tc.constraint_type = 'UNIQUE'
1141
+ `, [tableName]);
1142
+ const uniqueCols = new Set(uniqueResult.rows.map((r) => r.column_name));
1143
+ let pk;
1144
+ const fields = [];
1145
+ for (const col of colsResult.rows) {
1146
+ const pgType = col.data_type.toLowerCase();
1147
+ const fieldType = PG_TO_FIELD_TYPE[pgType];
1148
+ if (!fieldType) {
1149
+ throw new OrmIntrospectionError({ adapter: "postgresql", table: tableName, cause: `Unsupported column type '${pgType}' on column '${col.column_name}'` });
1150
+ }
1151
+ if (col.column_name === pkColName) {
1152
+ pk = { name: col.column_name, type: fieldType };
1153
+ continue;
1154
+ }
1155
+ const nullable = col.is_nullable === "YES";
1156
+ const raw = col.column_default;
1157
+ const def = this.#parseDefault(raw);
1158
+ fields.push({
1159
+ name: col.column_name,
1160
+ type: fieldType,
1161
+ nullable,
1162
+ ...def !== void 0 ? { default: def } : {},
1163
+ ...uniqueCols.has(col.column_name) ? { unique: true } : {}
1164
+ });
1165
+ }
1166
+ const idxResult = await client.query(`
1167
+ SELECT indexname, indexdef
1168
+ FROM pg_indexes
1169
+ WHERE schemaname = 'public' AND tablename = $1
1170
+ `, [tableName]);
1171
+ const indexes = [];
1172
+ for (const idx of idxResult.rows) {
1173
+ const idxName = idx.indexname;
1174
+ const idxDef = idx.indexdef;
1175
+ if (idxDef.includes("PRIMARY KEY") || idxName.endsWith("_pkey")) continue;
1176
+ const unique = idxDef.toUpperCase().includes("UNIQUE");
1177
+ const colMatch = idxDef.match(/\(([^)]+)\)/);
1178
+ const cols = colMatch ? colMatch[1].split(",").map((c) => c.trim().replace(/"/g, "")) : [];
1179
+ indexes.push({ name: idxName, on: cols, unique });
1180
+ }
1181
+ const fkResult = await client.query(`
1182
+ SELECT
1183
+ tc.constraint_name,
1184
+ kcu.column_name,
1185
+ ccu.table_name AS foreign_table_name,
1186
+ ccu.column_name AS foreign_column_name,
1187
+ rc.delete_rule,
1188
+ rc.update_rule
1189
+ FROM information_schema.table_constraints tc
1190
+ JOIN information_schema.key_column_usage kcu
1191
+ ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
1192
+ JOIN information_schema.constraint_column_usage ccu
1193
+ ON tc.constraint_name = ccu.constraint_name AND tc.table_schema = ccu.table_schema
1194
+ JOIN information_schema.referential_constraints rc
1195
+ ON tc.constraint_name = rc.constraint_name AND tc.table_schema = rc.constraint_schema
1196
+ WHERE tc.table_schema = 'public' AND tc.table_name = $1 AND tc.constraint_type = 'FOREIGN KEY'
1197
+ `, [tableName]);
1198
+ const foreignKeys = [];
1199
+ for (const fk of fkResult.rows) {
1200
+ foreignKeys.push({
1201
+ name: fk.constraint_name,
1202
+ on: fk.column_name,
1203
+ references: { table: fk.foreign_table_name, column: fk.foreign_column_name },
1204
+ ...fk.delete_rule && fk.delete_rule !== "NO ACTION" ? { onDelete: this.#parseFkAction(fk.delete_rule) } : {},
1205
+ ...fk.update_rule && fk.update_rule !== "NO ACTION" ? { onUpdate: this.#parseFkAction(fk.update_rule) } : {}
1206
+ });
1207
+ }
1208
+ schemas.push({ name: tableName, pk, fields, indexes, foreignKeys });
1209
+ }
1210
+ return schemas;
1211
+ }
1212
+ #renderColumnDef(f) {
1213
+ const pgType = FIELD_TYPE_TO_PG[f.type] ?? "text";
1214
+ let def = `"${f.name}" ${pgType}`;
1215
+ if (!f.nullable) def += " NOT NULL";
1216
+ if (f.default !== void 0) def += ` DEFAULT ${this.#renderDefault(f.default)}`;
1217
+ if (f.unique) def += " UNIQUE";
1218
+ return def;
1219
+ }
1220
+ #renderDefault(val) {
1221
+ if (val === null) return "NULL";
1222
+ if (typeof val === "string") return `'${val.replace(/'/g, "''")}'`;
1223
+ if (typeof val === "boolean") return val ? "TRUE" : "FALSE";
1224
+ return String(val);
1225
+ }
1226
+ #deriveIndexName(table, cols, unique) {
1227
+ const base = `idx_${table}_${cols.join("_")}`;
1228
+ return unique ? `${base}_unique` : base;
1229
+ }
1230
+ #renderFkAction(action) {
1231
+ const map = { cascade: "CASCADE", restrict: "RESTRICT", setnull: "SET NULL", noaction: "NO ACTION" };
1232
+ return map[action.toLowerCase()] ?? "NO ACTION";
1233
+ }
1234
+ #parseFkAction(rule) {
1235
+ const map = { CASCADE: "cascade", RESTRICT: "restrict", "SET NULL": "setNull" };
1236
+ return map[rule.toUpperCase()] ?? "noAction";
1237
+ }
1238
+ #parseDefault(raw) {
1239
+ if (raw === null || raw === void 0) return void 0;
1240
+ if (raw === "NULL" || raw === "NULL::text") return null;
1241
+ if (raw === "true" || raw === "TRUE") return true;
1242
+ if (raw === "false" || raw === "FALSE") return false;
1243
+ const numMatch = raw.match(/^(-?\d+(?:\.\d+)?)$/);
1244
+ if (numMatch) return Number(numMatch[1]);
1245
+ const strMatch = raw.match(/^'(.*)'(?:::.*)?$/);
1246
+ if (strMatch) return strMatch[1].replace(/''/g, "'");
1247
+ return void 0;
1248
+ }
1249
+ async session(fn) {
1250
+ if (this.#sessionStore.getStore()) return fn();
1251
+ let client;
1252
+ try {
1253
+ client = await this.pool.connect();
1254
+ await client.query("BEGIN");
1255
+ const result = await this.#sessionStore.run(client, fn);
1256
+ await client.query("COMMIT");
1257
+ return result;
1258
+ } catch (error) {
1259
+ if (client) {
1260
+ try {
1261
+ await client.query("ROLLBACK");
1262
+ } catch {
1263
+ }
1264
+ }
1265
+ if (error instanceof EquippedError) throw error;
1266
+ throw new EquippedError("PostgreSQL session failed", { adapter: "postgresql", operation: "session" }, error);
1267
+ } finally {
1268
+ client?.release();
1269
+ }
1270
+ }
1271
+ };
1272
+ if (void 0) {
1273
+ const { describe, test, expect, expectTypeOf, vi, beforeEach, afterEach } = void 0;
1274
+ const testConnectionConfig = {
1275
+ host: "localhost",
1276
+ port: 5432,
1277
+ username: "test",
1278
+ password: "test",
1279
+ database: "testdb",
1280
+ ssl: false
1281
+ };
1282
+ describe("PostgresAdapter: class-via-configurable shape", () => {
1283
+ let onSpy;
1284
+ beforeEach(async () => {
1285
+ const { Instance } = await null;
1286
+ onSpy = vi.spyOn(Instance, "on").mockImplementation(() => {
1287
+ });
1288
+ });
1289
+ afterEach(() => {
1290
+ onSpy.mockRestore();
1291
+ });
1292
+ test("PostgresAdapter.create returns instance with correct capability declarations", () => {
1293
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1294
+ expect(adapter.supportedFieldTypes).toEqual(["string", "number", "boolean", "null", "object", "array", "date"]);
1295
+ expect(adapter.queryableOps).toEqual([
1296
+ "eq",
1297
+ "ne",
1298
+ "gt",
1299
+ "gte",
1300
+ "lt",
1301
+ "lte",
1302
+ "in",
1303
+ "notIn",
1304
+ "like",
1305
+ "exists",
1306
+ "notExists",
1307
+ "contains",
1308
+ "notContains"
1309
+ ]);
1310
+ expect(adapter.updateOps).toEqual(["set", "inc", "mul", "min", "max", "unset", "push", "pull", "patch"]);
1311
+ });
1312
+ test("PostgresAdapter.create validates connection config", () => {
1313
+ expect(() => PostgresAdapter.create({ host: 123, port: "bad" })).toThrow();
1314
+ });
1315
+ test("pool is exposed as a readonly instance field", () => {
1316
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1317
+ expect(adapter.pool).toBeInstanceOf(Pool);
1318
+ });
1319
+ test("schemaConfigPipe is declared as readonly with table-name shape", () => {
1320
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1321
+ expect(adapter.schemaConfigPipe).toBeDefined();
1322
+ });
1323
+ test("auto-wires Instance hooks for connect and disconnect", () => {
1324
+ PostgresAdapter.create(testConnectionConfig);
1325
+ expect(onSpy).toHaveBeenCalledWith("start", expect.any(Function), expect.objectContaining({ class: PostgresAdapter }));
1326
+ expect(onSpy).toHaveBeenCalledWith("close", expect.any(Function), expect.objectContaining({ class: PostgresAdapter }));
1327
+ });
1328
+ test("adapter.use returns OrmUse-shaped object", async () => {
1329
+ const { Schema } = await null;
1330
+ const schema = Schema.from("test").pk("id", v.string(), () => "x").build();
1331
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1332
+ const use = adapter.use(schema, { table: "test" });
1333
+ expect(use.findMany).toBeTypeOf("function");
1334
+ expect(use.iterateMany).toBeTypeOf("function");
1335
+ expect(use.findOne).toBeTypeOf("function");
1336
+ expect(use.count).toBeTypeOf("function");
1337
+ expect(use.createOne).toBeTypeOf("function");
1338
+ expect(use.createMany).toBeTypeOf("function");
1339
+ expect(use.updateMany).toBeTypeOf("function");
1340
+ expect(use.updateOne).toBeTypeOf("function");
1341
+ expect(use.upsertOne).toBeTypeOf("function");
1342
+ expect(use.deleteOne).toBeTypeOf("function");
1343
+ expect(use.deleteMany).toBeTypeOf("function");
1344
+ expect(use.raw).toBeTypeOf("function");
1345
+ });
1346
+ test("type-level: capability declarations use as const", () => {
1347
+ const _adapter = PostgresAdapter.create(testConnectionConfig);
1348
+ expectTypeOf().toEqualTypeOf();
1349
+ expectTypeOf().toEqualTypeOf();
1350
+ expectTypeOf().toEqualTypeOf();
1351
+ });
1352
+ test("type-level: Repo.from with PostgresAdapter enables all builder methods", async () => {
1353
+ const { Repo } = await null;
1354
+ const { Schema } = await null;
1355
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1356
+ const repo = Repo.from(adapter).resolve(() => ({ table: "test" })).build();
1357
+ const _TestSchema = Schema.from("test").pk("id", v.string(), () => "x").build();
1358
+ const _one = repo.on(_TestSchema).one();
1359
+ const _all = repo.on(_TestSchema).all();
1360
+ const _ref = repo.on(_TestSchema);
1361
+ expectTypeOf(_one.create).toBeFunction();
1362
+ expectTypeOf(_one.find).toBeFunction();
1363
+ expectTypeOf(_one.update).toBeFunction();
1364
+ expectTypeOf(_one.delete).toBeFunction();
1365
+ expectTypeOf(_one.upsert).toBeFunction();
1366
+ expectTypeOf(_all.create).toBeFunction();
1367
+ expectTypeOf(_all.find).toBeFunction();
1368
+ expectTypeOf(_all.count).toBeFunction();
1369
+ expectTypeOf(_all.update).toBeFunction();
1370
+ expectTypeOf(_all.delete).toBeFunction();
1371
+ expectTypeOf(_ref.raw).toBeFunction();
1372
+ expectTypeOf(repo.session).toBeFunction();
1373
+ });
1374
+ test("type-level: raw arg-tuple infers (command: string, params?: unknown[]) from PostgresAdapter", async () => {
1375
+ const { Repo } = await null;
1376
+ const { Schema } = await null;
1377
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1378
+ const repo = Repo.from(adapter).resolve(() => ({ table: "test" })).build();
1379
+ const _TestSchema = Schema.from("test").pk("id", v.string(), () => "x").build();
1380
+ const _ref = repo.on(_TestSchema);
1381
+ expectTypeOf(_ref.raw).parameters.toEqualTypeOf();
1382
+ });
1383
+ test("type-level: per-call <T> override narrows PostgresAdapter raw return type", async () => {
1384
+ const { Repo } = await null;
1385
+ const { Schema } = await null;
1386
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1387
+ const repo = Repo.from(adapter).resolve(() => ({ table: "test" })).build();
1388
+ const _TestSchema = Schema.from("test").pk("id", v.string(), () => "x").build();
1389
+ const _ref = repo.on(_TestSchema);
1390
+ expectTypeOf(_ref.raw).returns.toEqualTypeOf();
1391
+ });
1392
+ test("count forwards COUNT query to pool.query and returns a number", async () => {
1393
+ const { Schema } = await null;
1394
+ const { FilterGroup: FilterGroup2 } = await null;
1395
+ const schema = Schema.from("pg_count").pk("id", v.string(), () => "x").field("name", v.string()).build();
1396
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1397
+ let capturedSql;
1398
+ let capturedParams;
1399
+ adapter.pool.query = async (sql, params) => {
1400
+ capturedSql = sql;
1401
+ capturedParams = params;
1402
+ return { rows: [{ count: "4" }] };
1403
+ };
1404
+ const result = await adapter.count(schema, { table: "users" }, FilterGroup2.create().eq("name", "Alice"));
1405
+ expect(capturedSql).toBe('SELECT COUNT(*) as count FROM "users" WHERE "name" = $1');
1406
+ expect(capturedParams).toEqual(["Alice"]);
1407
+ expect(result).toBe(4);
1408
+ });
1409
+ test("raw forwards (command, params) to pool.query at runtime", async () => {
1410
+ const { Schema } = await null;
1411
+ const schema = Schema.from("pg_raw").pk("id", v.string(), () => "x").build();
1412
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1413
+ let capturedCommand;
1414
+ let capturedParams;
1415
+ const mockResult = { rows: [{ id: "1" }], rowCount: 1 };
1416
+ adapter.pool.query = async (cmd, params) => {
1417
+ capturedCommand = cmd;
1418
+ capturedParams = params;
1419
+ return mockResult;
1420
+ };
1421
+ const result = await adapter.use(schema, { table: "users" }).raw("SELECT * FROM users WHERE id = $1", ["abc"]);
1422
+ expect(capturedCommand).toBe("SELECT * FROM users WHERE id = $1");
1423
+ expect(capturedParams).toEqual(["abc"]);
1424
+ expect(result).toBe(mockResult);
1425
+ });
1426
+ test("raw defaults params to [] when omitted", async () => {
1427
+ const { Schema } = await null;
1428
+ const schema = Schema.from("pg_raw2").pk("id", v.string(), () => "x").build();
1429
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1430
+ let capturedParams;
1431
+ adapter.pool.query = async (_cmd, params) => {
1432
+ capturedParams = params;
1433
+ return { rows: [] };
1434
+ };
1435
+ await adapter.use(schema, { table: "users" }).raw("SELECT 1");
1436
+ expect(capturedParams).toEqual([]);
1437
+ });
1438
+ test("iterateMany opens a dedicated cursor client, reads in batchSize chunks, and releases on completion", async () => {
1439
+ const { Schema } = await null;
1440
+ const { FilterGroup: FilterGroup2 } = await null;
1441
+ const { OrderBy } = await null;
1442
+ const schema = Schema.from("pg_iter").pk("id", v.string(), () => "x").field("age", v.number()).build();
1443
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1444
+ let capturedCursor;
1445
+ const release = vi.fn();
1446
+ const cursor = {
1447
+ read: vi.fn().mockResolvedValueOnce([{ id: "u3", age: 40 }]).mockResolvedValueOnce([{ id: "u1", age: 30 }]).mockResolvedValueOnce([]),
1448
+ close: vi.fn().mockResolvedValue(void 0)
1449
+ };
1450
+ const client = {
1451
+ query: vi.fn((query) => {
1452
+ capturedCursor = query;
1453
+ return cursor;
1454
+ }),
1455
+ release
1456
+ };
1457
+ adapter.pool.connect = vi.fn(async () => client);
1458
+ const rows = [];
1459
+ for await (const row of adapter.use(schema, { table: "people" }).iterateMany(FilterGroup2.create().gt("age", 19), {
1460
+ orderBy: [new OrderBy("age", "desc")],
1461
+ offset: 1,
1462
+ limit: 2,
1463
+ batchSize: 1
1464
+ })) {
1465
+ rows.push(row);
1466
+ }
1467
+ expect(adapter.pool.connect).toHaveBeenCalledTimes(1);
1468
+ expect(capturedCursor).toBeInstanceOf(Cursor);
1469
+ const capturedCursorConfig = capturedCursor;
1470
+ expect(capturedCursorConfig.text).toBe('SELECT * FROM "people" WHERE "age" > $1 ORDER BY "age" DESC LIMIT $2 OFFSET $3');
1471
+ expect(capturedCursorConfig.values).toEqual(["19", "2", "1"]);
1472
+ expect(cursor.read).toHaveBeenNthCalledWith(1, 1);
1473
+ expect(cursor.read).toHaveBeenNthCalledWith(2, 1);
1474
+ expect(cursor.read).toHaveBeenNthCalledWith(3, 1);
1475
+ expect(cursor.close).toHaveBeenCalledTimes(1);
1476
+ expect(release).toHaveBeenCalledTimes(1);
1477
+ expect(rows).toEqual([{ id: "u3", age: 40 }, { id: "u1", age: 30 }]);
1478
+ });
1479
+ test("iterateMany closes cursor and releases dedicated client on early break", async () => {
1480
+ const { Schema } = await null;
1481
+ const { FilterGroup: FilterGroup2 } = await null;
1482
+ const schema = Schema.from("pg_iter_break").pk("id", v.string(), () => "x").build();
1483
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1484
+ const release = vi.fn();
1485
+ const cursor = {
1486
+ read: vi.fn().mockResolvedValueOnce([{ id: "u1" }, { id: "u2" }]),
1487
+ close: vi.fn().mockResolvedValue(void 0)
1488
+ };
1489
+ adapter.pool.connect = vi.fn(async () => ({
1490
+ query: vi.fn(() => cursor),
1491
+ release
1492
+ }));
1493
+ const rows = [];
1494
+ for await (const row of adapter.use(schema, { table: "people" }).iterateMany(FilterGroup2.create())) {
1495
+ rows.push(row);
1496
+ break;
1497
+ }
1498
+ expect(rows).toEqual([{ id: "u1" }]);
1499
+ expect(cursor.close).toHaveBeenCalledTimes(1);
1500
+ expect(release).toHaveBeenCalledTimes(1);
1501
+ });
1502
+ test("iterateMany closes cursor and releases dedicated client when the consumer throws", async () => {
1503
+ const { Schema } = await null;
1504
+ const { FilterGroup: FilterGroup2 } = await null;
1505
+ const schema = Schema.from("pg_iter_throw").pk("id", v.string(), () => "x").build();
1506
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1507
+ const release = vi.fn();
1508
+ const cursor = {
1509
+ read: vi.fn().mockResolvedValueOnce([{ id: "u1" }]),
1510
+ close: vi.fn().mockResolvedValue(void 0)
1511
+ };
1512
+ adapter.pool.connect = vi.fn(async () => ({
1513
+ query: vi.fn(() => cursor),
1514
+ release
1515
+ }));
1516
+ const consumerError = new Error("consumer failed");
1517
+ await expect(async () => {
1518
+ for await (const _row of adapter.use(schema, { table: "people" }).iterateMany(FilterGroup2.create())) {
1519
+ throw consumerError;
1520
+ }
1521
+ }).rejects.toThrow(consumerError);
1522
+ expect(cursor.close).toHaveBeenCalledTimes(1);
1523
+ expect(release).toHaveBeenCalledTimes(1);
1524
+ });
1525
+ test("iterateMany inside a session uses the active client and leaves release ownership to session", async () => {
1526
+ const { Schema } = await null;
1527
+ const { FilterGroup: FilterGroup2 } = await null;
1528
+ const schema = Schema.from("pg_iter_session").pk("id", v.string(), () => "x").build();
1529
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1530
+ const events = [];
1531
+ const release = vi.fn(() => events.push("release"));
1532
+ const cursor = {
1533
+ read: vi.fn().mockResolvedValueOnce([{ id: "u1" }]).mockResolvedValueOnce([]),
1534
+ close: vi.fn(async () => events.push("cursor.close"))
1535
+ };
1536
+ const client = {
1537
+ query: vi.fn((query) => {
1538
+ if (typeof query === "string") {
1539
+ events.push(query);
1540
+ return { rows: [] };
1541
+ }
1542
+ events.push("cursor.open");
1543
+ return cursor;
1544
+ }),
1545
+ release
1546
+ };
1547
+ adapter.pool.connect = vi.fn(async () => client);
1548
+ const rows = [];
1549
+ await adapter.session(async () => {
1550
+ for await (const row of adapter.use(schema, { table: "people" }).iterateMany(FilterGroup2.create(), { batchSize: 1 })) {
1551
+ rows.push(row);
1552
+ }
1553
+ events.push("session.body.done");
1554
+ });
1555
+ expect(adapter.pool.connect).toHaveBeenCalledTimes(1);
1556
+ expect(rows).toEqual([{ id: "u1" }]);
1557
+ expect(events).toEqual(["BEGIN", "cursor.open", "cursor.close", "session.body.done", "COMMIT", "release"]);
1558
+ expect(release).toHaveBeenCalledTimes(1);
1559
+ });
1560
+ test("session method is exposed on the adapter", () => {
1561
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1562
+ expect(adapter.session).toBeDefined();
1563
+ expect(adapter.session).toBeTypeOf("function");
1564
+ });
1565
+ test("declares aggregateOps with all six canonical ops", () => {
1566
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1567
+ expect(adapter.aggregateOps).toEqual(["count", "countDistinct", "sum", "avg", "min", "max"]);
1568
+ });
1569
+ test("type-level: aggregateOps is a readonly tuple of all six ops", () => {
1570
+ const _adapter = PostgresAdapter.create(testConnectionConfig);
1571
+ expectTypeOf().toEqualTypeOf();
1572
+ });
1573
+ test("aggregate method forwards spec to pool.query and returns mapped rows", async () => {
1574
+ const { Schema } = await null;
1575
+ const schema = Schema.from("pg_agg").pk("id", v.string(), () => "x").field("amount", v.number()).field("region", v.string()).build();
1576
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1577
+ let capturedSql;
1578
+ let capturedParams;
1579
+ adapter.pool.query = async (sql, params) => {
1580
+ capturedSql = sql;
1581
+ capturedParams = params;
1582
+ return { rows: [{ total: "5" }] };
1583
+ };
1584
+ const result = await adapter.aggregate(schema, { table: "orders" }, {
1585
+ aggregates: [{ fn: "count", alias: "total" }],
1586
+ groupBy: []
1587
+ });
1588
+ expect(capturedSql).toBe('SELECT COUNT(*) AS "total" FROM "orders"');
1589
+ expect(capturedParams).toEqual([]);
1590
+ expect(result).toEqual([{ total: 5 }]);
1591
+ });
1592
+ test("aggregate converts PG bigint/numeric strings to numbers for count/sum/avg", async () => {
1593
+ const { Schema } = await null;
1594
+ const schema = Schema.from("pg_agg_types").pk("id", v.string(), () => "x").field("amount", v.number()).build();
1595
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1596
+ adapter.pool.query = async () => ({
1597
+ rows: [{ cnt: "10", revenue: "250.50", avgAmt: "25.05" }]
1598
+ });
1599
+ const result = await adapter.aggregate(schema, { table: "orders" }, {
1600
+ aggregates: [
1601
+ { fn: "count", alias: "cnt" },
1602
+ { fn: "sum", field: "amount", alias: "revenue" },
1603
+ { fn: "avg", field: "amount", alias: "avgAmt" }
1604
+ ],
1605
+ groupBy: []
1606
+ });
1607
+ expect(result[0].cnt).toBe(10);
1608
+ expect(result[0].revenue).toBe(250.5);
1609
+ expect(result[0].avgAmt).toBe(25.05);
1610
+ });
1611
+ test("aggregate preserves original type for min/max", async () => {
1612
+ const { Schema } = await null;
1613
+ const schema = Schema.from("pg_agg_minmax").pk("id", v.string(), () => "x").field("name", v.string()).build();
1614
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1615
+ adapter.pool.query = async () => ({
1616
+ rows: [{ lowest: "Alice", highest: "Zara" }]
1617
+ });
1618
+ const result = await adapter.aggregate(schema, { table: "users" }, {
1619
+ aggregates: [
1620
+ { fn: "min", field: "name", alias: "lowest" },
1621
+ { fn: "max", field: "name", alias: "highest" }
1622
+ ],
1623
+ groupBy: []
1624
+ });
1625
+ expect(result[0].lowest).toBe("Alice");
1626
+ expect(result[0].highest).toBe("Zara");
1627
+ });
1628
+ test("aggregate includes groupBy fields in result rows", async () => {
1629
+ const { Schema } = await null;
1630
+ const schema = Schema.from("pg_agg_group").pk("id", v.string(), () => "x").field("region", v.string()).build();
1631
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1632
+ adapter.pool.query = async () => ({
1633
+ rows: [
1634
+ { cnt: "3", region: "US" },
1635
+ { cnt: "2", region: "EU" }
1636
+ ]
1637
+ });
1638
+ const result = await adapter.aggregate(schema, { table: "orders" }, {
1639
+ aggregates: [{ fn: "count", alias: "cnt" }],
1640
+ groupBy: ["region"]
1641
+ });
1642
+ expect(result).toEqual([
1643
+ { cnt: 3, region: "US" },
1644
+ { cnt: 2, region: "EU" }
1645
+ ]);
1646
+ });
1647
+ test("type-level: Repo.from with PostgresAdapter enables aggregate method", async () => {
1648
+ const { Repo } = await null;
1649
+ const { Schema } = await null;
1650
+ const adapter = PostgresAdapter.create(testConnectionConfig);
1651
+ const repo = Repo.from(adapter).resolve(() => ({ table: "test" })).build();
1652
+ const _TestSchema = Schema.from("test").pk("id", v.string(), () => "x").build();
1653
+ const _ref = repo.on(_TestSchema);
1654
+ expectTypeOf(_ref.aggregate).toBeFunction();
1655
+ });
1656
+ });
1657
+ describe("PostgresAdapter: migration methods", () => {
1658
+ let onSpy;
1659
+ let adapter;
1660
+ let queries;
1661
+ beforeEach(async () => {
1662
+ const { Instance } = await null;
1663
+ onSpy = vi.spyOn(Instance, "on").mockImplementation(() => {
1664
+ });
1665
+ adapter = PostgresAdapter.create(testConnectionConfig);
1666
+ queries = [];
1667
+ adapter.pool.query = async (sql, params) => {
1668
+ queries.push({ sql, params });
1669
+ return { rows: [] };
1670
+ };
1671
+ });
1672
+ afterEach(() => {
1673
+ onSpy.mockRestore();
1674
+ });
1675
+ test("loadMigrations creates tracker table then selects rows", async () => {
1676
+ ;
1677
+ adapter.pool.query = async (sql, params) => {
1678
+ queries.push({ sql, params });
1679
+ if (sql.includes("SELECT id")) {
1680
+ return { rows: [{ id: "0001", applied_at: "1700000000000" }] };
1681
+ }
1682
+ return { rows: [] };
1683
+ };
1684
+ const result = await adapter.loadMigrations();
1685
+ expect(queries).toHaveLength(2);
1686
+ expect(queries[0].sql).toContain("CREATE TABLE IF NOT EXISTS");
1687
+ expect(queries[0].sql).toContain("equipped_migrations");
1688
+ expect(queries[1].sql).toContain("SELECT id, applied_at");
1689
+ expect(result).toEqual([{ id: "0001", appliedAt: 17e11 }]);
1690
+ });
1691
+ test("recordMigration inserts into tracker table", async () => {
1692
+ await adapter.recordMigration("0001-init", 17e11);
1693
+ expect(queries).toHaveLength(1);
1694
+ expect(queries[0].sql).toContain("INSERT INTO");
1695
+ expect(queries[0].sql).toContain("equipped_migrations");
1696
+ expect(queries[0].params).toEqual(["0001-init", 17e11]);
1697
+ });
1698
+ test("acquireMigrationLock wraps fn with pg_advisory_lock/unlock", async () => {
1699
+ const result = await adapter.acquireMigrationLock(async () => {
1700
+ queries.push({ sql: "USER_FN" });
1701
+ return 42;
1702
+ });
1703
+ expect(result).toBe(42);
1704
+ expect(queries[0].sql).toContain("pg_advisory_lock");
1705
+ expect(queries[1].sql).toBe("USER_FN");
1706
+ expect(queries[2].sql).toContain("pg_advisory_unlock");
1707
+ });
1708
+ test("acquireMigrationLock unlocks even on error", async () => {
1709
+ await expect(adapter.acquireMigrationLock(async () => {
1710
+ throw new Error("boom");
1711
+ })).rejects.toThrow("boom");
1712
+ expect(queries[0].sql).toContain("pg_advisory_lock");
1713
+ expect(queries[1].sql).toContain("pg_advisory_unlock");
1714
+ });
1715
+ test("applyCreateTable generates correct DDL", async () => {
1716
+ await adapter.applyCreateTable({
1717
+ kind: "createTable",
1718
+ name: "users",
1719
+ pk: { name: "id", type: "string" },
1720
+ fields: [
1721
+ { name: "email", type: "string", unique: true },
1722
+ { name: "age", type: "number", nullable: true },
1723
+ { name: "active", type: "boolean", default: true }
1724
+ ]
1725
+ });
1726
+ expect(queries).toHaveLength(1);
1727
+ const sql = queries[0].sql;
1728
+ expect(sql).toContain('CREATE TABLE "users"');
1729
+ expect(sql).toContain('"id" text PRIMARY KEY');
1730
+ expect(sql).toContain('"email" text NOT NULL UNIQUE');
1731
+ expect(sql).toContain('"age" double precision');
1732
+ expect(sql).not.toContain('"age" double precision NOT NULL');
1733
+ expect(sql).toContain('"active" boolean NOT NULL DEFAULT TRUE');
1734
+ });
1735
+ test("applyDropTable generates DROP TABLE", async () => {
1736
+ await adapter.applyDropTable({ kind: "dropTable", name: "users" });
1737
+ expect(queries[0].sql).toBe('DROP TABLE "users"');
1738
+ });
1739
+ test("applyAddField generates ALTER TABLE ADD COLUMN", async () => {
1740
+ await adapter.applyAddField({
1741
+ kind: "addField",
1742
+ table: "users",
1743
+ field: { name: "bio", type: "string", nullable: true, default: "none" }
1744
+ });
1745
+ expect(queries[0].sql).toContain('ALTER TABLE "users" ADD COLUMN');
1746
+ expect(queries[0].sql).toContain('"bio" text');
1747
+ expect(queries[0].sql).not.toContain("NOT NULL");
1748
+ expect(queries[0].sql).toContain("DEFAULT 'none'");
1749
+ });
1750
+ test("applyDropField generates ALTER TABLE DROP COLUMN", async () => {
1751
+ await adapter.applyDropField({ kind: "dropField", table: "users", name: "bio" });
1752
+ expect(queries[0].sql).toBe('ALTER TABLE "users" DROP COLUMN "bio"');
1753
+ });
1754
+ test("applyModifyField generates ALTER COLUMN statements for type, nullable, default", async () => {
1755
+ await adapter.applyModifyField({
1756
+ kind: "modifyField",
1757
+ table: "users",
1758
+ name: "age",
1759
+ to: { name: "age", type: "string", nullable: true, default: null }
1760
+ });
1761
+ expect(queries[0].sql).toContain('ALTER COLUMN "age" TYPE text');
1762
+ expect(queries[1].sql).toContain("DROP NOT NULL");
1763
+ expect(queries[2].sql).toContain("SET DEFAULT NULL");
1764
+ });
1765
+ test("applyModifyField renames column when to.name differs", async () => {
1766
+ await adapter.applyModifyField({
1767
+ kind: "modifyField",
1768
+ table: "users",
1769
+ name: "age",
1770
+ to: { name: "years", type: "number" }
1771
+ });
1772
+ const renameSql = queries.find((q) => q.sql.includes("RENAME COLUMN"));
1773
+ expect(renameSql).toBeDefined();
1774
+ expect(renameSql.sql).toContain('RENAME COLUMN "age" TO "years"');
1775
+ });
1776
+ test("applyRenameTable generates ALTER TABLE RENAME", async () => {
1777
+ await adapter.applyRenameTable({ kind: "renameTable", from: "users", to: "accounts" });
1778
+ expect(queries[0].sql).toBe('ALTER TABLE "users" RENAME TO "accounts"');
1779
+ });
1780
+ test("applyRenameField generates ALTER TABLE RENAME COLUMN", async () => {
1781
+ await adapter.applyRenameField({ kind: "renameField", table: "users", from: "name", to: "fullName" });
1782
+ expect(queries[0].sql).toBe('ALTER TABLE "users" RENAME COLUMN "name" TO "fullName"');
1783
+ });
1784
+ test("applyAddIndex generates CREATE INDEX with auto-derived name", async () => {
1785
+ await adapter.applyAddIndex({ kind: "addIndex", table: "users", on: ["email"] });
1786
+ expect(queries[0].sql).toBe('CREATE INDEX "idx_users_email" ON "users" ("email")');
1787
+ });
1788
+ test("applyAddIndex generates CREATE UNIQUE INDEX with explicit name", async () => {
1789
+ await adapter.applyAddIndex({ kind: "addIndex", table: "users", on: ["email"], unique: true, name: "my_idx" });
1790
+ expect(queries[0].sql).toBe('CREATE UNIQUE INDEX "my_idx" ON "users" ("email")');
1791
+ });
1792
+ test("applyAddIndex auto-derives unique suffix when unique and no name", async () => {
1793
+ await adapter.applyAddIndex({ kind: "addIndex", table: "posts", on: ["author", "title"], unique: true });
1794
+ expect(queries[0].sql).toBe('CREATE UNIQUE INDEX "idx_posts_author_title_unique" ON "posts" ("author", "title")');
1795
+ });
1796
+ test("applyDropIndex generates DROP INDEX", async () => {
1797
+ await adapter.applyDropIndex({ kind: "dropIndex", name: "idx_users_email" });
1798
+ expect(queries[0].sql).toBe('DROP INDEX "idx_users_email"');
1799
+ });
1800
+ test("applyAddForeignKey generates ALTER TABLE ADD CONSTRAINT with auto-derived name", async () => {
1801
+ await adapter.applyAddForeignKey({
1802
+ kind: "addForeignKey",
1803
+ table: "posts",
1804
+ on: "authorId",
1805
+ references: { table: "users", column: "id" },
1806
+ onDelete: "cascade",
1807
+ onUpdate: "setNull"
1808
+ });
1809
+ const sql = queries[0].sql;
1810
+ expect(sql).toContain('ALTER TABLE "posts" ADD CONSTRAINT "fk_posts_authorId"');
1811
+ expect(sql).toContain('FOREIGN KEY ("authorId") REFERENCES "users" ("id")');
1812
+ expect(sql).toContain("ON DELETE CASCADE");
1813
+ expect(sql).toContain("ON UPDATE SET NULL");
1814
+ });
1815
+ test("applyAddForeignKey uses explicit name when provided", async () => {
1816
+ await adapter.applyAddForeignKey({
1817
+ kind: "addForeignKey",
1818
+ table: "posts",
1819
+ on: "authorId",
1820
+ references: { table: "users", column: "id" },
1821
+ name: "custom_fk"
1822
+ });
1823
+ expect(queries[0].sql).toContain('ADD CONSTRAINT "custom_fk"');
1824
+ });
1825
+ test("applyDropForeignKey generates ALTER TABLE DROP CONSTRAINT", async () => {
1826
+ await adapter.applyDropForeignKey({ kind: "dropForeignKey", table: "posts", name: "fk_posts_authorId" });
1827
+ expect(queries[0].sql).toBe('ALTER TABLE "posts" DROP CONSTRAINT "fk_posts_authorId"');
1828
+ });
1829
+ test("introspect queries information_schema and builds DiscoveredSchema[]", async () => {
1830
+ ;
1831
+ adapter.pool.query = async (sql, params) => {
1832
+ queries.push({ sql, params });
1833
+ if (sql.includes("information_schema.tables")) {
1834
+ return { rows: [{ table_name: "users" }] };
1835
+ }
1836
+ if (sql.includes("information_schema.columns")) {
1837
+ return {
1838
+ rows: [
1839
+ { column_name: "id", data_type: "text", is_nullable: "NO", column_default: null },
1840
+ { column_name: "email", data_type: "character varying", is_nullable: "NO", column_default: null },
1841
+ { column_name: "age", data_type: "integer", is_nullable: "YES", column_default: "25" }
1842
+ ]
1843
+ };
1844
+ }
1845
+ if (sql.includes("PRIMARY KEY")) {
1846
+ return { rows: [{ column_name: "id" }] };
1847
+ }
1848
+ if (sql.includes("constraint_type = 'UNIQUE'")) {
1849
+ return { rows: [{ column_name: "email" }] };
1850
+ }
1851
+ if (sql.includes("pg_indexes")) {
1852
+ return { rows: [{ indexname: "users_email_idx", indexdef: "CREATE UNIQUE INDEX users_email_idx ON public.users USING btree (email)" }] };
1853
+ }
1854
+ if (sql.includes("constraint_type = 'FOREIGN KEY'")) {
1855
+ return { rows: [] };
1856
+ }
1857
+ return { rows: [] };
1858
+ };
1859
+ const schemas = await adapter.introspect();
1860
+ expect(schemas).toHaveLength(1);
1861
+ const s = schemas[0];
1862
+ expect(s.name).toBe("users");
1863
+ expect(s.pk).toEqual({ name: "id", type: "string" });
1864
+ expect(s.fields).toEqual([
1865
+ { name: "email", type: "string", nullable: false, unique: true },
1866
+ { name: "age", type: "number", nullable: true, default: 25 }
1867
+ ]);
1868
+ expect(s.indexes).toEqual([{ name: "users_email_idx", on: ["email"], unique: true }]);
1869
+ expect(s.foreignKeys).toEqual([]);
1870
+ });
1871
+ test("introspect throws OrmIntrospectionError on unsupported PG type", async () => {
1872
+ const { OrmIntrospectionError } = await null;
1873
+ adapter.pool.query = async (sql) => {
1874
+ if (sql.includes("information_schema.tables")) {
1875
+ return { rows: [{ table_name: "files" }] };
1876
+ }
1877
+ if (sql.includes("information_schema.columns")) {
1878
+ return {
1879
+ rows: [
1880
+ { column_name: "id", data_type: "text", is_nullable: "NO", column_default: null },
1881
+ { column_name: "data", data_type: "bytea", is_nullable: "YES", column_default: null }
1882
+ ]
1883
+ };
1884
+ }
1885
+ if (sql.includes("PRIMARY KEY")) {
1886
+ return { rows: [{ column_name: "id" }] };
1887
+ }
1888
+ if (sql.includes("constraint_type = 'UNIQUE'")) {
1889
+ return { rows: [] };
1890
+ }
1891
+ return { rows: [] };
1892
+ };
1893
+ await expect(adapter.introspect()).rejects.toThrow(OrmIntrospectionError);
1894
+ try {
1895
+ await adapter.introspect();
1896
+ } catch (err) {
1897
+ expect(err.adapter).toBe("postgresql");
1898
+ expect(err.table).toBe("files");
1899
+ expect(err.cause).toContain("bytea");
1900
+ }
1901
+ });
1902
+ test("introspect parses foreign keys with cascade actions", async () => {
1903
+ ;
1904
+ adapter.pool.query = async (sql) => {
1905
+ if (sql.includes("information_schema.tables")) {
1906
+ return { rows: [{ table_name: "posts" }] };
1907
+ }
1908
+ if (sql.includes("information_schema.columns")) {
1909
+ return {
1910
+ rows: [
1911
+ { column_name: "id", data_type: "text", is_nullable: "NO", column_default: null },
1912
+ { column_name: "author_id", data_type: "text", is_nullable: "NO", column_default: null }
1913
+ ]
1914
+ };
1915
+ }
1916
+ if (sql.includes("PRIMARY KEY")) {
1917
+ return { rows: [{ column_name: "id" }] };
1918
+ }
1919
+ if (sql.includes("constraint_type = 'UNIQUE'")) {
1920
+ return { rows: [] };
1921
+ }
1922
+ if (sql.includes("pg_indexes")) {
1923
+ return { rows: [] };
1924
+ }
1925
+ if (sql.includes("constraint_type = 'FOREIGN KEY'")) {
1926
+ return {
1927
+ rows: [{
1928
+ constraint_name: "fk_posts_author_id",
1929
+ column_name: "author_id",
1930
+ foreign_table_name: "users",
1931
+ foreign_column_name: "id",
1932
+ delete_rule: "CASCADE",
1933
+ update_rule: "SET NULL"
1934
+ }]
1935
+ };
1936
+ }
1937
+ return { rows: [] };
1938
+ };
1939
+ const schemas = await adapter.introspect();
1940
+ expect(schemas[0].foreignKeys).toEqual([{
1941
+ name: "fk_posts_author_id",
1942
+ on: "author_id",
1943
+ references: { table: "users", column: "id" },
1944
+ onDelete: "cascade",
1945
+ onUpdate: "setNull"
1946
+ }]);
1947
+ });
1948
+ test("introspect excludes tracker table from results", async () => {
1949
+ ;
1950
+ adapter.pool.query = async (sql, params) => {
1951
+ if (sql.includes("information_schema.tables")) {
1952
+ expect(params).toContain("equipped_migrations");
1953
+ return { rows: [] };
1954
+ }
1955
+ return { rows: [] };
1956
+ };
1957
+ const schemas = await adapter.introspect();
1958
+ expect(schemas).toEqual([]);
1959
+ });
1960
+ test("type-level: PostgresAdapter declares all migration methods", () => {
1961
+ expectTypeOf(adapter.loadMigrations).toBeFunction();
1962
+ expectTypeOf(adapter.recordMigration).toBeFunction();
1963
+ expectTypeOf(adapter.acquireMigrationLock).toBeFunction();
1964
+ expectTypeOf(adapter.applyCreateTable).toBeFunction();
1965
+ expectTypeOf(adapter.applyDropTable).toBeFunction();
1966
+ expectTypeOf(adapter.applyAddField).toBeFunction();
1967
+ expectTypeOf(adapter.applyDropField).toBeFunction();
1968
+ expectTypeOf(adapter.applyModifyField).toBeFunction();
1969
+ expectTypeOf(adapter.applyRenameTable).toBeFunction();
1970
+ expectTypeOf(adapter.applyRenameField).toBeFunction();
1971
+ expectTypeOf(adapter.applyAddIndex).toBeFunction();
1972
+ expectTypeOf(adapter.applyDropIndex).toBeFunction();
1973
+ expectTypeOf(adapter.applyAddForeignKey).toBeFunction();
1974
+ expectTypeOf(adapter.applyDropForeignKey).toBeFunction();
1975
+ expectTypeOf(adapter.introspect).toBeFunction();
1976
+ });
1977
+ test("type-level: Migrator.from rejects withoutLock for PostgresAdapter", async () => {
1978
+ const { Repo } = await null;
1979
+ const { Migrator } = await null;
1980
+ const repo = Repo.from(adapter).resolve(() => ({ table: "test" })).build();
1981
+ const step = Migrator.from(repo, adapter).migrations([]);
1982
+ expectTypeOf(step).toHaveProperty("build");
1983
+ expectTypeOf(step).not.toHaveProperty("withoutLock");
1984
+ });
1985
+ test("applyCreateTable maps all field types to correct PG types", async () => {
1986
+ await adapter.applyCreateTable({
1987
+ kind: "createTable",
1988
+ name: "all_types",
1989
+ pk: { name: "id", type: "string" },
1990
+ fields: [
1991
+ { name: "f_num", type: "number" },
1992
+ { name: "f_bool", type: "boolean" },
1993
+ { name: "f_date", type: "date" },
1994
+ { name: "f_null", type: "null" },
1995
+ { name: "f_obj", type: "object" },
1996
+ { name: "f_arr", type: "array" }
1997
+ ]
1998
+ });
1999
+ const sql = queries[0].sql;
2000
+ expect(sql).toContain('"f_num" double precision NOT NULL');
2001
+ expect(sql).toContain('"f_bool" boolean NOT NULL');
2002
+ expect(sql).toContain('"f_date" timestamptz NOT NULL');
2003
+ expect(sql).toContain('"f_null" text NOT NULL');
2004
+ expect(sql).toContain('"f_obj" jsonb NOT NULL');
2005
+ expect(sql).toContain('"f_arr" jsonb NOT NULL');
2006
+ });
2007
+ test("applyModifyField sets NOT NULL when nullable is falsy", async () => {
2008
+ await adapter.applyModifyField({
2009
+ kind: "modifyField",
2010
+ table: "users",
2011
+ name: "email",
2012
+ to: { name: "email", type: "string" }
2013
+ });
2014
+ expect(queries[1].sql).toContain("SET NOT NULL");
2015
+ });
2016
+ test("applyModifyField drops default when to.default is undefined", async () => {
2017
+ await adapter.applyModifyField({
2018
+ kind: "modifyField",
2019
+ table: "users",
2020
+ name: "age",
2021
+ to: { name: "age", type: "number" }
2022
+ });
2023
+ expect(queries[2].sql).toContain("DROP DEFAULT");
2024
+ });
2025
+ test("applyAddField with string default escapes single quotes", async () => {
2026
+ await adapter.applyAddField({
2027
+ kind: "addField",
2028
+ table: "users",
2029
+ field: { name: "bio", type: "string", default: "it's" }
2030
+ });
2031
+ expect(queries[0].sql).toContain("DEFAULT 'it''s'");
2032
+ });
2033
+ test("end-to-end: Migrator.from(repo, adapter) wires up correctly", async () => {
2034
+ const { Repo } = await null;
2035
+ const { Migrator } = await null;
2036
+ const { Schema } = await null;
2037
+ Schema.from("users").pk("id", v.string(), () => "x").field("email", v.string()).build();
2038
+ const repo = Repo.from(adapter).resolve(() => ({ table: "test" })).build();
2039
+ let loadCalls = 0;
2040
+ const mockClient = {
2041
+ query: async (sql, _params) => {
2042
+ if (sql.includes("pg_advisory_lock") || sql.includes("pg_advisory_unlock")) return { rows: [] };
2043
+ if (sql.includes("CREATE TABLE IF NOT EXISTS")) return { rows: [] };
2044
+ if (sql.includes("SELECT id, applied_at")) {
2045
+ loadCalls++;
2046
+ return { rows: [] };
2047
+ }
2048
+ if (sql.includes("INSERT INTO")) return { rows: [] };
2049
+ if (sql.includes("CREATE TABLE")) return { rows: [] };
2050
+ if (sql === "BEGIN" || sql === "COMMIT" || sql === "ROLLBACK") return { rows: [] };
2051
+ return { rows: [] };
2052
+ },
2053
+ release: () => {
2054
+ }
2055
+ };
2056
+ adapter.pool.query = mockClient.query;
2057
+ adapter.pool.connect = async () => mockClient;
2058
+ const migrator = Migrator.from(repo, adapter).migrations([
2059
+ { id: "0001", changes: [{ kind: "createTable", name: "users", pk: { name: "id", type: "string" }, fields: [{ name: "email", type: "string" }] }] }
2060
+ ]).build();
2061
+ const result = await migrator.up();
2062
+ expect(result.ran).toEqual(["0001"]);
2063
+ expect(loadCalls).toBe(1);
2064
+ });
2065
+ });
2066
+ }
2067
+ export {
2068
+ PostgresAdapter
2069
+ };