@budibase/server 0.9.184 → 0.9.185-alpha.11

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 (290) hide show
  1. package/Dockerfile +1 -1
  2. package/__mocks__/mssql.ts +1 -1
  3. package/__mocks__/pg.ts +3 -0
  4. package/builder/assets/bb-space-man.5be51a45.svg +290 -0
  5. package/builder/assets/index.053c6f7a.js +1321 -0
  6. package/builder/assets/index.4a7c5636.css +1 -0
  7. package/builder/assets/vendor.470042a4.js +152 -0
  8. package/builder/assets/vendor.5e1fe644.css +1 -0
  9. package/builder/index.html +4 -4
  10. package/coverage/clover.xml +1357 -959
  11. package/coverage/coverage-final.json +91 -87
  12. package/coverage/lcov-report/api/controllers/analytics.js.html +2 -2
  13. package/coverage/lcov-report/api/controllers/apikeys.js.html +2 -2
  14. package/coverage/lcov-report/api/controllers/application.js.html +65 -14
  15. package/coverage/lcov-report/api/controllers/auth.js.html +19 -10
  16. package/coverage/lcov-report/api/controllers/automation.js.html +3 -3
  17. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  20. package/coverage/lcov-report/api/controllers/datasource.js.html +147 -27
  21. package/coverage/lcov-report/api/controllers/dev.js.html +16 -7
  22. package/coverage/lcov-report/api/controllers/hosting.js.html +10 -10
  23. package/coverage/lcov-report/api/controllers/index.html +90 -90
  24. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/layout.js.html +3 -3
  26. package/coverage/lcov-report/api/controllers/metadata.js.html +3 -3
  27. package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
  28. package/coverage/lcov-report/api/controllers/query.js.html +53 -209
  29. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  30. package/coverage/lcov-report/api/controllers/routing.js.html +3 -3
  31. package/coverage/lcov-report/api/controllers/row/external.js.html +12 -6
  32. package/coverage/lcov-report/api/controllers/row/index.html +26 -26
  33. package/coverage/lcov-report/api/controllers/row/index.js.html +2 -2
  34. package/coverage/lcov-report/api/controllers/row/internal.js.html +9 -9
  35. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +2 -2
  36. package/coverage/lcov-report/api/controllers/row/utils.js.html +21 -30
  37. package/coverage/lcov-report/api/controllers/screen.js.html +2 -2
  38. package/coverage/lcov-report/api/controllers/script.js.html +3 -3
  39. package/coverage/lcov-report/api/controllers/table/external.js.html +980 -0
  40. package/coverage/lcov-report/api/controllers/table/index.html +56 -26
  41. package/coverage/lcov-report/api/controllers/table/index.js.html +80 -350
  42. package/coverage/lcov-report/api/controllers/table/internal.js.html +545 -0
  43. package/coverage/lcov-report/api/controllers/table/utils.js.html +172 -49
  44. package/coverage/lcov-report/api/controllers/templates.js.html +4 -4
  45. package/coverage/lcov-report/api/controllers/user.js.html +390 -33
  46. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/index.html +9 -9
  48. package/coverage/lcov-report/api/controllers/view/index.js.html +5 -5
  49. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  50. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +3 -3
  51. package/coverage/lcov-report/api/controllers/webhook.js.html +4 -4
  52. package/coverage/lcov-report/api/index.html +1 -1
  53. package/coverage/lcov-report/api/index.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/dev.js.html +2 -2
  65. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/index.html +4 -4
  67. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/query.js.html +5 -2
  73. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/static.js.html +2 -2
  79. package/coverage/lcov-report/api/routes/table.js.html +35 -2
  80. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/user.js.html +17 -2
  82. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  84. package/coverage/lcov-report/automations/actions.js.html +2 -2
  85. package/coverage/lcov-report/automations/automationUtils.js.html +3 -3
  86. package/coverage/lcov-report/automations/bullboard.js.html +71 -20
  87. package/coverage/lcov-report/automations/index.html +33 -48
  88. package/coverage/lcov-report/automations/index.js.html +2 -2
  89. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/discord.js.html +3 -3
  94. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/executeScript.js.html +3 -3
  96. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/index.html +14 -14
  98. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +3 -3
  100. package/coverage/lcov-report/automations/steps/queryRows.js.html +3 -3
  101. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/utils.js.html +7 -7
  106. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  108. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  109. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  111. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  112. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  113. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  115. package/coverage/lcov-report/automations/triggers.js.html +22 -10
  116. package/coverage/lcov-report/automations/utils.js.html +42 -12
  117. package/coverage/lcov-report/constants/index.html +5 -5
  118. package/coverage/lcov-report/constants/index.js.html +49 -4
  119. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  120. package/coverage/lcov-report/constants/screens.js.html +1 -1
  121. package/coverage/lcov-report/db/client.js.html +2 -2
  122. package/coverage/lcov-report/db/inMemoryView.js.html +2 -2
  123. package/coverage/lcov-report/db/index.html +2 -2
  124. package/coverage/lcov-report/db/index.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +6 -6
  126. package/coverage/lcov-report/db/linkedRows/index.html +10 -10
  127. package/coverage/lcov-report/db/linkedRows/index.js.html +5 -5
  128. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +6 -6
  129. package/coverage/lcov-report/db/newid.js.html +1 -1
  130. package/coverage/lcov-report/db/utils.js.html +1 -1
  131. package/coverage/lcov-report/events/AutomationEmitter.js.html +6 -6
  132. package/coverage/lcov-report/events/index.html +6 -6
  133. package/coverage/lcov-report/events/index.js.html +1 -1
  134. package/coverage/lcov-report/events/utils.js.html +5 -5
  135. package/coverage/lcov-report/index.html +98 -83
  136. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  137. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  138. package/coverage/lcov-report/middleware/appInfo.js.html +2 -2
  139. package/coverage/lcov-report/middleware/authorized.js.html +11 -8
  140. package/coverage/lcov-report/middleware/builder.js.html +16 -7
  141. package/coverage/lcov-report/middleware/currentapp.js.html +6 -6
  142. package/coverage/lcov-report/middleware/index.html +23 -23
  143. package/coverage/lcov-report/middleware/joi-validator.js.html +2 -2
  144. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  145. package/coverage/lcov-report/middleware/selfhost.js.html +2 -2
  146. package/coverage/lcov-report/middleware/usageQuota.js.html +4 -4
  147. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  148. package/coverage/lcov-report/{automations/thread.js.html → threads/automation.js.html} +83 -32
  149. package/coverage/lcov-report/threads/index.html +141 -0
  150. package/coverage/lcov-report/threads/index.js.html +260 -0
  151. package/coverage/lcov-report/threads/query.js.html +269 -0
  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 +144 -15
  156. package/coverage/lcov-report/utilities/global.js.html +26 -11
  157. package/coverage/lcov-report/utilities/index.html +49 -49
  158. package/coverage/lcov-report/utilities/index.js.html +65 -17
  159. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +30 -9
  160. package/coverage/lcov-report/utilities/queue/index.html +14 -14
  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 +4 -4
  164. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +2 -2
  165. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +3 -3
  166. package/coverage/lcov-report/utilities/scriptRunner.js.html +16 -7
  167. package/coverage/lcov-report/utilities/security.js.html +3 -3
  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 +5 -5
  171. package/coverage/lcov.info +2301 -1599
  172. package/dist/api/controllers/application.js +16 -2
  173. package/dist/api/controllers/auth.js +3 -3
  174. package/dist/api/controllers/datasource.js +47 -16
  175. package/dist/api/controllers/deploy/index.js +2 -0
  176. package/dist/api/controllers/dev.js +4 -1
  177. package/dist/api/controllers/query.js +30 -58
  178. package/dist/api/controllers/row/ExternalRequest.js +37 -14
  179. package/dist/api/controllers/row/external.js +1 -0
  180. package/dist/api/controllers/row/utils.js +6 -12
  181. package/dist/api/controllers/static/index.js +1 -1
  182. package/dist/api/controllers/table/external.js +242 -0
  183. package/dist/api/controllers/table/index.js +49 -123
  184. package/dist/api/controllers/table/internal.js +150 -0
  185. package/dist/api/controllers/table/utils.js +62 -28
  186. package/dist/api/controllers/user.js +123 -11
  187. package/dist/api/routes/query.js +1 -1
  188. package/dist/api/routes/table.js +7 -1
  189. package/dist/api/routes/user.js +2 -1
  190. package/dist/app.js +2 -11
  191. package/dist/automations/bullboard.js +37 -10
  192. package/dist/automations/triggers.js +7 -3
  193. package/dist/automations/utils.js +11 -2
  194. package/dist/constants/index.js +13 -0
  195. package/dist/definitions/datasource.js +4 -0
  196. package/dist/integrations/base/IntegrationBase.js +2 -0
  197. package/dist/integrations/base/datasourcePlus.js +2 -0
  198. package/dist/integrations/base/sql.js +334 -180
  199. package/dist/integrations/base/sqlTable.js +143 -0
  200. package/dist/integrations/base/utils.js +30 -0
  201. package/dist/integrations/microsoftSqlServer.js +117 -9
  202. package/dist/integrations/mysql.js +14 -84
  203. package/dist/integrations/postgres.js +35 -28
  204. package/dist/integrations/utils.js +56 -9
  205. package/dist/middleware/authorized.js +2 -1
  206. package/dist/middleware/builder.js +4 -1
  207. package/dist/package.json +7 -6
  208. package/dist/tests/utilities/TestConfiguration.js +2 -1
  209. package/dist/{automations/thread.js → threads/automation.js} +23 -7
  210. package/dist/threads/index.js +58 -0
  211. package/dist/threads/query.js +61 -0
  212. package/dist/tsconfig.tsbuildinfo +1 -1
  213. package/dist/utilities/csvParser.js +46 -5
  214. package/dist/utilities/global.js +6 -2
  215. package/dist/utilities/index.js +18 -2
  216. package/dist/utilities/queue/inMemoryQueue.js +8 -0
  217. package/dist/utilities/scriptRunner.js +4 -1
  218. package/package.json +8 -7
  219. package/scripts/integrations/mssql/data/Dockerfile +9 -0
  220. package/scripts/integrations/mssql/data/entrypoint.sh +24 -0
  221. package/scripts/integrations/mssql/data/setup.sql +54 -0
  222. package/scripts/integrations/mssql/docker-compose.yaml +12 -0
  223. package/scripts/integrations/mssql/reset.sh +3 -0
  224. package/scripts/likeCypress.ts +33 -0
  225. package/src/api/controllers/application.js +19 -2
  226. package/src/api/controllers/auth.js +3 -0
  227. package/src/api/controllers/datasource.js +56 -16
  228. package/src/api/controllers/deploy/index.js +2 -0
  229. package/src/api/controllers/dev.js +4 -1
  230. package/src/api/controllers/query.js +29 -81
  231. package/src/api/controllers/row/ExternalRequest.ts +47 -16
  232. package/src/api/controllers/row/external.js +2 -0
  233. package/src/api/controllers/row/utils.js +8 -11
  234. package/src/api/controllers/static/index.js +1 -1
  235. package/src/api/controllers/table/external.js +300 -0
  236. package/src/api/controllers/table/index.js +47 -137
  237. package/src/api/controllers/table/internal.js +155 -0
  238. package/src/api/controllers/table/utils.js +74 -33
  239. package/src/api/controllers/user.js +132 -13
  240. package/src/api/routes/query.js +1 -0
  241. package/src/api/routes/table.js +11 -0
  242. package/src/api/routes/tests/datasource.spec.js +2 -2
  243. package/src/api/routes/tests/misc.spec.js +5 -1
  244. package/src/api/routes/tests/query.spec.js +0 -1
  245. package/src/api/routes/user.js +5 -0
  246. package/src/app.ts +2 -10
  247. package/src/automations/bullboard.js +28 -11
  248. package/src/automations/tests/automation.spec.js +3 -4
  249. package/src/automations/triggers.js +7 -3
  250. package/src/automations/utils.js +12 -2
  251. package/src/constants/index.js +15 -0
  252. package/src/definitions/common.ts +7 -1
  253. package/src/definitions/datasource.ts +9 -3
  254. package/src/integrations/airtable.ts +2 -1
  255. package/src/integrations/arangodb.ts +2 -1
  256. package/src/integrations/base/IntegrationBase.ts +6 -0
  257. package/src/integrations/base/datasourcePlus.ts +9 -0
  258. package/src/integrations/base/sql.ts +359 -222
  259. package/src/integrations/base/sqlTable.ts +180 -0
  260. package/src/integrations/base/utils.ts +22 -0
  261. package/src/integrations/couchdb.ts +2 -1
  262. package/src/integrations/dynamodb.ts +2 -1
  263. package/src/integrations/elasticsearch.ts +2 -1
  264. package/src/integrations/microsoftSqlServer.ts +145 -13
  265. package/src/integrations/mongodb.ts +2 -1
  266. package/src/integrations/mysql.ts +20 -94
  267. package/src/integrations/postgres.ts +45 -35
  268. package/src/integrations/rest.ts +2 -1
  269. package/src/integrations/s3.ts +2 -1
  270. package/src/integrations/tests/microsoftSqlServer.spec.js +22 -15
  271. package/src/integrations/tests/postgres.spec.js +4 -0
  272. package/src/integrations/utils.ts +60 -8
  273. package/src/middleware/authorized.js +2 -1
  274. package/src/middleware/builder.js +4 -1
  275. package/src/tests/utilities/TestConfiguration.js +2 -1
  276. package/src/{automations/thread.js → threads/automation.js} +24 -7
  277. package/src/threads/index.js +60 -0
  278. package/src/threads/query.js +63 -0
  279. package/src/utilities/csvParser.js +48 -5
  280. package/src/utilities/global.js +7 -2
  281. package/src/utilities/index.js +18 -2
  282. package/src/utilities/queue/inMemoryQueue.js +7 -0
  283. package/src/utilities/scriptRunner.js +4 -1
  284. package/src/utilities/tests/__snapshots__/csvParser.spec.js.snap +0 -6
  285. package/src/utilities/tests/csvParser.spec.js +3 -0
  286. package/tsconfig.json +1 -1
  287. package/builder/assets/index.34964222.js +0 -201
  288. package/builder/assets/index.7469e1e4.css +0 -29
  289. package/builder/assets/vendor.278a305c.js +0 -9
  290. 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">50% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>46/75</span>
