@calmo/task-runner 1.2.1 → 1.2.2

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 (39) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/coverage/coverage-final.json +5 -2
  3. package/coverage/index.html +21 -21
  4. package/coverage/lcov-report/index.html +21 -21
  5. package/coverage/lcov-report/src/EventBus.ts.html +337 -0
  6. package/coverage/{TaskGraphValidator.ts.html → lcov-report/src/TaskGraphValidator.ts.html} +10 -10
  7. package/coverage/lcov-report/src/TaskRunner.ts.html +409 -0
  8. package/coverage/lcov-report/src/WorkflowExecutor.ts.html +400 -0
  9. package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +217 -0
  10. package/coverage/lcov-report/src/contracts/index.html +116 -0
  11. package/coverage/lcov-report/src/index.html +161 -0
  12. package/coverage/lcov.info +189 -140
  13. package/coverage/src/EventBus.ts.html +337 -0
  14. package/coverage/{lcov-report → src}/TaskGraphValidator.ts.html +10 -10
  15. package/coverage/src/TaskRunner.ts.html +409 -0
  16. package/coverage/src/WorkflowExecutor.ts.html +400 -0
  17. package/coverage/src/contracts/RunnerEvents.ts.html +217 -0
  18. package/coverage/src/contracts/index.html +116 -0
  19. package/coverage/src/index.html +161 -0
  20. package/dist/EventBus.d.ts +26 -0
  21. package/dist/EventBus.js +56 -0
  22. package/dist/EventBus.js.map +1 -0
  23. package/dist/TaskRunner.d.ts +3 -36
  24. package/dist/TaskRunner.js +7 -95
  25. package/dist/TaskRunner.js.map +1 -1
  26. package/dist/WorkflowExecutor.d.ts +23 -0
  27. package/dist/WorkflowExecutor.js +89 -0
  28. package/dist/WorkflowExecutor.js.map +1 -0
  29. package/dist/contracts/RunnerEvents.d.ts +36 -0
  30. package/dist/contracts/RunnerEvents.js +2 -0
  31. package/dist/contracts/RunnerEvents.js.map +1 -0
  32. package/package.json +1 -1
  33. package/src/EventBus.ts +84 -0
  34. package/src/TaskRunner.ts +10 -161
  35. package/src/WorkflowExecutor.ts +105 -0
  36. package/src/contracts/RunnerEvents.ts +44 -0
  37. package/test-report.xml +41 -37
  38. package/coverage/TaskRunner.ts.html +0 -862
  39. package/coverage/lcov-report/TaskRunner.ts.html +0 -862
