@budibase/server 1.0.123 → 1.0.125

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 (325) hide show
  1. package/builder/assets/index.3d890df7.js +1299 -0
  2. package/builder/assets/index.89795487.css +6 -0
  3. package/builder/assets/{vendor.8e34a169.js → vendor.5240f480.js} +1 -1
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +695 -1678
  6. package/coverage/coverage-final.json +28 -43
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +8 -3
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +9 -4
  9. package/coverage/lcov-report/api/controllers/auth.js.html +8 -3
  10. package/coverage/lcov-report/api/controllers/automation.js.html +8 -3
  11. package/coverage/lcov-report/api/controllers/backup.js.html +8 -3
  12. package/coverage/lcov-report/api/controllers/cloud.js.html +8 -3
  13. package/coverage/lcov-report/api/controllers/component.js.html +8 -3
  14. package/coverage/lcov-report/api/controllers/datasource.js.html +11 -6
  15. package/coverage/lcov-report/api/controllers/dev.js.html +8 -3
  16. package/coverage/lcov-report/api/controllers/index.html +16 -26
  17. package/coverage/lcov-report/api/controllers/integration.js.html +8 -3
  18. package/coverage/lcov-report/api/controllers/layout.js.html +8 -3
  19. package/coverage/lcov-report/api/controllers/metadata.js.html +8 -3
  20. package/coverage/lcov-report/api/controllers/migrations.js.html +8 -3
  21. package/coverage/lcov-report/api/controllers/permission.js.html +8 -3
  22. package/coverage/lcov-report/api/controllers/query/index.html +16 -26
  23. package/coverage/lcov-report/api/controllers/query/validation.js.html +8 -3
  24. package/coverage/lcov-report/api/controllers/role.js.html +10 -5
  25. package/coverage/lcov-report/api/controllers/routing.js.html +9 -4
  26. package/coverage/lcov-report/api/controllers/row/external.js.html +8 -3
  27. package/coverage/lcov-report/api/controllers/row/index.html +25 -35
  28. package/coverage/lcov-report/api/controllers/row/internal.js.html +32 -24
  29. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +21 -16
  30. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +24 -19
  31. package/coverage/lcov-report/api/controllers/row/utils.js.html +33 -19
  32. package/coverage/lcov-report/api/controllers/screen.js.html +9 -4
  33. package/coverage/lcov-report/api/controllers/script.js.html +8 -3
  34. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +55 -50
  35. package/coverage/lcov-report/api/controllers/table/external.js.html +8 -3
  36. package/coverage/lcov-report/api/controllers/table/index.html +19 -44
  37. package/coverage/lcov-report/api/controllers/table/index.js.html +20 -15
  38. package/coverage/lcov-report/api/controllers/templates.js.html +8 -3
  39. package/coverage/lcov-report/api/controllers/user.js.html +8 -3
  40. package/coverage/lcov-report/api/controllers/view/exporters.js.html +8 -3
  41. package/coverage/lcov-report/api/controllers/view/index.html +8 -3
  42. package/coverage/lcov-report/api/controllers/view/index.js.html +10 -5
  43. package/coverage/lcov-report/api/controllers/view/utils.js.html +8 -3
  44. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +8 -3
  45. package/coverage/lcov-report/api/controllers/webhook.js.html +10 -5
  46. package/coverage/lcov-report/api/index.html +18 -13
  47. package/coverage/lcov-report/api/index.js.html +28 -8
  48. package/coverage/lcov-report/api/routes/analytics.js.html +8 -3
  49. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -3
  50. package/coverage/lcov-report/api/routes/auth.js.html +8 -3
  51. package/coverage/lcov-report/api/routes/automation.js.html +8 -3
  52. package/coverage/lcov-report/api/routes/backup.js.html +8 -3
  53. package/coverage/lcov-report/api/routes/cloud.js.html +8 -3
  54. package/coverage/lcov-report/api/routes/component.js.html +8 -3
  55. package/coverage/lcov-report/api/routes/datasource.js.html +8 -3
  56. package/coverage/lcov-report/api/routes/deploy.js.html +8 -3
  57. package/coverage/lcov-report/api/routes/dev.js.html +9 -4
  58. package/coverage/lcov-report/api/routes/index.html +13 -68
  59. package/coverage/lcov-report/api/routes/integration.js.html +8 -3
  60. package/coverage/lcov-report/api/routes/layout.js.html +8 -3
  61. package/coverage/lcov-report/api/routes/metadata.js.html +8 -3
  62. package/coverage/lcov-report/api/routes/migrations.js.html +8 -3
  63. package/coverage/lcov-report/api/routes/permission.js.html +8 -3
  64. package/coverage/lcov-report/api/routes/query.js.html +8 -3
  65. package/coverage/lcov-report/api/routes/role.js.html +8 -3
  66. package/coverage/lcov-report/api/routes/routing.js.html +8 -3
  67. package/coverage/lcov-report/api/routes/screen.js.html +8 -3
  68. package/coverage/lcov-report/api/routes/script.js.html +8 -3
  69. package/coverage/lcov-report/api/routes/table.js.html +8 -3
  70. package/coverage/lcov-report/api/routes/templates.js.html +8 -3
  71. package/coverage/lcov-report/api/routes/user.js.html +8 -3
  72. package/coverage/lcov-report/api/routes/utils/index.html +8 -3
  73. package/coverage/lcov-report/api/routes/utils/validators.js.html +8 -3
  74. package/coverage/lcov-report/api/routes/view.js.html +8 -3
  75. package/coverage/lcov-report/api/routes/webhook.js.html +8 -3
  76. package/coverage/lcov-report/automations/actions.js.html +21 -7
  77. package/coverage/lcov-report/automations/automationUtils.js.html +64 -23
  78. package/coverage/lcov-report/automations/bullboard.js.html +8 -3
  79. package/coverage/lcov-report/automations/index.html +27 -37
  80. package/coverage/lcov-report/automations/index.js.html +8 -3
  81. package/coverage/lcov-report/automations/steps/bash.js.html +8 -3
  82. package/coverage/lcov-report/automations/steps/delay.js.html +8 -3
  83. package/coverage/lcov-report/automations/steps/discord.js.html +8 -3
  84. package/coverage/lcov-report/automations/steps/executeQuery.js.html +8 -3
  85. package/coverage/lcov-report/automations/steps/executeScript.js.html +8 -3
  86. package/coverage/lcov-report/automations/steps/filter.js.html +8 -3
  87. package/coverage/lcov-report/automations/steps/index.html +31 -41
  88. package/coverage/lcov-report/automations/steps/integromat.js.html +8 -3
  89. package/coverage/lcov-report/{api/routes/static.js.html → automations/steps/loop.js.html} +70 -80
  90. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +9 -4
  91. package/coverage/lcov-report/automations/steps/queryRows.js.html +9 -4
  92. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +8 -3
  93. package/coverage/lcov-report/automations/steps/serverLog.js.html +8 -3
  94. package/coverage/lcov-report/automations/steps/slack.js.html +8 -3
  95. package/coverage/lcov-report/automations/steps/updateRow.js.html +8 -3
  96. package/coverage/lcov-report/automations/steps/utils.js.html +14 -9
  97. package/coverage/lcov-report/automations/steps/zapier.js.html +8 -3
  98. package/coverage/lcov-report/automations/triggerInfo/app.js.html +8 -3
  99. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +8 -3
  100. package/coverage/lcov-report/automations/triggerInfo/index.html +8 -3
  101. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -3
  102. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +8 -3
  103. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +8 -3
  104. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +8 -3
  105. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +8 -3
  106. package/coverage/lcov-report/automations/triggers.js.html +16 -11
  107. package/coverage/lcov-report/block-navigation.js +8 -0
  108. package/coverage/lcov-report/constants/index.html +12 -7
  109. package/coverage/lcov-report/constants/index.js.html +55 -32
  110. package/coverage/lcov-report/constants/layouts.js.html +8 -3
  111. package/coverage/lcov-report/constants/screens.js.html +8 -3
  112. package/coverage/lcov-report/db/inMemoryView.js.html +8 -3
  113. package/coverage/lcov-report/db/index.html +8 -3
  114. package/coverage/lcov-report/db/index.js.html +9 -4
  115. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +20 -15
  116. package/coverage/lcov-report/db/linkedRows/index.html +8 -3
  117. package/coverage/lcov-report/db/linkedRows/index.js.html +22 -17
  118. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +12 -7
  119. package/coverage/lcov-report/db/newid.js.html +11 -6
  120. package/coverage/lcov-report/db/utils.js.html +84 -79
  121. package/coverage/lcov-report/events/AutomationEmitter.js.html +14 -9
  122. package/coverage/lcov-report/events/index.html +8 -3
  123. package/coverage/lcov-report/events/index.js.html +9 -4
  124. package/coverage/lcov-report/events/utils.js.html +18 -13
  125. package/coverage/lcov-report/index.html +125 -120
  126. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +8 -3
  127. package/coverage/lcov-report/integrations/tests/index.html +8 -3
  128. package/coverage/lcov-report/middleware/appInfo.js.html +8 -3
  129. package/coverage/lcov-report/middleware/builder.js.html +8 -3
  130. package/coverage/lcov-report/middleware/currentapp.js.html +65 -15
  131. package/coverage/lcov-report/middleware/index.html +25 -50
  132. package/coverage/lcov-report/middleware/joi-validator.js.html +9 -4
  133. package/coverage/lcov-report/middleware/publicApi.js.html +8 -3
  134. package/coverage/lcov-report/middleware/resourceId.js.html +8 -3
  135. package/coverage/lcov-report/middleware/selfhost.js.html +9 -4
  136. package/coverage/lcov-report/middleware/utils.js.html +8 -3
  137. package/coverage/lcov-report/sorter.js +26 -0
  138. package/coverage/lcov-report/threads/automation.js.html +581 -90
  139. package/coverage/lcov-report/threads/index.html +30 -40
  140. package/coverage/lcov-report/threads/query.js.html +9 -4
  141. package/coverage/lcov-report/threads/utils.js.html +17 -9
  142. package/coverage/lcov-report/utilities/bcrypt.js.html +8 -3
  143. package/coverage/lcov-report/utilities/budibaseDir.js.html +8 -3
  144. package/coverage/lcov-report/utilities/centralPath.js.html +8 -3
  145. package/coverage/lcov-report/utilities/csvParser.js.html +10 -5
  146. package/coverage/lcov-report/utilities/global.js.html +9 -4
  147. package/coverage/lcov-report/utilities/index.html +8 -3
  148. package/coverage/lcov-report/utilities/index.js.html +11 -6
  149. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +32 -9
  150. package/coverage/lcov-report/utilities/queue/index.html +12 -7
  151. package/coverage/lcov-report/utilities/routing/index.html +8 -3
  152. package/coverage/lcov-report/utilities/routing/index.js.html +8 -3
  153. package/coverage/lcov-report/utilities/rowProcessor/index.html +8 -3
  154. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +48 -43
  155. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +18 -13
  156. package/coverage/lcov-report/utilities/scriptRunner.js.html +8 -3
  157. package/coverage/lcov-report/utilities/security.js.html +9 -4
  158. package/coverage/lcov-report/utilities/statusCodes.js.html +8 -3
  159. package/coverage/lcov-report/utilities/usageQuota/index.html +24 -34
  160. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +44 -39
  161. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +8 -3
  162. package/coverage/lcov-report/utilities/users.js.html +8 -3
  163. package/coverage/lcov-report/utilities/workerRequests.js.html +9 -4
  164. package/coverage/lcov.info +1144 -2875
  165. package/dist/api/controllers/application.js +145 -73
  166. package/dist/api/controllers/deploy/index.js +68 -36
  167. package/dist/api/controllers/public/applications.js +29 -9
  168. package/dist/api/controllers/public/queries.js +27 -7
  169. package/dist/api/controllers/public/rows.js +32 -12
  170. package/dist/api/controllers/public/tables.js +2 -2
  171. package/dist/api/controllers/public/users.js +8 -8
  172. package/dist/api/controllers/public/utils.js +1 -1
  173. package/dist/api/controllers/query/import/index.js +3 -3
  174. package/dist/api/controllers/query/index.js +57 -44
  175. package/dist/api/controllers/row/ExternalRequest.js +27 -27
  176. package/dist/api/controllers/row/index.js +83 -60
  177. package/dist/api/controllers/row/internal.js +2 -1
  178. package/dist/api/controllers/row/utils.js +2 -1
  179. package/dist/api/controllers/static/templates/BudibaseApp.svelte +3 -0
  180. package/dist/api/controllers/table/bulkFormula.js +2 -1
  181. package/dist/api/controllers/table/internal.js +41 -35
  182. package/dist/api/controllers/table/utils.js +271 -229
  183. package/dist/api/index.js +5 -0
  184. package/dist/api/routes/application.js +39 -13
  185. package/dist/api/routes/index.js +61 -56
  186. package/dist/api/routes/public/index.js +6 -9
  187. package/dist/api/routes/public/queries.js +1 -1
  188. package/dist/api/routes/public/rows.js +1 -1
  189. package/dist/api/routes/public/tables.js +3 -3
  190. package/dist/api/routes/public/users.js +1 -1
  191. package/dist/api/routes/row.js +43 -17
  192. package/dist/api/routes/static.js +40 -13
  193. package/dist/api/routes/tests/utilities/TestFunctions.js +75 -33
  194. package/dist/app.js +8 -4
  195. package/dist/automations/actions.js +3 -0
  196. package/dist/automations/automationUtils.js +10 -0
  197. package/dist/automations/steps/createRow.js +12 -12
  198. package/dist/automations/steps/deleteRow.js +13 -16
  199. package/dist/automations/steps/loop.js +51 -0
  200. package/dist/automations/tests/utilities/index.js +13 -11
  201. package/dist/automations/utils.js +187 -133
  202. package/dist/constants/index.js +5 -0
  203. package/dist/definitions/datasource.js +1 -0
  204. package/dist/environment.js +2 -3
  205. package/dist/index.js +4 -0
  206. package/dist/integrations/base/sql.js +2 -2
  207. package/dist/integrations/base/sqlTable.js +2 -2
  208. package/dist/integrations/googlesheets.js +1 -1
  209. package/dist/integrations/index.js +4 -0
  210. package/dist/integrations/microsoftSqlServer.js +8 -8
  211. package/dist/integrations/mysql.js +9 -9
  212. package/dist/integrations/oracle.js +7 -7
  213. package/dist/integrations/postgres.js +7 -7
  214. package/dist/integrations/queries/sql.js +2 -2
  215. package/dist/integrations/redis.js +158 -0
  216. package/dist/integrations/rest.js +1 -1
  217. package/dist/middleware/authorized.js +51 -51
  218. package/dist/middleware/currentapp.js +15 -1
  219. package/dist/migrations/functions/appUrls.js +1 -1
  220. package/dist/migrations/functions/developerQuota.js +49 -0
  221. package/dist/migrations/functions/publishedAppsQuota.js +47 -0
  222. package/dist/migrations/functions/quotas1.js +6 -2
  223. package/dist/migrations/functions/usageQuotas/index.js +0 -4
  224. package/dist/migrations/functions/usageQuotas/syncApps.js +4 -7
  225. package/dist/migrations/functions/usageQuotas/syncDevelopers.js +24 -0
  226. package/dist/migrations/functions/usageQuotas/syncPublishedApps.js +26 -0
  227. package/dist/migrations/functions/usageQuotas/syncRows.js +5 -8
  228. package/dist/migrations/index.js +17 -1
  229. package/dist/package.json +14 -8
  230. package/dist/threads/automation.js +149 -27
  231. package/dist/threads/index.js +36 -10
  232. package/dist/threads/utils.js +1 -0
  233. package/dist/tsconfig.build.tsbuildinfo +1 -0
  234. package/dist/utilities/queue/inMemoryQueue.js +6 -1
  235. package/nodemon.json +1 -1
  236. package/package.json +15 -9
  237. package/scripts/dev/manage.js +2 -0
  238. package/src/api/controllers/{application.js → application.ts} +118 -51
  239. package/src/api/controllers/deploy/{index.js → index.ts} +53 -29
  240. package/src/api/controllers/public/applications.ts +2 -2
  241. package/src/api/controllers/public/queries.ts +1 -1
  242. package/src/api/controllers/public/rows.ts +1 -1
  243. package/src/api/controllers/query/{index.js → index.ts} +51 -48
  244. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  245. package/src/api/controllers/row/{index.js → index.ts} +24 -17
  246. package/src/api/controllers/row/internal.js +2 -1
  247. package/src/api/controllers/row/utils.js +4 -1
  248. package/src/api/controllers/static/templates/BudibaseApp.svelte +3 -0
  249. package/src/api/controllers/table/bulkFormula.js +1 -1
  250. package/src/api/controllers/table/{internal.js → internal.ts} +30 -26
  251. package/src/api/controllers/table/{utils.js → utils.ts} +86 -69
  252. package/src/api/index.js +5 -0
  253. package/src/api/routes/{application.js → application.ts} +8 -14
  254. package/src/api/routes/index.ts +60 -0
  255. package/src/api/routes/public/index.ts +1 -4
  256. package/src/api/routes/{row.js → row.ts} +7 -15
  257. package/src/api/routes/{static.js → static.ts} +11 -11
  258. package/src/api/routes/tests/misc.spec.js +39 -37
  259. package/src/api/routes/tests/utilities/{TestFunctions.js → TestFunctions.ts} +57 -33
  260. package/src/app.ts +1 -2
  261. package/src/automations/actions.js +3 -0
  262. package/src/automations/automationUtils.js +12 -0
  263. package/src/automations/steps/{createRow.js → createRow.ts} +9 -15
  264. package/src/automations/steps/{deleteRow.js → deleteRow.ts} +10 -16
  265. package/src/automations/steps/loop.js +50 -0
  266. package/src/automations/tests/automation.spec.js +0 -1
  267. package/src/automations/tests/{createRow.spec.js → createRow.spec.ts} +4 -15
  268. package/src/automations/tests/{deleteRow.spec.js → deleteRow.spec.ts} +3 -5
  269. package/src/automations/tests/utilities/index.js +12 -10
  270. package/src/automations/{utils.js → utils.ts} +39 -28
  271. package/src/constants/index.js +6 -0
  272. package/src/definitions/common.ts +1 -0
  273. package/src/definitions/datasource.ts +1 -0
  274. package/src/environment.js +2 -3
  275. package/src/index.ts +3 -0
  276. package/src/integrations/index.ts +4 -0
  277. package/src/integrations/redis.ts +152 -0
  278. package/src/integrations/tests/redis.spec.js +60 -0
  279. package/src/middleware/{authorized.js → authorized.ts} +20 -14
  280. package/src/middleware/currentapp.js +16 -1
  281. package/src/middleware/tests/currentapp.spec.js +8 -4
  282. package/src/migrations/functions/developerQuota.ts +15 -0
  283. package/src/migrations/functions/publishedAppsQuota.ts +13 -0
  284. package/src/migrations/functions/tests/quotas1.spec.js +0 -2
  285. package/src/migrations/functions/usageQuotas/index.ts +0 -5
  286. package/src/migrations/functions/usageQuotas/syncApps.ts +3 -6
  287. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +19 -0
  288. package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +21 -0
  289. package/src/migrations/functions/usageQuotas/syncRows.ts +3 -6
  290. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts +34 -0
  291. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +40 -0
  292. package/src/migrations/index.ts +13 -1
  293. package/src/threads/automation.js +196 -34
  294. package/src/threads/{index.js → index.ts} +18 -14
  295. package/src/threads/utils.js +1 -0
  296. package/src/utilities/queue/inMemoryQueue.js +7 -1
  297. package/tsconfig.build.json +10 -0
  298. package/tsconfig.json +2 -2
  299. package/builder/assets/index.68a7f4e3.css +0 -6
  300. package/builder/assets/index.8d4a5b33.js +0 -1291
  301. package/coverage/lcov-report/api/controllers/application.js.html +0 -1436
  302. package/coverage/lcov-report/api/controllers/query/index.js.html +0 -713
  303. package/coverage/lcov-report/api/controllers/row/index.js.html +0 -524
  304. package/coverage/lcov-report/api/controllers/table/internal.js.html +0 -620
  305. package/coverage/lcov-report/api/controllers/table/utils.js.html +0 -1331
  306. package/coverage/lcov-report/api/routes/application.js.html +0 -179
  307. package/coverage/lcov-report/api/routes/index.js.html +0 -266
  308. package/coverage/lcov-report/api/routes/row.js.html +0 -908
  309. package/coverage/lcov-report/automations/steps/createRow.js.html +0 -380
  310. package/coverage/lcov-report/automations/steps/deleteRow.js.html +0 -347
  311. package/coverage/lcov-report/automations/utils.js.html +0 -665
  312. package/coverage/lcov-report/middleware/authorized.js.html +0 -458
  313. package/coverage/lcov-report/middleware/usageQuota.js.html +0 -572
  314. package/coverage/lcov-report/threads/index.js.html +0 -296
  315. package/coverage/lcov-report/utilities/usageQuota/index.js.html +0 -359
  316. package/dist/middleware/usageQuota.js +0 -154
  317. package/dist/tsconfig.tsbuildinfo +0 -1
  318. package/dist/utilities/usageQuota/index.js +0 -86
  319. package/src/api/routes/index.js +0 -62
  320. package/src/middleware/tests/usageQuota.spec.js +0 -120
  321. package/src/middleware/usageQuota.js +0 -164
  322. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +0 -41
  323. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +0 -45
  324. package/src/utilities/tests/usageQuota/usageQuota.spec.js +0 -72
  325. package/src/utilities/usageQuota/index.js +0 -93
