@budibase/server 0.9.186 → 0.9.190-alpha.0

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 (309) hide show
  1. package/Dockerfile +7 -1
  2. package/LICENSE +1 -1
  3. package/__mocks__/mssql.ts +1 -1
  4. package/__mocks__/oracledb.ts +31 -0
  5. package/__mocks__/pg.ts +3 -0
  6. package/builder/assets/bb-space-man.5be51a45.svg +290 -0
  7. package/builder/assets/index.43f4c913.js +1316 -0
  8. package/builder/assets/index.7d405e74.css +1 -0
  9. package/builder/assets/oracle.66592424.png +0 -0
  10. package/builder/assets/vendor.470042a4.js +152 -0
  11. package/builder/assets/vendor.5e1fe644.css +1 -0
  12. package/builder/index.html +4 -4
  13. package/coverage/clover.xml +1520 -1087
  14. package/coverage/coverage-final.json +93 -89
  15. package/coverage/lcov-report/api/controllers/analytics.js.html +2 -2
  16. package/coverage/lcov-report/api/controllers/apikeys.js.html +2 -2
  17. package/coverage/lcov-report/api/controllers/application.js.html +64 -13
  18. package/coverage/lcov-report/api/controllers/auth.js.html +19 -10
  19. package/coverage/lcov-report/api/controllers/automation.js.html +3 -3
  20. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  23. package/coverage/lcov-report/api/controllers/datasource.js.html +232 -28
  24. package/coverage/lcov-report/api/controllers/dev.js.html +16 -7
  25. package/coverage/lcov-report/api/controllers/hosting.js.html +10 -10
  26. package/coverage/lcov-report/api/controllers/index.html +91 -91
  27. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/layout.js.html +3 -3
  29. package/coverage/lcov-report/api/controllers/metadata.js.html +3 -3
  30. package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
  31. package/coverage/lcov-report/api/controllers/query.js.html +53 -209
  32. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  33. package/coverage/lcov-report/api/controllers/routing.js.html +3 -3
  34. package/coverage/lcov-report/api/controllers/row/external.js.html +17 -8
  35. package/coverage/lcov-report/api/controllers/row/index.html +26 -26
  36. package/coverage/lcov-report/api/controllers/row/index.js.html +2 -2
  37. package/coverage/lcov-report/api/controllers/row/internal.js.html +9 -9
  38. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +2 -2
  39. package/coverage/lcov-report/api/controllers/row/utils.js.html +21 -30
  40. package/coverage/lcov-report/api/controllers/screen.js.html +2 -2
  41. package/coverage/lcov-report/api/controllers/script.js.html +3 -3
  42. package/coverage/lcov-report/api/controllers/table/external.js.html +1001 -0
  43. package/coverage/lcov-report/api/controllers/table/index.html +56 -26
  44. package/coverage/lcov-report/api/controllers/table/index.js.html +80 -350
  45. package/coverage/lcov-report/api/controllers/table/internal.js.html +545 -0
  46. package/coverage/lcov-report/api/controllers/table/utils.js.html +175 -52
  47. package/coverage/lcov-report/api/controllers/templates.js.html +4 -4
  48. package/coverage/lcov-report/api/controllers/user.js.html +390 -33
  49. package/coverage/lcov-report/api/controllers/view/exporters.js.html +19 -4
  50. package/coverage/lcov-report/api/controllers/view/index.html +22 -22
  51. package/coverage/lcov-report/api/controllers/view/index.js.html +52 -13
  52. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  53. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +3 -3
  54. package/coverage/lcov-report/api/controllers/webhook.js.html +4 -4
  55. package/coverage/lcov-report/api/index.html +1 -1
  56. package/coverage/lcov-report/api/index.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/dev.js.html +2 -2
  68. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/index.html +4 -4
  70. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/query.js.html +5 -2
  76. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/static.js.html +2 -2
  82. package/coverage/lcov-report/api/routes/table.js.html +35 -2
  83. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  84. package/coverage/lcov-report/api/routes/user.js.html +17 -2
  85. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  86. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  87. package/coverage/lcov-report/automations/actions.js.html +2 -2
  88. package/coverage/lcov-report/automations/automationUtils.js.html +4 -4
  89. package/coverage/lcov-report/automations/bullboard.js.html +71 -20
  90. package/coverage/lcov-report/automations/index.html +35 -50
  91. package/coverage/lcov-report/automations/index.js.html +2 -2
  92. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/discord.js.html +3 -3
  97. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/executeScript.js.html +3 -3
  99. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/index.html +14 -14
  101. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +3 -3
  103. package/coverage/lcov-report/automations/steps/queryRows.js.html +3 -3
  104. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  106. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  107. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  108. package/coverage/lcov-report/automations/steps/utils.js.html +7 -7
  109. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  111. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  112. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  114. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  115. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  116. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  118. package/coverage/lcov-report/automations/triggers.js.html +22 -10
  119. package/coverage/lcov-report/automations/utils.js.html +42 -12
  120. package/coverage/lcov-report/constants/index.html +5 -5
  121. package/coverage/lcov-report/constants/index.js.html +87 -21
  122. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  123. package/coverage/lcov-report/constants/screens.js.html +1 -1
  124. package/coverage/lcov-report/db/client.js.html +2 -2
  125. package/coverage/lcov-report/db/inMemoryView.js.html +2 -2
  126. package/coverage/lcov-report/db/index.html +2 -2
  127. package/coverage/lcov-report/db/index.js.html +1 -1
  128. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +6 -6
  129. package/coverage/lcov-report/db/linkedRows/index.html +10 -10
  130. package/coverage/lcov-report/db/linkedRows/index.js.html +5 -5
  131. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +6 -6
  132. package/coverage/lcov-report/db/newid.js.html +3 -3
  133. package/coverage/lcov-report/db/utils.js.html +57 -57
  134. package/coverage/lcov-report/events/AutomationEmitter.js.html +6 -6
  135. package/coverage/lcov-report/events/index.html +6 -6
  136. package/coverage/lcov-report/events/index.js.html +1 -1
  137. package/coverage/lcov-report/events/utils.js.html +5 -5
  138. package/coverage/lcov-report/index.html +108 -93
  139. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  140. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  141. package/coverage/lcov-report/middleware/appInfo.js.html +2 -2
  142. package/coverage/lcov-report/middleware/authorized.js.html +58 -34
  143. package/coverage/lcov-report/middleware/builder.js.html +16 -7
  144. package/coverage/lcov-report/middleware/currentapp.js.html +6 -6
  145. package/coverage/lcov-report/middleware/index.html +27 -27
  146. package/coverage/lcov-report/middleware/joi-validator.js.html +2 -2
  147. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  148. package/coverage/lcov-report/middleware/selfhost.js.html +2 -2
  149. package/coverage/lcov-report/middleware/usageQuota.js.html +4 -4
  150. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  151. package/coverage/lcov-report/{automations/thread.js.html → threads/automation.js.html} +90 -33
  152. package/coverage/lcov-report/threads/index.html +141 -0
  153. package/coverage/lcov-report/threads/index.js.html +278 -0
  154. package/coverage/lcov-report/threads/query.js.html +278 -0
  155. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  156. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  157. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  158. package/coverage/lcov-report/utilities/csvParser.js.html +144 -15
  159. package/coverage/lcov-report/utilities/global.js.html +26 -11
  160. package/coverage/lcov-report/utilities/index.html +48 -48
  161. package/coverage/lcov-report/utilities/index.js.html +47 -14
  162. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +30 -9
  163. package/coverage/lcov-report/utilities/queue/index.html +14 -14
  164. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  165. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  166. package/coverage/lcov-report/utilities/rowProcessor/index.html +4 -4
  167. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +2 -2
  168. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +3 -3
  169. package/coverage/lcov-report/utilities/scriptRunner.js.html +16 -7
  170. package/coverage/lcov-report/utilities/security.js.html +3 -3
  171. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  172. package/coverage/lcov-report/utilities/users.js.html +1 -1
  173. package/coverage/lcov-report/utilities/workerRequests.js.html +5 -5
  174. package/coverage/lcov.info +2558 -1787
  175. package/dist/api/controllers/application.js +15 -1
  176. package/dist/api/controllers/auth.js +3 -3
  177. package/dist/api/controllers/datasource.js +67 -16
  178. package/dist/api/controllers/deploy/index.js +2 -0
  179. package/dist/api/controllers/dev.js +4 -1
  180. package/dist/api/controllers/query.js +30 -58
  181. package/dist/api/controllers/row/ExternalRequest.js +37 -14
  182. package/dist/api/controllers/row/external.js +3 -1
  183. package/dist/api/controllers/row/utils.js +6 -12
  184. package/dist/api/controllers/table/external.js +249 -0
  185. package/dist/api/controllers/table/index.js +49 -123
  186. package/dist/api/controllers/table/internal.js +150 -0
  187. package/dist/api/controllers/table/utils.js +62 -28
  188. package/dist/api/controllers/user.js +123 -11
  189. package/dist/api/controllers/view/exporters.js +4 -0
  190. package/dist/api/controllers/view/index.js +14 -2
  191. package/dist/api/routes/query.js +1 -1
  192. package/dist/api/routes/table.js +7 -1
  193. package/dist/api/routes/user.js +2 -1
  194. package/dist/app.js +2 -11
  195. package/dist/automations/bullboard.js +37 -10
  196. package/dist/automations/triggers.js +7 -3
  197. package/dist/automations/utils.js +11 -2
  198. package/dist/constants/index.js +19 -0
  199. package/dist/definitions/datasource.js +5 -0
  200. package/dist/environment.js +13 -0
  201. package/dist/integrations/base/IntegrationBase.js +2 -0
  202. package/dist/integrations/base/datasourcePlus.js +2 -0
  203. package/dist/integrations/base/sql.js +338 -180
  204. package/dist/integrations/base/sqlTable.js +143 -0
  205. package/dist/integrations/base/utils.js +30 -0
  206. package/dist/integrations/index.js +6 -0
  207. package/dist/integrations/microsoftSqlServer.js +117 -9
  208. package/dist/integrations/mysql.js +14 -84
  209. package/dist/integrations/oracle.js +345 -0
  210. package/dist/integrations/postgres.js +35 -28
  211. package/dist/integrations/utils.js +71 -9
  212. package/dist/middleware/authorized.js +22 -11
  213. package/dist/middleware/builder.js +4 -1
  214. package/dist/package.json +13 -8
  215. package/dist/tests/utilities/TestConfiguration.js +2 -1
  216. package/dist/{automations/thread.js → threads/automation.js} +26 -8
  217. package/dist/threads/index.js +64 -0
  218. package/dist/threads/query.js +64 -0
  219. package/dist/tsconfig.tsbuildinfo +1 -1
  220. package/dist/utilities/csvParser.js +46 -5
  221. package/dist/utilities/global.js +6 -2
  222. package/dist/utilities/index.js +11 -0
  223. package/dist/utilities/queue/inMemoryQueue.js +8 -0
  224. package/dist/utilities/scriptRunner.js +4 -1
  225. package/package.json +14 -9
  226. package/scripts/dev/manage.js +1 -0
  227. package/scripts/integrations/mssql/data/Dockerfile +9 -0
  228. package/scripts/integrations/mssql/data/entrypoint.sh +24 -0
  229. package/scripts/integrations/mssql/data/setup.sql +54 -0
  230. package/scripts/integrations/mssql/docker-compose.yaml +12 -0
  231. package/scripts/integrations/mssql/reset.sh +3 -0
  232. package/scripts/integrations/oracle/docker-compose.yml +19 -0
  233. package/scripts/integrations/oracle/instantclient/linux/x86-64/basiclite-21.4.zip +0 -0
  234. package/scripts/integrations/oracle/instantclient/linux/x86-64/install.sh +23 -0
  235. package/scripts/integrations/oracle/oracle.md +90 -0
  236. package/scripts/integrations/postgres/docker-compose.yml +3 -3
  237. package/scripts/likeCypress.ts +33 -0
  238. package/src/api/controllers/application.js +18 -1
  239. package/src/api/controllers/auth.js +3 -0
  240. package/src/api/controllers/datasource.js +84 -16
  241. package/src/api/controllers/deploy/index.js +2 -0
  242. package/src/api/controllers/dev.js +4 -1
  243. package/src/api/controllers/query.js +29 -81
  244. package/src/api/controllers/row/ExternalRequest.ts +47 -16
  245. package/src/api/controllers/row/external.js +4 -1
  246. package/src/api/controllers/row/utils.js +8 -11
  247. package/src/api/controllers/table/external.js +307 -0
  248. package/src/api/controllers/table/index.js +47 -137
  249. package/src/api/controllers/table/internal.js +155 -0
  250. package/src/api/controllers/table/utils.js +74 -33
  251. package/src/api/controllers/user.js +132 -13
  252. package/src/api/controllers/view/exporters.js +5 -0
  253. package/src/api/controllers/view/index.js +15 -2
  254. package/src/api/routes/query.js +1 -0
  255. package/src/api/routes/table.js +11 -0
  256. package/src/api/routes/tests/datasource.spec.js +2 -2
  257. package/src/api/routes/tests/misc.spec.js +5 -1
  258. package/src/api/routes/tests/query.spec.js +0 -1
  259. package/src/api/routes/user.js +5 -0
  260. package/src/app.ts +2 -10
  261. package/src/automations/bullboard.js +28 -11
  262. package/src/automations/tests/automation.spec.js +3 -4
  263. package/src/automations/triggers.js +7 -3
  264. package/src/automations/utils.js +12 -2
  265. package/src/constants/index.js +22 -0
  266. package/src/definitions/common.ts +7 -1
  267. package/src/definitions/datasource.ts +10 -3
  268. package/src/environment.js +15 -0
  269. package/src/integrations/airtable.ts +2 -1
  270. package/src/integrations/arangodb.ts +2 -1
  271. package/src/integrations/base/IntegrationBase.ts +6 -0
  272. package/src/integrations/base/datasourcePlus.ts +9 -0
  273. package/src/integrations/base/sql.ts +362 -222
  274. package/src/integrations/base/sqlTable.ts +180 -0
  275. package/src/integrations/base/utils.ts +22 -0
  276. package/src/integrations/couchdb.ts +2 -1
  277. package/src/integrations/dynamodb.ts +2 -1
  278. package/src/integrations/elasticsearch.ts +2 -1
  279. package/src/integrations/index.ts +7 -0
  280. package/src/integrations/microsoftSqlServer.ts +145 -13
  281. package/src/integrations/mongodb.ts +2 -1
  282. package/src/integrations/mysql.ts +20 -94
  283. package/src/integrations/oracle.ts +445 -0
  284. package/src/integrations/postgres.ts +45 -35
  285. package/src/integrations/rest.ts +2 -1
  286. package/src/integrations/s3.ts +2 -1
  287. package/src/integrations/tests/microsoftSqlServer.spec.js +22 -15
  288. package/src/integrations/tests/oracle.spec.js +94 -0
  289. package/src/integrations/tests/postgres.spec.js +4 -0
  290. package/src/integrations/utils.ts +74 -8
  291. package/src/middleware/authorized.js +26 -18
  292. package/src/middleware/builder.js +4 -1
  293. package/src/middleware/tests/authorized.spec.js +2 -0
  294. package/src/tests/utilities/TestConfiguration.js +2 -1
  295. package/src/{automations/thread.js → threads/automation.js} +27 -8
  296. package/src/threads/index.js +66 -0
  297. package/src/threads/query.js +66 -0
  298. package/src/utilities/csvParser.js +48 -5
  299. package/src/utilities/global.js +7 -2
  300. package/src/utilities/index.js +11 -0
  301. package/src/utilities/queue/inMemoryQueue.js +7 -0
  302. package/src/utilities/scriptRunner.js +4 -1
  303. package/src/utilities/tests/__snapshots__/csvParser.spec.js.snap +0 -6
  304. package/src/utilities/tests/csvParser.spec.js +3 -0
  305. package/tsconfig.json +1 -1
  306. package/builder/assets/index.10556cc1.js +0 -201
  307. package/builder/assets/index.7469e1e4.css +0 -29
  308. package/builder/assets/vendor.278a305c.js +0 -9
  309. package/builder/assets/vendor.d75d5eb7.css +0 -1
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">61.33% </span>
26
+ <span class="strong">44.44% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>46/75</span>
28
+ <span class='fraction'>48/108</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">37.5% </span>
33
+ <span class="strong">19.44% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>6/16</span>
35
+ <span class='fraction'>7/36</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">72.73% </span>
40
+ <span class="strong">50% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>8/11</span>
42
+ <span class='fraction'>8/16</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">60.27% </span>
47
+ <span class="strong">43.92% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>44/73</span>
49
+ <span class='fraction'>47/107</span>
50
50
  </div>
