@budibase/server 1.1.31 → 1.1.32-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 (204) hide show
  1. package/builder/assets/index.55714cd6.js +977 -0
  2. package/builder/assets/{index.192adf4c.css → index.aa03d5f4.css} +2 -2
  3. package/builder/assets/{vendor.162098da.js → vendor.6bcafa60.js} +1 -1
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +380 -696
  6. package/coverage/coverage-final.json +13 -16
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/index.html +1 -1
  16. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/validation.js.html +2 -2
  23. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/index.html +18 -18
  27. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +94 -49
  29. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/webhook.js.html +15 -15
  45. package/coverage/lcov-report/api/index.html +1 -1
  46. package/coverage/lcov-report/api/index.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/index.html +1 -1
  58. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +2 -2
  73. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  75. package/coverage/lcov-report/automations/actions.js.html +1 -1
  76. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  77. package/coverage/lcov-report/automations/bullboard.js.html +17 -17
  78. package/coverage/lcov-report/automations/index.html +1 -1
  79. package/coverage/lcov-report/automations/index.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/executeQuery.js.html +5 -2
  84. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/index.html +1 -1
  87. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggers.js.html +18 -18
  106. package/coverage/lcov-report/constants/index.html +1 -1
  107. package/coverage/lcov-report/constants/index.js.html +5 -14
  108. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  109. package/coverage/lcov-report/constants/screens.js.html +1 -1
  110. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  111. package/coverage/lcov-report/db/index.html +19 -19
  112. package/coverage/lcov-report/db/index.js.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  117. package/coverage/lcov-report/db/newid.js.html +1 -1
  118. package/coverage/lcov-report/db/utils.js.html +61 -13
  119. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  120. package/coverage/lcov-report/events/index.html +1 -1
  121. package/coverage/lcov-report/events/index.js.html +1 -1
  122. package/coverage/lcov-report/events/utils.js.html +1 -1
  123. package/coverage/lcov-report/index.html +57 -72
  124. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  125. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  126. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  127. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  128. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  129. package/coverage/lcov-report/middleware/index.html +21 -21
  130. package/coverage/lcov-report/middleware/joi-validator.js.html +43 -43
  131. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  132. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  133. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  134. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  135. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  136. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  137. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  138. package/coverage/lcov-report/utilities/global.js.html +67 -13
  139. package/coverage/lcov-report/utilities/index.html +20 -20
  140. package/coverage/lcov-report/utilities/index.js.html +1 -1
  141. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +26 -14
  142. package/coverage/lcov-report/utilities/queue/index.html +17 -17
  143. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  144. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  146. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  148. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  149. package/coverage/lcov-report/utilities/security.js.html +2 -2
  150. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  151. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  152. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  153. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  154. package/coverage/lcov-report/utilities/users.js.html +1 -1
  155. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  156. package/coverage/lcov.info +690 -1214
  157. package/dist/api/controllers/deploy/index.js +1 -0
  158. package/dist/api/controllers/query/index.js +1 -1
  159. package/dist/api/controllers/query/validation.js +1 -1
  160. package/dist/api/controllers/row/internalSearch.js +30 -16
  161. package/dist/api/routes/utils/validators.js +1 -1
  162. package/dist/automations/utils.js +47 -1
  163. package/dist/constants/index.js +1 -4
  164. package/dist/db/utils.js +14 -1
  165. package/dist/definitions/automations.js +8 -0
  166. package/dist/integrations/base/sql.js +43 -14
  167. package/dist/package.json +8 -8
  168. package/dist/threads/automation.js +147 -54
  169. package/dist/threads/definitions.js +2 -0
  170. package/dist/threads/index.js +27 -20
  171. package/dist/threads/query.js +23 -15
  172. package/dist/threads/utils.js +47 -24
  173. package/dist/tsconfig.build.tsbuildinfo +1 -1
  174. package/dist/utilities/global.js +21 -4
  175. package/dist/utilities/queue/inMemoryQueue.js +5 -0
  176. package/package.json +9 -9
  177. package/src/api/controllers/deploy/index.ts +6 -1
  178. package/src/api/controllers/query/index.ts +1 -1
  179. package/src/api/controllers/query/validation.js +1 -1
  180. package/src/api/controllers/row/internalSearch.js +35 -20
  181. package/src/api/routes/tests/user.spec.js +2 -0
  182. package/src/api/routes/utils/validators.js +1 -1
  183. package/src/automations/steps/executeQuery.js +1 -0
  184. package/src/automations/tests/automation.spec.js +2 -2
  185. package/src/automations/utils.ts +54 -1
  186. package/src/constants/index.js +2 -5
  187. package/src/db/utils.js +16 -0
  188. package/src/definitions/automations.ts +49 -0
  189. package/src/definitions/datasource.ts +3 -0
  190. package/src/integrations/base/sql.ts +44 -13
  191. package/src/integrations/tests/sql.spec.js +50 -4
  192. package/src/middleware/tests/currentapp.spec.js +11 -0
  193. package/src/threads/{automation.js → automation.ts} +172 -48
  194. package/src/threads/definitions.ts +18 -0
  195. package/src/threads/index.ts +31 -23
  196. package/src/threads/{query.js → query.ts} +32 -12
  197. package/src/threads/{utils.js → utils.ts} +31 -12
  198. package/src/utilities/global.js +20 -2
  199. package/src/utilities/queue/inMemoryQueue.js +4 -0
  200. package/builder/assets/index.51767a56.js +0 -978
  201. package/coverage/lcov-report/threads/automation.js.html +0 -1114
  202. package/coverage/lcov-report/threads/index.html +0 -146
  203. package/coverage/lcov-report/threads/query.js.html +0 -916
  204. package/coverage/lcov-report/threads/utils.js.html +0 -319
