@calmo/task-runner 3.8.0 → 3.8.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 (59) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/coverage/coverage-final.json +5 -4
  3. package/coverage/index.html +18 -18
  4. package/coverage/lcov-report/index.html +18 -18
  5. package/coverage/lcov-report/src/EventBus.ts.html +70 -34
  6. package/coverage/lcov-report/src/TaskGraphValidationError.ts.html +1 -1
  7. package/coverage/lcov-report/src/TaskGraphValidator.ts.html +120 -60
  8. package/coverage/lcov-report/src/TaskRunner.ts.html +78 -63
  9. package/coverage/lcov-report/src/TaskRunnerBuilder.ts.html +1 -1
  10. package/coverage/lcov-report/src/TaskRunnerExecutionConfig.ts.html +1 -1
  11. package/coverage/lcov-report/src/TaskStateManager.ts.html +17 -29
  12. package/coverage/lcov-report/src/WorkflowExecutor.ts.html +1 -1
  13. package/coverage/lcov-report/src/contracts/ErrorTypes.ts.html +103 -0
  14. package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +1 -1
  15. package/coverage/lcov-report/src/contracts/index.html +23 -8
  16. package/coverage/lcov-report/src/index.html +13 -13
  17. package/coverage/lcov-report/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
  18. package/coverage/lcov-report/src/strategies/RetryingExecutionStrategy.ts.html +1 -1
  19. package/coverage/lcov-report/src/strategies/StandardExecutionStrategy.ts.html +1 -1
  20. package/coverage/lcov-report/src/strategies/index.html +1 -1
  21. package/coverage/lcov.info +238 -213
  22. package/coverage/src/EventBus.ts.html +70 -34
  23. package/coverage/src/TaskGraphValidationError.ts.html +1 -1
  24. package/coverage/src/TaskGraphValidator.ts.html +120 -60
  25. package/coverage/src/TaskRunner.ts.html +78 -63
  26. package/coverage/src/TaskRunnerBuilder.ts.html +1 -1
  27. package/coverage/src/TaskRunnerExecutionConfig.ts.html +1 -1
  28. package/coverage/src/TaskStateManager.ts.html +17 -29
  29. package/coverage/src/WorkflowExecutor.ts.html +1 -1
  30. package/coverage/src/contracts/ErrorTypes.ts.html +103 -0
  31. package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
  32. package/coverage/src/contracts/index.html +23 -8
  33. package/coverage/src/index.html +13 -13
  34. package/coverage/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
  35. package/coverage/src/strategies/RetryingExecutionStrategy.ts.html +1 -1
  36. package/coverage/src/strategies/StandardExecutionStrategy.ts.html +1 -1
  37. package/coverage/src/strategies/index.html +1 -1
  38. package/dist/EventBus.js +11 -2
  39. package/dist/EventBus.js.map +1 -1
  40. package/dist/TaskGraphValidator.d.ts +3 -0
  41. package/dist/TaskGraphValidator.js +33 -26
  42. package/dist/TaskGraphValidator.js.map +1 -1
  43. package/dist/TaskRunner.d.ts +4 -0
  44. package/dist/TaskRunner.js +38 -44
  45. package/dist/TaskRunner.js.map +1 -1
  46. package/dist/TaskStateManager.js +1 -5
  47. package/dist/TaskStateManager.js.map +1 -1
  48. package/dist/contracts/ErrorTypes.d.ts +6 -0
  49. package/dist/contracts/ErrorTypes.js +7 -0
  50. package/dist/contracts/ErrorTypes.js.map +1 -0
  51. package/dist/contracts/ValidationError.d.ts +2 -1
  52. package/package.json +1 -1
  53. package/src/EventBus.ts +27 -15
  54. package/src/TaskGraphValidator.ts +52 -32
  55. package/src/TaskRunner.ts +51 -46
  56. package/src/TaskStateManager.ts +1 -5
  57. package/src/contracts/ErrorTypes.ts +6 -0
  58. package/src/contracts/ValidationError.ts +10 -1
  59. package/test-report.xml +152 -128
