prostgles-server 1.5.122 → 2.0.3

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 (426) hide show
  1. package/dist/DboBuilder.d.ts +52 -27
  2. package/dist/DboBuilder.d.ts.map +1 -1
  3. package/dist/DboBuilder.js +404 -85
  4. package/dist/DboBuilder.js.map +1 -1
  5. package/dist/FileManager.d.ts +160 -0
  6. package/dist/FileManager.d.ts.map +1 -0
  7. package/dist/FileManager.js +419 -0
  8. package/dist/FileManager.js.map +1 -0
  9. package/dist/Prostgles.d.ts +145 -79
  10. package/dist/Prostgles.d.ts.map +1 -1
  11. package/dist/Prostgles.js +240 -180
  12. package/dist/Prostgles.js.map +1 -1
  13. package/dist/PubSubManager.js +1 -1
  14. package/dist/PubSubManager.js.map +1 -1
  15. package/dist/QueryBuilder.d.ts.map +1 -1
  16. package/dist/QueryBuilder.js +8 -5
  17. package/dist/QueryBuilder.js.map +1 -1
  18. package/dist/index.d.ts +3 -2
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js.map +1 -1
  21. package/lib/DboBuilder.ts +541 -136
  22. package/lib/FileManager.ts +546 -0
  23. package/lib/Prostgles.ts +407 -253
  24. package/lib/PubSubManager.ts +1 -1
  25. package/lib/QueryBuilder.ts +10 -6
  26. package/lib/index.ts +3 -3
  27. package/package.json +8 -2
  28. package/tests/client/index.js +18 -6
  29. package/tests/client/index.ts +16 -4
  30. package/tests/client/package-lock.json +27 -26
  31. package/tests/client/package.json +1 -1
  32. package/tests/client_only_queries.js +4 -4
  33. package/tests/config_test/DBoGenerated.d.ts +231 -8
  34. package/tests/config_test/index.html +35 -9
  35. package/tests/config_test/index.js +55 -97
  36. package/tests/config_test/index.js.map +1 -0
  37. package/tests/config_test/index.ts +67 -113
  38. package/tests/config_test/init.sql +50 -24
  39. package/tests/config_test/media/002d5f12-63c3-41f3-9007-cd33009104f4.txt +1 -0
  40. package/tests/config_test/media/003f0136-d231-4dd1-8937-08fa9a7c3d2e.txt +1 -0
  41. package/tests/config_test/media/01bd39a0-083b-4bfa-91fc-f4d1d9b7b204.txt +1 -0
  42. package/tests/config_test/media/0224513a-62de-4f0a-92bb-dcb3f700da7f.txt +1 -0
  43. package/tests/config_test/media/03005346-d6d5-4824-96ae-5ad7ca762730.txt +1 -0
  44. package/tests/config_test/media/0342d065-9bd2-443f-9058-f8058ab52de0.txt +1 -0
  45. package/tests/config_test/media/0350d1cf-b3b3-4c58-aef2-ad1dc3f80c6c.txt +1 -0
  46. package/tests/config_test/media/036833d7-d166-43a1-bda3-b801938c614d.txt +1 -0
  47. package/tests/config_test/media/03b5324d-0913-408f-a78a-252ff8fe8126.txt +1 -0
  48. package/tests/config_test/media/0540b670-bf42-4a83-82b2-67164630a24a.txt +1 -0
  49. package/tests/config_test/media/05900f5f-3b67-4ee9-8e1d-b511fd79d878.txt +1 -0
  50. package/tests/config_test/media/05969252-3f9e-41a0-88ce-aa23ba8b42eb.txt +1 -0
  51. package/tests/config_test/media/05a8a60c-cc75-4469-8e06-55d88c26e97a.txt +1 -0
  52. package/tests/config_test/media/05e662fc-7a03-4303-ae42-27a28d9affb9.txt +1 -0
  53. package/tests/config_test/media/061f86e6-0ddd-49b0-b243-4c063c6db5e4.txt +1 -0
  54. package/tests/config_test/media/062cf311-3976-471e-88ec-d618bd8ceeaa.txt +1 -0
  55. package/tests/config_test/media/0693b073-77b9-446a-9606-5453bcafd200.txt +1 -0
  56. package/tests/config_test/media/07a09b79-b1ed-45a3-bb42-42cd1a00757b.txt +1 -0
  57. package/tests/config_test/media/07e48303-0520-4a80-921e-130417488baa.txt +1 -0
  58. package/tests/config_test/media/09ab90a6-8461-4f39-89fb-8e2277974771.txt +1 -0
  59. package/tests/config_test/media/09c1194a-5d09-417c-a0c4-26dcf1e65bdb.txt +1 -0
  60. package/tests/config_test/media/09dc662f-6a9d-4a0b-95ba-8d24ceae9721.txt +1 -0
  61. package/tests/config_test/media/09ebb492-6146-4ff8-ac83-ac9970f5844c.txt +1 -0
  62. package/tests/config_test/media/0a198d6f-c629-42bd-9aa8-3c0ff62e1f1d.txt +1 -0
  63. package/tests/config_test/media/0a6d3ced-a16f-4491-b25b-679e9323ad79.txt +1 -0
  64. package/tests/config_test/media/0a817a27-6888-4ac4-b07b-4d1275e035ff.txt +1 -0
  65. package/tests/config_test/media/0aadc4f7-bf87-49da-8ef6-0857bf1789b4.txt +1 -0
  66. package/tests/config_test/media/0abe4a2e-fd75-428b-9757-2535d4112862.txt +1 -0
  67. package/tests/config_test/media/0ad9deca-6362-41dd-b0b3-8f8a71e2e1e2.txt +1 -0
  68. package/tests/config_test/media/0bdb19df-b82c-4a07-8d9b-a6e3a2af8a94.txt +1 -0
  69. package/tests/config_test/media/0c1e4575-223d-4d0c-b2c3-6ab6bb9844e6.txt +1 -0
  70. package/tests/config_test/media/0c4e3d55-432f-42e9-aa53-48e816ff6d15.txt +1 -0
  71. package/tests/config_test/media/0c5b47a4-884a-4207-b106-fa2557fc5600.txt +1 -0
  72. package/tests/config_test/media/0d8fbe62-22bc-47e8-b4ca-b77d8fd02798.txt +1 -0
  73. package/tests/config_test/media/0d95a140-3ae1-4faa-a34b-ed5b6cc524ac.txt +1 -0
  74. package/tests/config_test/media/0e0907c7-bd10-4ce2-ac36-066916a8a793.txt +1 -0
  75. package/tests/config_test/media/0e192b00-2676-4130-8819-90ee34a50932.txt +1 -0
  76. package/tests/config_test/media/0f9e3861-0e59-4ae4-a606-1fdd2c890c5b.txt +1 -0
  77. package/tests/config_test/media/1039afe1-24e9-4ea6-bfd0-6871b5f06f8f.txt +1 -0
  78. package/tests/config_test/media/1052e479-295e-46e9-88ec-d8f20efa75ea.txt +1 -0
  79. package/tests/config_test/media/11973be6-a675-4e0d-a54e-1eccbcdb3f2a.txt +1 -0
  80. package/tests/config_test/media/121656f5-1ef9-4181-9ee0-e3ae1433fed1.txt +1 -0
  81. package/tests/config_test/media/121a16b4-a925-406b-9ba9-0e4b4d413402.txt +1 -0
  82. package/tests/config_test/media/122cdf36-5b17-4b81-aa9d-c6725d1e8c8a.txt +1 -0
  83. package/tests/config_test/media/12435236-4735-4978-a234-52100181ee72.txt +1 -0
  84. package/tests/config_test/media/130eea28-64d0-40c4-8fa4-0cfba493e321.txt +1 -0
  85. package/tests/config_test/media/1435b6fd-4b86-4f7e-8e68-b607c5e5f2ad.txt +1 -0
  86. package/tests/config_test/media/14d78bf0-fd3e-4686-863d-b18d2c69b181.txt +1 -0
  87. package/tests/config_test/media/14dffd0e-23ae-4659-b8b3-25c89593643e.txt +1 -0
  88. package/tests/config_test/media/14e32028-fb4d-4743-a34d-c325be47b25e.txt +1 -0
  89. package/tests/config_test/media/14fb2139-eb53-4246-8dcb-c1e568572306.txt +1 -0
  90. package/tests/config_test/media/1644d880-c61f-4e9c-9c5c-892623ff5689.txt +1 -0
  91. package/tests/config_test/media/16818bb0-a022-4fd9-acac-e5a448b58eaf.txt +1 -0
  92. package/tests/config_test/media/16a47db5-262f-490b-850f-0f82019a58b4.txt +1 -0
  93. package/tests/config_test/media/16c2ffcc-8632-4935-b12d-be1313b74ddc.txt +1 -0
  94. package/tests/config_test/media/16fe3928-25c7-4e3a-9f68-51520712a4f6.txt +1 -0
  95. package/tests/config_test/media/172a7736-d3cf-431c-92a5-1a4aa6e89c7e.txt +1 -0
  96. package/tests/config_test/media/1784e75f-d063-43e2-accb-364ed36ae7d0.txt +1 -0
  97. package/tests/config_test/media/182e9dcc-0443-4cc5-aff1-9cf954dab771.txt +1 -0
  98. package/tests/config_test/media/19158860-e0c0-4ac7-afee-5428f9060b36.txt +1 -0
  99. package/tests/config_test/media/1998f271-5d71-4bc0-9f92-376a8a98f7da.txt +1 -0
  100. package/tests/config_test/media/19d2b383-4b1b-41a5-a7ef-ceaf1e691e0f.txt +1 -0
  101. package/tests/config_test/media/1c33fac7-470b-47e0-8aba-7c7394406aad.txt +1 -0
  102. package/tests/config_test/media/1d8a6c9c-0539-4c08-8ea5-4bd0bbe8fa18.txt +1 -0
  103. package/tests/config_test/media/1de86105-97ce-49c0-8137-030f3af37fb5.txt +1 -0
  104. package/tests/config_test/media/1f1393d1-e2f2-445e-806e-05c9a6135437.txt +1 -0
  105. package/tests/config_test/media/1fc303e7-943c-42cd-87f0-d14b361e5564.txt +1 -0
  106. package/tests/config_test/media/1fd79260-4246-4230-b4ab-c42baad3de44.txt +1 -0
  107. package/tests/config_test/media/209085fb-8441-4039-bb01-32171248c7f7.txt +1 -0
  108. package/tests/config_test/media/20ab3e07-77d6-4fbc-9532-b47e16c38e68.txt +1 -0
  109. package/tests/config_test/media/20d43c00-35b4-43da-b79f-cb59888ac41b.txt +1 -0
  110. package/tests/config_test/media/20f7f651-06de-4d5f-aa39-2c261c662cd3.txt +1 -0
  111. package/tests/config_test/media/214af93c-f973-4809-a440-87a5a3b28e83.txt +1 -0
  112. package/tests/config_test/media/22bffc7f-c942-4163-bbf6-141f585f3671.txt +1 -0
  113. package/tests/config_test/media/23d09f4f-db2a-44cb-9d1b-552eb0568acf.txt +1 -0
  114. package/tests/config_test/media/24a256f7-fe83-4a6d-ace8-a2c2ded37341.txt +1 -0
  115. package/tests/config_test/media/25522aa0-9c30-413b-b0df-f9f2c2562769.txt +1 -0
  116. package/tests/config_test/media/25806b78-52cd-40f2-907a-d4fba3821435.txt +1 -0
  117. package/tests/config_test/media/259920a6-0c5a-4193-8940-91fc0183204c.txt +1 -0
  118. package/tests/config_test/media/28ca6b02-f58e-4204-a87a-28347d8f5884.txt +1 -0
  119. package/tests/config_test/media/2a3f8e6e-3bc4-44b3-ac43-17851b1f53e4.txt +1 -0
  120. package/tests/config_test/media/2afe6eb3-64ca-4aae-b002-676ab3862c96.txt +1 -0
  121. package/tests/config_test/media/2bd913c1-408a-4451-b465-e48452ca46cb.txt +1 -0
  122. package/tests/config_test/media/2bfe0f21-70b6-45a7-9bc0-f60dee9b0786.txt +1 -0
  123. package/tests/config_test/media/2c37bb2d-412e-44be-8f91-58bf1adae554.txt +1 -0
  124. package/tests/config_test/media/2c6ffa05-479f-4d8f-bc98-0c050567ef28.txt +1 -0
  125. package/tests/config_test/media/2ce666cb-e1e7-411f-9727-ce47be9365f5.txt +1 -0
  126. package/tests/config_test/media/2d737158-559b-4fca-b35c-3a832e21a0bf.txt +1 -0
  127. package/tests/config_test/media/2d7cae40-8fa9-4715-8834-b105a5815efc.txt +1 -0
  128. package/tests/config_test/media/2ea6b55b-eb9e-4b72-9510-4d5b00490076.txt +1 -0
  129. package/tests/config_test/media/2f0f8b73-7a21-48e5-b0d8-6e733de5eef8.txt +1 -0
  130. package/tests/config_test/media/2f37ed63-4a76-49e8-9df0-b586e2318b54.txt +1 -0
  131. package/tests/config_test/media/2f4e2797-63dd-43cb-8edf-b6e4a5f6d85b.txt +1 -0
  132. package/tests/config_test/media/2fc8b254-571c-49da-b8d8-af12bead2b6e.txt +1 -0
  133. package/tests/config_test/media/31887ce4-a69d-429e-bd32-e3fcf1b6ec3c.txt +1 -0
  134. package/tests/config_test/media/31ab5780-f38f-4614-b11e-1399a5d19e88.txt +1 -0
  135. package/tests/config_test/media/330b1369-abf8-4a0d-aac3-15185409347b.txt +1 -0
  136. package/tests/config_test/media/332306f0-16a4-46f1-b312-42d5b1739561.txt +1 -0
  137. package/tests/config_test/media/33729cd7-ef5a-461d-860c-188b12c3c0e1.txt +1 -0
  138. package/tests/config_test/media/34f797b8-98c7-47ff-ac4f-da792d3e59ec.txt +1 -0
  139. package/tests/config_test/media/35753dc2-4a87-4fdb-b547-8ba587ab7cca.txt +1 -0
  140. package/tests/config_test/media/35cf2e07-f087-410d-898b-326b16617631.txt +1 -0
  141. package/tests/config_test/media/3704c54c-08b7-429c-98fa-0656dca539ca.txt +1 -0
  142. package/tests/config_test/media/3823f728-c199-416b-aeb3-223bc0dc006a.txt +1 -0
  143. package/tests/config_test/media/38d31ef9-7e41-47f9-8e05-e826f9d1a378.txt +1 -0
  144. package/tests/config_test/media/39504f22-47a7-428a-8793-7cb9cc79b23d.txt +1 -0
  145. package/tests/config_test/media/39baaddd-7764-48b4-9dc3-e77f91b04ff0.txt +1 -0
  146. package/tests/config_test/media/39c91ceb-928d-4279-a8a7-00f363b18384.txt +1 -0
  147. package/tests/config_test/media/3a58c511-78de-425f-a857-63a43e3b4c51.txt +1 -0
  148. package/tests/config_test/media/3c3fd2ca-8a72-4d38-899b-776f4ff690fc.txt +1 -0
  149. package/tests/config_test/media/3c592436-14fa-49f5-be05-1d8aff250d0d.txt +1 -0
  150. package/tests/config_test/media/3db275e8-327d-45d4-a755-3df103967b04.txt +1 -0
  151. package/tests/config_test/media/3de350d2-a26d-40ef-ad11-fa1454a0f50a.txt +1 -0
  152. package/tests/config_test/media/3e4f08ac-8b0a-4ec6-b3be-ff6ce140af6a.txt +1 -0
  153. package/tests/config_test/media/3fa40e56-cb30-4722-ba36-583e7c064d16.txt +1 -0
  154. package/tests/config_test/media/3fe9495c-6fa5-49ca-a16f-e3cf1808d619.txt +1 -0
  155. package/tests/config_test/media/3fed5003-1a13-433d-a82f-325dbd57ff55.txt +1 -0
  156. package/tests/config_test/media/40dfa3df-237e-4e0d-99ff-c90000c5f7ed.txt +1 -0
  157. package/tests/config_test/media/40ea2d40-3f28-46e5-a41d-5aae1721de21.txt +1 -0
  158. package/tests/config_test/media/410c564d-860e-4693-9112-efb2304bf940.txt +1 -0
  159. package/tests/config_test/media/424c9239-aa07-48f3-9a64-c99261387fec.txt +1 -0
  160. package/tests/config_test/media/4260eab4-3e7d-420a-bc8f-b9cc945f3c80.txt +1 -0
  161. package/tests/config_test/media/42886a01-8047-4a49-beab-97f5a3a7c128.txt +1 -0
  162. package/tests/config_test/media/44e2e069-a213-4632-b13b-153461000c5e.txt +1 -0
  163. package/tests/config_test/media/46520b9c-f878-41e9-9840-0d0babb9b63d.txt +1 -0
  164. package/tests/config_test/media/46f010a8-66b2-48d8-b4a6-62cc23e26008.txt +1 -0
  165. package/tests/config_test/media/48c9f649-f776-4cd9-8df5-56b5312f51c2.txt +1 -0
  166. package/tests/config_test/media/49f5836b-4fb0-4ee1-831b-91ddfcaac0bf.txt +1 -0
  167. package/tests/config_test/media/4a2d3bae-040e-44fe-bb36-301af65302fd.txt +1 -0
  168. package/tests/config_test/media/4ab15a14-36c7-4a4e-8179-be60c56368c5.txt +1 -0
  169. package/tests/config_test/media/4b98c009-458a-4e35-96e2-ccd465673234.txt +1 -0
  170. package/tests/config_test/media/4bf86749-685c-423c-9997-eb73cb0bc254.txt +1 -0
  171. package/tests/config_test/media/4db9d5ad-c703-4fb5-9b15-9c48ee3edca1.txt +1 -0
  172. package/tests/config_test/media/4dd147f7-59ef-4b8f-963b-1dbedb0d10a2.txt +1 -0
  173. package/tests/config_test/media/4e61da19-25e1-44a0-b901-2cefc3461619.txt +1 -0
  174. package/tests/config_test/media/4e66c64c-72e3-4458-8ac9-490774193a50.txt +1 -0
  175. package/tests/config_test/media/4e98ba50-1583-4d7b-9e0d-7c577af28182.txt +1 -0
  176. package/tests/config_test/media/4e9cb872-dd5f-404a-ae9f-97ec69606d36.txt +1 -0
  177. package/tests/config_test/media/4fbb89d3-e922-42f2-81ed-6c1370199c94.txt +1 -0
  178. package/tests/config_test/media/4fdf0b1d-1718-4f53-8a9c-6d44bdef0c60.txt +1 -0
  179. package/tests/config_test/media/503c6659-ff3f-4df4-ac88-628e809b2e72.txt +1 -0
  180. package/tests/config_test/media/51010c69-5b30-4ac7-8ed9-12f1866ef145.txt +1 -0
  181. package/tests/config_test/media/51b2d38d-230e-4eb0-9b1f-dab8fa8b415d.txt +1 -0
  182. package/tests/config_test/media/51cc7a7b-a764-4ebd-ac31-ba881fa1404e.txt +1 -0
  183. package/tests/config_test/media/52f0dbb6-2179-4472-871d-dd80c6341c58.txt +1 -0
  184. package/tests/config_test/media/54aff9eb-0202-447d-9c95-c74560cabcd7.txt +1 -0
  185. package/tests/config_test/media/55551c8d-4305-48ca-a752-ade3a9efb538.txt +1 -0
  186. package/tests/config_test/media/555b772b-6c78-4667-80d6-bbe2f290611c.txt +1 -0
  187. package/tests/config_test/media/555fbb0b-febc-4611-9efa-16ddbf8e988c.txt +1 -0
  188. package/tests/config_test/media/55a84883-9a15-4368-b8fe-05bd848de6ba.txt +1 -0
  189. package/tests/config_test/media/56523343-de4a-49de-94ae-8205cc92eeb6.txt +1 -0
  190. package/tests/config_test/media/567d431e-813f-47d7-a3d2-e2371c0f32e2.txt +1 -0
  191. package/tests/config_test/media/56fa54a9-10a4-42a3-9a29-ea132adf09bc.txt +1 -0
  192. package/tests/config_test/media/57734e9e-d5b8-4942-a76c-db1d0cb72aea.txt +1 -0
  193. package/tests/config_test/media/5777d7a2-cd26-494e-92ba-fa681c2445ef.txt +1 -0
  194. package/tests/config_test/media/582f6e3f-1b06-4f97-bb81-4355cc139e41.txt +1 -0
  195. package/tests/config_test/media/584ef61c-974e-4882-aaff-8089029b7a66.txt +1 -0
  196. package/tests/config_test/media/58987f15-0627-4c3c-a8ba-33e0315548f9.txt +1 -0
  197. package/tests/config_test/media/58eb23e6-6110-489f-81d3-37d48bcd3bf7.txt +1 -0
  198. package/tests/config_test/media/5c5e5543-491c-49d2-b762-162faa75019a.txt +1 -0
  199. package/tests/config_test/media/5e688b4a-afba-4d47-bdc8-dd108d673619.txt +1 -0
  200. package/tests/config_test/media/5f42b54e-6020-4552-8872-17dc7d57b110.txt +1 -0
  201. package/tests/config_test/media/5f5ae0f6-816d-4425-8403-5d07284db0aa.txt +1 -0
  202. package/tests/config_test/media/5ffa2969-2d65-430e-a621-420c07f18f41.txt +1 -0
  203. package/tests/config_test/media/62a62671-e4bc-4312-8dfd-a06168c22aee.txt +1 -0
  204. package/tests/config_test/media/63732c16-1f11-4635-b2bc-62a6459e651e.txt +1 -0
  205. package/tests/config_test/media/64b8c889-5423-4cbb-9816-a05e72771b52.txt +1 -0
  206. package/tests/config_test/media/653d8bcd-4e60-4fda-9676-2e0054d966c1.txt +1 -0
  207. package/tests/config_test/media/6602e1e0-07e9-4dd1-b3c8-276f24e2a41f.txt +1 -0
  208. package/tests/config_test/media/67868636-99cc-441b-991d-7fe781b67745.txt +1 -0
  209. package/tests/config_test/media/67b4eede-7118-4e25-8801-ca53d0fd9d7f.txt +1 -0
  210. package/tests/config_test/media/67b817df-8c2f-4fe5-ba38-6090b5658943.txt +1 -0
  211. package/tests/config_test/media/67f8c8a6-8aa3-4d0f-bcf6-bec8c5a6726a.txt +1 -0
  212. package/tests/config_test/media/6808c09c-a1a9-4eea-92d6-327957c599be.txt +1 -0
  213. package/tests/config_test/media/681f8ee3-0d7f-4d85-a593-0c1f5ceea9be.txt +1 -0
  214. package/tests/config_test/media/68ae942b-c728-4127-a057-dfd08edc1aee.txt +1 -0
  215. package/tests/config_test/media/6a405178-234d-4562-ab34-c554826476fc.txt +1 -0
  216. package/tests/config_test/media/6b801410-b1fb-43f6-935e-c7cb09fb0f5a.txt +1 -0
  217. package/tests/config_test/media/6bd41073-fa62-4c20-a896-8b1e5d2b8381.txt +1 -0
  218. package/tests/config_test/media/6ea9bf1d-780e-4fc2-987e-841038b791cd.txt +1 -0
  219. package/tests/config_test/media/6fa62bcc-859a-44eb-a85b-ed12b3aec3ae.txt +1 -0
  220. package/tests/config_test/media/70118801-66f3-4165-a0b2-8918e4d4bd15.txt +1 -0
  221. package/tests/config_test/media/70640e73-56dc-4880-af62-ad7530a1185d.txt +1 -0
  222. package/tests/config_test/media/7114e6d7-f285-48b3-80c9-ec3fb1c3233e.txt +1 -0
  223. package/tests/config_test/media/71997029-9398-4efb-9868-3025b6de861a.txt +1 -0
  224. package/tests/config_test/media/725cb5f7-8410-4b7a-8427-90b213cea9d6.txt +1 -0
  225. package/tests/config_test/media/727960af-4454-4aa2-b479-c88398ca2c01.txt +1 -0
  226. package/tests/config_test/media/763e2702-7677-48b0-89be-30f8caf56667.txt +1 -0
  227. package/tests/config_test/media/7682d7aa-6622-4ae1-bdfc-bb5134cf92d9.txt +1 -0
  228. package/tests/config_test/media/773d6a45-2316-41da-9973-1395727ffc1f.txt +1 -0
  229. package/tests/config_test/media/783cdda1-9913-4ab0-aba6-56a4c22e2b61.txt +1 -0
  230. package/tests/config_test/media/78becb97-76f6-4fd1-976d-ab3d5e4b21c2.txt +1 -0
  231. package/tests/config_test/media/78cb1409-965a-44ea-b42b-0363db4d2ebd.txt +1 -0
  232. package/tests/config_test/media/79f9864e-b5d5-4c8d-bb66-749f5b49877f.txt +1 -0
  233. package/tests/config_test/media/7b2928b9-4fd3-46c7-8b78-f8d1118c605b.txt +1 -0
  234. package/tests/config_test/media/7b5aead0-b20b-4719-88aa-3dd070d53e4d.txt +1 -0
  235. package/tests/config_test/media/7c1a82c9-391d-40fb-a6f3-d79468fcd45f.txt +1 -0
  236. package/tests/config_test/media/7f1aefd7-7c6b-4b29-9f71-a85d800d63eb.txt +1 -0
  237. package/tests/config_test/media/7fe1aa1b-3e92-4f1b-a77d-bf69601ba162.txt +1 -0
  238. package/tests/config_test/media/802ca8c0-8898-446d-aeca-59d0cce3eea5.txt +1 -0
  239. package/tests/config_test/media/8034e1cc-a82a-4e65-9019-ecf53a212c9e.txt +1 -0
  240. package/tests/config_test/media/80828d5a-916c-412b-aa23-eccdf3ce4078.txt +1 -0
  241. package/tests/config_test/media/81a6ec1c-49c5-490b-afe8-bd47a3c3b1e7.txt +1 -0
  242. package/tests/config_test/media/82827b46-f1f4-4b2a-bd5a-4a83e6b5cc12.txt +1 -0
  243. package/tests/config_test/media/82f7163d-c5a6-44fe-b06a-b1863c553af4.txt +1 -0
  244. package/tests/config_test/media/83141a3e-3f8b-456a-83f1-b9b4ada167f0.txt +1 -0
  245. package/tests/config_test/media/837397e7-63f9-4cba-8b10-51d565e00341.txt +1 -0
  246. package/tests/config_test/media/8440b86e-2036-46ef-affe-e052ae1e232f.txt +1 -0
  247. package/tests/config_test/media/8729c33a-8f9d-496c-8090-42947d3bd4c7.txt +1 -0
  248. package/tests/config_test/media/874e1047-3429-443a-868d-4ce453c3a525.txt +1 -0
  249. package/tests/config_test/media/8770cffa-58f5-4c15-869a-687c77529f81.txt +1 -0
  250. package/tests/config_test/media/87c977c0-4375-4527-abc1-6223c71e8756.txt +1 -0
  251. package/tests/config_test/media/889e72cc-7e19-40ef-9d5b-1e501f3b48c7.txt +1 -0
  252. package/tests/config_test/media/88c89c9b-755e-43f9-9ac6-c01df1e83dfb.txt +1 -0
  253. package/tests/config_test/media/894ee8b5-d527-40e2-a7e1-475d9f07c2aa.txt +1 -0
  254. package/tests/config_test/media/89ec8a46-a4bf-4462-8f6d-c132016af9e1.txt +1 -0
  255. package/tests/config_test/media/8b2bee47-1673-4cd9-a8d5-033ef092b93e.txt +1 -0
  256. package/tests/config_test/media/8c362262-34ff-4707-ab5f-c334034083ee.txt +1 -0
  257. package/tests/config_test/media/8c458967-085b-4750-91e6-3ea391147bc7.txt +1 -0
  258. package/tests/config_test/media/8c5b0560-fc62-47a5-b480-a93120ca7bc4.txt +1 -0
  259. package/tests/config_test/media/8ce076d6-e809-4355-97ab-96104b51b939.txt +1 -0
  260. package/tests/config_test/media/8d60f276-8a2d-48e2-934b-63ef82f03d0f.txt +1 -0
  261. package/tests/config_test/media/8d889db9-f6b8-4ccb-864c-d10d1a54f7e9.txt +1 -0
  262. package/tests/config_test/media/8df0284b-c43f-4c32-a4e1-7dbe2c8c80f0.txt +1 -0
  263. package/tests/config_test/media/8e583c0b-1e2e-4b51-b104-1382e81f69d9.txt +1 -0
  264. package/tests/config_test/media/8f57d7e8-0f26-4719-b4d1-37896da3f579.txt +1 -0
  265. package/tests/config_test/media/9070fc55-481f-44c9-96f2-62f7c0a08814.txt +1 -0
  266. package/tests/config_test/media/93743c64-b60e-4521-9774-4d3beffd4465.txt +1 -0
  267. package/tests/config_test/media/939c6b06-b95d-4de6-bdaa-6f33cbe1fc1e.txt +1 -0
  268. package/tests/config_test/media/94ac4fc1-ba54-43de-b283-a7fa05eb3921.txt +1 -0
  269. package/tests/config_test/media/95093a2d-81d2-46d7-a817-7ab507cc2454.txt +1 -0
  270. package/tests/config_test/media/9628850e-c8d3-44da-b3b4-b27e00ba0e05.txt +1 -0
  271. package/tests/config_test/media/965e4782-3120-41c1-a398-23b38a342d95.txt +1 -0
  272. package/tests/config_test/media/97216f64-db92-4fa8-a239-5a115e3293a0.txt +1 -0
  273. package/tests/config_test/media/97b54a41-ec05-498e-9c61-6ec20f34a331.txt +1 -0
  274. package/tests/config_test/media/97c15c9a-13b4-49f1-b9ea-708c92756b95.txt +1 -0
  275. package/tests/config_test/media/97e45e1c-d03b-4a17-bb6f-ea8601e7fdf4.txt +1 -0
  276. package/tests/config_test/media/98faca9f-2686-4338-a1c2-d1920cce2fc0.txt +1 -0
  277. package/tests/config_test/media/997016d6-6832-4c09-9f8d-949dba5f4f8e.txt +1 -0
  278. package/tests/config_test/media/99ce7c2e-d4a3-49d0-9251-9c62d28288f5.txt +1 -0
  279. package/tests/config_test/media/9a9940a6-78b9-4978-98a6-914a171406c3.txt +1 -0
  280. package/tests/config_test/media/9ade4d45-452f-4a3f-ba4f-d9a08da80dab.txt +1 -0
  281. package/tests/config_test/media/9aff7e30-1809-4021-8ab1-e9a04068ad15.txt +1 -0
  282. package/tests/config_test/media/9b6b83df-1ee4-48f2-a3b0-aee0723378fc.txt +1 -0
  283. package/tests/config_test/media/9bbf50e1-c19d-4cc4-a366-0dcc234f003f.txt +1 -0
  284. package/tests/config_test/media/9ce9bc18-89eb-4a6f-832d-a4380111ebfa.txt +1 -0
  285. package/tests/config_test/media/9d7e647b-f1a9-44a7-bb9d-5ad7ac545ed9.txt +1 -0
  286. package/tests/config_test/media/9e141207-cb69-47c7-a80a-9096886b0f4e.txt +1 -0
  287. package/tests/config_test/media/9e58e7cc-04bb-48d0-9af1-9fd7c80d46be.txt +1 -0
  288. package/tests/config_test/media/9f1f6f42-70f0-404e-89e4-31588f235108.txt +1 -0
  289. package/tests/config_test/media/9f3e0022-deb0-44a2-b47c-fd4880fb2fa6.txt +1 -0
  290. package/tests/config_test/media/a07a6a4e-25c7-4f91-acdc-411e676bae99.txt +1 -0
  291. package/tests/config_test/media/a08ef99a-7cff-4224-985f-aa7cf292c6c3.txt +1 -0
  292. package/tests/config_test/media/a0c4ef94-eb1d-4b7f-b636-62ad6914a69c.txt +1 -0
  293. package/tests/config_test/media/a170f562-2b00-4662-85d7-7c43f9f67e0c.txt +1 -0
  294. package/tests/config_test/media/a32bb27b-7772-4373-ada7-890d9315256f.txt +1 -0
  295. package/tests/config_test/media/a36c31b9-f5c1-43a9-b448-34a380990d3f.txt +1 -0
  296. package/tests/config_test/media/a3831984-3f77-4bac-af70-5a7de6ce5424.txt +1 -0
  297. package/tests/config_test/media/a4f1f023-6135-44da-b580-c1d024cd3f47.txt +1 -0
  298. package/tests/config_test/media/a6227af7-2710-47be-ab45-25f497cec39f.txt +1 -0
  299. package/tests/config_test/media/a64baf32-bd1e-4353-bdf8-74cc3672639f.txt +1 -0
  300. package/tests/config_test/media/a67f5ac1-9645-4f28-a221-c3466b6ba865.txt +1 -0
  301. package/tests/config_test/media/a7f8e5a7-0c0e-48fb-b323-743b121fc091.txt +1 -0
  302. package/tests/config_test/media/a969343e-857b-49b1-a311-0030e0cc57cd.txt +1 -0
  303. package/tests/config_test/media/a9bc7241-7413-4113-8baf-784af73b110d.txt +1 -0
  304. package/tests/config_test/media/aa5b6ba2-76cf-4ca2-90b8-8f83cb23687e.txt +1 -0
  305. package/tests/config_test/media/aa5f29d2-3c13-4a15-ac68-b28964f80a1d.txt +1 -0
  306. package/tests/config_test/media/aaa97926-1d6f-4f5a-9af8-e68584797d23.txt +1 -0
  307. package/tests/config_test/media/ac98c0da-b830-4ec8-9ab6-d8e72a6d0bf2.txt +1 -0
  308. package/tests/config_test/media/af2dda92-1ed0-4b00-a786-f0f7516d4b2b.txt +1 -0
  309. package/tests/config_test/media/b0327e27-0733-4f08-b728-8dca3eae7526.txt +1 -0
  310. package/tests/config_test/media/b23fc74b-403b-49d6-810b-5c3dc71f48de.txt +1 -0
  311. package/tests/config_test/media/b2aa3fbb-ef3f-423b-b7a9-1863aba35bdd.txt +1 -0
  312. package/tests/config_test/media/b38675e5-1ecf-4967-88ef-9f60cce1bb89.txt +1 -0
  313. package/tests/config_test/media/b45c1951-b045-4762-a9fa-8d346617c1b5.txt +1 -0
  314. package/tests/config_test/media/b5359b92-46ea-4ebc-b6bc-102ef03ac5f5.txt +1 -0
  315. package/tests/config_test/media/b5d5aa47-fb92-48a6-9bd5-e394dc7b5212.txt +1 -0
  316. package/tests/config_test/media/b6bba0b4-d9fe-431b-8836-ef41bcd890fe.txt +1 -0
  317. package/tests/config_test/media/b72f4de8-5071-4314-a8e9-0adc7ce98fb8.txt +1 -0
  318. package/tests/config_test/media/b792506c-a05f-4b33-8934-83a7f2b1ebdd.txt +1 -0
  319. package/tests/config_test/media/b7e0e1bd-5e0f-44cc-89b9-55e67c368dce.txt +1 -0
  320. package/tests/config_test/media/b7ec24ac-6967-441e-9cb9-533daa7b443e.txt +1 -0
  321. package/tests/config_test/media/b86f2242-9e7c-4434-ac3d-e8fe868ab758.txt +1 -0
  322. package/tests/config_test/media/b8aa1cbb-05fe-4564-bfad-96a5243eec54.txt +1 -0
  323. package/tests/config_test/media/b8c54323-7977-4626-9412-66116a40fe42.txt +1 -0
  324. package/tests/config_test/media/ba3387a6-c5cd-4677-bddd-a399c6f648a3.txt +1 -0
  325. package/tests/config_test/media/ba70f293-7a40-4a5d-9e60-9d9c3d1fd2c0.txt +1 -0
  326. package/tests/config_test/media/ba7cad62-385b-494c-9688-b008fbae10c9.txt +1 -0
  327. package/tests/config_test/media/bb07c0ca-4b9f-4888-9109-95087951d2a6.txt +1 -0
  328. package/tests/config_test/media/bcf860eb-13b6-44b7-9a58-f2b6422a4fb0.txt +1 -0
  329. package/tests/config_test/media/bd8a019f-c9fd-4289-bc38-cc222a247ba8.txt +1 -0
  330. package/tests/config_test/media/bda18b4f-b4f3-4095-8b9b-8d715945ded1.txt +1 -0
  331. package/tests/config_test/media/bf3e4228-17f4-40d6-9d23-7ba79a333be5.txt +1 -0
  332. package/tests/config_test/media/bfa2fe67-34fe-466c-b807-bea2ddfb0141.txt +1 -0
  333. package/tests/config_test/media/c15ecf6e-6167-42ad-ba24-161216dbabfb.txt +1 -0
  334. package/tests/config_test/media/c17436fb-113d-425e-b59b-cafe93e3418e.txt +1 -0
  335. package/tests/config_test/media/c22154ee-3f66-4996-8ed7-df6120806040.txt +1 -0
  336. package/tests/config_test/media/c2c47ffe-50a1-46f4-bace-d66008c3ce7b.txt +1 -0
  337. package/tests/config_test/media/c4e0c0bf-f9b0-4fec-8fbf-292d8d2fe254.txt +1 -0
  338. package/tests/config_test/media/c56803d2-29bc-4359-8cb4-ea9574a47b2d.txt +1 -0
  339. package/tests/config_test/media/c607d0ee-1641-47e1-83d5-66e9e4bed857.txt +1 -0
  340. package/tests/config_test/media/c62769c5-d469-4499-bf09-97f752a65397.txt +1 -0
  341. package/tests/config_test/media/c667bac7-c161-4f89-b311-9975dcac5865.txt +1 -0
  342. package/tests/config_test/media/c7485a24-95f6-45e7-90f2-6a4716e8971e.txt +1 -0
  343. package/tests/config_test/media/c80b124d-579a-4f7b-9743-5428be624edf.txt +1 -0
  344. package/tests/config_test/media/c8f6e757-0252-4ac6-a439-14a5cd406e16.txt +1 -0
  345. package/tests/config_test/media/c94c9c39-24e1-4ce3-94bd-e32db7052a9d.txt +1 -0
  346. package/tests/config_test/media/ca950ac2-312d-472f-ae0f-7604edd6eae8.txt +1 -0
  347. package/tests/config_test/media/cc1ffb29-8d6f-47cd-9efd-f38832045570.txt +1 -0
  348. package/tests/config_test/media/cf42859e-23b6-4f7b-9b00-4928b0fc33fd.txt +1 -0
  349. package/tests/config_test/media/d000b20e-fd2c-4d07-bb8c-fc48541fe420.txt +1 -0
  350. package/tests/config_test/media/d191b4ba-365d-4346-96c6-7ab4f27a163d.txt +1 -0
  351. package/tests/config_test/media/d2739585-5101-44b5-8dd1-bbb09a104978.txt +1 -0
  352. package/tests/config_test/media/d31d2bf6-bdb1-4de2-9942-3ab83e857a52.txt +1 -0
  353. package/tests/config_test/media/d4027635-8e25-4cf5-a3dc-73a826c5045c.txt +1 -0
  354. package/tests/config_test/media/d476077e-d4e9-42e8-a7db-ded7f075d88d.txt +1 -0
  355. package/tests/config_test/media/d4fe0fae-942f-4966-ab76-64ba34352269.txt +1 -0
  356. package/tests/config_test/media/d551ace3-b4bb-4306-ad17-4873cdbfa5f5.txt +1 -0
  357. package/tests/config_test/media/d5aabdf7-472d-4268-b542-ddce2b25c70e.txt +1 -0
  358. package/tests/config_test/media/d6279202-c868-4058-947d-d9e44acd26cc.txt +1 -0
  359. package/tests/config_test/media/d62ecbb0-df04-449c-91fa-5d60f96c717f.txt +1 -0
  360. package/tests/config_test/media/d6309af6-add5-4d3d-9596-92a3c1b785b8.txt +1 -0
  361. package/tests/config_test/media/d6f419fc-2441-4170-8967-1d3f2a232869.txt +1 -0
  362. package/tests/config_test/media/d78e034e-51e4-47e7-802b-2fb9ca7aeeb0.txt +1 -0
  363. package/tests/config_test/media/d7a5dea2-b545-4b1f-9f25-0ca31bfa9ba9.txt +1 -0
  364. package/tests/config_test/media/d7eff0e2-7e17-4364-995a-13608df42af3.txt +1 -0
  365. package/tests/config_test/media/d89b187c-f4e0-45c2-8622-8f6c05b3f8f8.txt +1 -0
  366. package/tests/config_test/media/d8e4f769-79a3-4577-ae6f-e21b6c373661.txt +1 -0
  367. package/tests/config_test/media/d9266efc-e275-4daf-bb58-a7d224649ac5.txt +1 -0
  368. package/tests/config_test/media/db04add1-1f89-4657-a897-4779001bd6cc.txt +1 -0
  369. package/tests/config_test/media/dc709e83-06c7-4371-95f4-c4982d094c7b.txt +1 -0
  370. package/tests/config_test/media/de3812df-b579-4203-98b1-7ee8821680a4.txt +1 -0
  371. package/tests/config_test/media/df1a21db-e3e1-4670-b909-da77c591486e.txt +1 -0
  372. package/tests/config_test/media/e033a02b-3a38-4b6f-8873-b121cc0cbcad.txt +1 -0
  373. package/tests/config_test/media/e13e2632-4aaf-4a79-b6b4-ef1f81028346.txt +1 -0
  374. package/tests/config_test/media/e19633b3-1ab1-4f18-86cd-e421633e96af.txt +1 -0
  375. package/tests/config_test/media/e1dc9b89-9563-4937-b529-43cd55f82a98.txt +1 -0
  376. package/tests/config_test/media/e37f9c75-0571-4336-b7a6-d431e295ba92.txt +1 -0
  377. package/tests/config_test/media/e3fb83b1-53ed-470d-b9f4-015f98c6a128.txt +1 -0
  378. package/tests/config_test/media/e6c964da-ab48-4779-9706-0ae9ab5f22bb.txt +1 -0
  379. package/tests/config_test/media/e732131f-d7e2-4969-9f0f-10672281405b.txt +1 -0
  380. package/tests/config_test/media/e73f5320-f030-43ae-9efe-002aeb6e0522.txt +1 -0
  381. package/tests/config_test/media/e98267b9-553f-4cd2-9277-2bee037b7003.txt +1 -0
  382. package/tests/config_test/media/ea3c4ac0-f63d-4a91-b015-345851856564.txt +1 -0
  383. package/tests/config_test/media/eacee16f-a2db-4d60-a36b-9b60ea2be330.txt +1 -0
  384. package/tests/config_test/media/eba1b05a-52aa-4f00-92f6-3d556ca2f366.txt +1 -0
  385. package/tests/config_test/media/ebf6e54b-0d1e-4d87-b206-34fa81c66dbb.txt +1 -0
  386. package/tests/config_test/media/ecbf0894-6d76-4141-875d-7691de63a8f7.txt +1 -0
  387. package/tests/config_test/media/ece7a87a-3490-4ac6-adaf-289b1e427325.txt +1 -0
  388. package/tests/config_test/media/ed59c963-3449-4431-8440-2cba7defdcae.txt +1 -0
  389. package/tests/config_test/media/eda09368-348b-4531-a062-a8aafbf9cb8a.txt +1 -0
  390. package/tests/config_test/media/edd1c2b2-179f-4d44-9ac0-72b4fe16c6f2.txt +1 -0
  391. package/tests/config_test/media/ee4e9f39-779e-4084-b696-f39abe74f545.txt +1 -0
  392. package/tests/config_test/media/ef08a195-fcc6-452f-b81e-9d4e97231327.txt +1 -0
  393. package/tests/config_test/media/ef518fee-57a4-47d3-bbb5-aef9b166ca49.txt +1 -0
  394. package/tests/config_test/media/efd77ad3-0e00-448f-a01d-4f363ad5c0b1.txt +1 -0
  395. package/tests/config_test/media/f0c18f54-1095-4787-891b-63c82ba6c153.txt +1 -0
  396. package/tests/config_test/media/f18dca67-521a-4e7f-8064-e6daa08ea3bc.txt +1 -0
  397. package/tests/config_test/media/f19a32ab-f345-4bcb-be01-58e62ade0285.txt +1 -0
  398. package/tests/config_test/media/f29ef9e1-4f84-4bb7-93ce-3693d7cd01f7.txt +1 -0
  399. package/tests/config_test/media/f2cd3857-386e-4d43-b5ee-cb54d1e7fa3c.txt +1 -0
  400. package/tests/config_test/media/f3c8b431-4b3a-43b9-a277-233daea240bb.txt +1 -0
  401. package/tests/config_test/media/f7344305-dde1-4b33-989e-b64b18447e2a.txt +1 -0
  402. package/tests/config_test/media/f829cdfe-a118-4751-a49f-565a617c2b99.txt +1 -0
  403. package/tests/config_test/media/f89206aa-0728-4215-a1df-c1f4315079b5.txt +1 -0
  404. package/tests/config_test/media/f89bb977-c022-471d-9972-d9417484f025.txt +1 -0
  405. package/tests/config_test/media/f960f026-724a-4630-b3ea-48d7ad60b022.txt +1 -0
  406. package/tests/config_test/media/fa343cd4-aca6-482b-9395-f221148fd0d8.txt +1 -0
  407. package/tests/config_test/media/fa802dcc-614e-4027-95fe-ce4f0da61bc9.txt +1 -0
  408. package/tests/config_test/media/ff1a47f0-9c4b-4c88-b0dc-b28d20a83509.txt +1 -0
  409. package/tests/config_test/media/ff8aa3b0-5c4d-4d39-be53-4e28e9ee02e7.txt +1 -0
  410. package/tests/config_test/media/ffb998c5-c98b-4442-b8ef-187bdc7e4c73.txt +1 -0
  411. package/tests/config_test/media/ffc43791-7d7b-4e13-a2ea-3bb952457e7f.txt +1 -0
  412. package/tests/config_test/package-lock.json +727 -688
  413. package/tests/config_test/package.json +2 -2
  414. package/tests/config_test/tsconfig.json +1 -1
  415. package/tests/isomorphic_queries.js +38 -0
  416. package/tests/isomorphic_queries.ts +28 -1
  417. package/tests/server/DBoGenerated.d.ts +135 -1
  418. package/tests/server/index.js +51 -27
  419. package/tests/server/index.ts +49 -26
  420. package/tests/server/init.sql +22 -7
  421. package/tests/server/media/35d7e3d7-64d3-4d4b-b564-5e810ca3671f.txt +1 -0
  422. package/tests/server/media/70ca7114-d6bc-4551-8170-cd7dcdff11dd.txt +1 -0
  423. package/tests/server/media/9e19f591-edc8-4ad7-ac4f-96c3078cb8ed.txt +1 -0
  424. package/tests/server/package-lock.json +166 -535
  425. package/tests/server/package.json +2 -2
  426. package/tests/config_test2/package-lock.json +0 -1999
