@budibase/server 1.0.25 → 1.0.27-alpha.10

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 (255) hide show
  1. package/__mocks__/node-fetch.ts +21 -0
  2. package/builder/assets/bb-spaceship.8f6e81e1.svg +227 -0
  3. package/builder/assets/{index.4fb3f887.css → index.0dce895b.css} +1 -1
  4. package/builder/assets/index.39751e34.js +1348 -0
  5. package/builder/assets/{vendor.470042a4.js → vendor.f9faf6ab.js} +88 -88
  6. package/builder/index.html +3 -3
  7. package/coverage/clover.xml +1263 -1036
  8. package/coverage/coverage-final.json +36 -35
  9. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/application.js.html +54 -54
  12. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/automation.js.html +22 -10
  14. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  17. package/coverage/lcov-report/api/controllers/datasource.js.html +62 -62
  18. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/hosting.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/index.html +39 -54
  21. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/query/index.html +126 -0
  26. package/coverage/lcov-report/api/controllers/{query.js.html → query/index.js.html} +225 -114
  27. package/coverage/lcov-report/api/controllers/query/validation.js.html +206 -0
  28. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/index.html +22 -22
  32. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/row/internal.js.html +38 -11
  34. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +7 -4
  35. package/coverage/lcov-report/api/controllers/row/utils.js.html +29 -20
  36. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/user.js.html +108 -9
  45. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  49. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/webhook.js.html +18 -6
  51. package/coverage/lcov-report/api/index.html +1 -1
  52. package/coverage/lcov-report/api/index.js.html +5 -5
  53. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/index.html +9 -9
  66. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/query.js.html +19 -85
  72. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/user.js.html +32 -2
  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 +20 -20
  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 +31 -7
  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 +11 -11
  97. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +5 -8
  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 +48 -15
  116. package/coverage/lcov-report/constants/index.html +1 -1
  117. package/coverage/lcov-report/constants/index.js.html +22 -22
  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 +18 -18
  121. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  122. package/coverage/lcov-report/db/index.html +15 -15
  123. package/coverage/lcov-report/db/index.js.html +3 -3
  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 +4 -4
  129. package/coverage/lcov-report/db/utils.js.html +107 -80
  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 +99 -84
  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 +10 -10
  139. package/coverage/lcov-report/middleware/builder.js.html +8 -8
  140. package/coverage/lcov-report/middleware/currentapp.js.html +28 -28
  141. package/coverage/lcov-report/middleware/index.html +1 -1
  142. package/coverage/lcov-report/middleware/joi-validator.js.html +11 -11
  143. package/coverage/lcov-report/middleware/resourceId.js.html +17 -17
  144. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  145. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  146. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  147. package/coverage/lcov-report/threads/automation.js.html +1 -1
  148. package/coverage/lcov-report/threads/index.html +31 -31
  149. package/coverage/lcov-report/threads/index.js.html +11 -11
  150. package/coverage/lcov-report/threads/query.js.html +394 -67
  151. package/coverage/lcov-report/threads/utils.js.html +356 -11
  152. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  153. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  154. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  155. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  156. package/coverage/lcov-report/utilities/global.js.html +13 -13
  157. package/coverage/lcov-report/utilities/index.html +19 -19
  158. package/coverage/lcov-report/utilities/index.js.html +68 -35
  159. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  160. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  161. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  162. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  163. package/coverage/lcov-report/utilities/rowProcessor/index.html +19 -19
  164. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +235 -10
  165. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  166. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  167. package/coverage/lcov-report/utilities/security.js.html +2 -2
  168. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  169. package/coverage/lcov-report/utilities/users.js.html +1 -1
  170. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  171. package/coverage/lcov.info +2117 -1728
  172. package/dist/api/controllers/automation.js +7 -5
  173. package/dist/api/controllers/query/import/index.js +79 -0
  174. package/dist/api/controllers/query/import/sources/base/index.js +64 -0
  175. package/dist/api/controllers/query/import/sources/base/openapi.js +42 -0
  176. package/dist/api/controllers/query/import/sources/curl.js +96 -0
  177. package/dist/api/controllers/query/import/sources/openapi2.js +142 -0
  178. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  179. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  180. package/dist/api/controllers/{query.js → query/index.js} +86 -52
  181. package/dist/api/controllers/query/validation.js +38 -0
  182. package/dist/api/controllers/row/internal.js +14 -6
  183. package/dist/api/controllers/row/internalSearch.js +2 -1
  184. package/dist/api/controllers/row/utils.js +13 -6
  185. package/dist/api/controllers/user.js +37 -1
  186. package/dist/api/controllers/webhook.js +4 -0
  187. package/dist/api/routes/query.js +5 -33
  188. package/dist/api/routes/user.js +3 -1
  189. package/dist/automations/steps/executeQuery.js +8 -1
  190. package/dist/automations/steps/outgoingWebhook.js +2 -3
  191. package/dist/automations/utils.js +10 -0
  192. package/dist/db/utils.js +8 -0
  193. package/dist/definitions/datasource.js +6 -1
  194. package/dist/integrations/base/sqlTable.js +1 -1
  195. package/dist/integrations/rest.js +207 -117
  196. package/dist/package.json +11 -4
  197. package/dist/tests/utilities/TestConfiguration.js +7 -0
  198. package/dist/threads/query.js +148 -40
  199. package/dist/threads/utils.js +105 -0
  200. package/dist/tsconfig.tsbuildinfo +1 -1
  201. package/dist/utilities/fileSystem/utilities.js +2 -1
  202. package/dist/utilities/index.js +10 -0
  203. package/dist/utilities/rowProcessor/index.js +76 -0
  204. package/package.json +12 -5
  205. package/src/api/controllers/automation.js +8 -4
  206. package/src/api/controllers/query/import/index.ts +85 -0
  207. package/src/api/controllers/query/import/sources/base/index.ts +87 -0
  208. package/src/api/controllers/query/import/sources/base/openapi.ts +24 -0
  209. package/src/api/controllers/query/import/sources/curl.ts +102 -0
  210. package/src/api/controllers/query/import/sources/openapi2.ts +163 -0
  211. package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +103 -0
  212. package/src/api/controllers/query/import/sources/tests/curl/data/delete.txt +1 -0
  213. package/src/api/controllers/query/import/sources/tests/curl/data/empty-body.txt +2 -0
  214. package/src/api/controllers/query/import/sources/tests/curl/data/get.txt +1 -0
  215. package/src/api/controllers/query/import/sources/tests/curl/data/headers.txt +3 -0
  216. package/src/api/controllers/query/import/sources/tests/curl/data/patch.txt +2 -0
  217. package/src/api/controllers/query/import/sources/tests/curl/data/path.txt +1 -0
  218. package/src/api/controllers/query/import/sources/tests/curl/data/post.txt +2 -0
  219. package/src/api/controllers/query/import/sources/tests/curl/data/put.txt +2 -0
  220. package/src/api/controllers/query/import/sources/tests/curl/data/query.txt +1 -0
  221. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  222. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.yaml +160 -0
  223. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  224. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.yaml +711 -0
  225. package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +238 -0
  226. package/src/api/controllers/query/import/tests/index.spec.js +109 -0
  227. package/src/api/controllers/query/index.js +195 -0
  228. package/src/api/controllers/query/validation.js +42 -0
  229. package/src/api/controllers/row/internal.js +14 -5
  230. package/src/api/controllers/row/internalSearch.js +2 -1
  231. package/src/api/controllers/row/utils.js +11 -8
  232. package/src/api/controllers/user.js +33 -0
  233. package/src/api/controllers/webhook.js +4 -0
  234. package/src/api/routes/query.js +13 -35
  235. package/src/api/routes/tests/query.spec.js +88 -0
  236. package/src/api/routes/user.js +10 -0
  237. package/src/automations/steps/executeQuery.js +9 -1
  238. package/src/automations/steps/outgoingWebhook.js +2 -3
  239. package/src/automations/utils.js +11 -0
  240. package/src/db/utils.js +9 -0
  241. package/src/definitions/common.ts +2 -16
  242. package/src/definitions/datasource.ts +83 -1
  243. package/src/integrations/base/IntegrationBase.ts +4 -4
  244. package/src/integrations/base/sqlTable.ts +1 -1
  245. package/src/integrations/oracle.ts +1 -1
  246. package/src/integrations/rest.ts +230 -137
  247. package/src/integrations/tests/rest.spec.js +167 -19
  248. package/src/tests/utilities/TestConfiguration.js +10 -0
  249. package/src/threads/query.js +149 -40
  250. package/src/threads/utils.js +115 -0
  251. package/src/utilities/fileSystem/utilities.js +2 -0
  252. package/src/utilities/index.js +11 -0
  253. package/src/utilities/rowProcessor/index.js +75 -0
  254. package/builder/assets/index.f01106f0.js +0 -1316
  255. package/src/api/controllers/query.js +0 -158
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">76.47% </span>
26
+ <span class="strong">59.52% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>65/85</span>
28
+ <span class='fraction'>75/126</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">58.57% </span>
33
+ <span class="strong">45.74% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>41/70</span>
35
+ <span class='fraction'>43/94</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">90% </span>
40
+ <span class="strong">52.63% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>9/10</span>
42
+ <span class='fraction'>10/19</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">76.19% </span>
47
+ <span class="strong">61.66% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>64/84</span>
49
+ <span class='fraction'>74/120</span>
50
50
  </div>
