@budibase/server 1.0.49 → 1.0.50-alpha.0

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 (381) hide show
  1. package/__mocks__/arangojs.ts +1 -1
  2. package/__mocks__/aws-sdk.ts +4 -4
  3. package/__mocks__/mongodb.ts +4 -5
  4. package/__mocks__/mssql.ts +3 -3
  5. package/__mocks__/node-fetch.ts +2 -1
  6. package/__mocks__/pg.ts +3 -5
  7. package/builder/assets/index.c0cc369d.css +6 -0
  8. package/builder/assets/{index.2c37968e.js → index.ff2bad21.js} +252 -249
  9. package/builder/assets/{vendor.f9faf6ab.js → vendor.5ad9695a.js} +202 -106
  10. package/builder/index.html +3 -3
  11. package/coverage/clover.xml +3105 -2814
  12. package/coverage/coverage-final.json +106 -101
  13. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/application.js.html +257 -152
  16. package/coverage/lcov-report/api/controllers/auth.js.html +22 -13
  17. package/coverage/lcov-report/api/controllers/automation.js.html +39 -69
  18. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/cloud.js.html +8 -11
  20. package/coverage/lcov-report/api/controllers/component.js.html +13 -16
  21. package/coverage/lcov-report/api/controllers/datasource.js.html +81 -51
  22. package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
  23. package/coverage/lcov-report/api/controllers/index.html +78 -78
  24. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/layout.js.html +9 -9
  26. package/coverage/lcov-report/api/controllers/metadata.js.html +6 -21
  27. package/coverage/lcov-report/api/controllers/migrations.js.html +119 -0
  28. package/coverage/lcov-report/api/controllers/permission.js.html +19 -19
  29. package/coverage/lcov-report/api/controllers/query/index.html +10 -10
  30. package/coverage/lcov-report/api/controllers/query/index.js.html +38 -35
  31. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
  32. package/coverage/lcov-report/api/controllers/role.js.html +16 -16
  33. package/coverage/lcov-report/api/controllers/routing.js.html +7 -10
  34. package/coverage/lcov-report/api/controllers/row/external.js.html +48 -141
  35. package/coverage/lcov-report/api/controllers/row/index.html +55 -40
  36. package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
  37. package/coverage/lcov-report/api/controllers/row/internal.js.html +118 -226
  38. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +52 -34
  39. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +548 -0
  40. package/coverage/lcov-report/api/controllers/row/utils.js.html +47 -62
  41. package/coverage/lcov-report/api/controllers/screen.js.html +15 -21
  42. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  43. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +599 -0
  44. package/coverage/lcov-report/api/controllers/table/external.js.html +25 -34
  45. package/coverage/lcov-report/api/controllers/table/index.html +58 -43
  46. package/coverage/lcov-report/api/controllers/table/index.js.html +58 -82
  47. package/coverage/lcov-report/api/controllers/table/internal.js.html +81 -66
  48. package/coverage/lcov-report/api/controllers/table/utils.js.html +218 -110
  49. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/user.js.html +79 -76
  51. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  52. package/coverage/lcov-report/api/controllers/view/index.html +16 -16
  53. package/coverage/lcov-report/api/controllers/view/index.js.html +27 -33
  54. package/coverage/lcov-report/api/controllers/view/utils.js.html +35 -20
  55. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  56. package/coverage/lcov-report/api/controllers/webhook.js.html +34 -28
  57. package/coverage/lcov-report/api/index.html +1 -1
  58. package/coverage/lcov-report/api/index.js.html +8 -8
  59. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/index.html +18 -18
  71. package/coverage/lcov-report/api/routes/index.js.html +3 -3
  72. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/{hosting.js.html → migrations.js.html} +17 -14
  76. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/static.js.html +17 -2
  84. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  85. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  86. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  87. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  88. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  89. package/coverage/lcov-report/automations/actions.js.html +24 -24
  90. package/coverage/lcov-report/automations/automationUtils.js.html +7 -10
  91. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  92. package/coverage/lcov-report/automations/index.html +18 -18
  93. package/coverage/lcov-report/automations/index.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  95. package/coverage/lcov-report/automations/steps/createRow.js.html +13 -22
  96. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  97. package/coverage/lcov-report/automations/steps/deleteRow.js.html +11 -20
  98. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  99. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  100. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  101. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  102. package/coverage/lcov-report/automations/steps/index.html +13 -13
  103. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  104. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  105. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  106. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  107. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  108. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  109. package/coverage/lcov-report/automations/steps/updateRow.js.html +7 -7
  110. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  111. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  112. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  113. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  115. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  116. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  118. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  119. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  120. package/coverage/lcov-report/automations/triggers.js.html +61 -55
  121. package/coverage/lcov-report/automations/utils.js.html +54 -42
  122. package/coverage/lcov-report/constants/index.html +5 -5
  123. package/coverage/lcov-report/constants/index.js.html +53 -26
  124. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  125. package/coverage/lcov-report/constants/screens.js.html +4 -4
  126. package/coverage/lcov-report/db/client.js.html +18 -18
  127. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  128. package/coverage/lcov-report/db/index.html +15 -15
  129. package/coverage/lcov-report/db/index.js.html +3 -3
  130. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +25 -37
  131. package/coverage/lcov-report/db/linkedRows/index.html +27 -27
  132. package/coverage/lcov-report/db/linkedRows/index.js.html +51 -96
  133. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +42 -42
  134. package/coverage/lcov-report/db/newid.js.html +4 -4
  135. package/coverage/lcov-report/db/utils.js.html +87 -87
  136. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  137. package/coverage/lcov-report/events/index.html +1 -1
  138. package/coverage/lcov-report/events/index.js.html +5 -5
  139. package/coverage/lcov-report/events/utils.js.html +3 -3
  140. package/coverage/lcov-report/index.html +135 -120
  141. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  142. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  143. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  144. package/coverage/lcov-report/middleware/authorized.js.html +173 -65
  145. package/coverage/lcov-report/middleware/builder.js.html +10 -10
  146. package/coverage/lcov-report/middleware/currentapp.js.html +95 -83
  147. package/coverage/lcov-report/middleware/index.html +38 -38
  148. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  149. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  150. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  151. package/coverage/lcov-report/middleware/usageQuota.js.html +281 -53
  152. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  153. package/coverage/lcov-report/threads/automation.js.html +30 -24
  154. package/coverage/lcov-report/threads/index.html +26 -26
  155. package/coverage/lcov-report/threads/index.js.html +10 -10
  156. package/coverage/lcov-report/threads/query.js.html +39 -24
  157. package/coverage/lcov-report/threads/utils.js.html +14 -14
  158. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  159. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  160. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  161. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  162. package/coverage/lcov-report/utilities/global.js.html +58 -49
  163. package/coverage/lcov-report/utilities/index.html +37 -37
  164. package/coverage/lcov-report/utilities/index.js.html +43 -73
  165. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
  166. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  167. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  168. package/coverage/lcov-report/utilities/routing/index.js.html +7 -7
  169. package/coverage/lcov-report/utilities/rowProcessor/index.html +27 -27
  170. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +97 -103
  171. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +75 -27
  172. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  173. package/coverage/lcov-report/utilities/security.js.html +8 -8
  174. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  175. package/coverage/lcov-report/utilities/usageQuota/index.html +141 -0
  176. package/coverage/lcov-report/utilities/usageQuota/index.js.html +359 -0
  177. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +305 -0
  178. package/coverage/lcov-report/{api/controllers/hosting.js.html → utilities/usageQuota/usageQuoteReset.js.html} +36 -48
  179. package/coverage/lcov-report/utilities/users.js.html +9 -9
  180. package/coverage/lcov-report/utilities/workerRequests.js.html +43 -112
  181. package/coverage/lcov.info +5010 -4425
  182. package/dist/api/controllers/application.js +90 -60
  183. package/dist/api/controllers/auth.js +8 -5
  184. package/dist/api/controllers/automation.js +14 -19
  185. package/dist/api/controllers/cloud.js +2 -3
  186. package/dist/api/controllers/component.js +3 -4
  187. package/dist/api/controllers/datasource.js +20 -10
  188. package/dist/api/controllers/deploy/Deployment.js +3 -6
  189. package/dist/api/controllers/deploy/index.js +12 -13
  190. package/dist/api/controllers/dev.js +5 -5
  191. package/dist/api/controllers/layout.js +3 -3
  192. package/dist/api/controllers/metadata.js +4 -4
  193. package/dist/api/controllers/migrations.js +21 -0
  194. package/dist/api/controllers/permission.js +4 -4
  195. package/dist/api/controllers/query/import/index.js +4 -6
  196. package/dist/api/controllers/query/index.js +11 -10
  197. package/dist/api/controllers/role.js +5 -5
  198. package/dist/api/controllers/routing.js +5 -6
  199. package/dist/api/controllers/row/ExternalRequest.js +90 -67
  200. package/dist/api/controllers/row/external.js +14 -22
  201. package/dist/api/controllers/row/internal.js +55 -93
  202. package/dist/api/controllers/row/internalSearch.js +23 -17
  203. package/dist/api/controllers/row/staticFormula.js +147 -0
  204. package/dist/api/controllers/row/utils.js +13 -14
  205. package/dist/api/controllers/screen.js +5 -7
  206. package/dist/api/controllers/static/index.js +62 -16
  207. package/dist/api/controllers/table/bulkFormula.js +159 -0
  208. package/dist/api/controllers/table/external.js +7 -10
  209. package/dist/api/controllers/table/index.js +16 -13
  210. package/dist/api/controllers/table/internal.js +22 -16
  211. package/dist/api/controllers/table/utils.js +62 -35
  212. package/dist/api/controllers/user.js +43 -43
  213. package/dist/api/controllers/view/index.js +8 -10
  214. package/dist/api/controllers/view/utils.js +9 -4
  215. package/dist/api/controllers/webhook.js +10 -8
  216. package/dist/api/routes/index.js +2 -2
  217. package/dist/api/routes/migrations.js +9 -0
  218. package/dist/api/routes/static.js +2 -1
  219. package/dist/api/routes/tests/utilities/TestFunctions.js +37 -17
  220. package/dist/app.js +35 -5
  221. package/dist/automations/automationUtils.js +2 -3
  222. package/dist/automations/steps/createRow.js +3 -5
  223. package/dist/automations/steps/deleteRow.js +1 -4
  224. package/dist/automations/steps/updateRow.js +1 -1
  225. package/dist/automations/triggers.js +27 -25
  226. package/dist/automations/utils.js +10 -5
  227. package/dist/constants/index.js +7 -0
  228. package/dist/db/linkedRows/LinkController.js +3 -7
  229. package/dist/db/linkedRows/index.js +16 -27
  230. package/dist/db/linkedRows/linkUtils.js +6 -6
  231. package/dist/db/views/staticViews.js +9 -10
  232. package/dist/definitions/datasource.js +1 -0
  233. package/dist/environment.js +4 -1
  234. package/dist/integrations/base/sql.js +62 -21
  235. package/dist/integrations/googlesheets.js +340 -0
  236. package/dist/integrations/index.js +3 -0
  237. package/dist/integrations/utils.js +60 -9
  238. package/dist/middleware/authorized.js +57 -30
  239. package/dist/middleware/builder.js +2 -2
  240. package/dist/middleware/currentapp.js +41 -37
  241. package/dist/middleware/usageQuota.js +82 -15
  242. package/dist/migrations/functions/appUrls.js +46 -0
  243. package/dist/migrations/functions/quotas1.js +50 -0
  244. package/dist/migrations/functions/usageQuotas/index.js +20 -0
  245. package/dist/migrations/functions/usageQuotas/syncApps.js +29 -0
  246. package/dist/migrations/functions/usageQuotas/syncRows.js +33 -0
  247. package/dist/migrations/functions/userEmailViewCasing.js +24 -0
  248. package/dist/migrations/index.js +62 -0
  249. package/dist/package.json +8 -5
  250. package/dist/tests/utilities/TestConfiguration.js +80 -50
  251. package/dist/threads/automation.js +13 -11
  252. package/dist/threads/query.js +15 -11
  253. package/dist/tsconfig.tsbuildinfo +1 -1
  254. package/dist/utilities/fileSystem/index.js +4 -3
  255. package/dist/utilities/global.js +15 -12
  256. package/dist/utilities/index.js +7 -17
  257. package/dist/utilities/routing/index.js +5 -5
  258. package/dist/utilities/rowProcessor/index.js +23 -17
  259. package/dist/utilities/rowProcessor/utils.js +14 -4
  260. package/dist/utilities/{usageQuota.js → usageQuota/index.js} +45 -31
  261. package/dist/utilities/usageQuota/rows.js +78 -0
  262. package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
  263. package/dist/utilities/users.js +3 -3
  264. package/dist/utilities/workerRequests.js +4 -24
  265. package/nodemon.json +1 -1
  266. package/package.json +9 -6
  267. package/scripts/integrations/mssql/data/Dockerfile +1 -1
  268. package/scripts/integrations/mssql/data/setup.sql +17 -4
  269. package/scripts/integrations/postgres/init.sql +11 -6
  270. package/scripts/likeCypress.ts +1 -1
  271. package/src/api/controllers/application.js +85 -50
  272. package/src/api/controllers/auth.js +8 -5
  273. package/src/api/controllers/automation.js +13 -23
  274. package/src/api/controllers/cloud.js +2 -3
  275. package/src/api/controllers/component.js +3 -4
  276. package/src/api/controllers/datasource.js +21 -11
  277. package/src/api/controllers/deploy/Deployment.js +3 -7
  278. package/src/api/controllers/deploy/index.js +20 -13
  279. package/src/api/controllers/dev.js +5 -5
  280. package/src/api/controllers/layout.js +3 -3
  281. package/src/api/controllers/metadata.js +4 -9
  282. package/src/api/controllers/migrations.js +13 -0
  283. package/src/api/controllers/permission.js +4 -4
  284. package/src/api/controllers/query/import/index.ts +4 -6
  285. package/src/api/controllers/query/import/tests/index.spec.js +2 -1
  286. package/src/api/controllers/query/index.js +11 -10
  287. package/src/api/controllers/role.js +5 -5
  288. package/src/api/controllers/routing.js +5 -6
  289. package/src/api/controllers/row/ExternalRequest.ts +67 -43
  290. package/src/api/controllers/row/external.js +27 -58
  291. package/src/api/controllers/row/internal.js +54 -90
  292. package/src/api/controllers/row/internalSearch.js +23 -17
  293. package/src/api/controllers/row/staticFormula.js +156 -0
  294. package/src/api/controllers/row/utils.js +13 -18
  295. package/src/api/controllers/screen.js +5 -7
  296. package/src/api/controllers/static/index.js +66 -15
  297. package/src/api/controllers/table/bulkFormula.js +173 -0
  298. package/src/api/controllers/table/external.js +7 -10
  299. package/src/api/controllers/table/index.js +20 -28
  300. package/src/api/controllers/table/internal.js +24 -19
  301. package/src/api/controllers/table/utils.js +78 -42
  302. package/src/api/controllers/user.js +46 -45
  303. package/src/api/controllers/view/index.js +8 -10
  304. package/src/api/controllers/view/utils.js +9 -4
  305. package/src/api/controllers/webhook.js +10 -8
  306. package/src/api/routes/index.js +2 -2
  307. package/src/api/routes/migrations.js +14 -0
  308. package/src/api/routes/static.js +5 -0
  309. package/src/api/routes/tests/application.spec.js +2 -2
  310. package/src/api/routes/tests/auth.spec.js +1 -2
  311. package/src/api/routes/tests/automation.spec.js +1 -0
  312. package/src/api/routes/tests/misc.spec.js +0 -1
  313. package/src/api/routes/tests/routing.spec.js +21 -12
  314. package/src/api/routes/tests/row.spec.js +7 -4
  315. package/src/api/routes/tests/static.spec.js +98 -0
  316. package/src/api/routes/tests/utilities/TestFunctions.js +39 -17
  317. package/src/app.ts +18 -5
  318. package/src/automations/automationUtils.js +2 -3
  319. package/src/automations/steps/createRow.js +2 -5
  320. package/src/automations/steps/deleteRow.js +1 -4
  321. package/src/automations/steps/updateRow.js +1 -1
  322. package/src/automations/triggers.js +33 -31
  323. package/src/automations/utils.js +9 -5
  324. package/src/constants/index.js +9 -0
  325. package/src/db/linkedRows/LinkController.js +3 -7
  326. package/src/db/linkedRows/index.js +16 -31
  327. package/src/db/linkedRows/linkUtils.js +6 -6
  328. package/src/db/tests/linkController.spec.js +0 -1
  329. package/src/db/tests/linkTests.spec.js +5 -6
  330. package/src/db/views/staticViews.js +8 -10
  331. package/src/definitions/common.ts +3 -0
  332. package/src/definitions/datasource.ts +3 -0
  333. package/src/environment.js +4 -1
  334. package/src/integrations/base/sql.ts +75 -29
  335. package/src/integrations/googlesheets.ts +353 -0
  336. package/src/integrations/index.ts +3 -0
  337. package/src/integrations/tests/sql.spec.js +16 -0
  338. package/src/integrations/utils.ts +75 -12
  339. package/src/middleware/authorized.js +66 -30
  340. package/src/middleware/builder.js +2 -2
  341. package/src/middleware/currentapp.js +50 -46
  342. package/src/middleware/tests/authorized.spec.js +13 -6
  343. package/src/middleware/tests/currentapp.spec.js +6 -0
  344. package/src/middleware/tests/usageQuota.spec.js +18 -24
  345. package/src/middleware/usageQuota.js +93 -17
  346. package/src/migrations/functions/appUrls.ts +34 -0
  347. package/src/migrations/functions/quotas1.ts +20 -0
  348. package/src/migrations/functions/tests/appUrls.spec.js +29 -0
  349. package/src/migrations/functions/tests/quotas1.spec.js +27 -0
  350. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +25 -0
  351. package/src/migrations/functions/usageQuotas/index.ts +8 -0
  352. package/src/migrations/functions/usageQuotas/syncApps.ts +18 -0
  353. package/src/migrations/functions/usageQuotas/syncRows.ts +22 -0
  354. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +37 -0
  355. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +43 -0
  356. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  357. package/src/migrations/index.ts +56 -0
  358. package/src/module.d.ts +3 -0
  359. package/src/tests/utilities/TestConfiguration.js +82 -55
  360. package/src/threads/automation.js +17 -15
  361. package/src/threads/query.js +17 -12
  362. package/src/utilities/fileSystem/index.js +4 -3
  363. package/src/utilities/global.js +15 -12
  364. package/src/utilities/index.js +7 -17
  365. package/src/utilities/routing/index.js +5 -5
  366. package/src/utilities/rowProcessor/index.js +25 -27
  367. package/src/utilities/rowProcessor/utils.js +23 -7
  368. package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
  369. package/src/utilities/usageQuota/index.js +93 -0
  370. package/src/utilities/usageQuota/rows.js +75 -0
  371. package/src/utilities/usageQuota/usageQuoteReset.js +18 -0
  372. package/src/utilities/users.js +3 -3
  373. package/src/utilities/workerRequests.js +4 -27
  374. package/tsconfig.json +2 -1
  375. package/builder/assets/index.39e01193.css +0 -1
  376. package/dist/api/controllers/hosting.js +0 -30
  377. package/dist/api/routes/hosting.js +0 -11
  378. package/src/api/controllers/hosting.js +0 -22
  379. package/src/api/routes/hosting.js +0 -13
  380. package/src/api/routes/tests/hosting.spec.js +0 -36
  381. package/src/utilities/usageQuota.js +0 -73
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">78.02% </span>
26
+ <span class="strong">79.71% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>142/182</span>
28
+ <span class='fraction'>165/207</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">56.94% </span>
33
+ <span class="strong">55.12% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>41/72</span>
35
+ <span class='fraction'>43/78</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">85% </span>
40
+ <span class="strong">88.46% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>17/20</span>
42
+ <span class='fraction'>23/26</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">78.88% </span>
47
+ <span class="strong">80.09% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>142/180</span>
49
+ <span class='fraction'>161/201</span>
50
50
  </div>