51
51
 
52
52
 
@@ -55,7 +55,7 @@
55
55
  Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
56
  </p>
57
57
  </div>
58
- <div class='status-line medium'></div>
58
+ <div class='status-line low'></div>
59
59
  <pre><table class="coverage">
60
60
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
61
  <a name='L2'></a><a href='#L2'>2</a>
@@ -204,7 +204,75 @@
204
204
  <a name='L145'></a><a href='#L145'>145</a>
205
205
  <a name='L146'></a><a href='#L146'>146</a>
206
206
  <a name='L147'></a><a href='#L147'>147</a>
207
- <a name='L148'></a><a href='#L148'>148</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">33x</span>
207
+ <a name='L148'></a><a href='#L148'>148</a>
208
+ <a name='L149'></a><a href='#L149'>149</a>
209
+ <a name='L150'></a><a href='#L150'>150</a>
210
+ <a name='L151'></a><a href='#L151'>151</a>
211
+ <a name='L152'></a><a href='#L152'>152</a>
212
+ <a name='L153'></a><a href='#L153'>153</a>
213
+ <a name='L154'></a><a href='#L154'>154</a>
214
+ <a name='L155'></a><a href='#L155'>155</a>
215
+ <a name='L156'></a><a href='#L156'>156</a>
216
+ <a name='L157'></a><a href='#L157'>157</a>
217
+ <a name='L158'></a><a href='#L158'>158</a>
218
+ <a name='L159'></a><a href='#L159'>159</a>
219
+ <a name='L160'></a><a href='#L160'>160</a>
220
+ <a name='L161'></a><a href='#L161'>161</a>
221
+ <a name='L162'></a><a href='#L162'>162</a>
222
+ <a name='L163'></a><a href='#L163'>163</a>
223
+ <a name='L164'></a><a href='#L164'>164</a>
224
+ <a name='L165'></a><a href='#L165'>165</a>
225
+ <a name='L166'></a><a href='#L166'>166</a>
226
+ <a name='L167'></a><a href='#L167'>167</a>
227
+ <a name='L168'></a><a href='#L168'>168</a>
228
+ <a name='L169'></a><a href='#L169'>169</a>
229
+ <a name='L170'></a><a href='#L170'>170</a>
230
+ <a name='L171'></a><a href='#L171'>171</a>
231
+ <a name='L172'></a><a href='#L172'>172</a>
232
+ <a name='L173'></a><a href='#L173'>173</a>
233
+ <a name='L174'></a><a href='#L174'>174</a>
234
+ <a name='L175'></a><a href='#L175'>175</a>
235
+ <a name='L176'></a><a href='#L176'>176</a>
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>
272
+ <a name='L213'></a><a href='#L213'>213</a>
273
+ <a name='L214'></a><a href='#L214'>214</a>
274
+ <a name='L215'></a><a href='#L215'>215</a>
275
+ <a name='L216'></a><a href='#L216'>216</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">33x</span>
208
276
  <span class="cline-any cline-neutral">&nbsp;</span>
