@baasix/baasix 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (666) hide show
  1. package/LICENSE.MD +85 -0
  2. package/README.md +526 -0
  3. package/assets/banner.jpg +0 -0
  4. package/assets/banner_small.jpg +0 -0
  5. package/assets/logo_icon.svg +20 -0
  6. package/assets/logo_icon_rounded.svg +20 -0
  7. package/dist/LICENSE.MD +85 -0
  8. package/dist/README.md +526 -0
  9. package/dist/app/404/index.html +1 -0
  10. package/dist/app/404.html +1 -0
  11. package/dist/app/_next/static/chunks/041e1f03-56ae8a902a7f2fe6.js +24 -0
  12. package/dist/app/_next/static/chunks/1117-05479929a8da73e3.js +1 -0
  13. package/dist/app/_next/static/chunks/1299.77cc7b7b76b75cba.js +1 -0
  14. package/dist/app/_next/static/chunks/1303-35a96e9c9cdeab9d.js +1 -0
  15. package/dist/app/_next/static/chunks/1509-56ac00cdaaecdf53.js +1 -0
  16. package/dist/app/_next/static/chunks/1668-e3eabd0f6753c780.js +1 -0
  17. package/dist/app/_next/static/chunks/1783-d9fb550fd324300c.js +1 -0
  18. package/dist/app/_next/static/chunks/2117-29b5fa47421595ad.js +2 -0
  19. package/dist/app/_next/static/chunks/2344.35b46d2179a765b5.js +1 -0
  20. package/dist/app/_next/static/chunks/257.990da16794a31292.js +1 -0
  21. package/dist/app/_next/static/chunks/2676-73b0ee7c80073a84.js +1 -0
  22. package/dist/app/_next/static/chunks/3563-b8842744384391fe.js +1 -0
  23. package/dist/app/_next/static/chunks/363642f4-933b579ed3c85f60.js +1 -0
  24. package/dist/app/_next/static/chunks/3817-e20c8f0a0810fc95.js +1 -0
  25. package/dist/app/_next/static/chunks/3834.84944e390d902509.js +2 -0
  26. package/dist/app/_next/static/chunks/4043-3a30c8a75896f241.js +1 -0
  27. package/dist/app/_next/static/chunks/4225-14090c7c0cd9dec6.js +1 -0
  28. package/dist/app/_next/static/chunks/4438-c9a12ca15b6e9160.js +1 -0
  29. package/dist/app/_next/static/chunks/4458-679fd0c6884f456a.js +1 -0
  30. package/dist/app/_next/static/chunks/4475-8bdfbd536fba8c48.js +1 -0
  31. package/dist/app/_next/static/chunks/4883-8a924721bb21b3b0.js +1 -0
  32. package/dist/app/_next/static/chunks/489-683ab07188f9df2b.js +1 -0
  33. package/dist/app/_next/static/chunks/4952-1b97320cf61f3f21.js +1 -0
  34. package/dist/app/_next/static/chunks/5094-8d53e403235d4ca6.js +1 -0
  35. package/dist/app/_next/static/chunks/5101-3a146e0625747ad1.js +1 -0
  36. package/dist/app/_next/static/chunks/54a60aa6-d9747982e0a81f58.js +79 -0
  37. package/dist/app/_next/static/chunks/5650-f096291df402bfc2.js +1 -0
  38. package/dist/app/_next/static/chunks/600-539045311240f579.js +1 -0
  39. package/dist/app/_next/static/chunks/6170-803b82e19d3ade6d.js +89 -0
  40. package/dist/app/_next/static/chunks/6241-30d7169d1010e5a4.js +1 -0
  41. package/dist/app/_next/static/chunks/6530-a91e10cffa4200c4.js +1 -0
  42. package/dist/app/_next/static/chunks/6547-4bbbdb5c399aef1e.js +1 -0
  43. package/dist/app/_next/static/chunks/6712-781937c53a2c49da.js +1 -0
  44. package/dist/app/_next/static/chunks/6fcbdc68-90be1a5480b8d353.js +1 -0
  45. package/dist/app/_next/static/chunks/70e0d97a-aeaf0cdc26ba1a58.js +1 -0
  46. package/dist/app/_next/static/chunks/7214-5154a89d08d24dde.js +1 -0
  47. package/dist/app/_next/static/chunks/7324-b53229c59a640880.js +10 -0
  48. package/dist/app/_next/static/chunks/7636-66424f0b51d350e9.js +1 -0
  49. package/dist/app/_next/static/chunks/7874-39a3f2541165a675.js +1 -0
  50. package/dist/app/_next/static/chunks/7982-9da12b83f11e3f5f.js +1 -0
  51. package/dist/app/_next/static/chunks/8213a2eb-da25a3b3c5521b2b.js +1 -0
  52. package/dist/app/_next/static/chunks/8473-6598318371eca31b.js +1 -0
  53. package/dist/app/_next/static/chunks/8640fa6b-72e43370f68e5587.js +1 -0
  54. package/dist/app/_next/static/chunks/9090-3ef676f29c95f1c7.js +1 -0
  55. package/dist/app/_next/static/chunks/9124-a02f9e209e6e3cce.js +1 -0
  56. package/dist/app/_next/static/chunks/926-156f32067d111d6b.js +1 -0
  57. package/dist/app/_next/static/chunks/9487-b17481605e513b83.js +1 -0
  58. package/dist/app/_next/static/chunks/9599-a7e572bb88c3392b.js +1 -0
  59. package/dist/app/_next/static/chunks/9881-419697138376e755.js +1 -0
  60. package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/all-activity/page-8917930b4d663405.js +1 -0
  61. package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/email-log/page-b27a6ee32782d7df.js +1 -0
  62. package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/notifications/page-b7eda523ede2702c.js +1 -0
  63. package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/page-1cfa62d1caedaed0.js +1 -0
  64. package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/sessions/page-3e21e20db90aeff7.js +1 -0
  65. package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/workflow-executions/page-27bcc26b747fb29b.js +1 -0
  66. package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/workflow-logs/page-9f9e9e952aef436e.js +1 -0
  67. package/dist/app/_next/static/chunks/app/(authenticated)/change-password/page-8d61aa499eabb127.js +1 -0
  68. package/dist/app/_next/static/chunks/app/(authenticated)/dashboard/page-1ceeac9e72997a8a.js +1 -0
  69. package/dist/app/_next/static/chunks/app/(authenticated)/data-browser/page-8cda2b57759dd670.js +1 -0
  70. package/dist/app/_next/static/chunks/app/(authenticated)/file-manager/page-8c6f1b1da66ad7e4.js +1 -0
  71. package/dist/app/_next/static/chunks/app/(authenticated)/layout-f70d225b2759c998.js +1 -0
  72. package/dist/app/_next/static/chunks/app/(authenticated)/settings/migrations/page-aacec8f7cfb40ab2.js +1 -0
  73. package/dist/app/_next/static/chunks/app/(authenticated)/settings/permissions/page-828110cfcde429c6.js +1 -0
  74. package/dist/app/_next/static/chunks/app/(authenticated)/settings/project/page-420e794bb76bd204.js +1 -0
  75. package/dist/app/_next/static/chunks/app/(authenticated)/settings/roles/page-9001d02b28f70708.js +1 -0
  76. package/dist/app/_next/static/chunks/app/(authenticated)/settings/schema/page-899574f35091dd58.js +1 -0
  77. package/dist/app/_next/static/chunks/app/(authenticated)/settings/tasks/page-ad7ab3e27c83f44f.js +1 -0
  78. package/dist/app/_next/static/chunks/app/(authenticated)/settings/templates/edit/page-bd83414cb8c4cb04.js +1 -0
  79. package/dist/app/_next/static/chunks/app/(authenticated)/settings/templates/page-3181447f8772b1d3.js +1 -0
  80. package/dist/app/_next/static/chunks/app/(authenticated)/settings/tenants/page-ef9bfbacef5a1d73.js +1 -0
  81. package/dist/app/_next/static/chunks/app/(authenticated)/users/invites/page-480306b7b2bbac7e.js +1 -0
  82. package/dist/app/_next/static/chunks/app/(authenticated)/users/list/page-74da51254c2606b3.js +1 -0
  83. package/dist/app/_next/static/chunks/app/(authenticated)/users/page-e99c6f0b915001b2.js +1 -0
  84. package/dist/app/_next/static/chunks/app/(authenticated)/users/preferences/page-1a935630ce8f2b12.js +1 -0
  85. package/dist/app/_next/static/chunks/app/(authenticated)/users/user-roles/page-901dfb8ea1f39ca8.js +1 -0
  86. package/dist/app/_next/static/chunks/app/(authenticated)/workflows/detail/page-9a6b839aea688ca4.js +1 -0
  87. package/dist/app/_next/static/chunks/app/(authenticated)/workflows/edit/page-11774efbc2fecae2.js +1 -0
  88. package/dist/app/_next/static/chunks/app/(authenticated)/workflows/execution/page-8ec1aea90412c03d.js +1 -0
  89. package/dist/app/_next/static/chunks/app/(authenticated)/workflows/page-88bc5b36ccb0a1f7.js +1 -0
  90. package/dist/app/_next/static/chunks/app/(public)/forgot-password/page-ed263fd46ef81c20.js +1 -0
  91. package/dist/app/_next/static/chunks/app/(public)/layout-f538977545844af8.js +1 -0
  92. package/dist/app/_next/static/chunks/app/(public)/login/page-c0a10b137f346096.js +1 -0
  93. package/dist/app/_next/static/chunks/app/(public)/register/page-4cb7644893efd9b3.js +1 -0
  94. package/dist/app/_next/static/chunks/app/_not-found/page-653f8815b78256cc.js +1 -0
  95. package/dist/app/_next/static/chunks/app/layout-591ca7a3e16528a1.js +1 -0
  96. package/dist/app/_next/static/chunks/app/page-dd19d124b5fa2577.js +1 -0
  97. package/dist/app/_next/static/chunks/c37d3baf.c2ff165f5b02c692.js +1 -0
  98. package/dist/app/_next/static/chunks/d0deef33.0379166a4ec23470.js +1 -0
  99. package/dist/app/_next/static/chunks/fd9d1056-54169f07cd680d6c.js +1 -0
  100. package/dist/app/_next/static/chunks/framework-8e0e0f4a6b83a956.js +1 -0
  101. package/dist/app/_next/static/chunks/main-324e91f5a430cddf.js +1 -0
  102. package/dist/app/_next/static/chunks/main-app-55bcae20c77aaf0e.js +1 -0
  103. package/dist/app/_next/static/chunks/pages/_app-3c9ca398d360b709.js +1 -0
  104. package/dist/app/_next/static/chunks/pages/_error-cf5ca766ac8f493f.js +1 -0
  105. package/dist/app/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  106. package/dist/app/_next/static/chunks/webpack-2c306566f7ee1b63.js +1 -0
  107. package/dist/app/_next/static/css/6c4002bae4e236b2.css +3 -0
  108. package/dist/app/_next/static/css/a275cc2b185e04f8.css +1 -0
  109. package/dist/app/_next/static/eCWhKA8XHqmB1zgFcEtN2/_buildManifest.js +1 -0
  110. package/dist/app/_next/static/eCWhKA8XHqmB1zgFcEtN2/_ssgManifest.js +1 -0
  111. package/dist/app/activity-log/all-activity/index.html +1 -0
  112. package/dist/app/activity-log/all-activity/index.txt +14 -0
  113. package/dist/app/activity-log/email-log/index.html +1 -0
  114. package/dist/app/activity-log/email-log/index.txt +14 -0
  115. package/dist/app/activity-log/index.html +1 -0
  116. package/dist/app/activity-log/index.txt +14 -0
  117. package/dist/app/activity-log/notifications/index.html +1 -0
  118. package/dist/app/activity-log/notifications/index.txt +14 -0
  119. package/dist/app/activity-log/sessions/index.html +1 -0
  120. package/dist/app/activity-log/sessions/index.txt +14 -0
  121. package/dist/app/activity-log/workflow-executions/index.html +1 -0
  122. package/dist/app/activity-log/workflow-executions/index.txt +14 -0
  123. package/dist/app/activity-log/workflow-logs/index.html +1 -0
  124. package/dist/app/activity-log/workflow-logs/index.txt +14 -0
  125. package/dist/app/change-password/index.html +1 -0
  126. package/dist/app/change-password/index.txt +14 -0
  127. package/dist/app/dashboard/index.html +1 -0
  128. package/dist/app/dashboard/index.txt +14 -0
  129. package/dist/app/data-browser/index.html +1 -0
  130. package/dist/app/data-browser/index.txt +14 -0
  131. package/dist/app/file-manager/index.html +1 -0
  132. package/dist/app/file-manager/index.txt +14 -0
  133. package/dist/app/forgot-password/index.html +1 -0
  134. package/dist/app/forgot-password/index.txt +13 -0
  135. package/dist/app/index.html +1 -0
  136. package/dist/app/index.txt +9 -0
  137. package/dist/app/login/index.html +1 -0
  138. package/dist/app/login/index.txt +13 -0
  139. package/dist/app/logo-dark.png +0 -0
  140. package/dist/app/logo-icon.svg +81 -0
  141. package/dist/app/logo-light.png +0 -0
  142. package/dist/app/register/index.html +1 -0
  143. package/dist/app/register/index.txt +13 -0
  144. package/dist/app/settings/migrations/index.html +1 -0
  145. package/dist/app/settings/migrations/index.txt +14 -0
  146. package/dist/app/settings/permissions/index.html +1 -0
  147. package/dist/app/settings/permissions/index.txt +14 -0
  148. package/dist/app/settings/project/index.html +1 -0
  149. package/dist/app/settings/project/index.txt +14 -0
  150. package/dist/app/settings/roles/index.html +1 -0
  151. package/dist/app/settings/roles/index.txt +14 -0
  152. package/dist/app/settings/schema/index.html +1 -0
  153. package/dist/app/settings/schema/index.txt +14 -0
  154. package/dist/app/settings/tasks/index.html +1 -0
  155. package/dist/app/settings/tasks/index.txt +14 -0
  156. package/dist/app/settings/templates/edit/index.html +1 -0
  157. package/dist/app/settings/templates/edit/index.txt +14 -0
  158. package/dist/app/settings/templates/index.html +1 -0
  159. package/dist/app/settings/templates/index.txt +14 -0
  160. package/dist/app/settings/tenants/index.html +1 -0
  161. package/dist/app/settings/tenants/index.txt +14 -0
  162. package/dist/app/users/index.html +1 -0
  163. package/dist/app/users/index.txt +14 -0
  164. package/dist/app/users/invites/index.html +1 -0
  165. package/dist/app/users/invites/index.txt +14 -0
  166. package/dist/app/users/list/index.html +1 -0
  167. package/dist/app/users/list/index.txt +14 -0
  168. package/dist/app/users/preferences/index.html +1 -0
  169. package/dist/app/users/preferences/index.txt +14 -0
  170. package/dist/app/users/user-roles/index.html +1 -0
  171. package/dist/app/users/user-roles/index.txt +14 -0
  172. package/dist/app/workflows/detail/index.html +1 -0
  173. package/dist/app/workflows/detail/index.txt +14 -0
  174. package/dist/app/workflows/edit/index.html +1 -0
  175. package/dist/app/workflows/edit/index.txt +14 -0
  176. package/dist/app/workflows/execution/index.html +1 -0
  177. package/dist/app/workflows/execution/index.txt +14 -0
  178. package/dist/app/workflows/index.html +1 -0
  179. package/dist/app/workflows/index.txt +14 -0
  180. package/dist/app.d.ts +36 -0
  181. package/dist/app.d.ts.map +1 -0
  182. package/dist/app.js +546 -0
  183. package/dist/app.js.map +1 -0
  184. package/dist/auth/adapters/baasix-adapter.d.ts +12 -0
  185. package/dist/auth/adapters/baasix-adapter.d.ts.map +1 -0
  186. package/dist/auth/adapters/baasix-adapter.js +318 -0
  187. package/dist/auth/adapters/baasix-adapter.js.map +1 -0
  188. package/dist/auth/adapters/index.d.ts +6 -0
  189. package/dist/auth/adapters/index.d.ts.map +1 -0
  190. package/dist/auth/adapters/index.js +5 -0
  191. package/dist/auth/adapters/index.js.map +1 -0
  192. package/dist/auth/core.d.ts +73 -0
  193. package/dist/auth/core.d.ts.map +1 -0
  194. package/dist/auth/core.js +528 -0
  195. package/dist/auth/core.js.map +1 -0
  196. package/dist/auth/index.d.ts +56 -0
  197. package/dist/auth/index.d.ts.map +1 -0
  198. package/dist/auth/index.js +58 -0
  199. package/dist/auth/index.js.map +1 -0
  200. package/dist/auth/oauth2/index.d.ts +5 -0
  201. package/dist/auth/oauth2/index.d.ts.map +1 -0
  202. package/dist/auth/oauth2/index.js +5 -0
  203. package/dist/auth/oauth2/index.js.map +1 -0
  204. package/dist/auth/oauth2/utils.d.ts +90 -0
  205. package/dist/auth/oauth2/utils.d.ts.map +1 -0
  206. package/dist/auth/oauth2/utils.js +167 -0
  207. package/dist/auth/oauth2/utils.js.map +1 -0
  208. package/dist/auth/providers/apple.d.ts +28 -0
  209. package/dist/auth/providers/apple.d.ts.map +1 -0
  210. package/dist/auth/providers/apple.js +192 -0
  211. package/dist/auth/providers/apple.js.map +1 -0
  212. package/dist/auth/providers/credential.d.ts +87 -0
  213. package/dist/auth/providers/credential.d.ts.map +1 -0
  214. package/dist/auth/providers/credential.js +162 -0
  215. package/dist/auth/providers/credential.js.map +1 -0
  216. package/dist/auth/providers/facebook.d.ts +26 -0
  217. package/dist/auth/providers/facebook.d.ts.map +1 -0
  218. package/dist/auth/providers/facebook.js +112 -0
  219. package/dist/auth/providers/facebook.js.map +1 -0
  220. package/dist/auth/providers/github.d.ts +29 -0
  221. package/dist/auth/providers/github.d.ts.map +1 -0
  222. package/dist/auth/providers/github.js +144 -0
  223. package/dist/auth/providers/github.js.map +1 -0
  224. package/dist/auth/providers/google.d.ts +32 -0
  225. package/dist/auth/providers/google.d.ts.map +1 -0
  226. package/dist/auth/providers/google.js +145 -0
  227. package/dist/auth/providers/google.js.map +1 -0
  228. package/dist/auth/providers/index.d.ts +22 -0
  229. package/dist/auth/providers/index.d.ts.map +1 -0
  230. package/dist/auth/providers/index.js +17 -0
  231. package/dist/auth/providers/index.js.map +1 -0
  232. package/dist/auth/routes.d.ts +63 -0
  233. package/dist/auth/routes.d.ts.map +1 -0
  234. package/dist/auth/routes.js +827 -0
  235. package/dist/auth/routes.js.map +1 -0
  236. package/dist/auth/services/index.d.ts +10 -0
  237. package/dist/auth/services/index.d.ts.map +1 -0
  238. package/dist/auth/services/index.js +7 -0
  239. package/dist/auth/services/index.js.map +1 -0
  240. package/dist/auth/services/session.d.ts +81 -0
  241. package/dist/auth/services/session.d.ts.map +1 -0
  242. package/dist/auth/services/session.js +186 -0
  243. package/dist/auth/services/session.js.map +1 -0
  244. package/dist/auth/services/token.d.ts +41 -0
  245. package/dist/auth/services/token.d.ts.map +1 -0
  246. package/dist/auth/services/token.js +44 -0
  247. package/dist/auth/services/token.js.map +1 -0
  248. package/dist/auth/services/verification.d.ts +77 -0
  249. package/dist/auth/services/verification.d.ts.map +1 -0
  250. package/dist/auth/services/verification.js +143 -0
  251. package/dist/auth/services/verification.js.map +1 -0
  252. package/dist/auth/types.d.ts +318 -0
  253. package/dist/auth/types.d.ts.map +1 -0
  254. package/dist/auth/types.js +6 -0
  255. package/dist/auth/types.js.map +1 -0
  256. package/dist/customTypes/arrays.d.ts +200 -0
  257. package/dist/customTypes/arrays.d.ts.map +1 -0
  258. package/dist/customTypes/arrays.js +309 -0
  259. package/dist/customTypes/arrays.js.map +1 -0
  260. package/dist/customTypes/index.d.ts +8 -0
  261. package/dist/customTypes/index.d.ts.map +1 -0
  262. package/dist/customTypes/index.js +11 -0
  263. package/dist/customTypes/index.js.map +1 -0
  264. package/dist/customTypes/postgis.d.ts +146 -0
  265. package/dist/customTypes/postgis.d.ts.map +1 -0
  266. package/dist/customTypes/postgis.js +315 -0
  267. package/dist/customTypes/postgis.js.map +1 -0
  268. package/dist/customTypes/ranges.d.ts +128 -0
  269. package/dist/customTypes/ranges.d.ts.map +1 -0
  270. package/dist/customTypes/ranges.js +257 -0
  271. package/dist/customTypes/ranges.js.map +1 -0
  272. package/dist/index.d.ts +37 -0
  273. package/dist/index.d.ts.map +1 -0
  274. package/dist/index.js +42 -0
  275. package/dist/index.js.map +1 -0
  276. package/dist/migrations/0.1.0-alpha.0_initial_setup.d.ts +29 -0
  277. package/dist/migrations/0.1.0-alpha.0_initial_setup.d.ts.map +1 -0
  278. package/dist/migrations/0.1.0-alpha.0_initial_setup.js +72 -0
  279. package/dist/migrations/0.1.0-alpha.0_initial_setup.js.map +1 -0
  280. package/dist/migrations/_example_migration.d.ts +31 -0
  281. package/dist/migrations/_example_migration.d.ts.map +1 -0
  282. package/dist/migrations/_example_migration.js +75 -0
  283. package/dist/migrations/_example_migration.js.map +1 -0
  284. package/dist/plugins/definePlugin.d.ts +49 -0
  285. package/dist/plugins/definePlugin.d.ts.map +1 -0
  286. package/dist/plugins/definePlugin.js +131 -0
  287. package/dist/plugins/definePlugin.js.map +1 -0
  288. package/dist/plugins/softDelete.d.ts +179 -0
  289. package/dist/plugins/softDelete.d.ts.map +1 -0
  290. package/dist/plugins/softDelete.js +235 -0
  291. package/dist/plugins/softDelete.js.map +1 -0
  292. package/dist/routes/auth.route.d.ts +14 -0
  293. package/dist/routes/auth.route.d.ts.map +1 -0
  294. package/dist/routes/auth.route.js +421 -0
  295. package/dist/routes/auth.route.js.map +1 -0
  296. package/dist/routes/file.route.d.ts +7 -0
  297. package/dist/routes/file.route.d.ts.map +1 -0
  298. package/dist/routes/file.route.js +274 -0
  299. package/dist/routes/file.route.js.map +1 -0
  300. package/dist/routes/items.route.d.ts +7 -0
  301. package/dist/routes/items.route.d.ts.map +1 -0
  302. package/dist/routes/items.route.js +369 -0
  303. package/dist/routes/items.route.js.map +1 -0
  304. package/dist/routes/migration.route.d.ts +7 -0
  305. package/dist/routes/migration.route.d.ts.map +1 -0
  306. package/dist/routes/migration.route.js +225 -0
  307. package/dist/routes/migration.route.js.map +1 -0
  308. package/dist/routes/notification.route.d.ts +7 -0
  309. package/dist/routes/notification.route.d.ts.map +1 -0
  310. package/dist/routes/notification.route.js +124 -0
  311. package/dist/routes/notification.route.js.map +1 -0
  312. package/dist/routes/openapi.route.d.ts +7 -0
  313. package/dist/routes/openapi.route.d.ts.map +1 -0
  314. package/dist/routes/openapi.route.js +2169 -0
  315. package/dist/routes/openapi.route.js.map +1 -0
  316. package/dist/routes/permission.route.d.ts +7 -0
  317. package/dist/routes/permission.route.d.ts.map +1 -0
  318. package/dist/routes/permission.route.js +158 -0
  319. package/dist/routes/permission.route.js.map +1 -0
  320. package/dist/routes/realtime.route.d.ts +21 -0
  321. package/dist/routes/realtime.route.d.ts.map +1 -0
  322. package/dist/routes/realtime.route.js +243 -0
  323. package/dist/routes/realtime.route.js.map +1 -0
  324. package/dist/routes/reports.route.d.ts +7 -0
  325. package/dist/routes/reports.route.d.ts.map +1 -0
  326. package/dist/routes/reports.route.js +95 -0
  327. package/dist/routes/reports.route.js.map +1 -0
  328. package/dist/routes/schema.route.d.ts +7 -0
  329. package/dist/routes/schema.route.d.ts.map +1 -0
  330. package/dist/routes/schema.route.js +1780 -0
  331. package/dist/routes/schema.route.js.map +1 -0
  332. package/dist/routes/settings.route.d.ts +7 -0
  333. package/dist/routes/settings.route.d.ts.map +1 -0
  334. package/dist/routes/settings.route.js +154 -0
  335. package/dist/routes/settings.route.js.map +1 -0
  336. package/dist/routes/templates.route.d.ts +7 -0
  337. package/dist/routes/templates.route.d.ts.map +1 -0
  338. package/dist/routes/templates.route.js +91 -0
  339. package/dist/routes/templates.route.js.map +1 -0
  340. package/dist/routes/utils.route.d.ts +7 -0
  341. package/dist/routes/utils.route.d.ts.map +1 -0
  342. package/dist/routes/utils.route.js +33 -0
  343. package/dist/routes/utils.route.js.map +1 -0
  344. package/dist/routes/workflow.route.d.ts +7 -0
  345. package/dist/routes/workflow.route.d.ts.map +1 -0
  346. package/dist/routes/workflow.route.js +787 -0
  347. package/dist/routes/workflow.route.js.map +1 -0
  348. package/dist/services/AssetsService.d.ts +39 -0
  349. package/dist/services/AssetsService.d.ts.map +1 -0
  350. package/dist/services/AssetsService.js +255 -0
  351. package/dist/services/AssetsService.js.map +1 -0
  352. package/dist/services/CacheService.d.ts +169 -0
  353. package/dist/services/CacheService.d.ts.map +1 -0
  354. package/dist/services/CacheService.js +722 -0
  355. package/dist/services/CacheService.js.map +1 -0
  356. package/dist/services/FilesService.d.ts +30 -0
  357. package/dist/services/FilesService.d.ts.map +1 -0
  358. package/dist/services/FilesService.js +268 -0
  359. package/dist/services/FilesService.js.map +1 -0
  360. package/dist/services/HooksManager.d.ts +38 -0
  361. package/dist/services/HooksManager.d.ts.map +1 -0
  362. package/dist/services/HooksManager.js +165 -0
  363. package/dist/services/HooksManager.js.map +1 -0
  364. package/dist/services/ItemsService.d.ts +273 -0
  365. package/dist/services/ItemsService.d.ts.map +1 -0
  366. package/dist/services/ItemsService.js +2458 -0
  367. package/dist/services/ItemsService.js.map +1 -0
  368. package/dist/services/MailService.d.ts +76 -0
  369. package/dist/services/MailService.d.ts.map +1 -0
  370. package/dist/services/MailService.js +585 -0
  371. package/dist/services/MailService.js.map +1 -0
  372. package/dist/services/MigrationService.d.ts +243 -0
  373. package/dist/services/MigrationService.d.ts.map +1 -0
  374. package/dist/services/MigrationService.js +914 -0
  375. package/dist/services/MigrationService.js.map +1 -0
  376. package/dist/services/NotificationService.d.ts +35 -0
  377. package/dist/services/NotificationService.d.ts.map +1 -0
  378. package/dist/services/NotificationService.js +159 -0
  379. package/dist/services/NotificationService.js.map +1 -0
  380. package/dist/services/PermissionService.d.ts +128 -0
  381. package/dist/services/PermissionService.d.ts.map +1 -0
  382. package/dist/services/PermissionService.js +373 -0
  383. package/dist/services/PermissionService.js.map +1 -0
  384. package/dist/services/PluginManager.d.ts +138 -0
  385. package/dist/services/PluginManager.d.ts.map +1 -0
  386. package/dist/services/PluginManager.js +463 -0
  387. package/dist/services/PluginManager.js.map +1 -0
  388. package/dist/services/RealtimeService.d.ts +209 -0
  389. package/dist/services/RealtimeService.d.ts.map +1 -0
  390. package/dist/services/RealtimeService.js +978 -0
  391. package/dist/services/RealtimeService.js.map +1 -0
  392. package/dist/services/ReportService.d.ts +13 -0
  393. package/dist/services/ReportService.d.ts.map +1 -0
  394. package/dist/services/ReportService.js +91 -0
  395. package/dist/services/ReportService.js.map +1 -0
  396. package/dist/services/SettingsService.d.ts +60 -0
  397. package/dist/services/SettingsService.d.ts.map +1 -0
  398. package/dist/services/SettingsService.js +474 -0
  399. package/dist/services/SettingsService.js.map +1 -0
  400. package/dist/services/SocketService.d.ts +129 -0
  401. package/dist/services/SocketService.d.ts.map +1 -0
  402. package/dist/services/SocketService.js +600 -0
  403. package/dist/services/SocketService.js.map +1 -0
  404. package/dist/services/StatsService.d.ts +10 -0
  405. package/dist/services/StatsService.d.ts.map +1 -0
  406. package/dist/services/StatsService.js +40 -0
  407. package/dist/services/StatsService.js.map +1 -0
  408. package/dist/services/StorageService.d.ts +20 -0
  409. package/dist/services/StorageService.d.ts.map +1 -0
  410. package/dist/services/StorageService.js +164 -0
  411. package/dist/services/StorageService.js.map +1 -0
  412. package/dist/services/TasksService.d.ts +74 -0
  413. package/dist/services/TasksService.d.ts.map +1 -0
  414. package/dist/services/TasksService.js +404 -0
  415. package/dist/services/TasksService.js.map +1 -0
  416. package/dist/services/WorkflowService.d.ts +305 -0
  417. package/dist/services/WorkflowService.d.ts.map +1 -0
  418. package/dist/services/WorkflowService.js +1811 -0
  419. package/dist/services/WorkflowService.js.map +1 -0
  420. package/dist/templates/logo/logo.png +0 -0
  421. package/dist/templates/mails/default.liquid +23 -0
  422. package/dist/types/aggregation.d.ts +40 -0
  423. package/dist/types/aggregation.d.ts.map +1 -0
  424. package/dist/types/aggregation.js +6 -0
  425. package/dist/types/aggregation.js.map +1 -0
  426. package/dist/types/assets.d.ts +32 -0
  427. package/dist/types/assets.d.ts.map +1 -0
  428. package/dist/types/assets.js +6 -0
  429. package/dist/types/assets.js.map +1 -0
  430. package/dist/types/auth.d.ts +50 -0
  431. package/dist/types/auth.d.ts.map +1 -0
  432. package/dist/types/auth.js +6 -0
  433. package/dist/types/auth.js.map +1 -0
  434. package/dist/types/cache.d.ts +47 -0
  435. package/dist/types/cache.d.ts.map +1 -0
  436. package/dist/types/cache.js +6 -0
  437. package/dist/types/cache.js.map +1 -0
  438. package/dist/types/database.d.ts +16 -0
  439. package/dist/types/database.d.ts.map +1 -0
  440. package/dist/types/database.js +6 -0
  441. package/dist/types/database.js.map +1 -0
  442. package/dist/types/fields.d.ts +71 -0
  443. package/dist/types/fields.d.ts.map +1 -0
  444. package/dist/types/fields.js +6 -0
  445. package/dist/types/fields.js.map +1 -0
  446. package/dist/types/files.d.ts +33 -0
  447. package/dist/types/files.d.ts.map +1 -0
  448. package/dist/types/files.js +6 -0
  449. package/dist/types/files.js.map +1 -0
  450. package/dist/types/hooks.d.ts +29 -0
  451. package/dist/types/hooks.d.ts.map +1 -0
  452. package/dist/types/hooks.js +6 -0
  453. package/dist/types/hooks.js.map +1 -0
  454. package/dist/types/import-export.d.ts +62 -0
  455. package/dist/types/import-export.d.ts.map +1 -0
  456. package/dist/types/import-export.js +6 -0
  457. package/dist/types/import-export.js.map +1 -0
  458. package/dist/types/index.d.ts +31 -0
  459. package/dist/types/index.d.ts.map +1 -0
  460. package/dist/types/index.js +58 -0
  461. package/dist/types/index.js.map +1 -0
  462. package/dist/types/mail.d.ts +34 -0
  463. package/dist/types/mail.d.ts.map +1 -0
  464. package/dist/types/mail.js +6 -0
  465. package/dist/types/mail.js.map +1 -0
  466. package/dist/types/notifications.d.ts +16 -0
  467. package/dist/types/notifications.d.ts.map +1 -0
  468. package/dist/types/notifications.js +6 -0
  469. package/dist/types/notifications.js.map +1 -0
  470. package/dist/types/plugin.d.ts +351 -0
  471. package/dist/types/plugin.d.ts.map +1 -0
  472. package/dist/types/plugin.js +8 -0
  473. package/dist/types/plugin.js.map +1 -0
  474. package/dist/types/query.d.ts +71 -0
  475. package/dist/types/query.d.ts.map +1 -0
  476. package/dist/types/query.js +6 -0
  477. package/dist/types/query.js.map +1 -0
  478. package/dist/types/relations.d.ts +111 -0
  479. package/dist/types/relations.d.ts.map +1 -0
  480. package/dist/types/relations.js +6 -0
  481. package/dist/types/relations.js.map +1 -0
  482. package/dist/types/reports.d.ts +17 -0
  483. package/dist/types/reports.d.ts.map +1 -0
  484. package/dist/types/reports.js +6 -0
  485. package/dist/types/reports.js.map +1 -0
  486. package/dist/types/schema.d.ts +26 -0
  487. package/dist/types/schema.d.ts.map +1 -0
  488. package/dist/types/schema.js +6 -0
  489. package/dist/types/schema.js.map +1 -0
  490. package/dist/types/seed.d.ts +27 -0
  491. package/dist/types/seed.d.ts.map +1 -0
  492. package/dist/types/seed.js +6 -0
  493. package/dist/types/seed.js.map +1 -0
  494. package/dist/types/services.d.ts +68 -0
  495. package/dist/types/services.d.ts.map +1 -0
  496. package/dist/types/services.js +6 -0
  497. package/dist/types/services.js.map +1 -0
  498. package/dist/types/settings.d.ts +36 -0
  499. package/dist/types/settings.d.ts.map +1 -0
  500. package/dist/types/settings.js +6 -0
  501. package/dist/types/settings.js.map +1 -0
  502. package/dist/types/sockets.d.ts +26 -0
  503. package/dist/types/sockets.d.ts.map +1 -0
  504. package/dist/types/sockets.js +6 -0
  505. package/dist/types/sockets.js.map +1 -0
  506. package/dist/types/sort.d.ts +25 -0
  507. package/dist/types/sort.d.ts.map +1 -0
  508. package/dist/types/sort.js +6 -0
  509. package/dist/types/sort.js.map +1 -0
  510. package/dist/types/spatial.d.ts +19 -0
  511. package/dist/types/spatial.d.ts.map +1 -0
  512. package/dist/types/spatial.js +6 -0
  513. package/dist/types/spatial.js.map +1 -0
  514. package/dist/types/stats.d.ts +21 -0
  515. package/dist/types/stats.d.ts.map +1 -0
  516. package/dist/types/stats.js +6 -0
  517. package/dist/types/stats.js.map +1 -0
  518. package/dist/types/storage.d.ts +19 -0
  519. package/dist/types/storage.d.ts.map +1 -0
  520. package/dist/types/storage.js +6 -0
  521. package/dist/types/storage.js.map +1 -0
  522. package/dist/types/tasks.d.ts +14 -0
  523. package/dist/types/tasks.d.ts.map +1 -0
  524. package/dist/types/tasks.js +6 -0
  525. package/dist/types/tasks.js.map +1 -0
  526. package/dist/types/utils.d.ts +54 -0
  527. package/dist/types/utils.d.ts.map +1 -0
  528. package/dist/types/utils.js +6 -0
  529. package/dist/types/utils.js.map +1 -0
  530. package/dist/types/workflow.d.ts +17 -0
  531. package/dist/types/workflow.d.ts.map +1 -0
  532. package/dist/types/workflow.js +6 -0
  533. package/dist/types/workflow.js.map +1 -0
  534. package/dist/utils/aggregationUtils.d.ts +192 -0
  535. package/dist/utils/aggregationUtils.d.ts.map +1 -0
  536. package/dist/utils/aggregationUtils.js +450 -0
  537. package/dist/utils/aggregationUtils.js.map +1 -0
  538. package/dist/utils/auth.d.ts +93 -0
  539. package/dist/utils/auth.d.ts.map +1 -0
  540. package/dist/utils/auth.js +557 -0
  541. package/dist/utils/auth.js.map +1 -0
  542. package/dist/utils/cache.d.ts +64 -0
  543. package/dist/utils/cache.d.ts.map +1 -0
  544. package/dist/utils/cache.js +464 -0
  545. package/dist/utils/cache.js.map +1 -0
  546. package/dist/utils/common.d.ts +53 -0
  547. package/dist/utils/common.d.ts.map +1 -0
  548. package/dist/utils/common.js +162 -0
  549. package/dist/utils/common.js.map +1 -0
  550. package/dist/utils/db.d.ts +101 -0
  551. package/dist/utils/db.d.ts.map +1 -0
  552. package/dist/utils/db.js +413 -0
  553. package/dist/utils/db.js.map +1 -0
  554. package/dist/utils/dirname.d.ts +30 -0
  555. package/dist/utils/dirname.d.ts.map +1 -0
  556. package/dist/utils/dirname.js +95 -0
  557. package/dist/utils/dirname.js.map +1 -0
  558. package/dist/utils/dynamicVariableResolver.d.ts +17 -0
  559. package/dist/utils/dynamicVariableResolver.d.ts.map +1 -0
  560. package/dist/utils/dynamicVariableResolver.js +262 -0
  561. package/dist/utils/dynamicVariableResolver.js.map +1 -0
  562. package/dist/utils/env.d.ts +38 -0
  563. package/dist/utils/env.d.ts.map +1 -0
  564. package/dist/utils/env.js +80 -0
  565. package/dist/utils/env.js.map +1 -0
  566. package/dist/utils/errorHandler.d.ts +14 -0
  567. package/dist/utils/errorHandler.d.ts.map +1 -0
  568. package/dist/utils/errorHandler.js +79 -0
  569. package/dist/utils/errorHandler.js.map +1 -0
  570. package/dist/utils/fieldExpansion.d.ts +30 -0
  571. package/dist/utils/fieldExpansion.d.ts.map +1 -0
  572. package/dist/utils/fieldExpansion.js +145 -0
  573. package/dist/utils/fieldExpansion.js.map +1 -0
  574. package/dist/utils/fieldUtils.d.ts +179 -0
  575. package/dist/utils/fieldUtils.d.ts.map +1 -0
  576. package/dist/utils/fieldUtils.js +424 -0
  577. package/dist/utils/fieldUtils.js.map +1 -0
  578. package/dist/utils/filterOperators.d.ts +472 -0
  579. package/dist/utils/filterOperators.d.ts.map +1 -0
  580. package/dist/utils/filterOperators.js +1229 -0
  581. package/dist/utils/filterOperators.js.map +1 -0
  582. package/dist/utils/importUtils.d.ts +127 -0
  583. package/dist/utils/importUtils.d.ts.map +1 -0
  584. package/dist/utils/importUtils.js +437 -0
  585. package/dist/utils/importUtils.js.map +1 -0
  586. package/dist/utils/index.d.ts +75 -0
  587. package/dist/utils/index.d.ts.map +1 -0
  588. package/dist/utils/index.js +101 -0
  589. package/dist/utils/index.js.map +1 -0
  590. package/dist/utils/logger.d.ts +41 -0
  591. package/dist/utils/logger.d.ts.map +1 -0
  592. package/dist/utils/logger.js +217 -0
  593. package/dist/utils/logger.js.map +1 -0
  594. package/dist/utils/orderUtils.d.ts +117 -0
  595. package/dist/utils/orderUtils.d.ts.map +1 -0
  596. package/dist/utils/orderUtils.js +249 -0
  597. package/dist/utils/orderUtils.js.map +1 -0
  598. package/dist/utils/queryBuilder.d.ts +118 -0
  599. package/dist/utils/queryBuilder.d.ts.map +1 -0
  600. package/dist/utils/queryBuilder.js +489 -0
  601. package/dist/utils/queryBuilder.js.map +1 -0
  602. package/dist/utils/relationLoader.d.ts +65 -0
  603. package/dist/utils/relationLoader.d.ts.map +1 -0
  604. package/dist/utils/relationLoader.js +1081 -0
  605. package/dist/utils/relationLoader.js.map +1 -0
  606. package/dist/utils/relationPathResolver.d.ts +30 -0
  607. package/dist/utils/relationPathResolver.d.ts.map +1 -0
  608. package/dist/utils/relationPathResolver.js +173 -0
  609. package/dist/utils/relationPathResolver.js.map +1 -0
  610. package/dist/utils/relationUtils.d.ts +139 -0
  611. package/dist/utils/relationUtils.d.ts.map +1 -0
  612. package/dist/utils/relationUtils.js +711 -0
  613. package/dist/utils/relationUtils.js.map +1 -0
  614. package/dist/utils/router.d.ts +6 -0
  615. package/dist/utils/router.d.ts.map +1 -0
  616. package/dist/utils/router.js +95 -0
  617. package/dist/utils/router.js.map +1 -0
  618. package/dist/utils/schema.d.ts +88 -0
  619. package/dist/utils/schema.d.ts.map +1 -0
  620. package/dist/utils/schema.js +24 -0
  621. package/dist/utils/schema.js.map +1 -0
  622. package/dist/utils/schemaManager.d.ts +238 -0
  623. package/dist/utils/schemaManager.d.ts.map +1 -0
  624. package/dist/utils/schemaManager.js +1992 -0
  625. package/dist/utils/schemaManager.js.map +1 -0
  626. package/dist/utils/schemaValidator.d.ts +83 -0
  627. package/dist/utils/schemaValidator.d.ts.map +1 -0
  628. package/dist/utils/schemaValidator.js +491 -0
  629. package/dist/utils/schemaValidator.js.map +1 -0
  630. package/dist/utils/seed.d.ts +45 -0
  631. package/dist/utils/seed.d.ts.map +1 -0
  632. package/dist/utils/seed.js +248 -0
  633. package/dist/utils/seed.js.map +1 -0
  634. package/dist/utils/sessionCleanup.d.ts +10 -0
  635. package/dist/utils/sessionCleanup.d.ts.map +1 -0
  636. package/dist/utils/sessionCleanup.js +49 -0
  637. package/dist/utils/sessionCleanup.js.map +1 -0
  638. package/dist/utils/sortUtils.d.ts +117 -0
  639. package/dist/utils/sortUtils.d.ts.map +1 -0
  640. package/dist/utils/sortUtils.js +232 -0
  641. package/dist/utils/sortUtils.js.map +1 -0
  642. package/dist/utils/spatialUtils.d.ts +244 -0
  643. package/dist/utils/spatialUtils.d.ts.map +1 -0
  644. package/dist/utils/spatialUtils.js +359 -0
  645. package/dist/utils/spatialUtils.js.map +1 -0
  646. package/dist/utils/systemschema.d.ts +11040 -0
  647. package/dist/utils/systemschema.d.ts.map +1 -0
  648. package/dist/utils/systemschema.js +1777 -0
  649. package/dist/utils/systemschema.js.map +1 -0
  650. package/dist/utils/tenantUtils.d.ts +34 -0
  651. package/dist/utils/tenantUtils.d.ts.map +1 -0
  652. package/dist/utils/tenantUtils.js +124 -0
  653. package/dist/utils/tenantUtils.js.map +1 -0
  654. package/dist/utils/typeMapper.d.ts +25 -0
  655. package/dist/utils/typeMapper.d.ts.map +1 -0
  656. package/dist/utils/typeMapper.js +282 -0
  657. package/dist/utils/typeMapper.js.map +1 -0
  658. package/dist/utils/valueValidator.d.ts +60 -0
  659. package/dist/utils/valueValidator.d.ts.map +1 -0
  660. package/dist/utils/valueValidator.js +303 -0
  661. package/dist/utils/valueValidator.js.map +1 -0
  662. package/dist/utils/workflow.d.ts +87 -0
  663. package/dist/utils/workflow.d.ts.map +1 -0
  664. package/dist/utils/workflow.js +205 -0
  665. package/dist/utils/workflow.js.map +1 -0
  666. package/package.json +115 -0
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Common utilities for routes
3
+ * Contains reusable functions that are duplicated across multiple route files
4
+ */
5
+ import { schemaManager } from "./schemaManager.js";
6
+ import { APIError } from "./errorHandler.js";
7
+ import { getCache } from "./cache.js";
8
+ import { getCacheService } from "./db.js";
9
+ import settingsService from "../services/SettingsService.js";
10
+ import env from "./env.js";
11
+ /**
12
+ * Middleware to check if a model/collection exists
13
+ * Used in: items.route.ts, reports.route.ts
14
+ */
15
+ export const modelExistsMiddleware = (req, res, next) => {
16
+ const modelName = req.params.collection;
17
+ if (!schemaManager.modelExists(modelName)) {
18
+ return next(new APIError(`Model ${modelName} not found`, 404));
19
+ }
20
+ next();
21
+ };
22
+ /**
23
+ * Throws APIError if user is not authenticated
24
+ * Used in: notification.route.ts (4 times)
25
+ */
26
+ export function requireAuth(req) {
27
+ if (!req.accountability?.user?.id) {
28
+ throw new APIError("Authentication required", 401);
29
+ }
30
+ }
31
+ /**
32
+ * Check if a collection has a tenant_Id field (supports tenant isolation)
33
+ */
34
+ export function collectionHasTenantField(collection) {
35
+ try {
36
+ const table = schemaManager.getTable(collection);
37
+ // Check if table has tenant_Id column
38
+ return 'tenant_Id' in table;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ /**
45
+ * Validates and adjusts accountability for imports
46
+ *
47
+ * Rules:
48
+ * - User must be authenticated (not public)
49
+ * - In multi-tenant mode, for collections with tenant_Id field:
50
+ * - Tenant-specific users: use their tenant from accountability (already set)
51
+ * - Administrators/non-tenant-specific users: must provide tenant in body
52
+ * - In single-tenant mode or for collections without tenant_Id: no tenant handling needed
53
+ *
54
+ * Used in: items.route.ts (import-csv and import-json)
55
+ */
56
+ export function getImportAccountability(req, collection) {
57
+ const accountability = req.accountability;
58
+ // Check if user is authenticated (not public)
59
+ if (!accountability?.user?.id) {
60
+ throw new APIError("Authentication required for import operations", 401);
61
+ }
62
+ const isMultiTenant = env.get('MULTI_TENANT') === 'true';
63
+ // If not multi-tenant mode, just return original accountability
64
+ if (!isMultiTenant) {
65
+ return accountability;
66
+ }
67
+ // Check if the collection supports tenant isolation
68
+ const hasTenantField = collection ? collectionHasTenantField(collection) : false;
69
+ // If collection doesn't have tenant field, no tenant handling needed
70
+ if (!hasTenantField) {
71
+ return accountability;
72
+ }
73
+ // Check if user has a tenant-specific role (accountability already has tenant set)
74
+ const isTenantSpecific = accountability?.role?.isTenantSpecific === true;
75
+ const userTenant = accountability?.tenant;
76
+ if (isTenantSpecific && userTenant) {
77
+ // Tenant-specific users: tenant is already in accountability, just return it
78
+ return accountability;
79
+ }
80
+ else {
81
+ // Administrators or non-tenant-specific users
82
+ // They must provide tenant in body for tenant-enabled tables
83
+ const tenant = req.body?.tenant;
84
+ if (tenant) {
85
+ return {
86
+ ...accountability,
87
+ tenant: tenant,
88
+ };
89
+ }
90
+ else {
91
+ throw new APIError("Tenant is required for importing into tenant-enabled collections. Provide 'tenant' in the request body.", 400);
92
+ }
93
+ }
94
+ }
95
+ /**
96
+ * Invalidate auth cache for a specific role or all roles
97
+ * Used in: permission.route.ts
98
+ */
99
+ export async function invalidateAuthCache(roleId) {
100
+ try {
101
+ const cache = getCache();
102
+ if (roleId) {
103
+ const cacheKey = `auth:role:${roleId}:permissions`;
104
+ await cache.delete(cacheKey);
105
+ }
106
+ else {
107
+ await cache.invalidateModel("auth");
108
+ }
109
+ }
110
+ catch (error) {
111
+ console.error(`[Common] Failed to invalidate auth cache:`, error);
112
+ }
113
+ }
114
+ /**
115
+ * Invalidate cache for a collection
116
+ * Used in: permission.route.ts
117
+ */
118
+ export async function invalidateCollectionCache(collection) {
119
+ try {
120
+ const cache = getCacheService();
121
+ if (cache) {
122
+ await cache.onMutate({ tables: [collection] });
123
+ }
124
+ }
125
+ catch (error) {
126
+ console.error(`[Common] Failed to invalidate cache for ${collection}:`, error);
127
+ }
128
+ }
129
+ /**
130
+ * Invalidate settings cache for a tenant or global
131
+ * Used in: items.route.ts
132
+ * @param corsInvalidator - Function to invalidate CORS cache (from app.ts)
133
+ */
134
+ export async function invalidateSettingsCache(item, corsInvalidator) {
135
+ try {
136
+ const tenantId = item?.tenant_Id;
137
+ console.info(`Settings modified - invalidating cache for tenant: ${tenantId || "global"}`);
138
+ if (tenantId) {
139
+ await settingsService.invalidateTenantCache(tenantId);
140
+ }
141
+ else {
142
+ await settingsService.loadGlobalSettings();
143
+ await settingsService.invalidateAllCaches();
144
+ }
145
+ if (corsInvalidator) {
146
+ corsInvalidator();
147
+ }
148
+ }
149
+ catch (error) {
150
+ console.error("Error invalidating settings cache:", error);
151
+ }
152
+ }
153
+ /**
154
+ * Invalidate settings cache after import (always invalidates all)
155
+ * Used in: items.route.ts (import-csv and import-json)
156
+ */
157
+ export async function invalidateSettingsCacheAfterImport() {
158
+ console.info(`Settings imported - invalidating all caches`);
159
+ await settingsService.loadGlobalSettings();
160
+ await settingsService.invalidateAllCaches();
161
+ }
162
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../baasix/utils/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Database Connection Layer for Drizzle ORM
3
+ * Provides PostgreSQL connection with pooling, SSL support, and read replicas
4
+ * Matches Sequelize database configuration for parity
5
+ */
6
+ import { drizzle, PostgresJsDatabase } from 'drizzle-orm/postgres-js';
7
+ import postgres from 'postgres';
8
+ import type { Transaction as TransactionType } from '../types/database.js';
9
+ declare global {
10
+ var __baasix_db: ReturnType<typeof drizzle> | null;
11
+ var __baasix_sql: ReturnType<typeof postgres> | null;
12
+ var __baasix_readSql: ReturnType<typeof postgres> | null;
13
+ }
14
+ type DrizzleDb = ReturnType<typeof drizzle>;
15
+ export type TransactionClient = Parameters<Parameters<DrizzleDb['transaction']>[0]>[0];
16
+ export type Transaction = TransactionType;
17
+ /**
18
+ * Initialize database connection
19
+ * Synchronous function that starts async cache initialization
20
+ */
21
+ export declare function initializeDatabase(): PostgresJsDatabase<Record<string, unknown>>;
22
+ /**
23
+ * Initialize database with cache service (async version)
24
+ * Use this when you need to ensure cache is ready before proceeding
25
+ */
26
+ export declare function initializeDatabaseWithCache(): Promise<PostgresJsDatabase<Record<string, unknown>>>;
27
+ /**
28
+ * Get database instance (synchronous - initializes if needed)
29
+ */
30
+ export declare function getDatabase(): PostgresJsDatabase<Record<string, unknown>>;
31
+ export declare const db: PostgresJsDatabase<Record<string, unknown>>;
32
+ /**
33
+ * Get postgres SQL client (for raw queries)
34
+ */
35
+ export declare function getSqlClient(): postgres.Sql<{}>;
36
+ export declare const sqlClient: ReturnType<typeof postgres>;
37
+ /**
38
+ * Get read replica SQL client (if configured)
39
+ */
40
+ export declare function getReadSqlClient(): postgres.Sql<{}>;
41
+ /**
42
+ * Close database connections
43
+ */
44
+ export declare function closeDatabase(): Promise<void>;
45
+ /**
46
+ * Create a new transaction with Sequelize-compatible API
47
+ * Returns a transaction that must be explicitly committed or rolled back
48
+ *
49
+ * Usage matching Sequelize:
50
+ * const transaction = await createTransaction();
51
+ * try {
52
+ * await transaction.insert(table).values(data);
53
+ * await transaction.commit();
54
+ * } catch (error) {
55
+ * await transaction.rollback();
56
+ * throw error;
57
+ * }
58
+ */
59
+ export declare function createTransaction(): Promise<Transaction>;
60
+ /**
61
+ * Test database connection
62
+ */
63
+ export declare function testConnection(): Promise<boolean>;
64
+ /**
65
+ * Get PostgreSQL server version
66
+ * Returns { major: number, minor: number, full: string }
67
+ * Caches the result after first call
68
+ */
69
+ export declare function getPostgresVersion(): Promise<{
70
+ major: number;
71
+ minor: number;
72
+ full: string;
73
+ }>;
74
+ /**
75
+ * Check if PostgreSQL version supports a feature
76
+ * @param minMajor Minimum major version required
77
+ * @param minMinor Minimum minor version required (default: 0)
78
+ */
79
+ export declare function isPgVersionAtLeast(minMajor: number, minMinor?: number): Promise<boolean>;
80
+ /**
81
+ * Get helper to extract instance ID
82
+ */
83
+ export declare function getInstanceId(instance: any): any;
84
+ declare const _default: {
85
+ db: PostgresJsDatabase<Record<string, unknown>>;
86
+ sql: postgres.Sql<{}>;
87
+ initializeDatabase: typeof initializeDatabase;
88
+ initializeDatabaseWithCache: typeof initializeDatabaseWithCache;
89
+ getDatabase: typeof getDatabase;
90
+ getSqlClient: typeof getSqlClient;
91
+ getReadSqlClient: typeof getReadSqlClient;
92
+ closeDatabase: typeof closeDatabase;
93
+ createTransaction: typeof createTransaction;
94
+ testConnection: typeof testConnection;
95
+ getInstanceId: typeof getInstanceId;
96
+ getPostgresVersion: typeof getPostgresVersion;
97
+ isPgVersionAtLeast: typeof isPgVersionAtLeast;
98
+ };
99
+ export default _default;
100
+ export { getCacheService, closeCacheService, initializeCacheService } from '../services/CacheService.js';
101
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../baasix/utils/db.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,QAAQ,MAAM,UAAU,CAAC;AAKhC,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAI3E,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,WAAW,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,GAAG,IAAI,CAAC;IACnD,IAAI,YAAY,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,GAAG,IAAI,CAAC;IACrD,IAAI,gBAAgB,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,GAAG,IAAI,CAAC;CAC1D;AAkBD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAG5C,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAGvF,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AA2B1C;;;GAGG;AACH,wBAAgB,kBAAkB,gDAqEjC;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,yDA0DhD;AAED;;GAEG;AACH,wBAAgB,WAAW,gDAK1B;AAKD,eAAO,MAAM,EAAE,6CAMb,CAAC;AAEH;;GAEG;AACH,wBAAgB,YAAY,qBAK3B;AAGD,eAAO,MAAM,SAAS,EAShB,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAElC;;GAEG;AACH,wBAAgB,gBAAgB,qBAK/B;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAiG9D;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAUvD;AAKD;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BlG;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CAMhD;;;;;;;;;;;;;;;;AAED,wBAcE;AAGF,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,413 @@
1
+ /**
2
+ * Database Connection Layer for Drizzle ORM
3
+ * Provides PostgreSQL connection with pooling, SSL support, and read replicas
4
+ * Matches Sequelize database configuration for parity
5
+ */
6
+ import { drizzle } from 'drizzle-orm/postgres-js';
7
+ import postgres from 'postgres';
8
+ import * as fs from 'fs';
9
+ import env from './env.js';
10
+ import { initializeCacheService, closeCacheService } from '../services/CacheService.js';
11
+ // Initialize globals if not already set
12
+ globalThis.__baasix_db = globalThis.__baasix_db ?? null;
13
+ globalThis.__baasix_sql = globalThis.__baasix_sql ?? null;
14
+ globalThis.__baasix_readSql = globalThis.__baasix_readSql ?? null;
15
+ // Use getters to access the global instances
16
+ const getDbInstance = () => globalThis.__baasix_db;
17
+ const setDbInstance = (val) => { globalThis.__baasix_db = val; };
18
+ const getSql = () => globalThis.__baasix_sql;
19
+ const setSql = (val) => { globalThis.__baasix_sql = val; };
20
+ const getReadSql = () => globalThis.__baasix_readSql;
21
+ const setReadSql = (val) => { globalThis.__baasix_readSql = val; };
22
+ const excludeModels = ['baasix_AuditLog', 'baasix_Sessions'];
23
+ /**
24
+ * Get database connection configuration
25
+ */
26
+ function getConnectionConfig() {
27
+ const config = {
28
+ max: parseInt(env.get('DATABASE_POOL_MAX') || '20'),
29
+ idle_timeout: parseInt(env.get('DATABASE_POOL_IDLE') || '10000') / 1000, // Convert to seconds
30
+ connect_timeout: parseInt(env.get('DATABASE_POOL_ACQUIRE') || '30000') / 1000, // Convert to seconds
31
+ max_lifetime: parseInt(env.get('DATABASE_POOL_EVICT') || '1000') / 1000 * 60, // Convert to seconds
32
+ onnotice: env.get('DATABASE_LOGGING') === 'true' ? console.log : undefined,
33
+ };
34
+ // SSL configuration
35
+ if (env.get('DATABASE_SSL_CERTIFICATE') && env.get('DATABASE_SSL_CERTIFICATE') !== 'false') {
36
+ const caCert = fs.readFileSync(env.get('DATABASE_SSL_CERTIFICATE'));
37
+ config.ssl = {
38
+ ca: caCert.toString(),
39
+ rejectUnauthorized: env.get('DATABASE_SSL_REJECT_UNAUTHORIZED') === 'true',
40
+ };
41
+ console.info('Using SSL certificate for database connection');
42
+ }
43
+ return config;
44
+ }
45
+ /**
46
+ * Initialize database connection
47
+ * Synchronous function that starts async cache initialization
48
+ */
49
+ export function initializeDatabase() {
50
+ if (getDbInstance()) {
51
+ return getDbInstance();
52
+ }
53
+ const config = getConnectionConfig();
54
+ // Start cache service initialization (async) but don't wait
55
+ // The cache will be available for subsequent queries
56
+ initializeCacheService().then(cacheService => {
57
+ if (cacheService && getDbInstance()) {
58
+ console.info('[Database] Cache service initialized and ready');
59
+ // Note: Drizzle cache is set during drizzle() initialization below
60
+ // We can't change it after creation, so cache is passed during init
61
+ }
62
+ }).catch(err => {
63
+ console.error('[Database] Cache service initialization failed:', err);
64
+ });
65
+ // Check if read replicas are enabled
66
+ if (env.get('DATABASE_READ_REPLICA_ENABLED') === 'true' && env.get('DATABASE_READ_REPLICA_URLS')) {
67
+ const readReplicaUrls = env.get('DATABASE_READ_REPLICA_URLS').split(',').map(url => url.trim());
68
+ // Write connection (primary)
69
+ setSql(postgres(env.get('DATABASE_URL'), {
70
+ ...config,
71
+ debug: env.get('DATABASE_LOGGING') === 'true',
72
+ }));
73
+ // Read connections (replicas) - use first replica for now
74
+ // In production, could implement load balancing across replicas
75
+ const replicaConfig = {
76
+ max: parseInt(env.get('DATABASE_READ_REPLICA_POOL_MAX') || '20'),
77
+ idle_timeout: parseInt(env.get('DATABASE_READ_REPLICA_POOL_IDLE') || '10000') / 1000,
78
+ connect_timeout: parseInt(env.get('DATABASE_READ_REPLICA_POOL_ACQUIRE') || '30000') / 1000,
79
+ max_lifetime: parseInt(env.get('DATABASE_READ_REPLICA_POOL_EVICT') || '1000') / 1000 * 60,
80
+ onnotice: env.get('DATABASE_LOGGING') === 'true' ? console.log : undefined,
81
+ debug: env.get('DATABASE_LOGGING') === 'true',
82
+ };
83
+ // Copy SSL config to replica if configured
84
+ if (config.ssl) {
85
+ replicaConfig.ssl = config.ssl;
86
+ }
87
+ setReadSql(postgres(readReplicaUrls[0], replicaConfig));
88
+ setDbInstance(drizzle(getSql(), {
89
+ logger: env.get('DATABASE_LOGGING') === 'true',
90
+ // Cache will be initialized asynchronously and used on subsequent queries
91
+ }));
92
+ console.info(`Database initialized with read replicas: ${readReplicaUrls.length} replica(s) configured`);
93
+ }
94
+ else {
95
+ // Single connection
96
+ setSql(postgres(env.get('DATABASE_URL'), {
97
+ ...config,
98
+ debug: env.get('DATABASE_LOGGING') === 'true',
99
+ }));
100
+ setDbInstance(drizzle(getSql(), {
101
+ logger: env.get('DATABASE_LOGGING') === 'true',
102
+ // Cache will be initialized asynchronously and used on subsequent queries
103
+ }));
104
+ console.info('Database initialized without read replicas');
105
+ }
106
+ return getDbInstance();
107
+ }
108
+ /**
109
+ * Initialize database with cache service (async version)
110
+ * Use this when you need to ensure cache is ready before proceeding
111
+ */
112
+ export async function initializeDatabaseWithCache() {
113
+ if (getDbInstance()) {
114
+ return getDbInstance();
115
+ }
116
+ const config = getConnectionConfig();
117
+ // Initialize cache service first and wait for it
118
+ const cacheService = await initializeCacheService();
119
+ // Check if read replicas are enabled
120
+ if (env.get('DATABASE_READ_REPLICA_ENABLED') === 'true' && env.get('DATABASE_READ_REPLICA_URLS')) {
121
+ const readReplicaUrls = env.get('DATABASE_READ_REPLICA_URLS').split(',').map(url => url.trim());
122
+ // Write connection (primary)
123
+ setSql(postgres(env.get('DATABASE_URL'), {
124
+ ...config,
125
+ debug: env.get('DATABASE_LOGGING') === 'true',
126
+ }));
127
+ // Read connections (replicas)
128
+ const replicaConfig = {
129
+ max: parseInt(env.get('DATABASE_READ_REPLICA_POOL_MAX') || '20'),
130
+ idle_timeout: parseInt(env.get('DATABASE_READ_REPLICA_POOL_IDLE') || '10000') / 1000,
131
+ connect_timeout: parseInt(env.get('DATABASE_READ_REPLICA_POOL_ACQUIRE') || '30000') / 1000,
132
+ max_lifetime: parseInt(env.get('DATABASE_READ_REPLICA_POOL_EVICT') || '1000') / 1000 * 60,
133
+ onnotice: env.get('DATABASE_LOGGING') === 'true' ? console.log : undefined,
134
+ debug: env.get('DATABASE_LOGGING') === 'true',
135
+ };
136
+ if (config.ssl) {
137
+ replicaConfig.ssl = config.ssl;
138
+ }
139
+ setReadSql(postgres(readReplicaUrls[0], replicaConfig));
140
+ setDbInstance(drizzle(getSql(), {
141
+ logger: env.get('DATABASE_LOGGING') === 'true',
142
+ cache: cacheService || undefined,
143
+ }));
144
+ console.info(`Database initialized with read replicas and cache: ${readReplicaUrls.length} replica(s) configured`);
145
+ }
146
+ else {
147
+ // Single connection
148
+ setSql(postgres(env.get('DATABASE_URL'), {
149
+ ...config,
150
+ debug: env.get('DATABASE_LOGGING') === 'true',
151
+ }));
152
+ setDbInstance(drizzle(getSql(), {
153
+ logger: env.get('DATABASE_LOGGING') === 'true',
154
+ cache: cacheService || undefined,
155
+ }));
156
+ console.info('Database initialized with cache (no read replicas)');
157
+ }
158
+ return getDbInstance();
159
+ }
160
+ /**
161
+ * Get database instance (synchronous - initializes if needed)
162
+ */
163
+ export function getDatabase() {
164
+ if (!getDbInstance()) {
165
+ return initializeDatabase();
166
+ }
167
+ return getDbInstance();
168
+ }
169
+ // Export db as a getter to always return the current instance
170
+ // This ensures that even if the module is loaded from different paths,
171
+ // we always get the same database instance
172
+ export const db = new Proxy({}, {
173
+ get(_, prop) {
174
+ const instance = getDatabase();
175
+ const value = instance[prop];
176
+ return typeof value === 'function' ? value.bind(instance) : value;
177
+ },
178
+ });
179
+ /**
180
+ * Get postgres SQL client (for raw queries)
181
+ */
182
+ export function getSqlClient() {
183
+ if (!getSql()) {
184
+ initializeDatabase();
185
+ }
186
+ return getSql();
187
+ }
188
+ // Export sql for backward compatibility
189
+ export const sqlClient = new Proxy({}, {
190
+ get(_, prop) {
191
+ const instance = getSqlClient();
192
+ const value = instance[prop];
193
+ return typeof value === 'function' ? value.bind(instance) : value;
194
+ },
195
+ apply(_, thisArg, args) {
196
+ return getSqlClient().apply(thisArg, args);
197
+ },
198
+ });
199
+ /**
200
+ * Get read replica SQL client (if configured)
201
+ */
202
+ export function getReadSqlClient() {
203
+ if (!getSql()) {
204
+ initializeDatabase();
205
+ }
206
+ return getReadSql() || getSql();
207
+ }
208
+ /**
209
+ * Close database connections
210
+ */
211
+ export async function closeDatabase() {
212
+ // Close cache service first
213
+ await closeCacheService();
214
+ const sql = getSql();
215
+ const readSql = getReadSql();
216
+ if (sql) {
217
+ await sql.end();
218
+ setSql(null);
219
+ }
220
+ if (readSql) {
221
+ await readSql.end();
222
+ setReadSql(null);
223
+ }
224
+ setDbInstance(null);
225
+ console.info('Database connections closed');
226
+ }
227
+ /**
228
+ * Create a new transaction with Sequelize-compatible API
229
+ * Returns a transaction that must be explicitly committed or rolled back
230
+ *
231
+ * Usage matching Sequelize:
232
+ * const transaction = await createTransaction();
233
+ * try {
234
+ * await transaction.insert(table).values(data);
235
+ * await transaction.commit();
236
+ * } catch (error) {
237
+ * await transaction.rollback();
238
+ * throw error;
239
+ * }
240
+ */
241
+ export async function createTransaction() {
242
+ let resolveTransaction;
243
+ let rejectTransaction;
244
+ let resolveTxComplete;
245
+ let rejectTxComplete;
246
+ // Transaction timeout (default 30 seconds, configurable via env)
247
+ const TRANSACTION_TIMEOUT_MS = parseInt(env.get('TRANSACTION_TIMEOUT_MS') || '60000');
248
+ const transactionPromise = new Promise((resolve, reject) => {
249
+ resolveTransaction = resolve;
250
+ rejectTransaction = reject;
251
+ });
252
+ // Promise that resolves when Drizzle's transaction completes
253
+ const txCompletePromise = new Promise((resolve, reject) => {
254
+ resolveTxComplete = resolve;
255
+ rejectTxComplete = reject;
256
+ });
257
+ // Start the Drizzle transaction
258
+ const txPromise = db.transaction(async (tx) => {
259
+ // Create wrapper with commit/rollback methods
260
+ const transaction = tx;
261
+ transaction._committed = false;
262
+ transaction._rolledBack = false;
263
+ // Store the completion resolver
264
+ transaction._resolveTxComplete = resolveTxComplete;
265
+ transaction._rejectTxComplete = rejectTxComplete;
266
+ transaction.commit = async () => {
267
+ if (transaction._rolledBack) {
268
+ throw new Error('Transaction already rolled back');
269
+ }
270
+ transaction._committed = true;
271
+ // Wait for Drizzle transaction to complete before returning
272
+ await txCompletePromise;
273
+ };
274
+ transaction.rollback = async () => {
275
+ if (transaction._committed) {
276
+ throw new Error('Transaction already committed');
277
+ }
278
+ transaction._rolledBack = true;
279
+ throw new Error('__ROLLBACK__');
280
+ };
281
+ // Resolve with the transaction wrapper
282
+ resolveTransaction(transaction);
283
+ // Wait for explicit commit or rollback with timeout
284
+ await new Promise((resolve, reject) => {
285
+ let resolved = false;
286
+ // Timeout to prevent transaction from hanging forever
287
+ const timeoutId = setTimeout(() => {
288
+ if (!resolved) {
289
+ resolved = true;
290
+ console.error(`[Transaction] Transaction timeout after ${TRANSACTION_TIMEOUT_MS}ms - forcing rollback`);
291
+ transaction._rolledBack = true;
292
+ resolve();
293
+ }
294
+ }, TRANSACTION_TIMEOUT_MS);
295
+ const checkInterval = setInterval(() => {
296
+ if (transaction._committed || transaction._rolledBack) {
297
+ if (!resolved) {
298
+ resolved = true;
299
+ clearTimeout(timeoutId);
300
+ clearInterval(checkInterval);
301
+ resolve();
302
+ }
303
+ }
304
+ }, 10);
305
+ });
306
+ // If rolled back, throw to trigger Drizzle's rollback
307
+ if (transaction._rolledBack) {
308
+ throw new Error('__ROLLBACK__');
309
+ }
310
+ // If committed, transaction will complete successfully here
311
+ }).then(() => {
312
+ // Transaction completed successfully
313
+ resolveTxComplete();
314
+ }).catch((error) => {
315
+ // Swallow intentional rollback errors
316
+ if (error.message === '__ROLLBACK__') {
317
+ resolveTxComplete(); // Rollback is also a valid completion
318
+ }
319
+ else {
320
+ rejectTxComplete(error);
321
+ throw error;
322
+ }
323
+ });
324
+ return transactionPromise;
325
+ }
326
+ /**
327
+ * Test database connection
328
+ */
329
+ export async function testConnection() {
330
+ try {
331
+ const sqlClient = getSqlClient();
332
+ await sqlClient `SELECT 1 as test`;
333
+ console.info('Database connection test successful');
334
+ return true;
335
+ }
336
+ catch (error) {
337
+ console.error('Database connection test failed:', error);
338
+ return false;
339
+ }
340
+ }
341
+ // Cache for PostgreSQL version
342
+ let pgVersionCache = null;
343
+ /**
344
+ * Get PostgreSQL server version
345
+ * Returns { major: number, minor: number, full: string }
346
+ * Caches the result after first call
347
+ */
348
+ export async function getPostgresVersion() {
349
+ if (pgVersionCache) {
350
+ return pgVersionCache;
351
+ }
352
+ try {
353
+ const sqlClient = getSqlClient();
354
+ const result = await sqlClient `SHOW server_version`;
355
+ const versionString = result[0].server_version;
356
+ // Parse version like "15.4" or "14.9 (Ubuntu 14.9-0ubuntu0.22.04.1)"
357
+ const match = versionString.match(/^(\d+)\.(\d+)/);
358
+ if (match) {
359
+ pgVersionCache = {
360
+ major: parseInt(match[1], 10),
361
+ minor: parseInt(match[2], 10),
362
+ full: versionString,
363
+ };
364
+ }
365
+ else {
366
+ // Fallback if parsing fails
367
+ pgVersionCache = { major: 14, minor: 0, full: versionString };
368
+ }
369
+ return pgVersionCache;
370
+ }
371
+ catch (error) {
372
+ console.warn('Failed to get PostgreSQL version, defaulting to 14:', error);
373
+ pgVersionCache = { major: 14, minor: 0, full: 'unknown' };
374
+ return pgVersionCache;
375
+ }
376
+ }
377
+ /**
378
+ * Check if PostgreSQL version supports a feature
379
+ * @param minMajor Minimum major version required
380
+ * @param minMinor Minimum minor version required (default: 0)
381
+ */
382
+ export async function isPgVersionAtLeast(minMajor, minMinor = 0) {
383
+ const version = await getPostgresVersion();
384
+ return version.major > minMajor || (version.major === minMajor && version.minor >= minMinor);
385
+ }
386
+ /**
387
+ * Get helper to extract instance ID
388
+ */
389
+ export function getInstanceId(instance) {
390
+ let id = instance.id || instance?._previousData?.id;
391
+ if (instance.constructor?.name === 'baasix_SchemaDefinition') {
392
+ return instance.collectionName;
393
+ }
394
+ return id;
395
+ }
396
+ export default {
397
+ db,
398
+ sql: sqlClient,
399
+ initializeDatabase,
400
+ initializeDatabaseWithCache,
401
+ getDatabase,
402
+ getSqlClient,
403
+ getReadSqlClient,
404
+ closeDatabase,
405
+ createTransaction,
406
+ testConnection,
407
+ getInstanceId,
408
+ getPostgresVersion,
409
+ isPgVersionAtLeast,
410
+ };
411
+ // Export cache service for use in other modules
412
+ export { getCacheService, closeCacheService, initializeCacheService } from '../services/CacheService.js';
413
+ //# sourceMappingURL=db.js.map