@@ -1,1114 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for threads/automation.js</title>
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" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../index.html">All files</a> / <a href="index.html">threads</a> automation.js</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">47.2% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>76/161</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">25.33% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>19/75</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">58.33% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>7/12</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">46.87% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>75/160</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input oninput="onInput()" type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line low'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">3x</span>
410
- <span class="cline-any cline-yes">3x</span>
411
- <span class="cline-any cline-yes">3x</span>
412
- <span class="cline-any cline-yes">3x</span>
413
- <span class="cline-any cline-yes">3x</span>
414
- <span class="cline-any cline-yes">3x</span>
415
- <span class="cline-any cline-yes">3x</span>
416
- <span class="cline-any cline-yes">3x</span>
417
- <span class="cline-any cline-yes">3x</span>
418
- <span class="cline-any cline-yes">3x</span>
419
- <span class="cline-any cline-yes">3x</span>
420
- <span class="cline-any cline-yes">3x</span>
421
- <span class="cline-any cline-neutral">&nbsp;</span>
422
- <span class="cline-any cline-yes">3x</span>
423
- <span class="cline-any cline-yes">3x</span>
424
- <span class="cline-any cline-yes">3x</span>
425
- <span class="cline-any cline-yes">3x</span>
426
- <span class="cline-any cline-neutral">&nbsp;</span>
427
- <span class="cline-any cline-neutral">&nbsp;</span>
428
- <span class="cline-any cline-no">&nbsp;</span>
429
- <span class="cline-any cline-no">&nbsp;</span>
430
- <span class="cline-any cline-neutral">&nbsp;</span>
431
- <span class="cline-any cline-no">&nbsp;</span>
432
- <span class="cline-any cline-no">&nbsp;</span>
433
- <span class="cline-any cline-no">&nbsp;</span>
434
- <span class="cline-any cline-no">&nbsp;</span>
435
- <span class="cline-any cline-neutral">&nbsp;</span>
436
- <span class="cline-any cline-no">&nbsp;</span>
437
- <span class="cline-any cline-no">&nbsp;</span>
438
- <span class="cline-any cline-neutral">&nbsp;</span>
439
- <span class="cline-any cline-no">&nbsp;</span>
440
- <span class="cline-any cline-neutral">&nbsp;</span>
441
- <span class="cline-any cline-no">&nbsp;</span>
442
- <span class="cline-any cline-no">&nbsp;</span>
443
- <span class="cline-any cline-neutral">&nbsp;</span>
444
- <span class="cline-any cline-no">&nbsp;</span>
445
- <span class="cline-any cline-neutral">&nbsp;</span>
446
- <span class="cline-any cline-neutral">&nbsp;</span>
447
- <span class="cline-any cline-no">&nbsp;</span>
448
- <span class="cline-any cline-neutral">&nbsp;</span>
449
- <span class="cline-any cline-no">&nbsp;</span>
450
- <span class="cline-any cline-neutral">&nbsp;</span>
451
- <span class="cline-any cline-neutral">&nbsp;</span>
452
- <span class="cline-any cline-neutral">&nbsp;</span>
453
- <span class="cline-any cline-no">&nbsp;</span>
454
- <span class="cline-any cline-no">&nbsp;</span>
455
- <span class="cline-any cline-no">&nbsp;</span>
456
- <span class="cline-any cline-neutral">&nbsp;</span>
457
- <span class="cline-any cline-no">&nbsp;</span>
458
- <span class="cline-any cline-neutral">&nbsp;</span>
459
- <span class="cline-any cline-neutral">&nbsp;</span>
460
- <span class="cline-any cline-neutral">&nbsp;</span>
461
- <span class="cline-any cline-neutral">&nbsp;</span>
462
- <span class="cline-any cline-neutral">&nbsp;</span>
463
- <span class="cline-any cline-neutral">&nbsp;</span>
464
- <span class="cline-any cline-neutral">&nbsp;</span>
465
- <span class="cline-any cline-neutral">&nbsp;</span>
466
- <span class="cline-any cline-neutral">&nbsp;</span>
467
- <span class="cline-any cline-neutral">&nbsp;</span>
468
- <span class="cline-any cline-neutral">&nbsp;</span>
469
- <span class="cline-any cline-yes">6x</span>
470
- <span class="cline-any cline-yes">6x</span>
471
- <span class="cline-any cline-yes">6x</span>
472
- <span class="cline-any cline-yes">6x</span>
473
- <span class="cline-any cline-yes">6x</span>
474
- <span class="cline-any cline-yes">6x</span>
475
- <span class="cline-any cline-neutral">&nbsp;</span>
476
- <span class="cline-any cline-yes">6x</span>
477
- <span class="cline-any cline-yes">6x</span>
478
- <span class="cline-any cline-neutral">&nbsp;</span>
479
- <span class="cline-any cline-yes">6x</span>
480
- <span class="cline-any cline-yes">6x</span>
481
- <span class="cline-any cline-neutral">&nbsp;</span>
482
- <span class="cline-any cline-neutral">&nbsp;</span>
483
- <span class="cline-any cline-yes">6x</span>
484
- <span class="cline-any cline-yes">6x</span>
485
- <span class="cline-any cline-neutral">&nbsp;</span>
486
- <span class="cline-any cline-yes">6x</span>
487
- <span class="cline-any cline-yes">6x</span>
488
- <span class="cline-any cline-neutral">&nbsp;</span>
489
- <span class="cline-any cline-neutral">&nbsp;</span>
490
- <span class="cline-any cline-neutral">&nbsp;</span>
491
- <span class="cline-any cline-yes">6x</span>
492
- <span class="cline-any cline-no">&nbsp;</span>
493
- <span class="cline-any cline-neutral">&nbsp;</span>
494
- <span class="cline-any cline-yes">6x</span>
495
- <span class="cline-any cline-neutral">&nbsp;</span>
496
- <span class="cline-any cline-neutral">&nbsp;</span>
497
- <span class="cline-any cline-neutral">&nbsp;</span>
498
- <span class="cline-any cline-yes">5x</span>
499
- <span class="cline-any cline-yes">5x</span>
500
- <span class="cline-any cline-no">&nbsp;</span>
501
- <span class="cline-any cline-neutral">&nbsp;</span>
502
- <span class="cline-any cline-yes">5x</span>
503
- <span class="cline-any cline-neutral">&nbsp;</span>
504
- <span class="cline-any cline-neutral">&nbsp;</span>
505
- <span class="cline-any cline-neutral">&nbsp;</span>
506
- <span class="cline-any cline-no">&nbsp;</span>
507
- <span class="cline-any cline-no">&nbsp;</span>
508
- <span class="cline-any cline-neutral">&nbsp;</span>
509
- <span class="cline-any cline-no">&nbsp;</span>
510
- <span class="cline-any cline-no">&nbsp;</span>
511
- <span class="cline-any cline-no">&nbsp;</span>
512
- <span class="cline-any cline-neutral">&nbsp;</span>
513
- <span class="cline-any cline-neutral">&nbsp;</span>
514
- <span class="cline-any cline-neutral">&nbsp;</span>
515
- <span class="cline-any cline-yes">11x</span>
516
- <span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-yes">11x</span>
518
- <span class="cline-any cline-yes">6x</span>
519
- <span class="cline-any cline-neutral">&nbsp;</span>
520
- <span class="cline-any cline-yes">11x</span>
521
- <span class="cline-any cline-neutral">&nbsp;</span>
522
- <span class="cline-any cline-neutral">&nbsp;</span>
523
- <span class="cline-any cline-neutral">&nbsp;</span>
524
- <span class="cline-any cline-no">&nbsp;</span>
525
- <span class="cline-any cline-neutral">&nbsp;</span>
526
- <span class="cline-any cline-neutral">&nbsp;</span>
527
- <span class="cline-any cline-neutral">&nbsp;</span>
528
- <span class="cline-any cline-neutral">&nbsp;</span>
529
- <span class="cline-any cline-neutral">&nbsp;</span>
530
- <span class="cline-any cline-neutral">&nbsp;</span>
531
- <span class="cline-any cline-neutral">&nbsp;</span>
532
- <span class="cline-any cline-neutral">&nbsp;</span>
533
- <span class="cline-any cline-neutral">&nbsp;</span>
534
- <span class="cline-any cline-no">&nbsp;</span>
535
- <span class="cline-any cline-neutral">&nbsp;</span>
536
- <span class="cline-any cline-neutral">&nbsp;</span>
537
- <span class="cline-any cline-neutral">&nbsp;</span>
538
- <span class="cline-any cline-neutral">&nbsp;</span>
539
- <span class="cline-any cline-neutral">&nbsp;</span>
540
- <span class="cline-any cline-neutral">&nbsp;</span>
541
- <span class="cline-any cline-neutral">&nbsp;</span>
542
- <span class="cline-any cline-yes">6x</span>
543
- <span class="cline-any cline-yes">6x</span>
544
- <span class="cline-any cline-yes">6x</span>
545
- <span class="cline-any cline-neutral">&nbsp;</span>
546
- <span class="cline-any cline-yes">6x</span>
547
- <span class="cline-any cline-yes">6x</span>
548
- <span class="cline-any cline-yes">6x</span>
549
- <span class="cline-any cline-yes">6x</span>
550
- <span class="cline-any cline-yes">5x</span>
551
- <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-yes">5x</span>
553
- <span class="cline-any cline-yes">5x</span>
554
- <span class="cline-any cline-yes">5x</span>
555
- <span class="cline-any cline-no">&nbsp;</span>
556
- <span class="cline-any cline-no">&nbsp;</span>
557
- <span class="cline-any cline-no">&nbsp;</span>
558
- <span class="cline-any cline-neutral">&nbsp;</span>
559
- <span class="cline-any cline-neutral">&nbsp;</span>
560
- <span class="cline-any cline-yes">5x</span>
561
- <span class="cline-any cline-no">&nbsp;</span>
562
- <span class="cline-any cline-no">&nbsp;</span>
563
- <span class="cline-any cline-neutral">&nbsp;</span>
564
- <span class="cline-any cline-neutral">&nbsp;</span>
565
- <span class="cline-any cline-yes">5x</span>
566
- <span class="cline-any cline-yes">5x</span>
567
- <span class="cline-any cline-neutral">&nbsp;</span>
568
- <span class="cline-any cline-neutral">&nbsp;</span>
569
- <span class="cline-any cline-yes">5x</span>
570
- <span class="cline-any cline-no">&nbsp;</span>
571
- <span class="cline-any cline-neutral">&nbsp;</span>
572
- <span class="cline-any cline-neutral">&nbsp;</span>
573
- <span class="cline-any cline-neutral">&nbsp;</span>
574
- <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-no">&nbsp;</span>
576
- <span class="cline-any cline-no">&nbsp;</span>
577
- <span class="cline-any cline-no">&nbsp;</span>
578
- <span class="cline-any cline-neutral">&nbsp;</span>
579
- <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
583
- <span class="cline-any cline-no">&nbsp;</span>
584
- <span class="cline-any cline-no">&nbsp;</span>
585
- <span class="cline-any cline-no">&nbsp;</span>
586
- <span class="cline-any cline-neutral">&nbsp;</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-no">&nbsp;</span>
590
- <span class="cline-any cline-neutral">&nbsp;</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-no">&nbsp;</span>
594
- <span class="cline-any cline-neutral">&nbsp;</span>
595
- <span class="cline-any cline-no">&nbsp;</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-no">&nbsp;</span>
599
- <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-neutral">&nbsp;</span>
601
- <span class="cline-any cline-neutral">&nbsp;</span>
602
- <span class="cline-any cline-neutral">&nbsp;</span>
603
- <span class="cline-any cline-neutral">&nbsp;</span>
604
- <span class="cline-any cline-no">&nbsp;</span>
605
- <span class="cline-any cline-no">&nbsp;</span>
606
- <span class="cline-any cline-no">&nbsp;</span>
607
- <span class="cline-any cline-neutral">&nbsp;</span>
608
- <span class="cline-any cline-neutral">&nbsp;</span>
609
- <span class="cline-any cline-no">&nbsp;</span>
610
- <span class="cline-any cline-no">&nbsp;</span>
611
- <span class="cline-any cline-neutral">&nbsp;</span>
612
- <span class="cline-any cline-neutral">&nbsp;</span>
613
- <span class="cline-any cline-neutral">&nbsp;</span>
614
- <span class="cline-any cline-neutral">&nbsp;</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-no">&nbsp;</span>
619
- <span class="cline-any cline-no">&nbsp;</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>
623
- <span class="cline-any cline-neutral">&nbsp;</span>
624
- <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-no">&nbsp;</span>
627
- <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-neutral">&nbsp;</span>
629
- <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-no">&nbsp;</span>
631
- <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-no">&nbsp;</span>
635
- <span class="cline-any cline-no">&nbsp;</span>
636
- <span class="cline-any cline-no">&nbsp;</span>
637
- <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-no">&nbsp;</span>
640
- <span class="cline-any cline-no">&nbsp;</span>
641
- <span class="cline-any cline-no">&nbsp;</span>
642
- <span class="cline-any cline-no">&nbsp;</span>
643
- <span class="cline-any cline-no">&nbsp;</span>
644
- <span class="cline-any cline-neutral">&nbsp;</span>
645
- <span class="cline-any cline-neutral">&nbsp;</span>
646
- <span class="cline-any cline-no">&nbsp;</span>
647
- <span class="cline-any cline-neutral">&nbsp;</span>
648
- <span class="cline-any cline-neutral">&nbsp;</span>
649
- <span class="cline-any cline-no">&nbsp;</span>
650
- <span class="cline-any cline-no">&nbsp;</span>
651
- <span class="cline-any cline-neutral">&nbsp;</span>
652
- <span class="cline-any cline-neutral">&nbsp;</span>
653
- <span class="cline-any cline-neutral">&nbsp;</span>
654
- <span class="cline-any cline-no">&nbsp;</span>
655
- <span class="cline-any cline-no">&nbsp;</span>
656
- <span class="cline-any cline-no">&nbsp;</span>
657
- <span class="cline-any cline-neutral">&nbsp;</span>
658
- <span class="cline-any cline-neutral">&nbsp;</span>
659
- <span class="cline-any cline-neutral">&nbsp;</span>
660
- <span class="cline-any cline-neutral">&nbsp;</span>
661
- <span class="cline-any cline-yes">5x</span>
662
- <span class="cline-any cline-no">&nbsp;</span>
663
- <span class="cline-any cline-no">&nbsp;</span>
664
- <span class="cline-any cline-neutral">&nbsp;</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-neutral">&nbsp;</span>
667
- <span class="cline-any cline-yes">5x</span>
668
- <span class="cline-any cline-yes">5x</span>
669
- <span class="cline-any cline-yes">5x</span>
670
- <span class="cline-any cline-yes">5x</span>
671
- <span class="cline-any cline-neutral">&nbsp;</span>
672
- <span class="cline-any cline-yes">5x</span>
673
- <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-neutral">&nbsp;</span>
675
- <span class="cline-any cline-neutral">&nbsp;</span>
676
- <span class="cline-any cline-neutral">&nbsp;</span>
677
- <span class="cline-any cline-neutral">&nbsp;</span>
678
- <span class="cline-any cline-yes">5x</span>
679
- <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-neutral">&nbsp;</span>
681
- <span class="cline-any cline-yes">5x</span>
682
- <span class="cline-any cline-no">&nbsp;</span>
683
- <span class="cline-any cline-no">&nbsp;</span>
684
- <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-neutral">&nbsp;</span>
687
- <span class="cline-any cline-no">&nbsp;</span>
688
- <span class="cline-any cline-neutral">&nbsp;</span>
689
- <span class="cline-any cline-yes">5x</span>
690
- <span class="cline-any cline-no">&nbsp;</span>
691
- <span class="cline-any cline-neutral">&nbsp;</span>
692
- <span class="cline-any cline-yes">5x</span>
693
- <span class="cline-any cline-neutral">&nbsp;</span>
694
- <span class="cline-any cline-neutral">&nbsp;</span>
695
- <span class="cline-any cline-neutral">&nbsp;</span>
696
- <span class="cline-any cline-neutral">&nbsp;</span>
697
- <span class="cline-any cline-neutral">&nbsp;</span>
698
- <span class="cline-any cline-neutral">&nbsp;</span>
699
- <span class="cline-any cline-neutral">&nbsp;</span>
700
- <span class="cline-any cline-no">&nbsp;</span>
701
- <span class="cline-any cline-no">&nbsp;</span>
702
- <span class="cline-any cline-neutral">&nbsp;</span>
703
- <span class="cline-any cline-yes">5x</span>
704
- <span class="cline-any cline-no">&nbsp;</span>
705
- <span class="cline-any cline-no">&nbsp;</span>
706
- <span class="cline-any cline-no">&nbsp;</span>
707
- <span class="cline-any cline-no">&nbsp;</span>
708
- <span class="cline-any cline-no">&nbsp;</span>
709
- <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-neutral">&nbsp;</span>
711
- <span class="cline-any cline-neutral">&nbsp;</span>
712
- <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-yes">5x</span>
714
- <span class="cline-any cline-no">&nbsp;</span>
715
- <span class="cline-any cline-neutral">&nbsp;</span>
716
- <span class="cline-any cline-neutral">&nbsp;</span>
717
- <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-neutral">&nbsp;</span>
719
- <span class="cline-any cline-no">&nbsp;</span>
720
- <span class="cline-any cline-neutral">&nbsp;</span>
721
- <span class="cline-any cline-neutral">&nbsp;</span>
722
- <span class="cline-any cline-neutral">&nbsp;</span>
723
- <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-neutral">&nbsp;</span>
725
- <span class="cline-any cline-neutral">&nbsp;</span>
726
- <span class="cline-any cline-no">&nbsp;</span>
727
- <span class="cline-any cline-no">&nbsp;</span>
728
- <span class="cline-any cline-neutral">&nbsp;</span>
729
- <span class="cline-any cline-neutral">&nbsp;</span>
730
- <span class="cline-any cline-neutral">&nbsp;</span>
731
- <span class="cline-any cline-neutral">&nbsp;</span>
732
- <span class="cline-any cline-yes">6x</span>
733
- <span class="cline-any cline-yes">6x</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-neutral">&nbsp;</span>
737
- <span class="cline-any cline-yes">3x</span>
738
- <span class="cline-any cline-yes">6x</span>
739
- <span class="cline-any cline-yes">6x</span>
740
- <span class="cline-any cline-yes">6x</span>
741
- <span class="cline-any cline-neutral">&nbsp;</span>
742
- <span class="cline-any cline-neutral">&nbsp;</span>
743
- <span class="cline-any cline-neutral">&nbsp;</span>
744
- <span class="cline-any cline-yes">6x</span>
745
- <span class="cline-any cline-yes">6x</span>
746
- <span class="cline-any cline-yes">6x</span>
747
- <span class="cline-any cline-neutral">&nbsp;</span>
748
- <span class="cline-any cline-no">&nbsp;</span>
749
- <span class="cline-any cline-neutral">&nbsp;</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-neutral">&nbsp;</span>
752
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">require("./utils").threadSetup()
753
- const actions = require("../automations/actions")
754
- const automationUtils = require("../automations/automationUtils")
755
- const AutomationEmitter = require("../events/AutomationEmitter")
756
- const { processObject } = require("@budibase/string-templates")
757
- const { DocumentTypes } = require("../db/utils")
758
- const { definitions: triggerDefs } = require("../automations/triggerInfo")
759
- const { doInAppContext, getAppDB } = require("@budibase/backend-core/context")
760
- const { AutomationErrors, LoopStepTypes } = require("../constants")
761
- const { storeLog } = require("../automations/logging")
762
- const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId
763
- const LOOP_STEP_ID = actions.ACTION_DEFINITIONS.LOOP.stepId
764
- &nbsp;
765
- const CRON_STEP_ID = triggerDefs.CRON.stepId
766
- const STOPPED_STATUS = { success: true, status: "STOPPED" }
767
- const { cloneDeep } = require("lodash/fp")
768
- const env = require("../environment")
769
- &nbsp;
770
- function <span class="fstat-no" title="function not covered" >typecastForLooping(</span>loopStep, input) {
771
- <span class="cstat-no" title="statement not covered" > if (!input || !input.binding) {</span>
772
- <span class="cstat-no" title="statement not covered" > return null</span>
773
- }
774
- const isArray = <span class="cstat-no" title="statement not covered" >Array.isArray(input.binding),</span>
775
- isString = <span class="cstat-no" title="statement not covered" >typeof input.binding === "string"</span>
776
- <span class="cstat-no" title="statement not covered" > try {</span>
777
- <span class="cstat-no" title="statement not covered" > switch (loopStep.inputs.option) {</span>
778
- case LoopStepTypes.ARRAY:
779
- <span class="cstat-no" title="statement not covered" > if (isString) {</span>
780
- <span class="cstat-no" title="statement not covered" > return JSON.parse(input.binding)</span>
781
- }
782
- <span class="cstat-no" title="statement not covered" > break</span>
783
- case LoopStepTypes.STRING:
784
- <span class="cstat-no" title="statement not covered" > if (isArray) {</span>
785
- <span class="cstat-no" title="statement not covered" > return input.binding.join(",")</span>
786
- }
787
- <span class="cstat-no" title="statement not covered" > break</span>
788
- }
789
- } catch (err) {
790
- <span class="cstat-no" title="statement not covered" > throw new Error("Unable to cast to correct type")</span>
791
- }
792
- <span class="cstat-no" title="statement not covered" > return input.binding</span>
793
- }
794
- &nbsp;
795
- function <span class="fstat-no" title="function not covered" >getLoopIterations(</span>loopStep, input) {
796
- const binding = <span class="cstat-no" title="statement not covered" >typecastForLooping(loopStep, input)</span>
797
- <span class="cstat-no" title="statement not covered" > if (!loopStep || !binding) {</span>
798
- <span class="cstat-no" title="statement not covered" > return 1</span>
799
- }
800
- <span class="cstat-no" title="statement not covered" > return Array.isArray(binding)</span>
801
- ? binding.length
802
- : automationUtils.stringSplit(binding).length
803
- }
804
- &nbsp;
805
- /**
806
- * The automation orchestrator is a class responsible for executing automations.
807
- * It handles the context of the automation and makes sure each step gets the correct
808
- * inputs and handles any outputs.
809
- */
810
- class Orchestrator {
811
- constructor(automation, triggerOutput = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
812
- this._metadata = triggerOutput.metadata
813
- this._chainCount = this._metadata ? this._metadata.automationChainCount : 0
814
- this._appId = triggerOutput.appId
815
- this._app = null
816
- const triggerStepId = automation.definition.trigger.stepId
817
- triggerOutput = this.cleanupTriggerOutputs(triggerStepId, triggerOutput)
818
- // remove from context
819
- delete triggerOutput.appId
820
- delete triggerOutput.metadata
821
- // step zero is never used as the template string is zero indexed for customer facing
822
- this._context = { steps: [{}], trigger: triggerOutput }
823
- this._automation = automation
824
- // create an emitter which has the chain count for this automation run in it, so it can block
825
- // excessive chaining if required
826
- this._emitter = new AutomationEmitter(this._chainCount + 1)
827
- this.executionOutput = { trigger: {}, steps: [] }
828
- // setup the execution output
829
- const triggerId = automation.definition.trigger.id
830
- this.updateExecutionOutput(triggerId, triggerStepId, null, triggerOutput)
831
- }
832
- &nbsp;
833
- cleanupTriggerOutputs(stepId, triggerOutput) {
834
- <span class="missing-if-branch" title="if path not taken" >I</span>if (stepId === CRON_STEP_ID) {
835
- <span class="cstat-no" title="statement not covered" > triggerOutput.timestamp = Date.now()</span>
836
- }
837
- return triggerOutput
838
- }
839
- &nbsp;
840
- async getStepFunctionality(stepId) {
841
- let step = await actions.getAction(stepId)
842
- <span class="missing-if-branch" title="if path not taken" >I</span>if (step == null) {
843
- <span class="cstat-no" title="statement not covered" > throw `Cannot find automation step by name ${stepId}`</span>
844
- }
845
- return step
846
- }
847
- &nbsp;
848
- <span class="fstat-no" title="function not covered" > as</span>ync getApp() {
849
- <span class="cstat-no" title="statement not covered" > if (this._app) {</span>
850
- <span class="cstat-no" title="statement not covered" > return this._app</span>
851
- }
852
- const db = <span class="cstat-no" title="statement not covered" >getAppDB()</span>
853
- <span class="cstat-no" title="statement not covered" > this._app = await db.get(DocumentTypes.APP_METADATA)</span>
854
- <span class="cstat-no" title="statement not covered" > return this._app</span>
855
- }
856
- &nbsp;
857
- updateExecutionOutput(id, stepId, inputs, outputs) {
858
- const stepObj = { id, stepId, inputs, outputs }
859
- // first entry is always the trigger (constructor)
860
- if (this.executionOutput.steps.length === 0) {
861
- this.executionOutput.trigger = stepObj
862
- }
863
- this.executionOutput.steps.push(stepObj)
864
- }
865
- &nbsp;
866
- <span class="fstat-no" title="function not covered" > up</span>dateContextAndOutput(loopStepNumber, step, output, result) {
867
- <span class="cstat-no" title="statement not covered" > this.executionOutput.steps.splice(loopStepNumber, 0, {</span>
868
- id: step.id,
869
- stepId: step.stepId,
870
- outputs: {
871
- ...output,
872
- success: result.success,
873
- status: result.status,
874
- },
875
- inputs: step.inputs,
876
- })
877
- <span class="cstat-no" title="statement not covered" > this._context.steps.splice(loopStepNumber, 0, {</span>
878
- ...output,
879
- success: result.success,
880
- status: result.status,
881
- })
882
- }
883
- &nbsp;
884
- async execute() {
885
- let automation = this._automation
886
- let stopped = false
887
- let loopStep = null
888
- &nbsp;
889
- let stepCount = 0
890
- let loopStepNumber = null
891
- let loopSteps = []
892
- for (let step of automation.definition.steps) {
893
- stepCount++
894
- let input,
895
- iterations = 1,
896
- iterationCount = 0
897
- <span class="missing-if-branch" title="if path not taken" >I</span>if (step.stepId === LOOP_STEP_ID) {
898
- <span class="cstat-no" title="statement not covered" > loopStep = step</span>
899
- <span class="cstat-no" title="statement not covered" > loopStepNumber = stepCount</span>
900
- <span class="cstat-no" title="statement not covered" > continue</span>
901
- }
902
- &nbsp;
903
- <span class="missing-if-branch" title="if path not taken" >I</span>if (loopStep) {
904
- <span class="cstat-no" title="statement not covered" > input = await processObject(loopStep.inputs, this._context)</span>
905
- <span class="cstat-no" title="statement not covered" > iterations = getLoopIterations(loopStep, input)</span>
906
- }
907
- &nbsp;
908
- for (let index = 0; index &lt; iterations; index++) {
909
- let originalStepInput = cloneDeep(step.inputs)
910
- &nbsp;
911
- // Handle if the user has set a max iteration count or if it reaches the max limit set by us
912
- <span class="missing-if-branch" title="if path not taken" >I</span>if (loopStep &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >input.binding)</span> {
913
- let newInput = <span class="cstat-no" title="statement not covered" >await processObject(</span>
914
- loopStep.inputs,
915
- cloneDeep(this._context)
916
- )
917
- &nbsp;
918
- let tempOutput = <span class="cstat-no" title="statement not covered" >{ items: loopSteps, iterations: iterationCount }</span>
919
- <span class="cstat-no" title="statement not covered" > try {</span>
920
- <span class="cstat-no" title="statement not covered" > newInput.binding = typecastForLooping(loopStep, newInput)</span>
921
- } catch (err) {
922
- <span class="cstat-no" title="statement not covered" > this.updateContextAndOutput(loopStepNumber, step, tempOutput, {</span>
923
- status: AutomationErrors.INCORRECT_TYPE,
924
- success: false,
925
- })
926
- <span class="cstat-no" title="statement not covered" > loopSteps = null</span>
927
- <span class="cstat-no" title="statement not covered" > loopStep = null</span>
928
- <span class="cstat-no" title="statement not covered" > break</span>
929
- }
930
- &nbsp;
931
- let item
932
- <span class="cstat-no" title="statement not covered" > if (</span>
933
- typeof loopStep.inputs.binding === "string" &amp;&amp;
934
- loopStep.inputs.option === "String"
935
- ) {
936
- <span class="cstat-no" title="statement not covered" > item = automationUtils.stringSplit(newInput.binding)</span>
937
- } else {
938
- <span class="cstat-no" title="statement not covered" > item = loopStep.inputs.binding</span>
939
- }
940
- &nbsp;
941
- <span class="cstat-no" title="statement not covered" > this._context.steps[loopStepNumber] = {</span>
942
- currentItem: item[index],
943
- }
944
- &nbsp;
945
- // The "Loop" binding in the front end is "fake", so replace it here so the context can understand it
946
- // Pretty hacky because we need to account for the row object
947
- <span class="cstat-no" title="statement not covered" > for (let [key, value] of Object.entries(originalStepInput)) {</span>
948
- <span class="cstat-no" title="statement not covered" > if (typeof value === "object") {</span>
949
- <span class="cstat-no" title="statement not covered" > for (let [innerKey, innerValue] of Object.entries(</span>
950
- originalStepInput[key]
951
- )) {
952
- <span class="cstat-no" title="statement not covered" > if (typeof innerValue === "string") {</span>
953
- <span class="cstat-no" title="statement not covered" > originalStepInput[key][innerKey] =</span>
954
- automationUtils.substituteLoopStep(
955
- innerValue,
956
- `steps.${loopStepNumber}`
957
- )
958
- }
959
- }
960
- } else {
961
- <span class="cstat-no" title="statement not covered" > if (typeof value === "string") {</span>
962
- <span class="cstat-no" title="statement not covered" > originalStepInput[key] = automationUtils.substituteLoopStep(</span>
963
- value,
964
- `steps.${loopStepNumber}`
965
- )
966
- }
967
- }
968
- }
969
- <span class="cstat-no" title="statement not covered" > if (</span>
970
- index === env.AUTOMATION_MAX_ITERATION ||
971
- index === parseInt(loopStep.inputs.iterations)
972
- ) {
973
- <span class="cstat-no" title="statement not covered" > this.updateContextAndOutput(loopStepNumber, step, tempOutput, {</span>
974
- status: AutomationErrors.MAX_ITERATIONS,
975
- success: true,
976
- })
977
- <span class="cstat-no" title="statement not covered" > loopSteps = null</span>
978
- <span class="cstat-no" title="statement not covered" > loopStep = null</span>
979
- <span class="cstat-no" title="statement not covered" > break</span>
980
- }
981
- &nbsp;
982
- let isFailure = <span class="cstat-no" title="statement not covered" >false</span>
983
- const currentItem = <span class="cstat-no" title="statement not covered" >this._context.steps[loopStepNumber]?.currentItem</span>
984
- <span class="cstat-no" title="statement not covered" > if (currentItem &amp;&amp; typeof currentItem === "object") {</span>
985
- <span class="cstat-no" title="statement not covered" > isFailure = Object.keys(currentItem).some(<span class="fstat-no" title="function not covered" >va</span>lue =&gt; {</span>
986
- <span class="cstat-no" title="statement not covered" > return currentItem[value] === loopStep.inputs.failure</span>
987
- })
988
- } else {
989
- <span class="cstat-no" title="statement not covered" > isFailure = currentItem &amp;&amp; currentItem === loopStep.inputs.failure</span>
990
- }
991
- &nbsp;
992
- <span class="cstat-no" title="statement not covered" > if (isFailure) {</span>
993
- <span class="cstat-no" title="statement not covered" > this.updateContextAndOutput(loopStepNumber, step, tempOutput, {</span>
994
- status: AutomationErrors.FAILURE_CONDITION,
995
- success: false,
996
- })
997
- <span class="cstat-no" title="statement not covered" > loopSteps = null</span>
998
- <span class="cstat-no" title="statement not covered" > loopStep = null</span>
999
- <span class="cstat-no" title="statement not covered" > break</span>
1000
- }
1001
- }
1002
- &nbsp;
1003
- // execution stopped, record state for that
1004
- <span class="missing-if-branch" title="if path not taken" >I</span>if (stopped) {
1005
- <span class="cstat-no" title="statement not covered" > this.updateExecutionOutput(step.id, step.stepId, {}, STOPPED_STATUS)</span>
1006
- <span class="cstat-no" title="statement not covered" > continue</span>
1007
- }
1008
- &nbsp;
1009
- // If it's a loop step, we need to manually add the bindings to the context
1010
- let stepFn = await this.getStepFunctionality(step.stepId)
1011
- let inputs = await processObject(originalStepInput, this._context)
1012
- inputs = automationUtils.cleanInputValues(inputs, step.schema.inputs)
1013
- try {
1014
- // appId is always passed
1015
- const outputs = await stepFn({
1016
- inputs: inputs,
1017
- appId: this._appId,
1018
- emitter: this._emitter,
1019
- context: this._context,
1020
- })
1021
- this._context.steps[stepCount] = outputs
1022
- // if filter causes us to stop execution don't break the loop, set a var
1023
- // so that we can finish iterating through the steps and record that it stopped
1024
- <span class="missing-if-branch" title="if path not taken" >I</span>if (step.stepId === FILTER_STEP_ID &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >!outputs.result)</span> {
1025
- <span class="cstat-no" title="statement not covered" > stopped = true</span>
1026
- <span class="cstat-no" title="statement not covered" > this.updateExecutionOutput(step.id, step.stepId, step.inputs, {</span>
1027
- ...outputs,
1028
- ...STOPPED_STATUS,
1029
- })
1030
- <span class="cstat-no" title="statement not covered" > continue</span>
1031
- }
1032
- <span class="missing-if-branch" title="if path not taken" >I</span>if (loopStep &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >loopSteps)</span> {
1033
- <span class="cstat-no" title="statement not covered" > loopSteps.push(outputs)</span>
1034
- } else {
1035
- this.updateExecutionOutput(
1036
- step.id,
1037
- step.stepId,
1038
- step.inputs,
1039
- outputs
1040
- )
1041
- }
1042
- } catch (err) {
1043
- <span class="cstat-no" title="statement not covered" > console.error(`Automation error - ${step.stepId} - ${err}`)</span>
1044
- <span class="cstat-no" title="statement not covered" > return err</span>
1045
- }
1046
- <span class="missing-if-branch" title="if path not taken" >I</span>if (loopStep) {
1047
- <span class="cstat-no" title="statement not covered" > iterationCount++</span>
1048
- <span class="cstat-no" title="statement not covered" > if (index === iterations - 1) {</span>
1049
- <span class="cstat-no" title="statement not covered" > loopStep = null</span>
1050
- <span class="cstat-no" title="statement not covered" > this._context.steps.splice(loopStepNumber, 1)</span>
1051
- <span class="cstat-no" title="statement not covered" > break</span>
1052
- }
1053
- }
1054
- }
1055
- &nbsp;
1056
- <span class="missing-if-branch" title="if path not taken" >I</span>if (loopSteps &amp;&amp; loopSteps.length) {
1057
- let tempOutput = <span class="cstat-no" title="statement not covered" >{</span>
1058
- success: true,
1059
- items: loopSteps,
1060
- iterations: iterationCount,
1061
- }
1062
- <span class="cstat-no" title="statement not covered" > this.executionOutput.steps.splice(loopStepNumber + 1, 0, {</span>
1063
- id: step.id,
1064
- stepId: step.stepId,
1065
- outputs: tempOutput,
1066
- inputs: step.inputs,
1067
- })
1068
- &nbsp;
1069
- <span class="cstat-no" title="statement not covered" > this._context.steps.splice(loopStepNumber, 0, tempOutput)</span>
1070
- <span class="cstat-no" title="statement not covered" > loopSteps = null</span>
1071
- }
1072
- }
1073
- &nbsp;
1074
- // store the logs for the automation run
1075
- await storeLog(this._automation, this.executionOutput)
1076
- return this.executionOutput
1077
- }
1078
- }
1079
- &nbsp;
1080
- module.exports = (input, callback) =&gt; {
1081
- const appId = input.data.event.appId
1082
- doInAppContext(appId, async () =&gt; {
1083
- const automationOrchestrator = new Orchestrator(
1084
- input.data.automation,
1085
- input.data.event
1086
- )
1087
- try {
1088
- const response = await automationOrchestrator.execute()
1089
- callback(null, response)
1090
- } catch (err) {
1091
- <span class="cstat-no" title="statement not covered" > callback(err)</span>
1092
- }
1093
- })
1094
- }
1095
- &nbsp;</pre></td></tr></table></pre>
1096
-
1097
- <div class='push'></div><!-- for sticky footer -->
1098
- </div><!-- /wrapper -->
1099
- <div class='footer quiet pad2 space-top1 center small'>
1100
- Code coverage generated by
1101
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1102
- at Fri Jul 29 2022 14:56:44 GMT+0000 (Coordinated Universal Time)
1103
- </div>
1104
- <script src="../prettify.js"></script>
1105
- <script>
1106
- window.onload = function () {
1107
- prettyPrint();
1108
- };
1109
- </script>
1110
- <script src="../sorter.js"></script>
1111
- <script src="../block-navigation.js"></script>
1112
- </body>
1113
- </html>
1114
-