@budibase/server 0.9.136 → 0.9.140-alpha.0

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 (296) hide show
  1. package/builder/assets/discord.c14881e9.svg +10 -0
  2. package/builder/assets/{index.a0ab7774.js → index.0d1fa670.js} +35 -35
  3. package/builder/assets/{index.121692c9.css → index.79907e5c.css} +5 -5
  4. package/builder/assets/integromat.42212f11.png +0 -0
  5. package/builder/assets/slack.1e1f7cfb.svg +33 -0
  6. package/builder/assets/{vendor.7177f366.js → vendor.d39b3c1e.js} +2 -2
  7. package/builder/assets/zapier.3fbd8f5c.png +0 -0
  8. package/builder/index.html +3 -3
  9. package/coverage/clover.xml +2142 -2095
  10. package/coverage/coverage-final.json +120 -106
  11. package/coverage/lcov-report/api/controllers/analytics.js.html +3 -3
  12. package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
  13. package/coverage/lcov-report/api/controllers/application.js.html +84 -84
  14. package/coverage/lcov-report/api/controllers/auth.js.html +6 -6
  15. package/coverage/lcov-report/api/controllers/automation.js.html +182 -356
  16. package/coverage/lcov-report/api/controllers/backup.js.html +3 -3
  17. package/coverage/lcov-report/api/controllers/component.js.html +5 -5
  18. package/coverage/lcov-report/api/controllers/datasource.js.html +12 -12
  19. package/coverage/lcov-report/api/controllers/dev.js.html +15 -15
  20. package/coverage/lcov-report/api/controllers/hosting.js.html +8 -8
  21. package/coverage/lcov-report/api/controllers/index.html +47 -32
  22. package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
  23. package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
  24. package/coverage/lcov-report/api/controllers/metadata.js.html +218 -0
  25. package/coverage/lcov-report/api/controllers/permission.js.html +14 -14
  26. package/coverage/lcov-report/api/controllers/query.js.html +17 -23
  27. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  28. package/coverage/lcov-report/api/controllers/routing.js.html +9 -9
  29. package/coverage/lcov-report/api/controllers/row/external.js.html +15 -15
  30. package/coverage/lcov-report/api/controllers/row/index.html +29 -44
  31. package/coverage/lcov-report/api/controllers/row/index.js.html +48 -45
  32. package/coverage/lcov-report/api/controllers/row/internal.js.html +159 -126
  33. package/coverage/lcov-report/api/controllers/row/utils.js.html +17 -17
  34. package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
  35. package/coverage/lcov-report/api/controllers/script.js.html +5 -5
  36. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/index.js.html +40 -40
  38. package/coverage/lcov-report/api/controllers/table/utils.js.html +48 -48
  39. package/coverage/lcov-report/api/controllers/templates.js.html +5 -5
  40. package/coverage/lcov-report/api/controllers/user.js.html +14 -11
  41. package/coverage/lcov-report/api/controllers/view/exporters.js.html +3 -3
  42. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/index.js.html +9 -9
  44. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +6 -6
  45. package/coverage/lcov-report/api/controllers/webhook.js.html +14 -14
  46. package/coverage/lcov-report/api/index.html +1 -1
  47. package/coverage/lcov-report/api/index.js.html +23 -23
  48. package/coverage/lcov-report/api/routes/analytics.js.html +6 -6
  49. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
  50. package/coverage/lcov-report/api/routes/application.js.html +8 -8
  51. package/coverage/lcov-report/api/routes/auth.js.html +6 -6
  52. package/coverage/lcov-report/api/routes/automation.js.html +41 -26
  53. package/coverage/lcov-report/api/routes/backup.js.html +8 -8
  54. package/coverage/lcov-report/api/routes/component.js.html +8 -8
  55. package/coverage/lcov-report/api/routes/datasource.js.html +13 -13
  56. package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
  57. package/coverage/lcov-report/api/routes/dev.js.html +11 -11
  58. package/coverage/lcov-report/api/routes/hosting.js.html +8 -8
  59. package/coverage/lcov-report/api/routes/index.html +24 -9
  60. package/coverage/lcov-report/api/routes/index.js.html +36 -30
  61. package/coverage/lcov-report/api/routes/integration.js.html +8 -8
  62. package/coverage/lcov-report/api/routes/layout.js.html +8 -8
  63. package/coverage/lcov-report/api/routes/metadata.js.html +194 -0
  64. package/coverage/lcov-report/api/routes/permission.js.html +12 -12
  65. package/coverage/lcov-report/api/routes/query.js.html +13 -13
  66. package/coverage/lcov-report/api/routes/role.js.html +12 -12
  67. package/coverage/lcov-report/api/routes/routing.js.html +8 -8
  68. package/coverage/lcov-report/api/routes/row.js.html +10 -10
  69. package/coverage/lcov-report/api/routes/screen.js.html +11 -11
  70. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/static.js.html +13 -16
  72. package/coverage/lcov-report/api/routes/table.js.html +12 -12
  73. package/coverage/lcov-report/api/routes/templates.js.html +8 -8
  74. package/coverage/lcov-report/api/routes/user.js.html +9 -9
  75. package/coverage/lcov-report/api/routes/view.js.html +11 -11
  76. package/coverage/lcov-report/api/routes/webhook.js.html +11 -11
  77. package/coverage/lcov-report/automations/actions.js.html +57 -117
  78. package/coverage/lcov-report/automations/automationUtils.js.html +7 -7
  79. package/coverage/lcov-report/automations/bullboard.js.html +49 -16
  80. package/coverage/lcov-report/automations/index.html +67 -67
  81. package/coverage/lcov-report/automations/index.js.html +27 -129
  82. package/coverage/lcov-report/automations/steps/bash.js.html +37 -16
  83. package/coverage/lcov-report/automations/steps/createRow.js.html +15 -15
  84. package/coverage/lcov-report/automations/steps/delay.js.html +48 -9
  85. package/coverage/lcov-report/automations/steps/deleteRow.js.html +14 -14
  86. package/coverage/lcov-report/automations/steps/discord.js.html +329 -0
  87. package/coverage/lcov-report/automations/steps/executeQuery.js.html +22 -34
  88. package/coverage/lcov-report/automations/steps/executeScript.js.html +21 -33
  89. package/coverage/lcov-report/automations/steps/filter.js.html +28 -25
  90. package/coverage/lcov-report/automations/steps/index.html +140 -65
  91. package/coverage/lcov-report/automations/steps/integromat.js.html +341 -0
  92. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +44 -38
  93. package/coverage/lcov-report/automations/steps/queryRows.js.html +437 -0
  94. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +13 -13
  95. package/coverage/lcov-report/automations/steps/serverLog.js.html +23 -11
  96. package/coverage/lcov-report/automations/steps/{sendgridEmail.js.html → slack.js.html} +58 -88
  97. package/coverage/lcov-report/automations/steps/updateRow.js.html +12 -12
  98. package/coverage/lcov-report/automations/steps/utils.js.html +188 -0
  99. package/coverage/lcov-report/automations/steps/zapier.js.html +332 -0
  100. package/coverage/lcov-report/automations/thread.js.html +81 -78
  101. package/coverage/lcov-report/automations/triggerInfo/app.js.html +173 -0
  102. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +173 -0
  103. package/coverage/lcov-report/automations/triggerInfo/index.html +201 -0
  104. package/coverage/lcov-report/automations/triggerInfo/index.js.html +125 -0
  105. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +176 -0
  106. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +200 -0
  107. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +200 -0
  108. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +188 -0
  109. package/coverage/lcov-report/automations/triggers.js.html +67 -838
  110. package/coverage/lcov-report/automations/utils.js.html +557 -0
  111. package/coverage/lcov-report/constants/index.html +5 -5
  112. package/coverage/lcov-report/constants/index.js.html +32 -17
  113. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  114. package/coverage/lcov-report/constants/screens.js.html +4 -4
  115. package/coverage/lcov-report/db/client.js.html +18 -18
  116. package/coverage/lcov-report/db/index.html +19 -19
  117. package/coverage/lcov-report/db/index.js.html +3 -3
  118. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +79 -79
  119. package/coverage/lcov-report/db/linkedRows/index.html +18 -18
  120. package/coverage/lcov-report/db/linkedRows/index.js.html +107 -149
  121. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +43 -43
  122. package/coverage/lcov-report/db/newid.js.html +4 -4
  123. package/coverage/lcov-report/db/utils.js.html +127 -76
  124. package/coverage/lcov-report/events/AutomationEmitter.js.html +7 -7
  125. package/coverage/lcov-report/events/index.html +1 -1
  126. package/coverage/lcov-report/events/index.js.html +6 -6
  127. package/coverage/lcov-report/events/utils.js.html +3 -3
  128. package/coverage/lcov-report/index.html +116 -101
  129. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  130. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  131. package/coverage/lcov-report/{automations/logic.js.html → middleware/appInfo.js.html} +35 -38
  132. package/coverage/lcov-report/middleware/authorized.js.html +16 -16
  133. package/coverage/lcov-report/middleware/builder.js.html +15 -15
  134. package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
  135. package/coverage/lcov-report/middleware/index.html +23 -8
  136. package/coverage/lcov-report/middleware/joi-validator.js.html +6 -6
  137. package/coverage/lcov-report/middleware/resourceId.js.html +28 -28
  138. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  139. package/coverage/lcov-report/middleware/usageQuota.js.html +8 -8
  140. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  141. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  142. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  143. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  144. package/coverage/lcov-report/utilities/global.js.html +33 -33
  145. package/coverage/lcov-report/utilities/index.html +28 -28
  146. package/coverage/lcov-report/utilities/index.js.html +178 -25
  147. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +18 -18
  148. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  149. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  150. package/coverage/lcov-report/utilities/routing/index.js.html +6 -6
  151. package/coverage/lcov-report/utilities/rowProcessor/index.html +14 -14
  152. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +87 -51
  153. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +10 -10
  154. package/coverage/lcov-report/utilities/security.js.html +9 -9
  155. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  156. package/coverage/lcov-report/utilities/users.js.html +5 -5
  157. package/coverage/lcov-report/utilities/workerRequests.js.html +52 -52
  158. package/coverage/lcov.info +3250 -3213
  159. package/dist/api/controllers/automation.js +60 -127
  160. package/dist/api/controllers/deploy/index.js +17 -1
  161. package/dist/api/controllers/metadata.js +49 -0
  162. package/dist/api/controllers/query.js +0 -2
  163. package/dist/api/controllers/row/ExternalRequest.js +1 -1
  164. package/dist/api/controllers/row/index.js +1 -0
  165. package/dist/api/controllers/row/internal.js +33 -23
  166. package/dist/api/controllers/static/index.js +1 -28
  167. package/dist/api/controllers/static/templates/BudibaseApp.svelte +4 -1
  168. package/dist/api/controllers/user.js +1 -1
  169. package/dist/api/routes/automation.js +4 -5
  170. package/dist/api/routes/index.js +2 -0
  171. package/dist/api/routes/metadata.js +13 -0
  172. package/dist/api/routes/static.js +0 -1
  173. package/dist/api/routes/tests/utilities/TestFunctions.js +13 -0
  174. package/dist/app.js +1 -1
  175. package/dist/automations/actions.js +29 -46
  176. package/dist/automations/bullboard.js +11 -2
  177. package/dist/automations/index.js +11 -48
  178. package/dist/automations/steps/bash.js +12 -6
  179. package/dist/automations/steps/createRow.js +5 -5
  180. package/dist/automations/steps/delay.js +16 -3
  181. package/dist/automations/steps/deleteRow.js +5 -5
  182. package/dist/automations/steps/discord.js +91 -0
  183. package/dist/automations/steps/executeQuery.js +12 -15
  184. package/dist/automations/steps/executeScript.js +12 -15
  185. package/dist/automations/steps/filter.js +19 -18
  186. package/dist/automations/steps/integromat.js +94 -0
  187. package/dist/automations/steps/outgoingWebhook.js +19 -20
  188. package/dist/automations/steps/queryRows.js +129 -0
  189. package/dist/automations/steps/sendSmtpEmail.js +4 -4
  190. package/dist/automations/steps/serverLog.js +7 -3
  191. package/dist/automations/steps/slack.js +73 -0
  192. package/dist/automations/steps/updateRow.js +4 -4
  193. package/dist/automations/steps/utils.js +46 -0
  194. package/dist/automations/steps/zapier.js +91 -0
  195. package/dist/automations/tests/utilities/index.js +2 -12
  196. package/dist/automations/thread.js +23 -25
  197. package/dist/automations/triggerInfo/app.js +32 -0
  198. package/dist/automations/triggerInfo/cron.js +32 -0
  199. package/dist/automations/triggerInfo/index.js +15 -0
  200. package/dist/automations/triggerInfo/rowDeleted.js +33 -0
  201. package/dist/automations/triggerInfo/rowSaved.js +41 -0
  202. package/dist/automations/triggerInfo/rowUpdated.js +41 -0
  203. package/dist/automations/triggerInfo/webhook.js +37 -0
  204. package/dist/automations/triggers.js +27 -285
  205. package/dist/automations/utils.js +143 -0
  206. package/dist/constants/index.js +4 -0
  207. package/dist/db/linkedRows/index.js +20 -34
  208. package/dist/db/utils.js +14 -1
  209. package/dist/environment.js +2 -1
  210. package/dist/integrations/mysql.js +14 -2
  211. package/dist/middleware/appInfo.js +17 -0
  212. package/dist/middleware/usageQuota.js +1 -1
  213. package/dist/package.json +12 -11
  214. package/dist/tsconfig.tsbuildinfo +1 -1
  215. package/dist/utilities/appDirectoryTemplate/package.json +1 -1
  216. package/dist/utilities/fileSystem/clientLibrary.js +2 -2
  217. package/dist/utilities/fileSystem/index.js +2 -27
  218. package/dist/utilities/index.js +54 -0
  219. package/dist/utilities/redis.js +16 -1
  220. package/dist/utilities/rowProcessor/index.js +7 -4
  221. package/package.json +13 -12
  222. package/scripts/jestSetup.js +1 -0
  223. package/scripts/selfhost.js +8 -0
  224. package/src/api/controllers/automation.js +87 -145
  225. package/src/api/controllers/deploy/index.js +23 -1
  226. package/src/api/controllers/metadata.js +46 -0
  227. package/src/api/controllers/query.js +0 -2
  228. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  229. package/src/api/controllers/row/index.js +1 -0
  230. package/src/api/controllers/row/internal.js +34 -23
  231. package/src/api/controllers/static/index.js +1 -39
  232. package/src/api/controllers/static/templates/BudibaseApp.svelte +4 -1
  233. package/src/api/controllers/user.js +1 -0
  234. package/src/api/routes/automation.js +16 -11
  235. package/src/api/routes/index.js +2 -0
  236. package/src/api/routes/metadata.js +38 -0
  237. package/src/api/routes/static.js +0 -1
  238. package/src/api/routes/tests/automation.spec.js +4 -26
  239. package/src/api/routes/tests/metadata.spec.js +65 -0
  240. package/src/api/routes/tests/utilities/TestFunctions.js +14 -0
  241. package/src/app.ts +1 -1
  242. package/src/automations/actions.js +29 -49
  243. package/src/automations/bullboard.js +13 -2
  244. package/src/automations/index.js +11 -45
  245. package/src/automations/steps/bash.js +13 -6
  246. package/src/automations/steps/createRow.js +5 -5
  247. package/src/automations/steps/delay.js +16 -3
  248. package/src/automations/steps/deleteRow.js +5 -5
  249. package/src/automations/steps/discord.js +83 -0
  250. package/src/automations/steps/executeQuery.js +12 -16
  251. package/src/automations/steps/executeScript.js +12 -16
  252. package/src/automations/steps/filter.js +19 -18
  253. package/src/automations/steps/integromat.js +87 -0
  254. package/src/automations/steps/outgoingWebhook.js +20 -18
  255. package/src/automations/steps/queryRows.js +119 -0
  256. package/src/automations/steps/sendSmtpEmail.js +4 -4
  257. package/src/automations/steps/serverLog.js +7 -3
  258. package/src/automations/steps/slack.js +64 -0
  259. package/src/automations/steps/updateRow.js +4 -4
  260. package/src/automations/steps/utils.js +36 -0
  261. package/src/automations/steps/zapier.js +84 -0
  262. package/src/automations/tests/automation.spec.js +4 -67
  263. package/src/automations/tests/delay.spec.js +2 -2
  264. package/src/automations/tests/filter.spec.js +14 -14
  265. package/src/automations/tests/queryRows.spec.js +51 -0
  266. package/src/automations/tests/utilities/index.js +2 -13
  267. package/src/automations/thread.js +27 -26
  268. package/src/automations/triggerInfo/app.js +31 -0
  269. package/src/automations/triggerInfo/cron.js +31 -0
  270. package/src/automations/triggerInfo/index.js +15 -0
  271. package/src/automations/triggerInfo/rowDeleted.js +32 -0
  272. package/src/automations/triggerInfo/rowSaved.js +40 -0
  273. package/src/automations/triggerInfo/rowUpdated.js +40 -0
  274. package/src/automations/triggerInfo/webhook.js +36 -0
  275. package/src/automations/triggers.js +33 -290
  276. package/src/automations/utils.js +159 -0
  277. package/src/constants/index.js +5 -0
  278. package/src/db/linkedRows/index.js +21 -35
  279. package/src/db/tests/linkTests.spec.js +0 -12
  280. package/src/db/utils.js +17 -0
  281. package/src/environment.js +2 -1
  282. package/src/integrations/mysql.ts +15 -2
  283. package/src/middleware/appInfo.js +19 -0
  284. package/src/middleware/usageQuota.js +1 -1
  285. package/src/utilities/appDirectoryTemplate/package.json +1 -1
  286. package/src/utilities/fileSystem/clientLibrary.js +2 -2
  287. package/src/utilities/fileSystem/index.js +2 -36
  288. package/src/utilities/index.js +51 -0
  289. package/src/utilities/redis.js +18 -1
  290. package/src/utilities/rowProcessor/index.js +16 -4
  291. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +0 -1244
  292. package/dist/automations/logic.js +0 -17
  293. package/dist/automations/steps/sendgridEmail.js +0 -85
  294. package/src/automations/logic.js +0 -20
  295. package/src/automations/steps/sendgridEmail.js +0 -74
  296. package/src/automations/tests/sendEmail.spec.js +0 -36
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">94.5% </span>
26
+ <span class="strong">89.47% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>103/109</span>
28
+ <span class='fraction'>85/95</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">83.33% </span>
33
+ <span class="strong">71.88% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>50/60</span>
35
+ <span class='fraction'>23/32</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">92.86% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>17/17</span>
42
+ <span class='fraction'>13/14</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">94.39% </span>
47
+ <span class="strong">89.36% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>101/107</span>
49
+ <span class='fraction'>84/94</span>
50
50
  </div>
