@budibase/server 1.1.32 → 1.2.2

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 (204) hide show
  1. package/builder/assets/{index.192adf4c.css → index.4d57d3d4.css} +2 -2
  2. package/builder/assets/index.a0665669.js +977 -0
  3. package/builder/assets/{vendor.162098da.js → vendor.6bcafa60.js} +1 -1
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +381 -696
  6. package/coverage/coverage-final.json +13 -16
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/index.html +1 -1
  16. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/validation.js.html +4 -4
  23. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/index.html +18 -18
  27. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +94 -49
  29. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/webhook.js.html +15 -15
  45. package/coverage/lcov-report/api/index.html +1 -1
  46. package/coverage/lcov-report/api/index.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/index.html +1 -1
  58. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +2 -2
  73. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  75. package/coverage/lcov-report/automations/actions.js.html +1 -1
  76. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  77. package/coverage/lcov-report/automations/bullboard.js.html +17 -17
  78. package/coverage/lcov-report/automations/index.html +1 -1
  79. package/coverage/lcov-report/automations/index.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/executeQuery.js.html +5 -2
  84. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/index.html +1 -1
  87. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggers.js.html +18 -18
  106. package/coverage/lcov-report/constants/index.html +1 -1
  107. package/coverage/lcov-report/constants/index.js.html +5 -14
  108. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  109. package/coverage/lcov-report/constants/screens.js.html +1 -1
  110. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  111. package/coverage/lcov-report/db/index.html +19 -19
  112. package/coverage/lcov-report/db/index.js.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  117. package/coverage/lcov-report/db/newid.js.html +1 -1
  118. package/coverage/lcov-report/db/utils.js.html +61 -13
  119. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  120. package/coverage/lcov-report/events/index.html +1 -1
  121. package/coverage/lcov-report/events/index.js.html +1 -1
  122. package/coverage/lcov-report/events/utils.js.html +1 -1
  123. package/coverage/lcov-report/index.html +57 -72
  124. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  125. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  126. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  127. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  128. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  129. package/coverage/lcov-report/middleware/index.html +21 -21
  130. package/coverage/lcov-report/middleware/joi-validator.js.html +43 -43
  131. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  132. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  133. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  134. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  135. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  136. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  137. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  138. package/coverage/lcov-report/utilities/global.js.html +68 -14
  139. package/coverage/lcov-report/utilities/index.html +19 -19
  140. package/coverage/lcov-report/utilities/index.js.html +1 -1
  141. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +26 -14
  142. package/coverage/lcov-report/utilities/queue/index.html +17 -17
  143. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  144. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  146. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  148. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  149. package/coverage/lcov-report/utilities/security.js.html +2 -2
  150. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  151. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  152. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  153. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  154. package/coverage/lcov-report/utilities/users.js.html +1 -1
  155. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  156. package/coverage/lcov.info +695 -1214
  157. package/dist/api/controllers/deploy/index.js +1 -0
  158. package/dist/api/controllers/query/index.js +1 -1
  159. package/dist/api/controllers/query/validation.js +3 -3
  160. package/dist/api/controllers/row/internalSearch.js +30 -16
  161. package/dist/api/routes/utils/validators.js +1 -1
  162. package/dist/automations/utils.js +47 -1
  163. package/dist/constants/index.js +1 -4
  164. package/dist/db/utils.js +14 -1
  165. package/dist/definitions/automations.js +8 -0
  166. package/dist/integrations/base/sql.js +43 -14
  167. package/dist/package.json +8 -8
  168. package/dist/threads/automation.js +147 -54
  169. package/dist/threads/definitions.js +2 -0
  170. package/dist/threads/index.js +27 -20
  171. package/dist/threads/query.js +23 -15
  172. package/dist/threads/utils.js +47 -24
  173. package/dist/tsconfig.build.tsbuildinfo +1 -1
  174. package/dist/utilities/global.js +24 -5
  175. package/dist/utilities/queue/inMemoryQueue.js +5 -0
  176. package/package.json +9 -9
  177. package/src/api/controllers/deploy/index.ts +6 -1
  178. package/src/api/controllers/query/index.ts +1 -1
  179. package/src/api/controllers/query/validation.js +3 -3
  180. package/src/api/controllers/row/internalSearch.js +35 -20
  181. package/src/api/routes/tests/user.spec.js +2 -0
  182. package/src/api/routes/utils/validators.js +1 -1
  183. package/src/automations/steps/executeQuery.js +1 -0
  184. package/src/automations/tests/automation.spec.js +2 -2
  185. package/src/automations/utils.ts +54 -1
  186. package/src/constants/index.js +2 -5
  187. package/src/db/utils.js +16 -0
  188. package/src/definitions/automations.ts +49 -0
  189. package/src/definitions/datasource.ts +3 -0
  190. package/src/integrations/base/sql.ts +44 -13
  191. package/src/integrations/tests/sql.spec.js +50 -4
  192. package/src/middleware/tests/currentapp.spec.js +11 -0
  193. package/src/threads/{automation.js → automation.ts} +172 -48
  194. package/src/threads/definitions.ts +18 -0
  195. package/src/threads/index.ts +31 -23
  196. package/src/threads/{query.js → query.ts} +32 -12
  197. package/src/threads/{utils.js → utils.ts} +31 -12
  198. package/src/utilities/global.js +21 -3
  199. package/src/utilities/queue/inMemoryQueue.js +4 -0
  200. package/builder/assets/index.133db51f.js +0 -978
  201. package/coverage/lcov-report/threads/automation.js.html +0 -1114
  202. package/coverage/lcov-report/threads/index.html +0 -146
  203. package/coverage/lcov-report/threads/query.js.html +0 -916
  204. package/coverage/lcov-report/threads/utils.js.html +0 -319
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">84.21% </span>
26
+ <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>16/19</span>
28
+ <span class='fraction'>0/19</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">62.5% </span>
33
+ <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>5/8</span>
35
+ <span class='fraction'>0/8</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">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>4/4</span>
42
+ <span class='fraction'>0/4</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">84.21% </span>
47
+ <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>16/19</span>
49
+ <span class='fraction'>0/19</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line high'></div>
64
+ <div class='status-line low'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -99,77 +99,77 @@
99
99
  <a name='L34'></a><a href='#L34'>34</a>
