@budibase/server 1.0.27-alpha.2 → 1.0.27-alpha.6

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 (192) hide show
  1. package/__mocks__/node-fetch.ts +18 -0
  2. package/builder/assets/{index.5522fcd5.css → index.431d69df.css} +1 -1
  3. package/builder/assets/{index.e9e2c4d7.js → index.f909f0e2.js} +245 -240
  4. package/builder/index.html +2 -2
  5. package/coverage/clover.xml +429 -339
  6. package/coverage/coverage-final.json +22 -22
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/application.js.html +54 -54
  10. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  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 +1 -1
  14. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +49 -49
  16. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/hosting.js.html +1 -1
  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 +1 -1
  23. package/coverage/lcov-report/api/controllers/query/index.html +19 -19
  24. package/coverage/lcov-report/api/controllers/query/index.js.html +66 -150
  25. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -3
  26. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  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 +1 -1
  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 +1 -1
  49. package/coverage/lcov-report/api/index.html +1 -1
  50. package/coverage/lcov-report/api/index.js.html +5 -5
  51. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  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 +1 -1
  66. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/query.js.html +24 -3
  70. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  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 +1 -1
  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 +31 -7
  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 +5 -5
  114. package/coverage/lcov-report/constants/index.html +1 -1
  115. package/coverage/lcov-report/constants/index.js.html +1 -1
  116. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  117. package/coverage/lcov-report/constants/screens.js.html +1 -1
  118. package/coverage/lcov-report/db/client.js.html +1 -1
  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 +18 -18
  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 +46 -46
  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 +10 -10
  137. package/coverage/lcov-report/middleware/builder.js.html +8 -8
  138. package/coverage/lcov-report/middleware/currentapp.js.html +28 -28
  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 +17 -17
  142. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  143. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  144. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  145. package/coverage/lcov-report/threads/automation.js.html +1 -1
  146. package/coverage/lcov-report/threads/index.html +30 -30
  147. package/coverage/lcov-report/threads/index.js.html +11 -11
  148. package/coverage/lcov-report/threads/query.js.html +358 -91
  149. package/coverage/lcov-report/threads/utils.js.html +352 -10
  150. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  151. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  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 +13 -13
  155. package/coverage/lcov-report/utilities/index.html +1 -1
  156. package/coverage/lcov-report/utilities/index.js.html +9 -9
  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 +1 -1
  162. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  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 +1 -1
  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 +1 -1
  169. package/coverage/lcov.info +732 -576
  170. package/dist/api/controllers/query/import/sources/curl.js +5 -1
  171. package/dist/api/controllers/query/index.js +29 -47
  172. package/dist/api/controllers/query/validation.js +2 -1
  173. package/dist/api/routes/query.js +3 -1
  174. package/dist/automations/steps/executeQuery.js +8 -1
  175. package/dist/integrations/rest.js +2 -2
  176. package/dist/package.json +5 -4
  177. package/dist/tests/utilities/TestConfiguration.js +7 -0
  178. package/dist/threads/query.js +145 -52
  179. package/dist/threads/utils.js +104 -0
  180. package/dist/tsconfig.tsbuildinfo +1 -1
  181. package/package.json +6 -5
  182. package/src/api/controllers/query/import/sources/curl.ts +5 -1
  183. package/src/api/controllers/query/index.js +27 -55
  184. package/src/api/controllers/query/validation.js +2 -1
  185. package/src/api/routes/query.js +8 -1
  186. package/src/api/routes/tests/query.spec.js +88 -0
  187. package/src/automations/steps/executeQuery.js +9 -1
  188. package/src/definitions/datasource.ts +10 -0
  189. package/src/integrations/rest.ts +5 -2
  190. package/src/tests/utilities/TestConfiguration.js +10 -0
  191. package/src/threads/query.js +145 -56
  192. package/src/threads/utils.js +114 -0
@@ -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,23 +138,190 @@
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>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
142
231
  <span class="cline-any cline-yes">1x</span>
143
232
  <span class="cline-any cline-yes">1x</span>
