@budibase/server 1.0.46 → 1.0.49-alpha.1

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 (277) hide show
  1. package/builder/assets/index.ba78c49d.css +1 -0
  2. package/builder/assets/{index.e9bff1c6.js → index.ed1cf508.js} +237 -234
  3. package/builder/assets/{vendor.f9faf6ab.js → vendor.d526bfe8.js} +12 -12
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +2368 -2016
  6. package/coverage/coverage-final.json +101 -95
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/application.js.html +210 -126
  10. package/coverage/lcov-report/api/controllers/auth.js.html +18 -6
  11. package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
  12. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +72 -36
  16. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +38 -53
  18. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/permission.js.html +15 -15
  22. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/index.js.html +19 -19
  24. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
  25. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  26. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
  28. package/coverage/lcov-report/api/controllers/row/index.html +48 -33
  29. package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
  30. package/coverage/lcov-report/api/controllers/row/internal.js.html +95 -158
  31. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +41 -17
  32. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +551 -0
  33. package/coverage/lcov-report/api/controllers/row/utils.js.html +39 -57
  34. package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
  35. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  36. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +629 -0
  37. package/coverage/lcov-report/api/controllers/table/external.js.html +12 -12
  38. package/coverage/lcov-report/api/controllers/table/index.html +49 -34
  39. package/coverage/lcov-report/api/controllers/table/index.js.html +53 -77
  40. package/coverage/lcov-report/api/controllers/table/internal.js.html +59 -35
  41. package/coverage/lcov-report/api/controllers/table/utils.js.html +283 -76
  42. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/user.js.html +30 -24
  44. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  45. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/index.js.html +14 -14
  47. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  48. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  49. package/coverage/lcov-report/api/controllers/webhook.js.html +15 -15
  50. package/coverage/lcov-report/api/index.html +1 -1
  51. package/coverage/lcov-report/api/index.js.html +10 -10
  52. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/index.html +7 -22
  64. package/coverage/lcov-report/api/routes/index.js.html +4 -10
  65. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/static.js.html +17 -2
  76. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  81. package/coverage/lcov-report/automations/actions.js.html +24 -24
  82. package/coverage/lcov-report/automations/automationUtils.js.html +5 -5
  83. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  84. package/coverage/lcov-report/automations/index.html +1 -1
  85. package/coverage/lcov-report/automations/index.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  87. package/coverage/lcov-report/automations/steps/createRow.js.html +13 -19
  88. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  89. package/coverage/lcov-report/automations/steps/deleteRow.js.html +11 -20
  90. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  91. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  92. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  93. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  94. package/coverage/lcov-report/automations/steps/index.html +13 -13
  95. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  96. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  97. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  98. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  99. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  100. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  101. package/coverage/lcov-report/automations/steps/updateRow.js.html +6 -6
  102. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  103. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  104. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  105. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  106. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  108. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  109. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  110. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  111. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  112. package/coverage/lcov-report/automations/triggers.js.html +18 -18
  113. package/coverage/lcov-report/automations/utils.js.html +32 -32
  114. package/coverage/lcov-report/constants/index.html +11 -11
  115. package/coverage/lcov-report/constants/index.js.html +68 -32
  116. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  117. package/coverage/lcov-report/constants/screens.js.html +4 -4
  118. package/coverage/lcov-report/db/client.js.html +18 -18
  119. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  120. package/coverage/lcov-report/db/index.html +15 -15
  121. package/coverage/lcov-report/db/index.js.html +3 -3
  122. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +18 -18
  123. package/coverage/lcov-report/db/linkedRows/index.html +10 -10
  124. package/coverage/lcov-report/db/linkedRows/index.js.html +38 -41
  125. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +15 -15
  126. package/coverage/lcov-report/db/newid.js.html +4 -4
  127. package/coverage/lcov-report/db/utils.js.html +86 -86
  128. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  129. package/coverage/lcov-report/events/index.html +1 -1
  130. package/coverage/lcov-report/events/index.js.html +5 -5
  131. package/coverage/lcov-report/events/utils.js.html +3 -3
  132. package/coverage/lcov-report/index.html +131 -101
  133. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  134. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  135. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  136. package/coverage/lcov-report/middleware/authorized.js.html +166 -64
  137. package/coverage/lcov-report/middleware/builder.js.html +8 -8
  138. package/coverage/lcov-report/middleware/currentapp.js.html +29 -29
  139. package/coverage/lcov-report/middleware/index.html +30 -30
  140. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  141. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  142. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  143. package/coverage/lcov-report/middleware/usageQuota.js.html +275 -41
  144. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  145. package/coverage/lcov-report/migrations/usageQuotas/index.html +141 -0
  146. package/coverage/lcov-report/migrations/usageQuotas/index.js.html +152 -0
  147. package/coverage/lcov-report/{api/routes/hosting.js.html → migrations/usageQuotas/syncApps.js.html} +42 -27
  148. package/coverage/lcov-report/{api/controllers/hosting.js.html → migrations/usageQuotas/syncRows.js.html} +41 -44
  149. package/coverage/lcov-report/threads/automation.js.html +1 -1
  150. package/coverage/lcov-report/threads/index.html +15 -15
  151. package/coverage/lcov-report/threads/index.js.html +10 -10
  152. package/coverage/lcov-report/threads/query.js.html +23 -8
  153. package/coverage/lcov-report/threads/utils.js.html +14 -14
  154. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  155. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  156. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  157. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  158. package/coverage/lcov-report/utilities/global.js.html +26 -26
  159. package/coverage/lcov-report/utilities/index.html +19 -19
  160. package/coverage/lcov-report/utilities/index.js.html +25 -25
  161. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
  162. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  163. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  164. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  165. package/coverage/lcov-report/utilities/rowProcessor/index.html +27 -27
  166. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +115 -79
  167. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +75 -27
  168. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  169. package/coverage/lcov-report/utilities/security.js.html +8 -8
  170. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  171. package/coverage/lcov-report/utilities/usageQuota/index.html +141 -0
  172. package/coverage/lcov-report/utilities/usageQuota/index.js.html +356 -0
  173. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +302 -0
  174. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +134 -0
  175. package/coverage/lcov-report/utilities/users.js.html +5 -5
  176. package/coverage/lcov-report/utilities/workerRequests.js.html +39 -108
  177. package/coverage/lcov.info +3719 -3046
  178. package/dist/api/controllers/application.js +49 -20
  179. package/dist/api/controllers/auth.js +4 -0
  180. package/dist/api/controllers/datasource.js +11 -0
  181. package/dist/api/controllers/row/ExternalRequest.js +2 -1
  182. package/dist/api/controllers/row/internal.js +30 -53
  183. package/dist/api/controllers/row/internalSearch.js +12 -4
  184. package/dist/api/controllers/row/staticFormula.js +147 -0
  185. package/dist/api/controllers/row/utils.js +6 -8
  186. package/dist/api/controllers/static/index.js +59 -10
  187. package/dist/api/controllers/table/bulkFormula.js +160 -0
  188. package/dist/api/controllers/table/index.js +12 -9
  189. package/dist/api/controllers/table/internal.js +9 -0
  190. package/dist/api/controllers/table/utils.js +56 -14
  191. package/dist/api/controllers/user.js +2 -0
  192. package/dist/api/routes/index.js +0 -2
  193. package/dist/api/routes/static.js +2 -1
  194. package/dist/automations/steps/createRow.js +2 -4
  195. package/dist/automations/steps/deleteRow.js +1 -4
  196. package/dist/constants/index.js +12 -5
  197. package/dist/db/linkedRows/index.js +4 -5
  198. package/dist/definitions/datasource.js +1 -0
  199. package/dist/environment.js +1 -0
  200. package/dist/integrations/base/sql.js +13 -6
  201. package/dist/integrations/googlesheets.js +340 -0
  202. package/dist/integrations/index.js +3 -0
  203. package/dist/integrations/utils.js +57 -8
  204. package/dist/middleware/authorized.js +55 -30
  205. package/dist/middleware/usageQuota.js +82 -13
  206. package/dist/migrations/usageQuotas/index.js +24 -0
  207. package/dist/migrations/usageQuotas/syncApps.js +26 -0
  208. package/dist/migrations/usageQuotas/syncRows.js +29 -0
  209. package/dist/package.json +8 -5
  210. package/dist/tests/utilities/TestConfiguration.js +10 -6
  211. package/dist/threads/query.js +4 -0
  212. package/dist/tsconfig.tsbuildinfo +1 -1
  213. package/dist/utilities/rowProcessor/index.js +18 -11
  214. package/dist/utilities/rowProcessor/utils.js +14 -4
  215. package/dist/utilities/{usageQuota.js → usageQuota/index.js} +44 -31
  216. package/dist/utilities/usageQuota/rows.js +77 -0
  217. package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
  218. package/dist/utilities/workerRequests.js +0 -20
  219. package/nodemon.json +1 -1
  220. package/package.json +9 -6
  221. package/src/api/controllers/application.js +52 -24
  222. package/src/api/controllers/auth.js +4 -0
  223. package/src/api/controllers/datasource.js +12 -0
  224. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  225. package/src/api/controllers/row/internal.js +29 -50
  226. package/src/api/controllers/row/internalSearch.js +12 -4
  227. package/src/api/controllers/row/staticFormula.js +157 -0
  228. package/src/api/controllers/row/utils.js +6 -12
  229. package/src/api/controllers/static/index.js +63 -10
  230. package/src/api/controllers/table/bulkFormula.js +183 -0
  231. package/src/api/controllers/table/index.js +16 -24
  232. package/src/api/controllers/table/internal.js +9 -1
  233. package/src/api/controllers/table/utils.js +80 -11
  234. package/src/api/controllers/user.js +2 -0
  235. package/src/api/routes/index.js +0 -2
  236. package/src/api/routes/static.js +5 -0
  237. package/src/api/routes/tests/application.spec.js +2 -2
  238. package/src/api/routes/tests/auth.spec.js +1 -2
  239. package/src/api/routes/tests/static.spec.js +98 -0
  240. package/src/automations/steps/createRow.js +2 -4
  241. package/src/automations/steps/deleteRow.js +1 -4
  242. package/src/constants/index.js +17 -5
  243. package/src/db/linkedRows/index.js +4 -5
  244. package/src/definitions/common.ts +3 -0
  245. package/src/definitions/datasource.ts +3 -0
  246. package/src/environment.js +1 -0
  247. package/src/integrations/base/sql.ts +14 -7
  248. package/src/integrations/googlesheets.ts +353 -0
  249. package/src/integrations/index.ts +3 -0
  250. package/src/integrations/tests/sql.spec.js +16 -0
  251. package/src/integrations/utils.ts +71 -10
  252. package/src/middleware/authorized.js +64 -30
  253. package/src/middleware/tests/authorized.spec.js +6 -4
  254. package/src/middleware/tests/usageQuota.spec.js +18 -24
  255. package/src/middleware/usageQuota.js +93 -15
  256. package/src/migrations/tests/usageQuotas/index.spec.js +27 -0
  257. package/src/migrations/tests/usageQuotas/syncApps.spec.js +37 -0
  258. package/src/migrations/tests/usageQuotas/syncRows.spec.js +43 -0
  259. package/src/migrations/usageQuotas/index.js +24 -0
  260. package/src/migrations/usageQuotas/syncApps.js +18 -0
  261. package/src/migrations/usageQuotas/syncRows.js +21 -0
  262. package/src/tests/utilities/TestConfiguration.js +10 -6
  263. package/src/threads/query.js +5 -0
  264. package/src/utilities/rowProcessor/index.js +24 -12
  265. package/src/utilities/rowProcessor/utils.js +23 -7
  266. package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
  267. package/src/utilities/usageQuota/index.js +92 -0
  268. package/src/utilities/usageQuota/rows.js +74 -0
  269. package/src/utilities/usageQuota/usageQuoteReset.js +18 -0
  270. package/src/utilities/workerRequests.js +0 -23
  271. package/builder/assets/index.39e01193.css +0 -1
  272. package/dist/api/controllers/hosting.js +0 -30
  273. package/dist/api/routes/hosting.js +0 -11
  274. package/src/api/controllers/hosting.js +0 -22
  275. package/src/api/routes/hosting.js +0 -13
  276. package/src/api/routes/tests/hosting.spec.js +0 -36
  277. package/src/utilities/usageQuota.js +0 -73
