@budibase/server 1.0.27-alpha.1 → 1.0.27-alpha.13

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 (343) hide show
  1. package/__mocks__/node-fetch.ts +18 -0
  2. package/builder/assets/{index.4a13c4cb.css → index.176f00e0.css} +1 -1
  3. package/builder/assets/index.5776ef20.js +1348 -0
  4. package/builder/index.html +2 -2
  5. package/coverage/clover.xml +1193 -1027
  6. package/coverage/coverage-final.json +72 -72
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +3 -3
  9. package/coverage/lcov-report/api/controllers/application.js.html +73 -64
  10. package/coverage/lcov-report/api/controllers/auth.js.html +2 -2
  11. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +13 -4
  14. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +150 -48
  16. package/coverage/lcov-report/api/controllers/dev.js.html +3 -3
  17. package/coverage/lcov-report/api/controllers/hosting.js.html +3 -3
  18. package/coverage/lcov-report/api/controllers/index.html +20 -20
  19. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
  23. package/coverage/lcov-report/api/controllers/query/index.html +21 -21
  24. package/coverage/lcov-report/api/controllers/query/index.js.html +101 -122
  25. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -3
  26. package/coverage/lcov-report/api/controllers/role.js.html +2 -2
  27. package/coverage/lcov-report/api/controllers/routing.js.html +2 -2
  28. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/index.html +22 -22
  30. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/internal.js.html +38 -11
  32. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +8 -5
  33. package/coverage/lcov-report/api/controllers/row/utils.js.html +29 -20
  34. package/coverage/lcov-report/api/controllers/screen.js.html +2 -2
  35. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/user.js.html +14 -5
  43. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/webhook.js.html +2 -2
  49. package/coverage/lcov-report/api/index.html +1 -1
  50. package/coverage/lcov-report/api/index.js.html +6 -6
  51. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/apikeys.js.html +2 -2
  53. package/coverage/lcov-report/api/routes/application.js.html +2 -2
  54. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/automation.js.html +2 -2
  56. package/coverage/lcov-report/api/routes/backup.js.html +2 -2
  57. package/coverage/lcov-report/api/routes/cloud.js.html +2 -2
  58. package/coverage/lcov-report/api/routes/component.js.html +2 -2
  59. package/coverage/lcov-report/api/routes/datasource.js.html +2 -2
  60. package/coverage/lcov-report/api/routes/deploy.js.html +2 -2
  61. package/coverage/lcov-report/api/routes/dev.js.html +2 -2
  62. package/coverage/lcov-report/api/routes/hosting.js.html +2 -2
  63. package/coverage/lcov-report/api/routes/index.html +1 -1
  64. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/integration.js.html +2 -2
  66. package/coverage/lcov-report/api/routes/layout.js.html +2 -2
  67. package/coverage/lcov-report/api/routes/metadata.js.html +2 -2
  68. package/coverage/lcov-report/api/routes/permission.js.html +12 -3
  69. package/coverage/lcov-report/api/routes/query.js.html +25 -4
  70. package/coverage/lcov-report/api/routes/role.js.html +2 -2
  71. package/coverage/lcov-report/api/routes/routing.js.html +2 -2
  72. package/coverage/lcov-report/api/routes/row.js.html +2 -2
  73. package/coverage/lcov-report/api/routes/screen.js.html +2 -2
  74. package/coverage/lcov-report/api/routes/script.js.html +2 -2
  75. package/coverage/lcov-report/api/routes/static.js.html +2 -2
  76. package/coverage/lcov-report/api/routes/table.js.html +2 -2
  77. package/coverage/lcov-report/api/routes/templates.js.html +2 -2
  78. package/coverage/lcov-report/api/routes/user.js.html +2 -2
  79. package/coverage/lcov-report/api/routes/view.js.html +2 -2
  80. package/coverage/lcov-report/api/routes/webhook.js.html +2 -2
  81. package/coverage/lcov-report/automations/actions.js.html +1 -1
  82. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  83. package/coverage/lcov-report/automations/bullboard.js.html +2 -2
  84. package/coverage/lcov-report/automations/index.html +1 -1
  85. package/coverage/lcov-report/automations/index.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/executeQuery.js.html +32 -8
  92. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/index.html +11 -11
  95. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  113. package/coverage/lcov-report/automations/utils.js.html +6 -6
  114. package/coverage/lcov-report/constants/index.html +1 -1
  115. package/coverage/lcov-report/constants/index.js.html +4 -4
  116. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  117. package/coverage/lcov-report/constants/screens.js.html +2 -2
  118. package/coverage/lcov-report/db/client.js.html +2 -2
  119. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  120. package/coverage/lcov-report/db/index.html +1 -1
  121. package/coverage/lcov-report/db/index.js.html +1 -1
  122. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  123. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  124. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  126. package/coverage/lcov-report/db/newid.js.html +2 -2
  127. package/coverage/lcov-report/db/utils.js.html +19 -19
  128. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  129. package/coverage/lcov-report/events/index.html +1 -1
  130. package/coverage/lcov-report/events/index.js.html +1 -1
  131. package/coverage/lcov-report/events/utils.js.html +1 -1
  132. package/coverage/lcov-report/index.html +64 -64
  133. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  134. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  135. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  136. package/coverage/lcov-report/middleware/authorized.js.html +12 -12
  137. package/coverage/lcov-report/middleware/builder.js.html +10 -10
  138. package/coverage/lcov-report/middleware/currentapp.js.html +48 -36
  139. package/coverage/lcov-report/middleware/index.html +1 -1
  140. package/coverage/lcov-report/middleware/joi-validator.js.html +9 -9
  141. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  142. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  143. package/coverage/lcov-report/middleware/usageQuota.js.html +2 -2
  144. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  145. package/coverage/lcov-report/threads/automation.js.html +3 -3
  146. package/coverage/lcov-report/threads/index.html +31 -31
  147. package/coverage/lcov-report/threads/index.js.html +12 -12
  148. package/coverage/lcov-report/threads/query.js.html +369 -93
  149. package/coverage/lcov-report/threads/utils.js.html +359 -14
  150. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  151. package/coverage/lcov-report/utilities/budibaseDir.js.html +2 -2
  152. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  153. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  154. package/coverage/lcov-report/utilities/global.js.html +28 -19
  155. package/coverage/lcov-report/utilities/index.html +1 -1
  156. package/coverage/lcov-report/utilities/index.js.html +11 -11
  157. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  158. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  159. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  160. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  161. package/coverage/lcov-report/utilities/rowProcessor/index.html +19 -19
  162. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +247 -10
  163. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  164. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  165. package/coverage/lcov-report/utilities/security.js.html +13 -4
  166. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  167. package/coverage/lcov-report/utilities/users.js.html +1 -1
  168. package/coverage/lcov-report/utilities/workerRequests.js.html +22 -22
  169. package/coverage/lcov.info +2027 -1725
  170. package/dist/api/controllers/apikeys.js +2 -2
  171. package/dist/api/controllers/application.js +4 -4
  172. package/dist/api/controllers/auth.js +1 -1
  173. package/dist/api/controllers/cloud.js +2 -2
  174. package/dist/api/controllers/datasource.js +29 -0
  175. package/dist/api/controllers/deploy/index.js +2 -2
  176. package/dist/api/controllers/dev.js +2 -2
  177. package/dist/api/controllers/hosting.js +2 -2
  178. package/dist/api/controllers/permission.js +2 -2
  179. package/dist/api/controllers/query/import/sources/base/index.js +2 -1
  180. package/dist/api/controllers/query/import/sources/curl.js +11 -5
  181. package/dist/api/controllers/query/import/sources/openapi2.js +8 -5
  182. package/dist/api/controllers/query/index.js +45 -47
  183. package/dist/api/controllers/query/validation.js +2 -1
  184. package/dist/api/controllers/role.js +1 -1
  185. package/dist/api/controllers/routing.js +1 -1
  186. package/dist/api/controllers/row/internal.js +14 -6
  187. package/dist/api/controllers/row/internalSearch.js +3 -2
  188. package/dist/api/controllers/row/utils.js +13 -6
  189. package/dist/api/controllers/screen.js +1 -1
  190. package/dist/api/controllers/user.js +3 -3
  191. package/dist/api/controllers/webhook.js +1 -1
  192. package/dist/api/index.js +1 -1
  193. package/dist/api/routes/apikeys.js +1 -1
  194. package/dist/api/routes/application.js +1 -1
  195. package/dist/api/routes/automation.js +1 -1
  196. package/dist/api/routes/backup.js +1 -1
  197. package/dist/api/routes/cloud.js +1 -1
  198. package/dist/api/routes/component.js +1 -1
  199. package/dist/api/routes/datasource.js +1 -1
  200. package/dist/api/routes/deploy.js +1 -1
  201. package/dist/api/routes/dev.js +1 -1
  202. package/dist/api/routes/hosting.js +1 -1
  203. package/dist/api/routes/integration.js +1 -1
  204. package/dist/api/routes/layout.js +1 -1
  205. package/dist/api/routes/metadata.js +1 -1
  206. package/dist/api/routes/permission.js +1 -1
  207. package/dist/api/routes/query.js +4 -2
  208. package/dist/api/routes/role.js +1 -1
  209. package/dist/api/routes/routing.js +1 -1
  210. package/dist/api/routes/row.js +1 -1
  211. package/dist/api/routes/screen.js +1 -1
  212. package/dist/api/routes/script.js +1 -1
  213. package/dist/api/routes/static.js +1 -1
  214. package/dist/api/routes/table.js +1 -1
  215. package/dist/api/routes/templates.js +1 -1
  216. package/dist/api/routes/tests/utilities/TestFunctions.js +1 -1
  217. package/dist/api/routes/user.js +1 -1
  218. package/dist/api/routes/view.js +1 -1
  219. package/dist/api/routes/webhook.js +1 -1
  220. package/dist/app.js +1 -1
  221. package/dist/automations/bullboard.js +1 -1
  222. package/dist/automations/steps/executeQuery.js +9 -2
  223. package/dist/automations/utils.js +1 -1
  224. package/dist/constants/index.js +3 -3
  225. package/dist/constants/screens.js +1 -1
  226. package/dist/db/client.js +1 -1
  227. package/dist/db/utils.js +1 -1
  228. package/dist/integrations/base/sqlTable.js +1 -1
  229. package/dist/integrations/rest.js +3 -3
  230. package/dist/middleware/authorized.js +2 -2
  231. package/dist/middleware/builder.js +2 -2
  232. package/dist/middleware/currentapp.js +6 -6
  233. package/dist/middleware/usageQuota.js +1 -1
  234. package/dist/package.json +5 -4
  235. package/dist/tests/utilities/TestConfiguration.js +55 -8
  236. package/dist/tests/utilities/structures.js +2 -2
  237. package/dist/threads/automation.js +2 -2
  238. package/dist/threads/query.js +148 -52
  239. package/dist/threads/utils.js +106 -1
  240. package/dist/tsconfig.tsbuildinfo +1 -1
  241. package/dist/utilities/budibaseDir.js +1 -1
  242. package/dist/utilities/fileSystem/utilities.js +2 -1
  243. package/dist/utilities/global.js +5 -5
  244. package/dist/utilities/index.js +1 -1
  245. package/dist/utilities/redis.js +1 -1
  246. package/dist/utilities/rowProcessor/index.js +76 -0
  247. package/dist/utilities/security.js +2 -2
  248. package/dist/utilities/usageQuota.js +2 -2
  249. package/dist/utilities/workerRequests.js +3 -3
  250. package/package.json +6 -5
  251. package/scripts/replicateApp.js +1 -1
  252. package/src/api/controllers/apikeys.js +2 -2
  253. package/src/api/controllers/application.js +7 -4
  254. package/src/api/controllers/auth.js +1 -1
  255. package/src/api/controllers/cloud.js +5 -2
  256. package/src/api/controllers/datasource.js +34 -0
  257. package/src/api/controllers/deploy/index.js +2 -2
  258. package/src/api/controllers/dev.js +2 -2
  259. package/src/api/controllers/hosting.js +2 -2
  260. package/src/api/controllers/permission.js +2 -2
  261. package/src/api/controllers/query/import/sources/base/index.ts +3 -1
  262. package/src/api/controllers/query/import/sources/curl.ts +12 -4
  263. package/src/api/controllers/query/import/sources/openapi2.ts +9 -5
  264. package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +2 -3
  265. package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +6 -7
  266. package/src/api/controllers/query/import/tests/index.spec.js +0 -6
  267. package/src/api/controllers/query/index.js +48 -55
  268. package/src/api/controllers/query/validation.js +2 -1
  269. package/src/api/controllers/role.js +1 -1
  270. package/src/api/controllers/routing.js +1 -1
  271. package/src/api/controllers/row/internal.js +14 -5
  272. package/src/api/controllers/row/internalSearch.js +3 -2
  273. package/src/api/controllers/row/utils.js +11 -8
  274. package/src/api/controllers/screen.js +1 -1
  275. package/src/api/controllers/user.js +6 -3
  276. package/src/api/controllers/webhook.js +1 -1
  277. package/src/api/index.js +1 -1
  278. package/src/api/routes/apikeys.js +1 -1
  279. package/src/api/routes/application.js +1 -1
  280. package/src/api/routes/automation.js +1 -1
  281. package/src/api/routes/backup.js +1 -1
  282. package/src/api/routes/cloud.js +1 -1
  283. package/src/api/routes/component.js +1 -1
  284. package/src/api/routes/datasource.js +1 -1
  285. package/src/api/routes/deploy.js +1 -1
  286. package/src/api/routes/dev.js +1 -1
  287. package/src/api/routes/hosting.js +1 -1
  288. package/src/api/routes/integration.js +1 -1
  289. package/src/api/routes/layout.js +1 -1
  290. package/src/api/routes/metadata.js +1 -1
  291. package/src/api/routes/permission.js +4 -1
  292. package/src/api/routes/query.js +9 -2
  293. package/src/api/routes/role.js +1 -1
  294. package/src/api/routes/routing.js +1 -1
  295. package/src/api/routes/row.js +1 -1
  296. package/src/api/routes/screen.js +1 -1
  297. package/src/api/routes/script.js +1 -1
  298. package/src/api/routes/static.js +1 -1
  299. package/src/api/routes/table.js +1 -1
  300. package/src/api/routes/templates.js +1 -1
  301. package/src/api/routes/tests/datasource.spec.js +45 -0
  302. package/src/api/routes/tests/permissions.spec.js +1 -1
  303. package/src/api/routes/tests/query.spec.js +70 -1
  304. package/src/api/routes/tests/role.spec.js +2 -2
  305. package/src/api/routes/tests/routing.spec.js +1 -1
  306. package/src/api/routes/tests/user.spec.js +1 -1
  307. package/src/api/routes/tests/utilities/TestFunctions.js +1 -1
  308. package/src/api/routes/user.js +1 -1
  309. package/src/api/routes/view.js +1 -1
  310. package/src/api/routes/webhook.js +1 -1
  311. package/src/app.ts +1 -1
  312. package/src/automations/bullboard.js +1 -1
  313. package/src/automations/steps/executeQuery.js +10 -2
  314. package/src/automations/utils.js +1 -1
  315. package/src/constants/index.js +3 -3
  316. package/src/constants/screens.js +1 -1
  317. package/src/db/client.js +1 -1
  318. package/src/db/utils.js +1 -1
  319. package/src/definitions/datasource.ts +10 -0
  320. package/src/integrations/base/sqlTable.ts +1 -1
  321. package/src/integrations/rest.ts +6 -3
  322. package/src/middleware/authorized.js +2 -2
  323. package/src/middleware/builder.js +2 -2
  324. package/src/middleware/currentapp.js +11 -7
  325. package/src/middleware/tests/authorized.spec.js +2 -2
  326. package/src/middleware/tests/currentapp.spec.js +35 -41
  327. package/src/middleware/tests/usageQuota.spec.js +1 -1
  328. package/src/middleware/usageQuota.js +1 -1
  329. package/src/tests/utilities/TestConfiguration.js +65 -8
  330. package/src/tests/utilities/structures.js +2 -2
  331. package/src/threads/automation.js +2 -2
  332. package/src/threads/query.js +148 -56
  333. package/src/threads/utils.js +116 -1
  334. package/src/utilities/budibaseDir.js +1 -1
  335. package/src/utilities/fileSystem/utilities.js +3 -1
  336. package/src/utilities/global.js +8 -5
  337. package/src/utilities/index.js +1 -1
  338. package/src/utilities/redis.js +1 -1
  339. package/src/utilities/rowProcessor/index.js +79 -0
  340. package/src/utilities/security.js +5 -2
  341. package/src/utilities/usageQuota.js +2 -2
  342. package/src/utilities/workerRequests.js +3 -3
  343. package/builder/assets/index.00c4135e.js +0 -1320
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">68.42% </span>
26
+ <span class="strong">92.39% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>26/38</span>
28
+ <span class='fraction'>85/92</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">55.55% </span>
33
+ <span class="strong">81.08% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>10/18</span>
35
+ <span class='fraction'>30/37</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">87.5% </span>
40
+ <span class="strong">91.66% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>7/8</span>
42
+ <span class='fraction'>11/12</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">69.44% </span>
47
+ <span class="strong">93.18% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>25/36</span>
49
+ <span class='fraction'>82/88</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>
@@ -138,161 +138,437 @@
138
138
  <a name='L79'></a><a href='#L79'>79</a>