209
277
  <span class="cline-any cline-neutral">&nbsp;</span>
210
278
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -215,6 +283,7 @@
215
283
  <span class="cline-any cline-yes">33x</span>
216
284
  <span class="cline-any cline-yes">33x</span>
217
285
  <span class="cline-any cline-yes">33x</span>
286
+ <span class="cline-any cline-yes">33x</span>
218
287
  <span class="cline-any cline-neutral">&nbsp;</span>
219
288
  <span class="cline-any cline-yes">33x</span>
220
289
  <span class="cline-any cline-yes">2x</span>
@@ -256,6 +325,10 @@
256
325
  <span class="cline-any cline-no">&nbsp;</span>
257
326
  <span class="cline-any cline-neutral">&nbsp;</span>
258
327
  <span class="cline-any cline-no">&nbsp;</span>
328
+ <span class="cline-any cline-no">&nbsp;</span>
329
+ <span class="cline-any cline-no">&nbsp;</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-no">&nbsp;</span>
259
332
  <span class="cline-any cline-neutral">&nbsp;</span>
260
333
  <span class="cline-any cline-neutral">&nbsp;</span>
261
334
  <span class="cline-any cline-yes">33x</span>
@@ -292,6 +365,8 @@
292
365
  <span class="cline-any cline-neutral">&nbsp;</span>
