@budibase/server 0.9.188 → 0.9.190-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/Dockerfile +7 -1
  2. package/__mocks__/mssql.ts +1 -1
  3. package/__mocks__/oracledb.ts +31 -0
  4. package/__mocks__/pg.ts +3 -0
  5. package/builder/assets/bb-space-man.5be51a45.svg +290 -0
  6. package/builder/assets/index.2bd3b345.js +1316 -0
  7. package/builder/assets/index.4fb3f887.css +1 -0
  8. package/builder/assets/oracle.66592424.png +0 -0
  9. package/builder/assets/vendor.470042a4.js +152 -0
  10. package/builder/assets/vendor.5e1fe644.css +1 -0
  11. package/builder/index.html +4 -4
  12. package/coverage/clover.xml +1608 -1191
  13. package/coverage/coverage-final.json +97 -93
  14. package/coverage/lcov-report/api/controllers/analytics.js.html +2 -2
  15. package/coverage/lcov-report/api/controllers/apikeys.js.html +2 -2
  16. package/coverage/lcov-report/api/controllers/application.js.html +113 -80
  17. package/coverage/lcov-report/api/controllers/auth.js.html +19 -10
  18. package/coverage/lcov-report/api/controllers/automation.js.html +3 -3
  19. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  22. package/coverage/lcov-report/api/controllers/datasource.js.html +245 -41
  23. package/coverage/lcov-report/api/controllers/dev.js.html +16 -7
  24. package/coverage/lcov-report/api/controllers/hosting.js.html +10 -10
  25. package/coverage/lcov-report/api/controllers/index.html +98 -98
  26. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/layout.js.html +9 -9
  28. package/coverage/lcov-report/api/controllers/metadata.js.html +3 -3
  29. package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
  30. package/coverage/lcov-report/api/controllers/query.js.html +79 -229
  31. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  32. package/coverage/lcov-report/api/controllers/routing.js.html +29 -29
  33. package/coverage/lcov-report/api/controllers/row/external.js.html +17 -8
  34. package/coverage/lcov-report/api/controllers/row/index.html +26 -26
  35. package/coverage/lcov-report/api/controllers/row/index.js.html +2 -2
  36. package/coverage/lcov-report/api/controllers/row/internal.js.html +9 -9
  37. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +2 -2
  38. package/coverage/lcov-report/api/controllers/row/utils.js.html +21 -30
  39. package/coverage/lcov-report/api/controllers/screen.js.html +3 -3
  40. package/coverage/lcov-report/api/controllers/script.js.html +3 -3
  41. package/coverage/lcov-report/api/controllers/table/external.js.html +1001 -0
  42. package/coverage/lcov-report/api/controllers/table/index.html +56 -26
  43. package/coverage/lcov-report/api/controllers/table/index.js.html +80 -350
  44. package/coverage/lcov-report/api/controllers/table/internal.js.html +533 -0
  45. package/coverage/lcov-report/api/controllers/table/utils.js.html +175 -52
  46. package/coverage/lcov-report/api/controllers/templates.js.html +4 -4
  47. package/coverage/lcov-report/api/controllers/user.js.html +390 -33
  48. package/coverage/lcov-report/api/controllers/view/exporters.js.html +19 -4
  49. package/coverage/lcov-report/api/controllers/view/index.html +22 -22
  50. package/coverage/lcov-report/api/controllers/view/index.js.html +52 -13
  51. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  52. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +3 -3
  53. package/coverage/lcov-report/api/controllers/webhook.js.html +4 -4
  54. package/coverage/lcov-report/api/index.html +1 -1
  55. package/coverage/lcov-report/api/index.js.html +5 -5
  56. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/dev.js.html +2 -2
  67. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/index.html +4 -4
  69. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/query.js.html +5 -2
  75. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/row.js.html +536 -2
  78. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/static.js.html +2 -2
  81. package/coverage/lcov-report/api/routes/table.js.html +464 -2
  82. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/user.js.html +17 -2
  84. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  85. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  86. package/coverage/lcov-report/automations/actions.js.html +2 -2
  87. package/coverage/lcov-report/automations/automationUtils.js.html +4 -4
  88. package/coverage/lcov-report/automations/bullboard.js.html +71 -20
  89. package/coverage/lcov-report/automations/index.html +35 -50
  90. package/coverage/lcov-report/automations/index.js.html +2 -2
  91. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/discord.js.html +3 -3
  96. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/executeScript.js.html +3 -3
  98. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/index.html +14 -14
  100. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +3 -3
  102. package/coverage/lcov-report/automations/steps/queryRows.js.html +3 -3
  103. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  106. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  107. package/coverage/lcov-report/automations/steps/utils.js.html +7 -7
  108. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  110. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  111. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  113. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  115. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  116. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggers.js.html +22 -10
  118. package/coverage/lcov-report/automations/utils.js.html +46 -16
  119. package/coverage/lcov-report/constants/index.html +5 -5
  120. package/coverage/lcov-report/constants/index.js.html +87 -21
  121. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  122. package/coverage/lcov-report/constants/screens.js.html +2 -2
  123. package/coverage/lcov-report/db/client.js.html +2 -2
  124. package/coverage/lcov-report/db/inMemoryView.js.html +2 -2
  125. package/coverage/lcov-report/db/index.html +2 -2
  126. package/coverage/lcov-report/db/index.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +6 -6
  128. package/coverage/lcov-report/db/linkedRows/index.html +10 -10
  129. package/coverage/lcov-report/db/linkedRows/index.js.html +5 -5
  130. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +6 -6
  131. package/coverage/lcov-report/db/newid.js.html +4 -4
  132. package/coverage/lcov-report/db/utils.js.html +75 -75
  133. package/coverage/lcov-report/events/AutomationEmitter.js.html +6 -6
  134. package/coverage/lcov-report/events/index.html +6 -6
  135. package/coverage/lcov-report/events/index.js.html +1 -1
  136. package/coverage/lcov-report/events/utils.js.html +5 -5
  137. package/coverage/lcov-report/index.html +106 -91
  138. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  139. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  140. package/coverage/lcov-report/middleware/appInfo.js.html +2 -2
  141. package/coverage/lcov-report/middleware/authorized.js.html +19 -16
  142. package/coverage/lcov-report/middleware/builder.js.html +22 -13
  143. package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
  144. package/coverage/lcov-report/middleware/index.html +23 -23
  145. package/coverage/lcov-report/middleware/joi-validator.js.html +2 -2
  146. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  147. package/coverage/lcov-report/middleware/selfhost.js.html +2 -2
  148. package/coverage/lcov-report/middleware/usageQuota.js.html +4 -4
  149. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  150. package/coverage/lcov-report/{automations/thread.js.html → threads/automation.js.html} +90 -33
  151. package/coverage/lcov-report/threads/index.html +141 -0
  152. package/coverage/lcov-report/threads/index.js.html +278 -0
  153. package/coverage/lcov-report/threads/query.js.html +278 -0
  154. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  155. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  156. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  157. package/coverage/lcov-report/utilities/csvParser.js.html +144 -15
  158. package/coverage/lcov-report/utilities/global.js.html +38 -23
  159. package/coverage/lcov-report/utilities/index.html +48 -48
  160. package/coverage/lcov-report/utilities/index.js.html +49 -16
  161. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +31 -10
  162. package/coverage/lcov-report/utilities/queue/index.html +14 -14
  163. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  164. package/coverage/lcov-report/utilities/routing/index.js.html +2 -2
  165. package/coverage/lcov-report/utilities/rowProcessor/index.html +4 -4
  166. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +2 -2
  167. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +3 -3
  168. package/coverage/lcov-report/utilities/scriptRunner.js.html +16 -7
  169. package/coverage/lcov-report/utilities/security.js.html +3 -3
  170. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  171. package/coverage/lcov-report/utilities/users.js.html +1 -1
  172. package/coverage/lcov-report/utilities/workerRequests.js.html +5 -5
  173. package/coverage/lcov.info +2687 -1942
  174. package/dist/api/controllers/application.js +16 -6
  175. package/dist/api/controllers/auth.js +3 -3
  176. package/dist/api/controllers/datasource.js +67 -16
  177. package/dist/api/controllers/deploy/index.js +2 -0
  178. package/dist/api/controllers/dev.js +4 -1
  179. package/dist/api/controllers/query.js +32 -62
  180. package/dist/api/controllers/row/ExternalRequest.js +83 -36
  181. package/dist/api/controllers/row/external.js +3 -1
  182. package/dist/api/controllers/row/utils.js +6 -12
  183. package/dist/api/controllers/table/external.js +249 -0
  184. package/dist/api/controllers/table/index.js +49 -123
  185. package/dist/api/controllers/table/internal.js +146 -0
  186. package/dist/api/controllers/table/utils.js +62 -28
  187. package/dist/api/controllers/user.js +123 -11
  188. package/dist/api/controllers/view/exporters.js +4 -0
  189. package/dist/api/controllers/view/index.js +14 -2
  190. package/dist/api/routes/query.js +1 -1
  191. package/dist/api/routes/row.js +178 -0
  192. package/dist/api/routes/table.js +150 -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 +17 -1
  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 +350 -177
  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 +16 -85
  209. package/dist/integrations/oracle.js +367 -0
  210. package/dist/integrations/postgres.js +35 -28
  211. package/dist/integrations/utils.js +71 -9
  212. package/dist/middleware/authorized.js +2 -1
  213. package/dist/middleware/builder.js +4 -1
  214. package/dist/package.json +18 -9
  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 +19 -10
  226. package/scripts/dev/manage.js +1 -0
  227. package/scripts/docs/README.md +31 -0
  228. package/scripts/docs/generate.js +74 -0
  229. package/scripts/docs/toSwagger.js +320 -0
  230. package/scripts/integrations/mssql/data/Dockerfile +9 -0
  231. package/scripts/integrations/mssql/data/entrypoint.sh +24 -0
  232. package/scripts/integrations/mssql/data/setup.sql +54 -0
  233. package/scripts/integrations/mssql/docker-compose.yaml +12 -0
  234. package/scripts/integrations/mssql/reset.sh +3 -0
  235. package/scripts/integrations/oracle/docker-compose.yml +19 -0
  236. package/scripts/integrations/oracle/instantclient/linux/x86-64/basiclite-21.4.zip +0 -0
  237. package/scripts/integrations/oracle/instantclient/linux/x86-64/install.sh +23 -0
  238. package/scripts/integrations/oracle/oracle.md +90 -0
  239. package/scripts/integrations/postgres/docker-compose.yml +3 -3
  240. package/scripts/likeCypress.ts +33 -0
  241. package/src/api/controllers/application.js +18 -7
  242. package/src/api/controllers/auth.js +3 -0
  243. package/src/api/controllers/datasource.js +84 -16
  244. package/src/api/controllers/deploy/index.js +2 -0
  245. package/src/api/controllers/dev.js +4 -1
  246. package/src/api/controllers/query.js +35 -85
  247. package/src/api/controllers/row/ExternalRequest.ts +99 -38
  248. package/src/api/controllers/row/external.js +4 -1
  249. package/src/api/controllers/row/utils.js +8 -11
  250. package/src/api/controllers/table/external.js +307 -0
  251. package/src/api/controllers/table/index.js +47 -137
  252. package/src/api/controllers/table/internal.js +151 -0
  253. package/src/api/controllers/table/utils.js +74 -33
  254. package/src/api/controllers/user.js +132 -13
  255. package/src/api/controllers/view/exporters.js +5 -0
  256. package/src/api/controllers/view/index.js +15 -2
  257. package/src/api/routes/query.js +1 -0
  258. package/src/api/routes/row.js +178 -0
  259. package/src/api/routes/table.js +154 -0
  260. package/src/api/routes/tests/application.spec.js +0 -2
  261. package/src/api/routes/tests/datasource.spec.js +2 -2
  262. package/src/api/routes/tests/misc.spec.js +5 -1
  263. package/src/api/routes/tests/query.spec.js +38 -9
  264. package/src/api/routes/tests/screen.spec.js +1 -1
  265. package/src/api/routes/user.js +5 -0
  266. package/src/app.ts +2 -10
  267. package/src/automations/bullboard.js +28 -11
  268. package/src/automations/tests/automation.spec.js +3 -4
  269. package/src/automations/triggers.js +7 -3
  270. package/src/automations/utils.js +12 -2
  271. package/src/constants/index.js +22 -0
  272. package/src/definitions/common.ts +7 -1
  273. package/src/definitions/datasource.ts +21 -3
  274. package/src/environment.js +15 -0
  275. package/src/integrations/airtable.ts +2 -1
  276. package/src/integrations/arangodb.ts +2 -1
  277. package/src/integrations/base/IntegrationBase.ts +6 -0
  278. package/src/integrations/base/datasourcePlus.ts +9 -0
  279. package/src/integrations/base/sql.ts +375 -218
  280. package/src/integrations/base/sqlTable.ts +180 -0
  281. package/src/integrations/base/utils.ts +22 -0
  282. package/src/integrations/couchdb.ts +2 -1
  283. package/src/integrations/dynamodb.ts +2 -1
  284. package/src/integrations/elasticsearch.ts +2 -1
  285. package/src/integrations/index.ts +7 -0
  286. package/src/integrations/microsoftSqlServer.ts +145 -13
  287. package/src/integrations/mongodb.ts +2 -1
  288. package/src/integrations/mysql.ts +23 -95
  289. package/src/integrations/oracle.ts +464 -0
  290. package/src/integrations/postgres.ts +45 -35
  291. package/src/integrations/rest.ts +2 -1
  292. package/src/integrations/s3.ts +2 -1
  293. package/src/integrations/tests/microsoftSqlServer.spec.js +22 -15
  294. package/src/integrations/tests/oracle.spec.js +94 -0
  295. package/src/integrations/tests/postgres.spec.js +4 -0
  296. package/src/integrations/utils.ts +78 -8
  297. package/src/middleware/authorized.js +2 -1
  298. package/src/middleware/builder.js +4 -1
  299. package/src/tests/utilities/TestConfiguration.js +2 -1
  300. package/src/{automations/thread.js → threads/automation.js} +27 -8
  301. package/src/threads/index.js +66 -0
  302. package/src/threads/query.js +66 -0
  303. package/src/utilities/csvParser.js +48 -5
  304. package/src/utilities/global.js +7 -2
  305. package/src/utilities/index.js +11 -0
  306. package/src/utilities/queue/inMemoryQueue.js +7 -0
  307. package/src/utilities/scriptRunner.js +4 -1
  308. package/src/utilities/tests/__snapshots__/csvParser.spec.js.snap +0 -6
  309. package/src/utilities/tests/csvParser.spec.js +3 -0
  310. package/tsconfig.json +1 -1
  311. package/builder/assets/index.550fdba7.js +0 -201
  312. package/builder/assets/index.7469e1e4.css +0 -29
  313. package/builder/assets/vendor.278a305c.js +0 -9
  314. 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">78.57% </span>