@@ -25,7 +25,7 @@
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'>49/49</span>
28
+ <span class='fraction'>48/48</span>
29
29
  </div>
30
30
 
31
31
 
@@ -265,7 +265,12 @@
265
265
  <a name='L200'></a><a href='#L200'>200</a>
266
266
  <a name='L201'></a><a href='#L201'>201</a>
267
267
  <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
269
274
  <span class="cline-any cline-neutral">&nbsp;</span>
270
275
  <span class="cline-any cline-neutral">&nbsp;</span>
271
276
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -346,23 +351,14 @@
346
351
  <span class="cline-any cline-neutral">&nbsp;</span>
347
352
  <span class="cline-any cline-yes">5x</span>
348
353
  <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-yes">15x</span>
355
354
  <span class="cline-any cline-yes">27x</span>
356
355
  <span class="cline-any cline-neutral">&nbsp;</span>
357
- <span class="cline-any cline-neutral">&nbsp;</span>
358
356
  <span class="cline-any cline-yes">5x</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
357
  <span class="cline-any cline-yes">15x</span>
363
358
  <span class="cline-any cline-neutral">&nbsp;</span>
364
359
  <span class="cline-any cline-neutral">&nbsp;</span>
365
360
  <span class="cline-any cline-neutral">&nbsp;</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
366
362
  <span class="cline-any cline-yes">5x</span>
367
363
  <span class="cline-any cline-yes">15x</span>
368
364
  <span class="cline-any cline-yes">5x</span>
@@ -426,15 +422,32 @@
426
422
  <span class="cline-any cline-neutral">&nbsp;</span>
427
423
  <span class="cline-any cline-neutral">&nbsp;</span>
428
424
  <span class="cline-any cline-neutral">&nbsp;</span>
429
- <span class="cline-any cline-neutral">&nbsp;</span>
430
425
  <span class="cline-any cline-yes">58x</span>
431
426
  <span class="cline-any cline-yes">5x</span>
432
- <span class="cline-any cline-yes">5x</span>
433
- <span class="cline-any cline-yes">3x</span>
434
427
  <span class="cline-any cline-neutral">&nbsp;</span>
435
428
  <span class="cline-any cline-neutral">&nbsp;</span>
436
429
  <span class="cline-any cline-neutral">&nbsp;</span>
437
430
  <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-neutral">&nbsp;</span>
432
+ <span class="cline-any cline-neutral">&nbsp;</span>
433
+ <span class="cline-any cline-yes">44x</span>
434
+ <span class="cline-any cline-neutral">&nbsp;</span>
435
+ <span class="cline-any cline-neutral">&nbsp;</span>
436
+ <span class="cline-any cline-neutral">&nbsp;</span>
437
+ <span class="cline-any cline-neutral">&nbsp;</span>
438
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</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-yes">5x</span>
447
+ <span class="cline-any cline-yes">5x</span>
448
+ <span class="cline-any cline-yes">3x</span>
449
+ <span class="cline-any cline-neutral">&nbsp;</span>
450
+ <span class="cline-any cline-neutral">&nbsp;</span>
438
451
  <span class="cline-any cline-yes">5x</span>
439
452
  <span class="cline-any cline-neutral">&nbsp;</span>
440
453
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -463,9 +476,6 @@
463
476
  <span class="cline-any cline-neutral">&nbsp;</span>
464
477
  <span class="cline-any cline-neutral">&nbsp;</span>
465
478
  <span class="cline-any cline-neutral">&nbsp;</span>
466
- <span class="cline-any cline-yes">44x</span>
467
- <span class="cline-any cline-neutral">&nbsp;</span>
468
- <span class="cline-any cline-neutral">&nbsp;</span>
469
479
  <span class="cline-any cline-neutral">&nbsp;</span>
470
480
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { TaskStep } from "./TaskStep.js";
471
481
  import { TaskResult } from "./TaskResult.js";