51
51
 
52
52
 
@@ -281,145 +281,84 @@
281
281
  <a name='L222'></a><a href='#L222'>222</a>
282
282
  <a name='L223'></a><a href='#L223'>223</a>
283
283
  <a name='L224'></a><a href='#L224'>224</a>
284
- <a name='L225'></a><a href='#L225'>225</a>
285
- <a name='L226'></a><a href='#L226'>226</a>
286
- <a name='L227'></a><a href='#L227'>227</a>
287
- <a name='L228'></a><a href='#L228'>228</a>
288
- <a name='L229'></a><a href='#L229'>229</a>
289
- <a name='L230'></a><a href='#L230'>230</a>
290
- <a name='L231'></a><a href='#L231'>231</a>
291
- <a name='L232'></a><a href='#L232'>232</a>
292
- <a name='L233'></a><a href='#L233'>233</a>
293
- <a name='L234'></a><a href='#L234'>234</a>
294
- <a name='L235'></a><a href='#L235'>235</a>
295
- <a name='L236'></a><a href='#L236'>236</a>
296
- <a name='L237'></a><a href='#L237'>237</a>
297
- <a name='L238'></a><a href='#L238'>238</a>
298
- <a name='L239'></a><a href='#L239'>239</a>
299
- <a name='L240'></a><a href='#L240'>240</a>
300
- <a name='L241'></a><a href='#L241'>241</a>
301
- <a name='L242'></a><a href='#L242'>242</a>
302
- <a name='L243'></a><a href='#L243'>243</a>
303
- <a name='L244'></a><a href='#L244'>244</a>
304
- <a name='L245'></a><a href='#L245'>245</a>
305
- <a name='L246'></a><a href='#L246'>246</a>
306
- <a name='L247'></a><a href='#L247'>247</a>
307
- <a name='L248'></a><a href='#L248'>248</a>
308
- <a name='L249'></a><a href='#L249'>249</a>
309
- <a name='L250'></a><a href='#L250'>250</a>
310
- <a name='L251'></a><a href='#L251'>251</a>
311
- <a name='L252'></a><a href='#L252'>252</a>
312
- <a name='L253'></a><a href='#L253'>253</a>
313
- <a name='L254'></a><a href='#L254'>254</a>
314
- <a name='L255'></a><a href='#L255'>255</a>
315
- <a name='L256'></a><a href='#L256'>256</a>
316
- <a name='L257'></a><a href='#L257'>257</a>
317
- <a name='L258'></a><a href='#L258'>258</a>
318
- <a name='L259'></a><a href='#L259'>259</a>
319
- <a name='L260'></a><a href='#L260'>260</a>
320
- <a name='L261'></a><a href='#L261'>261</a>
321
- <a name='L262'></a><a href='#L262'>262</a>
322
- <a name='L263'></a><a href='#L263'>263</a>
323
- <a name='L264'></a><a href='#L264'>264</a>
324
- <a name='L265'></a><a href='#L265'>265</a>
325
- <a name='L266'></a><a href='#L266'>266</a>
326
- <a name='L267'></a><a href='#L267'>267</a>
327
- <a name='L268'></a><a href='#L268'>268</a>
328
- <a name='L269'></a><a href='#L269'>269</a>
329
- <a name='L270'></a><a href='#L270'>270</a>
330
- <a name='L271'></a><a href='#L271'>271</a>
331
- <a name='L272'></a><a href='#L272'>272</a>
332
- <a name='L273'></a><a href='#L273'>273</a>
333
- <a name='L274'></a><a href='#L274'>274</a>
334
- <a name='L275'></a><a href='#L275'>275</a>
335
- <a name='L276'></a><a href='#L276'>276</a>
336
- <a name='L277'></a><a href='#L277'>277</a>
337
- <a name='L278'></a><a href='#L278'>278</a>
338
- <a name='L279'></a><a href='#L279'>279</a>
339
- <a name='L280'></a><a href='#L280'>280</a>
340
- <a name='L281'></a><a href='#L281'>281</a>
341
- <a name='L282'></a><a href='#L282'>282</a>
342
- <a name='L283'></a><a href='#L283'>283</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">32x</span>
343
- <span class="cline-any cline-yes">32x</span>
344
- <span class="cline-any cline-yes">32x</span>
345
- <span class="cline-any cline-yes">32x</span>
346
- <span class="cline-any cline-yes">32x</span>
347
- <span class="cline-any cline-yes">32x</span>
348
- <span class="cline-any cline-neutral">&nbsp;</span>
349
- <span class="cline-any cline-yes">32x</span>
350
- <span class="cline-any cline-yes">32x</span>
351
- <span class="cline-any cline-neutral">&nbsp;</span>
352
- <span class="cline-any cline-neutral">&nbsp;</span>
353
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
358
- <span class="cline-any cline-neutral">&nbsp;</span>
359
- <span class="cline-any cline-yes">19x</span>
360
- <span class="cline-any cline-no">&nbsp;</span>
284
+ <a name='L225'></a><a href='#L225'>225</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">33x</span>
285
+ <span class="cline-any cline-yes">33x</span>
286
+ <span class="cline-any cline-yes">33x</span>
287
+ <span class="cline-any cline-yes">33x</span>
361
288
  <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-yes">19x</span>
