@budibase/server 0.9.167-alpha.0 → 0.9.167-alpha.12

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 (197) hide show
  1. package/builder/assets/{index.32c8bc7d.js → index.bb938864.js} +34 -34
  2. package/builder/assets/{index.18ad7651.css → index.bcacf476.css} +2 -2
  3. package/builder/assets/{vendor.60887453.js → vendor.a3855e3d.js} +1 -1
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +416 -369
  6. package/coverage/coverage-final.json +17 -16
  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 +1 -1
  10. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  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 +1 -1
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/dev.js.html +41 -17
  17. package/coverage/lcov-report/api/controllers/hosting.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/index.html +43 -43
  19. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query.js.html +129 -24
  24. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/script.js.html +12 -57
  34. package/coverage/lcov-report/api/controllers/table/index.html +20 -20
  35. package/coverage/lcov-report/api/controllers/table/index.js.html +17 -8
  36. package/coverage/lcov-report/api/controllers/table/utils.js.html +8 -38
  37. package/coverage/lcov-report/api/controllers/templates.js.html +49 -13
  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 +1 -1
  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/application.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/dev.js.html +26 -11
  58. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/index.html +9 -9
  60. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/query.js.html +9 -3
  66. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  77. package/coverage/lcov-report/automations/actions.js.html +31 -10
  78. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  79. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  80. package/coverage/lcov-report/automations/index.html +19 -19
  81. package/coverage/lcov-report/automations/index.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/index.html +1 -1
  91. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  100. package/coverage/lcov-report/automations/thread.js.html +54 -12
  101. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  110. package/coverage/lcov-report/automations/utils.js.html +1 -1
  111. package/coverage/lcov-report/constants/index.html +1 -1
  112. package/coverage/lcov-report/constants/index.js.html +5 -2
  113. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  114. package/coverage/lcov-report/constants/screens.js.html +1 -1
  115. package/coverage/lcov-report/db/client.js.html +1 -1
  116. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  117. package/coverage/lcov-report/db/index.html +1 -1
  118. package/coverage/lcov-report/db/index.js.html +1 -1
  119. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +12 -12
  120. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  121. package/coverage/lcov-report/db/linkedRows/index.js.html +9 -9
  122. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  123. package/coverage/lcov-report/db/newid.js.html +1 -1
  124. package/coverage/lcov-report/db/utils.js.html +1 -1
  125. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  126. package/coverage/lcov-report/events/index.html +1 -1
  127. package/coverage/lcov-report/events/index.js.html +1 -1
  128. package/coverage/lcov-report/events/utils.js.html +1 -1
  129. package/coverage/lcov-report/index.html +53 -53
  130. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  131. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  132. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  133. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  134. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  135. package/coverage/lcov-report/middleware/currentapp.js.html +2 -2
  136. package/coverage/lcov-report/middleware/index.html +1 -1
  137. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  138. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  139. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  140. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  141. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  142. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  143. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  144. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  145. package/coverage/lcov-report/utilities/global.js.html +2 -2
  146. package/coverage/lcov-report/utilities/index.html +22 -7
  147. package/coverage/lcov-report/utilities/index.js.html +1 -1
  148. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  149. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  150. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  151. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  152. package/coverage/lcov-report/utilities/rowProcessor/index.html +14 -14
  153. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +38 -8
  154. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  155. package/coverage/lcov-report/utilities/scriptRunner.js.html +143 -0
  156. package/coverage/lcov-report/utilities/security.js.html +1 -1
  157. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  158. package/coverage/lcov-report/utilities/users.js.html +1 -1
  159. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  160. package/coverage/lcov.info +700 -608
  161. package/dist/api/controllers/dev.js +17 -11
  162. package/dist/api/controllers/query.js +26 -8
  163. package/dist/api/controllers/script.js +4 -16
  164. package/dist/api/controllers/table/index.js +3 -0
  165. package/dist/api/controllers/table/utils.js +2 -10
  166. package/dist/api/controllers/templates.js +18 -3
  167. package/dist/api/routes/dev.js +8 -4
  168. package/dist/api/routes/query.js +3 -1
  169. package/dist/automations/actions.js +9 -3
  170. package/dist/automations/thread.js +14 -3
  171. package/dist/constants/index.js +1 -0
  172. package/dist/integrations/base/sql.js +4 -4
  173. package/dist/middleware/currentapp.js +1 -1
  174. package/dist/package.json +5 -4
  175. package/dist/tsconfig.tsbuildinfo +1 -1
  176. package/dist/utilities/global.js +1 -1
  177. package/dist/utilities/rowProcessor/index.js +8 -0
  178. package/dist/utilities/scriptRunner.js +19 -0
  179. package/package.json +6 -5
  180. package/src/api/controllers/dev.js +16 -8
  181. package/src/api/controllers/query.js +46 -11
  182. package/src/api/controllers/script.js +4 -19
  183. package/src/api/controllers/table/index.js +3 -0
  184. package/src/api/controllers/table/utils.js +2 -12
  185. package/src/api/controllers/templates.js +17 -5
  186. package/src/api/routes/dev.js +9 -4
  187. package/src/api/routes/query.js +3 -1
  188. package/src/automations/actions.js +10 -3
  189. package/src/automations/thread.js +17 -3
  190. package/src/constants/index.js +1 -0
  191. package/src/integrations/base/sql.ts +5 -3
  192. package/src/integrations/tests/mongo.spec.js +10 -6
  193. package/src/middleware/currentapp.js +1 -1
  194. package/src/middleware/tests/currentapp.spec.js +3 -3
  195. package/src/utilities/global.js +1 -1
  196. package/src/utilities/rowProcessor/index.js +10 -0
  197. package/src/utilities/scriptRunner.js +21 -0
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">79.55% </span>
26
+ <span class="strong">77.78% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>70/88</span>
28
+ <span class='fraction'>77/99</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">54.05% </span>
33
+ <span class="strong">53.66% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>20/37</span>
35
+ <span class='fraction'>22/41</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">92.31% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>10/10</span>
42
+ <span class='fraction'>12/13</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">79.31% </span>
47
+ <span class="strong">78.13% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>69/87</span>
49
+ <span class='fraction'>75/96</span>
50
50
  </div>
