@calmo/task-runner 1.1.1 → 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 +26 -0
- package/GEMINI.md +2 -1
- package/README.md +5 -0
- package/coverage/TaskGraphValidator.ts.html +463 -0
- package/coverage/TaskRunner.ts.html +244 -67
- package/coverage/coverage-final.json +2 -1
- package/coverage/index.html +24 -9
- package/coverage/lcov-report/TaskGraphValidator.ts.html +463 -0
- package/coverage/lcov-report/TaskRunner.ts.html +244 -67
- package/coverage/lcov-report/index.html +24 -9
- package/coverage/lcov.info +214 -103
- package/dist/TaskGraph.d.ts +18 -0
- package/dist/TaskGraph.js +2 -0
- package/dist/TaskGraph.js.map +1 -0
- package/dist/TaskGraphValidator.d.ts +17 -0
- package/dist/TaskGraphValidator.js +103 -0
- package/dist/TaskGraphValidator.js.map +1 -0
- package/dist/TaskRunner.d.ts +1 -0
- package/dist/TaskRunner.js +88 -32
- package/dist/TaskRunner.js.map +1 -1
- package/dist/contracts/ITaskGraphValidator.d.ts +13 -0
- package/dist/contracts/ITaskGraphValidator.js +2 -0
- package/dist/contracts/ITaskGraphValidator.js.map +1 -0
- package/dist/contracts/ValidationError.d.ts +11 -0
- package/dist/contracts/ValidationError.js +2 -0
- package/dist/contracts/ValidationError.js.map +1 -0
- package/dist/contracts/ValidationResult.d.ts +10 -0
- package/dist/contracts/ValidationResult.js +2 -0
- package/dist/contracts/ValidationResult.js.map +1 -0
- package/package.json +1 -1
- package/src/TaskGraph.ts +19 -0
- package/src/TaskGraphValidator.ts +126 -0
- package/src/TaskRunner.ts +85 -26
- package/src/contracts/ITaskGraphValidator.ts +14 -0
- package/src/contracts/ValidationError.ts +11 -0
- package/src/contracts/ValidationResult.ts +11 -0
- package/test-report.xml +51 -23
|
@@ -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
|
|
|
@@ -263,7 +263,66 @@
|
|
|
263
263
|
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
264
|
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
265
|
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
-
<a name='L201'></a><a href='#L201'>201</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"> </span>
|
|
267
326
|
<span class="cline-any cline-neutral"> </span>
|
|
268
327
|
<span class="cline-any cline-neutral"> </span>
|
|
269
328
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -314,13 +373,16 @@
|
|
|
314
373
|
<span class="cline-any cline-neutral"> </span>
|
|
315
374
|
<span class="cline-any cline-neutral"> </span>
|
|
316
375
|
<span class="cline-any cline-neutral"> </span>
|
|
317
|
-
<span class="cline-any cline-yes">19x</span>
|
|
318
|
-
<span class="cline-any cline-yes">19x</span>
|
|
319
376
|
<span class="cline-any cline-neutral"> </span>
|
|
320
377
|
<span class="cline-any cline-neutral"> </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>
|
|
321
381
|
<span class="cline-any cline-neutral"> </span>
|
|
322
382
|
<span class="cline-any cline-neutral"> </span>
|
|
323
|
-
<span class="cline-any cline-
|
|
383
|
+
<span class="cline-any cline-neutral"> </span>
|
|
384
|
+
<span class="cline-any cline-neutral"> </span>
|
|
385
|
+
<span class="cline-any cline-yes">22x</span>
|
|
324
386
|
<span class="cline-any cline-neutral"> </span>
|
|
325
387
|
<span class="cline-any cline-neutral"> </span>
|
|
326
388
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -367,10 +429,10 @@
|
|
|
367
429
|
<span class="cline-any cline-neutral"> </span>
|
|
368
430
|
<span class="cline-any cline-neutral"> </span>
|
|
369
431
|
<span class="cline-any cline-neutral"> </span>
|
|
370
|
-
<span class="cline-any cline-yes">
|
|
432
|
+
<span class="cline-any cline-yes">88x</span>
|
|
371
433
|
<span class="cline-any cline-neutral"> </span>
|
|
372
434
|
<span class="cline-any cline-neutral"> </span>
|
|
373
|
-
<span class="cline-any cline-yes">
|
|
435
|
+
<span class="cline-any cline-yes">88x</span>
|
|
374
436
|
<span class="cline-any cline-yes">13x</span>
|
|
375
437
|
<span class="cline-any cline-yes">13x</span>
|
|
376
438
|
<span class="cline-any cline-yes">13x</span>
|
|
@@ -393,70 +455,126 @@
|
|
|
393
455
|
<span class="cline-any cline-neutral"> </span>
|
|
394
456
|
<span class="cline-any cline-neutral"> </span>
|
|
395
457
|
<span class="cline-any cline-neutral"> </span>
|
|
396
|
-
<span class="cline-any cline-yes">18x</span>
|
|
397
458
|
<span class="cline-any cline-neutral"> </span>
|
|
398
|
-
<span class="cline-any cline-yes">
|
|
459
|
+
<span class="cline-any cline-yes">21x</span>
|
|
460
|
+
<span class="cline-any cline-yes">43x</span>
|
|
399
461
|
<span class="cline-any cline-neutral"> </span>
|
|
400
|
-
<span class="cline-any cline-yes">18x</span>
|
|
401
|
-
<span class="cline-any cline-yes">26x</span>
|
|
402
|
-
<span class="cline-any cline-yes">80x</span>
|
|
403
462
|
<span class="cline-any cline-neutral"> </span>
|
|
404
463
|
<span class="cline-any cline-neutral"> </span>
|
|
405
|
-
<span class="cline-any cline-yes">26x</span>
|
|
406
|
-
<span class="cline-any cline-yes">57x</span>
|
|
407
|
-
<span class="cline-any cline-yes">57x</span>
|
|
408
|
-
<span class="cline-any cline-yes">42x</span>
|
|
409
464
|
<span class="cline-any cline-neutral"> </span>
|
|
410
465
|
<span class="cline-any cline-neutral"> </span>
|
|
466
|
+
<span class="cline-any cline-yes">21x</span>
|
|
467
|
+
<span class="cline-any cline-yes">21x</span>
|
|
411
468
|
<span class="cline-any cline-neutral"> </span>
|
|
469
|
+
<span class="cline-any cline-yes">6x</span>
|
|
470
|
+
<span class="cline-any cline-yes">6x</span>
|
|
412
471
|
<span class="cline-any cline-neutral"> </span>
|
|
413
|
-
<span class="cline-any cline-yes">
|
|
414
|
-
<span class="cline-any cline-yes">
|
|
415
|
-
<span class="cline-any cline-yes">
|
|
416
|
-
<span class="cline-any cline-yes">57x</span>
|
|
417
|
-
<span class="cline-any cline-yes">45x</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>
|
|
418
475
|
<span class="cline-any cline-neutral"> </span>
|
|
419
|
-
<span class="cline-any cline-yes">57x</span>
|
|
420
|
-
<span class="cline-any cline-yes">7x</span>
|
|
421
476
|
<span class="cline-any cline-neutral"> </span>
|
|
477
|
+
<span class="cline-any cline-yes">2x</span>
|
|
422
478
|
<span class="cline-any cline-neutral"> </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"> </span>
|
|
482
|
+
<span class="cline-any cline-neutral"> </span>
|
|
483
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
488
|
+
<span class="cline-any cline-neutral"> </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>
|
|
423
492
|
<span class="cline-any cline-neutral"> </span>
|
|
424
|
-
<span class="cline-any cline-yes">7x</span>
|
|
425
|
-
<span class="cline-any cline-yes">7x</span>
|
|
426
493
|
<span class="cline-any cline-neutral"> </span>
|
|
427
494
|
<span class="cline-any cline-neutral"> </span>
|
|
428
495
|
<span class="cline-any cline-neutral"> </span>
|
|
429
|
-
<span class="cline-any cline-yes">26x</span>
|
|
430
496
|
<span class="cline-any cline-neutral"> </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>
|
|
431
500
|
<span class="cline-any cline-neutral"> </span>
|
|
432
501
|
<span class="cline-any cline-neutral"> </span>
|
|
502
|
+
<span class="cline-any cline-yes">6x</span>
|
|
503
|
+
<span class="cline-any cline-neutral"> </span>
|
|
504
|
+
<span class="cline-any cline-neutral"> </span>
|
|
505
|
+
<span class="cline-any cline-yes">15x</span>
|
|
506
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
510
|
+
<span class="cline-any cline-neutral"> </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>
|
|
433
514
|
<span class="cline-any cline-neutral"> </span>
|
|
515
|
+
<span class="cline-any cline-neutral"> </span>
|
|
516
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
526
|
+
<span class="cline-any cline-neutral"> </span>
|
|
527
|
+
<span class="cline-any cline-yes">6x</span>
|
|
434
528
|
<span class="cline-any cline-yes">6x</span>
|
|
435
|
-
<span class="cline-any cline-yes">3x</span>
|
|
436
|
-
<span class="cline-any cline-yes">3x</span>
|
|
437
529
|
<span class="cline-any cline-neutral"> </span>
|
|
438
530
|
<span class="cline-any cline-neutral"> </span>
|
|
439
531
|
<span class="cline-any cline-neutral"> </span>
|
|
440
532
|
<span class="cline-any cline-neutral"> </span>
|
|
441
|
-
<span class="cline-any cline-yes">
|
|
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>
|
|
543
|
+
<span class="cline-any cline-yes">26x</span>
|
|
544
|
+
<span class="cline-any cline-yes">26x</span>
|
|
442
545
|
<span class="cline-any cline-neutral"> </span>
|
|
443
|
-
<span class="cline-any cline-yes">
|
|
444
|
-
<span class="cline-any cline-yes">
|
|
445
|
-
<span class="cline-any cline-yes">
|
|
446
|
-
<span class="cline-any cline-yes">
|
|
447
|
-
<span class="cline-any cline-yes">25x</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>
|
|
448
550
|
<span class="cline-any cline-neutral"> </span>
|
|
449
551
|
<span class="cline-any cline-yes">2x</span>
|
|
450
552
|
<span class="cline-any cline-neutral"> </span>
|
|
451
553
|
<span class="cline-any cline-neutral"> </span>
|
|
452
554
|
<span class="cline-any cline-neutral"> </span>
|
|
453
555
|
<span class="cline-any cline-neutral"> </span>
|
|
454
|
-
<span class="cline-any cline-yes">
|
|
455
|
-
<span class="cline-any cline-yes">
|
|
456
|
-
<span class="cline-any cline-yes">
|
|
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"> </span>
|
|
560
|
+
<span class="cline-any cline-neutral"> </span>
|
|
457
561
|
<span class="cline-any cline-neutral"> </span>
|
|
458
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>
|
|
459
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>
|
|
460
578
|
<span class="cline-any cline-neutral"> </span>
|
|
461
579
|
<span class="cline-any cline-neutral"> </span>
|
|
462
580
|
<span class="cline-any cline-yes">15x</span>
|
|
@@ -465,6 +583,8 @@
|
|
|
465
583
|
<span class="cline-any cline-neutral"> </span>
|
|
466
584
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { TaskStep } from "./TaskStep.js";
|
|
467
585
|
import { TaskResult } from "./TaskResult.js";
|
|
586
|
+
import { TaskGraphValidator } from "./TaskGraphValidator.js";
|
|
587
|
+
import { TaskGraph } from "./TaskGraph.js";
|
|
468
588
|
|
|
469
589
|
/**
|
|
470
590
|
* Define the payload for every possible event in the lifecycle.
|
|
@@ -516,6 +636,7 @@ type ListenerMap<TContext> = {
|
|
|
516
636
|
export class TaskRunner<TContext> {
|
|
517
637
|
private running = new Set<string>();
|
|
518
638
|
private listeners: ListenerMap<TContext> = {};
|
|
639
|
+
private validator = new TaskGraphValidator();
|
|
519
640
|
|
|
520
641
|
/**
|
|
521
642
|
* @param context The shared context object to be passed to each task.
|
|
@@ -593,25 +714,66 @@ export class TaskRunner<TContext> {
|
|
|
593
714
|
* and values are the corresponding TaskResult objects.
|
|
594
715
|
*/
|
|
595
716
|
async execute(steps: TaskStep<TContext>[]): Promise<Map<string, TaskResult>> {
|
|
717
|
+
// Validate the task graph before execution
|
|
718
|
+
const taskGraph: TaskGraph = {
|
|
719
|
+
tasks: steps.map((step) => ({
|
|
720
|
+
id: step.name,
|
|
721
|
+
dependencies: step.dependencies ?? [],
|
|
722
|
+
})),
|
|
723
|
+
};
|
|
724
|
+
|
|
725
|
+
const validationResult = this.validator.validate(taskGraph);
|
|
726
|
+
if (!validationResult.isValid) {
|
|
727
|
+
// Construct error message compatible with legacy tests
|
|
728
|
+
const affectedTasks = new Set<string>();
|
|
729
|
+
const errorDetails: string[] = [];
|
|
730
|
+
|
|
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) => 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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
596
764
|
this.emit("workflowStart", { context: this.context, steps });
|
|
597
765
|
|
|
598
766
|
const results = new Map<string, TaskResult>();
|
|
767
|
+
const executingPromises = new Set<Promise<void>>();
|
|
599
768
|
|
|
600
|
-
|
|
769
|
+
// Helper to process pending steps and launch ready ones
|
|
770
|
+
const processPendingSteps = () => {
|
|
601
771
|
const pendingSteps = steps.filter(
|
|
602
772
|
(step) => !results.has(step.name) && !this.running.has(step.name)
|
|
603
773
|
);
|
|
604
774
|
|
|
605
|
-
|
|
606
|
-
const deps = step.dependencies ?? [];
|
|
607
|
-
return deps.every(
|
|
608
|
-
(dep) => results.has(dep) && results.get(dep)?.status === "success"
|
|
609
|
-
);
|
|
610
|
-
});
|
|
611
|
-
|
|
612
|
-
// Skip tasks with failed dependencies
|
|
775
|
+
// 1. Identify and mark skipped tasks
|
|
613
776
|
for (const step of pendingSteps) {
|
|
614
|
-
if (results.has(step.name)) continue;
|
|
615
777
|
const deps = step.dependencies ?? [];
|
|
616
778
|
const failedDep = deps.find(
|
|
617
779
|
(dep) => results.has(dep) && results.get(dep)?.status !== "success"
|
|
@@ -626,22 +788,21 @@ export class TaskRunner<TContext> {
|
|
|
626
788
|
}
|
|
627
789
|
}
|
|
628
790
|
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
this.running.
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
const unrunnableStepNames = unrunnableSteps.map((s) => s.name);
|
|
636
|
-
throw new Error(
|
|
637
|
-
`Circular dependency or missing dependency detected. Unable to run tasks: ${unrunnableStepNames.join(", ")}`
|
|
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"
|
|
638
797
|
);
|
|
639
|
-
}
|
|
798
|
+
});
|
|
640
799
|
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
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 () => {
|
|
645
806
|
try {
|
|
646
807
|
const result = await step.run(this.context);
|
|
647
808
|
results.set(step.name, result);
|
|
@@ -655,8 +816,24 @@ export class TaskRunner<TContext> {
|
|
|
655
816
|
const result = results.get(step.name)!;
|
|
656
817
|
this.emit("taskEnd", { step, result });
|
|
657
818
|
}
|
|
658
|
-
})
|
|
659
|
-
|
|
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();
|
|
660
837
|
}
|
|
661
838
|
|
|
662
839
|
this.emit("workflowEnd", { context: this.context, results });
|
|
@@ -670,7 +847,7 @@ export class TaskRunner<TContext> {
|
|
|
670
847
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
671
848
|
Code coverage generated by
|
|
672
849
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
673
|
-
at 2026-01-
|
|
850
|
+
at 2026-01-18T05:09:17.338Z
|
|
674
851
|
</div>
|
|
675
852
|
<script src="prettify.js"></script>
|
|
676
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
|
|
|
@@ -79,18 +79,33 @@
|
|
|
79
79
|
</tr>
|
|
80
80
|
</thead>
|
|
81
81
|
<tbody><tr>
|
|
82
|
+
<td class="file high" data-value="TaskGraphValidator.ts"><a href="TaskGraphValidator.ts.html">TaskGraphValidator.ts</a></td>
|
|
83
|
+
<td data-value="100" class="pic high">
|
|
84
|
+
<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
|
|
85
|
+
</td>
|
|
86
|
+
<td data-value="100" class="pct high">100%</td>
|
|
87
|
+
<td data-value="43" class="abs high">43/43</td>
|
|
88
|
+
<td data-value="100" class="pct high">100%</td>
|
|
89
|
+
<td data-value="16" class="abs high">16/16</td>
|
|
90
|
+
<td data-value="100" class="pct high">100%</td>
|
|
91
|
+
<td data-value="3" class="abs high">3/3</td>
|
|
92
|
+
<td data-value="100" class="pct high">100%</td>
|
|
93
|
+
<td data-value="42" class="abs high">42/42</td>
|
|
94
|
+
</tr>
|
|
95
|
+
|
|
96
|
+
<tr>
|
|
82
97
|
<td class="file high" data-value="TaskRunner.ts"><a href="TaskRunner.ts.html">TaskRunner.ts</a></td>
|
|
83
98
|
<td data-value="100" class="pic high">
|
|
84
99
|
<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
|
|
85
100
|
</td>
|
|
86
101
|
<td data-value="100" class="pct high">100%</td>
|
|
87
|
-
<td data-value="
|
|
102
|
+
<td data-value="78" class="abs high">78/78</td>
|
|
88
103
|
<td data-value="100" class="pct high">100%</td>
|
|
89
|
-
<td data-value="
|
|
104
|
+
<td data-value="33" class="abs high">33/33</td>
|
|
90
105
|
<td data-value="100" class="pct high">100%</td>
|
|
91
|
-
<td data-value="
|
|
106
|
+
<td data-value="14" class="abs high">14/14</td>
|
|
92
107
|
<td data-value="100" class="pct high">100%</td>
|
|
93
|
-
<td data-value="
|
|
108
|
+
<td data-value="76" class="abs high">76/76</td>
|
|
94
109
|
</tr>
|
|
95
110
|
|
|
96
111
|
</tbody>
|
|
@@ -101,7 +116,7 @@
|
|
|
101
116
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
102
117
|
Code coverage generated by
|
|
103
118
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
104
|
-
at 2026-01-
|
|
119
|
+
at 2026-01-18T05:09:17.338Z
|
|
105
120
|
</div>
|
|
106
121
|
<script src="prettify.js"></script>
|
|
107
122
|
<script>
|