139
139
  <a name='L80'></a><a href='#L80'>80</a>
140
140
  <a name='L81'></a><a href='#L81'>81</a>
141
- <a name='L82'></a><a href='#L82'>82</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
142
- <span class="cline-any cline-yes">1x</span>
143
- <span class="cline-any cline-yes">1x</span>
141
+ <a name='L82'></a><a href='#L82'>82</a>
142
+ <a name='L83'></a><a href='#L83'>83</a>
143
+ <a name='L84'></a><a href='#L84'>84</a>
144
+ <a name='L85'></a><a href='#L85'>85</a>
145
+ <a name='L86'></a><a href='#L86'>86</a>
146
+ <a name='L87'></a><a href='#L87'>87</a>
147
+ <a name='L88'></a><a href='#L88'>88</a>
148
+ <a name='L89'></a><a href='#L89'>89</a>
149
+ <a name='L90'></a><a href='#L90'>90</a>
150
+ <a name='L91'></a><a href='#L91'>91</a>
151
+ <a name='L92'></a><a href='#L92'>92</a>
152
+ <a name='L93'></a><a href='#L93'>93</a>
153
+ <a name='L94'></a><a href='#L94'>94</a>
154
+ <a name='L95'></a><a href='#L95'>95</a>
155
+ <a name='L96'></a><a href='#L96'>96</a>
156
+ <a name='L97'></a><a href='#L97'>97</a>
157
+ <a name='L98'></a><a href='#L98'>98</a>
158
+ <a name='L99'></a><a href='#L99'>99</a>
159
+ <a name='L100'></a><a href='#L100'>100</a>
160
+ <a name='L101'></a><a href='#L101'>101</a>
161
+ <a name='L102'></a><a href='#L102'>102</a>
162
+ <a name='L103'></a><a href='#L103'>103</a>
163
+ <a name='L104'></a><a href='#L104'>104</a>
164
+ <a name='L105'></a><a href='#L105'>105</a>
165
+ <a name='L106'></a><a href='#L106'>106</a>
166
+ <a name='L107'></a><a href='#L107'>107</a>
167
+ <a name='L108'></a><a href='#L108'>108</a>
168
+ <a name='L109'></a><a href='#L109'>109</a>
169
+ <a name='L110'></a><a href='#L110'>110</a>
170
+ <a name='L111'></a><a href='#L111'>111</a>
171
+ <a name='L112'></a><a href='#L112'>112</a>
172
+ <a name='L113'></a><a href='#L113'>113</a>
173
+ <a name='L114'></a><a href='#L114'>114</a>
174
+ <a name='L115'></a><a href='#L115'>115</a>
175
+ <a name='L116'></a><a href='#L116'>116</a>
176
+ <a name='L117'></a><a href='#L117'>117</a>
177
+ <a name='L118'></a><a href='#L118'>118</a>
178
+ <a name='L119'></a><a href='#L119'>119</a>
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>
183
+ <a name='L124'></a><a href='#L124'>124</a>
184
+ <a name='L125'></a><a href='#L125'>125</a>
185
+ <a name='L126'></a><a href='#L126'>126</a>
186
+ <a name='L127'></a><a href='#L127'>127</a>
187
+ <a name='L128'></a><a href='#L128'>128</a>
188
+ <a name='L129'></a><a href='#L129'>129</a>
189
+ <a name='L130'></a><a href='#L130'>130</a>
190
+ <a name='L131'></a><a href='#L131'>131</a>
191
+ <a name='L132'></a><a href='#L132'>132</a>
192
+ <a name='L133'></a><a href='#L133'>133</a>
193
+ <a name='L134'></a><a href='#L134'>134</a>
194
+ <a name='L135'></a><a href='#L135'>135</a>
195
+ <a name='L136'></a><a href='#L136'>136</a>
196
+ <a name='L137'></a><a href='#L137'>137</a>
197
+ <a name='L138'></a><a href='#L138'>138</a>
198
+ <a name='L139'></a><a href='#L139'>139</a>
199
+ <a name='L140'></a><a href='#L140'>140</a>
200
+ <a name='L141'></a><a href='#L141'>141</a>
201
+ <a name='L142'></a><a href='#L142'>142</a>
202
+ <a name='L143'></a><a href='#L143'>143</a>
203
+ <a name='L144'></a><a href='#L144'>144</a>
204
+ <a name='L145'></a><a href='#L145'>145</a>
205
+ <a name='L146'></a><a href='#L146'>146</a>
206
+ <a name='L147'></a><a href='#L147'>147</a>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
234
+ <span class="cline-any cline-yes">2x</span>
235
+ <span class="cline-any cline-yes">2x</span>
236
+ <span class="cline-any cline-yes">2x</span>
237
+ <span class="cline-any cline-yes">2x</span>
238
+ <span class="cline-any cline-yes">2x</span>
239
+ <span class="cline-any cline-neutral">&nbsp;</span>
240
+ <span class="cline-any cline-neutral">&nbsp;</span>
241
+ <span class="cline-any cline-neutral">&nbsp;</span>
242
+ <span class="cline-any cline-yes">15x</span>
243
+ <span class="cline-any cline-yes">15x</span>
244
+ <span class="cline-any cline-yes">15x</span>
245
+ <span class="cline-any cline-yes">15x</span>
246
+ <span class="cline-any cline-yes">15x</span>
247
+ <span class="cline-any cline-yes">15x</span>
248
+ <span class="cline-any cline-yes">15x</span>
249
+ <span class="cline-any cline-yes">15x</span>
250
+ <span class="cline-any cline-yes">15x</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
252
+ <span class="cline-any cline-neutral">&nbsp;</span>
253
+ <span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-yes">15x</span>
255
+ <span class="cline-any cline-yes">15x</span>
144
256
  <span class="cline-any cline-neutral">&nbsp;</span>
