prostgles-server 1.5.119 → 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 +53 -28
  2. package/dist/DboBuilder.d.ts.map +1 -1
  3. package/dist/DboBuilder.js +432 -113
  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 +163 -78
  10. package/dist/Prostgles.d.ts.map +1 -1
  11. package/dist/Prostgles.js +241 -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 +581 -175
  22. package/lib/FileManager.ts +546 -0
  23. package/lib/Prostgles.ts +424 -252
  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 +83 -62
  31. package/tests/client/package.json +3 -3
  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 +43 -1
  416. package/tests/isomorphic_queries.ts +33 -2
  417. package/tests/server/DBoGenerated.d.ts +192 -0
  418. package/tests/server/index.js +64 -26
  419. package/tests/server/index.ts +64 -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,19 +565,44 @@ 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(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
 
503
603
  // TODO: fix renamed table trigger problem
504
604
 
505
- async getColumns(tableRules?: TableRule, localParams?: LocalParams): Promise<ValidatedColumnInfo[]> {
605
+ async getColumns(lang?: string, param2?, param3?, tableRules?: TableRule, localParams?: LocalParams): Promise<ValidatedColumnInfo[]> {
506
606
 
507
607
  try {
508
608
  const p = this.getValidatedRules(tableRules, localParams);
@@ -510,18 +610,35 @@ export class ViewHandler {
510
610
  if(!p.select.getColumns) throw "Not allowed";
511
611
 
512
612
  // console.log("getColumns", this.name, this.columns.map(c => c.name))
513
- return this.columns.map(c => ({
514
- ...c,
515
- tsDataType: postgresToTsType(c.udt_name),
516
- insert: Boolean(p.insert && p.insert.fields && p.insert.fields.includes(c.name)),
517
- select: Boolean(p.select && p.select.fields && p.select.fields.includes(c.name)),
518
- filter: Boolean(p.select && p.select.filterFields && p.select.filterFields.includes(c.name)),
519
- update: Boolean(p.update && p.update.fields && p.update.fields.includes(c.name)),
520
- delete: Boolean(p.delete && p.delete.filterFields && p.delete.filterFields.includes(c.name)),
521
- }));
613
+ let _lang = lang;
614
+ return this.columns.map(c => {
615
+ let label = c.comment || c.name;
616
+ const iConf = this.dboBuilder.prostgles?.opts?.i18n?.column_labels?.[this.name]?.[c.name];
617
+ const fallbackLang = this.dboBuilder.prostgles?.opts?.i18n?.fallbackLang;
618
+ _lang = _lang || fallbackLang as string;
619
+
620
+ if((lang || fallbackLang) && iConf){
621
+ let langLabel;
622
+ if(lang) langLabel = iConf[lang];
623
+ if(!langLabel && fallbackLang) langLabel = iConf[fallbackLang];
624
+ label = langLabel || label;
625
+ }
626
+
627
+ return {
628
+ ...c,
629
+ label,
630
+ tsDataType: postgresToTsType(c.udt_name),
631
+ insert: Boolean(p.insert && p.insert.fields && p.insert.fields.includes(c.name)),
632
+ select: Boolean(p.select && p.select.fields && p.select.fields.includes(c.name)),
633
+ filter: Boolean(p.select && p.select.filterFields && p.select.filterFields.includes(c.name)),
634
+ update: Boolean(p.update && p.update.fields && p.update.fields.includes(c.name)),
635
+ delete: Boolean(p.delete && p.delete.filterFields && p.delete.filterFields.includes(c.name)),
636
+ }
637
+ });
522
638
 
523
639
  } catch(e){
524
- throw "Something went wrong in " + `db.${this.name}.getColumns()`
640
+ console.trace(e);
641
+ throw "Something went wrong in " + `db.${this.name}.getColumns()`;
525
642
  }
526
643
  }
527
644
 
@@ -663,9 +780,10 @@ export class ViewHandler {
663
780
  async find(filter?: Filter, selectParams?: SelectParams , param3_unused = null, tableRules?: TableRule, localParams?: LocalParams): Promise<any[]>{
664
781
  try {
665
782
  filter = filter || {};
783
+ const allowedReturnTypes: Array<SelectParams["returnType"]> = ["row", "value", "values"]
666
784
  const { returnType } = selectParams || {};
667
- if(returnType && !["row", "value", "values"].includes(returnType)){
668
- 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 ")}`
669
787
  }
670
788
 
671
789
  const { testRule = false, returnQuery = false } = localParams || {};
@@ -698,7 +816,6 @@ export class ViewHandler {
698
816
 
699
817
  let q = await getNewQuery(this as unknown as TableHandler, filter, selectParams, param3_unused, tableRules, localParams),
700
818
  _query = makeQuery(this as unknown as TableHandler, q, undefined, undefined, selectParams);
701
- // console.log(_query)
702
819
 
703
820
  if(testRule){
704
821
  try {
@@ -710,8 +827,6 @@ export class ViewHandler {
710
827
  }
711
828
  }
712
829
 
713
- // console.log(_query);
714
-
715
830
  if(returnQuery) return (_query as unknown as any[]);
716
831
  if(["row", "value"].includes(returnType)) {
717
832
  return (this.t || this.db).oneOrNone(_query).then(data => {
@@ -909,21 +1024,23 @@ export class ViewHandler {
909
1024
 
910
1025
  const makeTableChain = (finalFilter: string) => {
911
1026
 
912
- let joinPaths: JoinInfo = [];
1027
+ let joinPaths: JoinInfo["paths"] = [];
1028
+ let expectOne = true;
913
1029
  tables.map((t2, depth) => {
914
1030
  let t1 = depth? tables[depth - 1] : thisTable;
915
1031
  let exactPaths = [t1, t2];
916
1032
 
917
1033
  if(!depth && eConfig.shortestJoin) exactPaths = undefined;
918
-
919
- 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);
920
1037
  });
921
1038
 
922
- let r = makeJoin(joinPaths, 0);
923
- // console.log(r);
1039
+ let r = makeJoin({ paths: joinPaths, expectOne }, 0);
924
1040
  return r;
925
1041
 
926
- function makeJoin(paths: JoinInfo, ji: number) {
1042
+ function makeJoin(joinInfo: JoinInfo, ji: number) {
1043
+ const { paths } = joinInfo;
927
1044
  const jp = paths[ji];
928
1045
 
929
1046
  let prevTable = ji? paths[ji - 1].table : jp.source;
@@ -934,7 +1051,6 @@ export class ViewHandler {
934
1051
  let cond = `${jp.on.map(([c1, c2]) =>
935
1052
  `${prevTableAlias}.${asName(c1)} = ${tableAlias}.${asName(c2)}`).join("\n AND ")
936
1053
  }`;
937
- // console.log(join, cond);
938
1054
 
939
1055
  let j = `SELECT 1 \n` +
940
1056
  `FROM ${asName(table)} ${tableAlias} \n` +
@@ -949,7 +1065,7 @@ export class ViewHandler {
949
1065
  const indent = (a, b) => a;
950
1066
 
951
1067
  if(ji < paths.length - 1){
952
- j += `AND ${makeJoin(paths, ji + 1)} \n`
1068
+ j += `AND ${makeJoin(joinInfo, ji + 1)} \n`
953
1069
  }
954
1070
 
955
1071
  j = indent(j, ji + 1);
@@ -968,9 +1084,9 @@ export class ViewHandler {
968
1084
  tableAlias;
969
1085
 
970
1086
  /* Check if allowed to view data */
971
- if(localParams && localParams.socket && this.dboBuilder.publishParser){
1087
+ if(localParams && (localParams.socket || localParams.httpReq) && this.dboBuilder.publishParser){
972
1088
  /* Need to think about joining through dissallowed tables */
973
- 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 });
974
1090
  if(!t2Rules || !t2Rules.select) throw "Dissallowed";
975
1091
  ({ forcedFilter, filterFields } = t2Rules.select);
976
1092
  }
@@ -984,13 +1100,13 @@ export class ViewHandler {
984
1100
  addKeywords: false,
985
1101
  tableAlias,
986
1102
  localParams,
987
- tableRule: tableRules
1103
+ tableRule: t2Rules //tableRules
988
1104
  }))
989
1105
  } catch(err) {
990
1106
  // console.trace(err)
991
1107
  throw "Issue with preparing $exists query for table " + t2 + "\n->" + JSON.stringify(err);
992
1108
  }
993
- // console.log(f2, finalWhere);
1109
+
994
1110
  if(!isJoined){
995
1111
  res = ` EXISTS (SELECT 1 \nFROM ${asName(t2)} \n${finalWhere? `WHERE ${finalWhere}` : ""}) `
996
1112
  } else {
@@ -1100,7 +1216,6 @@ export class ViewHandler {
1100
1216
  return false;
1101
1217
  })
1102
1218
  }
1103
- // console.log(allowedSelect);
1104
1219
 
1105
1220
  /* Add remaining allowed fields */
1106
1221
  allowedSelect = allowedSelect.concat(
@@ -1152,7 +1267,7 @@ export class ViewHandler {
1152
1267
  pgp,
1153
1268
  select: allowedSelect
1154
1269
  });
1155
- // console.log({ f, q })
1270
+
1156
1271
  let templates: string[] = [q].filter(q=>q);
1157
1272
 
1158
1273
  if(existsCond) templates.push(existsCond);
@@ -1161,7 +1276,6 @@ export class ViewHandler {
1161
1276
  return templates.sort() /* sorted to ensure duplicate subscription channels are not created due to different condition order */
1162
1277
  .join(" AND \n");
1163
1278
 
1164
- // console.log(templates)
1165
1279
  // return templates; //pgp.as.format(template, data);
1166
1280
 
1167
1281
  /*
@@ -1251,7 +1365,7 @@ export class ViewHandler {
1251
1365
  if(!_ob || !_ob.length) return "";
1252
1366
 
1253
1367
  const validatedAggAliases = select.filter(s => s.type !== "joinedColumn").map(s => s.alias)
1254
- // console.log({ validatedAggAliases })
1368
+
1255
1369
  let bad_param = _ob.find(({ key }) =>
1256
1370
  !(validatedAggAliases || []).includes(key) &&
1257
1371
  (
@@ -1512,6 +1626,7 @@ export class TableHandler extends ViewHandler {
1512
1626
  batching: null
1513
1627
  };
1514
1628
  this.is_view = false;
1629
+ this.is_media = dboBuilder.prostgles.isMedia(this.name)
1515
1630
  }
1516
1631
 
1517
1632
  /* TO DO: Maybe finished query batching */
@@ -1624,7 +1739,7 @@ export class TableHandler extends ViewHandler {
1624
1739
  )
1625
1740
  )
1626
1741
  );
1627
- // console.log(queries)
1742
+
1628
1743
  return this.db.tx(t => {
1629
1744
  const _queries = queries.map(q => t.none(q as unknown as string))
1630
1745
  return t.batch(_queries)
@@ -1709,13 +1824,12 @@ export class TableHandler extends ViewHandler {
1709
1824
  if(unrecProps.length) throw "Unrecognised params in textPatch field: " + unrecProps.join(", ");
1710
1825
  patchedTextData.push({ ...d, fieldName: c.name });
1711
1826
  }
1712
- // console.log("update2", patchedTextData);
1713
1827
  });
1714
1828
 
1715
1829
  if(patchedTextData && patchedTextData.length){
1716
1830
  if(tableRules && !tableRules.select) throw "Select needs to be permitted to patch data";
1717
1831
  const rows = await this.find(filter, { select: patchedTextData.reduce((a, v) => ({ ...a, [v.fieldName]: 1 }), {}) }, null, tableRules);
1718
- // console.log(rows)
1832
+
1719
1833
  if(rows.length !== 1) {
1720
1834
  throw "Cannot patch data within a filter that affects more/less than 1 row";
1721
1835
  }
@@ -1744,10 +1858,9 @@ export class TableHandler extends ViewHandler {
1744
1858
  let qType = "none";
1745
1859
  if(returning){
1746
1860
  qType = multi? "any" : "one";
1747
- query += await this.prepareReturning(returning, this.parseFieldFilter(returningFields));
1861
+ query += this.makeReturnQuery(await this.prepareReturning(returning, this.parseFieldFilter(returningFields)));
1748
1862
  }
1749
1863
 
1750
- // console.log(query)
1751
1864
  if(returnQuery) return query as unknown as void;
1752
1865
  if(this.t){
1753
1866
  return this.t[qType](query).catch(err => makeErr(err, localParams));
@@ -1778,7 +1891,248 @@ export class TableHandler extends ViewHandler {
1778
1891
  return { data, allowedCols: this.columns.filter(c => dataKeys.includes(c.name)).map(c => c.name) }
1779
1892
  }
1780
1893
 
1781
- 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
1782
2136
  try {
1783
2137
 
1784
2138
  const { returning, onConflictDoNothing, fixIssues = false } = param2 || {};
@@ -1786,8 +2140,8 @@ export class TableHandler extends ViewHandler {
1786
2140
 
1787
2141
  let returningFields: FieldFilter,
1788
2142
  forcedData: object,
1789
- validate: any,
1790
- preValidate: any,
2143
+ // validate: TableRule["insert"]["validate"],
2144
+ // preValidate: any,
1791
2145
  fields: FieldFilter;
1792
2146
 
1793
2147
  if(tableRules){
@@ -1795,17 +2149,17 @@ export class TableHandler extends ViewHandler {
1795
2149
  returningFields = tableRules.insert.returningFields;
1796
2150
  forcedData = tableRules.insert.forcedData;
1797
2151
  fields = tableRules.insert.fields;
1798
- validate = tableRules.insert.validate;
1799
- preValidate = tableRules.insert.preValidate;
2152
+ // validate = tableRules.insert.validate;
2153
+ // preValidate = tableRules.insert.preValidate;
1800
2154
 
1801
2155
  /* If no returning fields specified then take select fields as returning */
1802
- if(!returningFields) returningFields = get(tableRules, "select.fields");
1803
- if(!returningFields) returningFields = get(tableRules, "insert.fields");
2156
+ if(!returningFields) returningFields = get(tableRules, "select.fields") || get(tableRules, "insert.fields");
1804
2157
 
1805
2158
  if(!fields) throw ` invalid insert rule for ${this.name} -> fields missing `;
1806
2159
 
1807
2160
  /* Safely test publish rules */
1808
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";
1809
2163
  await this.validateViewRules(fields, null, returningFields, null, "insert");
1810
2164
  if(forcedData) {
1811
2165
  const keys = Object.keys(forcedData);
@@ -1819,6 +2173,7 @@ export class TableHandler extends ViewHandler {
1819
2173
  }
1820
2174
  }
1821
2175
  }
2176
+
1822
2177
  return true;
1823
2178
  }
1824
2179
  }
@@ -1827,43 +2182,50 @@ export class TableHandler extends ViewHandler {
1827
2182
  if(typeof onConflictDoNothing === "boolean" && onConflictDoNothing){
1828
2183
  conflict_query = " ON CONFLICT DO NOTHING ";
1829
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
+ }
1830
2191
 
1831
- if(!data) data = {}; //throw "Provide data in param1";
1832
- 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)));
1833
2194
  const makeQuery = async (_row, isOne = false) => {
1834
2195
  let row = { ..._row };
1835
- if(preValidate){
1836
- row = await preValidate(row);
2196
+
2197
+ if(!isPojoObject(row)) {
2198
+ console.trace(row)
2199
+ throw "\ninvalid insert data provided -> " + JSON.stringify(row);
1837
2200
  }
1838
- if(!isPojoObject(row)) throw "\ninvalid insert data provided -> " + JSON.stringify(row);
1839
2201
 
1840
2202
  const { data, allowedCols } = this.validateNewData({ row, forcedData, allowedFields: fields, tableRules, fixIssues });
1841
2203
  let _data = { ...data };
1842
- if(validate){
1843
- _data = await validate(_data);
1844
- }
2204
+
1845
2205
  let insertQ = "";
1846
2206
  if(!Object.keys(_data).length) insertQ = `INSERT INTO ${asName(this.name)} DEFAULT VALUES `;
1847
2207
  else insertQ = this.colSet.getInsertQuery(_data, allowedCols) // pgp.helpers.insert(_data, columnSet);
1848
2208
  return insertQ + conflict_query + returningSelect;
1849
2209
  };
1850
-
1851
-
1852
- if(param2){
1853
- const good_params = ["returning", "multi", "onConflictDoNothing", "fixIssues"];
1854
- const bad_params = Object.keys(param2).filter(k => !good_params.includes(k));
1855
- if(bad_params && bad_params.length) throw "Invalid params: " + bad_params.join(", ") + " \n Expecting: " + good_params.join(", ");
1856
- }
1857
2210
 
1858
2211
  let query = "";
1859
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
+
1860
2222
  if(Array.isArray(data)){
1861
2223
  // if(returning) throw "Sorry but [returning] is dissalowed for multi insert";
1862
2224
  let queries = await Promise.all(data.map(async p => {
1863
2225
  const q = await makeQuery(p);
1864
2226
  return q;
1865
2227
  }));
1866
- // console.log(queries)
2228
+
1867
2229
  query = pgp.helpers.concat(queries);
1868
2230
  if(returning) queryType = "many";
1869
2231
  } else {
@@ -1871,18 +2233,27 @@ export class TableHandler extends ViewHandler {
1871
2233
  if(returning) queryType = "one";
1872
2234
  }
1873
2235
 
1874
- // console.log(query);
1875
2236
  if(returnQuery) return query;
1876
- if(this.t) return this.t[queryType](query).catch(err => makeErr(err, localParams));
1877
- 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;
1878
2249
  } catch(e){
1879
2250
  if(localParams && localParams.testRule) throw e;
1880
2251
  throw { err: parseError(e), msg: `Issue with dbo.${this.name}.insert()` };
1881
- }
2252
+ }
1882
2253
  };
1883
2254
 
1884
- prepareReturning = async (returning: FieldFilter, allowedFields: string[], tableAlias?: string): Promise<string> => {
1885
- let result = "";
2255
+ prepareReturning = async (returning: FieldFilter, allowedFields: string[]): Promise<SelectItem[]> => {
2256
+ let result: SelectItem[] = [];
1886
2257
  if(returning){
1887
2258
  let sBuilder = new SelectItemBuilder({
1888
2259
  allFields: this.column_names.slice(0),
@@ -1893,13 +2264,16 @@ export class TableHandler extends ViewHandler {
1893
2264
  });
1894
2265
  await sBuilder.parseUserSelect(returning);
1895
2266
 
1896
- if(sBuilder.select.length) result = "RETURNING ";
1897
-
1898
- result += sBuilder.select.map(s => s.getQuery() + " AS " + asNameAlias(s.alias, tableAlias )).join(", ")
2267
+ return sBuilder.select;
1899
2268
  }
1900
2269
 
1901
2270
  return result;
1902
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
+ }
1903
2277
 
1904
2278
  async delete(filter?: Filter, params?: DeleteParams, param3_unused?, table_rules?: TableRule, localParams: LocalParams = null): Promise<any> { //{ socket, func, has_rules = false, socketDb } = {}
1905
2279
  try {
@@ -1955,7 +2329,7 @@ export class TableHandler extends ViewHandler {
1955
2329
  if(!returningFields) {
1956
2330
  throw "Returning dissallowed";
1957
2331
  }
1958
- _query += await this.prepareReturning(returning, this.parseFieldFilter(returningFields));
2332
+ _query += this.makeReturnQuery(await this.prepareReturning(returning, this.parseFieldFilter(returningFields)));
1959
2333
  }
1960
2334
 
1961
2335
  if(returnQuery) return _query;
@@ -1984,18 +2358,12 @@ export class TableHandler extends ViewHandler {
1984
2358
  return tblH.find(filter, { select: "", limit: 1 }, {}, table_rules, localParams)
1985
2359
  .then(exists => {
1986
2360
  if(exists && exists.length){
1987
- // console.log(filter, "exists");
1988
2361
  return tblH.update(filter, newData, params, table_rules, localParams);
1989
2362
  } else {
1990
- // console.log(filter, "existnts")
1991
2363
  return tblH.insert({ ...newData, ...filter }, params, null, table_rules, localParams);
1992
2364
  }
1993
2365
  });
1994
2366
  }
1995
- // .catch(existnts => {
1996
- // console.log(filter, "existnts")
1997
- // return this.insert({ ...filter, ...newData}, params);
1998
- // });
1999
2367
  } catch(e){
2000
2368
  if(localParams && localParams.testRule) throw e;
2001
2369
  throw { err: parseError(e), msg: `Issue with dbo.${this.name}.upsert()` };
@@ -2099,40 +2467,9 @@ export class TableHandler extends ViewHandler {
2099
2467
  }
2100
2468
 
2101
2469
  }
2102
- type TransactionHandler = {
2103
- (): Promise<TxHandler>
2104
- }
2105
- export interface TxHandler {
2106
- [key: string]: TableHandler | ViewHandler;
2107
- }
2108
- export type TxCB = {
2109
- (t: TxHandler): (any | void);
2110
- }
2111
- export type TX = {
2112
- (t: TxCB): Promise<(any | void)>;
2113
- }
2114
- // export type JoinMaker = (filter?: object, select?: FieldFilter, options?: SelectParams) => any;
2115
-
2116
- // export type TableJoin = {
2117
- // [key: string]: JoinMaker;
2118
- // }
2119
- // export type DbJoinMaker = {
2120
- // innerJoin: TableJoin;
2121
- // leftJoin: TableJoin;
2122
- // innerJoinOne: TableJoin;
2123
- // leftJoinOne: TableJoin;
2124
- // }
2125
-
2126
- // export type DbHandler = {
2127
- // [key: string]: TableHandler | ViewHandler;
2128
- // } & DbJoinMaker;
2129
-
2130
- export type DbHandlerTX = { [key: string]: TX } | DbHandler;
2131
2470
 
2132
2471
 
2133
2472
  import { JOIN_TYPES } from "./Prostgles";
2134
- import { type } from "os";
2135
- import { join } from "path";
2136
2473
 
2137
2474
  export class DboBuilder {
2138
2475
  tablesOrViews: TableOrViewInfo[];
@@ -2140,7 +2477,8 @@ export class DboBuilder {
2140
2477
  db: DB;
2141
2478
  schema: string = "public";
2142
2479
 
2143
- dbo: DbHandler | DbHandlerTX;
2480
+ // dbo: DbHandler | DbHandlerTX;
2481
+ dbo: DbHandler;
2144
2482
  pubSubManager: PubSubManager;
2145
2483
 
2146
2484
  pojoDefinitions: string[];
@@ -2160,8 +2498,8 @@ export class DboBuilder {
2160
2498
  private constructor(prostgles: Prostgles){
2161
2499
  this.prostgles = prostgles;
2162
2500
  this.db = this.prostgles.db;
2163
- this.schema = this.prostgles.schema || "public";
2164
- this.dbo = { };
2501
+ this.schema = this.prostgles.opts.schema || "public";
2502
+ this.dbo = { } as unknown as DbHandler;
2165
2503
  // this.joins = this.prostgles.joins;
2166
2504
 
2167
2505
  }
@@ -2169,7 +2507,7 @@ export class DboBuilder {
2169
2507
  private init = async () => {
2170
2508
  let onSchemaChange;
2171
2509
 
2172
- if(this.prostgles.watchSchema){
2510
+ if(this.prostgles.opts.watchSchema){
2173
2511
  onSchemaChange = (event: { command: string; query: string }) => {
2174
2512
  this.prostgles.onSchemaChange(event)
2175
2513
  }
@@ -2199,14 +2537,19 @@ export class DboBuilder {
2199
2537
  }
2200
2538
 
2201
2539
  async parseJoins(): Promise<JoinPaths> {
2202
- if(this.prostgles.joins){
2203
- 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);
2204
2543
  if(typeof _joins === "string" && _joins === "inferred"){
2205
- _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))))
2206
2549
  }
2207
2550
  let joins = JSON.parse(JSON.stringify(_joins)) as Join[];
2208
2551
  this.joins = joins;
2209
- // console.log(joins);
2552
+
2210
2553
  // Validate joins
2211
2554
  try {
2212
2555
  // 1 find duplicates
@@ -2285,9 +2628,6 @@ export class DboBuilder {
2285
2628
  }
2286
2629
  });
2287
2630
  });
2288
- // console.log(this.joinPaths)
2289
- // console.log(888, this.prostgles.joins);
2290
- // console.log(this.joinGraph, findShortestPath(this.joinGraph, "colors", "drawings"));
2291
2631
  }
2292
2632
 
2293
2633
  return this.joinPaths;
@@ -2297,7 +2637,7 @@ export class DboBuilder {
2297
2637
 
2298
2638
  }
2299
2639
 
2300
- async build(): Promise<DbHandler | DbHandlerTX>{
2640
+ async build(): Promise<DbHandler>{
2301
2641
 
2302
2642
  // await this.pubSubManager.init()
2303
2643
 
@@ -2321,9 +2661,18 @@ export type TxCB = {
2321
2661
  let joinTableNames = [];
2322
2662
 
2323
2663
  let allDataDefs = "";
2664
+ let i18nDef = "type DeepPartial<T> = { [P in keyof T]?: DeepPartial<T[P]>; }; \n"
2665
+ i18nDef += "export type I18N_DBO_CONFIG<LANG_IDS = { en: 1, fr: 1 }> = { \n";
2666
+ i18nDef += " fallbackLang: keyof LANG_IDS; \n";
2667
+ i18nDef += " column_labels?: DeepPartial<{ \n";
2668
+
2669
+
2324
2670
 
2325
2671
  this.tablesOrViews.map(tov => {
2326
- // console.log("dboInit", tov.name, tov.columns.map(c => c.name))
2672
+ i18nDef += ` ${JSON.stringify(tov.name)}: { \n`;
2673
+ i18nDef += ` [key in ${tov.columns.map(c => JSON.stringify(c.name)).join(" | ")}]: { [lang_id in keyof LANG_IDS]: string }; \n`;
2674
+ i18nDef += ` }; \n`;
2675
+
2327
2676
  const filterKeywords = Object.values(this.prostgles.keywords);
2328
2677
  const $filterCol = tov.columns.find(c => filterKeywords.includes(c.name));
2329
2678
  if($filterCol){
@@ -2378,6 +2727,8 @@ export type TxCB = {
2378
2727
  }
2379
2728
  }
2380
2729
  });
2730
+ i18nDef += " }> \n";
2731
+ i18nDef += "} \n";
2381
2732
 
2382
2733
  let joinBuilderDef = "";
2383
2734
  if(joinTableNames.length){
@@ -2392,13 +2743,88 @@ export type TxCB = {
2392
2743
  }
2393
2744
 
2394
2745
 
2395
- if(this.prostgles.transactions){
2746
+ if(this.prostgles.opts.transactions){
2396
2747
  let txKey = "tx";
2397
- if(typeof this.prostgles.transactions === "string") txKey = this.prostgles.transactions;
2748
+ if(typeof this.prostgles.opts.transactions === "string") txKey = this.prostgles.opts.transactions;
2398
2749
  this.dboDefinition += ` ${txKey}: (t: TxCB) => Promise<any | void> ;\n`;
2399
2750
 
2400
- this.dbo[txKey] = (cb: TxCB) => this.getTX(cb);
2751
+ (this.dbo[txKey] as TX) = (cb: TxCB) => this.getTX(cb);
2401
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"`)
2826
+ }
2827
+
2402
2828
  this.dboDefinition += "};\n";
2403
2829
 
2404
2830
  this.tsTypesDefinition = [
@@ -2408,7 +2834,8 @@ export type TxCB = {
2408
2834
  joinBuilderDef,
2409
2835
 
2410
2836
  `/* DBO Definition. Isomorphic */`,
2411
- this.dboDefinition
2837
+ this.dboDefinition,
2838
+ i18nDef,
2412
2839
  ].join("\n");
2413
2840
 
2414
2841
  return this.dbo;
@@ -2417,15 +2844,23 @@ export type TxCB = {
2417
2844
 
2418
2845
  getTX = (dbTX: TxCB) => {
2419
2846
  return this.db.tx((t) => {
2420
- let txDB = {};
2847
+ let txDB: TxHandler = {};
2421
2848
  this.tablesOrViews.map(tov => {
2422
2849
  if(tov.is_view){
2850
+
2423
2851
  txDB[tov.name] = new ViewHandler(this.db, tov, this.pubSubManager, this, t, this.joinPaths);
2424
2852
  } else {
2425
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);
2426
2861
  }
2427
2862
  });
2428
- return dbTX(txDB);
2863
+ return dbTX(txDB, t);
2429
2864
  });
2430
2865
  }
2431
2866
  }
@@ -2556,35 +2991,6 @@ export function isPlainObject(o) {
2556
2991
  return Object(o) === o && Object.getPrototypeOf(o) === Object.prototype;
2557
2992
  }
2558
2993
 
2559
- // export const _PG_strings = ['bpchar','char','varchar','text','citext','uuid','bytea','inet','time','timetz','interval','name'] as const;
2560
- // export const _PG_numbers = ['int2','int4','int8','float4','float8','numeric','money','oid'] as const;
2561
- // export const _PG_json = ['json', 'jsonb'] as const;
2562
- // export const _PG_bool = ['bool'] as const;
2563
- // export const _PG_date = ['date', 'timestamp', 'timestamptz'] as const;
2564
- // export const _PG_postgis = ['geometry'] as const;
2565
- // export type PG_COLUMN_UDT_DATA_TYPE =
2566
- // | typeof _PG_strings[number]
2567
- // | typeof _PG_numbers[number]
2568
- // | typeof _PG_json[number]
2569
- // | typeof _PG_bool[number]
2570
- // | typeof _PG_date[number]
2571
- // | typeof _PG_postgis[number];
2572
-
2573
- // export const TS_PG_Types: { [key: string]: readonly string[]; } = {
2574
- // "string": _PG_strings,
2575
- // "number": _PG_numbers,
2576
- // "boolean": _PG_bool,
2577
- // "Object": _PG_json,
2578
- // "Date": _PG_date,
2579
- // "Array<number>": _PG_numbers.map(s => `_${s}`),
2580
- // "Array<boolean>": _PG_bool.map(s => `_${s}`),
2581
- // "Array<string>": _PG_strings.map(s => `_${s}`),
2582
- // "Array<Object>": _PG_json.map(s => `_${s}`),
2583
- // "Array<Date>": _PG_date.map(s => `_${s}`),
2584
- // "any": [],
2585
- // } as const;
2586
- // export type TS_COLUMN_DATA_TYPES = keyof typeof TS_PG_Types;
2587
-
2588
2994
  function postgresToTsType(udt_data_type: PG_COLUMN_UDT_DATA_TYPE): keyof typeof TS_PG_Types {
2589
2995
  return Object.keys(TS_PG_Types).find(k => {
2590
2996
  return TS_PG_Types[k].includes(udt_data_type) || !TS_PG_Types[k].length;
@@ -2887,6 +3293,6 @@ async function getInferredJoins(db: DB, schema: string = "public"): Promise<Join
2887
3293
  })
2888
3294
  }
2889
3295
  });
2890
- // console.log(joins);
3296
+
2891
3297
  return joins;
2892
3298
  }