233
+ <span class="cline-any cline-yes">1x</span>
234
+ <span class="cline-any cline-yes">1x</span>
235
+ <span class="cline-any cline-yes">1x</span>
236
+ <span class="cline-any cline-neutral">&nbsp;</span>
237
+ <span class="cline-any cline-neutral">&nbsp;</span>
238
+ <span class="cline-any cline-neutral">&nbsp;</span>
239
+ <span class="cline-any cline-yes">11x</span>
240
+ <span class="cline-any cline-yes">11x</span>
241
+ <span class="cline-any cline-yes">11x</span>
242
+ <span class="cline-any cline-yes">11x</span>
243
+ <span class="cline-any cline-yes">11x</span>
244
+ <span class="cline-any cline-yes">11x</span>
245
+ <span class="cline-any cline-yes">11x</span>
246
+ <span class="cline-any cline-yes">11x</span>
247
+ <span class="cline-any cline-yes">11x</span>
248
+ <span class="cline-any cline-neutral">&nbsp;</span>
144
249
  <span class="cline-any cline-neutral">&nbsp;</span>
145
250
  <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-yes">11x</span>
252
+ <span class="cline-any cline-yes">11x</span>
253
+ <span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-neutral">&nbsp;</span>
255
+ <span class="cline-any cline-neutral">&nbsp;</span>
256
+ <span class="cline-any cline-yes">12x</span>
257
+ <span class="cline-any cline-neutral">&nbsp;</span>
258
+ <span class="cline-any cline-yes">12x</span>
259
+ <span class="cline-any cline-yes">12x</span>
260
+ <span class="cline-any cline-yes">12x</span>
261
+ <span class="cline-any cline-yes">12x</span>
146
262
  <span class="cline-any cline-yes">2x</span>
263
+ <span class="cline-any cline-neutral">&nbsp;</span>
264
+ <span class="cline-any cline-yes">10x</span>
265
+ <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-yes">10x</span>
267
+ <span class="cline-any cline-yes">10x</span>
268
+ <span class="cline-any cline-yes">10x</span>
269
+ <span class="cline-any cline-yes">10x</span>
270
+ <span class="cline-any cline-yes">10x</span>
271
+ <span class="cline-any cline-yes">8x</span>
272
+ <span class="cline-any cline-yes">8x</span>
273
+ <span class="cline-any cline-yes">8x</span>
274
+ <span class="cline-any cline-neutral">&nbsp;</span>
275
+ <span class="cline-any cline-neutral">&nbsp;</span>
276
+ <span class="cline-any cline-neutral">&nbsp;</span>
277
+ <span class="cline-any cline-yes">10x</span>
147
278
  <span class="cline-any cline-no">&nbsp;</span>
148
279
  <span class="cline-any cline-no">&nbsp;</span>
149
280
  <span class="cline-any cline-neutral">&nbsp;</span>
281
+ <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-yes">10x</span>
284
+ <span class="cline-any cline-neutral">&nbsp;</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
286
+ <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-neutral">&nbsp;</span>
288
+ <span class="cline-any cline-neutral">&nbsp;</span>
289
+ <span class="cline-any cline-yes">1x</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-yes">1x</span>
292
+ <span class="cline-any cline-yes">1x</span>
293
+ <span class="cline-any cline-neutral">&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">9x</span>
297
+ <span class="cline-any cline-yes">7x</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-yes">9x</span>
150
302
  <span class="cline-any cline-no">&nbsp;</span>
151
303
  <span class="cline-any cline-neutral">&nbsp;</span>
152
304
  <span class="cline-any cline-neutral">&nbsp;</span>
153
- <span class="cline-any cline-yes">2x</span>
305
+ <span class="cline-any cline-neutral">&nbsp;</span>
306
+ <span class="cline-any cline-yes">9x</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-yes">9x</span>
309
+ <span class="cline-any cline-no">&nbsp;</span>
310
+ <span class="cline-any cline-neutral">&nbsp;</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-yes">9x</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-neutral">&nbsp;</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-yes">3x</span>
317
+ <span class="cline-any cline-yes">3x</span>
318
+ <span class="cline-any cline-yes">3x</span>
319
+ <span class="cline-any cline-yes">3x</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
154
322
  <span class="cline-any cline-neutral">&nbsp;</span>
155
323
  <span class="cline-any cline-neutral">&nbsp;</span>
156
324
  <span class="cline-any cline-neutral">&nbsp;</span>
157
- <span class="cline-any cline-yes">2x</span>
158
325
  <span class="cline-any cline-neutral">&nbsp;</span>