51
51
 
52
52
 
@@ -319,7 +319,86 @@
319
319
  <a name='L260'></a><a href='#L260'>260</a>
320
320
  <a name='L261'></a><a href='#L261'>261</a>
321
321
  <a name='L262'></a><a href='#L262'>262</a>
322
- <a name='L263'></a><a href='#L263'>263</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
322
+ <a name='L263'></a><a href='#L263'>263</a>
323
+ <a name='L264'></a><a href='#L264'>264</a>
324
+ <a name='L265'></a><a href='#L265'>265</a>
325
+ <a name='L266'></a><a href='#L266'>266</a>
326
+ <a name='L267'></a><a href='#L267'>267</a>
327
+ <a name='L268'></a><a href='#L268'>268</a>
328
+ <a name='L269'></a><a href='#L269'>269</a>
329
+ <a name='L270'></a><a href='#L270'>270</a>
330
+ <a name='L271'></a><a href='#L271'>271</a>
331
+ <a name='L272'></a><a href='#L272'>272</a>
332
+ <a name='L273'></a><a href='#L273'>273</a>
333
+ <a name='L274'></a><a href='#L274'>274</a>
334
+ <a name='L275'></a><a href='#L275'>275</a>
335
+ <a name='L276'></a><a href='#L276'>276</a>
336
+ <a name='L277'></a><a href='#L277'>277</a>
337
+ <a name='L278'></a><a href='#L278'>278</a>
338
+ <a name='L279'></a><a href='#L279'>279</a>
339
+ <a name='L280'></a><a href='#L280'>280</a>
340
+ <a name='L281'></a><a href='#L281'>281</a>
341
+ <a name='L282'></a><a href='#L282'>282</a>
342
+ <a name='L283'></a><a href='#L283'>283</a>
343
+ <a name='L284'></a><a href='#L284'>284</a>
344
+ <a name='L285'></a><a href='#L285'>285</a>
345
+ <a name='L286'></a><a href='#L286'>286</a>
346
+ <a name='L287'></a><a href='#L287'>287</a>
347
+ <a name='L288'></a><a href='#L288'>288</a>
348
+ <a name='L289'></a><a href='#L289'>289</a>
349
+ <a name='L290'></a><a href='#L290'>290</a>
350
+ <a name='L291'></a><a href='#L291'>291</a>
351
+ <a name='L292'></a><a href='#L292'>292</a>
352
+ <a name='L293'></a><a href='#L293'>293</a>
353
+ <a name='L294'></a><a href='#L294'>294</a>
354
+ <a name='L295'></a><a href='#L295'>295</a>
355
+ <a name='L296'></a><a href='#L296'>296</a>
356
+ <a name='L297'></a><a href='#L297'>297</a>
357
+ <a name='L298'></a><a href='#L298'>298</a>
358
+ <a name='L299'></a><a href='#L299'>299</a>
359
+ <a name='L300'></a><a href='#L300'>300</a>
360
+ <a name='L301'></a><a href='#L301'>301</a>
361
+ <a name='L302'></a><a href='#L302'>302</a>
362
+ <a name='L303'></a><a href='#L303'>303</a>
363
+ <a name='L304'></a><a href='#L304'>304</a>
364
+ <a name='L305'></a><a href='#L305'>305</a>
365
+ <a name='L306'></a><a href='#L306'>306</a>
366
+ <a name='L307'></a><a href='#L307'>307</a>
367
+ <a name='L308'></a><a href='#L308'>308</a>
368
+ <a name='L309'></a><a href='#L309'>309</a>
369
+ <a name='L310'></a><a href='#L310'>310</a>
370
+ <a name='L311'></a><a href='#L311'>311</a>
371
+ <a name='L312'></a><a href='#L312'>312</a>
372
+ <a name='L313'></a><a href='#L313'>313</a>
373
+ <a name='L314'></a><a href='#L314'>314</a>
374
+ <a name='L315'></a><a href='#L315'>315</a>
375
+ <a name='L316'></a><a href='#L316'>316</a>
376
+ <a name='L317'></a><a href='#L317'>317</a>
377
+ <a name='L318'></a><a href='#L318'>318</a>
378
+ <a name='L319'></a><a href='#L319'>319</a>
379
+ <a name='L320'></a><a href='#L320'>320</a>
380
+ <a name='L321'></a><a href='#L321'>321</a>
381
+ <a name='L322'></a><a href='#L322'>322</a>
382
+ <a name='L323'></a><a href='#L323'>323</a>
383
+ <a name='L324'></a><a href='#L324'>324</a>
384
+ <a name='L325'></a><a href='#L325'>325</a>
385
+ <a name='L326'></a><a href='#L326'>326</a>
386
+ <a name='L327'></a><a href='#L327'>327</a>
387
+ <a name='L328'></a><a href='#L328'>328</a>
388
+ <a name='L329'></a><a href='#L329'>329</a>
389
+ <a name='L330'></a><a href='#L330'>330</a>
390
+ <a name='L331'></a><a href='#L331'>331</a>
391
+ <a name='L332'></a><a href='#L332'>332</a>
392
+ <a name='L333'></a><a href='#L333'>333</a>
393
+ <a name='L334'></a><a href='#L334'>334</a>
394
+ <a name='L335'></a><a href='#L335'>335</a>
395
+ <a name='L336'></a><a href='#L336'>336</a>
396
+ <a name='L337'></a><a href='#L337'>337</a>
397
+ <a name='L338'></a><a href='#L338'>338</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
398
+ <span class="cline-any cline-yes">34x</span>
399
+ <span class="cline-any cline-yes">34x</span>
400
+ <span class="cline-any cline-yes">34x</span>
401
+ <span class="cline-any cline-yes">34x</span>
323
402
  <span class="cline-any cline-yes">34x</span>