package/lib/DboBuilder.ts CHANGED
@@ -10,20 +10,63 @@ declare global { export interface Promise<T> extends Bluebird<T> {} }
10
10
  import * as pgPromise from 'pg-promise';
11
11
  import pg = require('pg-promise/typescript/pg-subset');
12
12
  import {
13
- ColumnInfo, ValidatedColumnInfo, FieldFilter, SelectParams, SubscribeParams, OrderBy, InsertParams, UpdateParams, DeleteParams,
13
+ ColumnInfo, ValidatedColumnInfo, FieldFilter, SelectParams, SubscribeParams, OrderBy, InsertParams, UpdateParams, DeleteParams, SQLOptions,
14
14
  DbJoinMaker,
15
15
  unpatchText,
16
16
  isEmpty,
17
17
  asName,
18
18
  PG_COLUMN_UDT_DATA_TYPE,
19
19
  TS_PG_Types,
20
+ TableInfo as TInfo,
21
+ SQLHandler,
22
+ AnyObject,
20
23
  } from "prostgles-types";
21
24
 
25
+ export type Media = {
26
+ "id"?: string;
27
+ "title"?: string;
28
+ "extension"?: string;
29
+ "content_type"?: string;
30
+ "local_url"?: string;
31
+ "url"?: string;
32
+ "signed_url"?: string;
33
+ "signed_url_expires"?: number;
34
+ "name"?: string;
35
+ "original_name"?: string;
36
+ "etag"?: string;
37
+ }
38
+
39
+ export interface TxHandler {
40
+ [key: string]: TableHandler | ViewHandler;
41
+ }
42
+ export type TxCB = {
43
+ (t: TxHandler, _t: pgPromise.ITask<{}>): (any | void);
44
+ }
45
+ export type TX = {
46
+ (t: TxCB): Promise<(any | void)>;
47
+ }
22
48
  export type DbHandler = {
23
49
  [key: string]: Partial<TableHandler>;
24
- } & DbJoinMaker & {
25
- sql?: (query: string, params?: any, options?: any) => Promise<any>;
26
- };
50
+ } &
51
+ DbJoinMaker &
52
+ {
53
+ sql?: SQLHandler
54
+ } & {
55
+ tx?: TX
56
+ }
57
+
58
+ // <TXKey extends string = "tx">
59
+ // & {
60
+ // [K in TXKey]: TX
61
+ // };
62
+
63
+ // const d: DbHandler = { } as any;
64
+ // d.
65
+ // export type DbHandlerTX = { [key: string]: TX } | DbHandler;
66
+ // export type DbHandlerTX = DbHandler
67
+ // & Partial<{
68
+ // [key: string]: TX
69
+ // }>
27
70
 