100
100
  <a name='L35'></a><a href='#L35'>35</a>
101
101
  <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">44x</span>
102
+ <a name='L37'></a><a href='#L37'>37</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
103
103
  <span class="cline-any cline-neutral">&nbsp;</span>
104
104
  <span class="cline-any cline-neutral">&nbsp;</span>
105
105
  <span class="cline-any cline-neutral">&nbsp;</span>
106
- <span class="cline-any cline-yes">594x</span>
107
- <span class="cline-any cline-yes">52x</span>
106
+ <span class="cline-any cline-no">&nbsp;</span>
107
+ <span class="cline-any cline-no">&nbsp;</span>
108
108
  <span class="cline-any cline-no">&nbsp;</span>
109
109
  <span class="cline-any cline-neutral">&nbsp;</span>
110
- <span class="cline-any cline-yes">52x</span>
111
- <span class="cline-any cline-yes">52x</span>
112
- <span class="cline-any cline-yes">1x</span>
113
- <span class="cline-any cline-yes">51x</span>
114
- <span class="cline-any cline-yes">51x</span>
110
+ <span class="cline-any cline-no">&nbsp;</span>
111
+ <span class="cline-any cline-no">&nbsp;</span>
112
+ <span class="cline-any cline-no">&nbsp;</span>
113
+ <span class="cline-any cline-no">&nbsp;</span>
114
+ <span class="cline-any cline-no">&nbsp;</span>
115
115
  <span class="cline-any cline-neutral">&nbsp;</span>
116
116
  <span class="cline-any cline-neutral">&nbsp;</span>