51
51
 
52
52
 
@@ -233,7 +233,43 @@
233
233
  <a name='L174'></a><a href='#L174'>174</a>
234
234
  <a name='L175'></a><a href='#L175'>175</a>
235
235
  <a name='L176'></a><a href='#L176'>176</a>
236
- <a name='L177'></a><a href='#L177'>177</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
236
+ <a name='L177'></a><a href='#L177'>177</a>
237
+ <a name='L178'></a><a href='#L178'>178</a>
238
+ <a name='L179'></a><a href='#L179'>179</a>
239
+ <a name='L180'></a><a href='#L180'>180</a>
240
+ <a name='L181'></a><a href='#L181'>181</a>
241
+ <a name='L182'></a><a href='#L182'>182</a>
242
+ <a name='L183'></a><a href='#L183'>183</a>
243
+ <a name='L184'></a><a href='#L184'>184</a>
244
+ <a name='L185'></a><a href='#L185'>185</a>
245
+ <a name='L186'></a><a href='#L186'>186</a>
246
+ <a name='L187'></a><a href='#L187'>187</a>
247
+ <a name='L188'></a><a href='#L188'>188</a>
248
+ <a name='L189'></a><a href='#L189'>189</a>
249
+ <a name='L190'></a><a href='#L190'>190</a>
250
+ <a name='L191'></a><a href='#L191'>191</a>
251
+ <a name='L192'></a><a href='#L192'>192</a>
252
+ <a name='L193'></a><a href='#L193'>193</a>
253
+ <a name='L194'></a><a href='#L194'>194</a>
254
+ <a name='L195'></a><a href='#L195'>195</a>
255
+ <a name='L196'></a><a href='#L196'>196</a>
256
+ <a name='L197'></a><a href='#L197'>197</a>
257
+ <a name='L198'></a><a href='#L198'>198</a>
258
+ <a name='L199'></a><a href='#L199'>199</a>
259
+ <a name='L200'></a><a href='#L200'>200</a>
260
+ <a name='L201'></a><a href='#L201'>201</a>
261
+ <a name='L202'></a><a href='#L202'>202</a>
262
+ <a name='L203'></a><a href='#L203'>203</a>
263
+ <a name='L204'></a><a href='#L204'>204</a>
264
+ <a name='L205'></a><a href='#L205'>205</a>
265
+ <a name='L206'></a><a href='#L206'>206</a>
266
+ <a name='L207'></a><a href='#L207'>207</a>
267
+ <a name='L208'></a><a href='#L208'>208</a>
268
+ <a name='L209'></a><a href='#L209'>209</a>
269
+ <a name='L210'></a><a href='#L210'>210</a>
270
+ <a name='L211'></a><a href='#L211'>211</a>
271
+ <a name='L212'></a><a href='#L212'>212</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
272
+ <span class="cline-any cline-yes">34x</span>
237
273
  <span class="cline-any cline-yes">34x</span>