293
366
  <span class="cline-any cline-neutral">&nbsp;</span>
294
367
  <span class="cline-any cline-yes">23x</span>
368
+ <span class="cline-any cline-yes">23x</span>
369
+ <span class="cline-any cline-no">&nbsp;</span>
295
370
  <span class="cline-any cline-no">&nbsp;</span>
296
371
  <span class="cline-any cline-no">&nbsp;</span>
297
372
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -309,6 +384,8 @@
309
384
  <span class="cline-any cline-neutral">&nbsp;</span>
310
385
  <span class="cline-any cline-yes">23x</span>
311
386
  <span class="cline-any cline-yes">23x</span>
387
+ <span class="cline-any cline-no">&nbsp;</span>
388
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
389
  <span class="cline-any cline-yes">23x</span>
313
390
  <span class="cline-any cline-neutral">&nbsp;</span>
314
391
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -317,9 +394,17 @@
317
394
  <span class="cline-any cline-neutral">&nbsp;</span>
318
395
  <span class="cline-any cline-neutral">&nbsp;</span>
319
396
  <span class="cline-any cline-yes">1x</span>
397
+ <span class="cline-any cline-neutral">&nbsp;</span>
398
+ <span class="cline-any cline-neutral">&nbsp;</span>
399
+ <span class="cline-any cline-yes">1x</span>
320
400
  <span class="cline-any cline-yes">1x</span>