117
- <span class="cline-any cline-yes">52x</span>
117
+ <span class="cline-any cline-no">&nbsp;</span>
118
118
  <span class="cline-any cline-neutral">&nbsp;</span>
119
119
  <span class="cline-any cline-neutral">&nbsp;</span>
120
120
  <span class="cline-any cline-neutral">&nbsp;</span>
121
121
  <span class="cline-any cline-neutral">&nbsp;</span>
122
- <span class="cline-any cline-yes">52x</span>
123
- <span class="cline-any cline-yes">52x</span>
122
+ <span class="cline-any cline-no">&nbsp;</span>
123
+ <span class="cline-any cline-no">&nbsp;</span>
124
124
  <span class="cline-any cline-no">&nbsp;</span>
125
125
  <span class="cline-any cline-no">&nbsp;</span>
126
126
  <span class="cline-any cline-neutral">&nbsp;</span>
127
- <span class="cline-any cline-yes">52x</span>
127
+ <span class="cline-any cline-no">&nbsp;</span>
128
128
  <span class="cline-any cline-neutral">&nbsp;</span>
129
129
  <span class="cline-any cline-neutral">&nbsp;</span>
130
130
  <span class="cline-any cline-neutral">&nbsp;</span>
131
- <span class="cline-any cline-yes">44x</span>
132
- <span class="cline-any cline-yes">540x</span>
131
+ <span class="cline-any cline-no">&nbsp;</span>
132
+ <span class="cline-any cline-no">&nbsp;</span>
133
133
  <span class="cline-any cline-neutral">&nbsp;</span>
134
134
  <span class="cline-any cline-neutral">&nbsp;</span>
135
- <span class="cline-any cline-yes">44x</span>
136
- <span class="cline-any cline-yes">54x</span>
135
+ <span class="cline-any cline-no">&nbsp;</span>
136
+ <span class="cline-any cline-no">&nbsp;</span>
137
137
  <span class="cline-any cline-neutral">&nbsp;</span>
138
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const Joi = require("joi")
138
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const Joi = <span class="cstat-no" title="statement not covered" >require("joi")</span>
139
139
  &nbsp;
