@ductape/sdk 0.0.4-v9 → 0.0.4-v90

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 (998) hide show
  1. package/dist/agents/agent-context.d.ts +98 -0
  2. package/dist/agents/agent-context.js +588 -0
  3. package/dist/agents/agent-context.js.map +1 -0
  4. package/dist/agents/agent-executor.d.ts +180 -0
  5. package/dist/agents/agent-executor.js +715 -0
  6. package/dist/agents/agent-executor.js.map +1 -0
  7. package/dist/agents/agents.service.d.ts +310 -0
  8. package/dist/agents/agents.service.js +1249 -0
  9. package/dist/agents/agents.service.js.map +1 -0
  10. package/dist/agents/index.d.ts +55 -0
  11. package/dist/agents/index.js +110 -0
  12. package/dist/agents/index.js.map +1 -0
  13. package/dist/agents/memory-manager.d.ts +182 -0
  14. package/dist/agents/memory-manager.js +383 -0
  15. package/dist/agents/memory-manager.js.map +1 -0
  16. package/dist/agents/tool-registry.d.ts +141 -0
  17. package/dist/agents/tool-registry.js +355 -0
  18. package/dist/agents/tool-registry.js.map +1 -0
  19. package/dist/agents/types/agents.types.d.ts +1227 -0
  20. package/dist/agents/types/agents.types.js +12 -0
  21. package/dist/agents/types/agents.types.js.map +1 -0
  22. package/dist/agents/types/index.d.ts +6 -0
  23. package/dist/agents/types/index.js +23 -0
  24. package/dist/agents/types/index.js.map +1 -0
  25. package/dist/agents/vector-store-adapter.d.ts +108 -0
  26. package/dist/agents/vector-store-adapter.js +213 -0
  27. package/dist/agents/vector-store-adapter.js.map +1 -0
  28. package/dist/api/services/appApi.service.d.ts +51 -5
  29. package/dist/api/services/appApi.service.js +101 -3
  30. package/dist/api/services/appApi.service.js.map +1 -1
  31. package/dist/api/services/pricingApi.service.d.ts +10 -0
  32. package/dist/api/services/pricingApi.service.js +34 -0
  33. package/dist/api/services/pricingApi.service.js.map +1 -0
  34. package/dist/api/services/processorApi.service.d.ts +322 -0
  35. package/dist/api/services/processorApi.service.js +252 -0
  36. package/dist/api/services/processorApi.service.js.map +1 -1
  37. package/dist/api/services/productsApi.service.d.ts +105 -0
  38. package/dist/api/services/productsApi.service.js +139 -3
  39. package/dist/api/services/productsApi.service.js.map +1 -1
  40. package/dist/api/services/resilienceApi.service.d.ts +106 -0
  41. package/dist/api/services/resilienceApi.service.js +224 -0
  42. package/dist/api/services/resilienceApi.service.js.map +1 -0
  43. package/dist/api/services/secretsApi.service.d.ts +50 -0
  44. package/dist/api/services/secretsApi.service.js +124 -0
  45. package/dist/api/services/secretsApi.service.js.map +1 -0
  46. package/dist/api/services/workflowApi.service.d.ts +199 -0
  47. package/dist/api/services/workflowApi.service.js +183 -0
  48. package/dist/api/services/workflowApi.service.js.map +1 -0
  49. package/dist/api/services/workspaceApi.service.d.ts +8 -0
  50. package/dist/api/services/workspaceApi.service.js +20 -0
  51. package/dist/api/services/workspaceApi.service.js.map +1 -1
  52. package/dist/api/urls.d.ts +62 -0
  53. package/dist/api/urls.js +87 -17
  54. package/dist/api/urls.js.map +1 -1
  55. package/dist/api/utils/auth.utils.d.ts +1 -3
  56. package/dist/api/utils/auth.utils.js.map +1 -1
  57. package/dist/api/utils/cache.utils.d.ts +1 -1
  58. package/dist/api/utils/cache.utils.js +2 -2
  59. package/dist/api/utils/cache.utils.js.map +1 -1
  60. package/dist/api/utils/strings.utils.d.ts +2 -0
  61. package/dist/api/utils/strings.utils.js +14 -0
  62. package/dist/api/utils/strings.utils.js.map +1 -1
  63. package/dist/apps/services/app.service.d.ts +41 -33
  64. package/dist/apps/services/app.service.js +472 -184
  65. package/dist/apps/services/app.service.js.map +1 -1
  66. package/dist/apps/utils/auth-context-manager.d.ts +137 -0
  67. package/dist/apps/utils/auth-context-manager.js +248 -0
  68. package/dist/apps/utils/auth-context-manager.js.map +1 -0
  69. package/dist/apps/utils/credential-manager.d.ts +128 -0
  70. package/dist/apps/utils/credential-manager.js +199 -0
  71. package/dist/apps/utils/credential-manager.js.map +1 -0
  72. package/dist/apps/utils/index.d.ts +10 -0
  73. package/dist/apps/utils/index.js +54 -0
  74. package/dist/apps/utils/index.js.map +1 -0
  75. package/dist/apps/utils/input-helpers.d.ts +67 -0
  76. package/dist/apps/utils/input-helpers.js +185 -0
  77. package/dist/apps/utils/input-helpers.js.map +1 -0
  78. package/dist/apps/utils/input-resolver.d.ts +165 -0
  79. package/dist/apps/utils/input-resolver.js +477 -0
  80. package/dist/apps/utils/input-resolver.js.map +1 -0
  81. package/dist/apps/utils/oauth-manager.d.ts +196 -0
  82. package/dist/apps/utils/oauth-manager.js +429 -0
  83. package/dist/apps/utils/oauth-manager.js.map +1 -0
  84. package/dist/apps/validators/joi-validators/create.appAction.validator.d.ts +1 -2
  85. package/dist/apps/validators/joi-validators/create.appAction.validator.js +21 -2
  86. package/dist/apps/validators/joi-validators/create.appAction.validator.js.map +1 -1
  87. package/dist/apps/validators/joi-validators/update.appAction.validator.js +11 -1
  88. package/dist/apps/validators/joi-validators/update.appAction.validator.js.map +1 -1
  89. package/dist/apps/validators/joi-validators/update.appActionResponse.validator.d.ts +1 -1
  90. package/dist/apps/validators/joi-validators/update.appActionResponse.validator.js +34 -1
  91. package/dist/apps/validators/joi-validators/update.appActionResponse.validator.js.map +1 -1
  92. package/dist/bin.d.ts +26 -0
  93. package/dist/bin.js +28 -0
  94. package/dist/bin.js.map +1 -0
  95. package/dist/brokers/brokers.service.d.ts +297 -0
  96. package/dist/brokers/brokers.service.js +797 -0
  97. package/dist/brokers/brokers.service.js.map +1 -0
  98. package/dist/brokers/index.d.ts +46 -0
  99. package/dist/brokers/index.js +83 -0
  100. package/dist/brokers/index.js.map +1 -0
  101. package/dist/brokers/types/index.d.ts +316 -0
  102. package/dist/brokers/types/index.js +8 -0
  103. package/dist/brokers/types/index.js.map +1 -0
  104. package/dist/brokers/utils/broker.util.d.ts +33 -0
  105. package/dist/brokers/utils/broker.util.js +125 -0
  106. package/dist/brokers/utils/broker.util.js.map +1 -0
  107. package/dist/brokers/utils/providers/aws-sqs.service.d.ts +16 -0
  108. package/dist/brokers/utils/providers/aws-sqs.service.js +71 -0
  109. package/dist/brokers/utils/providers/aws-sqs.service.js.map +1 -0
  110. package/dist/brokers/utils/providers/google-pubsub.service.d.ts +16 -0
  111. package/dist/brokers/utils/providers/google-pubsub.service.js +43 -0
  112. package/dist/brokers/utils/providers/google-pubsub.service.js.map +1 -0
  113. package/dist/brokers/utils/providers/index.d.ts +6 -0
  114. package/dist/brokers/utils/providers/index.js +16 -0
  115. package/dist/brokers/utils/providers/index.js.map +1 -0
  116. package/dist/brokers/utils/providers/kafka.service.d.ts +23 -0
  117. package/dist/brokers/utils/providers/kafka.service.js +131 -0
  118. package/dist/brokers/utils/providers/kafka.service.js.map +1 -0
  119. package/dist/brokers/utils/providers/nats.service.d.ts +18 -0
  120. package/dist/brokers/utils/providers/nats.service.js +63 -0
  121. package/dist/brokers/utils/providers/nats.service.js.map +1 -0
  122. package/dist/brokers/utils/providers/rabbitmq.service.d.ts +15 -0
  123. package/dist/brokers/utils/providers/rabbitmq.service.js +151 -0
  124. package/dist/brokers/utils/providers/rabbitmq.service.js.map +1 -0
  125. package/dist/brokers/utils/providers/redis.service.d.ts +18 -0
  126. package/dist/brokers/utils/providers/redis.service.js +93 -0
  127. package/dist/brokers/utils/providers/redis.service.js.map +1 -0
  128. package/dist/cache/cache.manager.d.ts +229 -0
  129. package/dist/cache/cache.manager.js +460 -0
  130. package/dist/cache/cache.manager.js.map +1 -0
  131. package/dist/cache/cache.service.d.ts +186 -0
  132. package/dist/cache/cache.service.js +437 -0
  133. package/dist/cache/cache.service.js.map +1 -0
  134. package/dist/cache/index.d.ts +52 -0
  135. package/dist/cache/index.js +79 -0
  136. package/dist/cache/index.js.map +1 -0
  137. package/dist/cache/types/index.d.ts +106 -0
  138. package/dist/cache/types/index.js +6 -0
  139. package/dist/cache/types/index.js.map +1 -0
  140. package/dist/clients/pricing.client.d.ts +3 -0
  141. package/dist/clients/pricing.client.js +33 -0
  142. package/dist/clients/pricing.client.js.map +1 -0
  143. package/dist/database/actions/action-manager.d.ts +170 -0
  144. package/dist/database/actions/action-manager.js +465 -0
  145. package/dist/database/actions/action-manager.js.map +1 -0
  146. package/dist/database/actions/index.d.ts +6 -0
  147. package/dist/database/actions/index.js +13 -0
  148. package/dist/database/actions/index.js.map +1 -0
  149. package/dist/database/adapters/adapter.factory.d.ts +62 -0
  150. package/dist/database/adapters/adapter.factory.js +97 -0
  151. package/dist/database/adapters/adapter.factory.js.map +1 -0
  152. package/dist/database/adapters/base.adapter.d.ts +423 -0
  153. package/dist/database/adapters/base.adapter.js +260 -0
  154. package/dist/database/adapters/base.adapter.js.map +1 -0
  155. package/dist/database/adapters/cassandra.adapter.d.ts +92 -0
  156. package/dist/database/adapters/cassandra.adapter.js +1091 -0
  157. package/dist/database/adapters/cassandra.adapter.js.map +1 -0
  158. package/dist/database/adapters/dynamodb.adapter.d.ts +110 -0
  159. package/dist/database/adapters/dynamodb.adapter.js +1564 -0
  160. package/dist/database/adapters/dynamodb.adapter.js.map +1 -0
  161. package/dist/database/adapters/index.d.ts +11 -0
  162. package/dist/database/adapters/index.js +27 -0
  163. package/dist/database/adapters/index.js.map +1 -0
  164. package/dist/database/adapters/mariadb.adapter.d.ts +100 -0
  165. package/dist/database/adapters/mariadb.adapter.js +247 -0
  166. package/dist/database/adapters/mariadb.adapter.js.map +1 -0
  167. package/dist/database/adapters/mongodb.adapter.d.ts +121 -0
  168. package/dist/database/adapters/mongodb.adapter.js +1284 -0
  169. package/dist/database/adapters/mongodb.adapter.js.map +1 -0
  170. package/dist/database/adapters/mysql.adapter.d.ts +86 -0
  171. package/dist/database/adapters/mysql.adapter.js +1371 -0
  172. package/dist/database/adapters/mysql.adapter.js.map +1 -0
  173. package/dist/database/adapters/postgresql.adapter.d.ts +90 -0
  174. package/dist/database/adapters/postgresql.adapter.js +1487 -0
  175. package/dist/database/adapters/postgresql.adapter.js.map +1 -0
  176. package/dist/database/databases.service.d.ts +1408 -0
  177. package/dist/database/databases.service.js +2953 -0
  178. package/dist/database/databases.service.js.map +1 -0
  179. package/dist/database/index.d.ts +46 -0
  180. package/dist/database/index.js +109 -0
  181. package/dist/database/index.js.map +1 -0
  182. package/dist/database/migrations/index.d.ts +6 -0
  183. package/dist/database/migrations/index.js +12 -0
  184. package/dist/database/migrations/index.js.map +1 -0
  185. package/dist/database/migrations/migration-engine.d.ts +136 -0
  186. package/dist/database/migrations/migration-engine.js +1421 -0
  187. package/dist/database/migrations/migration-engine.js.map +1 -0
  188. package/dist/database/operators/aggregation-builder.d.ts +67 -0
  189. package/dist/database/operators/aggregation-builder.js +841 -0
  190. package/dist/database/operators/aggregation-builder.js.map +1 -0
  191. package/dist/database/operators/index.d.ts +7 -0
  192. package/dist/database/operators/index.js +15 -0
  193. package/dist/database/operators/index.js.map +1 -0
  194. package/dist/database/operators/query-builder.d.ts +69 -0
  195. package/dist/database/operators/query-builder.js +447 -0
  196. package/dist/database/operators/query-builder.js.map +1 -0
  197. package/dist/database/presave/decrypt.d.ts +25 -0
  198. package/dist/database/presave/decrypt.js +146 -0
  199. package/dist/database/presave/decrypt.js.map +1 -0
  200. package/dist/database/presave/index.d.ts +9 -0
  201. package/dist/database/presave/index.js +18 -0
  202. package/dist/database/presave/index.js.map +1 -0
  203. package/dist/database/presave/presave-processor.d.ts +148 -0
  204. package/dist/database/presave/presave-processor.js +702 -0
  205. package/dist/database/presave/presave-processor.js.map +1 -0
  206. package/dist/database/schema/index.d.ts +7 -0
  207. package/dist/database/schema/index.js +13 -0
  208. package/dist/database/schema/index.js.map +1 -0
  209. package/dist/database/schema/schema-manager.d.ts +258 -0
  210. package/dist/database/schema/schema-manager.js +638 -0
  211. package/dist/database/schema/schema-manager.js.map +1 -0
  212. package/dist/database/transactions/index.d.ts +6 -0
  213. package/dist/database/transactions/index.js +13 -0
  214. package/dist/database/transactions/index.js.map +1 -0
  215. package/dist/database/transactions/transaction-manager.d.ts +113 -0
  216. package/dist/database/transactions/transaction-manager.js +344 -0
  217. package/dist/database/transactions/transaction-manager.js.map +1 -0
  218. package/dist/database/triggers/index.d.ts +7 -0
  219. package/dist/database/triggers/index.js +14 -0
  220. package/dist/database/triggers/index.js.map +1 -0
  221. package/dist/database/triggers/trigger-processor.d.ts +239 -0
  222. package/dist/database/triggers/trigger-processor.js +1034 -0
  223. package/dist/database/triggers/trigger-processor.js.map +1 -0
  224. package/dist/database/types/action.interface.d.ts +148 -0
  225. package/dist/database/types/action.interface.js +6 -0
  226. package/dist/database/types/action.interface.js.map +1 -0
  227. package/dist/database/types/aggregation.interface.d.ts +185 -0
  228. package/dist/database/types/aggregation.interface.js +6 -0
  229. package/dist/database/types/aggregation.interface.js.map +1 -0
  230. package/dist/database/types/connection.interface.d.ts +137 -0
  231. package/dist/database/types/connection.interface.js +6 -0
  232. package/dist/database/types/connection.interface.js.map +1 -0
  233. package/dist/database/types/enums.d.ts +195 -0
  234. package/dist/database/types/enums.js +244 -0
  235. package/dist/database/types/enums.js.map +1 -0
  236. package/dist/database/types/index.d.ts +14 -0
  237. package/dist/database/types/index.js +31 -0
  238. package/dist/database/types/index.js.map +1 -0
  239. package/dist/database/types/migration.interface.d.ts +686 -0
  240. package/dist/database/types/migration.interface.js +9 -0
  241. package/dist/database/types/migration.interface.js.map +1 -0
  242. package/dist/database/types/presave.interface.d.ts +292 -0
  243. package/dist/database/types/presave.interface.js +60 -0
  244. package/dist/database/types/presave.interface.js.map +1 -0
  245. package/dist/database/types/query.interface.d.ts +205 -0
  246. package/dist/database/types/query.interface.js +6 -0
  247. package/dist/database/types/query.interface.js.map +1 -0
  248. package/dist/database/types/schema.interface.d.ts +412 -0
  249. package/dist/database/types/schema.interface.js +6 -0
  250. package/dist/database/types/schema.interface.js.map +1 -0
  251. package/dist/database/types/transaction.interface.d.ts +84 -0
  252. package/dist/database/types/transaction.interface.js +6 -0
  253. package/dist/database/types/transaction.interface.js.map +1 -0
  254. package/dist/database/types/trigger.interface.d.ts +612 -0
  255. package/dist/database/types/trigger.interface.js +121 -0
  256. package/dist/database/types/trigger.interface.js.map +1 -0
  257. package/dist/database/types/write.interface.d.ts +216 -0
  258. package/dist/database/types/write.interface.js +6 -0
  259. package/dist/database/types/write.interface.js.map +1 -0
  260. package/dist/database/utils/database-error.d.ts +96 -0
  261. package/dist/database/utils/database-error.js +221 -0
  262. package/dist/database/utils/database-error.js.map +1 -0
  263. package/dist/database/utils/index.d.ts +6 -0
  264. package/dist/database/utils/index.js +11 -0
  265. package/dist/database/utils/index.js.map +1 -0
  266. package/dist/graph/adapters/adapter.factory.d.ts +47 -0
  267. package/dist/graph/adapters/adapter.factory.js +77 -0
  268. package/dist/graph/adapters/adapter.factory.js.map +1 -0
  269. package/dist/graph/adapters/arangodb.adapter.d.ts +86 -0
  270. package/dist/graph/adapters/arangodb.adapter.js +1588 -0
  271. package/dist/graph/adapters/arangodb.adapter.js.map +1 -0
  272. package/dist/graph/adapters/base.adapter.d.ts +264 -0
  273. package/dist/graph/adapters/base.adapter.js +156 -0
  274. package/dist/graph/adapters/base.adapter.js.map +1 -0
  275. package/dist/graph/adapters/index.d.ts +11 -0
  276. package/dist/graph/adapters/index.js +21 -0
  277. package/dist/graph/adapters/index.js.map +1 -0
  278. package/dist/graph/adapters/memgraph.adapter.d.ts +110 -0
  279. package/dist/graph/adapters/memgraph.adapter.js +1452 -0
  280. package/dist/graph/adapters/memgraph.adapter.js.map +1 -0
  281. package/dist/graph/adapters/neo4j.adapter.d.ts +81 -0
  282. package/dist/graph/adapters/neo4j.adapter.js +1317 -0
  283. package/dist/graph/adapters/neo4j.adapter.js.map +1 -0
  284. package/dist/graph/adapters/neptune.adapter.d.ts +82 -0
  285. package/dist/graph/adapters/neptune.adapter.js +1369 -0
  286. package/dist/graph/adapters/neptune.adapter.js.map +1 -0
  287. package/dist/graph/graphs.service.d.ts +568 -0
  288. package/dist/graph/graphs.service.js +1948 -0
  289. package/dist/graph/graphs.service.js.map +1 -0
  290. package/dist/graph/index.d.ts +57 -0
  291. package/dist/graph/index.js +77 -0
  292. package/dist/graph/index.js.map +1 -0
  293. package/dist/graph/transactions/index.d.ts +4 -0
  294. package/dist/graph/transactions/index.js +9 -0
  295. package/dist/graph/transactions/index.js.map +1 -0
  296. package/dist/graph/transactions/transaction-manager.d.ts +61 -0
  297. package/dist/graph/transactions/transaction-manager.js +126 -0
  298. package/dist/graph/transactions/transaction-manager.js.map +1 -0
  299. package/dist/graph/types/connection.interface.d.ts +149 -0
  300. package/dist/graph/types/connection.interface.js +9 -0
  301. package/dist/graph/types/connection.interface.js.map +1 -0
  302. package/dist/graph/types/enums.d.ts +101 -0
  303. package/dist/graph/types/enums.js +114 -0
  304. package/dist/graph/types/enums.js.map +1 -0
  305. package/dist/graph/types/index.d.ts +13 -0
  306. package/dist/graph/types/index.js +20 -0
  307. package/dist/graph/types/index.js.map +1 -0
  308. package/dist/graph/types/node.interface.d.ts +248 -0
  309. package/dist/graph/types/node.interface.js +9 -0
  310. package/dist/graph/types/node.interface.js.map +1 -0
  311. package/dist/graph/types/query.interface.d.ts +175 -0
  312. package/dist/graph/types/query.interface.js +9 -0
  313. package/dist/graph/types/query.interface.js.map +1 -0
  314. package/dist/graph/types/relationship.interface.d.ts +207 -0
  315. package/dist/graph/types/relationship.interface.js +9 -0
  316. package/dist/graph/types/relationship.interface.js.map +1 -0
  317. package/dist/graph/types/schema.interface.d.ts +295 -0
  318. package/dist/graph/types/schema.interface.js +9 -0
  319. package/dist/graph/types/schema.interface.js.map +1 -0
  320. package/dist/graph/types/transaction.interface.d.ts +55 -0
  321. package/dist/graph/types/transaction.interface.js +9 -0
  322. package/dist/graph/types/transaction.interface.js.map +1 -0
  323. package/dist/graph/types/traversal.interface.d.ts +181 -0
  324. package/dist/graph/types/traversal.interface.js +9 -0
  325. package/dist/graph/types/traversal.interface.js.map +1 -0
  326. package/dist/graph/utils/graph-error.d.ts +71 -0
  327. package/dist/graph/utils/graph-error.js +142 -0
  328. package/dist/graph/utils/graph-error.js.map +1 -0
  329. package/dist/graph/utils/index.d.ts +4 -0
  330. package/dist/graph/utils/index.js +9 -0
  331. package/dist/graph/utils/index.js.map +1 -0
  332. package/dist/imports/imports.service.d.ts +3 -3
  333. package/dist/imports/imports.service.js +8 -7
  334. package/dist/imports/imports.service.js.map +1 -1
  335. package/dist/imports/imports.types.d.ts +8 -0
  336. package/dist/imports/repos/openApi.repo.d.ts +1 -1
  337. package/dist/imports/repos/openApi.repo.js +414 -47
  338. package/dist/imports/repos/openApi.repo.js.map +1 -1
  339. package/dist/imports/repos/postmanV21.repo.d.ts +1 -1
  340. package/dist/imports/repos/postmanV21.repo.js +126 -83
  341. package/dist/imports/repos/postmanV21.repo.js.map +1 -1
  342. package/dist/index.d.ts +3654 -289
  343. package/dist/index.js +5066 -669
  344. package/dist/index.js.map +1 -1
  345. package/dist/init.interface.d.ts +407 -0
  346. package/dist/init.interface.js +3 -0
  347. package/dist/init.interface.js.map +1 -0
  348. package/dist/inputs/inputs.service.d.ts +1 -1
  349. package/dist/inputs/utils/inputs.utils.create.js +1 -1
  350. package/dist/inputs/utils/inputs.utils.create.js.map +1 -1
  351. package/dist/jobs/index.d.ts +38 -0
  352. package/dist/jobs/index.js +50 -0
  353. package/dist/jobs/index.js.map +1 -0
  354. package/dist/jobs/jobs.service.d.ts +154 -0
  355. package/dist/jobs/jobs.service.js +491 -0
  356. package/dist/jobs/jobs.service.js.map +1 -0
  357. package/dist/jobs/jobs.state.d.ts +113 -0
  358. package/dist/jobs/jobs.state.js +447 -0
  359. package/dist/jobs/jobs.state.js.map +1 -0
  360. package/dist/jobs/types.d.ts +449 -0
  361. package/dist/jobs/types.js +74 -0
  362. package/dist/jobs/types.js.map +1 -0
  363. package/dist/logs/logs.service.js +6 -2
  364. package/dist/logs/logs.service.js.map +1 -1
  365. package/dist/logs/logs.types.d.ts +19 -1
  366. package/dist/logs/logs.types.js +6 -0
  367. package/dist/logs/logs.types.js.map +1 -1
  368. package/dist/models/index.d.ts +6 -0
  369. package/dist/models/index.js +11 -0
  370. package/dist/models/index.js.map +1 -0
  371. package/dist/models/models.service.d.ts +137 -0
  372. package/dist/models/models.service.js +195 -0
  373. package/dist/models/models.service.js.map +1 -0
  374. package/dist/notifications/index.d.ts +13 -0
  375. package/dist/notifications/index.js +26 -0
  376. package/dist/notifications/index.js.map +1 -0
  377. package/dist/notifications/notifications.service.d.ts +265 -0
  378. package/dist/notifications/notifications.service.js +862 -0
  379. package/dist/notifications/notifications.service.js.map +1 -0
  380. package/dist/notifications/types/index.d.ts +4 -0
  381. package/dist/notifications/types/index.js +21 -0
  382. package/dist/notifications/types/index.js.map +1 -0
  383. package/dist/notifications/types/notifications.types.d.ts +402 -0
  384. package/dist/notifications/types/notifications.types.js +49 -0
  385. package/dist/notifications/types/notifications.types.js.map +1 -0
  386. package/dist/parsers/index.d.ts +3 -0
  387. package/dist/parsers/index.js +27 -0
  388. package/dist/parsers/index.js.map +1 -0
  389. package/dist/parsers/pipelines/postman.pipelines.d.ts +15 -0
  390. package/dist/parsers/pipelines/postman.pipelines.js +103 -0
  391. package/dist/parsers/pipelines/postman.pipelines.js.map +1 -0
  392. package/dist/parsers/types/postman.types.d.ts +200 -0
  393. package/dist/parsers/types/postman.types.js +3 -0
  394. package/dist/parsers/types/postman.types.js.map +1 -0
  395. package/dist/parsers/utils/postman.utils.d.ts +12 -0
  396. package/dist/parsers/utils/postman.utils.js +116 -0
  397. package/dist/parsers/utils/postman.utils.js.map +1 -0
  398. package/dist/parsers/validators/postman-auth.validators.d.ts +10 -0
  399. package/dist/parsers/validators/postman-auth.validators.js +127 -0
  400. package/dist/parsers/validators/postman-auth.validators.js.map +1 -0
  401. package/dist/parsers/validators/postman-request.validators.d.ts +13 -0
  402. package/dist/parsers/validators/postman-request.validators.js +139 -0
  403. package/dist/parsers/validators/postman-request.validators.js.map +1 -0
  404. package/dist/parsers/validators/postman-response.validators.d.ts +13 -0
  405. package/dist/parsers/validators/postman-response.validators.js +150 -0
  406. package/dist/parsers/validators/postman-response.validators.js.map +1 -0
  407. package/dist/parsers/validators/postman-variable.validators.d.ts +14 -0
  408. package/dist/parsers/validators/postman-variable.validators.js +163 -0
  409. package/dist/parsers/validators/postman-variable.validators.js.map +1 -0
  410. package/dist/pricing/pricing.repo.js +1 -0
  411. package/dist/pricing/pricing.repo.js.map +1 -0
  412. package/dist/pricing/pricing.service.d.ts +24 -0
  413. package/dist/pricing/pricing.service.js +51 -0
  414. package/dist/pricing/pricing.service.js.map +1 -0
  415. package/dist/pricing/pricing.types.d.ts +76 -0
  416. package/dist/pricing/pricing.types.js +21 -0
  417. package/dist/pricing/pricing.types.js.map +1 -0
  418. package/dist/pricing/utils/string.utils.d.ts +1 -0
  419. package/dist/pricing/utils/string.utils.js +9 -0
  420. package/dist/pricing/utils/string.utils.js.map +1 -0
  421. package/dist/processor/services/processor.service.d.ts +117 -73
  422. package/dist/processor/services/processor.service.js +1557 -1276
  423. package/dist/processor/services/processor.service.js.map +1 -1
  424. package/dist/processor/services/request.service.d.ts +36 -0
  425. package/dist/processor/services/request.service.js +304 -0
  426. package/dist/processor/services/request.service.js.map +1 -0
  427. package/dist/processor/types/request.types.d.ts +14 -0
  428. package/dist/processor/types/request.types.js +3 -0
  429. package/dist/processor/types/request.types.js.map +1 -0
  430. package/dist/processor/utils/processor.utils.js +32 -20
  431. package/dist/processor/utils/processor.utils.js.map +1 -1
  432. package/dist/processor/utils/request.utils.d.ts +20 -0
  433. package/dist/processor/utils/request.utils.js +113 -0
  434. package/dist/processor/utils/request.utils.js.map +1 -0
  435. package/dist/products/services/products.service.d.ts +365 -75
  436. package/dist/products/services/products.service.js +2809 -414
  437. package/dist/products/services/products.service.js.map +1 -1
  438. package/dist/products/utils/string.utils.d.ts +1 -1
  439. package/dist/products/utils/string.utils.js +14 -2
  440. package/dist/products/utils/string.utils.js.map +1 -1
  441. package/dist/products/validators/index.d.ts +7 -1
  442. package/dist/products/validators/index.js +16 -1
  443. package/dist/products/validators/index.js.map +1 -1
  444. package/dist/products/validators/joi-validators/create.productAgent.validator.d.ts +3 -0
  445. package/dist/products/validators/joi-validators/create.productAgent.validator.js +266 -0
  446. package/dist/products/validators/joi-validators/create.productAgent.validator.js.map +1 -0
  447. package/dist/products/validators/joi-validators/create.productDatabase.validator.js +5 -0
  448. package/dist/products/validators/joi-validators/create.productDatabase.validator.js.map +1 -1
  449. package/dist/products/validators/joi-validators/create.productEnv.validator.js +1 -0
  450. package/dist/products/validators/joi-validators/create.productEnv.validator.js.map +1 -1
  451. package/dist/products/validators/joi-validators/create.productGraph.validator.js +89 -0
  452. package/dist/products/validators/joi-validators/create.productGraph.validator.js.map +1 -0
  453. package/dist/products/validators/joi-validators/create.productHealthcheck.validator.d.ts +4 -0
  454. package/dist/products/validators/joi-validators/create.productHealthcheck.validator.js +58 -0
  455. package/dist/products/validators/joi-validators/create.productHealthcheck.validator.js.map +1 -0
  456. package/dist/products/validators/joi-validators/create.productMessageBrokers.validator.js +81 -25
  457. package/dist/products/validators/joi-validators/create.productMessageBrokers.validator.js.map +1 -1
  458. package/dist/products/validators/joi-validators/create.productModel.validator.d.ts +3 -0
  459. package/dist/products/validators/joi-validators/create.productModel.validator.js +132 -0
  460. package/dist/products/validators/joi-validators/create.productModel.validator.js.map +1 -0
  461. package/dist/products/validators/joi-validators/create.productNotification.validator.js +133 -45
  462. package/dist/products/validators/joi-validators/create.productNotification.validator.js.map +1 -1
  463. package/dist/products/validators/joi-validators/create.productStorage.validator.js +77 -18
  464. package/dist/products/validators/joi-validators/create.productStorage.validator.js.map +1 -1
  465. package/dist/products/validators/joi-validators/create.productVector.validator.d.ts +3 -0
  466. package/dist/products/validators/joi-validators/create.productVector.validator.js +135 -0
  467. package/dist/products/validators/joi-validators/create.productVector.validator.js.map +1 -0
  468. package/dist/products/validators/joi-validators/update.dataValue.validator.js +1 -0
  469. package/dist/products/validators/joi-validators/update.dataValue.validator.js.map +1 -1
  470. package/dist/products/validators/joi-validators/update.productDatabase.validator.js +5 -0
  471. package/dist/products/validators/joi-validators/update.productDatabase.validator.js.map +1 -1
  472. package/dist/products/validators/joi-validators/update.productEnv.validator.js +3 -0
  473. package/dist/products/validators/joi-validators/update.productEnv.validator.js.map +1 -1
  474. package/dist/products/validators/joi-validators/update.productGraph.validator.js +88 -0
  475. package/dist/products/validators/joi-validators/update.productGraph.validator.js.map +1 -0
  476. package/dist/resilience/fallback.service.d.ts +140 -0
  477. package/dist/resilience/fallback.service.js +764 -0
  478. package/dist/resilience/fallback.service.js.map +1 -0
  479. package/dist/resilience/healthcheck.service.d.ts +159 -0
  480. package/dist/resilience/healthcheck.service.js +943 -0
  481. package/dist/resilience/healthcheck.service.js.map +1 -0
  482. package/dist/resilience/index.d.ts +104 -0
  483. package/dist/resilience/index.js +140 -0
  484. package/dist/resilience/index.js.map +1 -0
  485. package/dist/resilience/quota.service.d.ts +82 -0
  486. package/dist/resilience/quota.service.js +516 -0
  487. package/dist/resilience/quota.service.js.map +1 -0
  488. package/dist/resilience/resilience.service.d.ts +98 -0
  489. package/dist/resilience/resilience.service.js +560 -0
  490. package/dist/resilience/resilience.service.js.map +1 -0
  491. package/dist/resilience/types/index.d.ts +513 -0
  492. package/dist/resilience/types/index.js +29 -0
  493. package/dist/resilience/types/index.js.map +1 -0
  494. package/dist/secrets/index.d.ts +10 -0
  495. package/dist/secrets/index.js +33 -0
  496. package/dist/secrets/index.js.map +1 -0
  497. package/dist/secrets/secrets.resolver.d.ts +52 -0
  498. package/dist/secrets/secrets.resolver.js +233 -0
  499. package/dist/secrets/secrets.resolver.js.map +1 -0
  500. package/dist/secrets/secrets.service.d.ts +93 -0
  501. package/dist/secrets/secrets.service.js +258 -0
  502. package/dist/secrets/secrets.service.js.map +1 -0
  503. package/dist/secrets/secrets.types.d.ts +188 -0
  504. package/dist/secrets/secrets.types.js +87 -0
  505. package/dist/secrets/secrets.types.js.map +1 -0
  506. package/dist/sessions/index.d.ts +50 -0
  507. package/dist/sessions/index.js +93 -0
  508. package/dist/sessions/index.js.map +1 -0
  509. package/dist/sessions/sessions.helper.d.ts +68 -0
  510. package/dist/sessions/sessions.helper.js +116 -0
  511. package/dist/sessions/sessions.helper.js.map +1 -0
  512. package/dist/sessions/sessions.resolver.d.ts +157 -0
  513. package/dist/sessions/sessions.resolver.js +374 -0
  514. package/dist/sessions/sessions.resolver.js.map +1 -0
  515. package/dist/sessions/sessions.service.d.ts +178 -0
  516. package/dist/sessions/sessions.service.js +923 -0
  517. package/dist/sessions/sessions.service.js.map +1 -0
  518. package/dist/sessions/types/index.d.ts +298 -0
  519. package/dist/sessions/types/index.js +6 -0
  520. package/dist/sessions/types/index.js.map +1 -0
  521. package/dist/storage/index.d.ts +66 -0
  522. package/dist/storage/index.js +99 -0
  523. package/dist/storage/index.js.map +1 -0
  524. package/dist/storage/storage.service.d.ts +174 -0
  525. package/dist/storage/storage.service.js +757 -0
  526. package/dist/storage/storage.service.js.map +1 -0
  527. package/dist/storage/types/index.d.ts +267 -0
  528. package/dist/storage/types/index.js +6 -0
  529. package/dist/storage/types/index.js.map +1 -0
  530. package/dist/storage/utils/storage.util.d.ts +62 -0
  531. package/dist/storage/utils/storage.util.js +593 -0
  532. package/dist/storage/utils/storage.util.js.map +1 -0
  533. package/dist/test/index.d.ts +3 -0
  534. package/dist/test/index.js +11 -0
  535. package/dist/test/index.js.map +1 -0
  536. package/dist/test/test.appBuilder.d.ts +0 -1
  537. package/dist/test/test.appBuilder.js +0 -15
  538. package/dist/test/test.appBuilder.js.map +1 -1
  539. package/dist/test/test.broker.kafka.js +172 -0
  540. package/dist/test/test.broker.kafka.js.map +1 -0
  541. package/dist/test/test.broker.nats.js +193 -0
  542. package/dist/test/test.broker.nats.js.map +1 -0
  543. package/dist/test/test.broker.pubsub.js +171 -0
  544. package/dist/test/test.broker.pubsub.js.map +1 -0
  545. package/dist/test/test.broker.rabbitmq.js +164 -0
  546. package/dist/test/test.broker.rabbitmq.js.map +1 -0
  547. package/dist/test/test.broker.redis.js +168 -0
  548. package/dist/test/test.broker.redis.js.map +1 -0
  549. package/dist/test/test.broker.sqs.d.ts +1 -0
  550. package/dist/test/test.broker.sqs.js +158 -0
  551. package/dist/test/test.broker.sqs.js.map +1 -0
  552. package/dist/test/test.caches.d.ts +1 -0
  553. package/dist/test/test.caches.js +231 -0
  554. package/dist/test/test.caches.js.map +1 -0
  555. package/dist/test/test.database.d.ts +1 -0
  556. package/dist/test/test.database.dynamo.d.ts +1 -0
  557. package/dist/test/test.database.dynamo.js +265 -0
  558. package/dist/test/test.database.dynamo.js.map +1 -0
  559. package/dist/test/test.database.js +140 -0
  560. package/dist/test/test.database.js.map +1 -0
  561. package/dist/test/test.database.mongo.d.ts +1 -0
  562. package/dist/test/test.database.mongo.js +371 -0
  563. package/dist/test/test.database.mongo.js.map +1 -0
  564. package/dist/test/test.database.mysql.d.ts +1 -0
  565. package/dist/test/test.database.mysql.js +415 -0
  566. package/dist/test/test.database.mysql.js.map +1 -0
  567. package/dist/test/test.database.postgres.d.ts +1 -0
  568. package/dist/test/test.database.postgres.js +412 -0
  569. package/dist/test/test.database.postgres.js.map +1 -0
  570. package/dist/test/test.email.brevo.d.ts +1 -0
  571. package/dist/test/test.email.brevo.js +326 -0
  572. package/dist/test/test.email.brevo.js.map +1 -0
  573. package/dist/test/test.email.mailgun.d.ts +1 -0
  574. package/dist/test/test.email.mailgun.js +352 -0
  575. package/dist/test/test.email.mailgun.js.map +1 -0
  576. package/dist/test/test.email.postmark.d.ts +1 -0
  577. package/dist/test/test.email.postmark.js +316 -0
  578. package/dist/test/test.email.postmark.js.map +1 -0
  579. package/dist/test/test.email.sendgrid.d.ts +1 -0
  580. package/dist/test/test.email.sendgrid.js +365 -0
  581. package/dist/test/test.email.sendgrid.js.map +1 -0
  582. package/dist/test/test.email.smtp.d.ts +1 -0
  583. package/dist/test/test.email.smtp.js +323 -0
  584. package/dist/test/test.email.smtp.js.map +1 -0
  585. package/dist/test/test.graph.arangodb.d.ts +1 -0
  586. package/dist/test/test.graph.arangodb.js +358 -0
  587. package/dist/test/test.graph.arangodb.js.map +1 -0
  588. package/dist/test/test.graph.memgraph.d.ts +1 -0
  589. package/dist/test/test.graph.memgraph.js +320 -0
  590. package/dist/test/test.graph.memgraph.js.map +1 -0
  591. package/dist/test/test.graph.neo4j.d.ts +1 -0
  592. package/dist/test/test.graph.neo4j.js +218 -0
  593. package/dist/test/test.graph.neo4j.js.map +1 -0
  594. package/dist/test/test.graph.neptune.d.ts +1 -0
  595. package/dist/test/test.graph.neptune.js +331 -0
  596. package/dist/test/test.graph.neptune.js.map +1 -0
  597. package/dist/test/test.health.js +1 -0
  598. package/dist/test/test.health.js.map +1 -0
  599. package/dist/test/test.import.d.ts +0 -1
  600. package/dist/test/test.import.js +0 -1459
  601. package/dist/test/test.import.js.map +1 -1
  602. package/dist/test/test.import.openapi.d.ts +0 -1
  603. package/dist/test/test.import.openapi.js +0 -75
  604. package/dist/test/test.import.openapi.js.map +1 -1
  605. package/dist/test/test.imports.js +14 -55
  606. package/dist/test/test.imports.js.map +1 -1
  607. package/dist/test/test.logs.d.ts +0 -1
  608. package/dist/test/test.logs.js +0 -17
  609. package/dist/test/test.logs.js.map +1 -1
  610. package/dist/test/test.notifications.d.ts +1 -0
  611. package/dist/test/test.notifications.js +198 -0
  612. package/dist/test/test.notifications.js.map +1 -0
  613. package/dist/test/test.notifiers.js +1 -0
  614. package/dist/test/test.notifiers.js.map +1 -0
  615. package/dist/test/test.processor.d.ts +0 -1
  616. package/dist/test/test.processor.js +0 -122
  617. package/dist/test/test.processor.js.map +1 -1
  618. package/dist/test/test.productBuilder.d.ts +0 -1
  619. package/dist/test/test.productBuilder.js +0 -660
  620. package/dist/test/test.productBuilder.js.map +1 -1
  621. package/dist/test/test.products.js +1 -0
  622. package/dist/test/test.products.js.map +1 -0
  623. package/dist/test/test.push.expo.d.ts +1 -0
  624. package/dist/test/test.push.expo.js +442 -0
  625. package/dist/test/test.push.expo.js.map +1 -0
  626. package/dist/test/test.push.firebase.d.ts +1 -0
  627. package/dist/test/test.push.firebase.js +409 -0
  628. package/dist/test/test.push.firebase.js.map +1 -0
  629. package/dist/test/test.session.d.ts +1 -0
  630. package/dist/test/test.session.js +299 -0
  631. package/dist/test/test.session.js.map +1 -0
  632. package/dist/test/test.sms.nexmo.d.ts +1 -0
  633. package/dist/test/test.sms.nexmo.js +278 -0
  634. package/dist/test/test.sms.nexmo.js.map +1 -0
  635. package/dist/test/test.sms.twilio.d.ts +1 -0
  636. package/dist/test/test.sms.twilio.js +275 -0
  637. package/dist/test/test.sms.twilio.js.map +1 -0
  638. package/dist/test/test.storage.d.ts +1 -0
  639. package/dist/test/test.storage.js +202 -0
  640. package/dist/test/test.storage.js.map +1 -0
  641. package/dist/test/test.triggers.d.ts +1 -0
  642. package/dist/test/test.triggers.js +314 -0
  643. package/dist/test/test.triggers.js.map +1 -0
  644. package/dist/test/test.vector.pinecone.d.ts +1 -0
  645. package/dist/test/test.vector.pinecone.js +238 -0
  646. package/dist/test/test.vector.pinecone.js.map +1 -0
  647. package/dist/test/test.vector.qdrant.d.ts +1 -0
  648. package/dist/test/test.vector.qdrant.js +307 -0
  649. package/dist/test/test.vector.qdrant.js.map +1 -0
  650. package/dist/test/test.vector.weaviate.d.ts +1 -0
  651. package/dist/test/test.vector.weaviate.js +325 -0
  652. package/dist/test/test.vector.weaviate.js.map +1 -0
  653. package/dist/types/appBuilder.types.d.ts +9 -2
  654. package/dist/types/enums.d.ts +11 -1
  655. package/dist/types/enums.js +10 -0
  656. package/dist/types/enums.js.map +1 -1
  657. package/dist/types/index.types.d.ts +4 -7
  658. package/dist/types/index.types.js +0 -1
  659. package/dist/types/index.types.js.map +1 -1
  660. package/dist/types/inputs.types.js +1 -1
  661. package/dist/types/inputs.types.js.map +1 -1
  662. package/dist/types/pricing.types.d.ts +4 -0
  663. package/dist/types/pricing.types.js +3 -0
  664. package/dist/types/pricing.types.js.map +1 -0
  665. package/dist/types/processor.types.d.ts +214 -33
  666. package/dist/types/processor.types.js +9 -1
  667. package/dist/types/processor.types.js.map +1 -1
  668. package/dist/types/productsBuilder.types.d.ts +978 -23
  669. package/dist/types/productsBuilder.types.js +210 -3
  670. package/dist/types/productsBuilder.types.js.map +1 -1
  671. package/dist/types/request-tracker.interface.js +1 -0
  672. package/dist/types/request-tracker.interface.js.map +1 -0
  673. package/dist/types/requests.types.d.ts +2 -0
  674. package/dist/utils/constants.d.ts +1 -0
  675. package/dist/utils/constants.js +5 -0
  676. package/dist/utils/constants.js.map +1 -0
  677. package/dist/utils/index.d.ts +0 -2
  678. package/dist/utils/index.js +24 -52
  679. package/dist/utils/index.js.map +1 -1
  680. package/dist/vector/actions/action-manager.d.ts +140 -0
  681. package/dist/vector/actions/action-manager.js +356 -0
  682. package/dist/vector/actions/action-manager.js.map +1 -0
  683. package/dist/vector/adapters/base.adapter.d.ts +169 -0
  684. package/dist/vector/adapters/base.adapter.js +218 -0
  685. package/dist/vector/adapters/base.adapter.js.map +1 -0
  686. package/dist/vector/adapters/index.d.ts +10 -0
  687. package/dist/vector/adapters/index.js +19 -0
  688. package/dist/vector/adapters/index.js.map +1 -0
  689. package/dist/vector/adapters/memory.adapter.d.ts +85 -0
  690. package/dist/vector/adapters/memory.adapter.js +505 -0
  691. package/dist/vector/adapters/memory.adapter.js.map +1 -0
  692. package/dist/vector/adapters/pinecone.adapter.d.ts +52 -0
  693. package/dist/vector/adapters/pinecone.adapter.js +433 -0
  694. package/dist/vector/adapters/pinecone.adapter.js.map +1 -0
  695. package/dist/vector/adapters/qdrant.adapter.d.ts +56 -0
  696. package/dist/vector/adapters/qdrant.adapter.js +442 -0
  697. package/dist/vector/adapters/qdrant.adapter.js.map +1 -0
  698. package/dist/vector/adapters/weaviate.adapter.d.ts +68 -0
  699. package/dist/vector/adapters/weaviate.adapter.js +645 -0
  700. package/dist/vector/adapters/weaviate.adapter.js.map +1 -0
  701. package/dist/vector/index.d.ts +36 -0
  702. package/dist/vector/index.js +70 -0
  703. package/dist/vector/index.js.map +1 -0
  704. package/dist/vector/types/action.interface.d.ts +195 -0
  705. package/dist/vector/types/action.interface.js +100 -0
  706. package/dist/vector/types/action.interface.js.map +1 -0
  707. package/dist/vector/types/connection.interface.d.ts +151 -0
  708. package/dist/vector/types/connection.interface.js +8 -0
  709. package/dist/vector/types/connection.interface.js.map +1 -0
  710. package/dist/vector/types/embedding.interface.d.ts +144 -0
  711. package/dist/vector/types/embedding.interface.js +8 -0
  712. package/dist/vector/types/embedding.interface.js.map +1 -0
  713. package/dist/vector/types/enums.d.ts +104 -0
  714. package/dist/vector/types/enums.js +113 -0
  715. package/dist/vector/types/enums.js.map +1 -0
  716. package/dist/vector/types/index.d.ts +11 -0
  717. package/dist/vector/types/index.js +23 -0
  718. package/dist/vector/types/index.js.map +1 -0
  719. package/dist/vector/types/vector.interface.d.ts +315 -0
  720. package/dist/vector/types/vector.interface.js +8 -0
  721. package/dist/vector/types/vector.interface.js.map +1 -0
  722. package/dist/vector/utils/index.d.ts +6 -0
  723. package/dist/vector/utils/index.js +11 -0
  724. package/dist/vector/utils/index.js.map +1 -0
  725. package/dist/vector/utils/vector-error.d.ts +69 -0
  726. package/dist/vector/utils/vector-error.js +116 -0
  727. package/dist/vector/utils/vector-error.js.map +1 -0
  728. package/dist/vector/vector-database.service.d.ts +474 -0
  729. package/dist/vector/vector-database.service.js +850 -0
  730. package/dist/vector/vector-database.service.js.map +1 -0
  731. package/dist/vector/vector.service.d.ts +283 -0
  732. package/dist/vector/vector.service.js +544 -0
  733. package/dist/vector/vector.service.js.map +1 -0
  734. package/dist/warehouse/executor/index.d.ts +5 -0
  735. package/dist/warehouse/executor/index.js +12 -0
  736. package/dist/warehouse/executor/index.js.map +1 -0
  737. package/dist/warehouse/executor/joins/index.d.ts +5 -0
  738. package/dist/warehouse/executor/joins/index.js +11 -0
  739. package/dist/warehouse/executor/joins/index.js.map +1 -0
  740. package/dist/warehouse/executor/joins/join-executor.d.ts +101 -0
  741. package/dist/warehouse/executor/joins/join-executor.js +493 -0
  742. package/dist/warehouse/executor/joins/join-executor.js.map +1 -0
  743. package/dist/warehouse/executor/joins/semantic-join.d.ts +64 -0
  744. package/dist/warehouse/executor/joins/semantic-join.js +241 -0
  745. package/dist/warehouse/executor/joins/semantic-join.js.map +1 -0
  746. package/dist/warehouse/executor/single-source-executor.d.ts +155 -0
  747. package/dist/warehouse/executor/single-source-executor.js +573 -0
  748. package/dist/warehouse/executor/single-source-executor.js.map +1 -0
  749. package/dist/warehouse/index.d.ts +79 -0
  750. package/dist/warehouse/index.js +111 -0
  751. package/dist/warehouse/index.js.map +1 -0
  752. package/dist/warehouse/parser/index.d.ts +4 -0
  753. package/dist/warehouse/parser/index.js +10 -0
  754. package/dist/warehouse/parser/index.js.map +1 -0
  755. package/dist/warehouse/parser/query-parser.d.ts +181 -0
  756. package/dist/warehouse/parser/query-parser.js +415 -0
  757. package/dist/warehouse/parser/query-parser.js.map +1 -0
  758. package/dist/warehouse/registry/data-source-registry.d.ts +207 -0
  759. package/dist/warehouse/registry/data-source-registry.js +396 -0
  760. package/dist/warehouse/registry/data-source-registry.js.map +1 -0
  761. package/dist/warehouse/registry/index.d.ts +4 -0
  762. package/dist/warehouse/registry/index.js +9 -0
  763. package/dist/warehouse/registry/index.js.map +1 -0
  764. package/dist/warehouse/transactions/index.d.ts +4 -0
  765. package/dist/warehouse/transactions/index.js +9 -0
  766. package/dist/warehouse/transactions/index.js.map +1 -0
  767. package/dist/warehouse/transactions/saga-orchestrator.d.ts +92 -0
  768. package/dist/warehouse/transactions/saga-orchestrator.js +383 -0
  769. package/dist/warehouse/transactions/saga-orchestrator.js.map +1 -0
  770. package/dist/warehouse/types/index.d.ts +9 -0
  771. package/dist/warehouse/types/index.js +33 -0
  772. package/dist/warehouse/types/index.js.map +1 -0
  773. package/dist/warehouse/types/join.interface.d.ts +225 -0
  774. package/dist/warehouse/types/join.interface.js +87 -0
  775. package/dist/warehouse/types/join.interface.js.map +1 -0
  776. package/dist/warehouse/types/query.interface.d.ts +232 -0
  777. package/dist/warehouse/types/query.interface.js +9 -0
  778. package/dist/warehouse/types/query.interface.js.map +1 -0
  779. package/dist/warehouse/types/transaction.interface.d.ts +236 -0
  780. package/dist/warehouse/types/transaction.interface.js +74 -0
  781. package/dist/warehouse/types/transaction.interface.js.map +1 -0
  782. package/dist/warehouse/types/where.interface.d.ts +208 -0
  783. package/dist/warehouse/types/where.interface.js +89 -0
  784. package/dist/warehouse/types/where.interface.js.map +1 -0
  785. package/dist/warehouse/warehouse.service.d.ts +200 -0
  786. package/dist/warehouse/warehouse.service.js +470 -0
  787. package/dist/warehouse/warehouse.service.js.map +1 -0
  788. package/dist/workflows/index.d.ts +30 -0
  789. package/dist/workflows/index.js +64 -0
  790. package/dist/workflows/index.js.map +1 -0
  791. package/dist/workflows/types/index.d.ts +6 -0
  792. package/dist/workflows/types/index.js +23 -0
  793. package/dist/workflows/types/index.js.map +1 -0
  794. package/dist/workflows/types/workflows.types.d.ts +1037 -0
  795. package/dist/workflows/types/workflows.types.js +13 -0
  796. package/dist/workflows/types/workflows.types.js.map +1 -0
  797. package/dist/workflows/workflow-builder.d.ts +70 -0
  798. package/dist/workflows/workflow-builder.js +338 -0
  799. package/dist/workflows/workflow-builder.js.map +1 -0
  800. package/dist/workflows/workflow-executor.d.ts +208 -0
  801. package/dist/workflows/workflow-executor.js +1194 -0
  802. package/dist/workflows/workflow-executor.js.map +1 -0
  803. package/dist/workflows/workflows.service.d.ts +410 -0
  804. package/dist/workflows/workflows.service.js +1724 -0
  805. package/dist/workflows/workflows.service.js.map +1 -0
  806. package/package.json +65 -12
  807. package/dist/actions/actions.repo.js +0 -13
  808. package/dist/actions/actions.repo.js.map +0 -1
  809. package/dist/actions/actions.service.js +0 -24
  810. package/dist/actions/actions.service.js.map +0 -1
  811. package/dist/actions/utils/actions.util.read.js +0 -427
  812. package/dist/actions/utils/actions.util.read.js.map +0 -1
  813. package/dist/api/services/integrationsApi.service.d.ts +0 -18
  814. package/dist/api/services/integrationsApi.service.js +0 -80
  815. package/dist/api/services/integrationsApi.service.js.map +0 -1
  816. package/dist/appBuilder/services/app.service.d.ts +0 -111
  817. package/dist/appBuilder/services/app.service.js +0 -737
  818. package/dist/appBuilder/services/app.service.js.map +0 -1
  819. package/dist/appBuilder/services/appBuilder.service.d.ts +0 -111
  820. package/dist/appBuilder/services/appBuilder.service.js +0 -662
  821. package/dist/appBuilder/services/appBuilder.service.js.map +0 -1
  822. package/dist/appBuilder/utils/objects.utils.d.ts +0 -3
  823. package/dist/appBuilder/utils/objects.utils.js +0 -9
  824. package/dist/appBuilder/utils/objects.utils.js.map +0 -1
  825. package/dist/appBuilder/utils/string.utils.d.ts +0 -2
  826. package/dist/appBuilder/utils/string.utils.js +0 -57
  827. package/dist/appBuilder/utils/string.utils.js.map +0 -1
  828. package/dist/appBuilder/validators/index.d.ts +0 -19
  829. package/dist/appBuilder/validators/index.js +0 -40
  830. package/dist/appBuilder/validators/index.js.map +0 -1
  831. package/dist/appBuilder/validators/joi-validators/create.app.validator.js +0 -10
  832. package/dist/appBuilder/validators/joi-validators/create.app.validator.js.map +0 -1
  833. package/dist/appBuilder/validators/joi-validators/create.appAction.validator.d.ts +0 -4
  834. package/dist/appBuilder/validators/joi-validators/create.appAction.validator.js +0 -20
  835. package/dist/appBuilder/validators/joi-validators/create.appAction.validator.js.map +0 -1
  836. package/dist/appBuilder/validators/joi-validators/create.appActionResponse.validator.d.ts +0 -7
  837. package/dist/appBuilder/validators/joi-validators/create.appActionResponse.validator.js +0 -44
  838. package/dist/appBuilder/validators/joi-validators/create.appActionResponse.validator.js.map +0 -1
  839. package/dist/appBuilder/validators/joi-validators/create.appAuth.validator.d.ts +0 -3
  840. package/dist/appBuilder/validators/joi-validators/create.appAuth.validator.js +0 -31
  841. package/dist/appBuilder/validators/joi-validators/create.appAuth.validator.js.map +0 -1
  842. package/dist/appBuilder/validators/joi-validators/create.appBody.validators.d.ts +0 -4
  843. package/dist/appBuilder/validators/joi-validators/create.appBody.validators.js +0 -11
  844. package/dist/appBuilder/validators/joi-validators/create.appBody.validators.js.map +0 -1
  845. package/dist/appBuilder/validators/joi-validators/create.appConstants.validator.d.ts +0 -4
  846. package/dist/appBuilder/validators/joi-validators/create.appConstants.validator.js +0 -12
  847. package/dist/appBuilder/validators/joi-validators/create.appConstants.validator.js.map +0 -1
  848. package/dist/appBuilder/validators/joi-validators/create.appEnv.validator.d.ts +0 -4
  849. package/dist/appBuilder/validators/joi-validators/create.appEnv.validator.js +0 -17
  850. package/dist/appBuilder/validators/joi-validators/create.appEnv.validator.js.map +0 -1
  851. package/dist/appBuilder/validators/joi-validators/create.appEvent.validator.d.ts +0 -5
  852. package/dist/appBuilder/validators/joi-validators/create.appEvent.validator.js +0 -30
  853. package/dist/appBuilder/validators/joi-validators/create.appEvent.validator.js.map +0 -1
  854. package/dist/appBuilder/validators/joi-validators/create.appVariable.validator.d.ts +0 -4
  855. package/dist/appBuilder/validators/joi-validators/create.appVariable.validator.js +0 -14
  856. package/dist/appBuilder/validators/joi-validators/create.appVariable.validator.js.map +0 -1
  857. package/dist/appBuilder/validators/joi-validators/sample.validator.d.ts +0 -5
  858. package/dist/appBuilder/validators/joi-validators/sample.validator.js +0 -26
  859. package/dist/appBuilder/validators/joi-validators/sample.validator.js.map +0 -1
  860. package/dist/appBuilder/validators/joi-validators/update.app.validator.d.ts +0 -4
  861. package/dist/appBuilder/validators/joi-validators/update.app.validator.js +0 -34
  862. package/dist/appBuilder/validators/joi-validators/update.app.validator.js.map +0 -1
  863. package/dist/appBuilder/validators/joi-validators/update.appAction.validator.d.ts +0 -4
  864. package/dist/appBuilder/validators/joi-validators/update.appAction.validator.js +0 -23
  865. package/dist/appBuilder/validators/joi-validators/update.appAction.validator.js.map +0 -1
  866. package/dist/appBuilder/validators/joi-validators/update.appActionResponse.validator.d.ts +0 -3
  867. package/dist/appBuilder/validators/joi-validators/update.appActionResponse.validator.js +0 -21
  868. package/dist/appBuilder/validators/joi-validators/update.appActionResponse.validator.js.map +0 -1
  869. package/dist/appBuilder/validators/joi-validators/update.appAuth.validator.d.ts +0 -4
  870. package/dist/appBuilder/validators/joi-validators/update.appAuth.validator.js +0 -19
  871. package/dist/appBuilder/validators/joi-validators/update.appAuth.validator.js.map +0 -1
  872. package/dist/appBuilder/validators/joi-validators/update.appConstants.validator.d.ts +0 -4
  873. package/dist/appBuilder/validators/joi-validators/update.appConstants.validator.js +0 -12
  874. package/dist/appBuilder/validators/joi-validators/update.appConstants.validator.js.map +0 -1
  875. package/dist/appBuilder/validators/joi-validators/update.appEnv.validator.d.ts +0 -4
  876. package/dist/appBuilder/validators/joi-validators/update.appEnv.validator.js +0 -17
  877. package/dist/appBuilder/validators/joi-validators/update.appEnv.validator.js.map +0 -1
  878. package/dist/appBuilder/validators/joi-validators/update.appEvent.validator.d.ts +0 -4
  879. package/dist/appBuilder/validators/joi-validators/update.appEvent.validator.js +0 -16
  880. package/dist/appBuilder/validators/joi-validators/update.appEvent.validator.js.map +0 -1
  881. package/dist/appBuilder/validators/joi-validators/update.appVariables.validator.d.ts +0 -4
  882. package/dist/appBuilder/validators/joi-validators/update.appVariables.validator.js +0 -14
  883. package/dist/appBuilder/validators/joi-validators/update.appVariables.validator.js.map +0 -1
  884. package/dist/appBuilder/validators/joi-validators/update.validation.entityData.validator.js +0 -27
  885. package/dist/appBuilder/validators/joi-validators/update.validation.entityData.validator.js.map +0 -1
  886. package/dist/apps/validators/joi-validators/create.appEvent.validator.d.ts +0 -5
  887. package/dist/apps/validators/joi-validators/create.appEvent.validator.js +0 -30
  888. package/dist/apps/validators/joi-validators/create.appEvent.validator.js.map +0 -1
  889. package/dist/apps/validators/joi-validators/update.appEvent.validator.d.ts +0 -4
  890. package/dist/apps/validators/joi-validators/update.appEvent.validator.js +0 -16
  891. package/dist/apps/validators/joi-validators/update.appEvent.validator.js.map +0 -1
  892. package/dist/clients/integrations.client.d.ts +0 -2
  893. package/dist/clients/integrations.client.js +0 -26
  894. package/dist/clients/integrations.client.js.map +0 -1
  895. package/dist/integrationsBuilder/services/integration.service.d.ts +0 -138
  896. package/dist/integrationsBuilder/services/integration.service.js +0 -1148
  897. package/dist/integrationsBuilder/services/integration.service.js.map +0 -1
  898. package/dist/integrationsBuilder/services/integrationBuilder.service.d.ts +0 -130
  899. package/dist/integrationsBuilder/services/integrationBuilder.service.js +0 -1017
  900. package/dist/integrationsBuilder/services/integrationBuilder.service.js.map +0 -1
  901. package/dist/integrationsBuilder/utils/objects.utils.d.ts +0 -2
  902. package/dist/integrationsBuilder/utils/objects.utils.js +0 -48
  903. package/dist/integrationsBuilder/utils/objects.utils.js.map +0 -1
  904. package/dist/integrationsBuilder/utils/string.utils.d.ts +0 -1
  905. package/dist/integrationsBuilder/utils/string.utils.js +0 -9
  906. package/dist/integrationsBuilder/utils/string.utils.js.map +0 -1
  907. package/dist/integrationsBuilder/validators/index.d.ts +0 -18
  908. package/dist/integrationsBuilder/validators/index.js +0 -38
  909. package/dist/integrationsBuilder/validators/index.js.map +0 -1
  910. package/dist/integrationsBuilder/validators/joi-validators/create.integration.validator.d.ts +0 -3
  911. package/dist/integrationsBuilder/validators/joi-validators/create.integration.validator.js +0 -10
  912. package/dist/integrationsBuilder/validators/joi-validators/create.integration.validator.js.map +0 -1
  913. package/dist/integrationsBuilder/validators/joi-validators/create.integrationApp.validator.d.ts +0 -4
  914. package/dist/integrationsBuilder/validators/joi-validators/create.integrationApp.validator.js +0 -26
  915. package/dist/integrationsBuilder/validators/joi-validators/create.integrationApp.validator.js.map +0 -1
  916. package/dist/integrationsBuilder/validators/joi-validators/create.integrationCache.validator.d.ts +0 -3
  917. package/dist/integrationsBuilder/validators/joi-validators/create.integrationCache.validator.js +0 -8
  918. package/dist/integrationsBuilder/validators/joi-validators/create.integrationCache.validator.js.map +0 -1
  919. package/dist/integrationsBuilder/validators/joi-validators/create.integrationDatabase.validator.d.ts +0 -3
  920. package/dist/integrationsBuilder/validators/joi-validators/create.integrationDatabase.validator.js +0 -8
  921. package/dist/integrationsBuilder/validators/joi-validators/create.integrationDatabase.validator.js.map +0 -1
  922. package/dist/integrationsBuilder/validators/joi-validators/create.integrationEnv.validator.d.ts +0 -3
  923. package/dist/integrationsBuilder/validators/joi-validators/create.integrationEnv.validator.js +0 -10
  924. package/dist/integrationsBuilder/validators/joi-validators/create.integrationEnv.validator.js.map +0 -1
  925. package/dist/integrationsBuilder/validators/joi-validators/create.integrationFeature.validator.d.ts +0 -3
  926. package/dist/integrationsBuilder/validators/joi-validators/create.integrationFeature.validator.js +0 -60
  927. package/dist/integrationsBuilder/validators/joi-validators/create.integrationFeature.validator.js.map +0 -1
  928. package/dist/integrationsBuilder/validators/joi-validators/create.integrationFunction.validator.d.ts +0 -3
  929. package/dist/integrationsBuilder/validators/joi-validators/create.integrationFunction.validator.js +0 -8
  930. package/dist/integrationsBuilder/validators/joi-validators/create.integrationFunction.validator.js.map +0 -1
  931. package/dist/integrationsBuilder/validators/joi-validators/create.integrationJob.validator.d.ts +0 -3
  932. package/dist/integrationsBuilder/validators/joi-validators/create.integrationJob.validator.js +0 -8
  933. package/dist/integrationsBuilder/validators/joi-validators/create.integrationJob.validator.js.map +0 -1
  934. package/dist/integrationsBuilder/validators/joi-validators/create.integrationNotification.validator.d.ts +0 -3
  935. package/dist/integrationsBuilder/validators/joi-validators/create.integrationNotification.validator.js +0 -8
  936. package/dist/integrationsBuilder/validators/joi-validators/create.integrationNotification.validator.js.map +0 -1
  937. package/dist/integrationsBuilder/validators/joi-validators/update.integrationApp.validator.d.ts +0 -3
  938. package/dist/integrationsBuilder/validators/joi-validators/update.integrationApp.validator.js +0 -9
  939. package/dist/integrationsBuilder/validators/joi-validators/update.integrationApp.validator.js.map +0 -1
  940. package/dist/integrationsBuilder/validators/joi-validators/update.integrationCache.validator.d.ts +0 -3
  941. package/dist/integrationsBuilder/validators/joi-validators/update.integrationCache.validator.js +0 -8
  942. package/dist/integrationsBuilder/validators/joi-validators/update.integrationCache.validator.js.map +0 -1
  943. package/dist/integrationsBuilder/validators/joi-validators/update.integrationDatabase.validator.d.ts +0 -3
  944. package/dist/integrationsBuilder/validators/joi-validators/update.integrationDatabase.validator.js +0 -8
  945. package/dist/integrationsBuilder/validators/joi-validators/update.integrationDatabase.validator.js.map +0 -1
  946. package/dist/integrationsBuilder/validators/joi-validators/update.integrationEnv.validator.d.ts +0 -3
  947. package/dist/integrationsBuilder/validators/joi-validators/update.integrationEnv.validator.js +0 -8
  948. package/dist/integrationsBuilder/validators/joi-validators/update.integrationEnv.validator.js.map +0 -1
  949. package/dist/integrationsBuilder/validators/joi-validators/update.integrationFeature.validator.d.ts +0 -3
  950. package/dist/integrationsBuilder/validators/joi-validators/update.integrationFeature.validator.js +0 -8
  951. package/dist/integrationsBuilder/validators/joi-validators/update.integrationFeature.validator.js.map +0 -1
  952. package/dist/integrationsBuilder/validators/joi-validators/update.integrationFunction.validator copy.d.ts +0 -3
  953. package/dist/integrationsBuilder/validators/joi-validators/update.integrationFunction.validator copy.js +0 -8
  954. package/dist/integrationsBuilder/validators/joi-validators/update.integrationFunction.validator copy.js.map +0 -1
  955. package/dist/integrationsBuilder/validators/joi-validators/update.integrationJob.validator.d.ts +0 -3
  956. package/dist/integrationsBuilder/validators/joi-validators/update.integrationJob.validator.js +0 -8
  957. package/dist/integrationsBuilder/validators/joi-validators/update.integrationJob.validator.js.map +0 -1
  958. package/dist/integrationsBuilder/validators/joi-validators/update.integrationNotification.validator.d.ts +0 -3
  959. package/dist/integrationsBuilder/validators/joi-validators/update.integrationNotification.validator.js +0 -8
  960. package/dist/integrationsBuilder/validators/joi-validators/update.integrationNotification.validator.js.map +0 -1
  961. package/dist/postman.d.ts +0 -1
  962. package/dist/postman.js +0 -21674
  963. package/dist/postman.js.map +0 -1
  964. package/dist/processor/utils/mongo.util.js +0 -152
  965. package/dist/processor/utils/mongo.util.js.map +0 -1
  966. package/dist/processor/utils/postgres.util.d.ts +0 -14
  967. package/dist/processor/utils/postgres.util.js +0 -83
  968. package/dist/processor/utils/postgres.util.js.map +0 -1
  969. package/dist/products/validators/joi-validators/create.product.validator.d.ts +0 -3
  970. package/dist/products/validators/joi-validators/create.product.validator.js +0 -10
  971. package/dist/products/validators/joi-validators/create.product.validator.js.map +0 -1
  972. package/dist/test.appBuilder.js +0 -14
  973. package/dist/test.appBuilder.js.map +0 -1
  974. package/dist/test.import.js +0 -24
  975. package/dist/test.import.js.map +0 -1
  976. package/dist/test.imports.js +0 -28
  977. package/dist/test.imports.js.map +0 -1
  978. package/dist/test.integrationBuilder.js +0 -276
  979. package/dist/test.integrationBuilder.js.map +0 -1
  980. package/dist/test.processor.js +0 -23
  981. package/dist/test.processor.js.map +0 -1
  982. package/dist/test.utils.js +0 -25
  983. package/dist/test.utils.js.map +0 -1
  984. package/dist/types/integrationsBuilder.types.d.ts +0 -276
  985. package/dist/types/integrationsBuilder.types.js +0 -51
  986. package/dist/types/integrationsBuilder.types.js.map +0 -1
  987. /package/dist/{actions/actions.repo.d.ts → pricing/pricing.repo.d.ts} +0 -0
  988. /package/dist/{appBuilder/validators/joi-validators/create.app.validator.d.ts → products/validators/joi-validators/create.productGraph.validator.d.ts} +0 -0
  989. /package/dist/{appBuilder/validators/joi-validators/update.validation.entityData.validator.d.ts → products/validators/joi-validators/update.productGraph.validator.d.ts} +0 -0
  990. /package/dist/{test.appBuilder.d.ts → test/test.broker.kafka.d.ts} +0 -0
  991. /package/dist/{test.imports.d.ts → test/test.broker.nats.d.ts} +0 -0
  992. /package/dist/{test.integrationBuilder.d.ts → test/test.broker.pubsub.d.ts} +0 -0
  993. /package/dist/{test.processor.d.ts → test/test.broker.rabbitmq.d.ts} +0 -0
  994. /package/dist/{test.utils.d.ts → test/test.broker.redis.d.ts} +0 -0
  995. /package/dist/{actions/actions.service.d.ts → test/test.health.d.ts} +0 -0
  996. /package/dist/{actions/utils/actions.util.read.d.ts → test/test.notifiers.d.ts} +0 -0
  997. /package/dist/{processor/utils/mongo.util.d.ts → test/test.products.d.ts} +0 -0
  998. /package/dist/{test.import.d.ts → types/request-tracker.interface.d.ts} +0 -0