51
51
 
52
52
 
@@ -471,19 +471,53 @@
471
471
  <a name='L412'></a><a href='#L412'>412</a>
472
472
  <a name='L413'></a><a href='#L413'>413</a>
473
473
  <a name='L414'></a><a href='#L414'>414</a>
474
- <a name='L415'></a><a href='#L415'>415</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">33x</span>
475
- <span class="cline-any cline-yes">33x</span>
476
- <span class="cline-any cline-yes">33x</span>
474
+ <a name='L415'></a><a href='#L415'>415</a>
475
+ <a name='L416'></a><a href='#L416'>416</a>
476
+ <a name='L417'></a><a href='#L417'>417</a>
477
+ <a name='L418'></a><a href='#L418'>418</a>
478
+ <a name='L419'></a><a href='#L419'>419</a>
479
+ <a name='L420'></a><a href='#L420'>420</a>
480
+ <a name='L421'></a><a href='#L421'>421</a>
481
+ <a name='L422'></a><a href='#L422'>422</a>
482
+ <a name='L423'></a><a href='#L423'>423</a>
483
+ <a name='L424'></a><a href='#L424'>424</a>
484
+ <a name='L425'></a><a href='#L425'>425</a>
485
+ <a name='L426'></a><a href='#L426'>426</a>
486
+ <a name='L427'></a><a href='#L427'>427</a>
487
+ <a name='L428'></a><a href='#L428'>428</a>
488
+ <a name='L429'></a><a href='#L429'>429</a>
489
+ <a name='L430'></a><a href='#L430'>430</a>
490
+ <a name='L431'></a><a href='#L431'>431</a>
491
+ <a name='L432'></a><a href='#L432'>432</a>
492
+ <a name='L433'></a><a href='#L433'>433</a>
493
+ <a name='L434'></a><a href='#L434'>434</a>
494
+ <a name='L435'></a><a href='#L435'>435</a>
495
+ <a name='L436'></a><a href='#L436'>436</a>
496
+ <a name='L437'></a><a href='#L437'>437</a>
497
+ <a name='L438'></a><a href='#L438'>438</a>
498
+ <a name='L439'></a><a href='#L439'>439</a>
499
+ <a name='L440'></a><a href='#L440'>440</a>
500
+ <a name='L441'></a><a href='#L441'>441</a>
501
+ <a name='L442'></a><a href='#L442'>442</a>
502
+ <a name='L443'></a><a href='#L443'>443</a>
503
+ <a name='L444'></a><a href='#L444'>444</a>
504
+ <a name='L445'></a><a href='#L445'>445</a>
505
+ <a name='L446'></a><a href='#L446'>446</a>
506
+ <a name='L447'></a><a href='#L447'>447</a>
507
+ <a name='L448'></a><a href='#L448'>448</a>
508
+ <a name='L449'></a><a href='#L449'>449</a>
509
+ <a name='L450'></a><a href='#L450'>450</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">38x</span>
510
+ <span class="cline-any cline-yes">38x</span>
477
511
  <span class="cline-any cline-neutral">&nbsp;</span>
