@budibase/server 1.0.89 → 1.0.90

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 (187) hide show
  1. package/builder/assets/{index.7f34af34.js → index.5cea89f7.js} +2 -2
  2. package/builder/index.html +1 -1
  3. package/coverage/clover.xml +267 -239
  4. package/coverage/coverage-final.json +6 -5
  5. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  6. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/application.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/index.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  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 +44 -8
  27. package/coverage/lcov-report/api/controllers/row/index.html +17 -17
  28. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/internal.js.html +34 -7
  30. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  44. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  49. package/coverage/lcov-report/api/index.html +1 -1
  50. package/coverage/lcov-report/api/index.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/index.html +1 -1
  63. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/migrations.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 +1 -1
  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/utils/index.html +1 -1
  80. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  83. package/coverage/lcov-report/automations/actions.js.html +1 -1
  84. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  85. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  86. package/coverage/lcov-report/automations/index.html +1 -1
  87. package/coverage/lcov-report/automations/index.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/index.html +1 -1
  97. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  114. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  115. package/coverage/lcov-report/automations/utils.js.html +1 -1
  116. package/coverage/lcov-report/constants/index.html +1 -1
  117. package/coverage/lcov-report/constants/index.js.html +1 -1
  118. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  119. package/coverage/lcov-report/constants/screens.js.html +1 -1
  120. package/coverage/lcov-report/db/client.js.html +1 -1
  121. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  122. package/coverage/lcov-report/db/index.html +1 -1
  123. package/coverage/lcov-report/db/index.js.html +1 -1
  124. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  128. package/coverage/lcov-report/db/newid.js.html +1 -1
  129. package/coverage/lcov-report/db/utils.js.html +1 -1
  130. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  131. package/coverage/lcov-report/events/index.html +1 -1
  132. package/coverage/lcov-report/events/index.js.html +1 -1
  133. package/coverage/lcov-report/events/utils.js.html +1 -1
  134. package/coverage/lcov-report/index.html +24 -24
  135. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  136. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  137. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  138. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  139. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  140. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  141. package/coverage/lcov-report/middleware/index.html +24 -9
  142. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  143. package/coverage/lcov-report/middleware/publicApi.js.html +143 -0
  144. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  145. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  146. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  147. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  148. package/coverage/lcov-report/threads/automation.js.html +1 -1
  149. package/coverage/lcov-report/threads/index.html +1 -1
  150. package/coverage/lcov-report/threads/index.js.html +1 -1
  151. package/coverage/lcov-report/threads/query.js.html +1 -1
  152. package/coverage/lcov-report/threads/utils.js.html +1 -1
  153. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  154. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  155. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  156. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  157. package/coverage/lcov-report/utilities/global.js.html +1 -1
  158. package/coverage/lcov-report/utilities/index.html +1 -1
  159. package/coverage/lcov-report/utilities/index.js.html +1 -1
  160. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  161. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  162. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  163. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  164. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  165. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  166. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  167. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  168. package/coverage/lcov-report/utilities/security.js.html +1 -1
  169. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  170. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  171. package/coverage/lcov-report/utilities/usageQuota/index.js.html +1 -1
  172. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  173. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  174. package/coverage/lcov-report/utilities/users.js.html +1 -1
  175. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  176. package/coverage/lcov.info +417 -372
  177. package/dist/api/controllers/row/external.js +11 -2
  178. package/dist/api/controllers/row/internal.js +9 -1
  179. package/dist/api/routes/public/index.js +6 -0
  180. package/dist/middleware/publicApi.js +24 -0
  181. package/dist/package.json +4 -4
  182. package/dist/tsconfig.tsbuildinfo +1 -1
  183. package/package.json +5 -5
  184. package/src/api/controllers/row/external.js +14 -2
  185. package/src/api/controllers/row/internal.js +10 -1
  186. package/src/api/routes/public/index.ts +7 -0
  187. package/src/middleware/publicApi.js +21 -0
@@ -181,7 +181,7 @@ exports.endUserPing = <span class="fstat-no" title="function not covered" >as</s
181
181
  <div class='footer quiet pad2 space-top1 center small'>
182
182
  Code coverage generated by
183
183
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
184
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
184
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
185
185
  </div>