145
257
  <span class="cline-any cline-neutral">&nbsp;</span>
258
+ <span class="cline-any cline-neutral">&nbsp;</span>
259
+ <span class="cline-any cline-yes">16x</span>
260
+ <span class="cline-any cline-neutral">&nbsp;</span>
261
+ <span class="cline-any cline-yes">16x</span>
262
+ <span class="cline-any cline-yes">16x</span>
263
+ <span class="cline-any cline-yes">16x</span>
264
+ <span class="cline-any cline-yes">16x</span>
146
265
  <span class="cline-any cline-yes">2x</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</span>
267
+ <span class="cline-any cline-yes">14x</span>
268
+ <span class="cline-any cline-neutral">&nbsp;</span>
269
+ <span class="cline-any cline-yes">14x</span>
270
+ <span class="cline-any cline-yes">14x</span>
271
+ <span class="cline-any cline-yes">14x</span>
272
+ <span class="cline-any cline-yes">14x</span>
273
+ <span class="cline-any cline-yes">14x</span>
274
+ <span class="cline-any cline-yes">12x</span>
275
+ <span class="cline-any cline-yes">12x</span>
276
+ <span class="cline-any cline-yes">12x</span>
277
+ <span class="cline-any cline-neutral">&nbsp;</span>
278
+ <span class="cline-any cline-neutral">&nbsp;</span>
279
+ <span class="cline-any cline-neutral">&nbsp;</span>
280
+ <span class="cline-any cline-yes">14x</span>
147
281
  <span class="cline-any cline-no">&nbsp;</span>