478
512
  <span class="cline-any cline-neutral">&nbsp;</span>
479
513
  <span class="cline-any cline-neutral">&nbsp;</span>
480
514
  <span class="cline-any cline-neutral">&nbsp;</span>
481
- <span class="cline-any cline-yes">33x</span>
515
+ <span class="cline-any cline-yes">38x</span>
482
516
  <span class="cline-any cline-neutral">&nbsp;</span>
483
517
  <span class="cline-any cline-neutral">&nbsp;</span>
484
518
  <span class="cline-any cline-neutral">&nbsp;</span>
485
519
  <span class="cline-any cline-neutral">&nbsp;</span>
486
- <span class="cline-any cline-yes">33x</span>
520
+ <span class="cline-any cline-yes">38x</span>
487
521
  <span class="cline-any cline-neutral">&nbsp;</span>
488
522
  <span class="cline-any cline-neutral">&nbsp;</span>
489
523
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -491,52 +525,56 @@
491
525
  <span class="cline-any cline-neutral">&nbsp;</span>
492
526
  <span class="cline-any cline-neutral">&nbsp;</span>
493
527
  <span class="cline-any cline-neutral">&nbsp;</span>
494
- <span class="cline-any cline-yes">33x</span>
528
+ <span class="cline-any cline-yes">38x</span>
495
529
  <span class="cline-any cline-neutral">&nbsp;</span>
