@budibase/server 1.0.26 → 1.0.27-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/__mocks__/node-fetch.ts +21 -0
  2. package/builder/assets/bb-spaceship.8f6e81e1.svg +227 -0
  3. package/builder/assets/{index.4fb3f887.css → index.0dce895b.css} +1 -1
  4. package/builder/assets/index.b98dd7ca.js +1348 -0
  5. package/builder/assets/{vendor.470042a4.js → vendor.f9faf6ab.js} +88 -88
  6. package/builder/index.html +3 -3
  7. package/coverage/clover.xml +1364 -1121
  8. package/coverage/coverage-final.json +37 -36
  9. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/application.js.html +59 -59
  12. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/automation.js.html +22 -10
  14. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  17. package/coverage/lcov-report/api/controllers/datasource.js.html +170 -68
  18. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/hosting.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/index.html +39 -54
  21. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/query/index.html +126 -0
  26. package/coverage/lcov-report/api/controllers/{query.js.html → query/index.js.html} +225 -114
  27. package/coverage/lcov-report/api/controllers/query/validation.js.html +206 -0
  28. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/index.html +22 -22
  32. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/row/internal.js.html +38 -11
  34. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +7 -4
  35. package/coverage/lcov-report/api/controllers/row/utils.js.html +29 -20
  36. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/user.js.html +108 -9
  45. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  49. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/webhook.js.html +18 -6
  51. package/coverage/lcov-report/api/index.html +1 -1
  52. package/coverage/lcov-report/api/index.js.html +5 -5
  53. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/index.html +9 -9
  66. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/query.js.html +19 -85
  72. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/user.js.html +32 -2
  81. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  83. package/coverage/lcov-report/automations/actions.js.html +1 -1
  84. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  85. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  86. package/coverage/lcov-report/automations/index.html +20 -20
  87. package/coverage/lcov-report/automations/index.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/executeQuery.js.html +31 -7
  94. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/index.html +11 -11
  97. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +5 -8
  99. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  114. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  115. package/coverage/lcov-report/automations/utils.js.html +48 -15
  116. package/coverage/lcov-report/constants/index.html +1 -1
  117. package/coverage/lcov-report/constants/index.js.html +22 -22
  118. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  119. package/coverage/lcov-report/constants/screens.js.html +1 -1
  120. package/coverage/lcov-report/db/client.js.html +18 -18
  121. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  122. package/coverage/lcov-report/db/index.html +15 -15
  123. package/coverage/lcov-report/db/index.js.html +3 -3
  124. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  128. package/coverage/lcov-report/db/newid.js.html +4 -4
  129. package/coverage/lcov-report/db/utils.js.html +107 -80
  130. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  131. package/coverage/lcov-report/events/index.html +1 -1
  132. package/coverage/lcov-report/events/index.js.html +1 -1
  133. package/coverage/lcov-report/events/utils.js.html +1 -1
  134. package/coverage/lcov-report/index.html +99 -84
  135. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  136. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  137. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  138. package/coverage/lcov-report/middleware/authorized.js.html +10 -10
  139. package/coverage/lcov-report/middleware/builder.js.html +8 -8
  140. package/coverage/lcov-report/middleware/currentapp.js.html +28 -28
  141. package/coverage/lcov-report/middleware/index.html +1 -1
  142. package/coverage/lcov-report/middleware/joi-validator.js.html +11 -11
  143. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  144. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  145. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  146. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  147. package/coverage/lcov-report/threads/automation.js.html +1 -1
  148. package/coverage/lcov-report/threads/index.html +31 -31
  149. package/coverage/lcov-report/threads/index.js.html +12 -12
  150. package/coverage/lcov-report/threads/query.js.html +396 -69
  151. package/coverage/lcov-report/threads/utils.js.html +358 -13
  152. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  153. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  154. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  155. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  156. package/coverage/lcov-report/utilities/global.js.html +13 -13
  157. package/coverage/lcov-report/utilities/index.html +19 -19
  158. package/coverage/lcov-report/utilities/index.js.html +69 -36
  159. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  160. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  161. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  162. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  163. package/coverage/lcov-report/utilities/rowProcessor/index.html +19 -19
  164. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +235 -10
  165. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  166. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  167. package/coverage/lcov-report/utilities/security.js.html +2 -2
  168. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  169. package/coverage/lcov-report/utilities/users.js.html +1 -1
  170. package/coverage/lcov-report/utilities/workerRequests.js.html +19 -19
  171. package/coverage/lcov.info +2294 -1874
  172. package/dist/api/controllers/automation.js +7 -5
  173. package/dist/api/controllers/datasource.js +29 -0
  174. package/dist/api/controllers/query/import/index.js +79 -0
  175. package/dist/api/controllers/query/import/sources/base/index.js +64 -0
  176. package/dist/api/controllers/query/import/sources/base/openapi.js +42 -0
  177. package/dist/api/controllers/query/import/sources/curl.js +96 -0
  178. package/dist/api/controllers/query/import/sources/openapi2.js +142 -0
  179. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  180. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  181. package/dist/api/controllers/{query.js → query/index.js} +86 -52
  182. package/dist/api/controllers/query/validation.js +38 -0
  183. package/dist/api/controllers/row/internal.js +14 -6
  184. package/dist/api/controllers/row/internalSearch.js +2 -1
  185. package/dist/api/controllers/row/utils.js +13 -6
  186. package/dist/api/controllers/user.js +37 -1
  187. package/dist/api/controllers/webhook.js +4 -0
  188. package/dist/api/routes/query.js +5 -33
  189. package/dist/api/routes/user.js +3 -1
  190. package/dist/automations/steps/executeQuery.js +8 -1
  191. package/dist/automations/steps/outgoingWebhook.js +2 -3
  192. package/dist/automations/utils.js +10 -0
  193. package/dist/db/utils.js +8 -0
  194. package/dist/definitions/datasource.js +6 -1
  195. package/dist/integrations/base/sqlTable.js +1 -1
  196. package/dist/integrations/rest.js +207 -117
  197. package/dist/package.json +11 -4
  198. package/dist/tests/utilities/TestConfiguration.js +47 -0
  199. package/dist/threads/query.js +148 -40
  200. package/dist/threads/utils.js +105 -0
  201. package/dist/tsconfig.tsbuildinfo +1 -1
  202. package/dist/utilities/fileSystem/utilities.js +2 -1
  203. package/dist/utilities/index.js +10 -0
  204. package/dist/utilities/rowProcessor/index.js +76 -0
  205. package/package.json +12 -5
  206. package/src/api/controllers/automation.js +8 -4
  207. package/src/api/controllers/datasource.js +34 -0
  208. package/src/api/controllers/query/import/index.ts +85 -0
  209. package/src/api/controllers/query/import/sources/base/index.ts +87 -0
  210. package/src/api/controllers/query/import/sources/base/openapi.ts +24 -0
  211. package/src/api/controllers/query/import/sources/curl.ts +102 -0
  212. package/src/api/controllers/query/import/sources/openapi2.ts +163 -0
  213. package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +103 -0
  214. package/src/api/controllers/query/import/sources/tests/curl/data/delete.txt +1 -0
  215. package/src/api/controllers/query/import/sources/tests/curl/data/empty-body.txt +2 -0
  216. package/src/api/controllers/query/import/sources/tests/curl/data/get.txt +1 -0
  217. package/src/api/controllers/query/import/sources/tests/curl/data/headers.txt +3 -0
  218. package/src/api/controllers/query/import/sources/tests/curl/data/patch.txt +2 -0
  219. package/src/api/controllers/query/import/sources/tests/curl/data/path.txt +1 -0
  220. package/src/api/controllers/query/import/sources/tests/curl/data/post.txt +2 -0
  221. package/src/api/controllers/query/import/sources/tests/curl/data/put.txt +2 -0
  222. package/src/api/controllers/query/import/sources/tests/curl/data/query.txt +1 -0
  223. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  224. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.yaml +160 -0
  225. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  226. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.yaml +711 -0
  227. package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +238 -0
  228. package/src/api/controllers/query/import/tests/index.spec.js +109 -0
  229. package/src/api/controllers/query/index.js +195 -0
  230. package/src/api/controllers/query/validation.js +42 -0
  231. package/src/api/controllers/row/internal.js +14 -5
  232. package/src/api/controllers/row/internalSearch.js +2 -1
  233. package/src/api/controllers/row/utils.js +11 -8
  234. package/src/api/controllers/user.js +33 -0
  235. package/src/api/controllers/webhook.js +4 -0
  236. package/src/api/routes/query.js +13 -35
  237. package/src/api/routes/tests/datasource.spec.js +45 -0
  238. package/src/api/routes/tests/query.spec.js +69 -0
  239. package/src/api/routes/user.js +10 -0
  240. package/src/automations/steps/executeQuery.js +9 -1
  241. package/src/automations/steps/outgoingWebhook.js +2 -3
  242. package/src/automations/utils.js +11 -0
  243. package/src/db/utils.js +9 -0
  244. package/src/definitions/common.ts +2 -16
  245. package/src/definitions/datasource.ts +83 -1
  246. package/src/integrations/base/IntegrationBase.ts +4 -4
  247. package/src/integrations/base/sqlTable.ts +1 -1
  248. package/src/integrations/oracle.ts +1 -1
  249. package/src/integrations/rest.ts +230 -137
  250. package/src/integrations/tests/rest.spec.js +167 -19
  251. package/src/tests/utilities/TestConfiguration.js +57 -0
  252. package/src/threads/query.js +149 -40
  253. package/src/threads/utils.js +115 -0
  254. package/src/utilities/fileSystem/utilities.js +2 -0
  255. package/src/utilities/index.js +11 -0
  256. package/src/utilities/rowProcessor/index.js +75 -0
  257. package/builder/assets/index.8adef83f.js +0 -1316
  258. package/src/api/controllers/query.js +0 -158