363
- <span class="cline-any cline-yes">19x</span>
364
- <span class="cline-any cline-yes">19x</span>
365
- <span class="cline-any cline-yes">19x</span>
366
- <span class="cline-any cline-yes">23x</span>
367
- <span class="cline-any cline-no">&nbsp;</span>
368
289
  <span class="cline-any cline-neutral">&nbsp;</span>
369
- <span class="cline-any cline-yes">23x</span>
370
- <span class="cline-any cline-yes">7x</span>
371
- <span class="cline-any cline-no">&nbsp;</span>
372
290
  <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-yes">33x</span>
292
+ <span class="cline-any cline-yes">33x</span>
293
+ <span class="cline-any cline-yes">33x</span>
294
+ <span class="cline-any cline-yes">33x</span>
373
295
  <span class="cline-any cline-neutral">&nbsp;</span>
374
296
  <span class="cline-any cline-neutral">&nbsp;</span>
375
- <span class="cline-any cline-yes">19x</span>
376
297
  <span class="cline-any cline-neutral">&nbsp;</span>
377
298
  <span class="cline-any cline-neutral">&nbsp;</span>
378
299
  <span class="cline-any cline-neutral">&nbsp;</span>
379
300
  <span class="cline-any cline-neutral">&nbsp;</span>