26
+ <span class="strong">84.5% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>77/98</span>
28
+ <span class='fraction'>60/71</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">53.66% </span>
33
+ <span class="strong">48% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>22/41</span>
35
+ <span class='fraction'>12/25</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">92.31% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>12/13</span>
42
+ <span class='fraction'>9/9</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">78.95% </span>
47
+ <span class="strong">84.28% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>75/95</span>
49
+ <span class='fraction'>59/70</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 high'></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>
@@ -215,115 +215,28 @@
215
215
  <a name='L156'></a><a href='#L156'>156</a>
216
216
  <a name='L157'></a><a href='#L157'>157</a>
217
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
269
- <span class="cline-any cline-yes">34x</span>
218
+ <a name='L159'></a><a href='#L159'>159</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
270
219
  <span class="cline-any cline-yes">34x</span>
220
+ <span class="cline-any cline-neutral">&nbsp;</span>
221
+ <span class="cline-any cline-neutral">&nbsp;</span>
222
+ <span class="cline-any cline-neutral">&nbsp;</span>
223
+ <span class="cline-any cline-neutral">&nbsp;</span>
271
224
  <span class="cline-any cline-yes">34x</span>
272
225
  <span class="cline-any cline-yes">34x</span>
273
226
  <span class="cline-any cline-yes">34x</span>