496
530
  <span class="cline-any cline-neutral">&nbsp;</span>
497
531
  <span class="cline-any cline-neutral">&nbsp;</span>
498
- <span class="cline-any cline-yes">33x</span>
499
- <span class="cline-any cline-yes">33x</span>
500
- <span class="cline-any cline-yes">33x</span>
501
- <span class="cline-any cline-yes">33x</span>
532
+ <span class="cline-any cline-yes">38x</span>
533
+ <span class="cline-any cline-yes">38x</span>
534
+ <span class="cline-any cline-yes">38x</span>
535
+ <span class="cline-any cline-yes">38x</span>
502
536
  <span class="cline-any cline-neutral">&nbsp;</span>
503
537
  <span class="cline-any cline-neutral">&nbsp;</span>
504
538
  <span class="cline-any cline-neutral">&nbsp;</span>
505
539
  <span class="cline-any cline-neutral">&nbsp;</span>
506
540
  <span class="cline-any cline-neutral">&nbsp;</span>
507
- <span class="cline-any cline-yes">33x</span>
508
- <span class="cline-any cline-yes">33x</span>
541
+ <span class="cline-any cline-yes">38x</span>
542
+ <span class="cline-any cline-yes">38x</span>
543
+ <span class="cline-any cline-yes">38x</span>
544
+ <span class="cline-any cline-yes">38x</span>
545
+ <span class="cline-any cline-yes">38x</span>
509
546
  <span class="cline-any cline-neutral">&nbsp;</span>
510
547
  <span class="cline-any cline-neutral">&nbsp;</span>
511
548
  <span class="cline-any cline-neutral">&nbsp;</span>
512
- <span class="cline-any cline-yes">33x</span>
513
- <span class="cline-any cline-yes">33x</span>
514
- <span class="cline-any cline-yes">33x</span>
515
549
  <span class="cline-any cline-neutral">&nbsp;</span>
550
+ <span class="cline-any cline-yes">38x</span>
551
+ <span class="cline-any cline-yes">38x</span>
552
+ <span class="cline-any cline-yes">38x</span>
553
+ <span class="cline-any cline-yes">38x</span>
554
+ <span class="cline-any cline-yes">38x</span>
516
555
  <span class="cline-any cline-neutral">&nbsp;</span>
517
556
  <span class="cline-any cline-neutral">&nbsp;</span>
518
557
  <span class="cline-any cline-neutral">&nbsp;</span>
519
- <span class="cline-any cline-yes">33x</span>
520
- <span class="cline-any cline-yes">33x</span>
521
- <span class="cline-any cline-yes">33x</span>
522
- <span class="cline-any cline-yes">33x</span>
523
- <span class="cline-any cline-yes">33x</span>
524
558
  <span class="cline-any cline-neutral">&nbsp;</span>
525
- <span class="cline-any cline-yes">33x</span>
559
+ <span class="cline-any cline-yes">38x</span>
526
560
  <span class="cline-any cline-neutral">&nbsp;</span>
561
+ <span class="cline-any cline-yes">38x</span>
527
562
  <span class="cline-any cline-neutral">&nbsp;</span>
528
563
  <span class="cline-any cline-neutral">&nbsp;</span>
529
- <span class="cline-any cline-yes">195x</span>
530
564
  <span class="cline-any cline-neutral">&nbsp;</span>
565
+ <span class="cline-any cline-yes">205x</span>
566
+ <span class="cline-any cline-yes">205x</span>
531
567
  <span class="cline-any cline-neutral">&nbsp;</span>
532
568
  <span class="cline-any cline-neutral">&nbsp;</span>
533
569
  <span class="cline-any cline-neutral">&nbsp;</span>
534
570
  <span class="cline-any cline-neutral">&nbsp;</span>
535
- <span class="cline-any cline-yes">390x</span>
536
571
  <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-yes">410x</span>
537
573
  <span class="cline-any cline-neutral">&nbsp;</span>
538
574
  <span class="cline-any cline-neutral">&nbsp;</span>
539
- <span class="cline-any cline-yes">195x</span>
575
+ <span class="cline-any cline-neutral">&nbsp;</span>
576
+ <span class="cline-any cline-yes">205x</span>
577
+ <span class="cline-any cline-yes">205x</span>
540
578
  <span class="cline-any cline-neutral">&nbsp;</span>
541
579
  <span class="cline-any cline-neutral">&nbsp;</span>
542
580
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -546,43 +584,57 @@
546
584
  <span class="cline-any cline-neutral">&nbsp;</span>
547
585
  <span class="cline-any cline-neutral">&nbsp;</span>
548
586
  <span class="cline-any cline-neutral">&nbsp;</span>
549
- <span class="cline-any cline-yes">193x</span>
587
+ <span class="cline-any cline-yes">203x</span>
588
+ <span class="cline-any cline-neutral">&nbsp;</span>
550
589
  <span class="cline-any cline-neutral">&nbsp;</span>
551
590
  <span class="cline-any cline-neutral">&nbsp;</span>
552
591
  <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-yes">38x</span>
553
593
  <span class="cline-any cline-neutral">&nbsp;</span>
554
594
  <span class="cline-any cline-neutral">&nbsp;</span>
595
+ <span class="cline-any cline-yes">198x</span>
555
596
  <span class="cline-any cline-neutral">&nbsp;</span>
556
- <span class="cline-any cline-yes">190x</span>
557
597
  <span class="cline-any cline-no">&nbsp;</span>
558
- <span class="cline-any cline-yes">190x</span>
559
- <span class="cline-any cline-yes">187x</span>
598
+ <span class="cline-any cline-yes">198x</span>
599
+ <span class="cline-any cline-neutral">&nbsp;</span>
600
+ <span class="cline-any cline-yes">198x</span>
560
601
  <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-yes">190x</span>
562
- <span class="cline-any cline-yes">187x</span>
602
+ <span class="cline-any cline-yes">198x</span>
603
+ <span class="cline-any cline-yes">198x</span>
563
604
  <span class="cline-any cline-neutral">&nbsp;</span>
564
- <span class="cline-any cline-yes">190x</span>
565
- <span class="cline-any cline-yes">15x</span>
605
+ <span class="cline-any cline-yes">198x</span>
606
+ <span class="cline-any cline-neutral">&nbsp;</span>
607
+ <span class="cline-any cline-neutral">&nbsp;</span>
608
+ <span class="cline-any cline-yes">38x</span>
609
+ <span class="cline-any cline-yes">197x</span>
610
+ <span class="cline-any cline-yes">2x</span>
611
+ <span class="cline-any cline-neutral">&nbsp;</span>
612
+ <span class="cline-any cline-yes">733x</span>
613
+ <span class="cline-any cline-no">&nbsp;</span>
566
614
  <span class="cline-any cline-neutral">&nbsp;</span>
567
- <span class="cline-any cline-yes">175x</span>
568
- <span class="cline-any cline-yes">175x</span>
569
615
  <span class="cline-any cline-neutral">&nbsp;</span>
570
616
  <span class="cline-any cline-neutral">&nbsp;</span>
617
+ <span class="cline-any cline-yes">38x</span>
571
618
  <span class="cline-any cline-neutral">&nbsp;</span>
619
+ <span class="cline-any cline-yes">197x</span>
620
+ <span class="cline-any cline-no">&nbsp;</span>
572
621
  <span class="cline-any cline-neutral">&nbsp;</span>
622
+ <span class="cline-any cline-yes">197x</span>
623
+ <span class="cline-any cline-yes">2x</span>
573
624
  <span class="cline-any cline-neutral">&nbsp;</span>
625
+ <span class="cline-any cline-yes">733x</span>
574
626
  <span class="cline-any cline-no">&nbsp;</span>
575
627
  <span class="cline-any cline-neutral">&nbsp;</span>
576
- <span class="cline-any cline-yes">175x</span>
577
628
  <span class="cline-any cline-neutral">&nbsp;</span>
578
629
  <span class="cline-any cline-neutral">&nbsp;</span>
579
630
  <span class="cline-any cline-neutral">&nbsp;</span>