324
403
  <span class="cline-any cline-yes">34x</span>
325
404
  <span class="cline-any cline-yes">34x</span>
@@ -404,6 +483,35 @@
404
483
  <span class="cline-any cline-neutral">&nbsp;</span>
405
484
  <span class="cline-any cline-neutral">&nbsp;</span>
406
485
  <span class="cline-any cline-neutral">&nbsp;</span>
486
+ <span class="cline-any cline-no">&nbsp;</span>
487
+ <span class="cline-any cline-no">&nbsp;</span>
488
+ <span class="cline-any cline-no">&nbsp;</span>
489
+ <span class="cline-any cline-neutral">&nbsp;</span>
490
+ <span class="cline-any cline-no">&nbsp;</span>
491
+ <span class="cline-any cline-neutral">&nbsp;</span>
492
+ <span class="cline-any cline-no">&nbsp;</span>
493
+ <span class="cline-any cline-neutral">&nbsp;</span>
494
+ <span class="cline-any cline-neutral">&nbsp;</span>
495
+ <span class="cline-any cline-neutral">&nbsp;</span>
496
+ <span class="cline-any cline-neutral">&nbsp;</span>
497
+ <span class="cline-any cline-neutral">&nbsp;</span>
498
+ <span class="cline-any cline-neutral">&nbsp;</span>
499
+ <span class="cline-any cline-neutral">&nbsp;</span>
500
+ <span class="cline-any cline-neutral">&nbsp;</span>
501
+ <span class="cline-any cline-neutral">&nbsp;</span>
502
+ <span class="cline-any cline-neutral">&nbsp;</span>
503
+ <span class="cline-any cline-no">&nbsp;</span>
504
+ <span class="cline-any cline-no">&nbsp;</span>
505
+ <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-no">&nbsp;</span>
507
+ <span class="cline-any cline-neutral">&nbsp;</span>
508
+ <span class="cline-any cline-no">&nbsp;</span>
509
+ <span class="cline-any cline-no">&nbsp;</span>
510
+ <span class="cline-any cline-neutral">&nbsp;</span>
511
+ <span class="cline-any cline-no">&nbsp;</span>
512
+ <span class="cline-any cline-no">&nbsp;</span>
513
+ <span class="cline-any cline-neutral">&nbsp;</span>
514
+ <span class="cline-any cline-neutral">&nbsp;</span>
407
515
  <span class="cline-any cline-neutral">&nbsp;</span>
