@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
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.run = void 0;
13
+ const tenancy_1 = require("@budibase/backend-core/tenancy");
14
+ const db_1 = require("@budibase/backend-core/db");
15
+ const pro_1 = require("@budibase/pro");
16
+ const run = () => __awaiter(void 0, void 0, void 0, function* () {
17
+ // get app count
18
+ const opts = { dev: false };
19
+ const prodApps = yield (0, db_1.getAllApps)(opts);
20
+ const prodAppCount = prodApps ? prodApps.length : 0;
21
+ // sync app count
22
+ const tenantId = (0, tenancy_1.getTenantId)();
23
+ console.log(`[Tenant: ${tenantId}] Syncing published app count: ${prodAppCount}`);
24
+ yield pro_1.quotas.setUsage(prodAppCount, pro_1.StaticQuotaName.PUBLISHED_APPS, pro_1.QuotaUsageType.STATIC);
25
+ });
26
+ exports.run = run;
@@ -12,22 +12,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.run = void 0;
13
13
  const tenancy_1 = require("@budibase/backend-core/tenancy");
14
14
  const db_1 = require("@budibase/backend-core/db");
15
- const usageQuota_1 = require("../../../utilities/usageQuota");
16
15
  const rows_1 = require("../../../utilities/usageQuota/rows");
16
+ const pro_1 = require("@budibase/pro");
17
17
  const run = () => __awaiter(void 0, void 0, void 0, function* () {
18
- const db = tenancy_1.getGlobalDB();
19
18
  // get all rows in all apps
20
19
  // @ts-ignore
21
- const allApps = yield db_1.getAllApps({ all: true });
20
+ const allApps = yield (0, db_1.getAllApps)({ all: true });
22
21
  // @ts-ignore
23
22
  const appIds = allApps ? allApps.map((app) => app.appId) : [];
24
- const rows = yield rows_1.getUniqueRows(appIds);
23
+ const rows = yield (0, rows_1.getUniqueRows)(appIds);
25
24
  const rowCount = rows ? rows.length : 0;
26
25
  // sync row count
27
- const tenantId = tenancy_1.getTenantId();
26
+ const tenantId = (0, tenancy_1.getTenantId)();
28
27
  console.log(`[Tenant: ${tenantId}] Syncing row count: ${rowCount}`);
29
- const usageDoc = yield usageQuota_1.getUsageQuotaDoc(db);
30
- usageDoc.usageQuota.rows = rowCount;
31
- yield db.put(usageDoc);
28
+ yield pro_1.quotas.setUsage(rowCount, pro_1.StaticQuotaName.ROWS, pro_1.QuotaUsageType.STATIC);
32
29
  });