380
301
  <span class="cline-any cline-neutral">&nbsp;</span>
381
302
  <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-yes">1x</span>
382
304
  <span class="cline-any cline-neutral">&nbsp;</span>
383
305
  <span class="cline-any cline-neutral">&nbsp;</span>
384
306
  <span class="cline-any cline-neutral">&nbsp;</span>
385
- <span class="cline-any cline-yes">20x</span>
386
- <span class="cline-any cline-yes">20x</span>
387
307
  <span class="cline-any cline-neutral">&nbsp;</span>
388
- <span class="cline-any cline-yes">40x</span>
308
+ <span class="cline-any cline-yes">1x</span>
389
309
  <span class="cline-any cline-neutral">&nbsp;</span>
390
310
  <span class="cline-any cline-neutral">&nbsp;</span>
391
311
  <span class="cline-any cline-neutral">&nbsp;</span>
392
312
  <span class="cline-any cline-neutral">&nbsp;</span>
393
313
  <span class="cline-any cline-neutral">&nbsp;</span>
394
314
  <span class="cline-any cline-neutral">&nbsp;</span>
395
- <span class="cline-any cline-yes">60x</span>
396
315
  <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-yes">22x</span>
317
+ <span class="cline-any cline-no">&nbsp;</span>
397
318
  <span class="cline-any cline-neutral">&nbsp;</span>
398
- <span class="cline-any cline-yes">20x</span>
399
- <span class="cline-any cline-yes">20x</span>
319
+ <span class="cline-any cline-yes">22x</span>
320
+ <span class="cline-any cline-yes">22x</span>
321
+ <span class="cline-any cline-yes">22x</span>
400
322
  <span class="cline-any cline-neutral">&nbsp;</span>
401
- <span class="cline-any cline-yes">20x</span>
323
+ <span class="cline-any cline-yes">22x</span>
324
+ <span class="cline-any cline-yes">18x</span>
402
325
  <span class="cline-any cline-neutral">&nbsp;</span>
403
- <span class="cline-any cline-yes">20x</span>
326
+ <span class="cline-any cline-yes">22x</span>
327
+ <span class="cline-any cline-yes">26x</span>
404
328
  <span class="cline-any cline-no">&nbsp;</span>
405
329
  <span class="cline-any cline-neutral">&nbsp;</span>
406
- <span class="cline-any cline-neutral">&nbsp;</span>
407
- <span class="cline-any cline-yes">20x</span>
330
+ <span class="cline-any cline-yes">26x</span>
331
+ <span class="cline-any cline-yes">7x</span>
408
332
  <span class="cline-any cline-no">&nbsp;</span>
409
333
  <span class="cline-any cline-neutral">&nbsp;</span>
410
334
  <span class="cline-any cline-neutral">&nbsp;</span>
411
335
  <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-yes">22x</span>
412
337
  <span class="cline-any cline-neutral">&nbsp;</span>
413
338
  <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-yes">33x</span>
340
+ <span class="cline-any cline-yes">21x</span>
341
+ <span class="cline-any cline-yes">21x</span>
342
+ <span class="cline-any cline-yes">21x</span>
414
343
  <span class="cline-any cline-neutral">&nbsp;</span>
415
344
  <span class="cline-any cline-neutral">&nbsp;</span>
416
- <span class="cline-any cline-no">&nbsp;</span>
345
+ <span class="cline-any cline-yes">21x</span>
346
+ <span class="cline-any cline-yes">1x</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
417
348
  <span class="cline-any cline-neutral">&nbsp;</span>
418
349
  <span class="cline-any cline-yes">20x</span>
419
350
  <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-yes">20x</span>
352
+ <span class="cline-any cline-yes">20x</span>
353
+ <span class="cline-any cline-yes">20x</span>
420
354
  <span class="cline-any cline-neutral">&nbsp;</span>
421
355
  <span class="cline-any cline-neutral">&nbsp;</span>
422
356
  <span class="cline-any cline-neutral">&nbsp;</span>
357
+ <span class="cline-any cline-yes">20x</span>
358
+ <span class="cline-any cline-yes">20x</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-yes">20x</span>
361
+ <span class="cline-any cline-yes">20x</span>
423
362
  <span class="cline-any cline-neutral">&nbsp;</span>
