@budibase/server 1.0.49-alpha.6 → 1.0.49

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