28
+ <span class='fraction'>48/96</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">25% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>6/16</span>
35
+ <span class='fraction'>7/28</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">57.14% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>8/11</span>
42
+ <span class='fraction'>8/14</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">49.47% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>44/73</span>
49
+ <span class='fraction'>47/95</span>
50
50
  </div>
51
51
 
52
52
 
@@ -204,7 +204,47 @@
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">33x</span>
208
248
  <span class="cline-any cline-neutral">&nbsp;</span>
209
249
  <span class="cline-any cline-neutral">&nbsp;</span>
210
250
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -215,6 +255,7 @@
215
255
  <span class="cline-any cline-yes">33x</span>
216
256
  <span class="cline-any cline-yes">33x</span>
217
257
  <span class="cline-any cline-yes">33x</span>
258
+ <span class="cline-any cline-yes">33x</span>
218
259
  <span class="cline-any cline-neutral">&nbsp;</span>
219
260
  <span class="cline-any cline-yes">33x</span>
220
261
  <span class="cline-any cline-yes">2x</span>
@@ -256,6 +297,10 @@
256
297
  <span class="cline-any cline-no">&nbsp;</span>
257
298
  <span class="cline-any cline-neutral">&nbsp;</span>
258
299
  <span class="cline-any cline-no">&nbsp;</span>
