@calmo/task-runner 1.2.0 → 1.2.1
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.
- package/CHANGELOG.md +16 -0
- package/GEMINI.md +2 -1
- package/README.md +5 -0
- package/coverage/TaskGraphValidator.ts.html +1 -1
- package/coverage/TaskRunner.ts.html +96 -30
- package/coverage/coverage-final.json +1 -1
- package/coverage/index.html +9 -9
- package/coverage/lcov-report/TaskGraphValidator.ts.html +1 -1
- package/coverage/lcov-report/TaskRunner.ts.html +96 -30
- package/coverage/lcov-report/index.html +9 -9
- package/coverage/lcov.info +74 -54
- package/dist/TaskRunner.js +44 -23
- package/dist/TaskRunner.js.map +1 -1
- package/package.json +1 -1
- package/src/TaskRunner.ts +37 -15
- package/test-report.xml +37 -37
|
@@ -25,28 +25,28 @@
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
26
|
<span class="strong">100% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>78/78</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
33
|
<span class="strong">100% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>33/33</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
40
|
<span class="strong">100% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>14/14</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
47
|
<span class="strong">100% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>76/76</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -300,7 +300,29 @@
|
|
|
300
300
|
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
301
|
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
302
|
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
-
<a name='L238'></a><a href='#L238'>238</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"> </span>
|
|
304
326
|
<span class="cline-any cline-neutral"> </span>
|
|
305
327
|
<span class="cline-any cline-neutral"> </span>
|
|
306
328
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -483,21 +505,16 @@
|
|
|
483
505
|
<span class="cline-any cline-yes">15x</span>
|
|
484
506
|
<span class="cline-any cline-neutral"> </span>
|
|
485
507
|
<span class="cline-any cline-yes">15x</span>
|
|
486
|
-
<span class="cline-any cline-neutral"> </span>
|
|
487
508
|
<span class="cline-any cline-yes">15x</span>
|
|
488
|
-
<span class="cline-any cline-yes">22x</span>
|
|
489
|
-
<span class="cline-any cline-yes">71x</span>
|
|
490
509
|
<span class="cline-any cline-neutral"> </span>
|
|
491
510
|
<span class="cline-any cline-neutral"> </span>
|
|
492
|
-
<span class="cline-any cline-yes">
|
|
493
|
-
<span class="cline-any cline-yes">49x</span>
|
|
494
|
-
<span class="cline-any cline-yes">49x</span>
|
|
511
|
+
<span class="cline-any cline-yes">15x</span>
|
|
495
512
|
<span class="cline-any cline-yes">35x</span>
|
|
513
|
+
<span class="cline-any cline-yes">98x</span>
|
|
496
514
|
<span class="cline-any cline-neutral"> </span>
|
|
497
515
|
<span class="cline-any cline-neutral"> </span>
|
|
498
516
|
<span class="cline-any cline-neutral"> </span>
|
|
499
|
-
<span class="cline-any cline-
|
|
500
|
-
<span class="cline-any cline-yes">22x</span>
|
|
517
|
+
<span class="cline-any cline-yes">35x</span>
|
|
501
518
|
<span class="cline-any cline-yes">49x</span>
|
|
502
519
|
<span class="cline-any cline-yes">49x</span>
|
|
503
520
|
<span class="cline-any cline-yes">39x</span>
|
|
@@ -512,10 +529,21 @@
|
|
|
512
529
|
<span class="cline-any cline-neutral"> </span>
|
|
513
530
|
<span class="cline-any cline-neutral"> </span>
|
|
514
531
|
<span class="cline-any cline-neutral"> </span>
|
|
515
|
-
<span class="cline-any cline-yes">22x</span>
|
|
516
532
|
<span class="cline-any cline-neutral"> </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"> </span>
|
|
539
|
+
<span class="cline-any cline-neutral"> </span>
|
|
540
|
+
<span class="cline-any cline-neutral"> </span>
|
|
541
|
+
<span class="cline-any cline-neutral"> </span>
|
|
542
|
+
<span class="cline-any cline-yes">35x</span>
|
|
517
543
|
<span class="cline-any cline-yes">26x</span>
|
|
518
544
|
<span class="cline-any cline-yes">26x</span>
|
|
545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
546
|
+
<span class="cline-any cline-yes">26x</span>
|
|
519
547
|
<span class="cline-any cline-yes">26x</span>
|
|
520
548
|
<span class="cline-any cline-yes">26x</span>
|
|
521
549
|
<span class="cline-any cline-yes">24x</span>
|
|
@@ -532,6 +560,22 @@
|
|
|
532
560
|
<span class="cline-any cline-neutral"> </span>
|
|
533
561
|
<span class="cline-any cline-neutral"> </span>
|
|
534
562
|
<span class="cline-any cline-neutral"> </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"> </span>
|
|
566
|
+
<span class="cline-any cline-yes">26x</span>
|
|
567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
568
|
+
<span class="cline-any cline-neutral"> </span>
|
|
569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
570
|
+
<span class="cline-any cline-neutral"> </span>
|
|
571
|
+
<span class="cline-any cline-yes">15x</span>
|
|
572
|
+
<span class="cline-any cline-neutral"> </span>
|
|
573
|
+
<span class="cline-any cline-yes">15x</span>
|
|
574
|
+
<span class="cline-any cline-neutral"> </span>
|
|
575
|
+
<span class="cline-any cline-yes">20x</span>
|
|
576
|
+
<span class="cline-any cline-neutral"> </span>
|
|
577
|
+
<span class="cline-any cline-yes">20x</span>
|
|
578
|
+
<span class="cline-any cline-neutral"> </span>
|
|
535
579
|
<span class="cline-any cline-neutral"> </span>
|
|
536
580
|
<span class="cline-any cline-yes">15x</span>
|
|
537
581
|
<span class="cline-any cline-yes">15x</span>
|
|
@@ -720,20 +764,15 @@ export class TaskRunner<TContext> {
|
|
|
720
764
|
this.emit("workflowStart", { context: this.context, steps });
|
|
721
765
|
|
|
722
766
|
const results = new Map<string, TaskResult>();
|
|
767
|
+
const executingPromises = new Set<Promise<void>>();
|
|
723
768
|
|
|
724
|
-
|
|
769
|
+
// Helper to process pending steps and launch ready ones
|
|
770
|
+
const processPendingSteps = () => {
|
|
725
771
|
const pendingSteps = steps.filter(
|
|
726
772
|
(step) => !results.has(step.name) && !this.running.has(step.name)
|
|
727
773
|
);
|
|
728
774
|
|
|
729
|
-
|
|
730
|
-
const deps = step.dependencies ?? [];
|
|
731
|
-
return deps.every(
|
|
732
|
-
(dep) => results.has(dep) && results.get(dep)?.status === "success"
|
|
733
|
-
);
|
|
734
|
-
});
|
|
735
|
-
|
|
736
|
-
// Skip tasks with failed dependencies
|
|
775
|
+
// 1. Identify and mark skipped tasks
|
|
737
776
|
for (const step of pendingSteps) {
|
|
738
777
|
const deps = step.dependencies ?? [];
|
|
739
778
|
const failedDep = deps.find(
|
|
@@ -749,10 +788,21 @@ export class TaskRunner<TContext> {
|
|
|
749
788
|
}
|
|
750
789
|
}
|
|
751
790
|
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
791
|
+
// Re-filter pending steps as some might have been skipped above
|
|
792
|
+
const readySteps = steps.filter((step) => {
|
|
793
|
+
if (results.has(step.name) || this.running.has(step.name)) return false;
|
|
794
|
+
const deps = step.dependencies ?? [];
|
|
795
|
+
return deps.every(
|
|
796
|
+
(dep) => results.has(dep) && results.get(dep)?.status === "success"
|
|
797
|
+
);
|
|
798
|
+
});
|
|
799
|
+
|
|
800
|
+
// 2. Launch ready tasks
|
|
801
|
+
for (const step of readySteps) {
|
|
802
|
+
this.running.add(step.name);
|
|
803
|
+
this.emit("taskStart", { step });
|
|
804
|
+
|
|
805
|
+
const taskPromise = (async () => {
|
|
756
806
|
try {
|
|
757
807
|
const result = await step.run(this.context);
|
|
758
808
|
results.set(step.name, result);
|
|
@@ -766,8 +816,24 @@ export class TaskRunner<TContext> {
|
|
|
766
816
|
const result = results.get(step.name)!;
|
|
767
817
|
this.emit("taskEnd", { step, result });
|
|
768
818
|
}
|
|
769
|
-
})
|
|
770
|
-
|
|
819
|
+
})();
|
|
820
|
+
|
|
821
|
+
// Wrap the task promise to ensure we can track it in the Set
|
|
822
|
+
const trackedPromise = taskPromise.then(() => {
|
|
823
|
+
executingPromises.delete(trackedPromise);
|
|
824
|
+
});
|
|
825
|
+
executingPromises.add(trackedPromise);
|
|
826
|
+
}
|
|
827
|
+
};
|
|
828
|
+
|
|
829
|
+
// Initial check to start independent tasks
|
|
830
|
+
processPendingSteps();
|
|
831
|
+
|
|
832
|
+
while (results.size < steps.length && executingPromises.size > 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();
|
|
771
837
|
}
|
|
772
838
|
|
|
773
839
|
this.emit("workflowEnd", { context: this.context, results });
|
|
@@ -781,7 +847,7 @@ export class TaskRunner<TContext> {
|
|
|
781
847
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
782
848
|
Code coverage generated by
|
|
783
849
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
784
|
-
at 2026-01-
|
|
850
|
+
at 2026-01-18T05:09:17.338Z
|
|
785
851
|
</div>
|
|
786
852
|
<script src="prettify.js"></script>
|
|
787
853
|
<script>
|
|
@@ -25,28 +25,28 @@
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
26
|
<span class="strong">100% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>121/121</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
33
|
<span class="strong">100% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>49/49</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
40
|
<span class="strong">100% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>17/17</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
47
|
<span class="strong">100% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>118/118</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -99,13 +99,13 @@
|
|
|
99
99
|
<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
|
|
100
100
|
</td>
|
|
101
101
|
<td data-value="100" class="pct high">100%</td>
|
|
102
|
-
<td data-value="
|
|
102
|
+
<td data-value="78" class="abs high">78/78</td>
|
|
103
103
|
<td data-value="100" class="pct high">100%</td>
|
|
104
|
-
<td data-value="
|
|
104
|
+
<td data-value="33" class="abs high">33/33</td>
|
|
105
105
|
<td data-value="100" class="pct high">100%</td>
|
|
106
|
-
<td data-value="
|
|
106
|
+
<td data-value="14" class="abs high">14/14</td>
|
|
107
107
|
<td data-value="100" class="pct high">100%</td>
|
|
108
|
-
<td data-value="
|
|
108
|
+
<td data-value="76" class="abs high">76/76</td>
|
|
109
109
|
</tr>
|
|
110
110
|
|
|
111
111
|
</tbody>
|
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
117
117
|
Code coverage generated by
|
|
118
118
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
119
|
-
at 2026-01-
|
|
119
|
+
at 2026-01-18T05:09:17.338Z
|
|
120
120
|
</div>
|
|
121
121
|
<script src="prettify.js"></script>
|
|
122
122
|
<script>
|
package/coverage/lcov.info
CHANGED
|
@@ -81,12 +81,14 @@ FN:133,(anonymous_4)
|
|
|
81
81
|
FN:136,(anonymous_5)
|
|
82
82
|
FN:155,(anonymous_6)
|
|
83
83
|
FN:187,(anonymous_7)
|
|
84
|
-
FN:
|
|
85
|
-
FN:
|
|
86
|
-
FN:
|
|
87
|
-
FN:
|
|
88
|
-
|
|
89
|
-
|
|
84
|
+
FN:189,(anonymous_8)
|
|
85
|
+
FN:196,(anonymous_9)
|
|
86
|
+
FN:209,(anonymous_10)
|
|
87
|
+
FN:213,(anonymous_11)
|
|
88
|
+
FN:222,(anonymous_12)
|
|
89
|
+
FN:239,(anonymous_13)
|
|
90
|
+
FNF:14
|
|
91
|
+
FNH:14
|
|
90
92
|
FNDA:22,(anonymous_0)
|
|
91
93
|
FNDA:12,(anonymous_1)
|
|
92
94
|
FNDA:2,(anonymous_2)
|
|
@@ -94,11 +96,13 @@ FNDA:88,(anonymous_3)
|
|
|
94
96
|
FNDA:21,(anonymous_4)
|
|
95
97
|
FNDA:43,(anonymous_5)
|
|
96
98
|
FNDA:6,(anonymous_6)
|
|
97
|
-
FNDA:
|
|
98
|
-
FNDA:
|
|
99
|
-
FNDA:
|
|
100
|
-
FNDA:
|
|
101
|
-
FNDA:
|
|
99
|
+
FNDA:35,(anonymous_7)
|
|
100
|
+
FNDA:98,(anonymous_8)
|
|
101
|
+
FNDA:39,(anonymous_9)
|
|
102
|
+
FNDA:98,(anonymous_10)
|
|
103
|
+
FNDA:29,(anonymous_11)
|
|
104
|
+
FNDA:26,(anonymous_12)
|
|
105
|
+
FNDA:26,(anonymous_13)
|
|
102
106
|
DA:54,22
|
|
103
107
|
DA:55,22
|
|
104
108
|
DA:56,22
|
|
@@ -138,35 +142,45 @@ DA:175,6
|
|
|
138
142
|
DA:178,6
|
|
139
143
|
DA:181,15
|
|
140
144
|
DA:183,15
|
|
141
|
-
DA:
|
|
142
|
-
DA:
|
|
143
|
-
DA:
|
|
144
|
-
DA:
|
|
145
|
-
DA:191,49
|
|
146
|
-
DA:192,49
|
|
145
|
+
DA:184,15
|
|
146
|
+
DA:187,15
|
|
147
|
+
DA:188,35
|
|
148
|
+
DA:189,98
|
|
147
149
|
DA:193,35
|
|
148
|
-
DA:
|
|
149
|
-
DA:
|
|
150
|
-
DA:
|
|
151
|
-
DA:
|
|
152
|
-
DA:
|
|
150
|
+
DA:194,49
|
|
151
|
+
DA:195,49
|
|
152
|
+
DA:196,39
|
|
153
|
+
DA:198,49
|
|
154
|
+
DA:199,6
|
|
155
|
+
DA:203,6
|
|
153
156
|
DA:204,6
|
|
154
|
-
DA:
|
|
155
|
-
DA:
|
|
156
|
-
DA:
|
|
157
|
-
DA:
|
|
158
|
-
DA:
|
|
159
|
-
DA:
|
|
160
|
-
DA:
|
|
161
|
-
DA:
|
|
162
|
-
DA:
|
|
163
|
-
DA:
|
|
164
|
-
DA:
|
|
165
|
-
DA:
|
|
166
|
-
DA:
|
|
167
|
-
DA:
|
|
168
|
-
|
|
169
|
-
|
|
157
|
+
DA:209,35
|
|
158
|
+
DA:210,98
|
|
159
|
+
DA:211,43
|
|
160
|
+
DA:212,98
|
|
161
|
+
DA:213,29
|
|
162
|
+
DA:218,35
|
|
163
|
+
DA:219,26
|
|
164
|
+
DA:220,26
|
|
165
|
+
DA:222,26
|
|
166
|
+
DA:223,26
|
|
167
|
+
DA:224,26
|
|
168
|
+
DA:225,24
|
|
169
|
+
DA:227,2
|
|
170
|
+
DA:232,26
|
|
171
|
+
DA:233,26
|
|
172
|
+
DA:234,26
|
|
173
|
+
DA:239,26
|
|
174
|
+
DA:240,26
|
|
175
|
+
DA:242,26
|
|
176
|
+
DA:247,15
|
|
177
|
+
DA:249,15
|
|
178
|
+
DA:251,20
|
|
179
|
+
DA:253,20
|
|
180
|
+
DA:256,15
|
|
181
|
+
DA:257,15
|
|
182
|
+
LF:76
|
|
183
|
+
LH:76
|
|
170
184
|
BRDA:72,0,0,11
|
|
171
185
|
BRDA:72,0,1,1
|
|
172
186
|
BRDA:92,1,0,1
|
|
@@ -180,20 +194,26 @@ BRDA:143,4,1,15
|
|
|
180
194
|
BRDA:150,5,0,2
|
|
181
195
|
BRDA:150,5,1,2
|
|
182
196
|
BRDA:150,5,2,2
|
|
183
|
-
BRDA:
|
|
184
|
-
BRDA:
|
|
185
|
-
BRDA:
|
|
186
|
-
BRDA:
|
|
187
|
-
BRDA:
|
|
188
|
-
BRDA:
|
|
189
|
-
BRDA:
|
|
190
|
-
BRDA:
|
|
191
|
-
BRDA:
|
|
192
|
-
BRDA:
|
|
193
|
-
BRDA:
|
|
194
|
-
BRDA:
|
|
195
|
-
BRDA:
|
|
196
|
-
BRDA:
|
|
197
|
-
|
|
198
|
-
|
|
197
|
+
BRDA:189,6,0,98
|
|
198
|
+
BRDA:189,6,1,50
|
|
199
|
+
BRDA:194,7,0,49
|
|
200
|
+
BRDA:194,7,1,18
|
|
201
|
+
BRDA:196,8,0,39
|
|
202
|
+
BRDA:196,8,1,18
|
|
203
|
+
BRDA:198,9,0,6
|
|
204
|
+
BRDA:198,9,1,43
|
|
205
|
+
BRDA:210,10,0,55
|
|
206
|
+
BRDA:210,10,1,43
|
|
207
|
+
BRDA:210,11,0,98
|
|
208
|
+
BRDA:210,11,1,44
|
|
209
|
+
BRDA:211,12,0,43
|
|
210
|
+
BRDA:211,12,1,18
|
|
211
|
+
BRDA:213,13,0,29
|
|
212
|
+
BRDA:213,13,1,12
|
|
213
|
+
BRDA:229,14,0,1
|
|
214
|
+
BRDA:229,14,1,1
|
|
215
|
+
BRDA:249,15,0,15
|
|
216
|
+
BRDA:249,15,1,20
|
|
217
|
+
BRF:33
|
|
218
|
+
BRH:33
|
|
199
219
|
end_of_record
|
package/dist/TaskRunner.js
CHANGED
|
@@ -110,13 +110,11 @@ export class TaskRunner {
|
|
|
110
110
|
}
|
|
111
111
|
this.emit("workflowStart", { context: this.context, steps });
|
|
112
112
|
const results = new Map();
|
|
113
|
-
|
|
113
|
+
const executingPromises = new Set();
|
|
114
|
+
// Helper to process pending steps and launch ready ones
|
|
115
|
+
const processPendingSteps = () => {
|
|
114
116
|
const pendingSteps = steps.filter((step) => !results.has(step.name) && !this.running.has(step.name));
|
|
115
|
-
|
|
116
|
-
const deps = step.dependencies ?? [];
|
|
117
|
-
return deps.every((dep) => results.has(dep) && results.get(dep)?.status === "success");
|
|
118
|
-
});
|
|
119
|
-
// Skip tasks with failed dependencies
|
|
117
|
+
// 1. Identify and mark skipped tasks
|
|
120
118
|
for (const step of pendingSteps) {
|
|
121
119
|
const deps = step.dependencies ?? [];
|
|
122
120
|
const failedDep = deps.find((dep) => results.has(dep) && results.get(dep)?.status !== "success");
|
|
@@ -129,25 +127,48 @@ export class TaskRunner {
|
|
|
129
127
|
this.emit("taskSkipped", { step, result });
|
|
130
128
|
}
|
|
131
129
|
}
|
|
132
|
-
|
|
130
|
+
// Re-filter pending steps as some might have been skipped above
|
|
131
|
+
const readySteps = steps.filter((step) => {
|
|
132
|
+
if (results.has(step.name) || this.running.has(step.name))
|
|
133
|
+
return false;
|
|
134
|
+
const deps = step.dependencies ?? [];
|
|
135
|
+
return deps.every((dep) => results.has(dep) && results.get(dep)?.status === "success");
|
|
136
|
+
});
|
|
137
|
+
// 2. Launch ready tasks
|
|
138
|
+
for (const step of readySteps) {
|
|
133
139
|
this.running.add(step.name);
|
|
134
140
|
this.emit("taskStart", { step });
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
141
|
+
const taskPromise = (async () => {
|
|
142
|
+
try {
|
|
143
|
+
const result = await step.run(this.context);
|
|
144
|
+
results.set(step.name, result);
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
results.set(step.name, {
|
|
148
|
+
status: "failure",
|
|
149
|
+
error: e instanceof Error ? e.message : String(e),
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
this.running.delete(step.name);
|
|
154
|
+
const result = results.get(step.name);
|
|
155
|
+
this.emit("taskEnd", { step, result });
|
|
156
|
+
}
|
|
157
|
+
})();
|
|
158
|
+
// Wrap the task promise to ensure we can track it in the Set
|
|
159
|
+
const trackedPromise = taskPromise.then(() => {
|
|
160
|
+
executingPromises.delete(trackedPromise);
|
|
161
|
+
});
|
|
162
|
+
executingPromises.add(trackedPromise);
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
// Initial check to start independent tasks
|
|
166
|
+
processPendingSteps();
|
|
167
|
+
while (results.size < steps.length && executingPromises.size > 0) {
|
|
168
|
+
// Wait for the next task to finish
|
|
169
|
+
await Promise.race(executingPromises);
|
|
170
|
+
// After a task finishes, check for new work
|
|
171
|
+
processPendingSteps();
|
|
151
172
|
}
|
|
152
173
|
this.emit("workflowEnd", { context: this.context, results });
|
|
153
174
|
return results;
|
package/dist/TaskRunner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskRunner.js","sourceRoot":"","sources":["../src/TaskRunner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TaskRunner.js","sourceRoot":"","sources":["../src/TaskRunner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/TaskRunner.ts
CHANGED
|
@@ -181,20 +181,15 @@ export class TaskRunner<TContext> {
|
|
|
181
181
|
this.emit("workflowStart", { context: this.context, steps });
|
|
182
182
|
|
|
183
183
|
const results = new Map<string, TaskResult>();
|
|
184
|
+
const executingPromises = new Set<Promise<void>>();
|
|
184
185
|
|
|
185
|
-
|
|
186
|
+
// Helper to process pending steps and launch ready ones
|
|
187
|
+
const processPendingSteps = () => {
|
|
186
188
|
const pendingSteps = steps.filter(
|
|
187
189
|
(step) => !results.has(step.name) && !this.running.has(step.name)
|
|
188
190
|
);
|
|
189
191
|
|
|
190
|
-
|
|
191
|
-
const deps = step.dependencies ?? [];
|
|
192
|
-
return deps.every(
|
|
193
|
-
(dep) => results.has(dep) && results.get(dep)?.status === "success"
|
|
194
|
-
);
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
// Skip tasks with failed dependencies
|
|
192
|
+
// 1. Identify and mark skipped tasks
|
|
198
193
|
for (const step of pendingSteps) {
|
|
199
194
|
const deps = step.dependencies ?? [];
|
|
200
195
|
const failedDep = deps.find(
|
|
@@ -210,10 +205,21 @@ export class TaskRunner<TContext> {
|
|
|
210
205
|
}
|
|
211
206
|
}
|
|
212
207
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
208
|
+
// Re-filter pending steps as some might have been skipped above
|
|
209
|
+
const readySteps = steps.filter((step) => {
|
|
210
|
+
if (results.has(step.name) || this.running.has(step.name)) return false;
|
|
211
|
+
const deps = step.dependencies ?? [];
|
|
212
|
+
return deps.every(
|
|
213
|
+
(dep) => results.has(dep) && results.get(dep)?.status === "success"
|
|
214
|
+
);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
// 2. Launch ready tasks
|
|
218
|
+
for (const step of readySteps) {
|
|
219
|
+
this.running.add(step.name);
|
|
220
|
+
this.emit("taskStart", { step });
|
|
221
|
+
|
|
222
|
+
const taskPromise = (async () => {
|
|
217
223
|
try {
|
|
218
224
|
const result = await step.run(this.context);
|
|
219
225
|
results.set(step.name, result);
|
|
@@ -227,8 +233,24 @@ export class TaskRunner<TContext> {
|
|
|
227
233
|
const result = results.get(step.name)!;
|
|
228
234
|
this.emit("taskEnd", { step, result });
|
|
229
235
|
}
|
|
230
|
-
})
|
|
231
|
-
|
|
236
|
+
})();
|
|
237
|
+
|
|
238
|
+
// Wrap the task promise to ensure we can track it in the Set
|
|
239
|
+
const trackedPromise = taskPromise.then(() => {
|
|
240
|
+
executingPromises.delete(trackedPromise);
|
|
241
|
+
});
|
|
242
|
+
executingPromises.add(trackedPromise);
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
// Initial check to start independent tasks
|
|
247
|
+
processPendingSteps();
|
|
248
|
+
|
|
249
|
+
while (results.size < steps.length && executingPromises.size > 0) {
|
|
250
|
+
// Wait for the next task to finish
|
|
251
|
+
await Promise.race(executingPromises);
|
|
252
|
+
// After a task finishes, check for new work
|
|
253
|
+
processPendingSteps();
|
|
232
254
|
}
|
|
233
255
|
|
|
234
256
|
this.emit("workflowEnd", { context: this.context, results });
|