580
- <span class="cline-any cline-yes">185x</span>
581
- <span class="cline-any cline-yes">185x</span>
582
- <span class="cline-any cline-yes">185x</span>
631
+ <span class="cline-any cline-yes">195x</span>
632
+ <span class="cline-any cline-yes">195x</span>
633
+ <span class="cline-any cline-yes">195x</span>
634
+ <span class="cline-any cline-yes">195x</span>
583
635
  <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-yes">185x</span>
585
- <span class="cline-any cline-yes">185x</span>
636
+ <span class="cline-any cline-yes">195x</span>
637
+ <span class="cline-any cline-yes">195x</span>
586
638
  <span class="cline-any cline-neutral">&nbsp;</span>
587
639
  <span class="cline-any cline-neutral">&nbsp;</span>
588
640
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -591,18 +643,18 @@
591
643
  <span class="cline-any cline-neutral">&nbsp;</span>
592
644
  <span class="cline-any cline-neutral">&nbsp;</span>
593
645
  <span class="cline-any cline-neutral">&nbsp;</span>
594
- <span class="cline-any cline-yes">185x</span>
595
- <span class="cline-any cline-yes">185x</span>
596
- <span class="cline-any cline-yes">185x</span>
646
+ <span class="cline-any cline-yes">195x</span>
647
+ <span class="cline-any cline-yes">195x</span>
648
+ <span class="cline-any cline-yes">195x</span>
597
649
  <span class="cline-any cline-neutral">&nbsp;</span>
598
650
  <span class="cline-any cline-neutral">&nbsp;</span>
599
651
  <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-yes">185x</span>
652
+ <span class="cline-any cline-yes">195x</span>
601
653
  <span class="cline-any cline-no">&nbsp;</span>
602
654
  <span class="cline-any cline-no">&nbsp;</span>
603
655
  <span class="cline-any cline-no">&nbsp;</span>
604
656
  <span class="cline-any cline-neutral">&nbsp;</span>
605
- <span class="cline-any cline-yes">185x</span>
657
+ <span class="cline-any cline-yes">195x</span>
606
658
  <span class="cline-any cline-neutral">&nbsp;</span>
607
659
  <span class="cline-any cline-neutral">&nbsp;</span>
608
660
  <span class="cline-any cline-no">&nbsp;</span>
@@ -610,13 +662,13 @@
610
662
  <span class="cline-any cline-neutral">&nbsp;</span>
611
663
  <span class="cline-any cline-neutral">&nbsp;</span>
612
664
  <span class="cline-any cline-neutral">&nbsp;</span>
613
- <span class="cline-any cline-yes">185x</span>
665
+ <span class="cline-any cline-yes">195x</span>
614
666
  <span class="cline-any cline-neutral">&nbsp;</span>
615
667
  <span class="cline-any cline-neutral">&nbsp;</span>
616
- <span class="cline-any cline-yes">185x</span>
668
+ <span class="cline-any cline-yes">195x</span>
617
669
  <span class="cline-any cline-neutral">&nbsp;</span>
618
670
  <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-yes">33x</span>
671
+ <span class="cline-any cline-yes">38x</span>
620
672
  <span class="cline-any cline-yes">10x</span>
621
673
  <span class="cline-any cline-yes">10x</span>
622
674
  <span class="cline-any cline-yes">10x</span>
@@ -641,8 +693,7 @@
641
693
  <span class="cline-any cline-yes">10x</span>
642
694
  <span class="cline-any cline-neutral">&nbsp;</span>
643
695
  <span class="cline-any cline-neutral">&nbsp;</span>
644
- <span class="cline-any cline-yes">33x</span>
645
- <span class="cline-any cline-yes">1x</span>
696
+ <span class="cline-any cline-yes">38x</span>
646
697
  <span class="cline-any cline-yes">1x</span>
647
698
  <span class="cline-any cline-yes">1x</span>
648
699
  <span class="cline-any cline-yes">1x</span>
@@ -657,51 +708,56 @@
657
708
  <span class="cline-any cline-neutral">&nbsp;</span>
658
709
  <span class="cline-any cline-neutral">&nbsp;</span>
659
710
  <span class="cline-any cline-neutral">&nbsp;</span>
660
- <span class="cline-any cline-yes">33x</span>
661
- <span class="cline-any cline-yes">194x</span>
662
- <span class="cline-any cline-yes">194x</span>
663
- <span class="cline-any cline-yes">194x</span>
664
- <span class="cline-any cline-yes">194x</span>
711
+ <span class="cline-any cline-yes">38x</span>
712
+ <span class="cline-any cline-yes">204x</span>
713
+ <span class="cline-any cline-yes">204x</span>
714
+ <span class="cline-any cline-yes">204x</span>
715
+ <span class="cline-any cline-yes">204x</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
665
717
  <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-yes">204x</span>
719
+ <span class="cline-any cline-yes">202x</span>
720
+ <span class="cline-any cline-yes">202x</span>
721
+ <span class="cline-any cline-yes">202x</span>
666
722
  <span class="cline-any cline-neutral">&nbsp;</span>
667
- <span class="cline-any cline-yes">194x</span>
668
- <span class="cline-any cline-yes">192x</span>
669
- <span class="cline-any cline-yes">192x</span>
670
- <span class="cline-any cline-yes">192x</span>
671
723
  <span class="cline-any cline-neutral">&nbsp;</span>
724
+ <span class="cline-any cline-yes">204x</span>
672
725
  <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-yes">194x</span>
674
726
  <span class="cline-any cline-neutral">&nbsp;</span>
675
727
  <span class="cline-any cline-neutral">&nbsp;</span>
676
728
  <span class="cline-any cline-neutral">&nbsp;</span>
677
729
  <span class="cline-any cline-neutral">&nbsp;</span>
678
730
  <span class="cline-any cline-neutral">&nbsp;</span>
679
731
  <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-yes">38x</span>
733
+ <span class="cline-any cline-yes">195x</span>
734
+ <span class="cline-any cline-yes">195x</span>
735
+ <span class="cline-any cline-yes">195x</span>
736
+ <span class="cline-any cline-yes">195x</span>
737
+ <span class="cline-any cline-yes">195x</span>
680
738
  <span class="cline-any cline-neutral">&nbsp;</span>
681
- <span class="cline-any cline-yes">33x</span>
682
- <span class="cline-any cline-yes">185x</span>
683
- <span class="cline-any cline-yes">185x</span>
739
+ <span class="cline-any cline-yes">195x</span>
740
+ <span class="cline-any cline-yes">195x</span>
684
741
  <span class="cline-any cline-neutral">&nbsp;</span>
685
742
  <span class="cline-any cline-neutral">&nbsp;</span>
686
743
  <span class="cline-any cline-neutral">&nbsp;</span>
687
744
  <span class="cline-any cline-neutral">&nbsp;</span>
688
- <span class="cline-any cline-yes">185x</span>
745
+ <span class="cline-any cline-yes">195x</span>
689
746
  <span class="cline-any cline-no">&nbsp;</span>
690
747
  <span class="cline-any cline-neutral">&nbsp;</span>
691
- <span class="cline-any cline-yes">185x</span>
692
- <span class="cline-any cline-yes">185x</span>
748
+ <span class="cline-any cline-yes">195x</span>
749
+ <span class="cline-any cline-yes">195x</span>
693
750
  <span class="cline-any cline-neutral">&nbsp;</span>
694
- <span class="cline-any cline-yes">185x</span>
695
- <span class="cline-any cline-yes">185x</span>
751
+ <span class="cline-any cline-yes">195x</span>
696
752
  <span class="cline-any cline-neutral">&nbsp;</span>
697
- <span class="cline-any cline-yes">185x</span>
753
+ <span class="cline-any cline-yes">195x</span>
698
754
  <span class="cline-any cline-neutral">&nbsp;</span>
699
- <span class="cline-any cline-yes">185x</span>
755
+ <span class="cline-any cline-yes">195x</span>
700
756
  <span class="cline-any cline-no">&nbsp;</span>
701
757
  <span class="cline-any cline-neutral">&nbsp;</span>
702
758
  <span class="cline-any cline-neutral">&nbsp;</span>
703
759
  <span class="cline-any cline-neutral">&nbsp;</span>
704
- <span class="cline-any cline-yes">185x</span>
760
+ <span class="cline-any cline-yes">195x</span>
705
761
  <span class="cline-any cline-neutral">&nbsp;</span>