300
+ <span class="cline-any cline-no">&nbsp;</span>
301
+ <span class="cline-any cline-no">&nbsp;</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-no">&nbsp;</span>
259
304
  <span class="cline-any cline-neutral">&nbsp;</span>
260
305
  <span class="cline-any cline-neutral">&nbsp;</span>
261
306
  <span class="cline-any cline-yes">33x</span>
@@ -292,6 +337,8 @@
292
337
  <span class="cline-any cline-neutral">&nbsp;</span>
293
338
  <span class="cline-any cline-neutral">&nbsp;</span>
294
339
  <span class="cline-any cline-yes">23x</span>
340
+ <span class="cline-any cline-yes">23x</span>
341
+ <span class="cline-any cline-no">&nbsp;</span>
295
342
  <span class="cline-any cline-no">&nbsp;</span>
296
343
  <span class="cline-any cline-no">&nbsp;</span>
297
344
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -309,6 +356,8 @@
309
356
  <span class="cline-any cline-neutral">&nbsp;</span>
310
357
  <span class="cline-any cline-yes">23x</span>
311
358
  <span class="cline-any cline-yes">23x</span>
359
+ <span class="cline-any cline-no">&nbsp;</span>
360
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
361
  <span class="cline-any cline-yes">23x</span>
313
362
  <span class="cline-any cline-neutral">&nbsp;</span>