424
363
  <span class="cline-any cline-neutral">&nbsp;</span>
425
364
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -427,56 +366,65 @@
427
366
  <span class="cline-any cline-neutral">&nbsp;</span>
428
367
  <span class="cline-any cline-neutral">&nbsp;</span>
429
368
  <span class="cline-any cline-neutral">&nbsp;</span>
430
- <span class="cline-any cline-yes">20x</span>
431
- <span class="cline-any cline-yes">20x</span>
432
369
  <span class="cline-any cline-neutral">&nbsp;</span>
433
- <span class="cline-any cline-yes">20x</span>
370
+ <span class="cline-any cline-yes">33x</span>
371
+ <span class="cline-any cline-yes">2x</span>
372
+ <span class="cline-any cline-yes">2x</span>
373
+ <span class="cline-any cline-yes">2x</span>
374
+ <span class="cline-any cline-yes">2x</span>
375
+ <span class="cline-any cline-yes">2x</span>
376
+ <span class="cline-any cline-yes">2x</span>
434
377
  <span class="cline-any cline-neutral">&nbsp;</span>
435
- <span class="cline-any cline-yes">61x</span>
436
378
  <span class="cline-any cline-neutral">&nbsp;</span>
437
379
  <span class="cline-any cline-neutral">&nbsp;</span>
438
380
  <span class="cline-any cline-neutral">&nbsp;</span>
381
+ <span class="cline-any cline-yes">2x</span>
382
+ <span class="cline-any cline-yes">2x</span>
439
383
  <span class="cline-any cline-neutral">&nbsp;</span>
440
384
  <span class="cline-any cline-neutral">&nbsp;</span>
385
+ <span class="cline-any cline-yes">2x</span>
441
386
  <span class="cline-any cline-neutral">&nbsp;</span>
442
- <span class="cline-any cline-yes">20x</span>
443
387
  <span class="cline-any cline-neutral">&nbsp;</span>
444
388
  <span class="cline-any cline-neutral">&nbsp;</span>
389
+ <span class="cline-any cline-yes">2x</span>
445
390
  <span class="cline-any cline-neutral">&nbsp;</span>
446
391
  <span class="cline-any cline-neutral">&nbsp;</span>
447
- <span class="cline-any cline-yes">1x</span>
448
- <span class="cline-any cline-yes">1x</span>
449
392
  <span class="cline-any cline-neutral">&nbsp;</span>
450
- <span class="cline-any cline-yes">1x</span>
393
+ <span class="cline-any cline-yes">2x</span>
451
394
  <span class="cline-any cline-yes">1x</span>
452
395
  <span class="cline-any cline-neutral">&nbsp;</span>
453
396
  <span class="cline-any cline-neutral">&nbsp;</span>
454
397
  <span class="cline-any cline-neutral">&nbsp;</span>
455
398
  <span class="cline-any cline-neutral">&nbsp;</span>
456
- <span class="cline-any cline-yes">1x</span>
457
- <span class="cline-any cline-yes">1x</span>
458
- <span class="cline-any cline-yes">1x</span>
459
399
  <span class="cline-any cline-neutral">&nbsp;</span>
460
- <span class="cline-any cline-yes">1x</span>
461
400
  <span class="cline-any cline-neutral">&nbsp;</span>
401
+ <span class="cline-any cline-yes">2x</span>
402
+ <span class="cline-any cline-yes">2x</span>
462
403
  <span class="cline-any cline-neutral">&nbsp;</span>
463
404
  <span class="cline-any cline-neutral">&nbsp;</span>
464
405
  <span class="cline-any cline-neutral">&nbsp;</span>
465
406
  <span class="cline-any cline-neutral">&nbsp;</span>
466
- <span class="cline-any cline-yes">20x</span>
467
407
  <span class="cline-any cline-neutral">&nbsp;</span>
468
408
  <span class="cline-any cline-neutral">&nbsp;</span>
469
409
  <span class="cline-any cline-neutral">&nbsp;</span>
470
- <span class="cline-any cline-yes">1x</span>
471
410
  <span class="cline-any cline-neutral">&nbsp;</span>
472
411
  <span class="cline-any cline-neutral">&nbsp;</span>
412
+ <span class="cline-any cline-yes">33x</span>
413
+ <span class="cline-any cline-yes">2x</span>
414
+ <span class="cline-any cline-yes">2x</span>
473
415
  <span class="cline-any cline-neutral">&nbsp;</span>
474
416
  <span class="cline-any cline-neutral">&nbsp;</span>
475
417
  <span class="cline-any cline-neutral">&nbsp;</span>
476
418
  <span class="cline-any cline-neutral">&nbsp;</span>
419
+ <span class="cline-any cline-yes">2x</span>
477
420
  <span class="cline-any cline-neutral">&nbsp;</span>
478
421
  <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-yes">33x</span>
423
+ <span class="cline-any cline-yes">1x</span>
424
+ <span class="cline-any cline-yes">1x</span>
479
425
  <span class="cline-any cline-neutral">&nbsp;</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-yes">33x</span>
480
428
  <span class="cline-any cline-yes">1x</span>
481
429
  <span class="cline-any cline-yes">1x</span>
482
430
  <span class="cline-any cline-yes">1x</span>
@@ -485,151 +433,89 @@
485
433
  <span class="cline-any cline-neutral">&nbsp;</span>
486
434
  <span class="cline-any cline-neutral">&nbsp;</span>
487
435
  <span class="cline-any cline-neutral">&nbsp;</span>
488
- <span class="cline-any cline-yes">20x</span>
436
+ <span class="cline-any cline-yes">1x</span>
437
+ <span class="cline-any cline-yes">1x</span>
489
438
  <span class="cline-any cline-neutral">&nbsp;</span>
490
439
  <span class="cline-any cline-neutral">&nbsp;</span>
491
- <span class="cline-any cline-yes">32x</span>
492
- <span class="cline-any cline-yes">18x</span>
493
- <span class="cline-any cline-yes">18x</span>
494
- <span class="cline-any cline-yes">18x</span>
440
+ <span class="cline-any cline-yes">33x</span>
441
+ <span class="cline-any cline-yes">1x</span>
495
442
  <span class="cline-any cline-neutral">&nbsp;</span>
496
443
  <span class="cline-any cline-neutral">&nbsp;</span>
497
- <span class="cline-any cline-yes">18x</span>
444
+ <span class="cline-any cline-yes">33x</span>
498
445
  <span class="cline-any cline-yes">1x</span>
499
446
  <span class="cline-any cline-neutral">&nbsp;</span>
500
447
  <span class="cline-any cline-neutral">&nbsp;</span>
501
- <span class="cline-any cline-yes">17x</span>
448
+ <span class="cline-any cline-yes">33x</span>
449
+ <span class="cline-any cline-yes">1x</span>
502
450
  <span class="cline-any cline-neutral">&nbsp;</span>
503
- <span class="cline-any cline-yes">17x</span>
504
- <span class="cline-any cline-yes">17x</span>
505
- <span class="cline-any cline-yes">17x</span>
506
451
  <span class="cline-any cline-neutral">&nbsp;</span>
507
452
  <span class="cline-any cline-neutral">&nbsp;</span>
508
453
  <span class="cline-any cline-neutral">&nbsp;</span>
509
- <span class="cline-any cline-yes">17x</span>
510
454
  <span class="cline-any cline-neutral">&nbsp;</span>
511
455
  <span class="cline-any cline-neutral">&nbsp;</span>
512
456
  <span class="cline-any cline-neutral">&nbsp;</span>