33
30
  exports.run = run;
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -34,6 +38,8 @@ const { MIGRATION_TYPES, runMigrations, } = require("@budibase/backend-core/migr
34
38
  const userEmailViewCasing = __importStar(require("./functions/userEmailViewCasing"));
35
39
  const quota1 = __importStar(require("./functions/quotas1"));
36
40
  const appUrls = __importStar(require("./functions/appUrls"));
41
+ const developerQuota = __importStar(require("./functions/developerQuota"));
42
+ const publishedAppsQuota = __importStar(require("./functions/publishedAppsQuota"));
37
43
  exports.MIGRATIONS = [
38
44
  {
39
45
  type: MIGRATION_TYPES.GLOBAL,
@@ -51,6 +57,16 @@ exports.MIGRATIONS = [
51
57
  opts: { all: true },
52
58
  fn: appUrls.run,
53
59
  },
60
+ {
61
+ type: MIGRATION_TYPES.GLOBAL,
62
+ name: "developer_quota",
63
+ fn: developerQuota.run,
64
+ },
65
+ {
66
+ type: MIGRATION_TYPES.GLOBAL,
67
+ name: "published_apps_quota",
68
+ fn: publishedAppsQuota.run,
69
+ },
54
70
  ];
55
71
  const migrate = (options) => __awaiter(void 0, void 0, void 0, function* () {
56
72
  yield runMigrations(exports.MIGRATIONS, options);
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.0.122",
4
+ "version": "1.0.124",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -9,7 +9,7 @@
9
9
  "url": "https://github.com/Budibase/budibase.git"
10
10
  },
11
11
  "scripts": {
12
- "build": "rimraf dist/ && tsc && mv dist/src/* dist/ && rmdir dist/src/ && yarn postbuild",
12
+ "build": "rimraf dist/ && tsc -p tsconfig.build.json && mv dist/src/* dist/ && rimraf dist/src/ && yarn postbuild",
13
13
  "postbuild": "copyfiles -u 1 src/**/*.svelte dist/ && copyfiles -u 1 src/**/*.hbs dist/ && copyfiles -u 1 src/**/*.json dist/",
14
14
  "test": "jest --coverage --maxWorkers=2",
15
15
  "test:watch": "jest --watch",
@@ -68,16 +68,19 @@
68
68
  "license": "GPL-3.0",
69
69
  "dependencies": {
70
70
  "@apidevtools/swagger-parser": "^10.0.3",
71
- "@budibase/backend-core": "^1.0.122",
72
- "@budibase/client": "^1.0.122",
73
- "@budibase/string-templates": "^1.0.122",
71
+ "@budibase/backend-core": "^1.0.124",
72
+ "@budibase/client": "^1.0.124",
73
+ "@budibase/pro": "1.0.124-alpha.0",
74
+ "@budibase/string-templates": "^1.0.124",
74
75
  "@bull-board/api": "^3.7.0",
75
76
  "@bull-board/koa": "^3.7.0",
76
77
  "@elastic/elasticsearch": "7.10.0",
77
78
  "@google-cloud/firestore": "^5.0.2",
78
79
  "@koa/router": "8.0.0",
79
80
  "@sendgrid/mail": "7.1.1",
80
- "@sentry/node": "^6.0.0",
81
+ "@sentry/node": "6.17.7",
82
+ "@types/global-agent": "^2.1.1",
83
+ "@types/koa__router": "^8.0.11",
81
84
  "airtable": "0.10.1",
82
85
  "arangojs": "7.2.0",
83
86
  "aws-sdk": "^2.767.0",
@@ -91,6 +94,7 @@
91
94
  "fix-path": "3.0.0",
92
95
  "form-data": "^4.0.0",
93
96
  "fs-extra": "8.1.0",
97
+ "global-agent": "^3.0.0",
94
98
  "google-auth-library": "^7.11.0",
95
99
  "google-spreadsheet": "^3.2.0",
96
100
  "jimp": "0.16.1",
@@ -143,18 +147,20 @@
143
147
  "@types/apidoc": "^0.50.0",
144
148
  "@types/bull": "^3.15.1",
145
149
  "@types/google-spreadsheet": "^3.1.5",
146
- "@types/jest": "^26.0.23",
150
+ "@types/jest": "^27.4.1",
147
151
  "@types/koa": "^2.13.3",
148
152
  "@types/koa-router": "^7.4.2",
149
153
  "@types/lodash": "4.14.180",
150
154
  "@types/node": "^15.12.4",
151
155
  "@types/oracledb": "^5.2.1",
152
156
  "@types/redis": "^4.0.11",
157
+ "@typescript-eslint/parser": "5.12.0",
153
158
  "apidoc": "^0.50.2",
154
159
  "babel-jest": "^27.0.2",
155
160
  "copyfiles": "^2.4.1",
156
161
  "docker-compose": "^0.23.6",
157
162
  "eslint": "^6.8.0",
163
+ "ioredis-mock": "^7.2.0",
158
164
  "is-wsl": "^2.2.0",
159
165
  "jest": "^27.0.5",
160
166
  "jest-openapi": "^0.14.2",
@@ -168,7 +174,7 @@
168
174
  "swagger-jsdoc": "^6.1.0",
169
175
  "ts-jest": "^27.0.3",
170
176
  "ts-node": "^10.0.0",
171
- "typescript": "^4.3.5",
177
+ "typescript": "^4.5.5",
172
178
  "update-dotenv": "^1.1.1"
173
179
  },
174
180
  "optionalDependencies": {
@@ -18,9 +18,13 @@ const { DocumentTypes } = require("../db/utils");
18
18
  const { doInTenant } = require("@budibase/backend-core/tenancy");
19
19
  const { definitions: triggerDefs } = require("../automations/triggerInfo");
20
20
  const { doInAppContext, getAppDB } = require("@budibase/backend-core/context");
21
+ const { AutomationErrors } = require("../constants");
21
22
  const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId;
23
+ const LOOP_STEP_ID = actions.ACTION_DEFINITIONS.LOOP.stepId;
22
24
  const CRON_STEP_ID = triggerDefs.CRON.stepId;
23
25
  const STOPPED_STATUS = { success: false, status: "STOPPED" };
26
+ const { cloneDeep } = require("lodash/fp");
27
+ const env = require("../environment");
24
28
  /**
25
29
  * The automation orchestrator is a class responsible for executing automations.
26
30
  * It handles the context of the automation and makes sure each step gets the correct
@@ -81,44 +85,162 @@ class Orchestrator {
81
85
  }
82
86
  this.executionOutput.steps.push(stepObj);
83
87
  }
88
+ updateContextAndOutput(loopStepNumber, step, output, result) {
89
+ this.executionOutput.steps.splice(loopStepNumber, 0, {
90
+ id: step.id,
91
+ stepId: step.stepId,
92
+ outputs: Object.assign(Object.assign({}, output), { success: result.success, status: result.status }),
93
+ inputs: step.inputs,
94
+ });
95
+ this._context.steps.splice(loopStepNumber, 0, Object.assign(Object.assign({}, output), { success: result.success, status: result.status }));
96
+ }
84
97
  execute() {
98
+ var _a;
85
99
  return __awaiter(this, void 0, void 0, function* () {
86
100
  let automation = this._automation;
87
101
  const app = yield this.getApp();
88
102
  let stopped = false;
103
+ let loopStep;
104
+ let stepCount = 0;
105
+ let loopStepNumber;
106
+ let loopSteps = [];
89
107
  for (let step of automation.definition.steps) {
90
- // execution stopped, record state for that
91
- if (stopped) {
92
- this.updateExecutionOutput(step.id, step.stepId, {}, STOPPED_STATUS);
108
+ stepCount++;
109
+ let input;
110
+ if (step.stepId === LOOP_STEP_ID) {
111
+ loopStep = step;
112
+ loopStepNumber = stepCount;
93
113
  continue;
94
114
  }
95
- let stepFn = yield this.getStepFunctionality(step.stepId);
96
- step.inputs = yield processObject(step.inputs, this._context);
97
- step.inputs = automationUtils.cleanInputValues(step.inputs, step.schema.inputs);
98
- // appId is always passed
99
- try {
100
- let tenantId = app.tenantId || DEFAULT_TENANT_ID;
101
- const outputs = yield doInTenant(tenantId, () => {
102
- return stepFn({
103
- inputs: step.inputs,
104
- appId: this._appId,
105
- emitter: this._emitter,
106
- context: this._context,
107
- });
108
- });
109
- this._context.steps.push(outputs);
110
- // if filter causes us to stop execution don't break the loop, set a var
111
- // so that we can finish iterating through the steps and record that it stopped
112
- if (step.stepId === FILTER_STEP_ID && !outputs.success) {
113
- stopped = true;
114
- this.updateExecutionOutput(step.id, step.stepId, step.inputs, Object.assign(Object.assign({}, outputs), STOPPED_STATUS));
115
+ if (loopStep) {
116
+ input = yield processObject(loopStep.inputs, this._context);
117
+ }
118
+ let iterations = loopStep ? input.binding.length : 1;
119
+ let iterationCount = 0;
120
+ for (let index = 0; index < iterations; index++) {
121
+ let originalStepInput = cloneDeep(step.inputs);
122
+ // Handle if the user has set a max iteration count or if it reaches the max limit set by us
123
+ if (loopStep) {
124
+ // lets first of all handle the input
125
+ // if the input is array then use it, if it is a string then split it on every new line
126
+ let newInput = yield processObject(loopStep.inputs, cloneDeep(this._context));
127
+ newInput = automationUtils.cleanInputValues(newInput, loopStep.schema.inputs);
128
+ this._context.steps[loopStepNumber] = {
129
+ currentItem: newInput.binding[index],
130
+ };
131
+ let tempOutput = { items: loopSteps, iterations: iterationCount };
132
+ if ((loopStep.inputs.option === "Array" &&
133
+ !Array.isArray(newInput.binding)) ||
134
+ (loopStep.inputs.option === "String" &&
135
+ typeof newInput.binding !== "string")) {
136
+ this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
137
+ status: AutomationErrors.INCORRECT_TYPE,
138
+ success: false,
139
+ });
140
+ loopSteps = null;
141
+ loopStep = null;
142
+ break;
143
+ }
144
+ // The "Loop" binding in the front end is "fake", so replace it here so the context can understand it
145
+ // Pretty hacky because we need to account for the row object
146
+ for (let [key, value] of Object.entries(originalStepInput)) {
147
+ if (typeof value === "object") {
148
+ for (let [innerKey, innerValue] of Object.entries(originalStepInput[key])) {
149
+ if (typeof innerValue === "string") {
150
+ originalStepInput[key][innerKey] =
151
+ automationUtils.substituteLoopStep(innerValue, `steps.${loopStepNumber}`);
152
+ }
153
+ }
154
+ }
155
+ else {
156
+ if (typeof value === "string") {
157
+ originalStepInput[key] = automationUtils.substituteLoopStep(value, `steps.${loopStepNumber}`);
158
+ }
159
+ }
160
+ }
161
+ if (index === parseInt(env.AUTOMATION_MAX_ITERATIONS) ||
162
+ index === loopStep.inputs.iterations) {
163
+ this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
164
+ status: AutomationErrors.MAX_ITERATIONS,
165
+ success: true,
166
+ });
167
+ loopSteps = null;
168
+ loopStep = null;
169
+ break;
170
+ }
171
+ if (((_a = this._context.steps[loopStepNumber]) === null || _a === void 0 ? void 0 : _a.currentItem) ===
172
+ loopStep.inputs.failure) {
173
+ this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
174
+ status: AutomationErrors.FAILURE_CONDITION,
175
+ success: false,
176
+ });
177
+ loopSteps = null;
178
+ loopStep = null;
179
+ break;
180
+ }
181
+ }
182
+ // execution stopped, record state for that
183
+ if (stopped) {
184
+ this.updateExecutionOutput(step.id, step.stepId, {}, STOPPED_STATUS);
115
185
  continue;
116
186
  }
117
- this.updateExecutionOutput(step.id, step.stepId, step.inputs, outputs);
187
+ // If it's a loop step, we need to manually add the bindings to the context
188
+ let stepFn = yield this.getStepFunctionality(step.stepId);
189
+ let inputs = yield processObject(originalStepInput, this._context);
190
+ inputs = automationUtils.cleanInputValues(inputs, step.schema.inputs);
191
+ try {
192
+ // appId is always passed
193
+ let tenantId = app.tenantId || DEFAULT_TENANT_ID;
194
+ const outputs = yield doInTenant(tenantId, () => {
195
+ return stepFn({
196
+ inputs: inputs,
197
+ appId: this._appId,
198
+ emitter: this._emitter,
199
+ context: this._context,
200
+ });
201
+ });
202
+ this._context.steps[stepCount] = outputs;
203
+ // if filter causes us to stop execution don't break the loop, set a var
204
+ // so that we can finish iterating through the steps and record that it stopped
205
+ if (step.stepId === FILTER_STEP_ID && !outputs.success) {
206
+ stopped = true;
207
+ this.updateExecutionOutput(step.id, step.stepId, step.inputs, Object.assign(Object.assign({}, outputs), STOPPED_STATUS));
208
+ continue;
209
+ }
210
+ if (loopStep && loopSteps) {
211
+ loopSteps.push(outputs);
212
+ }
213
+ else {
214
+ this.updateExecutionOutput(step.id, step.stepId, step.inputs, outputs);
215
+ }
216
+ }
217
+ catch (err) {
218
+ console.error(`Automation error - ${step.stepId} - ${err}`);
219
+ return err;
220
+ }
221
+ if (loopStep) {
222
+ iterationCount++;
223
+ if (index === iterations - 1) {
224
+ loopStep = null;
225
+ this._context.steps.splice(loopStepNumber, 1);
226
+ break;
227
+ }
228
+ }
118
229
  }
119
- catch (err) {
120
- console.error(`Automation error - ${step.stepId} - ${err}`);
121
- return err;
230
+ if (loopSteps && loopSteps.length) {
231
+ let tempOutput = {
232
+ success: true,
233
+ items: loopSteps,
234
+ iterations: iterationCount,
235
+ };
236
+ this.executionOutput.steps.splice(loopStepNumber + 1, 0, {
237
+ id: step.id,
238
+ stepId: step.stepId,
239
+ outputs: tempOutput,
240
+ inputs: step.inputs,
241
+ });
242
+ this._context.steps.splice(loopStepNumber, 0, tempOutput);
243
+ loopSteps = null;
122
244
  }
123
245
  }
124
246
  return this.executionOutput;
@@ -1,17 +1,45 @@
1
1
  "use strict";
2
- const workerFarm = require("worker-farm");
3
- const env = require("../environment");
4
- const ThreadType = {
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.Thread = exports.ThreadType = void 0;
30
+ const worker_farm_1 = __importDefault(require("worker-farm"));
31
+ const env = __importStar(require("../environment"));
32
+ exports.ThreadType = {
5
33
  QUERY: "query",
6
34
  AUTOMATION: "automation",
7
35
  };
8
36
  function typeToFile(type) {
9
37
  let filename = null;
10
38
  switch (type) {
11
- case ThreadType.QUERY:
39
+ case exports.ThreadType.QUERY:
12
40
  filename = "./query";
13
41
  break;
14
- case ThreadType.AUTOMATION:
42
+ case exports.ThreadType.AUTOMATION:
15
43
  filename = "./automation";
16
44
  break;
17
45
  default:
@@ -37,11 +65,10 @@ class Thread {
37
65
  this.timeoutMs = opts.timeoutMs;
38
66
  workerOpts.maxCallTime = opts.timeoutMs;
39
67
  }
40
- this.workers = workerFarm(workerOpts, typeToFile(type));
68
+ this.workers = (0, worker_farm_1.default)(workerOpts, typeToFile(type));
41
69
  }
42
70
  }
43
71
  run(data) {
44
- const timeoutMs = this.timeoutMs;
45
72
  return new Promise((resolve, reject) => {
46
73
  let fncToCall;
47
74
  // if in test then don't use threading
@@ -53,7 +80,7 @@ class Thread {
53
80
  }
54
81
  fncToCall(data, (err, response) => {
55
82
  if (err && err.type === "TimeoutError") {
56
- reject(new Error(`Query response time exceeded ${timeoutMs}ms timeout.`));
83
+ reject(new Error(`Query response time exceeded ${this.timeoutMs}ms timeout.`));
57
84
  }
58
85
  else if (err) {
59
86
  reject(err);
@@ -65,5 +92,4 @@ class Thread {
65
92
  });
66
93
  }
67
94
  }
68
- module.exports.Thread = Thread;
69
- module.exports.ThreadType = ThreadType;
95
+ exports.Thread = Thread;
@@ -68,6 +68,7 @@ exports.formatResponse = resp => {
68
68
  exports.hasExtraData = response => {
69
69
  return (typeof response === "object" &&
70
70
  !Array.isArray(response) &&
71
+ response &&
71
72
  response.data != null &&
72
73
  response.info != null);
73
74
  };