408
516
  <span class="cline-any cline-neutral">&nbsp;</span>
409
517
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -581,11 +689,57 @@
581
689
  <span class="cline-any cline-neutral">&nbsp;</span>
582
690
  <span class="cline-any cline-yes">100x</span>
583
691
  <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-neutral">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-yes">34x</span>
703
+ <span class="cline-any cline-yes">8x</span>
704
+ <span class="cline-any cline-yes">8x</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-yes">8x</span>
707
+ <span class="cline-any cline-yes">8x</span>
708
+ <span class="cline-any cline-yes">8x</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-neutral">&nbsp;</span>
711
+ <span class="cline-any cline-no">&nbsp;</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-no">&nbsp;</span>
714
+ <span class="cline-any cline-no">&nbsp;</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-no">&nbsp;</span>
718
+ <span class="cline-any cline-no">&nbsp;</span>
719
+ <span class="cline-any cline-no">&nbsp;</span>
720
+ <span class="cline-any cline-neutral">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-no">&nbsp;</span>
723
+ <span class="cline-any cline-no">&nbsp;</span>
724
+ <span class="cline-any cline-no">&nbsp;</span>
725
+ <span class="cline-any cline-no">&nbsp;</span>
726
+ <span class="cline-any cline-no">&nbsp;</span>
727
+ <span class="cline-any cline-no">&nbsp;</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
+ <span class="cline-any cline-neutral">&nbsp;</span>
730
+ <span class="cline-any cline-no">&nbsp;</span>
731
+ <span class="cline-any cline-no">&nbsp;</span>
732
+ <span class="cline-any cline-neutral">&nbsp;</span>
733
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
734
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const linkRows = require("../../db/linkedRows")
585
735
  const { cloneDeep } = require("lodash/fp")