186
186
  </div>
187
187
  <script src="../../prettify.js"></script>
@@ -226,7 +226,7 @@ exports.update = async function (ctx) {
226
226
  <div class='footer quiet pad2 space-top1 center small'>
227
227
  Code coverage generated by
228
228
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
229
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
229
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
230
230
  </div>
231
231
  </div>
232
232
  <script src="../../prettify.js"></script>
@@ -1414,7 +1414,7 @@ const createEmptyAppPackage = async (ctx, app) =&gt; {
1414
1414
  <div class='footer quiet pad2 space-top1 center small'>
1415
1415
  Code coverage generated by
1416
1416
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
1417
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
1417
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
1418
1418
  </div>
1419
1419
  </div>
1420
1420
  <script src="../../prettify.js"></script>
@@ -238,7 +238,7 @@ exports.fetchSelf = async ctx =&gt; {
238
238
  <div class='footer quiet pad2 space-top1 center small'>
239
239
  Code coverage generated by
240
240
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
241
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
241
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
242
242
  </div>
243
243
  </div>
244
244
  <script src="../../prettify.js"></script>
@@ -718,7 +718,7 @@ exports.test = async function (ctx) {
718
718
  <div class='footer quiet pad2 space-top1 center small'>
719
719
  Code coverage generated by
720
720
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
721
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
721
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
722
722
  </div>
723
723
  </div>
724
724
  <script src="../../prettify.js"></script>
@@ -91,7 +91,7 @@ exports.exportAppDump = async function (ctx) {
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">istanbul</a>
94
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
94
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
95
95
  </div>
96
96
  </div>
97
97
  <script src="../../prettify.js"></script>
@@ -403,7 +403,7 @@ exports.importApps = <span class="fstat-no" title="function not covered" >as</sp
403
403
  <div class='footer quiet pad2 space-top1 center small'>
404
404
  Code coverage generated by
405
405
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
406
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
406
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
407
407
  </div>
408
408
  </div>
409
409
  <script src="../../prettify.js"></script>
@@ -166,7 +166,7 @@ exports.fetchAppComponentDefinitions = async function (ctx) {
166
166
  <div class='footer quiet pad2 space-top1 center small'>
167
167
  Code coverage generated by
168
168
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
169
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
169
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
170
170
  </div>
171
171
  </div>
172
172
  <script src="../../prettify.js"></script>
@@ -841,7 +841,7 @@ const buildSchemaHelper = <span class="fstat-no" title="function not covered" >a
841
841
  <div class='footer quiet pad2 space-top1 center small'>
842
842
  Code coverage generated by
843
843
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
844
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
844
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
845
845
  </div>
846
846
  </div>
847
847
  <script src="../../prettify.js"></script>
@@ -436,7 +436,7 @@ exports.getBudibaseVersion = <span class="fstat-no" title="function not covered"
436
436
  <div class='footer quiet pad2 space-top1 center small'>
437
437
  Code coverage generated by
438
438
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
439
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
439
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
440
440
  </div>
441
441
  </div>
442
442
  <script src="../../prettify.js"></script>
@@ -410,7 +410,7 @@
410
410
  <div class='footer quiet pad2 space-top1 center small'>
411
411
  Code coverage generated by
412
412
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
413
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
413
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
414
414
  </div>
415
415
  </div>
416
416
  <script src="../../prettify.js"></script>
@@ -97,7 +97,7 @@ exports.find = async function (ctx) {
97
97
  <div class='footer quiet pad2 space-top1 center small'>
98
98
  Code coverage generated by
99
99
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
100
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
100
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
101
101
  </div>
102
102
  </div>
103
103
  <script src="../../prettify.js"></script>
@@ -217,7 +217,7 @@ exports.destroy = async function (ctx) {
217
217
  <div class='footer quiet pad2 space-top1 center small'>
218
218
  Code coverage generated by
219
219
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
220
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
220
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
221
221
  </div>
222
222
  </div>
223
223
  <script src="../../prettify.js"></script>
@@ -187,7 +187,7 @@ exports.getMetadata = async ctx =&gt; {
187
187
  <div class='footer quiet pad2 space-top1 center small'>
188
188
  Code coverage generated by
189
189
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
190
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
190
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
191
191
  </div>
192
192
  </div>
193
193
  <script src="../../prettify.js"></script>
@@ -103,7 +103,7 @@ exports.fetchDefinitions = <span class="fstat-no" title="function not covered" >
103
103
  <div class='footer quiet pad2 space-top1 center small'>
104
104
  Code coverage generated by
105
105
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
106
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
106
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
107
107
  </div>
108
108
  </div>
109
109
  <script src="../../prettify.js"></script>
@@ -589,7 +589,7 @@ exports.removePermission = async function (ctx) {
589
589
  <div class='footer quiet pad2 space-top1 center small'>
590
590
  Code coverage generated by
591
591
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
592
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
592
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
593
593
  </div>
594
594
  </div>
595
595
  <script src="../../prettify.js"></script>
@@ -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 Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
113
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
114
114
  </div>
115
115
  </div>
116
116
  <script src="../../../prettify.js"></script>
@@ -697,7 +697,7 @@ exports.destroy = async function (ctx) {
697
697
  <div class='footer quiet pad2 space-top1 center small'>
698
698
  Code coverage generated by
699
699
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
700
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
700
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
701
701
  </div>
702
702
  </div>
703
703
  <script src="../../../prettify.js"></script>
@@ -214,7 +214,7 @@ exports.generateQueryPreviewValidation = () =&gt; {
214
214
  <div class='footer quiet pad2 space-top1 center small'>
215
215
  Code coverage generated by
216
216
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
217
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
217
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
218
218
  </div>
219
219
  </div>
220
220
  <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 Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
361
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
362
362
  </div>
363
363
  </div>
364
364
  <script src="../../prettify.js"></script>
@@ -340,7 +340,7 @@ exports.clientFetch = async ctx =&gt; {
340
340
  <div class='footer quiet pad2 space-top1 center small'>
341
341
  Code coverage generated by
342
342
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
343
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
343
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
344
344
  </div>
345
345
  </div>
346
346
  <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">15.38% </span>
26
+ <span class="strong">16.07% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>16/104</span>
28
+ <span class='fraction'>18/112</span>
29
29
  </div>
30
30
 
31
31
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">15.68% </span>
47
+ <span class="strong">16.36% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>16/102</span>
49
+ <span class='fraction'>18/110</span>
50
50
  </div>
51
51
 
52
52
 
@@ -278,7 +278,19 @@
278
278
  <a name='L219'></a><a href='#L219'>219</a>
279
279
  <a name='L220'></a><a href='#L220'>220</a>
280
280
  <a name='L221'></a><a href='#L221'>221</a>
281
- <a name='L222'></a><a href='#L222'>222</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
281
+ <a name='L222'></a><a href='#L222'>222</a>
282
+ <a name='L223'></a><a href='#L223'>223</a>
283
+ <a name='L224'></a><a href='#L224'>224</a>
284
+ <a name='L225'></a><a href='#L225'>225</a>
285
+ <a name='L226'></a><a href='#L226'>226</a>
286
+ <a name='L227'></a><a href='#L227'>227</a>
287
+ <a name='L228'></a><a href='#L228'>228</a>
288
+ <a name='L229'></a><a href='#L229'>229</a>
289
+ <a name='L230'></a><a href='#L230'>230</a>
290
+ <a name='L231'></a><a href='#L231'>231</a>
291
+ <a name='L232'></a><a href='#L232'>232</a>
292
+ <a name='L233'></a><a href='#L233'>233</a>
293
+ <a name='L234'></a><a href='#L234'>234</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
282
294
  <span class="cline-any cline-neutral">&nbsp;</span>
283
295
  <span class="cline-any cline-neutral">&nbsp;</span>
284
296
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -290,6 +302,8 @@
290
302
  <span class="cline-any cline-yes">40x</span>
291
303
  <span class="cline-any cline-yes">40x</span>
292
304
  <span class="cline-any cline-yes">40x</span>
305
+ <span class="cline-any cline-yes">40x</span>
306
+ <span class="cline-any cline-yes">40x</span>
293
307
  <span class="cline-any cline-neutral">&nbsp;</span>
294
308
  <span class="cline-any cline-neutral">&nbsp;</span>
295
309
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -438,6 +452,7 @@
438
452
  <span class="cline-any cline-no">&nbsp;</span>
439
453
  <span class="cline-any cline-no">&nbsp;</span>
440
454
  <span class="cline-any cline-no">&nbsp;</span>
455
+ <span class="cline-any cline-no">&nbsp;</span>
441
456
  <span class="cline-any cline-neutral">&nbsp;</span>
442
457
  <span class="cline-any cline-no">&nbsp;</span>
443
458
  <span class="cline-any cline-no">&nbsp;</span>
@@ -450,6 +465,15 @@
450
465
  <span class="cline-any cline-neutral">&nbsp;</span>
451
466
  <span class="cline-any cline-neutral">&nbsp;</span>
452
467
  <span class="cline-any cline-neutral">&nbsp;</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-no">&nbsp;</span>
470
+ <span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-no">&nbsp;</span>
472
+ <span class="cline-any cline-no">&nbsp;</span>
473
+ <span class="cline-any cline-no">&nbsp;</span>
474
+ <span class="cline-any cline-neutral">&nbsp;</span>
475
+ <span class="cline-any cline-neutral">&nbsp;</span>
476
+ <span class="cline-any cline-no">&nbsp;</span>
453
477
  <span class="cline-any cline-no">&nbsp;</span>
454
478
  <span class="cline-any cline-neutral">&nbsp;</span>
455
479
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -511,6 +535,8 @@ const {
511
535
  } = require("../../../integrations/utils")
512
536
  const ExternalRequest = require("./ExternalRequest")
513
537
  const { getAppDB } = require("@budibase/backend-core/context")
538
+ const exporters = require("../view/exporters")
539
+ const { apiFileReturn } = require("../../../utilities/fileSystem")
514
540
  &nbsp;
515
541
  async function <span class="fstat-no" title="function not covered" >handleRequest(</span>operation, tableId, opts = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
516
542
  // make sure the filters are cleaned up, no empty strings for equals, fuzzy or string
@@ -656,6 +682,7 @@ exports.validate = <span class="fstat-no" title="function not covered" >as</span
656
682
  exports.exportRows = <span class="fstat-no" title="function not covered" >as</span>ync ctx =&gt; {
657
683
  const { datasourceId, tableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(ctx.params.tableId)</span>
658
684
  const db = <span class="cstat-no" title="statement not covered" >getAppDB()</span>
685
+ let format = <span class="cstat-no" title="statement not covered" >ctx.query.format</span>
659
686
  const datasource = <span class="cstat-no" title="statement not covered" >await db.get(datasourceId)</span>
660
687
  <span class="cstat-no" title="statement not covered" > if (!datasource || !datasource.entities) {</span>
661
688
  <span class="cstat-no" title="statement not covered" > ctx.throw(400, "Datasource has not been configured for plus API.")</span>
@@ -665,13 +692,22 @@ exports.exportRows = <span class="fstat-no" title="function not covered" >as</sp
665
692
  <span class="cstat-no" title="statement not covered" > ctx.request.body = {</span>
666
693
  query: {
667
694
  oneOf: {
668
- [table.primaryDisplay]: ctx.request.body.map(
695
+ [table.primaryDisplay]: ctx.request.body.rows.map(
669
696
  <span class="fstat-no" title="function not covered" > id</span> =&gt; <span class="cstat-no" title="statement not covered" >breakRowIdField(id)[0]</span>
670
697
  ),
671
698
  },
672
699
  },
673
700
  }
674
- <span class="cstat-no" title="statement not covered" > return exports.search(ctx)</span>
701
+ &nbsp;
702
+ let result = <span class="cstat-no" title="statement not covered" >await exports.search(ctx)</span>
703
+ &nbsp;
704
+ let headers = <span class="cstat-no" title="statement not covered" >Object.keys(result.rows[0])</span>
705
+ const exporter = <span class="cstat-no" title="statement not covered" >exporters[format]</span>
706
+ const filename = <span class="cstat-no" title="statement not covered" >`export.${format}`</span>
707
+ &nbsp;
708
+ // send down the file
709
+ <span class="cstat-no" title="statement not covered" > ctx.attachment(filename)</span>
710
+ <span class="cstat-no" title="statement not covered" > return apiFileReturn(exporter(headers, result.rows))</span>
675
711
  }
676
712
  &nbsp;
677
713
  exports.fetchEnrichedRow = <span class="fstat-no" title="function not covered" >as</span>ync ctx =&gt; {
@@ -727,7 +763,7 @@ exports.fetchEnrichedRow = <span class="fstat-no" title="function not covered" >
727
763
  <div class='footer quiet pad2 space-top1 center small'>
728
764
  Code coverage generated by
729
765
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
730
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
766
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
731
767
  </div>
732
768
  </div>
733
769
  <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">62.46% </span>
26
+ <span class="strong">61.68% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>421/674</span>
28
+ <span class='fraction'>425/689</span>
29
29
  </div>
30
30
 
31
31
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">62.63% </span>
47
+ <span class="strong">61.83% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>414/661</span>
49
+ <span class='fraction'>418/676</span>
50
50
  </div>
51
51
 
52
52
 
@@ -74,17 +74,17 @@
74
74
  </thead>
75
75
  <tbody><tr>
76
76
  <td class="file low" data-value="external.js"><a href="external.js.html">external.js</a></td>
77
- <td data-value="15.38" class="pic low">
78
- <div class="chart"><div class="cover-fill" style="width: 15%"></div><div class="cover-empty" style="width: 85%"></div></div>
77
+ <td data-value="16.07" class="pic low">
78
+ <div class="chart"><div class="cover-fill" style="width: 16%"></div><div class="cover-empty" style="width: 84%"></div></div>
79
79
  </td>
80
- <td data-value="15.38" class="pct low">15.38%</td>
81
- <td data-value="104" class="abs low">16/104</td>
80
+ <td data-value="16.07" class="pct low">16.07%</td>
81
+ <td data-value="112" class="abs low">18/112</td>
82
82
  <td data-value="0" class="pct low">0%</td>
83
83
  <td data-value="46" class="abs low">0/46</td>
84
84
  <td data-value="0" class="pct low">0%</td>
85
85
  <td data-value="15" class="abs low">0/15</td>
86
- <td data-value="15.68" class="pct low">15.68%</td>
87
- <td data-value="102" class="abs low">16/102</td>
86
+ <td data-value="16.36" class="pct low">16.36%</td>
87
+ <td data-value="110" class="abs low">18/110</td>
88
88
  </tr>
89
89
 
90
90
  <tr>
@@ -104,17 +104,17 @@
104
104
 
105
105
  <tr>
106
106
  <td class="file high" data-value="internal.js"><a href="internal.js.html">internal.js</a></td>
107
- <td data-value="82.29" class="pic high">
108
- <div class="chart"><div class="cover-fill" style="width: 82%"></div><div class="cover-empty" style="width: 18%"></div></div>
107
+ <td data-value="80.55" class="pic high">
108
+ <div class="chart"><div class="cover-fill" style="width: 80%"></div><div class="cover-empty" style="width: 20%"></div></div>
109
109
  </td>
110
- <td data-value="82.29" class="pct high">82.29%</td>
111
- <td data-value="209" class="abs high">172/209</td>
110
+ <td data-value="80.55" class="pct high">80.55%</td>
111
+ <td data-value="216" class="abs high">174/216</td>
112
112
  <td data-value="62.9" class="pct medium">62.9%</td>
113
113
  <td data-value="62" class="abs medium">39/62</td>
114
114
  <td data-value="84.61" class="pct high">84.61%</td>
115
115
  <td data-value="26" class="abs high">22/26</td>
116
- <td data-value="82.26" class="pct high">82.26%</td>
117
- <td data-value="203" class="abs high">167/203</td>
116
+ <td data-value="80.47" class="pct high">80.47%</td>
117
+ <td data-value="210" class="abs high">169/210</td>
118
118
  </tr>
119
119
 
120
120
  <tr>
@@ -170,7 +170,7 @@
170
170
  <div class='footer quiet pad2 space-top1 center small'>
171
171
  Code coverage generated by
172
172
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
173
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
173
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
174
174
  </div>
175
175
  </div>
176
176
  <script src="../../../prettify.js"></script>
@@ -508,7 +508,7 @@ exports.export = <span class="fstat-no" title="function not covered" >as</span>y
508
508
  <div class='footer quiet pad2 space-top1 center small'>
509
509
  Code coverage generated by
510
510
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
511
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
511
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
512
512
  </div>
513
513
  </div>
514
514
  <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">82.29% </span>
26
+ <span class="strong">80.55% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>172/209</span>
28
+ <span class='fraction'>174/216</span>
29
29
  </div>
30
30
 
31
31
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">82.26% </span>
47
+ <span class="strong">80.47% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>167/203</span>
49
+ <span class='fraction'>169/210</span>
50
50
  </div>
51
51
 
52
52
 
@@ -497,7 +497,16 @@
497
497
  <a name='L438'></a><a href='#L438'>438</a>
498
498
  <a name='L439'></a><a href='#L439'>439</a>
499
499
  <a name='L440'></a><a href='#L440'>440</a>
500
- <a name='L441'></a><a href='#L441'>441</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">40x</span>
500
+ <a name='L441'></a><a href='#L441'>441</a>
501
+ <a name='L442'></a><a href='#L442'>442</a>
502
+ <a name='L443'></a><a href='#L443'>443</a>
503
+ <a name='L444'></a><a href='#L444'>444</a>
504
+ <a name='L445'></a><a href='#L445'>445</a>
505
+ <a name='L446'></a><a href='#L446'>446</a>
506
+ <a name='L447'></a><a href='#L447'>447</a>
507
+ <a name='L448'></a><a href='#L448'>448</a>
508
+ <a name='L449'></a><a href='#L449'>449</a>
509
+ <a name='L450'></a><a href='#L450'>450</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">40x</span>
501
510
  <span class="cline-any cline-neutral">&nbsp;</span>
502
511
  <span class="cline-any cline-neutral">&nbsp;</span>
503
512
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -526,6 +535,8 @@
526
535
  <span class="cline-any cline-yes">40x</span>
527
536
  <span class="cline-any cline-yes">40x</span>
528
537
  <span class="cline-any cline-yes">40x</span>
538
+ <span class="cline-any cline-yes">40x</span>
539
+ <span class="cline-any cline-yes">40x</span>
529
540
  <span class="cline-any cline-neutral">&nbsp;</span>
530
541
  <span class="cline-any cline-yes">40x</span>
531
542
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -866,6 +877,7 @@
866
877
  <span class="cline-any cline-no">&nbsp;</span>
867
878
  <span class="cline-any cline-no">&nbsp;</span>
868
879
  <span class="cline-any cline-no">&nbsp;</span>
880
+ <span class="cline-any cline-no">&nbsp;</span>
869
881
  <span class="cline-any cline-neutral">&nbsp;</span>
870
882
  <span class="cline-any cline-neutral">&nbsp;</span>
871
883
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -875,6 +887,12 @@
875
887
  <span class="cline-any cline-no">&nbsp;</span>
876
888
  <span class="cline-any cline-neutral">&nbsp;</span>
877
889
  <span class="cline-any cline-no">&nbsp;</span>
890
+ <span class="cline-any cline-no">&nbsp;</span>
891
+ <span class="cline-any cline-no">&nbsp;</span>
892
+ <span class="cline-any cline-neutral">&nbsp;</span>
893
+ <span class="cline-any cline-neutral">&nbsp;</span>
894
+ <span class="cline-any cline-no">&nbsp;</span>
895
+ <span class="cline-any cline-no">&nbsp;</span>
878
896
  <span class="cline-any cline-neutral">&nbsp;</span>
879
897
  <span class="cline-any cline-neutral">&nbsp;</span>
880
898
  <span class="cline-any cline-yes">40x</span>
@@ -966,6 +984,8 @@ const {
966
984
  const { cloneDeep } = require("lodash/fp")
967
985
  const { getAppDB } = require("@budibase/backend-core/context")
968
986
  const { finaliseRow, updateRelatedFormula } = require("./staticFormula")
987
+ const exporters = require("../view/exporters")
988
+ const { apiFileReturn } = require("../../../utilities/fileSystem")
969
989
  &nbsp;
970
990
  const CALCULATION_TYPES = {
971
991
  SUM: "sum",
@@ -1305,6 +1325,7 @@ exports.exportRows = <span class="fstat-no" title="function not covered" >as</sp
1305
1325
  const db = <span class="cstat-no" title="statement not covered" >getAppDB()</span>
1306
1326
  const table = <span class="cstat-no" title="statement not covered" >await db.get(ctx.params.tableId)</span>
1307
1327
  const rowIds = <span class="cstat-no" title="statement not covered" >ctx.request.body.rows</span>
1328
+ let format = <span class="cstat-no" title="statement not covered" >ctx.query.format</span>
1308
1329
  let response = <span class="cstat-no" title="statement not covered" >(</span>
1309
1330
  await db.allDocs({
1310
1331
  include_docs: true,
@@ -1314,7 +1335,13 @@ exports.exportRows = <span class="fstat-no" title="function not covered" >as</sp
1314
1335
  &nbsp;
1315
1336
  let rows = <span class="cstat-no" title="statement not covered" >await outputProcessing(table, response)</span>
1316
1337
  &nbsp;
1317
- <span class="cstat-no" title="statement not covered" > return rows</span>
1338
+ let headers = <span class="cstat-no" title="statement not covered" >Object.keys(rows[0])</span>
1339
+ const exporter = <span class="cstat-no" title="statement not covered" >exporters[format]</span>
1340
+ const filename = <span class="cstat-no" title="statement not covered" >`export.${format}`</span>
1341
+ &nbsp;
1342
+ // send down the file
1343
+ <span class="cstat-no" title="statement not covered" > ctx.attachment(filename)</span>
1344
+ <span class="cstat-no" title="statement not covered" > return apiFileReturn(exporter(headers, rows))</span>
1318
1345
  }
1319
1346
  &nbsp;
1320
1347
  exports.fetchEnrichedRow = async ctx =&gt; {
@@ -1384,7 +1411,7 @@ exports.fetchEnrichedRow = async ctx =&gt; {
1384
1411
  <div class='footer quiet pad2 space-top1 center small'>
1385
1412
  Code coverage generated by
1386
1413
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
1387
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
1414
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
1388
1415
  </div>
1389
1416
  </div>
1390
1417
  <script src="../../../prettify.js"></script>
@@ -1249,7 +1249,7 @@ exports.fullSearch = async (query, params) =&gt; {
1249
1249
  <div class='footer quiet pad2 space-top1 center small'>
1250
1250
  Code coverage generated by
1251
1251
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
1252
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
1252
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
1253
1253
  </div>
1254
1254
  </div>
1255
1255
  <script src="../../../prettify.js"></script>
@@ -532,7 +532,7 @@ exports.finaliseRow = async (
532
532
  <div class='footer quiet pad2 space-top1 center small'>
533
533
  Code coverage generated by
534
534
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
535
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
535
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
536
536
  </div>
537
537
  </div>
538
538
  <script src="../../../prettify.js"></script>
@@ -331,7 +331,7 @@ exports.validate = async ({ tableId, row, table }) =&gt; {
331
331
  <div class='footer quiet pad2 space-top1 center small'>
332
332
  Code coverage generated by
333
333
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
334
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
334
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
335
335
  </div>
336
336
  </div>
337
337
  <script src="../../../prettify.js"></script>
@@ -202,7 +202,7 @@ exports.destroy = async ctx =&gt; {
202
202
  <div class='footer quiet pad2 space-top1 center small'>
203
203
  Code coverage generated by
204
204
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
205
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
205
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
206
206
  </div>
207
207
  </div>
208
208
  <script src="../../prettify.js"></script>
@@ -97,7 +97,7 @@ exports.save = <span class="fstat-no" title="function not covered" >as</span>ync
97
97
  <div class='footer quiet pad2 space-top1 center small'>
98
98
  Code coverage generated by
99
99
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
100
- at Tue Mar 15 2022 11:26:39 GMT+0000 (Coordinated Universal Time)
100
+ at Wed Mar 16 2022 11:37:01 GMT+0000 (Coordinated Universal Time)
101
101
  </div>
102
102
  </div>
103
103
  <script src="../../prettify.js"></script>