@@ -0,0 +1,2953 @@
1
+ "use strict";
2
+ /**
3
+ * DatabaseService - Main ORM Service Class
4
+ *
5
+ * This is the primary entry point for all database operations in the Ductape SDK.
6
+ * It provides a unified interface for querying, writing, transactions, schema management,
7
+ * migrations, and database actions across multiple database types.
8
+ *
9
+ * Supported databases: PostgreSQL, MySQL, MongoDB, DynamoDB, MariaDB, Cassandra
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.databaseService = exports.DatabaseConnection = exports.DatabaseService = void 0;
49
+ const enums_1 = require("./types/enums");
50
+ const presave_processor_1 = require("./presave/presave-processor");
51
+ const adapter_factory_1 = require("./adapters/adapter.factory");
52
+ const query_builder_1 = require("./operators/query-builder");
53
+ const aggregation_builder_1 = require("./operators/aggregation-builder");
54
+ const transaction_manager_1 = require("./transactions/transaction-manager");
55
+ const schema_manager_1 = require("./schema/schema-manager");
56
+ const migration_engine_1 = require("./migrations/migration-engine");
57
+ const action_manager_1 = require("./actions/action-manager");
58
+ const trigger_processor_1 = require("./triggers/trigger-processor");
59
+ const trigger_interface_1 = require("./types/trigger.interface");
60
+ const database_error_1 = require("./utils/database-error");
61
+ const products_service_1 = __importDefault(require("../products/services/products.service"));
62
+ const types_1 = require("../types");
63
+ const cache_manager_1 = require("../cache/cache.manager");
64
+ const processor_service_1 = __importDefault(require("../processor/services/processor.service"));
65
+ const crypto_1 = require("crypto");
66
+ const logs_service_1 = __importDefault(require("../logs/logs.service"));
67
+ const logs_types_1 = require("../logs/logs.types");
68
+ const processor_utils_1 = require("../processor/utils/processor.utils");
69
+ const secrets_1 = require("../secrets");
70
+ /**
71
+ * Main Database Service class
72
+ * Provides unified ORM interface for all supported databases
73
+ */
74
+ class DatabaseService {
75
+ /**
76
+ * Create a new DatabaseService instance
77
+ * @param config - Optional configuration for authentication and workspace context
78
+ */
79
+ constructor(config) {
80
+ this.adapters = new Map();
81
+ this.connectionContexts = new Map();
82
+ this.currentContext = null;
83
+ this.schemaManagers = new Map();
84
+ this.migrationEngines = new Map();
85
+ /** Service configuration */
86
+ this.config = null;
87
+ /** ProductBuilder instances cache (keyed by product tag) */
88
+ this.productBuilders = new Map();
89
+ /** LogService instance for logging operations */
90
+ this.logService = null;
91
+ /** Current product ID for logging */
92
+ this.productId = '';
93
+ /** CacheManager for two-tier caching (Redis + remote) */
94
+ this.cacheManager = null;
95
+ /** Private keys cache for products (keyed by product tag) */
96
+ this.privateKeys = new Map();
97
+ this.config = config || null;
98
+ this.adapterFactory = new adapter_factory_1.AdapterFactory();
99
+ this.transactionManager = new transaction_manager_1.TransactionManager();
100
+ this.actionManager = new action_manager_1.ActionManager(this);
101
+ this._privateKey = (config === null || config === void 0 ? void 0 : config.private_key) || '';
102
+ // Initialize CacheManager if Redis client is provided
103
+ if (config === null || config === void 0 ? void 0 : config.redis_client) {
104
+ this.cacheManager = new cache_manager_1.CacheManager({
105
+ workspace_id: config.workspace_id,
106
+ public_key: config.public_key,
107
+ user_id: config.user_id,
108
+ token: config.token,
109
+ env_type: config.env_type,
110
+ redis_client: config.redis_client,
111
+ });
112
+ }
113
+ }
114
+ /**
115
+ * Get or create a SchemaManager for the given adapter key or current context
116
+ */
117
+ getSchemaManager(adapterKey) {
118
+ // If no key provided, use current context
119
+ if (!adapterKey) {
120
+ if (!this.currentContext) {
121
+ throw new database_error_1.DatabaseError('No active database connection. Please connect first.', enums_1.DatabaseErrorType.CONNECTION_ERROR);
122
+ }
123
+ adapterKey = this.buildContextKey(this.currentContext.database, this.currentContext.env);
124
+ }
125
+ let manager = this.schemaManagers.get(adapterKey);
126
+ if (!manager) {
127
+ const adapter = this.adapters.get(adapterKey);
128
+ if (!adapter) {
129
+ throw new database_error_1.DatabaseError(`No adapter found for key: ${adapterKey}`, enums_1.DatabaseErrorType.NOT_FOUND);
130
+ }
131
+ manager = new schema_manager_1.SchemaManager(adapter);
132
+ this.schemaManagers.set(adapterKey, manager);
133
+ }
134
+ return manager;
135
+ }
136
+ /**
137
+ * Get or create a MigrationEngine for the given adapter key or current context
138
+ */
139
+ getMigrationEngine(adapterKey) {
140
+ // If no key provided, use current context
141
+ if (!adapterKey) {
142
+ if (!this.currentContext) {
143
+ throw new database_error_1.DatabaseError('No active database connection. Please connect first.', enums_1.DatabaseErrorType.CONNECTION_ERROR);
144
+ }
145
+ adapterKey = this.buildContextKey(this.currentContext.database, this.currentContext.env);
146
+ }
147
+ let engine = this.migrationEngines.get(adapterKey);
148
+ if (!engine) {
149
+ const adapter = this.adapters.get(adapterKey);
150
+ if (!adapter) {
151
+ throw new database_error_1.DatabaseError(`No adapter found for key: ${adapterKey}`, enums_1.DatabaseErrorType.NOT_FOUND);
152
+ }
153
+ engine = new migration_engine_1.MigrationEngine(adapter);
154
+ this.migrationEngines.set(adapterKey, engine);
155
+ }
156
+ return engine;
157
+ }
158
+ // ==================== PRODUCT BUILDER MANAGEMENT ====================
159
+ /**
160
+ * Create a new ProductBuilder instance
161
+ */
162
+ createNewProductBuilder() {
163
+ if (!this.config) {
164
+ throw new database_error_1.DatabaseError('DatabaseService not configured. Please provide config when initializing.', enums_1.DatabaseErrorType.CONFIGURATION_ERROR);
165
+ }
166
+ return new products_service_1.default({
167
+ workspace_id: this.config.workspace_id,
168
+ public_key: this.config.public_key,
169
+ user_id: this.config.user_id,
170
+ token: this.config.token,
171
+ env_type: this.config.env_type,
172
+ access_key: this.config.access_key,
173
+ });
174
+ }
175
+ /**
176
+ * Get or create a ProductBuilder instance for the given product tag
177
+ */
178
+ async getProductBuilder(productTag) {
179
+ let builder = this.productBuilders.get(productTag);
180
+ if (!builder) {
181
+ builder = this.createNewProductBuilder();
182
+ await builder.initializeProductByTag(productTag);
183
+ this.productBuilders.set(productTag, builder);
184
+ // Update productId for logging
185
+ this.productId = builder.fetchProductId() || '';
186
+ // Cache private key for caching operations
187
+ const privateKey = builder.fetchPrivateKey();
188
+ if (privateKey) {
189
+ this.privateKeys.set(productTag, privateKey);
190
+ }
191
+ }
192
+ return builder;
193
+ }
194
+ /**
195
+ * Initialize logging service
196
+ */
197
+ initializeLogService() {
198
+ if (!this.logService && this.config) {
199
+ this.logService = new logs_service_1.default({
200
+ product_id: this.productId,
201
+ workspace_id: this.config.workspace_id,
202
+ public_key: this.config.public_key,
203
+ user_id: this.config.user_id,
204
+ token: this.config.token,
205
+ env_type: this.config.env_type,
206
+ });
207
+ }
208
+ }
209
+ /**
210
+ * Create a new ProcessorService instance for job scheduling
211
+ */
212
+ createNewProcessor() {
213
+ if (!this.config) {
214
+ throw new database_error_1.DatabaseError('DatabaseService not configured. Please provide config when initializing.', enums_1.DatabaseErrorType.CONFIGURATION_ERROR);
215
+ }
216
+ return new processor_service_1.default({
217
+ workspace_id: this.config.workspace_id,
218
+ public_key: this.config.public_key,
219
+ user_id: this.config.user_id,
220
+ token: this.config.token,
221
+ env_type: this.config.env_type,
222
+ private_key: this._privateKey,
223
+ });
224
+ }
225
+ // ==================== DATABASE CRUD OPERATIONS ====================
226
+ /**
227
+ * Register a new database configuration for a product
228
+ * @param productTag - The product tag
229
+ * @param data - The database configuration data
230
+ */
231
+ async registerDatabase(productTag, data) {
232
+ const builder = await this.getProductBuilder(productTag);
233
+ return builder.createDatabase(data);
234
+ }
235
+ /**
236
+ * Fetch all databases for a product
237
+ * @param productTag - The product tag
238
+ * @returns Array of database configurations
239
+ */
240
+ async fetchAllDatabases(productTag) {
241
+ const builder = await this.getProductBuilder(productTag);
242
+ return builder.fetchDatabases();
243
+ }
244
+ /**
245
+ * Fetch a specific database by tag
246
+ * @param productTag - The product tag
247
+ * @param databaseTag - The database tag
248
+ * @returns The database configuration or null if not found
249
+ */
250
+ async fetchDatabase(productTag, databaseTag) {
251
+ const builder = await this.getProductBuilder(productTag);
252
+ return builder.fetchDatabase(databaseTag);
253
+ }
254
+ /**
255
+ * Update a database configuration
256
+ * @param productTag - The product tag
257
+ * @param databaseTag - The database tag
258
+ * @param data - The data to update
259
+ */
260
+ async updateDatabase(productTag, databaseTag, data) {
261
+ const builder = await this.getProductBuilder(productTag);
262
+ // Process connection URLs in envs if provided
263
+ if (data.envs && data.envs.length > 0) {
264
+ const secretsService = (0, secrets_1.getSecretsService)();
265
+ const processedEnvs = [];
266
+ for (const env of data.envs) {
267
+ let connectionUrl = env.connection_url;
268
+ const secretCheck = (0, secrets_1.isSecretReference)(connectionUrl);
269
+ // If not already a secret reference and we have a secrets service, store it as a secret
270
+ if (!secretCheck.isSecret && secretsService) {
271
+ const secretKey = this.generateDbSecretKey(productTag, databaseTag, env.slug);
272
+ try {
273
+ const exists = await secretsService.exists(secretKey);
274
+ if (exists) {
275
+ await secretsService.update(secretKey, { value: connectionUrl });
276
+ console.log(`[Secrets] Updated existing secret '${secretKey}' for database '${databaseTag}' in environment '${env.slug}'`);
277
+ }
278
+ else {
279
+ await secretsService.create({
280
+ key: secretKey,
281
+ value: connectionUrl,
282
+ description: `Database connection URL for ${databaseTag} in ${env.slug}`,
283
+ scope: [productTag, databaseTag],
284
+ envs: [env.slug],
285
+ });
286
+ console.log(`[Secrets] Created new secret '${secretKey}' for database '${databaseTag}' in environment '${env.slug}'`);
287
+ }
288
+ // Update the connection URL to use the secret reference
289
+ connectionUrl = `$Secret{${secretKey}}`;
290
+ console.log(`[Secrets] Connection URL converted to secret reference: $Secret{${secretKey}}`);
291
+ }
292
+ catch (error) {
293
+ console.warn(`[Secrets] Failed to store database connection URL as secret: ${error}`);
294
+ // Continue with the original connection URL
295
+ }
296
+ }
297
+ processedEnvs.push(Object.assign(Object.assign({}, env), { connection_url: connectionUrl }));
298
+ }
299
+ data = Object.assign(Object.assign({}, data), { envs: processedEnvs });
300
+ }
301
+ return builder.updateDatabase(databaseTag, data);
302
+ }
303
+ // ==================== DATABASE TRIGGER OPERATIONS ====================
304
+ /**
305
+ * Create a database trigger
306
+ * @param productTag - The product tag
307
+ * @param data - The trigger configuration
308
+ */
309
+ async createTrigger(productTag, data) {
310
+ const builder = await this.getProductBuilder(productTag);
311
+ return builder.createDatabaseTrigger(data);
312
+ }
313
+ /**
314
+ * Update a database trigger
315
+ * @param productTag - The product tag
316
+ * @param data - The trigger configuration
317
+ */
318
+ async updateTrigger(productTag, data) {
319
+ const builder = await this.getProductBuilder(productTag);
320
+ return builder.updateDatabaseTrigger(data);
321
+ }
322
+ /**
323
+ * Fetch a database trigger
324
+ * @param productTag - The product tag
325
+ * @param tag - The trigger tag (format: database_tag:trigger_tag)
326
+ */
327
+ async fetchTrigger(productTag, tag) {
328
+ const builder = await this.getProductBuilder(productTag);
329
+ return builder.fetchDatabaseTrigger(tag);
330
+ }
331
+ /**
332
+ * Fetch all triggers for a database
333
+ * @param productTag - The product tag
334
+ * @param databaseTag - The database tag
335
+ */
336
+ async fetchTriggers(productTag, databaseTag) {
337
+ const builder = await this.getProductBuilder(productTag);
338
+ return builder.fetchDatabaseTriggers(databaseTag);
339
+ }
340
+ /**
341
+ * Delete a database trigger
342
+ * @param productTag - The product tag
343
+ * @param tag - The trigger tag (format: database_tag:trigger_tag)
344
+ */
345
+ async deleteTrigger(productTag, tag) {
346
+ const builder = await this.getProductBuilder(productTag);
347
+ return builder.deleteDatabaseTrigger(tag);
348
+ }
349
+ /**
350
+ * Get the current service configuration
351
+ */
352
+ getConfig() {
353
+ return this.config;
354
+ }
355
+ /**
356
+ * Update the service configuration (used after auth is complete)
357
+ */
358
+ updateConfig(config) {
359
+ if (this.config) {
360
+ this.config = Object.assign(Object.assign({}, this.config), config);
361
+ }
362
+ else {
363
+ this.config = config;
364
+ }
365
+ }
366
+ /**
367
+ * Get workspace ID from config
368
+ */
369
+ getWorkspaceId() {
370
+ var _a;
371
+ return ((_a = this.config) === null || _a === void 0 ? void 0 : _a.workspace_id) || null;
372
+ }
373
+ /**
374
+ * Get user ID from config
375
+ */
376
+ getUserId() {
377
+ var _a;
378
+ return ((_a = this.config) === null || _a === void 0 ? void 0 : _a.user_id) || null;
379
+ }
380
+ /**
381
+ * Get authentication token from config
382
+ */
383
+ getToken() {
384
+ var _a;
385
+ return ((_a = this.config) === null || _a === void 0 ? void 0 : _a.token) || null;
386
+ }
387
+ /**
388
+ * Get environment type from config
389
+ */
390
+ getEnvType() {
391
+ var _a;
392
+ return ((_a = this.config) === null || _a === void 0 ? void 0 : _a.env_type) || null;
393
+ }
394
+ // ==================== CONNECTION MANAGEMENT ====================
395
+ /**
396
+ * Create/register a new database configuration
397
+ *
398
+ * @example
399
+ * // Persist to product
400
+ * await ductape.database.create({
401
+ * product: 'my-product',
402
+ * name: 'User Database',
403
+ * tag: 'users-db',
404
+ * type: 'postgresql',
405
+ * description: 'Stores user accounts and profiles',
406
+ * envs: [
407
+ * { slug: 'dev', connection_url: 'postgresql://localhost:5432/myapp_dev' },
408
+ * { slug: 'prd', connection_url: 'postgresql://prod-host:5432/myapp_prod' },
409
+ * ],
410
+ * });
411
+ *
412
+ * // Local only (not persisted)
413
+ * await ductape.database.create({
414
+ * name: 'Temp Database',
415
+ * tag: 'temp-db',
416
+ * type: 'postgresql',
417
+ * envs: [{ slug: 'dev', connection_url: 'postgresql://localhost:5432/temp' }],
418
+ * });
419
+ */
420
+ async create(config) {
421
+ var _a;
422
+ // Validate required fields
423
+ if (!config.name || !config.tag || !config.type || !((_a = config.envs) === null || _a === void 0 ? void 0 : _a.length)) {
424
+ throw new database_error_1.DatabaseError('Missing required fields: name, tag, type, and envs are required', enums_1.DatabaseErrorType.VALIDATION_ERROR);
425
+ }
426
+ const exists = await this.fetchDatabase(config.product, config.tag);
427
+ if (exists) {
428
+ return;
429
+ }
430
+ // Validate database type
431
+ if (!Object.values(enums_1.DatabaseType).includes(config.type)) {
432
+ throw new database_error_1.DatabaseError(`Unsupported database type: ${config.type}. Supported types: ${Object.values(enums_1.DatabaseType).join(', ')}`, enums_1.DatabaseErrorType.VALIDATION_ERROR);
433
+ }
434
+ // Process connection URLs - store as secrets if not already secret references
435
+ const secretsService = (0, secrets_1.getSecretsService)();
436
+ const processedEnvs = [];
437
+ for (const env of config.envs) {
438
+ let connectionUrl = env.connection_url;
439
+ const secretCheck = (0, secrets_1.isSecretReference)(connectionUrl);
440
+ // If not already a secret reference and we have a secrets service, store it as a secret
441
+ if (!secretCheck.isSecret && secretsService && config.product) {
442
+ const secretKey = this.generateDbSecretKey(config.product, config.tag, env.slug);
443
+ try {
444
+ const exists = await secretsService.exists(secretKey);
445
+ if (exists) {
446
+ await secretsService.update(secretKey, { value: connectionUrl });
447
+ }
448
+ else {
449
+ await secretsService.create({
450
+ key: secretKey,
451
+ value: connectionUrl,
452
+ description: `Database connection URL for ${config.tag} in ${env.slug}`,
453
+ scope: [config.product, config.tag],
454
+ envs: [env.slug],
455
+ });
456
+ }
457
+ // Update the connection URL to use the secret reference
458
+ connectionUrl = `$Secret{${secretKey}}`;
459
+ }
460
+ catch (error) {
461
+ // Continue with the original connection URL on failure
462
+ }
463
+ }
464
+ processedEnvs.push(Object.assign(Object.assign({}, env), { connection_url: connectionUrl }));
465
+ }
466
+ // Persist to ProductBuilder if product is specified
467
+ if (config.product) {
468
+ const productBuilder = await this.getProductBuilder(config.product);
469
+ await productBuilder.createDatabase({
470
+ name: config.name,
471
+ tag: config.tag,
472
+ type: config.type, // DatabaseType maps to DatabaseTypes enum
473
+ description: config.description,
474
+ envs: processedEnvs.map(env => ({
475
+ slug: env.slug,
476
+ connection_url: env.connection_url,
477
+ description: env.description,
478
+ })),
479
+ });
480
+ }
481
+ // Create local adapters and connection contexts
482
+ this.createAdapter({
483
+ tag: config.tag,
484
+ name: config.name,
485
+ type: config.type,
486
+ description: config.description,
487
+ envs: processedEnvs,
488
+ });
489
+ }
490
+ /**
491
+ * Create local adapter and connection context for a database configuration.
492
+ * This is a lightweight operation that only sets up local state without API calls.
493
+ * Use this when the database config is already fetched/decrypted from the API.
494
+ *
495
+ * @param config - The database configuration (already decrypted if from API)
496
+ */
497
+ createAdapter(config) {
498
+ var _a;
499
+ // Validate required fields
500
+ if (!config.tag || !config.type || !((_a = config.envs) === null || _a === void 0 ? void 0 : _a.length)) {
501
+ throw new database_error_1.DatabaseError('Database configuration requires tag, type, and at least one environment', enums_1.DatabaseErrorType.VALIDATION_ERROR);
502
+ }
503
+ const databaseType = typeof config.type === 'string'
504
+ ? this.convertDatabaseType(config.type)
505
+ : config.type;
506
+ // Validate database type
507
+ if (!Object.values(enums_1.DatabaseType).includes(databaseType)) {
508
+ throw new database_error_1.DatabaseError(`Unsupported database type: ${config.type}. Supported types: ${Object.values(enums_1.DatabaseType).join(', ')}`, enums_1.DatabaseErrorType.VALIDATION_ERROR);
509
+ }
510
+ // Create adapters and contexts for each environment
511
+ for (const envConfig of config.envs) {
512
+ const contextKey = this.buildContextKey(config.tag, envConfig.slug);
513
+ // Skip if already exists
514
+ if (this.adapters.has(contextKey) && this.connectionContexts.has(contextKey)) {
515
+ continue;
516
+ }
517
+ const adapter = this.adapterFactory.create(databaseType);
518
+ this.adapters.set(contextKey, adapter);
519
+ this.connectionContexts.set(contextKey, {
520
+ database: config.tag,
521
+ env: envConfig.slug,
522
+ type: databaseType,
523
+ connectionUrl: envConfig.connection_url,
524
+ connected: false,
525
+ name: config.name,
526
+ description: config.description,
527
+ });
528
+ }
529
+ }
530
+ /**
531
+ * Generate a secret key for database connection URLs
532
+ * Format: DB_{PRODUCT}_{ASSET_TAG}_{ENV}_{KEY}
533
+ *
534
+ * Where:
535
+ * - PRODUCT = productTag.split('.')[1] (second part after workspace)
536
+ * - ASSET_TAG = if dbTag starts with same workspace prefix, use second part; otherwise sanitize full tag
537
+ * - All parts are automatically capitalized
538
+ */
539
+ generateDbSecretKey(product, dbTag, env) {
540
+ const sanitize = (str) => str.toUpperCase().replace(/[^A-Z0-9]/g, '_');
541
+ // Support both ':' and '.' delimiters for product tags (e.g., 'ductape:rematch' or 'ductape.rematch')
542
+ const productParts = product.includes(':') ? product.split(':') : product.split('.');
543
+ const productKey = productParts[1] || productParts[0]; // Use product name (index 1), fallback to index 0
544
+ const workspace = productParts[0];
545
+ // Support both ':' and '.' delimiters for database tags
546
+ const dbParts = dbTag.includes(':') ? dbTag.split(':') : dbTag.split('.');
547
+ let assetTag;
548
+ if (dbParts.length > 1 && dbParts[0] === workspace) {
549
+ // Same workspace prefix, use second part
550
+ assetTag = dbParts[1];
551
+ }
552
+ else {
553
+ // Different or no prefix, use full tag
554
+ assetTag = dbTag;
555
+ }
556
+ return `DB_${sanitize(productKey)}_${sanitize(assetTag)}_${sanitize(env)}_URL`;
557
+ }
558
+ /**
559
+ * Connect to a database
560
+ *
561
+ * @example
562
+ * const result = await ductape.database.connect({
563
+ * env: 'dev',
564
+ * product: 'my-app',
565
+ * database: 'users-db',
566
+ * });
567
+ * console.log('Connected:', result.connected);
568
+ * console.log('Database Version:', result.version);
569
+ * console.log('Latency:', result.latency, 'ms');
570
+ *
571
+ * // With the returned connection object, you can use scoped operations:
572
+ * const db = await ductape.databases.connect({ env: 'dev', product: 'my-app', database: 'users-db' });
573
+ * await db.triggers.create({ tag: 'my-trigger', ... });
574
+ */
575
+ async connect(config) {
576
+ var _a, _b, _c, _d, _e, _f;
577
+ const process_id = (0, processor_utils_1.generateObjectId)();
578
+ const start = Date.now();
579
+ const contextKey = this.buildContextKey(config.database, config.env);
580
+ let adapter = this.adapters.get(contextKey);
581
+ let context = this.connectionContexts.get(contextKey);
582
+ // If not found locally, fetch from the remote API
583
+ if (!adapter || !context) {
584
+ if (!config.product) {
585
+ throw new database_error_1.DatabaseError(`Database '${config.database}' not found locally. Please provide 'product' to fetch from remote.`, enums_1.DatabaseErrorType.NOT_FOUND);
586
+ }
587
+ // Initialize product builder
588
+ await this.getProductBuilder(config.product);
589
+ // Fetch the database config from the API (already decrypted)
590
+ const dbConfig = await this.fetchDatabase(config.product, config.database);
591
+ if (!dbConfig) {
592
+ throw new database_error_1.DatabaseError(`Database '${config.database}' not found for product '${config.product}'.`, enums_1.DatabaseErrorType.NOT_FOUND);
593
+ }
594
+ // Register the database locally (config is already decrypted from API)
595
+ this.createAdapter({
596
+ tag: config.database,
597
+ name: dbConfig.name,
598
+ type: dbConfig.type,
599
+ description: dbConfig.description,
600
+ envs: dbConfig.envs.map(e => ({
601
+ slug: e.slug,
602
+ connection_url: e.connection_url,
603
+ description: e.description,
604
+ })),
605
+ });
606
+ adapter = this.adapters.get(contextKey);
607
+ context = this.connectionContexts.get(contextKey);
608
+ }
609
+ if (!adapter || !context) {
610
+ throw new database_error_1.DatabaseError(`Failed to initialize adapter for ${contextKey}`, enums_1.DatabaseErrorType.CONNECTION_ERROR);
611
+ }
612
+ // Initialize logging
613
+ this.initializeLogService();
614
+ const envValue = config.env || '';
615
+ const baseLogs = {
616
+ product_tag: config.product || '',
617
+ workspace_id: ((_a = this.config) === null || _a === void 0 ? void 0 : _a.workspace_id) || '',
618
+ env: envValue,
619
+ app_env: envValue,
620
+ process_id,
621
+ type: logs_types_1.LogEventTypes.DATABASE,
622
+ parent_tag: config.database,
623
+ child_tag: 'connect',
624
+ data: { database: config.database, env: envValue, operation: 'connect' },
625
+ };
626
+ (_b = this.logService) === null || _b === void 0 ? void 0 : _b.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database connect - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
627
+ try {
628
+ // Resolve secret reference in connection URL if needed
629
+ let connectionUrl = context.connectionUrl;
630
+ const secretCheck = (0, secrets_1.isSecretReference)(connectionUrl);
631
+ if (secretCheck.isSecret) {
632
+ const secretsService = (0, secrets_1.getSecretsService)();
633
+ if (secretsService) {
634
+ const resolved = await secretsService.resolve(connectionUrl, { env: config.env });
635
+ connectionUrl = resolved.value;
636
+ }
637
+ else {
638
+ throw new database_error_1.DatabaseError(`Connection URL contains secret reference but secrets service is not initialized.`, enums_1.DatabaseErrorType.CONNECTION_ERROR);
639
+ }
640
+ }
641
+ await adapter.connect({
642
+ connectionUrl,
643
+ });
644
+ context.connected = true;
645
+ context.product = config.product;
646
+ this.currentContext = context;
647
+ const end = Date.now();
648
+ (_c = this.logService) === null || _c === void 0 ? void 0 : _c.add(Object.assign(Object.assign({}, baseLogs), { start,
649
+ end, message: 'Database connect - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
650
+ (_d = this.logService) === null || _d === void 0 ? void 0 : _d.publish();
651
+ // Return a DatabaseConnection object for scoped operations
652
+ return new DatabaseConnection(this, config.database, config.env, config.product || '');
653
+ }
654
+ catch (error) {
655
+ const end = Date.now();
656
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start,
657
+ end, message: 'Database connect - failed', failed_execution: true, data: { database: config.database, env: config.env, error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
658
+ await ((_f = this.logService) === null || _f === void 0 ? void 0 : _f.publish());
659
+ throw new database_error_1.DatabaseError(`Failed to connect to database: ${error.message}`, enums_1.DatabaseErrorType.CONNECTION_ERROR, error);
660
+ }
661
+ }
662
+ /**
663
+ * Test database connection without establishing persistent connection
664
+ *
665
+ * @example
666
+ * const result = await ductape.database.testConnection({
667
+ * env: 'dev',
668
+ * product: 'my-app',
669
+ * database: 'users-db',
670
+ * });
671
+ * if (result.connected) {
672
+ * console.log('Connection successful!');
673
+ * } else {
674
+ * console.error('Connection failed:', result.error);
675
+ * }
676
+ */
677
+ async testConnection(config) {
678
+ const contextKey = this.buildContextKey(config.database, config.env);
679
+ let adapter = this.adapters.get(contextKey);
680
+ let context = this.connectionContexts.get(contextKey);
681
+ if (!adapter || !context) {
682
+ return {
683
+ connected: false,
684
+ error: `Database '${config.database}' not found for environment '${config.env}'`,
685
+ };
686
+ }
687
+ const startTime = Date.now();
688
+ try {
689
+ const result = await adapter.testConnection({
690
+ connectionUrl: context.connectionUrl,
691
+ });
692
+ return {
693
+ connected: result.connected,
694
+ version: result.version,
695
+ latency: Date.now() - startTime,
696
+ };
697
+ }
698
+ catch (error) {
699
+ return {
700
+ connected: false,
701
+ error: error.message,
702
+ latency: Date.now() - startTime,
703
+ };
704
+ }
705
+ }
706
+ /**
707
+ * Disconnect from the current database
708
+ */
709
+ async disconnect() {
710
+ if (this.currentContext) {
711
+ const contextKey = this.buildContextKey(this.currentContext.database, this.currentContext.env);
712
+ const adapter = this.adapters.get(contextKey);
713
+ if (adapter) {
714
+ await adapter.disconnect();
715
+ this.currentContext.connected = false;
716
+ }
717
+ this.currentContext = null;
718
+ }
719
+ }
720
+ /**
721
+ * Close all database connections
722
+ *
723
+ * @example
724
+ * await ductape.database.closeAll();
725
+ */
726
+ async closeAll() {
727
+ const disconnectPromises = [];
728
+ for (const [key, adapter] of this.adapters) {
729
+ disconnectPromises.push(adapter.disconnect());
730
+ const context = this.connectionContexts.get(key);
731
+ if (context) {
732
+ context.connected = false;
733
+ }
734
+ }
735
+ await Promise.all(disconnectPromises);
736
+ this.currentContext = null;
737
+ }
738
+ /**
739
+ * Fetch all registered databases
740
+ *
741
+ * @example
742
+ * const databases = await ductape.database.fetchAll();
743
+ * databases.forEach((db) => {
744
+ * console.log(`${db.name} (${db.tag}): ${db.type}`);
745
+ * });
746
+ */
747
+ async fetchAll(product) {
748
+ const databases = new Map();
749
+ for (const [key, context] of this.connectionContexts) {
750
+ if (!databases.has(context.database)) {
751
+ databases.set(context.database, {
752
+ product,
753
+ name: context.name || context.database,
754
+ tag: context.database,
755
+ type: context.type,
756
+ description: context.description,
757
+ envs: [],
758
+ });
759
+ }
760
+ databases.get(context.database).envs.push({
761
+ slug: context.env,
762
+ connection_url: context.connectionUrl,
763
+ });
764
+ }
765
+ return Array.from(databases.values());
766
+ }
767
+ /**
768
+ * Fetch a specific database configuration
769
+ *
770
+ * @example
771
+ * const usersDb = await ductape.database.fetch('users-db');
772
+ * console.log('Database:', usersDb.name);
773
+ * console.log('Type:', usersDb.type);
774
+ * console.log('Environments:', usersDb.envs);
775
+ */
776
+ async fetch(product, database) {
777
+ const databases = await this.fetchAll(product);
778
+ return databases.find((db) => db.tag === database) || null;
779
+ }
780
+ /**
781
+ * Update a local database configuration
782
+ *
783
+ * @example
784
+ * await ductape.database.updateLocalConfig('users-db', {
785
+ * name: 'User Database v2',
786
+ * description: 'Updated user storage',
787
+ * envs: [
788
+ * { slug: 'dev', connection_url: 'postgresql://new-dev-host:5432/myapp' },
789
+ * ],
790
+ * });
791
+ */
792
+ async updateLocalConfig(tag, updates) {
793
+ for (const [key, context] of this.connectionContexts) {
794
+ if (context.database === tag) {
795
+ if (updates.name) {
796
+ context.name = updates.name;
797
+ }
798
+ if (updates.description) {
799
+ context.description = updates.description;
800
+ }
801
+ if (updates.envs) {
802
+ const envUpdate = updates.envs.find((e) => e.slug === context.env);
803
+ if (envUpdate) {
804
+ context.connectionUrl = envUpdate.connection_url;
805
+ }
806
+ }
807
+ }
808
+ }
809
+ }
810
+ // ==================== QUERY OPERATIONS ====================
811
+ /**
812
+ * Query records from a table
813
+ *
814
+ * @example
815
+ * // With established connection
816
+ * const result = await ductape.database.query({
817
+ * table: 'users',
818
+ * where: { status: 'active' },
819
+ * orderBy: { column: 'created_at', order: 'DESC' },
820
+ * limit: 10,
821
+ * });
822
+ *
823
+ * // With explicit connection params
824
+ * const result = await ductape.database.query({
825
+ * env: 'prd',
826
+ * product: 'my-app',
827
+ * database: 'main-db',
828
+ * table: 'users',
829
+ * });
830
+ */
831
+ async query(options) {
832
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
833
+ const process_id = (0, processor_utils_1.generateObjectId)();
834
+ const start = Date.now();
835
+ this.initializeLogService();
836
+ // Session log fields (will be populated if session is provided)
837
+ let sessionLogFields = {};
838
+ let resolvedOptions = options;
839
+ // Process session if provided
840
+ if (options.session && options.product) {
841
+ const builder = await this.getProductBuilder(options.product);
842
+ const privateKey = builder.fetchPrivateKey();
843
+ if (privateKey) {
844
+ const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
845
+ const sessionResult = await processSessionForExecution(options.session, privateKey, options, options.env);
846
+ if (sessionResult.error) {
847
+ throw new Error(`Session validation failed: ${sessionResult.error}`);
848
+ }
849
+ resolvedOptions = sessionResult.input;
850
+ sessionLogFields = sessionResult.logFields;
851
+ }
852
+ }
853
+ const envValue = options.env || ((_a = this.currentContext) === null || _a === void 0 ? void 0 : _a.env) || '';
854
+ const baseLogs = Object.assign({ product_tag: options.product || ((_b = this.currentContext) === null || _b === void 0 ? void 0 : _b.product) || '', workspace_id: ((_c = this.config) === null || _c === void 0 ? void 0 : _c.workspace_id) || '', env: envValue, app_env: envValue, process_id, type: logs_types_1.LogEventTypes.DATABASE, parent_tag: options.database || ((_d = this.currentContext) === null || _d === void 0 ? void 0 : _d.database) || '', child_tag: 'query', data: {
855
+ table: options.table,
856
+ operation: 'query',
857
+ database: options.database || ((_e = this.currentContext) === null || _e === void 0 ? void 0 : _e.database) || '',
858
+ env: envValue,
859
+ where: options.where,
860
+ select: options.select,
861
+ orderBy: options.orderBy,
862
+ limit: options.limit,
863
+ offset: options.offset,
864
+ include: options.include,
865
+ } }, sessionLogFields);
866
+ (_f = this.logService) === null || _f === void 0 ? void 0 : _f.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database query - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
867
+ try {
868
+ // Check cache if cache tag is provided
869
+ const privateKey = options.product ? this.privateKeys.get(options.product) : undefined;
870
+ if (options.cache && this.cacheManager && privateKey) {
871
+ const cacheOptions = {
872
+ cache_tag: options.cache,
873
+ product_tag: options.product || '',
874
+ component_tag: options.database || '',
875
+ component_type: 'database',
876
+ input: { table: options.table, where: options.where, select: options.select, orderBy: options.orderBy, limit: options.limit, offset: options.offset },
877
+ privateKey,
878
+ };
879
+ const cached = await this.cacheManager.fetch(cacheOptions);
880
+ if (cached.hit && cached.data) {
881
+ const end = Date.now();
882
+ (_g = this.logService) === null || _g === void 0 ? void 0 : _g.add(Object.assign(Object.assign({}, baseLogs), { start,
883
+ end, message: `Database query - cache hit (${cached.source})`, successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
884
+ (_h = this.logService) === null || _h === void 0 ? void 0 : _h.publish();
885
+ return cached.data;
886
+ }
887
+ }
888
+ const adapter = this.getAdapter(resolvedOptions);
889
+ const queryBuilder = new query_builder_1.QueryBuilder(adapter.getDatabaseType());
890
+ const builtQuery = queryBuilder.buildQuery(resolvedOptions);
891
+ const result = await adapter.query(builtQuery);
892
+ // Store in cache if cache tag is provided
893
+ if (options.cache && this.cacheManager && privateKey) {
894
+ const cacheOptions = {
895
+ cache_tag: options.cache,
896
+ product_tag: options.product || '',
897
+ component_tag: options.database || '',
898
+ component_type: 'database',
899
+ input: { table: options.table, where: options.where, select: options.select, orderBy: options.orderBy, limit: options.limit, offset: options.offset },
900
+ privateKey,
901
+ };
902
+ await this.cacheManager.store(cacheOptions, result);
903
+ }
904
+ const end = Date.now();
905
+ (_j = this.logService) === null || _j === void 0 ? void 0 : _j.add(Object.assign(Object.assign({}, baseLogs), { start,
906
+ end, message: 'Database query - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
907
+ (_k = this.logService) === null || _k === void 0 ? void 0 : _k.publish();
908
+ return result;
909
+ }
910
+ catch (error) {
911
+ const end = Date.now();
912
+ (_l = this.logService) === null || _l === void 0 ? void 0 : _l.add(Object.assign(Object.assign({}, baseLogs), { start,
913
+ end, message: 'Database query - failed', failed_execution: true, data: { table: options.table, operation: 'query', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
914
+ await ((_m = this.logService) === null || _m === void 0 ? void 0 : _m.publish());
915
+ throw error;
916
+ }
917
+ }
918
+ /**
919
+ * Execute a raw query
920
+ *
921
+ * @example
922
+ * // PostgreSQL
923
+ * const result = await ductape.database.raw({
924
+ * query: 'SELECT * FROM users WHERE created_at > $1 AND status = $2',
925
+ * params: [new Date('2024-01-01'), 'active'],
926
+ * });
927
+ *
928
+ * // MySQL
929
+ * const result = await ductape.database.raw({
930
+ * query: 'SELECT * FROM users WHERE created_at > ? AND status = ?',
931
+ * params: [new Date('2024-01-01'), 'active'],
932
+ * });
933
+ *
934
+ * // MongoDB
935
+ * const result = await ductape.database.raw({
936
+ * query: { status: 'active', created_at: { $gte: new Date('2024-01-01') } },
937
+ * collection: 'users',
938
+ * });
939
+ */
940
+ async raw(options) {
941
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
942
+ const process_id = (0, processor_utils_1.generateObjectId)();
943
+ const start = Date.now();
944
+ this.initializeLogService();
945
+ const envValue = options.env || ((_a = this.currentContext) === null || _a === void 0 ? void 0 : _a.env) || '';
946
+ const databaseValue = options.database || ((_b = this.currentContext) === null || _b === void 0 ? void 0 : _b.database) || '';
947
+ const baseLogs = {
948
+ product_tag: options.product || ((_c = this.currentContext) === null || _c === void 0 ? void 0 : _c.product) || '',
949
+ workspace_id: ((_d = this.config) === null || _d === void 0 ? void 0 : _d.workspace_id) || '',
950
+ env: envValue,
951
+ app_env: envValue,
952
+ process_id,
953
+ type: logs_types_1.LogEventTypes.DATABASE,
954
+ parent_tag: databaseValue,
955
+ child_tag: 'raw',
956
+ data: {
957
+ operation: 'raw',
958
+ database: databaseValue,
959
+ env: envValue,
960
+ collection: options.collection,
961
+ query: options.query,
962
+ params: options.params,
963
+ },
964
+ };
965
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database raw query - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
966
+ try {
967
+ // Check cache if cache tag is provided
968
+ const privateKey = options.product ? this.privateKeys.get(options.product) : undefined;
969
+ if (options.cache && this.cacheManager && privateKey) {
970
+ const cacheOptions = {
971
+ cache_tag: options.cache,
972
+ product_tag: options.product || '',
973
+ component_tag: options.database || '',
974
+ component_type: 'database',
975
+ input: { query: options.query, params: options.params, collection: options.collection },
976
+ privateKey,
977
+ };
978
+ const cached = await this.cacheManager.fetch(cacheOptions);
979
+ if (cached.hit && cached.data) {
980
+ const end = Date.now();
981
+ (_f = this.logService) === null || _f === void 0 ? void 0 : _f.add(Object.assign(Object.assign({}, baseLogs), { start,
982
+ end, message: `Database raw query - cache hit (${cached.source})`, successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
983
+ (_g = this.logService) === null || _g === void 0 ? void 0 : _g.publish();
984
+ return cached.data;
985
+ }
986
+ }
987
+ const adapter = this.getAdapter(options);
988
+ const result = await adapter.raw(options);
989
+ // Store in cache if cache tag is provided
990
+ if (options.cache && this.cacheManager && privateKey) {
991
+ const cacheOptions = {
992
+ cache_tag: options.cache,
993
+ product_tag: options.product || '',
994
+ component_tag: options.database || '',
995
+ component_type: 'database',
996
+ input: { query: options.query, params: options.params, collection: options.collection },
997
+ privateKey,
998
+ };
999
+ await this.cacheManager.store(cacheOptions, result);
1000
+ }
1001
+ const end = Date.now();
1002
+ (_h = this.logService) === null || _h === void 0 ? void 0 : _h.add(Object.assign(Object.assign({}, baseLogs), { start,
1003
+ end, message: 'Database raw query - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
1004
+ (_j = this.logService) === null || _j === void 0 ? void 0 : _j.publish();
1005
+ return result;
1006
+ }
1007
+ catch (error) {
1008
+ const end = Date.now();
1009
+ (_k = this.logService) === null || _k === void 0 ? void 0 : _k.add(Object.assign(Object.assign({}, baseLogs), { start,
1010
+ end, message: 'Database raw query - failed', failed_execution: true, data: { operation: 'raw', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
1011
+ await ((_l = this.logService) === null || _l === void 0 ? void 0 : _l.publish());
1012
+ throw error;
1013
+ }
1014
+ }
1015
+ // ==================== WRITE OPERATIONS ====================
1016
+ /**
1017
+ * Insert one or more records
1018
+ *
1019
+ * @example
1020
+ * // Single record
1021
+ * const result = await ductape.database.insert({
1022
+ * table: 'users',
1023
+ * data: {
1024
+ * name: 'Jane Doe',
1025
+ * email: 'jane@example.com',
1026
+ * status: 'active',
1027
+ * },
1028
+ * returning: true,
1029
+ * });
1030
+ *
1031
+ * // Multiple records
1032
+ * const result = await ductape.database.insert({
1033
+ * table: 'users',
1034
+ * data: [
1035
+ * { name: 'User 1', email: 'user1@example.com' },
1036
+ * { name: 'User 2', email: 'user2@example.com' },
1037
+ * ],
1038
+ * });
1039
+ *
1040
+ * // With conflict handling (upsert)
1041
+ * const result = await ductape.database.insert({
1042
+ * table: 'users',
1043
+ * data: { email: 'john@example.com', name: 'John' },
1044
+ * onConflict: {
1045
+ * columns: ['email'],
1046
+ * action: 'update',
1047
+ * update: ['name'],
1048
+ * },
1049
+ * });
1050
+ */
1051
+ async insert(options) {
1052
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1053
+ const process_id = (0, processor_utils_1.generateObjectId)();
1054
+ const start = Date.now();
1055
+ this.initializeLogService();
1056
+ // Session log fields (will be populated if session is provided)
1057
+ let sessionLogFields = {};
1058
+ let resolvedOptions = options;
1059
+ // Process session if provided
1060
+ if (options.session && options.product) {
1061
+ const builder = await this.getProductBuilder(options.product);
1062
+ const privateKey = builder.fetchPrivateKey();
1063
+ if (privateKey) {
1064
+ const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
1065
+ const sessionResult = await processSessionForExecution(options.session, privateKey, options, options.env);
1066
+ if (sessionResult.error) {
1067
+ throw new Error(`Session validation failed: ${sessionResult.error}`);
1068
+ }
1069
+ resolvedOptions = sessionResult.input;
1070
+ sessionLogFields = sessionResult.logFields;
1071
+ }
1072
+ }
1073
+ const envValue = options.env || ((_a = this.currentContext) === null || _a === void 0 ? void 0 : _a.env) || '';
1074
+ const databaseValue = options.database || ((_b = this.currentContext) === null || _b === void 0 ? void 0 : _b.database) || '';
1075
+ const baseLogs = Object.assign({ product_tag: options.product || ((_c = this.currentContext) === null || _c === void 0 ? void 0 : _c.product) || '', workspace_id: ((_d = this.config) === null || _d === void 0 ? void 0 : _d.workspace_id) || '', env: envValue, app_env: envValue, process_id, type: logs_types_1.LogEventTypes.DATABASE, parent_tag: databaseValue, child_tag: 'insert', data: {
1076
+ table: options.table,
1077
+ operation: 'insert',
1078
+ database: databaseValue,
1079
+ env: envValue,
1080
+ data: options.data,
1081
+ returning: options.returning,
1082
+ onConflict: options.onConflict,
1083
+ } }, sessionLogFields);
1084
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database insert - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
1085
+ try {
1086
+ // Apply pre-save operations if specified
1087
+ let processedData = resolvedOptions.data;
1088
+ if (resolvedOptions.preSave && resolvedOptions.preSave.length > 0) {
1089
+ const processor = new presave_processor_1.PreSaveProcessor(resolvedOptions.preSaveConfig);
1090
+ const preSaveResult = await processor.process(resolvedOptions.data, resolvedOptions.preSave);
1091
+ processedData = preSaveResult.data;
1092
+ }
1093
+ const adapter = this.getAdapter(resolvedOptions);
1094
+ const result = await adapter.insert(Object.assign(Object.assign({}, resolvedOptions), { data: processedData }));
1095
+ const end = Date.now();
1096
+ (_f = this.logService) === null || _f === void 0 ? void 0 : _f.add(Object.assign(Object.assign({}, baseLogs), { start,
1097
+ end, message: 'Database insert - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
1098
+ (_g = this.logService) === null || _g === void 0 ? void 0 : _g.publish();
1099
+ return result;
1100
+ }
1101
+ catch (error) {
1102
+ const end = Date.now();
1103
+ (_h = this.logService) === null || _h === void 0 ? void 0 : _h.add(Object.assign(Object.assign({}, baseLogs), { start,
1104
+ end, message: 'Database insert - failed', failed_execution: true, data: { table: options.table, operation: 'insert', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
1105
+ await ((_j = this.logService) === null || _j === void 0 ? void 0 : _j.publish());
1106
+ throw error;
1107
+ }
1108
+ }
1109
+ /**
1110
+ * Update records matching conditions
1111
+ *
1112
+ * @example
1113
+ * // Simple update
1114
+ * const result = await ductape.database.update({
1115
+ * table: 'users',
1116
+ * data: { status: 'inactive' },
1117
+ * where: { last_login: { $LT: new Date('2023-01-01') } },
1118
+ * });
1119
+ *
1120
+ * // With increment/decrement
1121
+ * await ductape.database.update({
1122
+ * table: 'products',
1123
+ * data: { stock: { $inc: 10 } },
1124
+ * where: { id: productId },
1125
+ * });
1126
+ */
1127
+ async update(options) {
1128
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1129
+ const process_id = (0, processor_utils_1.generateObjectId)();
1130
+ const start = Date.now();
1131
+ this.initializeLogService();
1132
+ // Session log fields (will be populated if session is provided)
1133
+ let sessionLogFields = {};
1134
+ let resolvedOptions = options;
1135
+ // Process session if provided
1136
+ if (options.session && options.product) {
1137
+ const builder = await this.getProductBuilder(options.product);
1138
+ const privateKey = builder.fetchPrivateKey();
1139
+ if (privateKey) {
1140
+ const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
1141
+ const sessionResult = await processSessionForExecution(options.session, privateKey, options, options.env);
1142
+ if (sessionResult.error) {
1143
+ throw new Error(`Session validation failed: ${sessionResult.error}`);
1144
+ }
1145
+ resolvedOptions = sessionResult.input;
1146
+ sessionLogFields = sessionResult.logFields;
1147
+ }
1148
+ }
1149
+ const envValue = options.env || ((_a = this.currentContext) === null || _a === void 0 ? void 0 : _a.env) || '';
1150
+ const databaseValue = options.database || ((_b = this.currentContext) === null || _b === void 0 ? void 0 : _b.database) || '';
1151
+ const baseLogs = Object.assign({ product_tag: options.product || ((_c = this.currentContext) === null || _c === void 0 ? void 0 : _c.product) || '', workspace_id: ((_d = this.config) === null || _d === void 0 ? void 0 : _d.workspace_id) || '', env: envValue, app_env: envValue, process_id, type: logs_types_1.LogEventTypes.DATABASE, parent_tag: databaseValue, child_tag: 'update', data: {
1152
+ table: options.table,
1153
+ operation: 'update',
1154
+ database: databaseValue,
1155
+ env: envValue,
1156
+ where: options.where,
1157
+ data: options.data,
1158
+ returning: options.returning,
1159
+ } }, sessionLogFields);
1160
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database update - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
1161
+ try {
1162
+ // Apply pre-save operations if specified
1163
+ let processedData = resolvedOptions.data;
1164
+ if (resolvedOptions.preSave && resolvedOptions.preSave.length > 0) {
1165
+ const processor = new presave_processor_1.PreSaveProcessor(resolvedOptions.preSaveConfig);
1166
+ const preSaveResult = await processor.process(resolvedOptions.data, resolvedOptions.preSave);
1167
+ processedData = preSaveResult.data;
1168
+ }
1169
+ const adapter = this.getAdapter(resolvedOptions);
1170
+ const result = await adapter.update(Object.assign(Object.assign({}, resolvedOptions), { data: processedData }));
1171
+ const end = Date.now();
1172
+ (_f = this.logService) === null || _f === void 0 ? void 0 : _f.add(Object.assign(Object.assign({}, baseLogs), { start,
1173
+ end, message: 'Database update - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
1174
+ (_g = this.logService) === null || _g === void 0 ? void 0 : _g.publish();
1175
+ return result;
1176
+ }
1177
+ catch (error) {
1178
+ const end = Date.now();
1179
+ (_h = this.logService) === null || _h === void 0 ? void 0 : _h.add(Object.assign(Object.assign({}, baseLogs), { start,
1180
+ end, message: 'Database update - failed', failed_execution: true, data: { table: options.table, operation: 'update', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
1181
+ await ((_j = this.logService) === null || _j === void 0 ? void 0 : _j.publish());
1182
+ throw error;
1183
+ }
1184
+ }
1185
+ /**
1186
+ * Delete records matching conditions
1187
+ *
1188
+ * @example
1189
+ * const result = await ductape.database.delete({
1190
+ * table: 'users',
1191
+ * where: { status: 'deleted' },
1192
+ * });
1193
+ * console.log('Deleted count:', result.count);
1194
+ */
1195
+ async delete(options) {
1196
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1197
+ const process_id = (0, processor_utils_1.generateObjectId)();
1198
+ const start = Date.now();
1199
+ this.initializeLogService();
1200
+ // Session log fields (will be populated if session is provided)
1201
+ let sessionLogFields = {};
1202
+ let resolvedOptions = options;
1203
+ // Process session if provided
1204
+ if (options.session && options.product) {
1205
+ const builder = await this.getProductBuilder(options.product);
1206
+ const privateKey = builder.fetchPrivateKey();
1207
+ if (privateKey) {
1208
+ const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
1209
+ const sessionResult = await processSessionForExecution(options.session, privateKey, options, options.env);
1210
+ if (sessionResult.error) {
1211
+ throw new Error(`Session validation failed: ${sessionResult.error}`);
1212
+ }
1213
+ resolvedOptions = sessionResult.input;
1214
+ sessionLogFields = sessionResult.logFields;
1215
+ }
1216
+ }
1217
+ const envValue = options.env || ((_a = this.currentContext) === null || _a === void 0 ? void 0 : _a.env) || '';
1218
+ const databaseValue = options.database || ((_b = this.currentContext) === null || _b === void 0 ? void 0 : _b.database) || '';
1219
+ const baseLogs = Object.assign({ product_tag: options.product || ((_c = this.currentContext) === null || _c === void 0 ? void 0 : _c.product) || '', workspace_id: ((_d = this.config) === null || _d === void 0 ? void 0 : _d.workspace_id) || '', env: envValue, app_env: envValue, process_id, type: logs_types_1.LogEventTypes.DATABASE, parent_tag: databaseValue, child_tag: 'delete', data: {
1220
+ table: options.table,
1221
+ operation: 'delete',
1222
+ database: databaseValue,
1223
+ env: envValue,
1224
+ where: options.where,
1225
+ } }, sessionLogFields);
1226
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database delete - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
1227
+ try {
1228
+ const adapter = this.getAdapter(resolvedOptions);
1229
+ const result = await adapter.delete(resolvedOptions);
1230
+ const end = Date.now();
1231
+ (_f = this.logService) === null || _f === void 0 ? void 0 : _f.add(Object.assign(Object.assign({}, baseLogs), { start,
1232
+ end, message: 'Database delete - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
1233
+ (_g = this.logService) === null || _g === void 0 ? void 0 : _g.publish();
1234
+ return result;
1235
+ }
1236
+ catch (error) {
1237
+ const end = Date.now();
1238
+ (_h = this.logService) === null || _h === void 0 ? void 0 : _h.add(Object.assign(Object.assign({}, baseLogs), { start,
1239
+ end, message: 'Database delete - failed', failed_execution: true, data: { table: options.table, operation: 'delete', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
1240
+ await ((_j = this.logService) === null || _j === void 0 ? void 0 : _j.publish());
1241
+ throw error;
1242
+ }
1243
+ }
1244
+ /**
1245
+ * Insert or update a record based on conflict keys
1246
+ *
1247
+ * @example
1248
+ * const result = await ductape.database.upsert({
1249
+ * table: 'user_preferences',
1250
+ * data: {
1251
+ * user_id: 123,
1252
+ * theme: 'dark',
1253
+ * language: 'en',
1254
+ * },
1255
+ * conflictKeys: ['user_id'],
1256
+ * });
1257
+ * console.log('Operation:', result.operation); // 'inserted' or 'updated'
1258
+ */
1259
+ async upsert(options) {
1260
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1261
+ const process_id = (0, processor_utils_1.generateObjectId)();
1262
+ const start = Date.now();
1263
+ this.initializeLogService();
1264
+ // Session log fields (will be populated if session is provided)
1265
+ let sessionLogFields = {};
1266
+ let resolvedOptions = options;
1267
+ // Process session if provided
1268
+ if (options.session && options.product) {
1269
+ const builder = await this.getProductBuilder(options.product);
1270
+ const privateKey = builder.fetchPrivateKey();
1271
+ if (privateKey) {
1272
+ const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
1273
+ const sessionResult = await processSessionForExecution(options.session, privateKey, options, options.env);
1274
+ if (sessionResult.error) {
1275
+ throw new Error(`Session validation failed: ${sessionResult.error}`);
1276
+ }
1277
+ resolvedOptions = sessionResult.input;
1278
+ sessionLogFields = sessionResult.logFields;
1279
+ }
1280
+ }
1281
+ const envValue = options.env || ((_a = this.currentContext) === null || _a === void 0 ? void 0 : _a.env) || '';
1282
+ const databaseValue = options.database || ((_b = this.currentContext) === null || _b === void 0 ? void 0 : _b.database) || '';
1283
+ const baseLogs = Object.assign({ product_tag: options.product || ((_c = this.currentContext) === null || _c === void 0 ? void 0 : _c.product) || '', workspace_id: ((_d = this.config) === null || _d === void 0 ? void 0 : _d.workspace_id) || '', env: envValue, app_env: envValue, process_id, type: logs_types_1.LogEventTypes.DATABASE, parent_tag: databaseValue, child_tag: 'upsert', data: {
1284
+ table: options.table,
1285
+ operation: 'upsert',
1286
+ database: databaseValue,
1287
+ env: envValue,
1288
+ data: options.data,
1289
+ conflictKeys: options.conflictKeys,
1290
+ updateColumns: options.updateColumns,
1291
+ returning: options.returning,
1292
+ } }, sessionLogFields);
1293
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database upsert - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
1294
+ try {
1295
+ const adapter = this.getAdapter(resolvedOptions);
1296
+ const result = await adapter.upsert(resolvedOptions);
1297
+ const end = Date.now();
1298
+ (_f = this.logService) === null || _f === void 0 ? void 0 : _f.add(Object.assign(Object.assign({}, baseLogs), { start,
1299
+ end, message: 'Database upsert - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
1300
+ (_g = this.logService) === null || _g === void 0 ? void 0 : _g.publish();
1301
+ return result;
1302
+ }
1303
+ catch (error) {
1304
+ const end = Date.now();
1305
+ (_h = this.logService) === null || _h === void 0 ? void 0 : _h.add(Object.assign(Object.assign({}, baseLogs), { start,
1306
+ end, message: 'Database upsert - failed', failed_execution: true, data: { table: options.table, operation: 'upsert', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
1307
+ await ((_j = this.logService) === null || _j === void 0 ? void 0 : _j.publish());
1308
+ throw error;
1309
+ }
1310
+ }
1311
+ // ==================== AGGREGATION OPERATIONS ====================
1312
+ /**
1313
+ * Count records
1314
+ *
1315
+ * @example
1316
+ * const count = await ductape.database.count({
1317
+ * table: 'users',
1318
+ * where: { status: 'active' },
1319
+ * });
1320
+ */
1321
+ async count(options) {
1322
+ const adapter = this.getAdapter(options);
1323
+ return adapter.count(options);
1324
+ }
1325
+ /**
1326
+ * Sum values of a column
1327
+ *
1328
+ * @example
1329
+ * const totalRevenue = await ductape.database.sum({
1330
+ * table: 'orders',
1331
+ * column: 'total',
1332
+ * where: { status: 'completed' },
1333
+ * });
1334
+ */
1335
+ async sum(options) {
1336
+ const adapter = this.getAdapter(options);
1337
+ return adapter.sum(options);
1338
+ }
1339
+ /**
1340
+ * Calculate average of a column
1341
+ *
1342
+ * @example
1343
+ * const avgOrderValue = await ductape.database.avg({
1344
+ * table: 'orders',
1345
+ * column: 'total',
1346
+ * });
1347
+ */
1348
+ async avg(options) {
1349
+ const adapter = this.getAdapter(options);
1350
+ return adapter.avg(options);
1351
+ }
1352
+ /**
1353
+ * Get minimum value of a column
1354
+ *
1355
+ * @example
1356
+ * const minPrice = await ductape.database.min({
1357
+ * table: 'products',
1358
+ * column: 'price',
1359
+ * });
1360
+ */
1361
+ async min(options) {
1362
+ const adapter = this.getAdapter(options);
1363
+ return adapter.min(options);
1364
+ }
1365
+ /**
1366
+ * Get maximum value of a column
1367
+ *
1368
+ * @example
1369
+ * const maxPrice = await ductape.database.max({
1370
+ * table: 'products',
1371
+ * column: 'price',
1372
+ * });
1373
+ */
1374
+ async max(options) {
1375
+ const adapter = this.getAdapter(options);
1376
+ return adapter.max(options);
1377
+ }
1378
+ /**
1379
+ * Perform multiple aggregations in one query
1380
+ *
1381
+ * @example
1382
+ * const stats = await ductape.database.aggregate({
1383
+ * table: 'orders',
1384
+ * operations: {
1385
+ * total_revenue: { $SUM: 'total' },
1386
+ * order_count: { $COUNT: '*' },
1387
+ * avg_order_value: { $AVG: 'total' },
1388
+ * },
1389
+ * where: { status: 'completed' },
1390
+ * });
1391
+ */
1392
+ async aggregate(options) {
1393
+ const adapter = this.getAdapter(options);
1394
+ const aggregationBuilder = new aggregation_builder_1.AggregationBuilder(adapter.getDatabaseType());
1395
+ const builtAggregation = aggregationBuilder.buildAggregation(options);
1396
+ return adapter.aggregate(builtAggregation);
1397
+ }
1398
+ /**
1399
+ * Group records and perform aggregations
1400
+ *
1401
+ * @example
1402
+ * const salesByCategory = await ductape.database.groupBy({
1403
+ * table: 'products',
1404
+ * groupBy: ['category'],
1405
+ * operations: {
1406
+ * total_sales: { $SUM: 'sales_count' },
1407
+ * avg_price: { $AVG: 'price' },
1408
+ * },
1409
+ * having: {
1410
+ * total_sales: { $GT: 100 },
1411
+ * },
1412
+ * });
1413
+ */
1414
+ async groupBy(options) {
1415
+ const adapter = this.getAdapter(options);
1416
+ const aggregationBuilder = new aggregation_builder_1.AggregationBuilder(adapter.getDatabaseType());
1417
+ const builtGroupBy = aggregationBuilder.buildGroupBy(options);
1418
+ return adapter.groupBy(builtGroupBy);
1419
+ }
1420
+ // ==================== TRANSACTION OPERATIONS ====================
1421
+ /**
1422
+ * Execute operations within a transaction (callback API - recommended)
1423
+ *
1424
+ * @example
1425
+ * const order = await ductape.database.transaction({
1426
+ * env: 'prd',
1427
+ * product: 'my-app',
1428
+ * database: 'main-db',
1429
+ * }, async (transaction) => {
1430
+ * const order = await ductape.database.insert({
1431
+ * table: 'orders',
1432
+ * data: { customer_id: 123, total: 99.99 },
1433
+ * transaction,
1434
+ * });
1435
+ *
1436
+ * await ductape.database.insert({
1437
+ * table: 'order_items',
1438
+ * data: items.map(item => ({ order_id: order.insertedIds[0], ...item })),
1439
+ * transaction,
1440
+ * });
1441
+ *
1442
+ * return order;
1443
+ * });
1444
+ */
1445
+ async transaction(options, callback) {
1446
+ const adapter = this.getAdapter(options);
1447
+ return this.transactionManager.executeTransaction(adapter, options, callback);
1448
+ }
1449
+ /**
1450
+ * Begin a transaction manually
1451
+ *
1452
+ * @example
1453
+ * const transaction = await ductape.database.beginTransaction({
1454
+ * env: 'prd',
1455
+ * product: 'my-app',
1456
+ * database: 'main-db',
1457
+ * isolationLevel: 'REPEATABLE_READ',
1458
+ * });
1459
+ *
1460
+ * try {
1461
+ * await ductape.database.insert({ table: 'accounts', data: {...}, transaction });
1462
+ * await transaction.commit();
1463
+ * } catch (error) {
1464
+ * await transaction.rollback();
1465
+ * throw error;
1466
+ * }
1467
+ */
1468
+ async beginTransaction(options) {
1469
+ const adapter = this.getAdapter(options);
1470
+ return this.transactionManager.beginTransaction(adapter, options);
1471
+ }
1472
+ // ==================== SCHEMA OPERATIONS ====================
1473
+ /**
1474
+ * Create a new table
1475
+ *
1476
+ * @example
1477
+ * import { SchemaHelpers } from '@ductape/sdk';
1478
+ *
1479
+ * await ductape.database.createTable(
1480
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1481
+ * {
1482
+ * name: 'products',
1483
+ * columns: [
1484
+ * SchemaHelpers.id(),
1485
+ * SchemaHelpers.string('name', 255, false),
1486
+ * SchemaHelpers.decimal('price', 10, 2),
1487
+ * ...SchemaHelpers.timestamps(),
1488
+ * ],
1489
+ * },
1490
+ * { ifNotExists: true }
1491
+ * );
1492
+ */
1493
+ async createTable(connectionConfigOrDefinition, tableDefinitionOrOptions, options) {
1494
+ // Check if first arg is a table definition (no connectionConfig provided)
1495
+ if ('columns' in connectionConfigOrDefinition || 'name' in connectionConfigOrDefinition && !('env' in connectionConfigOrDefinition)) {
1496
+ // Using current context - connectionConfigOrDefinition is actually tableDefinition
1497
+ const adapter = this.getAdapter();
1498
+ return adapter.createTable(connectionConfigOrDefinition, tableDefinitionOrOptions);
1499
+ }
1500
+ // Using explicit connection config
1501
+ const adapter = this.getAdapter(connectionConfigOrDefinition);
1502
+ return adapter.createTable(tableDefinitionOrOptions, options);
1503
+ }
1504
+ /**
1505
+ * Alter an existing table
1506
+ *
1507
+ * @example
1508
+ * import { ColumnAlterationType, ColumnType } from '@ductape/sdk';
1509
+ *
1510
+ * // Add column
1511
+ * await ductape.database.alterTable(
1512
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1513
+ * 'products',
1514
+ * [{ type: ColumnAlterationType.ADD, column: { name: 'sku', type: ColumnType.STRING, length: 50 } }]
1515
+ * );
1516
+ *
1517
+ * // Drop column
1518
+ * await ductape.database.alterTable(
1519
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1520
+ * 'products',
1521
+ * [{ type: ColumnAlterationType.DROP, columnName: 'old_field' }]
1522
+ * );
1523
+ *
1524
+ * // Rename column
1525
+ * await ductape.database.alterTable(
1526
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1527
+ * 'products',
1528
+ * [{ type: ColumnAlterationType.RENAME, oldName: 'old_name', newName: 'new_name' }]
1529
+ * );
1530
+ */
1531
+ async alterTable(connectionConfigOrTableName, tableNameOrAlterations, alterations) {
1532
+ // Check if first arg is a string (tableName - no connectionConfig provided)
1533
+ if (typeof connectionConfigOrTableName === 'string') {
1534
+ const adapter = this.getAdapter();
1535
+ return adapter.alterTable(connectionConfigOrTableName, tableNameOrAlterations);
1536
+ }
1537
+ // Using explicit connection config
1538
+ const adapter = this.getAdapter(connectionConfigOrTableName);
1539
+ return adapter.alterTable(tableNameOrAlterations, alterations);
1540
+ }
1541
+ /**
1542
+ * Drop a table
1543
+ *
1544
+ * @example
1545
+ * await ductape.database.dropTable(
1546
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1547
+ * 'old_table'
1548
+ * );
1549
+ */
1550
+ async dropTable(connectionConfigOrTableName, tableName) {
1551
+ // Check if first arg is a string (tableName - no connectionConfig provided)
1552
+ if (typeof connectionConfigOrTableName === 'string') {
1553
+ const adapter = this.getAdapter();
1554
+ return adapter.dropTable(connectionConfigOrTableName, true);
1555
+ }
1556
+ // Using explicit connection config
1557
+ const adapter = this.getAdapter(connectionConfigOrTableName);
1558
+ return adapter.dropTable(tableName, true);
1559
+ }
1560
+ /**
1561
+ * List all tables in the database
1562
+ *
1563
+ * @example
1564
+ * const tables = await ductape.database.listTables({
1565
+ * env: 'dev',
1566
+ * product: 'my-app',
1567
+ * database: 'main-db',
1568
+ * });
1569
+ */
1570
+ async listTables(connectionConfig) {
1571
+ const adapter = this.getAdapter(connectionConfig);
1572
+ return adapter.listTables();
1573
+ }
1574
+ /**
1575
+ * List all tables with basic information including estimated row counts
1576
+ *
1577
+ * @example
1578
+ * const tables = await ductape.database.listTablesWithInfo({
1579
+ * env: 'dev',
1580
+ * product: 'my-app',
1581
+ * database: 'main-db',
1582
+ * });
1583
+ * // Returns: [{ name: 'users', estimatedRowCount: 1247, schema: 'public' }, ...]
1584
+ */
1585
+ async listTablesWithInfo(connectionConfig) {
1586
+ const adapter = this.getAdapter(connectionConfig);
1587
+ return adapter.listTablesWithInfo();
1588
+ }
1589
+ /**
1590
+ * Check if a table exists
1591
+ *
1592
+ * @example
1593
+ * const exists = await ductape.database.tableExists(
1594
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1595
+ * 'users'
1596
+ * );
1597
+ */
1598
+ async tableExists(connectionConfigOrTableName, tableName) {
1599
+ // Check if first arg is a string (tableName - no connectionConfig provided)
1600
+ if (typeof connectionConfigOrTableName === 'string') {
1601
+ const adapter = this.getAdapter();
1602
+ return adapter.tableExists(connectionConfigOrTableName);
1603
+ }
1604
+ // Using explicit connection config
1605
+ const adapter = this.getAdapter(connectionConfigOrTableName);
1606
+ return adapter.tableExists(tableName);
1607
+ }
1608
+ /**
1609
+ * Get the schema of a table
1610
+ *
1611
+ * @example
1612
+ * const schema = await ductape.database.getTableSchema(
1613
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1614
+ * 'users'
1615
+ * );
1616
+ * console.log('Table:', schema.name);
1617
+ * console.log('Columns:', schema.columns);
1618
+ * console.log('Indexes:', schema.indexes);
1619
+ */
1620
+ async getTableSchema(connectionConfigOrTableName, tableName) {
1621
+ // Check if first arg is a string (tableName - no connectionConfig provided)
1622
+ if (typeof connectionConfigOrTableName === 'string') {
1623
+ const adapter = this.getAdapter();
1624
+ return adapter.getTableSchema(connectionConfigOrTableName);
1625
+ }
1626
+ // Using explicit connection config
1627
+ const adapter = this.getAdapter(connectionConfigOrTableName);
1628
+ return adapter.getTableSchema(tableName);
1629
+ }
1630
+ /**
1631
+ * Create an index
1632
+ *
1633
+ * @example
1634
+ * await ductape.database.createIndex({
1635
+ * env: 'dev',
1636
+ * product: 'my-app',
1637
+ * database: 'main-db',
1638
+ * table: 'users',
1639
+ * index: {
1640
+ * name: 'idx_users_email',
1641
+ * table: 'users',
1642
+ * columns: [{ name: 'email' }],
1643
+ * unique: true,
1644
+ * },
1645
+ * ifNotExists: true,
1646
+ * concurrent: true, // PostgreSQL: create without locking
1647
+ * });
1648
+ */
1649
+ async createIndex(options) {
1650
+ const adapter = this.getAdapter(options);
1651
+ return adapter.createIndex(options.index, options.ifNotExists, options.concurrent);
1652
+ }
1653
+ /**
1654
+ * Drop an index
1655
+ *
1656
+ * @example
1657
+ * await ductape.database.dropIndex({
1658
+ * env: 'dev',
1659
+ * product: 'my-app',
1660
+ * database: 'main-db',
1661
+ * table: 'users',
1662
+ * indexName: 'idx_users_old',
1663
+ * ifExists: true,
1664
+ * concurrent: true,
1665
+ * });
1666
+ */
1667
+ async dropIndex(options) {
1668
+ const adapter = this.getAdapter(options);
1669
+ return adapter.dropIndex(options.table, options.indexName, options.ifExists, options.concurrent, options.cascade);
1670
+ }
1671
+ /**
1672
+ * List all indexes on a table
1673
+ *
1674
+ * @example
1675
+ * const indexes = await ductape.database.listIndexes({
1676
+ * env: 'dev',
1677
+ * product: 'my-app',
1678
+ * database: 'main-db',
1679
+ * table: 'users',
1680
+ * includeSystem: false,
1681
+ * });
1682
+ */
1683
+ async listIndexes(options) {
1684
+ const adapter = this.getAdapter(options);
1685
+ return adapter.listIndexes(options.table, options.includeSystem);
1686
+ }
1687
+ /**
1688
+ * Get index statistics
1689
+ *
1690
+ * @example
1691
+ * // All indexes on a table
1692
+ * const stats = await ductape.database.getIndexStatistics(
1693
+ * { env: 'prd', product: 'my-app', database: 'main-db' },
1694
+ * 'users'
1695
+ * );
1696
+ *
1697
+ * // Specific index
1698
+ * const emailStats = await ductape.database.getIndexStatistics(
1699
+ * { env: 'prd', product: 'my-app', database: 'main-db' },
1700
+ * 'users',
1701
+ * 'idx_users_email'
1702
+ * );
1703
+ */
1704
+ async getIndexStatistics(connectionConfig, tableName, indexName) {
1705
+ const adapter = this.getAdapter(connectionConfig);
1706
+ return adapter.getIndexStatistics(tableName, indexName);
1707
+ }
1708
+ // ==================== MIGRATION OPERATIONS ====================
1709
+ /**
1710
+ * Run a migration
1711
+ *
1712
+ * @example
1713
+ * const result = await ductape.database.runMigration([migration]);
1714
+ * console.log('Migrated:', result.size);
1715
+ */
1716
+ async runMigration(migrations, options) {
1717
+ const engine = this.getMigrationEngine();
1718
+ return engine.migrate(migrations, options);
1719
+ }
1720
+ /**
1721
+ * Rollback migrations
1722
+ *
1723
+ * @example
1724
+ * const result = await ductape.database.rollbackMigration([migration], 1);
1725
+ * console.log('Rolled back:', result.size);
1726
+ */
1727
+ async rollbackMigration(migrations, count = 1) {
1728
+ const engine = this.getMigrationEngine();
1729
+ return engine.rollback(migrations, count);
1730
+ }
1731
+ /**
1732
+ * Get migration history (applied migrations)
1733
+ *
1734
+ * @example
1735
+ * const history = await ductape.database.getMigrationHistory();
1736
+ * history.forEach((entry) => {
1737
+ * console.log('Tag:', entry.tag);
1738
+ * console.log('Applied at:', entry.appliedAt);
1739
+ * });
1740
+ */
1741
+ async getMigrationHistory() {
1742
+ const engine = this.getMigrationEngine();
1743
+ return engine.getAppliedMigrations();
1744
+ }
1745
+ /**
1746
+ * Get status of all migrations
1747
+ *
1748
+ * @example
1749
+ * const status = await ductape.database.getMigrationStatus(allMigrations);
1750
+ * console.log('Pending:', status.pending);
1751
+ */
1752
+ async getMigrationStatus(migrations) {
1753
+ const engine = this.getMigrationEngine();
1754
+ return engine.getStatus(migrations);
1755
+ }
1756
+ // ==================== MIGRATION CRUD OPERATIONS ====================
1757
+ /**
1758
+ * Migration management sub-object
1759
+ * Provides CRUD operations for database migrations via ProductBuilder
1760
+ */
1761
+ get migration() {
1762
+ return {
1763
+ /**
1764
+ * Create a new database migration
1765
+ *
1766
+ * @example
1767
+ * await ductape.database.migration.create({
1768
+ * product: 'my-product',
1769
+ * database: 'main-db',
1770
+ * data: {
1771
+ * name: 'Add users table',
1772
+ * tag: 'main-db:add-users-table',
1773
+ * value: {
1774
+ * up: ['CREATE TABLE users (id SERIAL PRIMARY KEY, email VARCHAR(255))'],
1775
+ * down: ['DROP TABLE users'],
1776
+ * },
1777
+ * },
1778
+ * });
1779
+ */
1780
+ create: async (options) => {
1781
+ const builder = await this.getProductBuilder(options.product);
1782
+ // Format tag as database:migration if not already formatted
1783
+ const tag = options.data.tag.includes(':')
1784
+ ? options.data.tag
1785
+ : `${options.database}:${options.data.tag}`;
1786
+ await builder.createDatabaseMigration({
1787
+ name: options.data.name,
1788
+ tag,
1789
+ description: options.data.description,
1790
+ value: options.data.value,
1791
+ });
1792
+ },
1793
+ /**
1794
+ * Update an existing database migration
1795
+ *
1796
+ * @example
1797
+ * await ductape.database.migration.update({
1798
+ * product: 'my-product',
1799
+ * tag: 'main-db:add-users-table',
1800
+ * data: {
1801
+ * description: 'Updated description',
1802
+ * },
1803
+ * });
1804
+ */
1805
+ update: async (options) => {
1806
+ const builder = await this.getProductBuilder(options.product);
1807
+ await builder.updateDatabaseMigration(Object.assign({ tag: options.tag }, options.data));
1808
+ },
1809
+ /**
1810
+ * Fetch a specific database migration
1811
+ *
1812
+ * @example
1813
+ * const migration = await ductape.database.migration.fetch({
1814
+ * product: 'my-product',
1815
+ * tag: 'main-db:add-users-table',
1816
+ * });
1817
+ */
1818
+ fetch: async (options) => {
1819
+ const builder = await this.getProductBuilder(options.product);
1820
+ return builder.fetchDatabaseMigration(options.tag);
1821
+ },
1822
+ /**
1823
+ * Fetch all database migrations for a database
1824
+ *
1825
+ * @example
1826
+ * const migrations = await ductape.database.migration.fetchAll({
1827
+ * product: 'my-product',
1828
+ * database: 'main-db',
1829
+ * });
1830
+ */
1831
+ fetchAll: async (options) => {
1832
+ const builder = await this.getProductBuilder(options.product);
1833
+ return builder.fetchDatabaseMigrations(options.database);
1834
+ },
1835
+ /**
1836
+ * Delete a database migration
1837
+ *
1838
+ * @example
1839
+ * await ductape.database.migration.delete({
1840
+ * product: 'my-product',
1841
+ * tag: 'main-db:add-users-table',
1842
+ * });
1843
+ */
1844
+ delete: async (options) => {
1845
+ const builder = await this.getProductBuilder(options.product);
1846
+ return builder.deleteDatabaseMigration(options.tag);
1847
+ },
1848
+ /**
1849
+ * Run a database migration (up)
1850
+ * @deprecated Migration execution has been deprecated
1851
+ */
1852
+ run: async (_options) => {
1853
+ throw new Error('Migration execution has been deprecated');
1854
+ },
1855
+ /**
1856
+ * Rollback a database migration (down)
1857
+ * @deprecated Migration execution has been deprecated
1858
+ */
1859
+ rollback: async (_options) => {
1860
+ throw new Error('Migration execution has been deprecated');
1861
+ },
1862
+ };
1863
+ }
1864
+ // ==================== ACTION OPERATIONS ====================
1865
+ /**
1866
+ * Action management sub-object
1867
+ */
1868
+ get action() {
1869
+ return {
1870
+ /**
1871
+ * Create a new database action
1872
+ *
1873
+ * @example
1874
+ * await ductape.database.action.create({
1875
+ * name: 'Get Users Paginated',
1876
+ * tag: 'postgresdb:get-users-paginated',
1877
+ * tableName: 'users',
1878
+ * operation: DatabaseActionTypes.QUERY,
1879
+ * template: {
1880
+ * where: { is_active: true },
1881
+ * limit: '{{limit}}',
1882
+ * offset: '{{offset}}',
1883
+ * },
1884
+ * });
1885
+ */
1886
+ create: async (options) => {
1887
+ return this.actionManager.create(options);
1888
+ },
1889
+ /**
1890
+ * Update an existing action
1891
+ *
1892
+ * @example
1893
+ * await ductape.database.action.update({
1894
+ * tag: 'postgresdb:get-users',
1895
+ * template: { where: { status: '{{status}}' } },
1896
+ * });
1897
+ */
1898
+ update: async (options) => {
1899
+ return this.actionManager.update(options);
1900
+ },
1901
+ /**
1902
+ * Fetch a specific action
1903
+ *
1904
+ * @example
1905
+ * const action = await ductape.database.action.fetch('postgresdb:get-users');
1906
+ */
1907
+ fetch: async (tag) => {
1908
+ return this.actionManager.fetch(tag);
1909
+ },
1910
+ /**
1911
+ * Fetch all actions for a database
1912
+ *
1913
+ * @example
1914
+ * const actions = await ductape.database.action.fetchAll('postgresdb');
1915
+ */
1916
+ fetchAll: async (databaseTag) => {
1917
+ return this.actionManager.fetchAll(databaseTag);
1918
+ },
1919
+ /**
1920
+ * Delete a database action
1921
+ *
1922
+ * @example
1923
+ * await ductape.database.action.delete('postgresdb:get-users');
1924
+ */
1925
+ delete: async (tag) => {
1926
+ return this.actionManager.delete(tag);
1927
+ },
1928
+ /**
1929
+ * Dispatches a database action to run as a scheduled job.
1930
+ * @param {IDBActionDispatchInput} data - The database action dispatch input.
1931
+ * @returns {Promise<IDispatchResult>} The dispatch result with job ID and status.
1932
+ * @example
1933
+ * // Schedule a database action to run in 1 hour
1934
+ * await ductape.databases.action.dispatch({
1935
+ * product: 'my-product',
1936
+ * env: 'production',
1937
+ * database: 'users-db',
1938
+ * event: 'cleanup-inactive',
1939
+ * input: { query: { inactive: true } },
1940
+ * schedule: { start_at: Date.now() + 3600000 }
1941
+ * });
1942
+ *
1943
+ * // Run on a cron schedule
1944
+ * await ductape.databases.action.dispatch({
1945
+ * product: 'my-product',
1946
+ * env: 'production',
1947
+ * database: 'analytics-db',
1948
+ * event: 'aggregate-daily',
1949
+ * input: { query: {} },
1950
+ * schedule: { cron: '0 0 * * *' } // Daily at midnight
1951
+ * });
1952
+ */
1953
+ dispatch: async (data) => {
1954
+ const processorService = this.createNewProcessor();
1955
+ const productBuilder = await this.getProductBuilder(data.product);
1956
+ const schedule = data.schedule || {};
1957
+ const startAt = typeof schedule.start_at === 'string'
1958
+ ? new Date(schedule.start_at).getTime()
1959
+ : schedule.start_at || Date.now();
1960
+ // Generate job tag based on type, database, and event
1961
+ const jobTag = `database:${data.database}:${data.event}`;
1962
+ // Check if job exists, if not create it
1963
+ const existingJob = await productBuilder.fetchJob(jobTag);
1964
+ if (!existingJob) {
1965
+ await productBuilder.createJob({
1966
+ tag: jobTag,
1967
+ name: `Database: ${data.database}/${data.event}`,
1968
+ description: `Auto-created job for database action ${data.event} on database ${data.database}`,
1969
+ type: types_1.JobEventTypes.DATABASE_ACTION,
1970
+ app: data.database,
1971
+ event: data.event,
1972
+ executions: 0,
1973
+ intervals: schedule.every || 0,
1974
+ start_at: startAt,
1975
+ });
1976
+ }
1977
+ const jobInput = {
1978
+ product: data.product,
1979
+ env: data.env,
1980
+ event: jobTag,
1981
+ input: data.input,
1982
+ retries: data.retries || 0,
1983
+ start_at: startAt,
1984
+ session: data.session,
1985
+ cache: data.cache,
1986
+ repeat: schedule.cron || schedule.every ? {
1987
+ cron: schedule.cron,
1988
+ every: schedule.every,
1989
+ limit: schedule.limit,
1990
+ endDate: schedule.endDate,
1991
+ tz: schedule.tz,
1992
+ } : undefined,
1993
+ };
1994
+ await processorService.processJob(jobInput);
1995
+ const isRecurring = !!(schedule.cron || schedule.every);
1996
+ let nextRunAt;
1997
+ if (isRecurring && schedule.every) {
1998
+ nextRunAt = startAt + schedule.every;
1999
+ }
2000
+ return {
2001
+ job_id: (0, crypto_1.randomUUID)(),
2002
+ status: startAt > Date.now() ? 'scheduled' : 'queued',
2003
+ scheduled_at: startAt,
2004
+ recurring: isRecurring,
2005
+ next_run_at: nextRunAt,
2006
+ };
2007
+ },
2008
+ };
2009
+ }
2010
+ /**
2011
+ * Execute a database action
2012
+ *
2013
+ * @example
2014
+ * const users = await ductape.database.execute({
2015
+ * product: 'my-product',
2016
+ * env: 'prd',
2017
+ * database: 'postgresdb',
2018
+ * action: 'get-users-paginated',
2019
+ * input: {
2020
+ * limit: 25,
2021
+ * offset: 0,
2022
+ * },
2023
+ * });
2024
+ */
2025
+ async execute(options) {
2026
+ var _a, _b, _c, _d, _e, _f;
2027
+ const process_id = (0, processor_utils_1.generateObjectId)();
2028
+ const start = Date.now();
2029
+ // Session log fields (will be populated if session is provided)
2030
+ let sessionLogFields = {};
2031
+ let resolvedOptions = options;
2032
+ // Initialize product builder and logging
2033
+ if (options.product) {
2034
+ const builder = await this.getProductBuilder(options.product);
2035
+ // Process session if provided
2036
+ if (options.session) {
2037
+ const privateKey = builder.fetchPrivateKey();
2038
+ if (privateKey) {
2039
+ const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
2040
+ const sessionResult = await processSessionForExecution(options.session, privateKey, options, options.env);
2041
+ if (sessionResult.error) {
2042
+ throw new Error(`Session validation failed: ${sessionResult.error}`);
2043
+ }
2044
+ resolvedOptions = sessionResult.input;
2045
+ sessionLogFields = sessionResult.logFields;
2046
+ }
2047
+ }
2048
+ }
2049
+ this.initializeLogService();
2050
+ const baseLogs = Object.assign({ product_tag: options.product || '', workspace_id: ((_a = this.config) === null || _a === void 0 ? void 0 : _a.workspace_id) || '', env: options.env, process_id, type: logs_types_1.LogEventTypes.DB_ACTION, parent_tag: options.database, child_tag: options.action, data: { database: options.database, action: options.action } }, sessionLogFields);
2051
+ (_b = this.logService) === null || _b === void 0 ? void 0 : _b.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database action execute - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
2052
+ try {
2053
+ const result = await this.actionManager.execute(resolvedOptions);
2054
+ const end = Date.now();
2055
+ (_c = this.logService) === null || _c === void 0 ? void 0 : _c.add(Object.assign(Object.assign({}, baseLogs), { start,
2056
+ end, message: 'Database action execute - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
2057
+ (_d = this.logService) === null || _d === void 0 ? void 0 : _d.publish();
2058
+ return result;
2059
+ }
2060
+ catch (error) {
2061
+ const end = Date.now();
2062
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start,
2063
+ end, message: 'Database action execute - failed', failed_execution: true, data: { database: options.database, action: options.action, error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
2064
+ await ((_f = this.logService) === null || _f === void 0 ? void 0 : _f.publish());
2065
+ throw error;
2066
+ }
2067
+ }
2068
+ /**
2069
+ * Dispatches a database operation to run as a scheduled job.
2070
+ * Use this for direct database operations (query, insert, update, delete, etc.).
2071
+ * @param {IDBOperationDispatchInput} data - The database operation dispatch input.
2072
+ * @returns {Promise<IDispatchResult>} The dispatch result with job ID and status.
2073
+ * @example
2074
+ * // Schedule a database operation to run in 1 hour
2075
+ * await ductape.databases.dispatch({
2076
+ * product: 'my-product',
2077
+ * env: 'production',
2078
+ * database: 'users-db',
2079
+ * operation: 'deleteMany',
2080
+ * input: { filter: { inactive: true, lastLogin: { $lt: '2024-01-01' } } },
2081
+ * schedule: { start_at: Date.now() + 3600000 }
2082
+ * });
2083
+ *
2084
+ * // Run daily database cleanup
2085
+ * await ductape.databases.dispatch({
2086
+ * product: 'my-product',
2087
+ * env: 'production',
2088
+ * database: 'logs-db',
2089
+ * operation: 'deleteMany',
2090
+ * input: { filter: { createdAt: { $lt: '$DateAdd($Now(), -30, "days")' } } },
2091
+ * schedule: { cron: '0 3 * * *' } // Daily at 3 AM
2092
+ * });
2093
+ */
2094
+ async dispatch(data) {
2095
+ var _a, _b, _c, _d, _e, _f;
2096
+ const process_id = (0, processor_utils_1.generateObjectId)();
2097
+ const start = Date.now();
2098
+ const processorService = this.createNewProcessor();
2099
+ const productBuilder = await this.getProductBuilder(data.product);
2100
+ const schedule = data.schedule || {};
2101
+ const startAt = typeof schedule.start_at === 'string'
2102
+ ? new Date(schedule.start_at).getTime()
2103
+ : schedule.start_at || Date.now();
2104
+ // Generate job tag based on type, database, and operation
2105
+ const jobTag = `database-operation:${data.database}:${data.operation}`;
2106
+ // Initialize logging
2107
+ this.initializeLogService();
2108
+ const baseLogs = {
2109
+ product_tag: data.product,
2110
+ workspace_id: ((_a = this.config) === null || _a === void 0 ? void 0 : _a.workspace_id) || '',
2111
+ env: data.env,
2112
+ process_id,
2113
+ type: logs_types_1.LogEventTypes.DATABASE,
2114
+ parent_tag: data.database,
2115
+ child_tag: data.operation,
2116
+ data: { database: data.database, operation: data.operation },
2117
+ };
2118
+ (_b = this.logService) === null || _b === void 0 ? void 0 : _b.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database dispatch - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
2119
+ try {
2120
+ // Check if job exists, if not create it
2121
+ const existingJob = await productBuilder.fetchJob(jobTag);
2122
+ if (!existingJob) {
2123
+ await productBuilder.createJob({
2124
+ tag: jobTag,
2125
+ name: `Database Operation: ${data.database}/${data.operation}`,
2126
+ description: `Auto-created job for database operation ${data.operation} on database ${data.database}`,
2127
+ type: types_1.JobEventTypes.DATABASE_OPERATION,
2128
+ app: data.database,
2129
+ event: data.operation,
2130
+ executions: 0,
2131
+ intervals: schedule.every || 0,
2132
+ start_at: startAt,
2133
+ });
2134
+ }
2135
+ const jobInput = {
2136
+ product: data.product,
2137
+ env: data.env,
2138
+ event: jobTag,
2139
+ input: data.input,
2140
+ retries: data.retries || 0,
2141
+ start_at: startAt,
2142
+ session: data.session,
2143
+ cache: data.cache,
2144
+ repeat: schedule.cron || schedule.every ? {
2145
+ cron: schedule.cron,
2146
+ every: schedule.every,
2147
+ limit: schedule.limit,
2148
+ endDate: schedule.endDate,
2149
+ tz: schedule.tz,
2150
+ } : undefined,
2151
+ };
2152
+ await processorService.processJob(jobInput);
2153
+ const isRecurring = !!(schedule.cron || schedule.every);
2154
+ let nextRunAt;
2155
+ if (isRecurring && schedule.every) {
2156
+ nextRunAt = startAt + schedule.every;
2157
+ }
2158
+ const job_id = (0, crypto_1.randomUUID)();
2159
+ const end = Date.now();
2160
+ (_c = this.logService) === null || _c === void 0 ? void 0 : _c.add(Object.assign(Object.assign({}, baseLogs), { start,
2161
+ end, message: 'Database dispatch - success', successful_execution: true, data: { database: data.database, operation: data.operation, job_id }, status: logs_types_1.LogEventStatus.SUCCESS }));
2162
+ (_d = this.logService) === null || _d === void 0 ? void 0 : _d.publish();
2163
+ return {
2164
+ job_id,
2165
+ status: startAt > Date.now() ? 'scheduled' : 'queued',
2166
+ scheduled_at: startAt,
2167
+ recurring: isRecurring,
2168
+ next_run_at: nextRunAt,
2169
+ };
2170
+ }
2171
+ catch (error) {
2172
+ const end = Date.now();
2173
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start,
2174
+ end, message: 'Database dispatch - failed', failed_execution: true, data: { database: data.database, operation: data.operation, error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
2175
+ await ((_f = this.logService) === null || _f === void 0 ? void 0 : _f.publish());
2176
+ throw error;
2177
+ }
2178
+ }
2179
+ // ==================== HELPER METHODS ====================
2180
+ /**
2181
+ * Get the appropriate adapter for the operation
2182
+ */
2183
+ getAdapter(options) {
2184
+ // If options specify env and database, use those
2185
+ if ((options === null || options === void 0 ? void 0 : options.env) && (options === null || options === void 0 ? void 0 : options.database)) {
2186
+ const contextKey = this.buildContextKey(options.database, options.env);
2187
+ const adapter = this.adapters.get(contextKey);
2188
+ if (!adapter) {
2189
+ throw new database_error_1.DatabaseError(`No adapter found for database '${options.database}' in environment '${options.env}'`, enums_1.DatabaseErrorType.NOT_FOUND);
2190
+ }
2191
+ return adapter;
2192
+ }
2193
+ // Otherwise use current context
2194
+ if (!this.currentContext) {
2195
+ throw new database_error_1.DatabaseError('No database connection established. Call connect() first or provide env and database options.', enums_1.DatabaseErrorType.CONNECTION_ERROR);
2196
+ }
2197
+ const contextKey = this.buildContextKey(this.currentContext.database, this.currentContext.env);
2198
+ const adapter = this.adapters.get(contextKey);
2199
+ if (!adapter) {
2200
+ throw new database_error_1.DatabaseError('No adapter found for current connection context', enums_1.DatabaseErrorType.CONNECTION_ERROR);
2201
+ }
2202
+ return adapter;
2203
+ }
2204
+ /**
2205
+ * Get the current connection context
2206
+ */
2207
+ getCurrentContext() {
2208
+ return this.currentContext;
2209
+ }
2210
+ /**
2211
+ * Get a connection-scoped interface for a specific database/environment.
2212
+ * This ensures schema operations are isolated to a specific connection.
2213
+ *
2214
+ * @example
2215
+ * const usersDb = db.connection('users-db', 'dev');
2216
+ * await usersDb.schema.create('users', { ... });
2217
+ *
2218
+ * const ordersDb = db.connection('orders-db', 'dev');
2219
+ * await ordersDb.schema.create('orders', { ... }); // Different connection
2220
+ */
2221
+ connection(database, env, product = '') {
2222
+ return new DatabaseConnection(this, database, env, product);
2223
+ }
2224
+ /**
2225
+ * Build a context key from database and environment
2226
+ */
2227
+ buildContextKey(database, env) {
2228
+ return `${database}:${env}`;
2229
+ }
2230
+ /**
2231
+ * Convert DatabaseTypes (from product API) to DatabaseType (ORM internal)
2232
+ */
2233
+ convertDatabaseType(type) {
2234
+ // Map from DatabaseTypes enum values to DatabaseType enum
2235
+ const typeMap = {
2236
+ 'postgresql': enums_1.DatabaseType.POSTGRESQL,
2237
+ 'mongodb': enums_1.DatabaseType.MONGODB,
2238
+ 'mysql': enums_1.DatabaseType.MYSQL,
2239
+ 'dynamodb': enums_1.DatabaseType.DYNAMODB,
2240
+ 'mariadb': enums_1.DatabaseType.MARIADB,
2241
+ 'cassandra': enums_1.DatabaseType.CASSANDRA,
2242
+ };
2243
+ const normalizedType = String(type).toLowerCase();
2244
+ const mappedType = typeMap[normalizedType];
2245
+ if (!mappedType) {
2246
+ throw new database_error_1.DatabaseError(`Unsupported database type: ${type}. Supported types: ${Object.keys(typeMap).join(', ')}`, enums_1.DatabaseErrorType.VALIDATION_ERROR);
2247
+ }
2248
+ return mappedType;
2249
+ }
2250
+ // ==================== SIMPLIFIED SCHEMA API ====================
2251
+ /**
2252
+ * Simplified schema operations API (Mongoose-style)
2253
+ *
2254
+ * @example
2255
+ * await db.connect({ env: 'dev', product: 'my-app', database: 'users-db' });
2256
+ *
2257
+ * // Create a table with Mongoose-style schema
2258
+ * await db.schema.create('users', {
2259
+ * id: { type: 'uuid', primaryKey: true },
2260
+ * email: { type: 'string', length: 255, required: true, unique: true },
2261
+ * name: { type: 'string', length: 100 },
2262
+ * age: 'integer', // Shorthand
2263
+ * status: { type: 'enum', enum: ['active', 'inactive'], default: 'active' },
2264
+ * }, { timestamps: true });
2265
+ */
2266
+ get schema() {
2267
+ return {
2268
+ /**
2269
+ * Create a collection/table with Mongoose-style schema definition
2270
+ */
2271
+ create: (name, definition, options) => this.schemaCreate(name, definition, options),
2272
+ /**
2273
+ * Drop a collection/table
2274
+ */
2275
+ drop: (name, options) => this.schemaDrop(name, options),
2276
+ /**
2277
+ * Add a field to a collection
2278
+ */
2279
+ addField: (collection, fieldName, definition) => this.schemaAddField(collection, fieldName, definition),
2280
+ /**
2281
+ * Drop a field from a collection
2282
+ */
2283
+ dropField: (collection, fieldName) => this.schemaDropField(collection, fieldName),
2284
+ /**
2285
+ * Rename a field in a collection
2286
+ */
2287
+ renameField: (collection, oldName, newName) => this.schemaRenameField(collection, oldName, newName),
2288
+ /**
2289
+ * Modify a field's definition
2290
+ */
2291
+ modifyField: (collection, fieldName, changes) => this.schemaModifyField(collection, fieldName, changes),
2292
+ /**
2293
+ * Create an index on a collection
2294
+ */
2295
+ createIndex: (collection, fields, options) => this.schemaCreateIndex(collection, fields, options),
2296
+ /**
2297
+ * Drop an index from a collection
2298
+ */
2299
+ dropIndex: (collection, indexName) => this.schemaDropIndex(collection, indexName),
2300
+ /**
2301
+ * Add a constraint (SQL databases only)
2302
+ */
2303
+ addConstraint: (collection, constraint) => this.schemaAddConstraint(collection, constraint),
2304
+ /**
2305
+ * Drop a constraint (SQL databases only)
2306
+ */
2307
+ dropConstraint: (collection, constraintName) => this.schemaDropConstraint(collection, constraintName),
2308
+ /**
2309
+ * Rename a collection/table
2310
+ */
2311
+ rename: (oldName, newName) => this.schemaRename(oldName, newName),
2312
+ /**
2313
+ * Check if a collection/table exists
2314
+ */
2315
+ exists: (name) => this.schemaExists(name),
2316
+ /**
2317
+ * List all collections/tables
2318
+ */
2319
+ list: (schemaName) => this.schemaList(schemaName),
2320
+ /**
2321
+ * Get detailed schema information for a collection
2322
+ */
2323
+ describe: (name) => this.schemaDescribe(name),
2324
+ /**
2325
+ * List indexes on a collection
2326
+ */
2327
+ indexes: (collection) => this.schemaListIndexes(collection),
2328
+ };
2329
+ }
2330
+ // ==================== PRIVATE SCHEMA IMPLEMENTATION ====================
2331
+ /**
2332
+ * Create a collection with Mongoose-style definition
2333
+ */
2334
+ async schemaCreate(name, definition, options) {
2335
+ var _a;
2336
+ const schemaManager = this.getSchemaManager();
2337
+ const fields = this.convertToFieldDefinitions(definition, options === null || options === void 0 ? void 0 : options.timestamps);
2338
+ // Convert simple index definitions to the expected format
2339
+ const indexes = (_a = options === null || options === void 0 ? void 0 : options.indexes) === null || _a === void 0 ? void 0 : _a.map(idx => ({
2340
+ name: idx.name || `idx_${name}_${Array.isArray(idx.fields) ? (typeof idx.fields[0] === 'string' ? idx.fields.join('_') : idx.fields.map((f) => f.name).join('_')) : idx.fields}`,
2341
+ fields: this.normalizeIndexFields(idx.fields),
2342
+ unique: idx.unique,
2343
+ }));
2344
+ return schemaManager.createCollection(name, fields, {
2345
+ autoApply: true,
2346
+ indexes,
2347
+ sqlOptions: options === null || options === void 0 ? void 0 : options.sqlOptions,
2348
+ mongoOptions: options === null || options === void 0 ? void 0 : options.mongoOptions,
2349
+ dynamoOptions: options === null || options === void 0 ? void 0 : options.dynamoOptions,
2350
+ cassandraOptions: options === null || options === void 0 ? void 0 : options.cassandraOptions,
2351
+ });
2352
+ }
2353
+ /**
2354
+ * Drop a collection
2355
+ */
2356
+ async schemaDrop(name, options) {
2357
+ const schemaManager = this.getSchemaManager();
2358
+ return schemaManager.dropCollection(name, {
2359
+ autoApply: true,
2360
+ ifExists: options === null || options === void 0 ? void 0 : options.ifExists,
2361
+ cascade: options === null || options === void 0 ? void 0 : options.cascade,
2362
+ });
2363
+ }
2364
+ /**
2365
+ * Add a field to a collection
2366
+ */
2367
+ async schemaAddField(collection, fieldName, definition) {
2368
+ const schemaManager = this.getSchemaManager();
2369
+ const field = this.convertFieldDefinition(fieldName, definition);
2370
+ return schemaManager.addField(collection, field, { autoApply: true });
2371
+ }
2372
+ /**
2373
+ * Drop a field from a collection
2374
+ */
2375
+ async schemaDropField(collection, fieldName) {
2376
+ const schemaManager = this.getSchemaManager();
2377
+ return schemaManager.dropField(collection, fieldName, { autoApply: true });
2378
+ }
2379
+ /**
2380
+ * Rename a field
2381
+ */
2382
+ async schemaRenameField(collection, oldName, newName) {
2383
+ const schemaManager = this.getSchemaManager();
2384
+ return schemaManager.renameField(collection, oldName, newName, { autoApply: true });
2385
+ }
2386
+ /**
2387
+ * Modify a field's definition
2388
+ */
2389
+ async schemaModifyField(collection, fieldName, changes) {
2390
+ const schemaManager = this.getSchemaManager();
2391
+ const fieldChanges = {};
2392
+ if (changes.type) {
2393
+ fieldChanges.type = this.normalizeFieldType(changes.type);
2394
+ }
2395
+ if (changes.minLength !== undefined) {
2396
+ fieldChanges.minLength = changes.minLength;
2397
+ }
2398
+ if (changes.maxLength !== undefined) {
2399
+ fieldChanges.maxLength = changes.maxLength;
2400
+ }
2401
+ if (changes.precision !== undefined) {
2402
+ fieldChanges.precision = changes.precision;
2403
+ }
2404
+ if (changes.scale !== undefined) {
2405
+ fieldChanges.scale = changes.scale;
2406
+ }
2407
+ if (changes.required !== undefined) {
2408
+ fieldChanges.nullable = !changes.required;
2409
+ }
2410
+ if (changes.unique !== undefined) {
2411
+ fieldChanges.unique = changes.unique;
2412
+ }
2413
+ if (changes.default !== undefined) {
2414
+ fieldChanges.defaultValue = changes.default;
2415
+ }
2416
+ if (changes.enum !== undefined) {
2417
+ fieldChanges.enumValues = changes.enum;
2418
+ }
2419
+ return schemaManager.modifyField(collection, fieldName, fieldChanges, { autoApply: true });
2420
+ }
2421
+ /**
2422
+ * Create an index
2423
+ */
2424
+ async schemaCreateIndex(collection, fields, options) {
2425
+ const schemaManager = this.getSchemaManager();
2426
+ const normalizedFields = this.normalizeIndexFields(fields);
2427
+ const indexName = (options === null || options === void 0 ? void 0 : options.name) || `idx_${collection}_${normalizedFields.map(f => f.name).join('_')}`;
2428
+ return schemaManager.createIndex(collection, indexName, normalizedFields, {
2429
+ autoApply: true,
2430
+ unique: options === null || options === void 0 ? void 0 : options.unique,
2431
+ sparse: options === null || options === void 0 ? void 0 : options.sparse,
2432
+ sqlOptions: (options === null || options === void 0 ? void 0 : options.where) ? { where: options.where } : undefined,
2433
+ mongoOptions: (options === null || options === void 0 ? void 0 : options.expireAfterSeconds) ? { expireAfterSeconds: options.expireAfterSeconds } : undefined,
2434
+ });
2435
+ }
2436
+ /**
2437
+ * Drop an index
2438
+ */
2439
+ async schemaDropIndex(collection, indexName) {
2440
+ const schemaManager = this.getSchemaManager();
2441
+ return schemaManager.dropIndex(collection, indexName, { autoApply: true, ifExists: true });
2442
+ }
2443
+ /**
2444
+ * Add a constraint (SQL only)
2445
+ */
2446
+ async schemaAddConstraint(collection, constraint) {
2447
+ const schemaManager = this.getSchemaManager();
2448
+ return schemaManager.addConstraint(collection, constraint, { autoApply: true });
2449
+ }
2450
+ /**
2451
+ * Drop a constraint (SQL only)
2452
+ */
2453
+ async schemaDropConstraint(collection, constraintName) {
2454
+ const schemaManager = this.getSchemaManager();
2455
+ return schemaManager.dropConstraint(collection, constraintName, { autoApply: true });
2456
+ }
2457
+ /**
2458
+ * Rename a collection
2459
+ */
2460
+ async schemaRename(oldName, newName) {
2461
+ const schemaManager = this.getSchemaManager();
2462
+ return schemaManager.renameCollection(oldName, newName, { autoApply: true });
2463
+ }
2464
+ /**
2465
+ * Check if collection exists
2466
+ */
2467
+ async schemaExists(name) {
2468
+ const schemaManager = this.getSchemaManager();
2469
+ return schemaManager.collectionExists(name);
2470
+ }
2471
+ /**
2472
+ * List all collections
2473
+ */
2474
+ async schemaList(schemaName) {
2475
+ const schemaManager = this.getSchemaManager();
2476
+ return schemaManager.listCollections(schemaName);
2477
+ }
2478
+ /**
2479
+ * Describe a collection's schema
2480
+ */
2481
+ async schemaDescribe(name) {
2482
+ const schemaManager = this.getSchemaManager();
2483
+ return schemaManager.getCollectionSchema(name);
2484
+ }
2485
+ /**
2486
+ * List indexes on a collection
2487
+ */
2488
+ async schemaListIndexes(collection) {
2489
+ const schemaManager = this.getSchemaManager();
2490
+ return schemaManager.listIndexes(collection);
2491
+ }
2492
+ // ==================== SCHEMA CONVERSION HELPERS ====================
2493
+ /**
2494
+ * Convert Mongoose-style schema definition to IFieldDefinition array
2495
+ */
2496
+ convertToFieldDefinitions(definition, timestamps) {
2497
+ const fields = [];
2498
+ for (const [name, config] of Object.entries(definition)) {
2499
+ fields.push(this.convertFieldDefinition(name, config));
2500
+ }
2501
+ if (timestamps) {
2502
+ fields.push({ name: 'created_at', type: 'timestamp', defaultValue: 'NOW()', nullable: false }, { name: 'updated_at', type: 'timestamp', defaultValue: 'NOW()', nullable: false });
2503
+ }
2504
+ return fields;
2505
+ }
2506
+ /**
2507
+ * Convert a single field definition
2508
+ */
2509
+ convertFieldDefinition(name, config) {
2510
+ // Handle shorthand: { name: 'string' }
2511
+ if (typeof config === 'string') {
2512
+ return { name, type: this.normalizeFieldType(config) };
2513
+ }
2514
+ // Validate autoIncrement only works with numeric types
2515
+ if (config.autoIncrement) {
2516
+ const normalizedType = this.normalizeFieldType(config.type);
2517
+ const numericTypes = ['integer', 'int', 'bigint', 'smallint', 'number', 'float', 'double', 'decimal'];
2518
+ if (!numericTypes.includes(normalizedType.toLowerCase())) {
2519
+ throw new database_error_1.DatabaseError(`autoIncrement can only be used with numeric types (integer, bigint, number, etc.), but field '${name}' has type '${config.type}'`, enums_1.DatabaseErrorType.VALIDATION_ERROR);
2520
+ }
2521
+ }
2522
+ // Handle full definition
2523
+ return {
2524
+ name,
2525
+ type: this.normalizeFieldType(config.type),
2526
+ nullable: config.required === undefined ? true : !config.required,
2527
+ unique: config.unique,
2528
+ primaryKey: config.primaryKey,
2529
+ autoGenerate: config.autoIncrement,
2530
+ defaultValue: config.default,
2531
+ minLength: config.minLength,
2532
+ maxLength: config.maxLength,
2533
+ precision: config.precision,
2534
+ scale: config.scale,
2535
+ enumValues: config.enum,
2536
+ comment: config.comment,
2537
+ };
2538
+ }
2539
+ /**
2540
+ * Normalize Mongoose-style type names to FieldType
2541
+ */
2542
+ normalizeFieldType(type) {
2543
+ const typeMap = {
2544
+ // String types
2545
+ 'String': 'string',
2546
+ // Numeric types
2547
+ 'Number': 'double', // JS number is 64-bit float
2548
+ 'Integer': 'integer', // 32-bit signed integer
2549
+ 'BigInt': 'bigint', // 64-bit signed integer
2550
+ 'Float': 'float', // 32-bit floating point
2551
+ 'Double': 'double', // 64-bit floating point
2552
+ 'Decimal': 'decimal', // Exact precision (for money)
2553
+ // Other types
2554
+ 'Boolean': 'boolean',
2555
+ 'Date': 'datetime',
2556
+ 'ObjectId': 'uuid',
2557
+ 'Array': 'array',
2558
+ 'Object': 'json',
2559
+ 'Mixed': 'json',
2560
+ };
2561
+ return typeMap[type] || type;
2562
+ }
2563
+ /**
2564
+ * Normalize index fields to IIndexFieldDefinition array
2565
+ */
2566
+ normalizeIndexFields(fields) {
2567
+ if (fields.length === 0) {
2568
+ return [];
2569
+ }
2570
+ // Check if first element is a string
2571
+ if (typeof fields[0] === 'string') {
2572
+ return fields.map(name => ({ name }));
2573
+ }
2574
+ return fields;
2575
+ }
2576
+ /**
2577
+ * Get adapter by context key (used by DatabaseConnection)
2578
+ * @internal
2579
+ */
2580
+ getAdapterByContextKey(contextKey) {
2581
+ const adapter = this.adapters.get(contextKey);
2582
+ if (!adapter) {
2583
+ throw new database_error_1.DatabaseError(`No adapter found for context '${contextKey}'. Call connect() first.`, enums_1.DatabaseErrorType.CONNECTION_ERROR);
2584
+ }
2585
+ return adapter;
2586
+ }
2587
+ }
2588
+ exports.DatabaseService = DatabaseService;
2589
+ /**
2590
+ * Connection-scoped database interface.
2591
+ * Provides isolated schema, query, and aggregation operations for a specific database/environment.
2592
+ */
2593
+ class DatabaseConnection {
2594
+ constructor(service, database, env, product) {
2595
+ this.service = service;
2596
+ this._database = database;
2597
+ this._env = env;
2598
+ this._product = product;
2599
+ this.contextKey = `${database}:${env}`;
2600
+ this.triggerProcessor = new trigger_processor_1.TriggerProcessor({}, null);
2601
+ }
2602
+ /** Database tag */
2603
+ get database() {
2604
+ return this._database;
2605
+ }
2606
+ /** Environment slug */
2607
+ get env() {
2608
+ return this._env;
2609
+ }
2610
+ /** Product tag */
2611
+ get product() {
2612
+ return this._product;
2613
+ }
2614
+ /** Get the adapter for this connection */
2615
+ getAdapter() {
2616
+ return this.service.getAdapterByContextKey(this.contextKey);
2617
+ }
2618
+ /**
2619
+ * Schema operations scoped to this connection
2620
+ */
2621
+ get schema() {
2622
+ const adapter = () => this.getAdapter();
2623
+ const service = this.service;
2624
+ return {
2625
+ create: async (name, definition, options) => {
2626
+ var _a;
2627
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2628
+ const fields = service.convertToFieldDefinitions(definition, options === null || options === void 0 ? void 0 : options.timestamps);
2629
+ const indexes = (_a = options === null || options === void 0 ? void 0 : options.indexes) === null || _a === void 0 ? void 0 : _a.map(idx => ({
2630
+ name: idx.name || `idx_${name}_${Array.isArray(idx.fields) ? (typeof idx.fields[0] === 'string' ? idx.fields.join('_') : idx.fields.map((f) => f.name).join('_')) : idx.fields}`,
2631
+ fields: service.normalizeIndexFields(idx.fields),
2632
+ unique: idx.unique,
2633
+ }));
2634
+ return schemaManager.createCollection(name, fields, {
2635
+ autoApply: true,
2636
+ indexes,
2637
+ sqlOptions: options === null || options === void 0 ? void 0 : options.sqlOptions,
2638
+ mongoOptions: options === null || options === void 0 ? void 0 : options.mongoOptions,
2639
+ dynamoOptions: options === null || options === void 0 ? void 0 : options.dynamoOptions,
2640
+ cassandraOptions: options === null || options === void 0 ? void 0 : options.cassandraOptions,
2641
+ });
2642
+ },
2643
+ drop: async (name, options) => {
2644
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2645
+ return schemaManager.dropCollection(name, {
2646
+ autoApply: true,
2647
+ ifExists: options === null || options === void 0 ? void 0 : options.ifExists,
2648
+ cascade: options === null || options === void 0 ? void 0 : options.cascade,
2649
+ });
2650
+ },
2651
+ addField: async (collection, fieldName, definition) => {
2652
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2653
+ const field = service.convertFieldDefinition(fieldName, definition);
2654
+ return schemaManager.addField(collection, field, { autoApply: true });
2655
+ },
2656
+ dropField: async (collection, fieldName) => {
2657
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2658
+ return schemaManager.dropField(collection, fieldName, { autoApply: true });
2659
+ },
2660
+ renameField: async (collection, oldName, newName) => {
2661
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2662
+ return schemaManager.renameField(collection, oldName, newName, { autoApply: true });
2663
+ },
2664
+ modifyField: async (collection, fieldName, changes) => {
2665
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2666
+ const fieldChanges = {};
2667
+ if (changes.type)
2668
+ fieldChanges.type = service.normalizeFieldType(changes.type);
2669
+ if (changes.minLength !== undefined)
2670
+ fieldChanges.minLength = changes.minLength;
2671
+ if (changes.maxLength !== undefined)
2672
+ fieldChanges.maxLength = changes.maxLength;
2673
+ if (changes.precision !== undefined)
2674
+ fieldChanges.precision = changes.precision;
2675
+ if (changes.scale !== undefined)
2676
+ fieldChanges.scale = changes.scale;
2677
+ if (changes.required !== undefined)
2678
+ fieldChanges.nullable = !changes.required;
2679
+ if (changes.unique !== undefined)
2680
+ fieldChanges.unique = changes.unique;
2681
+ if (changes.default !== undefined)
2682
+ fieldChanges.defaultValue = changes.default;
2683
+ if (changes.enum !== undefined)
2684
+ fieldChanges.enumValues = changes.enum;
2685
+ return schemaManager.modifyField(collection, fieldName, fieldChanges, { autoApply: true });
2686
+ },
2687
+ createIndex: async (collection, fields, options) => {
2688
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2689
+ const normalizedFields = service.normalizeIndexFields(fields);
2690
+ const indexName = (options === null || options === void 0 ? void 0 : options.name) || `idx_${collection}_${normalizedFields.map((f) => f.name).join('_')}`;
2691
+ return schemaManager.createIndex(collection, indexName, normalizedFields, {
2692
+ autoApply: true,
2693
+ unique: options === null || options === void 0 ? void 0 : options.unique,
2694
+ sparse: options === null || options === void 0 ? void 0 : options.sparse,
2695
+ sqlOptions: (options === null || options === void 0 ? void 0 : options.where) ? { where: options.where } : undefined,
2696
+ mongoOptions: (options === null || options === void 0 ? void 0 : options.expireAfterSeconds) ? { expireAfterSeconds: options.expireAfterSeconds } : undefined,
2697
+ });
2698
+ },
2699
+ dropIndex: async (collection, indexName) => {
2700
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2701
+ return schemaManager.dropIndex(collection, indexName, { autoApply: true, ifExists: true });
2702
+ },
2703
+ addConstraint: async (collection, constraint) => {
2704
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2705
+ return schemaManager.addConstraint(collection, constraint, { autoApply: true });
2706
+ },
2707
+ dropConstraint: async (collection, constraintName) => {
2708
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2709
+ return schemaManager.dropConstraint(collection, constraintName, { autoApply: true });
2710
+ },
2711
+ rename: async (oldName, newName) => {
2712
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2713
+ return schemaManager.renameCollection(oldName, newName, { autoApply: true });
2714
+ },
2715
+ exists: async (name) => {
2716
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2717
+ return schemaManager.collectionExists(name);
2718
+ },
2719
+ list: async (schemaName) => {
2720
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2721
+ return schemaManager.listCollections(schemaName);
2722
+ },
2723
+ describe: async (name) => {
2724
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2725
+ return schemaManager.getCollectionSchema(name);
2726
+ },
2727
+ indexes: async (collection) => {
2728
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2729
+ return schemaManager.listIndexes(collection);
2730
+ },
2731
+ };
2732
+ }
2733
+ // Query operations scoped to this connection
2734
+ query(options) {
2735
+ return this.service.query(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2736
+ }
2737
+ insert(options) {
2738
+ return this.service.insert(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2739
+ }
2740
+ update(options) {
2741
+ return this.service.update(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2742
+ }
2743
+ delete(options) {
2744
+ return this.service.delete(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2745
+ }
2746
+ upsert(options) {
2747
+ return this.service.upsert(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2748
+ }
2749
+ raw(options) {
2750
+ return this.service.raw(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2751
+ }
2752
+ // Aggregation operations scoped to this connection
2753
+ count(options) {
2754
+ return this.service.count(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2755
+ }
2756
+ sum(options) {
2757
+ return this.service.sum(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2758
+ }
2759
+ avg(options) {
2760
+ return this.service.avg(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2761
+ }
2762
+ min(options) {
2763
+ return this.service.min(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2764
+ }
2765
+ max(options) {
2766
+ return this.service.max(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2767
+ }
2768
+ aggregate(options) {
2769
+ return this.service.aggregate(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2770
+ }
2771
+ groupBy(options) {
2772
+ return this.service.groupBy(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2773
+ }
2774
+ /**
2775
+ * Trigger operations scoped to this connection
2776
+ */
2777
+ get triggers() {
2778
+ const connection = this;
2779
+ return {
2780
+ /**
2781
+ * Create a trigger and store it on the backend
2782
+ * @param data - Trigger configuration (tag should be just the trigger name, database tag is added automatically)
2783
+ */
2784
+ create: async (data) => {
2785
+ var _a;
2786
+ if (!connection._product) {
2787
+ throw new Error('Product tag is required to create triggers. Use connect() with product parameter.');
2788
+ }
2789
+ // Auto-prefix with database tag if not already prefixed
2790
+ const tag = ((_a = data.tag) === null || _a === void 0 ? void 0 : _a.includes(':')) ? data.tag : `${connection._database}:${data.tag}`;
2791
+ return connection.service.createTrigger(connection._product, Object.assign(Object.assign({}, data), { tag }));
2792
+ },
2793
+ /**
2794
+ * Update an existing trigger on the backend
2795
+ * @param data - Trigger configuration
2796
+ */
2797
+ update: async (data) => {
2798
+ var _a;
2799
+ if (!connection._product) {
2800
+ throw new Error('Product tag is required to update triggers. Use connect() with product parameter.');
2801
+ }
2802
+ const tag = ((_a = data.tag) === null || _a === void 0 ? void 0 : _a.includes(':')) ? data.tag : `${connection._database}:${data.tag}`;
2803
+ return connection.service.updateTrigger(connection._product, Object.assign(Object.assign({}, data), { tag }));
2804
+ },
2805
+ /**
2806
+ * Fetch a specific trigger from the backend
2807
+ * @param triggerTag - The trigger tag (without database prefix)
2808
+ */
2809
+ fetch: async (triggerTag) => {
2810
+ if (!connection._product) {
2811
+ throw new Error('Product tag is required to fetch triggers. Use connect() with product parameter.');
2812
+ }
2813
+ const tag = triggerTag.includes(':') ? triggerTag : `${connection._database}:${triggerTag}`;
2814
+ return connection.service.fetchTrigger(connection._product, tag);
2815
+ },
2816
+ /**
2817
+ * Fetch all triggers for this database from the backend
2818
+ * @deprecated Use list() instead
2819
+ */
2820
+ fetchAll: async () => {
2821
+ if (!connection._product) {
2822
+ throw new Error('Product tag is required to fetch triggers. Use connect() with product parameter.');
2823
+ }
2824
+ return connection.service.fetchTriggers(connection._product, connection._database);
2825
+ },
2826
+ /**
2827
+ * List all triggers for this database from the backend
2828
+ * @param options - Optional filters (table, event, enabled)
2829
+ */
2830
+ list: async (options) => {
2831
+ if (!connection._product) {
2832
+ throw new Error('Product tag is required to list triggers. Use connect() with product parameter.');
2833
+ }
2834
+ let triggers = await connection.service.fetchTriggers(connection._product, connection._database);
2835
+ // Apply filters if provided
2836
+ if (options === null || options === void 0 ? void 0 : options.table) {
2837
+ triggers = triggers.filter(t => { var _a; return (_a = t.tables) === null || _a === void 0 ? void 0 : _a.includes(options.table); });
2838
+ }
2839
+ if (options === null || options === void 0 ? void 0 : options.event) {
2840
+ triggers = triggers.filter(t => { var _a; return (_a = t.events) === null || _a === void 0 ? void 0 : _a.includes(options.event); });
2841
+ }
2842
+ if ((options === null || options === void 0 ? void 0 : options.enabled) !== undefined) {
2843
+ triggers = triggers.filter(t => t.enabled === options.enabled);
2844
+ }
2845
+ return triggers;
2846
+ },
2847
+ /**
2848
+ * Delete a trigger from the backend
2849
+ * @param triggerTag - The trigger tag (without database prefix)
2850
+ */
2851
+ delete: async (triggerTag) => {
2852
+ if (!connection._product) {
2853
+ throw new Error('Product tag is required to delete triggers. Use connect() with product parameter.');
2854
+ }
2855
+ const tag = triggerTag.includes(':') ? triggerTag : `${connection._database}:${triggerTag}`;
2856
+ await connection.service.deleteTrigger(connection._product, tag);
2857
+ return true;
2858
+ },
2859
+ /**
2860
+ * Register a trigger in memory for the current session (does not persist to backend)
2861
+ * @deprecated Use create() for persistent triggers
2862
+ */
2863
+ register: (table, trigger) => {
2864
+ connection.triggerProcessor.register(table, trigger);
2865
+ },
2866
+ /**
2867
+ * Register multiple triggers in memory (does not persist to backend)
2868
+ * @deprecated Use create() for persistent triggers
2869
+ */
2870
+ registerAll: (triggers) => {
2871
+ connection.triggerProcessor.registerAll(triggers);
2872
+ },
2873
+ /**
2874
+ * Unregister a trigger from memory
2875
+ */
2876
+ unregister: (table, triggerName) => {
2877
+ return connection.triggerProcessor.unregister(table, triggerName);
2878
+ },
2879
+ /**
2880
+ * Get all triggers for a table and event
2881
+ */
2882
+ getTriggersForEvent: (table, event) => {
2883
+ return connection.triggerProcessor.getTriggersForEvent(table, event);
2884
+ },
2885
+ /**
2886
+ * Execute all triggers for an event
2887
+ */
2888
+ execute: async (event, context) => {
2889
+ return connection.triggerProcessor.executeTriggers(event, Object.assign(Object.assign({}, context), { database: connection._database, env: connection._env }));
2890
+ },
2891
+ /**
2892
+ * Load triggers from the backend and register them in memory
2893
+ */
2894
+ load: async () => {
2895
+ if (!connection._product) {
2896
+ throw new Error('Product tag is required to load triggers. Use connect() with product parameter.');
2897
+ }
2898
+ const backendTriggers = await connection.service.fetchTriggers(connection._product, connection._database);
2899
+ for (const trigger of backendTriggers) {
2900
+ // Convert backend trigger format to ITriggerDefinition
2901
+ const definition = {
2902
+ name: trigger.tag,
2903
+ description: trigger.description,
2904
+ events: trigger.events, // TriggerEventType maps to TriggerEvent
2905
+ tables: trigger.tables,
2906
+ condition: trigger.condition,
2907
+ actions: trigger.actions.map(action => (Object.assign(Object.assign({}, action.config), { type: action.type, name: action.name, condition: action.condition, timing: action.timing, retry: action.retry, timeout: action.timeout, continueOnError: action.continueOnError }))),
2908
+ enabled: trigger.enabled,
2909
+ priority: trigger.priority,
2910
+ tags: trigger.tags,
2911
+ };
2912
+ // Register for all tables specified, or use '*' for all
2913
+ const tables = trigger.tables && trigger.tables.length > 0 ? trigger.tables : ['*'];
2914
+ for (const table of tables) {
2915
+ connection.triggerProcessor.register(table, definition);
2916
+ }
2917
+ }
2918
+ },
2919
+ /**
2920
+ * Set the Ductape instance for trigger actions
2921
+ */
2922
+ setDuctapeInstance: (instance) => {
2923
+ connection.triggerProcessor.setDuctapeInstance(instance);
2924
+ },
2925
+ /**
2926
+ * Get the trigger processor instance
2927
+ */
2928
+ getProcessor: () => {
2929
+ return connection.triggerProcessor;
2930
+ },
2931
+ /**
2932
+ * Trigger action builders
2933
+ */
2934
+ Trigger: trigger_processor_1.Trigger,
2935
+ /**
2936
+ * Trigger events enum
2937
+ */
2938
+ TriggerEvent: trigger_interface_1.TriggerEvent,
2939
+ /**
2940
+ * Trigger timing enum
2941
+ */
2942
+ TriggerTiming: trigger_interface_1.TriggerTiming,
2943
+ /**
2944
+ * Trigger action types enum
2945
+ */
2946
+ TriggerActionType: trigger_interface_1.TriggerActionType,
2947
+ };
2948
+ }
2949
+ }
2950
+ exports.DatabaseConnection = DatabaseConnection;
2951
+ // Export singleton instance for convenience
2952
+ exports.databaseService = new DatabaseService();
2953
+ //# sourceMappingURL=databases.service.js.map