227
+ <span class="cline-any cline-neutral">&nbsp;</span>
274
228
  <span class="cline-any cline-yes">34x</span>
275
229
  <span class="cline-any cline-neutral">&nbsp;</span>
276
230
  <span class="cline-any cline-neutral">&nbsp;</span>
277
231
  <span class="cline-any cline-neutral">&nbsp;</span>
232
+ <span class="cline-any cline-yes">5x</span>
233
+ <span class="cline-any cline-yes">5x</span>
234
+ <span class="cline-any cline-yes">5x</span>
278
235
  <span class="cline-any cline-yes">4x</span>
279
236
  <span class="cline-any cline-yes">4x</span>
280
- <span class="cline-any cline-yes">4x</span>
281
- <span class="cline-any cline-yes">3x</span>
282
- <span class="cline-any cline-yes">3x</span>
283
- <span class="cline-any cline-neutral">&nbsp;</span>
284
- <span class="cline-any cline-neutral">&nbsp;</span>
285
- <span class="cline-any cline-yes">4x</span>
286
237
  <span class="cline-any cline-neutral">&nbsp;</span>
287
238
  <span class="cline-any cline-neutral">&nbsp;</span>
288
- <span class="cline-any cline-neutral">&nbsp;</span>
289
- <span class="cline-any cline-yes">2x</span>
290
- <span class="cline-any cline-no">&nbsp;</span>
291
- <span class="cline-any cline-no">&nbsp;</span>
292
- <span class="cline-any cline-neutral">&nbsp;</span>
293
- <span class="cline-any cline-no">&nbsp;</span>
294
- <span class="cline-any cline-neutral">&nbsp;</span>
295
- <span class="cline-any cline-neutral">&nbsp;</span>
296
- <span class="cline-any cline-yes">2x</span>
297
- <span class="cline-any cline-neutral">&nbsp;</span>
298
- <span class="cline-any cline-neutral">&nbsp;</span>
299
- <span class="cline-any cline-neutral">&nbsp;</span>
300
- <span class="cline-any cline-neutral">&nbsp;</span>
301
- <span class="cline-any cline-neutral">&nbsp;</span>
302
- <span class="cline-any cline-neutral">&nbsp;</span>
303
- <span class="cline-any cline-neutral">&nbsp;</span>
304
- <span class="cline-any cline-neutral">&nbsp;</span>
305
- <span class="cline-any cline-yes">2x</span>
306
- <span class="cline-any cline-neutral">&nbsp;</span>
307
- <span class="cline-any cline-neutral">&nbsp;</span>
308
- <span class="cline-any cline-yes">2x</span>
309
- <span class="cline-any cline-no">&nbsp;</span>
310
- <span class="cline-any cline-no">&nbsp;</span>
311
- <span class="cline-any cline-neutral">&nbsp;</span>
312
- <span class="cline-any cline-neutral">&nbsp;</span>
313
- <span class="cline-any cline-neutral">&nbsp;</span>
314
- <span class="cline-any cline-yes">2x</span>
315
- <span class="cline-any cline-no">&nbsp;</span>
316
- <span class="cline-any cline-neutral">&nbsp;</span>
317
- <span class="cline-any cline-neutral">&nbsp;</span>
318
- <span class="cline-any cline-neutral">&nbsp;</span>
319
- <span class="cline-any cline-yes">2x</span>
320
- <span class="cline-any cline-no">&nbsp;</span>
321
- <span class="cline-any cline-neutral">&nbsp;</span>
322
- <span class="cline-any cline-neutral">&nbsp;</span>
323
- <span class="cline-any cline-neutral">&nbsp;</span>
324
- <span class="cline-any cline-yes">2x</span>
325
- <span class="cline-any cline-neutral">&nbsp;</span>
326
- <span class="cline-any cline-yes">2x</span>
239
+ <span class="cline-any cline-yes">5x</span>
327
240
  <span class="cline-any cline-neutral">&nbsp;</span>