706
762
  <span class="cline-any cline-neutral">&nbsp;</span>
707
763
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -716,32 +772,46 @@
716
772
  <span class="cline-any cline-neutral">&nbsp;</span>
717
773
  <span class="cline-any cline-neutral">&nbsp;</span>
718
774
  <span class="cline-any cline-neutral">&nbsp;</span>
719
- <span class="cline-any cline-yes">185x</span>
720
- <span class="cline-any cline-yes">185x</span>
775
+ <span class="cline-any cline-yes">195x</span>
776
+ <span class="cline-any cline-yes">195x</span>
777
+ <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-neutral">&nbsp;</span>
780
+ <span class="cline-any cline-yes">195x</span>
781
+ <span class="cline-any cline-yes">195x</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
721
783
  <span class="cline-any cline-neutral">&nbsp;</span>
722
784
  <span class="cline-any cline-neutral">&nbsp;</span>
723
785
  <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-yes">185x</span>
725
- <span class="cline-any cline-yes">185x</span>
726
786
  <span class="cline-any cline-neutral">&nbsp;</span>
727
787
  <span class="cline-any cline-neutral">&nbsp;</span>
728
788
  <span class="cline-any cline-neutral">&nbsp;</span>
789
+ <span class="cline-any cline-yes">195x</span>
790
+ <span class="cline-any cline-yes">195x</span>
791
+ <span class="cline-any cline-yes">195x</span>
792
+ <span class="cline-any cline-neutral">&nbsp;</span>
793
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
794
  <span class="cline-any cline-neutral">&nbsp;</span>
730
795
  <span class="cline-any cline-neutral">&nbsp;</span>
796
+ <span class="cline-any cline-yes">38x</span>
797
+ <span class="cline-any cline-yes">2x</span>
731
798
  <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-yes">2x</span>
800
+ <span class="cline-any cline-yes">2x</span>
801
+ <span class="cline-any cline-yes">2x</span>
732
802
  <span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-yes">185x</span>
734
- <span class="cline-any cline-yes">185x</span>
735
- <span class="cline-any cline-yes">185x</span>
803
+ <span class="cline-any cline-yes">2x</span>
804
+ <span class="cline-any cline-yes">2x</span>
805
+ <span class="cline-any cline-yes">2x</span>
806
+ <span class="cline-any cline-yes">2x</span>
736
807
  <span class="cline-any cline-neutral">&nbsp;</span>
737
808
  <span class="cline-any cline-neutral">&nbsp;</span>
738
- <span class="cline-any cline-yes">33x</span>
739
809
  <span class="cline-any cline-yes">2x</span>
740
810
  <span class="cline-any cline-yes">2x</span>
741
811
  <span class="cline-any cline-yes">2x</span>
742
812
  <span class="cline-any cline-neutral">&nbsp;</span>
743
813
  <span class="cline-any cline-neutral">&nbsp;</span>
744
- <span class="cline-any cline-yes">33x</span>
814
+ <span class="cline-any cline-yes">38x</span>
745
815
  <span class="cline-any cline-neutral">&nbsp;</span>
746
816
  <span class="cline-any cline-yes">2x</span>
747
817
  <span class="cline-any cline-yes">2x</span>
@@ -763,7 +833,7 @@
763
833
  <span class="cline-any cline-yes">2x</span>
764
834
  <span class="cline-any cline-neutral">&nbsp;</span>
765
835
  <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-yes">33x</span>
836
+ <span class="cline-any cline-yes">38x</span>
767
837
  <span class="cline-any cline-neutral">&nbsp;</span>
768
838
  <span class="cline-any cline-yes">1x</span>
769
839
  <span class="cline-any cline-yes">1x</span>
@@ -786,7 +856,7 @@
786
856
  <span class="cline-any cline-yes">1x</span>
787
857
  <span class="cline-any cline-neutral">&nbsp;</span>
788
858
  <span class="cline-any cline-neutral">&nbsp;</span>
789
- <span class="cline-any cline-yes">33x</span>
859
+ <span class="cline-any cline-yes">38x</span>
790
860
  <span class="cline-any cline-yes">11x</span>
791
861
  <span class="cline-any cline-neutral">&nbsp;</span>
792
862
  <span class="cline-any cline-yes">11x</span>
@@ -805,7 +875,7 @@
805
875
  <span class="cline-any cline-yes">11x</span>
806
876
  <span class="cline-any cline-neutral">&nbsp;</span>
807
877
  <span class="cline-any cline-neutral">&nbsp;</span>
808
- <span class="cline-any cline-yes">33x</span>
878
+ <span class="cline-any cline-yes">38x</span>
809
879
  <span class="cline-any cline-no">&nbsp;</span>
810
880
  <span class="cline-any cline-no">&nbsp;</span>
811
881
  <span class="cline-any cline-no">&nbsp;</span>
@@ -815,6 +885,7 @@
815
885
  <span class="cline-any cline-no">&nbsp;</span>
816
886
  <span class="cline-any cline-neutral">&nbsp;</span>
817
887
  <span class="cline-any cline-no">&nbsp;</span>
888
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
889
  <span class="cline-any cline-no">&nbsp;</span>
819
890
  <span class="cline-any cline-no">&nbsp;</span>
820
891
  <span class="cline-any cline-no">&nbsp;</span>
@@ -854,8 +925,7 @@
854
925
  <span class="cline-any cline-neutral">&nbsp;</span>
855
926
  <span class="cline-any cline-neutral">&nbsp;</span>
856
927
  <span class="cline-any cline-neutral">&nbsp;</span>
857
- <span class="cline-any cline-yes">33x</span>
858
- <span class="cline-any cline-yes">5x</span>
928
+ <span class="cline-any cline-yes">38x</span>
859
929
  <span class="cline-any cline-yes">5x</span>
860
930
  <span class="cline-any cline-yes">5x</span>
861
931
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -874,19 +944,18 @@
874
944
  <span class="cline-any cline-yes">5x</span>
875
945
  <span class="cline-any cline-neutral">&nbsp;</span>
876
946
  <span class="cline-any cline-neutral">&nbsp;</span>
877
- <span class="cline-any cline-yes">33x</span>
878
- <span class="cline-any cline-yes">185x</span>
947
+ <span class="cline-any cline-yes">38x</span>
948
+ <span class="cline-any cline-yes">195x</span>
879
949
  <span class="cline-any cline-neutral">&nbsp;</span>
880
- <span class="cline-any cline-yes">185x</span>
881
- <span class="cline-any cline-yes">185x</span>
882
- <span class="cline-any cline-yes">370x</span>
883
- <span class="cline-any cline-yes">370x</span>
950
+ <span class="cline-any cline-yes">195x</span>
951
+ <span class="cline-any cline-yes">195x</span>
952
+ <span class="cline-any cline-yes">390x</span>
953
+ <span class="cline-any cline-yes">390x</span>
884
954
  <span class="cline-any cline-neutral">&nbsp;</span>
885
955
  <span class="cline-any cline-neutral">&nbsp;</span>
886
- <span class="cline-any cline-yes">185x</span>
956
+ <span class="cline-any cline-yes">195x</span>
887
957
  <span class="cline-any cline-neutral">&nbsp;</span>
888
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const CouchDB = require("../../db")
889
- const env = require("../../environment")
958
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const env = require("../../environment")
890
959
  const packageJson = require("../../../package.json")