586
736
  const { FieldTypes, AutoFieldSubTypes } = require("../../constants")
587
737
  const { attachmentsRelativeURL } = require("../index")
588
738
  const { processFormulas } = require("./utils")
739
+ const { deleteFiles } = require("../../utilities/fileSystem/utilities")
740
+ const { ObjectStoreBuckets } = require("../../constants")
741
+ const { isProdAppID, getDeployedAppID, dbExists } = require("@budibase/auth/db")
742
+ const CouchDB = require("../../db")
589
743
  &nbsp;
590
744
  const BASE_AUTO_ID = 1
591
745
  &nbsp;
@@ -664,6 +818,35 @@ const TYPE_TRANSFORM_MAP = {
664
818
  [FieldTypes.AUTO]: {
665
819
  parse: <span class="fstat-no" title="function not covered" >()</span> =&gt; <span class="cstat-no" title="statement not covered" >undefined,</span>
666
820
  },
821
+ [FieldTypes.JSON]: {
822
+ parse: <span class="fstat-no" title="function not covered" >in</span>put =&gt; {
823
+ <span class="cstat-no" title="statement not covered" > try {</span>
824
+ <span class="cstat-no" title="statement not covered" > if (input === "") {</span>
825
+ <span class="cstat-no" title="statement not covered" > return undefined</span>
826
+ }
827
+ <span class="cstat-no" title="statement not covered" > return JSON.parse(input)</span>
828
+ } catch (err) {
829
+ <span class="cstat-no" title="statement not covered" > return input</span>
830
+ }
831
+ },
832
+ },
833
+ }
834
+ &nbsp;
835
+ /**
836
+ * Given the old state of the row and the new one after an update, this will
837
+ * find the keys that have been removed in the updated row.
838
+ */
839
+ function <span class="fstat-no" title="function not covered" >getRemovedAttachmentKeys(</span>oldRow, row, attachmentKey) {
840
+ <span class="cstat-no" title="statement not covered" > if (!oldRow[attachmentKey]) {</span>
841
+ <span class="cstat-no" title="statement not covered" > return []</span>
842
+ }
843
+ const oldKeys = <span class="cstat-no" title="statement not covered" >oldRow[attachmentKey].map(<span class="fstat-no" title="function not covered" >at</span>tachment =&gt; <span class="cstat-no" title="statement not covered" >attachment.key)</span></span>
844
+ // no attachments in new row, all removed
845
+ <span class="cstat-no" title="statement not covered" > if (!row[attachmentKey]) {</span>
846
+ <span class="cstat-no" title="statement not covered" > return oldKeys</span>
847
+ }
848
+ const newKeys = <span class="cstat-no" title="statement not covered" >row[attachmentKey].map(<span class="fstat-no" title="function not covered" >at</span>tachment =&gt; <span class="cstat-no" title="statement not covered" >attachment.key)</span></span>
849
+ <span class="cstat-no" title="statement not covered" > return oldKeys.filter(<span class="fstat-no" title="function not covered" >ke</span>y =&gt; <span class="cstat-no" title="statement not covered" >newKeys.indexOf(key) === -1)</span></span>
667
850
  }