321
401
  <span class="cline-any cline-neutral">&nbsp;</span>
322
402
  <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-neutral">&nbsp;</span>
405
+ <span class="cline-any cline-neutral">&nbsp;</span>
406
+ <span class="cline-any cline-neutral">&nbsp;</span>
407
+ <span class="cline-any cline-neutral">&nbsp;</span>
323
408
  <span class="cline-any cline-yes">1x</span>
324
409
  <span class="cline-any cline-neutral">&nbsp;</span>
325
410
  <span class="cline-any cline-yes">1x</span>
@@ -341,6 +426,23 @@
341
426
  <span class="cline-any cline-neutral">&nbsp;</span>
342
427
  <span class="cline-any cline-neutral">&nbsp;</span>
343
428
  <span class="cline-any cline-neutral">&nbsp;</span>
429
+ <span class="cline-any cline-neutral">&nbsp;</span>
430
+ <span class="cline-any cline-no">&nbsp;</span>
431
+ <span class="cline-any cline-no">&nbsp;</span>
432
+ <span class="cline-any cline-no">&nbsp;</span>
433
+ <span class="cline-any cline-neutral">&nbsp;</span>
434
+ <span class="cline-any cline-neutral">&nbsp;</span>
435
+ <span class="cline-any cline-neutral">&nbsp;</span>
436
+ <span class="cline-any cline-no">&nbsp;</span>
437
+ <span class="cline-any cline-no">&nbsp;</span>
438
+ <span class="cline-any cline-neutral">&nbsp;</span>
439
+ <span class="cline-any cline-no">&nbsp;</span>
440
+ <span class="cline-any cline-no">&nbsp;</span>
441
+ <span class="cline-any cline-neutral">&nbsp;</span>
442
+ <span class="cline-any cline-no">&nbsp;</span>
443
+ <span class="cline-any cline-no">&nbsp;</span>
444
+ <span class="cline-any cline-neutral">&nbsp;</span>
445
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
446
  <span class="cline-any cline-yes">33x</span>
345
447
  <span class="cline-any cline-no">&nbsp;</span>
346
448
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -349,6 +451,40 @@
349
451
  <span class="cline-any cline-no">&nbsp;</span>
350
452
  <span class="cline-any cline-no">&nbsp;</span>
351
453
  <span class="cline-any cline-neutral">&nbsp;</span>
454
+ <span class="cline-any cline-neutral">&nbsp;</span>
455
+ <span class="cline-any cline-no">&nbsp;</span>
456
+ <span class="cline-any cline-no">&nbsp;</span>
457
+ <span class="cline-any cline-no">&nbsp;</span>
458
+ <span class="cline-any cline-neutral">&nbsp;</span>
459
+ <span class="cline-any cline-no">&nbsp;</span>
460
+ <span class="cline-any cline-no">&nbsp;</span>
461
+ <span class="cline-any cline-neutral">&nbsp;</span>
462
+ <span class="cline-any cline-no">&nbsp;</span>
463
+ <span class="cline-any cline-no">&nbsp;</span>
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-no">&nbsp;</span>
468
+ <span class="cline-any cline-no">&nbsp;</span>
469
+ <span class="cline-any cline-no">&nbsp;</span>
470
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
477
+ <span class="cline-any cline-neutral">&nbsp;</span>
478
+ <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-no">&nbsp;</span>
480
+ <span class="cline-any cline-no">&nbsp;</span>
481
+ <span class="cline-any cline-no">&nbsp;</span>
482
+ <span class="cline-any cline-neutral">&nbsp;</span>
483
+ <span class="cline-any cline-neutral">&nbsp;</span>
484
+ <span class="cline-any cline-neutral">&nbsp;</span>
485
+ <span class="cline-any cline-neutral">&nbsp;</span>
486
+ <span class="cline-any cline-neutral">&nbsp;</span>
487
+ <span class="cline-any cline-neutral">&nbsp;</span>
352
488
  <span class="cline-any cline-no">&nbsp;</span>
353
489
  <span class="cline-any cline-neutral">&nbsp;</span>
354
490
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const CouchDB = require("../../db")
@@ -360,8 +496,9 @@ const {
360
496
  BudibaseInternalDB,
361
497
  getTableParams,
362
498
  } = require("../../db/utils")
499
+ const { BuildSchemaErrors, InvalidColumns } = require("../../constants")
363
500
  const { integrations } = require("../../integrations")
364
- const { makeExternalQuery } = require("./row/utils")
501
+ const { getDatasourceAndQuery } = require("./row/utils")
365
502
  &nbsp;