148
- <span class="cline-any cline-no">&nbsp;</span>
282
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</span>
149
284
  <span class="cline-any cline-neutral">&nbsp;</span>
150
285
  <span class="cline-any cline-no">&nbsp;</span>
151
286
  <span class="cline-any cline-neutral">&nbsp;</span>
152
287
  <span class="cline-any cline-neutral">&nbsp;</span>
153
- <span class="cline-any cline-yes">2x</span>
154
288
  <span class="cline-any cline-neutral">&nbsp;</span>
289
+ <span class="cline-any cline-yes">14x</span>
155
290
  <span class="cline-any cline-neutral">&nbsp;</span>
156
291
  <span class="cline-any cline-neutral">&nbsp;</span>
157
- <span class="cline-any cline-yes">2x</span>
158
292
  <span class="cline-any cline-neutral">&nbsp;</span>
159
293
  <span class="cline-any cline-neutral">&nbsp;</span>
160
294
  <span class="cline-any cline-neutral">&nbsp;</span>
295
+ <span class="cline-any cline-yes">1x</span>
161
296
  <span class="cline-any cline-neutral">&nbsp;</span>
297
+ <span class="cline-any cline-yes">1x</span>
298
+ <span class="cline-any cline-yes">1x</span>
162
299
  <span class="cline-any cline-neutral">&nbsp;</span>