668
851
  &nbsp;
669
852
  /**
@@ -843,6 +1026,48 @@ exports.outputProcessing = async (
843
1026
  }
844
1027
  return wasArray ? enriched : enriched[0]
845
1028
  }
1029
+ &nbsp;
1030
+ /**
1031
+ * Clean up any attachments that were attached to a row.
1032
+ * @param {string} appId The ID of the app from which a row is being deleted.
1033
+ * @param {object} table The table from which a row is being removed.
1034
+ * @param {any} row optional - the row being removed.
1035
+ * @param {any} rows optional - if multiple rows being deleted can do this in bulk.
1036
+ * @param {any} oldRow optional - if updating a row this will determine the difference.
1037
+ * @return {Promise&lt;void&gt;} When all attachments have been removed this will return.
1038
+ */
1039
+ exports.cleanupAttachments = async (appId, table, { row, rows, oldRow }) =&gt; {
1040
+ if (!isProdAppID(appId)) {
1041
+ const prodAppId = getDeployedAppID(appId)
1042
+ // if prod exists, then don't allow deleting
1043
+ const exists = await dbExists(CouchDB, prodAppId)
1044
+ if (exists) {
1045
+ return
1046
+ }
1047
+ }
1048
+ let files = <span class="cstat-no" title="statement not covered" >[]</span>
1049
+ function <span class="fstat-no" title="function not covered" >addFiles(</span>row, key) {
1050
+ <span class="cstat-no" title="statement not covered" > if (row[key]) {</span>
1051
+ <span class="cstat-no" title="statement not covered" > files = files.concat(row[key].map(<span class="fstat-no" title="function not covered" >at</span>tachment =&gt; <span class="cstat-no" title="statement not covered" >attachment.key)</span>)</span>
1052
+ }
1053
+ }
1054
+ <span class="cstat-no" title="statement not covered" > for (let [key, schema] of Object.entries(table.schema)) {</span>
1055
+ <span class="cstat-no" title="statement not covered" > if (schema.type !== FieldTypes.ATTACHMENT) {</span>
1056
+ <span class="cstat-no" title="statement not covered" > continue</span>
1057
+ }
1058
+ // if updating, need to manage the differences
1059
+ <span class="cstat-no" title="statement not covered" > if (oldRow &amp;&amp; row) {</span>
1060
+ <span class="cstat-no" title="statement not covered" > files = files.concat(getRemovedAttachmentKeys(oldRow, row, key))</span>
1061
+ } else <span class="cstat-no" title="statement not covered" >if (row) {</span>
1062
+ <span class="cstat-no" title="statement not covered" > addFiles(row, key)</span>
1063
+ } else <span class="cstat-no" title="statement not covered" >if (rows) {</span>
1064
+ <span class="cstat-no" title="statement not covered" > rows.forEach(<span class="fstat-no" title="function not covered" >ro</span>w =&gt; <span class="cstat-no" title="statement not covered" >addFiles(row, key))</span></span>
1065
+ }
1066
+ }
1067
+ <span class="cstat-no" title="statement not covered" > if (files.length &gt; 0) {</span>
1068
+ <span class="cstat-no" title="statement not covered" > return deleteFiles(ObjectStoreBuckets.APPS, files)</span>
1069
+ }
1070
+ }
846
1071
  &nbsp;</pre></td></tr></table></pre>
