@ductape/sdk 0.0.4-v5 → 0.0.4-v51

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 (338) hide show
  1. package/README.md +1 -1
  2. package/dist/api/services/appApi.service.d.ts +48 -2
  3. package/dist/api/services/appApi.service.js +101 -2
  4. package/dist/api/services/appApi.service.js.map +1 -1
  5. package/dist/api/services/pricingApi.service.d.ts +10 -0
  6. package/dist/api/services/pricingApi.service.js +34 -0
  7. package/dist/api/services/pricingApi.service.js.map +1 -0
  8. package/dist/api/services/processorApi.service.d.ts +12 -2
  9. package/dist/api/services/processorApi.service.js +12 -2
  10. package/dist/api/services/processorApi.service.js.map +1 -1
  11. package/dist/api/services/productsApi.service.d.ts +40 -1
  12. package/dist/api/services/productsApi.service.js +105 -1
  13. package/dist/api/services/productsApi.service.js.map +1 -1
  14. package/dist/api/services/userApi.service.js +1 -0
  15. package/dist/api/services/userApi.service.js.map +1 -1
  16. package/dist/api/services/workspaceApi.service.js +1 -0
  17. package/dist/api/services/workspaceApi.service.js.map +1 -1
  18. package/dist/api/services/workspaceSecretsApi.service.d.ts +75 -0
  19. package/dist/api/services/workspaceSecretsApi.service.js +62 -0
  20. package/dist/api/services/workspaceSecretsApi.service.js.map +1 -0
  21. package/dist/api/urls.d.ts +6 -1
  22. package/dist/api/urls.js +12 -2
  23. package/dist/api/urls.js.map +1 -1
  24. package/dist/api/utils/cache.utils.d.ts +1 -1
  25. package/dist/api/utils/cache.utils.js +10 -4
  26. package/dist/api/utils/cache.utils.js.map +1 -1
  27. package/dist/api/utils/strings.utils.d.ts +2 -0
  28. package/dist/api/utils/strings.utils.js +14 -0
  29. package/dist/api/utils/strings.utils.js.map +1 -1
  30. package/dist/apps/services/app.service.d.ts +51 -33
  31. package/dist/apps/services/app.service.js +488 -244
  32. package/dist/apps/services/app.service.js.map +1 -1
  33. package/dist/apps/validators/joi-validators/create.appAction.validator.d.ts +1 -2
  34. package/dist/apps/validators/joi-validators/create.appAction.validator.js +21 -2
  35. package/dist/apps/validators/joi-validators/create.appAction.validator.js.map +1 -1
  36. package/dist/apps/validators/joi-validators/create.appWebhook.validator.d.ts +1 -2
  37. package/dist/apps/validators/joi-validators/create.appWebhook.validator.js +2 -15
  38. package/dist/apps/validators/joi-validators/create.appWebhook.validator.js.map +1 -1
  39. package/dist/apps/validators/joi-validators/update.appAction.validator.js +11 -1
  40. package/dist/apps/validators/joi-validators/update.appAction.validator.js.map +1 -1
  41. package/dist/apps/validators/joi-validators/update.appActionResponse.validator.d.ts +1 -1
  42. package/dist/apps/validators/joi-validators/update.appActionResponse.validator.js +34 -1
  43. package/dist/apps/validators/joi-validators/update.appActionResponse.validator.js.map +1 -1
  44. package/dist/apps/validators/joi-validators/update.appWebhook.validator.d.ts +1 -2
  45. package/dist/apps/validators/joi-validators/update.appWebhook.validator.js +2 -14
  46. package/dist/apps/validators/joi-validators/update.appWebhook.validator.js.map +1 -1
  47. package/dist/clients/pricing.client.d.ts +3 -0
  48. package/dist/clients/pricing.client.js +33 -0
  49. package/dist/clients/pricing.client.js.map +1 -0
  50. package/dist/database/adapters/base.adapter.d.ts +176 -0
  51. package/dist/database/adapters/base.adapter.js +31 -0
  52. package/dist/database/adapters/base.adapter.js.map +1 -0
  53. package/dist/database/adapters/dynamodb.adapter.d.ts +91 -0
  54. package/dist/database/adapters/dynamodb.adapter.js +1608 -0
  55. package/dist/database/adapters/dynamodb.adapter.js.map +1 -0
  56. package/dist/database/adapters/mongodb.adapter.d.ts +71 -0
  57. package/dist/database/adapters/mongodb.adapter.js +1072 -0
  58. package/dist/database/adapters/mongodb.adapter.js.map +1 -0
  59. package/dist/database/adapters/mysql.adapter.d.ts +146 -0
  60. package/dist/database/adapters/mysql.adapter.js +1492 -0
  61. package/dist/database/adapters/mysql.adapter.js.map +1 -0
  62. package/dist/database/adapters/postgresql.adapter.d.ts +147 -0
  63. package/dist/database/adapters/postgresql.adapter.js +1603 -0
  64. package/dist/database/adapters/postgresql.adapter.js.map +1 -0
  65. package/dist/database/database.service.d.ts +232 -0
  66. package/dist/database/database.service.js +802 -0
  67. package/dist/database/database.service.js.map +1 -0
  68. package/dist/database/index.d.ts +18 -0
  69. package/dist/database/index.js +98 -0
  70. package/dist/database/index.js.map +1 -0
  71. package/dist/database/types/aggregation.types.d.ts +261 -0
  72. package/dist/database/types/aggregation.types.js +21 -0
  73. package/dist/database/types/aggregation.types.js.map +1 -0
  74. package/dist/database/types/connection.types.d.ts +132 -0
  75. package/dist/database/types/connection.types.js +6 -0
  76. package/dist/database/types/connection.types.js.map +1 -0
  77. package/dist/database/types/database.types.d.ts +175 -0
  78. package/dist/database/types/database.types.js +75 -0
  79. package/dist/database/types/database.types.js.map +1 -0
  80. package/dist/database/types/index.d.ts +12 -0
  81. package/dist/database/types/index.js +37 -0
  82. package/dist/database/types/index.js.map +1 -0
  83. package/dist/database/types/index.types.d.ts +220 -0
  84. package/dist/database/types/index.types.js +27 -0
  85. package/dist/database/types/index.types.js.map +1 -0
  86. package/dist/database/types/migration.types.d.ts +205 -0
  87. package/dist/database/types/migration.types.js +44 -0
  88. package/dist/database/types/migration.types.js.map +1 -0
  89. package/dist/database/types/query.types.d.ts +305 -0
  90. package/dist/database/types/query.types.js +57 -0
  91. package/dist/database/types/query.types.js.map +1 -0
  92. package/dist/database/types/result.types.d.ts +220 -0
  93. package/dist/database/types/result.types.js +6 -0
  94. package/dist/database/types/result.types.js.map +1 -0
  95. package/dist/database/types/schema.types.d.ts +190 -0
  96. package/dist/database/types/schema.types.js +69 -0
  97. package/dist/database/types/schema.types.js.map +1 -0
  98. package/dist/database/utils/helpers.d.ts +66 -0
  99. package/dist/database/utils/helpers.js +501 -0
  100. package/dist/database/utils/helpers.js.map +1 -0
  101. package/dist/database/utils/migration.utils.d.ts +151 -0
  102. package/dist/database/utils/migration.utils.js +476 -0
  103. package/dist/database/utils/migration.utils.js.map +1 -0
  104. package/dist/database/utils/transaction.d.ts +64 -0
  105. package/dist/database/utils/transaction.js +130 -0
  106. package/dist/database/utils/transaction.js.map +1 -0
  107. package/dist/database/validators/connection.validator.d.ts +20 -0
  108. package/dist/database/validators/connection.validator.js +267 -0
  109. package/dist/database/validators/connection.validator.js.map +1 -0
  110. package/dist/database/validators/query.validator.d.ts +31 -0
  111. package/dist/database/validators/query.validator.js +305 -0
  112. package/dist/database/validators/query.validator.js.map +1 -0
  113. package/dist/database/validators/schema.validator.d.ts +31 -0
  114. package/dist/database/validators/schema.validator.js +334 -0
  115. package/dist/database/validators/schema.validator.js.map +1 -0
  116. package/dist/graph/adapters/arangodb.adapter.d.ts +80 -0
  117. package/dist/graph/adapters/arangodb.adapter.js +1393 -0
  118. package/dist/graph/adapters/arangodb.adapter.js.map +1 -0
  119. package/dist/graph/adapters/base.adapter.d.ts +228 -0
  120. package/dist/graph/adapters/base.adapter.js +38 -0
  121. package/dist/graph/adapters/base.adapter.js.map +1 -0
  122. package/dist/graph/adapters/index.d.ts +10 -0
  123. package/dist/graph/adapters/index.js +23 -0
  124. package/dist/graph/adapters/index.js.map +1 -0
  125. package/dist/graph/adapters/memgraph.adapter.d.ts +85 -0
  126. package/dist/graph/adapters/memgraph.adapter.js +1491 -0
  127. package/dist/graph/adapters/memgraph.adapter.js.map +1 -0
  128. package/dist/graph/adapters/neo4j.adapter.d.ts +88 -0
  129. package/dist/graph/adapters/neo4j.adapter.js +1861 -0
  130. package/dist/graph/adapters/neo4j.adapter.js.map +1 -0
  131. package/dist/graph/adapters/neptune.adapter.d.ts +87 -0
  132. package/dist/graph/adapters/neptune.adapter.js +1430 -0
  133. package/dist/graph/adapters/neptune.adapter.js.map +1 -0
  134. package/dist/graph/graph.service.d.ts +278 -0
  135. package/dist/graph/graph.service.js +687 -0
  136. package/dist/graph/graph.service.js.map +1 -0
  137. package/dist/graph/index.d.ts +11 -0
  138. package/dist/graph/index.js +42 -0
  139. package/dist/graph/index.js.map +1 -0
  140. package/dist/graph/types/connection.types.d.ts +158 -0
  141. package/dist/graph/types/connection.types.js +43 -0
  142. package/dist/graph/types/connection.types.js.map +1 -0
  143. package/dist/graph/types/graph.types.d.ts +144 -0
  144. package/dist/graph/types/graph.types.js +84 -0
  145. package/dist/graph/types/graph.types.js.map +1 -0
  146. package/dist/graph/types/index.d.ts +11 -0
  147. package/dist/graph/types/index.js +35 -0
  148. package/dist/graph/types/index.js.map +1 -0
  149. package/dist/graph/types/node.types.d.ts +193 -0
  150. package/dist/graph/types/node.types.js +49 -0
  151. package/dist/graph/types/node.types.js.map +1 -0
  152. package/dist/graph/types/path.types.d.ts +224 -0
  153. package/dist/graph/types/path.types.js +38 -0
  154. package/dist/graph/types/path.types.js.map +1 -0
  155. package/dist/graph/types/query.types.d.ts +247 -0
  156. package/dist/graph/types/query.types.js +23 -0
  157. package/dist/graph/types/query.types.js.map +1 -0
  158. package/dist/graph/types/relationship.types.d.ts +224 -0
  159. package/dist/graph/types/relationship.types.js +35 -0
  160. package/dist/graph/types/relationship.types.js.map +1 -0
  161. package/dist/graph/types/result.types.d.ts +237 -0
  162. package/dist/graph/types/result.types.js +7 -0
  163. package/dist/graph/types/result.types.js.map +1 -0
  164. package/dist/graph/validators/index.d.ts +81 -0
  165. package/dist/graph/validators/index.js +243 -0
  166. package/dist/graph/validators/index.js.map +1 -0
  167. package/dist/imports/imports.service.d.ts +3 -3
  168. package/dist/imports/imports.service.js +7 -7
  169. package/dist/imports/imports.service.js.map +1 -1
  170. package/dist/imports/imports.types.d.ts +8 -0
  171. package/dist/imports/repos/postmanV21.repo.d.ts +1 -1
  172. package/dist/imports/repos/postmanV21.repo.js +29 -2
  173. package/dist/imports/repos/postmanV21.repo.js.map +1 -1
  174. package/dist/index.d.ts +1244 -150
  175. package/dist/index.js +1309 -209
  176. package/dist/index.js.map +1 -1
  177. package/dist/inputs/inputs.service.js +2 -2
  178. package/dist/inputs/inputs.service.js.map +1 -1
  179. package/dist/inputs/utils/inputs.utils.create.js +1 -1
  180. package/dist/inputs/utils/inputs.utils.create.js.map +1 -1
  181. package/dist/logs/logs.types.d.ts +5 -0
  182. package/dist/logs/logs.types.js +1 -0
  183. package/dist/logs/logs.types.js.map +1 -1
  184. package/dist/parsers/index.d.ts +3 -0
  185. package/dist/parsers/index.js +27 -0
  186. package/dist/parsers/index.js.map +1 -0
  187. package/dist/parsers/pipelines/postman.pipelines.d.ts +15 -0
  188. package/dist/parsers/pipelines/postman.pipelines.js +103 -0
  189. package/dist/parsers/pipelines/postman.pipelines.js.map +1 -0
  190. package/dist/parsers/types/postman.types.d.ts +200 -0
  191. package/dist/parsers/types/postman.types.js +3 -0
  192. package/dist/parsers/types/postman.types.js.map +1 -0
  193. package/dist/parsers/utils/postman.utils.d.ts +12 -0
  194. package/dist/parsers/utils/postman.utils.js +116 -0
  195. package/dist/parsers/utils/postman.utils.js.map +1 -0
  196. package/dist/parsers/validators/postman-auth.validators.d.ts +10 -0
  197. package/dist/parsers/validators/postman-auth.validators.js +127 -0
  198. package/dist/parsers/validators/postman-auth.validators.js.map +1 -0
  199. package/dist/parsers/validators/postman-request.validators.d.ts +13 -0
  200. package/dist/parsers/validators/postman-request.validators.js +139 -0
  201. package/dist/parsers/validators/postman-request.validators.js.map +1 -0
  202. package/dist/parsers/validators/postman-response.validators.d.ts +13 -0
  203. package/dist/parsers/validators/postman-response.validators.js +150 -0
  204. package/dist/parsers/validators/postman-response.validators.js.map +1 -0
  205. package/dist/parsers/validators/postman-variable.validators.d.ts +14 -0
  206. package/dist/parsers/validators/postman-variable.validators.js +163 -0
  207. package/dist/parsers/validators/postman-variable.validators.js.map +1 -0
  208. package/dist/pricing/pricing.repo.d.ts +0 -0
  209. package/dist/pricing/pricing.repo.js +1 -0
  210. package/dist/pricing/pricing.repo.js.map +1 -0
  211. package/dist/pricing/pricing.service.d.ts +24 -0
  212. package/dist/pricing/pricing.service.js +51 -0
  213. package/dist/pricing/pricing.service.js.map +1 -0
  214. package/dist/pricing/pricing.types.d.ts +76 -0
  215. package/dist/pricing/pricing.types.js +21 -0
  216. package/dist/pricing/pricing.types.js.map +1 -0
  217. package/dist/pricing/utils/string.utils.d.ts +1 -0
  218. package/dist/pricing/utils/string.utils.js +9 -0
  219. package/dist/pricing/utils/string.utils.js.map +1 -0
  220. package/dist/processor/repos/sms.repo.d.ts +4 -4
  221. package/dist/processor/repos/sms.repo.js +23 -10
  222. package/dist/processor/repos/sms.repo.js.map +1 -1
  223. package/dist/processor/services/messagebrokers/kafka.service.js +0 -2
  224. package/dist/processor/services/messagebrokers/kafka.service.js.map +1 -1
  225. package/dist/processor/services/messagebrokers/rabbitmq.service.d.ts +9 -1
  226. package/dist/processor/services/messagebrokers/rabbitmq.service.js +40 -11
  227. package/dist/processor/services/messagebrokers/rabbitmq.service.js.map +1 -1
  228. package/dist/processor/services/processor.service.d.ts +38 -10
  229. package/dist/processor/services/processor.service.js +533 -248
  230. package/dist/processor/services/processor.service.js.map +1 -1
  231. package/dist/processor/services/request.service.d.ts +36 -0
  232. package/dist/processor/services/request.service.js +304 -0
  233. package/dist/processor/services/request.service.js.map +1 -0
  234. package/dist/processor/types/request.types.d.ts +14 -0
  235. package/dist/processor/types/request.types.js +3 -0
  236. package/dist/processor/types/request.types.js.map +1 -0
  237. package/dist/processor/utils/processor.utils.d.ts +3 -0
  238. package/dist/processor/utils/processor.utils.js +84 -22
  239. package/dist/processor/utils/processor.utils.js.map +1 -1
  240. package/dist/processor/utils/request.utils.d.ts +20 -0
  241. package/dist/processor/utils/request.utils.js +113 -0
  242. package/dist/processor/utils/request.utils.js.map +1 -0
  243. package/dist/products/services/products.service.d.ts +114 -77
  244. package/dist/products/services/products.service.js +805 -362
  245. package/dist/products/services/products.service.js.map +1 -1
  246. package/dist/products/services/utils/crypt.utils.d.ts +1 -0
  247. package/dist/products/services/utils/crypt.utils.js +17 -0
  248. package/dist/products/services/utils/crypt.utils.js.map +1 -0
  249. package/dist/products/services/utils/functions.utils.d.ts +13 -0
  250. package/dist/products/services/utils/functions.utils.js +289 -0
  251. package/dist/products/services/utils/functions.utils.js.map +1 -0
  252. package/dist/products/services/utils/objects.utils.d.ts +13 -0
  253. package/dist/products/services/utils/objects.utils.js +89 -0
  254. package/dist/products/services/utils/objects.utils.js.map +1 -0
  255. package/dist/products/services/utils/string.utils.d.ts +12 -0
  256. package/dist/products/services/utils/string.utils.js +168 -0
  257. package/dist/products/services/utils/string.utils.js.map +1 -0
  258. package/dist/products/utils/string.utils.d.ts +1 -1
  259. package/dist/products/utils/string.utils.js +14 -2
  260. package/dist/products/utils/string.utils.js.map +1 -1
  261. package/dist/products/validators/index.d.ts +4 -1
  262. package/dist/products/validators/index.js +7 -1
  263. package/dist/products/validators/index.js.map +1 -1
  264. package/dist/products/validators/joi-validators/create.productDatabaseAction.validator.d.ts +15 -4
  265. package/dist/products/validators/joi-validators/create.productDatabaseAction.validator.js +501 -109
  266. package/dist/products/validators/joi-validators/create.productDatabaseAction.validator.js.map +1 -1
  267. package/dist/products/validators/joi-validators/create.productEnv.validator.js +1 -0
  268. package/dist/products/validators/joi-validators/create.productEnv.validator.js.map +1 -1
  269. package/dist/products/validators/joi-validators/create.productGraph.validator.d.ts +3 -0
  270. package/dist/products/validators/joi-validators/create.productGraph.validator.js +82 -0
  271. package/dist/products/validators/joi-validators/create.productGraph.validator.js.map +1 -0
  272. package/dist/products/validators/joi-validators/create.productGraphAction.validator.d.ts +14 -0
  273. package/dist/products/validators/joi-validators/create.productGraphAction.validator.js +696 -0
  274. package/dist/products/validators/joi-validators/create.productGraphAction.validator.js.map +1 -0
  275. package/dist/products/validators/joi-validators/create.productHealthcheck.validator.d.ts +4 -0
  276. package/dist/products/validators/joi-validators/create.productHealthcheck.validator.js +58 -0
  277. package/dist/products/validators/joi-validators/create.productHealthcheck.validator.js.map +1 -0
  278. package/dist/products/validators/joi-validators/create.productMessageBrokerTopic.validator.js +1 -0
  279. package/dist/products/validators/joi-validators/create.productMessageBrokerTopic.validator.js.map +1 -1
  280. package/dist/products/validators/joi-validators/create.productMessageBrokers.validator.js +9 -4
  281. package/dist/products/validators/joi-validators/create.productMessageBrokers.validator.js.map +1 -1
  282. package/dist/products/validators/joi-validators/create.productNotification.validator.js +5 -2
  283. package/dist/products/validators/joi-validators/create.productNotification.validator.js.map +1 -1
  284. package/dist/products/validators/joi-validators/create.userAuth.validator.js +1 -0
  285. package/dist/products/validators/joi-validators/create.userAuth.validator.js.map +1 -1
  286. package/dist/products/validators/joi-validators/update.dataValue.validator.js +1 -0
  287. package/dist/products/validators/joi-validators/update.dataValue.validator.js.map +1 -1
  288. package/dist/products/validators/joi-validators/update.productDatabaseAction.validator.d.ts +6 -0
  289. package/dist/products/validators/joi-validators/update.productDatabaseAction.validator.js +28 -26
  290. package/dist/products/validators/joi-validators/update.productDatabaseAction.validator.js.map +1 -1
  291. package/dist/products/validators/joi-validators/update.productEnv.validator.js +3 -0
  292. package/dist/products/validators/joi-validators/update.productEnv.validator.js.map +1 -1
  293. package/dist/products/validators/joi-validators/update.productGraph.validator.d.ts +3 -0
  294. package/dist/products/validators/joi-validators/update.productGraph.validator.js +87 -0
  295. package/dist/products/validators/joi-validators/update.productGraph.validator.js.map +1 -0
  296. package/dist/products/validators/joi-validators/update.productGraphAction.validator.d.ts +7 -0
  297. package/dist/products/validators/joi-validators/update.productGraphAction.validator.js +72 -0
  298. package/dist/products/validators/joi-validators/update.productGraphAction.validator.js.map +1 -0
  299. package/dist/products/validators/joi-validators/update.productMessageBrokerTopic.validator.js +1 -0
  300. package/dist/products/validators/joi-validators/update.productMessageBrokerTopic.validator.js.map +1 -1
  301. package/dist/products/validators/joi-validators/update.userAuth.validator.js +1 -0
  302. package/dist/products/validators/joi-validators/update.userAuth.validator.js.map +1 -1
  303. package/dist/test/test.health.d.ts +1 -0
  304. package/dist/test/test.health.js +49 -0
  305. package/dist/test/test.health.js.map +1 -0
  306. package/dist/test/test.import.js +51 -4
  307. package/dist/test/test.import.js.map +1 -1
  308. package/dist/test/test.imports.js +22 -7
  309. package/dist/test/test.imports.js.map +1 -1
  310. package/dist/test/test.notifiers.d.ts +1 -0
  311. package/dist/test/test.notifiers.js +85 -0
  312. package/dist/test/test.notifiers.js.map +1 -0
  313. package/dist/test/test.processor.js +30 -115
  314. package/dist/test/test.processor.js.map +1 -1
  315. package/dist/test/test.products.d.ts +1 -0
  316. package/dist/test/test.products.js +49 -0
  317. package/dist/test/test.products.js.map +1 -0
  318. package/dist/tsconfig.tsbuildinfo +1 -0
  319. package/dist/types/appBuilder.types.d.ts +5 -12
  320. package/dist/types/enums.d.ts +4 -1
  321. package/dist/types/enums.js +3 -0
  322. package/dist/types/enums.js.map +1 -1
  323. package/dist/types/index.types.d.ts +4 -0
  324. package/dist/types/pricing.types.d.ts +4 -0
  325. package/dist/types/pricing.types.js +3 -0
  326. package/dist/types/pricing.types.js.map +1 -0
  327. package/dist/types/processor.types.d.ts +67 -11
  328. package/dist/types/processor.types.js.map +1 -1
  329. package/dist/types/productsBuilder.types.d.ts +132 -14
  330. package/dist/types/productsBuilder.types.js +69 -4
  331. package/dist/types/productsBuilder.types.js.map +1 -1
  332. package/dist/types/request-tracker.interface.d.ts +0 -0
  333. package/dist/types/request-tracker.interface.js +1 -0
  334. package/dist/types/request-tracker.interface.js.map +1 -0
  335. package/dist/utils/constants.d.ts +1 -0
  336. package/dist/utils/constants.js +5 -0
  337. package/dist/utils/constants.js.map +1 -0
  338. package/package.json +17 -3