314
363
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -317,7 +366,15 @@
317
366
  <span class="cline-any cline-neutral">&nbsp;</span>
318
367
  <span class="cline-any cline-neutral">&nbsp;</span>
319
368
  <span class="cline-any cline-yes">1x</span>
369
+ <span class="cline-any cline-neutral">&nbsp;</span>
370
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
371
  <span class="cline-any cline-yes">1x</span>
372
+ <span class="cline-any cline-yes">1x</span>
373
+ <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-neutral">&nbsp;</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-neutral">&nbsp;</span>
377
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
378
  <span class="cline-any cline-neutral">&nbsp;</span>
322
379
  <span class="cline-any cline-neutral">&nbsp;</span>
323
380
  <span class="cline-any cline-yes">1x</span>
@@ -349,6 +406,29 @@
349
406
  <span class="cline-any cline-no">&nbsp;</span>
350
407
  <span class="cline-any cline-no">&nbsp;</span>
351
408
  <span class="cline-any cline-neutral">&nbsp;</span>
409
+ <span class="cline-any cline-neutral">&nbsp;</span>
410
+ <span class="cline-any cline-no">&nbsp;</span>
411
+ <span class="cline-any cline-no">&nbsp;</span>
412
+ <span class="cline-any cline-no">&nbsp;</span>
413
+ <span class="cline-any cline-neutral">&nbsp;</span>
414
+ <span class="cline-any cline-no">&nbsp;</span>
415
+ <span class="cline-any cline-no">&nbsp;</span>
416
+ <span class="cline-any cline-neutral">&nbsp;</span>
417
+ <span class="cline-any cline-no">&nbsp;</span>
418
+ <span class="cline-any cline-no">&nbsp;</span>
419
+ <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-neutral">&nbsp;</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-no">&nbsp;</span>
423
+ <span class="cline-any cline-no">&nbsp;</span>
424
+ <span class="cline-any cline-no">&nbsp;</span>
425
+ <span class="cline-any cline-no">&nbsp;</span>
426
+ <span class="cline-any cline-no">&nbsp;</span>
427
+ <span class="cline-any cline-no">&nbsp;</span>
428
+ <span class="cline-any cline-no">&nbsp;</span>
429
+ <span class="cline-any cline-neutral">&nbsp;</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-neutral">&nbsp;</span>
352
432
  <span class="cline-any cline-no">&nbsp;</span>