328
241
  <span class="cline-any cline-neutral">&nbsp;</span>
329
242
  <span class="cline-any cline-yes">34x</span>
@@ -338,25 +251,25 @@
338
251
  <span class="cline-any cline-neutral">&nbsp;</span>
339
252
  <span class="cline-any cline-neutral">&nbsp;</span>
340
253
  <span class="cline-any cline-yes">34x</span>
341
- <span class="cline-any cline-yes">18x</span>
342
- <span class="cline-any cline-yes">18x</span>
254
+ <span class="cline-any cline-yes">20x</span>
255
+ <span class="cline-any cline-yes">20x</span>
343
256
  <span class="cline-any cline-neutral">&nbsp;</span>
344
- <span class="cline-any cline-yes">18x</span>
345
- <span class="cline-any cline-yes">18x</span>
257
+ <span class="cline-any cline-yes">20x</span>
258
+ <span class="cline-any cline-yes">20x</span>
346
259
  <span class="cline-any cline-neutral">&nbsp;</span>
347
260
  <span class="cline-any cline-neutral">&nbsp;</span>
348
- <span class="cline-any cline-yes">18x</span>
349
- <span class="cline-any cline-yes">18x</span>
261
+ <span class="cline-any cline-yes">20x</span>
262
+ <span class="cline-any cline-yes">20x</span>
350
263
  <span class="cline-any cline-neutral">&nbsp;</span>