163
300
  <span class="cline-any cline-neutral">&nbsp;</span>
164
301
  <span class="cline-any cline-neutral">&nbsp;</span>
302
+ <span class="cline-any cline-yes">13x</span>
303
+ <span class="cline-any cline-yes">11x</span>
165
304
  <span class="cline-any cline-neutral">&nbsp;</span>
166
- <span class="cline-any cline-yes">4x</span>
167
- <span class="cline-any cline-yes">4x</span>
168
- <span class="cline-any cline-yes">2x</span>
169
305
  <span class="cline-any cline-neutral">&nbsp;</span>
170
- <span class="cline-any cline-yes">2x</span>
171
306
  <span class="cline-any cline-neutral">&nbsp;</span>
172
- <span class="cline-any cline-yes">2x</span>
173
- <span class="cline-any cline-yes">2x</span>
174
- <span class="cline-any cline-yes">2x</span>
175
- <span class="cline-any cline-yes">2x</span>
176
- <span class="cline-any cline-yes">2x</span>
177
- <span class="cline-any cline-no">&nbsp;</span>
178
- <span class="cline-any cline-no">&nbsp;</span>
307
+ <span class="cline-any cline-yes">13x</span>
179
308
  <span class="cline-any cline-no">&nbsp;</span>
180
309
  <span class="cline-any cline-neutral">&nbsp;</span>