353
433
  <span class="cline-any cline-neutral">&nbsp;</span>
354
434
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const CouchDB = require("../../db")
@@ -360,8 +440,9 @@ const {
360
440
  BudibaseInternalDB,
361
441
  getTableParams,
362
442
  } = require("../../db/utils")
443
+ const { BuildSchemaErrors } = require("../../constants")
363
444
  const { integrations } = require("../../integrations")
364
- const { makeExternalQuery } = require("./row/utils")
445
+ const { getDatasourceAndQuery } = require("./row/utils")
365
446
  &nbsp;
366
447
  exports.fetch = async function (ctx) {
367
448
  const database = new CouchDB(ctx.appId)
@@ -396,13 +477,17 @@ exports.buildSchemaFromDb = <span class="fstat-no" title="function not covered"
396
477
  const db = <span class="cstat-no" title="statement not covered" >new CouchDB(ctx.appId)</span>
397
478
  const datasource = <span class="cstat-no" title="statement not covered" >await db.get(ctx.params.datasourceId)</span>
398
479
  &nbsp;
399
- const tables = <span class="cstat-no" title="statement not covered" >await buildSchemaHelper(datasource)</span>
480
+ const { tables, error } = <span class="cstat-no" title="statement not covered" >await buildSchemaHelper(datasource)</span>
400
481
  <span class="cstat-no" title="statement not covered" > datasource.entities = tables</span>
401
482
  &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>
483
+ const dbResp = <span class="cstat-no" title="statement not covered" >await db.put(datasource)</span>
484
+ <span class="cstat-no" title="statement not covered" > datasource._rev = dbResp.rev</span>
404
485
  &nbsp;
405
- <span class="cstat-no" title="statement not covered" > ctx.body = datasource</span>
486
+ const response = <span class="cstat-no" title="statement not covered" >{ datasource }</span>
487
+ <span class="cstat-no" title="statement not covered" > if (error) {</span>
488
+ <span class="cstat-no" title="statement not covered" > response.error = error</span>
489
+ }
490
+ <span class="cstat-no" title="statement not covered" > ctx.body = response</span>
406
491
  }