159
326
  <span class="cline-any cline-neutral">&nbsp;</span>
160
327
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -165,134 +332,234 @@
165
332
  <span class="cline-any cline-neutral">&nbsp;</span>
166
333
  <span class="cline-any cline-yes">4x</span>
167
334
  <span class="cline-any cline-yes">4x</span>
168
- <span class="cline-any cline-yes">2x</span>
335
+ <span class="cline-any cline-yes">4x</span>
336
+ <span class="cline-any cline-yes">4x</span>
337
+ <span class="cline-any cline-yes">4x</span>
338
+ <span class="cline-any cline-yes">3x</span>
169
339
  <span class="cline-any cline-neutral">&nbsp;</span>
170
- <span class="cline-any cline-yes">2x</span>
171
340
  <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>
179
- <span class="cline-any cline-no">&nbsp;</span>
180
341
  <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-yes">3x</span>
343
+ <span class="cline-any cline-yes">3x</span>
181
344
  <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-yes">1x</span>
182
346
  <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>
185
- <span class="cline-any cline-no">&nbsp;</span>
347
+ <span class="cline-any cline-yes">4x</span>
186
348
  <span class="cline-any cline-neutral">&nbsp;</span>
187
349
  <span class="cline-any cline-neutral">&nbsp;</span>
188
350
  <span class="cline-any cline-neutral">&nbsp;</span>
189
- <span class="cline-any cline-yes">2x</span>
351
+ <span class="cline-any cline-yes">12x</span>
352
+ <span class="cline-any cline-yes">12x</span>
190
353
  <span class="cline-any cline-no">&nbsp;</span>
191
354
  <span class="cline-any cline-neutral">&nbsp;</span>
192
- <span class="cline-any cline-neutral">&nbsp;</span>
193
- <span class="cline-any cline-neutral">&nbsp;</span>
355
+ <span class="cline-any cline-yes">12x</span>
356
+ <span class="cline-any cline-yes">12x</span>
357
+ <span class="cline-any cline-yes">12x</span>
358
+ <span class="cline-any cline-yes">2x</span>
194
359
  <span class="cline-any cline-yes">2x</span>
195
- <span class="cline-any cline-no">&nbsp;</span>
196
360
  <span class="cline-any cline-neutral">&nbsp;</span>
197
361
  <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-yes">12x</span>
198
363
  <span class="cline-any cline-neutral">&nbsp;</span>
199
- <span class="cline-any cline-yes">2x</span>
364
+ <span class="cline-any cline-yes">9x</span>
365
+ <span class="cline-any cline-yes">9x</span>
200
366
  <span class="cline-any cline-neutral">&nbsp;</span>
201
- <span class="cline-any cline-yes">2x</span>
367
+ <span class="cline-any cline-yes">4x</span>
202
368
  <span class="cline-any cline-no">&nbsp;</span>
203
369
  <span class="cline-any cline-neutral">&nbsp;</span>
204
370
  <span class="cline-any cline-neutral">&nbsp;</span>
205
- <span class="cline-any cline-yes">2x</span>
371
+ <span class="cline-any cline-yes">4x</span>
372
+ <span class="cline-any cline-yes">4x</span>
373
+ <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-yes">9x</span>
375
+ <span class="cline-any cline-yes">9x</span>
376
+ <span class="cline-any cline-yes">9x</span>
377
+ <span class="cline-any cline-yes">4x</span>
378
+ <span class="cline-any cline-yes">4x</span>
379
+ <span class="cline-any cline-neutral">&nbsp;</span>
380
+ <span class="cline-any cline-neutral">&nbsp;</span>
206
381
  <span class="cline-any cline-neutral">&nbsp;</span>
207
382
  <span class="cline-any cline-neutral">&nbsp;</span>
208
- <span class="cline-any cline-yes">1x</span>
209
383
  <span class="cline-any cline-yes">4x</span>
210
384
  <span class="cline-any cline-neutral">&nbsp;</span>
211
385
  <span class="cline-any cline-neutral">&nbsp;</span>
386
+ <span class="cline-any cline-yes">12x</span>
212
387
  <span class="cline-any cline-neutral">&nbsp;</span>
213
388
  <span class="cline-any cline-neutral">&nbsp;</span>