181
310
  <span class="cline-any cline-neutral">&nbsp;</span>
182
311
  <span class="cline-any cline-neutral">&nbsp;</span>
183
- <span class="cline-any cline-yes">2x</span>
184
- <span class="cline-any cline-no">&nbsp;</span>
312
+ <span class="cline-any cline-yes">13x</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-yes">13x</span>
185
315
  <span class="cline-any cline-no">&nbsp;</span>
186
316
  <span class="cline-any cline-neutral">&nbsp;</span>
187
317
  <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-yes">13x</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-yes">5x</span>
323
+ <span class="cline-any cline-yes">5x</span>
324
+ <span class="cline-any cline-yes">5x</span>
325
+ <span class="cline-any cline-yes">5x</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
188
327
  <span class="cline-any cline-neutral">&nbsp;</span>
189
- <span class="cline-any cline-yes">2x</span>
190
- <span class="cline-any cline-no">&nbsp;</span>
191
328
  <span class="cline-any cline-neutral">&nbsp;</span>
192
329
  <span class="cline-any cline-neutral">&nbsp;</span>
193
330
  <span class="cline-any cline-neutral">&nbsp;</span>
194
- <span class="cline-any cline-yes">2x</span>
195
- <span class="cline-any cline-no">&nbsp;</span>
196
331
  <span class="cline-any cline-neutral">&nbsp;</span>
197
332
  <span class="cline-any cline-neutral">&nbsp;</span>
198
333
  <span class="cline-any cline-neutral">&nbsp;</span>
199
- <span class="cline-any cline-yes">2x</span>
200
334
  <span class="cline-any cline-neutral">&nbsp;</span>
335
+ <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-neutral">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-yes">6x</span>
340
+ <span class="cline-any cline-yes">6x</span>
341
+ <span class="cline-any cline-yes">6x</span>
342
+ <span class="cline-any cline-yes">6x</span>
343
+ <span class="cline-any cline-yes">6x</span>
344
+ <span class="cline-any cline-yes">5x</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-yes">5x</span>
349
+ <span class="cline-any cline-yes">5x</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-yes">1x</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span>
353
+ <span class="cline-any cline-yes">6x</span>
354
+ <span class="cline-any cline-neutral">&nbsp;</span>
355
+ <span class="cline-any cline-neutral">&nbsp;</span>
356
+ <span class="cline-any cline-neutral">&nbsp;</span>
357
+ <span class="cline-any cline-yes">16x</span>
358
+ <span class="cline-any cline-yes">16x</span>
359
+ <span class="cline-any cline-no">&nbsp;</span>
360
+ <span class="cline-any cline-neutral">&nbsp;</span>
361
+ <span class="cline-any cline-yes">16x</span>
362
+ <span class="cline-any cline-yes">16x</span>
363
+ <span class="cline-any cline-yes">16x</span>
364
+ <span class="cline-any cline-yes">2x</span>
201
365
  <span class="cline-any cline-yes">2x</span>
366
+ <span class="cline-any cline-neutral">&nbsp;</span>
367
+ <span class="cline-any cline-neutral">&nbsp;</span>
368
+ <span class="cline-any cline-yes">16x</span>
369
+ <span class="cline-any cline-neutral">&nbsp;</span>
370
+ <span class="cline-any cline-yes">11x</span>
371
+ <span class="cline-any cline-yes">11x</span>
372
+ <span class="cline-any cline-neutral">&nbsp;</span>
373
+ <span class="cline-any cline-yes">6x</span>
202
374
  <span class="cline-any cline-no">&nbsp;</span>
203
375
  <span class="cline-any cline-neutral">&nbsp;</span>
204
376
  <span class="cline-any cline-neutral">&nbsp;</span>
205
- <span class="cline-any cline-yes">2x</span>
377
+ <span class="cline-any cline-yes">6x</span>
378
+ <span class="cline-any cline-yes">6x</span>
206
379
  <span class="cline-any cline-neutral">&nbsp;</span>
380
+ <span class="cline-any cline-yes">11x</span>
381
+ <span class="cline-any cline-yes">11x</span>
382
+ <span class="cline-any cline-yes">11x</span>
383
+ <span class="cline-any cline-yes">6x</span>
384
+ <span class="cline-any cline-yes">6x</span>
207
385
  <span class="cline-any cline-neutral">&nbsp;</span>
208
- <span class="cline-any cline-yes">1x</span>
209
- <span class="cline-any cline-yes">4x</span>
210
386
  <span class="cline-any cline-neutral">&nbsp;</span>
211
387
  <span class="cline-any cline-neutral">&nbsp;</span>
212
388
  <span class="cline-any cline-neutral">&nbsp;</span>
389
+ <span class="cline-any cline-yes">6x</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-neutral">&nbsp;</span>
392
+ <span class="cline-any cline-yes">16x</span>
213
393
  <span class="cline-any cline-neutral">&nbsp;</span>
214
394
  <span class="cline-any cline-neutral">&nbsp;</span>