407
492
  &nbsp;
408
493
  exports.update = <span class="fstat-no" title="function not covered" >as</span>ync function (ctx) {
@@ -424,7 +509,7 @@ exports.update = <span class="fstat-no" title="function not covered" >as</span>y
424
509
  &nbsp;
425
510
  <span class="cstat-no" title="statement not covered" > ctx.status = 200</span>
426
511
  <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>
512
+ <span class="cstat-no" title="statement not covered" > ctx.body = { datasource }</span>
428
513
  }
429
514
  &nbsp;
430
515
  exports.save = async function (ctx) {
@@ -438,33 +523,45 @@ exports.save = async function (ctx) {
438
523
  ...ctx.request.body.datasource,
439
524
  }
440
525
  &nbsp;
526
+ let schemaError = null
441
527
  <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>
528
+ const { tables, error } = <span class="cstat-no" title="statement not covered" >await buildSchemaHelper(datasource)</span>
529
+ <span class="cstat-no" title="statement not covered" > schemaError = error</span>
443
530
  <span class="cstat-no" title="statement not covered" > datasource.entities = tables</span>
444
531
  }
445
532
  &nbsp;
446
- const response = await db.put(datasource)
447
- datasource._rev = response.rev
533
+ const dbResp = await db.put(datasource)
534
+ datasource._rev = dbResp.rev
448
535
  &nbsp;
449
536
  // Drain connection pools when configuration is changed
450
- <span class="missing-if-branch" title="else path not taken" >E</span>if (datasource.source) {
537
+ if (datasource.source) {
451
538
  const source = integrations[datasource.source]
452
539
  <span class="missing-if-branch" title="if path not taken" >I</span>if (source &amp;&amp; source.pool) {
453
540
  <span class="cstat-no" title="statement not covered" > await source.pool.end()</span>
454
541
  }
455
542
  }
456
543
  &nbsp;
457
- ctx.status = 200
458
- ctx.message = "Datasource saved successfully."
459
- ctx.body = datasource
544
+ const response = { datasource }
545
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (schemaError) {
546
+ <span class="cstat-no" title="statement not covered" > response.error = schemaError</span>
547
+ }
548
+ ctx.body = response
460
549
  }
461
550
  &nbsp;