28
71
  import { get } from "./utils";
29
72
  import { getNewQuery, makeQuery, COMPUTED_FIELDS, SelectItem, FieldSpec, asNameAlias, SelectItemBuilder, FUNCTIONS } from "./QueryBuilder";
@@ -40,7 +83,7 @@ export const pgp: PGP = pgPromise({
40
83
  // ,query: function (e) { console.log({psql: e.query, params: e.params}); }
41
84
  });
42
85
 
43
- export type TableInfo = {
86
+ export type TableInfo = TInfo & {
44
87
  schema: string;
45
88
  name: string;
46
89
  oid: number;
@@ -57,14 +100,24 @@ export type TableOrViewInfo = TableInfo & ViewInfo & {
57
100
  }
58
101
 
59
102
  export type LocalParams = {
103
+ httpReq?: any;
60
104
  socket?: any;
61
105
  func?: () => any;
62
106
  has_rules?: boolean;
63
107
  testRule?: boolean;
64
108
  tableAlias?: string;
65
109
  // subOne?: boolean;
66
- dbTX?: any;
110
+ dbTX?: TxHandler;
111
+
112
+ // localTX?: pgPromise.ITask<{}>;
113
+ localDBTX?: DbHandler;
114
+
67
115
  returnQuery?: boolean;
116
+
117
+ nestedJoin?: {
118
+ depth: number;
119
+ data: AnyObject;
120
+ }
68
121
  }
69
122
  function replaceNonAlphaNumeric(string: string): string {
70
123
  return string.replace(/[\W_]+/g,"_");
@@ -129,13 +182,14 @@ type Query = {
129
182
  }
130
183
 
131
184
  export type JoinInfo = {
132
- table: string,
133
- on: [[string, string]],
134
185
  expectOne: boolean,
135
- source: string,
136
- target: string
137
- }[]
138
-
186
+ paths: {
187
+ table: string,
188
+ on: [[string, string]],
189
+ source: string,
190
+ target: string
191
+ }[]
192
+ }
139
193
  type JoinPaths = {
140
194
  t1: string;
141
195
  t2: string;
@@ -303,11 +357,14 @@ export class ViewHandler {
303
357
  joinGraph: Graph;
304
358
  joinPaths: JoinPaths;
305
359
  dboBuilder: DboBuilder;
360
+
306
361
  t: pgPromise.ITask<{}>;
362
+
307
363
  is_view: boolean = true;
308
364
  filterDef: string = "";
309
365
 
310
366
  pubSubManager: PubSubManager;
367
+ is_media: boolean = false;
311
368
  constructor(db: DB, tableOrViewInfo: TableOrViewInfo, pubSubManager: PubSubManager, dboBuilder: DboBuilder, t?: pgPromise.ITask<{}>, joinPaths?: JoinPaths){
312
369
  if(!db || !tableOrViewInfo) throw "";
313
370
 
@@ -334,7 +391,7 @@ export class ViewHandler {
334
391
  // if(this.tsDataName === "T") this.tsDataName = this.tsDataName + "_";
335
392
  // this.tsDataDef = `export type ${this.tsDataName} = {\n`;
336
393
  this.columns.map(({ name, udt_name }) => {
337
- this.tsColumnDefs.push(`${escapeTSNames(name, false)}?: ${postgresToTsType(udt_name)};`);
394
+ this.tsColumnDefs.push(`${escapeTSNames(name, false)}?: ${postgresToTsType(udt_name) as string};`);
338
395
  });
339
396
  // this.tsDataDef += "};";
340
397
  // this.tsDataDef += "\n";
@@ -376,12 +433,15 @@ export class ViewHandler {
376
433
  return []
377
434
  }
378
435
 
379
- async validateViewRules(fields: FieldFilter, filterFields: FieldFilter, returningFields: FieldFilter, forcedFilter: object, rule: string){
436
+ async validateViewRules(fields: FieldFilter, filterFields: FieldFilter, returningFields: FieldFilter, forcedFilter: object, rule: "update" | "select" | "insert" | "delete"){
380
437
 
381
438
  /* Safely test publish rules */
382
439
  if(fields) {
383
440
  try {
384
- this.parseFieldFilter(fields);
441
+ const _fields = this.parseFieldFilter(fields);
442
+ if(this.is_media && rule === "insert" && !_fields.includes("id")){
443
+ throw "Must allow id insert for media table"
444
+ }
385
445
  } catch(e){
386
446
  throw ` issue with publish.${this.name}.${rule}.fields: \nVALUE: ` + JSON.stringify(fields, null, 2) + "\nERROR: " + JSON.stringify(e, null, 2);
387
447
  }
@@ -430,7 +490,7 @@ export class ViewHandler {
430
490
  }
431
491
 
432
492
  getJoins(source: string, target: string, path?: string[]): JoinInfo {
433
- let result = [];
493
+ let paths: JoinInfo["paths"] = [];
434
494
 
435
495
  if(!this.joinPaths) throw "Joins dissallowed";
436
496
 
@@ -450,7 +510,7 @@ export class ViewHandler {
450
510
  if(!jp || !this.joinPaths.find(j => path? j.path.join() === path.join() : j.t1 === source && j.t2 === target)) throw `Joining ${source} <-...-> ${target} dissallowed or missing`;
451
511
 
452
512
  /* Make the join chain info excluding root table */
453
- result = (path || jp.path).slice(1).map((t2, i, arr) => {
513
+ paths = (path || jp.path).slice(1).map((t2, i, arr) => {
454
514
  const t1 = i === 0? source : arr[i-1];
455
515
 
456
516
  if(!this.joins) this.joins = JSON.parse(JSON.stringify(this.dboBuilder.joins));
@@ -482,7 +542,22 @@ export class ViewHandler {
482
542
  on
483
543
  };
484
544
  });
485
- return result;
545
+ let expectOne = false;
546
+ paths.map(({ source, target, on }, i) => {
547
+ // if(expectOne && on.length === 1){
548
+ // const sourceCol = on[0][1];
549
+ // const targetCol = on[0][0];
550
+
551
+ // const sCol = this.dboBuilder.dbo[source].columns.find(c => c.name === sourceCol)
552
+ // const tCol = this.dboBuilder.dbo[target].columns.find(c => c.name === targetCol)
553
+ // console.log({ sourceCol, targetCol, sCol, source, tCol, target, on})
554
+ // expectOne = sCol.is_pkey && tCol.is_pkey
555
+ // }
556
+ })
557
+ return {
558
+ paths,
559
+ expectOne
560
+ };
486
561
  }
487
562
 
488
563
 
@@ -490,13 +565,38 @@ export class ViewHandler {
490
565
  if(filter === null || filter && !isPojoObject(filter)) throw `invalid filter -> ${JSON.stringify(filter)} \nExpecting: undefined | {} | { field_name: "value" } | { field: { $gt: 22 } } ... `;
491
566
  }
492
567
 
493
- async getInfo(param1, param2, param3, tableRules?: TableRule, localParams?: LocalParams): Promise<{ oid: number; comment: string; }>{
568
+ async getInfo(param1?, param2?, param3?, tableRules?: TableRule, localParams?: LocalParams): Promise<{ oid: number; comment: string; is_media: boolean; has_media?: "one" | "many" }>{
494
569
  const p = this.getValidatedRules(tableRules, localParams);
495
570
  if(!p.select.getInfo) throw "Not allowed";
496
571
 
572
+ let has_media = undefined;
573
+
574
+ const mediaTable = this.dboBuilder.prostgles?.opts?.fileTable?.tableName;
575
+ if(!this.is_media && mediaTable){
576
+ if(this.dboBuilder.prostgles?.opts?.fileTable?.referencedTables?.[this.name]){
577
+ has_media = this.dboBuilder.prostgles?.opts?.fileTable?.referencedTables?.[this.name];
578
+ } else {
579
+ const jp = this.dboBuilder.joinPaths.find(jp => jp.t1 === this.name && jp.t2 === mediaTable);
580
+ if(jp && jp.path.length < 4){
581
+ await Promise.all(jp.path.map(async tableName => {
582
+ const cols = (await this.dboBuilder.dbo[tableName].getColumns()).filter(c => jp.path.includes(c.references?.ftable));
583
+ if(cols.length && has_media !== "many"){
584
+ if(cols.find(c => !c.is_pkey)){
585
+ has_media = "many"
586
+ } else {
587
+ has_media = "one"
588
+ }
589
+ }
590
+ }));
591
+ }
592
+ }
593
+ }
594
+
497
595
  return {
498
596
  oid: this.tableOrViewInfo.oid,
499
597
  comment: this.tableOrViewInfo.comment,
598
+ is_media: this.is_media, // this.name === this.dboBuilder.prostgles?.opts?.fileTable?.tableName
599
+ has_media,
500
600
  }
501
601
  }
502
602
 
@@ -513,8 +613,8 @@ export class ViewHandler {
513
613
  let _lang = lang;
514
614
  return this.columns.map(c => {
515
615
  let label = c.comment || c.name;
516
- const iConf = this.dboBuilder.prostgles?.i18n?.column_labels?.[this.name]?.[c.name];
517
- const fallbackLang = this.dboBuilder.prostgles?.i18n?.fallbackLang;
616
+ const iConf = this.dboBuilder.prostgles?.opts?.i18n?.column_labels?.[this.name]?.[c.name];
617
+ const fallbackLang = this.dboBuilder.prostgles?.opts?.i18n?.fallbackLang;
518
618
  _lang = _lang || fallbackLang as string;
519
619
 
520
620
  if((lang || fallbackLang) && iConf){
@@ -680,9 +780,10 @@ export class ViewHandler {
680
780
  async find(filter?: Filter, selectParams?: SelectParams , param3_unused = null, tableRules?: TableRule, localParams?: LocalParams): Promise<any[]>{
681
781
  try {
682
782
  filter = filter || {};
783
+ const allowedReturnTypes: Array<SelectParams["returnType"]> = ["row", "value", "values"]
683
784
  const { returnType } = selectParams || {};
684
- if(returnType && !["row", "value", "values"].includes(returnType)){
685
- throw `returnType (${returnType}) can only be ${["row", "values"].join(" OR ")}`
785
+ if(returnType && !allowedReturnTypes.includes(returnType)){
786
+ throw `returnType (${returnType}) can only be ${allowedReturnTypes.join(" OR ")}`
686
787
  }
687
788
 
688
789
  const { testRule = false, returnQuery = false } = localParams || {};
@@ -715,7 +816,6 @@ export class ViewHandler {
715
816
 
716
817
  let q = await getNewQuery(this as unknown as TableHandler, filter, selectParams, param3_unused, tableRules, localParams),
717
818
  _query = makeQuery(this as unknown as TableHandler, q, undefined, undefined, selectParams);
718
- // console.log(_query)
719
819
 
720
820
  if(testRule){
721
821
  try {
@@ -727,8 +827,6 @@ export class ViewHandler {
727
827
  }
728
828
  }
729
829
 
730
- // console.log(_query);
731
-
732
830
  if(returnQuery) return (_query as unknown as any[]);
733
831
  if(["row", "value"].includes(returnType)) {
734
832
  return (this.t || this.db).oneOrNone(_query).then(data => {
@@ -926,21 +1024,23 @@ export class ViewHandler {
926
1024
 
927
1025
  const makeTableChain = (finalFilter: string) => {
928
1026
 
929
- let joinPaths: JoinInfo = [];
1027
+ let joinPaths: JoinInfo["paths"] = [];
1028
+ let expectOne = true;
930
1029
  tables.map((t2, depth) => {
931
1030
  let t1 = depth? tables[depth - 1] : thisTable;
932
1031
  let exactPaths = [t1, t2];
933
1032
 
934
1033
  if(!depth && eConfig.shortestJoin) exactPaths = undefined;
935
-
936
- joinPaths = joinPaths.concat(this.getJoins(t1, t2, exactPaths));
1034
+ const jinf= this.getJoins(t1, t2, exactPaths);
1035
+ expectOne = expectOne && jinf.expectOne
1036
+ joinPaths = joinPaths.concat(jinf.paths);
937
1037
  });
938
1038
 
939
- let r = makeJoin(joinPaths, 0);
940
- // console.log(r);
1039
+ let r = makeJoin({ paths: joinPaths, expectOne }, 0);
941
1040
  return r;
942
1041
 
943
- function makeJoin(paths: JoinInfo, ji: number) {
1042
+ function makeJoin(joinInfo: JoinInfo, ji: number) {
1043
+ const { paths } = joinInfo;
944
1044
  const jp = paths[ji];
945
1045
 
946
1046
  let prevTable = ji? paths[ji - 1].table : jp.source;
@@ -951,7 +1051,6 @@ export class ViewHandler {
951
1051
  let cond = `${jp.on.map(([c1, c2]) =>
952
1052
  `${prevTableAlias}.${asName(c1)} = ${tableAlias}.${asName(c2)}`).join("\n AND ")
953
1053
  }`;
954
- // console.log(join, cond);
955
1054
 
956
1055
  let j = `SELECT 1 \n` +
957
1056
  `FROM ${asName(table)} ${tableAlias} \n` +
@@ -966,7 +1065,7 @@ export class ViewHandler {
966
1065
  const indent = (a, b) => a;
967
1066
 
968
1067
  if(ji < paths.length - 1){
969
- j += `AND ${makeJoin(paths, ji + 1)} \n`
1068
+ j += `AND ${makeJoin(joinInfo, ji + 1)} \n`
970
1069
  }
971
1070
 
972
1071
  j = indent(j, ji + 1);
@@ -985,9 +1084,9 @@ export class ViewHandler {
985
1084
  tableAlias;
986
1085
 
987
1086
  /* Check if allowed to view data */
988
- if(localParams && localParams.socket && this.dboBuilder.publishParser){
1087
+ if(localParams && (localParams.socket || localParams.httpReq) && this.dboBuilder.publishParser){
989
1088
  /* Need to think about joining through dissallowed tables */
990
- t2Rules = await this.dboBuilder.publishParser.getValidatedRequestRuleWusr({ tableName: t2, command: "find", socket: localParams.socket });
1089
+ t2Rules = await this.dboBuilder.publishParser.getValidatedRequestRuleWusr({ tableName: t2, command: "find", localParams });
991
1090
  if(!t2Rules || !t2Rules.select) throw "Dissallowed";
992
1091
  ({ forcedFilter, filterFields } = t2Rules.select);
993
1092
  }
@@ -1001,13 +1100,13 @@ export class ViewHandler {
1001
1100
  addKeywords: false,
1002
1101
  tableAlias,
1003
1102
  localParams,
1004
- tableRule: tableRules
1103
+ tableRule: t2Rules //tableRules
1005
1104
  }))
1006
1105
  } catch(err) {
1007
1106
  // console.trace(err)
1008
1107
  throw "Issue with preparing $exists query for table " + t2 + "\n->" + JSON.stringify(err);
1009
1108
  }
1010
- // console.log(f2, finalWhere);
1109
+
1011
1110
  if(!isJoined){
1012
1111
  res = ` EXISTS (SELECT 1 \nFROM ${asName(t2)} \n${finalWhere? `WHERE ${finalWhere}` : ""}) `
1013
1112
  } else {
@@ -1117,7 +1216,6 @@ export class ViewHandler {
1117
1216
  return false;
1118
1217
  })
1119
1218
  }
1120
- // console.log(allowedSelect);
1121
1219
 
1122
1220
  /* Add remaining allowed fields */
1123
1221
  allowedSelect = allowedSelect.concat(
@@ -1169,7 +1267,7 @@ export class ViewHandler {
1169
1267
  pgp,
1170
1268
  select: allowedSelect
1171
1269
  });
1172
- // console.log({ f, q })
1270
+
1173
1271
  let templates: string[] = [q].filter(q=>q);
1174
1272
 
1175
1273
  if(existsCond) templates.push(existsCond);
@@ -1178,7 +1276,6 @@ export class ViewHandler {
1178
1276
  return templates.sort() /* sorted to ensure duplicate subscription channels are not created due to different condition order */
1179
1277
  .join(" AND \n");
1180
1278
 
1181
- // console.log(templates)
1182
1279
  // return templates; //pgp.as.format(template, data);
1183
1280
 
1184
1281
  /*
@@ -1268,7 +1365,7 @@ export class ViewHandler {
1268
1365
  if(!_ob || !_ob.length) return "";
1269
1366
 
1270
1367
  const validatedAggAliases = select.filter(s => s.type !== "joinedColumn").map(s => s.alias)
1271
- // console.log({ validatedAggAliases })
1368
+
1272
1369
  let bad_param = _ob.find(({ key }) =>
1273
1370
  !(validatedAggAliases || []).includes(key) &&
1274
1371
  (
@@ -1529,6 +1626,7 @@ export class TableHandler extends ViewHandler {
1529
1626
  batching: null
1530
1627
  };
1531
1628
  this.is_view = false;
1629
+ this.is_media = dboBuilder.prostgles.isMedia(this.name)
1532
1630
  }
1533
1631
 
1534
1632
  /* TO DO: Maybe finished query batching */
@@ -1641,7 +1739,7 @@ export class TableHandler extends ViewHandler {
1641
1739
  )
1642
1740
  )
1643
1741
  );
1644
- // console.log(queries)
1742
+
1645
1743
  return this.db.tx(t => {
1646
1744
  const _queries = queries.map(q => t.none(q as unknown as string))
1647
1745
  return t.batch(_queries)
@@ -1726,13 +1824,12 @@ export class TableHandler extends ViewHandler {
1726
1824
  if(unrecProps.length) throw "Unrecognised params in textPatch field: " + unrecProps.join(", ");
1727
1825
  patchedTextData.push({ ...d, fieldName: c.name });
1728
1826
  }
1729
- // console.log("update2", patchedTextData);
1730
1827
  });
1731
1828
 
1732
1829
  if(patchedTextData && patchedTextData.length){
1733
1830
  if(tableRules && !tableRules.select) throw "Select needs to be permitted to patch data";
1734
1831
  const rows = await this.find(filter, { select: patchedTextData.reduce((a, v) => ({ ...a, [v.fieldName]: 1 }), {}) }, null, tableRules);
1735
- // console.log(rows)
1832
+
1736
1833
  if(rows.length !== 1) {
1737
1834
  throw "Cannot patch data within a filter that affects more/less than 1 row";
1738
1835
  }
@@ -1761,10 +1858,9 @@ export class TableHandler extends ViewHandler {
1761
1858
  let qType = "none";
1762
1859
  if(returning){
1763
1860
  qType = multi? "any" : "one";
1764
- query += await this.prepareReturning(returning, this.parseFieldFilter(returningFields));
1861
+ query += this.makeReturnQuery(await this.prepareReturning(returning, this.parseFieldFilter(returningFields)));
1765
1862
  }
1766
1863
 
1767
- // console.log(query)
1768
1864
  if(returnQuery) return query as unknown as void;
1769
1865
  if(this.t){
1770
1866
  return this.t[qType](query).catch(err => makeErr(err, localParams));
@@ -1795,7 +1891,248 @@ export class TableHandler extends ViewHandler {
1795
1891
  return { data, allowedCols: this.columns.filter(c => dataKeys.includes(c.name)).map(c => c.name) }
1796
1892
  }
1797
1893
 
1798
- async insert(data: (object | object[]), param2?: InsertParams, param3_unused?, tableRules?: TableRule, localParams: LocalParams = null): Promise<any | any[] | boolean>{
1894
+
1895
+ private async insertDataParse(data: (AnyObject | AnyObject[]), param2?: InsertParams, param3_unused?, tableRules?: TableRule, _localParams: LocalParams = null): Promise<{
1896
+ data?: AnyObject | AnyObject[];
1897
+ insertResult?: AnyObject | AnyObject[];
1898
+ }>{
1899
+ const localParams = _localParams || {};
1900
+ const {dbTX} = localParams;
1901
+
1902
+ const isMultiInsert = Array.isArray(data);
1903
+ const getExtraKeys = d => Object.keys(d).filter(k => !this.columns.find(c => c.name === k));
1904
+
1905
+ /* Nested insert is not allowed for the file table */
1906
+ const isNestedInsert = this.is_media? false : (Array.isArray(data)? data : [data]).some(d => getExtraKeys(d).length);
1907
+
1908
+ /**
1909
+ * Make sure nested insert uses a transaction
1910
+ */
1911
+ if(isNestedInsert && (!this.t || !dbTX)){
1912
+ return {
1913
+ insertResult: await this.dboBuilder.getTX((dbTX) =>
1914
+ (dbTX[this.name] as TableHandler).insert(
1915
+ data,
1916
+ param2,
1917
+ param3_unused,
1918
+ tableRules,
1919
+ {dbTX, ...localParams}
1920
+ )
1921
+ )
1922
+ }
1923
+ }
1924
+
1925
+ const preValidate = tableRules?.insert?.preValidate,
1926
+ validate = tableRules?.insert?.validate;
1927
+
1928
+ let _data = await Promise.all((Array.isArray(data)? data : [data]).map(async row => {
1929
+ if(preValidate){
1930
+ row = await preValidate(row);
1931
+ }
1932
+
1933
+ const dataKeys = Object.keys(row);
1934
+ const extraKeys = getExtraKeys(row);
1935
+
1936
+ /* Upload file then continue insert */
1937
+ if(this.is_media){
1938
+ if(!this.dboBuilder.prostgles?.fileManager) throw "fileManager not set up";
1939
+ const { data, name } = row;
1940
+
1941
+ if(dataKeys.length !== 2) throw "Expecting only two properties: { name: string; data: File }";
1942
+
1943
+ // if(!Buffer.isBuffer(data)) throw "data is not of type Buffer"
1944
+ if(!data) throw "data not provided"
1945
+ if(typeof name !== "string"){
1946
+ throw "name is not of type string"
1947
+ }
1948
+
1949
+ const media_id = (await this.db.oneOrNone("SELECT gen_random_uuid() as name")).name;
1950
+ const type = await this.dboBuilder.prostgles.fileManager.getMIME(data, name)
1951
+ const media_name = `${media_id}.${type.ext}`;
1952
+ let media: Media = {
1953
+ id: media_id,
1954
+ name: media_name,
1955
+ original_name: name,
1956
+ extension: type.ext,
1957
+ content_type: type.mime
1958
+ }
1959
+
1960
+ if(validate){
1961
+ media = await validate(media);
1962
+ }
1963
+
1964
+ const _media: Media = await this.dboBuilder.prostgles.fileManager.uploadAsMedia({
1965
+ item: {
1966
+ data,
1967
+ name: media.name,
1968
+ content_type: media.content_type as any
1969
+ },
1970
+ // imageCompression: {
1971
+ // inside: {
1972
+ // width: 1100,
1973
+ // height: 630
1974
+ // }
1975
+ // }
1976
+ });
1977
+
1978
+ return {
1979
+ ...media,
1980
+ ..._media,
1981
+ };
1982
+
1983
+ /* Potentially a nested join */
1984
+ } else if(extraKeys.length){
1985
+
1986
+ /* Ensure we're using the same transaction */
1987
+ const _this = this.t? this : dbTX[this.name] as TableHandler;
1988
+
1989
+ let rootData = filterObj(data, null, extraKeys);
1990
+
1991
+ let insertedChildren: AnyObject[];
1992
+ let targetTableRules: TableRule;
1993
+
1994
+ if(validate){
1995
+ rootData = await validate(rootData);
1996
+ }
1997
+
1998
+ const fullRootResult = await _this.insert(rootData, { returning: "*" }, null, tableRules, localParams);
1999
+ let returnData: AnyObject;
2000
+ const returning = param2?.returning;
2001
+ if(returning){
2002
+ returnData = {}
2003
+ const returningItems = await this.prepareReturning(returning, this.parseFieldFilter(tableRules?.insert?.returningFields));
2004
+ returningItems.filter(s => s.selected).map(rs => {
2005
+ returnData[rs.alias] = fullRootResult[rs.alias];
2006
+ })
2007
+ }
2008
+
2009
+ await Promise.all(extraKeys.map(async targetTable => {
2010
+ const childDataItems = Array.isArray(row[targetTable])? row[targetTable] : [row[targetTable]];
2011
+ // console.log({childDataItems})
2012
+
2013
+ /* Must be allowed to insert into media table */
2014
+ const canInsert = async (tbl: string) => {
2015
+ const childRules = await this.dboBuilder.publishParser.getValidatedRequestRuleWusr({ tableName: tbl, command: "insert", localParams });
2016
+ if(!childRules || !childRules.insert) throw "Dissallowed nested insert into table " + childRules;
2017
+ return childRules;
2018
+ }
2019
+
2020
+ // console.log(JSON.stringify(this.dboBuilder.joinPaths, null, 2))
2021
+ const jp = this.dboBuilder.joinPaths.find(jp => jp.t1 === this.name && jp.t2 === targetTable);
2022
+ if(!jp) throw `Could not find a valid table for the nested data { ${targetTable} } `;
2023
+
2024
+ const childInsert = async (cdata, tableName) => {
2025
+ // console.log("childInsert", {data, tableName})
2026
+ if(!cdata || !dbTX[tableName] || !("insert" in dbTX[tableName])) throw "childInsertErr: Child table handler missing for: " + tableName;
2027
+
2028
+ const tableRules = await canInsert(tableName);
2029
+ return Promise.all(
2030
+ (Array.isArray(cdata)? cdata : [cdata])
2031
+ .map(m => (dbTX[tableName] as TableHandler)
2032
+ .insert(m, { returning: "*" }, null, tableRules, localParams)
2033
+ .catch(e => {
2034
+ console.trace({ childInsertErr: e })
2035
+ return Promise.reject({ childInsertErr: e });
2036
+ })
2037
+ )
2038
+ );
2039
+ }
2040
+
2041
+ const { path } = jp;
2042
+ const [tbl1, tbl2, tbl3] = path;
2043
+ targetTableRules = await canInsert(targetTable); // tbl3
2044
+
2045
+ const cols2 = this.dboBuilder.dbo[tbl2].columns || [];
2046
+ if(!this.dboBuilder.dbo[tbl2]) throw "Invalid/disallowed table: " + tbl2;
2047
+ const colsRefT1 = cols2?.filter(c => c.references?.cols.length === 1 && c.references?.ftable === tbl1);
2048
+
2049
+
2050
+ if(!path.length) {
2051
+ throw "Nested inserts join path not found for " + [this.name, targetTable];
2052
+ } else if(path.length === 2){
2053
+ if(targetTable !== tbl2) throw "Did not expect this";
2054
+
2055
+ if(!colsRefT1.length) throw `Target table ${tbl2} does not reference any columns from the root table ${this.name}. Cannot do nested insert`;
2056
+
2057
+ // console.log(JSON.stringify(colsRefT1, null, 2))
2058
+ insertedChildren = await childInsert(
2059
+ childDataItems.map(d => {
2060
+ let result = {...d};
2061
+ colsRefT1.map(col => {
2062
+ result[col.references.cols[0]] = fullRootResult[col.references.fcols[0]]
2063
+ })
2064
+ return result;
2065
+ }),
2066
+ targetTable
2067
+ );
2068
+
2069
+ } else if(path.length === 3){
2070
+ if(targetTable !== tbl3) throw "Did not expect this";
2071
+ const colsRefT3 = cols2?.filter(c => c.references?.cols.length === 1 && c.references?.ftable === tbl3);
2072
+ if(!colsRefT1.length || !colsRefT3.length) throw "Incorrectly referenced or missing columns for nested insert";
2073
+
2074
+ if(targetTable !== this.dboBuilder.prostgles.fileManager.tableName){
2075
+ throw "Only media allowed to have nested inserts more than 2 tables apart"
2076
+ }
2077
+
2078
+ /* We expect tbl2 to have only 2 columns (media_id and foreign_id) */
2079
+ if(!cols2 || cols2.find(c => !["media_id", "foreign_id"].includes(c.name))){
2080
+ throw "Second joining table not of expected format";
2081
+ }
2082
+
2083
+ insertedChildren = await childInsert(childDataItems, targetTable);
2084
+
2085
+ /* Insert in key_lookup table */
2086
+ await Promise.all(insertedChildren.map(async t3Child => {
2087
+ let tbl2Row = {};
2088
+
2089
+ colsRefT3.map(col => {
2090
+ tbl2Row[col.name] = t3Child[col.references.fcols[0]];
2091
+ })
2092
+ colsRefT1.map(col => {
2093
+ tbl2Row[col.name] = fullRootResult[col.references.fcols[0]];
2094
+ })
2095
+ // console.log({ rootResult, tbl2Row, t3Child, colsRefT3, colsRefT1, t: this.t?.ctx?.start });
2096
+
2097
+ await childInsert(tbl2Row, tbl2);//.then(() => {});
2098
+ }));
2099
+
2100
+ } else throw "Unexpected path for Nested inserts";
2101
+
2102
+ /* Return also the nested inserted data */
2103
+ if(targetTableRules && insertedChildren?.length && returning){
2104
+ const targetTableHandler = dbTX[targetTable] as TableHandler;
2105
+ const targetReturning = await targetTableHandler.prepareReturning("*", targetTableHandler.parseFieldFilter(targetTableRules?.insert?.returningFields));
2106
+ let clientTargetInserts = insertedChildren.map(d => {
2107
+ let _d = { ...d };
2108
+ let res = {};
2109
+ targetReturning.map(r => {
2110
+ res[r.alias] = _d[r.alias]
2111
+ });
2112
+ return res;
2113
+ });
2114
+
2115
+ returnData[targetTable] = clientTargetInserts.length === 1? clientTargetInserts[0] : clientTargetInserts;
2116
+ }
2117
+ }));
2118
+
2119
+ return returnData
2120
+ }
2121
+
2122
+ return row;
2123
+ }));
2124
+
2125
+ const result = isMultiInsert? _data : _data[0];
2126
+ let res = isNestedInsert?
2127
+ { insertResult: result } :
2128
+ { data: result };
2129
+
2130
+ return res;
2131
+ }
2132
+
2133
+ async insert(rowOrRows: (AnyObject | AnyObject[]), param2?: InsertParams, param3_unused?, tableRules?: TableRule, _localParams: LocalParams = null): Promise<any | any[] | boolean>{
2134
+ const localParams = _localParams || {};
2135
+ const {dbTX} = localParams
1799
2136
  try {
1800
2137
 
1801
2138
  const { returning, onConflictDoNothing, fixIssues = false } = param2 || {};
@@ -1803,8 +2140,8 @@ export class TableHandler extends ViewHandler {
1803
2140
 
1804
2141
  let returningFields: FieldFilter,
1805
2142
  forcedData: object,
1806
- validate: any,
1807
- preValidate: any,
2143
+ // validate: TableRule["insert"]["validate"],
2144
+ // preValidate: any,
1808
2145
  fields: FieldFilter;
1809
2146
 
1810
2147
  if(tableRules){
@@ -1812,17 +2149,17 @@ export class TableHandler extends ViewHandler {
1812
2149
  returningFields = tableRules.insert.returningFields;
1813
2150
  forcedData = tableRules.insert.forcedData;
1814
2151
  fields = tableRules.insert.fields;
1815
- validate = tableRules.insert.validate;
1816
- preValidate = tableRules.insert.preValidate;
2152
+ // validate = tableRules.insert.validate;
2153
+ // preValidate = tableRules.insert.preValidate;
1817
2154
 
1818
2155
  /* If no returning fields specified then take select fields as returning */
1819
- if(!returningFields) returningFields = get(tableRules, "select.fields");
1820
- if(!returningFields) returningFields = get(tableRules, "insert.fields");
2156
+ if(!returningFields) returningFields = get(tableRules, "select.fields") || get(tableRules, "insert.fields");
1821
2157
 
1822
2158
  if(!fields) throw ` invalid insert rule for ${this.name} -> fields missing `;
1823
2159
 
1824
2160
  /* Safely test publish rules */
1825
2161
  if(testRule){
2162
+ // if(this.is_media && tableRules.insert.preValidate) throw "Media table cannot have a preValidate. It already is used internally by prostgles for file upload";
1826
2163
  await this.validateViewRules(fields, null, returningFields, null, "insert");
1827
2164
  if(forcedData) {
1828
2165
  const keys = Object.keys(forcedData);
@@ -1836,6 +2173,7 @@ export class TableHandler extends ViewHandler {
1836
2173
  }
1837
2174
  }
1838
2175
  }
2176
+
1839
2177
  return true;
1840
2178
  }
1841
2179
  }
@@ -1844,43 +2182,50 @@ export class TableHandler extends ViewHandler {
1844
2182
  if(typeof onConflictDoNothing === "boolean" && onConflictDoNothing){
1845
2183
  conflict_query = " ON CONFLICT DO NOTHING ";
1846
2184
  }
2185
+
2186
+ if(param2){
2187
+ const good_params = ["returning", "multi", "onConflictDoNothing", "fixIssues"];
2188
+ const bad_params = Object.keys(param2).filter(k => !good_params.includes(k));
2189
+ if(bad_params && bad_params.length) throw "Invalid params: " + bad_params.join(", ") + " \n Expecting: " + good_params.join(", ");
2190
+ }
1847
2191
 
1848
- if(!data) data = {}; //throw "Provide data in param1";
1849
- let returningSelect = await this.prepareReturning(returning, this.parseFieldFilter(returningFields));
2192
+ if(!rowOrRows) rowOrRows = {}; //throw "Provide data in param1";
2193
+ let returningSelect = this.makeReturnQuery(await this.prepareReturning(returning, this.parseFieldFilter(returningFields)));
1850
2194
  const makeQuery = async (_row, isOne = false) => {
1851
2195
  let row = { ..._row };
1852
- if(preValidate){
1853
- row = await preValidate(row);
2196
+
2197
+ if(!isPojoObject(row)) {
2198
+ console.trace(row)
2199
+ throw "\ninvalid insert data provided -> " + JSON.stringify(row);
1854
2200
  }
1855
- if(!isPojoObject(row)) throw "\ninvalid insert data provided -> " + JSON.stringify(row);
1856
2201
 
1857
2202
  const { data, allowedCols } = this.validateNewData({ row, forcedData, allowedFields: fields, tableRules, fixIssues });
1858
2203
  let _data = { ...data };
1859
- if(validate){
1860
- _data = await validate(_data);
1861
- }
2204
+
1862
2205
  let insertQ = "";
1863
2206
  if(!Object.keys(_data).length) insertQ = `INSERT INTO ${asName(this.name)} DEFAULT VALUES `;
1864
2207
  else insertQ = this.colSet.getInsertQuery(_data, allowedCols) // pgp.helpers.insert(_data, columnSet);
1865
2208
  return insertQ + conflict_query + returningSelect;
1866
2209
  };
1867
-
1868
-
1869
- if(param2){
1870
- const good_params = ["returning", "multi", "onConflictDoNothing", "fixIssues"];
1871
- const bad_params = Object.keys(param2).filter(k => !good_params.includes(k));
1872
- if(bad_params && bad_params.length) throw "Invalid params: " + bad_params.join(", ") + " \n Expecting: " + good_params.join(", ");
1873
- }
1874
2210
 
1875
2211
  let query = "";
1876
2212
  let queryType = "none";
2213
+
2214
+ /**
2215
+ * If media it will: upload file and continue insert
2216
+ * If nested insert it will: make separate inserts and not continue main insert
2217
+ */
2218
+ const { data, insertResult } = await this.insertDataParse(rowOrRows, param2, param3_unused, tableRules, localParams);
2219
+
2220
+ if(insertResult) return insertResult;
2221
+
1877
2222
  if(Array.isArray(data)){
1878
2223
  // if(returning) throw "Sorry but [returning] is dissalowed for multi insert";
1879
2224
  let queries = await Promise.all(data.map(async p => {
1880
2225
  const q = await makeQuery(p);
1881
2226
  return q;
1882
2227
  }));
1883
- // console.log(queries)
2228
+
1884
2229
  query = pgp.helpers.concat(queries);
1885
2230
  if(returning) queryType = "many";
1886
2231
  } else {
@@ -1888,18 +2233,27 @@ export class TableHandler extends ViewHandler {
1888
2233
  if(returning) queryType = "one";
1889
2234
  }
1890
2235
 
1891
- // console.log(query);
1892
2236
  if(returnQuery) return query;
1893
- if(this.t) return this.t[queryType](query).catch(err => makeErr(err, localParams));
1894
- return this.db.tx(t => t[queryType](query)).catch(err => makeErr(err, localParams));
2237
+ let result;
2238
+
2239
+ // console.log(this.t?.ctx?.start, "insert in " + this.name, data);
2240
+
2241
+ const tx = dbTX?.[this.name]?.t || this.t;
2242
+ if(tx) {
2243
+ result = tx[queryType](query).catch(err => makeErr(err, localParams));
2244
+ } else {
2245
+ result = this.db.tx(t => t[queryType](query)).catch(err => makeErr(err, localParams));
2246
+ }
2247
+
2248
+ return result;
1895
2249
  } catch(e){
1896
2250
  if(localParams && localParams.testRule) throw e;
1897
2251
  throw { err: parseError(e), msg: `Issue with dbo.${this.name}.insert()` };
1898
- }
2252
+ }
1899
2253
  };
1900
2254
 
1901
- prepareReturning = async (returning: FieldFilter, allowedFields: string[], tableAlias?: string): Promise<string> => {
1902
- let result = "";
2255
+ prepareReturning = async (returning: FieldFilter, allowedFields: string[]): Promise<SelectItem[]> => {
2256
+ let result: SelectItem[] = [];
1903
2257
  if(returning){
1904
2258
  let sBuilder = new SelectItemBuilder({
1905
2259
  allFields: this.column_names.slice(0),
@@ -1910,13 +2264,16 @@ export class TableHandler extends ViewHandler {
1910
2264
  });
1911
2265
  await sBuilder.parseUserSelect(returning);
1912
2266
 
1913
- if(sBuilder.select.length) result = "RETURNING ";
1914
-
1915
- result += sBuilder.select.map(s => s.getQuery() + " AS " + asNameAlias(s.alias, tableAlias )).join(", ")
2267
+ return sBuilder.select;
1916
2268
  }
1917
2269
 
1918
2270
  return result;
1919
2271
  }
2272
+
2273
+ makeReturnQuery(items?: SelectItem[]){
2274
+ if(items?.length) return " RETURNING " + items.map(s => s.getQuery() + " AS " + asName(s.alias)).join(", ");
2275
+ return "";
2276
+ }
1920
2277
 
1921
2278
  async delete(filter?: Filter, params?: DeleteParams, param3_unused?, table_rules?: TableRule, localParams: LocalParams = null): Promise<any> { //{ socket, func, has_rules = false, socketDb } = {}
1922
2279
  try {
@@ -1972,7 +2329,7 @@ export class TableHandler extends ViewHandler {
1972
2329
  if(!returningFields) {
1973
2330
  throw "Returning dissallowed";
1974
2331
  }
1975
- _query += await this.prepareReturning(returning, this.parseFieldFilter(returningFields));
2332
+ _query += this.makeReturnQuery(await this.prepareReturning(returning, this.parseFieldFilter(returningFields)));
1976
2333
  }
1977
2334
 
1978
2335
  if(returnQuery) return _query;
@@ -2001,18 +2358,12 @@ export class TableHandler extends ViewHandler {
2001
2358
  return tblH.find(filter, { select: "", limit: 1 }, {}, table_rules, localParams)
2002
2359
  .then(exists => {
2003
2360
  if(exists && exists.length){
2004
- // console.log(filter, "exists");
2005
2361
  return tblH.update(filter, newData, params, table_rules, localParams);
2006
2362
  } else {
2007
- // console.log(filter, "existnts")
2008
2363
  return tblH.insert({ ...newData, ...filter }, params, null, table_rules, localParams);
2009
2364
  }
2010
2365
  });
2011
2366
  }
2012
- // .catch(existnts => {
2013
- // console.log(filter, "existnts")
2014
- // return this.insert({ ...filter, ...newData}, params);
2015
- // });
2016
2367
  } catch(e){
2017
2368
  if(localParams && localParams.testRule) throw e;
2018
2369
  throw { err: parseError(e), msg: `Issue with dbo.${this.name}.upsert()` };
@@ -2116,40 +2467,9 @@ export class TableHandler extends ViewHandler {
2116
2467
  }
2117
2468
 
2118
2469
  }
2119
- type TransactionHandler = {
2120
- (): Promise<TxHandler>
2121
- }
2122
- export interface TxHandler {
2123
- [key: string]: TableHandler | ViewHandler;
2124
- }
2125
- export type TxCB = {
2126
- (t: TxHandler): (any | void);
2127
- }
2128
- export type TX = {
2129
- (t: TxCB): Promise<(any | void)>;
2130
- }
2131
- // export type JoinMaker = (filter?: object, select?: FieldFilter, options?: SelectParams) => any;
2132
-
2133
- // export type TableJoin = {
2134
- // [key: string]: JoinMaker;
2135
- // }
2136
- // export type DbJoinMaker = {
2137
- // innerJoin: TableJoin;
2138
- // leftJoin: TableJoin;
2139
- // innerJoinOne: TableJoin;
2140
- // leftJoinOne: TableJoin;
2141
- // }
2142
-
2143
- // export type DbHandler = {
2144
- // [key: string]: TableHandler | ViewHandler;
2145
- // } & DbJoinMaker;
2146
-
2147
- export type DbHandlerTX = { [key: string]: TX } | DbHandler;
2148
2470
 
2149
2471
 
2150
2472
  import { JOIN_TYPES } from "./Prostgles";
2151
- import { type } from "os";
2152
- import { join } from "path";
2153
2473
 
2154
2474
  export class DboBuilder {
2155
2475
  tablesOrViews: TableOrViewInfo[];
@@ -2157,7 +2477,8 @@ export class DboBuilder {
2157
2477
  db: DB;
2158
2478
  schema: string = "public";
2159
2479
 
2160
- dbo: DbHandler | DbHandlerTX;
2480
+ // dbo: DbHandler | DbHandlerTX;
2481
+ dbo: DbHandler;
2161
2482
  pubSubManager: PubSubManager;
2162
2483
 
2163
2484
  pojoDefinitions: string[];
@@ -2177,8 +2498,8 @@ export class DboBuilder {
2177
2498
  private constructor(prostgles: Prostgles){
2178
2499
  this.prostgles = prostgles;
2179
2500
  this.db = this.prostgles.db;
2180
- this.schema = this.prostgles.schema || "public";
2181
- this.dbo = { };
2501
+ this.schema = this.prostgles.opts.schema || "public";
2502
+ this.dbo = { } as unknown as DbHandler;
2182
2503
  // this.joins = this.prostgles.joins;
2183
2504
 
2184
2505
  }
@@ -2186,7 +2507,7 @@ export class DboBuilder {
2186
2507
  private init = async () => {
2187
2508
  let onSchemaChange;
2188
2509
 
2189
- if(this.prostgles.watchSchema){
2510
+ if(this.prostgles.opts.watchSchema){
2190
2511
  onSchemaChange = (event: { command: string; query: string }) => {
2191
2512
  this.prostgles.onSchemaChange(event)
2192
2513
  }
@@ -2216,14 +2537,19 @@ export class DboBuilder {
2216
2537
  }
2217
2538
 
2218
2539
  async parseJoins(): Promise<JoinPaths> {
2219
- if(this.prostgles.joins){
2220
- let _joins = await this.prostgles.joins;
2540
+ if(this.prostgles.opts.joins){
2541
+ let _joins = await this.prostgles.opts.joins;
2542
+ let inferredJoins = await getInferredJoins(this.db, this.prostgles.opts.schema);
2221
2543
  if(typeof _joins === "string" && _joins === "inferred"){
2222
- _joins = await getInferredJoins(this.db, this.prostgles.schema);
2544
+ _joins = inferredJoins
2545
+ /* If joins are specified then include inferred joins except the explicit tables */
2546
+ } else if(Array.isArray(_joins)){
2547
+ const joinTables = _joins.map(j => j.tables).flat();
2548
+ _joins = _joins.concat(inferredJoins.filter(j => !j.tables.find(t => joinTables.includes(t))))
2223
2549
  }
2224
2550
  let joins = JSON.parse(JSON.stringify(_joins)) as Join[];
2225
2551
  this.joins = joins;
2226
- // console.log(joins);
2552
+
2227
2553
  // Validate joins
2228
2554
  try {
2229
2555
  // 1 find duplicates
@@ -2302,9 +2628,6 @@ export class DboBuilder {
2302
2628
  }
2303
2629
  });
2304
2630
  });
2305
- // console.log(this.joinPaths)
2306
- // console.log(888, this.prostgles.joins);
2307
- // console.log(this.joinGraph, findShortestPath(this.joinGraph, "colors", "drawings"));
2308
2631
  }
2309
2632
 
2310
2633
  return this.joinPaths;
@@ -2314,7 +2637,7 @@ export class DboBuilder {
2314
2637
 
2315
2638
  }
2316
2639
 
2317
- async build(): Promise<DbHandler | DbHandlerTX>{
2640
+ async build(): Promise<DbHandler>{
2318
2641
 
2319
2642
  // await this.pubSubManager.init()
2320
2643
 
@@ -2350,7 +2673,6 @@ export type TxCB = {
2350
2673
  i18nDef += ` [key in ${tov.columns.map(c => JSON.stringify(c.name)).join(" | ")}]: { [lang_id in keyof LANG_IDS]: string }; \n`;
2351
2674
  i18nDef += ` }; \n`;
2352
2675
 
2353
- // console.log("dboInit", tov.name, tov.columns.map(c => c.name))
2354
2676
  const filterKeywords = Object.values(this.prostgles.keywords);
2355
2677
  const $filterCol = tov.columns.find(c => filterKeywords.includes(c.name));
2356
2678
  if($filterCol){
@@ -2421,13 +2743,88 @@ export type TxCB = {
2421
2743
  }
2422
2744
 
2423
2745
 
2424
- if(this.prostgles.transactions){
2746
+ if(this.prostgles.opts.transactions){
2425
2747
  let txKey = "tx";
2426
- if(typeof this.prostgles.transactions === "string") txKey = this.prostgles.transactions;
2748
+ if(typeof this.prostgles.opts.transactions === "string") txKey = this.prostgles.opts.transactions;
2427
2749
  this.dboDefinition += ` ${txKey}: (t: TxCB) => Promise<any | void> ;\n`;
2428
2750
 
2429
- this.dbo[txKey] = (cb: TxCB) => this.getTX(cb);
2751
+ (this.dbo[txKey] as TX) = (cb: TxCB) => this.getTX(cb);
2752
+ }
2753
+
2754
+ if(!this.dbo.sql){
2755
+
2756
+ let needType = true;// this.publishRawSQL && typeof this.publishRawSQL === "function";
2757
+ let DATA_TYPES = !needType? [] : await this.db.any("SELECT oid, typname FROM pg_type");
2758
+ let USER_TABLES = !needType? [] : await this.db.any("SELECT relid, relname FROM pg_catalog.pg_statio_user_tables");
2759
+
2760
+ this.dbo.sql = async (query: string, params: any, options: SQLOptions, localParams?: LocalParams) => {
2761
+ const canRunSQL = async (localParams: LocalParams) => {
2762
+ if(!localParams) return true;
2763
+
2764
+ const { socket } = localParams;
2765
+ const publishParams = await this.prostgles.publishParser.getPublishParams({ socket });
2766
+ let res = await this.prostgles.opts.publishRawSQL(publishParams);
2767
+ return Boolean(res && typeof res === "boolean" || res === "*");
2768
+ }
2769
+
2770
+ if(!(await canRunSQL(localParams))) throw "Not allowed to run SQL";
2771
+
2772
+ const { returnType }: SQLOptions = options || ({} as any);
2773
+ const { socket } = localParams || {};
2774
+
2775
+ if(returnType === "noticeSubscription"){
2776
+ if(!socket) throw "Only allowed with client socket"
2777
+ return await this.prostgles.dbEventsManager.addNotice(socket);
2778
+ } else if(returnType === "statement"){
2779
+ try {
2780
+ return pgp.as.format(query, params);
2781
+ } catch (err){
2782
+ throw err.toString();
2783
+ }
2784
+ } else if(this.db) {
2785
+
2786
+ let qres = await this.db.result(query, params)
2787
+ const { duration, fields, rows, command } = qres;
2788
+
2789
+ if(command === "LISTEN"){
2790
+ if(!socket) throw "Only allowed with client socket"
2791
+ return await this.prostgles.dbEventsManager.addNotify(query, socket);
2792
+
2793
+ } else if(returnType === "rows") {
2794
+ return rows;
2795
+
2796
+ } else if(returnType === "row") {
2797
+ return rows[0];
2798
+
2799
+ } else if(returnType === "value") {
2800
+ return Object.values(rows?.[0] || {})?.[0];
2801
+
2802
+ } else if(returnType === "values") {
2803
+ return rows.map(r => Object.values(r[0]));
2804
+
2805
+ } else {
2806
+ if(fields && DATA_TYPES.length){
2807
+ qres.fields = fields.map(f => {
2808
+ const dataType = DATA_TYPES.find(dt => +dt.oid === +f.dataTypeID),
2809
+ tableName = USER_TABLES.find(t => +t.relid === +f.tableID),
2810
+ { name } = f;
2811
+
2812
+ return {
2813
+ ...f,
2814
+ ...(dataType? { dataType: dataType.typname } : {}),
2815
+ ...(tableName? { tableName: tableName.relname } : {}),
2816
+ }
2817
+ });
2818
+ }
2819
+ return qres;
2820
+ }
2821
+
2822
+ } else console.error("db missing");
2823
+ }
2824
+ } else {
2825
+ console.warn(`Could not create dbo.sql handler because there is already a table named "sql"`)
2430
2826
  }
2827
+
2431
2828
  this.dboDefinition += "};\n";
2432
2829
 
2433
2830
  this.tsTypesDefinition = [
@@ -2447,15 +2844,23 @@ export type TxCB = {
2447
2844
 
2448
2845
  getTX = (dbTX: TxCB) => {
2449
2846
  return this.db.tx((t) => {
2450
- let txDB = {};
2847
+ let txDB: TxHandler = {};
2451
2848
  this.tablesOrViews.map(tov => {
2452
2849
  if(tov.is_view){
2850
+
2453
2851
  txDB[tov.name] = new ViewHandler(this.db, tov, this.pubSubManager, this, t, this.joinPaths);
2454
2852
  } else {
2455
2853
  txDB[tov.name] = new TableHandler(this.db, tov, this.pubSubManager, this, t, this.joinPaths);
2854
+
2855
+ /**
2856
+ * Pass only the transaction object to ensure consistency
2857
+ */
2858
+ // txDB[tov.name] = new ViewHandler(t, tov, this.pubSubManager, this, t, this.joinPaths);
2859
+ // } else {
2860
+ // txDB[tov.name] = new TableHandler(t as any, tov, this.pubSubManager, this, t, this.joinPaths);
2456
2861
  }
2457
2862
  });
2458
- return dbTX(txDB);
2863
+ return dbTX(txDB, t);
2459
2864
  });
2460
2865
  }
2461
2866
  }
@@ -2888,6 +3293,6 @@ async function getInferredJoins(db: DB, schema: string = "public"): Promise<Join
2888
3293
  })
2889
3294
  }
2890
3295
  });
2891
- // console.log(joins);
3296
+
2892
3297
  return joins;
2893
3298
  }