140
- function validate(schema, property) {
140
+ function <span class="fstat-no" title="function not covered" >validate(</span>schema, property) {
141
141
  // Return a Koa middleware function
142
- return (ctx, next) =&gt; {
143
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!schema) {
142
+ <span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >(c</span>tx, next) =&gt; {</span>
143
+ <span class="cstat-no" title="statement not covered" > if (!schema) {</span>
144
144
  <span class="cstat-no" title="statement not covered" > return next()</span>
145
145
  }
146
- let params = null
147
- if (ctx[property] != null) {
148
- params = ctx[property]
149
- } else <span class="missing-if-branch" title="else path not taken" >E</span>if (ctx.request[property] != null) {
150
- params = ctx.request[property]
146
+ let params = <span class="cstat-no" title="statement not covered" >null</span>
147
+ <span class="cstat-no" title="statement not covered" > if (ctx[property] != null) {</span>
148
+ <span class="cstat-no" title="statement not covered" > params = ctx[property]</span>
149
+ } else <span class="cstat-no" title="statement not covered" >if (ctx.request[property] != null) {</span>
150
+ <span class="cstat-no" title="statement not covered" > params = ctx.request[property]</span>
151
151
  }
152
152
  &nbsp;
153
- schema = schema.append({
153
+ <span class="cstat-no" title="statement not covered" > schema = schema.append({</span>
154
154
  createdAt: Joi.any().optional(),
155
155
  updatedAt: Joi.any().optional(),
156
156
  })
157
157
  &nbsp;
158
- const { error } = schema.validate(params)
159
- <span class="missing-if-branch" title="if path not taken" >I</span>if (error) {
158
+ const { error } = <span class="cstat-no" title="statement not covered" >schema.validate(params)</span>
159
+ <span class="cstat-no" title="statement not covered" > if (error) {</span>
160
160
  <span class="cstat-no" title="statement not covered" > ctx.throw(400, `Invalid ${property} - ${error.message}`)</span>
161
161
  <span class="cstat-no" title="statement not covered" > return</span>
162
162
  }
163
- return next()
163
+ <span class="cstat-no" title="statement not covered" > return next()</span>
164
164
  }
165
165
  }
166
166
  &nbsp;
167
- module.exports.body = schema =&gt; {
168
- return validate(schema, "body")
167
+ <span class="cstat-no" title="statement not covered" >module.exports.body = <span class="fstat-no" title="function not covered" >sc</span>hema =&gt; {</span>
168
+ <span class="cstat-no" title="statement not covered" > return validate(schema, "body")</span>
169
169
  }
170
170
  &nbsp;
171
- module.exports.params = schema =&gt; {
172
- return validate(schema, "params")
171
+ <span class="cstat-no" title="statement not covered" >module.exports.params = <span class="fstat-no" title="function not covered" >sc</span>hema =&gt; {</span>
172
+ <span class="cstat-no" title="statement not covered" > return validate(schema, "params")</span>
173
173
  }
174
174
  &nbsp;</pre></td></tr></table></pre>
175
175
 
@@ -178,7 +178,7 @@ module.exports.params = schema =&gt; {
178
178
  <div class='footer quiet pad2 space-top1 center small'>
179
179
  Code coverage generated by
180
180
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
181
- at Mon Aug 01 2022 15:42:56 GMT+0000 (Coordinated Universal Time)
181
+ at Tue Aug 02 2022 09:44:51 GMT+0000 (Coordinated Universal Time)
182
182
  </div>
183
183
  <script src="../prettify.js"></script>
184
184
  <script>
@@ -133,7 +133,7 @@ module.exports = function ({ requiresAppId } = <span class="branch-0 cbranch-no"
133
133
  <div class='footer quiet pad2 space-top1 center small'>
134
134
  Code coverage generated by
135
135
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
136
- at Mon Aug 01 2022 15:42:56 GMT+0000 (Coordinated Universal Time)
136
+ at Tue Aug 02 2022 09:44:51 GMT+0000 (Coordinated Universal Time)
137
137
  </div>
138
138
  <script src="../prettify.js"></script>
139
139
  <script>
@@ -253,7 +253,7 @@ module.exports.bodySubResource = (main, sub) =&gt; {
253
253
  <div class='footer quiet pad2 space-top1 center small'>
254
254
  Code coverage generated by
255
255
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
256
- at Mon Aug 01 2022 15:42:56 GMT+0000 (Coordinated Universal Time)
256
+ at Tue Aug 02 2022 09:44:51 GMT+0000 (Coordinated Universal Time)
257
257
  </div>
258
258
  <script src="../prettify.js"></script>
259
259
  <script>
@@ -100,7 +100,7 @@ module.exports = async (ctx, next) =&gt; {
100
100
  <div class='footer quiet pad2 space-top1 center small'>
101
101
  Code coverage generated by
102
102
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
103
- at Mon Aug 01 2022 15:42:56 GMT+0000 (Coordinated Universal Time)
103
+ at Tue Aug 02 2022 09:44:51 GMT+0000 (Coordinated Universal Time)
104
104
  </div>
105
105
  <script src="../prettify.js"></script>
106
106
  <script>
@@ -91,7 +91,7 @@ exports.isWebhookEndpoint = ctx =&gt; {
91
91
  <div class='footer quiet pad2 space-top1 center small'>
92
92
  Code coverage generated by
93
93
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
94
- at Mon Aug 01 2022 15:42:56 GMT+0000 (Coordinated Universal Time)
94
+ at Tue Aug 02 2022 09:44:51 GMT+0000 (Coordinated Universal Time)
95
95
  </div>
96
96
  <script src="../prettify.js"></script>
97
97
  <script>
@@ -79,7 +79,7 @@ module.exports.budibaseTempDir = budibaseTempDir
79
79
  <div class='footer quiet pad2 space-top1 center small'>
80
80
  Code coverage generated by
81
81
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
82
- at Mon Aug 01 2022 15:42:56 GMT+0000 (Coordinated Universal Time)
82
+ at Tue Aug 02 2022 09:44:51 GMT+0000 (Coordinated Universal Time)
83
83
  </div>
84
84
  <script src="../prettify.js"></script>
85
85
  <script>
@@ -136,7 +136,7 @@ exports.resolve = function (...args) {
136
136
  <div class='footer quiet pad2 space-top1 center small'>
137
137
  Code coverage generated by
138
138
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
139
- at Mon Aug 01 2022 15:42:56 GMT+0000 (Coordinated Universal Time)
139
+ at Tue Aug 02 2022 09:44:51 GMT+0000 (Coordinated Universal Time)
140
140
  </div>
141
141
  <script src="../prettify.js"></script>
142
142
  <script>
@@ -502,7 +502,7 @@ module.exports = {
502
502
  <div class='footer quiet pad2 space-top1 center small'>
503
503
  Code coverage generated by
504
504
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
505
- at Mon Aug 01 2022 15:42:56 GMT+0000 (Coordinated Universal Time)
505
+ at Tue Aug 02 2022 09:44:51 GMT+0000 (Coordinated Universal Time)
506
506
  </div>
507
507
  <script src="../prettify.js"></script>
508
508
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">83.6% </span>
26
+ <span class="strong">78.57% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>51/61</span>
28
+ <span class='fraction'>55/70</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">78.57% </span>
33
+ <span class="strong">75.67% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>22/28</span>
35
+ <span class='fraction'>28/37</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">73.33% </span>
40
+ <span class="strong">68.75% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>11/15</span>
42
+ <span class='fraction'>11/16</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">84.74% </span>
47
+ <span class="strong">79.41% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>50/59</span>
49
+ <span class='fraction'>54/68</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line high'></div>
64
+ <div class='status-line medium'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -170,7 +170,25 @@
170
170
  <a name='L105'></a><a href='#L105'>105</a>
171
171
  <a name='L106'></a><a href='#L106'>106</a>
172
172
  <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
174
192
  <span class="cline-any cline-neutral">&nbsp;</span>
175
193
  <span class="cline-any cline-neutral">&nbsp;</span>
176
194
  <span class="cline-any cline-yes">49x</span>
@@ -184,9 +202,11 @@
184
202
  <span class="cline-any cline-yes">49x</span>
185
203
  <span class="cline-any cline-yes">49x</span>
186
204
  <span class="cline-any cline-yes">49x</span>
205
+ <span class="cline-any cline-yes">49x</span>
187
206
  <span class="cline-any cline-neutral">&nbsp;</span>
188
207
  <span class="cline-any cline-yes">49x</span>
189
208
  <span class="cline-any cline-yes">238x</span>
209
+ <span class="cline-any cline-neutral">&nbsp;</span>
190
210
  <span class="cline-any cline-yes">238x</span>
191
211
  <span class="cline-any cline-yes">3x</span>
192
212
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -204,14 +224,29 @@
204
224
  <span class="cline-any cline-yes">203x</span>
205
225
  <span class="cline-any cline-yes">32x</span>
206
226
  <span class="cline-any cline-yes">27x</span>
227
+ <span class="cline-any cline-yes">5x</span>
228
+ <span class="cline-any cline-no">&nbsp;</span>
229
+ <span class="cline-any cline-neutral">&nbsp;</span>
207
230
  <span class="cline-any cline-neutral">&nbsp;</span>
208
231
  <span class="cline-any cline-yes">235x</span>
209
232
  <span class="cline-any cline-yes">235x</span>
210
233
  <span class="cline-any cline-neutral">&nbsp;</span>
211
234
  <span class="cline-any cline-neutral">&nbsp;</span>
212
235
  <span class="cline-any cline-neutral">&nbsp;</span>
236
+ <span class="cline-any cline-no">&nbsp;</span>
237
+ <span class="cline-any cline-no">&nbsp;</span>
238
+ <span class="cline-any cline-neutral">&nbsp;</span>
239
+ <span class="cline-any cline-no">&nbsp;</span>
240
+ <span class="cline-any cline-neutral">&nbsp;</span>
241
+ <span class="cline-any cline-neutral">&nbsp;</span>
242
+ <span class="cline-any cline-neutral">&nbsp;</span>
243
+ <span class="cline-any cline-yes">231x</span>
244
+ <span class="cline-any cline-yes">231x</span>
245
+ <span class="cline-any cline-neutral">&nbsp;</span>
213
246
  <span class="cline-any cline-yes">231x</span>
214
247
  <span class="cline-any cline-yes">231x</span>
248
+ <span class="cline-any cline-no">&nbsp;</span>
249
+ <span class="cline-any cline-neutral">&nbsp;</span>
215
250
  <span class="cline-any cline-neutral">&nbsp;</span>
216
251
  <span class="cline-any cline-yes">231x</span>
217
252
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -261,6 +296,7 @@
261
296
  <span class="cline-any cline-yes">32x</span>
262
297
  <span class="cline-any cline-no">&nbsp;</span>
263
298
  <span class="cline-any cline-neutral">&nbsp;</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
264
300
  <span class="cline-any cline-yes">32x</span>
265
301
  <span class="cline-any cline-neutral">&nbsp;</span>
266
302
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -291,9 +327,11 @@ const {
291
327
  } = require("@budibase/backend-core/tenancy")
292
328
  const env = require("../environment")
293
329
  const { getAppId } = require("@budibase/backend-core/context")
330
+ const { groups } = require("@budibase/pro")
294
331
  &nbsp;
295
332
  exports.updateAppRole = (user, { appId } = {}) =&gt; {
296
333
  appId = appId || getAppId()
334
+ &nbsp;
297
335
  if (!user || !user.roles) {
298
336
  return user
299
337
  }
@@ -309,18 +347,33 @@ exports.updateAppRole = (user, { appId } = {}) =&gt; {
309
347
  // if a role wasn't found then either set as admin (builder) or public (everyone else)
310
348
  if (!user.roleId &amp;&amp; user.builder &amp;&amp; user.builder.global) {
311
349
  user.roleId = BUILTIN_ROLE_IDS.ADMIN
312
- } else if (!user.roleId) {
350
+ } else if (!user.roleId &amp;&amp; !user?.userGroups?.length) {
313
351
  user.roleId = BUILTIN_ROLE_IDS.PUBLIC
352
+ } else <span class="missing-if-branch" title="if path not taken" >I</span>if (user?.userGroups?.length) {
353
+ <span class="cstat-no" title="statement not covered" > user.roleId = null</span>
314
354
  }
355
+ &nbsp;
315
356
  delete user.roles
316
357
  return user
317
358
  }
318
359
  &nbsp;
319
- function processUser(user, { appId } = {}) {
360
+ async function <span class="fstat-no" title="function not covered" >checkGroupRoles(</span>user, { appId } = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
361
+ let roleId = <span class="cstat-no" title="statement not covered" >await groups.getGroupRoleId(user, appId)</span>
362
+ <span class="cstat-no" title="statement not covered" > user.roleId = roleId</span>
363
+ &nbsp;
364
+ <span class="cstat-no" title="statement not covered" > return user</span>
365
+ }
366
+ &nbsp;
367
+ async function processUser(user, { appId } = {}) {
320
368
  <span class="missing-if-branch" title="else path not taken" >E</span>if (user) {
321
369
  delete user.password
322
370
  }
323
- return exports.updateAppRole(user, { appId })
371
+ user = await exports.updateAppRole(user, { appId })
372
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!user.roleId &amp;&amp; user?.userGroups?.length) {
373
+ <span class="cstat-no" title="statement not covered" > user = await checkGroupRoles(user, { appId })</span>
374
+ }
375
+ &nbsp;
376
+ return user
324
377
  }
325
378
  &nbsp;
326
379
  exports.getCachedSelf = async (ctx, appId) =&gt; {
@@ -368,6 +421,7 @@ exports.getGlobalUsers = async (users = null) =&gt; {
368
421
  <span class="missing-if-branch" title="if path not taken" >I</span>if (!appId) {
369
422
  <span class="cstat-no" title="statement not covered" > return globalUsers</span>
370
423
  }
424
+ &nbsp;
371
425
  return globalUsers.map(user =&gt; exports.updateAppRole(user))
372
426
  }
373
427
  &nbsp;
@@ -391,7 +445,7 @@ exports.getGlobalUsersFromMetadata = async users =&gt; {
391
445
  <div class='footer quiet pad2 space-top1 center small'>
392
446
  Code coverage generated by
393
447
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
394
- at Mon Aug 01 2022 15:42:56 GMT+0000 (Coordinated Universal Time)
448
+ at Tue Aug 02 2022 09:44:51 GMT+0000 (Coordinated Universal Time)
395
449
  </div>
396
450
  <script src="../prettify.js"></script>
397
451
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">73.63% </span>
26
+ <span class="strong">72.9% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>257/349</span>
28
+ <span class='fraction'>261/358</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">60.28% </span>
33
+ <span class="strong">60.66% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>85/141</span>
35
+ <span class='fraction'>91/150</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">71.64% </span>
40
+ <span class="strong">70.58% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>48/67</span>
42
+ <span class='fraction'>48/68</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">73.39% </span>
47
+ <span class="strong">72.64% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>251/342</span>
49
+ <span class='fraction'>255/351</span>
50
50
  </div>
51
51
 
52
52
 
@@ -124,18 +124,18 @@
124
124
  </tr>
125
125
 
126
126
  <tr>
127
- <td class="file high" data-value="global.js"><a href="global.js.html">global.js</a></td>
128
- <td data-value="83.6" class="pic high">
129
- <div class="chart"><div class="cover-fill" style="width: 83%"></div><div class="cover-empty" style="width: 17%"></div></div>
127
+ <td class="file medium" data-value="global.js"><a href="global.js.html">global.js</a></td>
128
+ <td data-value="78.57" class="pic medium">
129
+ <div class="chart"><div class="cover-fill" style="width: 78%"></div><div class="cover-empty" style="width: 22%"></div></div>
130
130
  </td>
131
- <td data-value="83.6" class="pct high">83.6%</td>
132
- <td data-value="61" class="abs high">51/61</td>
133
131
  <td data-value="78.57" class="pct medium">78.57%</td>
134
- <td data-value="28" class="abs medium">22/28</td>
135
- <td data-value="73.33" class="pct medium">73.33%</td>
136
- <td data-value="15" class="abs medium">11/15</td>
137
- <td data-value="84.74" class="pct high">84.74%</td>
138
- <td data-value="59" class="abs high">50/59</td>
132
+ <td data-value="70" class="abs medium">55/70</td>
133
+ <td data-value="75.67" class="pct medium">75.67%</td>
134
+ <td data-value="37" class="abs medium">28/37</td>
135
+ <td data-value="68.75" class="pct medium">68.75%</td>
136
+ <td data-value="16" class="abs medium">11/16</td>
137
+ <td data-value="79.41" class="pct medium">79.41%</td>
138
+ <td data-value="68" class="abs medium">54/68</td>
139
139
  </tr>
140
140
 
141
141
  <tr>
@@ -236,7 +236,7 @@
236
236
  <div class='footer quiet pad2 space-top1 center small'>
237
237
  Code coverage generated by
238
238
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
239
- at Mon Aug 01 2022 15:42:56 GMT+0000 (Coordinated Universal Time)
239
+ at Tue Aug 02 2022 09:44:51 GMT+0000 (Coordinated Universal Time)
240
240
  </div>
241
241
  <script src="../prettify.js"></script>
242
242
  <script>
@@ -562,7 +562,7 @@ exports.convertBookmark = bookmark =&gt; {
562
562
  <div class='footer quiet pad2 space-top1 center small'>
563
563
  Code coverage generated by
564
564
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
565
- at Mon Aug 01 2022 15:42:56 GMT+0000 (Coordinated Universal Time)
565
+ at Tue Aug 02 2022 09:44:51 GMT+0000 (Coordinated Universal Time)
566
566
  </div>
567
567
  <script src="../prettify.js"></script>
568
568
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">81.81% </span>
26
+ <span class="strong">78.26% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>18/22</span>
28
+ <span class='fraction'>18/23</span>
29
29
  </div>
30
30
 
31
31
 
@@ -37,16 +37,16 @@
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">60% </span>
40
+ <span class="strong">54.54% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>6/10</span>
42
+ <span class='fraction'>6/11</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">81.81% </span>
47
+ <span class="strong">78.26% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>18/22</span>
49
+ <span class='fraction'>18/23</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line high'></div>
64
+ <div class='status-line medium'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -177,7 +177,11 @@
177
177
  <a name='L112'></a><a href='#L112'>112</a>
178
178
  <a name='L113'></a><a href='#L113'>113</a>
179
179
  <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">43x</span>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">44x</span>
181
185
  <span class="cline-any cline-neutral">&nbsp;</span>
182
186
  <span class="cline-any cline-neutral">&nbsp;</span>
183
187
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -209,10 +213,10 @@
209
213
  <span class="cline-any cline-neutral">&nbsp;</span>
210
214
  <span class="cline-any cline-neutral">&nbsp;</span>
211
215
  <span class="cline-any cline-neutral">&nbsp;</span>
212
- <span class="cline-any cline-yes">43x</span>
213
- <span class="cline-any cline-yes">43x</span>
214
- <span class="cline-any cline-yes">43x</span>
215
- <span class="cline-any cline-yes">43x</span>
216
+ <span class="cline-any cline-yes">44x</span>
217
+ <span class="cline-any cline-yes">44x</span>
218
+ <span class="cline-any cline-yes">44x</span>
219
+ <span class="cline-any cline-yes">44x</span>
216
220
  <span class="cline-any cline-neutral">&nbsp;</span>
217
221
  <span class="cline-any cline-neutral">&nbsp;</span>
218
222
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -290,7 +294,11 @@
290
294
  <span class="cline-any cline-neutral">&nbsp;</span>
291
295
  <span class="cline-any cline-neutral">&nbsp;</span>
292
296
  <span class="cline-any cline-neutral">&nbsp;</span>
293
- <span class="cline-any cline-yes">43x</span>
297
+ <span class="cline-any cline-no">&nbsp;</span>
298
+ <span class="cline-any cline-neutral">&nbsp;</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-neutral">&nbsp;</span>
301
+ <span class="cline-any cline-yes">44x</span>
294
302
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">let events = require("events")
295
303
  &nbsp;
296
304
  /**
@@ -402,6 +410,10 @@ class InMemoryQueue {
402
410
  <span class="fstat-no" title="function not covered" > as</span>ync clean() {
403
411
  <span class="cstat-no" title="statement not covered" > return []</span>
404
412
  }
413
+ &nbsp;
414
+ <span class="fstat-no" title="function not covered" > as</span>ync getJob() {
415
+ <span class="cstat-no" title="statement not covered" > return {}</span>
416
+ }
405
417
  }
406
418
  &nbsp;
407
419
  module.exports = InMemoryQueue
@@ -412,7 +424,7 @@ module.exports = InMemoryQueue
412
424
  <div class='footer quiet pad2 space-top1 center small'>
413
425
  Code coverage generated by
414
426
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
415
- at Mon Aug 01 2022 15:42:56 GMT+0000 (Coordinated Universal Time)
427
+ at Tue Aug 02 2022 09:44:51 GMT+0000 (Coordinated Universal Time)
416
428
  </div>
417
429
  <script src="../../prettify.js"></script>
418
430
  <script>