366
503
  exports.fetch = async function (ctx) {
367
504
  const database = new CouchDB(ctx.appId)
@@ -396,13 +533,17 @@ exports.buildSchemaFromDb = <span class="fstat-no" title="function not covered"
396
533
  const db = <span class="cstat-no" title="statement not covered" >new CouchDB(ctx.appId)</span>
397
534
  const datasource = <span class="cstat-no" title="statement not covered" >await db.get(ctx.params.datasourceId)</span>
398
535
  &nbsp;
399
- const tables = <span class="cstat-no" title="statement not covered" >await buildSchemaHelper(datasource)</span>
536
+ const { tables, error } = <span class="cstat-no" title="statement not covered" >await buildSchemaHelper(datasource)</span>
400
537
  <span class="cstat-no" title="statement not covered" > datasource.entities = tables</span>
401
538
  &nbsp;
402
- const response = <span class="cstat-no" title="statement not covered" >await db.put(datasource)</span>
403
- <span class="cstat-no" title="statement not covered" > datasource._rev = response.rev</span>
539
+ const dbResp = <span class="cstat-no" title="statement not covered" >await db.put(datasource)</span>
540
+ <span class="cstat-no" title="statement not covered" > datasource._rev = dbResp.rev</span>
404
541
  &nbsp;
405
- <span class="cstat-no" title="statement not covered" > ctx.body = datasource</span>
542
+ const response = <span class="cstat-no" title="statement not covered" >{ datasource }</span>
543
+ <span class="cstat-no" title="statement not covered" > if (error) {</span>
544
+ <span class="cstat-no" title="statement not covered" > response.error = error</span>
545
+ }
546
+ <span class="cstat-no" title="statement not covered" > ctx.body = response</span>
406
547
  }
407
548
  &nbsp;
408
549
  exports.update = <span class="fstat-no" title="function not covered" >as</span>ync function (ctx) {
@@ -424,7 +565,7 @@ exports.update = <span class="fstat-no" title="function not covered" >as</span>y
424
565
  &nbsp;
425
566
  <span class="cstat-no" title="statement not covered" > ctx.status = 200</span>
426
567
  <span class="cstat-no" title="statement not covered" > ctx.message = "Datasource saved successfully."</span>
427
- <span class="cstat-no" title="statement not covered" > ctx.body = datasource</span>
568
+ <span class="cstat-no" title="statement not covered" > ctx.body = { datasource }</span>
428
569
  }
429
570
  &nbsp;