@@ -3,15 +3,15 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for api/controllers/query.js</title>
6
+ <title>Code coverage report for api/controllers/query/index.js</title>
7
7
  <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
8
+ <link rel="stylesheet" href="../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
11
11
  <meta name="viewport" content="width=device-width, initial-scale=1" />
12
12
  <style type='text/css'>
13
13
  .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
14
+ background-image: url(../../../sort-arrow-sprite.png);
15
15
  }
16
16
  </style>
17
17
  </head>
@@ -19,34 +19,34 @@
19
19
  <body>
20
20
  <div class='wrapper'>
21
21
  <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">api/controllers</a> query.js</h1>
22
+ <h1><a href="../../../index.html">All files</a> / <a href="index.html">api/controllers/query</a> index.js</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">84.5% </span>
26
+ <span class="strong">81.11% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>60/71</span>
28
+ <span class='fraction'>73/90</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">48% </span>
33
+ <span class="strong">68.42% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>12/25</span>
35
+ <span class='fraction'>13/19</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
40
+ <span class="strong">85.71% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>9/9</span>
42
+ <span class='fraction'>12/14</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">84.28% </span>
47
+ <span class="strong">80.68% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>59/70</span>
49
+ <span class='fraction'>71/88</span>
50
50
  </div>
51
51
 