351
- <span class="cline-any cline-yes">18x</span>
352
- <span class="cline-any cline-yes">18x</span>
264
+ <span class="cline-any cline-yes">20x</span>
265
+ <span class="cline-any cline-yes">20x</span>
353
266
  <span class="cline-any cline-neutral">&nbsp;</span>
354
267
  <span class="cline-any cline-neutral">&nbsp;</span>
355
268
  <span class="cline-any cline-neutral">&nbsp;</span>
356
- <span class="cline-any cline-yes">2x</span>
269
+ <span class="cline-any cline-yes">4x</span>
357
270
  <span class="cline-any cline-neutral">&nbsp;</span>
358
271
  <span class="cline-any cline-neutral">&nbsp;</span>
359
- <span class="cline-any cline-yes">2x</span>
272
+ <span class="cline-any cline-yes">4x</span>
360
273
  <span class="cline-any cline-no">&nbsp;</span>
361
274
  <span class="cline-any cline-no">&nbsp;</span>
362
275
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -367,11 +280,13 @@
367
280
  <span class="cline-any cline-neutral">&nbsp;</span>
368
281
  <span class="cline-any cline-no">&nbsp;</span>
369
282
  <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</span>
284
+ <span class="cline-any cline-neutral">&nbsp;</span>
370
285
  <span class="cline-any cline-no">&nbsp;</span>
371
286
  <span class="cline-any cline-neutral">&nbsp;</span>
372
287
  <span class="cline-any cline-neutral">&nbsp;</span>
373
288
  <span class="cline-any cline-neutral">&nbsp;</span>
374
- <span class="cline-any cline-yes">2x</span>
289
+ <span class="cline-any cline-yes">4x</span>
375
290
  <span class="cline-any cline-neutral">&nbsp;</span>
376
291
  <span class="cline-any cline-neutral">&nbsp;</span>
377
292
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -388,19 +303,18 @@
388
303
  <span class="cline-any cline-no">&nbsp;</span>
389
304
  <span class="cline-any cline-neutral">&nbsp;</span>
390
305
  <span class="cline-any cline-neutral">&nbsp;</span>
391
- <span class="cline-any cline-yes">2x</span>
306
+ <span class="cline-any cline-yes">4x</span>
392
307
  <span class="cline-any cline-neutral">&nbsp;</span>
393
308
  <span class="cline-any cline-neutral">&nbsp;</span>
394
309
  <span class="cline-any cline-yes">34x</span>
395
- <span class="cline-any cline-yes">2x</span>
396
- <span class="cline-any cline-yes">2x</span>
310
+ <span class="cline-any cline-yes">3x</span>
311
+ <span class="cline-any cline-yes">3x</span>
397
312
  <span class="cline-any cline-neutral">&nbsp;</span>
398
- <span class="cline-any cline-yes">2x</span>
399
- <span class="cline-any cline-yes">1x</span>
313
+ <span class="cline-any cline-yes">3x</span>
400
314
  <span class="cline-any cline-yes">1x</span>
401
315
  <span class="cline-any cline-yes">1x</span>
402
316
  <span class="cline-any cline-neutral">&nbsp;</span>
403
- <span class="cline-any cline-yes">2x</span>
317
+ <span class="cline-any cline-yes">3x</span>
404
318
  <span class="cline-any cline-neutral">&nbsp;</span>
405
319
  <span class="cline-any cline-neutral">&nbsp;</span>