238
274
  <span class="cline-any cline-yes">34x</span>
239
275
  <span class="cline-any cline-yes">34x</span>
@@ -264,8 +300,35 @@
264
300
  <span class="cline-any cline-neutral">&nbsp;</span>
265
301
  <span class="cline-any cline-neutral">&nbsp;</span>
266
302
  <span class="cline-any cline-yes">2x</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-neutral">&nbsp;</span>
305
+ <span class="cline-any cline-neutral">&nbsp;</span>
306
+ <span class="cline-any cline-neutral">&nbsp;</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-neutral">&nbsp;</span>
310
+ <span class="cline-any cline-neutral">&nbsp;</span>
311
+ <span class="cline-any cline-yes">2x</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-yes">2x</span>
315
+ <span class="cline-any cline-no">&nbsp;</span>
316
+ <span class="cline-any cline-no">&nbsp;</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-yes">2x</span>
321
+ <span class="cline-any cline-no">&nbsp;</span>
322
+ <span class="cline-any cline-neutral">&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-yes">2x</span>
267
326
  <span class="cline-any cline-no">&nbsp;</span>
268
327
  <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-neutral">&nbsp;</span>
330
+ <span class="cline-any cline-yes">2x</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
269
332
  <span class="cline-any cline-yes">2x</span>
270
333
  <span class="cline-any cline-neutral">&nbsp;</span>
271
334
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -358,14 +421,15 @@
358
421
  <span class="cline-any cline-neutral">&nbsp;</span>
359
422
  <span class="cline-any cline-neutral">&nbsp;</span>
360
423
  <span class="cline-any cline-yes">1x</span>
361
- <span class="cline-any cline-neutral">&nbsp;</span>
362
424
  <span class="cline-any cline-yes">1x</span>
363
- <span class="cline-any cline-neutral">&nbsp;</span>
364
425
  <span class="cline-any cline-yes">1x</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span>
365
427
  <span class="cline-any cline-yes">1x</span>
366
428
  <span class="cline-any cline-neutral">&nbsp;</span>
367
429
  <span class="cline-any cline-neutral">&nbsp;</span>
368
- <span class="cline-any cline-yes">1x</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-neutral">&nbsp;</span>
432
+ <span class="cline-any cline-neutral">&nbsp;</span>
369
433
  <span class="cline-any cline-neutral">&nbsp;</span>
370
434
  <span class="cline-any cline-yes">1x</span>
371
435
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -393,9 +457,15 @@
393
457
  <span class="cline-any cline-neutral">&nbsp;</span>
394
458
  <span class="cline-any cline-neutral">&nbsp;</span>
395
459
  <span class="cline-any cline-neutral">&nbsp;</span>
460
+ <span class="cline-any cline-yes">1x</span>
461
+ <span class="cline-any cline-neutral">&nbsp;</span>
396
462
  <span class="cline-any cline-neutral">&nbsp;</span>
397
463
  <span class="cline-any cline-yes">1x</span>
398
464
  <span class="cline-any cline-neutral">&nbsp;</span>
465
+ <span class="cline-any cline-neutral">&nbsp;</span>
466
+ <span class="cline-any cline-neutral">&nbsp;</span>
467
+ <span class="cline-any cline-neutral">&nbsp;</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
399
469
  <span class="cline-any cline-yes">1x</span>
400
470
  <span class="cline-any cline-neutral">&nbsp;</span>
401
471
  <span class="cline-any cline-yes">1x</span>
@@ -415,6 +485,7 @@ const { generateQueryID, getQueryParams } = require("../../db/utils")
415
485
  const { integrations } = require("../../integrations")
416
486
  const { BaseQueryVerbs } = require("../../constants")
417
487
  const env = require("../../environment")
488
+ const ScriptRunner = require("../../utilities/scriptRunner")
418
489
  &nbsp;
419
490
  // simple function to append "readable" to all read queries