52
52
 
@@ -215,8 +215,44 @@
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
219
- <span class="cline-any cline-yes">34x</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
220
256
  <span class="cline-any cline-neutral">&nbsp;</span>
221
257
  <span class="cline-any cline-neutral">&nbsp;</span>
222
258
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -224,6 +260,9 @@
224
260
  <span class="cline-any cline-yes">34x</span>
225
261
  <span class="cline-any cline-yes">34x</span>
226
262
  <span class="cline-any cline-yes">34x</span>
263
+ <span class="cline-any cline-yes">34x</span>
264
+ <span class="cline-any cline-yes">34x</span>
265
+ <span class="cline-any cline-yes">34x</span>
227
266
  <span class="cline-any cline-neutral">&nbsp;</span>
228
267
  <span class="cline-any cline-yes">34x</span>
229
268
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -247,63 +286,62 @@
247
286
  <span class="cline-any cline-neutral">&nbsp;</span>
248
287
  <span class="cline-any cline-neutral">&nbsp;</span>
249
288
  <span class="cline-any cline-neutral">&nbsp;</span>
289
+ <span class="cline-any cline-neutral">&nbsp;</span>
250
290
  <span class="cline-any cline-yes">2x</span>
251
291
  <span class="cline-any cline-neutral">&nbsp;</span>
252
292
  <span class="cline-any cline-neutral">&nbsp;</span>
253
293
  <span class="cline-any cline-yes">34x</span>
254
- <span class="cline-any cline-yes">20x</span>
255
- <span class="cline-any cline-yes">20x</span>
294
+ <span class="cline-any cline-no">&nbsp;</span>
295
+ <span class="cline-any cline-no">&nbsp;</span>
256
296
  <span class="cline-any cline-neutral">&nbsp;</span>
257
- <span class="cline-any cline-yes">20x</span>
258
- <span class="cline-any cline-yes">20x</span>
297
+ <span class="cline-any cline-no">&nbsp;</span>
298
+ <span class="cline-any cline-no">&nbsp;</span>
259
299
  <span class="cline-any cline-neutral">&nbsp;</span>
