@saltcorn/data 0.6.1-beta.3 → 0.6.2-beta.2

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