462
551
  exports.destroy = async function (ctx) {
463
552
  const db = new CouchDB(ctx.appId)
464
553
  &nbsp;
465
554
  // 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 })))
555
+ const queries = await db.allDocs(
556
+ getQueryParams(ctx.params.datasourceId, null)
557
+ )
558
+ await db.bulkDocs(
559
+ queries.rows.map(row =&gt; ({
560
+ _id: row.id,
561
+ _rev: row.value.rev,
562
+ _deleted: true,
563
+ }))
564
+ )
468
565
  &nbsp;
469
566
  // delete the datasource
470
567
  await db.remove(ctx.params.datasourceId, ctx.params.revId)
@@ -482,7 +579,7 @@ exports.find = async function (ctx) {
482
579
  exports.query = async function (ctx) {
483
580
  const queryJson = ctx.request.body
484
581
  try {
485
- ctx.body = await makeExternalQuery(ctx.appId, queryJson)
582
+ ctx.body = await getDatasourceAndQuery(ctx.appId, queryJson)
486
583
  } catch (err) {
487
584
  <span class="cstat-no" title="statement not covered" > ctx.throw(400, err)</span>
488
585
  }
@@ -496,7 +593,30 @@ const buildSchemaHelper = <span class="fstat-no" title="function not covered" >a
496
593
  <span class="cstat-no" title="statement not covered" > await connector.buildSchema(datasource._id, datasource.entities)</span>
497
594
  <span class="cstat-no" title="statement not covered" > datasource.entities = connector.tables</span>
498
595
  &nbsp;
499
- <span class="cstat-no" title="statement not covered" > return connector.tables</span>
596
+ // make sure they all have a display name selected
597
+ <span class="cstat-no" title="statement not covered" > for (let entity of Object.values(datasource.entities)) {</span>
598
+ <span class="cstat-no" title="statement not covered" > if (entity.primaryDisplay) {</span>
599
+ <span class="cstat-no" title="statement not covered" > continue</span>
600
+ }
601
+ const notAutoColumn = <span class="cstat-no" title="statement not covered" >Object.values(entity.schema).find(</span>
602
+ <span class="fstat-no" title="function not covered" > sc</span>hema =&gt; <span class="cstat-no" title="statement not covered" >!schema.autocolumn</span>
603
+ )
604
+ <span class="cstat-no" title="statement not covered" > if (notAutoColumn) {</span>
605
+ <span class="cstat-no" title="statement not covered" > entity.primaryDisplay = notAutoColumn.name</span>
606
+ }
607
+ }
608
+ &nbsp;
609
+ const errors = <span class="cstat-no" title="statement not covered" >connector.schemaErrors</span>
610
+ let error = <span class="cstat-no" title="statement not covered" >null</span>
611
+ <span class="cstat-no" title="statement not covered" > if (errors &amp;&amp; Object.keys(errors).length &gt; 0) {</span>
612
+ const noKeyTables = <span class="cstat-no" title="statement not covered" >Object.entries(errors)</span>
613
+ .filter(<span class="fstat-no" title="function not covered" >en</span>try =&gt; <span class="cstat-no" title="statement not covered" >entry[1] === BuildSchemaErrors.NO_KEY)</span>
614
+ .map(<span class="fstat-no" title="function not covered" >([</span>name]) =&gt; <span class="cstat-no" title="statement not covered" >name)</span>
615
+ <span class="cstat-no" title="statement not covered" > error = `No primary key constraint found for the following: ${noKeyTables.join(</span>
616
+ ", "
617
+ )}`
618
+ }
619
+ <span class="cstat-no" title="statement not covered" > return { tables: connector.tables, error }</span>
500
620
  }
501
621
  &nbsp;</pre></td></tr></table></pre>
502
622
 
@@ -505,7 +625,7 @@ const buildSchemaHelper = <span class="fstat-no" title="function not covered" >a
505
625
  <div class='footer quiet pad2 space-top1 center small'>
506
626
  Code coverage generated by
507
627
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
508
- at Thu Nov 11 2021 11:32:22 GMT+0000 (Coordinated Universal Time)
628
+ at Mon Nov 22 2021 10:23:31 GMT+0000 (Coordinated Universal Time)
509
629
  </div>
510
630
  </div>
511
631
  <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 Thu Nov 11 2021 11:32:22 GMT+0000 (Coordinated Universal Time)
433
+ at Mon Nov 22 2021 10:23:31 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 Thu Nov 11 2021 11:32:22 GMT+0000 (Coordinated Universal Time)
133
+ at Mon Nov 22 2021 10:23:31 GMT+0000 (Coordinated Universal Time)
134
134
  </div>
135
135
  </div>
136
136
  <script src="../../prettify.js"></script>