@@ -0,0 +1,1603 @@
1
+ "use strict";
2
+ /**
3
+ * PostgreSQL Database Adapter
4
+ * Implements database operations for PostgreSQL
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.PostgreSQLAdapter = void 0;
41
+ const base_adapter_1 = require("./base.adapter");
42
+ const database_types_1 = require("../types/database.types");
43
+ const uuid_1 = require("uuid");
44
+ const schema_types_1 = require("../types/schema.types");
45
+ const migration_types_1 = require("../types/migration.types");
46
+ /**
47
+ * PostgreSQL Connection wrapper
48
+ */
49
+ class PostgreSQLConnection {
50
+ constructor(id, pool) {
51
+ this.id = id;
52
+ this.type = database_types_1.DatabaseType.POSTGRESQL;
53
+ this.status = database_types_1.ConnectionStatus.CONNECTED;
54
+ this.pool = pool;
55
+ }
56
+ async connect() {
57
+ this.status = database_types_1.ConnectionStatus.CONNECTED;
58
+ }
59
+ async disconnect() {
60
+ if (this.pool) {
61
+ await this.pool.end();
62
+ this.status = database_types_1.ConnectionStatus.DISCONNECTED;
63
+ }
64
+ }
65
+ isConnected() {
66
+ return this.status === database_types_1.ConnectionStatus.CONNECTED;
67
+ }
68
+ getClient() {
69
+ return this.pool;
70
+ }
71
+ }
72
+ /**
73
+ * PostgreSQL Savepoint implementation
74
+ */
75
+ class PostgreSQLSavepoint {
76
+ constructor(name, transaction, client) {
77
+ this.name = name;
78
+ this.transaction = transaction;
79
+ this.createdAt = new Date();
80
+ this.client = client;
81
+ }
82
+ async rollback() {
83
+ await this.client.query(`ROLLBACK TO SAVEPOINT ${this.name}`);
84
+ }
85
+ async release() {
86
+ await this.client.query(`RELEASE SAVEPOINT ${this.name}`);
87
+ }
88
+ }
89
+ /**
90
+ * PostgreSQL Transaction implementation
91
+ */
92
+ class PostgreSQLTransaction {
93
+ constructor(connection, client, options) {
94
+ this.id = (0, uuid_1.v4)();
95
+ this.connection = connection;
96
+ this.status = database_types_1.TransactionStatus.ACTIVE;
97
+ this.isolationLevel = options === null || options === void 0 ? void 0 : options.isolationLevel;
98
+ this.createdAt = new Date();
99
+ this.client = client;
100
+ this.native = client;
101
+ }
102
+ async commit() {
103
+ if (this.status !== database_types_1.TransactionStatus.ACTIVE) {
104
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.TRANSACTION_ERROR, `Cannot commit transaction: status is ${this.status}`);
105
+ }
106
+ await this.client.query('COMMIT');
107
+ this.status = database_types_1.TransactionStatus.COMMITTED;
108
+ }
109
+ async rollback() {
110
+ if (this.status !== database_types_1.TransactionStatus.ACTIVE) {
111
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.TRANSACTION_ERROR, `Cannot rollback transaction: status is ${this.status}`);
112
+ }
113
+ await this.client.query('ROLLBACK');
114
+ this.status = database_types_1.TransactionStatus.ROLLED_BACK;
115
+ }
116
+ async savepoint(name) {
117
+ if (this.status !== database_types_1.TransactionStatus.ACTIVE) {
118
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.TRANSACTION_ERROR, `Cannot create savepoint: transaction status is ${this.status}`);
119
+ }
120
+ await this.client.query(`SAVEPOINT ${name}`);
121
+ return new PostgreSQLSavepoint(name, this, this.client);
122
+ }
123
+ isActive() {
124
+ return this.status === database_types_1.TransactionStatus.ACTIVE;
125
+ }
126
+ }
127
+ /**
128
+ * PostgreSQL Adapter
129
+ */
130
+ class PostgreSQLAdapter extends base_adapter_1.BaseDatabaseAdapter {
131
+ constructor() {
132
+ super(...arguments);
133
+ this.type = database_types_1.DatabaseType.POSTGRESQL;
134
+ this.connectionPool = new Map();
135
+ }
136
+ // ==================== Connection Methods ====================
137
+ async connect(config) {
138
+ try {
139
+ // Import pg library dynamically
140
+ const { Pool } = await Promise.resolve().then(() => __importStar(require('pg')));
141
+ // Extract connection options from config
142
+ const options = config.options || {};
143
+ // Create connection pool
144
+ const pool = new Pool({
145
+ host: options.host,
146
+ port: options.port || 5432,
147
+ database: config.database || options.database,
148
+ user: options.user || options.username,
149
+ password: options.password,
150
+ ssl: options.ssl,
151
+ max: options.poolSize || 10,
152
+ connectionTimeoutMillis: options.connectionTimeout || 5000,
153
+ idleTimeoutMillis: options.idleTimeout || 30000,
154
+ });
155
+ // Test connection
156
+ await pool.query('SELECT 1');
157
+ // Create connection wrapper
158
+ const connectionId = `postgresql-${config.database}-${Date.now()}`;
159
+ const connection = new PostgreSQLConnection(connectionId, pool);
160
+ // Store in pool map
161
+ this.connectionPool.set(connectionId, connection);
162
+ return connection;
163
+ }
164
+ catch (error) {
165
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.CONNECTION_ERROR, `Failed to connect to PostgreSQL: ${error.message}`, error);
166
+ }
167
+ }
168
+ async disconnect(connection) {
169
+ await connection.disconnect();
170
+ this.connectionPool.delete(connection.id);
171
+ }
172
+ async testConnection(connection) {
173
+ var _a;
174
+ const startTime = Date.now();
175
+ try {
176
+ const pool = connection.getClient();
177
+ const result = await pool.query('SELECT version()');
178
+ const responseTime = Date.now() - startTime;
179
+ return {
180
+ connected: true,
181
+ message: 'Successfully connected to PostgreSQL',
182
+ databaseType: 'PostgreSQL',
183
+ version: (_a = result.rows[0]) === null || _a === void 0 ? void 0 : _a.version,
184
+ responseTime,
185
+ };
186
+ }
187
+ catch (error) {
188
+ return {
189
+ connected: false,
190
+ message: 'Failed to connect to PostgreSQL',
191
+ databaseType: 'PostgreSQL',
192
+ responseTime: Date.now() - startTime,
193
+ error: error.message,
194
+ };
195
+ }
196
+ }
197
+ // ==================== Transaction Methods ====================
198
+ async beginTransaction(connection, options) {
199
+ try {
200
+ const pool = connection.getClient();
201
+ const client = await pool.connect();
202
+ // Set isolation level if specified
203
+ let beginStatement = 'BEGIN';
204
+ if (options === null || options === void 0 ? void 0 : options.isolationLevel) {
205
+ beginStatement += ` ISOLATION LEVEL ${options.isolationLevel.replace('_', ' ')}`;
206
+ }
207
+ if (options === null || options === void 0 ? void 0 : options.readOnly) {
208
+ beginStatement += ' READ ONLY';
209
+ }
210
+ if (options === null || options === void 0 ? void 0 : options.deferrable) {
211
+ beginStatement += ' DEFERRABLE';
212
+ }
213
+ await client.query(beginStatement);
214
+ return new PostgreSQLTransaction(connection, client, options);
215
+ }
216
+ catch (error) {
217
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.TRANSACTION_ERROR, `Failed to begin transaction: ${error.message}`, error);
218
+ }
219
+ }
220
+ async commitTransaction(connection, transaction) {
221
+ await transaction.commit();
222
+ }
223
+ async rollbackTransaction(connection, transaction) {
224
+ await transaction.rollback();
225
+ }
226
+ async createSavepoint(connection, transaction, savepointName) {
227
+ return transaction.savepoint(savepointName);
228
+ }
229
+ async rollbackToSavepoint(_connection, _transaction, savepoint) {
230
+ await savepoint.rollback();
231
+ }
232
+ async releaseSavepoint(_connection, _transaction, savepoint) {
233
+ await savepoint.release();
234
+ }
235
+ // ==================== Query Methods ====================
236
+ async query(connection, options) {
237
+ const startTime = Date.now();
238
+ try {
239
+ const { query, params } = this.buildSelectQuery(options);
240
+ const client = connection.getClient();
241
+ const result = await client.query(query, params);
242
+ const executionTime = Date.now() - startTime;
243
+ return {
244
+ data: result.rows,
245
+ count: result.rowCount,
246
+ executionTime,
247
+ databaseType: 'PostgreSQL',
248
+ };
249
+ }
250
+ catch (error) {
251
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `PostgreSQL query failed: ${error.message}`, error);
252
+ }
253
+ }
254
+ async insert(connection, options) {
255
+ const startTime = Date.now();
256
+ try {
257
+ const { query, params } = this.buildInsertQuery(options);
258
+ const client = connection.getClient();
259
+ const result = await client.query(query, params);
260
+ const executionTime = Date.now() - startTime;
261
+ return {
262
+ insertedCount: result.rowCount,
263
+ insertedIds: result.rows.map((row) => row.id || row[Object.keys(row)[0]]),
264
+ data: options.returning ? result.rows : undefined,
265
+ executionTime,
266
+ success: true,
267
+ };
268
+ }
269
+ catch (error) {
270
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `PostgreSQL insert failed: ${error.message}`, error);
271
+ }
272
+ }
273
+ async update(connection, options) {
274
+ const startTime = Date.now();
275
+ try {
276
+ const { query, params } = this.buildUpdateQuery(options);
277
+ const client = connection.getClient();
278
+ const result = await client.query(query, params);
279
+ const executionTime = Date.now() - startTime;
280
+ return {
281
+ updatedCount: result.rowCount,
282
+ matchedCount: result.rowCount,
283
+ data: options.returning ? result.rows : undefined,
284
+ executionTime,
285
+ success: true,
286
+ };
287
+ }
288
+ catch (error) {
289
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `PostgreSQL update failed: ${error.message}`, error);
290
+ }
291
+ }
292
+ async delete(connection, options) {
293
+ const startTime = Date.now();
294
+ try {
295
+ const { query, params } = this.buildDeleteQuery(options);
296
+ const client = connection.getClient();
297
+ const result = await client.query(query, params);
298
+ const executionTime = Date.now() - startTime;
299
+ return {
300
+ deletedCount: result.rowCount,
301
+ data: options.returning ? result.rows : undefined,
302
+ executionTime,
303
+ success: true,
304
+ };
305
+ }
306
+ catch (error) {
307
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `PostgreSQL delete failed: ${error.message}`, error);
308
+ }
309
+ }
310
+ async upsert(connection, options) {
311
+ const startTime = Date.now();
312
+ try {
313
+ const { query, params } = this.buildUpsertQuery(options);
314
+ const client = connection.getClient();
315
+ const result = await client.query(query, params);
316
+ const executionTime = Date.now() - startTime;
317
+ return {
318
+ insertedCount: 0, // PostgreSQL doesn't distinguish in upsert
319
+ updatedCount: 0,
320
+ affectedCount: result.rowCount,
321
+ data: options.returning ? result.rows : undefined,
322
+ executionTime,
323
+ success: true,
324
+ };
325
+ }
326
+ catch (error) {
327
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `PostgreSQL upsert failed: ${error.message}`, error);
328
+ }
329
+ }
330
+ async executeRaw(connection, options) {
331
+ var _a;
332
+ const startTime = Date.now();
333
+ try {
334
+ const client = connection.getClient();
335
+ const result = await client.query(options.query, options.params || []);
336
+ const executionTime = Date.now() - startTime;
337
+ return {
338
+ rows: result.rows,
339
+ rowCount: result.rowCount,
340
+ fields: (_a = result.fields) === null || _a === void 0 ? void 0 : _a.map((f) => ({
341
+ name: f.name,
342
+ type: f.dataTypeID,
343
+ })),
344
+ executionTime,
345
+ };
346
+ }
347
+ catch (error) {
348
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `PostgreSQL raw query failed: ${error.message}`, error);
349
+ }
350
+ }
351
+ // ==================== Aggregation Methods ====================
352
+ async count(connection, options) {
353
+ try {
354
+ const { query, params } = this.buildCountQuery(options);
355
+ const client = connection.getClient();
356
+ const result = await client.query(query, params);
357
+ return parseInt(result.rows[0].count, 10);
358
+ }
359
+ catch (error) {
360
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `PostgreSQL count failed: ${error.message}`, error);
361
+ }
362
+ }
363
+ async sum(connection, options) {
364
+ try {
365
+ const { query, params } = this.buildAggregateQuery('SUM', options.column, options);
366
+ const client = connection.getClient();
367
+ const result = await client.query(query, params);
368
+ return parseFloat(result.rows[0].result) || 0;
369
+ }
370
+ catch (error) {
371
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `PostgreSQL sum failed: ${error.message}`, error);
372
+ }
373
+ }
374
+ async avg(connection, options) {
375
+ try {
376
+ const { query, params } = this.buildAggregateQuery('AVG', options.column, options);
377
+ const client = connection.getClient();
378
+ const result = await client.query(query, params);
379
+ return parseFloat(result.rows[0].result) || 0;
380
+ }
381
+ catch (error) {
382
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `PostgreSQL avg failed: ${error.message}`, error);
383
+ }
384
+ }
385
+ async min(connection, options) {
386
+ try {
387
+ const { query, params } = this.buildAggregateQuery('MIN', options.column, options);
388
+ const client = connection.getClient();
389
+ const result = await client.query(query, params);
390
+ return result.rows[0].result;
391
+ }
392
+ catch (error) {
393
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `PostgreSQL min failed: ${error.message}`, error);
394
+ }
395
+ }
396
+ async max(connection, options) {
397
+ try {
398
+ const { query, params } = this.buildAggregateQuery('MAX', options.column, options);
399
+ const client = connection.getClient();
400
+ const result = await client.query(query, params);
401
+ return result.rows[0].result;
402
+ }
403
+ catch (error) {
404
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `PostgreSQL max failed: ${error.message}`, error);
405
+ }
406
+ }
407
+ async groupBy(connection, options) {
408
+ try {
409
+ const { query, params } = this.buildGroupByQuery(options);
410
+ const client = connection.getClient();
411
+ const result = await client.query(query, params);
412
+ return result.rows;
413
+ }
414
+ catch (error) {
415
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `PostgreSQL groupBy failed: ${error.message}`, error);
416
+ }
417
+ }
418
+ async aggregate(connection, options) {
419
+ try {
420
+ const { query, params } = this.buildMultiAggregateQuery(options);
421
+ const client = connection.getClient();
422
+ const result = await client.query(query, params);
423
+ return result.rows[0] || {};
424
+ }
425
+ catch (error) {
426
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `PostgreSQL aggregate failed: ${error.message}`, error);
427
+ }
428
+ }
429
+ // ==================== Schema Methods ====================
430
+ async createTable(connection, schema, options) {
431
+ const startTime = Date.now();
432
+ try {
433
+ const query = this.buildCreateTableQuery(schema, options);
434
+ const client = connection.getClient();
435
+ await client.query(query);
436
+ const executionTime = Date.now() - startTime;
437
+ return {
438
+ success: true,
439
+ operation: 'create',
440
+ table: schema.name,
441
+ executionTime,
442
+ };
443
+ }
444
+ catch (error) {
445
+ return {
446
+ success: false,
447
+ operation: 'create',
448
+ table: schema.name,
449
+ error: error.message,
450
+ executionTime: Date.now() - startTime,
451
+ };
452
+ }
453
+ }
454
+ async dropTable(connection, tableName) {
455
+ const startTime = Date.now();
456
+ try {
457
+ const client = connection.getClient();
458
+ await client.query(`DROP TABLE IF EXISTS "${tableName}"`);
459
+ return {
460
+ success: true,
461
+ operation: 'drop',
462
+ table: tableName,
463
+ executionTime: Date.now() - startTime,
464
+ };
465
+ }
466
+ catch (error) {
467
+ return {
468
+ success: false,
469
+ operation: 'drop',
470
+ table: tableName,
471
+ error: error.message,
472
+ executionTime: Date.now() - startTime,
473
+ };
474
+ }
475
+ }
476
+ async alterTable(connection, tableName, alterations, options) {
477
+ const startTime = Date.now();
478
+ try {
479
+ const queries = this.buildAlterTableQueries(tableName, alterations);
480
+ const client = connection.getClient();
481
+ for (const query of queries) {
482
+ await client.query(query);
483
+ }
484
+ return {
485
+ success: true,
486
+ operation: 'alter',
487
+ table: tableName,
488
+ executionTime: Date.now() - startTime,
489
+ };
490
+ }
491
+ catch (error) {
492
+ return {
493
+ success: false,
494
+ operation: 'alter',
495
+ table: tableName,
496
+ error: error.message,
497
+ executionTime: Date.now() - startTime,
498
+ };
499
+ }
500
+ }
501
+ async getTableSchema(connection, tableName) {
502
+ try {
503
+ const client = connection.getClient();
504
+ const query = `
505
+ SELECT
506
+ column_name,
507
+ data_type,
508
+ is_nullable,
509
+ column_default,
510
+ character_maximum_length,
511
+ numeric_precision,
512
+ numeric_scale
513
+ FROM information_schema.columns
514
+ WHERE table_name = $1
515
+ ORDER BY ordinal_position
516
+ `;
517
+ const result = await client.query(query, [tableName]);
518
+ const columns = result.rows.map((row) => ({
519
+ name: row.column_name,
520
+ type: this.mapPostgreSQLTypeToColumnType(row.data_type),
521
+ nullable: row.is_nullable === 'YES',
522
+ defaultValue: row.column_default,
523
+ length: row.character_maximum_length,
524
+ precision: row.numeric_precision,
525
+ scale: row.numeric_scale,
526
+ }));
527
+ return {
528
+ name: tableName,
529
+ columns,
530
+ };
531
+ }
532
+ catch (error) {
533
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.SCHEMA_ERROR, `Failed to get PostgreSQL table schema: ${error.message}`, error);
534
+ }
535
+ }
536
+ async listTables(connection) {
537
+ try {
538
+ const client = connection.getClient();
539
+ const query = `
540
+ SELECT tablename
541
+ FROM pg_tables
542
+ WHERE schemaname = 'public'
543
+ ORDER BY tablename
544
+ `;
545
+ const result = await client.query(query);
546
+ return result.rows.map((row) => row.tablename);
547
+ }
548
+ catch (error) {
549
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.QUERY_ERROR, `Failed to list PostgreSQL tables: ${error.message}`, error);
550
+ }
551
+ }
552
+ async tableExists(connection, tableName) {
553
+ try {
554
+ const client = connection.getClient();
555
+ const query = `
556
+ SELECT EXISTS (
557
+ SELECT FROM information_schema.tables
558
+ WHERE table_schema = 'public'
559
+ AND table_name = $1
560
+ )
561
+ `;
562
+ const result = await client.query(query, [tableName]);
563
+ return result.rows[0].exists;
564
+ }
565
+ catch (error) {
566
+ return false;
567
+ }
568
+ }
569
+ // ==================== Index Methods ====================
570
+ async createIndex(connection, options) {
571
+ const startTime = Date.now();
572
+ try {
573
+ const query = this.buildCreateIndexQuery(options);
574
+ const client = connection.getClient();
575
+ await client.query(query);
576
+ return {
577
+ success: true,
578
+ operation: 'create',
579
+ indexName: options.index.name,
580
+ table: options.table,
581
+ executionTime: Date.now() - startTime,
582
+ };
583
+ }
584
+ catch (error) {
585
+ return {
586
+ success: false,
587
+ operation: 'create',
588
+ indexName: options.index.name,
589
+ table: options.table,
590
+ error: error.message,
591
+ executionTime: Date.now() - startTime,
592
+ };
593
+ }
594
+ }
595
+ async dropIndex(connection, options) {
596
+ const startTime = Date.now();
597
+ try {
598
+ const client = connection.getClient();
599
+ await client.query(`DROP INDEX IF EXISTS "${options.indexName}"`);
600
+ return {
601
+ success: true,
602
+ operation: 'drop',
603
+ indexName: options.indexName,
604
+ table: options.table,
605
+ executionTime: Date.now() - startTime,
606
+ };
607
+ }
608
+ catch (error) {
609
+ return {
610
+ success: false,
611
+ operation: 'drop',
612
+ indexName: options.indexName,
613
+ table: options.table,
614
+ error: error.message,
615
+ executionTime: Date.now() - startTime,
616
+ };
617
+ }
618
+ }
619
+ async listIndexes(connection, options) {
620
+ try {
621
+ const client = connection.getClient();
622
+ const query = `
623
+ SELECT
624
+ i.relname as index_name,
625
+ a.attname as column_name,
626
+ ix.indisunique as is_unique,
627
+ am.amname as index_type
628
+ FROM
629
+ pg_class t,
630
+ pg_class i,
631
+ pg_index ix,
632
+ pg_attribute a,
633
+ pg_am am
634
+ WHERE
635
+ t.oid = ix.indrelid
636
+ AND i.oid = ix.indexrelid
637
+ AND a.attrelid = t.oid
638
+ AND a.attnum = ANY(ix.indkey)
639
+ AND t.relkind = 'r'
640
+ AND t.relname = $1
641
+ AND i.relam = am.oid
642
+ ORDER BY
643
+ i.relname,
644
+ a.attnum
645
+ `;
646
+ const result = await client.query(query, [options.table]);
647
+ // Group by index name
648
+ const indexMap = new Map();
649
+ result.rows.forEach((row) => {
650
+ if (!indexMap.has(row.index_name)) {
651
+ indexMap.set(row.index_name, {
652
+ name: row.index_name,
653
+ table: options.table,
654
+ columns: [],
655
+ columnDetails: [],
656
+ unique: row.is_unique,
657
+ primaryKey: false,
658
+ type: row.index_type,
659
+ });
660
+ }
661
+ const indexInfo = indexMap.get(row.index_name);
662
+ indexInfo.columns.push(row.column_name);
663
+ indexInfo.columnDetails.push({
664
+ name: row.column_name,
665
+ order: 'ASC',
666
+ });
667
+ });
668
+ return Array.from(indexMap.values());
669
+ }
670
+ catch (error) {
671
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.INDEX_ERROR, `Failed to list PostgreSQL indexes: ${error.message}`, error);
672
+ }
673
+ }
674
+ async getIndexStatistics(connection, tableName, indexName) {
675
+ try {
676
+ const client = connection.getClient();
677
+ let query = `
678
+ SELECT
679
+ schemaname,
680
+ tablename,
681
+ indexname,
682
+ idx_scan as scans,
683
+ idx_tup_read as tuples_read,
684
+ idx_tup_fetch as tuples_fetched
685
+ FROM
686
+ pg_stat_user_indexes
687
+ WHERE
688
+ tablename = $1
689
+ `;
690
+ const params = [tableName];
691
+ if (indexName) {
692
+ query += ` AND indexname = $2`;
693
+ params.push(indexName);
694
+ }
695
+ const result = await client.query(query, params);
696
+ return result.rows.map((row) => ({
697
+ indexName: row.indexname,
698
+ tableName: row.tablename,
699
+ scans: row.scans,
700
+ tuplesRead: row.tuples_read,
701
+ tuplesFetched: row.tuples_fetched,
702
+ }));
703
+ }
704
+ catch (error) {
705
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.INDEX_ERROR, `Failed to get PostgreSQL index statistics: ${error.message}`, error);
706
+ }
707
+ }
708
+ // ==================== Migration Methods ====================
709
+ /**
710
+ * Build SQL for a migration operation
711
+ */
712
+ async buildMigrationOperationSQL(operation) {
713
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
714
+ switch (operation.type) {
715
+ case migration_types_1.MigrationOperationType.RAW_SQL:
716
+ return operation.sql || null;
717
+ case migration_types_1.MigrationOperationType.CREATE_TABLE:
718
+ if ((_a = operation.params) === null || _a === void 0 ? void 0 : _a.schema) {
719
+ const schema = operation.params.schema;
720
+ const columns = schema.columns
721
+ .map((col) => {
722
+ let def = `"${col.name}" ${this.mapColumnTypeToPostgreSQL(col.type)}`;
723
+ if (col.primaryKey)
724
+ def += ' PRIMARY KEY';
725
+ if (!col.nullable)
726
+ def += ' NOT NULL';
727
+ if (col.unique)
728
+ def += ' UNIQUE';
729
+ if (col.defaultValue !== undefined) {
730
+ def += ` DEFAULT ${this.escapeValue(col.defaultValue)}`;
731
+ }
732
+ return def;
733
+ })
734
+ .join(', ');
735
+ return `CREATE TABLE "${schema.name}" (${columns})`;
736
+ }
737
+ return null;
738
+ case migration_types_1.MigrationOperationType.DROP_TABLE:
739
+ return operation.table ? `DROP TABLE IF EXISTS "${operation.table}"` : null;
740
+ case migration_types_1.MigrationOperationType.ADD_COLUMN:
741
+ if (operation.table && ((_b = operation.params) === null || _b === void 0 ? void 0 : _b.column)) {
742
+ const col = operation.params.column;
743
+ let def = `ALTER TABLE "${operation.table}" ADD COLUMN "${col.name}" ${this.mapColumnTypeToPostgreSQL(col.type)}`;
744
+ if (!col.nullable)
745
+ def += ' NOT NULL';
746
+ if (col.defaultValue !== undefined) {
747
+ def += ` DEFAULT ${this.escapeValue(col.defaultValue)}`;
748
+ }
749
+ return def;
750
+ }
751
+ return null;
752
+ case migration_types_1.MigrationOperationType.DROP_COLUMN:
753
+ return operation.table && ((_c = operation.params) === null || _c === void 0 ? void 0 : _c.columnName)
754
+ ? `ALTER TABLE "${operation.table}" DROP COLUMN "${operation.params.columnName}"`
755
+ : null;
756
+ case migration_types_1.MigrationOperationType.MODIFY_COLUMN:
757
+ if (operation.table && ((_d = operation.params) === null || _d === void 0 ? void 0 : _d.column)) {
758
+ const col = operation.params.column;
759
+ return `ALTER TABLE "${operation.table}" ALTER COLUMN "${col.name}" TYPE ${this.mapColumnTypeToPostgreSQL(col.type)}`;
760
+ }
761
+ return null;
762
+ case migration_types_1.MigrationOperationType.RENAME_COLUMN:
763
+ return operation.table && ((_e = operation.params) === null || _e === void 0 ? void 0 : _e.oldName) && ((_f = operation.params) === null || _f === void 0 ? void 0 : _f.newName)
764
+ ? `ALTER TABLE "${operation.table}" RENAME COLUMN "${operation.params.oldName}" TO "${operation.params.newName}"`
765
+ : null;
766
+ case migration_types_1.MigrationOperationType.ADD_INDEX:
767
+ if (operation.table && ((_g = operation.params) === null || _g === void 0 ? void 0 : _g.indexName) && ((_h = operation.params) === null || _h === void 0 ? void 0 : _h.columns)) {
768
+ const unique = operation.params.unique ? 'UNIQUE ' : '';
769
+ const columns = operation.params.columns.map((col) => `"${col}"`).join(', ');
770
+ return `CREATE ${unique}INDEX "${operation.params.indexName}" ON "${operation.table}" (${columns})`;
771
+ }
772
+ return null;
773
+ case migration_types_1.MigrationOperationType.DROP_INDEX:
774
+ return ((_j = operation.params) === null || _j === void 0 ? void 0 : _j.indexName)
775
+ ? `DROP INDEX IF EXISTS "${operation.params.indexName}"`
776
+ : null;
777
+ case migration_types_1.MigrationOperationType.ADD_CONSTRAINT:
778
+ if (operation.table && ((_k = operation.params) === null || _k === void 0 ? void 0 : _k.constraintName) && ((_l = operation.params) === null || _l === void 0 ? void 0 : _l.definition)) {
779
+ return `ALTER TABLE "${operation.table}" ADD CONSTRAINT "${operation.params.constraintName}" ${operation.params.definition}`;
780
+ }
781
+ return null;
782
+ case migration_types_1.MigrationOperationType.DROP_CONSTRAINT:
783
+ return operation.table && ((_m = operation.params) === null || _m === void 0 ? void 0 : _m.constraintName)
784
+ ? `ALTER TABLE "${operation.table}" DROP CONSTRAINT IF EXISTS "${operation.params.constraintName}"`
785
+ : null;
786
+ default:
787
+ return null;
788
+ }
789
+ }
790
+ async runMigration(connection, migration, options) {
791
+ const startTime = Date.now();
792
+ const statements = [];
793
+ try {
794
+ const client = connection.getClient();
795
+ await client.query('BEGIN');
796
+ try {
797
+ // Execute migration operations
798
+ for (const operation of migration.up) {
799
+ const sql = await this.buildMigrationOperationSQL(operation);
800
+ if (sql) {
801
+ statements.push(sql);
802
+ await client.query(sql);
803
+ }
804
+ }
805
+ // Record migration in history table
806
+ await this.recordMigration(client, migration, migration_types_1.MigrationDirection.UP);
807
+ await client.query('COMMIT');
808
+ return {
809
+ tag: migration.tag,
810
+ status: migration_types_1.MigrationStatus.COMPLETED,
811
+ direction: migration_types_1.MigrationDirection.UP,
812
+ executedAt: new Date(),
813
+ duration: Date.now() - startTime,
814
+ statements,
815
+ };
816
+ }
817
+ catch (error) {
818
+ await client.query('ROLLBACK');
819
+ throw error;
820
+ }
821
+ }
822
+ catch (error) {
823
+ return {
824
+ tag: migration.tag,
825
+ status: migration_types_1.MigrationStatus.FAILED,
826
+ direction: migration_types_1.MigrationDirection.UP,
827
+ executedAt: new Date(),
828
+ duration: Date.now() - startTime,
829
+ error: error.message,
830
+ statements,
831
+ };
832
+ }
833
+ }
834
+ async rollbackMigration(connection, migration, options) {
835
+ const startTime = Date.now();
836
+ const statements = [];
837
+ try {
838
+ const client = connection.getClient();
839
+ await client.query('BEGIN');
840
+ try {
841
+ // Execute rollback operations
842
+ for (const operation of migration.down) {
843
+ const sql = await this.buildMigrationOperationSQL(operation);
844
+ if (sql) {
845
+ statements.push(sql);
846
+ await client.query(sql);
847
+ }
848
+ }
849
+ // Remove migration from history table
850
+ await this.removeMigration(client, migration.tag);
851
+ await client.query('COMMIT');
852
+ return {
853
+ tag: migration.tag,
854
+ status: migration_types_1.MigrationStatus.ROLLED_BACK,
855
+ direction: migration_types_1.MigrationDirection.DOWN,
856
+ executedAt: new Date(),
857
+ duration: Date.now() - startTime,
858
+ statements,
859
+ };
860
+ }
861
+ catch (error) {
862
+ await client.query('ROLLBACK');
863
+ throw error;
864
+ }
865
+ }
866
+ catch (error) {
867
+ return {
868
+ tag: migration.tag,
869
+ status: migration_types_1.MigrationStatus.FAILED,
870
+ direction: migration_types_1.MigrationDirection.DOWN,
871
+ executedAt: new Date(),
872
+ duration: Date.now() - startTime,
873
+ error: error.message,
874
+ statements,
875
+ };
876
+ }
877
+ }
878
+ async getMigrationHistory(connection, options) {
879
+ try {
880
+ const client = connection.getClient();
881
+ // Ensure migration table exists
882
+ await this.ensureMigrationTable(client);
883
+ const query = `
884
+ SELECT tag, name, executed_at
885
+ FROM _ductape_migrations
886
+ ORDER BY executed_at DESC
887
+ `;
888
+ const result = await client.query(query);
889
+ return result.rows.map((row) => ({
890
+ tag: row.tag,
891
+ name: row.name,
892
+ executedAt: row.executed_at,
893
+ }));
894
+ }
895
+ catch (error) {
896
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.MIGRATION_ERROR, `Failed to get migration history: ${error.message}`, error);
897
+ }
898
+ }
899
+ // ==================== Helper Methods ====================
900
+ /**
901
+ * Build SELECT query from options
902
+ */
903
+ buildSelectQuery(options) {
904
+ const params = [];
905
+ let paramIndex = 1;
906
+ // Handle includes
907
+ const hasIncludes = options.include && (Array.isArray(options.include) ? options.include.length > 0 : true);
908
+ // SELECT clause
909
+ let selectColumns;
910
+ if (options.select && options.select.length > 0) {
911
+ // Prefix main table columns with table name
912
+ selectColumns = options.select.map((col) => `"${options.table}"."${col}"`).join(', ');
913
+ }
914
+ else {
915
+ // Select all from main table
916
+ selectColumns = hasIncludes ? `"${options.table}".*` : '*';
917
+ }
918
+ // Add included relation columns
919
+ if (hasIncludes) {
920
+ const includes = Array.isArray(options.include) ? options.include : [options.include];
921
+ includes.forEach((include) => {
922
+ const relationAlias = include.relation;
923
+ if (include.select && include.select.length > 0) {
924
+ const relationCols = include.select.map((col) => `"${relationAlias}"."${col}" as "${relationAlias}_${col}"`).join(', ');
925
+ selectColumns += `, ${relationCols}`;
926
+ }
927
+ else {
928
+ // Use JSON aggregation for one-to-many
929
+ if (include.type === 'one-to-many') {
930
+ selectColumns += `, json_agg("${relationAlias}".*) as "${relationAlias}"`;
931
+ }
932
+ else {
933
+ selectColumns += `, row_to_json("${relationAlias}".*) as "${relationAlias}"`;
934
+ }
935
+ }
936
+ });
937
+ }
938
+ let query = `SELECT ${options.distinct ? 'DISTINCT ' : ''}${selectColumns} FROM "${options.table}"`;
939
+ // JOIN clauses for includes
940
+ if (hasIncludes) {
941
+ const includes = Array.isArray(options.include) ? options.include : [options.include];
942
+ includes.forEach((include) => {
943
+ const { joinClause } = this.buildIncludeJoin(options.table, include);
944
+ query += ` ${joinClause}`;
945
+ });
946
+ }
947
+ // WHERE clause
948
+ if (options.where) {
949
+ const { clause, values } = this.buildWhereClause(options.where, paramIndex);
950
+ query += ` WHERE ${clause}`;
951
+ params.push(...values);
952
+ paramIndex += values.length;
953
+ }
954
+ // GROUP BY clause
955
+ if (options.groupBy && options.groupBy.length > 0) {
956
+ query += ` GROUP BY ${options.groupBy.map((col) => `"${col}"`).join(', ')}`;
957
+ }
958
+ else if (hasIncludes) {
959
+ // Auto group by main table primary key for one-to-many relations
960
+ const includes = Array.isArray(options.include) ? options.include : [options.include];
961
+ const hasOneToMany = includes.some(inc => inc.type === 'one-to-many');
962
+ if (hasOneToMany) {
963
+ query += ` GROUP BY "${options.table}"."id"`;
964
+ }
965
+ }
966
+ // HAVING clause
967
+ if (options.having) {
968
+ const { clause, values } = this.buildWhereClause(options.having, paramIndex);
969
+ query += ` HAVING ${clause}`;
970
+ params.push(...values);
971
+ paramIndex += values.length;
972
+ }
973
+ // ORDER BY clause
974
+ if (options.orderBy) {
975
+ const orderByArray = Array.isArray(options.orderBy) ? options.orderBy : [options.orderBy];
976
+ const orderClauses = orderByArray.map((order) => `"${options.table}"."${order.column}" ${order.order || 'ASC'}`);
977
+ query += ` ORDER BY ${orderClauses.join(', ')}`;
978
+ }
979
+ // LIMIT clause
980
+ if (options.limit) {
981
+ query += ` LIMIT $${paramIndex++}`;
982
+ params.push(options.limit);
983
+ }
984
+ // OFFSET clause
985
+ if (options.offset) {
986
+ query += ` OFFSET $${paramIndex++}`;
987
+ params.push(options.offset);
988
+ }
989
+ return { query, params };
990
+ }
991
+ /**
992
+ * Build JOIN clause for include relationships
993
+ */
994
+ buildIncludeJoin(mainTable, include) {
995
+ const relationTable = include.relation;
996
+ const foreignKey = include.foreignKey || `${relationTable}_id`;
997
+ const primaryKey = include.primaryKey || 'id';
998
+ const joinType = include.type === 'one-to-many' || include.type === 'one-to-one' ? 'LEFT' : 'INNER';
999
+ let joinClause;
1000
+ if (include.type === 'many-to-many' && include.through) {
1001
+ // Many-to-many with junction table
1002
+ const throughTable = include.through;
1003
+ const throughForeignKey = include.throughForeignKey || `${mainTable}_id`;
1004
+ const throughRelatedKey = include.throughRelatedKey || `${relationTable}_id`;
1005
+ joinClause = `${joinType} JOIN "${throughTable}" ON "${mainTable}"."${primaryKey}" = "${throughTable}"."${throughForeignKey}" `;
1006
+ joinClause += `${joinType} JOIN "${relationTable}" ON "${throughTable}"."${throughRelatedKey}" = "${relationTable}"."${primaryKey}"`;
1007
+ }
1008
+ else if (include.type === 'one-to-many') {
1009
+ // One-to-many: foreign key is in the related table
1010
+ joinClause = `${joinType} JOIN "${relationTable}" ON "${mainTable}"."${primaryKey}" = "${relationTable}"."${foreignKey}"`;
1011
+ }
1012
+ else {
1013
+ // Many-to-one or one-to-one: foreign key is in the main table
1014
+ joinClause = `${joinType} JOIN "${relationTable}" ON "${mainTable}"."${foreignKey}" = "${relationTable}"."${primaryKey}"`;
1015
+ }
1016
+ // Add where clause for the relation if specified
1017
+ if (include.where) {
1018
+ const { clause } = this.buildWhereClause(include.where, 1);
1019
+ joinClause += ` AND ${clause}`;
1020
+ }
1021
+ return { joinClause };
1022
+ }
1023
+ /**
1024
+ * Build INSERT query from options
1025
+ */
1026
+ buildInsertQuery(options) {
1027
+ const dataArray = Array.isArray(options.data) ? options.data : [options.data];
1028
+ const columns = Object.keys(dataArray[0]);
1029
+ const params = [];
1030
+ let paramIndex = 1;
1031
+ let query = `INSERT INTO "${options.table}" (${columns.map((col) => `"${col}"`).join(', ')}) VALUES `;
1032
+ const valuesClauses = [];
1033
+ dataArray.forEach((data) => {
1034
+ const valuePlaceholders = columns.map(() => `$${paramIndex++}`);
1035
+ valuesClauses.push(`(${valuePlaceholders.join(', ')})`);
1036
+ params.push(...columns.map((col) => data[col]));
1037
+ });
1038
+ query += valuesClauses.join(', ');
1039
+ if (options.returning) {
1040
+ const returningColumns = Array.isArray(options.returning)
1041
+ ? options.returning.map((col) => `"${col}"`).join(', ')
1042
+ : '*';
1043
+ query += ` RETURNING ${returningColumns}`;
1044
+ }
1045
+ return { query, params };
1046
+ }
1047
+ /**
1048
+ * Build UPDATE query from options
1049
+ */
1050
+ buildUpdateQuery(options) {
1051
+ const params = [];
1052
+ let paramIndex = 1;
1053
+ const setClauses = Object.keys(options.data).map((key) => {
1054
+ params.push(options.data[key]);
1055
+ return `"${key}" = $${paramIndex++}`;
1056
+ });
1057
+ let query = `UPDATE "${options.table}" SET ${setClauses.join(', ')}`;
1058
+ if (options.where) {
1059
+ const { clause, values } = this.buildWhereClause(options.where, paramIndex);
1060
+ query += ` WHERE ${clause}`;
1061
+ params.push(...values);
1062
+ }
1063
+ if (options.returning) {
1064
+ const returningColumns = Array.isArray(options.returning)
1065
+ ? options.returning.map((col) => `"${col}"`).join(', ')
1066
+ : '*';
1067
+ query += ` RETURNING ${returningColumns}`;
1068
+ }
1069
+ return { query, params };
1070
+ }
1071
+ /**
1072
+ * Build DELETE query from options
1073
+ */
1074
+ buildDeleteQuery(options) {
1075
+ const params = [];
1076
+ let paramIndex = 1;
1077
+ let query = `DELETE FROM "${options.table}"`;
1078
+ if (options.where) {
1079
+ const { clause, values } = this.buildWhereClause(options.where, paramIndex);
1080
+ query += ` WHERE ${clause}`;
1081
+ params.push(...values);
1082
+ }
1083
+ if (options.returning) {
1084
+ const returningColumns = Array.isArray(options.returning)
1085
+ ? options.returning.map((col) => `"${col}"`).join(', ')
1086
+ : '*';
1087
+ query += ` RETURNING ${returningColumns}`;
1088
+ }
1089
+ return { query, params };
1090
+ }
1091
+ /**
1092
+ * Build UPSERT (INSERT ... ON CONFLICT) query from options
1093
+ */
1094
+ buildUpsertQuery(options) {
1095
+ // Upsert only works with single records
1096
+ const data = Array.isArray(options.data) ? options.data[0] : options.data;
1097
+ const columns = Object.keys(data);
1098
+ const params = [];
1099
+ let paramIndex = 1;
1100
+ let query = `INSERT INTO "${options.table}" (${columns.map((col) => `"${col}"`).join(', ')}) VALUES (`;
1101
+ query += columns.map(() => `$${paramIndex++}`).join(', ');
1102
+ params.push(...columns.map((col) => data[col]));
1103
+ query += `) ON CONFLICT (${options.uniqueColumns.map((col) => `"${col}"`).join(', ')}) DO UPDATE SET `;
1104
+ const updateClauses = columns
1105
+ .filter((col) => !options.uniqueColumns.includes(col))
1106
+ .map((col) => `"${col}" = EXCLUDED."${col}"`);
1107
+ query += updateClauses.join(', ');
1108
+ if (options.returning) {
1109
+ const returningColumns = Array.isArray(options.returning)
1110
+ ? options.returning.map((col) => `"${col}"`).join(', ')
1111
+ : '*';
1112
+ query += ` RETURNING ${returningColumns}`;
1113
+ }
1114
+ return { query, params };
1115
+ }
1116
+ /**
1117
+ * Build COUNT query from options
1118
+ */
1119
+ buildCountQuery(options) {
1120
+ const params = [];
1121
+ let paramIndex = 1;
1122
+ const column = options.column || '*';
1123
+ let query = `SELECT COUNT(${column === '*' ? '*' : `"${column}"`}) as count FROM "${options.table}"`;
1124
+ if (options.where) {
1125
+ const { clause, values } = this.buildWhereClause(options.where, paramIndex);
1126
+ query += ` WHERE ${clause}`;
1127
+ params.push(...values);
1128
+ }
1129
+ return { query, params };
1130
+ }
1131
+ /**
1132
+ * Build aggregate query (SUM, AVG, MIN, MAX)
1133
+ */
1134
+ buildAggregateQuery(func, column, options) {
1135
+ const params = [];
1136
+ let paramIndex = 1;
1137
+ let query = `SELECT ${func}("${column}") as result FROM "${options.table}"`;
1138
+ if (options.where) {
1139
+ const { clause, values } = this.buildWhereClause(options.where, paramIndex);
1140
+ query += ` WHERE ${clause}`;
1141
+ params.push(...values);
1142
+ }
1143
+ return { query, params };
1144
+ }
1145
+ /**
1146
+ * Build GROUP BY query
1147
+ */
1148
+ buildGroupByQuery(options) {
1149
+ const params = [];
1150
+ let paramIndex = 1;
1151
+ const groupColumns = options.groupBy.map((col) => `"${col}"`);
1152
+ const selectColumns = [...groupColumns];
1153
+ // Build aggregations
1154
+ if (options.aggregate) {
1155
+ Object.entries(options.aggregate).forEach(([alias, agg]) => {
1156
+ const aggObj = agg;
1157
+ if (aggObj.$COUNT !== undefined) {
1158
+ const column = aggObj.$COUNT === '*' ? '*' : `"${aggObj.$COUNT}"`;
1159
+ selectColumns.push(`COUNT(${column}) AS "${alias}"`);
1160
+ }
1161
+ else if (aggObj.$SUM !== undefined) {
1162
+ selectColumns.push(`SUM("${aggObj.$SUM}") AS "${alias}"`);
1163
+ }
1164
+ else if (aggObj.$AVG !== undefined) {
1165
+ selectColumns.push(`AVG("${aggObj.$AVG}") AS "${alias}"`);
1166
+ }
1167
+ else if (aggObj.$MIN !== undefined) {
1168
+ selectColumns.push(`MIN("${aggObj.$MIN}") AS "${alias}"`);
1169
+ }
1170
+ else if (aggObj.$MAX !== undefined) {
1171
+ selectColumns.push(`MAX("${aggObj.$MAX}") AS "${alias}"`);
1172
+ }
1173
+ else if (aggObj.$STRING_AGG !== undefined) {
1174
+ selectColumns.push(`STRING_AGG("${aggObj.$STRING_AGG}", ', ') AS "${alias}"`);
1175
+ }
1176
+ else if (aggObj.$ARRAY_AGG !== undefined) {
1177
+ selectColumns.push(`ARRAY_AGG("${aggObj.$ARRAY_AGG}") AS "${alias}"`);
1178
+ }
1179
+ });
1180
+ }
1181
+ let query = `SELECT ${selectColumns.join(', ')} FROM "${options.table}"`;
1182
+ if (options.where) {
1183
+ const { clause, values } = this.buildWhereClause(options.where, paramIndex);
1184
+ query += ` WHERE ${clause}`;
1185
+ params.push(...values);
1186
+ paramIndex += values.length;
1187
+ }
1188
+ query += ` GROUP BY ${groupColumns.join(', ')}`;
1189
+ if (options.having) {
1190
+ const { clause, values } = this.buildWhereClause(options.having, paramIndex);
1191
+ query += ` HAVING ${clause}`;
1192
+ params.push(...values);
1193
+ }
1194
+ return { query, params };
1195
+ }
1196
+ /**
1197
+ * Build multi-aggregate query
1198
+ */
1199
+ buildMultiAggregateQuery(options) {
1200
+ const params = [];
1201
+ let paramIndex = 1;
1202
+ const aggregations = Object.entries(options.operations).map(([alias, agg]) => {
1203
+ const aggObj = agg;
1204
+ if (aggObj.$COUNT !== undefined) {
1205
+ const column = aggObj.$COUNT === '*' ? '*' : `"${aggObj.$COUNT}"`;
1206
+ return `COUNT(${column}) AS "${alias}"`;
1207
+ }
1208
+ if (aggObj.$SUM !== undefined) {
1209
+ return `SUM("${aggObj.$SUM}") AS "${alias}"`;
1210
+ }
1211
+ if (aggObj.$AVG !== undefined) {
1212
+ return `AVG("${aggObj.$AVG}") AS "${alias}"`;
1213
+ }
1214
+ if (aggObj.$MIN !== undefined) {
1215
+ return `MIN("${aggObj.$MIN}") AS "${alias}"`;
1216
+ }
1217
+ if (aggObj.$MAX !== undefined) {
1218
+ return `MAX("${aggObj.$MAX}") AS "${alias}"`;
1219
+ }
1220
+ if (aggObj.$STRING_AGG !== undefined) {
1221
+ return `STRING_AGG("${aggObj.$STRING_AGG}", ', ') AS "${alias}"`;
1222
+ }
1223
+ if (aggObj.$ARRAY_AGG !== undefined) {
1224
+ return `ARRAY_AGG("${aggObj.$ARRAY_AGG}") AS "${alias}"`;
1225
+ }
1226
+ throw new database_types_1.DatabaseError(database_types_1.DatabaseErrorType.VALIDATION_ERROR, `Invalid aggregation operation for alias "${alias}". Use format: { $COUNT: '*' }, { $SUM: 'column' }, etc.`);
1227
+ });
1228
+ let query = `SELECT ${aggregations.join(', ')} FROM "${options.table}"`;
1229
+ if (options.where) {
1230
+ const { clause, values } = this.buildWhereClause(options.where, paramIndex);
1231
+ query += ` WHERE ${clause}`;
1232
+ params.push(...values);
1233
+ paramIndex += values.length;
1234
+ }
1235
+ if (options.groupBy && options.groupBy.length > 0) {
1236
+ const groupCols = options.groupBy.map(col => `"${col}"`).join(', ');
1237
+ query += ` GROUP BY ${groupCols}`;
1238
+ }
1239
+ if (options.having) {
1240
+ const { clause, values } = this.buildWhereClause(options.having, paramIndex);
1241
+ query += ` HAVING ${clause}`;
1242
+ params.push(...values);
1243
+ }
1244
+ return { query, params };
1245
+ }
1246
+ /**
1247
+ * Build WHERE clause from WhereClause object
1248
+ * Supports both simplified syntax (GT, LT, AND, OR) and legacy syntax ($gt, $lt, $and, $or)
1249
+ */
1250
+ buildWhereClause(where, startIndex = 1) {
1251
+ const values = [];
1252
+ let paramIndex = startIndex;
1253
+ const buildCondition = (condition) => {
1254
+ if (typeof condition !== 'object' || condition === null) {
1255
+ values.push(condition);
1256
+ return `$${paramIndex++}`;
1257
+ }
1258
+ // Handle logical operators (supports $AND, AND, and legacy $and)
1259
+ if (condition.$AND || condition.AND || condition.$and) {
1260
+ const andConditions = condition.$AND || condition.AND || condition.$and;
1261
+ if (typeof andConditions === 'object' && !Array.isArray(andConditions)) {
1262
+ // New syntax: { $AND: { col1: val1, col2: val2 } }
1263
+ return buildCondition(andConditions);
1264
+ }
1265
+ else {
1266
+ // Legacy syntax: { $and: [cond1, cond2] }
1267
+ const subConditions = andConditions.map(buildCondition);
1268
+ return `(${subConditions.join(' AND ')})`;
1269
+ }
1270
+ }
1271
+ if (condition.$OR || condition.OR || condition.$or) {
1272
+ const orConditions = condition.$OR || condition.OR || condition.$or;
1273
+ if (typeof orConditions === 'object' && !Array.isArray(orConditions)) {
1274
+ // New syntax: { $OR: { col1: val1, col2: val2 } }
1275
+ const subClauses = [];
1276
+ for (const [key, value] of Object.entries(orConditions)) {
1277
+ if (key === '$AND' || key === 'AND' || key === '$and' || key === '$OR' || key === 'OR' || key === '$or') {
1278
+ subClauses.push(buildCondition({ [key]: value }));
1279
+ }
1280
+ else {
1281
+ subClauses.push(buildCondition({ [key]: value }));
1282
+ }
1283
+ }
1284
+ return `(${subClauses.join(' OR ')})`;
1285
+ }
1286
+ else {
1287
+ // Legacy syntax: { $or: [cond1, cond2] }
1288
+ const subConditions = orConditions.map(buildCondition);
1289
+ return `(${subConditions.join(' OR ')})`;
1290
+ }
1291
+ }
1292
+ // Handle column conditions
1293
+ const conditions = [];
1294
+ for (const [key, value] of Object.entries(condition)) {
1295
+ // Skip logical operators
1296
+ if (key === '$AND' || key === 'AND' || key === '$and' || key === '$OR' || key === 'OR' || key === '$or') {
1297
+ continue;
1298
+ }
1299
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
1300
+ // Handle comparison operators
1301
+ for (const [op, opValue] of Object.entries(value)) {
1302
+ switch (op) {
1303
+ // Preferred $-prefixed syntax
1304
+ case '$GT':
1305
+ case 'GT':
1306
+ case '$gt':
1307
+ values.push(opValue);
1308
+ conditions.push(`"${key}" > $${paramIndex++}`);
1309
+ break;
1310
+ case '$GTE':
1311
+ case 'GTE':
1312
+ case '$gte':
1313
+ values.push(opValue);
1314
+ conditions.push(`"${key}" >= $${paramIndex++}`);
1315
+ break;
1316
+ case '$LT':
1317
+ case 'LT':
1318
+ case '$lt':
1319
+ values.push(opValue);
1320
+ conditions.push(`"${key}" < $${paramIndex++}`);
1321
+ break;
1322
+ case '$LTE':
1323
+ case 'LTE':
1324
+ case '$lte':
1325
+ values.push(opValue);
1326
+ conditions.push(`"${key}" <= $${paramIndex++}`);
1327
+ break;
1328
+ case '$NE':
1329
+ case '$NOT':
1330
+ case 'NE':
1331
+ case 'NOT':
1332
+ case '$ne':
1333
+ values.push(opValue);
1334
+ conditions.push(`"${key}" != $${paramIndex++}`);
1335
+ break;
1336
+ case '$IN':
1337
+ case 'IN':
1338
+ case '$in':
1339
+ values.push(opValue);
1340
+ conditions.push(`"${key}" = ANY($${paramIndex++})`);
1341
+ break;
1342
+ case '$NOT_IN':
1343
+ case 'NOT_IN':
1344
+ case '$nin':
1345
+ values.push(opValue);
1346
+ conditions.push(`"${key}" != ANY($${paramIndex++})`);
1347
+ break;
1348
+ case '$LIKE':
1349
+ case 'LIKE':
1350
+ case '$like':
1351
+ values.push(opValue);
1352
+ conditions.push(`"${key}" LIKE $${paramIndex++}`);
1353
+ break;
1354
+ case '$ILIKE':
1355
+ case 'ILIKE':
1356
+ case '$ilike':
1357
+ values.push(opValue);
1358
+ conditions.push(`"${key}" ILIKE $${paramIndex++}`);
1359
+ break;
1360
+ case '$IS_NULL':
1361
+ case 'IS_NULL':
1362
+ case '$null':
1363
+ conditions.push(`"${key}" IS NULL`);
1364
+ break;
1365
+ case '$IS_NOT_NULL':
1366
+ case 'IS_NOT_NULL':
1367
+ case '$notNull':
1368
+ conditions.push(`"${key}" IS NOT NULL`);
1369
+ break;
1370
+ case '$BETWEEN':
1371
+ case 'BETWEEN':
1372
+ case '$between':
1373
+ if (Array.isArray(opValue) && opValue.length === 2) {
1374
+ values.push(opValue[0], opValue[1]);
1375
+ conditions.push(`"${key}" BETWEEN $${paramIndex++} AND $${paramIndex++}`);
1376
+ }
1377
+ break;
1378
+ }
1379
+ }
1380
+ }
1381
+ else {
1382
+ // Simple equality
1383
+ values.push(value);
1384
+ conditions.push(`"${key}" = $${paramIndex++}`);
1385
+ }
1386
+ }
1387
+ return conditions.join(' AND ');
1388
+ };
1389
+ const clause = buildCondition(where);
1390
+ return { clause, values };
1391
+ }
1392
+ /**
1393
+ * Build CREATE TABLE query
1394
+ */
1395
+ buildCreateTableQuery(schema, options) {
1396
+ const columnDefs = schema.columns.map((col) => {
1397
+ let def = `"${col.name}" ${this.mapColumnTypeToPostgreSQL(col.type)}`;
1398
+ if (col.length) {
1399
+ def += `(${col.length})`;
1400
+ }
1401
+ else if (col.precision && col.scale) {
1402
+ def += `(${col.precision}, ${col.scale})`;
1403
+ }
1404
+ else if (col.precision) {
1405
+ def += `(${col.precision})`;
1406
+ }
1407
+ if (col.primaryKey) {
1408
+ def += ' PRIMARY KEY';
1409
+ }
1410
+ if (col.unique) {
1411
+ def += ' UNIQUE';
1412
+ }
1413
+ if (!col.nullable && !col.primaryKey) {
1414
+ def += ' NOT NULL';
1415
+ }
1416
+ if (col.defaultValue !== undefined) {
1417
+ def += ` DEFAULT ${col.defaultValue}`;
1418
+ }
1419
+ if (col.autoIncrement) {
1420
+ def = `"${col.name}" SERIAL PRIMARY KEY`;
1421
+ }
1422
+ return def;
1423
+ });
1424
+ let query = `CREATE TABLE ${(options === null || options === void 0 ? void 0 : options.ifNotExists) ? 'IF NOT EXISTS ' : ''}"${schema.name}" (${columnDefs.join(', ')})`;
1425
+ return query;
1426
+ }
1427
+ /**
1428
+ * Build ALTER TABLE queries
1429
+ */
1430
+ buildAlterTableQueries(tableName, alterations) {
1431
+ return alterations.map((alt) => {
1432
+ let query = `ALTER TABLE "${tableName}" `;
1433
+ switch (alt.type) {
1434
+ case schema_types_1.ColumnAlterationType.ADD:
1435
+ query += `ADD COLUMN "${alt.column.name}" ${this.mapColumnTypeToPostgreSQL(alt.column.type)}`;
1436
+ if (!alt.column.nullable) {
1437
+ query += ' NOT NULL';
1438
+ }
1439
+ break;
1440
+ case schema_types_1.ColumnAlterationType.DROP:
1441
+ query += `DROP COLUMN "${alt.oldName}"`;
1442
+ break;
1443
+ case schema_types_1.ColumnAlterationType.MODIFY:
1444
+ query += `ALTER COLUMN "${alt.column.name}" TYPE ${this.mapColumnTypeToPostgreSQL(alt.column.type)}`;
1445
+ break;
1446
+ case schema_types_1.ColumnAlterationType.RENAME:
1447
+ query += `RENAME COLUMN "${alt.oldName}" TO "${alt.newName}"`;
1448
+ break;
1449
+ }
1450
+ return query;
1451
+ });
1452
+ }
1453
+ /**
1454
+ * Build CREATE INDEX query
1455
+ */
1456
+ buildCreateIndexQuery(options) {
1457
+ const unique = options.index.unique ? 'UNIQUE ' : '';
1458
+ const columns = options.index.columns.map((col) => `"${col.name}"`).join(', ');
1459
+ return `CREATE ${unique}INDEX ${options.ifNotExists ? 'IF NOT EXISTS ' : ''}"${options.index.name}" ON "${options.table}" (${columns})`;
1460
+ }
1461
+ /**
1462
+ * Map ColumnType to PostgreSQL type
1463
+ */
1464
+ mapColumnTypeToPostgreSQL(type) {
1465
+ const typeMap = {
1466
+ [schema_types_1.ColumnType.STRING]: 'VARCHAR',
1467
+ [schema_types_1.ColumnType.TEXT]: 'TEXT',
1468
+ [schema_types_1.ColumnType.VARCHAR]: 'VARCHAR',
1469
+ [schema_types_1.ColumnType.CHAR]: 'CHAR',
1470
+ [schema_types_1.ColumnType.INTEGER]: 'INTEGER',
1471
+ [schema_types_1.ColumnType.BIGINT]: 'BIGINT',
1472
+ [schema_types_1.ColumnType.SMALLINT]: 'SMALLINT',
1473
+ [schema_types_1.ColumnType.DECIMAL]: 'DECIMAL',
1474
+ [schema_types_1.ColumnType.NUMERIC]: 'NUMERIC',
1475
+ [schema_types_1.ColumnType.FLOAT]: 'REAL',
1476
+ [schema_types_1.ColumnType.DOUBLE]: 'DOUBLE PRECISION',
1477
+ [schema_types_1.ColumnType.REAL]: 'REAL',
1478
+ [schema_types_1.ColumnType.BOOLEAN]: 'BOOLEAN',
1479
+ [schema_types_1.ColumnType.DATE]: 'DATE',
1480
+ [schema_types_1.ColumnType.TIME]: 'TIME',
1481
+ [schema_types_1.ColumnType.DATETIME]: 'TIMESTAMP',
1482
+ [schema_types_1.ColumnType.TIMESTAMP]: 'TIMESTAMP',
1483
+ [schema_types_1.ColumnType.JSON]: 'JSONB',
1484
+ [schema_types_1.ColumnType.JSONB]: 'JSONB',
1485
+ [schema_types_1.ColumnType.UUID]: 'UUID',
1486
+ [schema_types_1.ColumnType.BLOB]: 'BYTEA',
1487
+ [schema_types_1.ColumnType.BINARY]: 'BYTEA',
1488
+ [schema_types_1.ColumnType.ARRAY]: 'ARRAY',
1489
+ [schema_types_1.ColumnType.OBJECT]: 'JSONB',
1490
+ [schema_types_1.ColumnType.ENUM]: 'VARCHAR',
1491
+ };
1492
+ return typeMap[type] || 'TEXT';
1493
+ }
1494
+ /**
1495
+ * Map PostgreSQL type to ColumnType
1496
+ */
1497
+ mapPostgreSQLTypeToColumnType(pgType) {
1498
+ const typeMap = {
1499
+ 'character varying': schema_types_1.ColumnType.VARCHAR,
1500
+ varchar: schema_types_1.ColumnType.VARCHAR,
1501
+ text: schema_types_1.ColumnType.TEXT,
1502
+ character: schema_types_1.ColumnType.CHAR,
1503
+ char: schema_types_1.ColumnType.CHAR,
1504
+ integer: schema_types_1.ColumnType.INTEGER,
1505
+ bigint: schema_types_1.ColumnType.BIGINT,
1506
+ smallint: schema_types_1.ColumnType.SMALLINT,
1507
+ decimal: schema_types_1.ColumnType.DECIMAL,
1508
+ numeric: schema_types_1.ColumnType.NUMERIC,
1509
+ real: schema_types_1.ColumnType.FLOAT,
1510
+ 'double precision': schema_types_1.ColumnType.DOUBLE,
1511
+ boolean: schema_types_1.ColumnType.BOOLEAN,
1512
+ date: schema_types_1.ColumnType.DATE,
1513
+ time: schema_types_1.ColumnType.TIME,
1514
+ timestamp: schema_types_1.ColumnType.TIMESTAMP,
1515
+ 'timestamp without time zone': schema_types_1.ColumnType.TIMESTAMP,
1516
+ jsonb: schema_types_1.ColumnType.JSONB,
1517
+ json: schema_types_1.ColumnType.JSON,
1518
+ uuid: schema_types_1.ColumnType.UUID,
1519
+ bytea: schema_types_1.ColumnType.BINARY,
1520
+ };
1521
+ return typeMap[pgType.toLowerCase()] || schema_types_1.ColumnType.TEXT;
1522
+ }
1523
+ /**
1524
+ * Ensure migration table exists
1525
+ */
1526
+ async ensureMigrationTable(client) {
1527
+ const query = `
1528
+ CREATE TABLE IF NOT EXISTS _ductape_migrations (
1529
+ tag VARCHAR(255) PRIMARY KEY,
1530
+ name VARCHAR(255) NOT NULL,
1531
+ executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
1532
+ )
1533
+ `;
1534
+ await client.query(query);
1535
+ }
1536
+ /**
1537
+ * Record migration execution
1538
+ */
1539
+ async recordMigration(client, migration, direction) {
1540
+ await this.ensureMigrationTable(client);
1541
+ const query = `
1542
+ INSERT INTO _ductape_migrations (tag, name, executed_at)
1543
+ VALUES ($1, $2, CURRENT_TIMESTAMP)
1544
+ ON CONFLICT (tag) DO UPDATE SET executed_at = CURRENT_TIMESTAMP
1545
+ `;
1546
+ await client.query(query, [migration.tag, migration.name]);
1547
+ }
1548
+ /**
1549
+ * Remove migration from history
1550
+ */
1551
+ async removeMigration(client, tag) {
1552
+ await this.ensureMigrationTable(client);
1553
+ const query = `DELETE FROM _ductape_migrations WHERE tag = $1`;
1554
+ await client.query(query, [tag]);
1555
+ }
1556
+ // ==================== Utility Methods ====================
1557
+ /**
1558
+ * Escape identifier (table/column name)
1559
+ */
1560
+ escapeIdentifier(identifier) {
1561
+ return `"${identifier.replace(/"/g, '""')}"`;
1562
+ }
1563
+ /**
1564
+ * Escape value for SQL
1565
+ */
1566
+ escapeValue(value) {
1567
+ if (value === null || value === undefined) {
1568
+ return 'NULL';
1569
+ }
1570
+ if (typeof value === 'string') {
1571
+ return `'${value.replace(/'/g, "''")}'`;
1572
+ }
1573
+ if (typeof value === 'boolean') {
1574
+ return value ? 'TRUE' : 'FALSE';
1575
+ }
1576
+ if (value instanceof Date) {
1577
+ return `'${value.toISOString()}'`;
1578
+ }
1579
+ if (Array.isArray(value)) {
1580
+ return `ARRAY[${value.map((v) => this.escapeValue(v)).join(', ')}]`;
1581
+ }
1582
+ if (typeof value === 'object') {
1583
+ return `'${JSON.stringify(value)}'::jsonb`;
1584
+ }
1585
+ return String(value);
1586
+ }
1587
+ /**
1588
+ * Get database version
1589
+ */
1590
+ async getDatabaseVersion(connection) {
1591
+ var _a;
1592
+ try {
1593
+ const pool = connection.getClient();
1594
+ const result = await pool.query('SELECT version()');
1595
+ return ((_a = result.rows[0]) === null || _a === void 0 ? void 0 : _a.version) || 'Unknown';
1596
+ }
1597
+ catch (error) {
1598
+ return 'Unknown';
1599
+ }
1600
+ }
1601
+ }
1602
+ exports.PostgreSQLAdapter = PostgreSQLAdapter;
1603
+ //# sourceMappingURL=postgresql.adapter.js.map