513
- <span class="cline-any cline-yes">17x</span>
514
- <span class="cline-any cline-yes">17x</span>
515
457
  <span class="cline-any cline-neutral">&nbsp;</span>
516
- <span class="cline-any cline-yes">17x</span>
517
- <span class="cline-any cline-yes">17x</span>
518
458
  <span class="cline-any cline-neutral">&nbsp;</span>
519
459
  <span class="cline-any cline-neutral">&nbsp;</span>
520
460
  <span class="cline-any cline-neutral">&nbsp;</span>
461
+ <span class="cline-any cline-yes">33x</span>
462
+ <span class="cline-any cline-no">&nbsp;</span>
463
+ <span class="cline-any cline-no">&nbsp;</span>
464
+ <span class="cline-any cline-no">&nbsp;</span>
465
+ <span class="cline-any cline-no">&nbsp;</span>
521
466
  <span class="cline-any cline-neutral">&nbsp;</span>
522
467
  <span class="cline-any cline-neutral">&nbsp;</span>
523
468
  <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-no">&nbsp;</span>
470
+ <span class="cline-any cline-neutral">&nbsp;</span>
524
471
  <span class="cline-any cline-neutral">&nbsp;</span>
525
472
  <span class="cline-any cline-neutral">&nbsp;</span>
526
- <span class="cline-any cline-yes">32x</span>
527
- <span class="cline-any cline-yes">2x</span>
528
- <span class="cline-any cline-yes">2x</span>
529
- <span class="cline-any cline-yes">2x</span>
530
- <span class="cline-any cline-yes">2x</span>
531
- <span class="cline-any cline-yes">2x</span>
532
- <span class="cline-any cline-yes">2x</span>
533
473
  <span class="cline-any cline-neutral">&nbsp;</span>
534
474
  <span class="cline-any cline-neutral">&nbsp;</span>
535
475
  <span class="cline-any cline-neutral">&nbsp;</span>
536
476
  <span class="cline-any cline-neutral">&nbsp;</span>
537
477
  <span class="cline-any cline-yes">2x</span>
478
+ <span class="cline-any cline-no">&nbsp;</span>
538
479
  <span class="cline-any cline-neutral">&nbsp;</span>
480
+ <span class="cline-any cline-yes">2x</span>
481
+ <span class="cline-any cline-no">&nbsp;</span>
539
482
  <span class="cline-any cline-neutral">&nbsp;</span>
483
+ <span class="cline-any cline-yes">2x</span>
540
484
  <span class="cline-any cline-neutral">&nbsp;</span>
541
485
  <span class="cline-any cline-neutral">&nbsp;</span>
486
+ <span class="cline-any cline-yes">33x</span>
542
487
  <span class="cline-any cline-yes">2x</span>
543
488
  <span class="cline-any cline-yes">2x</span>
544
- <span class="cline-any cline-neutral">&nbsp;</span>
545
489
  <span class="cline-any cline-yes">2x</span>
546
490
  <span class="cline-any cline-yes">2x</span>
547
- <span class="cline-any cline-neutral">&nbsp;</span>
548
- <span class="cline-any cline-neutral">&nbsp;</span>
549
- <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-neutral">&nbsp;</span>
551
- <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-neutral">&nbsp;</span>
553
- <span class="cline-any cline-neutral">&nbsp;</span>
554
- <span class="cline-any cline-neutral">&nbsp;</span>
555
- <span class="cline-any cline-neutral">&nbsp;</span>
556
- <span class="cline-any cline-yes">32x</span>
557
- <span class="cline-any cline-yes">2x</span>
558
491
  <span class="cline-any cline-yes">2x</span>
559
- <span class="cline-any cline-neutral">&nbsp;</span>
560
- <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-neutral">&nbsp;</span>
562
- <span class="cline-any cline-neutral">&nbsp;</span>
563
492
  <span class="cline-any cline-yes">2x</span>
564
493
  <span class="cline-any cline-neutral">&nbsp;</span>
565
494
  <span class="cline-any cline-neutral">&nbsp;</span>
566
- <span class="cline-any cline-yes">32x</span>
567
- <span class="cline-any cline-yes">1x</span>
568
- <span class="cline-any cline-yes">1x</span>
569
- <span class="cline-any cline-neutral">&nbsp;</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-yes">32x</span>
572
- <span class="cline-any cline-yes">1x</span>
573
- <span class="cline-any cline-yes">1x</span>
574
- <span class="cline-any cline-yes">1x</span>
575
- <span class="cline-any cline-neutral">&nbsp;</span>
576
- <span class="cline-any cline-neutral">&nbsp;</span>
577
- <span class="cline-any cline-neutral">&nbsp;</span>
578
- <span class="cline-any cline-yes">1x</span>
579
- <span class="cline-any cline-neutral">&nbsp;</span>
580
- <span class="cline-any cline-neutral">&nbsp;</span>
581
- <span class="cline-any cline-neutral">&nbsp;</span>
582
- <span class="cline-any cline-yes">1x</span>
583
- <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-neutral">&nbsp;</span>
585
- <span class="cline-any cline-yes">32x</span>
586
- <span class="cline-any cline-yes">1x</span>
587
- <span class="cline-any cline-neutral">&nbsp;</span>
588
- <span class="cline-any cline-neutral">&nbsp;</span>
589
- <span class="cline-any cline-yes">32x</span>
590
- <span class="cline-any cline-yes">1x</span>
591
- <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-neutral">&nbsp;</span>
593
- <span class="cline-any cline-yes">32x</span>
594
- <span class="cline-any cline-yes">1x</span>
595
- <span class="cline-any cline-neutral">&nbsp;</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-yes">32x</span>
598
- <span class="cline-any cline-yes">1x</span>
599
- <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-neutral">&nbsp;</span>
601
495
  <span class="cline-any cline-neutral">&nbsp;</span>
602
496
  <span class="cline-any cline-neutral">&nbsp;</span>
603
497
  <span class="cline-any cline-neutral">&nbsp;</span>
604
498
  <span class="cline-any cline-neutral">&nbsp;</span>
605
499
  <span class="cline-any cline-neutral">&nbsp;</span>
606
500
  <span class="cline-any cline-neutral">&nbsp;</span>
501
+ <span class="cline-any cline-yes">2x</span>
607
502
  <span class="cline-any cline-neutral">&nbsp;</span>
608
503
  <span class="cline-any cline-neutral">&nbsp;</span>
609
504
  <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-neutral">&nbsp;</span>
611
- <span class="cline-any cline-yes">32x</span>
612
- <span class="cline-any cline-yes">1x</span>
613
- <span class="cline-any cline-yes">1x</span>
614
- <span class="cline-any cline-yes">1x</span>
615
- <span class="cline-any cline-neutral">&nbsp;</span>
616
- <span class="cline-any cline-neutral">&nbsp;</span>
617
- <span class="cline-any cline-neutral">&nbsp;</span>
618
- <span class="cline-any cline-yes">1x</span>
619
- <span class="cline-any cline-yes">1x</span>
620
- <span class="cline-any cline-neutral">&nbsp;</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-yes">2x</span>
506
+ <span class="cline-any cline-yes">2x</span>
623
507
  <span class="cline-any cline-neutral">&nbsp;</span>
624
508
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const CouchDB = require("../../db")
625
509
  const actions = require("../../automations/actions")
626
- const logic = require("../../automations/logic")
627
510
  const triggers = require("../../automations/triggers")