406
320
  <span class="cline-any cline-yes">34x</span>
@@ -409,16 +323,10 @@
409
323
  <span class="cline-any cline-yes">2x</span>
410
324
  <span class="cline-any cline-neutral">&nbsp;</span>
411
325
  <span class="cline-any cline-yes">2x</span>
412
- <span class="cline-any cline-neutral">&nbsp;</span>
413
326
  <span class="cline-any cline-yes">2x</span>
414
- <span class="cline-any cline-yes">1x</span>
415
- <span class="cline-any cline-neutral">&nbsp;</span>
416
- <span class="cline-any cline-neutral">&nbsp;</span>
417
- <span class="cline-any cline-yes">1x</span>
418
- <span class="cline-any cline-yes">1x</span>
419
- <span class="cline-any cline-yes">1x</span>
420
327
  <span class="cline-any cline-neutral">&nbsp;</span>
421
- <span class="cline-any cline-yes">1x</span>
328
+ <span class="cline-any cline-yes">2x</span>
329
+ <span class="cline-any cline-yes">2x</span>
422
330
  <span class="cline-any cline-neutral">&nbsp;</span>
423
331
  <span class="cline-any cline-neutral">&nbsp;</span>
424
332
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -431,7 +339,6 @@
431
339
  <span class="cline-any cline-neutral">&nbsp;</span>
432
340
  <span class="cline-any cline-neutral">&nbsp;</span>
433
341
  <span class="cline-any cline-yes">1x</span>
434
- <span class="cline-any cline-no">&nbsp;</span>
435
342
  <span class="cline-any cline-neutral">&nbsp;</span>
436
343
  <span class="cline-any cline-neutral">&nbsp;</span>
437
344
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -443,18 +350,12 @@
443
350
  <span class="cline-any cline-neutral">&nbsp;</span>
444
351
  <span class="cline-any cline-yes">2x</span>
445
352
  <span class="cline-any cline-neutral">&nbsp;</span>
446
- <span class="cline-any cline-yes">2x</span>
447
- <span class="cline-any cline-yes">1x</span>
448
353
  <span class="cline-any cline-neutral">&nbsp;</span>
449
354
  <span class="cline-any cline-neutral">&nbsp;</span>
450
- <span class="cline-any cline-yes">1x</span>
451
355
  <span class="cline-any cline-neutral">&nbsp;</span>
452
356
  <span class="cline-any cline-neutral">&nbsp;</span>
453
- <span class="cline-any cline-neutral">&nbsp;</span>
454
- <span class="cline-any cline-yes">1x</span>
455
- <span class="cline-any cline-neutral">&nbsp;</span>
456
- <span class="cline-any cline-neutral">&nbsp;</span>
457
- <span class="cline-any cline-yes">1x</span>
357
+ <span class="cline-any cline-yes">2x</span>
358
+ <span class="cline-any cline-yes">2x</span>
458
359
  <span class="cline-any cline-neutral">&nbsp;</span>
459
360
  <span class="cline-any cline-neutral">&nbsp;</span>
460
361
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -463,7 +364,6 @@
463
364
  <span class="cline-any cline-yes">1x</span>
464
365
  <span class="cline-any cline-neutral">&nbsp;</span>
465
366
  <span class="cline-any cline-yes">1x</span>
466
- <span class="cline-any cline-no">&nbsp;</span>
467
367
  <span class="cline-any cline-neutral">&nbsp;</span>
468
368
  <span class="cline-any cline-neutral">&nbsp;</span>
469
369
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -475,65 +375,28 @@
475
375
  <span class="cline-any cline-neutral">&nbsp;</span>
476
376
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const { processString } = require("@budibase/string-templates")
477
377
  const CouchDB = require("../../db")
478
- const { generateQueryID, getQueryParams } = require("../../db/utils")
479
- const { integrations } = require("../../integrations")
378
+ const {
379
+ generateQueryID,
380
+ getQueryParams,
381
+ isProdAppID,
382
+ } = require("../../db/utils")
480
383
  const { BaseQueryVerbs } = require("../../constants")
481
- const env = require("../../environment")
482
- const ScriptRunner = require("../../utilities/scriptRunner")
384
+ const { Thread, ThreadType } = require("../../threads")
385
+ &nbsp;
386
+ const Runner = new Thread(ThreadType.QUERY, { timeoutMs: 10000 })
483
387
  &nbsp;
484
388
  // simple function to append "readable" to all read queries