420
491
  function enrichQueries(input) {
@@ -439,12 +510,39 @@ function formatResponse(resp) {
439
510
  <span class="cstat-no" title="statement not covered" > resp = { response: resp }</span>
440
511
  }
441
512
  }
442
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(resp)) {
443
- <span class="cstat-no" title="statement not covered" > resp = [resp]</span>
444
- }
445
513
  return resp
446
514
  }
447
515
  &nbsp;
516
+ async function runAndTransform(
517
+ integration,
518
+ queryVerb,
519
+ enrichedQuery,
520
+ transformer
521
+ ) {
522
+ let rows = formatResponse(await integration[queryVerb](enrichedQuery))
523
+ &nbsp;
524
+ // transform as required
525
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (transformer) {
526
+ const runner = <span class="cstat-no" title="statement not covered" >new ScriptRunner(transformer, { data: rows })</span>
527
+ <span class="cstat-no" title="statement not covered" > rows = runner.execute()</span>
528
+ }
529
+ &nbsp;
530
+ // needs to an array for next step
531
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(rows)) {
532
+ <span class="cstat-no" title="statement not covered" > rows = [rows]</span>
533
+ }
534
+ &nbsp;
535
+ // map into JSON if just raw primitive here
536
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (rows.find(row =&gt; typeof row !== "object")) {
537
+ <span class="cstat-no" title="statement not covered" > rows = rows.map(<span class="fstat-no" title="function not covered" >va</span>lue =&gt; (<span class="cstat-no" title="statement not covered" >{ value })</span>)</span>
538
+ }
539
+ &nbsp;
540
+ // get all the potential fields in the schema
541
+ let keys = rows.flatMap(Object.keys)
542
+ &nbsp;
543
+ return { rows, keys }
544
+ }
545
+ &nbsp;
448
546
  exports.fetch = async function (ctx) {
449
547
  const db = new CouchDB(ctx.appId)
450
548
  &nbsp;
@@ -533,15 +631,16 @@ exports.preview = async function (ctx) {
533
631
  ctx.throw(400, "Integration type does not exist.")
534
632
  }
535
633
  &nbsp;
536
- const { fields, parameters, queryVerb } = ctx.request.body
537
- &nbsp;
634
+ const { fields, parameters, queryVerb, transformer } = ctx.request.body
538
635
  const enrichedQuery = await enrichQueryFields(fields, parameters)
539
- &nbsp;
540
636
  const integration = new Integration(datasource.config)
541
- const rows = formatResponse(await integration[queryVerb](enrichedQuery))
542
637
  &nbsp;
543
- // get all the potential fields in the schema
544
- const keys = rows.flatMap(Object.keys)
638
+ const { rows, keys } = await runAndTransform(
639
+ integration,
640
+ queryVerb,
641
+ enrichedQuery,
642
+ transformer
643
+ )
545
644
  &nbsp;
546
645
  ctx.body = {
547
646
  rows,
@@ -569,10 +668,16 @@ exports.execute = async function (ctx) {
569
668
  query.fields,
570
669
  ctx.request.body.parameters
571
670
  )
572
- &nbsp;
573
671
  const integration = new Integration(datasource.config)
672
+ &nbsp;
574
673
  // call the relevant CRUD method on the integration class
575
- ctx.body = formatResponse(await integration[query.queryVerb](enrichedQuery))
674
+ const { rows } = await runAndTransform(
675
+ integration,
676
+ query.queryVerb,
677
+ enrichedQuery,
678
+ query.transformer
679
+ )
680
+ ctx.body = rows
576
681
  // cleanup
577
682
  <span class="missing-if-branch" title="if path not taken" >I</span>if (integration.end) {
578
683
  <span class="cstat-no" title="statement not covered" > integration.end()</span>
@@ -592,7 +697,7 @@ exports.destroy = async function (ctx) {
592
697
  <div class='footer quiet pad2 space-top1 center small'>
593
698
  Code coverage generated by
594
699
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
595
- at Wed Oct 13 2021 15:52:51 GMT+0000 (Coordinated Universal Time)
700
+ at Mon Oct 18 2021 10:14:28 GMT+0000 (Coordinated Universal Time)
596
701
  </div>
597
702
  </div>
598
703
  <script src="../../prettify.js"></script>
@@ -358,7 +358,7 @@ exports.destroy = async function (ctx) {
358
358
  <div class='footer quiet pad2 space-top1 center small'>
359
359
  Code coverage generated by
360
360
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
361
- at Wed Oct 13 2021 15:52:51 GMT+0000 (Coordinated Universal Time)
361
+ at Mon Oct 18 2021 10:14:28 GMT+0000 (Coordinated Universal Time)
362
362
  </div>
363
363
  </div>
364
364
  <script src="../../prettify.js"></script>
@@ -343,7 +343,7 @@ exports.clientFetch = async ctx =&gt; {
343
343
  <div class='footer quiet pad2 space-top1 center small'>
344
344
  Code coverage generated by
345
345
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
346
- at Wed Oct 13 2021 15:52:51 GMT+0000 (Coordinated Universal Time)
346
+ at Mon Oct 18 2021 10:14:28 GMT+0000 (Coordinated Universal Time)
347
347
  </div>
348
348
  </div>
349
349
  <script src="../../prettify.js"></script>
@@ -748,7 +748,7 @@ exports.fetchEnrichedRow = <span class="fstat-no" title="function not covered" >
748
748
  <div class='footer quiet pad2 space-top1 center small'>
749
749
  Code coverage generated by
750
750
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
751
- at Wed Oct 13 2021 15:52:51 GMT+0000 (Coordinated Universal Time)
751
+ at Mon Oct 18 2021 10:14:28 GMT+0000 (Coordinated Universal Time)
752
752
  </div>
753
753
  </div>
754
754
  <script src="../../../prettify.js"></script>
@@ -155,7 +155,7 @@
155
155
  <div class='footer quiet pad2 space-top1 center small'>
156
156
  Code coverage generated by
157
157
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
158
- at Wed Oct 13 2021 15:52:51 GMT+0000 (Coordinated Universal Time)
158
+ at Mon Oct 18 2021 10:14:28 GMT+0000 (Coordinated Universal Time)
159
159
  </div>
160
160
  </div>
161
161
  <script src="../../../prettify.js"></script>
@@ -481,7 +481,7 @@ exports.fetchEnrichedRow = async function (ctx) {
481
481
  <div class='footer quiet pad2 space-top1 center small'>
482
482
  Code coverage generated by
483
483
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
484
- at Wed Oct 13 2021 15:52:51 GMT+0000 (Coordinated Universal Time)
484
+ at Mon Oct 18 2021 10:14:28 GMT+0000 (Coordinated Universal Time)
485
485
  </div>
486
486
  </div>
487
487
  <script src="../../../prettify.js"></script>
@@ -1405,7 +1405,7 @@ exports.fetchEnrichedRow = async ctx =&gt; {
1405
1405
  <div class='footer quiet pad2 space-top1 center small'>
1406
1406
  Code coverage generated by
1407
1407
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
1408
- at Wed Oct 13 2021 15:52:51 GMT+0000 (Coordinated Universal Time)
1408
+ at Mon Oct 18 2021 10:14:28 GMT+0000 (Coordinated Universal Time)
1409
1409
  </div>
1410
1410
  </div>
1411
1411
  <script src="../../../prettify.js"></script>
@@ -1228,7 +1228,7 @@ exports.fullSearch = <span class="fstat-no" title="function not covered" >as</sp
1228
1228
  <div class='footer quiet pad2 space-top1 center small'>
1229
1229
  Code coverage generated by
1230
1230
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
1231
- at Wed Oct 13 2021 15:52:51 GMT+0000 (Coordinated Universal Time)
1231
+ at Mon Oct 18 2021 10:14:28 GMT+0000 (Coordinated Universal Time)
1232
1232
  </div>
1233
1233
  </div>
1234
1234
  <script src="../../../prettify.js"></script>
@@ -328,7 +328,7 @@ exports.validate = async ({ appId, tableId, row, table }) =&gt; {
328
328
  <div class='footer quiet pad2 space-top1 center small'>
329
329
  Code coverage generated by
330
330
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
331
- at Wed Oct 13 2021 15:52:51 GMT+0000 (Coordinated Universal Time)
331
+ at Mon Oct 18 2021 10:14:28 GMT+0000 (Coordinated Universal Time)
332
332
  </div>
333
333
  </div>
334
334
  <script src="../../../prettify.js"></script>
@@ -208,7 +208,7 @@ exports.destroy = async ctx =&gt; {
208
208
  <div class='footer quiet pad2 space-top1 center small'>
209
209
  Code coverage generated by
210
210
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
211
- at Wed Oct 13 2021 15:52:51 GMT+0000 (Coordinated Universal Time)
211
+ at Mon Oct 18 2021 10:14:28 GMT+0000 (Coordinated Universal Time)
212
212
  </div>
213
213
  </div>
214
214
  <script src="../../prettify.js"></script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">30.77% </span>
26
+ <span class="strong">42.86% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>4/13</span>
28
+ <span class='fraction'>3/7</span>
29
29
  </div>
30
30
 
31
31
 
@@ -39,14 +39,14 @@
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/4</span>
42
+ <span class='fraction'>0/2</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">30.77% </span>
47
+ <span class="strong">42.86% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>4/13</span>
49
+ <span class='fraction'>3/7</span>
50
50
  </div>
51
51
 
52
52
 
@@ -68,68 +68,23 @@
68
68
  <a name='L9'></a><a href='#L9'>9</a>
69
69
  <a name='L10'></a><a href='#L10'>10</a>
70
70
  <a name='L11'></a><a href='#L11'>11</a>
71
- <a name='L12'></a><a href='#L12'>12</a>
72
- <a name='L13'></a><a href='#L13'>13</a>
73
- <a name='L14'></a><a href='#L14'>14</a>
74
- <a name='L15'></a><a href='#L15'>15</a>
75
- <a name='L16'></a><a href='#L16'>16</a>
76
- <a name='L17'></a><a href='#L17'>17</a>
77
- <a name='L18'></a><a href='#L18'>18</a>
78
- <a name='L19'></a><a href='#L19'>19</a>
79
- <a name='L20'></a><a href='#L20'>20</a>
80
- <a name='L21'></a><a href='#L21'>21</a>
81
- <a name='L22'></a><a href='#L22'>22</a>
82
- <a name='L23'></a><a href='#L23'>23</a>
83
- <a name='L24'></a><a href='#L24'>24</a>
84
- <a name='L25'></a><a href='#L25'>25</a>
85
- <a name='L26'></a><a href='#L26'>26</a>
86
- <a name='L27'></a><a href='#L27'>27</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
87
- <span class="cline-any cline-yes">34x</span>
88
- <span class="cline-any cline-neutral">&nbsp;</span>
89
- <span class="cline-any cline-neutral">&nbsp;</span>
90
- <span class="cline-any cline-neutral">&nbsp;</span>
91
- <span class="cline-any cline-no">&nbsp;</span>
92
- <span class="cline-any cline-no">&nbsp;</span>
93
- <span class="cline-any cline-no">&nbsp;</span>
94
- <span class="cline-any cline-no">&nbsp;</span>
95
- <span class="cline-any cline-neutral">&nbsp;</span>
96
- <span class="cline-any cline-neutral">&nbsp;</span>
97
- <span class="cline-any cline-neutral">&nbsp;</span>
98
- <span class="cline-any cline-no">&nbsp;</span>
99
- <span class="cline-any cline-no">&nbsp;</span>
100
- <span class="cline-any cline-neutral">&nbsp;</span>
101
- <span class="cline-any cline-neutral">&nbsp;</span>
71
+ <a name='L12'></a><a href='#L12'>12</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
102
72
  <span class="cline-any cline-neutral">&nbsp;</span>
103
73
  <span class="cline-any cline-yes">34x</span>
104
74
  <span class="cline-any cline-no">&nbsp;</span>
105
- <span class="cline-any cline-neutral">&nbsp;</span>
75
+ <span class="cline-any cline-no">&nbsp;</span>
106
76
  <span class="cline-any cline-no">&nbsp;</span>
107
77
  <span class="cline-any cline-neutral">&nbsp;</span>
108
78
  <span class="cline-any cline-neutral">&nbsp;</span>
109
79
  <span class="cline-any cline-yes">34x</span>
110
80
  <span class="cline-any cline-no">&nbsp;</span>
111
81
  <span class="cline-any cline-neutral">&nbsp;</span>
112
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const fetch = require("node-fetch")
113
- const vm = require("vm")
114
- &nbsp;
115
- class ScriptExecutor {
116
- <span class="fstat-no" title="function not covered" > co</span>nstructor(body) {
117
- const code = <span class="cstat-no" title="statement not covered" >`let fn = () =&gt; {\n${body.script}\n}; out = fn();`</span>
118
- <span class="cstat-no" title="statement not covered" > this.script = new vm.Script(code)</span>
119
- <span class="cstat-no" title="statement not covered" > this.context = vm.createContext(body.context)</span>
120
- <span class="cstat-no" title="statement not covered" > this.context.fetch = fetch</span>
121
- }
122
- &nbsp;
123
- <span class="fstat-no" title="function not covered" > ex</span>ecute() {
124
- <span class="cstat-no" title="statement not covered" > this.script.runInContext(this.context)</span>
125
- <span class="cstat-no" title="statement not covered" > return this.context.out</span>
126
- }
127
- }
82
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const ScriptRunner = require("../../utilities/scriptRunner")
128
83
  &nbsp;
129
84
  exports.execute = <span class="fstat-no" title="function not covered" >as</span>ync function (ctx) {
130
- const executor = <span class="cstat-no" title="statement not covered" >new ScriptExecutor(ctx.request.body)</span>
131
- &nbsp;
132
- <span class="cstat-no" title="statement not covered" > ctx.body = executor.execute()</span>
85
+ const { script, context } = <span class="cstat-no" title="statement not covered" >ctx.request.body</span>
86
+ const runner = <span class="cstat-no" title="statement not covered" >new ScriptRunner(script, context)</span>
87
+ <span class="cstat-no" title="statement not covered" > ctx.body = runner.execute()</span>
133
88
  }
134
89
  &nbsp;
135
90
  exports.save = <span class="fstat-no" title="function not covered" >as</span>ync function (ctx) {
@@ -142,7 +97,7 @@ exports.save = <span class="fstat-no" title="function not covered" >as</span>ync
142
97
  <div class='footer quiet pad2 space-top1 center small'>
143
98
  Code coverage generated by
144
99
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
145
- at Wed Oct 13 2021 15:52:51 GMT+0000 (Coordinated Universal Time)
100
+ at Mon Oct 18 2021 10:14:28 GMT+0000 (Coordinated Universal Time)
146
101
  </div>
147
102
  </div>
148
103
  <script src="../../prettify.js"></script>
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">85.71% </span>
26
+ <span class="strong">85.26% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>162/189</span>
28
+ <span class='fraction'>162/190</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">68.89% </span>
33
+ <span class="strong">69.15% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>62/90</span>
35
+ <span class='fraction'>65/94</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">87.91% </span>
47
+ <span class="strong">87.43% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>160/182</span>
49
+ <span class='fraction'>160/183</span>
50
50
  </div>
51
51
 
52
52
 
@@ -74,32 +74,32 @@
74
74
  </thead>
75
75
  <tbody><tr>
76
76
  <td class="file high" data-value="index.js"><a href="index.js.html">index.js</a></td>
77
- <td data-value="83.33" class="pic high">
78
- <div class="chart"><div class="cover-fill" style="width: 83%"></div><div class="cover-empty" style="width: 17%"></div></div>
77
+ <td data-value="82.56" class="pic high">
78
+ <div class="chart"><div class="cover-fill" style="width: 82%"></div><div class="cover-empty" style="width: 18%"></div></div>
79
79
  </td>
80
- <td data-value="83.33" class="pct high">83.33%</td>
81
- <td data-value="84" class="abs high">70/84</td>
82
- <td data-value="71.79" class="pct medium">71.79%</td>
83
- <td data-value="39" class="abs medium">28/39</td>
80
+ <td data-value="82.56" class="pct high">82.56%</td>
81
+ <td data-value="86" class="abs high">71/86</td>
82
+ <td data-value="72.09" class="pct medium">72.09%</td>
83
+ <td data-value="43" class="abs medium">31/43</td>
84
84
  <td data-value="70" class="pct medium">70%</td>
85
85
  <td data-value="10" class="abs medium">7/10</td>
86
- <td data-value="87.34" class="pct high">87.34%</td>
87
- <td data-value="79" class="abs high">69/79</td>
86
+ <td data-value="86.42" class="pct high">86.42%</td>
87
+ <td data-value="81" class="abs high">70/81</td>
88
88
  </tr>
89
89
 
90
90
  <tr>
91
91
  <td class="file high" data-value="utils.js"><a href="utils.js.html">utils.js</a></td>
92
- <td data-value="87.62" class="pic high">
92
+ <td data-value="87.5" class="pic high">
93
93
  <div class="chart"><div class="cover-fill" style="width: 87%"></div><div class="cover-empty" style="width: 13%"></div></div>
94
94
  </td>
95
- <td data-value="87.62" class="pct high">87.62%</td>
96
- <td data-value="105" class="abs high">92/105</td>
95
+ <td data-value="87.5" class="pct high">87.5%</td>
96
+ <td data-value="104" class="abs high">91/104</td>
97
97
  <td data-value="66.67" class="pct medium">66.67%</td>
98
98
  <td data-value="51" class="abs medium">34/51</td>
99
99
  <td data-value="82.35" class="pct high">82.35%</td>
100
100
  <td data-value="17" class="abs high">14/17</td>
101
- <td data-value="88.35" class="pct high">88.35%</td>
102
- <td data-value="103" class="abs high">91/103</td>
101
+ <td data-value="88.24" class="pct high">88.24%</td>
102
+ <td data-value="102" class="abs high">90/102</td>
103
103
  </tr>
104
104
 
105
105
  </tbody>
@@ -110,7 +110,7 @@
110
110
  <div class='footer quiet pad2 space-top1 center small'>
111
111
  Code coverage generated by
112
112
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
113
- at Wed Oct 13 2021 15:52:51 GMT+0000 (Coordinated Universal Time)
113
+ at Mon Oct 18 2021 10:14:28 GMT+0000 (Coordinated Universal Time)
114
114
  </div>
115
115
  </div>
116
116
  <script src="../../../prettify.js"></script>
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">83.33% </span>
26
+ <span class="strong">82.56% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>70/84</span>
28
+ <span class='fraction'>71/86</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">71.79% </span>
33
+ <span class="strong">72.09% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>28/39</span>
35
+ <span class='fraction'>31/43</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">87.34% </span>
47
+ <span class="strong">86.42% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>69/79</span>
49
+ <span class='fraction'>70/81</span>
50
50
  </div>
51
51
 
52
52
 
@@ -260,7 +260,10 @@
260
260
  <a name='L201'></a><a href='#L201'>201</a>
261
261
  <a name='L202'></a><a href='#L202'>202</a>
262
262
  <a name='L203'></a><a href='#L203'>203</a>
263
- <a name='L204'></a><a href='#L204'>204</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
263
+ <a name='L204'></a><a href='#L204'>204</a>
264
+ <a name='L205'></a><a href='#L205'>205</a>
265
+ <a name='L206'></a><a href='#L206'>206</a>
266
+ <a name='L207'></a><a href='#L207'>207</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
264
267
  <span class="cline-any cline-yes">34x</span>
265
268
  <span class="cline-any cline-yes">34x</span>
266
269
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -356,6 +359,9 @@
356
359
  <span class="cline-any cline-yes">13x</span>
357
360
  <span class="cline-any cline-no">&nbsp;</span>
358
361
  <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-yes">13x</span>
363
+ <span class="cline-any cline-no">&nbsp;</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span>
359
365
  <span class="cline-any cline-neutral">&nbsp;</span>
360
366
  <span class="cline-any cline-neutral">&nbsp;</span>
361
367
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -556,6 +562,9 @@ exports.save = async function (ctx) {
556
562
  for (let propKey of Object.keys(tableToSave.schema)) {
557
563
  let column = tableToSave.schema[propKey]
558
564
  let oldColumn = oldTable.schema[propKey]
565
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (oldColumn &amp;&amp; oldColumn.type === "internal") {
566
+ <span class="cstat-no" title="statement not covered" > oldColumn.type = "auto"</span>
567
+ }
559
568
  <span class="missing-if-branch" title="if path not taken" >I</span>if (oldColumn &amp;&amp; oldColumn.type !== column.type) {
560
569
  <span class="cstat-no" title="statement not covered" > ctx.throw(400, "Cannot change the type of a column")</span>
561
570
  }
@@ -673,7 +682,7 @@ exports.validateCSVSchema = async function (ctx) {
673
682
  <div class='footer quiet pad2 space-top1 center small'>
674
683
  Code coverage generated by
675
684
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
676
- at Wed Oct 13 2021 15:52:51 GMT+0000 (Coordinated Universal Time)
685
+ at Mon Oct 18 2021 10:14:28 GMT+0000 (Coordinated Universal Time)
677
686
  </div>
678
687
  </div>
679
688
  <script src="../../../prettify.js"></script>