628
- const webhooks = require("./webhook")
629
511
  const { getAutomationParams, generateAutomationID } = require("../../db/utils")
630
- &nbsp;
631
- const WH_STEP_ID = triggers.BUILTIN_DEFINITIONS.WEBHOOK.stepId
632
- const CRON_STEP_ID = triggers.BUILTIN_DEFINITIONS.CRON.stepId
512
+ const {
513
+ checkForWebhooks,
514
+ updateTestHistory,
515
+ } = require("../../automations/utils")
516
+ const { deleteEntityMetadata } = require("../../utilities")
517
+ const { MetadataTypes } = require("../../constants")
518
+ const { setTestFlag, clearTestFlag } = require("../../utilities/redis")
633
519
  &nbsp;
634
520
  /*************************
635
521
  * *
@@ -637,6 +523,19 @@ const CRON_STEP_ID = triggers.BUILTIN_DEFINITIONS.CRON.stepId
637
523
  * *
638
524
  *************************/
639
525
  &nbsp;
526
+ async function cleanupAutomationMetadata(appId, automationId) {
527
+ await deleteEntityMetadata(
528
+ appId,
529
+ MetadataTypes.AUTOMATION_TEST_INPUT,
530
+ automationId
531
+ )
532
+ await deleteEntityMetadata(
533
+ appId,
534
+ MetadataTypes.AUTOMATION_TEST_HISTORY,
535
+ automationId
536
+ )
537
+ }
538
+ &nbsp;
640
539
  function cleanAutomationInputs(automation) {
641
540
  <span class="missing-if-branch" title="if path not taken" >I</span>if (automation == null) {
642
541
  <span class="cstat-no" title="statement not covered" > return automation</span>
@@ -644,6 +543,10 @@ function cleanAutomationInputs(automation) {
644
543
  let steps = automation.definition.steps
645
544
  let trigger = automation.definition.trigger
646
545
  let allSteps = [...steps, trigger]
546
+ // live is not a property used anymore
547
+ if (automation.live != null) {
548
+ delete automation.live
549
+ }
647
550
  for (let step of allSteps) {
648
551
  <span class="missing-if-branch" title="if path not taken" >I</span>if (step == null) {
649
552
  <span class="cstat-no" title="statement not covered" > continue</span>
@@ -657,119 +560,6 @@ function cleanAutomationInputs(automation) {
657
560
  return automation
658
561
  }
659
562
  &nbsp;
660
- /**
661
- * This function handles checking of any cron jobs need to be created or deleted for automations.
662
- * @param {string} appId The ID of the app in which we are checking for webhooks
663
- * @param {object|undefined} oldAuto The old automation object if updating/deleting
664
- * @param {object|undefined} newAuto The new automation object if creating/updating
665
- */
666
- async function checkForCronTriggers({ appId, oldAuto, newAuto }) {
667
- const oldTrigger = oldAuto ? oldAuto.definition.trigger : null
668
- const newTrigger = newAuto ? newAuto.definition.trigger : null
669
- function isCronTrigger(auto) {
670
- return (
671
- auto &amp;&amp;
672
- auto.definition.trigger &amp;&amp;
673
- auto.definition.trigger.stepId === CRON_STEP_ID
674
- )
675
- }
676
- &nbsp;
677
- const isLive = auto =&gt; auto &amp;&amp; auto.live
678
- &nbsp;
679
- const cronTriggerRemoved =
680
- isCronTrigger(oldAuto) &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >!isCronTrigger(newAuto) </span>&amp;&amp; <span class="branch-2 cbranch-no" title="branch not covered" >oldTrigger.cronJobId</span>
681
- const cronTriggerDeactivated = !isLive(newAuto) &amp;&amp; isLive(oldAuto)
682
- &nbsp;
683
- const cronTriggerActivated = isLive(newAuto) &amp;&amp; !isLive(oldAuto)
684
- &nbsp;
685
- <span class="missing-if-branch" title="if path not taken" >I</span>if (cronTriggerRemoved || (cronTriggerDeactivated &amp;&amp; oldTrigger.cronJobId)) {
686
- <span class="cstat-no" title="statement not covered" > await triggers.automationQueue.removeRepeatableByKey(oldTrigger.cronJobId)</span>
687
- }
688
- // need to create cron job
689
- else <span class="missing-if-branch" title="if path not taken" >I</span>if (isCronTrigger(newAuto) &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >cronTriggerActivated)</span> {
690
- const job = <span class="cstat-no" title="statement not covered" >await triggers.automationQueue.add(</span>
691
- {
692
- automation: newAuto,
693
- event: { appId, timestamp: Date.now() },
694
- },
695
- { repeat: { cron: newTrigger.inputs.cron } }
696
- )
697
- // Assign cron job ID from bull so we can remove it later if the cron trigger is removed
698
- <span class="cstat-no" title="statement not covered" > newTrigger.cronJobId = job.id</span>
699
- }
700
- return newAuto
701
- }
702
- &nbsp;
703
- /**
704
- * This function handles checking if any webhooks need to be created or deleted for automations.
705
- * @param {string} appId The ID of the app in which we are checking for webhooks
706
- * @param {object|undefined} oldAuto The old automation object if updating/deleting
707
- * @param {object|undefined} newAuto The new automation object if creating/updating
708
- * @returns {Promise&lt;object|undefined&gt;} After this is complete the new automation object may have been updated and should be
709
- * written to DB (this does not write to DB as it would be wasteful to repeat).
710
- */
711
- async function checkForWebhooks({ appId, oldAuto, newAuto }) {
712
- const oldTrigger = oldAuto ? oldAuto.definition.trigger : null
713
- const newTrigger = newAuto ? newAuto.definition.trigger : null
714
- const triggerChanged =
715
- oldTrigger &amp;&amp; newTrigger &amp;&amp; oldTrigger.id !== newTrigger.id
716
- function isWebhookTrigger(auto) {
717
- return (
718
- auto &amp;&amp;
719
- auto.definition.trigger &amp;&amp;
720
- auto.definition.trigger.stepId === WH_STEP_ID
721
- )
722
- }
723
- // need to delete webhook
724
- if (
725
- isWebhookTrigger(oldAuto) &amp;&amp;
726
- (!isWebhookTrigger(newAuto) || <span class="branch-2 cbranch-no" title="branch not covered" >triggerChanged)</span> &amp;&amp;
727
- oldTrigger.webhookId
728
- ) {
729
- try {
730
- let db = new CouchDB(appId)
731
- // need to get the webhook to get the rev
732
- const webhook = await db.get(oldTrigger.webhookId)
733
- const ctx = {
734
- appId,
735
- params: { id: webhook._id, rev: webhook._rev },
736
- }
737
- // might be updating - reset the inputs to remove the URLs
738
- <span class="missing-if-branch" title="else path not taken" >E</span>if (newTrigger) {
739
- delete newTrigger.webhookId
740
- newTrigger.inputs = {}
741
- }
742
- await webhooks.destroy(ctx)
743
- } catch (err) {
744
- // don't worry about not being able to delete, if it doesn't exist all good
745
- }
746
- }
747
- // need to create webhook
748
- if (
749
- (!isWebhookTrigger(oldAuto) || triggerChanged) &amp;&amp;
750
- isWebhookTrigger(newAuto)
751
- ) {
752
- const ctx = {
753
- appId,
754
- request: {
755
- body: new webhooks.Webhook(
756
- "Automation webhook",
757
- webhooks.WebhookType.AUTOMATION,
758
- newAuto._id
759
- ),
760
- },
761
- }
762
- await webhooks.save(ctx)
763
- const id = ctx.body.webhook._id
764
- newTrigger.webhookId = id
765
- newTrigger.inputs = {
766
- schemaUrl: `api/webhooks/schema/${appId}/${id}`,
767
- triggerUrl: `api/webhooks/trigger/${appId}/${id}`,
768
- }
769
- }
770
- return newAuto
771
- }
772
- &nbsp;
773
563
  exports.create = async function (ctx) {
774
564
  const db = new CouchDB(ctx.appId)
775
565
  let automation = ctx.request.body
@@ -788,10 +578,6 @@ exports.create = async function (ctx) {
788
578
  appId: ctx.appId,
789
579
  newAuto: automation,
790
580
  })
791
- automation = await checkForCronTriggers({
792
- appId: ctx.appId,
793
- newAuto: automation,
794
- })
795
581
  const response = await db.put(automation)
796
582
  automation._rev = response.rev
797
583
  &nbsp;
@@ -816,13 +602,25 @@ exports.update = async function (ctx) {
816
602
  oldAuto: oldAutomation,
817
603
  newAuto: automation,
818
604
  })
819
- automation = await checkForCronTriggers({
820
- appId: ctx.appId,
821
- oldAuto: oldAutomation,
822
- newAuto: automation,
823
- })
824
605
  const response = await db.put(automation)
825
606
  automation._rev = response.rev
607
+ &nbsp;
608
+ const oldAutoTrigger =
609
+ oldAutomation &amp;&amp; oldAutomation.definition.trigger
610
+ ? oldAutomation.definition.trigger
611
+ : <span class="branch-1 cbranch-no" title="branch not covered" >{}</span>
612
+ const newAutoTrigger =
613
+ automation &amp;&amp; automation.definition.trigger
614
+ ? automation.definition.trigger
615
+ : <span class="branch-1 cbranch-no" title="branch not covered" >{}</span>
616
+ // trigger has been updated, remove the test inputs
617
+ if (oldAutoTrigger.id !== newAutoTrigger.id) {
618
+ await deleteEntityMetadata(
619
+ ctx.appId,
620
+ MetadataTypes.AUTOMATION_TEST_INPUT,
621
+ automation._id
622
+ )
623
+ }
826
624
  &nbsp;
827
625
  ctx.status = 200
828
626
  ctx.body = {
@@ -852,35 +650,29 @@ exports.find = async function (ctx) {
852
650
  &nbsp;
853
651
  exports.destroy = async function (ctx) {
854
652
  const db = new CouchDB(ctx.appId)
855
- const oldAutomation = await db.get(ctx.params.id)
653
+ const automationId = ctx.params.id
654
+ const oldAutomation = await db.get(automationId)
856
655
  await checkForWebhooks({
857
656
  appId: ctx.appId,
858
657
  oldAuto: oldAutomation,
859
658
  })
860
- await checkForCronTriggers({
861
- appId: ctx.appId,
862
- oldAuto: oldAutomation,
863
- })
864
- ctx.body = await db.remove(ctx.params.id, ctx.params.rev)
659
+ // delete metadata first
660
+ await cleanupAutomationMetadata(ctx.appId, automationId)
661
+ ctx.body = await db.remove(automationId, ctx.params.rev)
865
662
  }
866
663
  &nbsp;
867
664
  exports.getActionList = async function (ctx) {
868
- ctx.body = actions.DEFINITIONS
665
+ ctx.body = actions.ACTION_DEFINITIONS
869
666
  }
870
667
  &nbsp;
871
668
  exports.getTriggerList = async function (ctx) {
872
- ctx.body = triggers.BUILTIN_DEFINITIONS
873
- }
874
- &nbsp;
875
- exports.getLogicList = async function (ctx) {
876
- ctx.body = logic.BUILTIN_DEFINITIONS
669
+ ctx.body = triggers.TRIGGER_DEFINITIONS
877
670
  }
878
671
  &nbsp;
879
672
  module.exports.getDefinitionList = async function (ctx) {
880
673
  ctx.body = {
881
- logic: logic.BUILTIN_DEFINITIONS,
882
- trigger: triggers.BUILTIN_DEFINITIONS,
883
- action: actions.DEFINITIONS,
674
+ trigger: triggers.TRIGGER_DEFINITIONS,
675
+ action: actions.ACTION_DEFINITIONS,
884
676
  }
885
677
  }
886
678
  &nbsp;
@@ -890,19 +682,53 @@ module.exports.getDefinitionList = async function (ctx) {
890
682
  * *
891
683
  *********************/
892
684
  &nbsp;
893
- exports.trigger = async function (ctx) {
894
- const db = new CouchDB(ctx.appId)
895
- let automation = await db.get(ctx.params.id)
896
- await triggers.externalTrigger(automation, {
685
+ exports.trigger = <span class="fstat-no" title="function not covered" >as</span>ync function (ctx) {
686
+ const appId = <span class="cstat-no" title="statement not covered" >ctx.appId</span>
687
+ const db = <span class="cstat-no" title="statement not covered" >new CouchDB(appId)</span>
688
+ let automation = <span class="cstat-no" title="statement not covered" >await db.get(ctx.params.id)</span>
689
+ <span class="cstat-no" title="statement not covered" > await triggers.externalTrigger(automation, {</span>
897
690
  ...ctx.request.body,
898
- appId: ctx.appId,
691
+ appId,
899
692
  })
900
- ctx.status = 200
901
- ctx.body = {
693
+ <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
902
694
  message: `Automation ${automation._id} has been triggered.`,
903
695
  automation,
904
696
  }
905
697
  }
698
+ &nbsp;
699
+ function prepareTestInput(input) {
700
+ // prepare the test parameters
701
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (input.id &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >input.row)</span> {
702
+ <span class="cstat-no" title="statement not covered" > input.row._id = input.id</span>
703
+ }
704
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (input.revision &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >input.row)</span> {
705
+ <span class="cstat-no" title="statement not covered" > input.row._rev = input.revision</span>
706
+ }
707
+ return input
708
+ }
709
+ &nbsp;
710
+ exports.test = async function (ctx) {
711
+ const appId = ctx.appId
712
+ const db = new CouchDB(appId)
713
+ let automation = await db.get(ctx.params.id)
714
+ await setTestFlag(automation._id)
715
+ const testInput = prepareTestInput(ctx.request.body)
716
+ const response = await triggers.externalTrigger(
717
+ automation,
718
+ {
719
+ ...testInput,
720
+ appId,
721
+ },
722
+ { getResponses: true }
723
+ )
724
+ // save a test history run
725
+ await updateTestHistory(ctx.appId, automation, {
726
+ ...ctx.request.body,
727
+ occurredAt: new Date().getTime(),
728
+ })
729
+ await clearTestFlag(automation._id)
730
+ ctx.body = response
731
+ }
906
732
  &nbsp;</pre></td></tr></table></pre>
907
733
 
908
734
  <div class='push'></div><!-- for sticky footer -->
@@ -910,7 +736,7 @@ exports.trigger = async function (ctx) {
910
736
  <div class='footer quiet pad2 space-top1 center small'>
911
737
  Code coverage generated by
912
738
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
913
- at Tue Sep 21 2021 13:44:17 GMT+0000 (Coordinated Universal Time)
739
+ at Tue Sep 21 2021 20:54:54 GMT+0000 (Coordinated Universal Time)
914
740
  </div>
915
741
  </div>
916
742
  <script src="../../prettify.js"></script>