485
389
  function enrichQueries(input) {
486
390
  const wasArray = Array.isArray(input)
487
391
  const queries = wasArray ? input : [input]
488
392
  for (let query of queries) {
489
- <span class="missing-if-branch" title="else path not taken" >E</span>if (query.queryVerb === BaseQueryVerbs.READ) {
393
+ if (query.queryVerb === BaseQueryVerbs.READ) {
490
394
  query.readable = true
491
395
  }
492
396
  }
493
397
  return wasArray ? queries : queries[0]
494
398
  }
495
399
  &nbsp;
496
- function formatResponse(resp) {
497
- <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof resp === "string") {
498
- <span class="cstat-no" title="statement not covered" > try {</span>
499
- <span class="cstat-no" title="statement not covered" > resp = JSON.parse(resp)</span>
500
- } catch (err) {
501
- <span class="cstat-no" title="statement not covered" > resp = { response: resp }</span>
502
- }
503
- }
504
- return resp
505
- }
506
- &nbsp;
507
- async function runAndTransform(
508
- integration,
509
- queryVerb,
510
- enrichedQuery,
511
- transformer
512
- ) {
513
- let rows = formatResponse(await integration[queryVerb](enrichedQuery))
514
- &nbsp;
515
- // transform as required
516
- <span class="missing-if-branch" title="if path not taken" >I</span>if (transformer) {
517
- const runner = <span class="cstat-no" title="statement not covered" >new ScriptRunner(transformer, { data: rows })</span>
518
- <span class="cstat-no" title="statement not covered" > rows = runner.execute()</span>
519
- }
520
- &nbsp;
521
- // needs to an array for next step
522
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(rows)) {
523
- <span class="cstat-no" title="statement not covered" > rows = [rows]</span>
524
- }
525
- &nbsp;
526
- // map into JSON if just raw primitive here
527
- <span class="missing-if-branch" title="if path not taken" >I</span>if (rows.find(row =&gt; typeof row !== "object")) {
528
- <span class="cstat-no" title="statement not covered" > rows = rows.map(<span class="fstat-no" title="function not covered" >va</span>lue =&gt; (<span class="cstat-no" title="statement not covered" >{ value })</span>)</span>
529
- }
530
- &nbsp;
531
- // get all the potential fields in the schema
532
- let keys = rows.flatMap(Object.keys)
533
- &nbsp;
534
- return { rows, keys }
535
- }
536
- &nbsp;
537
400
  exports.fetch = async function (ctx) {
538
401
  const db = new CouchDB(ctx.appId)
539
402
  &nbsp;
@@ -549,7 +412,7 @@ exports.save = async function (ctx) {
549
412
  const db = new CouchDB(ctx.appId)
550
413
  const query = ctx.request.body
551
414
  &nbsp;
552
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!query._id) {
415
+ if (!query._id) {
553
416
  query._id = generateQueryID(query.datasourceId)
554
417
  }
555
418
  &nbsp;
@@ -573,7 +436,9 @@ async function enrichQueryFields(fields, parameters = <span class="branch-0 cbra
573
436
  <span class="cstat-no" title="statement not covered" > enrichedQuery[key] = await enrichQueryFields(fields[key], parameters)</span>
574
437
  } else <span class="cstat-no" title="statement not covered" >if (typeof fields[key] === "string") {</span>
575
438
  // enrich string value as normal
576
- <span class="cstat-no" title="statement not covered" > enrichedQuery[key] = await processString(fields[key], parameters)</span>
439
+ <span class="cstat-no" title="statement not covered" > enrichedQuery[key] = await processString(fields[key], parameters, {</span>
440
+ noHelpers: true,
441
+ })
577
442
  } else {
578
443
  <span class="cstat-no" title="statement not covered" > enrichedQuery[key] = fields[key]</span>
579
444
  }
@@ -603,10 +468,9 @@ exports.find = async function (ctx) {
603
468
  const db = new CouchDB(ctx.appId)
604
469
  const query = enrichQueries(await db.get(ctx.params.queryId))
605
470
  // remove properties that could be dangerous in real app
606
- if (env.isProd()) {
471
+ if (isProdAppID(ctx.appId)) {
607
472
  delete query.fields
608
473
  delete query.parameters
609
- delete query.schema
610
474
  }
611
475
  ctx.body = query
612
476
  }
@@ -615,31 +479,24 @@ exports.preview = async function (ctx) {
615
479
  const db = new CouchDB(ctx.appId)
616
480
  &nbsp;
617
481
  const datasource = await db.get(ctx.request.body.datasourceId)
618
- &nbsp;
619
- const Integration = integrations[datasource.source]
620
- &nbsp;
621
- if (!Integration) {
622
- ctx.throw(400, "Integration type does not exist.")
623
- }
624
482
  &nbsp;
625
483
  const { fields, parameters, queryVerb, transformer } = ctx.request.body
626
484
  const enrichedQuery = await enrichQueryFields(fields, parameters)
627
- const integration = new Integration(datasource.config)
628
485
  &nbsp;
629
- const { rows, keys } = await runAndTransform(
630
- integration,
631
- queryVerb,
632
- enrichedQuery,
633
- transformer
634
- )
486
+ try {
487
+ const { rows, keys } = await Runner.run({
488
+ datasource,
489
+ queryVerb,
490
+ query: enrichedQuery,
491
+ transformer,
492
+ })
635
493
  &nbsp;
636
- ctx.body = {
637
- rows,
638
- schemaFields: [...new Set(keys)],
639
- }
640
- // cleanup
641
- <span class="missing-if-branch" title="if path not taken" >I</span>if (integration.end) {
642
- <span class="cstat-no" title="statement not covered" > integration.end()</span>
494
+ ctx.body = {
495
+ rows,
496
+ schemaFields: [...new Set(keys)],
497
+ }
498
+ } catch (err) {
499
+ ctx.throw(400, err)
643
500
  }
644
501
  }
645
502
  &nbsp;
@@ -648,30 +505,23 @@ exports.execute = async function (ctx) {
648
505
  &nbsp;
649
506
  const query = await db.get(ctx.params.queryId)
650
507
  const datasource = await db.get(query.datasourceId)
651
- &nbsp;
652
- const Integration = integrations[datasource.source]
653
- &nbsp;
654
- if (!Integration) {
655
- ctx.throw(400, "Integration type does not exist.")
656
- }
657
508
  &nbsp;
658
509
  const enrichedQuery = await enrichQueryFields(
659
510
  query.fields,
660
511
  ctx.request.body.parameters
661
512
  )
662
- const integration = new Integration(datasource.config)
663
513
  &nbsp;
664
514
  // call the relevant CRUD method on the integration class
665
- const { rows } = await runAndTransform(
666
- integration,
667
- query.queryVerb,
668
- enrichedQuery,
669
- query.transformer
670
- )
671
- ctx.body = rows
672
- // cleanup
673
- <span class="missing-if-branch" title="if path not taken" >I</span>if (integration.end) {
674
- <span class="cstat-no" title="statement not covered" > integration.end()</span>
515
+ try {
516
+ const { rows } = await Runner.run({
517
+ datasource,
518
+ queryVerb: query.queryVerb,
519
+ query: enrichedQuery,
520
+ transformer: query.transformer,
521
+ })
522
+ ctx.body = rows
523
+ } catch (err) {
524
+ ctx.throw(400, err)
675
525
  }
676
526
  }
677
527
  &nbsp;
@@ -688,7 +538,7 @@ exports.destroy = async function (ctx) {
688
538
  <div class='footer quiet pad2 space-top1 center small'>
689
539
  Code coverage generated by
690
540
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
691
- at Thu Nov 18 2021 07:07:10 GMT+0000 (Coordinated Universal Time)
541
+ at Fri Nov 26 2021 18:59:43 GMT+0000 (Coordinated Universal Time)
692
542
  </div>
693
543
  </div>
694
544
  <script src="../../prettify.js"></script>
@@ -23,28 +23,28 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">87.04% </span>
26
+ <span class="strong">87.03% </span>
27
27
  <span class="quiet">Statements</span>
28
28
  <span class='fraction'>47/54</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">63.64% </span>
33
+ <span class="strong">63.63% </span>
34
34
  <span class="quiet">Branches</span>
35
35
  <span class='fraction'>14/22</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">71.43% </span>
40
+ <span class="strong">71.42% </span>
41
41
  <span class="quiet">Functions</span>
42
42
  <span class='fraction'>5/7</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">88.68% </span>
47
+ <span class="strong">88.67% </span>
48
48
  <span class="quiet">Lines</span>
49
49
  <span class='fraction'>47/53</span>
50
50
  </div>
@@ -283,13 +283,13 @@ async function updateRolesOnUserTable(db, roleId, updateOption) {
283
283
  const indexOf = constraints.inclusion.indexOf(roleId)
284
284
  if (remove &amp;&amp; indexOf !== -1) {
285
285
  constraints.inclusion.splice(indexOf, 1)
286
- } else <span class="missing-if-branch" title="else path not taken" >E</span>if (!remove &amp;&amp; indexOf === -1) {
286
+ } else if (!remove &amp;&amp; indexOf === -1) {
287
287
  constraints.inclusion.push(roleId)
288
288
  }
289
289
  break
290
290
  }
291
291
  }
292
- <span class="missing-if-branch" title="else path not taken" >E</span>if (updated) {
292
+ if (updated) {
293
293
  await db.put(table)
294
294
  }
295
295
  }
@@ -305,9 +305,9 @@ exports.find = async function (ctx) {
305
305
  exports.save = async function (ctx) {
306
306
  const db = new CouchDB(ctx.appId)
307
307
  let { _id, name, inherits, permissionId } = ctx.request.body
308
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!_id) {
308
+ if (!_id) {
309
309
  _id = generateRoleID()
310
- } else <span class="cstat-no" title="statement not covered" >if (isBuiltin(_id)) {</span>
310
+ } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (isBuiltin(_id)) {</span>
311
311
  <span class="cstat-no" title="statement not covered" > ctx.throw(400, "Cannot update builtin roles.")</span>
312
312
  }
313
313
  const role = new Role(_id, name)
@@ -358,7 +358,7 @@ exports.destroy = async function (ctx) {
358
358
  <div class='footer quiet pad2 space-top1 center small'>
359
359
  Code coverage generated by
360
360
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
361
- at Thu Nov 18 2021 07:07:10 GMT+0000 (Coordinated Universal Time)
361
+ at Fri Nov 26 2021 18:59:43 GMT+0000 (Coordinated Universal Time)
362
362
  </div>
363
363
  </div>
364
364
  <script src="../../prettify.js"></script>