260
300
  <span class="cline-any cline-neutral">&nbsp;</span>
261
- <span class="cline-any cline-yes">20x</span>
262
- <span class="cline-any cline-yes">20x</span>
301
+ <span class="cline-any cline-no">&nbsp;</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-no">&nbsp;</span>
304
+ <span class="cline-any cline-no">&nbsp;</span>
305
+ <span class="cline-any cline-neutral">&nbsp;</span>
263
306
  <span class="cline-any cline-neutral">&nbsp;</span>
264
- <span class="cline-any cline-yes">20x</span>
265
- <span class="cline-any cline-yes">20x</span>
266
307
  <span class="cline-any cline-neutral">&nbsp;</span>
267
308
  <span class="cline-any cline-neutral">&nbsp;</span>
268
309
  <span class="cline-any cline-neutral">&nbsp;</span>
269
- <span class="cline-any cline-yes">4x</span>
270
310
  <span class="cline-any cline-neutral">&nbsp;</span>
271
311
  <span class="cline-any cline-neutral">&nbsp;</span>
272
- <span class="cline-any cline-yes">4x</span>
273
- <span class="cline-any cline-no">&nbsp;</span>
274
- <span class="cline-any cline-no">&nbsp;</span>
275
312
  <span class="cline-any cline-neutral">&nbsp;</span>
276
- <span class="cline-any cline-no">&nbsp;</span>
277
313
  <span class="cline-any cline-neutral">&nbsp;</span>
278
314
  <span class="cline-any cline-no">&nbsp;</span>
279
315
  <span class="cline-any cline-no">&nbsp;</span>
280
- <span class="cline-any cline-neutral">&nbsp;</span>
281
316
  <span class="cline-any cline-no">&nbsp;</span>
282
- <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-no">&nbsp;</span>
283
318
  <span class="cline-any cline-neutral">&nbsp;</span>
284
319
  <span class="cline-any cline-neutral">&nbsp;</span>
285
320
  <span class="cline-any cline-no">&nbsp;</span>
286
321
  <span class="cline-any cline-neutral">&nbsp;</span>
287
322
  <span class="cline-any cline-neutral">&nbsp;</span>
323
+ <span class="cline-any cline-no">&nbsp;</span>
288
324
  <span class="cline-any cline-neutral">&nbsp;</span>
289
- <span class="cline-any cline-yes">4x</span>
290
- <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-no">&nbsp;</span>
291
326
  <span class="cline-any cline-neutral">&nbsp;</span>
292
327
  <span class="cline-any cline-neutral">&nbsp;</span>
293
328
  <span class="cline-any cline-neutral">&nbsp;</span>
294
329
  <span class="cline-any cline-no">&nbsp;</span>
295
- <span class="cline-any cline-no">&nbsp;</span>
296
- <span class="cline-any cline-neutral">&nbsp;</span>
297
- <span class="cline-any cline-neutral">&nbsp;</span>
298
330
  <span class="cline-any cline-neutral">&nbsp;</span>
299
331
  <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-yes">34x</span>
333
+ <span class="cline-any cline-yes">28x</span>
334
+ <span class="cline-any cline-yes">28x</span>
300
335
  <span class="cline-any cline-neutral">&nbsp;</span>
301
- <span class="cline-any cline-no">&nbsp;</span>
336
+ <span class="cline-any cline-yes">28x</span>
337
+ <span class="cline-any cline-yes">28x</span>
302
338
  <span class="cline-any cline-neutral">&nbsp;</span>
303
- <span class="cline-any cline-no">&nbsp;</span>
304
339
  <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-yes">28x</span>
341
+ <span class="cline-any cline-yes">28x</span>
305
342
  <span class="cline-any cline-neutral">&nbsp;</span>
306
- <span class="cline-any cline-yes">4x</span>
343
+ <span class="cline-any cline-yes">28x</span>
344
+ <span class="cline-any cline-yes">28x</span>
307
345
  <span class="cline-any cline-neutral">&nbsp;</span>
308
346
  <span class="cline-any cline-neutral">&nbsp;</span>
309
347
  <span class="cline-any cline-yes">34x</span>
@@ -318,22 +356,28 @@
318
356
  <span class="cline-any cline-neutral">&nbsp;</span>
319
357
  <span class="cline-any cline-neutral">&nbsp;</span>
320
358
  <span class="cline-any cline-yes">34x</span>