214
389
  <span class="cline-any cline-neutral">&nbsp;</span>
390
+ <span class="cline-any cline-yes">1x</span>
391
+ <span class="cline-any cline-yes">8x</span>
392
+ <span class="cline-any cline-yes">8x</span>
215
393
  <span class="cline-any cline-neutral">&nbsp;</span>
216
- <span class="cline-any cline-yes">2x</span>
394
+ <span class="cline-any cline-yes">6x</span>
217
395
  <span class="cline-any cline-neutral">&nbsp;</span>
218
396
  <span class="cline-any cline-neutral">&nbsp;</span>
219
397
  <span class="cline-any cline-yes">2x</span>
220
398
  <span class="cline-any cline-neutral">&nbsp;</span>
221
399
  <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()
400
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const threadUtils = require("./utils")
401
+ threadUtils.threadSetup()
223
402
  const ScriptRunner = require("../utilities/scriptRunner")
224
403
  const { integrations } = require("../integrations")
404
+ const { processStringSync } = require("@budibase/string-templates")
405
+ const CouchDB = require("../db")
225
406
  &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
- }
407
+ class QueryRunner {
408
+ constructor(input, flags = { noRecursiveQuery: false }) {
409
+ this.appId = input.appId
410
+ this.datasource = input.datasource
411
+ this.queryVerb = input.queryVerb
412
+ this.fields = input.fields
413
+ this.parameters = input.parameters
414
+ this.transformer = input.transformer
415
+ this.queryId = input.queryId
416
+ this.noRecursiveQuery = flags.noRecursiveQuery
417
+ this.cachedVariables = []
418
+ // allows the response from a query to be stored throughout this
419
+ // execution so that if it needs to be re-used for another variable
420
+ // it can be
421
+ this.queryResponse = {}
422
+ this.hasRerun = false
233
423
  }
234
- return resp
235
- }
236
424
  &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
- }
425
+ async execute() {
426
+ let { datasource, fields, queryVerb, transformer } = this
427
+ // pre-query, make sure datasource variables are added to parameters
428
+ const parameters = await this.addDatasourceVariables()
429
+ const query = threadUtils.enrichQueryFields(fields, parameters)
430
+ const Integration = integrations[datasource.source]
431
+ if (!Integration) {
432
+ throw "Integration type does not exist."
433
+ }
434
+ const integration = new Integration(datasource.config)
245
435
  &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)
436
+ let output = threadUtils.formatResponse(await integration[queryVerb](query))
437
+ let rows = output,
438
+ info = undefined,
439
+ extra = undefined
440
+ if (threadUtils.hasExtraData(output)) {
441
+ rows = output.data
442
+ info = output.info
443
+ extra = output.extra
444
+ }
252
445
  &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
- }
446
+ // transform as required
447
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (transformer) {
448
+ const runner = <span class="cstat-no" title="statement not covered" >new ScriptRunner(transformer, { data: rows })</span>
449
+ <span class="cstat-no" title="statement not covered" > rows = runner.execute()</span>
450
+ }
262
451
  &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
- }
452
+ // if the request fails we retry once, invalidating the cached value
453
+ if (
454
+ info &amp;&amp;
455
+ info.code &gt;= 400 &amp;&amp;
456
+ this.cachedVariables.length &gt; 0 &amp;&amp;
457
+ !this.hasRerun
458
+ ) {
459
+ this.hasRerun = true
460
+ // invalidate the cache value
461
+ await threadUtils.invalidateDynamicVariables(this.cachedVariables)
462
+ return this.execute()
463
+ }
268
464
  &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
- }
465
+ // needs to an array for next step
466
+ if (!Array.isArray(rows)) {
467
+ rows = [rows]
468
+ }
469
+ &nbsp;
470
+ // map into JSON if just raw primitive here
471
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (rows.find(row =&gt; typeof row !== "object")) {
472
+ <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>
473
+ }
474
+ &nbsp;
475
+ // get all the potential fields in the schema
476
+ let keys = rows.flatMap(Object.keys)
273
477
  &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>
478
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (integration.end) {
479
+ <span class="cstat-no" title="statement not covered" > integration.end()</span>
480
+ }
481
+ &nbsp;
482
+ return { rows, keys, info, extra }
277
483
  }