430
571
  exports.save = async function (ctx) {
@@ -438,33 +579,45 @@ exports.save = async function (ctx) {
438
579
  ...ctx.request.body.datasource,
439
580
  }
440
581
  &nbsp;
582
+ let schemaError = null
441
583
  <span class="missing-if-branch" title="if path not taken" >I</span>if (fetchSchema) {
442
- let tables = <span class="cstat-no" title="statement not covered" >await buildSchemaHelper(datasource)</span>
584
+ const { tables, error } = <span class="cstat-no" title="statement not covered" >await buildSchemaHelper(datasource)</span>
585
+ <span class="cstat-no" title="statement not covered" > schemaError = error</span>
443
586
  <span class="cstat-no" title="statement not covered" > datasource.entities = tables</span>
444
587
  }
445
588
  &nbsp;
446
- const response = await db.put(datasource)
447
- datasource._rev = response.rev
589
+ const dbResp = await db.put(datasource)
590
+ datasource._rev = dbResp.rev
448
591
  &nbsp;
449
592
  // Drain connection pools when configuration is changed
450
- <span class="missing-if-branch" title="else path not taken" >E</span>if (datasource.source) {
593
+ if (datasource.source) {
451
594
  const source = integrations[datasource.source]
452
595
  <span class="missing-if-branch" title="if path not taken" >I</span>if (source &amp;&amp; source.pool) {
453
596
  <span class="cstat-no" title="statement not covered" > await source.pool.end()</span>
454
597
  }
455
598
  }
456
599
  &nbsp;
457
- ctx.status = 200
458
- ctx.message = "Datasource saved successfully."
459
- ctx.body = datasource
600
+ const response = { datasource }
601
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (schemaError) {
602
+ <span class="cstat-no" title="statement not covered" > response.error = schemaError</span>
603
+ }
604
+ ctx.body = response
460
605
  }
461
606
  &nbsp;
462
607
  exports.destroy = async function (ctx) {
463
608
  const db = new CouchDB(ctx.appId)
464
609
  &nbsp;
465
610
  // Delete all queries for the datasource
466
- const rows = await db.allDocs(getQueryParams(ctx.params.datasourceId, null))
467
- await db.bulkDocs(rows.rows.map(row =&gt; ({ ...row.doc, _deleted: true })))
611
+ const queries = await db.allDocs(
612
+ getQueryParams(ctx.params.datasourceId, null)
613
+ )
614
+ await db.bulkDocs(
615
+ queries.rows.map(row =&gt; ({
616
+ _id: row.id,
617
+ _rev: row.value.rev,
618
+ _deleted: true,
619
+ }))
620
+ )
468
621
  &nbsp;
469
622
  // delete the datasource
470
623
  await db.remove(ctx.params.datasourceId, ctx.params.revId)
@@ -482,12 +635,29 @@ exports.find = async function (ctx) {
482
635
  exports.query = async function (ctx) {
483
636
  const queryJson = ctx.request.body
484
637
  try {
485
- ctx.body = await makeExternalQuery(ctx.appId, queryJson)
638
+ ctx.body = await getDatasourceAndQuery(ctx.appId, queryJson)
486
639
  } catch (err) {
487
640
  <span class="cstat-no" title="statement not covered" > ctx.throw(400, err)</span>
488
641
  }
489
642
  }
490
643
  &nbsp;
644
+ function <span class="fstat-no" title="function not covered" >getErrorTables(</span>errors, errorType) {
645
+ <span class="cstat-no" title="statement not covered" > return Object.entries(errors)</span>
646
+ .filter(<span class="fstat-no" title="function not covered" >en</span>try =&gt; <span class="cstat-no" title="statement not covered" >entry[1] === errorType)</span>
647
+ .map(<span class="fstat-no" title="function not covered" >([</span>name]) =&gt; <span class="cstat-no" title="statement not covered" >name)</span>
648
+ }
649
+ &nbsp;
650
+ function <span class="fstat-no" title="function not covered" >updateError(</span>error, newError, tables) {
651
+ <span class="cstat-no" title="statement not covered" > if (!error) {</span>
652
+ <span class="cstat-no" title="statement not covered" > error = ""</span>
653
+ }
654
+ <span class="cstat-no" title="statement not covered" > if (error.length &gt; 0) {</span>
655
+ <span class="cstat-no" title="statement not covered" > error += "\n"</span>
656
+ }
657
+ <span class="cstat-no" title="statement not covered" > error += `${newError} ${tables.join(", ")}`</span>
658
+ <span class="cstat-no" title="statement not covered" > return error</span>
659
+ }
660
+ &nbsp;
491
661
  const buildSchemaHelper = <span class="fstat-no" title="function not covered" >as</span>ync datasource =&gt; {
492
662
  const Connector = <span class="cstat-no" title="statement not covered" >integrations[datasource.source]</span>
493
663
  &nbsp;
@@ -496,7 +666,41 @@ const buildSchemaHelper = <span class="fstat-no" title="function not covered" >a
496
666
  <span class="cstat-no" title="statement not covered" > await connector.buildSchema(datasource._id, datasource.entities)</span>
497
667
  <span class="cstat-no" title="statement not covered" > datasource.entities = connector.tables</span>
498
668
  &nbsp;
499
- <span class="cstat-no" title="statement not covered" > return connector.tables</span>
669
+ // make sure they all have a display name selected
670
+ <span class="cstat-no" title="statement not covered" > for (let entity of Object.values(datasource.entities)) {</span>
671
+ <span class="cstat-no" title="statement not covered" > if (entity.primaryDisplay) {</span>
672
+ <span class="cstat-no" title="statement not covered" > continue</span>
673
+ }
674
+ const notAutoColumn = <span class="cstat-no" title="statement not covered" >Object.values(entity.schema).find(</span>
675
+ <span class="fstat-no" title="function not covered" > sc</span>hema =&gt; <span class="cstat-no" title="statement not covered" >!schema.autocolumn</span>
676
+ )
677
+ <span class="cstat-no" title="statement not covered" > if (notAutoColumn) {</span>
678
+ <span class="cstat-no" title="statement not covered" > entity.primaryDisplay = notAutoColumn.name</span>
679
+ }
680
+ }
681
+ &nbsp;
682
+ const errors = <span class="cstat-no" title="statement not covered" >connector.schemaErrors</span>
683
+ let error = <span class="cstat-no" title="statement not covered" >null</span>
684
+ <span class="cstat-no" title="statement not covered" > if (errors &amp;&amp; Object.keys(errors).length &gt; 0) {</span>
685
+ const noKey = <span class="cstat-no" title="statement not covered" >getErrorTables(errors, BuildSchemaErrors.NO_KEY)</span>
686
+ const invalidCol = <span class="cstat-no" title="statement not covered" >getErrorTables(errors, BuildSchemaErrors.INVALID_COLUMN)</span>
687
+ <span class="cstat-no" title="statement not covered" > if (noKey.length) {</span>
688
+ <span class="cstat-no" title="statement not covered" > error = updateError(</span>
689
+ error,
690
+ "No primary key constraint found for the following:",
691
+ noKey
692
+ )
693
+ }
694
+ <span class="cstat-no" title="statement not covered" > if (invalidCol.length) {</span>
695
+ const invalidCols = <span class="cstat-no" title="statement not covered" >Object.values(InvalidColumns).join(", ")</span>
696
+ <span class="cstat-no" title="statement not covered" > error = updateError(</span>
697
+ error,
698
+ `Cannot use columns ${invalidCols} found in following:`,
699
+ invalidCol
700
+ )
701
+ }
702
+ }
703
+ <span class="cstat-no" title="statement not covered" > return { tables: connector.tables, error }</span>
500
704
  }
501
705
  &nbsp;</pre></td></tr></table></pre>
502
706
 
@@ -505,7 +709,7 @@ const buildSchemaHelper = <span class="fstat-no" title="function not covered" >a
505
709
  <div class='footer quiet pad2 space-top1 center small'>
506
710
  Code coverage generated by
507
711
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
508
- at Fri Nov 12 2021 13:13:12 GMT+0000 (Coordinated Universal Time)
712
+ at Thu Nov 25 2021 12:28:23 GMT+0000 (Coordinated Universal Time)
509
713
  </div>
510
714
  </div>
511
715
  <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">27.87% </span>
26
+ <span class="strong">28.12% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>17/61</span>
28
+ <span class='fraction'>18/64</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">28.33% </span>
47
+ <span class="strong">28.57% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>17/60</span>
49
+ <span class='fraction'>18/63</span>
50
50
  </div>
51
51
 
52
52
 
@@ -176,7 +176,11 @@
176
176
  <a name='L117'></a><a href='#L117'>117</a>
177
177
  <a name='L118'></a><a href='#L118'>118</a>
178
178
  <a name='L119'></a><a href='#L119'>119</a>
179
- <a name='L120'></a><a href='#L120'>120</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">23x</span>
179
+ <a name='L120'></a><a href='#L120'>120</a>
180
+ <a name='L121'></a><a href='#L121'>121</a>
181
+ <a name='L122'></a><a href='#L122'>122</a>
182
+ <a name='L123'></a><a href='#L123'>123</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">23x</span>
183
+ <span class="cline-any cline-yes">23x</span>
180
184
  <span class="cline-any cline-yes">23x</span>
181
185
  <span class="cline-any cline-yes">23x</span>
182
186
  <span class="cline-any cline-yes">23x</span>
@@ -203,6 +207,7 @@
203
207
  <span class="cline-any cline-neutral">&nbsp;</span>
204
208
  <span class="cline-any cline-no">&nbsp;</span>
205
209
  <span class="cline-any cline-no">&nbsp;</span>
210
+ <span class="cline-any cline-no">&nbsp;</span>
206
211
  <span class="cline-any cline-neutral">&nbsp;</span>
207
212
  <span class="cline-any cline-no">&nbsp;</span>
208
213
  <span class="cline-any cline-no">&nbsp;</span>
@@ -285,6 +290,7 @@
285
290
  <span class="cline-any cline-no">&nbsp;</span>
286
291
  <span class="cline-any cline-no">&nbsp;</span>
287
292
  <span class="cline-any cline-no">&nbsp;</span>
293
+ <span class="cline-any cline-no">&nbsp;</span>
288
294
  <span class="cline-any cline-neutral">&nbsp;</span>
289
295
  <span class="cline-any cline-neutral">&nbsp;</span>
290
296
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -303,6 +309,7 @@ const { request } = require("../../utilities/workerRequests")
303
309
  const { clearLock } = require("../../utilities/redis")
304
310
  const { Replication } = require("@budibase/auth").db
305
311
  const { DocumentTypes } = require("../../db/utils")
312
+ const { app: appCache } = require("@budibase/auth/cache")
306
313
  &nbsp;
307
314
  async function <span class="fstat-no" title="function not covered" >redirect(</span>ctx, method, path = <span class="branch-0 cbranch-no" title="branch not covered" >"global")</span> {
308
315
  const { devPath } = <span class="cstat-no" title="statement not covered" >ctx.params</span>
@@ -321,7 +328,8 @@ async function <span class="fstat-no" title="function not covered" >redirect(</s
321
328
  )
322
329
  )
323
330
  <span class="cstat-no" title="statement not covered" > if (response.status !== 200) {</span>
324
- <span class="cstat-no" title="statement not covered" > ctx.throw(response.status, response.statusText)</span>
331
+ const err = <span class="cstat-no" title="statement not covered" >await response.text()</span>
332
+ <span class="cstat-no" title="statement not covered" > ctx.throw(400, err)</span>
325
333
  }
326
334
  const cookie = <span class="cstat-no" title="statement not covered" >response.headers.get("set-cookie")</span>
327
335
  <span class="cstat-no" title="statement not covered" > if (cookie) {</span>
@@ -403,6 +411,7 @@ exports.revert = <span class="fstat-no" title="function not covered" >as</span>y
403
411
  <span class="cstat-no" title="statement not covered" > appDoc.appId = appId</span>
404
412
  <span class="cstat-no" title="statement not covered" > appDoc.instance._id = appId</span>
405
413
  <span class="cstat-no" title="statement not covered" > await db.put(appDoc)</span>
414
+ <span class="cstat-no" title="statement not covered" > await appCache.invalidateAppMetadata(appId)</span>
406
415
  <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
407
416
  message: "Reverted changes successfully.",
408
417
  }
@@ -421,7 +430,7 @@ exports.getBudibaseVersion = <span class="fstat-no" title="function not covered"
421
430
  <div class='footer quiet pad2 space-top1 center small'>
422
431
  Code coverage generated by
423
432
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
424
- at Fri Nov 12 2021 13:13:12 GMT+0000 (Coordinated Universal Time)
433
+ at Thu Nov 25 2021 12:28:23 GMT+0000 (Coordinated Universal Time)
425
434
  </div>
426
435
  </div>
427
436
  <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">86.67% </span>
26
+ <span class="strong">93.33% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>13/15</span>
28
+ <span class='fraction'>14/15</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">50% </span>
33
+ <span class="strong">75% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>2/4</span>
35
+ <span class='fraction'>3/4</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">86.67% </span>
47
+ <span class="strong">93.33% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>13/15</span>
49
+ <span class='fraction'>14/15</span>
50
50
  </div>
51
51
 
52
52
 
@@ -91,7 +91,7 @@
91
91
  <span class="cline-any cline-yes">1x</span>
92
92
  <span class="cline-any cline-yes">1x</span>
93
93
  <span class="cline-any cline-yes">1x</span>
94
- <span class="cline-any cline-no">&nbsp;</span>
94
+ <span class="cline-any cline-yes">1x</span>
95
95
  <span class="cline-any cline-neutral">&nbsp;</span>
96
96
  <span class="cline-any cline-yes">1x</span>
97
97
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -112,8 +112,8 @@ exports.fetchUrls = async ctx =&gt; {
112
112
  const db = new CouchDB(appId)
113
113
  const settings = await getScopedConfig(db, { type: Configs.SETTINGS })
114
114
  let appUrl = "http://localhost:10000/app"
115
- <span class="missing-if-branch" title="if path not taken" >I</span>if (settings &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >settings["platformUrl"])</span> {
116
- <span class="cstat-no" title="statement not covered" > appUrl = checkSlashesInUrl(`${settings["platformUrl"]}/app`)</span>
115
+ if (settings &amp;&amp; settings["platformUrl"]) {
116
+ appUrl = checkSlashesInUrl(`${settings["platformUrl"]}/app`)
117
117
  }
118
118
  ctx.body = {
119
119
  app: appUrl,
@@ -130,7 +130,7 @@ exports.getDeployedApps = <span class="fstat-no" title="function not covered" >a
130
130
  <div class='footer quiet pad2 space-top1 center small'>
131
131
  Code coverage generated by
132
132
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
133
- at Fri Nov 12 2021 13:13:12 GMT+0000 (Coordinated Universal Time)
133
+ at Thu Nov 25 2021 12:28:23 GMT+0000 (Coordinated Universal Time)
134
134
  </div>
135
135
  </div>
136
136
  <script src="../../prettify.js"></script>