@@ -43,53 +43,55 @@ describe("run misc tests", () => {
43
43
 
44
44
  describe("test table utilities", () => {
45
45
  it("should be able to import a CSV", async () => {
46
- const table = await config.createTable({
47
- name: "table",
48
- type: "table",
49
- key: "name",
50
- schema: {
51
- a: {
52
- type: "string",
53
- constraints: {
46
+ return config.doInContext(null, async () => {
47
+ const table = await config.createTable({
48
+ name: "table",
49
+ type: "table",
50
+ key: "name",
51
+ schema: {
52
+ a: {
54
53
  type: "string",
54
+ constraints: {
55
+ type: "string",
56
+ },
55
57
  },
56
- },
57
- b: {
58
- type: "string",
59
- constraints: {
58
+ b: {
60
59
  type: "string",
60
+ constraints: {
61
+ type: "string",
62
+ },
61
63
  },
62
- },
63
- c: {
64
- type: "string",
65
- constraints: {
64
+ c: {
66
65
  type: "string",
66
+ constraints: {
67
+ type: "string",
68
+ },
67
69
  },
68
- },
69
- d: {
70
- type: "string",
71
- constraints: {
70
+ d: {
72
71
  type: "string",
72
+ constraints: {
73
+ type: "string",
74
+ },
73
75
  },
74
76
  },
75
- },
77
+ })
78
+ const dataImport = {
79
+ csvString: "a,b,c,d\n1,2,3,4",
80
+ schema: {},
81
+ }
82
+ for (let col of ["a", "b", "c", "d"]) {
83
+ dataImport.schema[col] = { type: "string" }
84
+ }
85
+ await tableUtils.handleDataImport(
86
+ { userId: "test" },
87
+ table,
88
+ dataImport
89
+ )
90
+ const rows = await config.getRows()
91
+ expect(rows[0].a).toEqual("1")
92
+ expect(rows[0].b).toEqual("2")
93
+ expect(rows[0].c).toEqual("3")
76
94
  })
77
- const dataImport = {
78
- csvString: "a,b,c,d\n1,2,3,4",
79
- schema: {},
80
- }
81
- for (let col of ["a", "b", "c", "d"]) {
82
- dataImport.schema[col] = { type: "string" }
83
- }
84
- await tableUtils.handleDataImport(
85
- { userId: "test" },
86
- table,
87
- dataImport
88
- )
89
- const rows = await config.getRows()
90
- expect(rows[0].a).toEqual("1")
91
- expect(rows[0].b).toEqual("2")
92
- expect(rows[0].c).toEqual("3")
93
95
  })
94
96
  })
95
97
  })
@@ -1,44 +1,54 @@
1
- const rowController = require("../../../controllers/row")
2
- const appController = require("../../../controllers/application")
3
- const { AppStatus } = require("../../../../db/utils")
4
- const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
5
- const { TENANT_ID } = require("../../../../tests/utilities/structures")
6
- const { doInAppContext } = require("@budibase/backend-core/context")
7
- const env = require("../../../../environment")
8
-
9
- function Request(appId, params) {
10
- this.appId = appId
11
- this.params = params
12
- this.request = {}
1
+ import * as rowController from "../../../controllers/row"
2
+ import * as appController from "../../../controllers/application"
3
+ import { AppStatus } from "../../../../db/utils"
4
+ import { BUILTIN_ROLE_IDS } from "@budibase/backend-core/roles"
5
+ import { doInTenant } from "@budibase/backend-core/tenancy"
6
+ import { TENANT_ID } from "../../../../tests/utilities/structures"
7
+ import { getAppDB, doInAppContext } from "@budibase/backend-core/context"
8
+ import * as env from "../../../../environment"
9
+
10
+ class Request {
11
+ appId: any
12
+ params: any
13
+ request: any
14
+ body: any
15
+
16
+ constructor(appId: any, params: any) {
17
+ this.appId = appId
18
+ this.params = params
19
+ this.request = {}
20
+ }
13
21
  }
14
22
 
15
- function runRequest(appId, controlFunc, request) {
23
+ function runRequest(appId: any, controlFunc: any, request?: any) {
16
24
  return doInAppContext(appId, async () => {
17
25
  return controlFunc(request)
18
26
  })
19
27
  }
20
28
 
21
- exports.getAllTableRows = async config => {
29
+ export const getAllTableRows = async (config: any) => {
22
30
  const req = new Request(config.appId, { tableId: config.table._id })
23
31
  await runRequest(config.appId, rowController.fetch, req)
24
32
  return req.body
25
33
  }
26
34
 
27
- exports.clearAllApps = async (tenantId = TENANT_ID) => {
28
- const req = { query: { status: AppStatus.DEV }, user: { tenantId } }
29
- await appController.fetch(req)
30
- const apps = req.body
31
- if (!apps || apps.length <= 0) {
32
- return
33
- }
34
- for (let app of apps) {
35
- const { appId } = app
36
- const req = new Request(null, { appId })
37
- await runRequest(appId, appController.delete, req)
38
- }
35
+ export const clearAllApps = async (tenantId = TENANT_ID) => {
36
+ await doInTenant(tenantId, async () => {
37
+ const req: any = { query: { status: AppStatus.DEV }, user: { tenantId } }
38
+ await appController.fetch(req)
39
+ const apps = req.body
40
+ if (!apps || apps.length <= 0) {
41
+ return
42
+ }
43
+ for (let app of apps) {
44
+ const { appId } = app
45
+ const req = new Request(null, { appId })
46
+ await runRequest(appId, appController.destroy, req)
47
+ }
48
+ })
39
49
  }
40
50
 
41
- exports.clearAllAutomations = async config => {
51
+ export const clearAllAutomations = async (config: any) => {
42
52
  const automations = await config.getAllAutomations()
43
53
  for (let auto of automations) {
44
54
  await doInAppContext(config.appId, async () => {
@@ -47,7 +57,12 @@ exports.clearAllAutomations = async config => {
47
57
  }
48
58
  }
49
59
 
50
- exports.createRequest = (request, method, url, body) => {
60
+ export const createRequest = (
61
+ request: any,
62
+ method: any,
63
+ url: any,
64
+ body: any
65
+ ) => {
51
66
  let req
52
67
 
53
68
  if (method === "POST") req = request.post(url).send(body)
@@ -59,7 +74,12 @@ exports.createRequest = (request, method, url, body) => {
59
74
  return req
60
75
  }
61
76
 
62
- exports.checkBuilderEndpoint = async ({ config, method, url, body }) => {
77
+ export const checkBuilderEndpoint = async ({
78
+ config,
79
+ method,
80
+ url,
81
+ body,
82
+ }: any) => {
63
83
  const headers = await config.login({
64
84
  userId: "us_fail",
65
85
  builder: false,
@@ -71,14 +91,14 @@ exports.checkBuilderEndpoint = async ({ config, method, url, body }) => {
71
91
  .expect(403)
72
92
  }
73
93
 
74
- exports.checkPermissionsEndpoint = async ({
94
+ export const checkPermissionsEndpoint = async ({
75
95
  config,
76
96
  method,
77
97
  url,
78
98
  body,
79
99
  passRole,
80
100
  failRole,
81
- }) => {
101
+ }: any) => {
82
102
  const passHeader = await config.login({
83
103
  roleId: passRole,
84
104
  prodApp: true,
@@ -106,7 +126,11 @@ exports.checkPermissionsEndpoint = async ({
106
126
  .expect(403)
107
127
  }
108
128
 
109
- exports.testAutomation = async (config, automation) => {
129
+ export const getDB = () => {
130
+ return getAppDB()
131
+ }
132
+
133
+ export const testAutomation = async (config: any, automation: any) => {
110
134
  return runRequest(automation.appId, async () => {
111
135
  return await config.request
112
136
  .post(`/api/automations/${automation._id}/test`)
@@ -122,7 +146,7 @@ exports.testAutomation = async (config, automation) => {
122
146
  })
123
147
  }
124
148
 
125
- exports.runInProd = async func => {
149
+ export const runInProd = async (func: any) => {
126
150
  const nodeEnv = env.NODE_ENV
127
151
  const workerId = env.JEST_WORKER_ID
128
152
  env._set("NODE_ENV", "PRODUCTION")
package/src/app.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  // need to load environment first
2
2
  import { ExtendableContext } from "koa"
3
-
4
3
  import * as env from "./environment"
5
4
  import db from "./db"
6
5
  db.init()
@@ -15,7 +14,7 @@ const automations = require("./automations/index")
15
14
  const Sentry = require("@sentry/node")
16
15
  const fileSystem = require("./utilities/fileSystem")
17
16
  const bullboard = require("./automations/bullboard")
18
- const redis = require("./utilities/redis")
17
+ import redis from "./utilities/redis"
19
18
  import * as migrations from "./migrations"
20
19
 
21
20
  const app = new Koa()
@@ -13,6 +13,7 @@ const integromat = require("./steps/integromat")
13
13
  let filter = require("./steps/filter")
14
14
  let delay = require("./steps/delay")
15
15
  let queryRow = require("./steps/queryRows")
16
+ let loop = require("./steps/loop")
16
17
  const env = require("../environment")
17
18
 
18
19
  const ACTION_IMPLS = {
@@ -27,6 +28,7 @@ const ACTION_IMPLS = {
27
28
  DELAY: delay.run,
28
29
  FILTER: filter.run,
29
30
  QUERY_ROWS: queryRow.run,
31
+ LOOP: loop.run,
30
32
  // these used to be lowercase step IDs, maintain for backwards compat
31
33
  discord: discord.run,
32
34
  slack: slack.run,
@@ -45,6 +47,7 @@ const ACTION_DEFINITIONS = {
45
47
  DELAY: delay.definition,
46
48
  FILTER: filter.definition,
47
49
  QUERY_ROWS: queryRow.definition,
50
+ LOOP: loop.definition,
48
51
  // these used to be lowercase step IDs, maintain for backwards compat
49
52
  discord: discord.definition,
50
53
  slack: slack.definition,
@@ -1,4 +1,5 @@
1
1
  const { getTable } = require("../api/controllers/table/utils")
2
+ const { findHBSBlocks } = require("@budibase/string-templates")
2
3
 
3
4
  /**
4
5
  * When values are input to the system generally they will be of type string as this is required for template strings.
@@ -74,3 +75,14 @@ exports.getError = err => {
74
75
  }
75
76
  return typeof err !== "string" ? err.toString() : err
76
77
  }
78
+
79
+ exports.substituteLoopStep = (hbsString, substitute) => {
80
+ let blocks = findHBSBlocks(hbsString)
81
+ for (let block of blocks) {
82
+ let oldBlock = block
83
+ block = block.replace(/loop/, substitute)
84
+ hbsString = hbsString.replace(new RegExp(oldBlock, "g"), block)
85
+ }
86
+
87
+ return hbsString
88
+ }
@@ -1,9 +1,8 @@
1
- const rowController = require("../../api/controllers/row")
2
- const automationUtils = require("../automationUtils")
3
- const usage = require("../../utilities/usageQuota")
4
- const { buildCtx } = require("./utils")
1
+ import { save } from "../../api/controllers/row"
2
+ import { cleanUpRow, getError } from "../automationUtils"
3
+ import { buildCtx } from "./utils"
5
4
 
6
- exports.definition = {
5
+ export const definition = {
7
6
  name: "Create Row",
8
7
  tagline: "Create a {{inputs.enriched.table.name}} row",
9
8
  icon: "TableRowAddBottom",
@@ -59,7 +58,7 @@ exports.definition = {
59
58
  },
60
59
  }
61
60
 
62
- exports.run = async function ({ inputs, appId, emitter }) {
61
+ export async function run({ inputs, appId, emitter }: any) {
63
62
  if (inputs.row == null || inputs.row.tableId == null) {
64
63
  return {
65
64
  success: false,
@@ -69,7 +68,7 @@ exports.run = async function ({ inputs, appId, emitter }) {
69
68
  }
70
69
  }
71
70
  // have to clean up the row, remove the table from it
72
- const ctx = buildCtx(appId, emitter, {
71
+ const ctx: any = buildCtx(appId, emitter, {
73
72
  body: inputs.row,
74
73
  params: {
75
74
  tableId: inputs.row.tableId,
@@ -77,13 +76,8 @@ exports.run = async function ({ inputs, appId, emitter }) {
77
76
  })
78
77
 
79
78
  try {
80
- inputs.row = await automationUtils.cleanUpRow(
81
- inputs.row.tableId,
82
- inputs.row
83
- )
84
- await usage.update(usage.Properties.ROW, 1, { dryRun: true })
85
- await rowController.save(ctx)
86
- await usage.update(usage.Properties.ROW, 1)
79
+ inputs.row = await cleanUpRow(inputs.row.tableId, inputs.row)
80
+ await save(ctx)
87
81
  return {
88
82
  row: inputs.row,
89
83
  response: ctx.body,
@@ -94,7 +88,7 @@ exports.run = async function ({ inputs, appId, emitter }) {
94
88
  } catch (err) {
95
89
  return {
96
90
  success: false,
97
- response: automationUtils.getError(err),
91
+ response: getError(err),
98
92
  }
99
93
  }
100
94
  }
@@ -1,9 +1,8 @@
1
- const rowController = require("../../api/controllers/row")
2
- const usage = require("../../utilities/usageQuota")
3
- const { buildCtx } = require("./utils")
4
- const automationUtils = require("../automationUtils")
1
+ import { destroy } from "../../api/controllers/row"
2
+ import { buildCtx } from "./utils"
3
+ import { getError } from "../automationUtils"
5
4
 
6
- exports.definition = {
5
+ export const definition = {
7
6
  description: "Delete a row from your database",
8
7
  icon: "TableRowRemoveCenter",
9
8
  name: "Delete Row",
@@ -24,12 +23,8 @@ exports.definition = {
24
23
  type: "string",
25
24
  title: "Row ID",
26
25
  },
27
- revision: {
28
- type: "string",
29
- title: "Row Revision",
30
- },
31
26
  },
32
- required: ["tableId", "id", "revision"],
27
+ required: ["tableId", "id"],
33
28
  },
34
29
  outputs: {
35
30
  properties: {
@@ -52,8 +47,8 @@ exports.definition = {
52
47
  },
53
48
  }
54
49
 
55
- exports.run = async function ({ inputs, appId, emitter }) {
56
- if (inputs.id == null || inputs.revision == null) {
50
+ export async function run({ inputs, appId, emitter }: any) {
51
+ if (inputs.id == null) {
57
52
  return {
58
53
  success: false,
59
54
  response: {
@@ -62,7 +57,7 @@ exports.run = async function ({ inputs, appId, emitter }) {
62
57
  }
63
58
  }
64
59
 
65
- let ctx = buildCtx(appId, emitter, {
60
+ let ctx: any = buildCtx(appId, emitter, {
66
61
  body: {
67
62
  _id: inputs.id,
68
63
  _rev: inputs.revision,
@@ -73,8 +68,7 @@ exports.run = async function ({ inputs, appId, emitter }) {
73
68
  })
74
69
 
75
70
  try {
76
- await usage.update(usage.Properties.ROW, -1)
77
- await rowController.destroy(ctx)
71
+ await destroy(ctx)
78
72
  return {
79
73
  response: ctx.body,
80
74
  row: ctx.row,
@@ -83,7 +77,7 @@ exports.run = async function ({ inputs, appId, emitter }) {
83
77
  } catch (err) {
84
78
  return {
85
79
  success: false,
86
- response: automationUtils.getError(err),
80
+ response: getError(err),
87
81
  }
88
82
  }
89
83
  }
@@ -0,0 +1,50 @@
1
+ exports.definition = {
2
+ name: "Looping",
3
+ icon: "Reuse",
4
+ tagline: "Loop the block",
5
+ description: "Loop",
6
+ stepId: "LOOP",
7
+ internal: true,
8
+ inputs: {},
9
+ schema: {
10
+ inputs: {
11
+ properties: {
12
+ option: {
13
+ customType: "loopOption",
14
+ title: "Input type",
15
+ },
16
+ binding: {
17
+ type: "string",
18
+ title: "Binding / Value",
19
+ },
20
+ iterations: {
21
+ type: "number",
22
+ title: "Max loop iterations",
23
+ },
24
+ failure: {
25
+ type: "string",
26
+ title: "Failure Condition",
27
+ },
28
+ },
29
+ required: ["type", "value", "iterations", "failure"],
30
+ },
31
+ outputs: {
32
+ properties: {
33
+ items: {
34
+ customType: "item",
35
+ description: "The item currently being executed",
36
+ },
37
+ success: {
38
+ type: "boolean",
39
+ description: "Whether the message loop was successfully",
40
+ },
41
+ iterations: {
42
+ type: "number",
43
+ descriptions: "The amount of times the block ran",
44
+ },
45
+ },
46
+ required: ["success", "items", "iterations"],
47
+ },
48
+ },
49
+ type: "LOGIC",
50
+ }
@@ -1,4 +1,3 @@
1
- jest.mock("../../utilities/usageQuota")
2
1
  jest.mock("../../threads/automation")
3
2
  jest.mock("../../utilities/redis", () => ({
4
3
  init: jest.fn(),
@@ -1,10 +1,8 @@
1
- jest.mock("../../utilities/usageQuota")
2
-
3
- const usageQuota = require("../../utilities/usageQuota")
4
- const setup = require("./utilities")
1
+ import * as setup from "./utilities"
5
2
 
6
3
  describe("test the create row action", () => {
7
- let table, row
4
+ let table: any
5
+ let row: any
8
6
  let config = setup.getConfig()
9
7
 
10
8
  beforeEach(async () => {
@@ -36,20 +34,11 @@ describe("test the create row action", () => {
36
34
  row: {
37
35
  tableId: "invalid",
38
36
  invalid: "invalid",
39
- }
37
+ },
40
38
  })
41
39
  expect(res.success).toEqual(false)
42
40
  })
43
41
 
44
- it("check usage quota attempts", async () => {
45
- await setup.runInProd(async () => {
46
- await setup.runStep(setup.actions.CREATE_ROW.stepId, {
47
- row
48
- })
49
- expect(usageQuota.update).toHaveBeenCalledWith("rows", 1)
50
- })
51
- })
52
-
53
42
  it("should check invalid inputs return an error", async () => {
54
43
  const res = await setup.runStep(setup.actions.CREATE_ROW.stepId, {})
55
44
  expect(res.success).toEqual(false)
@@ -1,10 +1,9 @@
1
- jest.mock("../../utilities/usageQuota")
2
-
3
- const usageQuota = require("../../utilities/usageQuota")
4
1
  const setup = require("./utilities")
5
2
 
6
3
  describe("test the delete row action", () => {
7
- let table, row, inputs
4
+ let table: any
5
+ let row: any
6
+ let inputs: any
8
7
  let config = setup.getConfig()
9
8
 
10
9
  beforeEach(async () => {
@@ -37,7 +36,6 @@ describe("test the delete row action", () => {
37
36
  it("check usage quota attempts", async () => {
38
37
  await setup.runInProd(async () => {
39
38
  await setup.runStep(setup.actions.DELETE_ROW.stepId, inputs)
40
- expect(usageQuota.update).toHaveBeenCalledWith("rows", -1)
41
39
  })
42
40
  })
43
41
 
@@ -1,4 +1,6 @@
1
1
  const TestConfig = require("../../../tests/utilities/TestConfiguration")
2
+ const { TENANT_ID } = require("../../../tests/utilities/structures")
3
+ const { doInTenant } = require("@budibase/backend-core/tenancy")
2
4
  const actions = require("../../actions")
3
5
  const emitter = require("../../../events/index")
4
6
  const env = require("../../../environment")
@@ -18,7 +20,6 @@ exports.afterAll = () => {
18
20
 
19
21
  exports.runInProd = async fn => {
20
22
  env._set("NODE_ENV", "production")
21
- env._set("USE_QUOTAS", 1)
22
23
  let error
23
24
  try {
24
25
  await fn()
@@ -26,21 +27,22 @@ exports.runInProd = async fn => {
26
27
  error = err
27
28
  }
28
29
  env._set("NODE_ENV", "jest")
29
- env._set("USE_QUOTAS", null)
30
30
  if (error) {
31
31
  throw error
32
32
  }
33
33
  }
34
34
 
35
35
  exports.runStep = async function runStep(stepId, inputs) {
36
- let step = await actions.getAction(stepId)
37
- expect(step).toBeDefined()
38
- return step({
39
- inputs,
40
- appId: config ? config.getAppId() : null,
41
- // don't really need an API key, mocked out usage quota, not being tested here
42
- apiKey: exports.apiKey,
43
- emitter,
36
+ return doInTenant(TENANT_ID, async () => {
37
+ let step = await actions.getAction(stepId)
38
+ expect(step).toBeDefined()
39
+ return step({
40
+ inputs,
41
+ appId: config ? config.getAppId() : null,
42
+ // don't really need an API key, mocked out usage quota, not being tested here
43
+ apiKey: exports.apiKey,
44
+ emitter,
45
+ })
44
46
  })
45
47
  }
46
48