891
960
  const {
892
961
  createLinkView,
@@ -916,14 +985,11 @@ const { processObject } = require("@budibase/string-templates")
916
985
  const {
917
986
  getAllApps,
918
987
  isDevAppID,
919
- getDeployedAppID,
988
+ getProdAppID,
920
989
  Replication,
921
990
  } = require("@budibase/backend-core/db")
922
991
  const { USERS_TABLE_SCHEMA } = require("../../constants")
923
- const {
924
- getDeployedApps,
925
- removeAppFromUserRoles,
926
- } = require("../../utilities/workerRequests")
992
+ const { removeAppFromUserRoles } = require("../../utilities/workerRequests")
927
993
  const { clientLibraryPath, stringToReadStream } = require("../../utilities")
928
994
  const { getAllLocks } = require("../../utilities/redis")
929
995
  const {
@@ -935,11 +1001,17 @@ const { getTenantId, isMultiTenant } = require("@budibase/backend-core/tenancy")
935
1001
  const { syncGlobalUsers } = require("./user")
936
1002
  const { app: appCache } = require("@budibase/backend-core/cache")
937
1003
  const { cleanupAutomations } = require("../../automations/utils")
1004
+ const {
1005
+ getAppDB,
1006
+ getProdAppDB,
1007
+ updateAppId,
1008
+ } = require("@budibase/backend-core/context")
938
1009
  &nbsp;
939
1010
  const URL_REGEX_SLASH = /\/|\\/g
940
1011
  &nbsp;
941
1012
  // utility function, need to do away with this
942
- async function getLayouts(db) {
1013
+ async function getLayouts() {
1014
+ const db = getAppDB()
943
1015
  return (
944
1016
  await db.allDocs(
945
1017
  getLayoutParams(null, {
@@ -949,7 +1021,8 @@ async function getLayouts(db) {
949
1021
  ).rows.map(row =&gt; row.doc)
950
1022
  }
951
1023
  &nbsp;
952
- async function getScreens(db) {
1024
+ async function getScreens() {
1025
+ const db = getAppDB()
953
1026
  return (
954
1027
  await db.allDocs(
955
1028
  getScreenParams(null, {
@@ -965,37 +1038,51 @@ function getUserRoleId(ctx) {
965
1038
  : ctx.user.role._id
966
1039
  }
967
1040
  &nbsp;
968
- async function getAppUrlIfNotInUse(ctx) {
1041
+ exports.getAppUrl = ctx =&gt; {
1042
+ // construct the url
969
1043
  let url
970
1044
  <span class="missing-if-branch" title="if path not taken" >I</span>if (ctx.request.body.url) {
1045
+ // if the url is provided, use that
971
1046
  <span class="cstat-no" title="statement not covered" > url = encodeURI(ctx.request.body.url)</span>
972
1047
  } else if (ctx.request.body.name) {
1048
+ // otherwise use the name
973
1049
  url = encodeURI(`${ctx.request.body.name}`)
974
1050
  }
975
1051
  if (url) {
976
1052
  url = `/${url.replace(URL_REGEX_SLASH, "")}`.toLowerCase()
977
1053
  }
978
- if (!env.SELF_HOSTED) {
979
- return url
1054
+ return url
1055
+ }
1056
+ &nbsp;
1057
+ const checkAppUrl = (ctx, apps, url, currentAppId) =&gt; {
1058
+ if (currentAppId) {
1059
+ apps = apps.filter(app =&gt; app.appId !== currentAppId)
980
1060
  }
981
- const deployedApps = await getDeployedApps()
982
- <span class="missing-if-branch" title="if path not taken" >I</span>if (
983
- url &amp;&amp;
984
- deployedApps[url] != null &amp;&amp;
985
- <span class="branch-2 cbranch-no" title="branch not covered" > ctx.params != null </span>&amp;&amp;
986
- <span class="branch-3 cbranch-no" title="branch not covered" > deployedApps[url].appId !== ctx.params.appId</span>
987
- ) {
988
- <span class="cstat-no" title="statement not covered" > ctx.throw(400, "App name/URL is already in use.")</span>
1061
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (apps.some(app =&gt; app.url === url)) {
1062
+ <span class="cstat-no" title="statement not covered" > ctx.throw(400, "App URL is already in use.")</span>
1063
+ }
1064
+ }
1065
+ &nbsp;
1066
+ const checkAppName = (ctx, apps, name, currentAppId) =&gt; {
1067
+ // TODO: Replace with Joi
1068
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!name) {
1069
+ <span class="cstat-no" title="statement not covered" > ctx.throw(400, "Name is required")</span>
1070
+ }
1071
+ if (currentAppId) {
1072
+ apps = apps.filter(app =&gt; app.appId !== currentAppId)
1073
+ }
1074
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (apps.some(app =&gt; app.name === name)) {
1075
+ <span class="cstat-no" title="statement not covered" > ctx.throw(400, "App name is already in use.")</span>
989
1076
  }
990
- return url
991
1077
  }
992
1078
  &nbsp;
993
1079
  async function createInstance(template) {
994
1080
  const tenantId = isMultiTenant() ? <span class="branch-0 cbranch-no" title="branch not covered" >getTenantId() </span>: null
995
1081
  const baseAppId = generateAppID(tenantId)
996
1082
  const appId = generateDevAppID(baseAppId)
1083
+ updateAppId(appId)
997
1084
  &nbsp;
998
- const db = new CouchDB(appId)
1085
+ const db = getAppDB()
999
1086
  await db.put({
1000
1087
  _id: "_design/database",
1001
1088
  // view collation information, read before writing any complex views:
@@ -1005,9 +1092,9 @@ async function createInstance(template) {
1005
1092
  &nbsp;
1006
1093
  // NOTE: indexes need to be created before any tables/templates
1007
1094
  // add view for linked rows
1008
- await createLinkView(appId)
1009
- await createRoutingView(appId)
1010
- await createAllSearchIndex(appId)
1095
+ await createLinkView()
1096
+ await createRoutingView()
1097
+ await createAllSearchIndex()
1011
1098
  &nbsp;
1012
1099
  // replicate the template data to the instance DB
1013
1100
  // this is currently very hard to test, downloading and importing template files
@@ -1033,7 +1120,7 @@ async function createInstance(template) {
1033
1120
  exports.fetch = async ctx =&gt; {
1034
1121
  const dev = ctx.query &amp;&amp; ctx.query.status === AppStatus.DEV
1035
1122
  const all = ctx.query &amp;&amp; ctx.query.status === AppStatus.ALL
1036
- const apps = await getAllApps(CouchDB, { dev, all })
1123
+ const apps = await getAllApps({ dev, all })
1037
1124
  &nbsp;
1038
1125
  // get the locks for all the dev apps
1039
1126
  if (dev || <span class="branch-1 cbranch-no" title="branch not covered" >all)</span> {
@@ -1056,12 +1143,11 @@ exports.fetch = async ctx =&gt; {
1056
1143
  }
1057
1144
  &nbsp;
1058
1145
  exports.fetchAppDefinition = async ctx =&gt; {
1059
- const db = new CouchDB(ctx.params.appId)
1060
- const layouts = await getLayouts(db)
1146
+ const layouts = await getLayouts()
1061
1147
  const userRoleId = getUserRoleId(ctx)
1062
- const accessController = new AccessController(ctx.params.appId)
1148
+ const accessController = new AccessController()
1063
1149
  const screens = await accessController.checkScreensAccess(
1064
- await getScreens(db),
1150
+ await getScreens(),
1065
1151
  userRoleId
1066
1152
  )
1067
1153
  ctx.body = {
@@ -1072,15 +1158,15 @@ exports.fetchAppDefinition = async ctx =&gt; {
1072
1158
  }
1073
1159
  &nbsp;
1074
1160
  exports.fetchAppPackage = async ctx =&gt; {
1075
- const db = new CouchDB(ctx.params.appId)
1161
+ const db = getAppDB()
1076
1162
  const application = await db.get(DocumentTypes.APP_METADATA)
1077
- const layouts = await getLayouts(db)
1078
- let screens = await getScreens(db)
1163
+ const layouts = await getLayouts()
1164
+ let screens = await getScreens()
1079
1165
  &nbsp;
1080
1166
  // Only filter screens if the user is not a builder
1081
1167
  if (!(ctx.user.builder &amp;&amp; ctx.user.builder.global)) {
1082
1168
  const userRoleId = getUserRoleId(ctx)
1083
- const accessController = new AccessController(ctx.params.appId)
1169
+ const accessController = new AccessController()
1084
1170
  screens = await accessController.checkScreensAccess(screens, userRoleId)
1085
1171
  }
1086
1172
  &nbsp;
@@ -1093,6 +1179,12 @@ exports.fetchAppPackage = async ctx =&gt; {
1093
1179
  }
1094
1180
  &nbsp;
1095
1181
  exports.create = async ctx =&gt; {
1182
+ const apps = await getAllApps({ dev: true })
1183
+ const name = ctx.request.body.name
1184
+ checkAppName(ctx, apps, name)
1185
+ const url = exports.getAppUrl(ctx)
1186
+ checkAppUrl(ctx, apps, url)
1187
+ &nbsp;
1096
1188
  const { useTemplate, templateKey, templateString } = ctx.request.body
1097
1189
  const instanceConfig = {
1098
1190
  useTemplate,
@@ -1105,8 +1197,7 @@ exports.create = async ctx =&gt; {
1105
1197
  const instance = await createInstance(instanceConfig)
1106
1198
  const appId = instance._id
1107
1199
  &nbsp;
1108
- const url = await getAppUrlIfNotInUse(ctx)
1109
- const db = new CouchDB(appId)
1200
+ const db = getAppDB()
1110
1201
  let _rev
1111
1202
  try {
1112
1203
  // if template there will be an existing doc
@@ -1122,7 +1213,7 @@ exports.create = async ctx =&gt; {
1122
1213
  type: "app",
1123
1214
  version: packageJson.version,
1124
1215
  componentLibraries: ["@budibase/standard-components"],
1125
- name: ctx.request.body.name,
1216
+ name: name,
1126
1217
  url: url,
1127
1218
  template: ctx.request.body.template,
1128
1219
  instance: instance,
@@ -1149,15 +1240,29 @@ exports.create = async ctx =&gt; {
1149
1240
  ctx.body = newApplication
1150
1241
  }
1151
1242
  &nbsp;
1243
+ // This endpoint currently operates as a PATCH rather than a PUT
1244
+ // Thus name and url fields are handled only if present
1152
1245
  exports.update = async ctx =&gt; {
1153
- const data = await updateAppPackage(ctx, ctx.request.body, ctx.params.appId)
1246
+ const apps = await getAllApps({ dev: true })
1247
+ // validation
1248
+ const name = ctx.request.body.name
1249
+ if (name) {
1250
+ checkAppName(ctx, apps, name, ctx.params.appId)
1251
+ }
1252
+ const url = await exports.getAppUrl(ctx)
1253
+ if (url) {
1254
+ checkAppUrl(ctx, apps, url, ctx.params.appId)
1255
+ ctx.request.body.url = url
1256
+ }
1257
+ &nbsp;
1258
+ const data = await updateAppPackage(ctx.request.body, ctx.params.appId)
1154
1259
  ctx.status = 200
1155
1260
  ctx.body = data
1156
1261
  }
1157
1262
  &nbsp;
1158
1263
  exports.updateClient = async ctx =&gt; {
1159
1264
  // Get current app version
1160
- const db = new CouchDB(ctx.params.appId)
1265
+ const db = getAppDB()
1161
1266
  const application = await db.get(DocumentTypes.APP_METADATA)
1162
1267
  const currentVersion = application.version
1163
1268
  &nbsp;
@@ -1172,14 +1277,14 @@ exports.updateClient = async ctx =&gt; {
1172
1277
  version: packageJson.version,
1173
1278
  revertableVersion: currentVersion,
1174
1279
  }
1175
- const data = await updateAppPackage(ctx, appPackageUpdates, ctx.params.appId)
1280
+ const data = await updateAppPackage(appPackageUpdates, ctx.params.appId)
1176
1281
  ctx.status = 200
1177
1282
  ctx.body = data
1178
1283
  }
1179
1284
  &nbsp;
1180
1285
  exports.revertClient = async ctx =&gt; {
1181
1286
  // Check app can be reverted
1182
- const db = new CouchDB(ctx.params.appId)
1287
+ const db = getAppDB()
1183
1288
  const application = await db.get(DocumentTypes.APP_METADATA)
1184
1289
  <span class="missing-if-branch" title="if path not taken" >I</span>if (!application.revertableVersion) {
1185
1290
  <span class="cstat-no" title="statement not covered" > ctx.throw(400, "There is no version to revert to")</span>
@@ -1195,13 +1300,13 @@ exports.revertClient = async ctx =&gt; {
1195
1300
  version: application.revertableVersion,
1196
1301
  revertableVersion: null,
1197
1302
  }
1198
- const data = await updateAppPackage(ctx, appPackageUpdates, ctx.params.appId)
1303
+ const data = await updateAppPackage(appPackageUpdates, ctx.params.appId)
1199
1304
  ctx.status = 200
1200
1305
  ctx.body = data
1201
1306
  }
1202
1307
  &nbsp;
1203
1308
  exports.delete = async ctx =&gt; {
1204
- const db = new CouchDB(ctx.params.appId)
1309
+ const db = getAppDB()
1205
1310
  &nbsp;
1206
1311
  const result = await db.destroy()
1207
1312
  /* istanbul ignore next */
@@ -1226,10 +1331,11 @@ exports.sync = <span class="fstat-no" title="function not covered" >as</span>ync
1226
1331
  }
1227
1332
  &nbsp;
1228
1333
  // replicate prod to dev
1229
- const prodAppId = <span class="cstat-no" title="statement not covered" >getDeployedAppID(appId)</span>
1334
+ const prodAppId = <span class="cstat-no" title="statement not covered" >getProdAppID(appId)</span>
1230
1335
  &nbsp;
1231
1336
  <span class="cstat-no" title="statement not covered" > try {</span>
1232
- const prodDb = <span class="cstat-no" title="statement not covered" >new CouchDB(prodAppId, { skip_setup: true })</span>
1337
+ // specific case, want to make sure setup is skipped
1338
+ const prodDb = <span class="cstat-no" title="statement not covered" >getProdAppDB({ skip_setup: true })</span>
1233
1339
  const info = <span class="cstat-no" title="statement not covered" >await prodDb.info()</span>
1234
1340
  <span class="cstat-no" title="statement not covered" > if (info.error) <span class="cstat-no" title="statement not covered" >throw info.error</span></span>
1235
1341
  } catch (err) {
@@ -1257,7 +1363,7 @@ exports.sync = <span class="fstat-no" title="function not covered" >as</span>ync
1257
1363
  }
1258
1364
  &nbsp;
1259
1365
  // sync the users
1260
- <span class="cstat-no" title="statement not covered" > await syncGlobalUsers(appId)</span>
1366
+ <span class="cstat-no" title="statement not covered" > await syncGlobalUsers()</span>
1261
1367
  &nbsp;
1262
1368
  <span class="cstat-no" title="statement not covered" > if (error) {</span>
1263
1369
  <span class="cstat-no" title="statement not covered" > ctx.throw(400, error)</span>
@@ -1268,12 +1374,11 @@ exports.sync = <span class="fstat-no" title="function not covered" >as</span>ync
1268
1374
  }
1269
1375
  }
1270
1376
  &nbsp;
1271
- const updateAppPackage = async (ctx, appPackage, appId) =&gt; {
1272
- const url = await getAppUrlIfNotInUse(ctx)
1273
- const db = new CouchDB(appId)
1377
+ const updateAppPackage = async (appPackage, appId) =&gt; {
1378
+ const db = getAppDB()
1274
1379
  const application = await db.get(DocumentTypes.APP_METADATA)
1275
1380
  &nbsp;
1276
- const newAppPackage = { ...application, ...appPackage, url }
1381
+ const newAppPackage = { ...application, ...appPackage }
1277
1382
  if (appPackage._rev !== application._rev) {
1278
1383
  newAppPackage._rev = application._rev
1279
1384
  }
@@ -1289,7 +1394,7 @@ const updateAppPackage = async (ctx, appPackage, appId) =&gt; {
1289
1394
  }
1290
1395
  &nbsp;
1291
1396
  const createEmptyAppPackage = async (ctx, app) =&gt; {
1292
- const db = new CouchDB(app.appId)
1397
+ const db = getAppDB()
1293
1398
  &nbsp;
1294
1399
  let screensAndLayouts = []
1295
1400
  for (let layout of BASE_LAYOUTS) {
@@ -1306,7 +1411,7 @@ const createEmptyAppPackage = async (ctx, app) =&gt; {
1306
1411
  <div class='footer quiet pad2 space-top1 center small'>
1307
1412
  Code coverage generated by
1308
1413
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
1309
- at Fri Feb 04 2022 12:19:28 GMT+0000 (Coordinated Universal Time)
1414
+ at Mon Feb 07 2022 20:42:11 GMT+0000 (Coordinated Universal Time)
1310
1415
  </div>
1311
1416
  </div>
1312
1417
  <script src="../../prettify.js"></script>