321
- <span class="cline-any cline-yes">2x</span>
359
+ <span class="cline-any cline-yes">8x</span>
322
360
  <span class="cline-any cline-neutral">&nbsp;</span>
323
- <span class="cline-any cline-yes">2x</span>
361
+ <span class="cline-any cline-yes">8x</span>
324
362
  <span class="cline-any cline-neutral">&nbsp;</span>
325
- <span class="cline-any cline-yes">2x</span>
326
- <span class="cline-any cline-yes">2x</span>
327
363
  <span class="cline-any cline-neutral">&nbsp;</span>
328
- <span class="cline-any cline-yes">2x</span>
329
- <span class="cline-any cline-yes">2x</span>
330
364
  <span class="cline-any cline-neutral">&nbsp;</span>
365
+ <span class="cline-any cline-yes">8x</span>
331
366
  <span class="cline-any cline-neutral">&nbsp;</span>
367
+ <span class="cline-any cline-yes">8x</span>
368
+ <span class="cline-any cline-yes">8x</span>
332
369
  <span class="cline-any cline-neutral">&nbsp;</span>
333
370
  <span class="cline-any cline-neutral">&nbsp;</span>
334
371
  <span class="cline-any cline-neutral">&nbsp;</span>
335
372
  <span class="cline-any cline-neutral">&nbsp;</span>
336
- <span class="cline-any cline-yes">1x</span>
373
+ <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-neutral">&nbsp;</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-neutral">&nbsp;</span>
377
+ <span class="cline-any cline-neutral">&nbsp;</span>
378
+ <span class="cline-any cline-yes">7x</span>
379
+ <span class="cline-any cline-neutral">&nbsp;</span>
380
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
381
  <span class="cline-any cline-neutral">&nbsp;</span>
338
382
  <span class="cline-any cline-neutral">&nbsp;</span>
339
383
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -342,46 +386,78 @@
342
386
  <span class="cline-any cline-neutral">&nbsp;</span>
343
387
  <span class="cline-any cline-neutral">&nbsp;</span>
344
388
  <span class="cline-any cline-neutral">&nbsp;</span>
345
- <span class="cline-any cline-yes">34x</span>
389
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
390
  <span class="cline-any cline-yes">2x</span>
347
391
  <span class="cline-any cline-neutral">&nbsp;</span>
348
392
  <span class="cline-any cline-yes">2x</span>
349
393
  <span class="cline-any cline-yes">2x</span>
350
394
  <span class="cline-any cline-neutral">&nbsp;</span>
395
+ <span class="cline-any cline-neutral">&nbsp;</span>
396
+ <span class="cline-any cline-yes">2x</span>
351
397
  <span class="cline-any cline-yes">2x</span>
352
398
  <span class="cline-any cline-neutral">&nbsp;</span>
353
399
  <span class="cline-any cline-neutral">&nbsp;</span>
354
400
  <span class="cline-any cline-neutral">&nbsp;</span>
355
401
  <span class="cline-any cline-neutral">&nbsp;</span>
356
402
  <span class="cline-any cline-neutral">&nbsp;</span>
357
- <span class="cline-any cline-yes">2x</span>
358
- <span class="cline-any cline-yes">2x</span>
359
403
  <span class="cline-any cline-neutral">&nbsp;</span>
360
404
  <span class="cline-any cline-neutral">&nbsp;</span>
361
405
  <span class="cline-any cline-neutral">&nbsp;</span>
406
+ <span class="cline-any cline-yes">1x</span>
407
+ <span class="cline-any cline-yes">1x</span>
362
408
  <span class="cline-any cline-neutral">&nbsp;</span>
409
+ <span class="cline-any cline-no">&nbsp;</span>
363
410
  <span class="cline-any cline-neutral">&nbsp;</span>
364
- <span class="cline-any cline-yes">1x</span>
365
411
  <span class="cline-any cline-neutral">&nbsp;</span>
366
412
  <span class="cline-any cline-yes">1x</span>
367
413
  <span class="cline-any cline-neutral">&nbsp;</span>
368
414
  <span class="cline-any cline-neutral">&nbsp;</span>
369
415
  <span class="cline-any cline-neutral">&nbsp;</span>
370
416
  <span class="cline-any cline-yes">34x</span>
