@saltcorn/data 0.6.2-beta.0 → 0.6.2-beta.4

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 (555) hide show
  1. package/dist/base-plugin/actions.d.ts +141 -0
  2. package/dist/base-plugin/actions.d.ts.map +1 -0
  3. package/dist/base-plugin/actions.js +551 -0
  4. package/dist/base-plugin/actions.js.map +1 -0
  5. package/dist/base-plugin/base.test.d.ts +2 -0
  6. package/dist/base-plugin/base.test.d.ts.map +1 -0
  7. package/dist/base-plugin/base.test.js +15 -0
  8. package/dist/base-plugin/base.test.js.map +1 -0
  9. package/dist/base-plugin/fieldviews.d.ts +25 -0
  10. package/dist/base-plugin/fieldviews.d.ts.map +1 -0
  11. package/dist/base-plugin/fieldviews.js +159 -0
  12. package/dist/base-plugin/fieldviews.js.map +1 -0
  13. package/dist/base-plugin/fileviews.d.ts +52 -0
  14. package/dist/base-plugin/fileviews.d.ts.map +1 -0
  15. package/dist/base-plugin/fileviews.js +59 -0
  16. package/dist/base-plugin/fileviews.js.map +1 -0
  17. package/dist/base-plugin/index.d.ts +524 -0
  18. package/dist/base-plugin/index.d.ts.map +1 -0
  19. package/{base-plugin → dist/base-plugin}/index.js +22 -24
  20. package/dist/base-plugin/index.js.map +1 -0
  21. package/dist/base-plugin/types.d.ts +383 -0
  22. package/dist/base-plugin/types.d.ts.map +1 -0
  23. package/dist/base-plugin/types.js +1080 -0
  24. package/dist/base-plugin/types.js.map +1 -0
  25. package/dist/base-plugin/viewtemplates/edit.d.ts +116 -0
  26. package/dist/base-plugin/viewtemplates/edit.d.ts.map +1 -0
  27. package/dist/base-plugin/viewtemplates/edit.js +561 -0
  28. package/dist/base-plugin/viewtemplates/edit.js.map +1 -0
  29. package/dist/base-plugin/viewtemplates/feed.d.ts +73 -0
  30. package/dist/base-plugin/viewtemplates/feed.d.ts.map +1 -0
  31. package/dist/base-plugin/viewtemplates/feed.js +348 -0
  32. package/dist/base-plugin/viewtemplates/feed.js.map +1 -0
  33. package/dist/base-plugin/viewtemplates/filter.d.ts +46 -0
  34. package/dist/base-plugin/viewtemplates/filter.d.ts.map +1 -0
  35. package/dist/base-plugin/viewtemplates/filter.js +267 -0
  36. package/dist/base-plugin/viewtemplates/filter.js.map +1 -0
  37. package/dist/base-plugin/viewtemplates/list.d.ts +99 -0
  38. package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -0
  39. package/dist/base-plugin/viewtemplates/list.js +471 -0
  40. package/dist/base-plugin/viewtemplates/list.js.map +1 -0
  41. package/dist/base-plugin/viewtemplates/listshowlist.d.ts +41 -0
  42. package/dist/base-plugin/viewtemplates/listshowlist.d.ts.map +1 -0
  43. package/dist/base-plugin/viewtemplates/listshowlist.js +248 -0
  44. package/dist/base-plugin/viewtemplates/listshowlist.js.map +1 -0
  45. package/dist/base-plugin/viewtemplates/room.d.ts +140 -0
  46. package/dist/base-plugin/viewtemplates/room.d.ts.map +1 -0
  47. package/dist/base-plugin/viewtemplates/room.js +469 -0
  48. package/dist/base-plugin/viewtemplates/room.js.map +1 -0
  49. package/dist/base-plugin/viewtemplates/show.d.ts +101 -0
  50. package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -0
  51. package/dist/base-plugin/viewtemplates/show.js +562 -0
  52. package/dist/base-plugin/viewtemplates/show.js.map +1 -0
  53. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts +108 -0
  54. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts.map +1 -0
  55. package/dist/base-plugin/viewtemplates/viewable_fields.js +563 -0
  56. package/dist/base-plugin/viewtemplates/viewable_fields.js.map +1 -0
  57. package/dist/contracts.d.ts +49 -0
  58. package/dist/contracts.d.ts.map +1 -0
  59. package/dist/contracts.js +212 -0
  60. package/dist/contracts.js.map +1 -0
  61. package/dist/coverage/lcov-report/block-navigation.d.ts +2 -0
  62. package/dist/coverage/lcov-report/block-navigation.d.ts.map +1 -0
  63. package/dist/coverage/lcov-report/block-navigation.js +66 -0
  64. package/dist/coverage/lcov-report/block-navigation.js.map +1 -0
  65. package/dist/coverage/lcov-report/prettify.d.ts +1 -0
  66. package/dist/coverage/lcov-report/prettify.d.ts.map +1 -0
  67. package/dist/coverage/lcov-report/prettify.js +478 -0
  68. package/dist/coverage/lcov-report/prettify.js.map +1 -0
  69. package/dist/coverage/lcov-report/sorter.d.ts +2 -0
  70. package/dist/coverage/lcov-report/sorter.d.ts.map +1 -0
  71. package/dist/coverage/lcov-report/sorter.js +141 -0
  72. package/dist/coverage/lcov-report/sorter.js.map +1 -0
  73. package/dist/db/connect.d.ts +40 -0
  74. package/dist/db/connect.d.ts.map +1 -0
  75. package/dist/db/connect.js +150 -0
  76. package/dist/db/connect.js.map +1 -0
  77. package/dist/db/db.test.d.ts +2 -0
  78. package/dist/db/db.test.d.ts.map +1 -0
  79. package/dist/db/db.test.js +28 -0
  80. package/dist/db/db.test.js.map +1 -0
  81. package/dist/db/fixtures.d.ts +8 -0
  82. package/dist/db/fixtures.d.ts.map +1 -0
  83. package/dist/db/fixtures.js +300 -0
  84. package/dist/db/fixtures.js.map +1 -0
  85. package/dist/db/index.d.ts +3 -0
  86. package/dist/db/index.d.ts.map +1 -0
  87. package/dist/db/index.js +41 -0
  88. package/dist/db/index.js.map +1 -0
  89. package/dist/db/reset_schema.d.ts +13 -0
  90. package/dist/db/reset_schema.d.ts.map +1 -0
  91. package/{db → dist/db}/reset_schema.js +45 -55
  92. package/dist/db/reset_schema.js.map +1 -0
  93. package/dist/db/state.d.ts +56 -0
  94. package/dist/db/state.d.ts.map +1 -0
  95. package/dist/db/state.js +608 -0
  96. package/dist/db/state.js.map +1 -0
  97. package/dist/index.d.ts +2 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/{index.js → dist/index.js} +2 -1
  100. package/dist/index.js.map +1 -0
  101. package/dist/migrate.d.ts +12 -0
  102. package/dist/migrate.d.ts.map +1 -0
  103. package/dist/migrate.js +94 -0
  104. package/dist/migrate.js.map +1 -0
  105. package/dist/migrations/202005141503.d.ts +2 -0
  106. package/dist/migrations/202005141503.d.ts.map +1 -0
  107. package/{migrations → dist/migrations}/202005141503.js +2 -1
  108. package/dist/migrations/202005141503.js.map +1 -0
  109. package/dist/migrations/202005241712.d.ts +2 -0
  110. package/dist/migrations/202005241712.d.ts.map +1 -0
  111. package/{migrations → dist/migrations}/202005241712.js +2 -1
  112. package/dist/migrations/202005241712.js.map +1 -0
  113. package/dist/migrations/202005251037.d.ts +2 -0
  114. package/dist/migrations/202005251037.d.ts.map +1 -0
  115. package/{migrations → dist/migrations}/202005251037.js +2 -1
  116. package/dist/migrations/202005251037.js.map +1 -0
  117. package/dist/migrations/202005282134.d.ts +2 -0
  118. package/dist/migrations/202005282134.d.ts.map +1 -0
  119. package/{migrations → dist/migrations}/202005282134.js +2 -1
  120. package/dist/migrations/202005282134.js.map +1 -0
  121. package/dist/migrations/202006022156.d.ts +2 -0
  122. package/dist/migrations/202006022156.d.ts.map +1 -0
  123. package/{migrations → dist/migrations}/202006022156.js +2 -1
  124. package/dist/migrations/202006022156.js.map +1 -0
  125. package/dist/migrations/202006051507.d.ts +2 -0
  126. package/dist/migrations/202006051507.d.ts.map +1 -0
  127. package/{migrations → dist/migrations}/202006051507.js +2 -1
  128. package/dist/migrations/202006051507.js.map +1 -0
  129. package/dist/migrations/202006240906.d.ts +2 -0
  130. package/dist/migrations/202006240906.d.ts.map +1 -0
  131. package/{migrations → dist/migrations}/202006240906.js +2 -1
  132. package/dist/migrations/202006240906.js.map +1 -0
  133. package/dist/migrations/202007091707.d.ts +2 -0
  134. package/dist/migrations/202007091707.d.ts.map +1 -0
  135. package/{migrations → dist/migrations}/202007091707.js +2 -1
  136. package/dist/migrations/202007091707.js.map +1 -0
  137. package/dist/migrations/202007202144.d.ts +2 -0
  138. package/dist/migrations/202007202144.d.ts.map +1 -0
  139. package/{migrations → dist/migrations}/202007202144.js +2 -1
  140. package/dist/migrations/202007202144.js.map +1 -0
  141. package/dist/migrations/202008031500.d.ts +2 -0
  142. package/dist/migrations/202008031500.d.ts.map +1 -0
  143. package/dist/migrations/202008031500.js +4 -0
  144. package/dist/migrations/202008031500.js.map +1 -0
  145. package/dist/migrations/202008051415.d.ts +2 -0
  146. package/dist/migrations/202008051415.d.ts.map +1 -0
  147. package/{migrations → dist/migrations}/202008051415.js +2 -1
  148. package/dist/migrations/202008051415.js.map +1 -0
  149. package/dist/migrations/202008121149.d.ts +3 -0
  150. package/dist/migrations/202008121149.d.ts.map +1 -0
  151. package/{migrations → dist/migrations}/202008121149.js +2 -2
  152. package/dist/migrations/202008121149.js.map +1 -0
  153. package/dist/migrations/202009112140.d.ts +3 -0
  154. package/dist/migrations/202009112140.d.ts.map +1 -0
  155. package/{migrations → dist/migrations}/202009112140.js +2 -2
  156. package/dist/migrations/202009112140.js.map +1 -0
  157. package/dist/migrations/202009181655.d.ts +2 -0
  158. package/dist/migrations/202009181655.d.ts.map +1 -0
  159. package/dist/migrations/202009181655.js +7 -0
  160. package/dist/migrations/202009181655.js.map +1 -0
  161. package/dist/migrations/202009221105.d.ts +2 -0
  162. package/dist/migrations/202009221105.d.ts.map +1 -0
  163. package/dist/migrations/202009221105.js +4 -0
  164. package/dist/migrations/202009221105.js.map +1 -0
  165. package/dist/migrations/202009231331.d.ts +2 -0
  166. package/dist/migrations/202009231331.d.ts.map +1 -0
  167. package/{migrations → dist/migrations}/202009231331.js +2 -1
  168. package/dist/migrations/202009231331.js.map +1 -0
  169. package/dist/migrations/202009301531.d.ts +2 -0
  170. package/dist/migrations/202009301531.d.ts.map +1 -0
  171. package/dist/migrations/202009301531.js +8 -0
  172. package/dist/migrations/202009301531.js.map +1 -0
  173. package/dist/migrations/202010231444.d.ts +2 -0
  174. package/dist/migrations/202010231444.d.ts.map +1 -0
  175. package/dist/migrations/202010231444.js +4 -0
  176. package/dist/migrations/202010231444.js.map +1 -0
  177. package/dist/migrations/202010251412.d.ts +2 -0
  178. package/dist/migrations/202010251412.d.ts.map +1 -0
  179. package/dist/migrations/202010251412.js +10 -0
  180. package/dist/migrations/202010251412.js.map +1 -0
  181. package/dist/migrations/202011021749.d.ts +2 -0
  182. package/dist/migrations/202011021749.d.ts.map +1 -0
  183. package/{migrations → dist/migrations}/202011021749.js +2 -1
  184. package/dist/migrations/202011021749.js.map +1 -0
  185. package/dist/migrations/202011051353.d.ts +2 -0
  186. package/dist/migrations/202011051353.d.ts.map +1 -0
  187. package/{migrations → dist/migrations}/202011051353.js +2 -1
  188. package/dist/migrations/202011051353.js.map +1 -0
  189. package/dist/migrations/202011111127.d.ts +2 -0
  190. package/dist/migrations/202011111127.d.ts.map +1 -0
  191. package/{migrations → dist/migrations}/202011111127.js +2 -1
  192. package/dist/migrations/202011111127.js.map +1 -0
  193. package/dist/migrations/202012011203.d.ts +2 -0
  194. package/dist/migrations/202012011203.d.ts.map +1 -0
  195. package/{migrations → dist/migrations}/202012011203.js +2 -1
  196. package/dist/migrations/202012011203.js.map +1 -0
  197. package/dist/migrations/202012100841.d.ts +2 -0
  198. package/dist/migrations/202012100841.d.ts.map +1 -0
  199. package/{migrations → dist/migrations}/202012100841.js +2 -1
  200. package/dist/migrations/202012100841.js.map +1 -0
  201. package/dist/migrations/202012281835.d.ts +2 -0
  202. package/dist/migrations/202012281835.d.ts.map +1 -0
  203. package/{migrations → dist/migrations}/202012281835.js +2 -1
  204. package/dist/migrations/202012281835.js.map +1 -0
  205. package/dist/migrations/202101061051.d.ts +2 -0
  206. package/dist/migrations/202101061051.d.ts.map +1 -0
  207. package/{migrations → dist/migrations}/202101061051.js +2 -1
  208. package/dist/migrations/202101061051.js.map +1 -0
  209. package/dist/migrations/202101141128.d.ts +2 -0
  210. package/dist/migrations/202101141128.d.ts.map +1 -0
  211. package/dist/migrations/202101141128.js +4 -0
  212. package/dist/migrations/202101141128.js.map +1 -0
  213. package/dist/migrations/202102091312.d.ts +3 -0
  214. package/dist/migrations/202102091312.d.ts.map +1 -0
  215. package/dist/migrations/202102091312.js +19 -0
  216. package/dist/migrations/202102091312.js.map +1 -0
  217. package/dist/migrations/202102101624.d.ts +2 -0
  218. package/dist/migrations/202102101624.d.ts.map +1 -0
  219. package/dist/migrations/202102101624.js +7 -0
  220. package/dist/migrations/202102101624.js.map +1 -0
  221. package/dist/migrations/202102172148.d.ts +2 -0
  222. package/dist/migrations/202102172148.d.ts.map +1 -0
  223. package/{migrations → dist/migrations}/202102172148.js +2 -2
  224. package/dist/migrations/202102172148.js.map +1 -0
  225. package/dist/migrations/202102261650.d.ts +2 -0
  226. package/dist/migrations/202102261650.d.ts.map +1 -0
  227. package/dist/migrations/202102261650.js +7 -0
  228. package/dist/migrations/202102261650.js.map +1 -0
  229. package/dist/migrations/202106102347.d.ts +2 -0
  230. package/dist/migrations/202106102347.d.ts.map +1 -0
  231. package/{migrations → dist/migrations}/202106102347.js +2 -3
  232. package/dist/migrations/202106102347.js.map +1 -0
  233. package/dist/migrations/202106112120.d.ts +2 -0
  234. package/dist/migrations/202106112120.d.ts.map +1 -0
  235. package/{migrations → dist/migrations}/202106112120.js +2 -3
  236. package/dist/migrations/202106112120.js.map +1 -0
  237. package/dist/migrations/202106120012.d.ts +2 -0
  238. package/dist/migrations/202106120012.d.ts.map +1 -0
  239. package/{migrations → dist/migrations}/202106120012.js +2 -3
  240. package/dist/migrations/202106120012.js.map +1 -0
  241. package/dist/migrations/202106120220.d.ts +2 -0
  242. package/dist/migrations/202106120220.d.ts.map +1 -0
  243. package/{migrations → dist/migrations}/202106120220.js +2 -4
  244. package/dist/migrations/202106120220.js.map +1 -0
  245. package/dist/migrations/202106121701.d.ts +2 -0
  246. package/dist/migrations/202106121701.d.ts.map +1 -0
  247. package/{migrations → dist/migrations}/202106121701.js +2 -3
  248. package/dist/migrations/202106121701.js.map +1 -0
  249. package/dist/migrations/202106121703.d.ts +3 -0
  250. package/dist/migrations/202106121703.d.ts.map +1 -0
  251. package/{migrations → dist/migrations}/202106121703.js +2 -3
  252. package/dist/migrations/202106121703.js.map +1 -0
  253. package/dist/migrations/202106251126.d.ts +2 -0
  254. package/dist/migrations/202106251126.d.ts.map +1 -0
  255. package/dist/migrations/202106251126.js +6 -0
  256. package/dist/migrations/202106251126.js.map +1 -0
  257. package/dist/migrations/202107281619.d.ts +2 -0
  258. package/dist/migrations/202107281619.d.ts.map +1 -0
  259. package/{migrations → dist/migrations}/202107281619.js +2 -1
  260. package/dist/migrations/202107281619.js.map +1 -0
  261. package/dist/migrations/202107302158.d.ts +3 -0
  262. package/dist/migrations/202107302158.d.ts.map +1 -0
  263. package/{migrations → dist/migrations}/202107302158.js +2 -3
  264. package/dist/migrations/202107302158.js.map +1 -0
  265. package/dist/migrations/202108022257.d.ts +2 -0
  266. package/dist/migrations/202108022257.d.ts.map +1 -0
  267. package/{migrations → dist/migrations}/202108022257.js +3 -4
  268. package/dist/migrations/202108022257.js.map +1 -0
  269. package/dist/migrations/202109201624.d.ts +2 -0
  270. package/dist/migrations/202109201624.d.ts.map +1 -0
  271. package/{migrations → dist/migrations}/202109201624.js +2 -1
  272. package/dist/migrations/202109201624.js.map +1 -0
  273. package/dist/migrations/202109301031.d.ts +3 -0
  274. package/dist/migrations/202109301031.d.ts.map +1 -0
  275. package/{migrations → dist/migrations}/202109301031.js +2 -2
  276. package/dist/migrations/202109301031.js.map +1 -0
  277. package/dist/migrations/202111290253.d.ts +3 -0
  278. package/dist/migrations/202111290253.d.ts.map +1 -0
  279. package/dist/migrations/202111290253.js +5 -0
  280. package/dist/migrations/202111290253.js.map +1 -0
  281. package/dist/models/backup.d.ts +22 -0
  282. package/dist/models/backup.d.ts.map +1 -0
  283. package/{models → dist/models}/backup.js +95 -192
  284. package/dist/models/backup.js.map +1 -0
  285. package/dist/models/config.d.ts +180 -0
  286. package/dist/models/config.d.ts.map +1 -0
  287. package/dist/models/config.js +758 -0
  288. package/dist/models/config.js.map +1 -0
  289. package/dist/models/crash.d.ts +74 -0
  290. package/dist/models/crash.d.ts.map +1 -0
  291. package/dist/models/crash.js +118 -0
  292. package/dist/models/crash.js.map +1 -0
  293. package/dist/models/discovery.d.ts +28 -0
  294. package/dist/models/discovery.d.ts.map +1 -0
  295. package/dist/models/discovery.js +163 -0
  296. package/dist/models/discovery.js.map +1 -0
  297. package/dist/models/email.d.ts +16 -0
  298. package/dist/models/email.d.ts.map +1 -0
  299. package/dist/models/email.js +90 -0
  300. package/dist/models/email.js.map +1 -0
  301. package/dist/models/eventlog.d.ts +77 -0
  302. package/dist/models/eventlog.d.ts.map +1 -0
  303. package/dist/models/eventlog.js +132 -0
  304. package/dist/models/eventlog.js.map +1 -0
  305. package/dist/models/expression.d.ts +54 -0
  306. package/dist/models/expression.d.ts.map +1 -0
  307. package/dist/models/expression.js +274 -0
  308. package/dist/models/expression.js.map +1 -0
  309. package/dist/models/field.d.ts +217 -0
  310. package/dist/models/field.d.ts.map +1 -0
  311. package/dist/models/field.js +619 -0
  312. package/dist/models/field.js.map +1 -0
  313. package/dist/models/fieldrepeat.d.ts +49 -0
  314. package/dist/models/fieldrepeat.d.ts.map +1 -0
  315. package/dist/models/fieldrepeat.js +88 -0
  316. package/dist/models/fieldrepeat.js.map +1 -0
  317. package/dist/models/file.d.ts +122 -0
  318. package/dist/models/file.d.ts.map +1 -0
  319. package/dist/models/file.js +224 -0
  320. package/dist/models/file.js.map +1 -0
  321. package/dist/models/form.d.ts +82 -0
  322. package/dist/models/form.d.ts.map +1 -0
  323. package/dist/models/form.js +163 -0
  324. package/dist/models/form.js.map +1 -0
  325. package/dist/models/index.d.ts +1 -0
  326. package/dist/models/index.d.ts.map +1 -0
  327. package/{models → dist/models}/index.js +42 -42
  328. package/dist/models/index.js.map +1 -0
  329. package/dist/models/layout.d.ts +34 -0
  330. package/dist/models/layout.d.ts.map +1 -0
  331. package/dist/models/layout.js +153 -0
  332. package/dist/models/layout.js.map +1 -0
  333. package/dist/models/library.d.ts +50 -0
  334. package/dist/models/library.d.ts.map +1 -0
  335. package/dist/models/library.js +129 -0
  336. package/dist/models/library.js.map +1 -0
  337. package/dist/models/pack.d.ts +89 -0
  338. package/dist/models/pack.d.ts.map +1 -0
  339. package/dist/models/pack.js +390 -0
  340. package/dist/models/pack.js.map +1 -0
  341. package/dist/models/page.d.ts +101 -0
  342. package/dist/models/page.d.ts.map +1 -0
  343. package/dist/models/page.js +223 -0
  344. package/dist/models/page.js.map +1 -0
  345. package/dist/models/plugin.d.ts +100 -0
  346. package/dist/models/plugin.d.ts.map +1 -0
  347. package/dist/models/plugin.js +204 -0
  348. package/dist/models/plugin.js.map +1 -0
  349. package/dist/models/random.d.ts +24 -0
  350. package/dist/models/random.d.ts.map +1 -0
  351. package/dist/models/random.js +186 -0
  352. package/dist/models/random.js.map +1 -0
  353. package/dist/models/role.d.ts +42 -0
  354. package/dist/models/role.d.ts.map +1 -0
  355. package/dist/models/role.js +64 -0
  356. package/dist/models/role.js.map +1 -0
  357. package/dist/models/scheduler.d.ts +18 -0
  358. package/dist/models/scheduler.d.ts.map +1 -0
  359. package/dist/models/scheduler.js +159 -0
  360. package/dist/models/scheduler.js.map +1 -0
  361. package/dist/models/table.d.ts +326 -0
  362. package/dist/models/table.d.ts.map +1 -0
  363. package/dist/models/table.js +1006 -0
  364. package/dist/models/table.js.map +1 -0
  365. package/dist/models/table_constraints.d.ts +69 -0
  366. package/dist/models/table_constraints.d.ts.map +1 -0
  367. package/dist/models/table_constraints.js +118 -0
  368. package/dist/models/table_constraints.js.map +1 -0
  369. package/dist/models/tenant.d.ts +55 -0
  370. package/dist/models/tenant.d.ts.map +1 -0
  371. package/{models → dist/models}/tenant.js +40 -63
  372. package/dist/models/tenant.js.map +1 -0
  373. package/dist/models/trigger.d.ts +133 -0
  374. package/dist/models/trigger.d.ts.map +1 -0
  375. package/dist/models/trigger.js +292 -0
  376. package/dist/models/trigger.js.map +1 -0
  377. package/dist/models/user.d.ts +235 -0
  378. package/dist/models/user.d.ts.map +1 -0
  379. package/dist/models/user.js +434 -0
  380. package/dist/models/user.js.map +1 -0
  381. package/dist/models/view.d.ts +204 -0
  382. package/dist/models/view.d.ts.map +1 -0
  383. package/dist/models/view.js +497 -0
  384. package/dist/models/view.js.map +1 -0
  385. package/dist/models/workflow.d.ts +48 -0
  386. package/dist/models/workflow.d.ts.map +1 -0
  387. package/dist/models/workflow.js +190 -0
  388. package/dist/models/workflow.js.map +1 -0
  389. package/dist/plugin-helper.d.ts +145 -0
  390. package/dist/plugin-helper.d.ts.map +1 -0
  391. package/dist/plugin-helper.js +1158 -0
  392. package/dist/plugin-helper.js.map +1 -0
  393. package/dist/plugin-testing.d.ts +3 -0
  394. package/dist/plugin-testing.d.ts.map +1 -0
  395. package/dist/plugin-testing.js +120 -0
  396. package/dist/plugin-testing.js.map +1 -0
  397. package/dist/tests/actions.test.d.ts +2 -0
  398. package/dist/tests/actions.test.d.ts.map +1 -0
  399. package/dist/tests/actions.test.js +205 -0
  400. package/dist/tests/actions.test.js.map +1 -0
  401. package/dist/tests/auxtest.test.d.ts +2 -0
  402. package/dist/tests/auxtest.test.d.ts.map +1 -0
  403. package/dist/tests/auxtest.test.js +48 -0
  404. package/dist/tests/auxtest.test.js.map +1 -0
  405. package/dist/tests/backup.test.d.ts +2 -0
  406. package/dist/tests/backup.test.d.ts.map +1 -0
  407. package/dist/tests/backup.test.js +88 -0
  408. package/dist/tests/backup.test.js.map +1 -0
  409. package/dist/tests/calc.test.d.ts +2 -0
  410. package/dist/tests/calc.test.d.ts.map +1 -0
  411. package/dist/tests/calc.test.js +231 -0
  412. package/dist/tests/calc.test.js.map +1 -0
  413. package/dist/tests/config.test.d.ts +2 -0
  414. package/dist/tests/config.test.d.ts.map +1 -0
  415. package/dist/tests/config.test.js +83 -0
  416. package/dist/tests/config.test.js.map +1 -0
  417. package/dist/tests/discover.test.d.ts +2 -0
  418. package/dist/tests/discover.test.d.ts.map +1 -0
  419. package/dist/tests/discover.test.js +106 -0
  420. package/dist/tests/discover.test.js.map +1 -0
  421. package/dist/tests/exact_views.test.d.ts +2 -0
  422. package/dist/tests/exact_views.test.d.ts.map +1 -0
  423. package/dist/tests/exact_views.test.js +511 -0
  424. package/dist/tests/exact_views.test.js.map +1 -0
  425. package/dist/tests/field.test.d.ts +2 -0
  426. package/dist/tests/field.test.d.ts.map +1 -0
  427. package/dist/tests/field.test.js +237 -0
  428. package/dist/tests/field.test.js.map +1 -0
  429. package/dist/tests/form.test.d.ts +2 -0
  430. package/dist/tests/form.test.d.ts.map +1 -0
  431. package/dist/tests/form.test.js +191 -0
  432. package/dist/tests/form.test.js.map +1 -0
  433. package/dist/tests/mocks.d.ts +111 -0
  434. package/dist/tests/mocks.d.ts.map +1 -0
  435. package/dist/tests/mocks.js +165 -0
  436. package/dist/tests/mocks.js.map +1 -0
  437. package/dist/tests/models.test.d.ts +2 -0
  438. package/dist/tests/models.test.d.ts.map +1 -0
  439. package/dist/tests/models.test.js +210 -0
  440. package/dist/tests/models.test.js.map +1 -0
  441. package/dist/tests/pack.test.d.ts +2 -0
  442. package/dist/tests/pack.test.d.ts.map +1 -0
  443. package/dist/tests/pack.test.js +331 -0
  444. package/dist/tests/pack.test.js.map +1 -0
  445. package/dist/tests/plugin.test.d.ts +2 -0
  446. package/dist/tests/plugin.test.d.ts.map +1 -0
  447. package/dist/tests/plugin.test.js +53 -0
  448. package/dist/tests/plugin.test.js.map +1 -0
  449. package/dist/tests/random.test.d.ts +2 -0
  450. package/dist/tests/random.test.d.ts.map +1 -0
  451. package/dist/tests/random.test.js +138 -0
  452. package/dist/tests/random.test.js.map +1 -0
  453. package/dist/tests/table.test.d.ts +2 -0
  454. package/dist/tests/table.test.d.ts.map +1 -0
  455. package/dist/tests/table.test.js +1048 -0
  456. package/dist/tests/table.test.js.map +1 -0
  457. package/dist/tests/tenant.test.d.ts +2 -0
  458. package/dist/tests/tenant.test.d.ts.map +1 -0
  459. package/dist/tests/tenant.test.js +45 -0
  460. package/dist/tests/tenant.test.js.map +1 -0
  461. package/dist/tests/user.test.d.ts +2 -0
  462. package/dist/tests/user.test.d.ts.map +1 -0
  463. package/dist/tests/user.test.js +190 -0
  464. package/dist/tests/user.test.js.map +1 -0
  465. package/dist/tests/view.test.d.ts +2 -0
  466. package/dist/tests/view.test.d.ts.map +1 -0
  467. package/dist/tests/view.test.js +238 -0
  468. package/dist/tests/view.test.js.map +1 -0
  469. package/dist/tests/workflow.test.d.ts +2 -0
  470. package/dist/tests/workflow.test.d.ts.map +1 -0
  471. package/dist/tests/workflow.test.js +115 -0
  472. package/dist/tests/workflow.test.js.map +1 -0
  473. package/dist/tsconfig.ref.tsbuildinfo +1 -0
  474. package/dist/utils.d.ts +26 -0
  475. package/dist/utils.d.ts.map +1 -0
  476. package/dist/utils.js +124 -0
  477. package/dist/utils.js.map +1 -0
  478. package/package.json +32 -8
  479. package/base-plugin/actions.js +0 -629
  480. package/base-plugin/base.test.js +0 -15
  481. package/base-plugin/fieldviews.js +0 -197
  482. package/base-plugin/fileviews.js +0 -65
  483. package/base-plugin/types.js +0 -1154
  484. package/base-plugin/viewtemplates/edit.js +0 -669
  485. package/base-plugin/viewtemplates/feed.js +0 -434
  486. package/base-plugin/viewtemplates/filter.js +0 -358
  487. package/base-plugin/viewtemplates/list.js +0 -575
  488. package/base-plugin/viewtemplates/listshowlist.js +0 -292
  489. package/base-plugin/viewtemplates/room.js +0 -652
  490. package/base-plugin/viewtemplates/show.js +0 -689
  491. package/base-plugin/viewtemplates/viewable_fields.js +0 -713
  492. package/contracts.js +0 -311
  493. package/db/connect.js +0 -151
  494. package/db/db.test.js +0 -33
  495. package/db/fixtures.js +0 -303
  496. package/db/index.js +0 -63
  497. package/db/state.js +0 -674
  498. package/migrate.js +0 -99
  499. package/migrations/202008031500.js +0 -4
  500. package/migrations/202009181655.js +0 -6
  501. package/migrations/202009221105.js +0 -4
  502. package/migrations/202009301531.js +0 -7
  503. package/migrations/202010231444.js +0 -4
  504. package/migrations/202010251412.js +0 -9
  505. package/migrations/202101141128.js +0 -4
  506. package/migrations/202102091312.js +0 -19
  507. package/migrations/202102101624.js +0 -5
  508. package/migrations/202102261650.js +0 -6
  509. package/migrations/202106251126.js +0 -5
  510. package/models/config.js +0 -680
  511. package/models/crash.js +0 -126
  512. package/models/discovery.js +0 -195
  513. package/models/email.js +0 -92
  514. package/models/eventlog.js +0 -146
  515. package/models/expression.js +0 -276
  516. package/models/field.js +0 -746
  517. package/models/fieldrepeat.js +0 -96
  518. package/models/file.js +0 -234
  519. package/models/form.js +0 -169
  520. package/models/layout.js +0 -146
  521. package/models/library.js +0 -135
  522. package/models/pack.js +0 -466
  523. package/models/page.js +0 -255
  524. package/models/plugin.js +0 -219
  525. package/models/random.js +0 -206
  526. package/models/role.js +0 -94
  527. package/models/scheduler.js +0 -163
  528. package/models/table.js +0 -1211
  529. package/models/table_constraints.js +0 -133
  530. package/models/trigger.js +0 -327
  531. package/models/user.js +0 -503
  532. package/models/view.js +0 -622
  533. package/models/workflow.js +0 -205
  534. package/plugin-helper.js +0 -1311
  535. package/plugin-testing.js +0 -124
  536. package/tests/actions.test.js +0 -232
  537. package/tests/auxtest.test.js +0 -52
  538. package/tests/backup.test.js +0 -92
  539. package/tests/calc.test.js +0 -243
  540. package/tests/config.test.js +0 -91
  541. package/tests/discover.test.js +0 -114
  542. package/tests/exact_views.test.js +0 -526
  543. package/tests/field.test.js +0 -253
  544. package/tests/form.test.js +0 -198
  545. package/tests/mocks.js +0 -173
  546. package/tests/models.test.js +0 -221
  547. package/tests/pack.test.js +0 -350
  548. package/tests/plugin.test.js +0 -59
  549. package/tests/random.test.js +0 -154
  550. package/tests/table.test.js +0 -1091
  551. package/tests/tenant.test.js +0 -56
  552. package/tests/user.test.js +0 -196
  553. package/tests/view.test.js +0 -251
  554. package/tests/workflow.test.js +0 -119
  555. package/utils.js +0 -137