278
484
  &nbsp;
279
- // get all the potential fields in the schema
280
- let keys = rows.flatMap(Object.keys)
485
+ async runAnotherQuery(queryId, parameters) {
486
+ const db = new CouchDB(this.appId)
487
+ const query = await db.get(queryId)
488
+ const datasource = await db.get(query.datasourceId)
489
+ return new QueryRunner(
490
+ {
491
+ appId: this.appId,
492
+ datasource,
493
+ queryVerb: query.queryVerb,
494
+ fields: query.fields,
495
+ parameters,
496
+ transformer: query.transformer,
497
+ },
498
+ { noRecursiveQuery: true }
499
+ ).execute()
500
+ }
281
501
  &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>
502
+ async getDynamicVariable(variable) {
503
+ let { parameters } = this
504
+ const queryId = variable.queryId,
505
+ name = variable.name
506
+ let value = await threadUtils.checkCacheForDynamicVariable(queryId, name)
507
+ if (!value) {
508
+ value = this.queryResponse[queryId]
509
+ ? <span class="branch-0 cbranch-no" title="branch not covered" >this.queryResponse[queryId]</span>
510
+ : await this.runAnotherQuery(queryId, parameters)
511
+ // store incase this query is to be called again
512
+ this.queryResponse[queryId] = value
513
+ await threadUtils.storeDynamicVariable(queryId, name, value)
514
+ } else {
515
+ this.cachedVariables.push({ queryId, name })
516
+ }
517
+ return value
284
518
  }
285
519
  &nbsp;
286
- return { rows, keys, info, extra }
520
+ async addDatasourceVariables() {
521
+ let { datasource, parameters, fields } = this
522
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!datasource || !datasource.config) {
523
+ <span class="cstat-no" title="statement not covered" > return parameters</span>
524
+ }
525
+ const staticVars = datasource.config.staticVariables || {}
526
+ const dynamicVars = datasource.config.dynamicVariables || []
527
+ for (let [key, value] of Object.entries(staticVars)) {
528
+ if (!parameters[key]) {
529
+ parameters[key] = value
530
+ }
531
+ }
532
+ if (!this.noRecursiveQuery) {
533
+ // need to see if this uses any variables
534
+ const stringFields = JSON.stringify(fields)
535
+ const foundVars = dynamicVars.filter(variable =&gt; {
536
+ // don't allow a query to use its own dynamic variable (loop)
537
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (variable.queryId === this.queryId) {
538
+ <span class="cstat-no" title="statement not covered" > return false</span>
539
+ }
540
+ // look for {{ variable }} but allow spaces between handlebars
541
+ const regex = new RegExp(`{{[ ]*${variable.name}[ ]*}}`)
542
+ return regex.test(stringFields)
543
+ })
544
+ const dynamics = foundVars.map(dynVar =&gt; this.getDynamicVariable(dynVar))
545
+ const responses = await Promise.all(dynamics)
546
+ for (let i = 0; i &lt; foundVars.length; i++) {
547
+ const variable = foundVars[i]
548
+ parameters[variable.name] = processStringSync(variable.value, {
549
+ data: responses[i].rows,
550
+ info: responses[i].extra,
551
+ })
552
+ // make sure its known that this uses dynamic variables in case it fails
553
+ this.hasDynamicVariables = true
554
+ }
555
+ }
556
+ return parameters
557
+ }
287
558
  }
288
559
  &nbsp;
289
560
  module.exports = (input, callback) =&gt; {
290
- runAndTransform(
291
- input.datasource,
292
- input.queryVerb,
293
- input.query,
294
- input.transformer
295
- )
561
+ const Runner = new QueryRunner(input)
562
+ Runner.execute()
296
563
  .then(response =&gt; {
297
564
  callback(null, response)
298
565
  })
@@ -307,7 +574,7 @@ module.exports = (input, callback) =&gt; {
307
574
  <div class='footer quiet pad2 space-top1 center small'>
308
575
  Code coverage generated by
309
576
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
310
- at Tue Jan 04 2022 11:51:46 GMT+0000 (Coordinated Universal Time)
577
+ at Fri Jan 07 2022 12:04:09 GMT+0000 (Coordinated Universal Time)
311
578
  </div>
312
579
  </div>
313
580
  <script src="../prettify.js"></script>