@@ -1,862 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for TaskRunner.ts</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> TaskRunner.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">100% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>78/78</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">100% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>33/33</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>14/14</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>76/76</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 type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line high'></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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
326
- <span class="cline-any cline-neutral">&nbsp;</span>
327
- <span class="cline-any cline-neutral">&nbsp;</span>
328
- <span class="cline-any cline-neutral">&nbsp;</span>
329
- <span class="cline-any cline-neutral">&nbsp;</span>
330
- <span class="cline-any cline-neutral">&nbsp;</span>
331
- <span class="cline-any cline-neutral">&nbsp;</span>
332
- <span class="cline-any cline-neutral">&nbsp;</span>
333
- <span class="cline-any cline-neutral">&nbsp;</span>
334
- <span class="cline-any cline-neutral">&nbsp;</span>
335
- <span class="cline-any cline-neutral">&nbsp;</span>
336
- <span class="cline-any cline-neutral">&nbsp;</span>
337
- <span class="cline-any cline-neutral">&nbsp;</span>
338
- <span class="cline-any cline-neutral">&nbsp;</span>
339
- <span class="cline-any cline-neutral">&nbsp;</span>
340
- <span class="cline-any cline-neutral">&nbsp;</span>
341
- <span class="cline-any cline-neutral">&nbsp;</span>
342
- <span class="cline-any cline-neutral">&nbsp;</span>
343
- <span class="cline-any cline-neutral">&nbsp;</span>
344
- <span class="cline-any cline-neutral">&nbsp;</span>
345
- <span class="cline-any cline-neutral">&nbsp;</span>
346
- <span class="cline-any cline-neutral">&nbsp;</span>
347
- <span class="cline-any cline-neutral">&nbsp;</span>
348
- <span class="cline-any cline-neutral">&nbsp;</span>
349
- <span class="cline-any cline-neutral">&nbsp;</span>
350
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
360
- <span class="cline-any cline-neutral">&nbsp;</span>
361
- <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-neutral">&nbsp;</span>
363
- <span class="cline-any cline-neutral">&nbsp;</span>
364
- <span class="cline-any cline-neutral">&nbsp;</span>
365
- <span class="cline-any cline-neutral">&nbsp;</span>
366
- <span class="cline-any cline-neutral">&nbsp;</span>
367
- <span class="cline-any cline-neutral">&nbsp;</span>
368
- <span class="cline-any cline-neutral">&nbsp;</span>
369
- <span class="cline-any cline-neutral">&nbsp;</span>
370
- <span class="cline-any cline-neutral">&nbsp;</span>
371
- <span class="cline-any cline-neutral">&nbsp;</span>
372
- <span class="cline-any cline-neutral">&nbsp;</span>
373
- <span class="cline-any cline-neutral">&nbsp;</span>
374
- <span class="cline-any cline-neutral">&nbsp;</span>
375
- <span class="cline-any cline-neutral">&nbsp;</span>
376
- <span class="cline-any cline-neutral">&nbsp;</span>
377
- <span class="cline-any cline-neutral">&nbsp;</span>
378
- <span class="cline-any cline-yes">22x</span>
379
- <span class="cline-any cline-yes">22x</span>
380
- <span class="cline-any cline-yes">22x</span>
381
- <span class="cline-any cline-neutral">&nbsp;</span>
382
- <span class="cline-any cline-neutral">&nbsp;</span>
383
- <span class="cline-any cline-neutral">&nbsp;</span>
384
- <span class="cline-any cline-neutral">&nbsp;</span>
385
- <span class="cline-any cline-yes">22x</span>
386
- <span class="cline-any cline-neutral">&nbsp;</span>
387
- <span class="cline-any cline-neutral">&nbsp;</span>
388
- <span class="cline-any cline-neutral">&nbsp;</span>
389
- <span class="cline-any cline-neutral">&nbsp;</span>
390
- <span class="cline-any cline-neutral">&nbsp;</span>
391
- <span class="cline-any cline-neutral">&nbsp;</span>
392
- <span class="cline-any cline-neutral">&nbsp;</span>
393
- <span class="cline-any cline-neutral">&nbsp;</span>
394
- <span class="cline-any cline-neutral">&nbsp;</span>
395
- <span class="cline-any cline-neutral">&nbsp;</span>
396
- <span class="cline-any cline-yes">12x</span>
397
- <span class="cline-any cline-neutral">&nbsp;</span>
398
- <span class="cline-any cline-neutral">&nbsp;</span>
399
- <span class="cline-any cline-yes">11x</span>
400
- <span class="cline-any cline-neutral">&nbsp;</span>
401
- <span class="cline-any cline-neutral">&nbsp;</span>
402
- <span class="cline-any cline-yes">12x</span>
403
- <span class="cline-any cline-neutral">&nbsp;</span>
404
- <span class="cline-any cline-neutral">&nbsp;</span>
405
- <span class="cline-any cline-neutral">&nbsp;</span>
406
- <span class="cline-any cline-neutral">&nbsp;</span>
407
- <span class="cline-any cline-neutral">&nbsp;</span>
408
- <span class="cline-any cline-neutral">&nbsp;</span>
409
- <span class="cline-any cline-neutral">&nbsp;</span>
410
- <span class="cline-any cline-neutral">&nbsp;</span>
411
- <span class="cline-any cline-neutral">&nbsp;</span>
412
- <span class="cline-any cline-neutral">&nbsp;</span>
413
- <span class="cline-any cline-neutral">&nbsp;</span>
414
- <span class="cline-any cline-neutral">&nbsp;</span>
415
- <span class="cline-any cline-neutral">&nbsp;</span>
416
- <span class="cline-any cline-yes">2x</span>
417
- <span class="cline-any cline-yes">1x</span>
418
- <span class="cline-any cline-neutral">&nbsp;</span>
419
- <span class="cline-any cline-neutral">&nbsp;</span>
420
- <span class="cline-any cline-neutral">&nbsp;</span>
421
- <span class="cline-any cline-neutral">&nbsp;</span>
422
- <span class="cline-any cline-neutral">&nbsp;</span>
423
- <span class="cline-any cline-neutral">&nbsp;</span>
424
- <span class="cline-any cline-neutral">&nbsp;</span>
425
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
429
- <span class="cline-any cline-neutral">&nbsp;</span>
430
- <span class="cline-any cline-neutral">&nbsp;</span>
431
- <span class="cline-any cline-neutral">&nbsp;</span>
432
- <span class="cline-any cline-yes">88x</span>
433
- <span class="cline-any cline-neutral">&nbsp;</span>
434
- <span class="cline-any cline-neutral">&nbsp;</span>
435
- <span class="cline-any cline-yes">88x</span>
436
- <span class="cline-any cline-yes">13x</span>
437
- <span class="cline-any cline-yes">13x</span>
438
- <span class="cline-any cline-yes">13x</span>
439
- <span class="cline-any cline-neutral">&nbsp;</span>
440
- <span class="cline-any cline-neutral">&nbsp;</span>
441
- <span class="cline-any cline-yes">1x</span>
442
- <span class="cline-any cline-neutral">&nbsp;</span>
443
- <span class="cline-any cline-neutral">&nbsp;</span>
444
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
448
- <span class="cline-any cline-neutral">&nbsp;</span>
449
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
454
- <span class="cline-any cline-neutral">&nbsp;</span>
455
- <span class="cline-any cline-neutral">&nbsp;</span>
456
- <span class="cline-any cline-neutral">&nbsp;</span>
457
- <span class="cline-any cline-neutral">&nbsp;</span>
458
- <span class="cline-any cline-neutral">&nbsp;</span>
459
- <span class="cline-any cline-yes">21x</span>
460
- <span class="cline-any cline-yes">43x</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-yes">21x</span>
467
- <span class="cline-any cline-yes">21x</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-neutral">&nbsp;</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-neutral">&nbsp;</span>
477
- <span class="cline-any cline-yes">2x</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">2x</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-neutral">&nbsp;</span>
484
- <span class="cline-any cline-yes">2x</span>
485
- <span class="cline-any cline-yes">2x</span>
486
- <span class="cline-any cline-yes">2x</span>
487
- <span class="cline-any cline-neutral">&nbsp;</span>
488
- <span class="cline-any cline-neutral">&nbsp;</span>
489
- <span class="cline-any cline-yes">2x</span>
490
- <span class="cline-any cline-yes">2x</span>
491
- <span class="cline-any cline-yes">2x</span>
492
- <span class="cline-any cline-neutral">&nbsp;</span>
493
- <span class="cline-any cline-neutral">&nbsp;</span>
494
- <span class="cline-any cline-neutral">&nbsp;</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-yes">6x</span>
498
- <span class="cline-any cline-yes">6x</span>
499
- <span class="cline-any cline-yes">6x</span>
500
- <span class="cline-any cline-neutral">&nbsp;</span>
501
- <span class="cline-any cline-neutral">&nbsp;</span>
502
- <span class="cline-any cline-yes">6x</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-yes">15x</span>
506
- <span class="cline-any cline-neutral">&nbsp;</span>
507
- <span class="cline-any cline-yes">15x</span>
508
- <span class="cline-any cline-yes">15x</span>
509
- <span class="cline-any cline-neutral">&nbsp;</span>
510
- <span class="cline-any cline-neutral">&nbsp;</span>
511
- <span class="cline-any cline-yes">15x</span>
512
- <span class="cline-any cline-yes">35x</span>
513
- <span class="cline-any cline-yes">98x</span>
514
- <span class="cline-any cline-neutral">&nbsp;</span>
515
- <span class="cline-any cline-neutral">&nbsp;</span>
516
- <span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-yes">35x</span>
518
- <span class="cline-any cline-yes">49x</span>
519
- <span class="cline-any cline-yes">49x</span>
520
- <span class="cline-any cline-yes">39x</span>
521
- <span class="cline-any cline-neutral">&nbsp;</span>
522
- <span class="cline-any cline-yes">49x</span>
523
- <span class="cline-any cline-yes">6x</span>
524
- <span class="cline-any cline-neutral">&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-yes">6x</span>
528
- <span class="cline-any cline-yes">6x</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-yes">35x</span>
534
- <span class="cline-any cline-yes">98x</span>
535
- <span class="cline-any cline-yes">43x</span>
536
- <span class="cline-any cline-yes">98x</span>
537
- <span class="cline-any cline-yes">29x</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">35x</span>
543
- <span class="cline-any cline-yes">26x</span>
544
- <span class="cline-any cline-yes">26x</span>
545
- <span class="cline-any cline-neutral">&nbsp;</span>
546
- <span class="cline-any cline-yes">26x</span>
547
- <span class="cline-any cline-yes">26x</span>
548
- <span class="cline-any cline-yes">26x</span>
549
- <span class="cline-any cline-yes">24x</span>
550
- <span class="cline-any cline-neutral">&nbsp;</span>
551
- <span class="cline-any cline-yes">2x</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">26x</span>
557
- <span class="cline-any cline-yes">26x</span>
558
- <span class="cline-any cline-yes">26x</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
- <span class="cline-any cline-yes">26x</span>
564
- <span class="cline-any cline-yes">26x</span>
565
- <span class="cline-any cline-neutral">&nbsp;</span>
566
- <span class="cline-any cline-yes">26x</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-neutral">&nbsp;</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-yes">15x</span>
572
- <span class="cline-any cline-neutral">&nbsp;</span>
573
- <span class="cline-any cline-yes">15x</span>
574
- <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-yes">20x</span>
576
- <span class="cline-any cline-neutral">&nbsp;</span>
577
- <span class="cline-any cline-yes">20x</span>
578
- <span class="cline-any cline-neutral">&nbsp;</span>
579
- <span class="cline-any cline-neutral">&nbsp;</span>
580
- <span class="cline-any cline-yes">15x</span>
581
- <span class="cline-any cline-yes">15x</span>
582
- <span class="cline-any cline-neutral">&nbsp;</span>
583
- <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { TaskStep } from "./TaskStep.js";
585
- import { TaskResult } from "./TaskResult.js";
586
- import { TaskGraphValidator } from "./TaskGraphValidator.js";
587
- import { TaskGraph } from "./TaskGraph.js";
588
- &nbsp;
589
- /**
590
- * Define the payload for every possible event in the lifecycle.
591
- */
592
- export interface RunnerEventPayloads&lt;TContext&gt; {
593
- workflowStart: {
594
- context: TContext;
595
- steps: TaskStep&lt;TContext&gt;[];
596
- };
597
- workflowEnd: {
598
- context: TContext;
599
- results: Map&lt;string, TaskResult&gt;;
600
- };
601
- taskStart: {
602
- step: TaskStep&lt;TContext&gt;;
603
- };
604
- taskEnd: {
605
- step: TaskStep&lt;TContext&gt;;
606
- result: TaskResult;
607
- };
608
- taskSkipped: {
609
- step: TaskStep&lt;TContext&gt;;
610
- result: TaskResult;
611
- };
612
- }
613
- &nbsp;
614
- /**
615
- * A generic listener type that maps the event key to its specific payload.
616
- */
617
- export type RunnerEventListener&lt;
618
- TContext,
619
- K extends keyof RunnerEventPayloads&lt;TContext&gt;,
620
- &gt; = (data: RunnerEventPayloads&lt;TContext&gt;[K]) =&gt; void | Promise&lt;void&gt;;
621
- &nbsp;
622
- /**
623
- * Helper type for the listeners map to avoid private access issues in generic contexts.
624
- */
625
- type ListenerMap&lt;TContext&gt; = {
626
- [K in keyof RunnerEventPayloads&lt;TContext&gt;]?: Set&lt;
627
- RunnerEventListener&lt;TContext, K&gt;
628
- &gt;;
629
- };
630
- &nbsp;
631
- /**
632
- * The main class that orchestrates the execution of a list of tasks
633
- * based on their dependencies, with support for parallel execution.
634
- * @template TContext The shape of the shared context object.
635
- */
636
- export class TaskRunner&lt;TContext&gt; {
637
- private running = new Set&lt;string&gt;();
638
- private listeners: ListenerMap&lt;TContext&gt; = {};
639
- private validator = new TaskGraphValidator();
640
- &nbsp;
641
- /**
642
- * @param context The shared context object to be passed to each task.
643
- */
644
- constructor(private context: TContext) {}
645
- &nbsp;
646
- /**
647
- * Subscribe to an event.
648
- * @param event The event name.
649
- * @param callback The callback to execute when the event is emitted.
650
- */
651
- public on&lt;K extends keyof RunnerEventPayloads&lt;TContext&gt;&gt;(
652
- event: K,
653
- callback: RunnerEventListener&lt;TContext, K&gt;
654
- ): void {
655
- if (!this.listeners[event]) {
656
- // Type assertion needed because TypeScript cannot verify that the generic K
657
- // matches the specific key in the mapped type during assignment.
658
- this.listeners[event] = new Set() as unknown as ListenerMap&lt;TContext&gt;[K];
659
- }
660
- // Type assertion needed to tell TS that this specific Set matches the callback type
661
- (this.listeners[event] as Set&lt;RunnerEventListener&lt;TContext, K&gt;&gt;).add(
662
- callback
663
- );
664
- }
665
- &nbsp;
666
- /**
667
- * Unsubscribe from an event.
668
- * @param event The event name.
669
- * @param callback The callback to remove.
670
- */
671
- public off&lt;K extends keyof RunnerEventPayloads&lt;TContext&gt;&gt;(
672
- event: K,
673
- callback: RunnerEventListener&lt;TContext, K&gt;
674
- ): void {
675
- if (this.listeners[event]) {
676
- (this.listeners[event] as Set&lt;RunnerEventListener&lt;TContext, K&gt;&gt;).delete(
677
- callback
678
- );
679
- }
680
- }
681
- &nbsp;
682
- /**
683
- * Emit an event to all subscribers.
684
- * @param event The event name.
685
- * @param data The payload for the event.
686
- */
687
- private emit&lt;K extends keyof RunnerEventPayloads&lt;TContext&gt;&gt;(
688
- event: K,
689
- data: RunnerEventPayloads&lt;TContext&gt;[K]
690
- ): void {
691
- const listeners = this.listeners[event] as
692
- | Set&lt;RunnerEventListener&lt;TContext, K&gt;&gt;
693
- | undefined;
694
- if (listeners) {
695
- for (const listener of listeners) {
696
- try {
697
- listener(data);
698
- } catch (error) {
699
- // Prevent listener errors from bubbling up
700
- console.error(
701
- `Error in event listener for ${String(event)}:`,
702
- error
703
- );
704
- }
705
- }
706
- }
707
- }
708
- &nbsp;
709
- /**
710
- * Executes a list of tasks, respecting their dependencies and running
711
- * independent tasks in parallel.
712
- * @param steps An array of TaskStep objects to be executed.
713
- * @returns A Promise that resolves to a Map where keys are task names
714
- * and values are the corresponding TaskResult objects.
715
- */
716
- async execute(steps: TaskStep&lt;TContext&gt;[]): Promise&lt;Map&lt;string, TaskResult&gt;&gt; {
717
- // Validate the task graph before execution
718
- const taskGraph: TaskGraph = {
719
- tasks: steps.map((step) =&gt; ({
720
- id: step.name,
721
- dependencies: step.dependencies ?? [],
722
- })),
723
- };
724
- &nbsp;
725
- const validationResult = this.validator.validate(taskGraph);
726
- if (!validationResult.isValid) {
727
- // Construct error message compatible with legacy tests
728
- const affectedTasks = new Set&lt;string&gt;();
729
- const errorDetails: string[] = [];
730
- &nbsp;
731
- for (const error of validationResult.errors) {
732
- errorDetails.push(error.message);
733
- switch (error.type) {
734
- case "cycle": {
735
- // details is { cyclePath: string[] }
736
- const path = (error.details as { cyclePath: string[] }).cyclePath;
737
- // The last element duplicates the first in the path representation, so valid unique tasks are slice(0, -1) or just all as Set handles uniq
738
- path.forEach((t) =&gt; affectedTasks.add(t));
739
- break;
740
- }
741
- case "missing_dependency": {
742
- // details is { taskId: string, missingDependencyId: string }
743
- const d = error.details as { taskId: string };
744
- affectedTasks.add(d.taskId);
745
- break;
746
- }
747
- case "duplicate_task": {
748
- const d = error.details as { taskId: string };
749
- affectedTasks.add(d.taskId);
750
- break;
751
- }
752
- }
753
- }
754
- &nbsp;
755
- // Legacy error format: "Circular dependency or missing dependency detected. Unable to run tasks: A, B"
756
- const taskList = Array.from(affectedTasks).join(", ");
757
- const legacyMessage = `Circular dependency or missing dependency detected. Unable to run tasks: ${taskList}`;
758
- const detailedMessage = `Task graph validation failed: ${errorDetails.join("; ")}`;
759
- &nbsp;
760
- // Combine them to satisfy both legacy tests (checking for legacy message) and new requirements (clear details)
761
- throw new Error(`${legacyMessage} | ${detailedMessage}`);
762
- }
763
- &nbsp;
764
- this.emit("workflowStart", { context: this.context, steps });
765
- &nbsp;
766
- const results = new Map&lt;string, TaskResult&gt;();
767
- const executingPromises = new Set&lt;Promise&lt;void&gt;&gt;();
768
- &nbsp;
769
- // Helper to process pending steps and launch ready ones
770
- const processPendingSteps = () =&gt; {
771
- const pendingSteps = steps.filter(
772
- (step) =&gt; !results.has(step.name) &amp;&amp; !this.running.has(step.name)
773
- );
774
- &nbsp;
775
- // 1. Identify and mark skipped tasks
776
- for (const step of pendingSteps) {
777
- const deps = step.dependencies ?? [];
778
- const failedDep = deps.find(
779
- (dep) =&gt; results.has(dep) &amp;&amp; results.get(dep)?.status !== "success"
780
- );
781
- if (failedDep) {
782
- const result: TaskResult = {
783
- status: "skipped",
784
- message: `Skipped due to failed dependency: ${failedDep}`,
785
- };
786
- results.set(step.name, result);
787
- this.emit("taskSkipped", { step, result });
788
- }
789
- }
790
- &nbsp;
791
- // Re-filter pending steps as some might have been skipped above
792
- const readySteps = steps.filter((step) =&gt; {
793
- if (results.has(step.name) || this.running.has(step.name)) return false;
794
- const deps = step.dependencies ?? [];
795
- return deps.every(
796
- (dep) =&gt; results.has(dep) &amp;&amp; results.get(dep)?.status === "success"
797
- );
798
- });
799
- &nbsp;
800
- // 2. Launch ready tasks
801
- for (const step of readySteps) {
802
- this.running.add(step.name);
803
- this.emit("taskStart", { step });
804
- &nbsp;
805
- const taskPromise = (async () =&gt; {
806
- try {
807
- const result = await step.run(this.context);
808
- results.set(step.name, result);
809
- } catch (e) {
810
- results.set(step.name, {
811
- status: "failure",
812
- error: e instanceof Error ? e.message : String(e),
813
- });
814
- } finally {
815
- this.running.delete(step.name);
816
- const result = results.get(step.name)!;
817
- this.emit("taskEnd", { step, result });
818
- }
819
- })();
820
- &nbsp;
821
- // Wrap the task promise to ensure we can track it in the Set
822
- const trackedPromise = taskPromise.then(() =&gt; {
823
- executingPromises.delete(trackedPromise);
824
- });
825
- executingPromises.add(trackedPromise);
826
- }
827
- };
828
- &nbsp;
829
- // Initial check to start independent tasks
830
- processPendingSteps();
831
- &nbsp;
832
- while (results.size &lt; steps.length &amp;&amp; executingPromises.size &gt; 0) {
833
- // Wait for the next task to finish
834
- await Promise.race(executingPromises);
835
- // After a task finishes, check for new work
836
- processPendingSteps();
837
- }
838
- &nbsp;
839
- this.emit("workflowEnd", { context: this.context, results });
840
- return results;
841
- }
842
- }
843
- &nbsp;</pre></td></tr></table></pre>
844
-
845
- <div class='push'></div><!-- for sticky footer -->
846
- </div><!-- /wrapper -->
847
- <div class='footer quiet pad2 space-top1 center small'>
848
- Code coverage generated by
849
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
850
- at 2026-01-18T05:09:17.333Z
851
- </div>
852
- <script src="prettify.js"></script>
853
- <script>
854
- window.onload = function () {
855
- prettyPrint();
856
- };
857
- </script>
858
- <script src="sorter.js"></script>
859
- <script src="block-navigation.js"></script>
860
- </body>
861
- </html>
862
-