@@ -0,0 +1,1006 @@
1
+ "use strict";
2
+ /**
3
+ * Table Database Access Layer
4
+ * @category saltcorn-data
5
+ * @module models/table
6
+ * @subcategory models
7
+ */
8
+ const db = require("../db");
9
+ const { sqlsanitize, mkWhere, mkSelectOptions, } = require("@saltcorn/db-common/internal");
10
+ const Field = require("./field");
11
+ const Trigger = require("./trigger");
12
+ const { apply_calculated_fields, apply_calculated_fields_stored, recalculate_for_stored, get_expression_function, } = require("./expression");
13
+ const { contract, is } = require("contractis");
14
+ const { is_table_query } = require("../contracts");
15
+ const csvtojson = require("csvtojson");
16
+ const moment = require("moment");
17
+ const fs = require("fs");
18
+ const { InvalidConfiguration, InvalidAdminAction, satisfies, structuredClone, getLines, } = require("../utils");
19
+ /**
20
+ * Transponce Objects
21
+ * TODO more detailed explanation
22
+ * TODO refactor - move to object util module?
23
+ * @param objs
24
+ * @returns {object}
25
+ */
26
+ const transposeObjects = (objs) => {
27
+ const keys = new Set();
28
+ for (const o of objs) {
29
+ Object.keys(o).forEach((k) => keys.add(k));
30
+ }
31
+ const res = {};
32
+ keys.forEach((k) => {
33
+ res[k] = [];
34
+ });
35
+ for (const o of objs) {
36
+ keys.forEach((k) => {
37
+ res[k].push(o[k]);
38
+ });
39
+ }
40
+ return res;
41
+ };
42
+ // todo support also other date formats https://momentjs.com/docs/
43
+ const dateFormats = [moment.ISO_8601];
44
+ // todo refactor - move to separated data utils module?
45
+ /**
46
+ * Is Valid Date of format moment.ISO_8601,
47
+ * example 2010-01-01T05:06:07
48
+ *
49
+ * @param date
50
+ * @returns {boolean}
51
+ */
52
+ const isDate = function (date) {
53
+ return moment(date, dateFormats, true).isValid();
54
+ };
55
+ // todo resolve database specific
56
+ /**
57
+ * Normalise specific error message according db specific
58
+ * @param msg
59
+ * @returns {string}
60
+ */
61
+ // todo refactor
62
+ const normalise_error_message = (msg) => db.isSQLite
63
+ ? msg.replace(/SQLITE_CONSTRAINT: UNIQUE constraint failed: (.*?)\.(.*?)/, "Duplicate value for unique field: $2")
64
+ : msg.replace(/duplicate key value violates unique constraint "(.*?)_(.*?)_unique"/, "Duplicate value for unique field: $2");
65
+ /**
66
+ * Table class
67
+ * @category saltcorn-data
68
+ */
69
+ class Table {
70
+ /**
71
+ * Table constructor
72
+ * @param {object} o
73
+ */
74
+ constructor(o) {
75
+ this.name = o.name;
76
+ this.id = o.id;
77
+ this.min_role_read = o.min_role_read;
78
+ this.min_role_write = o.min_role_write;
79
+ this.ownership_field_id = o.ownership_field_id;
80
+ this.ownership_formula = o.ownership_formula;
81
+ this.versioned = !!o.versioned;
82
+ this.external = false;
83
+ this.description = o.description;
84
+ if (o.fields)
85
+ this.fields = o.fields.map((f) => new Field(f));
86
+ contract.class(this);
87
+ }
88
+ /**
89
+ *
90
+ * Find one Table
91
+ * @param where - where condition
92
+ * @returns {*|Table|null} table or null
93
+ */
94
+ static findOne(where) {
95
+ if (where &&
96
+ ((where.constructor && where.constructor.name === "Table") ||
97
+ where.getRows))
98
+ return where;
99
+ if (typeof where === "string")
100
+ return Table.findOne({ name: where });
101
+ if (typeof where === "number")
102
+ return Table.findOne({ id: where });
103
+ if (where.name) {
104
+ const { getState } = require("../db/state");
105
+ const extTable = getState().external_tables[where.name];
106
+ if (extTable)
107
+ return extTable;
108
+ }
109
+ const { getState } = require("../db/state");
110
+ const tbl = getState().tables.find(where.id
111
+ ? (v) => v.id === +where.id
112
+ : where.name
113
+ ? (v) => v.name === where.name
114
+ : satisfies(where));
115
+ return tbl ? new Table(structuredClone(tbl)) : null;
116
+ }
117
+ /**
118
+ * Find Tables
119
+ * @param where - where condition
120
+ * @param selectopts - options
121
+ * @returns {Promise<Table[]>} table list
122
+ */
123
+ static async find(where, selectopts = { orderBy: "name", nocase: true }) {
124
+ if (selectopts.cached) {
125
+ const { getState } = require("../db/state");
126
+ return getState().tables.map((t) => new Table(t));
127
+ }
128
+ const tbls = await db.select("_sc_tables", where, selectopts);
129
+ return tbls.map((t) => new Table(t));
130
+ }
131
+ /**
132
+ * Find Tables including external tables
133
+ * @param where0
134
+ * @param selectopts
135
+ * @returns {Promise<object[]>}
136
+ */
137
+ static async find_with_external(where0 = {}, selectopts = { orderBy: "name", nocase: true }) {
138
+ const { external, ...where } = where0;
139
+ let externals = [], dbs = [];
140
+ if (external !== false) {
141
+ //do include externals
142
+ const { getState } = require("../db/state");
143
+ externals = Object.values(getState().external_tables);
144
+ }
145
+ if (external !== true) {
146
+ //do include db tables
147
+ const tbls = await db.select("_sc_tables", where, selectopts);
148
+ dbs = tbls.map((t) => new Table(t));
149
+ }
150
+ return [...dbs, ...externals];
151
+ }
152
+ /**
153
+ * Get owner column name
154
+ * @param fields - fields list
155
+ * @returns {null|*} null or owner column name
156
+ */
157
+ owner_fieldname_from_fields(fields) {
158
+ if (!this.ownership_field_id)
159
+ return null;
160
+ const field = fields.find((f) => f.id === this.ownership_field_id);
161
+ return field.name;
162
+ }
163
+ /**
164
+ * Get owner column name
165
+ * @returns {Promise<string|null|*>}
166
+ */
167
+ owner_fieldname() {
168
+ if (this.name === "users")
169
+ return "id";
170
+ if (!this.ownership_field_id)
171
+ return null;
172
+ return this.owner_fieldname_from_fields(this.fields);
173
+ }
174
+ /**
175
+ * Check if user is owner of row
176
+ * @param user - user
177
+ * @param row - table row
178
+ * @returns {Promise<string|null|*|boolean>}
179
+ */
180
+ is_owner(user, row) {
181
+ if (!user)
182
+ return false;
183
+ if (this.ownership_formula) {
184
+ const f = get_expression_function(this.ownership_formula, this.fields);
185
+ return f(row, user);
186
+ }
187
+ const field_name = this.owner_fieldname();
188
+ return field_name && row[field_name] === user.id;
189
+ }
190
+ /**
191
+ * Create table
192
+ * @param name - table name
193
+ * @param options - table fields
194
+ * @returns {Promise<Table>} table
195
+ */
196
+ static async create(name, options = {}) {
197
+ const schema = db.getTenantSchemaPrefix();
198
+ // create table in database
199
+ await db.query(`create table ${schema}"${sqlsanitize(name)}" (id ${db.isSQLite ? "integer" : "serial"} primary key)`);
200
+ // populate table definition row
201
+ const tblrow = {
202
+ name,
203
+ versioned: options.versioned || false,
204
+ min_role_read: options.min_role_read || 1,
205
+ min_role_write: options.min_role_write || 1,
206
+ ownership_field_id: options.ownership_field_id,
207
+ ownership_formula: options.ownership_formula,
208
+ description: options.description || "",
209
+ };
210
+ // insert table defintion into _sc_tables
211
+ const id = await db.insert("_sc_tables", tblrow);
212
+ // add primary key columnt ID
213
+ await db.query(`insert into ${schema}_sc_fields(table_id, name, label, type, attributes, required, is_unique,primary_key)
214
+ values($1,'id','ID','Integer', '{}', true, true, true)`, [id]);
215
+ // create table
216
+ const table = new Table({ ...tblrow, id });
217
+ // create table history
218
+ if (table.versioned)
219
+ await table.create_history_table();
220
+ // refresh tables cache
221
+ await require("../db/state").getState().refresh_tables();
222
+ return table;
223
+ }
224
+ /**
225
+ * Drop current table
226
+ * @returns {Promise<void>}
227
+ */
228
+ async delete(only_forget = false) {
229
+ const schema = db.getTenantSchemaPrefix();
230
+ const is_sqlite = db.isSQLite;
231
+ await this.update({ ownership_field_id: null });
232
+ const client = is_sqlite ? db : await db.getClient();
233
+ await client.query(`BEGIN`);
234
+ try {
235
+ if (!only_forget)
236
+ await client.query(`drop table if exists ${schema}"${sqlsanitize(this.name)}"`);
237
+ await client.query(`delete FROM ${schema}_sc_fields WHERE table_id = $1`, [this.id]);
238
+ await client.query(`delete FROM ${schema}_sc_tables WHERE id = $1`, [
239
+ this.id,
240
+ ]);
241
+ if (this.versioned)
242
+ await client.query(`drop table if exists ${schema}"${sqlsanitize(this.name)}__history"`);
243
+ await client.query(`COMMIT`);
244
+ }
245
+ catch (e) {
246
+ await client.query(`ROLLBACK`);
247
+ if (!is_sqlite)
248
+ client.release(true);
249
+ throw e;
250
+ }
251
+ if (!is_sqlite)
252
+ client.release(true);
253
+ await require("../db/state").getState().refresh_tables();
254
+ }
255
+ /***
256
+ * get Table SQL Name
257
+ * @type {string}
258
+ */
259
+ get sql_name() {
260
+ return `${db.getTenantSchemaPrefix()}"${sqlsanitize(this.name)}"`;
261
+ }
262
+ /**
263
+ * Delete rows from table
264
+ * @param where - condition
265
+ * @returns {Promise<void>}
266
+ */
267
+ async deleteRows(where) {
268
+ // get triggers on delete
269
+ const triggers = await Trigger.getTableTriggers("Delete", this);
270
+ if (triggers.length > 0) {
271
+ const rows = await this.getRows(where);
272
+ for (const trigger of triggers) {
273
+ for (const row of rows) {
274
+ // run triggers on delete
275
+ await trigger.run(row);
276
+ }
277
+ }
278
+ }
279
+ await db.deleteWhere(this.name, where);
280
+ }
281
+ /**
282
+ * Returns row with only fields that can be read from db (readFromDB flag)
283
+ * @param row
284
+ * @returns {*}
285
+ */
286
+ readFromDB(row) {
287
+ for (const f of this.fields) {
288
+ if (f.type && f.type.readFromDB)
289
+ row[f.name] = f.type.readFromDB(row[f.name]);
290
+ }
291
+ return row;
292
+ }
293
+ /**
294
+ * Get one row from table in db
295
+ * @param where
296
+ * @returns {Promise<null|*>}
297
+ */
298
+ async getRow(where = {}) {
299
+ await this.getFields();
300
+ const row = await db.selectMaybeOne(this.name, where);
301
+ if (!row)
302
+ return null;
303
+ return apply_calculated_fields([this.readFromDB(row)], this.fields)[0];
304
+ }
305
+ /**
306
+ * Get rows from Table in db
307
+ * @param where
308
+ * @param selopts
309
+ * @returns {Promise<void>}
310
+ */
311
+ async getRows(where = {}, selopts) {
312
+ await this.getFields();
313
+ const rows = await db.select(this.name, where, selopts);
314
+ return apply_calculated_fields(rows.map((r) => this.readFromDB(r)), this.fields);
315
+ }
316
+ /**
317
+ * Count amount of rows in db table
318
+ * @param where
319
+ * @returns {Promise<number>}
320
+ */
321
+ async countRows(where) {
322
+ return await db.count(this.name, where);
323
+ }
324
+ /**
325
+ * Return distinct Values for column in table
326
+ * ????
327
+ * @param fieldnm
328
+ * @returns {Promise<Object[]>}
329
+ */
330
+ async distinctValues(fieldnm) {
331
+ const res = await db.query(`select distinct "${db.sqlsanitize(fieldnm)}" from ${this.sql_name}`);
332
+ return res.rows.map((r) => r[fieldnm]);
333
+ }
334
+ /**
335
+ * Update row
336
+ * @param v_in - colums with values to update
337
+ * @param id - id value
338
+ * @param _userid - user id
339
+ * @returns {Promise<void>}
340
+ */
341
+ async updateRow(v_in, id, _userid) {
342
+ let existing;
343
+ let v;
344
+ const fields = await this.getFields();
345
+ const pk_name = this.pk_name;
346
+ if (fields.some((f) => f.calculated && f.stored)) {
347
+ existing = await db.selectOne(this.name, { [pk_name]: id });
348
+ v = await apply_calculated_fields_stored({ ...existing, ...v_in }, this.fields);
349
+ }
350
+ else
351
+ v = v_in;
352
+ if (this.versioned) {
353
+ if (!existing)
354
+ existing = await db.selectOne(this.name, { [pk_name]: id });
355
+ await db.insert(this.name + "__history", {
356
+ ...existing,
357
+ ...v,
358
+ [pk_name]: id,
359
+ _version: {
360
+ next_version_by_id: +id,
361
+ },
362
+ _time: new Date(),
363
+ _userid,
364
+ });
365
+ }
366
+ await db.update(this.name, v, id, { pk_name });
367
+ if (typeof existing === "undefined") {
368
+ const triggers = await Trigger.getTableTriggers("Update", this);
369
+ if (triggers.length > 0)
370
+ existing = await db.selectOne(this.name, { [pk_name]: id });
371
+ }
372
+ const newRow = { ...existing, ...v, [pk_name]: id };
373
+ await Trigger.runTableTriggers("Update", this, newRow);
374
+ }
375
+ /**
376
+ * Try to Update row
377
+ * @param v
378
+ * @param id
379
+ * @param _userid
380
+ * @returns {Promise<{error}|{success: boolean}>}
381
+ */
382
+ async tryUpdateRow(v, id, _userid) {
383
+ try {
384
+ await this.updateRow(v, id, _userid);
385
+ return { success: true };
386
+ }
387
+ catch (e) {
388
+ return { error: normalise_error_message(e.message) };
389
+ }
390
+ }
391
+ /**
392
+ * ????
393
+ * @param id
394
+ * @param field_name
395
+ * @returns {Promise<void>}
396
+ */
397
+ async toggleBool(id, field_name) {
398
+ const schema = db.getTenantSchemaPrefix();
399
+ await db.query(`update ${schema}"${sqlsanitize(this.name)}" set "${sqlsanitize(field_name)}"=NOT coalesce("${sqlsanitize(field_name)}", false) where id=$1`, [id]);
400
+ const triggers = await Trigger.getTableTriggers("Update", this);
401
+ if (triggers.length > 0) {
402
+ const row = await this.getRow({ id });
403
+ for (const trigger of triggers) {
404
+ await trigger.run(row);
405
+ }
406
+ }
407
+ }
408
+ /**
409
+ * Get primary key field
410
+ * @type {string}
411
+ */
412
+ get pk_name() {
413
+ return this.fields.find((f) => f.primary_key).name;
414
+ }
415
+ /**
416
+ * Insert row
417
+ * @param v_in
418
+ * @param _userid
419
+ * @returns {Promise<*>}
420
+ */
421
+ async insertRow(v_in, _userid) {
422
+ await this.getFields();
423
+ const v = await apply_calculated_fields_stored(v_in, this.fields);
424
+ const pk_name = this.pk_name;
425
+ const id = await db.insert(this.name, v, { pk_name });
426
+ if (this.versioned)
427
+ await db.insert(this.name + "__history", {
428
+ ...v,
429
+ [pk_name]: id,
430
+ _version: 1,
431
+ _userid,
432
+ _time: new Date(),
433
+ });
434
+ Trigger.runTableTriggers("Insert", this, { [pk_name]: id, ...v });
435
+ return id;
436
+ }
437
+ /**
438
+ * Try to Insert row
439
+ * @param v
440
+ * @param _userid
441
+ * @returns {Promise<{error}|{success: *}>}
442
+ */
443
+ async tryInsertRow(v, _userid) {
444
+ try {
445
+ const id = await this.insertRow(v, _userid);
446
+ return { success: id };
447
+ }
448
+ catch (e) {
449
+ return { error: normalise_error_message(e.message) };
450
+ }
451
+ }
452
+ /**
453
+ * Get Fields list for table
454
+ * @returns {Promise<Field[]>}
455
+ */
456
+ async getFields() {
457
+ if (!this.fields) {
458
+ this.fields = await Field.find({ table_id: this.id }, { orderBy: "id" });
459
+ }
460
+ return this.fields;
461
+ }
462
+ /**
463
+ * Create history table
464
+ * @returns {Promise<void>}
465
+ */
466
+ // todo create function that returns history table name for table
467
+ async create_history_table() {
468
+ const schemaPrefix = db.getTenantSchemaPrefix();
469
+ const fields = await this.getFields();
470
+ const flds = fields.map((f) => `,"${sqlsanitize(f.name)}" ${f.sql_bare_type}`);
471
+ const pk = fields.find((f) => f.primary_key).name;
472
+ // create history table
473
+ await db.query(`create table ${schemaPrefix}"${sqlsanitize(this.name)}__history" (
474
+ _version integer,
475
+ _time timestamp,
476
+ _userid integer
477
+ ${flds.join("")}
478
+ ,PRIMARY KEY("${pk}", _version)
479
+ );`);
480
+ }
481
+ /**
482
+ * Drop history table
483
+ * @returns {Promise<void>}
484
+ */
485
+ async drop_history_table() {
486
+ const schemaPrefix = db.getTenantSchemaPrefix();
487
+ await db.query(`
488
+ drop table ${schemaPrefix}"${sqlsanitize(this.name)}__history";`);
489
+ }
490
+ /**
491
+ * Rename table
492
+ * @param new_name
493
+ * @returns {Promise<void>}
494
+ */
495
+ async rename(new_name) {
496
+ //in transaction
497
+ if (db.isSQLite)
498
+ throw new InvalidAdminAction("Cannot rename table on SQLite");
499
+ const schemaPrefix = db.getTenantSchemaPrefix();
500
+ const client = await db.getClient();
501
+ await client.query(`BEGIN`);
502
+ try {
503
+ //rename table
504
+ await db.query(`alter table ${schemaPrefix}"${sqlsanitize(this.name)}" rename to "${sqlsanitize(new_name)}";`);
505
+ //change refs
506
+ await db.query(`update ${schemaPrefix}_sc_fields set reftable_name=$1 where reftable_name=$2`, [sqlsanitize(new_name), sqlsanitize(this.name)]);
507
+ //rename history
508
+ if (this.versioned)
509
+ await db.query(`alter table ${schemaPrefix}"${sqlsanitize(this.name)}__history" rename to "${sqlsanitize(new_name)}__history";`);
510
+ //1. change record
511
+ await this.update({ name: new_name });
512
+ await client.query(`COMMIT`);
513
+ }
514
+ catch (e) {
515
+ await client.query(`ROLLBACK`);
516
+ client.release(true);
517
+ throw e;
518
+ }
519
+ client.release(true);
520
+ await require("../db/state").getState().refresh_tables();
521
+ }
522
+ /**
523
+ * Update Table description in _sc_table
524
+ * Also creates / drops history table for table
525
+ * @param new_table_rec
526
+ * @returns {Promise<void>}
527
+ */
528
+ async update(new_table_rec) {
529
+ if (new_table_rec.ownership_field_id === "")
530
+ delete new_table_rec.ownership_field_id;
531
+ const existing = await Table.findOne({ id: this.id });
532
+ const { external, fields, ...upd_rec } = new_table_rec;
533
+ await db.update("_sc_tables", upd_rec, this.id);
534
+ await require("../db/state").getState().refresh_tables();
535
+ const new_table = await Table.findOne({ id: this.id });
536
+ if (new_table.versioned && !existing.versioned) {
537
+ await new_table.create_history_table();
538
+ }
539
+ else if (!new_table.versioned && existing.versioned) {
540
+ await new_table.drop_history_table();
541
+ }
542
+ Object.assign(this, new_table_rec);
543
+ }
544
+ /**
545
+ * Get table history data
546
+ * @param id
547
+ * @returns {Promise<*>}
548
+ */
549
+ async get_history(id) {
550
+ return await db.select(`${sqlsanitize(this.name)}__history`, { id }, { orderBy: "_version" });
551
+ }
552
+ /**
553
+ * Enable constraints
554
+ * @returns {Promise<void>}
555
+ */
556
+ async enable_fkey_constraints() {
557
+ const fields = await this.getFields();
558
+ for (const f of fields)
559
+ await f.enable_fkey_constraint(this);
560
+ }
561
+ /**
562
+ * Table Create from CSV
563
+ * @param name
564
+ * @param filePath
565
+ * @returns {Promise<{error: string}|{error: string}|{error: string}|{error: string}|{error: string}|{success: string}|{error: (string|string|*)}>}
566
+ */
567
+ static async create_from_csv(name, filePath) {
568
+ let rows;
569
+ try {
570
+ const s = await getLines(filePath, 500);
571
+ rows = await csvtojson().fromString(s); // todo agrument type unknown
572
+ }
573
+ catch (e) {
574
+ return { error: `Error processing CSV file` };
575
+ }
576
+ const rowsTr = transposeObjects(rows);
577
+ const table = await Table.create(name);
578
+ for (const [k, vs] of Object.entries(rowsTr)) {
579
+ const required = vs.every((v) => v !== "");
580
+ const nonEmpties = vs.filter((v) => v !== "");
581
+ const isBools = "true false yes no on off y n t f".split(" ");
582
+ let type;
583
+ if (nonEmpties.every((v) =>
584
+ //https://www.postgresql.org/docs/11/datatype-boolean.html
585
+ isBools.includes(v && v.toLowerCase && v.toLowerCase())))
586
+ type = "Bool";
587
+ else if (nonEmpties.every((v) => !isNaN(v)))
588
+ if (nonEmpties.every((v) => Number.isSafeInteger(+v)))
589
+ type = "Integer";
590
+ else
591
+ type = "Float";
592
+ else if (nonEmpties.every((v) => isDate(v)))
593
+ type = "Date";
594
+ else
595
+ type = "String";
596
+ const label = (k.charAt(0).toUpperCase() + k.slice(1)).replace(/_/g, " ");
597
+ //can fail here if: non integer i d, duplicate headers, invalid name
598
+ const fld = new Field({
599
+ name: Field.labelToName(k),
600
+ required,
601
+ type,
602
+ table,
603
+ label,
604
+ });
605
+ if (db.sqlsanitize(k.toLowerCase()) === "id") {
606
+ if (type !== "Integer") {
607
+ await table.delete();
608
+ return { error: `Columns named "id" must have only integers` };
609
+ }
610
+ if (!required) {
611
+ await table.delete();
612
+ return { error: `Columns named "id" must not have missing values` };
613
+ }
614
+ continue;
615
+ }
616
+ if (db.sqlsanitize(fld.name) === "") {
617
+ await table.delete();
618
+ return {
619
+ error: `Invalid column name ${k} - Use A-Z, a-z, 0-9, _ only`,
620
+ };
621
+ }
622
+ try {
623
+ await Field.create(fld);
624
+ }
625
+ catch (e) {
626
+ await table.delete();
627
+ return { error: `Error in header ${k}: ${e.message}` };
628
+ }
629
+ }
630
+ const parse_res = await table.import_csv_file(filePath);
631
+ if (parse_res.error) {
632
+ await table.delete();
633
+ return { error: parse_res.error };
634
+ }
635
+ parse_res.table = table;
636
+ await require("../db/state").getState().refresh_tables();
637
+ return parse_res;
638
+ }
639
+ /**
640
+ * Import CSV file to existing table
641
+ * @param filePath
642
+ * @param recalc_stored
643
+ * @param skip_first_data_row
644
+ * @returns {Promise<{error: string}|{success: string}>}
645
+ */
646
+ async import_csv_file(filePath, recalc_stored, skip_first_data_row) {
647
+ let headers;
648
+ const { readStateStrict } = require("../plugin-helper");
649
+ try {
650
+ const s = await getLines(filePath, 1);
651
+ [headers] = await csvtojson({
652
+ output: "csv",
653
+ noheader: true,
654
+ }).fromString(s); // todo agrument type unknown
655
+ }
656
+ catch (e) {
657
+ return { error: `Error processing CSV file` };
658
+ }
659
+ const fields = (await this.getFields()).filter((f) => !f.calculated);
660
+ const okHeaders = {};
661
+ const pk_name = this.pk_name;
662
+ const renames = [];
663
+ for (const f of fields) {
664
+ if (headers.includes(f.name))
665
+ okHeaders[f.name] = f;
666
+ else if (headers.includes(f.label)) {
667
+ okHeaders[f.label] = f;
668
+ renames.push({ from: f.label, to: f.name });
669
+ }
670
+ else if (f.required && !f.primary_key)
671
+ return { error: `Required field missing: ${f.label}` };
672
+ }
673
+ const fieldNames = headers.map((hnm) => {
674
+ if (okHeaders[hnm])
675
+ return okHeaders[hnm].name;
676
+ });
677
+ // also id
678
+ if (headers.includes(`id`))
679
+ okHeaders.id = { type: "Integer" };
680
+ const colRe = new RegExp(`(${Object.keys(okHeaders).join("|")})`);
681
+ let i = 1;
682
+ let rejects = 0;
683
+ const client = db.isSQLite ? db : await db.getClient();
684
+ const stats = await fs.promises.stat(filePath);
685
+ const fileSizeInMegabytes = stats.size / (1024 * 1024);
686
+ await client.query("BEGIN");
687
+ const readStream = fs.createReadStream(filePath);
688
+ try {
689
+ if (db.copyFrom && fileSizeInMegabytes > 1) {
690
+ let theError;
691
+ const copyres = await db
692
+ .copyFrom(readStream, this.name, fieldNames, client)
693
+ .catch((cate) => {
694
+ theError = cate;
695
+ });
696
+ if (theError || (copyres && copyres.error)) {
697
+ theError = theError || copyres.error;
698
+ return {
699
+ error: `Error processing CSV file: ${!theError
700
+ ? theError
701
+ : theError.error || theError.message || theError}`,
702
+ };
703
+ }
704
+ }
705
+ else {
706
+ await new Promise((resolve, reject) => {
707
+ csvtojson({
708
+ includeColumns: colRe,
709
+ })
710
+ .fromStream(readStream)
711
+ .subscribe(async (rec) => {
712
+ i += 1;
713
+ if (skip_first_data_row && i === 2)
714
+ return;
715
+ try {
716
+ renames.forEach(({ from, to }) => {
717
+ rec[to] = rec[from];
718
+ delete rec[from];
719
+ });
720
+ const rowOk = readStateStrict(rec, fields);
721
+ if (rowOk)
722
+ await db.insert(this.name, rec, {
723
+ noid: true,
724
+ client,
725
+ pk_name,
726
+ });
727
+ else
728
+ rejects += 1;
729
+ }
730
+ catch (e) {
731
+ await client.query("ROLLBACK");
732
+ if (!db.isSQLite)
733
+ await client.release(true);
734
+ reject({ error: `${e.message} in row ${i}` });
735
+ }
736
+ }, (err) => {
737
+ reject({ error: !err ? err : err.message || err });
738
+ }, () => {
739
+ resolve();
740
+ });
741
+ });
742
+ readStream.destroy();
743
+ }
744
+ }
745
+ catch (e) {
746
+ return {
747
+ error: `Error processing CSV file: ${!e ? e : e.error || e.message || e}`,
748
+ };
749
+ }
750
+ await client.query("COMMIT");
751
+ if (!db.isSQLite)
752
+ await client.release(true);
753
+ const pk = fields.find((f) => f.primary_key);
754
+ if (db.reset_sequence && pk.type.name === "Integer")
755
+ await db.reset_sequence(this.name);
756
+ if (recalc_stored && this.fields.some((f) => f.calculated && f.stored)) {
757
+ await recalculate_for_stored(this);
758
+ }
759
+ return {
760
+ success: `Imported ${i > 1 ? i - 1 - rejects : ""} rows into table ${this.name}` + (rejects ? `. Rejected ${rejects} rows.` : ""),
761
+ };
762
+ }
763
+ /**
764
+ * Import JSON table description
765
+ * @param filePath
766
+ * @param skip_first_data_row
767
+ * @returns {Promise<{error: string}|{success: string}>}
768
+ */
769
+ async import_json_file(filePath, skip_first_data_row) {
770
+ // todo argument type buffer is not assignable for type String...
771
+ const file_rows = JSON.parse(await fs.promises.readFile(filePath));
772
+ const fields = await this.getFields();
773
+ const pk_name = this.pk_name;
774
+ const { readState } = require("../plugin-helper");
775
+ let i = 1;
776
+ const client = db.isSQLite ? db : await db.getClient();
777
+ await client.query("BEGIN");
778
+ for (const rec of file_rows) {
779
+ i += 1;
780
+ if (skip_first_data_row && i === 2)
781
+ continue;
782
+ fields
783
+ .filter((f) => f.calculated && !f.stored)
784
+ .forEach((f) => {
785
+ if (typeof rec[f.name] !== "undefined") {
786
+ delete rec[f.name];
787
+ }
788
+ });
789
+ try {
790
+ readState(rec, fields);
791
+ await db.insert(this.name, rec, { noid: true, client, pk_name });
792
+ }
793
+ catch (e) {
794
+ await client.query("ROLLBACK");
795
+ if (!db.isSQLite)
796
+ await client.release(true);
797
+ return { error: `${e.message} in row ${i}` };
798
+ }
799
+ }
800
+ await client.query("COMMIT");
801
+ if (!db.isSQLite)
802
+ await client.release(true);
803
+ const pk = fields.find((f) => f.primary_key);
804
+ if (db.reset_sequence && pk.type.name === "Integer")
805
+ await db.reset_sequence(this.name);
806
+ return {
807
+ success: `Imported ${file_rows.length} rows into table ${this.name}`,
808
+ };
809
+ }
810
+ /**
811
+ * Get parent relations for table
812
+ * @param allow_double
813
+ * @returns {Promise<{parent_relations: object[], parent_field_list: object[]}>}
814
+ */
815
+ async get_parent_relations(allow_double) {
816
+ const fields = await this.getFields();
817
+ let parent_relations = [];
818
+ let parent_field_list = [];
819
+ for (const f of fields) {
820
+ if (f.is_fkey && f.type !== "File") {
821
+ const table = await Table.findOne({ name: f.reftable_name });
822
+ await table.getFields();
823
+ for (const pf of table.fields.filter((f) => !f.calculated || f.stored)) {
824
+ parent_field_list.push(`${f.name}.${pf.name}`);
825
+ if (pf.is_fkey && pf.type !== "File" && allow_double) {
826
+ const table1 = await Table.findOne({ name: pf.reftable_name });
827
+ await table1.getFields();
828
+ for (const gpf of table1.fields.filter((f) => !f.calculated || f.stored)) {
829
+ parent_field_list.push(`${f.name}.${pf.name}.${gpf.name}`);
830
+ }
831
+ parent_relations.push({ key_field: pf, through: f, table: table1 });
832
+ }
833
+ }
834
+ parent_relations.push({ key_field: f, table });
835
+ }
836
+ }
837
+ return { parent_relations, parent_field_list };
838
+ }
839
+ /**
840
+ * Get child relations for table
841
+ * @returns {Promise<{child_relations: object[], child_field_list: object[]}>}
842
+ */
843
+ async get_child_relations() {
844
+ const cfields = await Field.find({ reftable_name: this.name });
845
+ let child_relations = [];
846
+ let child_field_list = [];
847
+ for (const f of cfields) {
848
+ if (f.is_fkey) {
849
+ const table = await Table.findOne({ id: f.table_id });
850
+ child_field_list.push(`${table.name}.${f.name}`);
851
+ await table.getFields();
852
+ child_relations.push({ key_field: f, table });
853
+ }
854
+ }
855
+ return { child_relations, child_field_list };
856
+ }
857
+ /**
858
+ *
859
+ * @param opts
860
+ * @returns {Promise<{values, sql: string}>}
861
+ */
862
+ async getJoinedQuery(opts = {}) {
863
+ const fields = await this.getFields();
864
+ let fldNms = [];
865
+ let joinq = "";
866
+ let joinTables = [];
867
+ let joinFields = opts.joinFields || [];
868
+ const schema = db.getTenantSchemaPrefix();
869
+ fields
870
+ .filter((f) => f.type === "File")
871
+ .forEach((f) => {
872
+ joinFields[`${f.name}__filename`] = {
873
+ ref: f.name,
874
+ reftable: "_sc_files",
875
+ target: `filename`,
876
+ };
877
+ });
878
+ for (const [fldnm, { ref, target, through }] of Object.entries(joinFields)) {
879
+ const reffield = fields.find((f) => f.name === ref);
880
+ if (!reffield)
881
+ throw new InvalidConfiguration(`Key field ${ref} not found in table ${this.name}`);
882
+ const reftable = reffield.reftable_name;
883
+ if (!reftable)
884
+ throw new InvalidConfiguration(`Field ${ref} is not a key field`);
885
+ const jtNm = `${sqlsanitize(reftable)}_jt_${sqlsanitize(ref)}`;
886
+ if (!joinTables.includes(jtNm)) {
887
+ joinTables.push(jtNm);
888
+ joinq += ` left join ${schema}"${sqlsanitize(reftable)}" ${jtNm} on ${jtNm}."${reffield.refname}"=a."${sqlsanitize(ref)}"`;
889
+ }
890
+ if (through) {
891
+ const throughTable = await Table.findOne({
892
+ name: reffield.reftable_name,
893
+ });
894
+ if (!throughTable)
895
+ throw new InvalidConfiguration(`Join-through table ${reffield.reftable_name} not found`);
896
+ const throughTableFields = await throughTable.getFields();
897
+ const throughRefField = throughTableFields.find((f) => f.name === through);
898
+ if (!throughRefField)
899
+ throw new InvalidConfiguration(`Reference field field ${through} not found in table ${throughTable.name}`);
900
+ const finalTable = throughRefField.reftable_name;
901
+ const jtNm1 = `${sqlsanitize(reftable)}_jt_${sqlsanitize(through)}_jt_${sqlsanitize(ref)}`;
902
+ if (!joinTables.includes(jtNm1)) {
903
+ joinTables.push(jtNm1);
904
+ joinq += ` left join ${schema}"${sqlsanitize(finalTable)}" ${jtNm1} on ${jtNm1}.id=${jtNm}."${sqlsanitize(through)}"`;
905
+ }
906
+ fldNms.push(`${jtNm1}.${sqlsanitize(target)} as ${sqlsanitize(fldnm)}`);
907
+ }
908
+ else {
909
+ fldNms.push(`${jtNm}.${sqlsanitize(target)} as ${sqlsanitize(fldnm)}`);
910
+ }
911
+ }
912
+ for (const f of fields.filter((f) => !f.calculated || f.stored)) {
913
+ fldNms.push(`a."${sqlsanitize(f.name)}"`);
914
+ }
915
+ Object.entries(opts.aggregations || {}).forEach(([fldnm, { table, ref, field, where, aggregate, subselect }]) => {
916
+ if (aggregate.startsWith("Latest ")) {
917
+ const dateField = aggregate.replace("Latest ", "");
918
+ fldNms.push(`(select "${sqlsanitize(field)}" from ${schema}"${sqlsanitize(table)}" where ${dateField}=(select max(${dateField}) from ${schema}"${sqlsanitize(table)}" where "${sqlsanitize(ref)}"=a.id${where ? ` and ${where}` : ""}) and "${sqlsanitize(ref)}"=a.id) ${sqlsanitize(fldnm)}`);
919
+ }
920
+ else if (subselect)
921
+ fldNms.push(`(select ${sqlsanitize(aggregate)}(${field ? `"${sqlsanitize(field)}"` : "*"}) from ${schema}"${sqlsanitize(table)}" where ${sqlsanitize(ref)} in (select "${subselect.field}" from ${schema}"${subselect.table.name}" where "${subselect.whereField}"=a.id)) ${sqlsanitize(fldnm)}`);
922
+ else
923
+ fldNms.push(`(select ${sqlsanitize(aggregate)}(${field ? `"${sqlsanitize(field)}"` : "*"}) from ${schema}"${sqlsanitize(table)}" where "${sqlsanitize(ref)}"=a.id${where ? ` and ${where}` : ""}) ${sqlsanitize(fldnm)}`);
924
+ });
925
+ let whereObj = {};
926
+ if (opts.where) {
927
+ Object.keys(opts.where).forEach((k) => {
928
+ if (k === "_fts")
929
+ whereObj[k] = { table: "a", ...opts.where[k] };
930
+ else
931
+ whereObj[`a."${k}"`] = opts.where[k];
932
+ });
933
+ }
934
+ const { where, values } = mkWhere(whereObj, db.isSQLite);
935
+ const selectopts = {
936
+ limit: opts.limit,
937
+ orderBy: opts.orderBy &&
938
+ (opts.orderBy.distance ? opts.orderBy : "a." + opts.orderBy),
939
+ orderDesc: opts.orderDesc,
940
+ offset: opts.offset,
941
+ };
942
+ const sql = `SELECT ${fldNms.join()} FROM ${schema}"${sqlsanitize(this.name)}" a ${joinq} ${where} ${mkSelectOptions(selectopts)}`;
943
+ return { sql, values };
944
+ }
945
+ /**
946
+ * @param {object} [opts = {}]
947
+ * @returns {Promise<object[]>}
948
+ */
949
+ async getJoinedRows(opts = {}) {
950
+ const fields = await this.getFields();
951
+ const { sql, values } = await this.getJoinedQuery(opts);
952
+ const res = await db.query(sql, values);
953
+ return apply_calculated_fields(res.rows, fields);
954
+ }
955
+ }
956
+ /**
957
+ * Table contract
958
+ * @type {{variables: {name: ((function(*=): *)|*)}, methods: {updateRow: ((function(*=): *)|*), get_history: ((function(*=): *)|*), tryUpdateRow: ((function(*=): *)|*), deleteRows: ((function(*=): *)|*), update: ((function(*=): *)|*), getRows: ((function(*=): *)|*), getRow: ((function(*=): *)|*), delete: ((function(*=): *)|*), get_parent_relations: ((function(*=): *)|*), get_child_relations: ((function(*=): *)|*), tryInsertRow: ((function(*=): *)|*), getFields: ((function(*=): *)|*), insertRow: ((function(*=): *)|*), toggleBool: ((function(*=): *)|*), getJoinedRows: ((function(*=): *)|*), countRows: ((function(*=): *)|*), distinctValues: ((function(*=): *)|*), sql_name: ((function(*=): *)|*), import_csv_file: ((function(*=): *)|*)}, static_methods: {find: ((function(*=): *)|*), create_from_csv: ((function(*=): *)|*), findOne: ((function(*=): *)|*), find_with_external: ((function(*=): *)|*), create: ((function(*=): *)|*)}, constructs: {name: ((function(*=): *)|*)}}}
959
+ */
960
+ Table.contract = {
961
+ constructs: { name: is.str },
962
+ variables: { name: is.str },
963
+ methods: {
964
+ delete: is.fun([], is.promise(is.eq(undefined))),
965
+ update: is.fun(is.obj(), is.promise(is.eq(undefined))),
966
+ deleteRows: is.fun(is.obj(), is.promise(is.eq(undefined))),
967
+ getRow: is.fun(is.maybe(is.obj()), is.promise(is.maybe(is.obj()))),
968
+ getRows: is.fun(is.maybe(is.obj()), is.promise(is.array(is.obj()))),
969
+ countRows: is.fun(is.maybe(is.obj()), is.promise(is.posint)),
970
+ updateRow: is.fun([is.obj(), is.any], is.promise(is.eq(undefined))),
971
+ toggleBool: is.fun([is.any, is.str], is.promise(is.eq(undefined))),
972
+ insertRow: is.fun(is.obj(), is.promise(is.any)),
973
+ get_history: is.fun(is.posint, is.promise(is.array(is.obj()))),
974
+ distinctValues: is.fun(is.str, is.promise(is.array(is.any))),
975
+ tryInsertRow: is.fun([is.obj(), is.maybe(is.posint)], is.promise(is.or(is.obj({ error: is.str }), is.obj({ success: is.any })))),
976
+ tryUpdateRow: is.fun([is.obj(), is.any, is.maybe(is.posint)], is.promise(is.or(is.obj({ error: is.str }), is.obj({ success: is.eq(true) })))),
977
+ sql_name: is.getter(is.str),
978
+ getFields: is.fun([], is.promise(is.array(is.class("Field")))),
979
+ get_parent_relations: is.fun([], is.promise(is.obj({
980
+ parent_relations: is.array(is.obj({
981
+ key_field: is.class("Field"),
982
+ table: is.class("Table"),
983
+ })),
984
+ parent_field_list: is.array(is.str),
985
+ }))),
986
+ get_child_relations: is.fun([], is.promise(is.obj({
987
+ child_relations: is.array(is.obj({
988
+ key_field: is.class("Field"),
989
+ table: is.class("Table"),
990
+ })),
991
+ child_field_list: is.array(is.str),
992
+ }))),
993
+ import_csv_file: is.fun(is.str, is.promise(is.or(is.obj({ success: is.str }), is.obj({ error: is.str })))),
994
+ getJoinedRows: is.fun(is.maybe(is_table_query), is.promise(is.array(is.obj({})))),
995
+ },
996
+ static_methods: {
997
+ find: is.fun([is.maybe(is.obj()), is.maybe(is.obj())], is.promise(is.array(is.class("Table")))),
998
+ find_with_external: is.fun([is.maybe(is.obj()), is.maybe(is.obj())], is.promise(is.array(is.or(is.class("Table"), is.obj({ external: is.eq(true) }))))),
999
+ findOne: is.fun(is.or(is.obj(), is.str, is.posint), is.maybe(is.or(is.class("Table"), is.obj({ external: is.eq(true) })))),
1000
+ create: is.fun(is.str, is.promise(is.class("Table"))),
1001
+ create_from_csv: is.fun([is.str, is.str], is.promise(is.or(is.obj({ success: is.str, table: is.class("Table") }), is.obj({ error: is.str })))),
1002
+ //update: is.fun([is.posint, is.obj({})], is.promise(is.eq(undefined)))
1003
+ },
1004
+ };
1005
+ module.exports = Table;
1006
+ //# sourceMappingURL=table.js.map