215
395
  <span class="cline-any cline-neutral">&nbsp;</span>
216
396
  <span class="cline-any cline-yes">2x</span>
397
+ <span class="cline-any cline-yes">10x</span>
398
+ <span class="cline-any cline-yes">10x</span>
399
+ <span class="cline-any cline-neutral">&nbsp;</span>
400
+ <span class="cline-any cline-yes">8x</span>
217
401
  <span class="cline-any cline-neutral">&nbsp;</span>
218
402
  <span class="cline-any cline-neutral">&nbsp;</span>
219
403
  <span class="cline-any cline-yes">2x</span>
220
404
  <span class="cline-any cline-neutral">&nbsp;</span>
221
405
  <span class="cline-any cline-neutral">&nbsp;</span>
222
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">require("./utils").threadSetup()
406
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const threadUtils = require("./utils")
407
+ threadUtils.threadSetup()
223
408
  const ScriptRunner = require("../utilities/scriptRunner")
224
409
  const { integrations } = require("../integrations")
410
+ const { processStringSync } = require("@budibase/string-templates")
411
+ const CouchDB = require("../db")
225
412
  &nbsp;
226
- function formatResponse(resp) {
227
- <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof resp === "string") {
228
- <span class="cstat-no" title="statement not covered" > try {</span>
229
- <span class="cstat-no" title="statement not covered" > resp = JSON.parse(resp)</span>
230
- } catch (err) {
231
- <span class="cstat-no" title="statement not covered" > resp = { response: resp }</span>
232
- }
413
+ class QueryRunner {
414
+ constructor(input, flags = { noRecursiveQuery: false }) {
415
+ this.appId = input.appId
416
+ this.datasource = input.datasource
417
+ this.queryVerb = input.queryVerb
418
+ this.fields = input.fields
419
+ this.parameters = input.parameters
420
+ this.transformer = input.transformer
421
+ this.queryId = input.queryId
422
+ this.noRecursiveQuery = flags.noRecursiveQuery
423
+ this.cachedVariables = []
424
+ // allows the response from a query to be stored throughout this
425
+ // execution so that if it needs to be re-used for another variable
426
+ // it can be
427
+ this.queryResponse = {}
428
+ this.hasRerun = false
233
429
  }
234
- return resp
235
- }
236
430
  &nbsp;
237
- function hasExtraData(response) {
238
- return (
239
- typeof response === "object" &amp;&amp;
240
- !Array.isArray(response) &amp;&amp;
241
- <span class="branch-2 cbranch-no" title="branch not covered" > response.data != null </span>&amp;&amp;
242
- <span class="branch-3 cbranch-no" title="branch not covered" > response.info != null</span>
243
- )
244
- }
431
+ async execute() {
432
+ let { datasource, fields, queryVerb, transformer } = this
433
+ // pre-query, make sure datasource variables are added to parameters
434
+ const parameters = await this.addDatasourceVariables()
435
+ const query = threadUtils.enrichQueryFields(fields, parameters)
436
+ const Integration = integrations[datasource.source]
437
+ if (!Integration) {
438
+ throw "Integration type does not exist."
439
+ }
440
+ const integration = new Integration(datasource.config)
245
441
  &nbsp;
246
- async function runAndTransform(datasource, queryVerb, query, transformer) {
247
- const Integration = integrations[datasource.source]
248
- if (!Integration) {
249
- throw "Integration type does not exist."
250
- }
251
- const integration = new Integration(datasource.config)
442
+ let output = threadUtils.formatResponse(await integration[queryVerb](query))
443
+ let rows = output,
444
+ info = undefined,
445
+ extra = undefined
446
+ if (threadUtils.hasExtraData(output)) {
447
+ rows = output.data
448
+ info = output.info
449
+ extra = output.extra
450
+ }
252
451
  &nbsp;
253
- let output = formatResponse(await integration[queryVerb](query))
254
- let rows = output,
255
- info = undefined,
256
- extra = undefined
257
- <span class="missing-if-branch" title="if path not taken" >I</span>if (hasExtraData(output)) {
258
- <span class="cstat-no" title="statement not covered" > rows = output.data</span>
259
- <span class="cstat-no" title="statement not covered" > info = output.info</span>
260
- <span class="cstat-no" title="statement not covered" > extra = output.extra</span>
261
- }
452
+ // transform as required
453
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (transformer) {
454
+ const runner = <span class="cstat-no" title="statement not covered" >new ScriptRunner(transformer, {</span>
455
+ data: rows,
456
+ params: parameters,
457
+ })
458
+ <span class="cstat-no" title="statement not covered" > rows = runner.execute()</span>
459
+ }
262
460
  &nbsp;
263
- // transform as required
264
- <span class="missing-if-branch" title="if path not taken" >I</span>if (transformer) {
265
- const runner = <span class="cstat-no" title="statement not covered" >new ScriptRunner(transformer, { data: rows })</span>
266
- <span class="cstat-no" title="statement not covered" > rows = runner.execute()</span>
267
- }
461
+ // if the request fails we retry once, invalidating the cached value
462
+ if (
463
+ info &amp;&amp;
464
+ info.code &gt;= 400 &amp;&amp;
465
+ this.cachedVariables.length &gt; 0 &amp;&amp;
466
+ !this.hasRerun
467
+ ) {
468
+ this.hasRerun = true
469
+ // invalidate the cache value
470
+ await threadUtils.invalidateDynamicVariables(this.cachedVariables)
471
+ return this.execute()
472
+ }
268
473
  &nbsp;
269
- // needs to an array for next step
270
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(rows)) {
271
- <span class="cstat-no" title="statement not covered" > rows = [rows]</span>
272
- }
474
+ // needs to an array for next step
475
+ if (!Array.isArray(rows)) {
476
+ rows = [rows]
477
+ }
273
478
  &nbsp;
274
- // map into JSON if just raw primitive here
275
- <span class="missing-if-branch" title="if path not taken" >I</span>if (rows.find(row =&gt; typeof row !== "object")) {
276
- <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>
479
+ // map into JSON if just raw primitive here
480
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (rows.find(row =&gt; typeof row !== "object")) {
481
+ <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>
482
+ }
483
+ &nbsp;
484
+ // get all the potential fields in the schema
485
+ let keys = rows.flatMap(Object.keys)
486
+ &nbsp;
487
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (integration.end) {
488
+ <span class="cstat-no" title="statement not covered" > integration.end()</span>
489
+ }
490
+ &nbsp;
491
+ return { rows, keys, info, extra }
277
492
  }
278
493
  &nbsp;
279
- // get all the potential fields in the schema
280
- let keys = rows.flatMap(Object.keys)
494
+ async runAnotherQuery(queryId, parameters) {
495
+ const db = new CouchDB(this.appId)
496
+ const query = await db.get(queryId)
497
+ const datasource = await db.get(query.datasourceId)
498
+ return new QueryRunner(
499
+ {
500
+ appId: this.appId,
501
+ datasource,
502
+ queryVerb: query.queryVerb,
503
+ fields: query.fields,
504
+ parameters,
505
+ transformer: query.transformer,
506
+ },
507
+ { noRecursiveQuery: true }
508
+ ).execute()
509
+ }
281
510
  &nbsp;
282
- <span class="missing-if-branch" title="if path not taken" >I</span>if (integration.end) {
283
- <span class="cstat-no" title="statement not covered" > integration.end()</span>
511
+ async getDynamicVariable(variable) {
512
+ let { parameters } = this
513
+ const queryId = variable.queryId,
514
+ name = variable.name
515
+ let value = await threadUtils.checkCacheForDynamicVariable(queryId, name)
516
+ if (!value) {
517
+ value = this.queryResponse[queryId]
518
+ ? <span class="branch-0 cbranch-no" title="branch not covered" >this.queryResponse[queryId]</span>
519
+ : await this.runAnotherQuery(queryId, parameters)
520
+ // store incase this query is to be called again
521
+ this.queryResponse[queryId] = value
522
+ await threadUtils.storeDynamicVariable(queryId, name, value)
523
+ } else {
524
+ this.cachedVariables.push({ queryId, name })
525
+ }
526
+ return value
284
527
  }
285
528
  &nbsp;
286
- return { rows, keys, info, extra }
529
+ async addDatasourceVariables() {
530
+ let { datasource, parameters, fields } = this
531
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!datasource || !datasource.config) {
532
+ <span class="cstat-no" title="statement not covered" > return parameters</span>
533
+ }
534
+ const staticVars = datasource.config.staticVariables || {}
535
+ const dynamicVars = datasource.config.dynamicVariables || []
536
+ for (let [key, value] of Object.entries(staticVars)) {
537
+ if (!parameters[key]) {
538
+ parameters[key] = value
539
+ }
540
+ }
541
+ if (!this.noRecursiveQuery) {
542
+ // need to see if this uses any variables
543
+ const stringFields = JSON.stringify(fields)
544
+ const foundVars = dynamicVars.filter(variable =&gt; {
545
+ // don't allow a query to use its own dynamic variable (loop)
546
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (variable.queryId === this.queryId) {
547
+ <span class="cstat-no" title="statement not covered" > return false</span>
548
+ }
549
+ // look for {{ variable }} but allow spaces between handlebars
550
+ const regex = new RegExp(`{{[ ]*${variable.name}[ ]*}}`)
551
+ return regex.test(stringFields)
552
+ })
553
+ const dynamics = foundVars.map(dynVar =&gt; this.getDynamicVariable(dynVar))
554
+ const responses = await Promise.all(dynamics)
555
+ for (let i = 0; i &lt; foundVars.length; i++) {
556
+ const variable = foundVars[i]
557
+ parameters[variable.name] = processStringSync(variable.value, {
558
+ data: responses[i].rows,
559
+ info: responses[i].extra,
560
+ })
561
+ // make sure its known that this uses dynamic variables in case it fails
562
+ this.hasDynamicVariables = true
563
+ }
564
+ }
565
+ return parameters
566
+ }
287
567
  }
288
568
  &nbsp;
289
569
  module.exports = (input, callback) =&gt; {
290
- runAndTransform(
291
- input.datasource,
292
- input.queryVerb,
293
- input.query,
294
- input.transformer
295
- )
570
+ const Runner = new QueryRunner(input)
571
+ Runner.execute()
296
572
  .then(response =&gt; {
297
573
  callback(null, response)
298
574
  })
@@ -307,7 +583,7 @@ module.exports = (input, callback) =&gt; {
307
583
  <div class='footer quiet pad2 space-top1 center small'>
308
584
  Code coverage generated by
309
585
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
310
- at Fri Dec 31 2021 14:12:35 GMT+0000 (Coordinated Universal Time)
586
+ at Wed Jan 12 2022 13:19:56 GMT+0000 (Coordinated Universal Time)
311
587
  </div>
312
588
  </div>
313
589
  <script src="../prettify.js"></script>