417
+ <span class="cline-any cline-yes">2x</span>
418
+ <span class="cline-any cline-neutral">&nbsp;</span>
419
+ <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-yes">34x</span>
421
+ <span class="cline-any cline-no">&nbsp;</span>
422
+ <span class="cline-any cline-neutral">&nbsp;</span>
423
+ <span class="cline-any cline-neutral">&nbsp;</span>
424
+ <span class="cline-any cline-yes">34x</span>
425
+ <span class="cline-any cline-yes">2x</span>
426
+ <span class="cline-any cline-yes">2x</span>
427
+ <span class="cline-any cline-yes">2x</span>
428
+ <span class="cline-any cline-neutral">&nbsp;</span>
429
+ <span class="cline-any cline-yes">2x</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-yes">1x</span>
371
432
  <span class="cline-any cline-yes">1x</span>
372
433
  <span class="cline-any cline-yes">1x</span>
434
+ <span class="cline-any cline-neutral">&nbsp;</span>
435
+ <span class="cline-any cline-neutral">&nbsp;</span>
436
+ <span class="cline-any cline-yes">1x</span>
373
437
  <span class="cline-any cline-yes">1x</span>
438
+ <span class="cline-any cline-neutral">&nbsp;</span>
374
439
  <span class="cline-any cline-yes">1x</span>
375
440
  <span class="cline-any cline-neutral">&nbsp;</span>
376
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const { processString } = require("@budibase/string-templates")
377
- const CouchDB = require("../../db")
441
+ <span class="cline-any cline-neutral">&nbsp;</span>
442
+ <span class="cline-any cline-neutral">&nbsp;</span>
443
+ <span class="cline-any cline-yes">34x</span>
444
+ <span class="cline-any cline-yes">2x</span>
445
+ <span class="cline-any cline-yes">2x</span>
446
+ <span class="cline-any cline-yes">2x</span>
447
+ <span class="cline-any cline-yes">2x</span>
448
+ <span class="cline-any cline-yes">2x</span>
449
+ <span class="cline-any cline-neutral">&nbsp;</span>
450
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const CouchDB = require("../../../db")
378
451
  const {
379
452
  generateQueryID,
380
453
  getQueryParams,
381
454
  isProdAppID,
382
- } = require("../../db/utils")
383
- const { BaseQueryVerbs } = require("../../constants")
384
- const { Thread, ThreadType } = require("../../threads")
455
+ } = require("../../../db/utils")
456
+ const { BaseQueryVerbs } = require("../../../constants")
457
+ const { Thread, ThreadType } = require("../../../threads")
458
+ const { save: saveDatasource } = require("../datasource")
459
+ const { RestImporter } = require("./import")
460
+ const { invalidateDynamicVariables } = require("../../../threads/utils")
385
461
  &nbsp;
386
462
  const Runner = new Thread(ThreadType.QUERY, { timeoutMs: 10000 })
387
463
  &nbsp;
@@ -405,9 +481,49 @@ exports.fetch = async function (ctx) {
405
481
  include_docs: true,
406
482
  })
407
483
  )
484
+ &nbsp;
408
485
  ctx.body = enrichQueries(body.rows.map(row =&gt; row.doc))
409
486
  }
410
487
  &nbsp;