@@ -548,23 +558,14 @@ export class TaskRunner&lt;TContext&gt; {
548
558
  public static getMermaidGraph&lt;T&gt;(steps: TaskStep&lt;T&gt;[]): string {
549
559
  const graphLines = ["graph TD"];
550
560
  &nbsp;
551
- // Helper to sanitize node names or wrap them if needed
552
- // For simplicity, we just wrap in quotes and use the name as ID if it's simple
553
- // or generate an ID if strictly needed. Here we assume names are unique IDs.
554
- // We will wrap names in quotes for the label, but use the name as the ID.
555
- // Actually, Mermaid ID cannot have spaces without quotes.
556
- const safeId = (name: string) =&gt; JSON.stringify(name);
557
561
  const sanitize = (name: string) =&gt; this.sanitizeMermaidId(name);
558
562
  &nbsp;
559
- // Add all nodes first to ensure they exist
560
563
  for (const step of steps) {
561
- // Using the name as both ID and Label for simplicity
562
- // Format: ID["Label"]
563
- // safeId returns a quoted string (e.g. "Task Name"), so we use it directly as the label
564
- graphLines.push(` ${sanitize(step.name)}[${safeId(step.name)}]`);
564
+ graphLines.push(
565
+ ` ${sanitize(step.name)}[${JSON.stringify(step.name)}]`
566
+ );
565
567
  }
566
568
  &nbsp;
567
- // Add edges
568
569
  for (const step of steps) {
569
570
  if (step.dependencies) {
570
571
  for (const dep of step.dependencies) {
@@ -628,44 +629,58 @@ export class TaskRunner&lt;TContext&gt; {
628
629
  config?.concurrency
629
630
  );
630
631
  &nbsp;
631
- // We need to handle the timeout cleanup properly.
632
632
  if (config?.timeout !== undefined) {
633
- const controller = new AbortController();
634
- const timeoutId = setTimeout(() =&gt; {
635
- controller.abort(
636
- new Error(`Workflow timed out after ${config.timeout}ms`)
637
- );
638
- }, config.timeout);
633
+ return this.executeWithTimeout(
634
+ executor,
635
+ steps,
636
+ config.timeout,
637
+ config.signal
638
+ );
639
+ } else {
640
+ return executor.execute(steps, config?.signal);
641
+ }
642
+ }
639
643
  &nbsp;
640
- let effectiveSignal = controller.signal;
641
- let onAbort: (() =&gt; void) | undefined;
644
+ /**
645
+ * Executes tasks with a timeout, ensuring resources are cleaned up.
646
+ */
647
+ private async executeWithTimeout(
648
+ executor: WorkflowExecutor&lt;TContext&gt;,
649
+ steps: TaskStep&lt;TContext&gt;[],
650
+ timeout: number,
651
+ signal?: AbortSignal
652
+ ): Promise&lt;Map&lt;string, TaskResult&gt;&gt; {
653
+ const controller = new AbortController();
654
+ const timeoutId = setTimeout(() =&gt; {
655
+ controller.abort(new Error(`Workflow timed out after ${timeout}ms`));
656
+ }, timeout);
642
657
  &nbsp;
643
- // Handle combination of signals if user provided one
644
- if (config.signal) {
645
- if (config.signal.aborted) {
646
- // If already aborted, use it directly (WorkflowExecutor handles early abort)
647
- // We can cancel timeout immediately
648
- clearTimeout(timeoutId);
649
- effectiveSignal = config.signal;
650
- } else {
651
- // Listen to user signal to abort our controller
652
- onAbort = () =&gt; {
653
- controller.abort(config.signal?.reason);
654
- };
655
- config.signal.addEventListener("abort", onAbort);
656
- }
657
- }
658
+ let effectiveSignal = controller.signal;
659
+ let onAbort: (() =&gt; void) | undefined;
658
660
  &nbsp;
659
- try {
660
- return await executor.execute(steps, effectiveSignal);
661
- } finally {
661
+ // Handle combination of signals if user provided one
662
+ if (signal) {
663
+ if (signal.aborted) {
664
+ // If already aborted, use it directly (WorkflowExecutor handles early abort)
665
+ // We can cancel timeout immediately
662
666
  clearTimeout(timeoutId);
663
- if (config.signal &amp;&amp; onAbort) {
664
- config.signal.removeEventListener("abort", onAbort);
665
- }
667
+ effectiveSignal = signal;
668
+ } else {
669
+ // Listen to user signal to abort our controller
670
+ onAbort = () =&gt; {
671
+ controller.abort(signal.reason);
672
+ };
673
+ signal.addEventListener("abort", onAbort);
674
+ }
675
+ }
676
+ &nbsp;
677
+ try {
678
+ return await executor.execute(steps, effectiveSignal);
679
+ } finally {
680
+ clearTimeout(timeoutId);
681
+ if (signal &amp;&amp; onAbort) {
682
+ signal.removeEventListener("abort", onAbort);
666
683
  }
667
- } else {
668
- return executor.execute(steps, config?.signal);
669
684
  }
670
685
  }
671
686
  }
@@ -676,7 +691,7 @@ export class TaskRunner&lt;TContext&gt; {
676
691
  <div class='footer quiet pad2 space-top1 center small'>
677
692
  Code coverage generated by
678
693
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
679
- at 2026-01-21T00:01:01.006Z
694
+ at 2026-01-21T01:16:02.348Z
680
695
  </div>
681
696
  <script src="../prettify.js"></script>
682
697
  <script>
@@ -322,7 +322,7 @@ export class TaskRunnerBuilder&lt;TContext&gt; {
322
322
  <div class='footer quiet pad2 space-top1 center small'>
323
323
  Code coverage generated by
324
324
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
325
- at 2026-01-21T00:01:01.006Z
325
+ at 2026-01-21T01:16:02.348Z
326
326
  </div>
327
327
  <script src="../prettify.js"></script>
328
328
  <script>
@@ -139,7 +139,7 @@ export interface TaskRunnerExecutionConfig {
139
139
  <div class='footer quiet pad2 space-top1 center small'>
140
140
  Code coverage generated by
141
141
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
142
- at 2026-01-21T00:01:01.006Z
142
+ at 2026-01-21T01:16:02.348Z
143
143
  </div>
144
144
  <script src="../prettify.js"></script>
145
145
  <script>
@@ -25,7 +25,7 @@
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'>47/47</span>
28
+ <span class='fraction'>48/48</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
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'>47/47</span>
49
+ <span class='fraction'>48/48</span>
50
50
  </div>
51
51
 
52
52
 
@@ -211,11 +211,7 @@
211
211
  <a name='L146'></a><a href='#L146'>146</a>
212
212
  <a name='L147'></a><a href='#L147'>147</a>
213
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
214
+ <a name='L149'></a><a href='#L149'>149</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
219
215
  <span class="cline-any cline-neutral">&nbsp;</span>
220
216
  <span class="cline-any cline-neutral">&nbsp;</span>
221
217
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -224,20 +220,20 @@
224
220
  <span class="cline-any cline-neutral">&nbsp;</span>
225
221
  <span class="cline-any cline-neutral">&nbsp;</span>
226
222
  <span class="cline-any cline-neutral">&nbsp;</span>
227
- <span class="cline-any cline-yes">65x</span>
228
- <span class="cline-any cline-yes">65x</span>
229
- <span class="cline-any cline-yes">65x</span>
223
+ <span class="cline-any cline-yes">66x</span>
224
+ <span class="cline-any cline-yes">66x</span>
225
+ <span class="cline-any cline-yes">66x</span>
230
226
  <span class="cline-any cline-neutral">&nbsp;</span>
231
- <span class="cline-any cline-yes">65x</span>
227
+ <span class="cline-any cline-yes">66x</span>
232
228
  <span class="cline-any cline-neutral">&nbsp;</span>
233
229
  <span class="cline-any cline-neutral">&nbsp;</span>
234
230
  <span class="cline-any cline-neutral">&nbsp;</span>
235
231
  <span class="cline-any cline-neutral">&nbsp;</span>
236
232
  <span class="cline-any cline-neutral">&nbsp;</span>
237
233
  <span class="cline-any cline-neutral">&nbsp;</span>
238
- <span class="cline-any cline-yes">64x</span>
239
- <span class="cline-any cline-yes">64x</span>
240
- <span class="cline-any cline-yes">64x</span>
234
+ <span class="cline-any cline-yes">65x</span>
235
+ <span class="cline-any cline-yes">65x</span>
236
+ <span class="cline-any cline-yes">65x</span>
241
237
  <span class="cline-any cline-neutral">&nbsp;</span>
242
238
  <span class="cline-any cline-neutral">&nbsp;</span>
243
239
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -315,24 +311,20 @@
315
311
  <span class="cline-any cline-neutral">&nbsp;</span>
316
312
  <span class="cline-any cline-neutral">&nbsp;</span>
317
313
  <span class="cline-any cline-neutral">&nbsp;</span>
318
- <span class="cline-any cline-yes">87x</span>
319
- <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-yes">88x</span>
320
315
  <span class="cline-any cline-neutral">&nbsp;</span>
321
316
  <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-yes">8x</span>
322
318
  <span class="cline-any cline-yes">7x</span>
323
- <span class="cline-any cline-yes">6x</span>
324
- <span class="cline-any cline-neutral">&nbsp;</span>
325
- <span class="cline-any cline-neutral">&nbsp;</span>
326
- <span class="cline-any cline-neutral">&nbsp;</span>
327
- <span class="cline-any cline-yes">6x</span>
328
- <span class="cline-any cline-neutral">&nbsp;</span>
329
319
  <span class="cline-any cline-neutral">&nbsp;</span>
330
320
  <span class="cline-any cline-neutral">&nbsp;</span>
331
321
  <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-yes">7x</span>
323
+ <span class="cline-any cline-yes">7x</span>
332
324
  <span class="cline-any cline-neutral">&nbsp;</span>
333
325
  <span class="cline-any cline-neutral">&nbsp;</span>
334
326
  <span class="cline-any cline-neutral">&nbsp;</span>
335
- <span class="cline-any cline-yes">87x</span>
327
+ <span class="cline-any cline-yes">88x</span>
336
328
  <span class="cline-any cline-neutral">&nbsp;</span>
337
329
  <span class="cline-any cline-neutral">&nbsp;</span>
338
330
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -470,20 +462,16 @@ export class TaskStateManager&lt;TContext&gt; {
470
462
  for (const step of this.pendingSteps) {
471
463
  // Also check running? No, running tasks are handled by AbortSignal in Executor.
472
464
  // We only cancel what is pending and hasn't started.
473
- /* v8 ignore next 1 */
474
465
  if (!this.results.has(step.name) &amp;&amp; !this.running.has(step.name)) {
475
466
  const result: TaskResult = {
476
467
  status: "cancelled",
477
468
  message,
478
469
  };
479
470
  this.results.set(step.name, result);
471
+ this.eventBus.emit("taskEnd", { step, result });
480
472
  }
481
473
  }
482
474
  // Clear pending set as they are now "done" (cancelled)
483
- // Wait, if we clear pending steps, processDependencies won't pick them up.
484
- // The loop in Executor relies on results.size or pendingSteps.
485
- // The previous implementation iterated `steps` (all steps) to cancel.
486
- // Here we iterate `pendingSteps`.
487
475
  this.pendingSteps.clear();
488
476
  }
489
477
  &nbsp;
@@ -526,7 +514,7 @@ export class TaskStateManager&lt;TContext&gt; {
526
514
  <div class='footer quiet pad2 space-top1 center small'>
527
515
  Code coverage generated by
528
516
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
529
- at 2026-01-21T00:01:01.006Z
517
+ at 2026-01-21T01:16:02.348Z
530
518
  </div>
531
519
  <script src="../prettify.js"></script>
532
520
  <script>
@@ -643,7 +643,7 @@ export class WorkflowExecutor&lt;TContext&gt; {
643
643
  <div class='footer quiet pad2 space-top1 center small'>
644
644
  Code coverage generated by
645
645
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
646
- at 2026-01-21T00:01:01.006Z
646
+ at 2026-01-21T01:16:02.348Z
647
647
  </div>
648
648
  <script src="../prettify.js"></script>
649
649
  <script>
@@ -0,0 +1,103 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/contracts/ErrorTypes.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> / <a href="index.html">src/contracts</a> ErrorTypes.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'>3/3</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'>0/0</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'>0/0</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'>3/3</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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
73
+ <span class="cline-any cline-neutral">&nbsp;</span>
74
+ <span class="cline-any cline-neutral">&nbsp;</span>
75
+ <span class="cline-any cline-yes">17x</span>
76
+ <span class="cline-any cline-yes">17x</span>
77
+ <span class="cline-any cline-yes">17x</span>
78
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
79
+ * Error type constants for task graph validation.
80
+ */
81
+ export const ERROR_DUPLICATE_TASK = "duplicate_task" as const;
82
+ export const ERROR_MISSING_DEPENDENCY = "missing_dependency" as const;
83
+ export const ERROR_CYCLE = "cycle" as const;
84
+ &nbsp;</pre></td></tr></table></pre>
85
+
86
+ <div class='push'></div><!-- for sticky footer -->
87
+ </div><!-- /wrapper -->
88
+ <div class='footer quiet pad2 space-top1 center small'>
89
+ Code coverage generated by
90
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
91
+ at 2026-01-21T01:16:02.348Z
92
+ </div>
93
+ <script src="../../prettify.js"></script>
94
+ <script>
95
+ window.onload = function () {
96
+ prettyPrint();
97
+ };
98
+ </script>
99
+ <script src="../../sorter.js"></script>
100
+ <script src="../../block-navigation.js"></script>
101
+ </body>
102
+ </html>
103
+
@@ -202,7 +202,7 @@ export type ListenerMap&lt;TContext&gt; = {
202
202
  <div class='footer quiet pad2 space-top1 center small'>
203
203
  Code coverage generated by
204
204
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
205
- at 2026-01-21T00:01:01.006Z
205
+ at 2026-01-21T01:16:02.348Z
206
206
  </div>
207
207
  <script src="../../prettify.js"></script>
208
208
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">0% </span>
26
+ <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/0</span>
28
+ <span class='fraction'>3/3</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
33
+ <span class="strong">100% </span>
34
34
  <span class="quiet">Branches</span>
35
35
  <span class='fraction'>0/0</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
42
  <span class='fraction'>0/0</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
47
+ <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/0</span>
49
+ <span class='fraction'>3/3</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line high'></div>
65
65
  <div class="pad1">
66
66
  <table class="coverage-summary">
67
67
  <thead>
@@ -79,6 +79,21 @@
79
79
  </tr>
80
80
  </thead>
81
81
  <tbody><tr>
82
+ <td class="file high" data-value="ErrorTypes.ts"><a href="ErrorTypes.ts.html">ErrorTypes.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="3" class="abs high">3/3</td>
88
+ <td data-value="100" class="pct high">100%</td>
89
+ <td data-value="0" class="abs high">0/0</td>
90
+ <td data-value="100" class="pct high">100%</td>
91
+ <td data-value="0" class="abs high">0/0</td>
92
+ <td data-value="100" class="pct high">100%</td>
93
+ <td data-value="3" class="abs high">3/3</td>
94
+ </tr>
95
+
96
+ <tr>
82
97
  <td class="file empty" data-value="RunnerEvents.ts"><a href="RunnerEvents.ts.html">RunnerEvents.ts</a></td>
83
98
  <td data-value="0" class="pic empty">
84
99
  <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
@@ -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-21T00:01:01.006Z
119
+ at 2026-01-21T01:16:02.348Z
105
120
  </div>
106
121
  <script src="../../prettify.js"></script>
107
122
  <script>