@@ -247,7 +247,7 @@ module.exports.bodySubResource = (main, sub) => {
247
247
  <div class='footer quiet pad2 space-top1 center small'>
248
248
  Code coverage generated by
249
249
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
250
- at Thu Jan 20 2022 19:58:26 GMT+0000 (Coordinated Universal Time)
250
+ at Mon Jan 31 2022 16:01:47 GMT+0000 (Coordinated Universal Time)
251
251
  </div>
252
252
  </div>
253
253
  <script src="../prettify.js"></script>
@@ -94,7 +94,7 @@ module.exports = async (ctx, next) =&gt; {
94
94
  <div class='footer quiet pad2 space-top1 center small'>
95
95
  Code coverage generated by
96
96
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
97
- at Thu Jan 20 2022 19:58:26 GMT+0000 (Coordinated Universal Time)
97
+ at Mon Jan 31 2022 16:01:47 GMT+0000 (Coordinated Universal Time)
98
98
  </div>
99
99
  </div>
100
100
  <script src="../prettify.js"></script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">92.1% </span>
26
+ <span class="strong">67.12% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>35/38</span>
28
+ <span class='fraction'>49/73</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">82.14% </span>
33
+ <span class="strong">50.98% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>23/28</span>
35
+ <span class='fraction'>26/51</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
40
+ <span class="strong">50% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>4/4</span>
42
+ <span class='fraction'>4/8</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">91.66% </span>
47
+ <span class="strong">69.01% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>33/36</span>
49
+ <span class='fraction'>49/71</span>
50
50
  </div>
51
51
 
52
52
 
@@ -55,7 +55,7 @@
55
55
  Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
56
  </p>
57
57
  </div>
58
- <div class='status-line high'></div>
58
+ <div class='status-line medium'></div>
59
59
  <pre><table class="coverage">
60
60
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
61
  <a name='L2'></a><a href='#L2'>2</a>
@@ -145,16 +145,91 @@
145
145
  <a name='L86'></a><a href='#L86'>86</a>
146
146
  <a name='L87'></a><a href='#L87'>87</a>
147
147
  <a name='L88'></a><a href='#L88'>88</a>
148
- <a name='L89'></a><a href='#L89'>89</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">24x</span>
149
- <span class="cline-any cline-yes">24x</span>
148
+ <a name='L89'></a><a href='#L89'>89</a>
149
+ <a name='L90'></a><a href='#L90'>90</a>
150
+ <a name='L91'></a><a href='#L91'>91</a>
151
+ <a name='L92'></a><a href='#L92'>92</a>
152
+ <a name='L93'></a><a href='#L93'>93</a>
153
+ <a name='L94'></a><a href='#L94'>94</a>
154
+ <a name='L95'></a><a href='#L95'>95</a>
155
+ <a name='L96'></a><a href='#L96'>96</a>
156
+ <a name='L97'></a><a href='#L97'>97</a>
157
+ <a name='L98'></a><a href='#L98'>98</a>
158
+ <a name='L99'></a><a href='#L99'>99</a>
159
+ <a name='L100'></a><a href='#L100'>100</a>
160
+ <a name='L101'></a><a href='#L101'>101</a>
161
+ <a name='L102'></a><a href='#L102'>102</a>
162
+ <a name='L103'></a><a href='#L103'>103</a>
163
+ <a name='L104'></a><a href='#L104'>104</a>
164
+ <a name='L105'></a><a href='#L105'>105</a>
165
+ <a name='L106'></a><a href='#L106'>106</a>
166
+ <a name='L107'></a><a href='#L107'>107</a>
167
+ <a name='L108'></a><a href='#L108'>108</a>
168
+ <a name='L109'></a><a href='#L109'>109</a>
169
+ <a name='L110'></a><a href='#L110'>110</a>
170
+ <a name='L111'></a><a href='#L111'>111</a>
171
+ <a name='L112'></a><a href='#L112'>112</a>
172
+ <a name='L113'></a><a href='#L113'>113</a>
173
+ <a name='L114'></a><a href='#L114'>114</a>
174
+ <a name='L115'></a><a href='#L115'>115</a>
175
+ <a name='L116'></a><a href='#L116'>116</a>
176
+ <a name='L117'></a><a href='#L117'>117</a>
177
+ <a name='L118'></a><a href='#L118'>118</a>
178
+ <a name='L119'></a><a href='#L119'>119</a>
179
+ <a name='L120'></a><a href='#L120'>120</a>
180
+ <a name='L121'></a><a href='#L121'>121</a>
181
+ <a name='L122'></a><a href='#L122'>122</a>
182
+ <a name='L123'></a><a href='#L123'>123</a>
183
+ <a name='L124'></a><a href='#L124'>124</a>
184
+ <a name='L125'></a><a href='#L125'>125</a>
185
+ <a name='L126'></a><a href='#L126'>126</a>
186
+ <a name='L127'></a><a href='#L127'>127</a>
187
+ <a name='L128'></a><a href='#L128'>128</a>
188
+ <a name='L129'></a><a href='#L129'>129</a>
189
+ <a name='L130'></a><a href='#L130'>130</a>
190
+ <a name='L131'></a><a href='#L131'>131</a>
191
+ <a name='L132'></a><a href='#L132'>132</a>
192
+ <a name='L133'></a><a href='#L133'>133</a>
193
+ <a name='L134'></a><a href='#L134'>134</a>
194
+ <a name='L135'></a><a href='#L135'>135</a>
195
+ <a name='L136'></a><a href='#L136'>136</a>
196
+ <a name='L137'></a><a href='#L137'>137</a>
197
+ <a name='L138'></a><a href='#L138'>138</a>
198
+ <a name='L139'></a><a href='#L139'>139</a>
199
+ <a name='L140'></a><a href='#L140'>140</a>
200
+ <a name='L141'></a><a href='#L141'>141</a>
201
+ <a name='L142'></a><a href='#L142'>142</a>
202
+ <a name='L143'></a><a href='#L143'>143</a>
203
+ <a name='L144'></a><a href='#L144'>144</a>
204
+ <a name='L145'></a><a href='#L145'>145</a>
205
+ <a name='L146'></a><a href='#L146'>146</a>
206
+ <a name='L147'></a><a href='#L147'>147</a>
207
+ <a name='L148'></a><a href='#L148'>148</a>
208
+ <a name='L149'></a><a href='#L149'>149</a>
209
+ <a name='L150'></a><a href='#L150'>150</a>
210
+ <a name='L151'></a><a href='#L151'>151</a>
211
+ <a name='L152'></a><a href='#L152'>152</a>
212
+ <a name='L153'></a><a href='#L153'>153</a>
213
+ <a name='L154'></a><a href='#L154'>154</a>
214
+ <a name='L155'></a><a href='#L155'>155</a>
215
+ <a name='L156'></a><a href='#L156'>156</a>
216
+ <a name='L157'></a><a href='#L157'>157</a>
217
+ <a name='L158'></a><a href='#L158'>158</a>
218
+ <a name='L159'></a><a href='#L159'>159</a>
219
+ <a name='L160'></a><a href='#L160'>160</a>
220
+ <a name='L161'></a><a href='#L161'>161</a>
221
+ <a name='L162'></a><a href='#L162'>162</a>
222
+ <a name='L163'></a><a href='#L163'>163</a>
223
+ <a name='L164'></a><a href='#L164'>164</a>
224
+ <a name='L165'></a><a href='#L165'>165</a>
225
+ <a name='L166'></a><a href='#L166'>166</a>
226
+ <a name='L167'></a><a href='#L167'>167</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">24x</span>
150
227
  <span class="cline-any cline-yes">24x</span>
151
228
  <span class="cline-any cline-yes">24x</span>
152
229
  <span class="cline-any cline-neutral">&nbsp;</span>
153
230
  <span class="cline-any cline-neutral">&nbsp;</span>
154
231
  <span class="cline-any cline-neutral">&nbsp;</span>
155
232
  <span class="cline-any cline-yes">24x</span>
156
- <span class="cline-any cline-neutral">&nbsp;</span>
157
- <span class="cline-any cline-neutral">&nbsp;</span>
158
233
  <span class="cline-any cline-yes">24x</span>
159
234
  <span class="cline-any cline-neutral">&nbsp;</span>
160
235
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -176,18 +251,15 @@
176
251
  <span class="cline-any cline-neutral">&nbsp;</span>
177
252
  <span class="cline-any cline-neutral">&nbsp;</span>
178
253
  <span class="cline-any cline-yes">4x</span>
179
- <span class="cline-any cline-yes">5x</span>
254
+ <span class="cline-any cline-yes">7x</span>
180
255
  <span class="cline-any cline-yes">4x</span>
181
256
  <span class="cline-any cline-neutral">&nbsp;</span>
182
257
  <span class="cline-any cline-neutral">&nbsp;</span>
183
258
  <span class="cline-any cline-neutral">&nbsp;</span>
184
259
  <span class="cline-any cline-neutral">&nbsp;</span>
185
260
  <span class="cline-any cline-yes">24x</span>
186
- <span class="cline-any cline-yes">11x</span>
187
- <span class="cline-any cline-neutral">&nbsp;</span>
188
- <span class="cline-any cline-neutral">&nbsp;</span>
189
- <span class="cline-any cline-yes">11x</span>
190
- <span class="cline-any cline-yes">7x</span>
261
+ <span class="cline-any cline-yes">10x</span>
262
+ <span class="cline-any cline-yes">6x</span>
191
263
  <span class="cline-any cline-neutral">&nbsp;</span>
192
264
  <span class="cline-any cline-neutral">&nbsp;</span>
193
265
  <span class="cline-any cline-yes">4x</span>
@@ -221,10 +293,10 @@
221
293
  <span class="cline-any cline-neutral">&nbsp;</span>
222
294
  <span class="cline-any cline-yes">3x</span>
223
295
  <span class="cline-any cline-neutral">&nbsp;</span>
224
- <span class="cline-any cline-yes">1x</span>
296
+ <span class="cline-any cline-no">&nbsp;</span>
225
297
  <span class="cline-any cline-neutral">&nbsp;</span>
226
298
  <span class="cline-any cline-neutral">&nbsp;</span>
227
- <span class="cline-any cline-yes">2x</span>
299
+ <span class="cline-any cline-no">&nbsp;</span>
228
300
  <span class="cline-any cline-neutral">&nbsp;</span>
229
301
  <span class="cline-any cline-yes">3x</span>
230
302
  <span class="cline-any cline-yes">3x</span>
@@ -233,17 +305,98 @@
233
305
  <span class="cline-any cline-no">&nbsp;</span>
234
306
  <span class="cline-any cline-neutral">&nbsp;</span>
235
307
  <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-yes">24x</span>
310
+ <span class="cline-any cline-yes">3x</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-neutral">&nbsp;</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-neutral">&nbsp;</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-yes">3x</span>
317
+ <span class="cline-any cline-no">&nbsp;</span>
318
+ <span class="cline-any cline-no">&nbsp;</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-yes">3x</span>
322
+ <span class="cline-any cline-no">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
327
+ <span class="cline-any cline-yes">3x</span>
328
+ <span class="cline-any cline-yes">3x</span>
329
+ <span class="cline-any cline-yes">3x</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-yes">3x</span>
333
+ <span class="cline-any cline-no">&nbsp;</span>
334
+ <span class="cline-any cline-no">&nbsp;</span>
335
+ <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-yes">3x</span>
338
+ <span class="cline-any cline-yes">2x</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-yes">3x</span>
344
+ <span class="cline-any cline-yes">3x</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-yes">24x</span>
349
+ <span class="cline-any cline-no">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-no">&nbsp;</span>
352
+ <span class="cline-any cline-no">&nbsp;</span>
353
+ <span class="cline-any cline-neutral">&nbsp;</span>
354
+ <span class="cline-any cline-neutral">&nbsp;</span>
355
+ <span class="cline-any cline-neutral">&nbsp;</span>
356
+ <span class="cline-any cline-no">&nbsp;</span>
357
+ <span class="cline-any cline-no">&nbsp;</span>
358
+ <span class="cline-any cline-no">&nbsp;</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-neutral">&nbsp;</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-yes">24x</span>
363
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
+ <span class="cline-any cline-no">&nbsp;</span>
365
+ <span class="cline-any cline-no">&nbsp;</span>
366
+ <span class="cline-any cline-no">&nbsp;</span>
367
+ <span class="cline-any cline-neutral">&nbsp;</span>
368
+ <span class="cline-any cline-neutral">&nbsp;</span>
369
+ <span class="cline-any cline-neutral">&nbsp;</span>
370
+ <span class="cline-any cline-yes">24x</span>
371
+ <span class="cline-any cline-neutral">&nbsp;</span>
372
+ <span class="cline-any cline-yes">2x</span>
373
+ <span class="cline-any cline-no">&nbsp;</span>
374
+ <span class="cline-any cline-no">&nbsp;</span>
375
+ <span class="cline-any cline-no">&nbsp;</span>
376
+ <span class="cline-any cline-neutral">&nbsp;</span>
377
+ <span class="cline-any cline-neutral">&nbsp;</span>
378
+ <span class="cline-any cline-neutral">&nbsp;</span>
379
+ <span class="cline-any cline-yes">24x</span>
380
+ <span class="cline-any cline-neutral">&nbsp;</span>
381
+ <span class="cline-any cline-neutral">&nbsp;</span>
382
+ <span class="cline-any cline-neutral">&nbsp;</span>
383
+ <span class="cline-any cline-yes">24x</span>
384
+ <span class="cline-any cline-neutral">&nbsp;</span>
385
+ <span class="cline-any cline-neutral">&nbsp;</span>
386
+ <span class="cline-any cline-neutral">&nbsp;</span>
387
+ <span class="cline-any cline-yes">24x</span>
388
+ <span class="cline-any cline-neutral">&nbsp;</span>
389
+ <span class="cline-any cline-yes">24x</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-neutral">&nbsp;</span>
236
392
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const CouchDB = require("../db")
237
393
  const usageQuota = require("../utilities/usageQuota")
238
- const env = require("../environment")
239
- const { getTenantId } = require("@budibase/backend-core/tenancy")
394
+ const { getUniqueRows } = require("../utilities/usageQuota/rows")
240
395
  const {
241
396
  isExternalTable,
242
397
  isRowId: isExternalRowId,
243
398
  } = require("../integrations/utils")
244
- &nbsp;
245
- // tenants without limits
246
- const EXCLUDED_TENANTS = ["bb", "default", "bbtest", "bbstaging"]
399
+ const migration = require("../migrations/usageQuotas")
247
400
  &nbsp;
248
401
  // currently only counting new writes and deletes
249
402
  const METHOD_MAP = {
@@ -253,13 +406,13 @@ const METHOD_MAP = {
253
406
  &nbsp;
254
407
  const DOMAIN_MAP = {
255
408
  rows: usageQuota.Properties.ROW,
256
- upload: usageQuota.Properties.UPLOAD,
257
- views: usageQuota.Properties.VIEW,
258
- users: usageQuota.Properties.USER,
409
+ // upload: usageQuota.Properties.UPLOAD, // doesn't work yet
410
+ // views: usageQuota.Properties.VIEW, // doesn't work yet
411
+ // users: usageQuota.Properties.USER, // doesn't work yet
259
412
  applications: usageQuota.Properties.APPS,
260
413
  // this will not be updated by endpoint calls
261
414
  // instead it will be updated by triggerInfo
262
- automationRuns: usageQuota.Properties.AUTOMATION,
415
+ // automationRuns: usageQuota.Properties.AUTOMATION, // doesn't work yet
263
416
  }
264
417
  &nbsp;
265
418
  function getProperty(url) {
@@ -271,10 +424,7 @@ function getProperty(url) {
271
424
  }
272
425
  &nbsp;
273
426
  module.exports = async (ctx, next) =&gt; {
274
- const tenantId = getTenantId()
275
- &nbsp;
276
- // if in development or a self hosted cloud usage quotas should not be executed
277
- if (env.isDev() || env.SELF_HOSTED || EXCLUDED_TENANTS.includes(tenantId)) {
427
+ if (!usageQuota.useQuotas()) {
278
428
  return next()
279
429
  }
280
430
  &nbsp;
@@ -307,20 +457,104 @@ module.exports = async (ctx, next) =&gt; {
307
457
  }
308
458
  &nbsp;
309
459
  // update usage for uploads to be the total size
310
- if (property === usageQuota.Properties.UPLOAD) {
460
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (property === usageQuota.Properties.UPLOAD) {
311
461
  const files =
312
- ctx.request.files.file.length &gt; 1
462
+ <span class="cstat-no" title="statement not covered" > ctx.request.files.file.length &gt; 1</span>
313
463
  ? Array.from(ctx.request.files.file)
314
- : <span class="branch-1 cbranch-no" title="branch not covered" >[ctx.request.files.file]</span>
315
- usage = files.map(file =&gt; file.size).reduce((total, size) =&gt; total + size)
464
+ : [ctx.request.files.file]
465
+ <span class="cstat-no" title="statement not covered" > usage = files.map(<span class="fstat-no" title="function not covered" >fi</span>le =&gt; <span class="cstat-no" title="statement not covered" >file.size)</span>.reduce(<span class="fstat-no" title="function not covered" >(t</span>otal, size) =&gt; <span class="cstat-no" title="statement not covered" >total + size)</span></span>
316
466
  }
317
467
  try {
318
- await usageQuota.update(property, usage)
319
- return next()
468
+ await migration.run()
469
+ await performRequest(ctx, next, property, usage)
320
470
  } catch (err) {
321
471
  <span class="cstat-no" title="statement not covered" > ctx.throw(400, err)</span>
322
472
  }
323
473
  }
474
+ &nbsp;
475
+ const performRequest = async (ctx, next, property, usage) =&gt; {
476
+ const usageContext = {
477
+ skipNext: false,
478
+ skipUsage: false,
479
+ [usageQuota.Properties.APPS]: {},
480
+ }
481
+ &nbsp;
482
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (usage === -1) {
483
+ <span class="cstat-no" title="statement not covered" > if (PRE_DELETE[property]) {</span>
484
+ <span class="cstat-no" title="statement not covered" > await PRE_DELETE[property](ctx, usageContext)</span>
485
+ }
486
+ } else {
487
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (PRE_CREATE[property]) {
488
+ <span class="cstat-no" title="statement not covered" > await PRE_CREATE[property](ctx, usageContext)</span>
489
+ }
490
+ }
491
+ &nbsp;
492
+ // run the request
493
+ if (!usageContext.skipNext) {
494
+ await usageQuota.update(property, usage, { dryRun: true })
495
+ await next()
496
+ }
497
+ &nbsp;
498
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (usage === -1) {
499
+ <span class="cstat-no" title="statement not covered" > if (POST_DELETE[property]) {</span>
500
+ <span class="cstat-no" title="statement not covered" > await POST_DELETE[property](ctx, usageContext)</span>
501
+ }
502
+ } else {
503
+ if (POST_CREATE[property]) {
504
+ await POST_CREATE[property](ctx, usageContext)
505
+ }
506
+ }
507
+ &nbsp;
508
+ // update the usage
509
+ if (!usageContext.skipUsage) {
510
+ await usageQuota.update(property, usage)
511
+ }
512
+ }
513
+ &nbsp;
514
+ const appPreDelete = <span class="fstat-no" title="function not covered" >as</span>ync (ctx, usageContext) =&gt; {
515
+ <span class="cstat-no" title="statement not covered" > if (ctx.query.unpublish) {</span>
516
+ // don't run usage decrement for unpublish
517
+ <span class="cstat-no" title="statement not covered" > usageContext.skipUsage = true</span>
518
+ <span class="cstat-no" title="statement not covered" > return</span>
519
+ }
520
+ &nbsp;
521
+ // store the row count to delete
522
+ const rows = <span class="cstat-no" title="statement not covered" >await getUniqueRows([ctx.appId])</span>
523
+ <span class="cstat-no" title="statement not covered" > if (rows.length) {</span>
524
+ <span class="cstat-no" title="statement not covered" > usageContext[usageQuota.Properties.APPS] = { rowCount: rows.length }</span>
525
+ }
526
+ }
527
+ &nbsp;
528
+ const appPostDelete = <span class="fstat-no" title="function not covered" >as</span>ync (ctx, usageContext) =&gt; {
529
+ // delete the app rows from usage
530
+ const rowCount = <span class="cstat-no" title="statement not covered" >usageContext[usageQuota.Properties.APPS].rowCount</span>
531
+ <span class="cstat-no" title="statement not covered" > if (rowCount) {</span>
532
+ <span class="cstat-no" title="statement not covered" > await usageQuota.update(usageQuota.Properties.ROW, -rowCount)</span>
533
+ }
534
+ }
535
+ &nbsp;
536
+ const appPostCreate = async ctx =&gt; {
537
+ // app import &amp; template creation
538
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (ctx.request.body.useTemplate === "true") {
539
+ const rows = <span class="cstat-no" title="statement not covered" >await getUniqueRows([ctx.response.body.appId])</span>
540
+ const rowCount = <span class="cstat-no" title="statement not covered" >rows ? rows.length : 0</span>
541
+ <span class="cstat-no" title="statement not covered" > await usageQuota.update(usageQuota.Properties.ROW, rowCount)</span>
542
+ }
543
+ }
544
+ &nbsp;
545
+ const PRE_DELETE = {
546
+ [usageQuota.Properties.APPS]: appPreDelete,
547
+ }
548
+ &nbsp;
549
+ const POST_DELETE = {
550
+ [usageQuota.Properties.APPS]: appPostDelete,
551
+ }
552
+ &nbsp;
553
+ const PRE_CREATE = {}
554
+ &nbsp;
555
+ const POST_CREATE = {
556
+ [usageQuota.Properties.APPS]: appPostCreate,
557
+ }
324
558
  &nbsp;</pre></td></tr></table></pre>
325
559
 
326
560
  <div class='push'></div><!-- for sticky footer -->
@@ -328,7 +562,7 @@ module.exports = async (ctx, next) =&gt; {
328
562
  <div class='footer quiet pad2 space-top1 center small'>
329
563
  Code coverage generated by
330
564
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
331
- at Thu Jan 20 2022 19:58:26 GMT+0000 (Coordinated Universal Time)
565
+ at Mon Jan 31 2022 16:01:47 GMT+0000 (Coordinated Universal Time)
332
566
  </div>
333
567
  </div>
334
568
  <script src="../prettify.js"></script>
@@ -69,7 +69,7 @@
69
69
  <span class="cline-any cline-neutral">&nbsp;</span>
70
70
  <span class="cline-any cline-neutral">&nbsp;</span>
71
71
  <span class="cline-any cline-yes">29x</span>
72
- <span class="cline-any cline-yes">289x</span>
72
+ <span class="cline-any cline-yes">294x</span>
73
73
  <span class="cline-any cline-neutral">&nbsp;</span>
74
74
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const WEBHOOK_ENDPOINTS = new RegExp(
75
75
  ["webhooks/trigger", "webhooks/schema"].join("|")
@@ -85,7 +85,7 @@ exports.isWebhookEndpoint = ctx =&gt; {
85
85
  <div class='footer quiet pad2 space-top1 center small'>
86
86
  Code coverage generated by
87
87
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
88
- at Thu Jan 20 2022 19:58:26 GMT+0000 (Coordinated Universal Time)
88
+ at Mon Jan 31 2022 16:01:47 GMT+0000 (Coordinated Universal Time)
89
89
  </div>
90
90
  </div>
91
91
  <script src="../prettify.js"></script>
@@ -0,0 +1,141 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for migrations/usageQuotas</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> migrations/usageQuotas</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">100% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>40/40</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">62.5% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>5/8</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>5/5</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">100% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>39/39</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ </div>
58
+ <div class='status-line high'></div>
59
+ <div class="pad1">
60
+ <table class="coverage-summary">
61
+ <thead>
62
+ <tr>
63
+ <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
64
+ <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
65
+ <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
66
+ <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
67
+ <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
68
+ <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
69
+ <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
70
+ <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
71
+ <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
72
+ <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
73
+ </tr>
74
+ </thead>
75
+ <tbody><tr>
76
+ <td class="file high" data-value="index.js"><a href="index.js.html">index.js</a></td>
77
+ <td data-value="100" class="pic high">
78
+ <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
79
+ </td>
80
+ <td data-value="100" class="pct high">100%</td>
81
+ <td data-value="10" class="abs high">10/10</td>
82
+ <td data-value="100" class="pct high">100%</td>
83
+ <td data-value="2" class="abs high">2/2</td>
84
+ <td data-value="100" class="pct high">100%</td>
85
+ <td data-value="2" class="abs high">2/2</td>
86
+ <td data-value="100" class="pct high">100%</td>
87
+ <td data-value="10" class="abs high">10/10</td>
88
+ </tr>
89
+
90
+ <tr>
91
+ <td class="file high" data-value="syncApps.js"><a href="syncApps.js.html">syncApps.js</a></td>
92
+ <td data-value="100" class="pic high">
93
+ <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
94
+ </td>
95
+ <td data-value="100" class="pct high">100%</td>
96
+ <td data-value="13" class="abs high">13/13</td>
97
+ <td data-value="50" class="pct medium">50%</td>
98
+ <td data-value="2" class="abs medium">1/2</td>
99
+ <td data-value="100" class="pct high">100%</td>
100
+ <td data-value="1" class="abs high">1/1</td>
101
+ <td data-value="100" class="pct high">100%</td>
102
+ <td data-value="13" class="abs high">13/13</td>
103
+ </tr>
104
+
105
+ <tr>
106
+ <td class="file high" data-value="syncRows.js"><a href="syncRows.js.html">syncRows.js</a></td>
107
+ <td data-value="100" class="pic high">
108
+ <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
109
+ </td>
110
+ <td data-value="100" class="pct high">100%</td>
111
+ <td data-value="17" class="abs high">17/17</td>
112
+ <td data-value="50" class="pct medium">50%</td>
113
+ <td data-value="4" class="abs medium">2/4</td>
114
+ <td data-value="100" class="pct high">100%</td>
115
+ <td data-value="2" class="abs high">2/2</td>
116
+ <td data-value="100" class="pct high">100%</td>
117
+ <td data-value="16" class="abs high">16/16</td>
118
+ </tr>
119
+
120
+ </tbody>
121
+ </table>
122
+ </div>
123
+ <div class='push'></div><!-- for sticky footer -->
124
+ </div><!-- /wrapper -->
125
+ <div class='footer quiet pad2 space-top1 center small'>
126
+ Code coverage generated by
127
+ <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
128
+ at Mon Jan 31 2022 16:01:47 GMT+0000 (Coordinated Universal Time)
129
+ </div>
130
+ </div>
131
+ <script src="../../prettify.js"></script>
132
+ <script>
133
+ window.onload = function () {
134
+ prettyPrint();
135
+ };
136
+ </script>
137
+ <script src="../../sorter.js"></script>
138
+ <script src="../../block-navigation.js"></script>
139
+ </body>
140
+ </html>
141
+