488
+ exports.import = <span class="fstat-no" title="function not covered" >as</span>ync ctx =&gt; {
489
+ const body = <span class="cstat-no" title="statement not covered" >ctx.request.body</span>
490
+ const data = <span class="cstat-no" title="statement not covered" >body.data</span>
491
+ &nbsp;
492
+ const importer = <span class="cstat-no" title="statement not covered" >new RestImporter(data)</span>
493
+ <span class="cstat-no" title="statement not covered" > await importer.init()</span>
494
+ &nbsp;
495
+ let datasourceId
496
+ <span class="cstat-no" title="statement not covered" > if (!body.datasourceId) {</span>
497
+ // construct new datasource
498
+ const info = <span class="cstat-no" title="statement not covered" >await importer.getInfo()</span>
499
+ let datasource = <span class="cstat-no" title="statement not covered" >{</span>
500
+ type: "datasource",
501
+ source: "REST",
502
+ config: {
503
+ url: info.url,
504
+ defaultHeaders: [],
505
+ },
506
+ name: info.name,
507
+ }
508
+ // save the datasource
509
+ const datasourceCtx = <span class="cstat-no" title="statement not covered" >{ ...ctx }</span>
510
+ <span class="cstat-no" title="statement not covered" > datasourceCtx.request.body.datasource = datasource</span>
511
+ <span class="cstat-no" title="statement not covered" > await saveDatasource(datasourceCtx)</span>
512
+ <span class="cstat-no" title="statement not covered" > datasourceId = datasourceCtx.body.datasource._id</span>
513
+ } else {
514
+ // use existing datasource
515
+ <span class="cstat-no" title="statement not covered" > datasourceId = body.datasourceId</span>
516
+ }
517
+ &nbsp;
518
+ const importResult = <span class="cstat-no" title="statement not covered" >await importer.importQueries(ctx.appId, datasourceId)</span>
519
+ &nbsp;
520
+ <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
521
+ ...importResult,
522
+ datasourceId,
523
+ }
524
+ <span class="cstat-no" title="statement not covered" > ctx.status = 200</span>
525
+ }
526
+ &nbsp;
411
527
  exports.save = async function (ctx) {
412
528
  const db = new CouchDB(ctx.appId)
413
529
  const query = ctx.request.body
@@ -423,47 +539,6 @@ exports.save = async function (ctx) {
423
539
  ctx.message = `Query ${query.name} saved successfully.`
424
540
  }
425
541
  &nbsp;
426
- async function enrichQueryFields(fields, parameters = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
427
- const enrichedQuery = {}
428
- &nbsp;
429
- // enrich the fields with dynamic parameters
430
- for (let key of Object.keys(fields)) {
431
- <span class="cstat-no" title="statement not covered" > if (fields[key] == null) {</span>
432
- <span class="cstat-no" title="statement not covered" > continue</span>
433
- }
434
- <span class="cstat-no" title="statement not covered" > if (typeof fields[key] === "object") {</span>
435
- // enrich nested fields object
436
- <span class="cstat-no" title="statement not covered" > enrichedQuery[key] = await enrichQueryFields(fields[key], parameters)</span>
437
- } else <span class="cstat-no" title="statement not covered" >if (typeof fields[key] === "string") {</span>
438
- // enrich string value as normal
439
- <span class="cstat-no" title="statement not covered" > enrichedQuery[key] = await processString(fields[key], parameters, {</span>
440
- noHelpers: true,
441
- })
442
- } else {
443
- <span class="cstat-no" title="statement not covered" > enrichedQuery[key] = fields[key]</span>
444
- }
445
- }
446
- &nbsp;
447
- <span class="missing-if-branch" title="if path not taken" >I</span>if (
448
- enrichedQuery.json ||
449
- enrichedQuery.customData ||
450
- enrichedQuery.requestBody
451
- ) {
452
- <span class="cstat-no" title="statement not covered" > try {</span>
453
- <span class="cstat-no" title="statement not covered" > enrichedQuery.json = JSON.parse(</span>
454
- enrichedQuery.json ||
455
- enrichedQuery.customData ||
456
- enrichedQuery.requestBody
457
- )
458
- } catch (err) {
459
- <span class="cstat-no" title="statement not covered" > throw { message: `JSON Invalid - error: ${err}` }</span>
460
- }
461
- <span class="cstat-no" title="statement not covered" > delete enrichedQuery.customData</span>
462
- }
463
- &nbsp;
464
- return enrichedQuery
465
- }
466
- &nbsp;
467
542
  exports.find = async function (ctx) {
468
543
  const db = new CouchDB(ctx.appId)
469
544
  const query = enrichQueries(await db.get(ctx.params.queryId))
@@ -479,54 +554,90 @@ exports.preview = async function (ctx) {
479
554
  const db = new CouchDB(ctx.appId)
480
555
  &nbsp;
481
556
  const datasource = await db.get(ctx.request.body.datasourceId)
482
- &nbsp;
483
- const { fields, parameters, queryVerb, transformer } = ctx.request.body
484
- const enrichedQuery = await enrichQueryFields(fields, parameters)
557
+ // preview may not have a queryId as it hasn't been saved, but if it does
558
+ // this stops dynamic variables from calling the same query
559
+ const { fields, parameters, queryVerb, transformer, queryId } =
560
+ ctx.request.body
485
561
  &nbsp;
486
562
  try {
487
- const { rows, keys } = await Runner.run({
563
+ const { rows, keys, info, extra } = await Runner.run({
564
+ appId: ctx.appId,
488
565
  datasource,
489
566
  queryVerb,
490
- query: enrichedQuery,
567
+ fields,
568
+ parameters,
491
569
  transformer,
570
+ queryId,
492
571
  })
493
572
  &nbsp;
494
573
  ctx.body = {
495
574
  rows,
496
575
  schemaFields: [...new Set(keys)],
576
+ info,
577
+ extra,
497
578
  }
498
579
  } catch (err) {
499
580
  ctx.throw(400, err)
500
581
  }
501
582
  }
502
583
  &nbsp;
503
- exports.execute = async function (ctx) {
584
+ async function execute(ctx, opts = <span class="branch-0 cbranch-no" title="branch not covered" >{ rowsOnly: false })</span> {
504
585
  const db = new CouchDB(ctx.appId)
505
586
  &nbsp;
506
587
  const query = await db.get(ctx.params.queryId)
507
588
  const datasource = await db.get(query.datasourceId)
508
- &nbsp;
509
- const enrichedQuery = await enrichQueryFields(
510
- query.fields,
511
- ctx.request.body.parameters
512
- )
513
589
  &nbsp;
514
590
  // call the relevant CRUD method on the integration class
515
591
  try {
516
- const { rows } = await Runner.run({
592
+ const { rows, extra } = await Runner.run({
593
+ appId: ctx.appId,
517
594
  datasource,
518
595
  queryVerb: query.queryVerb,
519
- query: enrichedQuery,
596
+ fields: query.fields,
597
+ parameters: ctx.request.body.parameters,
520
598
  transformer: query.transformer,
599
+ queryId: ctx.params.queryId,
521
600
  })
522
- ctx.body = rows
601
+ if (opts &amp;&amp; opts.rowsOnly) {
602
+ ctx.body = rows
603
+ } else <span class="missing-if-branch" title="else path not taken" >E</span>{
604
+ <span class="cstat-no" title="statement not covered" > ctx.body = { data: rows, ...extra }</span>
605
+ }
523
606
  } catch (err) {
524
607
  ctx.throw(400, err)
525
608
  }
526
609
  }
527
610
  &nbsp;
611
+ exports.executeV1 = async function (ctx) {
612
+ return execute(ctx, { rowsOnly: true })
613
+ }
614
+ &nbsp;
615
+ exports.executeV2 = <span class="fstat-no" title="function not covered" >as</span>ync function (ctx) {
616
+ <span class="cstat-no" title="statement not covered" > return execute(ctx, { rowsOnly: false })</span>
617
+ }
618
+ &nbsp;
619
+ const removeDynamicVariables = async (db, queryId) =&gt; {
620
+ const query = await db.get(queryId)
621
+ const datasource = await db.get(query.datasourceId)
622
+ const dynamicVariables = datasource.config.dynamicVariables
623
+ &nbsp;
624
+ if (dynamicVariables) {
625
+ // delete dynamic variables from the datasource
626
+ const newVariables = dynamicVariables.filter(dv =&gt; dv.queryId !== queryId)
627
+ datasource.config.dynamicVariables = newVariables
628
+ await db.put(datasource)
629
+ &nbsp;
630
+ // invalidate the deleted variables
631
+ const variablesToDelete = dynamicVariables.filter(
632
+ dv =&gt; dv.queryId === queryId
633
+ )
634
+ await invalidateDynamicVariables(variablesToDelete)
635
+ }
636
+ }
637
+ &nbsp;
528
638
  exports.destroy = async function (ctx) {
529
639
  const db = new CouchDB(ctx.appId)
640
+ await removeDynamicVariables(db, ctx.params.queryId)
530
641
  await db.remove(ctx.params.queryId, ctx.params.revId)
531
642
  ctx.message = `Query deleted.`
532
643
  ctx.status = 200
@@ -538,17 +649,17 @@ exports.destroy = async function (ctx) {
538
649
  <div class='footer quiet pad2 space-top1 center small'>
539
650
  Code coverage generated by
540
651
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
541
- at Fri Dec 17 2021 14:52:30 GMT+0000 (Coordinated Universal Time)
652
+ at Tue Jan 11 2022 14:31:15 GMT+0000 (Coordinated Universal Time)
542
653
  </div>
543
654
  </div>
544
- <script src="../../prettify.js"></script>
655
+ <script src="../../../prettify.js"></script>
545
656
  <script>
546
657
  window.onload = function () {
547
658
  prettyPrint();
548
659
  };
549
660
  </script>
550
- <script src="../../sorter.js"></script>
551
- <script src="../../block-navigation.js"></script>
661
+ <script src="../../../sorter.js"></script>
662
+ <script src="../../../block-navigation.js"></script>
552
663
  </body>
553
664
  </html>
554
665