847
1072
 
848
1073
  <div class='push'></div><!-- for sticky footer -->
@@ -850,7 +1075,7 @@ exports.outputProcessing = async (
850
1075
  <div class='footer quiet pad2 space-top1 center small'>
851
1076
  Code coverage generated by
852
1077
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
853
- at Thu Dec 16 2021 18:30:12 GMT+0000 (Coordinated Universal Time)
1078
+ at Tue Jan 11 2022 13:49:36 GMT+0000 (Coordinated Universal Time)
854
1079
  </div>
855
1080
  </div>
856
1081
  <script src="../../prettify.js"></script>
@@ -133,7 +133,7 @@ exports.processFormulas = (table, rows) =&gt; {
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">istanbul</a>
136
- at Thu Dec 16 2021 18:30:12 GMT+0000 (Coordinated Universal Time)
136
+ at Tue Jan 11 2022 13:49:36 GMT+0000 (Coordinated Universal Time)
137
137
  </div>
138
138
  </div>
139
139
  <script src="../../prettify.js"></script>
@@ -136,7 +136,7 @@ module.exports = ScriptRunner
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">istanbul</a>
139
- at Thu Dec 16 2021 18:30:12 GMT+0000 (Coordinated Universal Time)
139
+ at Tue Jan 11 2022 13:49:36 GMT+0000 (Coordinated Universal Time)
140
140
  </div>
141
141
  </div>
142
142
  <script src="../prettify.js"></script>
@@ -140,7 +140,7 @@
140
140
  <span class="cline-any cline-neutral">&nbsp;</span>
141
141
  <span class="cline-any cline-yes">33x</span>
142
142
  <span class="cline-any cline-yes">4x</span>
143
- <span class="cline-any cline-yes">80x</span>
143
+ <span class="cline-any cline-yes">84x</span>
144
144
  <span class="cline-any cline-neutral">&nbsp;</span>
145
145
  <span class="cline-any cline-yes">4x</span>
146
146
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -265,7 +265,7 @@ exports.CURRENTLY_SUPPORTED_LEVELS = CURRENTLY_SUPPORTED_LEVELS
265
265
  <div class='footer quiet pad2 space-top1 center small'>
266
266
  Code coverage generated by
267
267
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
268
- at Thu Dec 16 2021 18:30:12 GMT+0000 (Coordinated Universal Time)
268
+ at Tue Jan 11 2022 13:49:36 GMT+0000 (Coordinated Universal Time)
269
269
  </div>
270
270
  </div>
271
271
  <script src="../prettify.js"></script>
@@ -85,7 +85,7 @@
85
85
  <div class='footer quiet pad2 space-top1 center small'>
86
86
  Code coverage generated by
87
87
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
88
- at Thu Dec 16 2021 18:30:12 GMT+0000 (Coordinated Universal Time)
88
+ at Tue Jan 11 2022 13:49:36 GMT+0000 (Coordinated Universal Time)
89
89
  </div>
90
90
  </div>
91
91
  <script src="../prettify.js"></script>
@@ -136,7 +136,7 @@ exports.getFullUser = async (ctx, userId) =&gt; {
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">istanbul</a>
139
- at Thu Dec 16 2021 18:30:12 GMT+0000 (Coordinated Universal Time)
139
+ at Tue Jan 11 2022 13:49:36 GMT+0000 (Coordinated Universal Time)
140
140
  </div>
141
141
  </div>
142
142
  <script src="../prettify.js"></script>
@@ -403,7 +403,7 @@ exports.removeAppFromUserRoles = async (ctx, appId) =&gt; {
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 Thu Dec 16 2021 18:30:12 GMT+0000 (Coordinated Universal Time)
406
+ at Tue Jan 11 2022 13:49:36 GMT+0000 (Coordinated Universal Time)
407
407
  </div>
408
408
  </div>
409
409
  <script src="../prettify.js"></script>